[istsos] 01/05: Imported Upstream version 2.1.1

Johan Van de Wauw johanvdw-guest at moszumanska.debian.org
Thu Sep 18 21:42:10 UTC 2014


This is an automated email from the git hooks/post-receive script.

johanvdw-guest pushed a commit to branch master
in repository istsos.

commit bde356fe1c49cd41a25c1d917a8d02c7a408f1cc
Author: Johan Van de Wauw <johan.vandewauw at gmail.com>
Date:   Fri Jul 18 11:41:48 2014 +0200

    Imported Upstream version 2.1.1
---
 application.py                                     |   253 +
 cmdimportcsv.py                                    |   315 +
 config.py                                          |    29 +
 config.pyc                                         |   Bin 0 -> 571 bytes
 interface/app/Procedure.js                         |  1371 +
 interface/app/data/cmbcapabilities.json            |    21 +
 interface/app/data/cmbcapabilitiesuom.json         |    26 +
 interface/app/data/cmbdocumentformat.json          |  3208 +
 interface/app/data/cmbepsg.json                    |    12 +
 interface/app/data/cmbidentification.json          |    31 +
 interface/app/data/cmbobservedproperties.json      |    19 +
 interface/app/data/cmbphenomenon.json              |    19 +
 interface/app/data/cmbsystemtype.json              |    13 +
 interface/app/data/cmbuom.json                     |    15 +
 interface/app/data/fakeOfferings.json              |    28 +
 interface/app/data/procedure.json                  |   146 +
 interface/app/engine/pageConfig.js                 |   377 +
 interface/app/engine/pageManager.js                |   217 +
 interface/app/engine/wa.js                         |    95 +
 interface/app/store/Constraint.js                  |    61 +
 interface/app/store/DataQualityStore.js            |    41 +
 interface/app/store/Fake.js                        |    42 +
 interface/app/store/MyArrayStore.js                |    30 +
 interface/app/store/Observations.js                |    43 +
 interface/app/store/ObservedProperties.js          |    50 +
 interface/app/store/Offerings.js                   |    43 +
 interface/app/store/Procedures.js                  |    42 +
 interface/app/store/RatingCurve.js                 |    63 +
 interface/app/store/Services.js                    |    42 +
 interface/app/store/cmbDocumentFormat.js           |    42 +
 interface/app/store/cmbIdentification.js           |    42 +
 interface/app/store/cmbName.js                     |    38 +
 interface/app/store/cmbNameDescription.js          |    42 +
 interface/app/store/cmbSml.js                      |    54 +
 interface/app/store/cmbSystemType.js               |    39 +
 interface/app/store/gridDocumentation.js           |    49 +
 interface/app/store/gridObservedProperties.js      |    54 +
 interface/app/store/gridOfferings.js               |    55 +
 interface/app/store/gridOutputs.js                 |    71 +
 interface/app/store/gridProceduresList.js          |    57 +
 interface/app/store/gridUoms.js                    |    46 +
 interface/app/store/serverstatus.js                |    86 +
 interface/app/store/vplist.js                      |    44 +
 interface/app/view/BasePage.js                     |     7 +
 interface/app/view/Calc.js                         |   355 +
 interface/app/view/Chart.js                        |  1238 +
 interface/app/view/ChartContainer.js               |    21 +
 interface/app/view/CheckColumn.js                  |    95 +
 interface/app/view/Editor1.js                      |    71 +
 interface/app/view/FormDataQuality.js              |    22 +
 interface/app/view/FormPaths.js                    |    21 +
 interface/app/view/MainMenu.js                     |    21 +
 interface/app/view/MainMenu2.js                    |   306 +
 interface/app/view/MainPanel.js                    |    51 +
 interface/app/view/MyGridPanel15.js                |    21 +
 interface/app/view/ObservationEditor.js            |   134 +
 .../view/ObservationEditorAdvancedOperations.js    |    41 +
 interface/app/view/ObservationEditorColumn.js      |   319 +
 interface/app/view/ProcedureChart.js               |   650 +
 interface/app/view/ProcedureChooser.js             |   287 +
 interface/app/view/ProcedureGrid.js                |   510 +
 interface/app/view/ProcedureGridEditor.js          |   123 +
 interface/app/view/ProcedurePlotter.js             |    38 +
 interface/app/view/TestCsv.js                      |   127 +
 interface/app/view/Viewer.js                       |    79 +
 interface/app/view/VirtualProcedureEditor.js       |   391 +
 interface/app/view/Wizard.js                       |    21 +
 interface/app/view/about.js                        |    33 +
 interface/app/view/config.js                       |    21 +
 interface/app/view/contactinfo.js                  |    20 +
 interface/app/view/contacts.js                     |    21 +
 interface/app/view/database.js                     |    58 +
 interface/app/view/geo.js                          |    24 +
 interface/app/view/getobservation.js               |   147 +
 interface/app/view/identification.js               |    21 +
 interface/app/view/newservice.js                   |   115 +
 interface/app/view/obsPropEditor.js                |   320 +
 interface/app/view/offeringsEditor.js              |   252 +
 interface/app/view/paths.js                        |    24 +
 interface/app/view/procedure.js                    |  1313 +
 interface/app/view/proceduresList.js               |   146 +
 interface/app/view/provider.js                     |    21 +
 interface/app/view/qualityindexEditor.js           |   154 +
 interface/app/view/serviceEditor.js                |   114 +
 interface/app/view/serviceconfig.js                |   112 +
 interface/app/view/serviceurl.js                   |    21 +
 interface/app/view/status.js                       |    64 +
 interface/app/view/ui/BasePage.js                  |    62 +
 interface/app/view/ui/Calc.js                      |   335 +
 interface/app/view/ui/CenterPage.js                |   384 +
 interface/app/view/ui/Chart.js                     |   260 +
 interface/app/view/ui/ChartContainer.js            |    37 +
 interface/app/view/ui/CheckColumn.js               |    23 +
 interface/app/view/ui/Editor1.js                   |    75 +
 interface/app/view/ui/FormDataQuality.js           |    99 +
 interface/app/view/ui/FormPaths.js                 |    44 +
 interface/app/view/ui/MainMenu.js                  |   225 +
 interface/app/view/ui/MainMenu2.js                 |   112 +
 interface/app/view/ui/MainPanel.js                 |   149 +
 interface/app/view/ui/MyGridPanel15.js             |    44 +
 interface/app/view/ui/ObservationEditor.js         |   213 +
 .../view/ui/ObservationEditorAdvancedOperations.js |    40 +
 interface/app/view/ui/ObservationEditorColumn.js   |    56 +
 interface/app/view/ui/ProcedureChart.js            |   197 +
 interface/app/view/ui/ProcedureChooser.js          |    98 +
 interface/app/view/ui/ProcedureGrid.js             |    26 +
 interface/app/view/ui/ProcedureGridEditor.js       |    98 +
 interface/app/view/ui/ProcedurePlotter.js          |   115 +
 interface/app/view/ui/TestCsv.js                   |   123 +
 interface/app/view/ui/Viewer.js                    |    96 +
 interface/app/view/ui/VirtualProcedureEditor.js    |   342 +
 interface/app/view/ui/Wizard.js                    |    67 +
 interface/app/view/ui/WizardPage.js                |   183 +
 interface/app/view/ui/about.js                     |    73 +
 interface/app/view/ui/config.js                    |   117 +
 interface/app/view/ui/contactinfo.js               |   114 +
 interface/app/view/ui/contacts.js                  |    94 +
 interface/app/view/ui/database.js                  |    97 +
 interface/app/view/ui/geo.js                       |    77 +
 interface/app/view/ui/getobservation.js            |    43 +
 interface/app/view/ui/identification.js            |    88 +
 interface/app/view/ui/newservice.js                |   134 +
 interface/app/view/ui/obsPropEditor.js             |   201 +
 interface/app/view/ui/offeringsEditor.js           |   305 +
 interface/app/view/ui/paths.js                     |    43 +
 interface/app/view/ui/procedure.js                 |  1421 +
 interface/app/view/ui/proceduresList.js            |    82 +
 interface/app/view/ui/provider.js                  |   118 +
 interface/app/view/ui/qualityindexEditor.js        |   132 +
 interface/app/view/ui/serviceEditor.js             |   112 +
 interface/app/view/ui/serviceconfig.js             |   286 +
 interface/app/view/ui/serviceurl.js                |    45 +
 interface/app/view/ui/status.js                    |   110 +
 interface/app/view/ui/uomsEditor.js                |   125 +
 interface/app/view/uomsEditor.js                   |   131 +
 interface/codemirror/LICENSE                       |    23 +
 interface/codemirror/README.md                     |     6 +
 interface/codemirror/demo/activeline.html          |    72 +
 interface/codemirror/demo/changemode.html          |    50 +
 interface/codemirror/demo/closetag.html            |    65 +
 interface/codemirror/demo/complete.html            |    70 +
 interface/codemirror/demo/emacs.html               |    59 +
 interface/codemirror/demo/folding.html             |    61 +
 interface/codemirror/demo/formatting.html          |    80 +
 interface/codemirror/demo/fullscreen.html          |   152 +
 interface/codemirror/demo/loadmode.html            |    39 +
 interface/codemirror/demo/marker.html              |    52 +
 interface/codemirror/demo/matchhighlighter.html    |    37 +
 interface/codemirror/demo/mustache.html            |    57 +
 interface/codemirror/demo/preview.html             |    76 +
 interface/codemirror/demo/resize.html              |    43 +
 interface/codemirror/demo/runmode.html             |    49 +
 interface/codemirror/demo/search.html              |    83 +
 interface/codemirror/demo/theme.html               |    76 +
 interface/codemirror/demo/vim.html                 |    50 +
 interface/codemirror/demo/visibletabs.html         |    61 +
 interface/codemirror/doc/baboon.png                |   Bin 0 -> 23299 bytes
 interface/codemirror/doc/baboon_vector.svg         |   153 +
 interface/codemirror/doc/compress.html             |   146 +
 interface/codemirror/doc/docs.css                  |   154 +
 interface/codemirror/doc/internals.html            |   494 +
 interface/codemirror/doc/manual.html               |  1100 +
 interface/codemirror/doc/oldrelease.html           |   251 +
 interface/codemirror/doc/reporting.html            |    57 +
 interface/codemirror/doc/upgrade_v2.2.html         |    95 +
 interface/codemirror/index.html                    |   411 +
 interface/codemirror/keymap/emacs.js               |    29 +
 interface/codemirror/keymap/vim.js                 |   500 +
 interface/codemirror/lib/codemirror.css            |   126 +
 interface/codemirror/lib/codemirror.js             |  3076 +
 interface/codemirror/lib/util/closetag.js          |   146 +
 interface/codemirror/lib/util/dialog.css           |    23 +
 interface/codemirror/lib/util/dialog.js            |    63 +
 interface/codemirror/lib/util/foldcode.js          |   191 +
 interface/codemirror/lib/util/formatting.js        |   294 +
 interface/codemirror/lib/util/javascript-hint.js   |   134 +
 interface/codemirror/lib/util/loadmode.js          |    51 +
 interface/codemirror/lib/util/match-highlighter.js |    44 +
 interface/codemirror/lib/util/overlay.js           |    51 +
 interface/codemirror/lib/util/runmode.js           |    49 +
 interface/codemirror/lib/util/search.js            |   114 +
 interface/codemirror/lib/util/searchcursor.js      |   117 +
 interface/codemirror/lib/util/simple-hint.css      |    16 +
 interface/codemirror/lib/util/simple-hint.js       |    72 +
 interface/codemirror/mode/javascript/index.html    |    77 +
 interface/codemirror/mode/javascript/javascript.js |   361 +
 interface/codemirror/mode/python/LICENSE.txt       |    21 +
 interface/codemirror/mode/python/index.html        |   122 +
 interface/codemirror/mode/python/python.js         |   338 +
 interface/codemirror/test/index.html               |    28 +
 interface/codemirror/test/mode_test.css            |    22 +
 interface/codemirror/test/mode_test.js             |   164 +
 interface/codemirror/test/test.js                  |   337 +
 interface/codemirror/theme/ambiance.css            |    82 +
 interface/codemirror/theme/blackboard.css          |    25 +
 interface/codemirror/theme/cobalt.css              |    18 +
 interface/codemirror/theme/eclipse.css             |    25 +
 interface/codemirror/theme/elegant.css             |    10 +
 interface/codemirror/theme/erlang-dark.css         |    21 +
 interface/codemirror/theme/lesser-dark.css         |    45 +
 interface/codemirror/theme/monokai.css             |    28 +
 interface/codemirror/theme/neat.css                |     9 +
 interface/codemirror/theme/night.css               |    21 +
 interface/codemirror/theme/rubyblue.css            |    21 +
 interface/codemirror/theme/xq-dark.css             |    46 +
 interface/css/images/checked.gif                   |   Bin 0 -> 959 bytes
 interface/css/images/grid3-hd-btn.gif              |   Bin 0 -> 502 bytes
 interface/css/images/unchecked.gif                 |   Bin 0 -> 941 bytes
 interface/css/main.css                             |   636 +
 interface/data/observations.json                   |    98 +
 interface/data/observedproperties.json             |    12 +
 interface/data/offerings.json                      |    12 +
 interface/data/procedures.json                     |    12 +
 interface/designer.html                            |    14 +
 interface/designer.js                              |   191 +
 interface/designer_includeOrder.txt                |   106 +
 interface/dev.html                                 |   223 +
 interface/dygraphs/dygraph-combined.js             |     2 +
 interface/ext/codemirror.js                        |   989 +
 interface/ext/ext-all-debug.js                     | 93093 +++++++++++++++++++
 interface/ext/resources/css/ext-all-access.css     |     1 +
 interface/ext/resources/css/ext-all-gray.css       |     1 +
 interface/ext/resources/css/ext-all-scoped.css     |     1 +
 interface/ext/resources/css/ext-all.css            |     1 +
 interface/ext/resources/css/ext-ie-scoped.css      |     1 +
 interface/ext/resources/css/ext-ie.css             |     1 +
 interface/ext/resources/css/ext-sandbox.css        |     1 +
 .../ext/resources/css/ext-standard-scoped.css      |     1 +
 interface/ext/resources/css/ext-standard.css       |     1 +
 interface/ext/resources/sass/config.rb             |    22 +
 interface/ext/resources/sass/ext-all-access.scss   |   219 +
 interface/ext/resources/sass/ext-all-gray.scss     |   118 +
 interface/ext/resources/sass/ext-all-scoped.scss   |     5 +
 interface/ext/resources/sass/ext-all.scss          |     2 +
 interface/ext/resources/sass/ext-ie-scoped.scss    |    16 +
 interface/ext/resources/sass/ext-ie.scss           |    14 +
 interface/ext/resources/sass/ext-sandbox.scss      |     4 +
 .../ext/resources/sass/ext-standard-scoped.scss    |    16 +
 interface/ext/resources/sass/ext-standard.scss     |    14 +
 interface/ext/resources/themes/compass_init.rb     |     6 +
 .../images/access/boundlist/trigger-arrow.png      |   Bin 0 -> 2869 bytes
 .../themes/images/access/box/corners-blue.gif      |   Bin 0 -> 1010 bytes
 .../resources/themes/images/access/box/corners.gif |   Bin 0 -> 1005 bytes
 .../resources/themes/images/access/box/l-blue.gif  |   Bin 0 -> 810 bytes
 .../ext/resources/themes/images/access/box/l.gif   |   Bin 0 -> 810 bytes
 .../resources/themes/images/access/box/r-blue.gif  |   Bin 0 -> 810 bytes
 .../ext/resources/themes/images/access/box/r.gif   |   Bin 0 -> 810 bytes
 .../resources/themes/images/access/box/tb-blue.gif |   Bin 0 -> 843 bytes
 .../ext/resources/themes/images/access/box/tb.gif  |   Bin 0 -> 839 bytes
 .../btn-group/btn-group-default-framed-corners.gif |   Bin 0 -> 1594 bytes
 .../btn-group-default-framed-notitle-corners.gif   |   Bin 0 -> 1594 bytes
 .../btn-group-default-framed-notitle-sides.gif     |   Bin 0 -> 1625 bytes
 .../btn-group/btn-group-default-framed-sides.gif   |   Bin 0 -> 1633 bytes
 .../access/btn-group/btn-group-framed-corners.gif  |   Bin 0 -> 1627 bytes
 .../btn-group/btn-group-framed-notitle-corners.gif |   Bin 0 -> 1624 bytes
 .../btn-group/btn-group-framed-notitle-sides.gif   |   Bin 0 -> 1651 bytes
 .../access/btn-group/btn-group-framed-sides.gif    |   Bin 0 -> 1687 bytes
 .../images/access/btn/btn-default-large-bg.gif     |   Bin 0 -> 1854 bytes
 .../access/btn/btn-default-large-corners.gif       |   Bin 0 -> 1615 bytes
 .../access/btn/btn-default-large-disabled-bg.gif   |   Bin 0 -> 1825 bytes
 .../btn/btn-default-large-disabled-corners.gif     |   Bin 0 -> 1616 bytes
 .../btn/btn-default-large-disabled-sides.gif       |   Bin 0 -> 1923 bytes
 .../access/btn/btn-default-large-focus-bg.gif      |   Bin 0 -> 1868 bytes
 .../access/btn/btn-default-large-focus-corners.gif |   Bin 0 -> 1623 bytes
 .../access/btn/btn-default-large-focus-sides.gif   |   Bin 0 -> 1952 bytes
 .../access/btn/btn-default-large-over-bg.gif       |   Bin 0 -> 1868 bytes
 .../access/btn/btn-default-large-over-corners.gif  |   Bin 0 -> 1623 bytes
 .../access/btn/btn-default-large-over-sides.gif    |   Bin 0 -> 1952 bytes
 .../access/btn/btn-default-large-pressed-bg.gif    |   Bin 0 -> 1855 bytes
 .../btn/btn-default-large-pressed-corners.gif      |   Bin 0 -> 1620 bytes
 .../access/btn/btn-default-large-pressed-sides.gif |   Bin 0 -> 1947 bytes
 .../images/access/btn/btn-default-large-sides.gif  |   Bin 0 -> 1938 bytes
 .../images/access/btn/btn-default-medium-bg.gif    |   Bin 0 -> 1831 bytes
 .../access/btn/btn-default-medium-corners.gif      |   Bin 0 -> 1615 bytes
 .../access/btn/btn-default-medium-disabled-bg.gif  |   Bin 0 -> 1809 bytes
 .../btn/btn-default-medium-disabled-corners.gif    |   Bin 0 -> 1618 bytes
 .../btn/btn-default-medium-disabled-sides.gif      |   Bin 0 -> 1907 bytes
 .../access/btn/btn-default-medium-focus-bg.gif     |   Bin 0 -> 1847 bytes
 .../btn/btn-default-medium-focus-corners.gif       |   Bin 0 -> 1624 bytes
 .../access/btn/btn-default-medium-focus-sides.gif  |   Bin 0 -> 1929 bytes
 .../access/btn/btn-default-medium-over-bg.gif      |   Bin 0 -> 1847 bytes
 .../access/btn/btn-default-medium-over-corners.gif |   Bin 0 -> 1624 bytes
 .../access/btn/btn-default-medium-over-sides.gif   |   Bin 0 -> 1929 bytes
 .../access/btn/btn-default-medium-pressed-bg.gif   |   Bin 0 -> 1835 bytes
 .../btn/btn-default-medium-pressed-corners.gif     |   Bin 0 -> 1620 bytes
 .../btn/btn-default-medium-pressed-sides.gif       |   Bin 0 -> 1927 bytes
 .../images/access/btn/btn-default-medium-sides.gif |   Bin 0 -> 1913 bytes
 .../images/access/btn/btn-default-small-bg.gif     |   Bin 0 -> 1814 bytes
 .../access/btn/btn-default-small-corners.gif       |   Bin 0 -> 1615 bytes
 .../access/btn/btn-default-small-disabled-bg.gif   |   Bin 0 -> 1793 bytes
 .../btn/btn-default-small-disabled-corners.gif     |   Bin 0 -> 1618 bytes
 .../btn/btn-default-small-disabled-sides.gif       |   Bin 0 -> 1887 bytes
 .../access/btn/btn-default-small-focus-bg.gif      |   Bin 0 -> 1817 bytes
 .../access/btn/btn-default-small-focus-corners.gif |   Bin 0 -> 1624 bytes
 .../access/btn/btn-default-small-focus-sides.gif   |   Bin 0 -> 1897 bytes
 .../access/btn/btn-default-small-over-bg.gif       |   Bin 0 -> 1817 bytes
 .../access/btn/btn-default-small-over-corners.gif  |   Bin 0 -> 1624 bytes
 .../access/btn/btn-default-small-over-sides.gif    |   Bin 0 -> 1897 bytes
 .../access/btn/btn-default-small-pressed-bg.gif    |   Bin 0 -> 1813 bytes
 .../btn/btn-default-small-pressed-corners.gif      |   Bin 0 -> 1620 bytes
 .../access/btn/btn-default-small-pressed-sides.gif |   Bin 0 -> 1897 bytes
 .../images/access/btn/btn-default-small-sides.gif  |   Bin 0 -> 1895 bytes
 .../btn/btn-default-toolbar-large-corners.gif      |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-large-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-large-disabled-sides.gif   |   Bin 0 -> 1596 bytes
 .../btn-default-toolbar-large-focus-corners.gif    |   Bin 0 -> 1620 bytes
 .../btn/btn-default-toolbar-large-focus-sides.gif  |   Bin 0 -> 1623 bytes
 .../btn/btn-default-toolbar-large-over-corners.gif |   Bin 0 -> 1620 bytes
 .../btn/btn-default-toolbar-large-over-sides.gif   |   Bin 0 -> 1623 bytes
 .../btn-default-toolbar-large-pressed-corners.gif  |   Bin 0 -> 1616 bytes
 .../btn-default-toolbar-large-pressed-sides.gif    |   Bin 0 -> 1623 bytes
 .../access/btn/btn-default-toolbar-large-sides.gif |   Bin 0 -> 1596 bytes
 .../btn/btn-default-toolbar-medium-corners.gif     |   Bin 0 -> 1585 bytes
 ...btn-default-toolbar-medium-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-medium-disabled-sides.gif  |   Bin 0 -> 1594 bytes
 .../btn-default-toolbar-medium-focus-corners.gif   |   Bin 0 -> 1621 bytes
 .../btn/btn-default-toolbar-medium-focus-sides.gif |   Bin 0 -> 1616 bytes
 .../btn-default-toolbar-medium-over-corners.gif    |   Bin 0 -> 1621 bytes
 .../btn/btn-default-toolbar-medium-over-sides.gif  |   Bin 0 -> 1616 bytes
 .../btn-default-toolbar-medium-pressed-corners.gif |   Bin 0 -> 1616 bytes
 .../btn-default-toolbar-medium-pressed-sides.gif   |   Bin 0 -> 1616 bytes
 .../btn/btn-default-toolbar-medium-sides.gif       |   Bin 0 -> 1594 bytes
 .../btn/btn-default-toolbar-small-corners.gif      |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-small-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-small-disabled-sides.gif   |   Bin 0 -> 1591 bytes
 .../btn-default-toolbar-small-focus-corners.gif    |   Bin 0 -> 1621 bytes
 .../btn/btn-default-toolbar-small-focus-sides.gif  |   Bin 0 -> 1607 bytes
 .../btn/btn-default-toolbar-small-over-corners.gif |   Bin 0 -> 1621 bytes
 .../btn/btn-default-toolbar-small-over-sides.gif   |   Bin 0 -> 1607 bytes
 .../btn-default-toolbar-small-pressed-corners.gif  |   Bin 0 -> 1616 bytes
 .../btn-default-toolbar-small-pressed-sides.gif    |   Bin 0 -> 1607 bytes
 .../access/btn/btn-default-toolbar-small-sides.gif |   Bin 0 -> 1591 bytes
 .../access/btn/btn-toolbar-large-corners.gif       |   Bin 0 -> 1585 bytes
 .../btn/btn-toolbar-large-disabled-corners.gif     |   Bin 0 -> 1585 bytes
 .../btn/btn-toolbar-large-disabled-sides.gif       |   Bin 0 -> 1596 bytes
 .../access/btn/btn-toolbar-large-focus-corners.gif |   Bin 0 -> 1620 bytes
 .../access/btn/btn-toolbar-large-focus-sides.gif   |   Bin 0 -> 1623 bytes
 .../access/btn/btn-toolbar-large-over-corners.gif  |   Bin 0 -> 1620 bytes
 .../access/btn/btn-toolbar-large-over-sides.gif    |   Bin 0 -> 1623 bytes
 .../btn/btn-toolbar-large-pressed-corners.gif      |   Bin 0 -> 1616 bytes
 .../access/btn/btn-toolbar-large-pressed-sides.gif |   Bin 0 -> 1623 bytes
 .../images/access/btn/btn-toolbar-large-sides.gif  |   Bin 0 -> 1596 bytes
 .../access/btn/btn-toolbar-medium-corners.gif      |   Bin 0 -> 1585 bytes
 .../btn/btn-toolbar-medium-disabled-corners.gif    |   Bin 0 -> 1585 bytes
 .../btn/btn-toolbar-medium-disabled-sides.gif      |   Bin 0 -> 1594 bytes
 .../btn/btn-toolbar-medium-focus-corners.gif       |   Bin 0 -> 1621 bytes
 .../access/btn/btn-toolbar-medium-focus-sides.gif  |   Bin 0 -> 1616 bytes
 .../access/btn/btn-toolbar-medium-over-corners.gif |   Bin 0 -> 1621 bytes
 .../access/btn/btn-toolbar-medium-over-sides.gif   |   Bin 0 -> 1616 bytes
 .../btn/btn-toolbar-medium-pressed-corners.gif     |   Bin 0 -> 1616 bytes
 .../btn/btn-toolbar-medium-pressed-sides.gif       |   Bin 0 -> 1616 bytes
 .../images/access/btn/btn-toolbar-medium-sides.gif |   Bin 0 -> 1594 bytes
 .../access/btn/btn-toolbar-small-corners.gif       |   Bin 0 -> 1585 bytes
 .../btn/btn-toolbar-small-disabled-corners.gif     |   Bin 0 -> 1585 bytes
 .../btn/btn-toolbar-small-disabled-sides.gif       |   Bin 0 -> 1591 bytes
 .../access/btn/btn-toolbar-small-focus-corners.gif |   Bin 0 -> 1621 bytes
 .../access/btn/btn-toolbar-small-focus-sides.gif   |   Bin 0 -> 1607 bytes
 .../access/btn/btn-toolbar-small-over-corners.gif  |   Bin 0 -> 1621 bytes
 .../access/btn/btn-toolbar-small-over-sides.gif    |   Bin 0 -> 1607 bytes
 .../btn/btn-toolbar-small-pressed-corners.gif      |   Bin 0 -> 1616 bytes
 .../access/btn/btn-toolbar-small-pressed-sides.gif |   Bin 0 -> 1607 bytes
 .../images/access/btn/btn-toolbar-small-sides.gif  |   Bin 0 -> 1591 bytes
 .../themes/images/access/button/arrow.gif          |   Bin 0 -> 833 bytes
 .../resources/themes/images/access/button/btn.gif  |   Bin 0 -> 2871 bytes
 .../themes/images/access/button/group-cs.gif       |   Bin 0 -> 2459 bytes
 .../themes/images/access/button/group-lr.gif       |   Bin 0 -> 861 bytes
 .../themes/images/access/button/group-tb.gif       |   Bin 0 -> 70 bytes
 .../images/access/button/s-arrow-b-noline.gif      |   Bin 0 -> 904 bytes
 .../themes/images/access/button/s-arrow-b.gif      |   Bin 0 -> 943 bytes
 .../themes/images/access/button/s-arrow-bo.gif     |   Bin 0 -> 961 bytes
 .../themes/images/access/button/s-arrow-light.gif  |   Bin 0 -> 116 bytes
 .../themes/images/access/button/s-arrow-noline.gif |   Bin 0 -> 875 bytes
 .../themes/images/access/button/s-arrow-o.gif      |   Bin 0 -> 155 bytes
 .../themes/images/access/button/s-arrow.gif        |   Bin 0 -> 956 bytes
 .../access/datepicker/datepicker-footer-bg.gif     |   Bin 0 -> 1835 bytes
 .../access/datepicker/datepicker-header-bg.gif     |   Bin 0 -> 1858 bytes
 .../resources/themes/images/access/dd/drop-add.gif |   Bin 0 -> 1001 bytes
 .../themes/images/access/dd/drop-between.gif       |   Bin 0 -> 907 bytes
 .../resources/themes/images/access/dd/drop-no.gif  |   Bin 0 -> 949 bytes
 .../themes/images/access/dd/drop-over.gif          |   Bin 0 -> 911 bytes
 .../themes/images/access/dd/drop-under.gif         |   Bin 0 -> 911 bytes
 .../resources/themes/images/access/dd/drop-yes.gif |   Bin 0 -> 1016 bytes
 .../themes/images/access/editor/tb-sprite.gif      |   Bin 0 -> 1994 bytes
 .../form-invalid-tip-default-corners.gif           |   Bin 0 -> 1690 bytes
 .../form-invalid-tip-default-sides.gif             |   Bin 0 -> 1647 bytes
 .../themes/images/access/form/checkbox.gif         |   Bin 0 -> 3210 bytes
 .../themes/images/access/form/checkbox_.gif        |   Bin 0 -> 2061 bytes
 .../themes/images/access/form/clear-trigger.gif    |   Bin 0 -> 2027 bytes
 .../themes/images/access/form/date-trigger.gif     |   Bin 0 -> 1620 bytes
 .../images/access/form/error-tip-corners.gif       |   Bin 0 -> 4183 bytes
 .../themes/images/access/form/exclamation.gif      |   Bin 0 -> 614 bytes
 .../resources/themes/images/access/form/radio.gif  |   Bin 0 -> 3444 bytes
 .../resources/themes/images/access/form/radio_.gif |   Bin 0 -> 1746 bytes
 .../themes/images/access/form/search-trigger.gif   |   Bin 0 -> 1534 bytes
 .../themes/images/access/form/spinner-small.gif    |   Bin 0 -> 1145 bytes
 .../themes/images/access/form/spinner.gif          |   Bin 0 -> 1145 bytes
 .../themes/images/access/form/spinner_.gif         |   Bin 0 -> 1943 bytes
 .../themes/images/access/form/text-bg.gif          |   Bin 0 -> 66 bytes
 .../themes/images/access/form/trigger-tpl.gif      |   Bin 0 -> 908 bytes
 .../themes/images/access/form/trigger.gif          |   Bin 0 -> 1451 bytes
 .../themes/images/access/grid/arrow-left-white.gif |   Bin 0 -> 825 bytes
 .../images/access/grid/arrow-right-white.gif       |   Bin 0 -> 825 bytes
 .../themes/images/access/grid/cell-special-bg.gif  |   Bin 0 -> 1636 bytes
 .../access/grid/cell-special-selected-bg.gif       |   Bin 0 -> 1637 bytes
 .../themes/images/access/grid/checked.gif          |   Bin 0 -> 959 bytes
 .../themes/images/access/grid/col-move-bottom.gif  |   Bin 0 -> 868 bytes
 .../themes/images/access/grid/col-move-top.gif     |   Bin 0 -> 869 bytes
 .../themes/images/access/grid/column-header-bg.gif |   Bin 0 -> 1863 bytes
 .../images/access/grid/column-header-over-bg.gif   |   Bin 0 -> 1860 bytes
 .../themes/images/access/grid/columns.gif          |   Bin 0 -> 962 bytes
 .../images/access/grid/dd-insert-arrow-left.gif    |   Bin 0 -> 299 bytes
 .../images/access/grid/dd-insert-arrow-left.png    |   Bin 0 -> 345 bytes
 .../images/access/grid/dd-insert-arrow-right.gif   |   Bin 0 -> 301 bytes
 .../images/access/grid/dd-insert-arrow-right.png   |   Bin 0 -> 349 bytes
 .../resources/themes/images/access/grid/dirty.gif  |   Bin 0 -> 68 bytes
 .../resources/themes/images/access/grid/done.gif   |   Bin 0 -> 133 bytes
 .../themes/images/access/grid/drop-no.gif          |   Bin 0 -> 947 bytes
 .../themes/images/access/grid/drop-yes.gif         |   Bin 0 -> 860 bytes
 .../themes/images/access/grid/footer-bg.gif        |   Bin 0 -> 834 bytes
 .../themes/images/access/grid/grid-blue-hd.gif     |   Bin 0 -> 829 bytes
 .../themes/images/access/grid/grid-blue-split.gif  |   Bin 0 -> 47 bytes
 .../themes/images/access/grid/grid-hrow.gif        |   Bin 0 -> 855 bytes
 .../themes/images/access/grid/grid-loading.gif     |   Bin 0 -> 701 bytes
 .../themes/images/access/grid/grid-split.gif       |   Bin 0 -> 817 bytes
 .../themes/images/access/grid/grid-vista-hd.gif    |   Bin 0 -> 829 bytes
 .../themes/images/access/grid/grid3-hd-btn.gif     |   Bin 0 -> 419 bytes
 .../themes/images/access/grid/grid3-hrow-over.gif  |   Bin 0 -> 268 bytes
 .../themes/images/access/grid/grid3-hrow.gif       |   Bin 0 -> 164 bytes
 .../images/access/grid/grid3-special-col-bg.gif    |   Bin 0 -> 162 bytes
 .../access/grid/grid3-special-col-sel-bg.gif       |   Bin 0 -> 162 bytes
 .../themes/images/access/grid/group-by.gif         |   Bin 0 -> 917 bytes
 .../themes/images/access/grid/group-collapse.gif   |   Bin 0 -> 77 bytes
 .../images/access/grid/group-expand-sprite.gif     |   Bin 0 -> 131 bytes
 .../themes/images/access/grid/group-expand.gif     |   Bin 0 -> 82 bytes
 .../resources/themes/images/access/grid/hd-pop.gif |   Bin 0 -> 839 bytes
 .../themes/images/access/grid/hmenu-asc.gif        |   Bin 0 -> 931 bytes
 .../themes/images/access/grid/hmenu-desc.gif       |   Bin 0 -> 930 bytes
 .../themes/images/access/grid/hmenu-lock.gif       |   Bin 0 -> 955 bytes
 .../themes/images/access/grid/hmenu-lock.png       |   Bin 0 -> 648 bytes
 .../themes/images/access/grid/hmenu-unlock.gif     |   Bin 0 -> 971 bytes
 .../themes/images/access/grid/hmenu-unlock.png     |   Bin 0 -> 697 bytes
 .../themes/images/access/grid/invalid_line.gif     |   Bin 0 -> 46 bytes
 .../themes/images/access/grid/loading.gif          |   Bin 0 -> 771 bytes
 .../resources/themes/images/access/grid/mso-hd.gif |   Bin 0 -> 875 bytes
 .../resources/themes/images/access/grid/nowait.gif |   Bin 0 -> 884 bytes
 .../images/access/grid/page-first-disabled.gif     |   Bin 0 -> 340 bytes
 .../themes/images/access/grid/page-first.gif       |   Bin 0 -> 96 bytes
 .../images/access/grid/page-last-disabled.gif      |   Bin 0 -> 340 bytes
 .../themes/images/access/grid/page-last.gif        |   Bin 0 -> 96 bytes
 .../images/access/grid/page-next-disabled.gif      |   Bin 0 -> 195 bytes
 .../themes/images/access/grid/page-next.gif        |   Bin 0 -> 82 bytes
 .../images/access/grid/page-prev-disabled.gif      |   Bin 0 -> 197 bytes
 .../themes/images/access/grid/page-prev.gif        |   Bin 0 -> 82 bytes
 .../themes/images/access/grid/pick-button.gif      |   Bin 0 -> 1036 bytes
 .../themes/images/access/grid/property-cell-bg.gif |   Bin 0 -> 915 bytes
 .../themes/images/access/grid/refresh-disabled.gif |   Bin 0 -> 577 bytes
 .../themes/images/access/grid/refresh.gif          |   Bin 0 -> 91 bytes
 .../themes/images/access/grid/row-check-sprite.gif |   Bin 0 -> 1083 bytes
 .../images/access/grid/row-expand-sprite.gif       |   Bin 0 -> 955 bytes
 .../themes/images/access/grid/row-over.gif         |   Bin 0 -> 823 bytes
 .../themes/images/access/grid/row-sel.gif          |   Bin 0 -> 823 bytes
 .../themes/images/access/grid/sort-hd.gif          |   Bin 0 -> 2075 bytes
 .../themes/images/access/grid/sort_asc.gif         |   Bin 0 -> 74 bytes
 .../themes/images/access/grid/sort_desc.gif        |   Bin 0 -> 73 bytes
 .../themes/images/access/grid/unchecked.gif        |   Bin 0 -> 941 bytes
 .../resources/themes/images/access/grid/wait.gif   |   Bin 0 -> 1100 bytes
 .../themes/images/access/layout/mini-bottom.gif    |   Bin 0 -> 856 bytes
 .../themes/images/access/layout/mini-left.gif      |   Bin 0 -> 871 bytes
 .../themes/images/access/layout/mini-right.gif     |   Bin 0 -> 872 bytes
 .../themes/images/access/layout/mini-top.gif       |   Bin 0 -> 856 bytes
 .../themes/images/access/menu/checked.gif          |   Bin 0 -> 959 bytes
 .../themes/images/access/menu/group-checked.gif    |   Bin 0 -> 856 bytes
 .../themes/images/access/menu/item-over.gif        |   Bin 0 -> 820 bytes
 .../images/access/menu/menu-item-active-bg.gif     |   Bin 0 -> 1839 bytes
 .../access/menu/menu-item-active-corners.gif       |   Bin 0 -> 1620 bytes
 .../images/access/menu/menu-item-active-sides.gif  |   Bin 0 -> 1918 bytes
 .../themes/images/access/menu/menu-parent.gif      |   Bin 0 -> 73 bytes
 .../resources/themes/images/access/menu/menu.gif   |   Bin 0 -> 826 bytes
 .../themes/images/access/menu/unchecked.gif        |   Bin 0 -> 941 bytes
 .../images/access/panel-header/panel-header-bg.gif |   Bin 0 -> 1860 bytes
 .../panel-header-default-bottom-bg.gif             |   Bin 0 -> 1854 bytes
 .../panel-header-default-framed-bottom-bg.gif      |   Bin 0 -> 1837 bytes
 .../panel-header-default-framed-bottom-corners.gif |   Bin 0 -> 1621 bytes
 ...el-header-default-framed-bottom-noborder-bg.gif |   Bin 0 -> 1831 bytes
 ...ader-default-framed-bottom-noborder-corners.gif |   Bin 0 -> 1607 bytes
 ...header-default-framed-bottom-noborder-sides.gif |   Bin 0 -> 1735 bytes
 .../panel-header-default-framed-bottom-sides.gif   |   Bin 0 -> 1900 bytes
 ...l-header-default-framed-collapsed-bottom-bg.gif |   Bin 0 -> 1833 bytes
 ...der-default-framed-collapsed-bottom-corners.gif |   Bin 0 -> 1629 bytes
 ...eader-default-framed-collapsed-bottom-sides.gif |   Bin 0 -> 1898 bytes
 ...nel-header-default-framed-collapsed-left-bg.gif |   Bin 0 -> 1640 bytes
 ...eader-default-framed-collapsed-left-corners.gif |   Bin 0 -> 1639 bytes
 ...-header-default-framed-collapsed-left-sides.gif |   Bin 0 -> 1801 bytes
 ...el-header-default-framed-collapsed-right-bg.gif |   Bin 0 -> 1641 bytes
 ...ader-default-framed-collapsed-right-corners.gif |   Bin 0 -> 1643 bytes
 ...header-default-framed-collapsed-right-sides.gif |   Bin 0 -> 1803 bytes
 ...anel-header-default-framed-collapsed-top-bg.gif |   Bin 0 -> 1831 bytes
 ...header-default-framed-collapsed-top-corners.gif |   Bin 0 -> 1629 bytes
 ...l-header-default-framed-collapsed-top-sides.gif |   Bin 0 -> 1898 bytes
 .../panel-header-default-framed-left-bg.gif        |   Bin 0 -> 1641 bytes
 .../panel-header-default-framed-left-corners.gif   |   Bin 0 -> 1631 bytes
 ...anel-header-default-framed-left-noborder-bg.gif |   Bin 0 -> 1639 bytes
 ...header-default-framed-left-noborder-corners.gif |   Bin 0 -> 1623 bytes
 ...l-header-default-framed-left-noborder-sides.gif |   Bin 0 -> 1746 bytes
 .../panel-header-default-framed-left-sides.gif     |   Bin 0 -> 1802 bytes
 .../panel-header-default-framed-right-bg.gif       |   Bin 0 -> 1642 bytes
 .../panel-header-default-framed-right-corners.gif  |   Bin 0 -> 1632 bytes
 ...nel-header-default-framed-right-noborder-bg.gif |   Bin 0 -> 1639 bytes
 ...eader-default-framed-right-noborder-corners.gif |   Bin 0 -> 1623 bytes
 ...-header-default-framed-right-noborder-sides.gif |   Bin 0 -> 1749 bytes
 .../panel-header-default-framed-right-sides.gif    |   Bin 0 -> 1804 bytes
 .../panel-header-default-framed-top-bg.gif         |   Bin 0 -> 1848 bytes
 .../panel-header-default-framed-top-corners.gif    |   Bin 0 -> 1620 bytes
 ...panel-header-default-framed-top-noborder-bg.gif |   Bin 0 -> 1838 bytes
 ...-header-default-framed-top-noborder-corners.gif |   Bin 0 -> 1606 bytes
 ...el-header-default-framed-top-noborder-sides.gif |   Bin 0 -> 1739 bytes
 .../panel-header-default-framed-top-sides.gif      |   Bin 0 -> 1905 bytes
 .../panel-header/panel-header-default-left-bg.gif  |   Bin 0 -> 1643 bytes
 .../panel-header/panel-header-default-right-bg.gif |   Bin 0 -> 1645 bytes
 .../panel-header/panel-header-default-top-bg.gif   |   Bin 0 -> 1859 bytes
 .../access/panel-header/panel-header-framed-bg.gif |   Bin 0 -> 1845 bytes
 .../panel-header/panel-header-framed-corners.gif   |   Bin 0 -> 1613 bytes
 .../panel-header/panel-header-framed-sides.gif     |   Bin 0 -> 1919 bytes
 .../panel-header/panel-header-vertical-bg.gif      |   Bin 0 -> 1601 bytes
 .../themes/images/access/panel/corners-sprite.gif  |   Bin 0 -> 577 bytes
 .../themes/images/access/panel/left-right.gif      |   Bin 0 -> 52 bytes
 .../themes/images/access/panel/light-hd.gif        |   Bin 0 -> 161 bytes
 .../access/panel/panel-default-framed-corners.gif  |   Bin 0 -> 1616 bytes
 .../panel-default-framed-noborder-corners.gif      |   Bin 0 -> 1607 bytes
 .../panel/panel-default-framed-noborder-sides.gif  |   Bin 0 -> 1625 bytes
 .../access/panel/panel-default-framed-sides.gif    |   Bin 0 -> 1693 bytes
 .../images/access/panel/panel-framed-corners.gif   |   Bin 0 -> 1614 bytes
 .../images/access/panel/panel-framed-sides.gif     |   Bin 0 -> 1693 bytes
 .../themes/images/access/panel/tool-sprite-tpl.gif |   Bin 0 -> 971 bytes
 .../themes/images/access/panel/tool-sprites.gif    |   Bin 0 -> 1981 bytes
 .../images/access/panel/tools-sprites-trans.gif    |   Bin 0 -> 2843 bytes
 .../themes/images/access/panel/top-bottom.gif      |   Bin 0 -> 116 bytes
 .../images/access/panel/white-corners-sprite.gif   |   Bin 0 -> 1366 bytes
 .../images/access/panel/white-left-right.gif       |   Bin 0 -> 52 bytes
 .../images/access/panel/white-top-bottom.gif       |   Bin 0 -> 115 bytes
 .../images/access/progress/progress-default-bg.gif |   Bin 0 -> 1839 bytes
 .../resources/themes/images/access/qtip/close.gif  |   Bin 0 -> 972 bytes
 .../images/access/qtip/tip-anchor-sprite.gif       |   Bin 0 -> 951 bytes
 .../themes/images/access/qtip/tip-sprite.gif       |   Bin 0 -> 3376 bytes
 .../themes/images/access/shared/blue-loading.gif   |   Bin 0 -> 3236 bytes
 .../themes/images/access/shared/glass-bg.gif       |   Bin 0 -> 103 bytes
 .../themes/images/access/shared/hd-sprite.gif      |   Bin 0 -> 673 bytes
 .../themes/images/access/shared/icon-error.gif     |   Bin 0 -> 1669 bytes
 .../themes/images/access/shared/icon-info.gif      |   Bin 0 -> 1586 bytes
 .../themes/images/access/shared/icon-question.gif  |   Bin 0 -> 1607 bytes
 .../themes/images/access/shared/icon-warning.gif   |   Bin 0 -> 1483 bytes
 .../themes/images/access/shared/large-loading.gif  |   Bin 0 -> 3236 bytes
 .../themes/images/access/shared/left-btn.gif       |   Bin 0 -> 77 bytes
 .../themes/images/access/shared/right-btn.gif      |   Bin 0 -> 79 bytes
 .../themes/images/access/sizer/e-handle-dark.gif   |   Bin 0 -> 248 bytes
 .../themes/images/access/sizer/e-handle.gif        |   Bin 0 -> 753 bytes
 .../themes/images/access/sizer/ne-handle-dark.gif  |   Bin 0 -> 66 bytes
 .../themes/images/access/sizer/ne-handle.gif       |   Bin 0 -> 115 bytes
 .../themes/images/access/sizer/nw-handle-dark.gif  |   Bin 0 -> 66 bytes
 .../themes/images/access/sizer/nw-handle.gif       |   Bin 0 -> 114 bytes
 .../themes/images/access/sizer/s-handle-dark.gif   |   Bin 0 -> 246 bytes
 .../themes/images/access/sizer/s-handle.gif        |   Bin 0 -> 494 bytes
 .../themes/images/access/sizer/se-handle-dark.gif  |   Bin 0 -> 65 bytes
 .../themes/images/access/sizer/se-handle.gif       |   Bin 0 -> 114 bytes
 .../themes/images/access/sizer/square.gif          |   Bin 0 -> 123 bytes
 .../themes/images/access/sizer/sw-handle-dark.gif  |   Bin 0 -> 66 bytes
 .../themes/images/access/sizer/sw-handle.gif       |   Bin 0 -> 116 bytes
 .../themes/images/access/slider/slider-bg.gif      |   Bin 0 -> 144 bytes
 .../themes/images/access/slider/slider-bg.png      |   Bin 0 -> 3636 bytes
 .../themes/images/access/slider/slider-thumb.gif   |   Bin 0 -> 437 bytes
 .../themes/images/access/slider/slider-thumb.png   |   Bin 0 -> 3436 bytes
 .../themes/images/access/slider/slider-v-bg.gif    |   Bin 0 -> 149 bytes
 .../themes/images/access/slider/slider-v-bg.png    |   Bin 0 -> 3630 bytes
 .../themes/images/access/slider/slider-v-thumb.gif |   Bin 0 -> 436 bytes
 .../themes/images/access/slider/slider-v-thumb.png |   Bin 0 -> 3432 bytes
 .../ext/resources/themes/images/access/spinner.gif |   Bin 0 -> 2048 bytes
 .../themes/images/access/tab-bar/scroll-left.gif   |   Bin 0 -> 996 bytes
 .../themes/images/access/tab-bar/scroll-right.gif  |   Bin 0 -> 999 bytes
 .../images/access/tab-bar/tab-bar-default-bg.gif   |   Bin 0 -> 1841 bytes
 .../access/tab/tab-bottom-active-corners.gif       |   Bin 0 -> 1640 bytes
 .../images/access/tab/tab-bottom-active-sides.gif  |   Bin 0 -> 1621 bytes
 .../images/access/tab/tab-bottom-corners.gif       |   Bin 0 -> 1640 bytes
 .../access/tab/tab-bottom-disabled-corners.gif     |   Bin 0 -> 1640 bytes
 .../access/tab/tab-bottom-disabled-sides.gif       |   Bin 0 -> 1621 bytes
 .../images/access/tab/tab-bottom-over-corners.gif  |   Bin 0 -> 1640 bytes
 .../images/access/tab/tab-bottom-over-sides.gif    |   Bin 0 -> 1621 bytes
 .../themes/images/access/tab/tab-bottom-sides.gif  |   Bin 0 -> 1621 bytes
 .../tab/tab-default-bottom-active-corners.gif      |   Bin 0 -> 1639 bytes
 .../access/tab/tab-default-bottom-active-sides.gif |   Bin 0 -> 1628 bytes
 .../access/tab/tab-default-bottom-corners.gif      |   Bin 0 -> 1643 bytes
 .../tab/tab-default-bottom-disabled-corners.gif    |   Bin 0 -> 1630 bytes
 .../tab/tab-default-bottom-disabled-sides.gif      |   Bin 0 -> 1628 bytes
 .../access/tab/tab-default-bottom-over-corners.gif |   Bin 0 -> 1643 bytes
 .../access/tab/tab-default-bottom-over-sides.gif   |   Bin 0 -> 1628 bytes
 .../images/access/tab/tab-default-bottom-sides.gif |   Bin 0 -> 1628 bytes
 .../access/tab/tab-default-top-active-corners.gif  |   Bin 0 -> 1625 bytes
 .../access/tab/tab-default-top-active-sides.gif    |   Bin 0 -> 1620 bytes
 .../images/access/tab/tab-default-top-corners.gif  |   Bin 0 -> 1631 bytes
 .../tab/tab-default-top-disabled-corners.gif       |   Bin 0 -> 1621 bytes
 .../access/tab/tab-default-top-disabled-sides.gif  |   Bin 0 -> 1620 bytes
 .../access/tab/tab-default-top-over-corners.gif    |   Bin 0 -> 1631 bytes
 .../access/tab/tab-default-top-over-sides.gif      |   Bin 0 -> 1620 bytes
 .../images/access/tab/tab-default-top-sides.gif    |   Bin 0 -> 1620 bytes
 .../images/access/tab/tab-top-active-corners.gif   |   Bin 0 -> 1625 bytes
 .../images/access/tab/tab-top-active-sides.gif     |   Bin 0 -> 1614 bytes
 .../themes/images/access/tab/tab-top-corners.gif   |   Bin 0 -> 1625 bytes
 .../images/access/tab/tab-top-disabled-corners.gif |   Bin 0 -> 1625 bytes
 .../images/access/tab/tab-top-disabled-sides.gif   |   Bin 0 -> 1614 bytes
 .../images/access/tab/tab-top-over-corners.gif     |   Bin 0 -> 1625 bytes
 .../images/access/tab/tab-top-over-sides.gif       |   Bin 0 -> 1614 bytes
 .../themes/images/access/tab/tab-top-sides.gif     |   Bin 0 -> 1614 bytes
 .../access/tabs/tab-btm-inactive-left-bg.gif       |   Bin 0 -> 130 bytes
 .../access/tabs/tab-btm-inactive-right-bg.gif      |   Bin 0 -> 513 bytes
 .../themes/images/access/tabs/tab-btm-left-bg.gif  |   Bin 0 -> 512 bytes
 .../themes/images/access/tabs/tab-btm-right-bg.gif |   Bin 0 -> 117 bytes
 .../themes/images/access/tabs/tab-close.gif        |   Bin 0 -> 76 bytes
 .../themes/images/access/tabs/tab-strip-bg.gif     |   Bin 0 -> 827 bytes
 .../themes/images/access/tabs/tab-strip-btm-bg.gif |   Bin 0 -> 70 bytes
 .../themes/images/access/tabs/tabs-sprite.gif      |   Bin 0 -> 1221 bytes
 .../themes/images/access/tip/tip-corners.gif       |   Bin 0 -> 1619 bytes
 .../themes/images/access/tip/tip-corners.png       |   Bin 0 -> 258 bytes
 .../themes/images/access/tip/tip-sides.gif         |   Bin 0 -> 1623 bytes
 .../themes/images/access/tip/tip-sides.png         |   Bin 0 -> 129 bytes
 .../resources/themes/images/access/toolbar/bg.gif  |   Bin 0 -> 82 bytes
 .../images/access/toolbar/btn-arrow-light.gif      |   Bin 0 -> 916 bytes
 .../themes/images/access/toolbar/btn-arrow.gif     |   Bin 0 -> 919 bytes
 .../themes/images/access/toolbar/btn-over-bg.gif   |   Bin 0 -> 837 bytes
 .../themes/images/access/toolbar/gray-bg.gif       |   Bin 0 -> 832 bytes
 .../themes/images/access/toolbar/more.gif          |   Bin 0 -> 67 bytes
 .../themes/images/access/toolbar/s-arrow-bo.gif    |   Bin 0 -> 186 bytes
 .../themes/images/access/toolbar/scroll-left.gif   |   Bin 0 -> 996 bytes
 .../themes/images/access/toolbar/scroll-right.gif  |   Bin 0 -> 999 bytes
 .../themes/images/access/toolbar/tb-btn-sprite.gif |   Bin 0 -> 1127 bytes
 .../images/access/toolbar/tb-xl-btn-sprite.gif     |   Bin 0 -> 1663 bytes
 .../themes/images/access/toolbar/tb-xl-sep.gif     |   Bin 0 -> 810 bytes
 .../images/access/toolbar/toolbar-default-bg.gif   |   Bin 0 -> 1807 bytes
 .../themes/images/access/tools/tool-sprite-tpl.gif |   Bin 0 -> 971 bytes
 .../themes/images/access/tools/tool-sprites.gif    |   Bin 0 -> 1981 bytes
 .../images/access/tools/tools-sprites-trans.gif    |   Bin 0 -> 2843 bytes
 .../resources/themes/images/access/tree/arrows.gif |   Bin 0 -> 183 bytes
 .../themes/images/access/tree/drop-above.gif       |   Bin 0 -> 911 bytes
 .../themes/images/access/tree/drop-add.gif         |   Bin 0 -> 1001 bytes
 .../themes/images/access/tree/drop-append.gif      |   Bin 0 -> 1001 bytes
 .../themes/images/access/tree/drop-below.gif       |   Bin 0 -> 911 bytes
 .../themes/images/access/tree/drop-between.gif     |   Bin 0 -> 907 bytes
 .../themes/images/access/tree/drop-no.gif          |   Bin 0 -> 949 bytes
 .../themes/images/access/tree/drop-over.gif        |   Bin 0 -> 911 bytes
 .../themes/images/access/tree/drop-under.gif       |   Bin 0 -> 911 bytes
 .../themes/images/access/tree/drop-yes.gif         |   Bin 0 -> 1016 bytes
 .../images/access/tree/elbow-end-minus-nl.gif      |   Bin 0 -> 86 bytes
 .../themes/images/access/tree/elbow-end-minus.gif  |   Bin 0 -> 104 bytes
 .../images/access/tree/elbow-end-plus-nl.gif       |   Bin 0 -> 89 bytes
 .../themes/images/access/tree/elbow-end-plus.gif   |   Bin 0 -> 108 bytes
 .../themes/images/access/tree/elbow-end.gif        |   Bin 0 -> 844 bytes
 .../themes/images/access/tree/elbow-line.gif       |   Bin 0 -> 846 bytes
 .../themes/images/access/tree/elbow-minus-nl.gif   |   Bin 0 -> 86 bytes
 .../themes/images/access/tree/elbow-minus.gif      |   Bin 0 -> 106 bytes
 .../themes/images/access/tree/elbow-plus-nl.gif    |   Bin 0 -> 89 bytes
 .../themes/images/access/tree/elbow-plus.gif       |   Bin 0 -> 111 bytes
 .../resources/themes/images/access/tree/elbow.gif  |   Bin 0 -> 850 bytes
 .../themes/images/access/tree/folder-open.gif      |   Bin 0 -> 342 bytes
 .../resources/themes/images/access/tree/folder.gif |   Bin 0 -> 340 bytes
 .../resources/themes/images/access/tree/leaf.gif   |   Bin 0 -> 945 bytes
 .../themes/images/access/tree/loading.gif          |   Bin 0 -> 771 bytes
 .../ext/resources/themes/images/access/tree/s.gif  |   Bin 0 -> 43 bytes
 .../images/access/util/splitter/mini-bottom.gif    |   Bin 0 -> 856 bytes
 .../images/access/util/splitter/mini-left.gif      |   Bin 0 -> 871 bytes
 .../images/access/util/splitter/mini-right.gif     |   Bin 0 -> 872 bytes
 .../images/access/util/splitter/mini-top.gif       |   Bin 0 -> 856 bytes
 .../window-header-default-bottom-corners.gif       |   Bin 0 -> 1660 bytes
 .../window-header-default-bottom-sides.gif         |   Bin 0 -> 1628 bytes
 .../window-header-default-left-corners.gif         |   Bin 0 -> 1651 bytes
 .../window-header-default-left-sides.gif           |   Bin 0 -> 1612 bytes
 .../window-header-default-right-corners.gif        |   Bin 0 -> 1657 bytes
 .../window-header-default-right-sides.gif          |   Bin 0 -> 1612 bytes
 .../window-header-default-top-corners.gif          |   Bin 0 -> 1663 bytes
 .../window-header-default-top-sides.gif            |   Bin 0 -> 1628 bytes
 .../themes/images/access/window/icon-error.gif     |   Bin 0 -> 256 bytes
 .../themes/images/access/window/icon-info.gif      |   Bin 0 -> 172 bytes
 .../themes/images/access/window/icon-question.gif  |   Bin 0 -> 217 bytes
 .../themes/images/access/window/icon-warning.gif   |   Bin 0 -> 173 bytes
 .../themes/images/access/window/window-corners.gif |   Bin 0 -> 1683 bytes
 .../access/window/window-default-corners.gif       |   Bin 0 -> 1677 bytes
 .../images/access/window/window-default-sides.gif  |   Bin 0 -> 1776 bytes
 .../themes/images/access/window/window-sides.gif   |   Bin 0 -> 1776 bytes
 .../images/default/boundlist/trigger-arrow.png     |   Bin 0 -> 2869 bytes
 .../themes/images/default/box/corners-blue.gif     |   Bin 0 -> 1010 bytes
 .../themes/images/default/box/corners.gif          |   Bin 0 -> 1005 bytes
 .../resources/themes/images/default/box/l-blue.gif |   Bin 0 -> 810 bytes
 .../ext/resources/themes/images/default/box/l.gif  |   Bin 0 -> 810 bytes
 .../resources/themes/images/default/box/r-blue.gif |   Bin 0 -> 810 bytes
 .../ext/resources/themes/images/default/box/r.gif  |   Bin 0 -> 810 bytes
 .../themes/images/default/box/tb-blue.gif          |   Bin 0 -> 851 bytes
 .../ext/resources/themes/images/default/box/tb.gif |   Bin 0 -> 839 bytes
 .../btn-group/btn-group-default-framed-corners.gif |   Bin 0 -> 1598 bytes
 .../btn-group-default-framed-notitle-corners.gif   |   Bin 0 -> 1598 bytes
 .../btn-group-default-framed-notitle-sides.gif     |   Bin 0 -> 1623 bytes
 .../btn-group/btn-group-default-framed-sides.gif   |   Bin 0 -> 1630 bytes
 .../images/default/btn/btn-default-large-bg.gif    |   Bin 0 -> 1825 bytes
 .../default/btn/btn-default-large-corners.gif      |   Bin 0 -> 1616 bytes
 .../default/btn/btn-default-large-disabled-bg.gif  |   Bin 0 -> 1825 bytes
 .../btn/btn-default-large-disabled-corners.gif     |   Bin 0 -> 1614 bytes
 .../btn/btn-default-large-disabled-sides.gif       |   Bin 0 -> 1923 bytes
 .../default/btn/btn-default-large-focus-bg.gif     |   Bin 0 -> 1840 bytes
 .../btn/btn-default-large-focus-corners.gif        |   Bin 0 -> 1621 bytes
 .../default/btn/btn-default-large-focus-sides.gif  |   Bin 0 -> 1923 bytes
 .../default/btn/btn-default-large-over-bg.gif      |   Bin 0 -> 1840 bytes
 .../default/btn/btn-default-large-over-corners.gif |   Bin 0 -> 1621 bytes
 .../default/btn/btn-default-large-over-sides.gif   |   Bin 0 -> 1923 bytes
 .../default/btn/btn-default-large-pressed-bg.gif   |   Bin 0 -> 1869 bytes
 .../btn/btn-default-large-pressed-corners.gif      |   Bin 0 -> 1619 bytes
 .../btn/btn-default-large-pressed-sides.gif        |   Bin 0 -> 1953 bytes
 .../images/default/btn/btn-default-large-sides.gif |   Bin 0 -> 1923 bytes
 .../images/default/btn/btn-default-medium-bg.gif   |   Bin 0 -> 1809 bytes
 .../default/btn/btn-default-medium-corners.gif     |   Bin 0 -> 1616 bytes
 .../default/btn/btn-default-medium-disabled-bg.gif |   Bin 0 -> 1809 bytes
 .../btn/btn-default-medium-disabled-corners.gif    |   Bin 0 -> 1614 bytes
 .../btn/btn-default-medium-disabled-sides.gif      |   Bin 0 -> 1907 bytes
 .../default/btn/btn-default-medium-focus-bg.gif    |   Bin 0 -> 1817 bytes
 .../btn/btn-default-medium-focus-corners.gif       |   Bin 0 -> 1622 bytes
 .../default/btn/btn-default-medium-focus-sides.gif |   Bin 0 -> 1897 bytes
 .../default/btn/btn-default-medium-over-bg.gif     |   Bin 0 -> 1817 bytes
 .../btn/btn-default-medium-over-corners.gif        |   Bin 0 -> 1622 bytes
 .../default/btn/btn-default-medium-over-sides.gif  |   Bin 0 -> 1897 bytes
 .../default/btn/btn-default-medium-pressed-bg.gif  |   Bin 0 -> 1849 bytes
 .../btn/btn-default-medium-pressed-corners.gif     |   Bin 0 -> 1619 bytes
 .../btn/btn-default-medium-pressed-sides.gif       |   Bin 0 -> 1929 bytes
 .../default/btn/btn-default-medium-sides.gif       |   Bin 0 -> 1907 bytes
 .../images/default/btn/btn-default-small-bg.gif    |   Bin 0 -> 1791 bytes
 .../default/btn/btn-default-small-corners.gif      |   Bin 0 -> 1614 bytes
 .../default/btn/btn-default-small-disabled-bg.gif  |   Bin 0 -> 1791 bytes
 .../btn/btn-default-small-disabled-corners.gif     |   Bin 0 -> 1614 bytes
 .../btn/btn-default-small-disabled-sides.gif       |   Bin 0 -> 1878 bytes
 .../default/btn/btn-default-small-focus-bg.gif     |   Bin 0 -> 1800 bytes
 .../btn/btn-default-small-focus-corners.gif        |   Bin 0 -> 1622 bytes
 .../default/btn/btn-default-small-focus-sides.gif  |   Bin 0 -> 1879 bytes
 .../default/btn/btn-default-small-over-bg.gif      |   Bin 0 -> 1800 bytes
 .../default/btn/btn-default-small-over-corners.gif |   Bin 0 -> 1621 bytes
 .../default/btn/btn-default-small-over-sides.gif   |   Bin 0 -> 1879 bytes
 .../default/btn/btn-default-small-pressed-bg.gif   |   Bin 0 -> 1811 bytes
 .../btn/btn-default-small-pressed-corners.gif      |   Bin 0 -> 1621 bytes
 .../btn/btn-default-small-pressed-sides.gif        |   Bin 0 -> 1892 bytes
 .../images/default/btn/btn-default-small-sides.gif |   Bin 0 -> 1873 bytes
 .../btn/btn-default-toolbar-large-corners.gif      |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-large-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-large-disabled-sides.gif   |   Bin 0 -> 1596 bytes
 .../btn/btn-default-toolbar-large-focus-bg.gif     |   Bin 0 -> 1851 bytes
 .../btn-default-toolbar-large-focus-corners.gif    |   Bin 0 -> 1621 bytes
 .../btn/btn-default-toolbar-large-focus-sides.gif  |   Bin 0 -> 1939 bytes
 .../btn/btn-default-toolbar-large-over-bg.gif      |   Bin 0 -> 1851 bytes
 .../btn/btn-default-toolbar-large-over-corners.gif |   Bin 0 -> 1621 bytes
 .../btn/btn-default-toolbar-large-over-sides.gif   |   Bin 0 -> 1939 bytes
 .../btn/btn-default-toolbar-large-pressed-bg.gif   |   Bin 0 -> 1846 bytes
 .../btn-default-toolbar-large-pressed-corners.gif  |   Bin 0 -> 1623 bytes
 .../btn-default-toolbar-large-pressed-sides.gif    |   Bin 0 -> 1933 bytes
 .../btn/btn-default-toolbar-large-sides.gif        |   Bin 0 -> 1596 bytes
 .../btn/btn-default-toolbar-medium-corners.gif     |   Bin 0 -> 1585 bytes
 ...btn-default-toolbar-medium-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-medium-disabled-sides.gif  |   Bin 0 -> 1594 bytes
 .../btn/btn-default-toolbar-medium-focus-bg.gif    |   Bin 0 -> 1826 bytes
 .../btn-default-toolbar-medium-focus-corners.gif   |   Bin 0 -> 1622 bytes
 .../btn/btn-default-toolbar-medium-focus-sides.gif |   Bin 0 -> 1917 bytes
 .../btn/btn-default-toolbar-medium-over-bg.gif     |   Bin 0 -> 1826 bytes
 .../btn-default-toolbar-medium-over-corners.gif    |   Bin 0 -> 1622 bytes
 .../btn/btn-default-toolbar-medium-over-sides.gif  |   Bin 0 -> 1917 bytes
 .../btn/btn-default-toolbar-medium-pressed-bg.gif  |   Bin 0 -> 1846 bytes
 .../btn-default-toolbar-medium-pressed-corners.gif |   Bin 0 -> 1621 bytes
 .../btn-default-toolbar-medium-pressed-sides.gif   |   Bin 0 -> 1919 bytes
 .../btn/btn-default-toolbar-medium-sides.gif       |   Bin 0 -> 1594 bytes
 .../btn/btn-default-toolbar-small-corners.gif      |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-small-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-small-disabled-sides.gif   |   Bin 0 -> 1589 bytes
 .../btn/btn-default-toolbar-small-focus-bg.gif     |   Bin 0 -> 1799 bytes
 .../btn-default-toolbar-small-focus-corners.gif    |   Bin 0 -> 1622 bytes
 .../btn/btn-default-toolbar-small-focus-sides.gif  |   Bin 0 -> 1879 bytes
 .../btn/btn-default-toolbar-small-over-bg.gif      |   Bin 0 -> 1799 bytes
 .../btn/btn-default-toolbar-small-over-corners.gif |   Bin 0 -> 1622 bytes
 .../btn/btn-default-toolbar-small-over-sides.gif   |   Bin 0 -> 1879 bytes
 .../btn/btn-default-toolbar-small-pressed-bg.gif   |   Bin 0 -> 1813 bytes
 .../btn-default-toolbar-small-pressed-corners.gif  |   Bin 0 -> 1624 bytes
 .../btn-default-toolbar-small-pressed-sides.gif    |   Bin 0 -> 1892 bytes
 .../btn/btn-default-toolbar-small-sides.gif        |   Bin 0 -> 1589 bytes
 .../themes/images/default/button/arrow.gif         |   Bin 0 -> 53 bytes
 .../resources/themes/images/default/button/btn.gif |   Bin 0 -> 4298 bytes
 .../themes/images/default/button/group-cs.gif      |   Bin 0 -> 2459 bytes
 .../themes/images/default/button/group-lr.gif      |   Bin 0 -> 861 bytes
 .../themes/images/default/button/group-tb.gif      |   Bin 0 -> 846 bytes
 .../images/default/button/s-arrow-b-noline.gif     |   Bin 0 -> 898 bytes
 .../themes/images/default/button/s-arrow-b.gif     |   Bin 0 -> 937 bytes
 .../themes/images/default/button/s-arrow-bo.gif    |   Bin 0 -> 139 bytes
 .../themes/images/default/button/s-arrow-light.gif |   Bin 0 -> 116 bytes
 .../images/default/button/s-arrow-noline.gif       |   Bin 0 -> 863 bytes
 .../themes/images/default/button/s-arrow-o.gif     |   Bin 0 -> 937 bytes
 .../themes/images/default/button/s-arrow.gif       |   Bin 0 -> 937 bytes
 .../default/datepicker/datepicker-footer-bg.gif    |   Bin 0 -> 1833 bytes
 .../default/datepicker/datepicker-footer-bg.png    |   Bin 0 -> 328 bytes
 .../default/datepicker/datepicker-header-bg.gif    |   Bin 0 -> 1860 bytes
 .../default/datepicker/datepicker-header-bg.png    |   Bin 0 -> 309 bytes
 .../themes/images/default/dd/drop-add.gif          |   Bin 0 -> 1001 bytes
 .../resources/themes/images/default/dd/drop-no.gif |   Bin 0 -> 949 bytes
 .../themes/images/default/dd/drop-yes.gif          |   Bin 0 -> 1016 bytes
 .../themes/images/default/editor/tb-sprite.gif     |   Bin 0 -> 2072 bytes
 .../form-invalid-tip/form-invalid-tip-corners.gif  |   Bin 0 -> 1688 bytes
 .../form-invalid-tip-default-corners.gif           |   Bin 0 -> 1690 bytes
 .../form-invalid-tip-default-sides.gif             |   Bin 0 -> 1647 bytes
 .../form-invalid-tip/form-invalid-tip-sides.gif    |   Bin 0 -> 1647 bytes
 .../themes/images/default/form/checkbox.gif        |   Bin 0 -> 2061 bytes
 .../themes/images/default/form/clear-trigger.gif   |   Bin 0 -> 1988 bytes
 .../themes/images/default/form/date-trigger.gif    |   Bin 0 -> 1573 bytes
 .../images/default/form/error-tip-corners.gif      |   Bin 0 -> 4183 bytes
 .../themes/images/default/form/exclamation.gif     |   Bin 0 -> 996 bytes
 .../resources/themes/images/default/form/radio.gif |   Bin 0 -> 1746 bytes
 .../themes/images/default/form/search-trigger.gif  |   Bin 0 -> 2182 bytes
 .../themes/images/default/form/spinner-small.gif   |   Bin 0 -> 743 bytes
 .../themes/images/default/form/spinner.gif         |   Bin 0 -> 1975 bytes
 .../themes/images/default/form/text-bg.gif         |   Bin 0 -> 819 bytes
 .../themes/images/default/form/trigger-square.gif  |   Bin 0 -> 1810 bytes
 .../themes/images/default/form/trigger-tpl.gif     |   Bin 0 -> 1487 bytes
 .../themes/images/default/form/trigger.gif         |   Bin 0 -> 1796 bytes
 .../images/default/grid/arrow-left-white.gif       |   Bin 0 -> 825 bytes
 .../images/default/grid/arrow-right-white.gif      |   Bin 0 -> 825 bytes
 .../themes/images/default/grid/cell-special-bg.gif |   Bin 0 -> 1636 bytes
 .../themes/images/default/grid/cell-special-bg.png |   Bin 0 -> 121 bytes
 .../default/grid/cell-special-selected-bg.gif      |   Bin 0 -> 1640 bytes
 .../default/grid/cell-special-selected-bg.png      |   Bin 0 -> 136 bytes
 .../themes/images/default/grid/checked.gif         |   Bin 0 -> 959 bytes
 .../themes/images/default/grid/col-move-bottom.gif |   Bin 0 -> 868 bytes
 .../themes/images/default/grid/col-move-top.gif    |   Bin 0 -> 869 bytes
 .../images/default/grid/column-header-bg.gif       |   Bin 0 -> 1858 bytes
 .../images/default/grid/column-header-bg.png       |   Bin 0 -> 293 bytes
 .../images/default/grid/column-header-over-bg.gif  |   Bin 0 -> 1767 bytes
 .../images/default/grid/column-header-over-bg.png  |   Bin 0 -> 283 bytes
 .../themes/images/default/grid/columns.gif         |   Bin 0 -> 962 bytes
 .../images/default/grid/dd-insert-arrow-left.gif   |   Bin 0 -> 299 bytes
 .../images/default/grid/dd-insert-arrow-left.png   |   Bin 0 -> 345 bytes
 .../images/default/grid/dd-insert-arrow-right.gif  |   Bin 0 -> 301 bytes
 .../images/default/grid/dd-insert-arrow-right.png  |   Bin 0 -> 349 bytes
 .../resources/themes/images/default/grid/dirty.gif |   Bin 0 -> 832 bytes
 .../resources/themes/images/default/grid/done.gif  |   Bin 0 -> 133 bytes
 .../themes/images/default/grid/drop-no.gif         |   Bin 0 -> 947 bytes
 .../themes/images/default/grid/drop-yes.gif        |   Bin 0 -> 860 bytes
 .../themes/images/default/grid/footer-bg.gif       |   Bin 0 -> 834 bytes
 .../themes/images/default/grid/grid-blue-hd.gif    |   Bin 0 -> 829 bytes
 .../themes/images/default/grid/grid-blue-split.gif |   Bin 0 -> 817 bytes
 .../themes/images/default/grid/grid-hrow.gif       |   Bin 0 -> 855 bytes
 .../themes/images/default/grid/grid-loading.gif    |   Bin 0 -> 701 bytes
 .../themes/images/default/grid/grid-split.gif      |   Bin 0 -> 817 bytes
 .../themes/images/default/grid/grid-vista-hd.gif   |   Bin 0 -> 829 bytes
 .../themes/images/default/grid/grid3-hd-btn.gif    |   Bin 0 -> 1229 bytes
 .../themes/images/default/grid/grid3-hrow-over.gif |   Bin 0 -> 823 bytes
 .../themes/images/default/grid/grid3-hrow.gif      |   Bin 0 -> 836 bytes
 .../themes/images/default/grid/grid3-rowheader.gif |   Bin 0 -> 43 bytes
 .../themes/images/default/grid/group-by.gif        |   Bin 0 -> 917 bytes
 .../themes/images/default/grid/group-collapse.gif  |   Bin 0 -> 881 bytes
 .../images/default/grid/group-expand-sprite.gif    |   Bin 0 -> 955 bytes
 .../themes/images/default/grid/group-expand.gif    |   Bin 0 -> 884 bytes
 .../themes/images/default/grid/hd-pop.gif          |   Bin 0 -> 839 bytes
 .../themes/images/default/grid/hmenu-asc.gif       |   Bin 0 -> 931 bytes
 .../themes/images/default/grid/hmenu-desc.gif      |   Bin 0 -> 930 bytes
 .../themes/images/default/grid/hmenu-lock.gif      |   Bin 0 -> 955 bytes
 .../themes/images/default/grid/hmenu-lock.png      |   Bin 0 -> 648 bytes
 .../themes/images/default/grid/hmenu-unlock.gif    |   Bin 0 -> 971 bytes
 .../themes/images/default/grid/hmenu-unlock.png    |   Bin 0 -> 697 bytes
 .../themes/images/default/grid/invalid_line.gif    |   Bin 0 -> 815 bytes
 .../themes/images/default/grid/loading.gif         |   Bin 0 -> 771 bytes
 .../themes/images/default/grid/mso-hd.gif          |   Bin 0 -> 875 bytes
 .../themes/images/default/grid/nowait.gif          |   Bin 0 -> 884 bytes
 .../images/default/grid/page-first-disabled.gif    |   Bin 0 -> 925 bytes
 .../themes/images/default/grid/page-first.gif      |   Bin 0 -> 925 bytes
 .../images/default/grid/page-last-disabled.gif     |   Bin 0 -> 923 bytes
 .../themes/images/default/grid/page-last.gif       |   Bin 0 -> 923 bytes
 .../images/default/grid/page-next-disabled.gif     |   Bin 0 -> 875 bytes
 .../themes/images/default/grid/page-next.gif       |   Bin 0 -> 875 bytes
 .../images/default/grid/page-prev-disabled.gif     |   Bin 0 -> 879 bytes
 .../themes/images/default/grid/page-prev.gif       |   Bin 0 -> 879 bytes
 .../themes/images/default/grid/pick-button.gif     |   Bin 0 -> 1036 bytes
 .../images/default/grid/property-cell-bg.gif       |   Bin 0 -> 915 bytes
 .../default/grid/property-cell-selected-bg.gif     |   Bin 0 -> 843 bytes
 .../images/default/grid/refresh-disabled.gif       |   Bin 0 -> 577 bytes
 .../themes/images/default/grid/refresh.gif         |   Bin 0 -> 977 bytes
 .../images/default/grid/row-check-sprite.gif       |   Bin 0 -> 1083 bytes
 .../images/default/grid/row-expand-sprite.gif      |   Bin 0 -> 955 bytes
 .../themes/images/default/grid/row-over.gif        |   Bin 0 -> 823 bytes
 .../themes/images/default/grid/row-sel.gif         |   Bin 0 -> 823 bytes
 .../themes/images/default/grid/sort-hd.gif         |   Bin 0 -> 1473 bytes
 .../themes/images/default/grid/sort_asc.gif        |   Bin 0 -> 830 bytes
 .../themes/images/default/grid/sort_desc.gif       |   Bin 0 -> 833 bytes
 .../themes/images/default/grid/unchecked.gif       |   Bin 0 -> 941 bytes
 .../resources/themes/images/default/grid/wait.gif  |   Bin 0 -> 1100 bytes
 .../themes/images/default/layout/mini-bottom.gif   |   Bin 0 -> 856 bytes
 .../themes/images/default/layout/mini-left.gif     |   Bin 0 -> 871 bytes
 .../themes/images/default/layout/mini-right.gif    |   Bin 0 -> 872 bytes
 .../themes/images/default/layout/mini-top.gif      |   Bin 0 -> 856 bytes
 .../themes/images/default/menu/checked.gif         |   Bin 0 -> 959 bytes
 .../themes/images/default/menu/group-checked.gif   |   Bin 0 -> 891 bytes
 .../themes/images/default/menu/item-over.gif       |   Bin 0 -> 47 bytes
 .../images/default/menu/menu-item-active-bg.gif    |   Bin 0 -> 1833 bytes
 .../default/menu/menu-item-active-corners.gif      |   Bin 0 -> 1621 bytes
 .../images/default/menu/menu-item-active-sides.gif |   Bin 0 -> 1909 bytes
 .../themes/images/default/menu/menu-parent.gif     |   Bin 0 -> 854 bytes
 .../resources/themes/images/default/menu/menu.gif  |   Bin 0 -> 834 bytes
 .../themes/images/default/menu/unchecked.gif       |   Bin 0 -> 941 bytes
 .../panel-header-default-bottom-bg.gif             |   Bin 0 -> 1862 bytes
 .../panel-header-default-framed-bottom-bg.gif      |   Bin 0 -> 1839 bytes
 .../panel-header-default-framed-bottom-corners.gif |   Bin 0 -> 1648 bytes
 .../panel-header-default-framed-bottom-sides.gif   |   Bin 0 -> 2015 bytes
 ...l-header-default-framed-collapsed-bottom-bg.gif |   Bin 0 -> 1820 bytes
 ...der-default-framed-collapsed-bottom-corners.gif |   Bin 0 -> 1667 bytes
 ...eader-default-framed-collapsed-bottom-sides.gif |   Bin 0 -> 1998 bytes
 ...nel-header-default-framed-collapsed-left-bg.gif |   Bin 0 -> 1634 bytes
 ...eader-default-framed-collapsed-left-corners.gif |   Bin 0 -> 1684 bytes
 ...-header-default-framed-collapsed-left-sides.gif |   Bin 0 -> 1831 bytes
 ...el-header-default-framed-collapsed-right-bg.gif |   Bin 0 -> 1634 bytes
 ...ader-default-framed-collapsed-right-corners.gif |   Bin 0 -> 1687 bytes
 ...header-default-framed-collapsed-right-sides.gif |   Bin 0 -> 1831 bytes
 ...anel-header-default-framed-collapsed-top-bg.gif |   Bin 0 -> 1821 bytes
 ...header-default-framed-collapsed-top-corners.gif |   Bin 0 -> 1668 bytes
 ...l-header-default-framed-collapsed-top-sides.gif |   Bin 0 -> 2002 bytes
 .../panel-header-default-framed-left-bg.gif        |   Bin 0 -> 1638 bytes
 .../panel-header-default-framed-left-corners.gif   |   Bin 0 -> 1669 bytes
 .../panel-header-default-framed-left-sides.gif     |   Bin 0 -> 1841 bytes
 .../panel-header-default-framed-right-bg.gif       |   Bin 0 -> 1639 bytes
 .../panel-header-default-framed-right-corners.gif  |   Bin 0 -> 1667 bytes
 .../panel-header-default-framed-right-sides.gif    |   Bin 0 -> 1844 bytes
 .../panel-header-default-framed-top-bg.gif         |   Bin 0 -> 1842 bytes
 .../panel-header-default-framed-top-corners.gif    |   Bin 0 -> 1652 bytes
 .../panel-header-default-framed-top-sides.gif      |   Bin 0 -> 2019 bytes
 .../panel-header/panel-header-default-left-bg.gif  |   Bin 0 -> 1640 bytes
 .../panel-header/panel-header-default-right-bg.gif |   Bin 0 -> 1640 bytes
 .../panel-header/panel-header-default-top-bg.gif   |   Bin 0 -> 1863 bytes
 .../default/panel/panel-default-framed-corners.gif |   Bin 0 -> 1639 bytes
 .../default/panel/panel-default-framed-sides.gif   |   Bin 0 -> 1727 bytes
 .../default/progress/progress-default-bg.gif       |   Bin 0 -> 1837 bytes
 .../themes/images/default/shared/blue-loading.gif  |   Bin 0 -> 3236 bytes
 .../themes/images/default/shared/calendar.gif      |   Bin 0 -> 979 bytes
 .../themes/images/default/shared/glass-bg.gif      |   Bin 0 -> 873 bytes
 .../themes/images/default/shared/hd-sprite.gif     |   Bin 0 -> 1099 bytes
 .../themes/images/default/shared/icon-error.gif    |   Bin 0 -> 1669 bytes
 .../themes/images/default/shared/icon-info.gif     |   Bin 0 -> 1586 bytes
 .../themes/images/default/shared/icon-question.gif |   Bin 0 -> 1607 bytes
 .../themes/images/default/shared/icon-warning.gif  |   Bin 0 -> 1483 bytes
 .../themes/images/default/shared/large-loading.gif |   Bin 0 -> 3236 bytes
 .../themes/images/default/shared/left-btn.gif      |   Bin 0 -> 98 bytes
 .../themes/images/default/shared/loading-balls.gif |   Bin 0 -> 2118 bytes
 .../themes/images/default/shared/right-btn.gif     |   Bin 0 -> 99 bytes
 .../themes/images/default/shared/shadow-c.png      |   Bin 0 -> 118 bytes
 .../themes/images/default/shared/shadow-lr.png     |   Bin 0 -> 135 bytes
 .../themes/images/default/shared/shadow.png        |   Bin 0 -> 311 bytes
 .../themes/images/default/shared/warning.gif       |   Bin 0 -> 960 bytes
 .../themes/images/default/sizer/e-handle-dark.gif  |   Bin 0 -> 1062 bytes
 .../themes/images/default/sizer/e-handle.gif       |   Bin 0 -> 1586 bytes
 .../themes/images/default/sizer/ne-handle-dark.gif |   Bin 0 -> 839 bytes
 .../themes/images/default/sizer/ne-handle.gif      |   Bin 0 -> 854 bytes
 .../themes/images/default/sizer/nw-handle-dark.gif |   Bin 0 -> 839 bytes
 .../themes/images/default/sizer/nw-handle.gif      |   Bin 0 -> 853 bytes
 .../themes/images/default/sizer/s-handle-dark.gif  |   Bin 0 -> 1060 bytes
 .../themes/images/default/sizer/s-handle.gif       |   Bin 0 -> 1318 bytes
 .../themes/images/default/sizer/se-handle-dark.gif |   Bin 0 -> 838 bytes
 .../themes/images/default/sizer/se-handle.gif      |   Bin 0 -> 853 bytes
 .../themes/images/default/sizer/square.gif         |   Bin 0 -> 864 bytes
 .../themes/images/default/sizer/sw-handle-dark.gif |   Bin 0 -> 839 bytes
 .../themes/images/default/sizer/sw-handle.gif      |   Bin 0 -> 855 bytes
 .../themes/images/default/slider/slider-bg.gif     |   Bin 0 -> 145 bytes
 .../themes/images/default/slider/slider-bg.png     |   Bin 0 -> 1494 bytes
 .../themes/images/default/slider/slider-thumb.gif  |   Bin 0 -> 542 bytes
 .../themes/images/default/slider/slider-thumb.png  |   Bin 0 -> 933 bytes
 .../themes/images/default/slider/slider-v-bg.gif   |   Bin 0 -> 150 bytes
 .../themes/images/default/slider/slider-v-bg.png   |   Bin 0 -> 288 bytes
 .../images/default/slider/slider-v-thumb.gif       |   Bin 0 -> 533 bytes
 .../images/default/slider/slider-v-thumb.png       |   Bin 0 -> 883 bytes
 .../themes/images/default/tab-bar/scroll-left.gif  |   Bin 0 -> 457 bytes
 .../themes/images/default/tab-bar/scroll-right.gif |   Bin 0 -> 460 bytes
 .../images/default/tab-bar/tab-bar-default-bg.gif  |   Bin 0 -> 1829 bytes
 .../default/tab/tab-default-bottom-active-bg.gif   |   Bin 0 -> 1785 bytes
 .../tab/tab-default-bottom-active-corners.gif      |   Bin 0 -> 1639 bytes
 .../tab/tab-default-bottom-active-sides.gif        |   Bin 0 -> 1982 bytes
 .../images/default/tab/tab-default-bottom-bg.gif   |   Bin 0 -> 1789 bytes
 .../default/tab/tab-default-bottom-corners.gif     |   Bin 0 -> 1648 bytes
 .../default/tab/tab-default-bottom-disabled-bg.gif |   Bin 0 -> 1798 bytes
 .../tab/tab-default-bottom-disabled-corners.gif    |   Bin 0 -> 1648 bytes
 .../tab/tab-default-bottom-disabled-sides.gif      |   Bin 0 -> 1984 bytes
 .../default/tab/tab-default-bottom-over-bg.gif     |   Bin 0 -> 1791 bytes
 .../tab/tab-default-bottom-over-corners.gif        |   Bin 0 -> 1643 bytes
 .../default/tab/tab-default-bottom-over-sides.gif  |   Bin 0 -> 1985 bytes
 .../default/tab/tab-default-bottom-sides.gif       |   Bin 0 -> 1984 bytes
 .../images/default/tab/tab-default-close.gif       |   Bin 0 -> 896 bytes
 .../default/tab/tab-default-top-active-bg.gif      |   Bin 0 -> 1775 bytes
 .../default/tab/tab-default-top-active-corners.gif |   Bin 0 -> 1640 bytes
 .../default/tab/tab-default-top-active-sides.gif   |   Bin 0 -> 1962 bytes
 .../images/default/tab/tab-default-top-bg.gif      |   Bin 0 -> 1775 bytes
 .../images/default/tab/tab-default-top-corners.gif |   Bin 0 -> 1648 bytes
 .../default/tab/tab-default-top-disabled-bg.gif    |   Bin 0 -> 1794 bytes
 .../tab/tab-default-top-disabled-corners.gif       |   Bin 0 -> 1649 bytes
 .../default/tab/tab-default-top-disabled-sides.gif |   Bin 0 -> 1979 bytes
 .../images/default/tab/tab-default-top-over-bg.gif |   Bin 0 -> 1777 bytes
 .../default/tab/tab-default-top-over-corners.gif   |   Bin 0 -> 1649 bytes
 .../default/tab/tab-default-top-over-sides.gif     |   Bin 0 -> 1963 bytes
 .../images/default/tab/tab-default-top-sides.gif   |   Bin 0 -> 1962 bytes
 .../themes/images/default/tip/tip-corners.gif      |   Bin 0 -> 1621 bytes
 .../themes/images/default/tip/tip-sides.gif        |   Bin 0 -> 1623 bytes
 .../themes/images/default/toolbar/more.gif         |   Bin 0 -> 845 bytes
 .../themes/images/default/toolbar/scroll-left.gif  |   Bin 0 -> 1861 bytes
 .../themes/images/default/toolbar/scroll-right.gif |   Bin 0 -> 1865 bytes
 .../images/default/toolbar/toolbar-default-bg.gif  |   Bin 0 -> 1837 bytes
 .../images/default/tools/tool-sprite-tpl.gif       |   Bin 0 -> 971 bytes
 .../themes/images/default/tools/tool-sprites.gif   |   Bin 0 -> 5421 bytes
 .../images/default/tools/tools-sprites-trans.gif   |   Bin 0 -> 2843 bytes
 .../themes/images/default/tree/arrows.gif          |   Bin 0 -> 617 bytes
 .../themes/images/default/tree/drop-above.gif      |   Bin 0 -> 911 bytes
 .../themes/images/default/tree/drop-add.gif        |   Bin 0 -> 1001 bytes
 .../themes/images/default/tree/drop-append.gif     |   Bin 0 -> 1001 bytes
 .../themes/images/default/tree/drop-below.gif      |   Bin 0 -> 911 bytes
 .../themes/images/default/tree/drop-between.gif    |   Bin 0 -> 907 bytes
 .../themes/images/default/tree/drop-no.gif         |   Bin 0 -> 949 bytes
 .../themes/images/default/tree/drop-over.gif       |   Bin 0 -> 911 bytes
 .../themes/images/default/tree/drop-under.gif      |   Bin 0 -> 911 bytes
 .../themes/images/default/tree/drop-yes.gif        |   Bin 0 -> 1016 bytes
 .../images/default/tree/elbow-end-minus-nl.gif     |   Bin 0 -> 898 bytes
 .../themes/images/default/tree/elbow-end-minus.gif |   Bin 0 -> 905 bytes
 .../images/default/tree/elbow-end-plus-nl.gif      |   Bin 0 -> 900 bytes
 .../themes/images/default/tree/elbow-end-plus.gif  |   Bin 0 -> 907 bytes
 .../themes/images/default/tree/elbow-end.gif       |   Bin 0 -> 844 bytes
 .../themes/images/default/tree/elbow-line.gif      |   Bin 0 -> 846 bytes
 .../themes/images/default/tree/elbow-minus-nl.gif  |   Bin 0 -> 898 bytes
 .../themes/images/default/tree/elbow-minus.gif     |   Bin 0 -> 908 bytes
 .../themes/images/default/tree/elbow-plus-nl.gif   |   Bin 0 -> 900 bytes
 .../themes/images/default/tree/elbow-plus.gif      |   Bin 0 -> 910 bytes
 .../resources/themes/images/default/tree/elbow.gif |   Bin 0 -> 850 bytes
 .../themes/images/default/tree/folder-open.gif     |   Bin 0 -> 956 bytes
 .../themes/images/default/tree/folder.gif          |   Bin 0 -> 952 bytes
 .../resources/themes/images/default/tree/leaf.gif  |   Bin 0 -> 945 bytes
 .../themes/images/default/tree/loading.gif         |   Bin 0 -> 771 bytes
 .../ext/resources/themes/images/default/tree/s.gif |   Bin 0 -> 43 bytes
 .../images/default/util/splitter/mini-bottom.gif   |   Bin 0 -> 856 bytes
 .../images/default/util/splitter/mini-left.gif     |   Bin 0 -> 871 bytes
 .../images/default/util/splitter/mini-right.gif    |   Bin 0 -> 872 bytes
 .../images/default/util/splitter/mini-top.gif      |   Bin 0 -> 856 bytes
 .../window-header-default-bottom-corners.gif       |   Bin 0 -> 1664 bytes
 .../window-header-default-bottom-sides.gif         |   Bin 0 -> 1624 bytes
 .../window-header-default-left-corners.gif         |   Bin 0 -> 1655 bytes
 .../window-header-default-left-sides.gif           |   Bin 0 -> 1610 bytes
 .../window-header-default-right-corners.gif        |   Bin 0 -> 1656 bytes
 .../window-header-default-right-sides.gif          |   Bin 0 -> 1610 bytes
 .../window-header-default-top-corners.gif          |   Bin 0 -> 1668 bytes
 .../window-header-default-top-sides.gif            |   Bin 0 -> 1624 bytes
 .../default/window/window-default-corners.gif      |   Bin 0 -> 1686 bytes
 .../images/default/window/window-default-sides.gif |   Bin 0 -> 1776 bytes
 .../themes/images/gray/boundlist/trigger-arrow.png |   Bin 0 -> 2869 bytes
 .../themes/images/gray/box/corners-blue.gif        |   Bin 0 -> 1010 bytes
 .../resources/themes/images/gray/box/corners.gif   |   Bin 0 -> 1005 bytes
 .../resources/themes/images/gray/box/l-blue.gif    |   Bin 0 -> 810 bytes
 .../ext/resources/themes/images/gray/box/l.gif     |   Bin 0 -> 810 bytes
 .../resources/themes/images/gray/box/r-blue.gif    |   Bin 0 -> 810 bytes
 .../ext/resources/themes/images/gray/box/r.gif     |   Bin 0 -> 810 bytes
 .../resources/themes/images/gray/box/tb-blue.gif   |   Bin 0 -> 851 bytes
 .../ext/resources/themes/images/gray/box/tb.gif    |   Bin 0 -> 839 bytes
 .../btn-group/btn-group-default-framed-corners.gif |   Bin 0 -> 1598 bytes
 .../btn-group-default-framed-notitle-corners.gif   |   Bin 0 -> 1598 bytes
 .../btn-group-default-framed-notitle-sides.gif     |   Bin 0 -> 1623 bytes
 .../btn-group/btn-group-default-framed-sides.gif   |   Bin 0 -> 1630 bytes
 .../images/gray/btn/btn-default-large-bg.gif       |   Bin 0 -> 1839 bytes
 .../images/gray/btn/btn-default-large-corners.gif  |   Bin 0 -> 1619 bytes
 .../gray/btn/btn-default-large-disabled-bg.gif     |   Bin 0 -> 1847 bytes
 .../btn/btn-default-large-disabled-corners.gif     |   Bin 0 -> 1615 bytes
 .../gray/btn/btn-default-large-disabled-sides.gif  |   Bin 0 -> 1943 bytes
 .../images/gray/btn/btn-default-large-focus-bg.gif |   Bin 0 -> 1837 bytes
 .../gray/btn/btn-default-large-focus-corners.gif   |   Bin 0 -> 1619 bytes
 .../gray/btn/btn-default-large-focus-sides.gif     |   Bin 0 -> 1935 bytes
 .../images/gray/btn/btn-default-large-over-bg.gif  |   Bin 0 -> 1837 bytes
 .../gray/btn/btn-default-large-over-corners.gif    |   Bin 0 -> 1619 bytes
 .../gray/btn/btn-default-large-over-sides.gif      |   Bin 0 -> 1935 bytes
 .../gray/btn/btn-default-large-pressed-bg.gif      |   Bin 0 -> 1858 bytes
 .../gray/btn/btn-default-large-pressed-corners.gif |   Bin 0 -> 1619 bytes
 .../gray/btn/btn-default-large-pressed-sides.gif   |   Bin 0 -> 1945 bytes
 .../images/gray/btn/btn-default-large-sides.gif    |   Bin 0 -> 1938 bytes
 .../images/gray/btn/btn-default-medium-bg.gif      |   Bin 0 -> 1826 bytes
 .../images/gray/btn/btn-default-medium-corners.gif |   Bin 0 -> 1619 bytes
 .../gray/btn/btn-default-medium-disabled-bg.gif    |   Bin 0 -> 1832 bytes
 .../btn/btn-default-medium-disabled-corners.gif    |   Bin 0 -> 1618 bytes
 .../gray/btn/btn-default-medium-disabled-sides.gif |   Bin 0 -> 1923 bytes
 .../gray/btn/btn-default-medium-focus-bg.gif       |   Bin 0 -> 1823 bytes
 .../gray/btn/btn-default-medium-focus-corners.gif  |   Bin 0 -> 1619 bytes
 .../gray/btn/btn-default-medium-focus-sides.gif    |   Bin 0 -> 1915 bytes
 .../images/gray/btn/btn-default-medium-over-bg.gif |   Bin 0 -> 1823 bytes
 .../gray/btn/btn-default-medium-over-corners.gif   |   Bin 0 -> 1619 bytes
 .../gray/btn/btn-default-medium-over-sides.gif     |   Bin 0 -> 1915 bytes
 .../gray/btn/btn-default-medium-pressed-bg.gif     |   Bin 0 -> 1839 bytes
 .../btn/btn-default-medium-pressed-corners.gif     |   Bin 0 -> 1621 bytes
 .../gray/btn/btn-default-medium-pressed-sides.gif  |   Bin 0 -> 1917 bytes
 .../images/gray/btn/btn-default-medium-sides.gif   |   Bin 0 -> 1919 bytes
 .../images/gray/btn/btn-default-small-bg.gif       |   Bin 0 -> 1801 bytes
 .../images/gray/btn/btn-default-small-corners.gif  |   Bin 0 -> 1619 bytes
 .../gray/btn/btn-default-small-disabled-bg.gif     |   Bin 0 -> 1803 bytes
 .../btn/btn-default-small-disabled-corners.gif     |   Bin 0 -> 1618 bytes
 .../gray/btn/btn-default-small-disabled-sides.gif  |   Bin 0 -> 1888 bytes
 .../images/gray/btn/btn-default-small-focus-bg.gif |   Bin 0 -> 1810 bytes
 .../gray/btn/btn-default-small-focus-corners.gif   |   Bin 0 -> 1622 bytes
 .../gray/btn/btn-default-small-focus-sides.gif     |   Bin 0 -> 1892 bytes
 .../images/gray/btn/btn-default-small-over-bg.gif  |   Bin 0 -> 1810 bytes
 .../gray/btn/btn-default-small-over-corners.gif    |   Bin 0 -> 1622 bytes
 .../gray/btn/btn-default-small-over-sides.gif      |   Bin 0 -> 1892 bytes
 .../gray/btn/btn-default-small-pressed-bg.gif      |   Bin 0 -> 1816 bytes
 .../gray/btn/btn-default-small-pressed-corners.gif |   Bin 0 -> 1621 bytes
 .../gray/btn/btn-default-small-pressed-sides.gif   |   Bin 0 -> 1894 bytes
 .../images/gray/btn/btn-default-small-sides.gif    |   Bin 0 -> 1889 bytes
 .../gray/btn/btn-default-toolbar-large-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-large-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-large-disabled-sides.gif   |   Bin 0 -> 1596 bytes
 .../btn/btn-default-toolbar-large-focus-bg.gif     |   Bin 0 -> 1837 bytes
 .../btn-default-toolbar-large-focus-corners.gif    |   Bin 0 -> 1618 bytes
 .../btn/btn-default-toolbar-large-focus-sides.gif  |   Bin 0 -> 1934 bytes
 .../gray/btn/btn-default-toolbar-large-over-bg.gif |   Bin 0 -> 1837 bytes
 .../btn/btn-default-toolbar-large-over-corners.gif |   Bin 0 -> 1618 bytes
 .../btn/btn-default-toolbar-large-over-sides.gif   |   Bin 0 -> 1934 bytes
 .../btn/btn-default-toolbar-large-pressed-bg.gif   |   Bin 0 -> 1858 bytes
 .../btn-default-toolbar-large-pressed-corners.gif  |   Bin 0 -> 1619 bytes
 .../btn-default-toolbar-large-pressed-sides.gif    |   Bin 0 -> 1947 bytes
 .../gray/btn/btn-default-toolbar-large-sides.gif   |   Bin 0 -> 1596 bytes
 .../btn/btn-default-toolbar-medium-corners.gif     |   Bin 0 -> 1585 bytes
 ...btn-default-toolbar-medium-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-medium-disabled-sides.gif  |   Bin 0 -> 1594 bytes
 .../btn/btn-default-toolbar-medium-focus-bg.gif    |   Bin 0 -> 1823 bytes
 .../btn-default-toolbar-medium-focus-corners.gif   |   Bin 0 -> 1619 bytes
 .../btn/btn-default-toolbar-medium-focus-sides.gif |   Bin 0 -> 1915 bytes
 .../btn/btn-default-toolbar-medium-over-bg.gif     |   Bin 0 -> 1823 bytes
 .../btn-default-toolbar-medium-over-corners.gif    |   Bin 0 -> 1619 bytes
 .../btn/btn-default-toolbar-medium-over-sides.gif  |   Bin 0 -> 1915 bytes
 .../btn/btn-default-toolbar-medium-pressed-bg.gif  |   Bin 0 -> 1839 bytes
 .../btn-default-toolbar-medium-pressed-corners.gif |   Bin 0 -> 1621 bytes
 .../btn-default-toolbar-medium-pressed-sides.gif   |   Bin 0 -> 1917 bytes
 .../gray/btn/btn-default-toolbar-medium-sides.gif  |   Bin 0 -> 1594 bytes
 .../gray/btn/btn-default-toolbar-small-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-small-disabled-corners.gif |   Bin 0 -> 1585 bytes
 .../btn-default-toolbar-small-disabled-sides.gif   |   Bin 0 -> 1589 bytes
 .../btn/btn-default-toolbar-small-focus-bg.gif     |   Bin 0 -> 1810 bytes
 .../btn-default-toolbar-small-focus-corners.gif    |   Bin 0 -> 1621 bytes
 .../btn/btn-default-toolbar-small-focus-sides.gif  |   Bin 0 -> 1892 bytes
 .../gray/btn/btn-default-toolbar-small-over-bg.gif |   Bin 0 -> 1810 bytes
 .../btn/btn-default-toolbar-small-over-corners.gif |   Bin 0 -> 1621 bytes
 .../btn/btn-default-toolbar-small-over-sides.gif   |   Bin 0 -> 1892 bytes
 .../btn/btn-default-toolbar-small-pressed-bg.gif   |   Bin 0 -> 1816 bytes
 .../btn-default-toolbar-small-pressed-corners.gif  |   Bin 0 -> 1621 bytes
 .../btn-default-toolbar-small-pressed-sides.gif    |   Bin 0 -> 1894 bytes
 .../gray/btn/btn-default-toolbar-small-sides.gif   |   Bin 0 -> 1589 bytes
 .../resources/themes/images/gray/button/arrow.gif  |   Bin 0 -> 828 bytes
 .../themes/images/gray/button/btn-arrow.gif        |   Bin 0 -> 870 bytes
 .../themes/images/gray/button/btn-sprite.gif       |   Bin 0 -> 1222 bytes
 .../resources/themes/images/gray/button/btn.gif    |   Bin 0 -> 3319 bytes
 .../themes/images/gray/button/group-cs.gif         |   Bin 0 -> 2459 bytes
 .../themes/images/gray/button/group-lr.gif         |   Bin 0 -> 861 bytes
 .../themes/images/gray/button/group-tb.gif         |   Bin 0 -> 846 bytes
 .../themes/images/gray/button/s-arrow-b-noline.gif |   Bin 0 -> 898 bytes
 .../themes/images/gray/button/s-arrow-b.gif        |   Bin 0 -> 937 bytes
 .../themes/images/gray/button/s-arrow-bo.gif       |   Bin 0 -> 123 bytes
 .../themes/images/gray/button/s-arrow-light.gif    |   Bin 0 -> 116 bytes
 .../themes/images/gray/button/s-arrow-noline.gif   |   Bin 0 -> 863 bytes
 .../themes/images/gray/button/s-arrow-o.gif        |   Bin 0 -> 139 bytes
 .../themes/images/gray/button/s-arrow.gif          |   Bin 0 -> 937 bytes
 .../gray/datepicker/datepicker-footer-bg.gif       |   Bin 0 -> 1800 bytes
 .../gray/datepicker/datepicker-footer-bg.png       |   Bin 0 -> 328 bytes
 .../gray/datepicker/datepicker-header-bg.gif       |   Bin 0 -> 1836 bytes
 .../gray/datepicker/datepicker-header-bg.png       |   Bin 0 -> 309 bytes
 .../resources/themes/images/gray/dd/drop-add.gif   |   Bin 0 -> 1001 bytes
 .../resources/themes/images/gray/dd/drop-no.gif    |   Bin 0 -> 949 bytes
 .../resources/themes/images/gray/dd/drop-yes.gif   |   Bin 0 -> 1016 bytes
 .../themes/images/gray/editor/tb-sprite.gif        |   Bin 0 -> 2072 bytes
 .../form-invalid-tip/form-invalid-tip-corners.gif  |   Bin 0 -> 1690 bytes
 .../form-invalid-tip-default-corners.gif           |   Bin 0 -> 1690 bytes
 .../form-invalid-tip-default-sides.gif             |   Bin 0 -> 1647 bytes
 .../form-invalid-tip/form-invalid-tip-sides.gif    |   Bin 0 -> 1647 bytes
 .../resources/themes/images/gray/form/checkbox.gif |   Bin 0 -> 2061 bytes
 .../themes/images/gray/form/clear-trigger.gif      |   Bin 0 -> 1425 bytes
 .../themes/images/gray/form/date-trigger.gif       |   Bin 0 -> 929 bytes
 .../themes/images/gray/form/error-tip-corners.gif  |   Bin 0 -> 4183 bytes
 .../themes/images/gray/form/exclamation.gif        |   Bin 0 -> 996 bytes
 .../resources/themes/images/gray/form/radio.gif    |   Bin 0 -> 1746 bytes
 .../themes/images/gray/form/search-trigger.gif     |   Bin 0 -> 2220 bytes
 .../themes/images/gray/form/spinner-small.gif      |   Bin 0 -> 743 bytes
 .../resources/themes/images/gray/form/spinner.gif  |   Bin 0 -> 1975 bytes
 .../resources/themes/images/gray/form/text-bg.gif  |   Bin 0 -> 819 bytes
 .../themes/images/gray/form/trigger-square.gif     |   Bin 0 -> 1071 bytes
 .../themes/images/gray/form/trigger-tpl.gif        |   Bin 0 -> 1487 bytes
 .../resources/themes/images/gray/form/trigger.gif  |   Bin 0 -> 1080 bytes
 .../themes/images/gray/grid/arrow-left-white.gif   |   Bin 0 -> 825 bytes
 .../themes/images/gray/grid/arrow-right-white.gif  |   Bin 0 -> 825 bytes
 .../themes/images/gray/grid/cell-special-bg.gif    |   Bin 0 -> 1636 bytes
 .../themes/images/gray/grid/cell-special-bg.png    |   Bin 0 -> 121 bytes
 .../images/gray/grid/cell-special-selected-bg.gif  |   Bin 0 -> 1640 bytes
 .../images/gray/grid/cell-special-selected-bg.png  |   Bin 0 -> 136 bytes
 .../resources/themes/images/gray/grid/checked.gif  |   Bin 0 -> 959 bytes
 .../themes/images/gray/grid/col-move-bottom.gif    |   Bin 0 -> 177 bytes
 .../themes/images/gray/grid/col-move-top.gif       |   Bin 0 -> 178 bytes
 .../themes/images/gray/grid/column-header-bg.gif   |   Bin 0 -> 1858 bytes
 .../themes/images/gray/grid/column-header-bg.png   |   Bin 0 -> 293 bytes
 .../images/gray/grid/column-header-over-bg.gif     |   Bin 0 -> 1767 bytes
 .../images/gray/grid/column-header-over-bg.png     |   Bin 0 -> 283 bytes
 .../resources/themes/images/gray/grid/columns.gif  |   Bin 0 -> 962 bytes
 .../images/gray/grid/dd-insert-arrow-left.gif      |   Bin 0 -> 299 bytes
 .../images/gray/grid/dd-insert-arrow-left.png      |   Bin 0 -> 345 bytes
 .../images/gray/grid/dd-insert-arrow-right.gif     |   Bin 0 -> 301 bytes
 .../images/gray/grid/dd-insert-arrow-right.png     |   Bin 0 -> 349 bytes
 .../resources/themes/images/gray/grid/dirty.gif    |   Bin 0 -> 832 bytes
 .../ext/resources/themes/images/gray/grid/done.gif |   Bin 0 -> 133 bytes
 .../resources/themes/images/gray/grid/drop-no.gif  |   Bin 0 -> 947 bytes
 .../resources/themes/images/gray/grid/drop-yes.gif |   Bin 0 -> 860 bytes
 .../themes/images/gray/grid/footer-bg.gif          |   Bin 0 -> 834 bytes
 .../themes/images/gray/grid/grid-blue-hd.gif       |   Bin 0 -> 829 bytes
 .../themes/images/gray/grid/grid-blue-split.gif    |   Bin 0 -> 817 bytes
 .../themes/images/gray/grid/grid-hrow.gif          |   Bin 0 -> 855 bytes
 .../themes/images/gray/grid/grid-loading.gif       |   Bin 0 -> 701 bytes
 .../themes/images/gray/grid/grid-split.gif         |   Bin 0 -> 817 bytes
 .../themes/images/gray/grid/grid-vista-hd.gif      |   Bin 0 -> 829 bytes
 .../themes/images/gray/grid/grid3-hd-btn.gif       |   Bin 0 -> 482 bytes
 .../themes/images/gray/grid/grid3-hrow-over.gif    |   Bin 0 -> 823 bytes
 .../themes/images/gray/grid/grid3-hrow.gif         |   Bin 0 -> 836 bytes
 .../themes/images/gray/grid/grid3-rowheader.gif    |   Bin 0 -> 43 bytes
 .../resources/themes/images/gray/grid/group-by.gif |   Bin 0 -> 917 bytes
 .../themes/images/gray/grid/group-collapse.gif     |   Bin 0 -> 136 bytes
 .../images/gray/grid/group-expand-sprite.gif       |   Bin 0 -> 196 bytes
 .../themes/images/gray/grid/group-expand.gif       |   Bin 0 -> 138 bytes
 .../resources/themes/images/gray/grid/hd-pop.gif   |   Bin 0 -> 839 bytes
 .../themes/images/gray/grid/hmenu-asc.gif          |   Bin 0 -> 931 bytes
 .../themes/images/gray/grid/hmenu-desc.gif         |   Bin 0 -> 930 bytes
 .../themes/images/gray/grid/hmenu-lock.gif         |   Bin 0 -> 955 bytes
 .../themes/images/gray/grid/hmenu-lock.png         |   Bin 0 -> 648 bytes
 .../themes/images/gray/grid/hmenu-unlock.gif       |   Bin 0 -> 971 bytes
 .../themes/images/gray/grid/hmenu-unlock.png       |   Bin 0 -> 697 bytes
 .../themes/images/gray/grid/invalid_line.gif       |   Bin 0 -> 815 bytes
 .../resources/themes/images/gray/grid/loading.gif  |   Bin 0 -> 771 bytes
 .../resources/themes/images/gray/grid/mso-hd.gif   |   Bin 0 -> 875 bytes
 .../resources/themes/images/gray/grid/nowait.gif   |   Bin 0 -> 884 bytes
 .../images/gray/grid/page-first-disabled.gif       |   Bin 0 -> 925 bytes
 .../themes/images/gray/grid/page-first.gif         |   Bin 0 -> 327 bytes
 .../themes/images/gray/grid/page-last-disabled.gif |   Bin 0 -> 923 bytes
 .../themes/images/gray/grid/page-last.gif          |   Bin 0 -> 325 bytes
 .../themes/images/gray/grid/page-next-disabled.gif |   Bin 0 -> 875 bytes
 .../themes/images/gray/grid/page-next.gif          |   Bin 0 -> 183 bytes
 .../themes/images/gray/grid/page-prev-disabled.gif |   Bin 0 -> 879 bytes
 .../themes/images/gray/grid/page-prev.gif          |   Bin 0 -> 186 bytes
 .../themes/images/gray/grid/pick-button.gif        |   Bin 0 -> 1036 bytes
 .../themes/images/gray/grid/property-cell-bg.gif   |   Bin 0 -> 915 bytes
 .../images/gray/grid/property-cell-selected-bg.gif |   Bin 0 -> 843 bytes
 .../themes/images/gray/grid/refresh-disabled.gif   |   Bin 0 -> 577 bytes
 .../resources/themes/images/gray/grid/refresh.gif  |   Bin 0 -> 570 bytes
 .../themes/images/gray/grid/row-check-sprite.gif   |   Bin 0 -> 1083 bytes
 .../themes/images/gray/grid/row-expand-sprite.gif  |   Bin 0 -> 196 bytes
 .../resources/themes/images/gray/grid/row-over.gif |   Bin 0 -> 823 bytes
 .../resources/themes/images/gray/grid/row-sel.gif  |   Bin 0 -> 823 bytes
 .../resources/themes/images/gray/grid/sort-hd.gif  |   Bin 0 -> 2731 bytes
 .../resources/themes/images/gray/grid/sort_asc.gif |   Bin 0 -> 59 bytes
 .../themes/images/gray/grid/sort_desc.gif          |   Bin 0 -> 59 bytes
 .../themes/images/gray/grid/unchecked.gif          |   Bin 0 -> 941 bytes
 .../ext/resources/themes/images/gray/grid/wait.gif |   Bin 0 -> 1100 bytes
 .../themes/images/gray/layout/mini-bottom.gif      |   Bin 0 -> 856 bytes
 .../themes/images/gray/layout/mini-left.gif        |   Bin 0 -> 871 bytes
 .../themes/images/gray/layout/mini-right.gif       |   Bin 0 -> 872 bytes
 .../themes/images/gray/layout/mini-top.gif         |   Bin 0 -> 856 bytes
 .../resources/themes/images/gray/menu/checked.gif  |   Bin 0 -> 959 bytes
 .../themes/images/gray/menu/group-checked.gif      |   Bin 0 -> 295 bytes
 .../themes/images/gray/menu/item-over-disabled.gif |   Bin 0 -> 49 bytes
 .../themes/images/gray/menu/item-over.gif          |   Bin 0 -> 850 bytes
 .../images/gray/menu/menu-item-active-bg.gif       |   Bin 0 -> 1820 bytes
 .../images/gray/menu/menu-item-active-corners.gif  |   Bin 0 -> 1620 bytes
 .../images/gray/menu/menu-item-active-sides.gif    |   Bin 0 -> 1902 bytes
 .../themes/images/gray/menu/menu-parent.gif        |   Bin 0 -> 165 bytes
 .../ext/resources/themes/images/gray/menu/menu.gif |   Bin 0 -> 834 bytes
 .../themes/images/gray/menu/unchecked.gif          |   Bin 0 -> 941 bytes
 .../panel-header-default-bottom-bg.gif             |   Bin 0 -> 1842 bytes
 .../panel-header-default-framed-bottom-bg.gif      |   Bin 0 -> 1829 bytes
 .../panel-header-default-framed-bottom-corners.gif |   Bin 0 -> 1641 bytes
 .../panel-header-default-framed-bottom-sides.gif   |   Bin 0 -> 2009 bytes
 ...l-header-default-framed-collapsed-bottom-bg.gif |   Bin 0 -> 1819 bytes
 ...der-default-framed-collapsed-bottom-corners.gif |   Bin 0 -> 1652 bytes
 ...eader-default-framed-collapsed-bottom-sides.gif |   Bin 0 -> 1995 bytes
 ...nel-header-default-framed-collapsed-left-bg.gif |   Bin 0 -> 1633 bytes
 ...eader-default-framed-collapsed-left-corners.gif |   Bin 0 -> 1676 bytes
 ...-header-default-framed-collapsed-left-sides.gif |   Bin 0 -> 1828 bytes
 ...el-header-default-framed-collapsed-right-bg.gif |   Bin 0 -> 1634 bytes
 ...ader-default-framed-collapsed-right-corners.gif |   Bin 0 -> 1677 bytes
 ...header-default-framed-collapsed-right-sides.gif |   Bin 0 -> 1832 bytes
 ...anel-header-default-framed-collapsed-top-bg.gif |   Bin 0 -> 1819 bytes
 ...header-default-framed-collapsed-top-corners.gif |   Bin 0 -> 1656 bytes
 ...l-header-default-framed-collapsed-top-sides.gif |   Bin 0 -> 2003 bytes
 .../panel-header-default-framed-left-bg.gif        |   Bin 0 -> 1637 bytes
 .../panel-header-default-framed-left-corners.gif   |   Bin 0 -> 1660 bytes
 .../panel-header-default-framed-left-sides.gif     |   Bin 0 -> 1841 bytes
 .../panel-header-default-framed-right-bg.gif       |   Bin 0 -> 1638 bytes
 .../panel-header-default-framed-right-corners.gif  |   Bin 0 -> 1659 bytes
 .../panel-header-default-framed-right-sides.gif    |   Bin 0 -> 1842 bytes
 .../panel-header-default-framed-top-bg.gif         |   Bin 0 -> 1838 bytes
 .../panel-header-default-framed-top-corners.gif    |   Bin 0 -> 1641 bytes
 .../panel-header-default-framed-top-sides.gif      |   Bin 0 -> 2018 bytes
 .../panel-header/panel-header-default-left-bg.gif  |   Bin 0 -> 1640 bytes
 .../panel-header/panel-header-default-right-bg.gif |   Bin 0 -> 1641 bytes
 .../panel-header/panel-header-default-top-bg.gif   |   Bin 0 -> 1851 bytes
 .../gray/panel/panel-default-framed-corners.gif    |   Bin 0 -> 1631 bytes
 .../gray/panel/panel-default-framed-sides.gif      |   Bin 0 -> 1727 bytes
 .../images/gray/progress/progress-default-bg.gif   |   Bin 0 -> 1832 bytes
 .../themes/images/gray/shared/blue-loading.gif     |   Bin 0 -> 3236 bytes
 .../themes/images/gray/shared/calendar.gif         |   Bin 0 -> 979 bytes
 .../themes/images/gray/shared/glass-bg.gif         |   Bin 0 -> 873 bytes
 .../themes/images/gray/shared/hd-sprite.gif        |   Bin 0 -> 1099 bytes
 .../themes/images/gray/shared/icon-error.gif       |   Bin 0 -> 1669 bytes
 .../themes/images/gray/shared/icon-info.gif        |   Bin 0 -> 1586 bytes
 .../themes/images/gray/shared/icon-question.gif    |   Bin 0 -> 1607 bytes
 .../themes/images/gray/shared/icon-warning.gif     |   Bin 0 -> 1483 bytes
 .../themes/images/gray/shared/large-loading.gif    |   Bin 0 -> 3236 bytes
 .../themes/images/gray/shared/left-btn.gif         |   Bin 0 -> 106 bytes
 .../themes/images/gray/shared/loading-balls.gif    |   Bin 0 -> 2118 bytes
 .../themes/images/gray/shared/right-btn.gif        |   Bin 0 -> 107 bytes
 .../themes/images/gray/shared/shadow-c.png         |   Bin 0 -> 118 bytes
 .../themes/images/gray/shared/shadow-lr.png        |   Bin 0 -> 135 bytes
 .../resources/themes/images/gray/shared/shadow.png |   Bin 0 -> 311 bytes
 .../themes/images/gray/shared/warning.gif          |   Bin 0 -> 960 bytes
 .../themes/images/gray/sizer/e-handle-dark.gif     |   Bin 0 -> 1062 bytes
 .../themes/images/gray/sizer/e-handle.gif          |   Bin 0 -> 753 bytes
 .../themes/images/gray/sizer/ne-handle-dark.gif    |   Bin 0 -> 839 bytes
 .../themes/images/gray/sizer/ne-handle.gif         |   Bin 0 -> 128 bytes
 .../themes/images/gray/sizer/nw-handle-dark.gif    |   Bin 0 -> 839 bytes
 .../themes/images/gray/sizer/nw-handle.gif         |   Bin 0 -> 114 bytes
 .../themes/images/gray/sizer/s-handle-dark.gif     |   Bin 0 -> 1060 bytes
 .../themes/images/gray/sizer/s-handle.gif          |   Bin 0 -> 494 bytes
 .../themes/images/gray/sizer/se-handle-dark.gif    |   Bin 0 -> 838 bytes
 .../themes/images/gray/sizer/se-handle.gif         |   Bin 0 -> 114 bytes
 .../resources/themes/images/gray/sizer/square.gif  |   Bin 0 -> 123 bytes
 .../themes/images/gray/sizer/sw-handle-dark.gif    |   Bin 0 -> 839 bytes
 .../themes/images/gray/sizer/sw-handle.gif         |   Bin 0 -> 116 bytes
 .../themes/images/gray/slider/slider-bg.gif        |   Bin 0 -> 145 bytes
 .../themes/images/gray/slider/slider-bg.png        |   Bin 0 -> 1494 bytes
 .../themes/images/gray/slider/slider-thumb.gif     |   Bin 0 -> 542 bytes
 .../themes/images/gray/slider/slider-thumb.png     |   Bin 0 -> 675 bytes
 .../themes/images/gray/slider/slider-v-bg.gif      |   Bin 0 -> 150 bytes
 .../themes/images/gray/slider/slider-v-bg.png      |   Bin 0 -> 288 bytes
 .../themes/images/gray/slider/slider-v-thumb.gif   |   Bin 0 -> 533 bytes
 .../themes/images/gray/slider/slider-v-thumb.png   |   Bin 0 -> 632 bytes
 .../themes/images/gray/tab-bar/scroll-left.gif     |   Bin 0 -> 1260 bytes
 .../themes/images/gray/tab-bar/scroll-right.gif    |   Bin 0 -> 1269 bytes
 .../images/gray/tab-bar/tab-bar-default-bg.gif     |   Bin 0 -> 1750 bytes
 .../gray/tab/tab-default-bottom-active-bg.gif      |   Bin 0 -> 1813 bytes
 .../gray/tab/tab-default-bottom-active-corners.gif |   Bin 0 -> 1642 bytes
 .../gray/tab/tab-default-bottom-active-sides.gif   |   Bin 0 -> 1998 bytes
 .../images/gray/tab/tab-default-bottom-bg.gif      |   Bin 0 -> 1796 bytes
 .../images/gray/tab/tab-default-bottom-corners.gif |   Bin 0 -> 1646 bytes
 .../gray/tab/tab-default-bottom-disabled-bg.gif    |   Bin 0 -> 1796 bytes
 .../tab/tab-default-bottom-disabled-corners.gif    |   Bin 0 -> 1632 bytes
 .../gray/tab/tab-default-bottom-disabled-sides.gif |   Bin 0 -> 1989 bytes
 .../images/gray/tab/tab-default-bottom-over-bg.gif |   Bin 0 -> 1783 bytes
 .../gray/tab/tab-default-bottom-over-corners.gif   |   Bin 0 -> 1642 bytes
 .../gray/tab/tab-default-bottom-over-sides.gif     |   Bin 0 -> 1979 bytes
 .../images/gray/tab/tab-default-bottom-sides.gif   |   Bin 0 -> 1985 bytes
 .../themes/images/gray/tab/tab-default-close.gif   |   Bin 0 -> 896 bytes
 .../images/gray/tab/tab-default-top-active-bg.gif  |   Bin 0 -> 1811 bytes
 .../gray/tab/tab-default-top-active-corners.gif    |   Bin 0 -> 1645 bytes
 .../gray/tab/tab-default-top-active-sides.gif      |   Bin 0 -> 1997 bytes
 .../themes/images/gray/tab/tab-default-top-bg.gif  |   Bin 0 -> 1795 bytes
 .../images/gray/tab/tab-default-top-corners.gif    |   Bin 0 -> 1647 bytes
 .../gray/tab/tab-default-top-disabled-bg.gif       |   Bin 0 -> 1789 bytes
 .../gray/tab/tab-default-top-disabled-corners.gif  |   Bin 0 -> 1637 bytes
 .../gray/tab/tab-default-top-disabled-sides.gif    |   Bin 0 -> 1977 bytes
 .../images/gray/tab/tab-default-top-over-bg.gif    |   Bin 0 -> 1773 bytes
 .../gray/tab/tab-default-top-over-corners.gif      |   Bin 0 -> 1648 bytes
 .../images/gray/tab/tab-default-top-over-sides.gif |   Bin 0 -> 1960 bytes
 .../images/gray/tab/tab-default-top-sides.gif      |   Bin 0 -> 1983 bytes
 .../themes/images/gray/tip/tip-corners.gif         |   Bin 0 -> 1620 bytes
 .../resources/themes/images/gray/tip/tip-sides.gif |   Bin 0 -> 1623 bytes
 .../resources/themes/images/gray/toolbar/more.gif  |   Bin 0 -> 845 bytes
 .../themes/images/gray/toolbar/scroll-left.gif     |   Bin 0 -> 1861 bytes
 .../themes/images/gray/toolbar/scroll-right.gif    |   Bin 0 -> 1865 bytes
 .../images/gray/toolbar/toolbar-default-bg.gif     |   Bin 0 -> 1801 bytes
 .../themes/images/gray/tools/tool-sprite-tpl.gif   |   Bin 0 -> 971 bytes
 .../themes/images/gray/tools/tool-sprites.gif      |   Bin 0 -> 5835 bytes
 .../images/gray/tools/tools-sprites-trans.gif      |   Bin 0 -> 1981 bytes
 .../resources/themes/images/gray/tree/arrows.gif   |   Bin 0 -> 617 bytes
 .../themes/images/gray/tree/drop-above.gif         |   Bin 0 -> 911 bytes
 .../resources/themes/images/gray/tree/drop-add.gif |   Bin 0 -> 1001 bytes
 .../themes/images/gray/tree/drop-append.gif        |   Bin 0 -> 1001 bytes
 .../themes/images/gray/tree/drop-below.gif         |   Bin 0 -> 911 bytes
 .../themes/images/gray/tree/drop-between.gif       |   Bin 0 -> 907 bytes
 .../resources/themes/images/gray/tree/drop-no.gif  |   Bin 0 -> 949 bytes
 .../themes/images/gray/tree/drop-over.gif          |   Bin 0 -> 911 bytes
 .../themes/images/gray/tree/drop-under.gif         |   Bin 0 -> 911 bytes
 .../resources/themes/images/gray/tree/drop-yes.gif |   Bin 0 -> 1016 bytes
 .../themes/images/gray/tree/elbow-end-minus-nl.gif |   Bin 0 -> 898 bytes
 .../themes/images/gray/tree/elbow-end-minus.gif    |   Bin 0 -> 905 bytes
 .../themes/images/gray/tree/elbow-end-plus-nl.gif  |   Bin 0 -> 900 bytes
 .../themes/images/gray/tree/elbow-end-plus.gif     |   Bin 0 -> 907 bytes
 .../themes/images/gray/tree/elbow-end.gif          |   Bin 0 -> 844 bytes
 .../themes/images/gray/tree/elbow-line.gif         |   Bin 0 -> 846 bytes
 .../themes/images/gray/tree/elbow-minus-nl.gif     |   Bin 0 -> 898 bytes
 .../themes/images/gray/tree/elbow-minus.gif        |   Bin 0 -> 908 bytes
 .../themes/images/gray/tree/elbow-plus-nl.gif      |   Bin 0 -> 900 bytes
 .../themes/images/gray/tree/elbow-plus.gif         |   Bin 0 -> 910 bytes
 .../resources/themes/images/gray/tree/elbow.gif    |   Bin 0 -> 850 bytes
 .../themes/images/gray/tree/folder-open.gif        |   Bin 0 -> 956 bytes
 .../resources/themes/images/gray/tree/folder.gif   |   Bin 0 -> 952 bytes
 .../ext/resources/themes/images/gray/tree/leaf.gif |   Bin 0 -> 945 bytes
 .../resources/themes/images/gray/tree/loading.gif  |   Bin 0 -> 771 bytes
 .../ext/resources/themes/images/gray/tree/s.gif    |   Bin 0 -> 43 bytes
 .../images/gray/util/splitter/mini-bottom.gif      |   Bin 0 -> 856 bytes
 .../themes/images/gray/util/splitter/mini-left.gif |   Bin 0 -> 871 bytes
 .../images/gray/util/splitter/mini-right.gif       |   Bin 0 -> 872 bytes
 .../themes/images/gray/util/splitter/mini-top.gif  |   Bin 0 -> 856 bytes
 .../window-header-default-bottom-corners.gif       |   Bin 0 -> 1652 bytes
 .../window-header-default-bottom-sides.gif         |   Bin 0 -> 1620 bytes
 .../window-header-default-left-corners.gif         |   Bin 0 -> 1647 bytes
 .../window-header-default-left-sides.gif           |   Bin 0 -> 1607 bytes
 .../window-header-default-right-corners.gif        |   Bin 0 -> 1649 bytes
 .../window-header-default-right-sides.gif          |   Bin 0 -> 1607 bytes
 .../window-header-default-top-corners.gif          |   Bin 0 -> 1661 bytes
 .../window-header-default-top-sides.gif            |   Bin 0 -> 1620 bytes
 .../themes/images/gray/window/icon-error.gif       |   Bin 0 -> 1669 bytes
 .../themes/images/gray/window/icon-info.gif        |   Bin 0 -> 1586 bytes
 .../themes/images/gray/window/icon-question.gif    |   Bin 0 -> 1607 bytes
 .../themes/images/gray/window/icon-warning.gif     |   Bin 0 -> 1483 bytes
 .../images/gray/window/window-default-corners.gif  |   Bin 0 -> 1672 bytes
 .../images/gray/window/window-default-sides.gif    |   Bin 0 -> 1776 bytes
 interface/ext/resources/themes/lib/utils.rb        |    93 +
 .../themes/stylesheets/ext4/default/_all.scss      |   113 +
 .../themes/stylesheets/ext4/default/_core.scss     |     2 +
 .../stylesheets/ext4/default/_functions.scss       |    44 +
 .../themes/stylesheets/ext4/default/_mixins.scss   |    25 +
 .../stylesheets/ext4/default/_variables.scss       |    41 +
 .../themes/stylesheets/ext4/default/_widgets.scss  |    22 +
 .../stylesheets/ext4/default/core/_core.scss       |   317 +
 .../stylesheets/ext4/default/core/_reset.scss      |   146 +
 .../stylesheets/ext4/default/layout/_layout.scss   |   309 +
 .../ext4/default/mixins/_background-gradient.scss  |   122 +
 .../ext4/default/mixins/_color-by-background.scss  |    23 +
 .../stylesheets/ext4/default/mixins/_frame.scss    |   205 +
 .../ext4/default/mixins/_inner-border.scss         |   149 +
 .../ext4/default/mixins/_reset-extras.scss         |   144 +
 .../default/mixins/_theme-background-image.scss    |    28 +
 .../stylesheets/ext4/default/util/_dragdrop.scss   |    76 +
 .../stylesheets/ext4/default/util/_focus.scss      |    37 +
 .../stylesheets/ext4/default/util/_messagebox.scss |    50 +
 .../stylesheets/ext4/default/util/_resizable.scss  |   222 +
 .../stylesheets/ext4/default/util/_scroller.scss   |    55 +
 .../stylesheets/ext4/default/util/_splitter.scss   |   106 +
 .../stylesheets/ext4/default/util/_tool.scss       |   295 +
 .../ext4/default/variables/_boundlist.scss         |    18 +
 .../ext4/default/variables/_btn-group.scss         |    15 +
 .../ext4/default/variables/_button.scss            |   141 +
 .../stylesheets/ext4/default/variables/_core.scss  |   114 +
 .../stylesheets/ext4/default/variables/_focus.scss |     3 +
 .../stylesheets/ext4/default/variables/_form.scss  |   114 +
 .../stylesheets/ext4/default/variables/_grid.scss  |    91 +
 .../ext4/default/variables/_htmleditor.scss        |     2 +
 .../ext4/default/variables/_layout.scss            |     5 +
 .../ext4/default/variables/_loadmask.scss          |    17 +
 .../stylesheets/ext4/default/variables/_menu.scss  |    23 +
 .../stylesheets/ext4/default/variables/_panel.scss |    65 +
 .../ext4/default/variables/_pickers.scss           |    66 +
 .../ext4/default/variables/_progress-bar.scss      |    21 +
 .../stylesheets/ext4/default/variables/_qtip.scss  |    29 +
 .../stylesheets/ext4/default/variables/_tabs.scss  |    87 +
 .../ext4/default/variables/_toolbar.scss           |    30 +
 .../stylesheets/ext4/default/variables/_tree.scss  |     2 +
 .../ext4/default/variables/_window.scss            |    19 +
 .../ext4/default/widgets/_boundlist.scss           |    45 +
 .../ext4/default/widgets/_btn-group.scss           |    80 +
 .../stylesheets/ext4/default/widgets/_button.scss  |   996 +
 .../ext4/default/widgets/_colorpicker.scss         |    45 +
 .../ext4/default/widgets/_datepicker.scss          |   422 +
 .../ext4/default/widgets/_drawcomponent.scss       |    55 +
 .../stylesheets/ext4/default/widgets/_form.scss    |     8 +
 .../stylesheets/ext4/default/widgets/_grid.scss    |   817 +
 .../stylesheets/ext4/default/widgets/_html.scss    |   126 +
 .../ext4/default/widgets/_loadmask.scss            |    59 +
 .../stylesheets/ext4/default/widgets/_menu.scss    |   191 +
 .../stylesheets/ext4/default/widgets/_panel.scss   |   448 +
 .../ext4/default/widgets/_progress-bar.scss        |   118 +
 .../stylesheets/ext4/default/widgets/_qtip.scss    |   164 +
 .../stylesheets/ext4/default/widgets/_slider.scss  |   141 +
 .../stylesheets/ext4/default/widgets/_tab.scss     |   501 +
 .../stylesheets/ext4/default/widgets/_tabbar.scss  |   151 +
 .../stylesheets/ext4/default/widgets/_toolbar.scss |   158 +
 .../stylesheets/ext4/default/widgets/_tree.scss    |   277 +
 .../ext4/default/widgets/_viewport.scss            |     9 +
 .../stylesheets/ext4/default/widgets/_window.scss  |   179 +
 .../ext4/default/widgets/form/_all.scss            |    75 +
 .../ext4/default/widgets/form/_checkbox.scss       |    65 +
 .../ext4/default/widgets/form/_checkboxgroup.scss  |    31 +
 .../ext4/default/widgets/form/_field.scss          |   125 +
 .../ext4/default/widgets/form/_fieldset.scss       |   109 +
 .../ext4/default/widgets/form/_file.scss           |    32 +
 .../ext4/default/widgets/form/_htmleditor.scss     |   124 +
 .../ext4/default/widgets/form/_triggerfield.scss   |   162 +
 .../themes/templates/resources/sass/config.rb      |    20 +
 .../templates/resources/sass/my-ext-theme.scss     |    45 +
 interface/favicon.ico                              |   Bin 0 -> 902 bytes
 interface/images/eye-grey.png                      |   Bin 0 -> 274 bytes
 interface/images/eye.png                           |   Bin 0 -> 331 bytes
 interface/images/eye.xcf                           |   Bin 0 -> 1768 bytes
 interface/images/forbidden.png                     |   Bin 0 -> 438 bytes
 interface/images/header.png                        |   Bin 0 -> 6665 bytes
 interface/images/icon/btn_border.png               |   Bin 0 -> 618 bytes
 interface/images/icon/btn_border_hover.png         |   Bin 0 -> 622 bytes
 interface/images/icon/chart_bar.png                |   Bin 0 -> 541 bytes
 interface/images/icon/chart_curve.png              |   Bin 0 -> 710 bytes
 interface/images/icon/chart_pie.png                |   Bin 0 -> 918 bytes
 interface/images/icon/clock.png                    |   Bin 0 -> 882 bytes
 interface/images/icon/database.png                 |   Bin 0 -> 390 bytes
 interface/images/icon/ko.svg                       |   123 +
 interface/images/icon/libreoffice-extension.png    |   Bin 0 -> 573 bytes
 interface/images/icon/loading_white.gif            |   Bin 0 -> 847 bytes
 interface/images/icon/ok.svg                       |    71 +
 interface/images/icon/server.png                   |   Bin 0 -> 530 bytes
 interface/images/icon/server_chart.png             |   Bin 0 -> 673 bytes
 interface/images/icon/status_online.png            |   Bin 0 -> 722 bytes
 interface/images/icon/user.png                     |   Bin 0 -> 741 bytes
 interface/images/icon/user_edit.png                |   Bin 0 -> 833 bytes
 interface/images/istsos-logo.gif                   |   Bin 0 -> 378 bytes
 interface/images/istsos-logo.png                   |   Bin 0 -> 20464 bytes
 interface/images/istsos-logo.xcf                   |   Bin 0 -> 3810 bytes
 interface/images/istsos.png                        |   Bin 0 -> 19187 bytes
 .../menu/11971055981382663610sagar_ns_database.svg |   197 +
 interface/images/menu/Icon-add.svg                 |   117 +
 interface/images/menu/No_trash_icon.svg            |  3797 +
 interface/images/menu/World.svg                    |   520 +
 interface/images/menu/about.svg                    |   716 +
 interface/images/menu/about2.svg                   |   853 +
 interface/images/menu/about_grey.svg               |   837 +
 .../menu/about_grey.svg-path3848-4294966697.png    |   Bin 0 -> 1132 bytes
 interface/images/menu/applications-internet.svg    |   876 +
 interface/images/menu/applications-system.svg      |  1241 +
 interface/images/menu/boh.svg                      |  7044 ++
 interface/images/menu/call-start.svg               |   658 +
 interface/images/menu/contacts.svg                 |  2812 +
 interface/images/menu/coordinate.svg               |  1046 +
 interface/images/menu/database.svg                 |   997 +
 interface/images/menu/delete.svg                   |  1123 +
 interface/images/menu/delete2.svg                  | 10273 ++
 interface/images/menu/desktop-effects.svg          |  3910 +
 interface/images/menu/document-save.svg            |  1238 +
 interface/images/menu/editor.svg                   |  1943 +
 interface/images/menu/emblem-shared.svg            |  1119 +
 interface/images/menu/emblem-system.svg            |   994 +
 .../menu/emblem-ubuntuone-unsynchronized.svg       |   912 +
 interface/images/menu/getobs.svg                   |  1491 +
 interface/images/menu/internet-radio-new.svg       |   738 +
 interface/images/menu/list-add.svg                 |   679 +
 interface/images/menu/media-eject.svg              |  1298 +
 interface/images/menu/media-playback-start.svg     |  1305 +
 interface/images/menu/network-transmit-receive.svg |  1110 +
 interface/images/menu/new_service.svg              |  1709 +
 interface/images/menu/observedProperties.svg       |  3551 +
 interface/images/menu/offerings.svg                |  9737 ++
 interface/images/menu/provider.svg                 |  2182 +
 interface/images/menu/proxy.svg                    |  3643 +
 interface/images/menu/quality.svg                  |  1638 +
 interface/images/menu/quality_index.svg            |   841 +
 interface/images/menu/service_provider.svg         |  4024 +
 interface/images/menu/service_provider_light.svg   |  5463 ++
 interface/images/menu/service_provider_light2.svg  |  7522 ++
 interface/images/menu/srvc_id.svg                  |  1232 +
 interface/images/menu/status.svg                   |   738 +
 interface/images/menu/status_1.svg                 |   694 +
 interface/images/menu/system-run.svg               |  7186 ++
 interface/images/menu/system-run_old.svg           |   805 +
 interface/images/menu/unit.svg                     |   708 +
 interface/images/menu/user-trash.svg               |  1323 +
 .../images/menu/view-list-details-symbolic.svg     |  1196 +
 interface/images/menu/view-list-icons-symbolic.svg |  1194 +
 interface/images/menu/virtual.svg                  |   929 +
 interface/index.html                               |   468 +
 interface/istsos-old.xds                           | 10998 +++
 interface/istsos.xds                               | 14185 +++
 interface/nbproject/private/private.properties     |     5 +
 interface/nbproject/private/private.xml            |    23 +
 interface/nbproject/private/retriever/catalog.xml  |   153 +
 .../schemas.opengis.net/filter/1.1.0/expr.xsd      |    67 +
 .../schemas.opengis.net/filter/1.1.0/filter.xsd    |   265 +
 .../schemas.opengis.net/filter/1.1.0/filterAll.xsd |    26 +
 .../filter/1.1.0/filterCapabilities.xsd            |   171 +
 .../schemas.opengis.net/filter/1.1.0/sort.xsd      |    47 +
 .../gml/3.1.1/base/basicTypes.xsd                  |   279 +
 .../gml/3.1.1/base/coordinateOperations.xsd        |   790 +
 .../gml/3.1.1/base/coordinateReferenceSystems.xsd  |   430 +
 .../gml/3.1.1/base/coordinateSystems.xsd           |   409 +
 .../gml/3.1.1/base/coverage.xsd                    |   452 +
 .../gml/3.1.1/base/dataQuality.xsd                 |   130 +
 .../schemas.opengis.net/gml/3.1.1/base/datums.xsd  |   485 +
 .../gml/3.1.1/base/defaultStyle.xsd                |   455 +
 .../gml/3.1.1/base/dictionary.xsd                  |   138 +
 .../gml/3.1.1/base/direction.xsd                   |    73 +
 .../gml/3.1.1/base/dynamicFeature.xsd              |   116 +
 .../schemas.opengis.net/gml/3.1.1/base/feature.xsd |   200 +
 .../gml/3.1.1/base/geometryAggregates.xsd          |   431 +
 .../gml/3.1.1/base/geometryBasic0d1d.xsd           |   603 +
 .../gml/3.1.1/base/geometryBasic2d.xsd             |   214 +
 .../gml/3.1.1/base/geometryComplexes.xsd           |   142 +
 .../gml/3.1.1/base/geometryPrimitives.xsd          |  1610 +
 .../schemas.opengis.net/gml/3.1.1/base/gml.xsd     |    22 +
 .../schemas.opengis.net/gml/3.1.1/base/gmlBase.xsd |   295 +
 .../schemas.opengis.net/gml/3.1.1/base/grids.xsd   |    77 +
 .../gml/3.1.1/base/measures.xsd                    |   201 +
 .../gml/3.1.1/base/observation.xsd                 |    97 +
 .../gml/3.1.1/base/referenceSystems.xsd            |   212 +
 .../gml/3.1.1/base/temporal.xsd                    |   333 +
 .../gml/3.1.1/base/temporalReferenceSystems.xsd    |   252 +
 .../gml/3.1.1/base/temporalTopology.xsd            |   187 +
 .../gml/3.1.1/base/topology.xsd                    |   460 +
 .../schemas.opengis.net/gml/3.1.1/base/units.xsd   |   171 +
 .../gml/3.1.1/base/valueObjects.xsd                |   362 +
 .../gml/3.1.1/smil/smil20-language.xsd             |   117 +
 .../schemas.opengis.net/gml/3.1.1/smil/smil20.xsd  |   234 +
 .../schemas.opengis.net/gml/3.2.1/basicTypes.xsd   |   268 +
 .../gml/3.2.1/coordinateOperations.xsd             |   525 +
 .../gml/3.2.1/coordinateReferenceSystems.xsd       |   373 +
 .../gml/3.2.1/coordinateSystems.xsd                |   297 +
 .../schemas.opengis.net/gml/3.2.1/coverage.xsd     |   292 +
 .../schemas.opengis.net/gml/3.2.1/datums.xsd       |   287 +
 .../gml/3.2.1/deprecatedTypes.xsd                  |  1133 +
 .../schemas.opengis.net/gml/3.2.1/dictionary.xsd   |    90 +
 .../schemas.opengis.net/gml/3.2.1/direction.xsd    |    84 +
 .../gml/3.2.1/dynamicFeature.xsd                   |   109 +
 .../schemas.opengis.net/gml/3.2.1/feature.xsd      |    94 +
 .../gml/3.2.1/geometryAggregates.xsd               |   197 +
 .../gml/3.2.1/geometryBasic0d1d.xsd                |   277 +
 .../gml/3.2.1/geometryBasic2d.xsd                  |   124 +
 .../gml/3.2.1/geometryComplexes.xsd                |    95 +
 .../gml/3.2.1/geometryPrimitives.xsd               |   846 +
 .../schemas.opengis.net/gml/3.2.1/gml.xsd          |    20 +
 .../schemas.opengis.net/gml/3.2.1/gmlBase.xsd      |   185 +
 .../schemas.opengis.net/gml/3.2.1/grids.xsd        |    64 +
 .../schemas.opengis.net/gml/3.2.1/measures.xsd     |    68 +
 .../schemas.opengis.net/gml/3.2.1/observation.xsd  |    95 +
 .../gml/3.2.1/referenceSystems.xsd                 |    70 +
 .../schemas.opengis.net/gml/3.2.1/temporal.xsd     |   269 +
 .../gml/3.2.1/temporalReferenceSystems.xsd         |   189 +
 .../gml/3.2.1/temporalTopology.xsd                 |   119 +
 .../schemas.opengis.net/gml/3.2.1/topology.xsd     |   386 +
 .../schemas.opengis.net/gml/3.2.1/units.xsd        |   162 +
 .../schemas.opengis.net/gml/3.2.1/valueObjects.xsd |   205 +
 .../schemas.opengis.net/ic/2.0/IC-ISM-v2.xsd       |   553 +
 .../iso/19139/20070417/gco/basicTypes.xsd          |   431 +
 .../iso/19139/20070417/gco/gco.xsd                 |    12 +
 .../iso/19139/20070417/gco/gcoBase.xsd             |    63 +
 .../iso/19139/20070417/gmd/applicationSchema.xsd   |    43 +
 .../iso/19139/20070417/gmd/citation.xsd            |   276 +
 .../iso/19139/20070417/gmd/constraints.xsd         |   107 +
 .../iso/19139/20070417/gmd/content.xsd             |   190 +
 .../iso/19139/20070417/gmd/dataQuality.xsd         |   556 +
 .../iso/19139/20070417/gmd/distribution.xsd        |   203 +
 .../iso/19139/20070417/gmd/extent.xsd              |   206 +
 .../iso/19139/20070417/gmd/freeText.xsd            |   123 +
 .../iso/19139/20070417/gmd/gmd.xsd                 |    12 +
 .../iso/19139/20070417/gmd/identification.xsd      |   349 +
 .../iso/19139/20070417/gmd/maintenance.xsd         |    87 +
 .../iso/19139/20070417/gmd/metadataApplication.xsd |   176 +
 .../iso/19139/20070417/gmd/metadataEntity.xsd      |    71 +
 .../iso/19139/20070417/gmd/metadataExtension.xsd   |   100 +
 .../iso/19139/20070417/gmd/portrayalCatalogue.xsd  |    37 +
 .../iso/19139/20070417/gmd/referenceSystem.xsd     |   101 +
 .../19139/20070417/gmd/spatialRepresentation.xsd   |   238 +
 .../iso/19139/20070417/gsr/gsr.xsd                 |    12 +
 .../iso/19139/20070417/gsr/spatialReferencing.xsd  |    25 +
 .../iso/19139/20070417/gss/geometry.xsd            |    36 +
 .../iso/19139/20070417/gss/gss.xsd                 |    12 +
 .../iso/19139/20070417/gts/gts.xsd                 |    12 +
 .../iso/19139/20070417/gts/temporalObjects.xsd     |    35 +
 .../schemas.opengis.net/om/1.0.0/observation.xsd   |   200 +
 .../retriever/schemas.opengis.net/om/1.0.0/om.xsd  |    17 +
 .../ows/1.1.0/ows19115subset.xsd                   |   236 +
 .../schemas.opengis.net/ows/1.1.0/owsAll.xsd       |    23 +
 .../schemas.opengis.net/ows/1.1.0/owsCommon.xsd    |   158 +
 .../schemas.opengis.net/ows/1.1.0/owsContents.xsd  |    87 +
 .../ows/1.1.0/owsDataIdentification.xsd            |   128 +
 .../ows/1.1.0/owsDomainType.xsd                    |   280 +
 .../ows/1.1.0/owsExceptionReport.xsd               |    77 +
 .../ows/1.1.0/owsGetCapabilities.xsd               |   113 +
 .../ows/1.1.0/owsGetResourceByID.xsd               |    52 +
 .../ows/1.1.0/owsInputOutputData.xsd               |    60 +
 .../schemas.opengis.net/ows/1.1.0/owsManifest.xsd  |   125 +
 .../ows/1.1.0/owsOperationsMetadata.xsd            |   141 +
 .../ows/1.1.0/owsServiceIdentification.xsd         |    61 +
 .../ows/1.1.0/owsServiceProvider.xsd               |    48 +
 .../sampling/1.0.0/LUTgeodesy.xsd                  |   439 +
 .../sampling/1.0.0/sampling.xsd                    |    23 +
 .../sampling/1.0.0/samplingBase.xsd                |   129 +
 .../sampling/1.0.0/samplingManifold.xsd            |   174 +
 .../sampling/1.0.0/specimen.xsd                    |   142 +
 .../sampling/1.0.0/surveyProcedure.xsd             |    88 +
 .../schemas.opengis.net/sensorML/1.0.1/base.xsd    |   483 +
 .../schemas.opengis.net/sensorML/1.0.1/method.xsd  |   172 +
 .../schemas.opengis.net/sensorML/1.0.1/process.xsd |   410 +
 .../sensorML/1.0.1/sensorML.xsd                    |    37 +
 .../schemas.opengis.net/sensorML/1.0.1/system.xsd  |   318 +
 .../schemas.opengis.net/sos/1.0.0/ogc4sos.xsd      |   103 +
 .../schemas.opengis.net/sos/1.0.0/sosAll.xsd       |    32 +
 .../schemas.opengis.net/sos/1.0.0/sosCommon.xsd    |    45 +
 .../schemas.opengis.net/sos/1.0.0/sosContents.xsd  |    98 +
 .../sos/1.0.0/sosDescribeFeatureType.xsd           |    45 +
 .../sos/1.0.0/sosDescribeObservationType.xsd       |    45 +
 .../sos/1.0.0/sosDescribeResultModel.xsd           |    46 +
 .../sos/1.0.0/sosDescribeSensor.xsd                |    51 +
 .../sos/1.0.0/sosGetCapabilities.xsd               |    66 +
 .../sos/1.0.0/sosGetFeatureOfInterest.xsd          |    73 +
 .../sos/1.0.0/sosGetFeatureOfInterestTime.xsd      |    48 +
 .../sos/1.0.0/sosGetObservation.xsd                |   116 +
 .../sos/1.0.0/sosGetObservationById.xsd            |    59 +
 .../schemas.opengis.net/sos/1.0.0/sosGetResult.xsd |    78 +
 .../schemas.opengis.net/sos/1.0.0/sosInsert.xsd    |    62 +
 .../sos/1.0.0/sosRegisterSensor.xsd                |    69 +
 .../sweCommon/1.0.1/aggregateTypes.xsd             |   257 +
 .../sweCommon/1.0.1/basicTypes.xsd                 |   207 +
 .../sweCommon/1.0.1/curveTypes.xsd                 |    68 +
 .../schemas.opengis.net/sweCommon/1.0.1/data.xsd   |    49 +
 .../sweCommon/1.0.1/encoding.xsd                   |   174 +
 .../sweCommon/1.0.1/phenomenon.xsd                 |   172 +
 .../sweCommon/1.0.1/positionTypes.xsd              |   184 +
 .../sweCommon/1.0.1/simpleTypes.xsd                |   659 +
 .../schemas.opengis.net/sweCommon/1.0.1/swe.xsd    |    21 +
 .../sweCommon/1.0.1/temporalAggregates.xsd         |   265 +
 .../sweCommon/1.0.1/xmlData.xsd                    |   117 +
 .../private/retriever/www.w3.org/1999/xlink        |    32 +
 .../private/retriever/www.w3.org/1999/xlink.xsd    |   270 +
 .../private/retriever/www.w3.org/2001/xml.xsd      |   287 +
 interface/nbproject/project.properties             |     7 +
 interface/nbproject/project.xml                    |     9 +
 interface/poster.html                              |   357 +
 interface/requests/describeSensor.xml              |    13 +
 interface/requests/getCapabilities.xml             |    14 +
 interface/requests/getFeatureOfInterest.xml        |    22 +
 interface/requests/getObservation.xml              |    32 +
 interface/requests/getObservation2.xml             |    32 +
 interface/requests/getObservation3.xml             |    29 +
 interface/requests/getfeatureOfinterestBBOX.xml    |    16 +
 interface/requests/getfeatureOfinterestId.xml      |    17 +
 .../insertObservation_dynamic_insitu_composite.xml |    88 +
 .../insertObservation_dynamic_insitu_simple.xml    |    86 +
 ...sertObservation_stationary_insitu_composite.xml |    80 +
 .../insertObservation_stationary_insitu_simple.xml |    68 +
 interface/requests/istSOS_post_xml_index.xml       |    28 +
 .../registerSensor_stationary_insitu_composite.xml |   253 +
 .../registerSensor_stationary_insitu_simple.xml    |   107 +
 interface/servicestatus.html                       |    10 +
 interface/test/chart/app/config/data.json          |    18 +
 interface/test/chart/app/store/testColumnStore.js  |    40 +
 interface/test/chart/app/view/testColumn.js        |    24 +
 interface/test/chart/app/view/ui/testColumn.js     |    74 +
 interface/test/chart/charts.xds                    |   175 +
 interface/test/chart/column-cathegory.html         |   326 +
 interface/test/chart/column-time.html              |   326 +
 interface/test/chart/designer.html                 |    14 +
 interface/test/chart/designer.js                   |    32 +
 interface/test/chart/designer_includeOrder.txt     |     3 +
 interface/test_ObservationEditor.html              |    64 +
 interface/test_csv.html                            |    35 +
 interface/test_observedPropertiesEditor.html       |   251 +
 interface/test_procedure.html                      |   127 +
 interface/test_requests.html                       |    25 +
 interface/test_virtualprocedureeditor.html         |    53 +
 interface/viewer.html                              |   113 +
 istsoslib/__init__.py                              |     1 +
 istsoslib/__init__.pyc                             |   Bin 0 -> 278 bytes
 istsoslib/filters/DS_filter.py                     |    98 +
 istsoslib/filters/DS_filter.pyc                    |   Bin 0 -> 2710 bytes
 istsoslib/filters/GC_filter.py                     |    57 +
 istsoslib/filters/GC_filter.pyc                    |   Bin 0 -> 1737 bytes
 istsoslib/filters/GF_filter.py                     |   101 +
 istsoslib/filters/GO_filter.py                     |   564 +
 istsoslib/filters/GO_filter.pyc                    |   Bin 0 -> 12306 bytes
 istsoslib/filters/IO_filter.py                     |   274 +
 istsoslib/filters/IO_filter.pyc                    |   Bin 0 -> 7502 bytes
 istsoslib/filters/RS_filter.py                     |   438 +
 istsoslib/filters/RS_filter.pyc                    |   Bin 0 -> 9703 bytes
 istsoslib/filters/USD_filter.py                    |    87 +
 istsoslib/filters/__init__.py                      |     1 +
 istsoslib/filters/__init__.pyc                     |   Bin 0 -> 335 bytes
 istsoslib/filters/factory_filters.py               |    98 +
 istsoslib/filters/factory_filters.pyc              |   Bin 0 -> 2832 bytes
 istsoslib/filters/filter.py                        |    98 +
 istsoslib/filters/filter.pyc                       |   Bin 0 -> 2553 bytes
 istsoslib/renderers/DSresponseRender.py            |   255 +
 istsoslib/renderers/DSresponseRender.pyc           |   Bin 0 -> 6845 bytes
 istsoslib/renderers/GCresponseRender.py            |   182 +
 istsoslib/renderers/GCresponseRender.pyc           |   Bin 0 -> 7655 bytes
 istsoslib/renderers/GFresponseRender.py            |   103 +
 istsoslib/renderers/GOresponseRender.py            |   350 +
 istsoslib/renderers/GOresponseRender.pyc           |   Bin 0 -> 10326 bytes
 istsoslib/renderers/IOresponseRender.py            |    28 +
 istsoslib/renderers/IOresponseRender.pyc           |   Bin 0 -> 763 bytes
 istsoslib/renderers/RSresponseRender.py            |    30 +
 istsoslib/renderers/RSresponseRender.pyc           |   Bin 0 -> 929 bytes
 istsoslib/renderers/USDresponseRender.py           |    25 +
 istsoslib/renderers/__init__.py                    |     1 +
 istsoslib/renderers/__init__.pyc                   |   Bin 0 -> 395 bytes
 istsoslib/renderers/factory_render.py              |    59 +
 istsoslib/renderers/factory_render.pyc             |   Bin 0 -> 1449 bytes
 istsoslib/responders/DSresponse.py                 |   119 +
 istsoslib/responders/DSresponse.pyc                |   Bin 0 -> 3102 bytes
 istsoslib/responders/GCresponse.py                 |   368 +
 istsoslib/responders/GCresponse.pyc                |   Bin 0 -> 15785 bytes
 istsoslib/responders/GFresponse.py                 |   107 +
 istsoslib/responders/GOresponse.py                 |  1067 +
 istsoslib/responders/GOresponse.pyc                |   Bin 0 -> 30526 bytes
 istsoslib/responders/IOresponse.py                 |   424 +
 istsoslib/responders/IOresponse.pyc                |   Bin 0 -> 10154 bytes
 istsoslib/responders/RSresponse.py                 |   386 +
 istsoslib/responders/RSresponse.pyc                |   Bin 0 -> 9248 bytes
 istsoslib/responders/USDresponse.py                |    81 +
 istsoslib/responders/__init__.py                   |     1 +
 istsoslib/responders/__init__.pyc                  |   Bin 0 -> 332 bytes
 istsoslib/responders/factory_response.py           |    57 +
 istsoslib/responders/factory_response.pyc          |   Bin 0 -> 1503 bytes
 istsoslib/sosDatabase.py                           |   208 +
 istsoslib/sosDatabase.pyc                          |   Bin 0 -> 7529 bytes
 istsoslib/sosException.py                          |    46 +
 istsoslib/sosException.pyc                         |   Bin 0 -> 2429 bytes
 istsoslib/sosUtils.py                              |   204 +
 istsoslib/sosUtils.pyc                             |   Bin 0 -> 7379 bytes
 istsoslib/sos_version.py                           |     2 +
 lib/__init__.py                                    |     1 +
 lib/__init__.pyc                                   |   Bin 0 -> 255 bytes
 lib/apscheduler/__init__.py                        |     3 +
 lib/apscheduler/events.py                          |    64 +
 lib/apscheduler/job.py                             |   137 +
 lib/apscheduler/jobstores/__init__.py              |     0
 lib/apscheduler/jobstores/base.py                  |    25 +
 lib/apscheduler/jobstores/mongodb_store.py         |    84 +
 lib/apscheduler/jobstores/ram_store.py             |    25 +
 lib/apscheduler/jobstores/redis_store.py           |    91 +
 lib/apscheduler/jobstores/shelve_store.py          |    68 +
 lib/apscheduler/jobstores/sqlalchemy_store.py      |    91 +
 lib/apscheduler/scheduler.py                       |   601 +
 lib/apscheduler/threadpool.py                      |   133 +
 lib/apscheduler/triggers/__init__.py               |     3 +
 lib/apscheduler/triggers/cron/__init__.py          |   144 +
 lib/apscheduler/triggers/cron/expressions.py       |   194 +
 lib/apscheduler/triggers/cron/fields.py            |   100 +
 lib/apscheduler/triggers/interval.py               |    39 +
 lib/apscheduler/triggers/simple.py                 |    17 +
 lib/apscheduler/util.py                            |   230 +
 lib/argparse.py                                    |  2365 +
 lib/argparse.pyc                                   |   Bin 0 -> 68846 bytes
 lib/etree.py                                       |    28 +
 lib/etree.pyc                                      |   Bin 0 -> 745 bytes
 lib/isodate/__init__.py                            |    55 +
 lib/isodate/__init__.pyc                           |   Bin 0 -> 2342 bytes
 lib/isodate/duration.py                            |   261 +
 lib/isodate/duration.pyc                           |   Bin 0 -> 9069 bytes
 lib/isodate/isodates.py                            |   201 +
 lib/isodate/isodates.pyc                           |   Bin 0 -> 5948 bytes
 lib/isodate/isodatetime.py                         |    61 +
 lib/isodate/isodatetime.pyc                        |   Bin 0 -> 1705 bytes
 lib/isodate/isoduration.py                         |   140 +
 lib/isodate/isoduration.pyc                        |   Bin 0 -> 4293 bytes
 lib/isodate/isoerror.py                            |    32 +
 lib/isodate/isoerror.pyc                           |   Bin 0 -> 540 bytes
 lib/isodate/isostrf.py                             |   207 +
 lib/isodate/isostrf.pyc                            |   Bin 0 -> 10639 bytes
 lib/isodate/isotime.py                             |   156 +
 lib/isodate/isotime.pyc                            |   Bin 0 -> 3923 bytes
 lib/isodate/isotzinfo.py                           |   109 +
 lib/isodate/isotzinfo.pyc                          |   Bin 0 -> 3209 bytes
 lib/isodate/tzinfo.py                              |   137 +
 lib/isodate/tzinfo.pyc                             |   Bin 0 -> 5271 bytes
 lib/preparelibs.sh                                 |     2 +
 lib/pytz/__init__.py                               |  1322 +
 lib/pytz/__init__.pyc                              |   Bin 0 -> 26999 bytes
 lib/pytz/locales/pytz.pot                          |  1645 +
 lib/pytz/reference.py                              |   127 +
 lib/pytz/tests/__init__.py                         |     0
 lib/pytz/tests/test_docs.py                        |    35 +
 lib/pytz/tests/test_tzinfo.py                      |   457 +
 lib/pytz/tzinfo.py                                 |   379 +
 lib/pytz/tzinfo.pyc                                |   Bin 0 -> 12523 bytes
 lib/pytz/zone.tab                                  |   417 +
 lib/pytz/zoneinfo/Africa/Abidjan.py                |    22 +
 lib/pytz/zoneinfo/Africa/Accra.py                  |    50 +
 lib/pytz/zoneinfo/Africa/Addis_Ababa.py            |    22 +
 lib/pytz/zoneinfo/Africa/Algiers.py                |    86 +
 lib/pytz/zoneinfo/Africa/Asmera.py                 |    22 +
 lib/pytz/zoneinfo/Africa/Bamako.py                 |    26 +
 lib/pytz/zoneinfo/Africa/Bangui.py                 |    22 +
 lib/pytz/zoneinfo/Africa/Banjul.py                 |    26 +
 lib/pytz/zoneinfo/Africa/Bissau.py                 |    24 +
 lib/pytz/zoneinfo/Africa/Blantyre.py               |    22 +
 lib/pytz/zoneinfo/Africa/Brazzaville.py            |    22 +
 lib/pytz/zoneinfo/Africa/Bujumbura.py              |    12 +
 lib/pytz/zoneinfo/Africa/Cairo.py                  |   368 +
 lib/pytz/zoneinfo/Africa/Casablanca.py             |    58 +
 lib/pytz/zoneinfo/Africa/Ceuta.py                  |   272 +
 lib/pytz/zoneinfo/Africa/Conakry.py                |    26 +
 lib/pytz/zoneinfo/Africa/Dakar.py                  |    24 +
 lib/pytz/zoneinfo/Africa/Dar_es_Salaam.py          |    26 +
 lib/pytz/zoneinfo/Africa/Djibouti.py               |    22 +
 lib/pytz/zoneinfo/Africa/Douala.py                 |    22 +
 lib/pytz/zoneinfo/Africa/El_Aaiun.py               |    24 +
 lib/pytz/zoneinfo/Africa/Freetown.py               |    80 +
 lib/pytz/zoneinfo/Africa/Gaborone.py               |    24 +
 lib/pytz/zoneinfo/Africa/Harare.py                 |    22 +
 lib/pytz/zoneinfo/Africa/Johannesburg.py           |    30 +
 lib/pytz/zoneinfo/Africa/Kampala.py                |    28 +
 lib/pytz/zoneinfo/Africa/Khartoum.py               |    88 +
 lib/pytz/zoneinfo/Africa/Kigali.py                 |    22 +
 lib/pytz/zoneinfo/Africa/Kinshasa.py               |    12 +
 lib/pytz/zoneinfo/Africa/Lagos.py                  |    22 +
 lib/pytz/zoneinfo/Africa/Libreville.py             |    22 +
 lib/pytz/zoneinfo/Africa/Lome.py                   |    12 +
 lib/pytz/zoneinfo/Africa/Luanda.py                 |    22 +
 lib/pytz/zoneinfo/Africa/Lubumbashi.py             |    12 +
 lib/pytz/zoneinfo/Africa/Lusaka.py                 |    22 +
 lib/pytz/zoneinfo/Africa/Malabo.py                 |    24 +
 lib/pytz/zoneinfo/Africa/Maputo.py                 |    22 +
 lib/pytz/zoneinfo/Africa/Maseru.py                 |    26 +
 lib/pytz/zoneinfo/Africa/Mbabane.py                |    22 +
 lib/pytz/zoneinfo/Africa/Mogadishu.py              |    24 +
 lib/pytz/zoneinfo/Africa/Monrovia.py               |    24 +
 lib/pytz/zoneinfo/Africa/Nairobi.py                |    28 +
 lib/pytz/zoneinfo/Africa/Ndjamena.py               |    26 +
 lib/pytz/zoneinfo/Africa/Niamey.py                 |    26 +
 lib/pytz/zoneinfo/Africa/Nouakchott.py             |    26 +
 lib/pytz/zoneinfo/Africa/Ouagadougou.py            |    22 +
 lib/pytz/zoneinfo/Africa/Porto_minus_Novo.py       |    24 +
 lib/pytz/zoneinfo/Africa/Sao_Tome.py               |    22 +
 lib/pytz/zoneinfo/Africa/Timbuktu.py               |    26 +
 lib/pytz/zoneinfo/Africa/Tripoli.py                |    78 +
 lib/pytz/zoneinfo/Africa/Tunis.py                  |   202 +
 lib/pytz/zoneinfo/Africa/Windhoek.py               |   204 +
 lib/pytz/zoneinfo/Africa/__init__.py               |     0
 lib/pytz/zoneinfo/America/Adak.py                  |   306 +
 lib/pytz/zoneinfo/America/Anchorage.py             |   306 +
 lib/pytz/zoneinfo/America/Anguilla.py              |    22 +
 lib/pytz/zoneinfo/America/Antigua.py               |    24 +
 lib/pytz/zoneinfo/America/Araguaina.py             |   118 +
 .../zoneinfo/America/Argentina/Buenos_Aires.py     |   132 +
 lib/pytz/zoneinfo/America/Argentina/Catamarca.py   |   136 +
 .../zoneinfo/America/Argentina/ComodRivadavia.py   |   136 +
 lib/pytz/zoneinfo/America/Argentina/Cordoba.py     |   132 +
 lib/pytz/zoneinfo/America/Argentina/Jujuy.py       |   132 +
 lib/pytz/zoneinfo/America/Argentina/La_Rioja.py    |   138 +
 lib/pytz/zoneinfo/America/Argentina/Mendoza.py     |   136 +
 .../zoneinfo/America/Argentina/Rio_Gallegos.py     |   136 +
 lib/pytz/zoneinfo/America/Argentina/San_Juan.py    |   138 +
 lib/pytz/zoneinfo/America/Argentina/Tucuman.py     |   136 +
 lib/pytz/zoneinfo/America/Argentina/Ushuaia.py     |   136 +
 lib/pytz/zoneinfo/America/Argentina/__init__.py    |     0
 lib/pytz/zoneinfo/America/Aruba.py                 |    24 +
 lib/pytz/zoneinfo/America/Asuncion.py              |   276 +
 lib/pytz/zoneinfo/America/Atikokan.py              |    32 +
 lib/pytz/zoneinfo/America/Atka.py                  |   306 +
 lib/pytz/zoneinfo/America/Bahia.py                 |   138 +
 lib/pytz/zoneinfo/America/Barbados.py              |    40 +
 lib/pytz/zoneinfo/America/Belem.py                 |    78 +
 lib/pytz/zoneinfo/America/Belize.py                |   130 +
 lib/pytz/zoneinfo/America/Blanc_minus_Sablon.py    |    30 +
 lib/pytz/zoneinfo/America/Boa_Vista.py             |    86 +
 lib/pytz/zoneinfo/America/Bogota.py                |    26 +
 lib/pytz/zoneinfo/America/Boise.py                 |   320 +
 lib/pytz/zoneinfo/America/Buenos_Aires.py          |   132 +
 lib/pytz/zoneinfo/America/Cambridge_Bay.py         |   272 +
 lib/pytz/zoneinfo/America/Campo_Grande.py          |   276 +
 lib/pytz/zoneinfo/America/Cancun.py                |   194 +
 lib/pytz/zoneinfo/America/Caracas.py               |    24 +
 lib/pytz/zoneinfo/America/Catamarca.py             |   136 +
 lib/pytz/zoneinfo/America/Cayenne.py               |    24 +
 lib/pytz/zoneinfo/America/Cayman.py                |    22 +
 lib/pytz/zoneinfo/America/Chicago.py               |   490 +
 lib/pytz/zoneinfo/America/Chihuahua.py             |   200 +
 lib/pytz/zoneinfo/America/Coral_Harbour.py         |    32 +
 lib/pytz/zoneinfo/America/Cordoba.py               |   132 +
 lib/pytz/zoneinfo/America/Costa_Rica.py            |    38 +
 lib/pytz/zoneinfo/America/Cuiaba.py                |   272 +
 lib/pytz/zoneinfo/America/Curacao.py               |    24 +
 lib/pytz/zoneinfo/America/Danmarkshavn.py          |    88 +
 lib/pytz/zoneinfo/America/Dawson.py                |   272 +
 lib/pytz/zoneinfo/America/Dawson_Creek.py          |   134 +
 lib/pytz/zoneinfo/America/Denver.py                |   334 +
 lib/pytz/zoneinfo/America/Detroit.py               |   298 +
 lib/pytz/zoneinfo/America/Dominica.py              |    22 +
 lib/pytz/zoneinfo/America/Edmonton.py              |   328 +
 lib/pytz/zoneinfo/America/Eirunepe.py              |    82 +
 lib/pytz/zoneinfo/America/El_Salvador.py           |    30 +
 lib/pytz/zoneinfo/America/Ensenada.py              |   318 +
 lib/pytz/zoneinfo/America/Fort_Wayne.py            |   216 +
 lib/pytz/zoneinfo/America/Fortaleza.py             |    98 +
 lib/pytz/zoneinfo/America/Glace_Bay.py             |   300 +
 lib/pytz/zoneinfo/America/Godthab.py               |   254 +
 lib/pytz/zoneinfo/America/Goose_Bay.py             |   426 +
 lib/pytz/zoneinfo/America/Grand_Turk.py            |   258 +
 lib/pytz/zoneinfo/America/Grenada.py               |    22 +
 lib/pytz/zoneinfo/America/Guadeloupe.py            |    22 +
 lib/pytz/zoneinfo/America/Guatemala.py             |    38 +
 lib/pytz/zoneinfo/America/Guayaquil.py             |    22 +
 lib/pytz/zoneinfo/America/Guyana.py                |    28 +
 lib/pytz/zoneinfo/America/Halifax.py               |   476 +
 lib/pytz/zoneinfo/America/Havana.py                |   330 +
 lib/pytz/zoneinfo/America/Hermosillo.py            |    50 +
 lib/pytz/zoneinfo/America/Indiana/Indianapolis.py  |   216 +
 lib/pytz/zoneinfo/America/Indiana/Knox.py          |   326 +
 lib/pytz/zoneinfo/America/Indiana/Marengo.py       |   224 +
 lib/pytz/zoneinfo/America/Indiana/Petersburg.py    |   250 +
 lib/pytz/zoneinfo/America/Indiana/Vevay.py         |   180 +
 lib/pytz/zoneinfo/America/Indiana/Vincennes.py     |   220 +
 lib/pytz/zoneinfo/America/Indiana/__init__.py      |     0
 lib/pytz/zoneinfo/America/Indianapolis.py          |   216 +
 lib/pytz/zoneinfo/America/Inuvik.py                |   272 +
 lib/pytz/zoneinfo/America/Iqaluit.py               |   270 +
 lib/pytz/zoneinfo/America/Jamaica.py               |    62 +
 lib/pytz/zoneinfo/America/Jujuy.py                 |   132 +
 lib/pytz/zoneinfo/America/Juneau.py                |   304 +
 lib/pytz/zoneinfo/America/Kentucky/Louisville.py   |   374 +
 lib/pytz/zoneinfo/America/Kentucky/Monticello.py   |   314 +
 lib/pytz/zoneinfo/America/Kentucky/__init__.py     |     0
 lib/pytz/zoneinfo/America/Knox_IN.py               |   326 +
 lib/pytz/zoneinfo/America/La_Paz.py                |    24 +
 lib/pytz/zoneinfo/America/Lima.py                  |    50 +
 lib/pytz/zoneinfo/America/Los_Angeles.py           |   390 +
 lib/pytz/zoneinfo/America/Louisville.py            |   374 +
 lib/pytz/zoneinfo/America/Maceio.py                |   102 +
 lib/pytz/zoneinfo/America/Managua.py               |    50 +
 lib/pytz/zoneinfo/America/Manaus.py                |    82 +
 lib/pytz/zoneinfo/America/Martinique.py            |    26 +
 lib/pytz/zoneinfo/America/Mazatlan.py              |   206 +
 lib/pytz/zoneinfo/America/Mendoza.py               |   136 +
 lib/pytz/zoneinfo/America/Menominee.py             |   304 +
 lib/pytz/zoneinfo/America/Merida.py                |   194 +
 lib/pytz/zoneinfo/America/Mexico_City.py           |   216 +
 lib/pytz/zoneinfo/America/Miquelon.py              |   228 +
 lib/pytz/zoneinfo/America/Moncton.py               |   432 +
 lib/pytz/zoneinfo/America/Monterrey.py             |   194 +
 lib/pytz/zoneinfo/America/Montevideo.py            |   282 +
 lib/pytz/zoneinfo/America/Montreal.py              |   484 +
 lib/pytz/zoneinfo/America/Montserrat.py            |    22 +
 lib/pytz/zoneinfo/America/Nassau.py                |   318 +
 lib/pytz/zoneinfo/America/New_York.py              |   490 +
 lib/pytz/zoneinfo/America/Nipigon.py               |   288 +
 lib/pytz/zoneinfo/America/Nome.py                  |   306 +
 lib/pytz/zoneinfo/America/Noronha.py               |    98 +
 lib/pytz/zoneinfo/America/North_Dakota/Center.py   |   318 +
 .../zoneinfo/America/North_Dakota/New_Salem.py     |   318 +
 lib/pytz/zoneinfo/America/North_Dakota/__init__.py |     0
 lib/pytz/zoneinfo/America/Panama.py                |    22 +
 lib/pytz/zoneinfo/America/Pangnirtung.py           |   270 +
 lib/pytz/zoneinfo/America/Paramaribo.py            |    30 +
 lib/pytz/zoneinfo/America/Phoenix.py               |    40 +
 .../zoneinfo/America/Port_minus_au_minus_Prince.py |   214 +
 lib/pytz/zoneinfo/America/Port_of_Spain.py         |    22 +
 lib/pytz/zoneinfo/America/Porto_Acre.py            |    78 +
 lib/pytz/zoneinfo/America/Porto_Velho.py           |    78 +
 lib/pytz/zoneinfo/America/Puerto_Rico.py           |    26 +
 lib/pytz/zoneinfo/America/Rainy_River.py           |   288 +
 lib/pytz/zoneinfo/America/Rankin_Inlet.py          |   270 +
 lib/pytz/zoneinfo/America/Recife.py                |    98 +
 lib/pytz/zoneinfo/America/Regina.py                |   126 +
 lib/pytz/zoneinfo/America/Rio_Branco.py            |    78 +
 lib/pytz/zoneinfo/America/Rosario.py               |   132 +
 lib/pytz/zoneinfo/America/Santiago.py              |   336 +
 lib/pytz/zoneinfo/America/Santo_Domingo.py         |    52 +
 lib/pytz/zoneinfo/America/Sao_Paulo.py             |   276 +
 lib/pytz/zoneinfo/America/Scoresbysund.py          |   254 +
 lib/pytz/zoneinfo/America/Shiprock.py              |   334 +
 lib/pytz/zoneinfo/America/St_Johns.py              |   496 +
 lib/pytz/zoneinfo/America/St_Kitts.py              |    22 +
 lib/pytz/zoneinfo/America/St_Lucia.py              |    22 +
 lib/pytz/zoneinfo/America/St_Thomas.py             |    22 +
 lib/pytz/zoneinfo/America/St_Vincent.py            |    22 +
 lib/pytz/zoneinfo/America/Swift_Current.py         |    66 +
 lib/pytz/zoneinfo/America/Tegucigalpa.py           |    46 +
 lib/pytz/zoneinfo/America/Thule.py                 |   210 +
 lib/pytz/zoneinfo/America/Thunder_Bay.py           |   296 +
 lib/pytz/zoneinfo/America/Tijuana.py               |   318 +
 lib/pytz/zoneinfo/America/Toronto.py               |   484 +
 lib/pytz/zoneinfo/America/Tortola.py               |    22 +
 lib/pytz/zoneinfo/America/Vancouver.py             |   398 +
 lib/pytz/zoneinfo/America/Virgin.py                |    22 +
 lib/pytz/zoneinfo/America/Whitehorse.py            |   272 +
 lib/pytz/zoneinfo/America/Winnipeg.py              |   392 +
 lib/pytz/zoneinfo/America/Yakutat.py               |   304 +
 lib/pytz/zoneinfo/America/Yellowknife.py           |   270 +
 lib/pytz/zoneinfo/America/__init__.py              |     0
 lib/pytz/zoneinfo/Antarctica/Casey.py              |    22 +
 lib/pytz/zoneinfo/Antarctica/Davis.py              |    26 +
 lib/pytz/zoneinfo/Antarctica/DumontDUrville.py     |    26 +
 lib/pytz/zoneinfo/Antarctica/Mawson.py             |    22 +
 lib/pytz/zoneinfo/Antarctica/McMurdo.py            |   276 +
 lib/pytz/zoneinfo/Antarctica/Palmer.py             |   270 +
 lib/pytz/zoneinfo/Antarctica/Rothera.py            |    22 +
 lib/pytz/zoneinfo/Antarctica/South_Pole.py         |   276 +
 lib/pytz/zoneinfo/Antarctica/Syowa.py              |    22 +
 lib/pytz/zoneinfo/Antarctica/Vostok.py             |    22 +
 lib/pytz/zoneinfo/Antarctica/__init__.py           |     0
 lib/pytz/zoneinfo/Arctic/Longyearbyen.py           |   302 +
 lib/pytz/zoneinfo/Arctic/__init__.py               |     0
 lib/pytz/zoneinfo/Asia/Aden.py                     |    22 +
 lib/pytz/zoneinfo/Asia/Almaty.py                   |   120 +
 lib/pytz/zoneinfo/Asia/Amman.py                    |   258 +
 lib/pytz/zoneinfo/Asia/Anadyr.py                   |   254 +
 lib/pytz/zoneinfo/Asia/Aqtau.py                    |   122 +
 lib/pytz/zoneinfo/Asia/Aqtobe.py                   |   122 +
 lib/pytz/zoneinfo/Asia/Ashgabat.py                 |    72 +
 lib/pytz/zoneinfo/Asia/Ashkhabad.py                |    72 +
 lib/pytz/zoneinfo/Asia/Baghdad.py                  |   246 +
 lib/pytz/zoneinfo/Asia/Bahrain.py                  |    24 +
 lib/pytz/zoneinfo/Asia/Baku.py                     |   244 +
 lib/pytz/zoneinfo/Asia/Bangkok.py                  |    22 +
 lib/pytz/zoneinfo/Asia/Beirut.py                   |   300 +
 lib/pytz/zoneinfo/Asia/Bishkek.py                  |   124 +
 lib/pytz/zoneinfo/Asia/Brunei.py                   |    24 +
 lib/pytz/zoneinfo/Asia/Calcutta.py                 |    28 +
 lib/pytz/zoneinfo/Asia/Choibalsan.py               |   236 +
 lib/pytz/zoneinfo/Asia/Chongqing.py                |    48 +
 lib/pytz/zoneinfo/Asia/Chungking.py                |    48 +
 lib/pytz/zoneinfo/Asia/Colombo.py                  |    34 +
 lib/pytz/zoneinfo/Asia/Dacca.py                    |    30 +
 lib/pytz/zoneinfo/Asia/Damascus.py                 |   322 +
 lib/pytz/zoneinfo/Asia/Dhaka.py                    |    30 +
 lib/pytz/zoneinfo/Asia/Dili.py                     |    30 +
 lib/pytz/zoneinfo/Asia/Dubai.py                    |    22 +
 lib/pytz/zoneinfo/Asia/Dushanbe.py                 |    68 +
 lib/pytz/zoneinfo/Asia/Gaza.py                     |   308 +
 lib/pytz/zoneinfo/Asia/Harbin.py                   |    54 +
 lib/pytz/zoneinfo/Asia/Hong_Kong.py                |   158 +
 lib/pytz/zoneinfo/Asia/Hovd.py                     |   236 +
 lib/pytz/zoneinfo/Asia/Irkutsk.py                  |   254 +
 lib/pytz/zoneinfo/Asia/Istanbul.py                 |   362 +
 lib/pytz/zoneinfo/Asia/Jakarta.py                  |    34 +
 lib/pytz/zoneinfo/Asia/Jayapura.py                 |    26 +
 lib/pytz/zoneinfo/Asia/Jerusalem.py                |   304 +
 lib/pytz/zoneinfo/Asia/Kabul.py                    |    22 +
 lib/pytz/zoneinfo/Asia/Kamchatka.py                |   254 +
 lib/pytz/zoneinfo/Asia/Karachi.py                  |    34 +
 lib/pytz/zoneinfo/Asia/Kashgar.py                  |    50 +
 lib/pytz/zoneinfo/Asia/Katmandu.py                 |    24 +
 lib/pytz/zoneinfo/Asia/Krasnoyarsk.py              |   254 +
 lib/pytz/zoneinfo/Asia/Kuala_Lumpur.py             |    34 +
 lib/pytz/zoneinfo/Asia/Kuching.py                  |    58 +
 lib/pytz/zoneinfo/Asia/Kuwait.py                   |    22 +
 lib/pytz/zoneinfo/Asia/Macao.py                    |   104 +
 lib/pytz/zoneinfo/Asia/Macau.py                    |   104 +
 lib/pytz/zoneinfo/Asia/Magadan.py                  |   254 +
 lib/pytz/zoneinfo/Asia/Makassar.py                 |    28 +
 lib/pytz/zoneinfo/Asia/Manila.py                   |    36 +
 lib/pytz/zoneinfo/Asia/Muscat.py                   |    22 +
 lib/pytz/zoneinfo/Asia/Nicosia.py                  |   274 +
 lib/pytz/zoneinfo/Asia/Novosibirsk.py              |   256 +
 lib/pytz/zoneinfo/Asia/Omsk.py                     |   254 +
 lib/pytz/zoneinfo/Asia/Oral.py                     |   122 +
 lib/pytz/zoneinfo/Asia/Phnom_Penh.py               |    28 +
 lib/pytz/zoneinfo/Asia/Pontianak.py                |    36 +
 lib/pytz/zoneinfo/Asia/Pyongyang.py                |    30 +
 lib/pytz/zoneinfo/Asia/Qatar.py                    |    24 +
 lib/pytz/zoneinfo/Asia/Qyzylorda.py                |   124 +
 lib/pytz/zoneinfo/Asia/Rangoon.py                  |    26 +
 lib/pytz/zoneinfo/Asia/Riyadh.py                   |    22 +
 lib/pytz/zoneinfo/Asia/Saigon.py                   |    28 +
 lib/pytz/zoneinfo/Asia/Sakhalin.py                 |   256 +
 lib/pytz/zoneinfo/Asia/Samarkand.py                |    72 +
 lib/pytz/zoneinfo/Asia/Seoul.py                    |    44 +
 lib/pytz/zoneinfo/Asia/Shanghai.py                 |    54 +
 lib/pytz/zoneinfo/Asia/Singapore.py                |    36 +
 lib/pytz/zoneinfo/Asia/Taipei.py                   |   100 +
 lib/pytz/zoneinfo/Asia/Tashkent.py                 |    72 +
 lib/pytz/zoneinfo/Asia/Tbilisi.py                  |   126 +
 lib/pytz/zoneinfo/Asia/Tehran.py                   |   100 +
 lib/pytz/zoneinfo/Asia/Tel_Aviv.py                 |   304 +
 lib/pytz/zoneinfo/Asia/Thimbu.py                   |    24 +
 lib/pytz/zoneinfo/Asia/Thimphu.py                  |    24 +
 lib/pytz/zoneinfo/Asia/Tokyo.py                    |    38 +
 lib/pytz/zoneinfo/Asia/Ujung_Pandang.py            |    28 +
 lib/pytz/zoneinfo/Asia/Ulaanbaatar.py              |   236 +
 lib/pytz/zoneinfo/Asia/Ulan_Bator.py               |   236 +
 lib/pytz/zoneinfo/Asia/Urumqi.py                   |    48 +
 lib/pytz/zoneinfo/Asia/Vientiane.py                |    28 +
 lib/pytz/zoneinfo/Asia/Vladivostok.py              |   254 +
 lib/pytz/zoneinfo/Asia/Yakutsk.py                  |   254 +
 lib/pytz/zoneinfo/Asia/Yekaterinburg.py            |   254 +
 lib/pytz/zoneinfo/Asia/Yerevan.py                  |   252 +
 lib/pytz/zoneinfo/Asia/__init__.py                 |     0
 lib/pytz/zoneinfo/Atlantic/Azores.py               |   460 +
 lib/pytz/zoneinfo/Atlantic/Bermuda.py              |   278 +
 lib/pytz/zoneinfo/Atlantic/Canary.py               |   256 +
 lib/pytz/zoneinfo/Atlantic/Cape_Verde.py           |    28 +
 lib/pytz/zoneinfo/Atlantic/Faeroe.py               |   250 +
 lib/pytz/zoneinfo/Atlantic/Jan_Mayen.py            |   302 +
 lib/pytz/zoneinfo/Atlantic/Madeira.py              |   460 +
 lib/pytz/zoneinfo/Atlantic/Reykjavik.py            |   148 +
 lib/pytz/zoneinfo/Atlantic/South_Georgia.py        |    12 +
 lib/pytz/zoneinfo/Atlantic/St_Helena.py            |    22 +
 lib/pytz/zoneinfo/Atlantic/Stanley.py              |   266 +
 lib/pytz/zoneinfo/Atlantic/__init__.py             |     0
 lib/pytz/zoneinfo/Australia/ACT.py                 |   302 +
 lib/pytz/zoneinfo/Australia/Adelaide.py            |   302 +
 lib/pytz/zoneinfo/Australia/Brisbane.py            |    52 +
 lib/pytz/zoneinfo/Australia/Broken_Hill.py         |   304 +
 lib/pytz/zoneinfo/Australia/Canberra.py            |   302 +
 lib/pytz/zoneinfo/Australia/Currie.py              |   302 +
 lib/pytz/zoneinfo/Australia/Darwin.py              |    36 +
 lib/pytz/zoneinfo/Australia/Hobart.py              |   318 +
 lib/pytz/zoneinfo/Australia/LHI.py                 |   248 +
 lib/pytz/zoneinfo/Australia/Lindeman.py            |    62 +
 lib/pytz/zoneinfo/Australia/Lord_Howe.py           |   248 +
 lib/pytz/zoneinfo/Australia/Melbourne.py           |   302 +
 lib/pytz/zoneinfo/Australia/NSW.py                 |   302 +
 lib/pytz/zoneinfo/Australia/North.py               |    36 +
 lib/pytz/zoneinfo/Australia/Perth.py               |    56 +
 lib/pytz/zoneinfo/Australia/Queensland.py          |    52 +
 lib/pytz/zoneinfo/Australia/South.py               |   302 +
 lib/pytz/zoneinfo/Australia/Sydney.py              |   302 +
 lib/pytz/zoneinfo/Australia/Tasmania.py            |   318 +
 lib/pytz/zoneinfo/Australia/Victoria.py            |   302 +
 lib/pytz/zoneinfo/Australia/West.py                |    56 +
 lib/pytz/zoneinfo/Australia/Yancowinna.py          |   304 +
 lib/pytz/zoneinfo/Australia/__init__.py            |     0
 lib/pytz/zoneinfo/Brazil/Acre.py                   |    78 +
 lib/pytz/zoneinfo/Brazil/DeNoronha.py              |    98 +
 lib/pytz/zoneinfo/Brazil/East.py                   |   276 +
 lib/pytz/zoneinfo/Brazil/West.py                   |    82 +
 lib/pytz/zoneinfo/Brazil/__init__.py               |     0
 lib/pytz/zoneinfo/CET.py                           |   288 +
 lib/pytz/zoneinfo/CST6CDT.py                       |   318 +
 lib/pytz/zoneinfo/Canada/Atlantic.py               |   476 +
 lib/pytz/zoneinfo/Canada/Central.py                |   392 +
 .../zoneinfo/Canada/East_minus_Saskatchewan.py     |   126 +
 lib/pytz/zoneinfo/Canada/Eastern.py                |   484 +
 lib/pytz/zoneinfo/Canada/Mountain.py               |   328 +
 lib/pytz/zoneinfo/Canada/Newfoundland.py           |   496 +
 lib/pytz/zoneinfo/Canada/Pacific.py                |   398 +
 lib/pytz/zoneinfo/Canada/Saskatchewan.py           |   126 +
 lib/pytz/zoneinfo/Canada/Yukon.py                  |   272 +
 lib/pytz/zoneinfo/Canada/__init__.py               |     0
 lib/pytz/zoneinfo/Chile/Continental.py             |   336 +
 lib/pytz/zoneinfo/Chile/EasterIsland.py            |   308 +
 lib/pytz/zoneinfo/Chile/__init__.py                |     0
 lib/pytz/zoneinfo/Cuba.py                          |   330 +
 lib/pytz/zoneinfo/EET.py                           |   264 +
 lib/pytz/zoneinfo/EST.py                           |    12 +
 lib/pytz/zoneinfo/EST5EDT.py                       |   318 +
 lib/pytz/zoneinfo/Egypt.py                         |   368 +
 lib/pytz/zoneinfo/Eire.py                          |   478 +
 lib/pytz/zoneinfo/Etc/GMT.py                       |    12 +
 lib/pytz/zoneinfo/Etc/GMT0.py                      |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_0.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_1.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_10.py              |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_11.py              |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_12.py              |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_13.py              |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_14.py              |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_2.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_3.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_4.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_5.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_6.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_7.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_8.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_minus_9.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_0.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_1.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_10.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_11.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_12.py               |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_2.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_3.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_4.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_5.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_6.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_7.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_8.py                |    12 +
 lib/pytz/zoneinfo/Etc/GMT_plus_9.py                |    12 +
 lib/pytz/zoneinfo/Etc/Greenwich.py                 |    12 +
 lib/pytz/zoneinfo/Etc/UCT.py                       |    12 +
 lib/pytz/zoneinfo/Etc/UTC.py                       |    12 +
 lib/pytz/zoneinfo/Etc/Universal.py                 |    12 +
 lib/pytz/zoneinfo/Etc/Zulu.py                      |    12 +
 lib/pytz/zoneinfo/Etc/__init__.py                  |     0
 lib/pytz/zoneinfo/Europe/Amsterdam.py              |   380 +
 lib/pytz/zoneinfo/Europe/Andorra.py                |   234 +
 lib/pytz/zoneinfo/Europe/Athens.py                 |   294 +
 lib/pytz/zoneinfo/Europe/Belfast.py                |   504 +
 lib/pytz/zoneinfo/Europe/Belgrade.py               |   258 +
 lib/pytz/zoneinfo/Europe/Berlin.py                 |   306 +
 lib/pytz/zoneinfo/Europe/Bratislava.py             |   302 +
 lib/pytz/zoneinfo/Europe/Brussels.py               |   390 +
 lib/pytz/zoneinfo/Europe/Bucharest.py              |   294 +
 lib/pytz/zoneinfo/Europe/Budapest.py               |   326 +
 lib/pytz/zoneinfo/Europe/Chisinau.py               |   300 +
 lib/pytz/zoneinfo/Europe/Copenhagen.py             |   286 +
 lib/pytz/zoneinfo/Europe/Dublin.py                 |   478 +
 lib/pytz/zoneinfo/Europe/Gibraltar.py              |   414 +
 lib/pytz/zoneinfo/Europe/Guernsey.py               |   504 +
 lib/pytz/zoneinfo/Europe/Helsinki.py               |   254 +
 lib/pytz/zoneinfo/Europe/Isle_of_Man.py            |   504 +
 lib/pytz/zoneinfo/Europe/Istanbul.py               |   362 +
 lib/pytz/zoneinfo/Europe/Jersey.py                 |   504 +
 lib/pytz/zoneinfo/Europe/Kaliningrad.py            |   280 +
 lib/pytz/zoneinfo/Europe/Kiev.py                   |   258 +
 lib/pytz/zoneinfo/Europe/Lisbon.py                 |   462 +
 lib/pytz/zoneinfo/Europe/Ljubljana.py              |   258 +
 lib/pytz/zoneinfo/Europe/London.py                 |   504 +
 lib/pytz/zoneinfo/Europe/Luxembourg.py             |   388 +
 lib/pytz/zoneinfo/Europe/Madrid.py                 |   346 +
 lib/pytz/zoneinfo/Europe/Malta.py                  |   356 +
 lib/pytz/zoneinfo/Europe/Mariehamn.py              |   254 +
 lib/pytz/zoneinfo/Europe/Minsk.py                  |   262 +
 lib/pytz/zoneinfo/Europe/Monaco.py                 |   388 +
 lib/pytz/zoneinfo/Europe/Moscow.py                 |   278 +
 lib/pytz/zoneinfo/Europe/Nicosia.py                |   274 +
 lib/pytz/zoneinfo/Europe/Oslo.py                   |   302 +
 lib/pytz/zoneinfo/Europe/Paris.py                  |   386 +
 lib/pytz/zoneinfo/Europe/Podgorica.py              |   258 +
 lib/pytz/zoneinfo/Europe/Prague.py                 |   302 +
 lib/pytz/zoneinfo/Europe/Riga.py                   |   274 +
 lib/pytz/zoneinfo/Europe/Rome.py                   |   360 +
 lib/pytz/zoneinfo/Europe/Samara.py                 |   256 +
 lib/pytz/zoneinfo/Europe/San_Marino.py             |   360 +
 lib/pytz/zoneinfo/Europe/Sarajevo.py               |   258 +
 lib/pytz/zoneinfo/Europe/Simferopol.py             |   266 +
 lib/pytz/zoneinfo/Europe/Skopje.py                 |   258 +
 lib/pytz/zoneinfo/Europe/Sofia.py                  |   270 +
 lib/pytz/zoneinfo/Europe/Stockholm.py              |   256 +
 lib/pytz/zoneinfo/Europe/Tallinn.py                |   268 +
 lib/pytz/zoneinfo/Europe/Tirane.py                 |   286 +
 lib/pytz/zoneinfo/Europe/Tiraspol.py               |   300 +
 lib/pytz/zoneinfo/Europe/Uzhgorod.py               |   262 +
 lib/pytz/zoneinfo/Europe/Vaduz.py                  |   248 +
 lib/pytz/zoneinfo/Europe/Vatican.py                |   360 +
 lib/pytz/zoneinfo/Europe/Vienna.py                 |   300 +
 lib/pytz/zoneinfo/Europe/Vilnius.py                |   262 +
 lib/pytz/zoneinfo/Europe/Volgograd.py              |   254 +
 lib/pytz/zoneinfo/Europe/Warsaw.py                 |   354 +
 lib/pytz/zoneinfo/Europe/Zagreb.py                 |   258 +
 lib/pytz/zoneinfo/Europe/Zaporozhye.py             |   262 +
 lib/pytz/zoneinfo/Europe/Zurich.py                 |   260 +
 lib/pytz/zoneinfo/Europe/__init__.py               |     0
 lib/pytz/zoneinfo/GB.py                            |   504 +
 lib/pytz/zoneinfo/GB_minus_Eire.py                 |   504 +
 lib/pytz/zoneinfo/GMT.py                           |    12 +
 lib/pytz/zoneinfo/GMT0.py                          |    12 +
 lib/pytz/zoneinfo/GMT_minus_0.py                   |    12 +
 lib/pytz/zoneinfo/GMT_plus_0.py                    |    12 +
 lib/pytz/zoneinfo/Greenwich.py                     |    12 +
 lib/pytz/zoneinfo/HST.py                           |    12 +
 lib/pytz/zoneinfo/Hongkong.py                      |   158 +
 lib/pytz/zoneinfo/Iceland.py                       |   148 +
 lib/pytz/zoneinfo/Indian/Antananarivo.py           |    26 +
 lib/pytz/zoneinfo/Indian/Chagos.py                 |    24 +
 lib/pytz/zoneinfo/Indian/Christmas.py              |    12 +
 lib/pytz/zoneinfo/Indian/Cocos.py                  |    12 +
 lib/pytz/zoneinfo/Indian/Comoro.py                 |    22 +
 lib/pytz/zoneinfo/Indian/Kerguelen.py              |    22 +
 lib/pytz/zoneinfo/Indian/Mahe.py                   |    22 +
 lib/pytz/zoneinfo/Indian/Maldives.py               |    22 +
 lib/pytz/zoneinfo/Indian/Mauritius.py              |    22 +
 lib/pytz/zoneinfo/Indian/Mayotte.py                |    22 +
 lib/pytz/zoneinfo/Indian/Reunion.py                |    22 +
 lib/pytz/zoneinfo/Indian/__init__.py               |     0
 lib/pytz/zoneinfo/Iran.py                          |   100 +
 lib/pytz/zoneinfo/Israel.py                        |   304 +
 lib/pytz/zoneinfo/Jamaica.py                       |    62 +
 lib/pytz/zoneinfo/Japan.py                         |    38 +
 lib/pytz/zoneinfo/Kwajalein.py                     |    24 +
 lib/pytz/zoneinfo/Libya.py                         |    78 +
 lib/pytz/zoneinfo/MET.py                           |   288 +
 lib/pytz/zoneinfo/MST.py                           |    12 +
 lib/pytz/zoneinfo/MST7MDT.py                       |   318 +
 lib/pytz/zoneinfo/Mexico/BajaNorte.py              |   318 +
 lib/pytz/zoneinfo/Mexico/BajaSur.py                |   206 +
 lib/pytz/zoneinfo/Mexico/General.py                |   216 +
 lib/pytz/zoneinfo/Mexico/__init__.py               |     0
 lib/pytz/zoneinfo/NZ.py                            |   330 +
 lib/pytz/zoneinfo/NZ_minus_CHAT.py                 |   276 +
 lib/pytz/zoneinfo/Navajo.py                        |   334 +
 lib/pytz/zoneinfo/PRC.py                           |    54 +
 lib/pytz/zoneinfo/PST8PDT.py                       |   318 +
 lib/pytz/zoneinfo/Pacific/Apia.py                  |    24 +
 lib/pytz/zoneinfo/Pacific/Auckland.py              |   330 +
 lib/pytz/zoneinfo/Pacific/Chatham.py               |   276 +
 lib/pytz/zoneinfo/Pacific/Easter.py                |   308 +
 lib/pytz/zoneinfo/Pacific/Efate.py                 |    62 +
 lib/pytz/zoneinfo/Pacific/Enderbury.py             |    24 +
 lib/pytz/zoneinfo/Pacific/Fakaofo.py               |    12 +
 lib/pytz/zoneinfo/Pacific/Fiji.py                  |    30 +
 lib/pytz/zoneinfo/Pacific/Funafuti.py              |    12 +
 lib/pytz/zoneinfo/Pacific/Galapagos.py             |    24 +
 lib/pytz/zoneinfo/Pacific/Gambier.py               |    22 +
 lib/pytz/zoneinfo/Pacific/Guadalcanal.py           |    22 +
 lib/pytz/zoneinfo/Pacific/Guam.py                  |    22 +
 lib/pytz/zoneinfo/Pacific/Honolulu.py              |    32 +
 lib/pytz/zoneinfo/Pacific/Johnston.py              |    12 +
 lib/pytz/zoneinfo/Pacific/Kiritimati.py            |    24 +
 lib/pytz/zoneinfo/Pacific/Kosrae.py                |    24 +
 lib/pytz/zoneinfo/Pacific/Kwajalein.py             |    24 +
 lib/pytz/zoneinfo/Pacific/Majuro.py                |    22 +
 lib/pytz/zoneinfo/Pacific/Marquesas.py             |    22 +
 lib/pytz/zoneinfo/Pacific/Midway.py                |    28 +
 lib/pytz/zoneinfo/Pacific/Nauru.py                 |    28 +
 lib/pytz/zoneinfo/Pacific/Niue.py                  |    24 +
 lib/pytz/zoneinfo/Pacific/Norfolk.py               |    22 +
 lib/pytz/zoneinfo/Pacific/Noumea.py                |    34 +
 lib/pytz/zoneinfo/Pacific/Pago_Pago.py             |    28 +
 lib/pytz/zoneinfo/Pacific/Palau.py                 |    12 +
 lib/pytz/zoneinfo/Pacific/Pitcairn.py              |    22 +
 lib/pytz/zoneinfo/Pacific/Ponape.py                |    12 +
 lib/pytz/zoneinfo/Pacific/Port_Moresby.py          |    12 +
 lib/pytz/zoneinfo/Pacific/Rarotonga.py             |    72 +
 lib/pytz/zoneinfo/Pacific/Saipan.py                |    24 +
 lib/pytz/zoneinfo/Pacific/Samoa.py                 |    28 +
 lib/pytz/zoneinfo/Pacific/Tahiti.py                |    22 +
 lib/pytz/zoneinfo/Pacific/Tarawa.py                |    12 +
 lib/pytz/zoneinfo/Pacific/Tongatapu.py             |    34 +
 lib/pytz/zoneinfo/Pacific/Truk.py                  |    12 +
 lib/pytz/zoneinfo/Pacific/Wake.py                  |    12 +
 lib/pytz/zoneinfo/Pacific/Wallis.py                |    12 +
 lib/pytz/zoneinfo/Pacific/Yap.py                   |    12 +
 lib/pytz/zoneinfo/Pacific/__init__.py              |     0
 lib/pytz/zoneinfo/Poland.py                        |   354 +
 lib/pytz/zoneinfo/Portugal.py                      |   462 +
 lib/pytz/zoneinfo/ROC.py                           |   100 +
 lib/pytz/zoneinfo/ROK.py                           |    44 +
 lib/pytz/zoneinfo/Singapore.py                     |    36 +
 lib/pytz/zoneinfo/Turkey.py                        |   362 +
 lib/pytz/zoneinfo/UCT.py                           |    12 +
 lib/pytz/zoneinfo/US/Alaska.py                     |   306 +
 lib/pytz/zoneinfo/US/Aleutian.py                   |   306 +
 lib/pytz/zoneinfo/US/Arizona.py                    |    40 +
 lib/pytz/zoneinfo/US/Central.py                    |   490 +
 lib/pytz/zoneinfo/US/East_minus_Indiana.py         |   216 +
 lib/pytz/zoneinfo/US/Eastern.py                    |   490 +
 lib/pytz/zoneinfo/US/Hawaii.py                     |    32 +
 lib/pytz/zoneinfo/US/Indiana_minus_Starke.py       |   326 +
 lib/pytz/zoneinfo/US/Michigan.py                   |   298 +
 lib/pytz/zoneinfo/US/Mountain.py                   |   334 +
 lib/pytz/zoneinfo/US/Pacific.py                    |   390 +
 lib/pytz/zoneinfo/US/Pacific_minus_New.py          |   390 +
 lib/pytz/zoneinfo/US/Samoa.py                      |    28 +
 lib/pytz/zoneinfo/US/__init__.py                   |     0
 lib/pytz/zoneinfo/UTC.py                           |     2 +
 lib/pytz/zoneinfo/Universal.py                     |    12 +
 lib/pytz/zoneinfo/WET.py                           |   264 +
 lib/pytz/zoneinfo/W_minus_SU.py                    |   278 +
 lib/pytz/zoneinfo/Zulu.py                          |    12 +
 lib/pytz/zoneinfo/__init__.py                      |     0
 lib/pytz/zoneinfo/posixrules.py                    |   490 +
 lib/requests/__init__.py                           |    60 +
 lib/requests/__init__.pyc                          |   Bin 0 -> 1798 bytes
 lib/requests/_oauth.py                             |    23 +
 lib/requests/_oauth.pyc                            |   Bin 0 -> 845 bytes
 lib/requests/api.py                                |   130 +
 lib/requests/api.pyc                               |   Bin 0 -> 5714 bytes
 lib/requests/async.py                              |     0
 lib/requests/auth.py                               |   382 +
 lib/requests/auth.pyc                              |   Bin 0 -> 13930 bytes
 lib/requests/cacert.pem                            |  3338 +
 lib/requests/certs.py                              |    27 +
 lib/requests/certs.pyc                             |   Bin 0 -> 730 bytes
 lib/requests/compat.py                             |   119 +
 lib/requests/compat.pyc                            |   Bin 0 -> 2509 bytes
 lib/requests/cookies.py                            |   377 +
 lib/requests/cookies.pyc                           |   Bin 0 -> 17695 bytes
 lib/requests/defaults.py                           |    50 +
 lib/requests/defaults.pyc                          |   Bin 0 -> 1894 bytes
 lib/requests/exceptions.py                         |    51 +
 lib/requests/exceptions.pyc                        |   Bin 0 -> 2900 bytes
 lib/requests/hooks.py                              |    48 +
 lib/requests/hooks.pyc                             |   Bin 0 -> 1264 bytes
 lib/requests/models.py                             |   907 +
 lib/requests/models.pyc                            |   Bin 0 -> 21744 bytes
 lib/requests/packages/__init__.py                  |     3 +
 lib/requests/packages/__init__.pyc                 |   Bin 0 -> 280 bytes
 lib/requests/packages/chardet/__init__.py          |    26 +
 lib/requests/packages/chardet/__init__.pyc         |   Bin 0 -> 563 bytes
 lib/requests/packages/chardet/big5freq.py          |   923 +
 lib/requests/packages/chardet/big5prober.py        |    41 +
 lib/requests/packages/chardet/chardistribution.py  |   200 +
 .../packages/chardet/charsetgroupprober.py         |    96 +
 lib/requests/packages/chardet/charsetprober.py     |    60 +
 .../packages/chardet/codingstatemachine.py         |    56 +
 lib/requests/packages/chardet/constants.py         |    47 +
 lib/requests/packages/chardet/escprober.py         |    79 +
 lib/requests/packages/chardet/escsm.py             |   240 +
 lib/requests/packages/chardet/eucjpprober.py       |    85 +
 lib/requests/packages/chardet/euckrfreq.py         |   594 +
 lib/requests/packages/chardet/euckrprober.py       |    41 +
 lib/requests/packages/chardet/euctwfreq.py         |   426 +
 lib/requests/packages/chardet/euctwprober.py       |    41 +
 lib/requests/packages/chardet/gb2312freq.py        |   471 +
 lib/requests/packages/chardet/gb2312prober.py      |    41 +
 lib/requests/packages/chardet/hebrewprober.py      |   269 +
 lib/requests/packages/chardet/jisfreq.py           |   567 +
 lib/requests/packages/chardet/jpcntx.py            |   210 +
 .../packages/chardet/langbulgarianmodel.py         |   228 +
 lib/requests/packages/chardet/langcyrillicmodel.py |   329 +
 lib/requests/packages/chardet/langgreekmodel.py    |   225 +
 lib/requests/packages/chardet/langhebrewmodel.py   |   201 +
 .../packages/chardet/langhungarianmodel.py         |   225 +
 lib/requests/packages/chardet/langthaimodel.py     |   200 +
 lib/requests/packages/chardet/latin1prober.py      |   136 +
 lib/requests/packages/chardet/mbcharsetprober.py   |    82 +
 lib/requests/packages/chardet/mbcsgroupprober.py   |    50 +
 lib/requests/packages/chardet/mbcssm.py            |   514 +
 lib/requests/packages/chardet/sbcharsetprober.py   |   106 +
 lib/requests/packages/chardet/sbcsgroupprober.py   |    64 +
 lib/requests/packages/chardet/sjisprober.py        |    85 +
 lib/requests/packages/chardet/universaldetector.py |   154 +
 lib/requests/packages/chardet/utf8prober.py        |    76 +
 lib/requests/packages/chardet2/__init__.py         |    26 +
 lib/requests/packages/chardet2/big5freq.py         |   923 +
 lib/requests/packages/chardet2/big5prober.py       |    41 +
 lib/requests/packages/chardet2/chardistribution.py |   200 +
 .../packages/chardet2/charsetgroupprober.py        |    97 +
 lib/requests/packages/chardet2/charsetprober.py    |    61 +
 .../packages/chardet2/codingstatemachine.py        |    57 +
 lib/requests/packages/chardet2/constants.py        |    39 +
 lib/requests/packages/chardet2/escprober.py        |    81 +
 lib/requests/packages/chardet2/escsm.py            |   240 +
 lib/requests/packages/chardet2/eucjpprober.py      |    87 +
 lib/requests/packages/chardet2/euckrfreq.py        |   594 +
 lib/requests/packages/chardet2/euckrprober.py      |    41 +
 lib/requests/packages/chardet2/euctwfreq.py        |   426 +
 lib/requests/packages/chardet2/euctwprober.py      |    41 +
 lib/requests/packages/chardet2/gb2312freq.py       |   471 +
 lib/requests/packages/chardet2/gb2312prober.py     |    41 +
 lib/requests/packages/chardet2/hebrewprober.py     |   269 +
 lib/requests/packages/chardet2/jisfreq.py          |   567 +
 lib/requests/packages/chardet2/jpcntx.py           |   210 +
 .../packages/chardet2/langbulgarianmodel.py        |   228 +
 .../packages/chardet2/langcyrillicmodel.py         |   329 +
 lib/requests/packages/chardet2/langgreekmodel.py   |   225 +
 lib/requests/packages/chardet2/langhebrewmodel.py  |   201 +
 .../packages/chardet2/langhungarianmodel.py        |   225 +
 lib/requests/packages/chardet2/langthaimodel.py    |   200 +
 lib/requests/packages/chardet2/latin1prober.py     |   135 +
 lib/requests/packages/chardet2/mbcharsetprober.py  |    83 +
 lib/requests/packages/chardet2/mbcsgroupprober.py  |    50 +
 lib/requests/packages/chardet2/mbcssm.py           |   514 +
 lib/requests/packages/chardet2/sbcharsetprober.py  |   107 +
 lib/requests/packages/chardet2/sbcsgroupprober.py  |    65 +
 lib/requests/packages/chardet2/sjisprober.py       |    86 +
 lib/requests/packages/chardet2/test.py             |    21 +
 .../packages/chardet2/universaldetector.py         |   155 +
 lib/requests/packages/chardet2/utf8prober.py       |    77 +
 lib/requests/packages/oauthlib/__init__.py         |     0
 lib/requests/packages/oauthlib/common.py           |   229 +
 lib/requests/packages/oauthlib/oauth1/__init__.py  |    13 +
 .../packages/oauthlib/oauth1/rfc5849/__init__.py   |   889 +
 .../packages/oauthlib/oauth1/rfc5849/parameters.py |   134 +
 .../packages/oauthlib/oauth1/rfc5849/signature.py  |   551 +
 .../packages/oauthlib/oauth1/rfc5849/utils.py      |    99 +
 lib/requests/packages/oauthlib/oauth2/__init__.py  |    13 +
 .../packages/oauthlib/oauth2/draft25/__init__.py   |   497 +
 .../packages/oauthlib/oauth2/draft25/parameters.py |   256 +
 .../packages/oauthlib/oauth2/draft25/tokens.py     |   132 +
 .../packages/oauthlib/oauth2/draft25/utils.py      |    39 +
 lib/requests/packages/urllib3/__init__.py          |    58 +
 lib/requests/packages/urllib3/__init__.pyc         |   Bin 0 -> 2181 bytes
 lib/requests/packages/urllib3/_collections.py      |    94 +
 lib/requests/packages/urllib3/_collections.pyc     |   Bin 0 -> 3676 bytes
 lib/requests/packages/urllib3/connectionpool.py    |   562 +
 lib/requests/packages/urllib3/connectionpool.pyc   |   Bin 0 -> 17704 bytes
 lib/requests/packages/urllib3/contrib/__init__.py  |     0
 lib/requests/packages/urllib3/contrib/ntlmpool.py  |   120 +
 lib/requests/packages/urllib3/exceptions.py        |    77 +
 lib/requests/packages/urllib3/exceptions.pyc       |   Bin 0 -> 4344 bytes
 lib/requests/packages/urllib3/filepost.py          |    91 +
 lib/requests/packages/urllib3/filepost.pyc         |   Bin 0 -> 3492 bytes
 lib/requests/packages/urllib3/packages/__init__.py |     4 +
 .../packages/urllib3/packages/__init__.pyc         |   Bin 0 -> 308 bytes
 .../packages/urllib3/packages/ordered_dict.py      |   260 +
 .../packages/urllib3/packages/ordered_dict.pyc     |   Bin 0 -> 10840 bytes
 lib/requests/packages/urllib3/packages/six.py      |   372 +
 lib/requests/packages/urllib3/packages/six.pyc     |   Bin 0 -> 14117 bytes
 .../packages/ssl_match_hostname/__init__.py        |    61 +
 .../packages/ssl_match_hostname/__init__.pyc       |   Bin 0 -> 2467 bytes
 lib/requests/packages/urllib3/poolmanager.py       |   158 +
 lib/requests/packages/urllib3/poolmanager.pyc      |   Bin 0 -> 6382 bytes
 lib/requests/packages/urllib3/request.py           |   128 +
 lib/requests/packages/urllib3/request.pyc          |   Bin 0 -> 5510 bytes
 lib/requests/packages/urllib3/response.py          |   202 +
 lib/requests/packages/urllib3/response.pyc         |   Bin 0 -> 7113 bytes
 lib/requests/packages/urllib3/util.py              |   252 +
 lib/requests/packages/urllib3/util.pyc             |   Bin 0 -> 7091 bytes
 lib/requests/safe_mode.py                          |    40 +
 lib/requests/safe_mode.pyc                         |   Bin 0 -> 1633 bytes
 lib/requests/sessions.py                           |   328 +
 lib/requests/sessions.pyc                          |   Bin 0 -> 11387 bytes
 lib/requests/status_codes.py                       |    86 +
 lib/requests/status_codes.pyc                      |   Bin 0 -> 4387 bytes
 lib/requests/structures.py                         |    67 +
 lib/requests/structures.pyc                        |   Bin 0 -> 3706 bytes
 lib/requests/utils.py                              |   616 +
 lib/requests/utils.pyc                             |   Bin 0 -> 17773 bytes
 logs/wa.log                                        |    83 +
 makecheck.py                                       |   395 +
 public.py                                          |    54 +
 runAllTests.py                                     |   397 +
 scheduler.py                                       |    78 +
 scripts/__init__.py                                |     2 +
 scripts/constrain2db.py                            |   202 +
 scripts/converter/__init__.py                      |     1 +
 scripts/converter/campbell.py                      |   177 +
 scripts/converter/csv.py                           |   279 +
 scripts/converter/kern.py                          |   170 +
 scripts/converter/sts.py                           |    94 +
 scripts/csv2istsos.py                              |   349 +
 scripts/istsos2istsos.py                           |   513 +
 scripts/raw2csv.py                                 |   551 +
 scripts/sos2istsos.py                              |   622 +
 scripts/sos_virtualHQ_importer.py                  |   265 +
 services/default.cfg                               |    94 +
 test/__init__.py                                   |     2 +
 test/_test.py                                      |     6 +
 test/admin/__init__.py                             |     1 +
 test/delete.py                                     |   131 +
 test/get.py                                        |   275 +
 test/istsoslib/__init__.py                         |     2 +
 test/istsoslib/sosRequests.py                      |  1037 +
 test/post.py                                       |   102 +
 test/prove.py                                      |  1669 +
 test/put.py                                        |   133 +
 test/scripts/__init__.py                           |     2 +
 test/scripts/data/soglie_QC0_2013.txt              |    96 +
 test/walib/__init__.py                             |     2 +
 test/walib/istsos/__init__.py                      |     1 +
 test/walib/istsos/services/__init__.py             |     1 +
 test/walib/istsos/services/configsections.py       |  1052 +
 test/walib/istsos/services/dataqualities.py        |   257 +
 test/walib/istsos/services/epsgs.py                |    48 +
 test/walib/istsos/services/observedproperties.py   |   281 +
 test/walib/istsos/services/offerings.py            |   440 +
 test/walib/istsos/services/operations.py           |   286 +
 test/walib/istsos/services/procedures.py           |   486 +
 test/walib/istsos/services/services.py             |   335 +
 test/walib/istsos/services/systemtypes.py          |    55 +
 test/walib/istsos/services/uoms.py                 |   261 +
 waconf2sos.py                                      |   288 +
 waconf2sos.pyc                                     |   Bin 0 -> 4902 bytes
 walib/__init__.py                                  |     1 +
 walib/__init__.pyc                                 |   Bin 0 -> 308 bytes
 walib/admin/__init__.py                            |     1 +
 walib/admin/configsections/__init__.py             |     1 +
 walib/admin/configsections/configsections.py       |     0
 walib/admin/configsections/paths.py                |    35 +
 walib/configManager.py                             |   158 +
 walib/configManager.pyc                            |   Bin 0 -> 5016 bytes
 walib/databaseManager.py                           |   167 +
 walib/databaseManager.pyc                          |   Bin 0 -> 6157 bytes
 walib/istsos/__init__.py                           |     1 +
 walib/istsos/__init__.pyc                          |   Bin 0 -> 203 bytes
 walib/istsos/istsos.py                             |   264 +
 walib/istsos/istsos.pyc                            |   Bin 0 -> 9174 bytes
 walib/istsos/services/__init__.py                  |     1 +
 walib/istsos/services/__init__.pyc                 |   Bin 0 -> 316 bytes
 walib/istsos/services/configsections/__init__.py   |     1 +
 walib/istsos/services/configsections/__init__.pyc  |   Bin 0 -> 337 bytes
 .../services/configsections/configsections.py      |    94 +
 .../services/configsections/configsections.pyc     |   Bin 0 -> 3117 bytes
 walib/istsos/services/configsections/connection.py |    53 +
 .../istsos/services/configsections/connection.pyc  |   Bin 0 -> 2210 bytes
 walib/istsos/services/configsections/geo.py        |    58 +
 walib/istsos/services/configsections/geo.pyc       |   Bin 0 -> 1611 bytes
 .../services/configsections/getobservation.py      |    29 +
 .../services/configsections/getobservation.pyc     |   Bin 0 -> 887 bytes
 .../services/configsections/identification.py      |    40 +
 .../services/configsections/identification.pyc     |   Bin 0 -> 1071 bytes
 walib/istsos/services/configsections/provider.py   |    51 +
 walib/istsos/services/configsections/provider.pyc  |   Bin 0 -> 1679 bytes
 walib/istsos/services/configsections/serviceurl.py |    23 +
 .../istsos/services/configsections/serviceurl.pyc  |   Bin 0 -> 559 bytes
 walib/istsos/services/configsections/urn.py        |    81 +
 walib/istsos/services/configsections/urn.pyc       |   Bin 0 -> 2753 bytes
 walib/istsos/services/dataqualities/__init__.py    |     1 +
 .../istsos/services/dataqualities/dataqualities.py |   235 +
 walib/istsos/services/epsgs/__init__.py            |     1 +
 walib/istsos/services/epsgs/__init__.pyc           |   Bin 0 -> 201 bytes
 walib/istsos/services/epsgs/epsgs.py               |    49 +
 walib/istsos/services/epsgs/epsgs.pyc              |   Bin 0 -> 1648 bytes
 .../istsos/services/observedproperties/__init__.py |     1 +
 .../observedproperties/observedproperties.py       |   280 +
 walib/istsos/services/offerings/__init__.py        |     1 +
 walib/istsos/services/offerings/__init__.pyc       |   Bin 0 -> 209 bytes
 walib/istsos/services/offerings/offerings.py       |   242 +
 walib/istsos/services/offerings/offerings.pyc      |   Bin 0 -> 8217 bytes
 .../services/offerings/procedures/__init__.py      |     1 +
 .../services/offerings/procedures/__init__.pyc     |   Bin 0 -> 221 bytes
 .../services/offerings/procedures/procedures.py    |   184 +
 .../services/offerings/procedures/procedures.pyc   |   Bin 0 -> 6608 bytes
 walib/istsos/services/procedures/__init__.py       |     1 +
 walib/istsos/services/procedures/__init__.pyc      |   Bin 0 -> 211 bytes
 walib/istsos/services/procedures/procedures.py     |   619 +
 walib/istsos/services/procedures/procedures.pyc    |   Bin 0 -> 19520 bytes
 walib/istsos/services/services.py                  |   733 +
 walib/istsos/services/services.pyc                 |   Bin 0 -> 21765 bytes
 walib/istsos/services/systemtypes/__init__.py      |     1 +
 walib/istsos/services/systemtypes/__init__.pyc     |   Bin 0 -> 213 bytes
 walib/istsos/services/systemtypes/systemtypes.py   |    65 +
 walib/istsos/services/systemtypes/systemtypes.pyc  |   Bin 0 -> 1916 bytes
 walib/istsos/services/uoms/__init__.py             |     1 +
 walib/istsos/services/uoms/uoms.py                 |   207 +
 .../istsos/services/virtualprocedures/__init__.py  |     3 +
 walib/istsos/services/virtualprocedures/code.py    |    92 +
 .../services/virtualprocedures/ratingcurve.py      |   123 +
 .../virtualprocedures/virtualprocedures.py         |   175 +
 walib/procedure.py                                 |   881 +
 walib/procedure.pyc                                |   Bin 0 -> 28406 bytes
 walib/resource.py                                  |   225 +
 walib/resource.pyc                                 |   Bin 0 -> 10308 bytes
 walib/resourceFactory.py                           |   275 +
 walib/resourceFactory.pyc                          |   Bin 0 -> 4778 bytes
 walib/sqlschema.py                                 |   395 +
 walib/sqlschema.pyc                                |   Bin 0 -> 14661 bytes
 walib/utils.py                                     |   593 +
 walib/utils.pyc                                    |   Bin 0 -> 20301 bytes
 walib/wa.cfg                                       |     3 +
 walib/wa_version.py                                |     1 +
 2707 files changed, 450432 insertions(+)

diff --git a/application.py b/application.py
new file mode 100755
index 0000000..6d9e19b
--- /dev/null
+++ b/application.py
@@ -0,0 +1,253 @@
+# -*- coding: utf-8 -*-
+# istsos WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import sys
+from os import path
+sys.path.insert(0, path.abspath(path.dirname(__file__)))
+
+import pprint
+pp = pprint.PrettyPrinter(indent=4)
+
+def application(environ, start_response):
+    
+    
+    path = environ['PATH_INFO'].strip()[1:].split("/")
+    #print >> sys.stderr, "pathInfo: %s" % path
+    #print >> sys.stderr, "\n\nENVIRON: %s" % pp.pprint(environ)
+    
+    if path[0]=='wa':
+        return executeWa(environ, start_response)
+    else:
+        return executeSos(environ, start_response)
+
+def executeSos(environ, start_response):
+    import sys
+    import traceback
+    import waconf2sos as cfg
+    sosConfig = cfg.istsosConfig(environ)
+    
+    if not sosConfig.istsos_librarypath=="" or sosConfig.istsos_librarypath==None:
+        sys.path.insert(0, sosConfig.istsos_librarypath)
+        
+    from istsoslib import sosDatabase
+    from istsoslib import sosException
+
+    try:
+        #===============================
+        # CALL istsos AND PRODUCE RESPONSE
+        #===============================
+        # call istsos to manage the request and generate the response
+        pgdb = sosDatabase.PgDB(sosConfig.connection["user"],
+                           sosConfig.connection["password"],
+                           sosConfig.connection["dbname"],
+                           sosConfig.connection["host"],
+                           sosConfig.connection["port"])
+        
+        from istsoslib.filters import factory_filters as FF
+        from istsoslib.responders import factory_response as FR
+        from istsoslib.renderers import factory_render as FRe
+        
+        req_filter = FF.sosFactoryFilter(environ,sosConfig)
+        response = FR.sosFactoryResponse(req_filter,pgdb)
+        render = FRe.sosFactoryRender(response,sosConfig)
+        try:
+            content_type = req_filter.responseFormat
+        except:
+            content_type = 'application/xml; charset=utf-8'
+
+        #===============================
+        # SEND RESPONSE
+        #===============================
+        # HTTP response code and message
+        status = '200 OK'
+        # prepare response header
+        response_headers = [('Content-Type', content_type),
+                            ('Content-Length', str(len(render.encode('utf-8'))))]
+        # send response header
+        start_response(status, response_headers)
+        #send response body
+        return [render.encode('utf-8')]
+        
+    except sosException.SOSException, e:
+        print >> sys.stderr, traceback.print_exc()
+        response_body = e.ToXML()
+        # HTTP response code and message
+        status = '200 OK'
+        # prepare response header
+        response_headers = [('Content-Type', 'application/xml; charset=utf-8'),
+                            ('Content-Length', str(len(response_body.encode('utf-8'))))]
+        # send response header
+        start_response(status, response_headers)
+        # send response
+        return [response_body.encode('utf-8')]
+    
+    except Exception, e:
+        print >> sys.stderr, traceback.print_exc()
+        othertext = traceback.format_exception(*sys.exc_info())
+        if sosConfig.debug:
+            response_body = "%s" % (sosException.SOSException("NoApplicableCode",None,e.__class__.__name__, [e, othertext]),)
+        else:
+            response_body = "%s" % (sosException.SOSException("NoApplicableCode",None,"istSOS internal error",["Please activate debug level for more details"]))
+        # HTTP response code and message
+        status = '200 OK'
+        # prepare response header
+        response_headers = [('Content-Type', 'application/xml; charset=utf-8'),
+                            ('Content-Length', str(len(response_body.encode('utf-8'))))]
+        # send response header
+        start_response(status, response_headers)
+        # send response
+        return [response_body.encode('utf-8')]
+        
+    return
+    
+    
+    
+def executeWa(environ, start_response):
+    
+    from urlparse import parse_qs
+    import config
+    import traceback
+    from walib import resourceFactory as factory
+    import logging, logging.config, logging.handlers
+
+    #----logging--------------------------------------------------------------------------
+    formatter = logging.Formatter('%(asctime)-6s: %(name)s - %(levelname)s - %(message)s')
+    log_filename = path.join(config.errorlog_path,"wa.log")
+    handler = logging.handlers.RotatingFileHandler(filename=log_filename, maxBytes = 1024*1024, backupCount = 20)
+    handler.setFormatter(formatter)
+    logger = logging.getLogger('istsos')
+    if len(logger.handlers)==0:
+        logger.addHandler(handler)
+    elif len(logger.handlers)==1 and type(logger.handlers[0])==type(handler):
+        pass
+    else:
+        for h in logger.handlers:
+            logger.removeHandler(h)
+        logger.addHandler(handler)
+    
+    if config.errorlog_level == "INFO":
+        logger.setLevel(logging.INFO)
+    elif config.errorlog_level == "ERROR":
+        logger.setLevel(logging.ERROR)
+    else:
+        logger.setLevel(logging.UNSET)
+    #--------------------------------------------------------------------------------------
+
+    #----setting environment variables-----------
+    wsgi_response = "Hello istSOS"
+    wsgi_mime = 'text/plain'
+    wsgi_status = '200 OK'
+    
+    waEnviron = {
+        "path" : environ['PATH_INFO'][3:],
+        "method" : str(environ['REQUEST_METHOD']).upper(),
+        "pathinfo" : environ['PATH_INFO'].strip()[4:].split("/"),
+        "wsgi_input" : environ['wsgi.input'].read(int(environ["CONTENT_LENGTH"])) if environ.get("CONTENT_LENGTH") else None,
+        "url_scheme" : environ['wsgi.url_scheme'],
+        "http_host" : environ['HTTP_HOST'] if environ.get('HTTP_HOST') else None,
+        "server_name" : environ['SERVER_NAME'],
+        "server_port" : environ['SERVER_PORT'],
+        "script_name" : environ['SCRIPT_NAME'] if environ.get('SCRIPT_NAME', '') else None,
+        "query_string" : environ['QUERY_STRING'] if environ.get('QUERY_STRING') else None,
+        "parameters": parse_qs(environ['QUERY_STRING']) if environ.get('QUERY_STRING') else None,
+        "services_path" : config.services_path,
+        "istsos_path" : config.istsoslib_path,
+        "errorlog_path" : config.errorlog_path
+    }
+    #print >> sys.stderr, "\n\nENVIRON: %s" % pp.pprint(waEnviron)
+    
+    try:   
+        
+        try:
+            op = None
+            op = factory.initResource(waEnviron)
+            
+            try:
+                if op.response['success']:
+                
+                    method = str(environ['REQUEST_METHOD']).upper()
+                    # Data RETRIEVAL
+                    if method=="GET":
+                        op.executeGet()
+                        
+                    # Data UPDATE
+                    elif method=="POST":
+                        op.executePost()
+                        
+                    # Data INSERT
+                    elif method=="PUT":
+                        op.executePut()
+                        
+                    # Data DELETE
+                    elif method=="DELETE":
+                        op.executeDelete()
+                    
+                    else:
+                        raise Exception("HTTP method %s not supported" % waEnviron["method"])
+                    
+                    if 'log' in op.response:
+                        logger.info("Executing %s on %s: %s" % (waEnviron["method"], 
+                                            environ['PATH_INFO'],str(op.response['log']) ))
+                    
+                    if 'message' in op.response:
+                        logger.info("Executing %s on %s: %s" % (waEnviron["method"], 
+                                            environ['PATH_INFO'],str(op.response['message']) ))
+                    
+                    
+                    
+            except Exception as exe:
+                print >> sys.stderr, traceback.print_exc()
+                logger.error("Executing %s on %s: %s" % (waEnviron["method"],
+                                 environ['PATH_INFO'],str(exe)))
+                #op.setException("Executing %s on %s: %s" % (method, environ['PATH_INFO'], exe))
+                op.setException(str(exe))
+                
+        except Exception as exe:
+            print >> sys.stderr, traceback.print_exc()
+            logger.error("On initialization %s on %s: %s" % (waEnviron["method"],
+                                 environ['PATH_INFO'],str(exe)))
+            from walib import resource
+            op = resource.waResource(waEnviron)
+            #op.setException("On initialization: %s" % exe)
+            op.setException(str(exe))
+            
+        try:
+            wsgi_response = op.getResponse()
+        except Exception as exe:
+            print >> sys.stderr, traceback.print_exc()
+            logger.error("Executing %s on %s: %s" % (waEnviron["method"],
+                                 environ['PATH_INFO'],str(exe)))
+            op.setException("Error converting response to json")
+            
+        wsgi_mime = "application/json"
+    
+    except Exception as e:
+        print >> sys.stderr, traceback.print_exc()
+        logger.error("Executing %s on %s: %s" % (waEnviron["method"],
+                                 environ['PATH_INFO'],str(e)))
+        wsgi_response = str(e)
+        wsgi_mime = 'text/plain'
+        wsgi_status = '400 Bad Request'
+    
+    wsgi_headers = [
+        ('Content-Type', "%s; charset=utf-8" % wsgi_mime),
+        ('Content-Length', str(len(wsgi_response)))
+    ]
+    start_response(wsgi_status, wsgi_headers)
+    return [wsgi_response]
+    
+
diff --git a/cmdimportcsv.py b/cmdimportcsv.py
new file mode 100755
index 0000000..004e037
--- /dev/null
+++ b/cmdimportcsv.py
@@ -0,0 +1,315 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+'''
+This script can be used to import measurement from a CSV file.
+'''
+
+try:
+    import os
+    import traceback
+    import json
+    import pprint
+    import glob
+    import lib.requests as requests
+    import lib.argparse as argparse
+    
+except ImportError as e:
+    raise e
+    
+def execute (args):  
+    pp = pprint.PrettyPrinter(indent=2)
+    try:
+    
+        # Initializing URLs
+        url = args['u']
+        
+        # Procedures
+        service = args['s']
+        
+        # Quality index
+        quality = args['q']
+        
+        # Service instance name
+        procs = args['p']
+        
+        # Working directory, where the CSV files are located
+        wd = args['wd']
+        # File extension
+        ext = args['e']
+        
+        debug = args['v']
+        test = args['t']
+        
+        user = args['usr']
+        passw = args['pwd']
+        
+        req = requests.session()
+        
+        for proc in procs:
+            
+            print "Procedure: %s" % proc
+            
+            # Load procedure description
+            print "GET: %s/wa/istsos/services/%s/procedures/%s" % (url,service,proc)
+                
+            res = req.get("%s/wa/istsos/services/%s/procedures/%s" % (
+                url,
+                service,
+                proc
+                ), prefetch=True, auth=(user, passw), verify=False)
+                
+            data = res.json
+            if debug:
+                pp.pprint(data)
+                
+            if data['success']==False:
+                raise Exception ("Description of procedure %s can not be loaded: %s" % (proc, data['message']))
+            else:
+                if debug:
+                    pp.pprint(data)
+                else:
+                    print " > %s" % data['message']
+            
+            data = data['data']
+            
+            aid = data['assignedSensorId']
+            
+            # Getting observed properties from describeSensor response
+            op = []
+            for out in data['outputs']:
+                op.append(out['definition'])
+            
+            # Load of a getobservation request
+            
+            print "GET: %s/wa/istsos/services/%s/operations/getobservation/offerings/%s/procedures/%s/observedproperties/%s/eventtime/last" % (url,service,'temporary',proc,','.join(op))
+            res = req.get("%s/wa/istsos/services/%s/operations/getobservation/offerings/%s/procedures/%s/observedproperties/%s/eventtime/last" % (
+                url,
+                service,
+                'temporary',
+                proc,
+                ','.join(op)
+                ), prefetch=True, auth=(user, passw), verify=False)
+            
+            data = res.json
+            
+            if data['success']==False:
+                raise Exception ("Last observation of procedure %s can not be loaded: %s" % (proc, data['message']))
+            else:
+                if debug:
+                    pp.pprint(data)
+                else:
+                    print " > %s" % data['message']
+                    
+            data = data['data'][0]
+            data['AssignedSensorId'] = aid
+            
+            # Set values array empty (can contain 1 value if procedure not empty)
+            data['result']['DataArray']['values'] = []
+            
+            # discover json observed property disposition
+            jsonindex = {}
+            for pos in range(0, len(data['result']['DataArray']['field'])):
+                field = data['result']['DataArray']['field'][pos]
+                jsonindex[field['definition']] = pos
+            
+            if debug:
+                print "\njsonindex:"
+                pp.pprint(jsonindex)
+            
+            # find files
+            print "Searching: %s" % os.path.join(wd, "%s%s" % (proc,ext))
+            files = glob.glob(os.path.join(wd, "%s%s" % (proc,ext)))
+            
+            print " > %s %s found" % (len(files), "Files" if len(files)>1 else "File")
+            for f in files:
+            
+                # open file
+                file = open(f, 'rU')
+                
+                # loop lines
+                lines = file.readlines()
+                
+                obsindex = lines[0].strip(' \t\n\r').split(",")
+                
+                # Check if all the observedProperties of the procedure are included in the CSV file (quality index is optional)
+                for k, v in jsonindex.iteritems():
+                    if k in obsindex:
+                        continue
+                    elif ':qualityIndex' in k:
+                        continue
+                    else:
+                        raise Exception ("Mandatory observed property %s is not present in the CSV." % k)
+                
+                begin = None
+                end = None
+                
+                # loop lines skipping the header
+                for i in range(1, len(lines)):
+                    try:
+                        line = lines[i]
+                        lineArray = line.strip(' \t\n\r').split(",")
+                        
+                        # Creating an empty array where the values will be inserted
+                        observation =  ['']*len(jsonindex)
+                        
+                        for k, v in jsonindex.iteritems():
+                            val = None
+                            if k in obsindex:
+                                val = lineArray[obsindex.index(k)]
+                            elif ':qualityIndex' in k: # Quality index is not present in the CSV so the default value will be set
+                                val = quality
+                                
+                            observation[v] = val
+                            
+                        # get first date
+                        if i == 1:
+                            begin = observation[jsonindex['urn:ogc:def:parameter:x-istsos:1.0:time:iso8601']]
+                            
+                        # get last date
+                        if i == (len(lines)-1):
+                            end   = observation[jsonindex['urn:ogc:def:parameter:x-istsos:1.0:time:iso8601']]
+                        
+                        # attach to object
+                        data['result']['DataArray']['values'].append(observation)
+                    except Exception as e:
+                        print "Errore alla riga: %s" % i
+                        raise e
+                        
+                
+                data["samplingTime"] = {
+				    "beginPosition": begin, 
+				    "endPosition": end
+			    };
+                
+                print "Begin: %s" % begin
+                print "End: %s" % end
+                print "Values: %s" % len( data['result']['DataArray']['values'])
+                
+            if debug:
+                pp.pprint({
+                    "ForceInsert": "true",
+                    "AssignedSensorId": aid,
+                    "Observation": data
+                    })
+            
+            # send to wa
+            
+            if not test:
+                res = req.post("%s/wa/istsos/services/%s/operations/insertobservation" % (
+                    url,
+                    service), 
+                    prefetch=True,
+                    auth=(user, passw),
+                    verify=False,
+                    data=json.dumps({
+                    "ForceInsert": "true",
+                    "AssignedSensorId": aid,
+                    "Observation": data
+                    })
+                )
+                # read response
+                if debug:
+                    pp.pprint(res.json)
+                else:
+                    print " > Insert observation success: %s" % res.json['success']
+                
+        pass
+        
+    except Exception as e:    
+        print "ERROR: %s\n\n" % e
+        traceback.print_exc()
+        pass
+        
+    pass
+    
+
+    
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser(
+        description='Import data from a csv file.')
+    
+    parser.add_argument('-v','--verbose',
+        action = 'store_true',
+        dest   = 'v',
+        help   = 'Activate verbose debug')
+        
+    parser.add_argument('-t','--test',
+        action = 'store_true',
+        dest   = 't',
+        help   = 'Use to test the command, deactivating the insert observation operations.')
+        
+    parser.add_argument('-p', 
+        action='store',
+        required=True,
+        nargs='+',
+        dest='p',
+        metavar='procedures',
+        help='List of procedures to be aggregated.')
+    
+    parser.add_argument('-q',
+        action = 'store',
+        dest   = 'q',
+        metavar= 'quality index',
+        default= '100',
+        help   = 'The quality index to set for all the measures of the CSV file, if not set into the CSV. (default: %(default)s).')
+        
+    parser.add_argument('-u',
+        action = 'store',
+        dest   = 'u',
+        metavar= 'url',
+        default= 'http://localhost:80/istsos',
+        help   = 'IstSOS Server address IP (or domain name) used for all request. (default: %(default)s).')
+    
+    parser.add_argument('-s',
+        action = 'store',
+        required=True,
+        dest   = 's',
+        metavar= 'service',
+        
+        help   = 'The name of the service instance.')
+    
+    parser.add_argument('-w',
+        action = 'store',
+        required=True,
+        dest   = 'wd',
+        metavar= 'working directory',
+        help   = 'Working directory where the csv files are located.')
+        
+    parser.add_argument('-e',
+        action = 'store',
+        dest   = 'e',
+        metavar= 'file extension',
+        default= '.DAT',
+        help   = 'Extension of the CSV file. (default: %(default)s)')
+        
+    parser.add_argument('-usr',
+        action = 'store',
+        dest   = 'usr',
+        metavar= 'user name')
+        
+    parser.add_argument('-pwd',
+        action = 'store',
+        dest   = 'pwd',
+        metavar= 'password')
+
+    args = parser.parse_args()
+    #print args.__dict__
+    execute(args.__dict__)
+
+
diff --git a/config.py b/config.py
new file mode 100755
index 0000000..859a79f
--- /dev/null
+++ b/config.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from os import path
+services_path = path.join(path.dirname(path.abspath(__file__)), "services")
+istsoslib_path = path.join(path.dirname(path.abspath(__file__)), "istsoslib")
+istsoswalib_path = path.join(path.dirname(path.abspath(__file__)), "walib")
+errorlog_path = path.join(path.dirname(path.abspath(__file__)), "logs")
+errorlog_level = "INFO"
+debug=False
+#==================================================================================
+# if you have to move some of "istsoslib" "walib" or "service" folder
+# in a different location you have to override the above paths
+# with the correct new absolute paths
+#==================================================================================
diff --git a/config.pyc b/config.pyc
new file mode 100644
index 0000000..68c5eb2
Binary files /dev/null and b/config.pyc differ
diff --git a/interface/app/Procedure.js b/interface/app/Procedure.js
new file mode 100755
index 0000000..7adf194
--- /dev/null
+++ b/interface/app/Procedure.js
@@ -0,0 +1,1371 @@
+/**
+ * istSOS WebAdmin - Istituto Scienze della Terra
+ * Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+ *
+ * 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 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+Ext.define('istsos.store.ObservationEditor', {
+    extend: 'Ext.data.Store',
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            proxy: {
+                type: 'memory',
+                reader: {
+                    type: 'array',
+                    idProperty: 'micro'
+                }
+            }
+        }, cfg)]);
+        this.addEvents('seriesupdated');
+    }
+});
+
+Ext.define('istsos.store.EditorQiStore', {
+    extend: 'Ext.data.Store',
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'editorQiStore',
+            fields: [
+            {
+                name: 'name'
+            },
+            {
+                name: 'description'
+            }
+            ]
+        }, cfg)]);
+    }
+});
+
+Ext.define('istsos.Sensor', {
+    extend: 'Ext.util.Observable',
+    service: null,
+    offering: null,
+    sensor: null,
+    beginPosition: null,
+    endPosition: null,
+    meta: null,
+    data: null,
+    store: null,
+    iso8601Field: 'iso8601',
+    visible: true,
+    color: "#000000",
+    configsections: {},
+    /**
+     * {Array} storeFields
+     * Array used to initialize an Ext.data.Model object.
+     * 
+     * storeFields = [
+     *   {
+     *       name: "micro",
+     *       type: "int"
+     *   },
+     *   {
+     *       name: "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601",
+     *       type: "string"
+     *   },
+     *   {
+     *       name: "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature",
+     *       type: "string"
+     *   }
+     * ]
+     * 
+     */
+    storeFields: [],
+    constructor: function(service, offering, sensor, config){
+        
+        if (Ext.isEmpty(service) || Ext.isEmpty(offering) || Ext.isEmpty(sensor) ) {
+            throw "Service, offering and sensor parameters are mandatory!"
+        }
+        
+        this.addEvents({
+            "metadataLoaded" : true,
+            "observationLoaded" : true,
+            "observationSaved" : true,
+            "colorchanged" : true,
+            "visibilitychanged" : true
+        });
+        
+        this.service = service;
+        this.offering = offering;
+        this.sensor = sensor;
+        
+        Ext.applyIf(this, config);
+        this.callParent(arguments);
+        this._loadMetadata();
+        
+        
+    },
+    // can be an iso8601 date string, a Date object or microseconds in unix time
+    getObservation: function(from, to){
+        
+        if (Ext.isDate(from)) {
+            from = Ext.Date.format(from,'c');
+        }else if (Ext.isNumber(from)) {
+            from = istsos.utils.micro2iso(from);
+        }else{
+            // Check that is a valid string in iso format
+            var d = Ext.Date.parse(from,'c');
+        }
+        
+        if (Ext.isDate(to)) {
+            to = Ext.Date.format(to,'c');
+        }else if (Ext.isNumber(to)) {
+            to = istsos.utils.micro2iso(to);
+        }else{
+            // Check that is a valid string in iso format
+            var d = Ext.Date.parse(to,'c');
+        }
+        
+        Ext.Ajax.request({
+            url: Ext.String.format(
+                '{0}/istsos/services/{1}/operations/getobservation/' +
+                'offerings/{2}/procedures/{3}/observedproperties/{4}/' +
+                'eventtime/{5}/{6}', wa.url, this.service,  this.offering,
+                this.sensor, this.getObservedProperties().join(','), from, to),
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    for (var i = 0; i < json.data.length; i++) {
+                        if (json.data[i]['name']==this.sensor) {
+                            this.loadObservation(json.data[i]);
+                            break;
+                        }
+                    }
+                }
+            }
+        });
+        
+    },
+    loadObservation: function(data){
+        if (data['name']!=this.sensor) {
+            throw "wrong data object. The data belong to " + data['name'];
+        }
+        this.data = data;
+        var records = [], 
+        values = this.data['result']['DataArray']['values'],
+        field = this.data['result']['DataArray']['field'],
+        fieldIdx = {};
+        for (var f = 0; f < field.length; f++) {
+            fieldIdx[field[f]['definition']]=f;
+        }
+        for (var i = 0; i < values.length; i++) {
+            var row = [];
+            // Estrazione dei microsecondi dalla data
+            var micro = istsos.utils.iso2micro(values[i][0]);
+            row.push(micro, values[i][0]);
+            for (var f = 2; f < this.storeFields.length; f++) {
+                
+                var fieldName = this.storeConvertIdToField[this.storeFields[f]['name']];
+                row.push(parseFloat(values[i][fieldIdx[fieldName]]));
+                
+            //row.push(parseFloat(values[i][fieldIdx[this.storeFields[f]['name']]]));
+            }
+            records.push(row);
+        }
+        this.store.loadData(records);
+        this.fireEvent("observationLoaded", this);
+    },
+    insertObservation: function(){
+        var recs = this.store.getRange();
+        //var fields = this.storeFields;
+        var fields = this.data.result.DataArray.field;
+        var values = [];
+        for (var r = 0; r < recs.length; r++) {
+            var row = [];
+            for (var i = 0; i < fields.length; i++) {
+                
+                var def = fields[i].definition;
+                if (def == this.isodef) {
+                    row.push(istsos.utils.micro2iso(recs[r].get('micro')));
+                }else{
+                    row.push(""+(recs[r].get(this.storeConvertFieldToId[def])));
+                }
+                
+                /*
+                if (fields[i].name==this.iso8601Field) {
+                    continue;
+                }else if (fields[i].name=='micro') {
+                    row.push(istsos.utils.micro2iso(recs[r].get(fields[i].name)));
+                }else{
+                    row.push(""+(recs[r].get(fields[i].name)));
+                }*/
+            }
+            values.push(row);
+        }
+        this.data.result.DataArray.values = values;
+        this.data.result.DataArray.elementCount = ""+values.length;
+        this.data.samplingTime.beginPosition = istsos.utils.micro2iso(recs[0].get('micro'));
+        this.data.samplingTime.endPosition = istsos.utils.micro2iso(recs[recs.length-1].get('micro'));
+                
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services/{1}/operations/insertobservation',wa.url,this.service),
+            scope: this,
+            method: "POST",
+            jsonData: {
+                "AssignedSensorId" : this.getId(),
+                "ForceInsert" : "true",
+                "Observation" : this.data
+            },
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                
+                this.commitModifications();
+                
+                this.fireEvent("observationSaved", this, json);
+            }
+        });
+        
+    },
+    rejectModifications: function(){
+        var recs = this.store.getUpdatedRecords();
+        for (var i = 0; i < recs.length; i++) {
+            recs[i].reject();
+        }
+    },
+    commitModifications: function(){
+        var recs = this.store.getUpdatedRecords();
+        for (var i = 0; i < recs.length; i++) {
+            recs[i].commit();
+        }
+    },
+    // This is a call to wa service for the describeSensor method
+    _loadMetadata: function(){
+        // First getting some sensors's service config
+        Ext.Ajax.request({          
+            url: Ext.String.format('{0}/istsos/services/{1}/configsections',wa.url,this.service),
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (!json.success) {
+                    throw "Error retreiving general service config";
+                }
+                this.configsections = json.data;
+                this.isodef = this.configsections.urn.time;
+                Ext.Ajax.request({
+                    url: Ext.String.format('{0}/istsos/services/{1}/procedures/{2}',wa.url,this.service,this.sensor),
+                    scope: this,
+                    method: "GET",
+                    success: function(response){
+                        var json = Ext.decode(response.responseText);
+                        this.storeConvertFieldToId = ["'"+this.isodef+"': '"+this.iso8601Field+"'"];
+                        this.storeConvertIdToField = ["'"+this.iso8601Field+"': '"+this.isodef+"'"];
+                        if (json.success) {
+                            this.meta = json.data;
+                            // Configuring store fields
+                            this.storeFields = [{
+                                name: "micro", // Unixtime in µs
+                                type: 'int'
+                            },{
+                                name: this.iso8601Field,
+                                //name: this.isodef,
+                                type: 'string'
+                            }];
+                            for (var i = 1; i < this.meta.outputs.length; i++) {
+                                
+                                var one = Ext.id(), two = Ext.id();
+                                this.storeConvertFieldToId.push(
+                                    "'"+this.meta.outputs[i].definition+"': '"+one+"'",
+                                    "'"+this.meta.outputs[i].definition+":qualityIndex': '"+two+"'"
+                                    );
+                                this.storeConvertIdToField.push(
+                                    "'"+one+"': '"+this.meta.outputs[i].definition+"'",
+                                    "'"+two+"': '"+this.meta.outputs[i].definition+":qualityIndex"+"'"
+                                    );
+                                this.storeFields.push({
+                                    name: one,
+                                    type: 'float'
+                                },{
+                                    name: two,
+                                    type: 'float'
+                                });
+                            }
+                            this.storeConvertFieldToId = Ext.decode("{"+this.storeConvertFieldToId.join(',')+"}");
+                            this.storeConvertIdToField = Ext.decode("{"+this.storeConvertIdToField.join(',')+"}");
+                            
+                            Ext.define(this.service+'-'+this.sensor+'-model', {
+                                extend: 'Ext.data.Model',
+                                idProperty: "micro",
+                                fields: this.storeFields
+                            });
+                            this.storeId = Ext.id();
+                            this.store = Ext.create('istsos.store.ObservationEditor',{
+                                model: this.service+'-'+this.sensor+'-model',
+                                name: this.sensor
+                            });
+                            this.fireEvent("metadataLoaded", this);
+                        }
+                    }
+                });
+            }
+        });
+    },
+    getDuration: function(){
+        if (!Ext.isObject(this.data)) {
+            throw "Duration unknown. Observation object not loaded.";
+        }
+        return this.data["samplingTime"]["duration"]
+    },
+    getId: function(){
+        if (Ext.isEmpty(this.meta)) {
+            throw "Sensor metadata are not initialized at all!";
+        }
+        return this.meta['assignedSensorId'];
+    },
+    getName: function(){
+        return this.sensor;    
+    },
+    // return insitu-fixed-point, insitu-mobile-point or virtual
+    getSystemType: function(){
+        if (Ext.isEmpty(this.meta)) {
+            throw "Sensor metadata are not initialized at all!";
+        }
+        for (var i = 0; i < this.meta.classification.length; i++) {
+            if (this.meta.classification[i]['definition']=='urn:ogc:def:classifier:x-istsos:1.0:systemType') {
+                return this.meta.classification[i]['value'];
+            }
+        }
+    },
+    // The name of the sensor type
+    getSensorType: function(){
+        if (Ext.isEmpty(this.meta)) {
+            throw "Sensor metadata are not initialized at all!";
+        }
+        for (var i = 0; i < this.meta.classification.length; i++) {
+            if (this.meta.classification[i]['definition'].indexOf('urn:ogc:def:classifier:x-istsos:1.0:sensorType')) {
+                return this.meta.classification[i]['value'];
+            }
+        }
+    },
+    getGeoJSON: function(){
+        if (Ext.isEmpty(this.meta)) {
+            throw "Sensor metadata are not initialized at all!";
+        }
+        return this.meta['location']
+    },
+    getObservedProperties: function(){
+        var ret = [];
+        for (var i = 0; i < this.meta.outputs.length; i++) {
+            if (this.meta.outputs[i]['definition']!=this.isodef) {
+                ret.push(this.meta.outputs[i]['definition']);
+            }
+        }
+        return ret;
+    },
+    getObservedPropertiesName: function(){
+        var ret = [];
+        for (var i = 0; i < this.meta.outputs.length; i++) {
+            if (this.meta.outputs[i]['definition']!=this.isodef) {
+                ret.push(this.meta.outputs[i]['name']);
+            }
+        }
+        return ret;
+    },
+    getUomCode: function(definition){
+        for (var i = 0; i < this.meta.outputs.length; i++) {
+            if (this.meta.outputs[i]['definition']==definition) {
+                return this.meta.outputs[i]['uom'];
+            }
+        }
+    },
+    getBeginPosition: function(){
+        var ret = [];
+        for (var i = 0; i < this.meta.outputs.length; i++) {
+            if (this.meta.outputs[i]['definition']==this.isodef) {
+                if (Ext.isArray(this.meta.outputs[i]['constraint']['interval']) 
+                    && this.meta.outputs[i]['constraint']['interval'].length==2) {
+                    return this.meta.outputs[i]['constraint']['interval'][0];
+                }
+            }
+        }
+        return ret;
+    },
+    getEndPosition: function(){
+        var ret = [];
+        for (var i = 0; i < this.meta.outputs.length; i++) {
+            if (this.meta.outputs[i]['definition']==this.isodef) {
+                if (Ext.isArray(this.meta.outputs[i]['constraint']['interval']) 
+                    && this.meta.outputs[i]['constraint']['interval'].length==2) {
+                    return this.meta.outputs[i]['constraint']['interval'][1];
+                }
+            }
+        }
+        return ret;
+    },
+    getDefaultQI: function(){
+        return this.configsections.getobservation.defaultqi;
+    },
+    getDefaultNoData: function(){
+        return parseFloat(this.configsections.getobservation.aggregatenodata);
+    },
+    /*
+     * Change the color representing this procedure.
+     * If silent = true then the event will NOT be thrown
+     */
+    setColor: function(color, silent){
+        if (silent != true) {
+            silent = false;
+        }
+        var old = this.color;
+        this.color = color;
+        if (!silent && this.color != old) {
+            this.fireEvent("colorchanged", this, this.color, old);
+        }
+    },
+    getColor: function(){
+        return this.color;
+    },
+    /*
+     * Change the visibility of this procedure.
+     * If silent = true then the event will NOT be thrown
+     */
+    setVisibility: function(visible, silent){
+        if (silent != true) {
+            silent = false;
+        }
+        var old = this.visible;
+        this.visible = visible;
+        if (!silent && this.visible != old) {
+            this.fireEvent("visibilitychanged", this, this.visible);
+        }
+    },
+    getVisibility: function(){
+        return this.visible;
+    }
+});
+
+Ext.define('istsos.utils', {
+    extend: 'Ext.util.Observable',
+    statics: {
+        // Convert microseconds number to isodate string
+        // If offset in minutes is not given UTC will be returned
+        micro2iso: function(m, offset){
+            
+            var offsetObj = new Date();
+            offsetObj.setHours(0);
+            offsetObj.setMinutes(0);
+            var sign = "+";
+            
+            var date = new Date(parseInt(m/1000));
+            var micro = parseFloat("0."+m);
+            
+            
+            if (offset!=null) {
+                date.setUTCMinutes(date.getUTCMinutes()+offset);
+                if (offset<0) {
+                    sign = "-";
+                    offset = -1 * offset;
+                    offsetObj.setMinutes(offset);
+                }else{
+                    offsetObj.setMinutes(offset);
+                }
+            }
+            
+            var year = date.getUTCFullYear();
+            var month = (date.getUTCMonth()+1)<10?"0"+(date.getUTCMonth()+1):(date.getUTCMonth()+1);
+            var day = date.getUTCDate()<10?"0"+date.getUTCDate():date.getUTCDate();
+            var hour = date.getUTCHours()<10?"0"+date.getUTCHours():date.getUTCHours();
+            //hour = hour + offsetObj.getHours();
+            var minute = date.getUTCMinutes()<10?"0"+date.getUTCMinutes():date.getUTCMinutes();
+            //minute = minute + offsetObj.getMinutes();
+            
+            var second = date.getUTCSeconds()<10?"0"+date.getUTCSeconds():date.getUTCSeconds();
+            var micro = (""+parseFloat((""+(m/1000000)).replace(parseInt(m/1000000),"0"))).replace("0","");
+            
+            var tz = offset==null?"Z":sign+(offsetObj.getHours()<10?"0"+offsetObj.getHours():offsetObj.getHours())+(offsetObj.getMinutes()<10?"0"+offsetObj.getMinutes():offsetObj.getMinutes());
+            
+            return year + "-" + month + "-"  + day + "T" + hour+ ":" + minute + ":" + second + "" + micro + "" + tz;
+            
+        },
+        // Extract microseconds from an isodate string 
+        //  > iso date with micro seconds: "2012-10-28T01:00:00.123456+0100"
+        //  > iso date with micro seconds: "2012-10-28T01:00:00+0100"
+        iso2micro: function(iso){
+            
+            // iso = "2012-10-28T00:50:00.123456+0100" | "2012-10-28T00:50:00+0100"
+            //                0      1     2        3          4        5
+            // splitted = ["2012", "10", "28", "00:50:00", "123456", "0100"]
+            // splitted = ["2012", "10", "28", "00:50:00", "0100"]
+            var splitted = iso.split(/[T]|[.]|[,]|[+]|[-]|[z]|[Z]/g);
+            
+            // Splitting hours
+            var hours = splitted[3].split(":");
+            
+            // Calculating offset
+            var hoffset = 0;
+            var moffset = 0;
+            if (iso.match(/[Z]/g)==null) { // Already UTC
+                hoffset = parseInt(parseInt(splitted[splitted.length-1])/100);
+                moffset = parseInt(splitted[splitted.length-1]) - (hoffset*100);
+                if (iso.match(/[+]/g)==null) {
+                    hoffset = -1 * hoffset;
+                    moffset = -1 * moffset;
+                }
+            }
+            
+            var milli = Date.UTC(
+                parseInt(splitted[0]), // years
+                parseInt(splitted[1])-1, // months
+                parseInt(splitted[2]), // days
+                parseInt(hours[0])-hoffset, // hours
+                parseInt(hours[1])-moffset, // minutes
+                parseInt(hours[2]) // seconds
+                );
+                    
+            var match = iso.match(/[.]|[,]/g);
+            if (match != null && ( Ext.Array.contains(match, '.') || Ext.Array.contains(match, ','))) {
+                var micro = parseFloat("0."+splitted[4]);
+                
+                //console.log(istsos.utils.micro2iso((milli * 1000) + (micro * 1000000)));
+                return (milli * 1000) + (micro * 1000000);
+            } else {
+                //console.log(istsos.utils.micro2iso( milli*1000));
+                return milli*1000;
+            }
+            
+        },
+        getStore: function(procedure){
+            
+            var meta = procedure.meta;
+            var service = procedure.service;
+            var sensor = procedure.sensor;
+            
+            var storeFields = [{
+                name: "micro", // Tagliamo la testa al toro -> i mems misurano ogni mezzo millisecondo (500µs)!!
+                type: 'int'
+            },{
+                name: this.isodef,
+                type: 'string'
+            }];
+        
+            for (var i = 1; i < meta.outputs.length; i++) {
+                storeFields.push({
+                    name: meta.outputs[i].definition,
+                    type: 'float'
+                },{
+                    name: meta.outputs[i].definition+":qualityIndex",
+                    type: 'float'
+                });
+            }
+            
+            Ext.define(service+'-'+sensor+'-model', {
+                extend: 'Ext.data.Model',
+                idProperty: this.isodef,
+                fields: storeFields
+            });
+            
+            /*return Ext.create('istsos.store.ObservationEditor',{
+                model: service+'-'+sensor+'-model',
+                name: sensor
+            });*/
+            
+            return Ext.create('Ext.data.Store', {
+                model: service+'-'+sensor+'-model',
+                name: sensor,
+                proxy: {
+                    type: 'memory',
+                    reader: {
+                        type: 'array',
+                        idProperty: this.isodef
+                    }
+                }
+            });
+            
+        },
+        validatefilename: function(procedure, filename){
+            var tmp = filename.split(/[\\/]/);
+            if (tmp.length<2 || !Ext.isArray(tmp)) {
+                throw "File path error";
+            }
+            var ext  = tmp[tmp.length-1].split(".")[1];
+            if (ext != 'dat') {
+                throw "File extension wrong (must be *.dat)";
+            }
+            tmp = tmp[tmp.length-1].split(".")[0];
+            var ep = tmp.split("_");
+            if (ep.length<2 || !Ext.isArray(ep)) {
+                throw "File name format error";
+            }
+            ep = ep[ep.length-1];
+            // tmp = tmp.replace("_"+ep,"");
+            // Extracting the end position date
+            //  > date in file names are always in Greenwich time (GMT)
+            ep = Ext.Date.parse(ep+"0", "YmdHisZ");
+            // Checking File nema prefix must be equal the procedure name
+            if (tmp!=procedure.getName()) {
+                throw "File name format error, '" + tmp + "'"
+                + " is is not valid for '" + procedure.getName() + "' procedure";
+            }
+            return true;
+        },
+        parsecsvfile: function(procedure, fileList, filename, callback){
+            this.getParser().parsecsvfile(procedure, fileList, filename, function(progressEvent){
+                callback(istsos.utils.parsecsvstring(procedure, progressEvent.target.result));
+            });
+        },
+        // Return an object that can read the csv file and throw an event when finisched
+        getParser: function(){
+            return Ext.create('Ext.util.Observable', {
+                events: ['csvfileparsed'],
+                parsecsvfile: function(procedure, fileList, filename, callback){
+                    if (Ext.isFunction(callback)) {
+                        this.callback = callback;
+                    }else{
+                        delete this.callback;
+                    }
+                    var reader = new FileReader();
+                    try {
+                        for (var i = 0; i < fileList.length; i++) {
+                            reader.parser = this;
+                            reader.addEventListener('load', function (e) {
+                                if (Ext.isFunction(this.parser.callback)) {
+                                    this.parser.callback(e);
+                                }
+                                this.parser.fireEvent('csvfileparsed', e.target.result);
+                            }, false);     
+                            reader.readAsText(fileList[i]);
+                        }
+                    } catch (exception) { 
+                        Ext.Msg.alert('Warning', exception);           
+                    } 
+                }
+            });
+        },
+        // Convert microseconds number to isodate string
+        /*
+         * Parse a csv and return an object like this:
+         * {
+         *      "data": [
+         *          [
+         *              {
+         *                  "micro": 123234253456, // microseconds
+         *                  "urn:ogc:def:parameter:x-istsos::time:iso8601": "2012-12-09T14:12Z",
+         *                  "urn:ogc:def:parameter:x-istsos::foobar": "12.5",
+         *                  "urn:ogc:def:parameter:x-istsos::foobar:qualityIndex": "100"
+         *              },
+         *              ...
+         *          ]
+         *      ],
+         *      "total": 23,
+         *      "begin": "2012-12-09T14:12Z",
+         *      "end": "2012-12-10T14:00Z"
+         * }
+         */
+        parsecsvstring: function(procedure, csvstring){            
+            var lines = csvstring.split(/[\r\n|\n]+/);             
+            var ret = {
+                data: [],
+                header: ["micro"],
+                total: 0,
+                begin: null, 
+                end: null,
+                isregular: true,
+                timeresolutions: [],
+                timeresolutionscheck: []
+            }, header = lines[0].split(",");                
+            try {                
+                if (lines.length<2) {
+                    throw "CSV file contain less then the minimal 2 line (header + value)";
+                }
+                // Detecting procedure's observation properties order
+                var opcomposition = [];
+                var properties = procedure.meta.outputs;
+                for (c = 0; c < properties.length ; c++) {                    
+                    // Check if the output observed properties exist in the CSV
+                    if(!Ext.Array.contains(
+                        header, properties[c].definition) ){
+                        throw "CSV observed properties in header are not correct"
+                    }                    
+                    if (properties[c].definition == this.isodef) {
+                        opcomposition.push(properties[c].definition);
+                    }else{
+                        opcomposition.push(
+                            properties[c].definition,
+                            properties[c].definition+":qualityIndex"
+                            );
+                    }
+                }             
+                ret.header = ret.header.concat(opcomposition);
+                // Getting the time column position in the csv file
+                var idx = Ext.Array.indexOf(header, this.isodef);                
+                // csv begin position
+                var bp = Ext.Date.parse(lines[1].split(",")[idx],"c");                
+                // Get microseconds of first date
+                ret.begin = istsos.utils.iso2micro(lines[1].split(",")[idx]);                
+                // csv end position
+                var ep;
+                // reverse loop because sometimes last rows are empty
+                for(var c=(lines.length-1);c>0;c--) {
+                    if (lines[c].split(",").length==header.length) {
+                        ep = Ext.Date.parse(lines[c].split(",")[idx],"c");
+                        // Get microseconds of last date
+                        ret.end = istsos.utils.iso2micro(lines[1].split(",")[idx]);
+                        break;
+                    }
+                }
+                // statistics counters
+                var updated = 0, inserted = 0;
+                try {
+                    var idxStart=0;      
+                    var lastDate;
+                    for(c=1;c<lines.length;c++) { // start looping csv lines >>
+                        var row = [];
+                        var line = lines[c].split(",");
+                        // csv observed properties must be lenght exacly as 
+                        //   the procedure observed property 
+                        if (line.length!=header.length) {
+                            // Skip empty rows
+                            if (line.length==1 && line[0]=="") {
+                                continue;
+                            }
+                            throw ("Length mismatch from header definition");
+                        }
+                        for (var i = 0; i < opcomposition.length; i++) {
+                            // finding the observed property position in the csv
+                            idx = Ext.Array.indexOf(header, opcomposition[i]);      
+                            if (idx < 0) { // CSV does not have observed property
+                                if (opcomposition[i].indexOf(":qualityIndex")<0) {
+                                    // Quality index are not mandatory, other output obs.prop are mandatory
+                                    throw ("Mandatory procedures output observed property \"" + opcomposition[i] + "\" is not present in the CSV text");
+                                }
+                                row.push(parseInt(procedure.getDefaultQI()));
+                            }else{
+                                if (opcomposition[i]==this.isodef) { // If isodate field
+                                    var micro = istsos.utils.iso2micro(line[idx]);
+                                    //var date = Ext.Date.parse(line[idx],"c");
+                                    row.push(micro, line[idx]);
+                                    // Prepare info about time resolutions of this timeseries
+                                    if (lastDate) {
+                                        var delta = micro - lastDate;
+                                        if (!Ext.Array.contains(ret.timeresolutions, delta)) {
+                                            ret.isregular = false;
+                                            ret.timeresolutions.push(delta);
+                                            ret.timeresolutionscheck.push(line[idx]);
+                                        }
+                                    }
+                                    lastDate = micro;
+                                }else{
+                                    if(line[idx]!=''){ // All other observed properties
+                                        row.push(parseFloat(line[idx]));
+                                    }
+                                }
+                            }
+                        }
+                        ret.total += 1;
+                        ret.data.push(row);
+                    }
+                } catch (exception) { 
+                    throw "Riga [" + (c+1) + "]:" + exception;
+                }
+            } catch (exception) { 
+                Ext.Msg.alert('Warning', exception);   
+            }
+            return ret;
+        }
+    }
+});
+
+
+/*
+Ext.define('istsos.Procedure', {
+    extend: 'Ext.util.Observable',
+    constructor: function(config){
+        
+        
+        this.addEvents({
+            "saved" : true,
+            "loaded" : true
+        });
+        
+        Ext.applyIf(this, config);
+        
+        var qis = Ext.create('istsos.store.EditorQiStore',{
+            storeId: this.id+'-editorQiStore',
+            proxy: {
+                type: 'ajax',
+                url: Ext.String.format("{0}/istsos/services/{1}/dataqualities", wa.url,this.service),
+                reader: {
+                    type: 'json',
+                    root: 'data'
+                }
+            }
+        });
+        qis.load();
+        
+        // init store
+        this.store = null;
+        this.callParent(arguments)
+    },
+    load: function(begin, end){
+    
+    },
+    commit: function(){
+    
+    },
+    isDirty: function(){
+        return true;
+    },
+    initStore: function(obsColl){
+        
+        this.template = obsColl;
+        
+        
+        // ***********************************************
+        // Initializing grid columns
+        //   dynamic column grid initialization
+        // ***********************************************
+        this.columns = [{
+            xtype: 'datecolumn',
+            dataIndex: wa.isodef, // isodate is always present at position one
+            flex: 0.7,
+            header: 'Date',
+            format: 'c'
+        }];
+        
+        var properties = obsColl.result.DataArray.field;
+        for (var i = 1; i < properties.length; i++) {
+            
+            this.columns.push({
+                xtype: 'numbercolumn',
+                format: '0,000.000000',
+                dataIndex: properties[i].definition,
+                flex: 0.4,
+                text: properties[i].name,
+                field: {
+                    xtype: 'numberfield',
+                    decimalPrecision: 6,
+                    hideLabel: true,
+                    listeners: {
+                        change: function(form, newValue, oldValue, eOpts){
+                            console.log("change: ");
+                            console.dir(arguments);
+                        }
+                    }
+                }
+            },{
+                xtype: 'gridcolumn',
+                dataIndex: Ext.String.format('{0}:qualityIndex',properties[i].definition),
+                flex: 0.3,
+                text: 'qualityIndex',
+                //text: Ext.String.format('{0}:qualityIndex',properties[i].name),
+                field: {
+                    xtype: 'combobox',
+                    queryMode: 'local',
+                    allowBlank: false,
+                    hideLabel: true,
+                    displayField: 'name',
+                    store: this.id+'-editorQiStore',
+                    valueField: 'name',
+                    anchor: '100%'
+                }
+            });
+            i++;
+        }
+        
+        
+        // ***********************************************
+        // Initializing store fields
+        // ***********************************************
+        // Dynamic fields store initialization
+        this.strFields = [{
+            dateFormat: 'c',
+            name: wa.isodef,
+            type: 'date'
+        }];
+        
+        //var properties = obsColl.result.DataArray.field;
+        for (var i = 1; i < properties.length; i++) {
+            this.strFields.push({
+                name: properties[i].definition,
+                type: 'float'
+            });
+        }
+        
+        
+        Ext.define(this.description.system_id+'Model', {
+            extend: 'Ext.data.Model',
+            idProperty: wa.isodef,
+            fields: this.strFields
+        });
+        
+        this.storeId = Ext.id();
+        var obs = obsColl.result.DataArray.values;
+        this.store = Ext.create('istsos.store.ObservationEditor',{
+            storeId: this.storeId,
+            name: obsColl.name,
+            model: this.description.system_id+'Model',
+            totalCount: obs.length
+        });
+        var data = [];
+        
+        // *****************************************************
+        // When loading data some extra statistics are collected
+        // *****************************************************
+        // 1. Number of observations
+        this.total = obs.length;
+        // 2. Time resolution/interval 
+        //this.timeresolution = null;
+        this.timeresolutions = [];
+        if(obs.length>=2){
+            //this.timeresolution = Ext.Date.parse(obs[1][0], "c").getTime()-Ext.Date.parse(obs[0][0], "c").getTime();
+            this.timeresolutions = [Ext.Date.parse(obs[1][0], "c").getTime()-Ext.Date.parse(obs[0][0], "c").getTime()];
+        }
+        // 3. regular or irregular timeseries boolean
+        this.isregular = true;
+        this.bp = Ext.Date.parse(obs[0][0], "c");
+        this.ep = Ext.Date.parse(obs[obs.length-1][0], "c");
+        for (i = 0; i < obs.length; i++) {
+            var rec = [];
+            rec.push(Ext.Date.parse(obs[i][0], "c"));
+            //chartStore[rec[0]]=[];
+            for (var c = 1; c < obs[i].length; c++) {
+                rec.push(parseFloat(obs[i][c]));
+            //chartStore[rec[0]].push(parseFloat(obs[i][c]));
+            }
+            data.push(rec);
+            // Check resolution
+            if (i>=1) {
+                var res = data[i][0].getTime()-data[i-1][0].getTime();
+                if (!Ext.Array.contains(this.timeresolutions, res)) {
+                    console.log(data[i][0]);
+                    this.isregular = false;
+                    this.timeresolutions.push(res);
+                }
+            }
+        }
+        this.store.loadData(data);
+        
+        this.timeresolutions = Ext.Array.unique(this.timeresolutions);
+        
+        var f = Ext.getCmp(this.resid);
+        
+        var tr = [];
+        for (i = 0; i < this.timeresolutions.length; i++) {
+            if (this.timeresolutions[i]>10) {
+                tr.push(centisecsToISODuration(this.timeresolutions[i]/10));
+            }
+        }
+        
+        f.setValue(tr.join(", "));
+        f.setVisible(true);
+        
+        f = Ext.getCmp(this.obsid);
+        f.setValue(this.total + " observations");
+        f.setVisible(true);
+        
+        if (!this.isregular) {
+            f = Ext.getCmp(this.intid);
+            f.setVisible(true);
+        }
+    
+    },
+    //Create a grid that fit the internal store
+    getGrid: function(observedProperty){
+        for (var i = 1; i < this.columns.length; i++) {
+            if (this.columns[i]['dataIndex']!=observedProperty && 
+                this.columns[i]['dataIndex']!=observedProperty+':qualityIndex') {
+                this.columns[i]['hidden']=true;
+            }
+        }
+        this.grid = Ext.create('Ext.grid.Panel', {
+            xtype: 'grid',
+            id: 'oegrid',
+            title: '',
+            store: this.storeId,
+            autoRender: true,
+            autoScroll: true,
+            viewConfig: {
+            
+            },
+            columns: this.columns,
+            plugins: [Ext.create('Ext.grid.plugin.CellEditing')],
+            selModel: Ext.create('Ext.selection.RowModel', {
+                allowDeselect: true,
+                mode: 'MULTI'
+            }),
+            dockedItems: [
+            {
+                xtype: 'toolbar',
+                dock: 'top',
+                items: [
+                {
+                    xtype: 'filefield',
+                    //fieldLabel : 'CSV',
+                    emptyText: 'Load CSV..',
+                    labelWidth: 40,
+                    listeners: {
+                        change: this.loadCsv,
+                        scope: this
+                    }
+                },
+                {
+                    xtype: 'button',
+                    flex: 1,
+                    id: 'btnSelectAll',
+                    text: 'Select all',
+                    handler: function(){
+                        var selectionModel = this.grid.getSelectionModel();
+                        selectionModel.selectAll(true);
+                    },
+                    scope: this
+                }
+                ]
+            }
+            ]
+        });
+        return this.grid;
+    },
+    loadCsv: function(field, value, eOpts){
+        console.dir(arguments);
+        var files = field.fileInputEl.dom.files;
+        var reader = new FileReader();
+        try {
+            
+            // Checking file path format
+            var tmp = value.split(/[\\/]/);
+            if (tmp.length<2 || !Ext.isArray(tmp)) {
+                throw "File path error";
+            }
+            // Checking the file name format
+            tmp = tmp[tmp.length-1].split(".")[0];
+            // getting end position
+            var ep = tmp.split("_");
+            
+            if (ep.length<2 || !Ext.isArray(ep)) {
+                throw "File name format error";
+            }
+            
+            ep = ep[ep.length-1];
+            tmp = tmp.replace("_"+ep,"");
+            
+            // Extracting the end position date
+            //  > date in file names are always in Greenwich time (GMT)
+            ep = Ext.Date.parse(ep+"0", "YmdHisZ");
+            console.log(ep);
+            
+            // Checking File nema prefix must be equal the procedure name
+            if (tmp!=this.description.system_id) {
+                throw "File name format error, '" + tmp + "'"
+                + " is different from '" + this.description.system_id + "'";
+            }
+            
+            for (var i = 0; i < files.length; i++) {
+                reader.istProcedure = this;
+                reader.addEventListener('load', function (e) {
+                    this.istProcedure.parseCSV(e.target.result);
+                }, false);     
+                reader.readAsText(files[i]);
+            }
+        
+        } catch (exception) { 
+            Ext.Msg.alert('Warning', exception);           
+        } 
+    },
+    parseCSV: function(csvstring){
+        var lines = csvstring.split(/[\r\n|\n]+/); 
+        try {
+            if (lines.length<2) {
+                throw "CSV file contain less then the minimal 2 line (header + value)";
+            }
+            // Comparing CSV obsprop and real procedure's obsprop
+            var csvObsProp = lines[0].split(",");
+            // Detecting local store observation properties order
+            var tplObsprop = [];
+            var properties = this.template.result.DataArray.field;
+            for (c = 0; c < properties.length ; c++) {
+                tplObsprop.push(properties[c].definition);
+                if(!Ext.Array.contains(
+                    csvObsProp, properties[c].definition) ){
+                    throw "CSV observed properties in header are not correct"
+                }
+            }
+            
+            // Getting the time column position in the csv file
+            var idx = Ext.Array.indexOf(csvObsProp, wa.isodef);
+            // csv begin position
+            var bp = Ext.Date.parse(lines[1].split(",")[idx],"c");
+            // csv end position
+            var ep;
+            // loop because sometimes last rows are empty
+            for(var c=(lines.length-1);c>0;c--) { 
+                if (lines[c].split(",").length==tplObsprop.length) {
+                    ep = Ext.Date.parse(lines[c].split(",")[idx],"c");
+                    break;
+                }
+            }
+            
+            // Some statistics counter
+            var updated = 0, inserted = 0;
+            
+            var data = [];
+            this.store.suspendEvents();
+            try {
+                var idxStart=0;      
+                var lastDate;
+                for(c=1;c<lines.length;c++) { // start looping csv lines >>
+                    var row = [];
+                    var line = lines[c].split(",");
+                    // csv observed properties must be exacly as 
+                    //   the procedure observed property 
+                    if (line.length==tplObsprop.length) { 
+                        var id;
+                        for (var i = 0; i < tplObsprop.length; i++) {
+                            // finding the csv observed property position
+                            idx = Ext.Array.indexOf(csvObsProp, tplObsprop[i]);                    
+                            if (tplObsprop[i]==wa.isodef) {
+                                id = Ext.Date.parse(line[idx],"c");
+                                row.push(Ext.Date.clone(id));
+                                // check regularity
+                                if (lastDate) {
+                                    var res = id.getTime() - lastDate;
+                                    if (!Ext.Array.contains(this.timeresolutions, res)) {
+                                        console.log(data[i][0]);
+                                        this.isregular = false;
+                                        this.timeresolutions.push(res);
+                                    }
+                                }
+                                lastDate = id.getTime();
+                            }else{
+                                if(line[idx]!=''){
+                                    row.push(parseFloat(line[idx]));
+                                }
+                            }
+                        }
+                        
+                        if (this.bp.getTime() > id.getTime() || 
+                            this.ep.getTime() < id.getTime()) {
+                            //this.store.loadData([row],true);
+                            data.push(row);
+                            inserted++;
+                        }else{
+                            var index = this.store.find(wa.isodef,id,idxStart);
+                            if (index==-1) {
+                                //this.store.loadData([row],true);
+                                data.push(row);
+                                inserted++;
+                            }else{
+                                var rec = this.store.getAt(index);
+                                rec.beginEdit();
+                                for (i = 0; i < tplObsprop.length; i++) {
+                                    if (tplObsprop[i]!=wa.isodef) {
+                                        rec.set(tplObsprop[i],row[i]);
+                                    }
+                                }
+                                rec.endEdit(true);
+                                idxStart = index+1;
+                                updated++;
+                            }
+                        }
+                    }
+                };
+                this.store.loadData(data,true);
+                
+                if (this.bp.getTime() > bp.getTime()){
+                    this.bp = bp;
+                }
+                
+                if (this.ep.getTime() < ep.getTime()){
+                    this.ep = ep;
+                }
+                
+            } catch (exception) { 
+                throw "Riga [" + (c+1) + "]:" + exception;
+            } finally {
+                console.log("Sorting.. and resuming events.");
+                this.store.sort(wa.isodef, 'ASC');
+                this.store.resumeEvents();        
+            }
+            
+            console.log("CSV stats:");
+            console.log("Updated: " + updated);
+            console.log("Inserted: " + inserted);
+            
+            var f = Ext.getCmp(this.resid);
+            var tr = [];
+            for (i = 0; i < this.timeresolutions.length; i++) {
+                if (this.timeresolutions[i]>10) {
+                    tr.push(centisecsToISODuration(this.timeresolutions[i]/10));
+                }
+            }
+            f.setValue(tr.join(", "));
+        
+            Ext.getCmp('chartpanel').initChartStore(false);
+            
+            
+        // Check empty / no data holes ;)
+            
+            
+            
+            
+        } catch (exception) { 
+            Ext.Msg.alert('Warning', exception);   
+        }
+    
+    },
+    getCheckbox: function(){
+        this.formid = "proc-" + Ext.id();
+        this.resid = Ext.id();
+        this.obsid = Ext.id();
+        this.intid = Ext.id();
+        var begin, end;
+        var obsprop = [];
+        var d = this.description;      
+        for (var i = 0; i < d.outputs.length; i++) {
+            if (d.outputs[i]["definition"]==wa.isodef) {
+                if (!Ext.isEmpty(d.outputs[i]['constraint']['interval'])) {
+                    var interval = Ext.Array.clone(d.outputs[i]['constraint']['interval']);
+                    try{
+                        //begin = Ext.Date.format(interval[0],'c');
+                        begin = interval[0];
+                    }catch (e){
+                        begin = "null";
+                    }
+                    try{
+                        //end = Ext.Date.format(interval[1],'c');
+                        end = interval[1];
+                    }catch (e){
+                        end = "null";
+                    }
+                }
+            }else{
+                obsprop.push(d.outputs[i]["name"]);
+            }
+        }
+        
+        return {
+            xtype: 'fieldset',
+            layout: {
+                type: 'column'
+            },
+            id: this.formid,
+            padding: 10,
+            collapsible: false,
+            checkboxToggle: true,
+            checkboxName: this.description.system_id,
+            title: this.description.system_id,
+            defaults: {
+                labelWidth: 70,
+                xtype: 'displayfield',
+                anchor: '100%',
+                columnWidth: 1
+            },
+            items: [
+            {
+                fieldLabel: 'From',
+                value: begin
+            },
+            {
+                fieldLabel: 'To',
+                value: end
+            },
+            {
+                fieldLabel: 'Observed',
+                value: obsprop.join(", ")
+            },
+            {
+                fieldLabel: 'Resolution',
+                id: this.resid,
+                hidden: true,
+                value: ""
+            },
+            {
+                fieldLabel: 'Loaded',
+                id: this.obsid,
+                hidden: true,
+                value: ""
+            },
+            {
+                fieldLabel: 'Interpolate',
+                id: this.intid,
+                xtype: 'checkbox',
+                hidden: true,
+                value: false,
+                listeners: {
+                    change: function (field, newValue, oldValue, eOpts) {
+                        console.log(arguments, "id: " + this.intid);
+                        if(newValue){
+                            this.interpolate();
+                        }
+                    },
+                    scope: this
+                }
+            }
+            ]
+        };
+    },
+    getObservedProperties: function(){
+        var out = this.description.outputs;
+        var ret = [];
+        for (var i = 0; i < out.length; i++) {
+            if (out[i].definition!=wa.isodef) {
+                ret.push(out[i].definition);
+            }
+        }
+        return ret;
+    },
+    interpolate: function(){
+        var obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        var chart = Ext.getCmp('chartpanel');
+        var cd = chart.chartdata;
+        var colIdx = chart.chart.indexFromSetName(this.store.name);
+        if(cd[0][colIdx]==null){
+            Ext.Msg.alert('Warning', 'Interpolation not possible if the series stars with no value.');
+        }
+        var templ = [];
+        var obsIdx = null; //Ext.Array.indexOf(this.strFields,obsprop);
+        for (i = 0; i < this.strFields.length; i++) {
+            if (this.strFields[i].name==obsprop) {
+                obsIdx = i;
+            }
+            templ.push(null);
+        }
+        this.store.suspendEvents();
+        for (var i = 1; i < cd.length; i++) {
+            if (cd[i][colIdx]==null) {
+                var id1 = i-1;
+                var id2 = id1+1;
+                var x = cd[i][0].getTime();
+                var rec0 = this.store.getAt(id1);
+                var rec1 = this.store.getAt(id2);
+                //var rec1 = this.store.findRecord(wa.isodef,id2);
+                var x0=rec0.get(wa.isodef).getTime();
+                var y0=rec0.get(obsprop);
+                var x1=rec1.get(wa.isodef).getTime();
+                var y1=rec1.get(obsprop);
+                // Interpolation function
+                var y = y0 + ((y1-y0)/(x1-x0))*(x-x0);
+                
+                var data = Ext.Array.clone(templ);
+                data[0] = Ext.Date.clone(cd[i][0]);
+                data[obsIdx] = y;
+                this.store.loadData([data],true);
+            }
+        }
+        this.store.sort(wa.isodef, 'ASC');
+        this.store.resumeEvents();
+        
+        chart._editedSeriesUpdate(this.store, this.store.getRange());
+    
+    }
+});*/
+
+
diff --git a/interface/app/data/cmbcapabilities.json b/interface/app/data/cmbcapabilities.json
new file mode 100755
index 0000000..35ef690
--- /dev/null
+++ b/interface/app/data/cmbcapabilities.json
@@ -0,0 +1,21 @@
+{
+    "total": 5,
+    "success": true,
+    "message": "Capabilities data loaded correctly",
+    "data": [
+    /*{
+        "name" : "Storage Type",
+        "definition" : "urn:x-ogc:def:classifier:x-istsos:1.0:storageType",
+        "uom" : ""            
+    },*/
+    {
+        "name" : "Memory Capacity",
+        "definition" : "urn:x-ogc:def:classifier:x-istsos:1.0:memoryCapacity",
+        "uom" : "Byte"            
+    },{
+        "name" : "Battery Current",
+        "definition" : "urn:x-ogc:def:phenomenon:x-istsos:1.0:batteryCurrent",            
+        "uom" : "A.h"            
+    }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/cmbcapabilitiesuom.json b/interface/app/data/cmbcapabilitiesuom.json
new file mode 100755
index 0000000..174794d
--- /dev/null
+++ b/interface/app/data/cmbcapabilitiesuom.json
@@ -0,0 +1,26 @@
+{
+    "total": 6,
+    "success": true,
+    "message": "Capabilities time uoms loaded correctly",
+    "data": [
+    {
+        "name" : "Microseconds",
+        "uom" : "µs"    
+    },{
+        "name" : "Milliseconds",
+        "uom" : "ms"    
+    },{
+        "name" : "Seconds",
+        "uom" : "s"    
+    },{
+        "name" : "Minutes",
+        "uom" : "min"    
+    },{
+        "name" : "Hoours",
+        "uom" : "h"    
+    },{
+        "name" : "Days",
+        "uom" : "d"    
+    }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/cmbdocumentformat.json b/interface/app/data/cmbdocumentformat.json
new file mode 100755
index 0000000..cece9a8
--- /dev/null
+++ b/interface/app/data/cmbdocumentformat.json
@@ -0,0 +1,3208 @@
+{
+    "total": 642,
+    "success": true,
+    "message": "Capabilities data loaded correctly",
+    "data": [
+    {
+        "extension": ".3dm",
+        "format": "x-world/x-3dmf"
+    },
+    {
+        "extension": ".3dmf",
+        "format": "x-world/x-3dmf"
+    },
+    {
+        "extension": ".a",
+        "format": "application/octet-stream"
+    },
+    {
+        "extension": ".aab",
+        "format": "application/x-authorware-bin"
+    },
+
+    {
+        "extension": ".aam",
+        "format": "application/x-authorware-map"
+    },
+
+    {
+        "extension": ".aas",
+        "format": "application/x-authorware-seg"
+    },
+
+    {
+        "extension": ".abc",
+        "format": "text/vnd.abc"
+    },
+
+    {
+        "extension": ".acgi",
+        "format": "text/html"
+    },
+
+    {
+        "extension": ".afl",
+        "format": "video/animaflex"
+    },
+
+    {
+        "extension": ".ai",
+        "format": "application/postscript"
+    },
+
+    {
+        "extension": ".aif",
+        "format": "audio/aiff"
+    },
+
+    {
+        "extension": ".aif",
+        "format": "audio/x-aiff"
+    },
+
+    {
+        "extension": ".aifc",
+        "format": "audio/aiff"
+    },
+
+    {
+        "extension": ".aifc",
+        "format": "audio/x-aiff"
+    },
+
+    {
+        "extension": ".aiff",
+        "format": "audio/aiff"
+    },
+
+    {
+        "extension": ".aiff",
+        "format": "audio/x-aiff"
+    },
+
+    {
+        "extension": ".aim",
+        "format": "application/x-aim"
+    },
+
+    {
+        "extension": ".aip",
+        "format": "text/x-audiosoft-intra"
+    },
+
+    {
+        "extension": ".ani",
+        "format": "application/x-navi-animation"
+    },
+
+    {
+        "extension": ".aos",
+        "format": "application/x-nokia-9000-communicator-add-on-software"
+    },
+
+    {
+        "extension": ".aps",
+        "format": "application/mime"
+    },
+
+    {
+        "extension": ".arc",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".arj",
+        "format": "application/arj"
+    },
+
+    {
+        "extension": ".arj",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".art",
+        "format": "image/x-jg"
+    },
+
+    {
+        "extension": ".asf",
+        "format": "video/x-ms-asf"
+    },
+
+    {
+        "extension": ".asm",
+        "format": "text/x-asm"
+    },
+
+    {
+        "extension": ".asp",
+        "format": "text/asp"
+    },
+
+    {
+        "extension": ".asx",
+        "format": "application/x-mplayer2"
+    },
+
+    {
+        "extension": ".asx",
+        "format": "video/x-ms-asf"
+    },
+
+    {
+        "extension": ".asx",
+        "format": "video/x-ms-asf-plugin"
+    },
+
+    {
+        "extension": ".au",
+        "format": "audio/basic"
+    },
+
+    {
+        "extension": ".au",
+        "format": "audio/x-au"
+    },
+
+    {
+        "extension": ".avi",
+        "format": "application/x-troff-msvideo"
+    },
+
+    {
+        "extension": ".avi",
+        "format": "video/avi"
+    },
+
+    {
+        "extension": ".avi",
+        "format": "video/msvideo"
+    },
+
+    {
+        "extension": ".avi",
+        "format": "video/x-msvideo"
+    },
+
+    {
+        "extension": ".avs",
+        "format": "video/avs-video"
+    },
+
+    {
+        "extension": ".bcpio",
+        "format": "application/x-bcpio"
+    },
+
+    {
+        "extension": ".bin",
+        "format": "application/mac-binary"
+    },
+
+    {
+        "extension": ".bin",
+        "format": "application/macbinary"
+    },
+
+    {
+        "extension": ".bin",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".bin",
+        "format": "application/x-binary"
+    },
+
+    {
+        "extension": ".bin",
+        "format": "application/x-macbinary"
+    },
+
+    {
+        "extension": ".bm",
+        "format": "image/bmp"
+    },
+
+    {
+        "extension": ".bmp",
+        "format": "image/bmp"
+    },
+
+    {
+        "extension": ".bmp",
+        "format": "image/x-windows-bmp"
+    },
+
+    {
+        "extension": ".boo",
+        "format": "application/book"
+    },
+
+    {
+        "extension": ".book",
+        "format": "application/book"
+    },
+
+    {
+        "extension": ".boz",
+        "format": "application/x-bzip2"
+    },
+
+    {
+        "extension": ".bsh",
+        "format": "application/x-bsh"
+    },
+
+    {
+        "extension": ".bz",
+        "format": "application/x-bzip"
+    },
+
+    {
+        "extension": ".bz2",
+        "format": "application/x-bzip2"
+    },
+
+    {
+        "extension": ".c",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".c",
+        "format": "text/x-c"
+    },
+
+    {
+        "extension": ".c++",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".cat",
+        "format": "application/vnd.ms-pki.seccat"
+    },
+
+    {
+        "extension": ".cc",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".cc",
+        "format": "text/x-c"
+    },
+
+    {
+        "extension": ".ccad",
+        "format": "application/clariscad"
+    },
+
+    {
+        "extension": ".cco",
+        "format": "application/x-cocoa"
+    },
+
+    {
+        "extension": ".cdf",
+        "format": "application/cdf"
+    },
+
+    {
+        "extension": ".cdf",
+        "format": "application/x-cdf"
+    },
+
+    {
+        "extension": ".cdf",
+        "format": "application/x-netcdf"
+    },
+
+    {
+        "extension": ".cer",
+        "format": "application/pkix-cert"
+    },
+
+    {
+        "extension": ".cer",
+        "format": "application/x-x509-ca-cert"
+    },
+
+    {
+        "extension": ".cha",
+        "format": "application/x-chat"
+    },
+
+    {
+        "extension": ".chat",
+        "format": "application/x-chat"
+    },
+
+    {
+        "extension": ".class",
+        "format": "application/java"
+    },
+
+    {
+        "extension": ".class",
+        "format": "application/java-byte-code"
+    },
+
+    {
+        "extension": ".class",
+        "format": "application/x-java-class"
+    },
+
+    {
+        "extension": ".com",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".com",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".conf",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".cpio",
+        "format": "application/x-cpio"
+    },
+
+    {
+        "extension": ".cpp",
+        "format": "text/x-c"
+    },
+
+    {
+        "extension": ".cpt",
+        "format": "application/mac-compactpro"
+    },
+
+    {
+        "extension": ".cpt",
+        "format": "application/x-compactpro"
+    },
+
+    {
+        "extension": ".cpt",
+        "format": "application/x-cpt"
+    },
+
+    {
+        "extension": ".crl",
+        "format": "application/pkcs-crl"
+    },
+
+    {
+        "extension": ".crl",
+        "format": "application/pkix-crl"
+    },
+
+    {
+        "extension": ".crt",
+        "format": "application/pkix-cert"
+    },
+
+    {
+        "extension": ".crt",
+        "format": "application/x-x509-ca-cert"
+    },
+
+    {
+        "extension": ".crt",
+        "format": "application/x-x509-user-cert"
+    },
+
+    {
+        "extension": ".csh",
+        "format": "application/x-csh"
+    },
+
+    {
+        "extension": ".csh",
+        "format": "text/x-script.csh"
+    },
+
+    {
+        "extension": ".css",
+        "format": "application/x-pointplus"
+    },
+
+    {
+        "extension": ".css",
+        "format": "text/css"
+    },
+
+    {
+        "extension": ".cxx",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".dcr",
+        "format": "application/x-director"
+    },
+
+    {
+        "extension": ".deepv",
+        "format": "application/x-deepv"
+    },
+
+    {
+        "extension": ".def",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".der",
+        "format": "application/x-x509-ca-cert"
+    },
+
+    {
+        "extension": ".dif",
+        "format": "video/x-dv"
+    },
+
+    {
+        "extension": ".dir",
+        "format": "application/x-director"
+    },
+
+    {
+        "extension": ".dl",
+        "format": "video/dl"
+    },
+
+    {
+        "extension": ".dl",
+        "format": "video/x-dl"
+    },
+
+    {
+        "extension": ".doc",
+        "format": "application/msword"
+    },
+
+    {
+        "extension": ".dot",
+        "format": "application/msword"
+    },
+
+    {
+        "extension": ".dp",
+        "format": "application/commonground"
+    },
+
+    {
+        "extension": ".drw",
+        "format": "application/drafting"
+    },
+
+    {
+        "extension": ".dump",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".dv",
+        "format": "video/x-dv"
+    },
+
+    {
+        "extension": ".dvi",
+        "format": "application/x-dvi"
+    },
+
+    {
+        "extension": ".dwf",
+        "format": "drawing/x-dwf (old)"
+    },
+
+    {
+        "extension": ".dwf",
+        "format": "model/vnd.dwf"
+    },
+
+    {
+        "extension": ".dwg",
+        "format": "application/acad"
+    },
+
+    {
+        "extension": ".dwg",
+        "format": "image/vnd.dwg"
+    },
+
+    {
+        "extension": ".dwg",
+        "format": "image/x-dwg"
+    },
+
+    {
+        "extension": ".dxf",
+        "format": "application/dxf"
+    },
+
+    {
+        "extension": ".dxf",
+        "format": "image/vnd.dwg"
+    },
+
+    {
+        "extension": ".dxf",
+        "format": "image/x-dwg"
+    },
+
+    {
+        "extension": ".dxr",
+        "format": "application/x-director"
+    },
+
+    {
+        "extension": ".el",
+        "format": "text/x-script.elisp"
+    },
+
+    {
+        "extension": ".elc",
+        "format": "application/x-bytecode.elisp (compiled elisp)"
+    },
+
+    {
+        "extension": ".elc",
+        "format": "application/x-elc"
+    },
+
+    {
+        "extension": ".env",
+        "format": "application/x-envoy"
+    },
+
+    {
+        "extension": ".eps",
+        "format": "application/postscript"
+    },
+
+    {
+        "extension": ".es",
+        "format": "application/x-esrehber"
+    },
+
+    {
+        "extension": ".etx",
+        "format": "text/x-setext"
+    },
+
+    {
+        "extension": ".evy",
+        "format": "application/envoy"
+    },
+
+    {
+        "extension": ".evy",
+        "format": "application/x-envoy"
+    },
+
+    {
+        "extension": ".exe",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".f",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".f",
+        "format": "text/x-fortran"
+    },
+
+    {
+        "extension": ".f77",
+        "format": "text/x-fortran"
+    },
+
+    {
+        "extension": ".f90",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".f90",
+        "format": "text/x-fortran"
+    },
+
+    {
+        "extension": ".fdf",
+        "format": "application/vnd.fdf"
+    },
+
+    {
+        "extension": ".fif",
+        "format": "application/fractals"
+    },
+
+    {
+        "extension": ".fif",
+        "format": "image/fif"
+    },
+
+    {
+        "extension": ".fli",
+        "format": "video/fli"
+    },
+
+    {
+        "extension": ".fli",
+        "format": "video/x-fli"
+    },
+
+    {
+        "extension": ".flo",
+        "format": "image/florian"
+    },
+
+    {
+        "extension": ".flx",
+        "format": "text/vnd.fmi.flexstor"
+    },
+
+    {
+        "extension": ".fmf",
+        "format": "video/x-atomic3d-feature"
+    },
+
+    {
+        "extension": ".for",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".for",
+        "format": "text/x-fortran"
+    },
+
+    {
+        "extension": ".fpx",
+        "format": "image/vnd.fpx"
+    },
+
+    {
+        "extension": ".fpx",
+        "format": "image/vnd.net-fpx"
+    },
+
+    {
+        "extension": ".frl",
+        "format": "application/freeloader"
+    },
+
+    {
+        "extension": ".funk",
+        "format": "audio/make"
+    },
+
+    {
+        "extension": ".g",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".g3",
+        "format": "image/g3fax"
+    },
+
+    {
+        "extension": ".gif",
+        "format": "image/gif"
+    },
+
+    {
+        "extension": ".gl",
+        "format": "video/gl"
+    },
+
+    {
+        "extension": ".gl",
+        "format": "video/x-gl"
+    },
+
+    {
+        "extension": ".gsd",
+        "format": "audio/x-gsm"
+    },
+
+    {
+        "extension": ".gsm",
+        "format": "audio/x-gsm"
+    },
+
+    {
+        "extension": ".gsp",
+        "format": "application/x-gsp"
+    },
+
+    {
+        "extension": ".gss",
+        "format": "application/x-gss"
+    },
+
+    {
+        "extension": ".gtar",
+        "format": "application/x-gtar"
+    },
+
+    {
+        "extension": ".gz",
+        "format": "application/x-compressed"
+    },
+
+    {
+        "extension": ".gz",
+        "format": "application/x-gzip"
+    },
+
+    {
+        "extension": ".gzip",
+        "format": "application/x-gzip"
+    },
+
+    {
+        "extension": ".gzip",
+        "format": "multipart/x-gzip"
+    },
+
+    {
+        "extension": ".h",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".h",
+        "format": "text/x-h"
+    },
+
+    {
+        "extension": ".hdf",
+        "format": "application/x-hdf"
+    },
+
+    {
+        "extension": ".help",
+        "format": "application/x-helpfile"
+    },
+
+    {
+        "extension": ".hgl",
+        "format": "application/vnd.hp-hpgl"
+    },
+
+    {
+        "extension": ".hh",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".hh",
+        "format": "text/x-h"
+    },
+
+    {
+        "extension": ".hlb",
+        "format": "text/x-script"
+    },
+
+    {
+        "extension": ".hlp",
+        "format": "application/hlp"
+    },
+
+    {
+        "extension": ".hlp",
+        "format": "application/x-helpfile"
+    },
+
+    {
+        "extension": ".hlp",
+        "format": "application/x-winhelp"
+    },
+
+    {
+        "extension": ".hpg",
+        "format": "application/vnd.hp-hpgl"
+    },
+
+    {
+        "extension": ".hpgl",
+        "format": "application/vnd.hp-hpgl"
+    },
+
+    {
+        "extension": ".hqx",
+        "format": "application/binhex"
+    },
+
+    {
+        "extension": ".hqx",
+        "format": "application/binhex4"
+    },
+
+    {
+        "extension": ".hqx",
+        "format": "application/mac-binhex"
+    },
+
+    {
+        "extension": ".hqx",
+        "format": "application/mac-binhex40"
+    },
+
+    {
+        "extension": ".hqx",
+        "format": "application/x-binhex40"
+    },
+
+    {
+        "extension": ".hqx",
+        "format": "application/x-mac-binhex40"
+    },
+
+    {
+        "extension": ".hta",
+        "format": "application/hta"
+    },
+
+    {
+        "extension": ".htc",
+        "format": "text/x-component"
+    },
+
+    {
+        "extension": ".htm",
+        "format": "text/html"
+    },
+
+    {
+        "extension": ".html",
+        "format": "text/html"
+    },
+
+    {
+        "extension": ".htmls",
+        "format": "text/html"
+    },
+
+    {
+        "extension": ".htt",
+        "format": "text/webviewhtml"
+    },
+
+    {
+        "extension": ".htx",
+        "format": "text/html"
+    },
+
+    {
+        "extension": ".ice",
+        "format": "x-conference/x-cooltalk"
+    },
+
+    {
+        "extension": ".ico",
+        "format": "image/x-icon"
+    },
+
+    {
+        "extension": ".idc",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".ief",
+        "format": "image/ief"
+    },
+
+    {
+        "extension": ".iefs",
+        "format": "image/ief"
+    },
+
+    {
+        "extension": ".iges",
+        "format": "application/iges"
+    },
+
+    {
+        "extension": ".iges",
+        "format": "model/iges"
+    },
+
+    {
+        "extension": ".igs",
+        "format": "application/iges"
+    },
+
+    {
+        "extension": ".igs",
+        "format": "model/iges"
+    },
+
+    {
+        "extension": ".ima",
+        "format": "application/x-ima"
+    },
+
+    {
+        "extension": ".imap",
+        "format": "application/x-httpd-imap"
+    },
+
+    {
+        "extension": ".inf",
+        "format": "application/inf"
+    },
+
+    {
+        "extension": ".ins",
+        "format": "application/x-internett-signup"
+    },
+
+    {
+        "extension": ".ip",
+        "format": "application/x-ip2"
+    },
+
+    {
+        "extension": ".isu",
+        "format": "video/x-isvideo"
+    },
+
+    {
+        "extension": ".it",
+        "format": "audio/it"
+    },
+
+    {
+        "extension": ".iv",
+        "format": "application/x-inventor"
+    },
+
+    {
+        "extension": ".ivr",
+        "format": "i-world/i-vrml"
+    },
+
+    {
+        "extension": ".ivy",
+        "format": "application/x-livescreen"
+    },
+
+    {
+        "extension": ".jam",
+        "format": "audio/x-jam"
+    },
+
+    {
+        "extension": ".jav",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".jav",
+        "format": "text/x-java-source"
+    },
+
+    {
+        "extension": ".java",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".java",
+        "format": "text/x-java-source"
+    },
+
+    {
+        "extension": ".jcm",
+        "format": "application/x-java-commerce"
+    },
+
+    {
+        "extension": ".jfif",
+        "format": "image/jpeg"
+    },
+
+    {
+        "extension": ".jfif",
+        "format": "image/pjpeg"
+    },
+
+    {
+        "extension": ".jfif-tbnl",
+        "format": "image/jpeg"
+    },
+
+    {
+        "extension": ".jpe",
+        "format": "image/jpeg"
+    },
+
+    {
+        "extension": ".jpe",
+        "format": "image/pjpeg"
+    },
+
+    {
+        "extension": ".jpeg",
+        "format": "image/jpeg"
+    },
+
+    {
+        "extension": ".jpeg",
+        "format": "image/pjpeg"
+    },
+
+    {
+        "extension": ".jpg",
+        "format": "image/jpeg"
+    },
+
+    {
+        "extension": ".jpg",
+        "format": "image/pjpeg"
+    },
+
+    {
+        "extension": ".jps",
+        "format": "image/x-jps"
+    },
+
+    {
+        "extension": ".js",
+        "format": "application/x-javascript"
+    },
+
+    {
+        "extension": ".jut",
+        "format": "image/jutvision"
+    },
+
+    {
+        "extension": ".kar",
+        "format": "audio/midi"
+    },
+
+    {
+        "extension": ".kar",
+        "format": "music/x-karaoke"
+    },
+
+    {
+        "extension": ".ksh",
+        "format": "application/x-ksh"
+    },
+
+    {
+        "extension": ".ksh",
+        "format": "text/x-script.ksh"
+    },
+
+    {
+        "extension": ".la",
+        "format": "audio/nspaudio"
+    },
+
+    {
+        "extension": ".la",
+        "format": "audio/x-nspaudio"
+    },
+
+    {
+        "extension": ".lam",
+        "format": "audio/x-liveaudio"
+    },
+
+    {
+        "extension": ".latex",
+        "format": "application/x-latex"
+    },
+
+    {
+        "extension": ".lha",
+        "format": "application/lha"
+    },
+
+    {
+        "extension": ".lha",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".lha",
+        "format": "application/x-lha"
+    },
+
+    {
+        "extension": ".lhx",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".list",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".lma",
+        "format": "audio/nspaudio"
+    },
+
+    {
+        "extension": ".lma",
+        "format": "audio/x-nspaudio"
+    },
+
+    {
+        "extension": ".log",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".lsp",
+        "format": "application/x-lisp"
+    },
+
+    {
+        "extension": ".lsp",
+        "format": "text/x-script.lisp"
+    },
+
+    {
+        "extension": ".lst",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".lsx",
+        "format": "text/x-la-asf"
+    },
+
+    {
+        "extension": ".ltx",
+        "format": "application/x-latex"
+    },
+
+    {
+        "extension": ".lzh",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".lzh",
+        "format": "application/x-lzh"
+    },
+
+    {
+        "extension": ".lzx",
+        "format": "application/lzx"
+    },
+
+    {
+        "extension": ".lzx",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".lzx",
+        "format": "application/x-lzx"
+    },
+
+    {
+        "extension": ".m",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".m",
+        "format": "text/x-m"
+    },
+
+    {
+        "extension": ".m1v",
+        "format": "video/mpeg"
+    },
+
+    {
+        "extension": ".m2a",
+        "format": "audio/mpeg"
+    },
+
+    {
+        "extension": ".m2v",
+        "format": "video/mpeg"
+    },
+
+    {
+        "extension": ".m3u",
+        "format": "audio/x-mpequrl"
+    },
+
+    {
+        "extension": ".man",
+        "format": "application/x-troff-man"
+    },
+
+    {
+        "extension": ".map",
+        "format": "application/x-navimap"
+    },
+
+    {
+        "extension": ".mar",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".mbd",
+        "format": "application/mbedlet"
+    },
+
+    {
+        "extension": ".mc$",
+        "format": "application/x-magic-cap-package-1.0"
+    },
+
+    {
+        "extension": ".mcd",
+        "format": "application/mcad"
+    },
+
+    {
+        "extension": ".mcd",
+        "format": "application/x-mathcad"
+    },
+
+    {
+        "extension": ".mcf",
+        "format": "image/vasa"
+    },
+
+    {
+        "extension": ".mcf",
+        "format": "text/mcf"
+    },
+
+    {
+        "extension": ".mcp",
+        "format": "application/netmc"
+    },
+
+    {
+        "extension": ".me",
+        "format": "application/x-troff-me"
+    },
+
+    {
+        "extension": ".mht",
+        "format": "message/rfc822"
+    },
+
+    {
+        "extension": ".mhtml",
+        "format": "message/rfc822"
+    },
+
+    {
+        "extension": ".mid",
+        "format": "application/x-midi"
+    },
+
+    {
+        "extension": ".mid",
+        "format": "audio/midi"
+    },
+
+    {
+        "extension": ".mid",
+        "format": "audio/x-mid"
+    },
+
+    {
+        "extension": ".mid",
+        "format": "audio/x-midi"
+    },
+
+    {
+        "extension": ".mid",
+        "format": "music/crescendo"
+    },
+
+    {
+        "extension": ".mid",
+        "format": "x-music/x-midi"
+    },
+
+    {
+        "extension": ".midi",
+        "format": "application/x-midi"
+    },
+
+    {
+        "extension": ".midi",
+        "format": "audio/midi"
+    },
+
+    {
+        "extension": ".midi",
+        "format": "audio/x-mid"
+    },
+
+    {
+        "extension": ".midi",
+        "format": "audio/x-midi"
+    },
+
+    {
+        "extension": ".midi",
+        "format": "music/crescendo"
+    },
+
+    {
+        "extension": ".midi",
+        "format": "x-music/x-midi"
+    },
+
+    {
+        "extension": ".mif",
+        "format": "application/x-frame"
+    },
+
+    {
+        "extension": ".mif",
+        "format": "application/x-mif"
+    },
+
+    {
+        "extension": ".mime",
+        "format": "message/rfc822"
+    },
+
+    {
+        "extension": ".mime",
+        "format": "www/mime"
+    },
+
+    {
+        "extension": ".mjf",
+        "format": "audio/x-vnd.audioexplosion.mjuicemediafile"
+    },
+
+    {
+        "extension": ".mjpg",
+        "format": "video/x-motion-jpeg"
+    },
+
+    {
+        "extension": ".mm",
+        "format": "application/base64"
+    },
+
+    {
+        "extension": ".mm",
+        "format": "application/x-meme"
+    },
+
+    {
+        "extension": ".mme",
+        "format": "application/base64"
+    },
+
+    {
+        "extension": ".mod",
+        "format": "audio/mod"
+    },
+
+    {
+        "extension": ".mod",
+        "format": "audio/x-mod"
+    },
+
+    {
+        "extension": ".moov",
+        "format": "video/quicktime"
+    },
+
+    {
+        "extension": ".mov",
+        "format": "video/quicktime"
+    },
+
+    {
+        "extension": ".movie",
+        "format": "video/x-sgi-movie"
+    },
+
+    {
+        "extension": ".mp2",
+        "format": "audio/mpeg"
+    },
+
+    {
+        "extension": ".mp2",
+        "format": "audio/x-mpeg"
+    },
+
+    {
+        "extension": ".mp2",
+        "format": "video/mpeg"
+    },
+
+    {
+        "extension": ".mp2",
+        "format": "video/x-mpeg"
+    },
+
+    {
+        "extension": ".mp2",
+        "format": "video/x-mpeq2a"
+    },
+
+    {
+        "extension": ".mp3",
+        "format": "audio/mpeg3"
+    },
+
+    {
+        "extension": ".mp3",
+        "format": "audio/x-mpeg-3"
+    },
+
+    {
+        "extension": ".mp3",
+        "format": "video/mpeg"
+    },
+
+    {
+        "extension": ".mp3",
+        "format": "video/x-mpeg"
+    },
+
+    {
+        "extension": ".mpa",
+        "format": "audio/mpeg"
+    },
+
+    {
+        "extension": ".mpa",
+        "format": "video/mpeg"
+    },
+
+    {
+        "extension": ".mpc",
+        "format": "application/x-project"
+    },
+
+    {
+        "extension": ".mpe",
+        "format": "video/mpeg"
+    },
+
+    {
+        "extension": ".mpeg",
+        "format": "video/mpeg"
+    },
+
+    {
+        "extension": ".mpg",
+        "format": "audio/mpeg"
+    },
+
+    {
+        "extension": ".mpg",
+        "format": "video/mpeg"
+    },
+
+    {
+        "extension": ".mpga",
+        "format": "audio/mpeg"
+    },
+
+    {
+        "extension": ".mpp",
+        "format": "application/vnd.ms-project"
+    },
+
+    {
+        "extension": ".mpt",
+        "format": "application/x-project"
+    },
+
+    {
+        "extension": ".mpv",
+        "format": "application/x-project"
+    },
+
+    {
+        "extension": ".mpx",
+        "format": "application/x-project"
+    },
+
+    {
+        "extension": ".mrc",
+        "format": "application/marc"
+    },
+
+    {
+        "extension": ".ms",
+        "format": "application/x-troff-ms"
+    },
+
+    {
+        "extension": ".mv",
+        "format": "video/x-sgi-movie"
+    },
+
+    {
+        "extension": ".my",
+        "format": "audio/make"
+    },
+
+    {
+        "extension": ".mzz",
+        "format": "application/x-vnd.audioexplosion.mzz"
+    },
+
+    {
+        "extension": ".nap",
+        "format": "image/naplps"
+    },
+
+    {
+        "extension": ".naplps",
+        "format": "image/naplps"
+    },
+
+    {
+        "extension": ".nc",
+        "format": "application/x-netcdf"
+    },
+
+    {
+        "extension": ".ncm",
+        "format": "application/vnd.nokia.configuration-message"
+    },
+
+    {
+        "extension": ".nif",
+        "format": "image/x-niff"
+    },
+
+    {
+        "extension": ".niff",
+        "format": "image/x-niff"
+    },
+
+    {
+        "extension": ".nix",
+        "format": "application/x-mix-transfer"
+    },
+
+    {
+        "extension": ".nsc",
+        "format": "application/x-conference"
+    },
+
+    {
+        "extension": ".nvd",
+        "format": "application/x-navidoc"
+    },
+
+    {
+        "extension": ".o",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".oda",
+        "format": "application/oda"
+    },
+
+    {
+        "extension": ".omc",
+        "format": "application/x-omc"
+    },
+
+    {
+        "extension": ".omcd",
+        "format": "application/x-omcdatamaker"
+    },
+
+    {
+        "extension": ".omcr",
+        "format": "application/x-omcregerator"
+    },
+
+    {
+        "extension": ".p",
+        "format": "text/x-pascal"
+    },
+
+    {
+        "extension": ".p10",
+        "format": "application/pkcs10"
+    },
+
+    {
+        "extension": ".p10",
+        "format": "application/x-pkcs10"
+    },
+
+    {
+        "extension": ".p12",
+        "format": "application/pkcs-12"
+    },
+
+    {
+        "extension": ".p12",
+        "format": "application/x-pkcs12"
+    },
+
+    {
+        "extension": ".p7a",
+        "format": "application/x-pkcs7-signature"
+    },
+
+    {
+        "extension": ".p7c",
+        "format": "application/pkcs7-mime"
+    },
+
+    {
+        "extension": ".p7c",
+        "format": "application/x-pkcs7-mime"
+    },
+
+    {
+        "extension": ".p7m",
+        "format": "application/pkcs7-mime"
+    },
+
+    {
+        "extension": ".p7m",
+        "format": "application/x-pkcs7-mime"
+    },
+
+    {
+        "extension": ".p7r",
+        "format": "application/x-pkcs7-certreqresp"
+    },
+
+    {
+        "extension": ".p7s",
+        "format": "application/pkcs7-signature"
+    },
+
+    {
+        "extension": ".part",
+        "format": "application/pro_eng"
+    },
+
+    {
+        "extension": ".pas",
+        "format": "text/pascal"
+    },
+
+    {
+        "extension": ".pbm",
+        "format": "image/x-portable-bitmap"
+    },
+
+    {
+        "extension": ".pcl",
+        "format": "application/vnd.hp-pcl"
+    },
+
+    {
+        "extension": ".pcl",
+        "format": "application/x-pcl"
+    },
+
+    {
+        "extension": ".pct",
+        "format": "image/x-pict"
+    },
+
+    {
+        "extension": ".pcx",
+        "format": "image/x-pcx"
+    },
+
+    {
+        "extension": ".pdb",
+        "format": "chemical/x-pdb"
+    },
+
+    {
+        "extension": ".pdf",
+        "format": "application/pdf"
+    },
+
+    {
+        "extension": ".pfunk",
+        "format": "audio/make"
+    },
+
+    {
+        "extension": ".pfunk",
+        "format": "audio/make.my.funk"
+    },
+
+    {
+        "extension": ".pgm",
+        "format": "image/x-portable-graymap"
+    },
+
+    {
+        "extension": ".pgm",
+        "format": "image/x-portable-greymap"
+    },
+
+    {
+        "extension": ".pic",
+        "format": "image/pict"
+    },
+
+    {
+        "extension": ".pict",
+        "format": "image/pict"
+    },
+
+    {
+        "extension": ".pkg",
+        "format": "application/x-newton-compatible-pkg"
+    },
+
+    {
+        "extension": ".pko",
+        "format": "application/vnd.ms-pki.pko"
+    },
+
+    {
+        "extension": ".pl",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".pl",
+        "format": "text/x-script.perl"
+    },
+
+    {
+        "extension": ".plx",
+        "format": "application/x-pixclscript"
+    },
+
+    {
+        "extension": ".pm",
+        "format": "image/x-xpixmap"
+    },
+
+    {
+        "extension": ".pm",
+        "format": "text/x-script.perl-module"
+    },
+
+    {
+        "extension": ".pm4",
+        "format": "application/x-pagemaker"
+    },
+
+    {
+        "extension": ".pm5",
+        "format": "application/x-pagemaker"
+    },
+
+    {
+        "extension": ".png",
+        "format": "image/png"
+    },
+
+    {
+        "extension": ".pnm",
+        "format": "application/x-portable-anymap"
+    },
+
+    {
+        "extension": ".pnm",
+        "format": "image/x-portable-anymap"
+    },
+
+    {
+        "extension": ".pot",
+        "format": "application/mspowerpoint"
+    },
+
+    {
+        "extension": ".pot",
+        "format": "application/vnd.ms-powerpoint"
+    },
+
+    {
+        "extension": ".pov",
+        "format": "model/x-pov"
+    },
+
+    {
+        "extension": ".ppa",
+        "format": "application/vnd.ms-powerpoint"
+    },
+
+    {
+        "extension": ".ppm",
+        "format": "image/x-portable-pixmap"
+    },
+
+    {
+        "extension": ".pps",
+        "format": "application/mspowerpoint"
+    },
+
+    {
+        "extension": ".pps",
+        "format": "application/vnd.ms-powerpoint"
+    },
+
+    {
+        "extension": ".ppt",
+        "format": "application/mspowerpoint"
+    },
+
+    {
+        "extension": ".ppt",
+        "format": "application/powerpoint"
+    },
+
+    {
+        "extension": ".ppt",
+        "format": "application/vnd.ms-powerpoint"
+    },
+
+    {
+        "extension": ".ppt",
+        "format": "application/x-mspowerpoint"
+    },
+
+    {
+        "extension": ".ppz",
+        "format": "application/mspowerpoint"
+    },
+
+    {
+        "extension": ".pre",
+        "format": "application/x-freelance"
+    },
+
+    {
+        "extension": ".prt",
+        "format": "application/pro_eng"
+    },
+
+    {
+        "extension": ".ps",
+        "format": "application/postscript"
+    },
+
+    {
+        "extension": ".psd",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".pvu",
+        "format": "paleovu/x-pv"
+    },
+
+    {
+        "extension": ".pwz",
+        "format": "application/vnd.ms-powerpoint"
+    },
+
+    {
+        "extension": ".py",
+        "format": "text/x-script.phyton"
+    },
+
+    {
+        "extension": ".pyc",
+        "format": "applicaiton/x-bytecode.python"
+    },
+
+    {
+        "extension": ".qcp",
+        "format": "audio/vnd.qcelp"
+    },
+
+    {
+        "extension": ".qd3",
+        "format": "x-world/x-3dmf"
+    },
+
+    {
+        "extension": ".qif",
+        "format": "image/x-quicktime"
+    },
+
+    {
+        "extension": ".qt",
+        "format": "video/quicktime"
+    },
+
+    {
+        "extension": ".qtc",
+        "format": "video/x-qtc"
+    },
+
+    {
+        "extension": ".qti",
+        "format": "image/x-quicktime"
+    },
+
+    {
+        "extension": ".qtif",
+        "format": "image/x-quicktime"
+    },
+
+    {
+        "extension": ".ra",
+        "format": "audio/x-pn-realaudio"
+    },
+
+    {
+        "extension": ".ra",
+        "format": "audio/x-pn-realaudio-plugin"
+    },
+
+    {
+        "extension": ".ra",
+        "format": "audio/x-realaudio"
+    },
+
+    {
+        "extension": ".ram",
+        "format": "audio/x-pn-realaudio"
+    },
+
+    {
+        "extension": ".ras",
+        "format": "application/x-cmu-raster"
+    },
+
+    {
+        "extension": ".ras",
+        "format": "image/cmu-raster"
+    },
+
+    {
+        "extension": ".ras",
+        "format": "image/x-cmu-raster"
+    },
+
+    {
+        "extension": ".rast",
+        "format": "image/cmu-raster"
+    },
+
+    {
+        "extension": ".rexx",
+        "format": "text/x-script.rexx"
+    },
+
+    {
+        "extension": ".rf",
+        "format": "image/vnd.rn-realflash"
+    },
+
+    {
+        "extension": ".rgb",
+        "format": "image/x-rgb"
+    },
+
+    {
+        "extension": ".rm",
+        "format": "application/vnd.rn-realmedia"
+    },
+
+    {
+        "extension": ".rm",
+        "format": "audio/x-pn-realaudio"
+    },
+
+    {
+        "extension": ".rmi",
+        "format": "audio/mid"
+    },
+
+    {
+        "extension": ".rmm",
+        "format": "audio/x-pn-realaudio"
+    },
+
+    {
+        "extension": ".rmp",
+        "format": "audio/x-pn-realaudio"
+    },
+
+    {
+        "extension": ".rmp",
+        "format": "audio/x-pn-realaudio-plugin"
+    },
+
+    {
+        "extension": ".rng",
+        "format": "application/ringing-tones"
+    },
+
+    {
+        "extension": ".rng",
+        "format": "application/vnd.nokia.ringing-tone"
+    },
+
+    {
+        "extension": ".rnx",
+        "format": "application/vnd.rn-realplayer"
+    },
+
+    {
+        "extension": ".roff",
+        "format": "application/x-troff"
+    },
+
+    {
+        "extension": ".rp",
+        "format": "image/vnd.rn-realpix"
+    },
+
+    {
+        "extension": ".rpm",
+        "format": "audio/x-pn-realaudio-plugin"
+    },
+
+    {
+        "extension": ".rt",
+        "format": "text/richtext"
+    },
+
+    {
+        "extension": ".rt",
+        "format": "text/vnd.rn-realtext"
+    },
+
+    {
+        "extension": ".rtf",
+        "format": "application/rtf"
+    },
+
+    {
+        "extension": ".rtf",
+        "format": "application/x-rtf"
+    },
+
+    {
+        "extension": ".rtf",
+        "format": "text/richtext"
+    },
+
+    {
+        "extension": ".rtx",
+        "format": "application/rtf"
+    },
+
+    {
+        "extension": ".rtx",
+        "format": "text/richtext"
+    },
+
+    {
+        "extension": ".rv",
+        "format": "video/vnd.rn-realvideo"
+    },
+
+    {
+        "extension": ".s",
+        "format": "text/x-asm"
+    },
+
+    {
+        "extension": ".s3m",
+        "format": "audio/s3m"
+    },
+
+    {
+        "extension": ".saveme",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".sbk",
+        "format": "application/x-tbook"
+    },
+
+    {
+        "extension": ".scm",
+        "format": "application/x-lotusscreencam"
+    },
+
+    {
+        "extension": ".scm",
+        "format": "text/x-script.guile"
+    },
+
+    {
+        "extension": ".scm",
+        "format": "text/x-script.scheme"
+    },
+
+    {
+        "extension": ".scm",
+        "format": "video/x-scm"
+    },
+
+    {
+        "extension": ".sdml",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".sdp",
+        "format": "application/sdp"
+    },
+
+    {
+        "extension": ".sdp",
+        "format": "application/x-sdp"
+    },
+
+    {
+        "extension": ".sdr",
+        "format": "application/sounder"
+    },
+
+    {
+        "extension": ".sea",
+        "format": "application/sea"
+    },
+
+    {
+        "extension": ".sea",
+        "format": "application/x-sea"
+    },
+
+    {
+        "extension": ".set",
+        "format": "application/set"
+    },
+
+    {
+        "extension": ".sgm",
+        "format": "text/sgml"
+    },
+
+    {
+        "extension": ".sgm",
+        "format": "text/x-sgml"
+    },
+
+    {
+        "extension": ".sgml",
+        "format": "text/sgml"
+    },
+
+    {
+        "extension": ".sgml",
+        "format": "text/x-sgml"
+    },
+
+    {
+        "extension": ".sh",
+        "format": "application/x-bsh"
+    },
+
+    {
+        "extension": ".sh",
+        "format": "application/x-sh"
+    },
+
+    {
+        "extension": ".sh",
+        "format": "application/x-shar"
+    },
+
+    {
+        "extension": ".sh",
+        "format": "text/x-script.sh"
+    },
+
+    {
+        "extension": ".shar",
+        "format": "application/x-bsh"
+    },
+
+    {
+        "extension": ".shar",
+        "format": "application/x-shar"
+    },
+
+    {
+        "extension": ".shtml",
+        "format": "text/html"
+    },
+
+    {
+        "extension": ".shtml",
+        "format": "text/x-server-parsed-html"
+    },
+
+    {
+        "extension": ".sid",
+        "format": "audio/x-psid"
+    },
+
+    {
+        "extension": ".sit",
+        "format": "application/x-sit"
+    },
+
+    {
+        "extension": ".sit",
+        "format": "application/x-stuffit"
+    },
+
+    {
+        "extension": ".skd",
+        "format": "application/x-koan"
+    },
+
+    {
+        "extension": ".skm",
+        "format": "application/x-koan"
+    },
+
+    {
+        "extension": ".skp",
+        "format": "application/x-koan"
+    },
+
+    {
+        "extension": ".skt",
+        "format": "application/x-koan"
+    },
+
+    {
+        "extension": ".sl",
+        "format": "application/x-seelogo"
+    },
+
+    {
+        "extension": ".smi",
+        "format": "application/smil"
+    },
+
+    {
+        "extension": ".smil",
+        "format": "application/smil"
+    },
+
+    {
+        "extension": ".snd",
+        "format": "audio/basic"
+    },
+
+    {
+        "extension": ".snd",
+        "format": "audio/x-adpcm"
+    },
+
+    {
+        "extension": ".sol",
+        "format": "application/solids"
+    },
+
+    {
+        "extension": ".spc",
+        "format": "application/x-pkcs7-certificates"
+    },
+
+    {
+        "extension": ".spc",
+        "format": "text/x-speech"
+    },
+
+    {
+        "extension": ".spl",
+        "format": "application/futuresplash"
+    },
+
+    {
+        "extension": ".spr",
+        "format": "application/x-sprite"
+    },
+
+    {
+        "extension": ".sprite",
+        "format": "application/x-sprite"
+    },
+
+    {
+        "extension": ".src",
+        "format": "application/x-wais-source"
+    },
+
+    {
+        "extension": ".ssi",
+        "format": "text/x-server-parsed-html"
+    },
+
+    {
+        "extension": ".ssm",
+        "format": "application/streamingmedia"
+    },
+
+    {
+        "extension": ".sst",
+        "format": "application/vnd.ms-pki.certstore"
+    },
+
+    {
+        "extension": ".step",
+        "format": "application/step"
+    },
+
+    {
+        "extension": ".stl",
+        "format": "application/sla"
+    },
+
+    {
+        "extension": ".stl",
+        "format": "application/vnd.ms-pki.stl"
+    },
+
+    {
+        "extension": ".stl",
+        "format": "application/x-navistyle"
+    },
+
+    {
+        "extension": ".stp",
+        "format": "application/step"
+    },
+
+    {
+        "extension": ".sv4cpio",
+        "format": "application/x-sv4cpio"
+    },
+
+    {
+        "extension": ".sv4crc",
+        "format": "application/x-sv4crc"
+    },
+
+    {
+        "extension": ".svf",
+        "format": "image/vnd.dwg"
+    },
+
+    {
+        "extension": ".svf",
+        "format": "image/x-dwg"
+    },
+
+    {
+        "extension": ".svr",
+        "format": "application/x-world"
+    },
+
+    {
+        "extension": ".svr",
+        "format": "x-world/x-svr"
+    },
+
+    {
+        "extension": ".swf",
+        "format": "application/x-shockwave-flash"
+    },
+
+    {
+        "extension": ".t",
+        "format": "application/x-troff"
+    },
+
+    {
+        "extension": ".talk",
+        "format": "text/x-speech"
+    },
+
+    {
+        "extension": ".tar",
+        "format": "application/x-tar"
+    },
+
+    {
+        "extension": ".tbk",
+        "format": "application/toolbook"
+    },
+
+    {
+        "extension": ".tbk",
+        "format": "application/x-tbook"
+    },
+
+    {
+        "extension": ".tcl",
+        "format": "application/x-tcl"
+    },
+
+    {
+        "extension": ".tcl",
+        "format": "text/x-script.tcl"
+    },
+
+    {
+        "extension": ".tcsh",
+        "format": "text/x-script.tcsh"
+    },
+
+    {
+        "extension": ".tex",
+        "format": "application/x-tex"
+    },
+
+    {
+        "extension": ".texi",
+        "format": "application/x-texinfo"
+    },
+
+    {
+        "extension": ".texinfo",
+        "format": "application/x-texinfo"
+    },
+
+    {
+        "extension": ".text",
+        "format": "application/plain"
+    },
+
+    {
+        "extension": ".text",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".tgz",
+        "format": "application/gnutar"
+    },
+
+    {
+        "extension": ".tgz",
+        "format": "application/x-compressed"
+    },
+
+    {
+        "extension": ".tif",
+        "format": "image/tiff"
+    },
+
+    {
+        "extension": ".tif",
+        "format": "image/x-tiff"
+    },
+
+    {
+        "extension": ".tiff",
+        "format": "image/tiff"
+    },
+
+    {
+        "extension": ".tiff",
+        "format": "image/x-tiff"
+    },
+
+    {
+        "extension": ".tr",
+        "format": "application/x-troff"
+    },
+
+    {
+        "extension": ".tsi",
+        "format": "audio/tsp-audio"
+    },
+
+    {
+        "extension": ".tsp",
+        "format": "application/dsptype"
+    },
+
+    {
+        "extension": ".tsp",
+        "format": "audio/tsplayer"
+    },
+
+    {
+        "extension": ".tsv",
+        "format": "text/tab-separated-values"
+    },
+
+    {
+        "extension": ".turbot",
+        "format": "image/florian"
+    },
+
+    {
+        "extension": ".txt",
+        "format": "text/plain"
+    },
+
+    {
+        "extension": ".uil",
+        "format": "text/x-uil"
+    },
+
+    {
+        "extension": ".uni",
+        "format": "text/uri-list"
+    },
+
+    {
+        "extension": ".unis",
+        "format": "text/uri-list"
+    },
+
+    {
+        "extension": ".unv",
+        "format": "application/i-deas"
+    },
+
+    {
+        "extension": ".uri",
+        "format": "text/uri-list"
+    },
+
+    {
+        "extension": ".uris",
+        "format": "text/uri-list"
+    },
+
+    {
+        "extension": ".ustar",
+        "format": "application/x-ustar"
+    },
+
+    {
+        "extension": ".ustar",
+        "format": "multipart/x-ustar"
+    },
+
+    {
+        "extension": ".uu",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".uu",
+        "format": "text/x-uuencode"
+    },
+
+    {
+        "extension": ".uue",
+        "format": "text/x-uuencode"
+    },
+
+    {
+        "extension": ".vcd",
+        "format": "application/x-cdlink"
+    },
+
+    {
+        "extension": ".vcs",
+        "format": "text/x-vcalendar"
+    },
+
+    {
+        "extension": ".vda",
+        "format": "application/vda"
+    },
+
+    {
+        "extension": ".vdo",
+        "format": "video/vdo"
+    },
+
+    {
+        "extension": ".vew",
+        "format": "application/groupwise"
+    },
+
+    {
+        "extension": ".viv",
+        "format": "video/vivo"
+    },
+
+    {
+        "extension": ".viv",
+        "format": "video/vnd.vivo"
+    },
+
+    {
+        "extension": ".vivo",
+        "format": "video/vivo"
+    },
+
+    {
+        "extension": ".vivo",
+        "format": "video/vnd.vivo"
+    },
+
+    {
+        "extension": ".vmd",
+        "format": "application/vocaltec-media-desc"
+    },
+
+    {
+        "extension": ".vmf",
+        "format": "application/vocaltec-media-file"
+    },
+
+    {
+        "extension": ".voc",
+        "format": "audio/voc"
+    },
+
+    {
+        "extension": ".voc",
+        "format": "audio/x-voc"
+    },
+
+    {
+        "extension": ".vos",
+        "format": "video/vosaic"
+    },
+
+    {
+        "extension": ".vox",
+        "format": "audio/voxware"
+    },
+
+    {
+        "extension": ".vqe",
+        "format": "audio/x-twinvq-plugin"
+    },
+
+    {
+        "extension": ".vqf",
+        "format": "audio/x-twinvq"
+    },
+
+    {
+        "extension": ".vql",
+        "format": "audio/x-twinvq-plugin"
+    },
+
+    {
+        "extension": ".vrml",
+        "format": "application/x-vrml"
+    },
+
+    {
+        "extension": ".vrml",
+        "format": "model/vrml"
+    },
+
+    {
+        "extension": ".vrml",
+        "format": "x-world/x-vrml"
+    },
+
+    {
+        "extension": ".vrt",
+        "format": "x-world/x-vrt"
+    },
+
+    {
+        "extension": ".vsd",
+        "format": "application/x-visio"
+    },
+
+    {
+        "extension": ".vst",
+        "format": "application/x-visio"
+    },
+
+    {
+        "extension": ".vsw",
+        "format": "application/x-visio"
+    },
+
+    {
+        "extension": ".w60",
+        "format": "application/wordperfect6.0"
+    },
+
+    {
+        "extension": ".w61",
+        "format": "application/wordperfect6.1"
+    },
+
+    {
+        "extension": ".w6w",
+        "format": "application/msword"
+    },
+
+    {
+        "extension": ".wav",
+        "format": "audio/wav"
+    },
+
+    {
+        "extension": ".wav",
+        "format": "audio/x-wav"
+    },
+
+    {
+        "extension": ".wb1",
+        "format": "application/x-qpro"
+    },
+
+    {
+        "extension": ".wbmp",
+        "format": "image/vnd.wap.wbmp"
+    },
+
+    {
+        "extension": ".web",
+        "format": "application/vnd.xara"
+    },
+
+    {
+        "extension": ".wiz",
+        "format": "application/msword"
+    },
+
+    {
+        "extension": ".wk1",
+        "format": "application/x-123"
+    },
+
+    {
+        "extension": ".wmf",
+        "format": "windows/metafile"
+    },
+
+    {
+        "extension": ".wml",
+        "format": "text/vnd.wap.wml"
+    },
+
+    {
+        "extension": ".wmlc",
+        "format": "application/vnd.wap.wmlc"
+    },
+
+    {
+        "extension": ".wmls",
+        "format": "text/vnd.wap.wmlscript"
+    },
+
+    {
+        "extension": ".wmlsc",
+        "format": "application/vnd.wap.wmlscriptc"
+    },
+
+    {
+        "extension": ".word",
+        "format": "application/msword"
+    },
+
+    {
+        "extension": ".wp",
+        "format": "application/wordperfect"
+    },
+
+    {
+        "extension": ".wp5",
+        "format": "application/wordperfect"
+    },
+
+    {
+        "extension": ".wp5",
+        "format": "application/wordperfect6.0"
+    },
+
+    {
+        "extension": ".wp6",
+        "format": "application/wordperfect"
+    },
+
+    {
+        "extension": ".wpd",
+        "format": "application/wordperfect"
+    },
+
+    {
+        "extension": ".wpd",
+        "format": "application/x-wpwin"
+    },
+
+    {
+        "extension": ".wq1",
+        "format": "application/x-lotus"
+    },
+
+    {
+        "extension": ".wri",
+        "format": "application/mswrite"
+    },
+
+    {
+        "extension": ".wri",
+        "format": "application/x-wri"
+    },
+
+    {
+        "extension": ".wrl",
+        "format": "application/x-world"
+    },
+
+    {
+        "extension": ".wrl",
+        "format": "model/vrml"
+    },
+
+    {
+        "extension": ".wrl",
+        "format": "x-world/x-vrml"
+    },
+
+    {
+        "extension": ".wrz",
+        "format": "model/vrml"
+    },
+
+    {
+        "extension": ".wrz",
+        "format": "x-world/x-vrml"
+    },
+
+    {
+        "extension": ".wsc",
+        "format": "text/scriplet"
+    },
+
+    {
+        "extension": ".wsrc",
+        "format": "application/x-wais-source"
+    },
+
+    {
+        "extension": ".wtk",
+        "format": "application/x-wintalk"
+    },
+
+    {
+        "extension": ".xbm",
+        "format": "image/x-xbitmap"
+    },
+
+    {
+        "extension": ".xbm",
+        "format": "image/x-xbm"
+    },
+
+    {
+        "extension": ".xbm",
+        "format": "image/xbm"
+    },
+
+    {
+        "extension": ".xdr",
+        "format": "video/x-amt-demorun"
+    },
+
+    {
+        "extension": ".xgz",
+        "format": "xgl/drawing"
+    },
+
+    {
+        "extension": ".xif",
+        "format": "image/vnd.xiff"
+    },
+
+    {
+        "extension": ".xl",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xla",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xla",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xla",
+        "format": "application/x-msexcel"
+    },
+
+    {
+        "extension": ".xlb",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xlb",
+        "format": "application/vnd.ms-excel"
+    },
+
+    {
+        "extension": ".xlb",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xlc",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xlc",
+        "format": "application/vnd.ms-excel"
+    },
+
+    {
+        "extension": ".xlc",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xld",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xld",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xlk",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xlk",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xll",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xll",
+        "format": "application/vnd.ms-excel"
+    },
+
+    {
+        "extension": ".xll",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xlm",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xlm",
+        "format": "application/vnd.ms-excel"
+    },
+
+    {
+        "extension": ".xlm",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xls",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xls",
+        "format": "application/vnd.ms-excel"
+    },
+
+    {
+        "extension": ".xls",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xls",
+        "format": "application/x-msexcel"
+    },
+
+    {
+        "extension": ".xlt",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xlt",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xlv",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xlv",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xlw",
+        "format": "application/excel"
+    },
+
+    {
+        "extension": ".xlw",
+        "format": "application/vnd.ms-excel"
+    },
+
+    {
+        "extension": ".xlw",
+        "format": "application/x-excel"
+    },
+
+    {
+        "extension": ".xlw",
+        "format": "application/x-msexcel"
+    },
+
+    {
+        "extension": ".xm",
+        "format": "audio/xm"
+    },
+
+    {
+        "extension": ".xml",
+        "format": "application/xml"
+    },
+
+    {
+        "extension": ".xml",
+        "format": "text/xml"
+    },
+
+    {
+        "extension": ".xmz",
+        "format": "xgl/movie"
+    },
+
+    {
+        "extension": ".xpix",
+        "format": "application/x-vnd.ls-xpix"
+    },
+
+    {
+        "extension": ".xpm",
+        "format": "image/x-xpixmap"
+    },
+
+    {
+        "extension": ".xpm",
+        "format": "image/xpm"
+    },
+
+    {
+        "extension": ".x-png",
+        "format": "image/png"
+    },
+
+    {
+        "extension": ".xsr",
+        "format": "video/x-amt-showrun"
+    },
+
+    {
+        "extension": ".xwd",
+        "format": "image/x-xwd"
+    },
+
+    {
+        "extension": ".xwd",
+        "format": "image/x-xwindowdump"
+    },
+
+    {
+        "extension": ".xyz",
+        "format": "chemical/x-pdb"
+    },
+
+    {
+        "extension": ".z",
+        "format": "application/x-compress"
+    },
+
+    {
+        "extension": ".z",
+        "format": "application/x-compressed"
+    },
+
+    {
+        "extension": ".zip",
+        "format": "application/x-compressed"
+    },
+
+    {
+        "extension": ".zip",
+        "format": "application/x-zip-compressed"
+    },
+
+    {
+        "extension": ".zip",
+        "format": "application/zip"
+    },
+
+    {
+        "extension": ".zip",
+        "format": "multipart/x-zip"
+    },
+
+    {
+        "extension": ".zoo",
+        "format": "application/octet-stream"
+    },
+
+    {
+        "extension": ".zsh",
+        "format": "text/x-script.zsh"
+    }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/cmbepsg.json b/interface/app/data/cmbepsg.json
new file mode 100755
index 0000000..c01608c
--- /dev/null
+++ b/interface/app/data/cmbepsg.json
@@ -0,0 +1,12 @@
+{
+    "total": 2,
+    "success": true,
+    "message": "System permitted EPSG data loaded correctly",
+    "data": [
+    {
+        "name" : "EPSG:21781"      
+    },{
+        "name" : "EPSG:4326"
+    }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/cmbidentification.json b/interface/app/data/cmbidentification.json
new file mode 100755
index 0000000..7a71d72
--- /dev/null
+++ b/interface/app/data/cmbidentification.json
@@ -0,0 +1,31 @@
+{
+    "total": 6,
+    "success": true,
+    "message": "Identification data loaded correctly",
+    "data": [
+        {
+            "name": "Short Name",
+            "definition": "urn:x-ogc:def:identifier:x-istsos:1.0:shortName"
+        },
+        {
+            "name": "Long Name",
+            "definition": "urn:x-ogc:def:identifier:x-istsos:1.0:longName"
+        },
+        {
+            "name": "Manufacturer Name",
+            "definition": "urn:x-ogc:def:identifier:x-istsos:1.0:manufacturerName"
+        },
+        {
+            "name": "Model Number",
+            "definition": "urn:x-ogc:def:identifier:x-istsos:1.0:modelNumber"
+        },
+        {
+            "name": "Serial Number",
+            "definition": "urn:x-ogc:def:identifier:x-istsos:1.0:serialNumber"
+        },
+        {
+            "name": "Device ID",
+            "definition": "urn:x-ogc:def:identifier:x-istsos:1.0:deviceID"
+        }
+    ]
+}
diff --git a/interface/app/data/cmbobservedproperties.json b/interface/app/data/cmbobservedproperties.json
new file mode 100755
index 0000000..f5d6c9f
--- /dev/null
+++ b/interface/app/data/cmbobservedproperties.json
@@ -0,0 +1,19 @@
+{
+    "total": 6,
+    "success": true,
+    "message": "Phenomenon data loaded correctly",
+    "data": [
+        {
+            "name": "Fanlocu",
+            "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:temperature"
+        },
+        {
+            "name": "Conductivity",
+            "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:conductivity"
+        },
+        {
+            "name": "Pressure",
+            "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:pressure"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/cmbphenomenon.json b/interface/app/data/cmbphenomenon.json
new file mode 100755
index 0000000..6de2e3a
--- /dev/null
+++ b/interface/app/data/cmbphenomenon.json
@@ -0,0 +1,19 @@
+{
+    "total": 6,
+    "success": true,
+    "message": "Phenomenon data loaded correctly",
+    "data": [
+        {
+            "name": "Temperature",
+            "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:temperature"
+        },
+        {
+            "name": "Conductivity",
+            "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:conductivity"
+        },
+        {
+            "name": "Pressure",
+            "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:pressure"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/cmbsystemtype.json b/interface/app/data/cmbsystemtype.json
new file mode 100755
index 0000000..30c1d3b
--- /dev/null
+++ b/interface/app/data/cmbsystemtype.json
@@ -0,0 +1,13 @@
+{
+    "total": 2,
+    "success": true,
+    "message": "Data loaded correctly",
+    "data": [
+        {
+            "name": "insitu-fixed-point"
+        },
+        {
+            "name": "insitu-mobile-point"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/cmbuom.json b/interface/app/data/cmbuom.json
new file mode 100755
index 0000000..c28f51c
--- /dev/null
+++ b/interface/app/data/cmbuom.json
@@ -0,0 +1,15 @@
+{
+    "total": 6,
+    "success": true,
+    "message": "Phenomenon data loaded correctly",
+    "data": [
+        {
+            "name": "Conductivity",
+            "description": "urn:x-ogc:def:phenomenon:x-istsos:1.0:conductivity"
+        },
+        {
+            "name": "Pressure",
+            "description": "urn:x-ogc:def:phenomenon:x-istsos:1.0:pressure"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/fakeOfferings.json b/interface/app/data/fakeOfferings.json
new file mode 100755
index 0000000..d551cb1
--- /dev/null
+++ b/interface/app/data/fakeOfferings.json
@@ -0,0 +1,28 @@
+{
+    "total": 1,
+    "success": true,
+    "message": "Capabilities data loaded correctly",
+    "data": [
+        {
+            "name": "temporary",
+            "description": "descrizione 1",
+            "procedures": 31,
+            "expiration": "31.01.2012",
+            "active": true
+        },
+        {
+            "name": "raifall",
+            "description": "descrizione 2",
+            "procedures": 4,
+            "expiration": "31.01.2012",
+            "active": false
+        },
+        {
+            "name": "temperature",
+            "description": "descrizione 3",
+            "procedures": 12,
+            "expiration": "31.01.2012",
+            "active": true
+        }
+    ]
+}
\ No newline at end of file
diff --git a/interface/app/data/procedure.json b/interface/app/data/procedure.json
new file mode 100755
index 0000000..a2728ac
--- /dev/null
+++ b/interface/app/data/procedure.json
@@ -0,0 +1,146 @@
+{
+    "total": 1,
+    "success": true,
+    "message": "Capabilities data loaded correctly",
+    "data": {
+        "system_id": "P_TRE",
+        "system": "P_TRE",
+        "description": "ciao",
+        "keywords": "uno,due,tre",
+        "identification": [
+        {
+            "name": "Serial Number",
+            "description": "",
+            "definition": "urn:x-ogc:def:identifier:x-istsos:1.0:serialNumber",
+            "uom": "",
+            "value": "TS-12349"
+        },
+        {
+            "name": "Long Name",
+            "description": "",
+            "definition": "urn:x-ogc:def:identifier:x-istsos:1.0:longName",
+            "uom": "",
+            "value": "nome lungo"
+        }
+        ],
+        "classification": [
+        {
+            "name": "System Type",
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType",
+            "value": "insitu-fixed-point"
+        },
+        {
+            "name": "Sensor Type",
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType",
+            "value": "bukket"
+        }
+        ],
+        "characteristics": "http://www.gafi.org/tetet",
+        "contacts": [
+        {
+            "role": "urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:owner",
+            "organizationName": "Pippo SA",
+            "individualName": "",
+            "voice": "",
+            "fax": "",
+            "email": "",
+            "web": "",
+            "deliveryPoint": "",
+            "city": "",
+            "administrativeArea": "",
+            "postalcode": ""
+        },
+        {
+            "role": "urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:manufacturer",
+            "organizationName": "SUPSI",
+            "individualName": "Maurizio Pozzoni",
+            "voice": "blablabla",
+            "fax": "091123456",
+            "email": "091123457",
+            "web": "http://www.figabagnata.org",
+            "deliveryPoint": "blabla",
+            "city": "blablabla",
+            "administrativeArea": "blabla",
+            "postalcode": "6900"
+        },
+        {
+            "role": "urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:operator",
+            "organizationName": "Paperino",
+            "individualName": "bla",
+            "voice": "bla",
+            "fax": "bla",
+            "email": "bla",
+            "web": "",
+            "deliveryPoint": "",
+            "city": "",
+            "administrativeArea": "",
+            "postalcode": ""
+        }
+        ],
+        "documentation": [
+        {
+            "description": "Documentation blablablabla",
+            "format": "text/html",
+            "date": "04/18/2012",
+            "link": "http://www.fififif.org/blabla",
+            "name": "",
+            "value": "",
+            "definition": ""
+        },
+        {
+            "description": "Documentation huhuhuhu",
+            "format": "text/html",
+            "date": "04/18/2011",
+            "link": "http://www.gugugu.org/blabla",
+            "name": "",
+            "value": "",
+            "definition": ""
+        }
+        ],
+        "location": {
+            "type": "Feature",
+            "geometry": {
+                "type": "Point",
+                "coordinates": [
+                "123",
+                "456"
+                ]
+            },
+            "crs": {
+                "type": "name",
+                "properties": {
+                    "name": "EPSG:21781"
+                }
+            },
+            "properties": {
+                "name": "LUGANO"
+            }
+        },
+        "interfaces": "RS-232,IR",
+        "inputs": [
+        {
+            "name": "Temperature",
+            "description": "temperatura",
+            "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:temperature",
+            "uom": "",
+            "value": ""
+        }
+        ],
+        "outputs": [
+        {
+            "name": "Conductivity",
+            "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:conductivity",
+            "uom": "Pressure",
+            "description": "miao",
+            "constraint": {
+                "role": "urn:x-ogc:def:classifiers:x-istsos:1.0:qualityIndexCheck:level0",
+                "interval": [
+                "12",
+                "65"
+                ]
+            }
+        }
+        ],
+        "history" : []
+    }
+}
\ No newline at end of file
diff --git a/interface/app/engine/pageConfig.js b/interface/app/engine/pageConfig.js
new file mode 100755
index 0000000..40c3946
--- /dev/null
+++ b/interface/app/engine/pageConfig.js
@@ -0,0 +1,377 @@
+Ext.ns("istsos","istsos.engine");
+
+/*
+    istFunction: {
+        onLoad: "operationPost",
+        onSubmit: "operationPost"
+    },
+    istOperation: {
+        restUrl: wa.url + "/istsos/services",
+        onLoadMethod: "GET",
+        onSubmitMethod: "PUT"
+    }
+*/
+
+istsos.EMPTY = "EMPTY";
+istsos.SUBMIT = "SUBMIT";
+// execute a next page operation without executing any other service operation
+istsos.WIZARD_JUST_NEXT = "WIZARD_JUST_NEXT"; 
+istsos.WIZARD = "WIZARD";
+istsos.WIZARD_NEXT_FINISH = "WIZARD_NEXT_FINISH";
+istsos.WIZARD_FINISH = "WIZARD_FINISH";
+
+istsos.engine.serviceConfig = {
+    "Service Settings": {
+        "Database": {
+            istTitle: "Database",
+            icon: 'database.svg',
+            istBody: ["istsos.view.database"],
+            istOperation: wa.url + "/istsos/services/@/configsections/connection",
+            istFooter: istsos.SUBMIT
+        },
+        "Service provider": {
+            istTitle: "Service provider",
+            icon: 'provider.svg',
+            istBody: ["istsos.view.provider"],
+            istOperation: wa.url + "/istsos/services/@/configsections/provider",
+            istFooter: istsos.SUBMIT
+        },
+        "Service identification": {
+            istTitle: "Service identification",
+            icon: 'contacts.svg',
+            istBody: ["istsos.view.identification"],
+            istOperation: wa.url + "/istsos/services/@/configsections/identification",
+            istFooter: istsos.SUBMIT
+        },
+        "Coordinates system": {
+            istTitle: "Coordinates",
+            icon: 'coordinate.svg',
+            istBody: ["istsos.view.geo"],
+            istOperation: wa.url + "/istsos/services/@/configsections/geo",
+            istFooter: istsos.SUBMIT
+        },
+        "GetObservation Configuration": {
+            istTitle: "GetObservation Configuration",
+            icon: 'getobs.svg',
+            istBody: ["istsos.view.getobservation"],
+            istOperation: wa.url + "/istsos/services/@/configsections/getobservation",
+            istFooter: istsos.SUBMIT
+        },
+        "Proxy Configuration": {
+            istTitle: "Proxy Configuration",
+            icon: 'proxy.svg',
+            istBody: ["istsos.view.serviceurl"],
+            istOperation: wa.url + "/istsos/services/@/configsections/serviceurl",
+            istFooter: istsos.SUBMIT
+        }
+    },
+    "Wizards": {
+        "Offerings": {
+            istTitle: "Offerings editor",
+            icon: 'offerings.svg',
+            istBody: ["istsos.view.offeringsEditor"],
+            istFunction: {
+                onLoad: "operationLoad"
+            },
+            istFooter: istsos.EMPTY
+        },
+        "Procedures": {
+            istTitle: "Procedures",
+            icon: 'system-run.svg',
+            istDescription: "Click on procedure name to edit",
+            istBody: ["istsos.view.proceduresList"],
+            istFunction: {
+                onLoad: "operationLoad"
+            },
+            istFooter: istsos.EMPTY
+        },
+        "Virtual Procedures": {
+            istTitle: "Virtual Procedures",
+            icon: 'virtual.svg',
+            istBody: ["istsos.view.VirtualProcedureEditor"],
+            wapage: 'MainCenter',
+            istFooter: istsos.EMPTY
+        },
+        "New procedure": {
+            istTitle: "New procedure",
+            icon: 'new_service.svg',
+            istBody: ["istsos.view.procedure"],
+            istFunction: {
+                onSubmit: "executePost"
+            },
+            istFooter: istsos.SUBMIT
+        },
+        "Observed properties": {
+            istTitle: "Observed properties",
+            icon: 'observedProperties.svg',
+            istBody: ["istsos.view.obsPropEditor"],
+            istFunction: {
+                onLoad: "operationLoad"
+            },
+            istFooter: istsos.EMPTY
+        },
+        "Units of measures": {
+            istTitle: "Units of measures",
+            icon: 'unit.svg',
+            istBody: ["istsos.view.uomsEditor"],
+            istFunction: {
+                onLoad: "operationLoad"
+            },
+            istFooter: istsos.EMPTY
+        },
+        "Data quality": {
+            istTitle: "Data quality",
+            icon: 'quality_index.svg',
+            istBody: ["istsos.view.qualityindexEditor"],
+            istFunction: {
+                onLoad: "operationLoad"
+            },
+            istFooter: istsos.EMPTY
+        }
+    }
+}
+
+istsos.engine.defaultConfig = {
+    "Server": {
+        "About istSOS": {
+            istTitle: "About istSOS",
+            icon: 'about_grey.svg',
+            istBody: ["istsos.view.about"],
+            istFunction: {
+                onLoad: "operationLoad"
+            },
+            istOperation: wa.url + "/istsos/operations/about",
+            istFooter: istsos.EMPTY
+        },
+        "Status": {
+            istTitle: "Server Status",
+            istDefault: "defaultPage",
+            icon: 'status_1.svg',
+            istDescription: "Summary of istSOS instances and run-time status",
+            istBody: ["istsos.view.status"],
+            istFunction: {
+                onLoad: "operationLoad"
+            },
+            istFooter: istsos.EMPTY
+        }
+        /*"Logs": {
+            istTitle: "Server Logs",
+            icon: 'emblem-shared.svg',
+            istBody: "<p><STRONG>Logs:</STRONG></p>",
+            istFooter: istsos.EMPTY
+        },*/
+    },
+    "Default Settings": {
+        "Database": {
+            istTitle: "Database",
+            icon: 'database.svg',
+            istBody: ["istsos.view.database"],
+            istOperation: wa.url + "/istsos/services/default/configsections/connection",
+            istFooter: istsos.SUBMIT
+        },
+        "Service provider": {
+            istTitle: "Service provider",
+            icon: 'provider.svg',
+            istBody: ["istsos.view.provider"],
+            istOperation: wa.url + "/istsos/services/default/configsections/provider",
+            istFooter: istsos.SUBMIT
+        },
+        "Service identification": {
+            istTitle: "Service identification",
+            icon: 'contacts.svg',
+            istBody: ["istsos.view.identification"],
+            istOperation: wa.url + "/istsos/services/default/configsections/identification",
+            istFooter: istsos.SUBMIT
+        },
+        "Coordinates system": {
+            istTitle: "Contacts",
+            icon: 'coordinate.svg',
+            istBody: ["istsos.view.geo"],
+            istOperation: wa.url + "/istsos/services/default/configsections/geo",
+            istFooter: istsos.SUBMIT
+        },
+        "GetObservation Configuration": {
+            istTitle: "GetObservation Configuration",
+            icon: 'getobs.svg',
+            istBody: ["istsos.view.getobservation"],
+            istOperation: wa.url + "/istsos/services/default/configsections/getobservation",
+            istFooter: istsos.SUBMIT
+        },
+        "Proxy Configuration": {
+            istTitle: "Proxy Configuration",
+            icon: 'proxy.svg',
+            istBody: ["istsos.view.serviceurl"],
+            istOperation: wa.url + "/istsos/services/default/configsections/serviceurl",
+            istFooter: istsos.SUBMIT
+        }
+    },
+    "Wizards": {
+        "New service": {
+            istTitle: "New service",
+            icon: 'new_service.svg',
+            wizardName: "newservice",
+            wapage: 'WizardPage',
+            istFooter: istsos.EMPTY
+        },
+        "Delete service": {
+            istTitle: "Delete service",
+            icon: 'delete2.svg',
+            istBody: ["istsos.view.serviceEditor"],
+            istFunction: {
+                onLoad: "operationLoad"
+            },
+            istFooter: istsos.EMPTY
+        }
+    }
+};
+
+istsos.engine.observationConfig = {
+    "Services": {
+        "Data Editor": {
+            istTitle: "Data Editor",
+            icon: 'editor.svg',
+            istBody: ["istsos.view.Editor1"],
+            wapage: 'MainCenter',
+            istFooter: istsos.EMPTY
+        }
+    }
+}
+
+istsos.engine.pageWizard = {
+    "initialization": {
+        "Welcome": {
+            istTitle: "Welcome",
+            istDescription: "Hi,<br>istSOS manager needs some configuration before running correctly",
+            istBody: "Please follow the setup instruction to start using the formidable istSOS manager!!.",
+            istFooter: istsos.WIZARD_JUST_NEXT
+        },
+        "defaultDatabase": {
+            istTitle: "Default database connection",
+            istDescription: "Fill the parameter required to connect to your database:<br><br>" + 
+            "If the database name does not exist this procedure will create a " +
+            "new one and then it will be used to store istSOS data and " + 
+            "configuration for each service instance.",
+            istBody: ["istsos.view.database"],
+            istOperation: {
+                restUrl: wa.url + "/istsos/services/@/configsections/connection",
+                onSubmitMethod: "PUT"
+            },
+            istFooter: istsos.WIZARD_NEXT_FINISH
+        },
+        "defaultProvider": {
+            istTitle: "Default Service Provider",
+            istDescription: "Please fill the following parameters.",
+            istBody: ["istsos.view.provider"],
+            istOperation: {
+                restUrl: wa.url + "/istsos/services/default/configsections/provider",
+                onSubmitMethod: "PUT"
+            },
+            istFooter: istsos.WIZARD
+        },
+        "defaultIdentification": {
+            istTitle: "Default Service Identification",
+            istDescription: "Please fill the following parameters:<br><ul>" +
+            "<li>istSOS library path: this is the folder where...</li>"+
+            "</ul>",
+            istBody: ["istsos.view.identification"],
+            istOperation: {
+                restUrl: wa.url + "/istsos/services/default/configsections/identification",
+                onSubmitMethod: "PUT"
+            },
+            istFooter: istsos.WIZARD
+        },
+        "defaultCoordinates": {
+            istTitle: "Default Coordinates system",
+            istDescription: "Please fill the following parameters:<br><ul>" +
+            "<li>istSOS library path: this is the folder where...</li>"+
+            "</ul>",
+            istBody: ["istsos.view.geo"],
+            istOperation: {
+                restUrl: wa.url + "/istsos/services/default/configsections/geo",
+                onSubmitMethod: "PUT"
+            },
+            istFooter: istsos.WIZARD
+        },
+        "defaultGetobservation": {
+            istTitle: "Default GetObservation Configuration",
+            istDescription: "Please fill the following parameters:<br><ul>" +
+            "<li>istSOS library path: this is the folder where...</li>"+
+            "</ul>",
+            istBody: ["istsos.view.getobservation"],
+            istOperation: {
+                restUrl: wa.url + "/istsos/services/default/configsections/getobservation",
+                onSubmitMethod: "PUT"
+            },
+            istFooter: istsos.WIZARD
+        },
+        "newServiceWizard": {
+            istTitle: "Initialize a new service",
+            istDescription: "This proceduce will guide you in each step needed to configure a new Sensor Observation Service.",
+            istBody: "Please follow the setup instruction to start using it.",
+            istFooter: istsos.WIZARD_JUST_NEXT
+        },
+        "newServiceName": {
+            istTitle: "Initialize a new service",
+            istDescription: "This proceduce will guide you in each step needed to configure a new Sensor Observation Service.",
+            istBody: ["istsos.view.newservice"],
+            istFunction: {
+                onLoad: "operationLoad",
+                onSubmit: "operationPost"
+            },
+            istBodyOnSubmit: "test",
+            istFooter: istsos.WIZARD
+        },
+        "newServicePersonalization": {
+            istTitle: "Service personalization",
+            istDescription: "Now you can personalize this istSOS instance otherwise the default server setting will be used.",
+            istBody: ["istsos.view.serviceconfig"],
+            istFunction: {
+                onLoad: "operationLoad",
+                onSubmit: "operationPost"
+            },
+            istFooter: istsos.WIZARD
+        },
+        "newServiceComplete": {
+            istTitle: "Configuration complete",
+            istDescription: "Now you are able to use your istSOS.",
+            istFooter: istsos.WIZARD_FINISH
+        }
+    },
+    "newservice": {
+        "newServiceWizard": {
+            istTitle: "Initialize a new service",
+            istDescription: "This proceduce will guide you in each step needed to configure a new Sensor Observation Service.",
+            istBody: "Please follow the setup instruction to start using it.",
+            istFooter: istsos.WIZARD_JUST_NEXT
+        },
+        "newServiceName": {
+            istTitle: "Initialize a new service",
+            istDescription: "This proceduce will guide you in each step needed to configure a new Sensor Observation Service.",
+            istBody: ["istsos.view.newservice"],
+            istFunction: {
+                onLoad: "operationLoad",
+                onSubmit: "operationPost"
+            },
+            istBodyOnSubmit: "test",
+            istFooter: istsos.WIZARD
+        },
+        "newServicePersonalization": {
+            istTitle: "Service personalization",
+            istDescription: "Now you can personalize this istSOS instance otherwise the default server setting will be used.",
+            istBody: ["istsos.view.serviceconfig"],
+            istFunction: {
+                onLoad: "operationLoad",
+                onSubmit: "operationPost"
+            },
+            istFooter: istsos.WIZARD
+        },
+        "newServiceComplete": {
+            istTitle: "Configuration complete",
+            istDescription: "Now you are able to use your istSOS.",
+            /*istFunction: {
+                onSubmit: "finish"
+            },*/
+            istFooter: istsos.WIZARD_FINISH
+        }
+    }
+};
diff --git a/interface/app/engine/pageManager.js b/interface/app/engine/pageManager.js
new file mode 100755
index 0000000..b473607
--- /dev/null
+++ b/interface/app/engine/pageManager.js
@@ -0,0 +1,217 @@
+Ext.ns("istsos","istsos.engine","istsos.engine.pageManager");
+
+// Create the default configuration menu in html
+istsos.engine.pageManager.getMenuHtml = function(){
+    var htmlMenu = "";
+    for (var h in istsos.engine.defaultConfig){
+        htmlMenu += "<div class='menuHead'>"+h+"</div>";
+        for (var l in istsos.engine.defaultConfig[h]){
+            htmlMenu += "<div class='menuLink' id='menuLink_"+ l + 
+            "' onClick='istsos.engine.pageManager.menuClick(\"menuLink_"+l+"\",\"default\");'>"+l+"</div>";
+        }
+        htmlMenu += "<br>";
+    }
+    return htmlMenu;
+}
+
+// Create the items representing the services menu
+istsos.engine.pageManager.getServicesMenu = function(serviceJson){
+    var ret = [];
+    for (var i = 0; i < serviceJson.total; i++) {
+        var data = serviceJson.data[i];
+        var htmlMenu = "";
+        for (var h in istsos.engine.serviceConfig){
+            htmlMenu += "<div class='menuHead'>"+h+"</div>";
+            for (var l in istsos.engine.serviceConfig[h]){
+                htmlMenu += "<div class='menuLink' id='menuLink_"+l+"' onClick='istsos.engine.pageManager.menuClick(\"menuLink_"+l+"\",\""+data.service+"\");'>"+l+"</div>";
+            }
+            htmlMenu += "<br>";
+        }
+        ret.push(Ext.create('Ext.Panel', {
+            title: data.service,
+            html: htmlMenu,
+            bodyPadding: "6px"
+        }));
+    }
+    return ret;
+}
+
+// Menu styling
+istsos.engine.pageManager.resetMenuHtml = function(){
+    // Reset style on other menu links
+    for (var h in istsos.engine.defaultConfig){
+        for (var l in istsos.engine.defaultConfig[h]){
+            var el = Ext.get("menuLink_"+l);
+            el.setStyle("color", "green");
+        }
+    }
+}
+
+istsos.engine.pageManager.getMenuConfig = function(menuLink, config) {
+    for (var h in config){
+        for (var l in config[h]){
+            if ("menuLink_"+l == menuLink) {
+                return config[h][l];
+            }
+        }
+    }
+    throw "Menu configuration object not found: " + menuLink;
+}
+
+istsos.engine.pageManager.getWizardConfig = function(wizardName) {
+    if (!Ext.isEmpty(istsos.engine.pageWizard[wizardName])) {
+        return istsos.engine.pageWizard[wizardName];
+    }
+    throw "Wizard configuration object not found: " + wizardName;
+}
+
+istsos.engine.pageManager.menuClick = function (menuLinkId, istService){
+    var conf = null;
+    if (istService != undefined) {
+        if (istService=="default") {
+            conf = Ext.apply({},istsos.engine.pageManager.getMenuConfig(
+                menuLinkId, istsos.engine.defaultConfig));
+        } else {
+            conf = Ext.apply({},istsos.engine.pageManager.getMenuConfig(
+                menuLinkId, istsos.engine.serviceConfig));
+        }
+        var url;
+        if (Ext.isObject(conf.istOperation)) {
+            url = conf.istOperation.restUrl;
+            if (url.indexOf("@")>0) {
+                conf.istOperation.restUrl = url.replace("@", istService);
+            }
+        }else if (Ext.isString(conf.istOperation)) {
+            url = conf.istOperation;
+            if (url.indexOf("@")>0) {
+                conf.istOperation = url.replace("@", istService);
+            }
+        }
+        Ext.apply(conf,{
+            istService: istService
+        });
+    }
+    istsos.engine.pageManager.openPage(conf);
+}
+
+istsos.engine.pageManager.openPage = function (conf){
+    // Loading page content
+    var mainCenter = Ext.getCmp("mainCenter");
+    mainCenter.removeAll(true);
+    try{
+        var page;
+        if (!Ext.isEmpty(conf['wapage']) && conf['wapage'] == 'MainCenter') {
+            page = Ext.create(conf.istBody[0],Ext.apply({
+                flex: 1 //,padding: 16
+            },conf)); 
+        }else{
+            page = Ext.create('istsos.view.ui.CenterPage',Ext.apply({},conf));
+        }
+        //var page = Ext.create('istsos.view.ui.CenterPage',Ext.apply({},conf));
+        mainCenter.add(page);
+    }catch(e){
+        console.error(e);
+        alert("Page does not exist ["+e+"]");
+        return;
+    }
+};
+istsos.engine.pageManager.openWaPage = function (conf){
+    var mainCenter = Ext.getCmp("mainCenter");
+    mainCenter.removeAll(true);
+    try{
+        var page = null;
+        if (Ext.isEmpty(conf['wapage']) || conf['wapage'] == "CenterPage" ) {
+            page = Ext.create('istsos.view.ui.CenterPage',Ext.apply({},conf));
+        } else if (conf['wapage'] == 'WizardPage') {
+            page = Ext.create('istsos.view.ui.WizardPage',{
+                istConfig: istsos.engine.pageManager.getWizardConfig(conf['wizardName']) 
+            },{
+                istWizard: conf['wizardName'],
+                istService: conf['istService']
+            });
+        } else if (conf['wapage'] == 'MainCenter') {
+            if(Ext.isArray(conf.istBody)){
+                if(conf.istBody.length==1){
+                    page = Ext.create(conf.istBody[0],{
+                        flex: 1 //,padding: 16
+                    });  
+                }
+            }
+        } else{
+            return;
+        }
+        mainCenter.add(page);
+    }catch(e){
+        console.error(e);
+        alert("Page does not exist ["+e+"]");
+        return;
+    }
+};
+
+istsos.engine.pageManager.openWizard = function(wizardName, istService){
+    var mainCenter = Ext.getCmp("mainCenter");
+    mainCenter.removeAll(true);
+    try{
+        var conf = null;
+        var page = null;
+        if (istService != undefined) {
+            page = Ext.create('istsos.view.ui.WizardPage',{
+                istConfig: istsos.engine.pageManager.getWizardConfig(wizardName) 
+            },{
+                istWizard: wizardName,
+                istService: istService
+            });
+        } else {
+            page = Ext.create('istsos.view.ui.WizardPage',{
+                istWizard: wizardName,
+                istConfig: istsos.engine.pageManager.getWizardConfig(wizardName) 
+            });
+        }
+        mainCenter.add(page);
+    }catch(e){
+        console.error(e);
+        alert("Page does not exist ["+e+"]");
+        return;
+    }
+};
+
+
+istsos.engine.pageManager.initConfigForm = function (panel) {
+    
+    var waUrl = wa.url;
+    if (!Ext.isEmpty(panel.istService)) {
+        waUrl += "/"+panel.istService;
+    }
+    waUrl += "/"+panel.istOperation;
+    panel.waurl = waUrl;
+    
+    panel.on("afterrender",function(cmp, eOpts){
+        
+        if (Ext.isEmpty(cmp.mask)) {
+            cmp.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        cmp.mask.show();
+        
+        Ext.Ajax.request({
+            url: cmp.waurl,
+            scope: cmp,
+            method: 'GET',
+            success: function(response){
+                try {
+                    var json = Ext.decode(response.responseText);
+                    if (json['message']) {
+                        Ext.getCmp('messageField').setVisible(true);
+                        json['data']['message']=json['message']
+                    }
+                    this.loadRecord(json);
+                } catch (exception) {
+                    console.error(exception);
+                }
+                this.mask.hide();
+            }
+        });
+        
+    });
+};
diff --git a/interface/app/engine/wa.js b/interface/app/engine/wa.js
new file mode 100755
index 0000000..b13d85f
--- /dev/null
+++ b/interface/app/engine/wa.js
@@ -0,0 +1,95 @@
+wa = {};
+wa.isodef = "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601";
+wa.url = "../wa";
+
+wa.createPath = function(){
+    var waUrl = wa.url;
+    for (var i = 0; i < arguments.length; i++) {
+        if (Ext.isObject(arguments[i])){
+            if (!Ext.isEmpty(arguments[i].istService)) {
+                waUrl += "/"+arguments[i].istService;
+            }
+        }else{
+            waUrl += "/"+arguments[i];
+        }
+    }
+    return waUrl;
+}
+
+/**
+ * arguments: FormPanel object, service name [optional], operation name
+ */
+wa.initConfigForm = function () {
+    
+    var waUrl = wa.url;
+    for (var i = 0; i < arguments.length; i++) {
+        if (Ext.isObject(arguments[i])){
+            if (!Ext.isEmpty(arguments[i].istService)) {
+                waUrl += "/"+arguments[i].istService;
+            }
+        }else{
+            waUrl += "/"+arguments[i];
+        }
+    }
+    
+    arguments[0].waurl = waUrl;
+    
+    arguments[0].on("afterlayout",function(cmp, eOpts){
+        if (Ext.isEmpty(cmp.mask)) {
+            cmp.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        cmp.mask.show();
+    });
+    
+    arguments[0].on("afterrender",function(cmp, eOpts){
+        Ext.Ajax.request({
+            url: cmp.waurl,
+            scope: cmp,
+            method: 'GET',
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json['message']) {
+                    Ext.getCmp('messageField').setVisible(true);
+                    json['data']['message']=json['message']
+                }
+                this.loadRecord(json);
+                this.mask.hide();
+            }
+        });
+    //wa.initConfigSubmit(cmp);
+        
+    });
+}
+
+wa.initConfigSubmit = function (panel){
+    Ext.getCmp('configsubmit').on("click",function(){
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        var json = this.getValues();
+        Ext.Ajax.request({
+            url: this.waurl,
+            scope: this,
+            method: 'POST',
+            jsonData: json,
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (!json.success && !Ext.isEmpty(json.message)) {
+                    Ext.Msg.alert('Warning', json['message']);
+                }else if (json.success && !Ext.isEmpty(json.message)) {
+                    Ext.getCmp('messageField').setVisible(true);
+                    json['data']['message']=json['message']
+                }else{
+                    Ext.getCmp('messageField').setVisible(false);
+                }
+                this.loadRecord(json);
+                this.mask.hide();
+            }
+        });
+    },panel);
+}
diff --git a/interface/app/store/Constraint.js b/interface/app/store/Constraint.js
new file mode 100755
index 0000000..64e25cf
--- /dev/null
+++ b/interface/app/store/Constraint.js
@@ -0,0 +1,61 @@
+/*
+ * File: app/store/Constraint.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.Constraint', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'constraint',
+            data: [
+                {
+                    name: ' -- ',
+                    'value': 0
+                },
+                {
+                    'name': 'Greater then',
+                    'value': 1
+                },
+                {
+                    'name': 'Less then',
+                    'value': 2
+                },
+                {
+                    'name': 'Between',
+                    'value': 3
+                },
+                {
+                    'name': 'Value list',
+                    'value': 4
+                },
+                
+            ],
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name'
+                },
+                {
+                    name: 'value'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/DataQualityStore.js b/interface/app/store/DataQualityStore.js
new file mode 100755
index 0000000..4ec2b86
--- /dev/null
+++ b/interface/app/store/DataQualityStore.js
@@ -0,0 +1,41 @@
+/*
+ * File: app/store/DataQualityStore.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.DataQualityStore', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'dataQualityStore',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name'
+                },
+                {
+                    name: 'code'
+                },
+                {
+                    name: 'description'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/Fake.js b/interface/app/store/Fake.js
new file mode 100755
index 0000000..66408e9
--- /dev/null
+++ b/interface/app/store/Fake.js
@@ -0,0 +1,42 @@
+/*
+ * File: app/store/Fake.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.Fake', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'fake',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name'
+                },
+                {
+                    name: 'value'
+                },
+                {
+                    name: 'definition',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/MyArrayStore.js b/interface/app/store/MyArrayStore.js
new file mode 100755
index 0000000..d52edb1
--- /dev/null
+++ b/interface/app/store/MyArrayStore.js
@@ -0,0 +1,30 @@
+/*
+ * File: app/store/MyArrayStore.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.MyArrayStore', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'MyArrayStore',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'array',
+                    idProperty: 'xx'
+                }
+            }
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/Observations.js b/interface/app/store/Observations.js
new file mode 100755
index 0000000..61f6b8e
--- /dev/null
+++ b/interface/app/store/Observations.js
@@ -0,0 +1,43 @@
+/*
+ * File: app/store/Observations.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.Observations', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'observations',
+            proxy: {
+                type: 'ajax',
+                url: 'data/observations.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'isodate',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    dateFormat: 'c',
+                    name: 'isodate',
+                    type: 'date'
+                },
+                {
+                    name: 'value',
+                    type: 'float'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/ObservedProperties.js b/interface/app/store/ObservedProperties.js
new file mode 100755
index 0000000..544d2a6
--- /dev/null
+++ b/interface/app/store/ObservedProperties.js
@@ -0,0 +1,50 @@
+/*
+ * File: app/store/ObservedProperties.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.ObservedProperties', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'observedproperties',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    messageProperty: 'message',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                },
+                {
+                    name: 'uom',
+                    type: 'string'
+                },
+                {
+                    name: 'definition',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/Offerings.js b/interface/app/store/Offerings.js
new file mode 100755
index 0000000..1e5e9cc
--- /dev/null
+++ b/interface/app/store/Offerings.js
@@ -0,0 +1,43 @@
+/*
+ * File: app/store/Offerings.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.Offerings', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'offerings',
+            proxy: {
+                type: 'ajax',
+                url: 'data/offerings.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'name',
+                    messageProperty: 'message',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/Procedures.js b/interface/app/store/Procedures.js
new file mode 100755
index 0000000..5276397
--- /dev/null
+++ b/interface/app/store/Procedures.js
@@ -0,0 +1,42 @@
+/*
+ * File: app/store/Procedures.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.Procedures', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'procedures',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    idProperty: 'name',
+                    messageProperty: 'message',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/RatingCurve.js b/interface/app/store/RatingCurve.js
new file mode 100755
index 0000000..9f95da2
--- /dev/null
+++ b/interface/app/store/RatingCurve.js
@@ -0,0 +1,63 @@
+/*
+ * File: app/store/RatingCurve.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.RatingCurve', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'ratingcurve',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json'
+                }
+            },
+            fields: [
+                {
+                    name: 'from',
+                    type: 'date'
+                },
+                {
+                    name: 'to',
+                    type: 'date'
+                },
+                {
+                    name: 'low_val',
+                    type: 'float'
+                },
+                {
+                    name: 'up_val',
+                    type: 'float'
+                },
+                {
+                    name: 'A',
+                    type: 'float'
+                },
+                {
+                    name: 'B',
+                    type: 'float'
+                },
+                {
+                    name: 'C',
+                    type: 'float'
+                },
+                {
+                    name: 'K',
+                    type: 'float'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/Services.js b/interface/app/store/Services.js
new file mode 100755
index 0000000..79a3a36
--- /dev/null
+++ b/interface/app/store/Services.js
@@ -0,0 +1,42 @@
+/*
+ * File: app/store/Services.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.Services', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'storeServices',
+            proxy: {
+                type: 'ajax',
+                url: '/istsos/wa/istsos/services',
+                reader: {
+                    type: 'json',
+                    idProperty: 'service',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'service',
+                    type: 'string'
+                },
+                {
+                    name: 'path',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/cmbDocumentFormat.js b/interface/app/store/cmbDocumentFormat.js
new file mode 100755
index 0000000..e7931ec
--- /dev/null
+++ b/interface/app/store/cmbDocumentFormat.js
@@ -0,0 +1,42 @@
+/*
+ * File: app/store/cmbDocumentFormat.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.cmbDocumentFormat', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'cmbdocumentformat',
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbdocumentformat.json',
+                reader: {
+                    type: 'json',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'extension',
+                    type: 'string'
+                },
+                {
+                    name: 'format',
+                    sortType: 'asText',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/cmbIdentification.js b/interface/app/store/cmbIdentification.js
new file mode 100755
index 0000000..9649b1c
--- /dev/null
+++ b/interface/app/store/cmbIdentification.js
@@ -0,0 +1,42 @@
+/*
+ * File: app/store/cmbIdentification.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.cmbIdentification', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'identification',
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbIdentification.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'definition',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/cmbName.js b/interface/app/store/cmbName.js
new file mode 100755
index 0000000..76edddd
--- /dev/null
+++ b/interface/app/store/cmbName.js
@@ -0,0 +1,38 @@
+/*
+ * File: app/store/cmbName.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.cmbName', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'cmbname',
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbsystemtype.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/cmbNameDescription.js b/interface/app/store/cmbNameDescription.js
new file mode 100755
index 0000000..b4cc1c9
--- /dev/null
+++ b/interface/app/store/cmbNameDescription.js
@@ -0,0 +1,42 @@
+/*
+ * File: app/store/cmbNameDescription.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.cmbNameDescription', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'namedescription',
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbsystemtype.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/cmbSml.js b/interface/app/store/cmbSml.js
new file mode 100755
index 0000000..82e9037
--- /dev/null
+++ b/interface/app/store/cmbSml.js
@@ -0,0 +1,54 @@
+/*
+ * File: app/store/cmbSml.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.cmbSml', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'cmbsml',
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbIdentification.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                },
+                {
+                    name: 'definition',
+                    type: 'string'
+                },
+                {
+                    name: 'uom',
+                    type: 'string'
+                },
+                {
+                    name: 'value',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/cmbSystemType.js b/interface/app/store/cmbSystemType.js
new file mode 100755
index 0000000..b1ef138
--- /dev/null
+++ b/interface/app/store/cmbSystemType.js
@@ -0,0 +1,39 @@
+/*
+ * File: app/store/cmbSystemType.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.cmbSystemType', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            autoLoad: true,
+            storeId: 'systemtype',
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbsystemtype.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/gridDocumentation.js b/interface/app/store/gridDocumentation.js
new file mode 100755
index 0000000..7611147
--- /dev/null
+++ b/interface/app/store/gridDocumentation.js
@@ -0,0 +1,49 @@
+/*
+ * File: app/store/gridDocumentation.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.gridDocumentation', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'griddocumentation',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'description',
+                    type: 'string'
+                },
+                {
+                    dateFormat: 'Y-m-d',
+                    name: 'date',
+                    type: 'date'
+                },
+                {
+                    name: 'format',
+                    type: 'string'
+                },
+                {
+                    name: 'link',
+                    type: 'string'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/gridObservedProperties.js b/interface/app/store/gridObservedProperties.js
new file mode 100755
index 0000000..202b0a1
--- /dev/null
+++ b/interface/app/store/gridObservedProperties.js
@@ -0,0 +1,54 @@
+/*
+ * File: app/store/gridObservedProperties.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.gridObservedProperties', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'gridobservedproperties',
+            proxy: {
+                type: 'ajax',
+                url: '',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    messageProperty: 'message',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'definition',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                },
+                {
+                    name: 'procedures',
+                    type: 'string'
+                },
+                {
+                    name: 'constraint'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/gridOfferings.js b/interface/app/store/gridOfferings.js
new file mode 100755
index 0000000..c532ce4
--- /dev/null
+++ b/interface/app/store/gridOfferings.js
@@ -0,0 +1,55 @@
+/*
+ * File: app/store/gridOfferings.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.gridOfferings', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'gridofferings',
+            proxy: {
+                type: 'ajax',
+                url: '',
+                reader: {
+                    type: 'json',
+                    idProperty: 'name',
+                    messageProperty: 'message',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                },
+                {
+                    name: 'procedures'
+                },
+                {
+                    dateFormat: 'c',
+                    name: 'expiration',
+                    type: 'date'
+                },
+                {
+                    name: 'active',
+                    type: 'boolean'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/gridOutputs.js b/interface/app/store/gridOutputs.js
new file mode 100755
index 0000000..ec1da76
--- /dev/null
+++ b/interface/app/store/gridOutputs.js
@@ -0,0 +1,71 @@
+/*
+ * File: app/store/gridOutputs.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.gridOutputs', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'gridoutputs',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                },
+                {
+                    name: 'definition',
+                    type: 'string'
+                },
+                {
+                    name: 'uom',
+                    type: 'string'
+                },
+                {
+                    name: 'value',
+                    type: 'string'
+                },
+                {
+                    name: 'role'
+                },
+                {
+                    name: 'from',
+                    type: 'string'
+                },
+                {
+                    name: 'to',
+                    type: 'string'
+                },
+                {
+                    name: 'list',
+                    type: 'string'
+                },
+                {
+                    name: 'ctype'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/gridProceduresList.js b/interface/app/store/gridProceduresList.js
new file mode 100755
index 0000000..f028384
--- /dev/null
+++ b/interface/app/store/gridProceduresList.js
@@ -0,0 +1,57 @@
+/*
+ * File: app/store/gridProceduresList.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.gridProceduresList', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'procedurelist',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    idProperty: 'name',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    sortType: 'asText',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    sortType: 'asText',
+                    type: 'string'
+                },
+                {
+                    name: 'sensortype',
+                    sortType: 'asText',
+                    type: 'string'
+                },
+                {
+                    name: 'offerings'
+                },
+                {
+                    name: 'observedproperties'
+                },
+                {
+                    name: 'samplingTime'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/gridUoms.js b/interface/app/store/gridUoms.js
new file mode 100755
index 0000000..2b1e897
--- /dev/null
+++ b/interface/app/store/gridUoms.js
@@ -0,0 +1,46 @@
+/*
+ * File: app/store/gridUoms.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.gridUoms', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'griduoms',
+            proxy: {
+                type: 'ajax',
+                url: '',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    messageProperty: 'message',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                },
+                {
+                    name: 'procedures'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/serverstatus.js b/interface/app/store/serverstatus.js
new file mode 100755
index 0000000..e64cac2
--- /dev/null
+++ b/interface/app/store/serverstatus.js
@@ -0,0 +1,86 @@
+/*
+ * File: app/store/serverstatus.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.serverstatus', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'serverstatus',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    idProperty: 'service',
+                    messageProperty: 'message',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'getcapabilities',
+                    type: 'boolean'
+                },
+                {
+                    name: 'featuresOfInterest',
+                    type: 'int'
+                },
+                {
+                    name: 'describesensor',
+                    type: 'boolean'
+                },
+                {
+                    name: 'getobservation',
+                    type: 'boolean'
+                },
+                {
+                    name: 'service',
+                    type: 'string'
+                },
+                {
+                    name: 'database',
+                    type: 'string'
+                },
+                {
+                    name: 'availability',
+                    type: 'string'
+                },
+                {
+                    name: 'offerings',
+                    type: 'int'
+                },
+                {
+                    name: 'getfeatureofinterest',
+                    type: 'boolean'
+                },
+                {
+                    name: 'registersensor',
+                    type: 'boolean'
+                },
+                {
+                    name: 'procedures',
+                    type: 'int'
+                },
+                {
+                    name: 'observedProperties',
+                    type: 'int'
+                },
+                {
+                    name: 'insertobservation',
+                    type: 'boolean'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/store/vplist.js b/interface/app/store/vplist.js
new file mode 100755
index 0000000..f5cc4db
--- /dev/null
+++ b/interface/app/store/vplist.js
@@ -0,0 +1,44 @@
+/*
+ * File: app/store/vplist.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.store.vplist', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'vplist',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    idProperty: 'name',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    sortType: 'asText',
+                    type: 'string'
+                },
+                {
+                    name: 'offerings'
+                },
+                {
+                    name: 'observedproperties'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/BasePage.js b/interface/app/view/BasePage.js
new file mode 100755
index 0000000..7f7b7ce
--- /dev/null
+++ b/interface/app/view/BasePage.js
@@ -0,0 +1,7 @@
+Ext.define('istsos.view.BasePage', {
+    extend: 'istsos.view.ui.BasePage',
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/Calc.js b/interface/app/view/Calc.js
new file mode 100755
index 0000000..0b48a97
--- /dev/null
+++ b/interface/app/view/Calc.js
@@ -0,0 +1,355 @@
+/**
+ * istSOS WebAdmin - Istituto Scienze della Terra
+ * Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+ *
+ * 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 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+Ext.define('istsos.store.CalcQiStore', {
+    extend: 'Ext.data.Store',
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'calcQiStore',
+            fields: [
+            {
+                name: 'code'
+            },
+            {
+                name: 'combo',
+                convert: function(v, record){
+                    return record.get('code')  + " - " + record.get('name');
+                }
+            },
+            {
+                name: 'name'
+            },
+            {
+                name: 'description'
+            }
+            ]
+        }, cfg)]);
+    }
+});
+
+Ext.define('istsos.view.Calc', {
+    extend: 'istsos.view.ui.Calc',
+    msgs: {
+        interpolation: 'Your calculation cannot be applied using values from procedure {0}'
+    + ', it is not synchronized with procedure {1}.<br><br>' 
+    + '<small>Tip: apply a linear interpolation on {0}.</small>'
+    },
+    initComponent: function() {
+        
+        var me = this;
+        
+        if (Ext.isEmpty(Ext.getStore('editableProcedure'))) {
+            Ext.create('Ext.data.Store',{
+                storeId: 'editableProcedure',
+                proxy: {
+                    type: 'ajax',
+                    reader: {
+                        type: 'json',
+                        idProperty: 'name',
+                        root: 'data'
+                    }
+                },
+                fields: [
+                {
+                    name: 'name',
+                    sortType: 'asText',
+                    type: 'string'
+                },
+                {
+                    name: 'offerings'
+                },
+                {
+                    name: 'observedproperties'
+                }
+                ]
+            });
+        }
+        
+        this.qis = Ext.create('istsos.store.CalcQiStore',{
+            autoLoad: true,
+            proxy: {
+                type: 'ajax',
+                url: Ext.String.format('{0}/istsos/services/{1}/dataqualities',wa.url, this.procedure.service),
+                reader: {
+                    type: 'json',
+                    idProperty: 'code',
+                    root: 'data'
+                }
+            }
+        });
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp('pEditing').setValue(this.procedure.getName()+" = ");
+        
+        this.code = Ext.create('Ext.ux.form.field.CodeMirror', {
+            fieldLabel: 'Operation',
+            anchor:     '100%',
+            flex: 1,
+            mode:       'text/javascript',
+            hideLabel:  true,
+            enableLineNumbers: false
+        });
+       
+        Ext.getCmp('codePanel').add(this.code);
+        
+        this.stats = {};
+        
+        Ext.getCmp('editableProcedureGrid').getView().on('itemdblclick',
+            function(view, record, item, index, ev, eOpts){                
+                var pos = this.code.editor.getCursor(true);
+                this.code.editor.replaceRange(record.get("name"), pos, pos);
+                this.code.editor.focus();            
+            },this);
+            
+        Ext.getCmp('btnExecute').on("click",function(){
+            
+            this.cnt = new Date().getTime();
+            
+            // Apply function
+            var pKeys = Ext.Object.getKeys(this.procedures);
+            var tmp = Ext.Array.clone(pKeys);
+            var func = this.code.getValue();
+            
+            // Removing procedures that are not involved
+            for (var i = 0; i < tmp.length; i++) {
+                if (func.indexOf(tmp[i])==-1) {
+                    pKeys = Ext.Array.remove(pKeys,tmp[i]);
+                }
+            }
+            
+            // Get an array of the currently selected records.
+            //var recs = this.chartpanel.grid.getSelectionModel().getSelection();
+            var recs = this.grid.getSelectionModel().getSelection();
+            
+            var st = {};
+            
+            this.procedure.store.suspendEvents();
+            
+            var qi = Ext.getCmp('calcQiCombo').getValue();
+            
+            // Updating STORE --------------------
+            for (var i = 0; i < recs.length; i++) {
+                
+                var vars = "";
+                var field = this.procedure.storeConvertFieldToId[this.observedproperty];
+                var fieldQi = this.procedure.storeConvertFieldToId[this.observedproperty+":qualityIndex"];
+                
+                for (var c = 0; c < pKeys.length; c++) {
+                    var os = this.procedures[pKeys[c]].store;
+                    var rec = os.getById(recs[i].get('micro'));
+                    if (rec==null) {
+                        Ext.Msg.alert('Warning', Ext.String.format(this.msgs.interpolation, pKeys[c], this.procedure.sensor));
+                        for (; i >= 0; i--) {
+                            recs[i].reject();
+                        }
+                        this.procedure.store.resumeEvents();                    
+                        return;
+                    }
+                    vars += "var "+pKeys[c]+"="+rec.get(this.procedures[pKeys[c]].storeConvertFieldToId[this.observedproperty])+"; ";
+                    eval(vars);
+                }
+                
+                if (!Ext.isEmpty(func)) {
+                    var x = eval(func);
+                    recs[i].set(field,x);
+                }
+                if (!Ext.isEmpty(qi)) {
+                    recs[i].set(fieldQi,qi);
+                }
+            }
+            
+            // Refreshing GRID --------------------
+            this.procedure.store.resumeEvents();
+            this.grid.getView().refresh();
+            
+            // Refreshing CHART --------------------
+            this.procedure.store.fireEvent(
+                "seriesupdated", 
+                this.procedure.store, recs);
+                
+            
+        },this);
+        
+        Ext.getCmp('plus').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("+", pos, pos);
+            this.code.editor.focus();
+        },this);
+        
+        Ext.getCmp('minus').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("-", pos, pos);
+            this.code.editor.focus();  
+        },this);
+       
+        Ext.getCmp('less').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("<", pos, pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('moltiply').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("*", pos, pos);
+            this.code.editor.focus();  
+        },this);
+       
+        Ext.getCmp('divide').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("/", pos, pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('grater').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange(">", pos, pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('sqrt').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("Math.sqrt()", pos, pos);
+            pos = this.code.editor.getCursor(true);
+            pos.ch = pos.ch - 1;
+            this.code.editor.setCursor(pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('cos').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("Math.cos()", pos, pos);
+            pos = this.code.editor.getCursor(true);
+            pos.ch = pos.ch - 1;
+            this.code.editor.setCursor(pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('equal').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("=", pos, pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('sin').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("Math.sin()", pos, pos);
+            pos = this.code.editor.getCursor(true);
+            pos.ch = pos.ch - 1;
+            this.code.editor.setCursor(pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('asin').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("Math.asin()", pos, pos);
+            pos = this.code.editor.getCursor(true);
+            pos.ch = pos.ch - 1;
+            this.code.editor.setCursor(pos);
+            this.code.editor.focus();  
+        },this);
+       
+        Ext.getCmp('lesseq').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("<=", pos, pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('exp').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("^", pos, pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('tan').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("Math.tan()", pos, pos);
+            pos = this.code.editor.getCursor(true);
+            pos.ch = pos.ch - 1;
+            this.code.editor.setCursor(pos);
+            this.code.editor.focus();  
+        },this);
+       
+        Ext.getCmp('gretereq').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange(">=", pos, pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('acos').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("Math.acos()", pos, pos);
+            pos = this.code.editor.getCursor(true);
+            pos.ch = pos.ch - 1;
+            this.code.editor.setCursor(pos);
+            this.code.editor.focus();  
+        },this);
+        
+        Ext.getCmp('atan').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("Math.atan()", pos, pos);
+            pos = this.code.editor.getCursor(true);
+            pos.ch = pos.ch - 1;
+            this.code.editor.setCursor(pos);
+            this.code.editor.focus();  
+        },this);
+       
+        Ext.getCmp('andop').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("&&", pos, pos);
+            this.code.editor.focus();  
+        },this);
+       
+        Ext.getCmp('openparentesis').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("(", pos, pos);
+            this.code.editor.focus();  
+        },this);
+       
+        Ext.getCmp('closedparentesis').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange(")", pos, pos);
+            this.code.editor.focus();  
+        },this);
+       
+        Ext.getCmp('orop').on("click",function(){
+            var pos = this.code.editor.getCursor(true);
+            this.code.editor.replaceRange("||", pos, pos);
+            this.code.editor.focus();  
+        },this);
+        
+    },
+    // Return and interpolated record for milli value, between the too given records
+    interpolate: function(x, rec0, rec1){
+        var obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        //var x0=rec0.get(wa.isodef).getTime();
+        var x0=rec0.get('micro');
+        var y0=rec0.get(obsprop);
+        //var x1=rec1.get(wa.isodef).getTime();
+        var x1=rec1.get('micro');
+        var y1=rec1.get(obsprop);
+        // Interpolation function
+        var y = y0 + ( (x-x0)*y1 - (x-x0)*y0) / ( x1 - x0);
+        var ret = rec0.copy();
+        //ret.set(wa.isodef,Ext.Date.parse(x, "U"));
+        ret.set('micro',Ext.Date.parse(x, "U").getTime());
+        ret.set(obsprop,y);
+    }
+});
diff --git a/interface/app/view/Chart.js b/interface/app/view/Chart.js
new file mode 100755
index 0000000..340ae61
--- /dev/null
+++ b/interface/app/view/Chart.js
@@ -0,0 +1,1238 @@
+/**
+ * istSOS WebAdmin - Istituto Scienze della Terra
+ * Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+ *
+ * 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 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+Ext.define('istsos.view.Chart', {
+    
+    extend: 'istsos.view.ui.Chart',
+    
+    initComponent: function() {
+        
+        Ext.create('istsos.store.Offerings');
+        Ext.create('istsos.store.gridProceduresList');
+        Ext.create('istsos.store.ObservedProperties');
+        
+        var ssrv = Ext.create('istsos.store.Services');
+        ssrv.getProxy().url = Ext.String.format('{0}/istsos/services',wa.url);
+        
+        
+        /*Ext.create('istsos.store.gridProceduresList',{
+            storeId: 'editableProcedure'
+        });*/
+        
+        Ext.create('Ext.data.Store', {
+            storeId: 'editableProcedure',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    idProperty: 'name',
+                    root: 'data'
+                }
+            },
+            fields: [
+            {
+                name: 'name',
+                sortType: 'asText',
+                type: 'string'
+            },
+            {
+                name: 'offerings'
+            },
+            {
+                name: 'observedproperties'
+            }
+            ]
+        });
+        
+        this.procedures = {};
+        
+        this.callParent(arguments);
+        
+        Ext.getCmp('calccnt').add(Ext.create('istsos.view.Calc',{
+            id: 'calcpanel',
+            chartpanel: this
+        }));
+        
+        this.addEvents('seriesSelected','procedureAdded','queueLoaded');
+        
+        var offset = (new Date()).getTimezoneOffset()/-60;
+        var tz = ((offset > 0) ? "+"+pad(offset) : pad(offset));
+        Ext.getCmp('oeBeginTime').format = 'H:i ['+tz+']';
+        Ext.getCmp('oeBeginTime').setValue(Ext.Date.parse("00:00", 'H:i'));
+        Ext.getCmp('oeEndTime').format = 'H:i ['+tz+']';
+        Ext.getCmp('oeEndTime').setValue(Ext.Date.parse("00:00", 'H:i'));
+        
+        
+        // ********************************************************************
+        // Initializing events for "choose procedure" panel"
+        
+        /*Ext.getCmp("cmbServices").on("select",function(combo, records, eOpts){
+            var o = Ext.getCmp('oeCbOffering');
+            o.reset();
+            o.disable();
+            Ext.getCmp('oeCbObservedProperty').disable();
+            o.getStore().load({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/operations/getlist',
+                    wa.url,combo.getValue()),
+                callback: function(records, operation, success){
+                    this.enable();
+                },
+                scope: o
+            });
+        });
+        
+        Ext.getCmp("oeCbOffering").on("select",function(combo, records, eOpts){
+            
+            var pr = Ext.getCmp('oeCbProcedure');
+            pr.reset();
+            pr.disable();
+            
+            var ob = Ext.getCmp('oeCbObservedProperty');
+            ob.reset();
+            ob.disable();
+            
+            pr.getStore().load({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/{2}/procedures/operations/memberslist',
+                    wa.url,Ext.getCmp('cmbServices').getValue(),combo.getValue()),
+                callback: function(records, operation, success){
+                    this.enable();
+                },
+                scope: pr
+            });
+        });*/
+        
+        
+        /*Ext.getCmp('pchoose').on("procedureAdded",function(procedure) {
+            this.addProcedure(procedure);
+        },Ext.getCmp('chartpanel'));*/
+        
+        /*Ext.getCmp("btnAdd").on("click",function(btn, e, eOpts){
+            
+            // Add an istsos.Procedure in the this.procedures array
+            // every row contains some describeSensor data
+            var service = Ext.getCmp("cmbServices").getValue();
+            var offering = Ext.getCmp("oeCbOffering").getValue();
+            var procedure = Ext.getCmp("oeCbProcedure").getValue();
+            
+            this.procedures[procedure] = Ext.create('istsos.Sensor', 
+                service, offering, procedure, {
+                    listeners: {
+                        metadataLoaded: this.addProcedure,
+                        scope: this
+                    }
+                });
+                       
+        },this);*/
+        
+        //this.on("procedureAdded",this.redrawProcedures, this);
+        
+        
+        
+        // ********************************************************************
+        // Initializing events for "PLOT DATA" panel"
+        
+        Ext.getCmp("btnPlot").on("click",function(){
+            
+            var begin = Ext.getCmp('oeBegin').getValue();
+            var bt = Ext.getCmp('oeBeginTime').getValue();
+            begin.setHours(bt.getHours());
+            begin.setMinutes(bt.getMinutes());
+            
+            var end = Ext.getCmp('oeEnd').getValue();
+            var et = Ext.getCmp('oeEndTime').getValue();
+            end.setHours(et.getHours());
+            end.setMinutes(et.getMinutes());
+            
+            // Load data based on the date-time fields
+            this.loading = [];
+            for (var key in this.procedures) {
+                this.loading.push(key);
+                this.procedures[key].on("observationLoaded",function(p){
+                    console.log("Loaded: " + p.getName());
+                    Ext.Array.remove(this.loading,p.getName());
+                    if (this.loading.length==0) {
+                        console.log("Queue Loaded.");
+                        this.fireEvent("queueLoaded",this);
+                    }
+                },this,{
+                    single: true
+                });
+                this.procedures[key].getObservation(begin,end);
+            }
+        }, this);
+        this.on("queueLoaded",this._initChartStore, this);
+        
+        Ext.getCmp("btnCancelEditor").on("click",function(btn, e, eOpts){
+            Ext.getCmp('plotcalc').getLayout().setActiveItem(0);
+            Ext.getCmp('chartgridcnt').removeAll();
+            Ext.getCmp('btnStartEditor').setText('Start editing');
+            Ext.getCmp('btnStartEditor').enable();
+            btn.setVisible(false);
+        });
+        
+        Ext.getCmp("btnStartEditor").on("click",function(btn, e, eOpts){
+            
+            var sel = Ext.getCmp('oeCbEditableProcedures').getValue();
+            var proc = this.procedures[sel];
+            
+            if (btn.getText() == 'Start editing') {
+                
+                var obsProp = Ext.getCmp('oeCbObservedProperty').getValue();
+                //var grid = proc.getGrid(obsProp);
+                var grid = this._getGrid(sel);
+                
+                grid.on("selectionchange",function(model, records, eOpts) {
+                    
+                    if (records[0]) {
+                        
+                        var rec, p = {};
+                        if (records.length==1) {
+                            rec = records[0];
+                            p['xval'] = rec.get('micro');
+                            this.pointClickCallback({
+                                'shiftKey': false
+                            },p,true);
+                        
+                        }else if (records.length>1) {
+                            
+                            if(model.store.data.length==records.length){
+                                records = model.store.getRange();
+                            }
+                            
+                            this.chart.setAnnotations([]);
+                            
+                            rec = records[0];
+                            p['xval'] = rec.get('micro');
+                            this.pointClickCallback({
+                                'shiftKey': false
+                            },p,true);
+                            
+                            rec = records[records.length-1];
+                            p['xval'] = rec.get('micro');
+                            this.pointClickCallback({
+                                'shiftKey': true
+                            },p,true);
+                        }
+                    }
+                    
+                },this);
+                
+                Ext.getCmp("btnCancelEditor").setVisible(true);
+                btn.disable();
+                btn.setText('Apply changes');
+                
+                grid.getStore().on("update",function(s, e){
+                    this.enable();
+                },btn,{
+                    single: true
+                });
+                grid.getStore().on("seriesupdated",function(s, e){
+                    this.enable();
+                },btn,{
+                    single: true
+                });
+                
+                grid.getStore().on("update",this._editedRowUpdate,this);
+            
+                grid.getStore().on("seriesupdated",this._editedSeriesUpdate,this);
+            
+                Ext.getCmp('chartgridcnt').add(grid);
+            
+                //Ext.getCmp('plotdatafrm').setVisible(false);
+                        
+                var style = {};
+            
+                // Set thin style for all
+                for (var key in this.procedures) {
+                    style[key] = {
+                        strokeWidth: 0.5,
+                        strokeBorderWidth: 0,
+                        //pointSize: 1,
+                        highlightCircleSize: 3,
+                        drawPoints: false
+                    };
+                }
+                // Set bold style for edited procedure
+                style[sel] = {
+                    strokeWidth: 1.5,
+                    strokeBorderWidth: 1,
+                    //pointSize: 3,
+                    highlightCircleSize: 4,
+                    drawPoints: false
+                };
+            
+                this.chart.updateOptions(style);
+                this.checkCalculator();
+            
+            } else if (btn.getText() == 'Apply changes') {
+                
+                var recs = proc.store.getRange();
+                var fields = proc.storeFields;
+                var values = [];
+                for (var r = 0; r < recs.length; r++) {
+                    var row = [];
+                    for (var i = 0; i < fields.length; i++) {
+                        // skip isodate microseconds are more accurate
+                        //if (fields[i].name==wa.isodef) {
+                        if (fields[i].name==proc.iso8601Field) {
+                            continue;
+                        }else if (fields[i].name=='micro') {
+                            row.push(istsos.utils.micro2iso(recs[r].get(fields[i].name)));
+                        }else{
+                            row.push(""+(recs[r].get(fields[i].name)));
+                        }
+                    }
+                    values.push(row);
+                }
+                
+                proc.data.result.DataArray.values = values;
+                proc.data.result.DataArray.elementCount = ""+values.length;
+                
+                proc.data.samplingTime.beginPosition = istsos.utils.micro2iso(recs[0].get('micro'));
+                    
+                proc.data.samplingTime.endPosition = istsos.utils.micro2iso(recs[recs.length-1].get('micro'));
+                
+                Ext.Ajax.request({
+                    url: Ext.String.format('{0}/istsos/services/{1}/operations/insertobservation',wa.url,proc.service),
+                    scope: this,
+                    method: "POST",
+                    jsonData: {
+                        "AssignedSensorId" : proc.getId(),
+                        "ForceInsert" : "true",
+                        "Observation" : proc.data
+                    },
+                    success: function(response){
+                        var json = Ext.decode(response.responseText);
+                        if (json.success) {
+                            Ext.getCmp('plotcalc').getLayout().setActiveItem(0);
+                            Ext.getCmp("btnCancelEditor").setVisible(false);
+                            Ext.getCmp('btnStartEditor').setText('Start editing');
+                            Ext.getCmp('chartgridcnt').removeAll();
+                            Ext.getCmp('btnStartEditor').enable();
+                            Ext.getCmp("btnPlot").fireEvent("click");
+                            delete this.grid;
+                        }else{
+                            
+                        }
+                    }
+                });
+            }
+        },this);
+            
+            
+        Ext.getCmp("btnRangeDay").on("click",function(btn, e, eOpts){
+            // 86400000 ms = 1 day
+            var range = this.chart.xAxisRange();
+            var extreme = this.chart.xAxisExtremes();
+            range[1] = range[0]+86400000000;
+            if (extreme[1]<range[1]) {
+                range[0] = extreme[1]-86400000000;
+                range[1] = extreme[1];
+            }
+            btn.toggle(true,true);
+            this.chart.updateOptions( {
+                'dateWindow': [range[0], range[1]]
+            } );
+        },this);
+        
+        Ext.getCmp("btnRangeWeek").on("click",function(btn, e, eOpts){
+            var range = this.chart.xAxisRange();
+            var extreme = this.chart.xAxisExtremes();
+            range[1] = range[0]+604800000000;
+            if (extreme[1]<range[1]) {
+                range[0] = extreme[1]-604800000000;
+                range[1] = extreme[1];
+            }
+            btn.toggle(true,true);
+            this.chart.updateOptions( {
+                'dateWindow': [range[0], range[1]]
+            } );
+        },this);
+        
+        Ext.getCmp("btnRangeAll").on("click",function(btn, e, eOpts){
+            btn.toggle(true,true);
+            this.chart.updateOptions( {
+                'dateWindow': this.chart.xAxisExtremes()
+            } );
+        },this);
+        
+    },
+    _editedSeriesUpdate: function( store, records){
+        var idx = store.indexOf(records[0]);
+        var rec = [];
+        var obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        var procedure = this.procedures[store.name];
+        var field = procedure.storeConvertFieldToId[obsprop];
+        //var proc = Ext.getCmp("oeCbProcedure").getValue();
+        var colIdx = this.chart.indexFromSetName(store.name);
+        for (var c = 0, i = 0; i < this.chartdata.length && c < records.length ; i++) {
+            if (this.chartdata[i][0]==records[c].get('micro')) {
+                this.chartdata[i][colIdx]=records[c].get(field);
+                //this.chartdata[i][colIdx]=records[c].get(obsprop);
+                c++;
+            }
+        }
+        this.chart.updateOptions({
+            file: this.chartdata
+        });
+    },
+    _editedRowUpdate: function( store, record){
+        var idx = store.indexOf(record);
+        var procedure = this.procedures[store.name];//
+        var rec = [];
+                
+        var obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        //var proc = Ext.getCmp("oeCbProcedure").getValue();
+                
+        var colIdx = this.chart.indexFromSetName(store.name);
+                
+        rec.push(record.get('micro'));
+        
+        // @todo sync NaN with istSOS configuration
+        if (record.get(procedure.storeConvertFieldToId[obsprop])<-900) {
+            rec.push(NaN);
+        }else{
+            rec.push(record.get(procedure.storeConvertFieldToId[obsprop]));
+        }
+        
+        for (var i = 0; i < this.chartdata.length; i++) {
+            if (this.chartdata[i][0]==rec[0]) {
+                this.chartdata[i][colIdx]=rec[1];
+                break;
+            }
+        }
+        
+        this.chart.updateOptions({
+            file: this.chartdata
+        });
+        
+    },
+    addProcedure: function(proc){
+        
+        var ps = Ext.getStore("editableProcedure");
+        
+        
+        // Append the procedure name in the store used by combos
+        ps.loadData([{
+            name: proc.getName()
+        }],true);
+        
+        if (ps.data.length==1) {
+            Ext.getCmp('oeCbEditableProcedures').setValue(ps.getAt(0));
+        }
+        
+        this._configurePlotPanel();
+        
+        var cnt = Ext.getCmp('proceduresTree');
+        
+        // Adding details in the panel listing selected procedures
+        var item = Ext.getCmp('proceduresTree').add(this._getProcedureDetails(proc));
+        
+        var func = "Ext.callback(Ext.getCmp(\""+this.id+"\").removeProcedure, Ext.getCmp(\""+this.id+"\"), [\""+item["title"]+"\"]);";
+        Ext.create('Ext.tip.ToolTip', {
+            target: item["id"],
+            id: "tip-"+proc.getName(),
+            anchor: 'right',
+            html: "<div class='softLink' onclick='"+func+"'>remove</div>",
+            style: {
+                'background-color': 'white !important'
+            },
+            hideDelay: 1000
+        });
+        Ext.getCmp(item["id"]).on("expand",function(fs, o){
+            var labels = this.chart.getLabels();
+            var idx = Ext.Array.indexOf(labels,fs.title);
+            if (idx>0) {
+                this.chart.setVisibility(idx-1,true);
+            }
+        },this);
+        Ext.getCmp(item["id"]).on("collapse",function(fs, o){
+            var labels = this.chart.getLabels();
+            var idx = Ext.Array.indexOf(labels,fs.title);
+            if (idx>0) {
+                this.chart.setVisibility(idx-1,false);
+            }
+        },this);
+    },
+    _getProcedureDetails: function(proc){
+        return {
+            xtype: 'fieldset',
+            id: 'fs-'+proc.getName(),
+            layout: {
+                type: 'column'
+            },
+            padding: 10,
+            collapsible: false,
+            checkboxToggle: true,
+            checkboxName: proc.getName(),
+            title: proc.getName(),
+            defaults: {
+                labelWidth: 70,
+                xtype: 'displayfield',
+                anchor: '100%',
+                columnWidth: 1
+            },
+            items: [
+            {
+                fieldLabel: 'From',
+                value: proc.getBeginPosition()
+            },
+            {
+                fieldLabel: 'To',
+                value: proc.getEndPosition()
+            },
+            {
+                fieldLabel: 'Observed',
+                value: proc.getObservedProperties().join(", ")
+            },
+            {
+                fieldLabel: 'Resolution',
+                itemId: 'resolution',
+                hidden: true,
+                value: ""
+            },
+            {
+                fieldLabel: 'Loaded',
+                itemId: 'loaded',
+                hidden: true,
+                value: ""
+            },
+            {
+                fieldLabel: 'Interpolate',
+                itemId: 'interpolate',
+                xtype: 'checkbox',
+                hidden: true,
+                value: false,
+                listeners: {
+                    change: function (field, newValue, oldValue, eOpts) {
+                        if(newValue){
+                            this.interpolate();
+                        }
+                    },
+                    scope: this
+                }
+            }
+            ]
+        };
+    },
+    /**
+     * For every procedure loaded, configure the panel plotter.
+     */
+    _configurePlotPanel: function(){
+        // Analising max begin and end position, used to set 
+        //  limits on datitime fields
+        var begin, end, os = Ext.getStore('observedproperties');
+        for (var key in this.procedures) {
+            var meta = this.procedures[key].meta;
+            for (var i = 0; i < meta.outputs.length; i++) {
+                if (meta.outputs[i]["definition"]==this.procedures[key].isodef) {
+                    if (!Ext.isEmpty(meta.outputs[i]['constraint']['interval'])) {
+                        var interval = Ext.Array.clone(meta.outputs[i]['constraint']['interval']);
+                        try{
+                            interval[0] = Ext.Date.parse(interval[0],"c");
+                            if (Ext.isEmpty(begin) || (Ext.isDate(begin) && begin>interval[0])) {
+                                begin = Ext.Date.clone(interval[0]);
+                            }
+                        }catch (e){
+                            console.error("Unable to parse allowed begin date interval");
+                        }
+                        try{
+                            interval[1] = Ext.Date.parse(interval[1],"c");
+                            if (Ext.isEmpty(end) || (Ext.isDate(end) && end<interval[1])) {
+                                end = Ext.Date.clone(interval[1]);
+                            }
+                        }catch (e){
+                            console.error("Unable to parse allowed end date interval");
+                        }
+                    }
+                }else if (os.find('definition',meta.outputs[i]["definition"])==-1) {
+                    var data = [[
+                    meta.outputs[i]["name"],
+                    meta.outputs[i]["description"],
+                    meta.outputs[i]["uom"],
+                    meta.outputs[i]["definition"]
+                    ]];
+                    os.loadData(data,true);
+                }
+            }
+        }
+        if (!Ext.isEmpty(begin)) {
+            Ext.getCmp('oeBegin').setMinValue(begin); 
+            Ext.getCmp('oeEnd').setMinValue(begin); 
+        }
+        if (!Ext.isEmpty(end)) {
+            var endCopy = Ext.Date.clone(end);
+            var beginCopy = Ext.Date.add(Ext.Date.clone(end), Ext.Date.DAY,-7);
+            Ext.getCmp('oeBegin').setMaxValue(endCopy); 
+            Ext.getCmp('oeEnd').setMaxValue(endCopy); 
+            Ext.getCmp('oeBegin').setValue(beginCopy); 
+            Ext.getCmp('oeEnd').setValue(end);
+        }
+        if (os.data.length==1) {
+            Ext.getCmp('oeCbObservedProperty').setValue(os.getAt(0));
+        }
+        
+        
+        Ext.getCmp('oeCbObservedProperty').enable();
+        Ext.getCmp("btnPlot").enable();
+    },
+    redrawProcedures: function(procedures){
+        var items = [];
+        var begin, end;
+        var cbEdStr = Ext.getStore("editableProcedure");
+        cbEdStr.removeAll();
+        var obsprop = Ext.getStore('observedproperties');
+        obsprop.removeAll();
+        for (var key in this.procedures) {
+            cbEdStr.loadData([{
+                name: key
+            }],true);
+            var p = this.procedures[key];
+            var d = p.description;      
+            for (var i = 0; i < d.outputs.length; i++) {
+                if (d.outputs[i]["definition"]==wa.isodef) {
+                    if (!Ext.isEmpty(d.outputs[i]['constraint']['interval'])) {
+                        var interval = Ext.Array.clone(d.outputs[i]['constraint']['interval']);
+                        try{
+                            interval[0] = Ext.Date.parse(interval[0],"c");
+                            if (Ext.isEmpty(begin) || (Ext.isDate(begin) && begin>interval[0])) {
+                                begin = Ext.Date.clone(interval[0]);
+                            }
+                        }catch (e){
+                            console.error("Unable to parse allowed begin date interval");
+                        }
+                        try{
+                            interval[1] = Ext.Date.parse(interval[1],"c");
+                            if (Ext.isEmpty(end) || (Ext.isDate(end) && end<interval[1])) {
+                                end = Ext.Date.clone(interval[1]);
+                            }
+                        }catch (e){
+                            console.error("Unable to parse allowed end date interval");
+                        }
+                    }
+                }else if (obsprop.find('definition',d.outputs[i]["definition"])==-1) {
+                    var data = [[
+                    d.outputs[i]["name"],
+                    d.outputs[i]["description"],
+                    d.outputs[i]["uom"],
+                    d.outputs[i]["definition"]
+                    ]];
+                    obsprop.loadData(data,true);
+                }
+            }
+            //console.log(begin,end);
+            var b = d.outputs
+            
+            var node = p.getCheckbox();
+            items.push(node);
+        }
+        if (!Ext.isEmpty(begin)) {
+            Ext.getCmp('oeBegin').setMinValue(begin); 
+            Ext.getCmp('oeEnd').setMinValue(begin); 
+        }
+        if (!Ext.isEmpty(end)) {
+            var endCopy = Ext.Date.clone(end);
+            var beginCopy = Ext.Date.add(Ext.Date.clone(end), Ext.Date.DAY,-7);
+            Ext.getCmp('oeBegin').setMaxValue(endCopy); 
+            Ext.getCmp('oeEnd').setMaxValue(endCopy); 
+            Ext.getCmp('oeBegin').setValue(beginCopy); 
+            Ext.getCmp('oeEnd').setValue(end);
+        }
+        Ext.getCmp('oeCbObservedProperty').enable();
+        Ext.getCmp("btnPlot").enable();
+        var cnt = Ext.getCmp('proceduresTree');
+        cnt.removeAll();
+        cnt.add(items);
+        for (i = 0; i < items.length; i++) {
+            var func = "Ext.callback(Ext.getCmp(\""+this.id+"\").removeProcedure, Ext.getCmp(\""+this.id+"\"), [\""+items[i]["title"]+"\"]);";
+            Ext.create('Ext.tip.ToolTip', {
+                target: items[i]["id"],
+                id: "tip-"+items[i]["id"],
+                anchor: 'right',
+                html: "<div class='softLink' onclick='"+func+"'>remove</div>",
+                style: {
+                    'background-color': 'white !important'
+                },
+                hideDelay: 1000
+            });
+            Ext.getCmp(items[i]["id"]).on("expand",function(fs, o){
+                var labels = this.chart.getLabels();
+                var idx = Ext.Array.indexOf(labels,fs.title);
+                if (idx>0) {
+                    this.chart.setVisibility(idx-1,true);
+                }
+            },this);
+            Ext.getCmp(items[i]["id"]).on("collapse",function(fs, o){
+                var labels = this.chart.getLabels();
+                var idx = Ext.Array.indexOf(labels,fs.title);
+                if (idx>0) {
+                    this.chart.setVisibility(idx-1,false);
+                }
+            },this);
+        }
+        Ext.QuickTips.init();
+    },
+    removeProcedure: function(procedure){
+        Ext.getCmp("tip-"+this.procedures[procedure].getName()).setVisible(false);
+        Ext.QuickTips.unregister("tip-"+this.procedures[procedure].getName());
+        Ext.getCmp('proceduresTree').remove('fs-'+this.procedures[procedure].getName());
+        delete this.procedures[procedure];
+        this._initChartStore(false);
+    },
+    _initChartStore: function(initChart){
+        var obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        var procs = [];
+        // get the json rapresentation of the tree menu of procedures
+        var checked = Ext.getCmp('proceduresTree').getValues();
+        var visibility = []; // Initialize the chart series visibility
+        
+        this.labels = ["isodate"];
+        var template = [];
+        
+        this.chartStore = {};
+        
+        var valueFormatter = {
+            
+        }
+        var cc = 1;
+        for (var key in this.procedures) {
+            // check if procedures loaded have the requested observed property
+            if (Ext.Array.contains(this.procedures[key].getObservedProperties(),obsprop)) {
+                procs.push(this.procedures[key]);
+                if (!Ext.isEmpty(checked[key])) { // if the checkbox is selected
+                    visibility.push(true);
+                }else{
+                    visibility.push(false);
+                }
+                // Preparing labels and single native row template
+                template.push(null);
+                this.labels.push(key);
+                
+                valueFormatter[cc == 1 ? 'y': 'y'+cc] = {
+                    valueFormatter: function(ms, fn, p) {
+                        return ' '+ ms + ' '+ Ext.getCmp('chartpanel').procedures[p].getUomCode(
+                            Ext.getCmp("oeCbObservedProperty").getValue()    
+                            );
+                    }
+                } 
+                
+            }
+        }
+        // merging data
+        var idx = 0;
+        for (var key in procs) {
+            
+            var p = procs[key];
+            var recs = p.store.getRange();
+            
+            for (var j = 0, l = recs.length; j < l; j++) {
+                
+                if (Ext.isEmpty(this.chartStore[ recs[j].get("micro") ])) {
+                    this.chartStore[recs[j].get("micro")] = Ext.Array.clone(template);
+                }
+                // Set the property choosen in the chart store in the right column
+                
+                var v = parseFloat(recs[j].get(p.storeConvertFieldToId[obsprop]));
+                if (v<-900) {
+                    this.chartStore[recs[j].get("micro")][idx] = NaN;  
+                }else{
+                    this.chartStore[recs[j].get("micro")][idx] = v;          
+                }
+            }
+            idx++;
+        }
+        
+        // Sorting array by dates
+        var sorted = Ext.Array.sort(Ext.Object.getKeys(this.chartStore), 
+            function (d1, d2) {
+                d1 = parseInt(d1);
+                d2 = parseInt(d2);
+                if (d1 > d2) return 1;
+                if (d1 < d2) return -1;
+                return 0;
+            });
+        this.chartdata = [];
+        for (var i = 0; i < sorted.length; i++) {
+            var rec = [];
+            rec.push(parseInt(sorted[i]));
+            var vals = this.chartStore[sorted[i]];
+            rec = rec.concat(vals);
+            this.chartdata.push(rec);
+        }
+        initChart = true;
+        if (initChart) {
+            Ext.getCmp("btnRangeDay").toggle(false,true);
+            Ext.getCmp("btnRangeWeek").toggle(false,true);
+            Ext.getCmp("btnRangeAll").toggle(true,true);
+            this.chart = new Dygraph(
+                document.getElementById("chartCnt"),
+                this.chartdata,
+                {
+                    labels: this.labels,
+                    digitsAfterDecimal: 6,
+                    visibility: visibility,
+                    legend: 'always',
+                    title: this.obsprop,
+                    showRangeSelector: true,
+                    showRoller: true,
+                    rangeSelectorHeight: 30,
+                    rangeSelectorPlotStrokeColor: 'black',
+                    rangeSelectorPlotFillColor: 'green',
+                    //
+                    // drawGapEdgePoints: Draw points at the edges of gaps in the data. 
+                    // This improves visibility of small data segments or 
+                    // other data irregularities.
+                    
+                    //connectSeparatedPoints: true,
+                    //drawGapEdgePoints: true,
+                    labelsDivStyles: {
+                        'padding': '4px',
+                        'border': '1px solid black',
+                        'borderRadius': '3px',
+                        'boxShadow': '4px 4px 4px #888',
+                        'right': '10px'
+                    },
+                    labelsDivWidth: "100%",
+                    axes: Ext.apply({
+                        /*y: {
+                            valueFormatter: function(ms) {
+                                console.log("ciao");
+                                return 'fica';
+                            }
+                        },*/
+                        x: {
+                            valueFormatter: function(ms) {
+                                return istsos.utils.micro2iso(ms);
+                            },
+                            axisLabelFormatter: function(ms, gran, b, chart){
+                        
+                                // Get unix time in seconds
+                                var unix = parseInt(ms/1000000);
+                                // Extract microseconds only
+                                var micro = ms-(unix*1000000);
+                                // Date object without considering microseconds
+                                var date = Ext.Date.parse(unix,'U');
+                        
+                                var range = chart.xAxisRange();
+                                var delta = range[1]-range[0];
+                                   
+                                var clip = function(m){
+                                    return (parseFloat('0.'+m)+"").substring(1);
+                                }
+                                if (delta<500000) { // less then a seconds range
+                                    //chart.updateOptions({axes: {x: {pixelsPerLabel: 50}}})
+                                    if (micro == 0) {
+                                        if (date.getHours()==0 
+                                            && date.getMinutes()==0  
+                                            && date.getSeconds()==0) {
+                                            return Ext.Date.format(date,'Y-m-d');
+                                        }else{
+                                            return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                        }
+                                    }else{
+                                        if (micro==200000 || micro==400000 || micro==600000 || micro==800000) {
+                                            return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                        }else{
+                                            return micro/1000;
+                                        }
+                                    }
+                                }else if (delta<1000000) { // less then a seconds range
+                                    //chart.updateOptions({axes: {x: {pixelsPerLabel: 50}}})
+                                    if (micro == 0) {
+                                        if (date.getHours()==0 
+                                            && date.getMinutes()==0  
+                                            && date.getSeconds()==0) {
+                                            return Ext.Date.format(date,'Y-m-d');
+                                        }else{
+                                            return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                        }
+                                    }else{
+                                        if (micro==500000) {
+                                            return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                        }else{
+                                            return micro/1000;
+                                        }
+                                    }
+                                }else if(delta<1000000*60) { // less the a minute
+                                    //chart.updateOptions({axes: {x: {pixelsPerLabel: 80}}})
+                                    if (date.getHours()==0 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d');
+                                    }else{
+                                        return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                    }
+                                }else if(delta<1000000*60*60) { // less the an hour
+                                    //chart.updateOptions({axes: {x: {pixelsPerLabel: 100}}})
+                                    if (date.getHours()==0 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d');
+                                    }else{
+                                        return Ext.Date.format(date,'H:i');
+                                    }
+                                }else if(delta<1000000*60*60*24) { // less the a day
+                                    //chart.updateOptions({axes: {x: {pixelsPerLabel: 120}}})
+                                    if (date.getHours()==0 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d');
+                                    }else if (date.getHours()==12 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d') + "T" +
+                                        Ext.Date.format(date,'H:i');
+                                    }else{
+                                        return Ext.Date.format(date,'H:i');
+                                    }
+                                }else if(delta<1000000*60*60*24*4) { // less the a day
+                                    //chart.updateOptions({axes: {x: {pixelsPerLabel: 120}}})
+                                    if (date.getHours()==0 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d');
+                                    }else if (date.getHours()==12) {
+                                        return Ext.Date.format(date,'Y-m-d') + "<br>" +
+                                        Ext.Date.format(date,'H:i');
+                                    }else{
+                                        return Ext.Date.format(date,'H:i');
+                                    }
+                                }else  { // less the a day
+                                    return Ext.Date.format(date,'Y-m-d');
+                                }
+                        
+                            }
+                        }
+                    },valueFormatter),
+                    axisLineColor: 'green',
+                    axisLabelFontSize: 12,
+                    axisLabelWidth: 150,
+                    xAxisLabelWidth: 150,
+                    /*xAxisHeight: 80,
+                    xLabelHeight: 80,*/
+                    //xAxisLabelFormatter: ,
+                    clickCallback: function(e, x, pts) {
+                        var chartpanel = Ext.getCmp('chartpanel');
+                        Ext.callback(chartpanel.clickCallback, chartpanel, [e, x, pts]);
+                        Ext.callback(chartpanel.updateGridSelection, chartpanel, [chartpanel.chart.annotations()]);
+                    },
+                    pointClickCallback: function(e, p) {
+                        var chartpanel = Ext.getCmp('chartpanel');
+                        Ext.callback(chartpanel.pointClickCallback, chartpanel, [e, p]);
+                        Ext.callback(chartpanel.updateGridSelection, chartpanel, [chartpanel.chart.annotations()]);
+                    },
+                    underlayCallback: function(canvas, area, g) {
+                        var chartpanel = Ext.getCmp('chartpanel');
+                        Ext.callback(chartpanel.highlight_period, chartpanel, [canvas, area, g]);
+                    }
+                }
+                );
+        }else if (!Ext.isEmpty(this.chart)) {
+            this.chart.updateOptions({
+                file: this.chartdata,
+                visibility: visibility,
+                labels: this.labels
+            });
+        }
+        
+    },
+    /**
+     * Create a grid that fit the internal store
+     */
+    _getGrid: function(procedureName){
+        
+        var procedure = this.procedures[procedureName];
+        var properties = procedure.data.result.DataArray.field;
+        
+        var columns = [{
+            xtype: 'numbercolumn',
+            dataIndex: 'micro',
+            hidden: true,
+            hideable: false,
+            header: 'id'
+        },{
+            xtype: 'gridcolumn',
+            dataIndex: procedure.iso8601Field, // isodate is always present at position one
+            flex: 0.7,
+            header: 'Date'
+        }];
+        
+        for (var i = 1; i < properties.length; i++) {
+            
+            columns.push({
+                xtype: 'numbercolumn',
+                format: "0'000.000000",
+                dataIndex: procedure.storeConvertFieldToId[properties[i].definition],
+                definition: properties[i].definition,
+                //dataIndex: properties[i].definition,
+                flex: 0.4,
+                text: properties[i].name,
+                field: {
+                    xtype: 'numberfield',
+                    decimalPrecision: 6,
+                    hideLabel: true,
+                    listeners: {
+                        change: function(form, newValue, oldValue, eOpts){
+                            //console.log("change: ");
+                            //console.dir(arguments);
+                        }
+                    }
+                }
+            },{
+                xtype: 'gridcolumn',
+                dataIndex: procedure.storeConvertFieldToId[properties[i].definition+':qualityIndex'],
+                definition: Ext.String.format('{0}:qualityIndex',properties[i].definition),
+                //dataIndex: Ext.String.format('{0}:qualityIndex',properties[i].definition),
+                flex: 0.3,
+                text: 'qualityIndex',
+                //text: Ext.String.format('{0}:qualityIndex',properties[i].name),
+                field: {
+                    xtype: 'combobox',
+                    queryMode: 'local',
+                    allowBlank: false,
+                    hideLabel: true,
+                    displayField: 'name',
+                    store: this.id+'-editorQiStore',
+                    valueField: 'name',
+                    anchor: '100%'
+                }
+            });
+            i++;
+        }
+        
+        var observedProperty = Ext.getCmp("oeCbObservedProperty").getValue();
+        for (var i = 1; i < columns.length; i++) {
+            if (columns[i]['definition']==wa.isodef && 
+                columns[i]['definition']!=observedProperty && 
+                columns[i]['definition']!=observedProperty+':qualityIndex') {
+                columns[i]['hidden']=true;
+            }
+        }
+        
+        this.grid = Ext.create('Ext.grid.Panel', {
+            xtype: 'grid',
+            //id: 'oegrid',
+            title: '',
+            store: this.procedures[procedureName].store,
+            autoRender: true,
+            autoScroll: true,
+            viewConfig: {
+            
+            },
+            columns: columns,
+            plugins: [Ext.create('Ext.grid.plugin.CellEditing')],
+            selModel: Ext.create('Ext.selection.RowModel', {
+                allowDeselect: true,
+                mode: 'MULTI'
+            }),
+            dockedItems: [
+            {
+                xtype: 'toolbar',
+                dock: 'top',
+                items: [
+                {
+                    xtype: 'filefield',
+                    emptyText: 'Load CSV..',
+                    labelWidth: 40/*,
+                    listeners: {
+                        change: this.loadCsv,
+                        scope: this
+                    }*/
+                },
+                {
+                    xtype: 'button',
+                    flex: 1,
+                    id: 'btnSelectAll',
+                    text: 'Select all',
+                    handler: function(){
+                        var selectionModel = this.grid.getSelectionModel();
+                        selectionModel.selectAll(true);
+                    },
+                    scope: this
+                }
+                ]
+            }
+            ]
+        });
+        return this.grid;
+    },
+    // Initializing store for each visible procedure 
+    //   if they have the requested observed property
+    initProcedureStore: function(obsColl){
+        this.obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        var checked = Ext.getCmp('proceduresTree').getValues(); // Check checkbox from left menu
+        for (var key in this.procedures) {
+            var p = this.procedures[key];
+            var d = p.description;
+            for (var i = 0; i < obsColl.length; i++) {
+                if (obsColl[i].name==key) {
+                    p.initStore(obsColl[i]);
+                    Ext.Array.remove(this.loadingQueue[p.service],p.description.system_id);
+                    if (this.loadingQueue[p.service].length==0) {
+                        delete this.loadingQueue[p.service];
+                    }
+                    if (Ext.Object.getKeys(this.loadingQueue[p.service]).length==0) {
+                        this.fireEvent("queueLoaded",true);
+                    }
+                    break;
+                }
+            }
+        }
+    },
+    /*_chartobservationsUpdate: function(store, record, operation, eOpts){
+        
+        var idx = store.indexOf(record);
+            
+        var rec = [];
+        rec.push(record.get(store.idProperty));
+        rec.push(record.get(this.obsprop));
+            
+        this.chartdata[idx]=rec;
+        this.chart.updateOptions({
+            file: this.chartdata
+        });
+    },*/
+    clickCallback: function(e, x, pts){
+        //console.log("clickCallback", arguments);
+        var grid = this.grid;
+        if (!Ext.isEmpty(grid)) {
+            var series = Ext.getCmp('oeCbEditableProcedures').getValue();
+            for (var i = 0; i < pts.length; i++) {
+                if (pts[i]['name']==series) {
+                    this.pointClickCallback(e, pts[i]);
+                    return;
+                }
+            }
+        }
+    },
+    pointClickCallback: function(e, p, disableGridSelection){
+        //console.log("pointClickCallback", arguments);
+        
+        var series = Ext.getCmp('oeCbEditableProcedures').getValue();
+        var annotations;
+        var a = {
+            series: series,
+            x: p['xval'],
+            shortText: '\\/',
+            text: 'long test',
+            tickHeight: 10
+        };
+        if (e.shiftKey) {
+            annotations = this.chart.annotations();
+            if (annotations.length==2) {
+                if (annotations[0]['x'] > p['xval']) {
+                    //annotations[1] = annotations[0];
+                    annotations[0] = a;
+                }else{
+                    annotations[1] = a;
+                }
+                annotations[0].shortText = ">";
+                annotations[1].shortText = "<";
+            }else if (annotations.length==1) {
+                if (annotations[0]['x'] > p['xval']) {
+                    annotations.push(annotations[0]);
+                    annotations[0] = a;
+                }else{
+                    annotations.push(a);
+                }
+                annotations[0].shortText = ">";
+                annotations[1].shortText = "<";
+            }else{
+                annotations.push(a);
+            }
+        }else{
+            annotations = [];
+            annotations.push(a);
+        }
+        this.chart.setAnnotations(annotations);
+        
+        if (annotations.length==2) {
+            this.fireEvent("seriesSelected", annotations);
+        }
+        this.checkCalculator();
+        
+    },
+    updateGridSelection: function(annotations){
+        var grid = this.grid;
+        if (!Ext.isEmpty(grid)) {
+            var selectionModel = grid.getSelectionModel(), store = grid.getStore();
+            if (annotations.length==2) {
+                // Get first annotation time
+                /*var d1 = Ext.Date.parse(annotations[0].x/1000, "U");
+                var d2 = Ext.Date.parse(annotations[1].x/1000, "U");
+                var idx1 = store.find(wa.isodef,d1);
+                var idx2 = store.find(wa.isodef,d2);*/
+                
+                var idx1 = store.find('micro',annotations[0].x);
+                var idx2 = store.find('micro',annotations[1].x);
+                
+                selectionModel.selectRange(idx1,idx2);
+                
+            }else if (annotations.length==1) {
+                
+                var d1 = annotations[0].x;
+                var idx1 = store.find('micro',annotations[0].x);
+                selectionModel.select(idx1);
+                
+            // Get first annotation time
+            /*var d1 = Ext.Date.parse(annotations[0].x/1000, "U");
+                var idx1 = store.find(wa.isodef,d1);
+                selectionModel.select(idx1);*/
+            }
+        }
+    },
+    checkCalculator: function(){
+        var grid = this.grid;
+        if (!Ext.isEmpty(grid)) {
+            
+            var sel = Ext.getCmp('oeCbEditableProcedures').getValue();
+            var proc = this.procedures[sel];
+            
+            Ext.getCmp('pEditing').setValue(Ext.getCmp('oeCbEditableProcedures').getValue()+" = ");
+            
+            Ext.getStore("calcQiStore").load({
+                url: Ext.String.format('{0}/istsos/services/{1}/dataqualities',wa.url,proc.service)
+            });
+            
+            Ext.getCmp('plotcalc').getLayout().setActiveItem(1);
+            
+            Ext.getCmp('calcpanel').code.editor.focus();  
+            /*
+            var annotations = this.chart.annotations();
+            if (annotations.length==2) {
+                Ext.getCmp('plotcalc').getLayout().getActiveItem(1).enable();
+            }else if (annotations.length<2) {
+                Ext.getCmp('plotcalc').getLayout().getActiveItem(1).disable();
+            }*/
+        }else{
+            Ext.getCmp('plotcalc').getLayout().setActiveItem(0);
+        }
+    },  
+    highlight_period: function(canvas, area, g) {
+        if (this.chart) {
+            var annotations = this.chart.annotations();
+            if (annotations.length==2) {
+                canvas.fillStyle = "rgba(194, 232, 184, 0.8)";
+                var canvas_left_x = g.toDomXCoord(annotations[0].x);
+                var canvas_right_x = g.toDomXCoord(annotations[1].x);
+                var canvas_width = canvas_right_x - canvas_left_x;
+                canvas.fillRect(canvas_left_x, area.y, canvas_width, area.h);
+            }
+        }
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ChartContainer.js b/interface/app/view/ChartContainer.js
new file mode 100755
index 0000000..c80bc61
--- /dev/null
+++ b/interface/app/view/ChartContainer.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/ChartContainer.js
+ * Date: Wed Jul 04 2012 10:10:54 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.ChartContainer', {
+    extend: 'istsos.view.ui.ChartContainer',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/CheckColumn.js b/interface/app/view/CheckColumn.js
new file mode 100755
index 0000000..c405312
--- /dev/null
+++ b/interface/app/view/CheckColumn.js
@@ -0,0 +1,95 @@
+/*
+
+This file is part of Ext JS 4
+
+Copyright (c) 2011 Sencha Inc
+
+Contact:  http://www.sencha.com/contact
+
+GNU General Public License Usage
+This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file.  Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+
+If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
+
+*/
+/**
+ * @class geoshield.ux.CheckColumn
+ * @extends Ext.grid.column.Column
+ * <p>A Header subclass which renders a checkbox in each column cell which toggles the truthiness of the associated data field on click.</p>
+ * <p><b>Note. As of ExtJS 3.3 this no longer has to be configured as a plugin of the GridPanel.</b></p>
+ * <p>Example usage:</p>
+ * <pre><code>
+// create the grid
+var grid = Ext.create('Ext.grid.Panel', {
+    ...
+    columns: [{
+           text: 'Foo',
+           ...
+        },{
+           xtype: 'checkcolumn',
+           text: 'Indoor?',
+           dataIndex: 'indoor',
+           width: 55
+        }
+    ]
+    ...
+});
+ * </code></pre>
+ * In addition to toggling a Boolean value within the record data, this
+ * class adds or removes a css class <tt>'x-grid-checked'</tt> on the td
+ * based on whether or not it is checked to alter the background image used
+ * for a column.
+ */
+Ext.define('istsos.view.CheckColumn', {
+    extend: 'istsos.view.ui.CheckColumn',
+    alias: 'widget.checkcolumn',
+
+    constructor: function() {
+        this.addEvents(
+            /**
+             * @event checkchange
+             * Fires when the checked state of a row changes
+             * @param {geoshield.ux.CheckColumn} this
+             * @param {Number} rowIndex The row index
+             * @param {Boolean} checked True if the box is checked
+             */
+            'checkchange'
+            );
+        this.callParent(arguments);
+    },
+    
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    },
+    /**
+     * @private
+     * Process and refire events routed from the GridView's processEvent method.
+     */
+    processEvent: function(type, view, cell, recordIndex, cellIndex, e) {
+        if (type == 'mousedown' || (type == 'keydown' && (e.getKey() == e.ENTER || e.getKey() == e.SPACE))) {
+            var record = view.panel.store.getAt(recordIndex),
+            dataIndex = this.dataIndex,
+            checked = !record.get(dataIndex);
+                
+            record.set(dataIndex, checked);
+            this.fireEvent('checkchange', this, recordIndex, checked);
+            // cancel selection.
+            return false;
+        } else {
+            return this.callParent(arguments);
+        }
+    },
+
+    // Note: class names are not placed on the prototype bc renderer scope
+    // is not in the header.
+    renderer : function(value){
+        var cssPrefix = Ext.baseCSSPrefix,
+        cls = [cssPrefix + 'grid-checkheader'];
+
+        if (value) {
+            cls.push(cssPrefix + 'grid-checkheader-checked');
+        }
+        return '<div class="' + cls.join(' ') + '"> </div>';
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/Editor1.js b/interface/app/view/Editor1.js
new file mode 100755
index 0000000..0d03331
--- /dev/null
+++ b/interface/app/view/Editor1.js
@@ -0,0 +1,71 @@
+/*
+ * File: app/view/Editor1.js
+ * Date: Wed Jan 30 2013 15:31:11 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.Editor1', {
+    extend: 'istsos.view.ui.Editor1',
+    alias: 'widget.editor1',
+
+    initComponent: function() {
+        
+        var me = this;
+        me.callParent(arguments);
+        
+        this.pchoose = Ext.getCmp('pchoose');
+        this.chartpanel = Ext.getCmp('chartpanel');
+        this.grideditor = Ext.getCmp('proceduregrideditor');
+        
+        this.pchoose.on("procedureAdded",function(procedure) {
+            this.chartpanel.addProcedure(procedure);
+            this.grideditor.addProcedure(procedure);
+        },this);
+        
+        this.pchoose.on("procedureRemoved",function(procedure) {
+            this.chartpanel.removeProcedure(procedure);
+            this.grideditor.removeProcedure(procedure);
+        },this);
+        
+        this.chartpanel.on('observedPropertyIsSet',function(chartpanel, observedProperty){
+            this.grideditor.setObservedProperty(observedProperty)
+        },this)
+        
+        
+        this.grideditor.on("selectionchange",function(panel, grid, selected, eOpts) {
+            if (selected.length==1) {
+                this.highlightRegion(selected[0].get('micro'));
+            }else if (selected.length>1) {
+                var rec, begin, end;
+                rec = selected[0];
+                begin = rec.get('micro');
+                rec = selected[selected.length-1];
+                end = rec.get('micro');
+                this.highlightRegion(begin,end);
+            }else if (selected.length==0) {
+                this.highlightRegion();
+                this.removeAnnotations();
+            }
+        },this.chartpanel);
+        
+        
+        this.chartpanel.on("clickCallback",function(panel, e, x, pts) {
+            this.updateGridSelection([x]);
+            panel.highlightRegion(x);
+        },this.grideditor);
+        
+        
+        this.chartpanel.on("seriesSelected",function(panel, e, x, y, pts) {
+            this.updateGridSelection([x,y]);
+            panel.highlightRegion(x,y);
+        },this.grideditor);
+        
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/FormDataQuality.js b/interface/app/view/FormDataQuality.js
new file mode 100755
index 0000000..ce4f672
--- /dev/null
+++ b/interface/app/view/FormDataQuality.js
@@ -0,0 +1,22 @@
+/*
+ * File: app/view/FormDataQuality.js
+ * Date: Wed Dec 28 2011 16:21:09 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.FormDataQuality', {
+    extend: 'istsos.view.ui.FormDataQuality',
+
+    initComponent: function() {
+        var me = this;
+        var store = Ext.create('istsos.store.DataQualityStore');
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/FormPaths.js b/interface/app/view/FormPaths.js
new file mode 100755
index 0000000..55d80be
--- /dev/null
+++ b/interface/app/view/FormPaths.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/FormPaths.js
+ * Date: Wed Apr 04 2012 18:12:58 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.FormPaths', {
+    extend: 'istsos.view.ui.FormPaths',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/MainMenu.js b/interface/app/view/MainMenu.js
new file mode 100755
index 0000000..776c82f
--- /dev/null
+++ b/interface/app/view/MainMenu.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/MainMenu.js
+ * Date: Wed May 09 2012 17:36:40 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.MainMenu', {
+    extend: 'istsos.view.ui.MainMenu',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/MainMenu2.js b/interface/app/view/MainMenu2.js
new file mode 100755
index 0000000..c182769
--- /dev/null
+++ b/interface/app/view/MainMenu2.js
@@ -0,0 +1,306 @@
+Ext.define('istsos.view.MainMenu2', {
+    extend: 'istsos.view.ui.MainMenu2',
+
+    initComponent: function() {
+        var me = this;
+        this.btnTemplate = new Ext.Template([
+            '<div class="submenuIcon">',
+            '<img src="images/menu/{icon}" width="46"/>',
+            '<div style="padding-top: 4px;">',
+            '{name}',
+            '</div>',
+            '</div>',
+            ]);
+        this.btnTemplate.compile();
+        
+        me.callParent(arguments);
+        
+        
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/operations/initialization',wa.url),
+            scope: this,
+            method: 'GET',
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (parseInt(json.data.level)>0) {
+                    //if (false) {
+                    Ext.getCmp('submenu').expand();
+                    this.loadServiceMenu();
+                    
+                }else{
+                    istsos.engine.pageManager.openWaPage({
+                        istService: "default",
+                        wizardName: "newservice",
+                        wapage: 'WizardPage'
+                    });
+                    Ext.getCmp('submenu').collapse();
+                }
+            }
+        });
+        
+        
+        // Registering click event on Server/Default button
+        
+        Ext.getCmp('menuServer').on("click",function(){
+            
+            var mainCenter = Ext.getCmp("mainCenter"), items = [];
+            mainCenter.removeAll(true);
+            
+            for (var h in istsos.engine.defaultConfig){
+                for (var l in istsos.engine.defaultConfig[h]){
+                    items.push(this.createSubButton({
+                        "name": l,
+                        "icon": istsos.engine.defaultConfig[h][l]['icon'],
+                        "istConfig": istsos.engine.defaultConfig[h][l]
+                    }));
+                }
+            }
+            
+            var sub = Ext.getCmp("submenu");
+            sub.removeAll();
+            var cmps = sub.add(items);
+            
+            var time = 250;
+            
+            for (var i = 0; i < cmps.length; i++) {
+                
+                //console.dir(cmps[i]);
+                
+                var el = cmps[i].getEl();
+                /*el.fadeIn({
+                    duration: time,
+                    easing: null
+                });*/
+                
+                el.on("click",function(e, t, eOpts){
+                    for (var c = 0; c < cmps.length; c++) {
+                        cmps[c].removeCls('submenuSelect');
+                    }
+                    this.addClass('submenuSelect');
+                    
+                    
+                    var conf = Ext.apply({
+                        istService: "default"
+                    },this.istConfig);
+                
+                    /*var conf = {
+                        istService: "default"
+                    };*/
+                    
+                    var url;
+                    if (Ext.isObject(conf.istOperation)) {
+                        url = conf.istOperation.restUrl;
+                        if (url.indexOf("@")>0) {
+                            conf.istOperation.restUrl = url.replace("@", istService);
+                        }
+                    }else if (Ext.isString(conf.istOperation)) {
+                        url = conf.istOperation;
+                        if (url.indexOf("@")>0) {
+                            conf.istOperation = url.replace("@", istService);
+                        }
+                    }
+                    
+                    istsos.engine.pageManager.openWaPage(conf);
+                    
+                },cmps[i]);
+                
+                time += 250;
+            }
+        },this);
+        
+        
+        Ext.getCmp('btnObservations').on("click",function(){
+            
+            var mainCenter = Ext.getCmp("mainCenter");
+            mainCenter.removeAll(true);
+            
+            var items = []
+            for (var h in istsos.engine.observationConfig){
+                for (var l in istsos.engine.observationConfig[h]){
+                    items.push(this.createSubButton({
+                        "name": l,
+                        "icon": istsos.engine.observationConfig[h][l]['icon'],
+                        "istConfig": istsos.engine.observationConfig[h][l]
+                    }));
+                }
+            }
+            
+            var sub = Ext.getCmp("submenu");
+            sub.removeAll();
+            if (items.length==1) {
+                items[0]['flex']=null;
+                items.push({
+                    xtype: 'container',
+                    id: 'imnotabutton',
+                    margin: '4 4 0 4',
+                    html: "",
+                    flex: 1,
+                    style: 'opacity: 0;'
+                });
+            }
+            var cmps = sub.add(items);
+            
+            var time = 250;
+            
+            for (var i = 0; i < cmps.length; i++) {
+                //console.dir(cmps[i]);
+                if (cmps[i].getId()!='imnotabutton') {
+                    var el = cmps[i].getEl();
+                    el.fadeIn({
+                        duration: time,
+                        easing: null
+                    
+                    });
+                    el.on("click",function(e, t, eOpts){
+                        for (var c = 0; c < cmps.length; c++) {
+                            cmps[c].removeCls('submenuSelect');
+                        }
+                        this.addClass('submenuSelect');
+                        var conf = Ext.apply({
+                            istService: "default"
+                        },this.istConfig);
+                        var url;
+                        if (Ext.isObject(conf.istOperation)) {
+                            url = conf.istOperation.restUrl;
+                            if (url.indexOf("@")>0) {
+                                conf.istOperation.restUrl = url.replace("@", istService);
+                            }
+                        }else if (Ext.isString(conf.istOperation)) {
+                            url = conf.istOperation;
+                            if (url.indexOf("@")>0) {
+                                conf.istOperation = url.replace("@", istService);
+                            }
+                        }
+                        istsos.engine.pageManager.openWaPage(conf);
+                    },cmps[i]);
+                    time += 250;
+                }
+            }
+        },this);
+    },
+    showMask: function(msg){
+        if (!Ext.isEmpty(this.mask)) {
+            this.mask.hide();
+        }
+        this.mask = new Ext.LoadMask(Ext.getCmp('mainCenter').body, {
+            msg: msg
+        });
+        this.mask.show();
+    },
+    hideMask: function(){
+        if (!Ext.isEmpty(this.mask)) {
+            this.mask.hide();
+        }
+    }, 
+    createSubButton: function(conf){
+        return {
+            xtype: 'container',
+            margin: '4 4 0 4',
+            html: this.btnTemplate.apply(conf),
+            istConfig: conf['istConfig'],
+            width: 60,
+            flex: 1,
+            //style: 'opacity: 0;',
+            overCls: 'submenuOver',
+            componentCls: 'submenu'
+        //styleHtmlCls: 'submenuContent'
+        }
+    },
+    loadServiceMenu: function(){
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services', wa.url),
+            scope: this,
+            method: 'GET',
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    var menu = Ext.getCmp("menuServices");
+                    menu.removeAll();
+                    var items = [];
+                    for (var i = 0; i < json.total; i++) {
+                        items.push({
+                            text: json.data[i].service,
+                            istConfig: json.data[i],
+                            iconCls: 'service_menu'
+                        });
+                    }
+                    var cmp = menu.add(items);
+                    for (i = 0; i < cmp.length; i++) {
+                        cmp[i].on("click",function(btn, e, eOpts){
+                            
+                            var mainCenter = Ext.getCmp("mainCenter");
+                            mainCenter.removeAll(true);
+                            this.loadServiceButtons(btn.istConfig);
+                            Ext.getCmp('btnService').toggle(true,true);
+                        },this)
+                    }
+                }else{
+                                    
+                }
+            }
+        });
+        Ext.getCmp('menuServer').fireEvent("click");
+        istsos.engine.pageManager.openWaPage(istsos.engine.defaultConfig.Server.Status);
+    },
+    loadServiceButtons: function(istConfig){
+        
+        var mainCenter = Ext.getCmp("mainCenter");
+        mainCenter.removeAll(true);
+        
+        var items = [];
+        
+        for (var h in istsos.engine.serviceConfig){
+            for (var l in istsos.engine.serviceConfig[h]){
+                items.push(this.createSubButton({
+                    "name": l,
+                    "icon": istsos.engine.serviceConfig[h][l]['icon'],
+                    "istConfig": istsos.engine.serviceConfig[h][l]
+                }));
+            }
+        }
+            
+        var sub = Ext.getCmp("submenu");
+        sub.removeAll();
+        var cmps = sub.add(items);
+            
+        var time = 250;
+            
+        for (var i = 0; i < cmps.length; i++) {
+                
+            var el = cmps[i].getEl();
+            el.fadeIn({
+                duration: time,
+                //easing: 'elasticIn'
+                //easing: 'ease'
+                //easing: 'easeInOut'
+                //easing: 'backIn'
+                easing: null
+            });
+                
+            el.on("click",function(e, t, eOpts){
+                for (var c = 0; c < cmps.length; c++) {
+                    cmps[c].removeCls('submenuSelect');
+                }
+                this.addClass('submenuSelect');
+                var conf = Ext.apply({
+                    istService: istConfig.service
+                },this.istConfig);
+                var url;
+                if (Ext.isObject(conf.istOperation)) {
+                    url = conf.istOperation.restUrl;
+                    if (url.indexOf("@")>0) {
+                        conf.istOperation.restUrl = url.replace("@", istConfig.service);
+                    }
+                }else if (Ext.isString(conf.istOperation)) {
+                    url = conf.istOperation;
+                    if (url.indexOf("@")>0) {
+                        conf.istOperation = url.replace("@", istConfig.service);
+                    }
+                }
+                istsos.engine.pageManager.openPage(conf);
+            },cmps[i]);
+            time += 250;
+            
+        }
+    }
+});
diff --git a/interface/app/view/MainPanel.js b/interface/app/view/MainPanel.js
new file mode 100755
index 0000000..65b9bd5
--- /dev/null
+++ b/interface/app/view/MainPanel.js
@@ -0,0 +1,51 @@
+Ext.define('istsos.view.MainPanel', {
+    extend: 'istsos.view.ui.MainPanel',
+    initComponent: function() {
+        this.callParent(arguments);
+        this.on("afterrender",function(){
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/operations/initialization',wa.url),
+                scope: this,
+                method: 'GET',
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    if (parseInt(json.data.level)>0) {
+                        this.enableStandardView();
+                    }else{
+                        // Set invisible the menu panel
+                        var x = Ext.getCmp("panelMenu");
+                        x.setVisible(false);
+                        // Initialize the wizard
+                        istsos.engine.pageManager.openWizard("initialization");
+                    }
+                }
+            });
+        });  
+        Ext.getCmp("btnMainMenu").on("click",function(){
+            Ext.getCmp('menuCard').getLayout().setActiveItem(0);
+        });
+        Ext.getCmp("btnServicesMenu").on("click",function(){
+            Ext.getCmp('menuCard').getLayout().setActiveItem(1);
+        });
+    },
+    enableStandardView: function(){
+        Ext.getCmp("panelMenu").setVisible(true);
+        // Load the existing services menu
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services',wa.url),
+            scope: this,
+            method: 'GET',
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    Ext.getCmp("servicesMenu").removeAll();
+                    Ext.getCmp("servicesMenu").add(istsos.engine.pageManager.getServicesMenu(json));
+                }else{
+                                    
+                }
+            }
+        });          
+        // Set the default server configuration menu
+        Ext.getCmp("mainMenu").update(istsos.engine.pageManager.getMenuHtml());
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/MyGridPanel15.js b/interface/app/view/MyGridPanel15.js
new file mode 100755
index 0000000..6d83056
--- /dev/null
+++ b/interface/app/view/MyGridPanel15.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/MyGridPanel15.js
+ * Date: Fri Jul 06 2012 10:15:34 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.MyGridPanel15', {
+    extend: 'istsos.view.ui.MyGridPanel15',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ObservationEditor.js b/interface/app/view/ObservationEditor.js
new file mode 100755
index 0000000..e137e94
--- /dev/null
+++ b/interface/app/view/ObservationEditor.js
@@ -0,0 +1,134 @@
+/*
+ * File: app/view/ObservationEditor.js
+ * Date: Wed Mar 21 2012 09:38:32 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.ObservationEditor', {
+    extend: 'istsos.view.ui.ObservationEditor',
+
+    initComponent: function() {
+        var me = this;
+        
+        var offs = Ext.create('istsos.store.Offerings');
+        var procs = Ext.create('istsos.store.gridProceduresList');
+        var obsprop = Ext.create('istsos.store.ObservedProperties');
+        var services = Ext.create('istsos.store.Services');
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp("cmbServices").on("select",function(combo, records, eOpts){
+            var o = Ext.getCmp('oeCbOffering');
+            o.reset();
+            o.disable();
+            Ext.getCmp('oeCbObservedProperty').disable();
+            Ext.getCmp('oeBegin').disable();
+            Ext.getCmp('oeEnd').disable();
+            Ext.getCmp('oeBeginTime').disable();
+            Ext.getCmp('oeEndTime').disable();
+            o.getStore().load({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/operations/getlist', wa.url, combo.getValue()),
+                callback: function(records, operation, success){
+                    this.enable();
+                },
+                scope: o
+            });
+        });
+        
+        Ext.getCmp("oeCbOffering").on("select",function(combo, records, eOpts){
+            var pr = Ext.getCmp('oeCbProcedure');
+            var ob = Ext.getCmp('oeCbObservedProperty');
+            pr.reset();
+            pr.disable();
+            ob.reset();
+            ob.disable();
+            var srv = Ext.getCmp('cmbServices');
+            Ext.getCmp('oeBegin').disable();
+            Ext.getCmp('oeEnd').disable();
+            Ext.getCmp('oeBeginTime').disable();
+            Ext.getCmp('oeEndTime').disable();
+            pr.getStore().load({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/{2}/procedures/operations/memberslist', 
+                    wa.url,srv.getValue(),combo.getValue()),
+                callback: function(records, operation, success){
+                    this.enable();
+                },
+                scope: pr
+            });
+        });
+        
+        
+        Ext.getCmp("oeCbProcedure").on("select",function(combo, records, eOpts){
+            var o = Ext.getCmp('oeCbObservedProperty');
+            o.reset();
+            o.disable();
+            Ext.getCmp('oeBegin').disable();
+            Ext.getCmp('oeEnd').disable();
+            Ext.getCmp('oeBeginTime').disable();
+            Ext.getCmp('oeEndTime').disable();
+            o.getStore().loadData(records[0].data.observedproperties);
+            o.enable();
+        });
+        
+        Ext.getCmp("oeCbObservedProperty").on("select",function(combo, records, eOpts){
+            Ext.getCmp('oeBegin').enable();
+            Ext.getCmp('oeEnd').enable();
+            Ext.getCmp('oeBeginTime').enable();
+            Ext.getCmp('oeEndTime').enable();
+        });
+        
+        Ext.getCmp('oeBtnLoad').on("click",function(btn, e, eOpts){
+            // Prepare chart and editing grid
+            // var obs = Ext.create('istsos.store.Observations');
+            var properties = Ext.getCmp("oeCbProcedure").getStore().findRecord(
+                "name",Ext.getCmp("oeCbProcedure").getValue()
+                ).data.observedproperties;
+            
+            var begin = Ext.getCmp('oeBegin').getValue();
+            begin.setHours(Ext.getCmp('oeBeginTime').getValue().getHours());
+            begin.setMinutes(Ext.getCmp('oeBeginTime').getValue().getMinutes());
+            
+            var end = Ext.getCmp('oeEnd').getValue();
+            end.setHours(Ext.getCmp('oeEndTime').getValue().getHours());
+            end.setMinutes(Ext.getCmp('oeEndTime').getValue().getMinutes());
+            
+            var procStore = Ext.getCmp("oeCbProcedure").getStore();
+            var proc = procStore.getAt(procStore.find("name",Ext.getCmp("oeCbProcedure").getValue())).data;
+            
+            var cmbObs = Ext.getCmp("oeCbObservedProperty");
+            var orecs = cmbObs.getStore().getRange();
+            var observedProperties=[];
+            for (var r in orecs){
+                console.dir(r);
+                observedProperties.push(orecs[r].get("name"));
+            }
+            
+            var oec = Ext.create('istsos.view.ObservationEditorColumn', {
+                id: "milan",
+                istConfig: {
+                    "service": Ext.getCmp("cmbServices").getValue(),
+                    "offering": Ext.getCmp("oeCbOffering").getValue(),
+                    "procedure": proc,
+                    "properties": properties,
+                    "observedProperties": observedProperties.join(","),
+                    "selectedProperty": cmbObs.getValue(),
+                    "begin": begin,
+                    "end": end
+                }
+            });
+            
+            var edPan = Ext.getCmp('oeEditor');
+            edPan.removeAll();
+            edPan.add(oec);
+            //obs.load();
+        });
+        
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ObservationEditorAdvancedOperations.js b/interface/app/view/ObservationEditorAdvancedOperations.js
new file mode 100755
index 0000000..d4febfb
--- /dev/null
+++ b/interface/app/view/ObservationEditorAdvancedOperations.js
@@ -0,0 +1,41 @@
+/*
+ * File: app/view/ObservationEditorAdvancedOperations.js
+ * Date: Tue May 15 2012 17:17:30 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.ObservationEditorAdvancedOperations', {
+    extend: 'istsos.view.ui.ObservationEditorAdvancedOperations',
+    
+    /**
+     * config: {
+     *      istgrid: Ext.grid.panel,
+     *      obsprop: String # selected observed property
+     * }
+     */
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+        Ext.getCmp("oeaTf").on("keyup", function(tf, ev, eOpts ){
+            // User has pressed "ENTER" key ?
+            if (ev.keyCode==13) { 
+                var val = tf.getValue();
+                // Get an array of the currently selected records.
+                var recs = this.istGrid.getSelectionModel().getSelection();
+                for (var i = 0; i < recs.length; i++) {
+                    console.dir(recs[i]);
+                    var x = recs[i].get(this.istConfig.selectedProperty);
+                    x = eval(val);
+                    recs[i].set(this.istConfig.selectedProperty,x);
+                }
+            }
+        },this);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ObservationEditorColumn.js b/interface/app/view/ObservationEditorColumn.js
new file mode 100755
index 0000000..aff3816
--- /dev/null
+++ b/interface/app/view/ObservationEditorColumn.js
@@ -0,0 +1,319 @@
+/*
+ * File: app/view/ObservationEditorColumn.js
+ * Date: Wed Mar 21 2012 17:13:57 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.ObservationEditorColumn', {
+    extend: 'istsos.view.ui.ObservationEditorColumn',
+    
+    initComponent: function() {
+        var me = this;
+        
+        var qi = Ext.create('istsos.store.cmbNameDescription',{
+            storeId: 'storeQualityindex'
+        });
+        
+        this.initStore(this.istConfig);
+        
+        qi.getProxy().url=Ext.String.format('{0}/istsos/services/{1}/dataqualities',wa.url, this.istConfig.service);
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp("gridContainer").add(
+            this.initGrid(this.istConfig));
+        Ext.getCmp("chartContainer").add(
+            this.initChart(this.istConfig));
+            
+        console.dir(this.istConfig);
+        
+        var url = wa.url + '/istsos/services/' + this.istConfig.service;
+        url += '/operations/getobservation/offerings/' + this.istConfig.offering;
+        url += '/procedures/' + this.istConfig.procedure.name;
+        url += '/observedproperties/' + this.istConfig.observedProperties;
+        url += '/eventtime/' + ISO8601FromDate(this.istConfig.begin) + '/' + ISO8601FromDate(this.istConfig.end);
+        
+        //console.log(url);
+        
+        Ext.Ajax.request({
+            url: url,
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    console.dir(json.data[0].observedProperty.component);
+                    this.goObject = Ext.apply({},json.data[0]);
+                    var obs = json.data[0].result.DataArray.values;
+                    var data = [];
+                    for (var i = 0; i < obs.length; i++) {
+                        var rec = [];
+                        rec.push(obs[i][0])
+                        for (var c = 1; c < obs[i].length; c++) {
+                            rec.push(parseFloat(obs[i][c]))
+                        }
+                        data.push(rec);
+                    }
+                    console.dir(data);
+                    Ext.getStore("observations").loadData(data);
+                }
+                console.dir(json);
+            }
+        });
+        
+        Ext.getCmp('oeapply').on("click",function(){
+            var store = Ext.getStore("observations");
+            var recs = store.getRange();           
+            console.dir(this.goObject.observedProperty);
+            var comps = this.goObject.observedProperty.component;
+            comps = this.goObject.observedProperty["component"];
+            var values = [];
+            for (var i = 0; i < recs.length; i++) {
+                for (var c = 0; c < comps.length; c++) {
+                    values.push(recs[i].get(comps[c]));
+                }
+            }
+            console.dir(values);
+        },this);
+        
+    },
+    initStore: function(istConfig){
+        
+        var fields = [{
+            dateFormat: 'c',
+            name: wa.isodef,
+            type: 'date'
+        }];
+        
+        for (var i = 0; i < this.istConfig.properties.length; i++) {
+            fields.push({
+                name: this.istConfig.properties[i].name,
+                type: 'float'
+            },{
+                name: Ext.String.format('{0}:qualityIndex',this.istConfig.properties[i].name),
+                type: 'float'
+            });
+        }
+        
+        var store = Ext.define('istsos.store.ObservationsChart', {
+            extend: 'Ext.data.ArrayStore'
+        });
+        
+        Ext.create('istsos.store.ObservationsChart',{
+            storeId: 'observations',
+            fields: fields
+        });
+        
+    },
+    initGrid: function(istConfig){
+        var columns = [{
+            xtype: 'datecolumn',
+            //dataIndex: 'isodate',
+            dataIndex: "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601",
+            flex: 0.7,
+            text: 'Date',
+            format: 'c'
+        }];
+        for (var i = 0; i < istConfig.properties.length; i++) {
+            columns.push({
+                xtype: 'numbercolumn',
+                dataIndex: istConfig.properties[i].name,
+                flex: 0.3,
+                text: istConfig.properties[i].name,
+                field: {
+                    xtype: 'numberfield',
+                    hideLabel: true
+                }
+            },{
+                xtype: 'gridcolumn',
+                dataIndex: Ext.String.format('{0}:qualityIndex',istConfig.properties[i].name),
+                flex: 0.3,
+                text: Ext.String.format('{0}:qualityIndex',istConfig.properties[i].name),
+                field: {
+                    xtype: 'combobox',
+                    fieldLabel: 'System type',
+                    allowBlank: false,
+                    displayField: 'name',
+                    store: 'storeQualityindex',
+                    valueField: 'name',
+                    anchor: '100%'
+                }
+            });
+        }
+        return {
+            xtype: 'gridpanel',
+            id: 'oegrid',
+            title: '',
+            store: 'observations',
+            viewConfig: {},
+            columns: columns,
+            plugins: [Ext.create('Ext.grid.plugin.CellEditing')],
+            selModel: Ext.create('Ext.selection.RowModel', {
+                allowDeselect: true,
+                mode: 'MULTI'
+            }),
+            dockedItems: [
+            {
+                xtype: 'toolbar',
+                dock: 'bottom',
+                layout: {
+                    pack: 'center',
+                    type: 'hbox'
+                },
+                items: [
+                {
+                    xtype: 'button',
+                    id: 'oeapply',
+                    text: 'Apply'
+                }
+                ]
+            }
+            ],
+            listeners: {
+                selectionchange: function(grid, records, eOpts) {
+                    if (records[0]) {
+                        var rec = records[0];
+                        var name = rec.get(wa.isodef);
+                        var series = Ext.getCmp('oechart').series.get(0);
+                        var i, items, l;                
+                        series.highlight = true;
+                        series.unHighlightItem();
+                        series.cleanHighlights();                
+                        for (i = 0, items = series.items, l = items.length; i < l; i++) {
+                            if (name == items[i].storeItem.get(wa.isodef)) {
+                                series.highlightItem(items[i]);
+                                break;
+                            }
+                        }
+                        series.highlight = false;
+                    }
+                }
+            }
+        };
+    },
+    initChart: function(istConfig){        
+        var ret = {
+            xtype: 'chart',
+            height: 250,
+            id: 'oechart',
+            width: 400,
+            animate: true,
+            insetPadding: 20,
+            store: 'observations',
+            axes: [
+            {
+                type: 'Category',
+                fields: wa.isodef,
+                label: {
+                    font: '11px Arial',
+                    rotate: {
+                        degrees: -90
+                    },
+                    renderer: function(v){
+                        return ISO8601FromDate(v);
+                    }
+                },
+                position: 'bottom',
+                title: 'iso8601'
+            },
+            {
+                type: 'Numeric',
+                fields: istConfig.selectedProperty,
+                grid: true,
+                label: {
+                    font: '12px Arial',
+                    renderer: Ext.util.Format.numberRenderer('0.0')
+                },
+                adjustMinimumByMajorUnit: true,
+                adjustMaximumByMajorUnit: true,
+                //maximum: 1,
+                //minimum: 0,
+                position: 'left',
+                title: istConfig.selectedProperty.replace(
+                    "urn:ogc:def:parameter:x-istsos:1.0:","")
+            },
+            {
+                type: 'Numeric',
+                fields: istConfig.selectedProperty,
+                grid: true,
+                adjustMinimumByMajorUnit: true,
+                adjustMaximumByMajorUnit: true,
+                //maximum: 1,
+                //minimum: 0,
+                position: 'right'
+            }
+            ],
+            series: [
+            {
+                //type: 'column',
+                type: 'line',
+                highlight: true,
+                /*label: {
+                    display: 'outside', // outside, over, insideStart
+                    rotate: {
+                        degrees: -90
+                    },
+                    'text-anchor': 'middle', // 
+                    field: istConfig.selectedProperty,
+                    renderer: Ext.util.Format.numberRenderer('0.0'),
+                    color: '#333'
+                },*/
+                xField: wa.isodef,
+                yField: istConfig.selectedProperty,
+                listeners: {
+                    itemmouseup: function(item, event) {
+                        var series = Ext.getCmp('oechart').series.get(0);
+                        var index = Ext.Array.indexOf(series.items, item);
+                        var grid = Ext.getCmp('oegrid');
+                        var selectionModel = grid.getSelectionModel();
+                        if (event.shiftKey) { 
+                            //console.log("shift!");
+                            selectionModel.selectRange(this.lastPressed,index);
+                            series.highlight = true;
+                            series.unHighlightItem();
+                            series.cleanHighlights();                
+                            for (var i = this.lastPressed; i < index+1; i++) {
+                                series.highlightItem(series.items[i]);
+                            }
+                            series.highlight = false;
+                            Ext.create('Ext.window.Window', {
+                                //title: 'Hello',
+                                /*height: 200,
+                                width: 400,*/
+                                border: 0,
+                                layout: 'fit',
+                                items: Ext.create('istsos.view.ObservationEditorAdvancedOperations',{
+                                    istGrid: grid,
+                                    istConfig: istConfig
+                                })
+                            }).show();
+                        }else{
+                            this.lastPressed = index;
+                            selectionModel.select(index);
+                        }
+                    }
+                },
+                tips: {
+                    trackMouse: true,
+                    width: 180,
+                    //height: 40,
+                    renderer: function(storeItem, item) {
+                        this.setTitle(
+                            ISO8601FromDate(storeItem.get(wa.isodef))
+                            +"<br/>"+
+                            storeItem.get(istConfig.selectedProperty));
+                    }
+                }
+            }
+            ]
+        };
+        return ret;
+    }
+});
diff --git a/interface/app/view/ProcedureChart.js b/interface/app/view/ProcedureChart.js
new file mode 100755
index 0000000..4065c04
--- /dev/null
+++ b/interface/app/view/ProcedureChart.js
@@ -0,0 +1,650 @@
+/**
+ * istSOS WebAdmin - Istituto Scienze della Terra
+ * Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+ *
+ * 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 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+Ext.define('istsos.view.ProcedureChart', {
+    extend: 'istsos.view.ui.ProcedureChart',
+    alias: 'widget.procedurechart',
+    
+    initComponent: function() {
+        var me = this;
+        
+        Ext.create('istsos.store.ObservedProperties');
+        this.procedures = {};
+        
+        me.callParent(arguments);
+        
+        this.addEvents('queueLoaded','observedPropertyIsSet','clickCallback','pointClickCallback', 'seriesSelected', 'underlayCallback');
+        
+        var offset = (new Date()).getTimezoneOffset()/-60;
+        var tz = ((offset > 0) ? "+"+this.pad(offset) : this.pad(offset));
+        Ext.getCmp('oeBeginTime').format = 'H:i ['+tz+']';
+        Ext.getCmp('oeBeginTime').setValue(Ext.Date.parse("00:00", 'H:i'));
+        Ext.getCmp('oeEndTime').format = 'H:i ['+tz+']';
+        Ext.getCmp('oeEndTime').setValue(Ext.Date.parse("00:00", 'H:i'));
+        
+        Ext.getCmp("btnPlot").on("click",this.loadObservation, this);
+        this.on("queueLoaded",this.rederChart, this);
+        
+        Ext.getCmp("btnRangeDay").on("click",function(btn, e, eOpts){
+            // 86400000 ms = 1 day
+            var range = this.chart.xAxisRange();
+            var extreme = this.chart.xAxisExtremes();
+            range[1] = range[0]+86400000000;
+            if (extreme[1]<range[1]) {
+                range[0] = extreme[1]-86400000000;
+                range[1] = extreme[1];
+            }
+            btn.toggle(true,true);
+            this.chart.updateOptions({
+                'dateWindow': [range[0], range[1]]
+            });
+        },this);
+        
+        Ext.getCmp("btnRangeWeek").on("click",function(btn, e, eOpts){
+            var range = this.chart.xAxisRange();
+            var extreme = this.chart.xAxisExtremes();
+            range[1] = range[0]+604800000000;
+            if (extreme[1]<range[1]) {
+                range[0] = extreme[1]-604800000000;
+                range[1] = extreme[1];
+            }
+            btn.toggle(true,true);
+            this.chart.updateOptions( {
+                'dateWindow': [range[0], range[1]]
+            } );
+        },this);
+        
+        Ext.getCmp("btnRangeAll").on("click",function(btn, e, eOpts){
+            btn.toggle(true,true);
+            this.chart.updateOptions( {
+                'dateWindow': this.chart.xAxisExtremes()
+            } );
+        },this);
+        
+        
+        this.on("resize",function(panel, adjWidth, adjHeight, eOpts){
+            if(this.chart){
+                this.chart.resize();
+            }
+        });
+        
+        Ext.getCmp('oeCbObservedProperty').on("select",function(combo, records, eOpts){
+            var op = null;
+            if (records.length==1) {
+                op = records[0].data;
+            }
+            this.fireEvent("observedPropertyIsSet", this, op);
+        },this);
+    
+    },
+    pad: function(n){
+        return n<10 ? '0'+n : n
+    },
+    rederChart: function(){
+        
+        var obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        var procs = [];
+        // get the json rapresentation of the tree menu of procedures
+        //var checked = Ext.getCmp('proceduresTree').getValues();
+        var visibility = []; // Initialize the chart series visibility
+        
+        this.labels = ["isodate"];
+        this.colors = [];
+        var template = [];
+        
+        this.chartStore = {};
+        
+        var valueFormatter = {
+        
+        }
+        var cc = 1;
+        
+        var keys = Object.keys(this.procedures);
+        keys = keys.sort();
+        
+        //for (var key in this.procedures) {
+        for (var c = 0; c < keys.length; c++) {
+            var key = keys[c];
+            // check if procedures loaded have the requested observed property
+            if (Ext.Array.contains(this.procedures[key].getObservedProperties(),obsprop)) {
+                procs.push(this.procedures[key]);
+                /*if (!Ext.isEmpty(checked[key])) { // if the checkbox is selected
+                    visibility.push(true);
+                }else{
+                    visibility.push(false);
+                }*/
+                // Preparing labels and single native row template
+                template.push(null);
+                this.labels.push(key);
+                this.colors.push(this.procedures[key].color);
+                valueFormatter[cc == 1 ? 'y': 'y'+cc] = {
+                    valueFormatter: function(ms, fn, p) {
+                        return ' '+ ms + ' '+ Ext.getCmp('chartpanel').procedures[p].getUomCode(
+                            Ext.getCmp("oeCbObservedProperty").getValue()    
+                            );
+                    }
+                } 
+            
+            }
+        }
+        // merging data
+        var idx = 0;
+        //for (var key in procs) {
+        for (var c = 0; c < procs.length; c++) {
+            var p = procs[c];
+            
+            p.store.on("update",this._storeUpdated,this);
+            p.store.on("seriesupdated",this._storeSeriesUpdated,this);
+            
+            var recs = p.store.getRange();
+            for (var j = 0, l = recs.length; j < l; j++) {
+                if (Ext.isEmpty(this.chartStore[recs[j].get("micro") ])) {
+                    this.chartStore[recs[j].get("micro")] = Ext.Array.clone(template);
+                }
+                // Set the property choosen in the chart store in the right column
+                var v = parseFloat(recs[j].get(p.storeConvertFieldToId[obsprop]));
+                if (v<-900) {
+                    this.chartStore[recs[j].get("micro")][idx] = NaN;  
+                }else{
+                    this.chartStore[recs[j].get("micro")][idx] = v;          
+                }
+            }
+            idx++;
+        }
+        
+        // Sorting array by dates
+        var sorted = Ext.Array.sort(Ext.Object.getKeys(this.chartStore), 
+            function (d1, d2) {
+                d1 = parseInt(d1);
+                d2 = parseInt(d2);
+                if (d1 > d2) return 1;
+                if (d1 < d2) return -1;
+                return 0;
+            });
+        this.chartdata = [];
+        for (var i = 0; i < sorted.length; i++) {
+            var rec = [];
+            rec.push(parseInt(sorted[i]));
+            var vals = this.chartStore[sorted[i]];
+            rec = rec.concat(vals);
+            this.chartdata.push(rec);
+        }
+        var initChart = true;
+        if (initChart) {
+            Ext.getCmp("btnRangeDay").toggle(false,true);
+            Ext.getCmp("btnRangeWeek").toggle(false,true);
+            Ext.getCmp("btnRangeAll").toggle(true,true);
+            this.chart = new Dygraph(
+                document.getElementById("chartCnt-body"),
+                this.chartdata,
+                {
+                    labels: this.labels,
+                    colors: this.colors,
+                    strokeWidth: 2,
+                    digitsAfterDecimal: 6,
+                    connectSeparatedPoints: true,
+                    //visibility: visibility,
+                    legend: 'always',
+                    title: this.obsprop,
+                    showRangeSelector: true,
+                    showRoller: true,
+                    rangeSelectorHeight: 30,
+                    rangeSelectorPlotStrokeColor: 'black',
+                    rangeSelectorPlotFillColor: 'green',
+                    labelsDivStyles: {
+                        'padding': '4px',
+                        'border': '1px solid black',
+                        'borderRadius': '3px',
+                        'boxShadow': '4px 4px 4px #888',
+                        'right': '10px'
+                    },
+                    labelsDivWidth: "100%",
+                    axisLineColor: 'green',
+                    axisLabelFontSize: 12,
+                    axisLabelWidth: 150,
+                    xAxisLabelWidth: 150,
+                    highlightCircleSize: 4,
+                    axes: Ext.apply({
+                        x: {
+                            valueFormatter: function(ms) {
+                                return istsos.utils.micro2iso(ms);
+                            },
+                            axisLabelFormatter: function(ms, gran, b, chart){
+                                
+                                // Get unix time in seconds
+                                var unix = parseInt(ms/1000000);
+                                // Extract microseconds only
+                                var micro = ms-(unix*1000000);
+                                // Date object without considering microseconds
+                                var date = Ext.Date.parse(unix,'U');
+                                
+                                var range = chart.xAxisRange();
+                                var delta = range[1]-range[0];
+                                
+                                var clip = function(m){
+                                    return (parseFloat('0.'+m)+"").substring(1);
+                                }
+                                if (delta<500000) { // less then a seconds range
+                                    if (micro == 0) {
+                                        if (date.getHours()==0 
+                                            && date.getMinutes()==0  
+                                            && date.getSeconds()==0) {
+                                            return Ext.Date.format(date,'Y-m-d');
+                                        }else{
+                                            return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                        }
+                                    }else{
+                                        if (micro==200000 || micro==400000 || micro==600000 || micro==800000) {
+                                            return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                        }else{
+                                            return micro/1000;
+                                        }
+                                    }
+                                }else if (delta<1000000) { // less then a seconds range
+                                    if (micro == 0) {
+                                        if (date.getHours()==0 
+                                            && date.getMinutes()==0  
+                                            && date.getSeconds()==0) {
+                                            return Ext.Date.format(date,'Y-m-d');
+                                        }else{
+                                            return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                        }
+                                    }else{
+                                        if (micro==500000) {
+                                            return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                        }else{
+                                            return micro/1000;
+                                        }
+                                    }
+                                }else if(delta<1000000*60) { // less the a minute
+                                    if (date.getHours()==0 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d');
+                                    }else{
+                                        return Ext.Date.format(date,'H:i:s')+clip(micro);
+                                    }
+                                }else if(delta<1000000*60*60) { // less the an hour
+                                    if (date.getHours()==0 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d');
+                                    }else{
+                                        return Ext.Date.format(date,'H:i');
+                                    }
+                                }else if(delta<1000000*60*60*24) { // less the a day
+                                    if (date.getHours()==0 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d');
+                                    }else if (date.getHours()==12 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d') + "T" +
+                                        Ext.Date.format(date,'H:i');
+                                    }else{
+                                        return Ext.Date.format(date,'H:i');
+                                    }
+                                }else if(delta<1000000*60*60*24*4) { // less the a day
+                                    if (date.getHours()==0 
+                                        && date.getMinutes()==0  
+                                        && date.getSeconds()==0) {
+                                        return Ext.Date.format(date,'Y-m-d');
+                                    }else if (date.getHours()==12) {
+                                        return Ext.Date.format(date,'Y-m-d') + "<br>" +
+                                        Ext.Date.format(date,'H:i');
+                                    }else{
+                                        return Ext.Date.format(date,'H:i');
+                                    }
+                                }else  { // less the a day
+                                    return Ext.Date.format(date,'Y-m-d');
+                                }
+                            
+                            }
+                        }
+                    },valueFormatter),
+                    clickCallback: function(e, x, pts) {
+                        var chartpanel = Ext.getCmp('chartpanel');                        
+                        // Series selectd
+                        if (e.shiftKey && chartpanel.lastClick) {
+                            Ext.callback(function(e, x, pts){
+                                this.fireEvent("seriesSelected", this, e, x, this.lastClick, pts);
+                            }, chartpanel, [e, x, pts]);
+                            
+                        }else{ // Single point selected
+                            chartpanel.lastClick = x;
+                            Ext.callback(function(e, x, pts){
+                                this.fireEvent("clickCallback", this, e, x, pts);
+                            }, chartpanel, [e, x, pts]);
+                        }
+                        
+                    },
+                    pointClickCallback: function(e, p) {
+                        
+                        
+                        
+                        var chartpanel = Ext.getCmp('chartpanel');
+                        Ext.callback(function(e, p){
+                            this.fireEvent("clickCallback", this, e, p['xval']);
+                        }, chartpanel, [e, p]);
+                    },
+                    underlayCallback: function(canvas, area, g) {
+                        var chartpanel = Ext.getCmp('chartpanel');
+                        Ext.callback(function(canvas, area, g){
+                            this.fireEvent("underlayCallback", this, canvas, area, g);
+                        }, chartpanel, [canvas, area, g]);
+                    }
+                }
+                );
+        }else if (!Ext.isEmpty(this.chart)) {
+            this.chart.updateOptions({
+                file: this.chartdata,
+                visibility: visibility,
+                labels: this.labels
+            });
+        }
+        Ext.get('chartCnt-body').removeCls("viewerChart");
+        Ext.get('chartCnt').unmask();
+    },
+    highlightRegion: function(startMicro, endMicro){
+        if (this.chart) {
+            if (startMicro==null && endMicro==null) {
+                this.chart.updateOptions({
+                    "underlayCallback": function(canvas, area, chart) {
+                    
+                    }
+                });
+            }else if (endMicro==null) {
+                this.chart.updateOptions({
+                    "underlayCallback": function(canvas, area, chart) {
+                        //canvas.fillStyle = "rgba(194, 232, 184, 1)";
+                        canvas.fillStyle = "rgba(0, 255, 0, 0.8)";
+                        var canvas_left_x = chart.toDomXCoord(startMicro)-1;
+                        var canvas_width = 3;
+                        canvas.fillRect(canvas_left_x, area.y, canvas_width, area.h);
+                        
+                        // Border left
+                        canvas.fillStyle = "rgba(0, 0, 0, 1)";
+                        canvas_left_x = chart.toDomXCoord(startMicro)-2;
+                        canvas_width = 1;
+                        canvas.fillRect(canvas_left_x, area.y, canvas_width, area.h);
+                        
+                        // Border right
+                        canvas_left_x = chart.toDomXCoord(startMicro)+2;
+                        canvas_width = 1;
+                        canvas.fillRect(canvas_left_x, area.y, canvas_width, area.h);
+                    }
+                });
+            }else{ 
+                this.chart.updateOptions({
+                    "underlayCallback": function(canvas, area, chart) {
+                        //canvas.fillStyle = "rgba(194, 232, 184, 1)";
+                        canvas.fillStyle = "rgba(0, 255, 0, 1)";
+                        var canvas_left_x = chart.toDomXCoord(startMicro);
+                        var canvas_right_x = chart.toDomXCoord(endMicro);
+                        var canvas_width = canvas_right_x - canvas_left_x;
+                        canvas.fillRect(canvas_left_x, area.y, canvas_width, area.h);
+                        
+                        
+                        // Border left
+                        canvas.fillStyle = "rgba(0, 0, 0, 1)";
+                        canvas_left_x = chart.toDomXCoord(startMicro);
+                        canvas_width = 1;
+                        canvas.fillRect(canvas_left_x, area.y, canvas_width, area.h);
+                        
+                        // Border right
+                        canvas_left_x = chart.toDomXCoord(endMicro)-1;
+                        canvas_width = 1;
+                        canvas.fillRect(canvas_left_x, area.y, canvas_width, area.h);
+                    }
+                });
+            }
+        }
+    },
+    addAnnotation: function(micro, annotation){
+        var series = Ext.getCmp('oeCbEditableProcedures').getValue();
+        var annotations = this.chart.annotations();
+        var a = {
+            series: series,
+            x: micro,
+            shortText: '\\/',
+            text: 'long test',
+            tickHeight: 10
+        };
+        if (!Ext.isEmpty(annotation)) {
+            Ext.apply(a,{
+                shortText: annotation
+            });
+        }
+        annotations.push(a);
+        this.chart.setAnnotations(annotations);
+    },
+    /*
+     * Remove all annotatione from the chart
+     */
+    removeAnnotations: function(){
+        this.chart.setAnnotations([]);
+    },
+    /*
+     * Load the observation for added procedures according to user configuration:
+     *  - begin / end
+     *  - observed property
+     */
+    loadObservation: function(){
+        // Mask the container with loading message
+        Ext.get('chartCnt').mask("Initializing chart..");
+        
+        var begin = Ext.getCmp('oeBegin').getValue();
+        var bt = Ext.getCmp('oeBeginTime').getValue();
+        begin.setHours(bt.getHours());
+        begin.setMinutes(bt.getMinutes());
+        
+        var end = Ext.getCmp('oeEnd').getValue();
+        var et = Ext.getCmp('oeEndTime').getValue();
+        end.setHours(et.getHours());
+        end.setMinutes(et.getMinutes());
+        
+        // Load data based on the date-time fields
+        this.loading = [];
+        for (var key in this.procedures) {
+            this.loading.push(key);
+            this.procedures[key].on("observationLoaded",function(p){
+                Ext.Array.remove(this.loading,p.getName());
+                if (this.loading.length==0) {
+                    this.fireEvent("queueLoaded",this);
+                }
+            },this,{
+                single: true
+            });
+            this.procedures[key].getObservation(begin,end);
+        }
+    },
+    _colorChanged: function(p, newColor, oldColor){
+        if (this.chart) {
+            var colors = this.chart.getColors();
+            var labels = this.chart.getLabels();
+            var index = Ext.Array.indexOf(labels, p.getName());
+            colors[index-1] = newColor;
+            this.chart.updateOptions( {
+                'colors': colors
+            });
+        }
+    },
+    _visibilityChanged: function(p, visibile){
+        if (this.chart) {
+            var labels = this.chart.getLabels();
+            var index = Ext.Array.indexOf(labels, p.getName())-1;
+            this.chart.setVisibility(index,visibile);
+        }
+    },
+    _storeUpdated: function( store, record){
+        var procedure = this.procedures[store.name];
+        var rec = [];
+        var obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        var colIdx = this.chart.indexFromSetName(store.name);
+        rec.push(record.get('micro'));
+        // @todo sync NaN with istSOS configuration
+        if (record.get(procedure.storeConvertFieldToId[obsprop])<-900) {
+            rec.push(NaN);
+        }else{
+            rec.push(record.get(procedure.storeConvertFieldToId[obsprop]));
+        }
+        for (var i = 0; i < this.chartdata.length; i++) {
+            if (this.chartdata[i][0]==rec[0]) {
+                this.chartdata[i][colIdx]=rec[1];
+                break;
+            }
+        }
+        this.chart.updateOptions({
+            file: this.chartdata
+        });
+        
+    },
+    _storeSeriesUpdated: function( store, records){
+        var obsprop = Ext.getCmp("oeCbObservedProperty").getValue();
+        var procedure = this.procedures[store.name];
+        var field = procedure.storeConvertFieldToId[obsprop];
+        var colIdx = this.chart.indexFromSetName(store.name);
+        for (var c = 0, i = 0; i < this.chartdata.length && c < records.length ; i++) {
+            if (this.chartdata[i][0]==records[c].get('micro')) {
+                this.chartdata[i][colIdx]=records[c].get(field);
+                c++;
+            }
+        }
+        this.chart.updateOptions({
+            file: this.chartdata
+        });
+    },
+    /*
+    * Configure the plot panel loading the observed properties into the combo
+    * and setting begin e end limits according to the procedures metadata.
+    */
+    addProcedure: function(procedure){
+        this.procedures[procedure.getName()] = procedure;
+        procedure.on("colorchanged",this._colorChanged,this);
+        procedure.on("visibilitychanged",this._visibilityChanged,this);
+        this.reconfigure();
+    },
+    removeProcedure: function(procedure){
+        procedure.un("colorchanged",this._colorChanged,this);
+        delete this.procedures[procedure.getName()];
+        this.reconfigure();
+        if (this.chart) {
+            if (Ext.Object.getSize(this.procedures)==0) {
+                Ext.destroy(Ext.get('chartCnt-body').child('*'));
+                Ext.get('chartCnt-body').addCls("viewerChart");
+                delete this.chart;
+            }else{
+                this.rederChart();
+            }
+        }
+    },
+    reconfigure: function(){
+        var oeBegin = Ext.getCmp('oeBegin'), 
+        oeEnd = Ext.getCmp('oeEnd'), 
+        os = Ext.getStore('observedproperties');
+        os.removeAll();
+        oeBegin.setMaxValue(null); 
+        oeBegin.setMinValue(null); 
+        oeEnd.setMaxValue(null); 
+        oeEnd.setMinValue(null); 
+        if (Ext.Object.getSize(this.procedures)==0) {
+            Ext.getCmp('oeCbObservedProperty').reset();
+            Ext.getCmp("btnPlot").disable();
+            oeBegin.reset();
+            oeEnd.reset();
+            return;
+        }
+        
+        for (var key in this.procedures) {
+            var procedure = this.procedures[key], begin, end;
+            
+            var meta = procedure.meta;
+            for (var i = 0; i < meta.outputs.length; i++) {
+                if (meta.outputs[i]["definition"]==procedure.isodef) {
+                    if (!Ext.isEmpty(meta.outputs[i]['constraint']['interval'])) {
+                        var interval = Ext.Array.clone(meta.outputs[i]['constraint']['interval']);
+                        try{
+                            interval[0] = Ext.Date.parse(interval[0],"c");
+                            if (Ext.isEmpty(begin) || (Ext.isDate(begin) && begin>interval[0])) {
+                                begin = Ext.Date.clone(interval[0]);
+                            }
+                        }catch (e){
+                            console.error("Unable to parse allowed begin date interval");
+                        }
+                        try{
+                            interval[1] = Ext.Date.parse(interval[1],"c");
+                            if (Ext.isEmpty(end) || (Ext.isDate(end) && end<interval[1])) {
+                                end = Ext.Date.clone(interval[1]);
+                            }
+                        }catch (e){
+                            console.error("Unable to parse allowed end date interval");
+                        }
+                    }
+                }else if (os.find('definition',meta.outputs[i]["definition"])==-1) {
+                    var data = [[
+                    meta.outputs[i]["name"],
+                    meta.outputs[i]["description"],
+                    meta.outputs[i]["uom"],
+                    meta.outputs[i]["definition"]
+                    ]];
+                    os.loadData(data,true);
+                }
+            }
+            if (!Ext.isEmpty(begin)) {
+                if (!Ext.isEmpty(oeBegin.minValue)) {
+                    if (oeBegin.minValue.getTime()>begin.getTime()) {
+                        oeBegin.setMinValue(begin); 
+                        oeEnd.setMinValue(begin); 
+                    }
+                }else{
+                    oeBegin.setMinValue(begin); 
+                    oeEnd.setMinValue(begin); 
+                }
+            }
+            
+            
+            if (!Ext.isEmpty(end)) {
+                
+                var endCopy = Ext.Date.clone(end);
+                var beginCopy = Ext.Date.add(Ext.Date.clone(end), Ext.Date.DAY,-7);
+                
+                if (!Ext.isEmpty(oeBegin.maxValue)) {
+                    if (oeBegin.maxValue.getTime()<end.getTime()) {
+                        oeBegin.setMaxValue(endCopy); 
+                        oeEnd.setMaxValue(endCopy); 
+                        oeBegin.setValue(beginCopy); 
+                        oeEnd.setValue(end);
+                    }
+                }else{
+                    oeBegin.setMaxValue(endCopy); 
+                    oeEnd.setMaxValue(endCopy); 
+                    oeBegin.setValue(beginCopy); 
+                    oeEnd.setValue(end);
+                }
+            
+            }
+        }
+        if (os.data.length==1) {
+            Ext.getCmp('oeCbObservedProperty').setValue(os.getAt(0));
+            this.fireEvent("observedPropertyIsSet", this, os.getAt(0).data);
+        }
+        //Ext.getCmp('oeCbObservedProperty').enable();
+        Ext.getCmp("btnPlot").enable();
+    }
+});
diff --git a/interface/app/view/ProcedureChooser.js b/interface/app/view/ProcedureChooser.js
new file mode 100755
index 0000000..b0541ff
--- /dev/null
+++ b/interface/app/view/ProcedureChooser.js
@@ -0,0 +1,287 @@
+/**
+ * istSOS WebAdmin - Istituto Scienze della Terra
+ * Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+ *
+ * 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 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+
+/*
+ * https://github.com/sterlingwes/RandomColor
+ */
+(function(root,factory){
+    if(typeof exports==='object'){
+        module.exports=factory;
+    }else if(typeof define==='function'&&define.amd){
+        define(factory);
+    }else{
+        root.RColor=factory();
+    }
+}(this,function(){
+    var RColor=function(){
+        this.hue=Math.random(),this.goldenRatio=0.618033988749895;
+    };
+    RColor.prototype.hsvToRgb=function(h,s,v){
+        var h_i=Math.floor(h*6),f=h*6- h_i,p=v*(1-s),q=v*(1-f*s),t=v*(1-(1-f)*s),r=255,g=255,b=255;
+        switch(h_i){
+            case 0:
+                r=v,g=t,b=p;
+                break;
+            case 1:
+                r=q,g=v,b=p;
+                break;
+            case 2:
+                r=p,g=v,b=t;
+                break;
+            case 3:
+                r=p,g=q,b=v;
+                break;
+            case 4:
+                r=t,g=p,b=v;
+                break;
+            case 5:
+                r=v,g=p,b=q;
+                break;
+        }
+        return[Math.floor(r*256),Math.floor(g*256),Math.floor(b*256)];
+    };
+    RColor.prototype.get=function(hex,saturation,value){
+        this.hue+=this.goldenRatio;
+        this.hue%=1;
+        if(typeof saturation!=="number")saturation=0.5;
+        if(typeof value!=="number")value=0.95;
+        var rgb=this.hsvToRgb(this.hue,saturation,value);
+        if(hex)
+            return"#"+rgb[0].toString(16)+rgb[1].toString(16)+rgb[2].toString(16);else
+            return rgb;
+    };
+    return RColor;
+}));
+
+Ext.define('istsos.view.ProcedureChooser', {
+    extend: 'istsos.view.ui.ProcedureChooser',
+    alias: 'widget.procedurechooser',
+
+    initComponent: function() {
+        
+        var me = this;
+        this.color = new RColor;
+        
+        this.addEvents({
+            "procedureAdded" : true,
+            "procedureRemoved" : true
+        });
+        
+        Ext.create('istsos.store.Offerings');
+        Ext.create('istsos.store.gridProceduresList');
+        var ssrv = Ext.create('istsos.store.Services');
+        ssrv.getProxy().url = Ext.String.format('{0}/istsos/services',wa.url);
+        
+        this.procedures = {};
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp("cmbServices").on("select",function(combo, records, eOpts){
+            var pr = Ext.getCmp('oeCbProcedure');
+            pr.reset();
+            pr.disable();
+            
+            var o = Ext.getCmp('oeCbOffering');
+            o.reset();
+            o.getStore().removeAll();
+            o.disable();
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/operations/getlist',
+                    wa.url,combo.getValue()),
+                scope: o,
+                method: "GET",
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    if (json.data.length>0) {
+                        this.getStore().loadData(json.data);
+                        this.enable();
+                    }else{
+                        this.disable();
+                        Ext.Msg.alert("Server message", "\"" + json['message'] + "\"<br/><br/>" + 
+                                "<small>Status response: " + response.statusText + "</small>");
+                    }
+                }
+            });
+            
+        /*o.disable();
+            o.getStore().load({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/operations/getlist',
+                    wa.url,combo.getValue()),
+                callback: function(records, operation, success){
+                    this.enable();
+                },
+                scope: o
+            });*/
+        });
+        
+        Ext.getCmp("oeCbOffering").on("select",function(combo, records, eOpts){
+            var pr = Ext.getCmp('oeCbProcedure');
+            pr.reset();
+            pr.getStore().removeAll();
+            pr.disable();
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/{2}/procedures/operations/memberslist',
+                    wa.url,Ext.getCmp('cmbServices').getValue(),combo.getValue()),
+                scope: pr,
+                method: "GET",
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    if (json.data.length>0) {
+                        this.getStore().loadData(json.data);
+                        this.enable();
+                    }else{
+                        this.disable();
+                        Ext.Msg.alert("Server message", "\"" + json['message'] + "\"<br/><br/>" + 
+                                "<small>Status response: " + response.statusText + "</small>");
+                    }
+                }
+            });
+            /*
+            pr.getStore().load({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/{2}/procedures/operations/memberslist',
+                    wa.url,Ext.getCmp('cmbServices').getValue(),combo.getValue()),
+                callback: function(records, operation, success){
+                    this.enable();
+                },
+                scope: pr
+            });*/
+        });
+        
+        Ext.getCmp("btnAdd").on("click",function(btn, e, eOpts){
+            
+            // Add an istsos.Procedure in the this.procedures array
+            // every row contains some describeSensor data
+            var service = Ext.getCmp("cmbServices").getValue();
+            var offering = Ext.getCmp("oeCbOffering").getValue();
+            var procedure = Ext.getCmp("oeCbProcedure").getValue();
+            
+            this.procedures[procedure] = Ext.create('istsos.Sensor', 
+                service, offering, procedure, {
+                    listeners: {
+                        metadataLoaded: this._getProcedureDetails,
+                        scope: this
+                    }
+                });
+            
+        },this);
+    },
+    _getProcedureDetails: function(proc){
+        var obsprop = [];
+        for (var i = 0; i < proc.meta.outputs.length; i++) {
+            if (proc.meta.outputs[i]['definition']!=proc.isodef) {
+                obsprop.push(proc.meta.outputs[i]['name'] + " (" + proc.meta.outputs[i]['uom']+ ")");
+            }
+        }
+        proc.color = this.color.get(true);
+        var idVisible = Ext.id(), idColor = Ext.id(), idRemove = Ext.id();
+        var cmp = Ext.getCmp('proceduresTree').add({
+            xtype: 'panel',
+            //id: 'fs-'+proc.getName(),
+            border: false,
+            istsos: {
+                procedure: proc,
+                idVisible: idVisible,
+                idColor: idColor,
+                idRemove: idRemove,
+                chooser: this
+            },
+            listeners: {
+                "added": {
+                    fn: function(panel, container, pos, eOpts){
+                        this.fireEvent("procedureAdded", proc);
+                    },
+                    scope: this,
+                    options: {
+                        single: true
+                    }
+                },
+                "afterrender": {
+                    fn: function(procedureDetailsPanel, layout, eOpts ){
+                        
+                        console.log("Afterrender: " + procedureDetailsPanel.istsos.procedure.getName());
+                        
+                        var v = Ext.get(procedureDetailsPanel.istsos.idVisible);
+                        v.on("click",function(){
+                            if (this.istsos.procedure.getVisibility()) {
+                                Ext.get(this.istsos.idVisible).addCls("pchooserBtnNotVisible");
+                            }else{
+                                Ext.get(this.istsos.idVisible).removeCls("pchooserBtnNotVisible");
+                            }
+                            this.istsos.procedure.setVisibility(!this.istsos.procedure.getVisibility());
+                        },procedureDetailsPanel);
+                    
+                        var c = Ext.get(procedureDetailsPanel.istsos.idColor);
+                        c.on("click",function(){
+                            Ext.create('Ext.window.Window', {
+                                title: this.istsos.procedure.getName() + ': color',
+                                height: 110,
+                                width: 200,
+                                closeAction: 'destroy',
+                                modal: true,
+                                layout: 'fit',
+                                items: Ext.create('Ext.picker.Color', {
+                                    listeners: {
+                                        select: function(picker, selColor) {
+                                            this.istsos.procedure.setColor("#"+selColor);
+                                            Ext.get(this.istsos.idColor).setStyle("background-color", "#"+selColor);
+                                            picker.ownerCt.close();
+                                        },
+                                        scope: this
+                                    }
+                                })
+                            }).show();
+                        },procedureDetailsPanel);
+                    
+                    
+                        var d = Ext.get(procedureDetailsPanel.istsos.idRemove);
+                        d.on("click",function(){
+                            var pchoose = this.ownerCt.ownerCt;
+                            this.ownerCt.remove(this);
+                            pchoose.fireEvent("procedureRemoved", proc);
+                        },procedureDetailsPanel,{
+                            single: true
+                        });
+                    
+                    },
+                    scope: this,
+                    options: {
+                        single: true
+                    }
+                }
+            },
+            html: 
+            "<div class='pchooser'>" +
+            "   <div style='border-bottom: thin solid white; padding: 2px; background-color: green; color: white; text-align: center;'>" +
+            "       <span style='font-weight: bold; font-size: 14px;'>" + proc.getName() + "</span>" +
+            "       <div id='"+idVisible+"' class='pchooserBtnVisible'></div>" +
+            "       <div id='"+idColor+"' class='pchooserBtnColor' style='background-color: "+proc.color+";'></div>" +
+            "       <div id='"+idRemove+"' class='pchooserBtnRemove'>x</div>" +
+            "   </div>" +
+            "   <div style='font-size: 12px; border-bottom: thin solid green; padding: 2px; background-color: white; color: black; text-align: center;'>" +
+            "       <span style='font-style: italic;'>" + proc.service + ":" + proc.offering + "</span><br/>" +
+            "       <span>Fr:" + proc.getBeginPosition() + "</span><br/>" +
+            "       <span>To:" + proc.getEndPosition() + "</span><br/>" +
+            "       <span style='font-weight: bold;'>" + obsprop.join("<br>") + "</span>" +
+            "   </div>" +
+            "</div>"
+        });
+        
+        
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ProcedureGrid.js b/interface/app/view/ProcedureGrid.js
new file mode 100755
index 0000000..2bddf7f
--- /dev/null
+++ b/interface/app/view/ProcedureGrid.js
@@ -0,0 +1,510 @@
+/*
+ * File: app/view/ProcedureGrid.js
+ * Date: Mon Jan 21 2013 10:59:02 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.ProcedureGrid', {
+    extend: 'istsos.view.ui.ProcedureGrid',
+    alias: 'widget.proceduregrid',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+        this.addEvents('select','selectionchange','gridremoved');
+    },
+    resetConfig: function(conf){
+        this.readOnlyGrid = false;
+        this.observedProperty = null;
+        if (Ext.isObject(conf)) {
+            Ext.apply(this,conf);
+        }
+    },
+    initEditorGrid: function(procedures, procedureName, observedProperty){
+        
+        this.resetConfig({
+            readOnlyGrid: false,
+            observedProperty: observedProperty
+        });
+        
+        // @todo think something better shirker
+        this.procedures=procedures;
+        var procedure = procedures[procedureName];
+        this.procedure=procedure;
+        
+        if (!Ext.getStore('editorQiStore')) {
+            Ext.create('Ext.data.Store', {
+                storeId: 'editorQiStore',
+                autoLoad: true,
+                proxy: {
+                    type: 'ajax',
+                    url: Ext.String.format('{0}/istsos/services/{1}/dataqualities',wa.url, this.procedure.service),
+                    reader: {
+                        type: 'json',
+                        idProperty: 'code',
+                        root: 'data'
+                    }
+                },
+                fields: [
+                {
+                    name: 'code'
+                },
+                {
+                    name: 'combo',
+                    convert: function(v, record){
+                        return record.get('code')  + " - " + record.get('name');
+                    }
+                },
+                {
+                    name: 'name'
+                },
+                {
+                    name: 'description'
+                }
+                ]
+            });
+        }else{
+            Ext.getStore('editorQiStore').getProxy().url = Ext.String.format('{0}/istsos/services/{1}/dataqualities',wa.url, this.procedure.service);
+            Ext.getStore('editorQiStore').load();
+        }
+        
+        
+        
+        
+        Ext.get(this.id).mask("Initializing editor grid..");
+        
+        var properties = procedure.data.result.DataArray.field;
+        
+        var columns = [{
+            xtype: 'numbercolumn',
+            dataIndex: 'micro',
+            hidden: true,
+            hideable: false,
+            header: 'id'
+        },{
+            xtype: 'gridcolumn',
+            dataIndex: procedure.iso8601Field, // isodate is always present at position one
+            flex: 0.7,
+            header: 'Date'
+        }];
+        
+        for (var i = 1; i < properties.length; i++) {
+            
+            columns.push({
+                //xtype: 'numbercolumn',
+                header: properties[i].name,
+                dataIndex: procedure.storeConvertFieldToId[properties[i].definition],
+                definition: properties[i].definition,
+                flex: 0.4,
+                editor: {
+                    xtype: 'numberfield',
+                    decimalPrecision: 6,
+                    hideLabel: true,
+                    listeners: {
+                        change: function(form, newValue, oldValue, eOpts){
+                        //console.log("change: ");
+                        //console.dir(arguments);
+                        }
+                    }
+                }
+            },{
+                //xtype: 'gridcolumn',
+                header: 'qualityIndex',
+                dataIndex: procedure.storeConvertFieldToId[properties[i].definition+':qualityIndex'],
+                definition: Ext.String.format('{0}:qualityIndex',properties[i].definition),
+                flex: 0.3,
+                editor: {
+                    xtype: 'combobox',
+                    queryMode: 'local',
+                    allowBlank: false,
+                    hideLabel: true,
+                    displayField: 'combo',
+                    matchFieldWidth: false,
+                    listConfig: {
+                        minWidth: 200
+                    },
+                    store: 'editorQiStore',
+                    valueField: 'code',
+                    anchor: '100%'
+                }
+            });
+            i++;
+        }
+        
+        var observedProperty = this.observedProperty.definition;
+        for (var i = 2; i < columns.length; i++) {
+            if (//columns[i]['definition']==procedure.isodef && 
+                columns[i]['definition']!=observedProperty && 
+                columns[i]['definition']!=observedProperty+':qualityIndex') {
+                columns[i]['hidden']=true;
+            }
+        }
+        
+        this.grid = Ext.create('Ext.grid.Panel', {
+            xtype: 'grid',
+            //id: 'oegrid',
+            title: '',
+            store: procedure.store,
+            autoRender: true,
+            autoScroll: true,
+            viewConfig: {
+            
+            },
+            columns: columns,
+            plugins: [Ext.create('Ext.grid.plugin.CellEditing')],
+            selModel: Ext.create('Ext.selection.RowModel', {
+                allowDeselect: true,
+                mode: 'MULTI'
+            }),
+            listeners: {
+                select: function(grid, record, index, eOpts){
+                    this.fireEvent("select", this, grid, record, index, eOpts);
+                },
+                selectionchange: function(grid, selected, eOpts){
+                    this.fireEvent("selectionchange", this, grid, selected, eOpts);
+                },
+                scope: this
+            },
+            dockedItems: [
+            {
+                xtype: 'toolbar',
+                dock: 'top',
+                items: [
+                /*{
+                    xtype: 'filefield',
+                    emptyText: 'Load CSV..',
+                    labelWidth: 40
+                },*/
+                {
+                    xtype: 'button',
+                    flex: 1,
+                    id: 'btnSave',
+                    text: 'Save',
+                    disabled: true,
+                    handler: function(){
+                        if (this.procedure.store.getUpdatedRecords().length>0) {
+                            this.procedure.on("observationSaved",function(){
+                                this.destroyGrid();
+                            },this,{
+                                single: true
+                            });
+                            this.procedure.insertObservation();
+                        }else{
+                            Ext.Msg.alert('Info', 'Nothing to save.');
+                        }
+                    },
+                    scope: this
+                },
+                {
+                    xtype: 'button',
+                    flex: 1,
+                    id: 'btnCancel',
+                    text: 'Cancel',
+                    handler: function(){
+                        if (this.procedure.store.getUpdatedRecords().length>0) {
+                            Ext.Msg.show({
+                                title:'Confirm action',
+                                msg: 'There are unsaved changes, are you sure you want to continue this action?',
+                                buttons: Ext.Msg.YESNO,
+                                icon: Ext.Msg.QUESTION,
+                                fn: function(btn, text){
+                                    if (btn == 'yes'){
+                                        this.destroyGrid();
+                                        this.procedure.rejectModifications();
+                                    }
+                                },
+                                scope: this
+                            });
+                            
+                        }else{
+                            this.destroyGrid();
+                        }
+                    },
+                    scope: this
+                },
+                {
+                    xtype: 'button',
+                    flex: 1,
+                    id: 'btnCalc',
+                    text: 'Calculator',
+                    handler: function(){
+                        this.calcWin = Ext.create('Ext.window.Window', {
+                            title: 'Calculator',
+                            height: 190,
+                            width: 700,
+                            layout: 'fit',
+                            items: Ext.create('istsos.view.Calc',{
+                                id: 'calcpanel',
+                                grid: Ext.getCmp('proceduregrid').grid,
+                                procedure: this.procedure,
+                                procedures: this.procedures,
+                                observedproperty: this.observedProperty.definition
+                            })
+                        });
+                        this.calcWin.show();
+                    },
+                    scope: this
+                },
+                {
+                    xtype: 'button',
+                    flex: 1,
+                    id: 'btnSelectAll',
+                    text: 'Select all',
+                    handler: function(){
+                        var selectionModel = this.grid.getSelectionModel();
+                        selectionModel.selectAll(true);
+                    },
+                    scope: this
+                }
+                ]
+            }
+            ]
+        });
+        this.removeAll();
+        this.add(this.grid);
+        
+        this.procedure.store.on('update',function(){
+            this.enable();
+        },Ext.getCmp('btnSave'));
+        this.procedure.store.on('seriesupdated',function(){
+            this.enable();
+        },Ext.getCmp('btnSave'));
+        
+        Ext.get(this.id).unmask();
+        
+        
+    },
+    destroyGrid: function(){
+        Ext.getCmp('btnSave').disable();
+        this.removeAll();
+        delete this.grid;
+        this.fireEvent("gridremoved", this);
+    },
+    /*
+ * procedures is a dictionary of istsos.Sensor objects
+ * 
+ * {
+ *    "T_BIASCA": {istsos.Sensor}
+ * }
+ */
+    initReadOnlyGrid: function(procedures, observedProperty){
+        // @todo: Check if procedures has loaded some data
+        
+        
+        this.resetConfig({
+            readOnlyGrid: true,
+            observedProperty: observedProperty
+        });
+        this.procedures = procedures;
+        
+        Ext.get('gridpanel').mask("Initializing read only grid..");
+        
+        var keys = Object.keys(procedures);
+        keys = keys.sort();
+        
+        // Initialization of the grid store and the data model *****************
+        var modelFields = [
+        {
+            name: 'micro', 
+            type: 'int'
+        },
+
+        {
+            name: 'iso8601', 
+            type: 'string'
+        }            
+        ];
+        var template = {
+            micro: null,
+            iso8601: null
+        }
+        for (var c = 0; c < keys.length; c++) {
+            var key = keys[c];
+            if (Ext.Array.contains(procedures[key].getObservedProperties(),observedProperty)) {
+                modelFields.push({
+                    name: key, 
+                    type: 'string'
+                },{
+                    name: key+'_qi', 
+                    type: 'string'
+                });
+                template[key] = "-";
+                template[key+'_qi'] = "-";
+            }
+        }
+        // Creating data model
+        Ext.define('procedureGridDatamodel', {
+            extend: 'Ext.data.Model',
+            idProperty: "micro",
+            fields: modelFields
+        });
+        // Creating the store
+        this.store = Ext.create('Ext.data.Store', {
+            model: 'procedureGridDatamodel',
+            proxy: {
+                type: 'memory',
+                reader: {
+                    type: 'array',
+                    idProperty: 'micro'
+                }
+            }
+        });
+        // Suspends the firing of all events:
+        // Pass as true to queue up suspended events to be fired after 
+        // the resumeEvents call instead of discarding all suspended events.
+        this.store.suspendEvents(false);
+        // Merging loaded data to this grid store
+        
+        for (var c = 0; c < keys.length; c++) {
+            var key = keys[c];
+            if (Ext.Array.contains(procedures[key].getObservedProperties(),observedProperty)) {
+                
+                var recs = procedures[key].store.getRange();
+                
+                for (var j = 0, l = recs.length; j < l; j++) {
+                    
+                    var rec = null;
+                    var idx = this.store.indexOfId(recs[j].get("micro"));
+                    
+                    if (idx==-1) { // If record does not exist create a new one
+                        rec = Ext.create('procedureGridDatamodel', template);
+                        rec.set("micro",recs[j].get("micro"));
+                        rec.set("iso8601",recs[j].get("iso8601"));
+                        this.store.add(rec);
+                    }else{// if record exists then use it
+                        rec = this.store.getAt(idx);
+                    }
+                    
+                    // Set the property choosen in the chart store in the right column
+                    var v = parseFloat(recs[j].get(procedures[key].storeConvertFieldToId[observedProperty]));
+                    rec.set(key,v);
+                    rec.set(key+"_qi", recs[j].get(procedures[key].storeConvertFieldToId[observedProperty+":qualityIndex"]));   
+                    rec.commit(true);
+                }
+            }
+        }
+        this.store.sort('micro');
+        this.store.resumeEvents();
+        
+        
+        
+        // Initialization of the two always present columns ********************
+        var columns = [{
+            xtype: 'numbercolumn',
+            dataIndex: 'micro',
+            hidden: true,
+            hideable: false,
+            sortable: false,
+            header: 'id'
+        },{
+            xtype: 'gridcolumn',
+            dataIndex: 'iso8601', // isodate is always present at position one
+            sortable: false,
+            hideable: false,
+            width: 200,
+            //flex: 0.7,
+            header: 'Date'
+        }];
+        for (var c = 0; c < keys.length; c++) {
+            var key = keys[c];
+            // check if procedures loaded have the requested observed property
+            if (Ext.Array.contains(procedures[key].getObservedProperties(),observedProperty)) {
+                columns.push({
+                    xtype: 'gridcolumn',
+                    //xtype: 'numbercolumn',
+                    //format: "0'000.000000",
+                    dataIndex: key,
+                    hideable: false,
+                    sortable: false,
+                    //flex: 0.4,
+                    text: key
+                },{
+                    xtype: 'gridcolumn',
+                    dataIndex: key + "_qi",
+                    sortable: false,
+                    hideable: false,
+                    width: 40,
+                    flex: (c+1) == keys.length ? 1: null,
+                    text: 'QI'
+                });
+            }else{
+                console.log("Procedure \""+key+"\" has not the desired observed property: " + observedProperty);
+            }
+        }
+        
+        this.grid = Ext.create('Ext.grid.Panel', {
+            xtype: 'grid',
+            store: this.store,
+            autoRender: true,
+            autoScroll: true,
+            viewConfig: {
+            
+            },
+            columns: columns,
+            selModel: Ext.create('Ext.selection.RowModel', {
+                allowDeselect: true,
+                mode: 'MULTI'
+            }),
+            listeners: {
+                select: function(grid, record, index, eOpts){
+                    this.fireEvent("select", this, grid, record, index, eOpts);
+                },
+                selectionchange: function(grid, selected, eOpts){
+                    this.fireEvent("selectionchange", this, grid, selected, eOpts);
+                },
+                scope: this
+            }
+        });
+        
+        this.removeAll();
+        this.add(this.grid);
+        
+        Ext.get('gridpanel').unmask();
+        
+    },
+    /*
+ * MicroArray can be of two type:
+ * 1. one array with an integer representing a micro id to be highlighted
+ *    example: [1351326600000000] 
+ * 2. one array with two integers representing an interval of micro ids to be highlighted
+ *    example: [1351326000000000,1351327000000000] 
+ */
+    updateGridSelection: function(microArray){
+        if (!Ext.isEmpty(this.grid)) {
+            var selectionModel, store;
+            this.suspendEvents(false);
+            if (microArray.length==2) {
+                selectionModel = this.grid.getSelectionModel();
+                store = this.grid.getStore();
+                var idx1 = store.find('micro',microArray[0]);
+                var idx2 = store.find('micro',microArray[1]);
+                selectionModel.selectRange(idx1,idx2);
+            }else if (microArray.length==1) {
+                selectionModel = this.grid.getSelectionModel();
+                store = this.grid.getStore();
+                var idx1 = store.find('micro',microArray[0]);
+                selectionModel.select(idx1);
+            }
+            this.resumeEvents();
+        }
+    },
+    removeProcedure: function(procedure){
+        delete this.procedures[procedure.getName()];
+        if (Ext.Object.getSize(this.procedures)==0) {
+            this.removeAll();
+        }else{
+            if (this.readOnlyGrid) {
+                this.initReadOnlyGrid(
+                    this.procedures,
+                    this.observedProperty);
+            }
+        }
+    }
+});
diff --git a/interface/app/view/ProcedureGridEditor.js b/interface/app/view/ProcedureGridEditor.js
new file mode 100755
index 0000000..1b6f123
--- /dev/null
+++ b/interface/app/view/ProcedureGridEditor.js
@@ -0,0 +1,123 @@
+/*
+ * File: app/view/ProcedureGridEditor.js
+ * Date: Wed Jan 30 2013 16:04:05 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.ProcedureGridEditor', {
+    extend: 'istsos.view.ui.ProcedureGridEditor',
+    alias: 'widget.proceduregrideditor',
+
+    initComponent: function() {
+        
+        Ext.create('Ext.data.Store', {
+            storeId: 'editableProcedure',
+            proxy: {
+                type: 'ajax',
+                reader: {
+                    type: 'json',
+                    idProperty: 'name',
+                    root: 'data'
+                }
+            },
+            fields: [
+            {
+                name: 'name',
+                sortType: 'asText',
+                type: 'string'
+            },
+            {
+                name: 'offerings'
+            },
+            {
+                name: 'observedproperties'
+            }
+            ]
+        });
+        
+        var me = this;
+        me.callParent(arguments);
+        
+        this.addEvents('select','selectionchange');
+        
+        this.gridpanel = Ext.getCmp("proceduregrid");
+        this.gridpanel.on('select',function(gridpanel, grid, record, index, eOpts){
+            this.fireEvent("select", gridpanel, grid, record, index, eOpts);
+        },this);
+        this.gridpanel.on('selectionchange',function(gridpanel, grid, selected, eOpts){
+            this.fireEvent("selectionchange", gridpanel, grid, selected, eOpts);
+        },this);
+        this.procedures = {};
+        
+        Ext.getCmp('btnStartEditor').on("click",this.startEditing,this);
+        
+        this.gridpanel.on('gridremoved',function(){
+            //this.getComponent('buttonspanel').setVisible(true);
+            //this.getComponent('buttonspanel').enable();
+        },this);
+        
+    },
+    /*
+    * Load the procedure name in the combo
+    */
+    addProcedure: function(procedure){
+        this.procedures[procedure.getName()] = procedure;
+        var ps = Ext.getStore("editableProcedure");
+        var data = [];
+        for (var key in this.procedures) {
+            data.push({
+                name: this.procedures[key].getName()
+            });
+        }
+        // Append the procedure name in the store used by combos
+        ps.loadData(data);
+        if (ps.data.length>0) {
+            Ext.getCmp('oeCbEditableProcedures').setValue(ps.getAt(0));
+        }
+    },
+    /*
+    * Remove the procedure from the combo
+    */
+    removeProcedure: function(procedure){
+        delete this.procedures[procedure.getName()];
+        var ps = Ext.getStore("editableProcedure");
+        var data = [];
+        for (var key in this.procedures) {
+            data.push({
+                name: this.procedures[key].getName()
+            });
+        }
+        // Append the procedure name in the store used by combos
+        ps.loadData(data);
+        if (ps.data.length>0) {
+            Ext.getCmp('oeCbEditableProcedures').setValue(ps.getAt(0));
+        }
+    },
+    setObservedProperty: function(observedProperty){
+        this.observedProperty = observedProperty;
+    },
+    startEditing: function(){
+        var combo = Ext.getCmp('oeCbEditableProcedures');
+        if (!combo.isValid()) {
+            Ext.Msg.alert('Warning', 'Please choose a valid procedure from the combo box.');
+            return;
+        }
+        if (Ext.isEmpty(this.observedProperty)) {
+            Ext.Msg.alert('Warning', 'The observed property is not selected');
+            return;
+        }
+        this.gridpanel.initEditorGrid(this.procedures, combo.getValue(), this.observedProperty);
+        //this.getComponent('buttonspanel').setVisible(false);
+        //this.getComponent('buttonspanel').disable();
+    },
+    updateGridSelection: function(x){
+        this.gridpanel.updateGridSelection(x);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ProcedurePlotter.js b/interface/app/view/ProcedurePlotter.js
new file mode 100755
index 0000000..318d9cf
--- /dev/null
+++ b/interface/app/view/ProcedurePlotter.js
@@ -0,0 +1,38 @@
+/**
+ * istSOS WebAdmin - Istituto Scienze della Terra
+ * Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+ *
+ * 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 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+Ext.define('istsos.view.ProcedurePlotter', {
+    extend: 'istsos.view.ui.ProcedurePlotter',
+    alias: 'widget.procedureplotter',
+
+    initComponent: function() {
+        var me = this;
+        
+        Ext.create('istsos.store.ObservedProperties');
+        
+        me.callParent(arguments);
+        
+        var offset = (new Date()).getTimezoneOffset()/-60;
+        var tz = ((offset > 0) ? "+"+pad(offset) : pad(offset));
+        Ext.getCmp('oeBeginTime').format = 'H:i ['+tz+']';
+        Ext.getCmp('oeBeginTime').setValue(Ext.Date.parse("00:00", 'H:i'));
+        Ext.getCmp('oeEndTime').format = 'H:i ['+tz+']';
+        Ext.getCmp('oeEndTime').setValue(Ext.Date.parse("00:00", 'H:i'));
+        
+    }
+});
diff --git a/interface/app/view/TestCsv.js b/interface/app/view/TestCsv.js
new file mode 100755
index 0000000..5eb669b
--- /dev/null
+++ b/interface/app/view/TestCsv.js
@@ -0,0 +1,127 @@
+/*
+ * File: app/view/TestCsv.js
+ * Date: Fri Dec 07 2012 17:05:12 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+function logger(msg) {
+    var log = Ext.getCmp("logger");
+    log.setValue(
+        Ext.isEmpty(log.getValue()) ? 
+        Ext.Date.format(new Date(), 'c') + ": " + msg: 
+        log.getValue() + "\n" + Ext.Date.format(new Date(), 'c') + ": " + msg
+        );
+}
+
+
+Ext.define('istsos.view.TestCsv', {
+    extend: 'istsos.view.ui.TestCsv',
+    id: 'mytest',
+    initComponent: function() {
+        var me = this;
+        
+        this.procedures = {};
+        
+        Ext.create('istsos.store.Offerings');
+        Ext.create('istsos.store.gridProceduresList');
+        Ext.create('istsos.store.ObservedProperties');
+        
+        var ssrv = Ext.create('istsos.store.Services');
+        ssrv.getProxy().url = Ext.String.format('{0}/istsos/services',wa.url);
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp("cmbServices").on("select",function(combo, records, eOpts){
+            
+            var o = Ext.getCmp('oeCbOffering');
+            o.reset();
+            o.disable();
+            
+            o.getStore().load({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/operations/getlist',
+                    wa.url,combo.getValue()),
+                callback: function(records, operation, success){
+                    this.enable();
+                },
+                scope: o
+            });
+        });
+        
+        Ext.getCmp("oeCbOffering").on("select",function(combo, records, eOpts){
+            
+            var pr = Ext.getCmp('oeCbProcedure');
+            pr.reset();
+            pr.disable();
+            pr.getStore().load({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/{2}/procedures/operations/memberslist',
+                    wa.url,Ext.getCmp('cmbServices').getValue(),combo.getValue()),
+                callback: function(records, operation, success){
+                    this.enable();
+                },
+                scope: pr
+            });
+            
+        });
+        
+        Ext.getCmp("oeCbProcedure").on("select",function(combo, records, eOpts){
+            
+            var service = Ext.getCmp("cmbServices").getValue();
+            var offering = Ext.getCmp("oeCbOffering").getValue();
+            var procedure = combo.getValue();
+            
+            this.procedures[procedure] = Ext.create('istsos.Sensor', 
+                service, offering, procedure, {
+                    listeners: {
+                        metadataLoaded: function(){
+                            logger("procedure "+ procedure+ " loaded.");
+                        },
+                        scope: this
+                    }
+                });
+                
+        },this);
+        
+        Ext.getCmp("btncsv").on("change",function(filefield, filename){
+            
+            var pname = Ext.getCmp("oeCbProcedure").getValue();
+            
+            // validate file name
+            try {
+                
+                istsos.utils.validatefilename(this.procedures[pname], filename);
+                
+                logger("file name "+ filename + " is valid.");
+                
+                var fileList = filefield.fileInputEl.dom.files;
+                
+                //var parser = istsos.utils.getParser();
+                /*parser.on("csvfileparsed",function(text){
+                    console.log(text);
+                });*/
+                istsos.utils.parsecsvfile(this.procedures[pname], fileList, filename, 
+                    function(text){
+                        
+                        console.log(text);
+                        logger("Loaded: " + text.total);
+                        logger("Begin: " + istsos.utils.micro2iso(text.begin));
+                        logger("End: " + istsos.utils.micro2iso(text.end));
+                        logger("Is " + text.isregular?"regular":"not regular");
+                        
+                    }
+                );
+                
+            } catch(e){
+                alert(e);
+            }
+            
+        },this);
+        
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/Viewer.js b/interface/app/view/Viewer.js
new file mode 100755
index 0000000..e714cf9
--- /dev/null
+++ b/interface/app/view/Viewer.js
@@ -0,0 +1,79 @@
+/**
+ * istSOS WebAdmin - Istituto Scienze della Terra
+ * Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+ *
+ * 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 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+Ext.define('istsos.view.Viewer', {
+    extend: 'istsos.view.ui.Viewer',
+
+    initComponent: function() {
+        
+        var me = this;
+        me.callParent(arguments);
+        
+        Ext.getCmp('pchoose').on("procedureAdded",function(procedure) {
+            this.addProcedure(procedure);
+        },Ext.getCmp('chartpanel'));
+        
+        Ext.getCmp('pchoose').on("procedureRemoved",function(procedure) {
+            this.removeProcedure(procedure);
+        },Ext.getCmp('chartpanel'));
+        
+        Ext.getCmp('pchoose').on("procedureRemoved",function(procedure) {
+            this.removeProcedure(procedure);
+        },Ext.getCmp('gridpanel'));
+        
+        Ext.getCmp('chartpanel').on("queueLoaded",function(chartpanel) {
+            this.initReadOnlyGrid(
+                chartpanel.procedures,
+                Ext.getCmp("oeCbObservedProperty").getValue());
+        },Ext.getCmp("gridpanel"));
+        
+        Ext.getCmp('chartpanel').on("clickCallback",function(panel, e, x, pts) {
+            this.updateGridSelection([x]);
+            panel.highlightRegion(x);
+        },Ext.getCmp('gridpanel'));
+        
+        /*Ext.getCmp('gridpanel').on("select",function(panel, grid, record, index, eOpts) {
+            console.log("select:");
+            console.dir(arguments);
+        },Ext.getCmp('chartpanel'));*/
+        
+        Ext.getCmp('gridpanel').on("selectionchange",function(panel, grid, selected, eOpts) {
+            
+            if (selected.length==1) {
+                //this.addAnnotation(selected[0].get('micro'));
+                this.highlightRegion(selected[0].get('micro'));
+            }else if (selected.length>1) {
+                var rec, begin, end;
+                rec = selected[0];
+                begin = rec.get('micro');
+                rec = selected[selected.length-1];
+                end = rec.get('micro');
+                this.highlightRegion(begin,end);
+            }else if (selected.length==0) {
+                this.highlightRegion();
+                this.removeAnnotations();
+            }
+        },Ext.getCmp('chartpanel'));
+        
+        /*Ext.getCmp('chartpanel').on("underlayCallback",function(panel, e, x, pts) {
+            console.log("underlayCallback:");
+            console.dir(arguments);
+        });*/
+        
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/VirtualProcedureEditor.js b/interface/app/view/VirtualProcedureEditor.js
new file mode 100755
index 0000000..379757f
--- /dev/null
+++ b/interface/app/view/VirtualProcedureEditor.js
@@ -0,0 +1,391 @@
+Ext.define('istsos.view.VirtualProcedureEditor', {
+    extend: 'istsos.view.ui.VirtualProcedureEditor',
+    alias: 'widget.virtualprocedureeditor',
+
+    initComponent: function() {
+        var me = this;
+        
+        // Store for the rating curve grid
+        var ratingCurveStore = Ext.create('istsos.store.RatingCurve');
+        Ext.define('ratingCurveModel', {
+            extend: 'Ext.data.Model',
+            fields: [
+                {
+                    name: 'from',
+                    type: 'date'
+                },
+                {
+                    name: 'to',
+                    type: 'date'
+                },
+                {
+                    name: 'low_val',
+                    type: 'float'
+                },
+                {
+                    name: 'up_val',
+                    type: 'float'
+                },
+                {
+                    name: 'A',
+                    type: 'float'
+                },
+                {
+                    name: 'B',
+                    type: 'float'
+                },
+                {
+                    name: 'C',
+                    type: 'float'
+                },
+                {
+                    name: 'K',
+                    type: 'float'
+                }
+            ]
+        });
+        
+        // Store for combo listing virtual procedures
+        var plist = Ext.create('istsos.store.vplist');
+        plist.getProxy().url = Ext.String.format(
+            '{0}/istsos/services/{1}/virtualprocedures/operations/getlist', 
+            wa.url, this.istService
+        );
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp('vppanel').mask = new Ext.LoadMask(Ext.getCmp('vppanel'), {msg:"Please wait..."});
+        
+        
+        // Refresh combo store of virtual procedures every time it is expanded
+        /*Ext.getCmp('vpcmbplist').on("expand",function(combo){
+            this.removeAll();
+            this.load();
+        },plist);*/
+        
+        // When virtual procedure is selected in combo load rating curve grid
+        Ext.getCmp('vpcmbplist').on("select",function(combo, record, index, eOpts){
+            this.loadRatingCurve(record[0].get('name'));
+            this.loadCode(record[0].get('name'));
+        },this);
+        
+        
+        // *****************************************
+        //              CODE EDITOR
+        // *****************************************
+        
+        this.codeExist = false;
+        
+        Ext.getCmp('vpcodingform').add(
+            Ext.create('Ext.ux.form.field.CodeMirror', {
+                anchor: '100%',
+                name: 'code',
+                flex: 1,
+                mode: {
+                    name: "python",
+                    version: 2,
+                    singleLineStringErrors: false
+                },
+                hideLabel:  true,
+                enableLineNumbers: true,
+                lineNumbers: true,
+                enableIndentWithTabs: false,
+                indentUnit: 4,
+                tabMode: "shift",
+                matchBrackets: true
+            })
+        );
+        
+        
+        Ext.getCmp('vpbtnsavecode').on('click',function(){
+            
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/services/{1}/virtualprocedures/{2}/code', 
+                    wa.url, 
+                    this.istService, 
+                    Ext.getCmp('vpcmbplist').getValue()),
+                scope: this,
+                method: this.codeExist? "PUT": "POST",
+                jsonData: Ext.getCmp('vpcodingform').getValues(),
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    if (!json.success && !Ext.isEmpty(json.message)) {
+                        Ext.Msg.alert('Warning', json['message']);
+                    }else{
+                        this.loadCode(Ext.getCmp('vpcmbplist').getValue());
+                    }
+                }
+            });
+            
+        },this);
+        
+        Ext.getCmp('vpbtndeletecode').on('click',function(){
+            Ext.Msg.show({
+                title:'Erasing rating curve',
+                msg: 'Are you sure you want to erase the rating curve data?',
+                buttons: Ext.Msg.YESNO,
+                icon: Ext.Msg.QUESTION,
+                scope: this,
+                fn: function(btn){
+                    if (btn == 'yes'){
+                        Ext.Ajax.request({
+                            url: Ext.String.format('{0}/istsos/services/{1}/virtualprocedures/{2}/code', 
+                                wa.url, 
+                                this.istService, 
+                                Ext.getCmp('vpcmbplist').getValue()),
+                            scope: this,
+                            method: "DELETE",
+                            success: function(response){
+                                var json = Ext.decode(response.responseText);
+                                if (!json.success && !Ext.isEmpty(json.message)) {
+                                    Ext.Msg.alert('Warning', json['message']);
+                                }else{
+                                    this.loadCode(Ext.getCmp('vpcmbplist').getValue());
+                                }
+                            }
+                        });
+                    }
+                }
+            });
+            
+        },this);
+        
+        
+        // *****************************************
+        //           RATING CURVE EDITOR
+        // *****************************************
+        
+        var ratingCurveGrid = Ext.getCmp('vpgridratingcurve');
+        
+        // Add row on rating curve grid @ end
+        Ext.getCmp('vpbtnaddrc').on('click',function(){
+            var row = this.store.getCount();
+            var r = Ext.create('ratingCurveModel');            
+            if (row>0){
+                var previous = this.store.getAt(row-1);
+                r.set("from",previous.get("to"));
+            }
+            this.store.insert(row, r);
+            if (row>0){
+                this.editingPlugin.startEditByPosition({row: row, column: 1});
+            }
+        },ratingCurveGrid);
+        
+        // Add row on rating curve grid above selection
+        Ext.getCmp('vpbtnaddbelowrc').on('click',function(){
+            var r = Ext.create('ratingCurveModel');
+            var sm = this.getSelectionModel();
+            var previous = sm.selected.items[0];
+            r.set("from",previous.get("to"));
+            var row = this.store.indexOf(previous)+1;
+            this.store.insert(row, r);
+            this.editingPlugin.startEditByPosition({row: row, column: 0});
+        },ratingCurveGrid);
+        
+        // Add row on rating curve grid below selection
+        Ext.getCmp('vpbtnaddaboverc').on('click',function(){
+            var r = Ext.create('ratingCurveModel');
+            var sm = this.getSelectionModel();
+            var firstSelection = sm.selected.items[0];
+            var row = this.store.indexOf(firstSelection);
+            this.store.insert(row, r);
+            this.editingPlugin.startEditByPosition({row: row, column: 0});
+        },ratingCurveGrid);
+        
+        // Remove selected row from rating curve grid
+        Ext.getCmp('vpbtnremoverc').on('click',function(){
+            var r = Ext.create('ratingCurveModel');
+            var sm = this.getSelectionModel();
+            var firstSelection = sm.selected.items[0];
+            this.store.remove(sm.selected.items[0]);
+            Ext.getCmp('vpbtnaddbelowrc').disable();
+            Ext.getCmp('vpbtnaddaboverc').disable();
+            Ext.getCmp('vpbtnremoverc').disable();
+        },ratingCurveGrid);
+        
+        // Enable buttons when grid rows selected
+        ratingCurveGrid.getSelectionModel().on("select",function(){
+            Ext.getCmp('vpbtnaddbelowrc').enable();
+            Ext.getCmp('vpbtnaddaboverc').enable();
+            Ext.getCmp('vpbtnremoverc').enable();
+        });
+        
+        // Enable buttons when grid rows deselected
+        ratingCurveGrid.getSelectionModel().on("deselect",function(){
+            Ext.getCmp('vpbtnaddbelowrc').disable();
+            Ext.getCmp('vpbtnaddaboverc').disable();
+            Ext.getCmp('vpbtnremoverc').disable();
+        });
+        
+        Ext.getCmp('vpbtnsaverc').on('click',function(){
+                    
+            try{
+                this.validateRatingCurve();
+            }catch (e){
+                Ext.Msg.alert('Validation error', e);
+                return;
+            }
+            
+            var recs = Ext.getCmp('vpgridratingcurve').store.getRange();
+            var data = [];
+            
+            for (var c = 0; c < recs.length; c++){
+                var rec = recs[c];
+                data.push({
+                    "from": Ext.Date.format(rec.data.from,'c'), 
+                    "to": Ext.Date.format(rec.data.to,'c'), 
+                    "up_val": ""+rec.get("up_val"), 
+                    "low_val": ""+rec.get("low_val"), 
+                    "A": ""+rec.get("A"), 
+                    "B": ""+rec.get("B"), 
+                    "C": ""+rec.get("C"), 
+                    "K": ""+rec.get("K")
+                });
+            }
+            
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/services/{1}/virtualprocedures/{2}/ratingcurve', 
+                    wa.url, 
+                    this.istService, 
+                    Ext.getCmp('vpcmbplist').getValue()),
+                scope: this,
+                method: "POST",
+                jsonData: data,
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    if (!json.success && !Ext.isEmpty(json.message)) {
+                        Ext.Msg.alert('Warning', json['message']);
+                    }else{
+                        this.loadRatingCurve(Ext.getCmp('vpcmbplist').getValue());
+                    }
+                }
+            });
+            
+        },this);
+        
+        Ext.getCmp('vpbtndeleterc').on('click',function(){
+            
+            Ext.Msg.show({
+                title:'Erasing rating curve',
+                msg: 'Are you sure you want to erase the rating curve data?',
+                buttons: Ext.Msg.YESNO,
+                icon: Ext.Msg.QUESTION,
+                scope: this,
+                fn: function(btn){
+                    if (btn == 'yes'){
+                        Ext.Ajax.request({
+                            url: Ext.String.format('{0}/istsos/services/{1}/virtualprocedures/{2}/ratingcurve', 
+                                wa.url, this.istService, Ext.getCmp('vpcmbplist').getValue()),
+                            scope: this,
+                            method: "DELETE",
+                            success: function(response){
+                                var json = Ext.decode(response.responseText);
+                                if (!json.success && !Ext.isEmpty(json.message)) {
+                                    Ext.Msg.alert('Warning', json['message']);
+                                }else{
+                                    this.loadRatingCurve(Ext.getCmp('vpcmbplist').getValue());
+                                }
+                            }
+                        });      
+                    }
+                }
+            });
+        },this);
+        
+    },
+    loadRatingCurve: function(procedure){
+        Ext.getCmp('vppanel').mask.show();
+        Ext.getCmp('vpgridratingcurve').store.removeAll();
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services/{1}/virtualprocedures/{2}/ratingcurve', 
+                wa.url, this.istService, procedure),
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    Ext.getCmp('vpgridratingcurve').store.loadData(json.data);
+                }else{
+                    console.log(json.message);
+                }
+                Ext.getCmp('vppanel').mask.hide();
+            }
+        });
+    },
+    // Validate single row of the rating curve grid
+    validateRatingCurveRecord: function(rec){
+        Ext.Array.each(['from','to'], function(key) {
+            if (!Ext.isDate(rec.get(key))){
+                throw "\""+key+"\" field must be a valid date";
+            }
+        });
+        Ext.Array.each(['A','B','C','K','up_val','low_val'], function(key) {
+            if (!Ext.isNumeric(rec.get(key))){
+                throw "\""+key+"\" field must be numeric";
+            }
+        });
+    },
+    // Validate all rows of the rating curve grid
+    validateRatingCurve: function(){
+        var recs = Ext.getCmp('vpgridratingcurve').store.getRange();
+        if (recs.length==0){
+            throw "The rating curve data grid is empty";
+        }
+        var from, to;
+        for (var c = 0; c < recs.length; c++){
+        
+            var rec = recs[c];
+            
+            try{
+                this.validateRatingCurveRecord(rec);
+            }catch (e){
+                throw 'Line ' + (c+1) + ': ' + e;
+            }
+            
+            // Check dates
+            if (c===0){
+                from = rec.get('from');
+                to = rec.get('to');
+                low = rec.get('low_val');
+                up = rec.get('up_val');
+            }else{
+                if (rec.get('from').getTime() == from.getTime() && rec.get('to').getTime() == to.getTime()){
+                    if (rec.get('low_val') != up){
+                        throw 'Line ' + (c+1) + ' [Low/Up error]: \"Low\" must be equal to \"Up\" in previous line';
+                    }
+                }else if (rec.get('from').getTime()  != to.getTime() ){
+                    throw 'Line ' + (c+1) + ' [Date error]: \"From\" must be equal to \"To\" in previous line';
+                }
+                from = rec.get('from');
+                to = rec.get('to');
+                low = rec.get('low_val');
+                up = rec.get('up_val');
+            }
+            if (from>=to){
+                throw 'Line ' + (c+1) + ' [Date error]: \"From\" must be prior to \"To\"';
+            }
+        }
+    },
+    loadCode: function(procedure){
+        Ext.getCmp('vppanel').mask.show();
+        Ext.getCmp('vpcodingform').loadRecord( { data:{code:''} });
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services/{1}/virtualprocedures/{2}/code', 
+                wa.url, this.istService, procedure),
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    //Ext.getCmp('vpgridratingcurve').store.loadData(json.data);
+                    Ext.getCmp('vpcodingform').loadRecord(json);
+                    this.codeExist = true;
+                }else{
+                    console.log(json.message);
+                    this.codeExist = false;
+                }
+                Ext.getCmp('vppanel').mask.hide();
+            }
+        });
+    }
+});
diff --git a/interface/app/view/Wizard.js b/interface/app/view/Wizard.js
new file mode 100755
index 0000000..3f0a273
--- /dev/null
+++ b/interface/app/view/Wizard.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/Wizard.js
+ * Date: Wed Apr 04 2012 18:12:58 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.Wizard', {
+    extend: 'istsos.view.ui.Wizard',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/about.js b/interface/app/view/about.js
new file mode 100755
index 0000000..009bc50
--- /dev/null
+++ b/interface/app/view/about.js
@@ -0,0 +1,33 @@
+/*
+ * File: app/view/about.js
+ * Date: Fri Apr 20 2012 08:54:29 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.about', {
+    extend: 'istsos.view.ui.about',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    },
+    operationLoad: function() {
+        this.on("operationGet",function(json){
+            if (json["data"]["istsos_update"]){
+                Ext.getCmp("changelog").setVisible(json["data"]["istsos_update"]);
+                Ext.getCmp("download").setVisible(json["data"]["istsos_update"]);
+                Ext.getCmp("download").setValue("<a href='"+ 
+                    json["data"]["download_url"]+"' target='_BLANK'>"+
+                    json["data"]["download_url"]+"</a>");
+                Ext.getCmp("updates").setFieldStyle("color: red;");
+            }
+        },this);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/config.js b/interface/app/view/config.js
new file mode 100755
index 0000000..05b1295
--- /dev/null
+++ b/interface/app/view/config.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/config.js
+ * Date: Thu Apr 05 2012 15:33:59 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.config', {
+    extend: 'istsos.view.ui.config',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/contactinfo.js b/interface/app/view/contactinfo.js
new file mode 100755
index 0000000..a47a0f0
--- /dev/null
+++ b/interface/app/view/contactinfo.js
@@ -0,0 +1,20 @@
+/*
+ * File: app/view/contactinfo.js
+ * Date: Thu Apr 05 2012 10:59:40 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.contactinfo', {
+    extend: 'istsos.view.ui.contactinfo',
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/contacts.js b/interface/app/view/contacts.js
new file mode 100755
index 0000000..49f2c9a
--- /dev/null
+++ b/interface/app/view/contacts.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/contacts.js
+ * Date: Thu Apr 05 2012 15:30:43 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.contacts', {
+    extend: 'istsos.view.ui.contacts',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/database.js b/interface/app/view/database.js
new file mode 100755
index 0000000..1584f25
--- /dev/null
+++ b/interface/app/view/database.js
@@ -0,0 +1,58 @@
+/*
+ * File: app/view/database.js
+ * Date: Thu Apr 05 2012 15:35:37 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.database', {
+    extend: 'istsos.view.ui.database',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+        
+        Ext.getCmp('btnTestConnection').on("click",function(){
+            if (Ext.isEmpty(this.mask)) {
+                this.mask = new Ext.LoadMask(this.body, {
+                    msg:"Please wait..."
+                });
+            }
+            this.mask.show();
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/operations/validatedb', wa.url),
+                scope: this,
+                method: 'POST',
+                jsonData: this.getForm().getValues(),
+                success: function(response){
+                    this.mask.hide();
+                    var json = Ext.decode(response.responseText);
+                    if (json['success']) {
+                        Ext.MessageBox.show({
+                            title: 'Test success',
+                            msg: "Database: " + json['data']['database'] + "<br/><br/>" + 
+                                "<small>"+json['message']+"</small>",
+                            buttons: Ext.MessageBox.OK,
+                            icon: Ext.Msg.INFO,
+                            animateTarget: 'btnTestConnection'
+                        });
+                    }else{
+                        Ext.MessageBox.show({
+                            title: 'Test failure',
+                            msg: json['message'],
+                            buttons: Ext.MessageBox.OK,
+                            icon: Ext.Msg.WARNING,
+                            animateTarget: 'btnTestConnection'
+                        });
+                    }
+                }
+            });
+        },this);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/geo.js b/interface/app/view/geo.js
new file mode 100755
index 0000000..db5634e
--- /dev/null
+++ b/interface/app/view/geo.js
@@ -0,0 +1,24 @@
+/*
+ * File: app/view/geo.js
+ * Date: Tue Apr 17 2012 17:03:01 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.geo', {
+    extend: 'istsos.view.ui.geo',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+        if (this.istService!='default') {
+            Ext.getCmp('defaultepsg').setReadOnly(true);
+        }
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/getobservation.js b/interface/app/view/getobservation.js
new file mode 100755
index 0000000..b3d60dc
--- /dev/null
+++ b/interface/app/view/getobservation.js
@@ -0,0 +1,147 @@
+/*
+ * File: app/view/getobservation.js
+ * Date: Wed Apr 18 2012 13:50:28 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+
+Ext.define('istsos.view.getobservation', {
+    extend: 'istsos.view.ui.getobservation',
+
+    initComponent: function() {
+        var me = this;
+        
+        this.store = Ext.create('Ext.data.Store', {
+            storeId: 'qistore',
+            autoLoad: this.istService=='default'?false:true,
+            proxy: {
+                type: 'ajax',
+                url: Ext.String.format('{0}/istsos/services/{1}/dataqualities',wa.url, this.istService),
+                reader: {
+                    type: 'json',
+                    idProperty: 'code',
+                    root: 'data'
+                }
+            },
+            fields: [
+            {
+                name: 'code'
+            },            
+            {
+                name: 'name'
+            },
+            {
+                name: 'description'
+            },
+            {
+                name: 'display',
+                convert: function(v, record){
+                    return record.get('code') + " - " + record.get('name') + " (" + record.get('description') + ")";
+                }
+            }
+            ]
+        });
+        
+        me.callParent(arguments);
+        
+        var items = [{
+            xtype: 'checkboxfield',
+            name: 'transactional_log',
+            fieldLabel: 'Transactional request logger',
+            boxLabel: 'Enabled if checked',
+            inputValue: 'True',
+            uncheckedValue: 'False',
+            anchor: '100%'
+        }];
+        
+        if (this.istService!='default') {
+            items = items.concat([{
+                xtype: 'combobox',
+                name: 'defaultqi',
+                fieldLabel: 'Default quality index',
+                displayField: 'display',
+                forceSelection: true,
+                queryMode: 'local',
+                store: 'qistore',
+                typeAhead: true,
+                valueField: 'code',
+                anchor: '100%'
+            },
+            {
+                xtype: 'combobox',
+                name: 'correct_qi',
+                fieldLabel: 'Correct quality index',
+                displayField: 'display',
+                forceSelection: true,
+                queryMode: 'local',
+                store: 'qistore',
+                typeAhead: true,
+                valueField: 'code',
+                anchor: '100%'
+            },
+            {
+                xtype: 'combobox',
+                name: 'stat_qi',
+                fieldLabel: 'Stat. quality index',
+                displayField: 'display',
+                forceSelection: true,
+                queryMode: 'local',
+                store: 'qistore',
+                typeAhead: true,
+                valueField: 'code',
+                anchor: '100%'
+            },
+            {
+                xtype: 'combobox',
+                name: 'aggregatenodataqi',
+                fieldLabel: 'Aggregation no-data quality index',
+                displayField: 'display',
+                forceSelection: true,
+                queryMode: 'local',
+                store: 'qistore',
+                typeAhead: true,
+                valueField: 'code',
+                anchor: '100%'
+            }]);
+        }else{
+            items = items.concat([{
+                xtype: 'textfield',
+                name: 'defaultqi',
+                fieldLabel: 'Default quality index',
+                anchor: '100%'
+            },
+            {
+                xtype: 'textfield',
+                name: 'correct_qi',
+                fieldLabel: 'Correct quality index',
+                anchor: '100%'
+            },
+            {
+                xtype: 'textfield',
+                name: 'stat_qi',
+                fieldLabel: 'Stat. quality index',
+                anchor: '100%'
+            },
+            {
+                xtype: 'textfield',
+                name: 'aggregatenodataqi',
+                fieldLabel: 'Aggregation no-data quality index',
+                anchor: '100%'
+            }]);
+        }
+        items = items.concat([{
+            xtype: 'textfield',
+            name: 'aggregatenodata',
+            fieldLabel: 'Aggregation no-data value',
+            anchor: '100%'
+        }]);
+        Ext.getCmp('getobsconfig').add(items);
+    }
+});
diff --git a/interface/app/view/identification.js b/interface/app/view/identification.js
new file mode 100755
index 0000000..68697a7
--- /dev/null
+++ b/interface/app/view/identification.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/identification.js
+ * Date: Thu Apr 12 2012 09:08:03 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.identification', {
+    extend: 'istsos.view.ui.identification',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/newservice.js b/interface/app/view/newservice.js
new file mode 100755
index 0000000..4afc393
--- /dev/null
+++ b/interface/app/view/newservice.js
@@ -0,0 +1,115 @@
+Ext.define('istsos.view.newservice', {
+    extend: 'istsos.view.ui.newservice',
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+        Ext.getCmp('btnTestConnection').on("click",function(){
+            
+            if (Ext.isEmpty(this.mask)) {
+                this.mask = new Ext.LoadMask(this.body, {
+                    msg:"Please wait..."
+                });
+            }
+            this.mask.show();
+            
+            console.dir(this.getForm().getValues())
+            
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/operations/validatedb', wa.url),
+                scope: this,
+                method: 'POST',
+                jsonData: this.getForm().getValues(),
+                success: function(response){
+                    this.mask.hide();
+                    var json = Ext.decode(response.responseText);
+                    if (json['success']) {
+                        Ext.MessageBox.show({
+                            title: 'Test success',
+                            msg: "Database: " + json['data']['database'] + "<br/><br/>" + 
+                                "<small>"+json['message']+"</small>",
+                            buttons: Ext.MessageBox.OK,
+                            icon: Ext.Msg.INFO,
+                            animateTarget: 'btnTestConnection'
+                        });
+                    }else{
+                        Ext.MessageBox.show({
+                            title: 'Test failure',
+                            msg: json['message'],
+                            buttons: Ext.MessageBox.OK,
+                            icon: Ext.Msg.WARNING,
+                            animateTarget: 'btnTestConnection'
+                        });
+                    }
+                }
+            });
+        },this);
+    },
+    operationLoad: function(){
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        var url = Ext.String.format('{0}/istsos/services/default/configsections/connection', wa.url);
+        Ext.Ajax.request({
+            url: url,
+            scope: this,
+            method: "GET",
+            success: function(response){
+                try {
+                    var json = Ext.decode(response.responseText);
+                    this.istForm.loadRecord(json);
+                } catch (exception) {
+                    console.error(exception);
+                }
+                this.mask.hide();
+                this.fireEvent("operationGet",json);
+            }
+        });
+    },
+    operationPost: function(){
+        
+        var json = this.istForm.getValues();
+            
+        if (Ext.isEmpty(json['customdb'])) {
+            if (!Ext.getCmp('nsservice').isValid()){
+                Ext.Msg.alert('Validation error', 'Service name is invalid, it must be a single lower case word.');
+                return;
+            }
+            json = {
+                "service": json['service']
+            };
+        }else{
+            if (!this.istForm.getForm().isValid()){
+                Ext.Msg.alert('Validation error', 'Please correct the invalid values');
+                return;
+            }
+        }
+        
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        
+        if (Ext.isEmpty(json.epsg)){
+            delete json.epsg;
+        }
+        
+        this.servicename = json['service'];
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services', wa.url),
+            scope: this,
+            method: "POST",
+            jsonData: json,
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                this.mask.hide();
+                Ext.getCmp('webadmincmp').loadServiceMenu();
+                this.fireEvent("operationSubmit",json);
+            }
+        });
+    }
+});
diff --git a/interface/app/view/obsPropEditor.js b/interface/app/view/obsPropEditor.js
new file mode 100755
index 0000000..c2d7d02
--- /dev/null
+++ b/interface/app/view/obsPropEditor.js
@@ -0,0 +1,320 @@
+Ext.define('istsos.view.obsPropEditor', {
+    extend: 'istsos.view.ui.obsPropEditor',
+
+    initComponent: function() {
+        var me = this;
+        
+        var gs = Ext.create('Ext.data.Store', {
+             storeId: 'gridobservedproperties',
+             proxy: {
+                type: 'ajax',
+                url: '',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    messageProperty: 'message',
+                    root: 'data'
+                }
+            },
+            fields: [
+                {
+                    name: 'name',
+                    type: 'string'
+                },
+                {
+                    name: 'definition',
+                    type: 'string'
+                },
+                {
+                    name: 'description',
+                    type: 'string'
+                },
+                {
+                    name: 'procedures',
+                    type: 'string'
+                },
+                {
+                    name: 'constraint'
+                },
+                {
+                    name: 'constraint2str',
+                    type: 'string',
+                    convert: function(value, record) {
+                        if (record.data.constraint){
+                            if (record.data.constraint.min) { // Greater then
+                                return "From: " + record.data.constraint.min;
+                            } else if (record.data.constraint.max) { // Less then
+                                return "To: " + record.data.constraint.max;
+                            } else if (record.data.constraint.interval) { // Between
+                                return "From: " + record.data.constraint.interval[0] 
+                                + " / To: "  + record.data.constraint.interval[1];
+                            } else if (record.data.constraint.valueList) { // List
+                                return "List: " + record.data.constraint.valueList.join(', ');
+                            }
+                        }
+                        return "-";
+                    }
+                }
+            ]
+         });
+        
+        //var gs = Ext.create('istsos.store.gridObservedProperties');
+        
+        Ext.create('istsos.store.Constraint');
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp("btnNew").on("click",function(){
+            this.resetForm();
+            Ext.getCmp('opDefinition').setValue(
+                Ext.String.format(
+                    'urn:ogc:def:parameter:{0}:{1}:',
+                    this.istSections.identification.authority ? this.istSections.identification.authority: 'x-istsos',
+                    this.istSections.identification.urnversion ? this.istSections.identification.urnversion: '1.0'
+                )
+            );
+            Ext.getCmp('frmObservedProperties').show();
+        },this);
+                
+        Ext.getCmp("btnForm").on("click",function(){
+            var f = Ext.getCmp('frmObservedProperties');
+            var btn = Ext.getCmp("btnForm");
+            
+            if (f.getForm().isValid()) {
+                var jsonData = f.getValues();
+                
+                var role = "urn:x-ogc:def:classifiers:x-istsos:1.0:qualityIndexCheck:level0";
+                
+                switch (jsonData.ctype) {
+                    case 1: // Greater then
+                        jsonData.constraint = {
+                            "role" : role,
+                            "min" : jsonData.from
+                        };
+                        break;
+                    case 2: // Less then
+                        jsonData.constraint = {
+                            "role" : role,
+                            "max" : jsonData.to
+                        };
+                        break;
+                    case 3: // Between
+                        jsonData.constraint = {
+                            "role" : role,
+                            "interval" : [jsonData.from, jsonData.to]
+                        };
+                        break;
+                    case 4: // List
+                        jsonData.constraint = {
+                            "role" : role,
+                            "valueList" : jsonData.list.split(",")
+                        };
+                        break;
+                    default:
+                        jsonData.constraint = {};
+                }
+                delete jsonData.list;
+                delete jsonData.from;
+                delete jsonData.to;
+                delete jsonData.ctype;
+                
+                if (btn.getText()=='Insert') {
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}/observedproperties',wa.url, this.istService),
+                        scope: this,
+                        method: "POST",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            Ext.getStore("gridobservedproperties").load();
+                            Ext.getCmp('frmObservedProperties').hide();
+                        }
+                    });
+                } else {
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}/observedproperties/{2}',wa.url, this.istService,Ext.getCmp('opDefinition').originalValue),
+                        scope: this,
+                        method: "PUT",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            Ext.getStore("gridobservedproperties").load();
+                            Ext.getCmp('frmObservedProperties').hide();
+                        }
+                    });
+                }
+            }else{
+                Ext.MessageBox.show({
+                    title: 'Validation error',
+                    msg: "Filled data is invalid",
+                    buttons: Ext.MessageBox.OK,
+                    animateTarget: f
+                });
+                return;
+            }
+        },this);
+                
+        Ext.getCmp("gridop").on("select",function(rowmodel, record, index, eOpts ){
+            
+            this.resetForm();
+            
+            Ext.getCmp('frmObservedProperties').loadRecord(record);
+            
+            var constraint = record.get("constraint");
+            var ctypeRec, ctypeCmb = Ext.getCmp('sqiChoose');
+            
+            /*if (constraint == null || Ext.Object.getKeys(constraint)==0) {
+                console.log("ciao");
+            } else */
+            
+            if (constraint){
+                if (constraint.min) { // Greater then
+                    ctypeCmb.select(1);
+                    ctypeRec = ctypeCmb.getStore().findRecord("value", 1);
+                    Ext.getCmp('sqiFrom').setValue(constraint.min);
+                } else if (constraint.max) { // Less then
+                    ctypeCmb.select(2);
+                    ctypeRec = ctypeCmb.getStore().findRecord("value", 2);
+                    Ext.getCmp('sqiTo').setValue(constraint.max);
+                } else if (constraint.interval) { // Between
+                    ctypeCmb.select(3);
+                    ctypeRec = ctypeCmb.getStore().findRecord("value", 3);
+                    Ext.getCmp('sqiFrom').setValue(constraint.interval[0]);
+                    Ext.getCmp('sqiTo').setValue(constraint.interval[1]);
+                } else if (constraint.valueList) { // List
+                    ctypeCmb.select(4);
+                    ctypeRec = ctypeCmb.getStore().findRecord("value", 4);
+                    Ext.getCmp('sqiList').setValue(constraint.valueList);
+                }
+            }
+            ctypeCmb.fireEvent("select",ctypeCmb,ctypeRec);
+            
+            Ext.getCmp('btnForm').setText('Update');
+            Ext.getCmp('btnRemove').enable();
+            Ext.getCmp('frmObservedProperties').show();
+            
+        },this);
+        
+        Ext.getCmp("btnRemove").on("click",function(){
+            //var sm = Ext.getCmp("gridop").getSelectionModel();
+            //var rec = sm.getSelection();
+            //if (rec.length>0) {
+            Ext.Msg.show({
+                    title:'Erasing observed property',
+                    msg: 'Are you sure you want to erase the observed property?',
+                    buttons: Ext.Msg.YESNO,
+                    icon: Ext.Msg.QUESTION,
+                    scope: this,
+                    fn: function(btn){
+                        if (btn == 'yes'){
+                            Ext.Ajax.request({
+                                url: Ext.String.format('{0}/istsos/services/{1}/observedproperties/{2}',wa.url, this.istService,Ext.getCmp('opDefinition').originalValue),
+                                scope: this,
+                                method: "DELETE",
+                                /*jsonData: {
+                                    'name': rec[0].get('name'),
+                                    'description': rec[0].get('description')
+                                },*/
+                                success: function(response){
+                                    this.resetForm();
+                                    Ext.getStore("gridobservedproperties").load();
+                                    Ext.getCmp('frmObservedProperties').hide();
+                                }
+                            });      
+                        }
+                    }
+            });
+                          
+            //}
+        },this);
+        
+        
+        Ext.getCmp("sqiChoose").on("select",function(combo, records, eOpts){
+        
+            var value = combo.getValue();
+            console.log(value);
+            
+            var from = Ext.getCmp('sqiFrom');
+            var to = Ext.getCmp('sqiTo');
+            var list = Ext.getCmp('sqiList');
+            
+            switch (value) {
+                case 0:
+                  from.setVisible(false);
+                  to.setVisible(false);
+                  list.setVisible(false);
+                  break;
+                case 1:
+                  from.setVisible(true);
+                  to.setVisible(false);
+                  list.setVisible(false);
+                  break;
+                case 2:
+                  from.setVisible(false);
+                  to.setVisible(true);
+                  list.setVisible(false);
+                  break;
+                case 3:
+                  from.setVisible(true);
+                  to.setVisible(true);
+                  list.setVisible(false);
+                  break;
+                case 4:
+                  from.setVisible(false);
+                  to.setVisible(false);
+                  list.setVisible(true);
+                  break;
+            }
+            
+        });
+        
+        //this.istService="sosmilan";
+        gs.getProxy().url=Ext.String.format('{0}/istsos/services/{1}/observedproperties',wa.url, this.istService);
+    },
+    operationLoad: function(){
+        Ext.getStore("gridobservedproperties").load();
+    },
+    resetForm: function(){
+        
+        Ext.getCmp('frmObservedProperties').loadRecord({
+            'data': { 
+                'name': '',
+                'definition': '',
+                'description': '',
+                'from': '',
+                'to': '',
+                'list': ''
+            }
+        });
+        
+        Ext.getCmp("sqiChoose").select(0);
+        Ext.getCmp('sqiFrom').setVisible(false);
+        Ext.getCmp('sqiTo').setVisible(false);
+        Ext.getCmp('sqiList').setVisible(false);
+        
+        Ext.getCmp('opName').clearInvalid();
+        Ext.getCmp('opDefinition').clearInvalid();
+        Ext.getCmp('btnForm').setText('Insert');
+        Ext.getCmp('btnRemove').disable();
+        Ext.getCmp("gridop").getSelectionModel().deselectAll();
+        
+    }
+});
+
+
+function openObsPropEditorWin(istService) {
+    var editor = Ext.create("istsos.view.obsPropEditor",{
+        istService: istService
+    });
+    var win = Ext.create('Ext.window.Window', {
+        title: 'Observed properties - EDITOR',
+        height: 400,
+        width: 800,
+        layout: 'fit',
+        items: editor,
+        modal: true
+    });
+    win.show();
+    editor.operationLoad();
+    return win;
+}
diff --git a/interface/app/view/offeringsEditor.js b/interface/app/view/offeringsEditor.js
new file mode 100755
index 0000000..8158c15
--- /dev/null
+++ b/interface/app/view/offeringsEditor.js
@@ -0,0 +1,252 @@
+/*
+ * File: app/view/offeringsEditor.js
+ * Date: Fri May 04 2012 11:08:56 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.offeringsEditor', {
+    extend: 'istsos.view.ui.offeringsEditor',
+
+    initComponent: function() {
+        var me = this;
+        Ext.create('istsos.store.gridOfferings');
+        Ext.create('istsos.store.Procedures',{
+            storeId: 'proceduresNonmembers'
+        });
+        Ext.create('istsos.store.Procedures',{
+            storeId: 'proceduresMembers'
+        });
+        var cmbName = Ext.create('istsos.store.cmbName');
+        
+        me.callParent(arguments);
+        
+        cmbName.getProxy().url=Ext.String.format(
+            '{0}/istsos/services/{1}/offerings/operations/getlist',
+            wa.url, this.istService);
+        
+        
+        Ext.getCmp("btnNew").on("click",function(){
+            this.resetForm();
+            Ext.getCmp('frmOfferings').show();
+        },this);
+        
+        
+        Ext.getCmp("btnForm").on("click",function(){
+            var f = Ext.getCmp('frmOfferings');
+            var btn = Ext.getCmp("btnForm");
+            if (f.getForm().isValid()) {
+                var jsonData = f.getValues();
+                if (btn.getText()=='Insert') {
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}/offerings',wa.url, this.istService),
+                        scope: this,
+                        method: "POST",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            this.operationLoad();
+                            Ext.getCmp('frmOfferings').hide();
+                        }
+                    });
+                }else{
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}/offerings/{2}',
+                            wa.url, this.istService,Ext.getCmp('offName').originalValue),
+                        scope: this,
+                        method: "PUT",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            this.operationLoad();
+                            Ext.getCmp('frmOfferings').hide();
+                        }
+                    });
+                }
+            }else{
+                Ext.MessageBox.show({
+                    title: 'Validation error',
+                    msg: "Filled data is invalid",
+                    buttons: Ext.MessageBox.OK,
+                    animateTarget: f
+                });
+                return;
+            }
+        },this);
+        
+        Ext.getCmp("gridoff").on("select",function(rowmodel, record, index, eOpts ){
+            Ext.getCmp('frmOfferings').loadRecord(record);
+            Ext.getCmp('btnForm').setText('Update');
+            Ext.getCmp('btnRemove').enable();
+            Ext.getCmp('frmOfferings').show();
+        });
+        
+        
+        Ext.getCmp("btnRemove").on("click",function(){
+            var sm = Ext.getCmp("gridoff").getSelectionModel();
+            var rec = sm.getSelection();
+            if (rec.length>0) {
+                Ext.Ajax.request({
+                    url: Ext.String.format('{0}/istsos/services/{1}/offerings/{2}',
+                        wa.url, this.istService,Ext.getCmp('offName').originalValue),
+                    scope: this,
+                    method: "DELETE",
+                    jsonData: {
+                        'name': rec[0].get('name'),
+                        'description': rec[0].get('description')
+                    },
+                    success: function(response){
+                        this.resetForm();
+                        this.operationLoad();
+                        Ext.getCmp('frmOfferings').hide();
+                    }
+                });                
+            }
+        },this);
+        
+        Ext.getCmp('cbOfferings').on("select",function( combo, records, eOpts){
+            
+            var members = Ext.getCmp('gridMembers');
+            var nonmembers = Ext.getCmp('gridNonMembers');
+            
+            if (Ext.isEmpty(members.mask)) {
+                members.mask = new Ext.LoadMask(members.body, {
+                    msg:"Loading members..."
+                });
+            }
+            
+            if (Ext.isEmpty(nonmembers.mask)) {
+                nonmembers.mask = new Ext.LoadMask(nonmembers.body, {
+                    msg:"Loading not members..."
+                });
+            }
+            
+            members.mask.show();
+            nonmembers.mask.show();
+            
+            Ext.Ajax.request({
+                url: Ext.String.format(
+                    '{0}/istsos/services/{1}/offerings/{2}/procedures/operations/memberslist',
+                    wa.url, this.istService,combo.getValue()),
+                scope: members,
+                method: "GET",
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    this.getStore().loadData(json.data);
+                    this.mask.hide();
+                }
+            });
+            Ext.Ajax.request({
+                url: Ext.String.format(
+                    '{0}/istsos/services/{1}/offerings/{2}/procedures/operations/nonmemberslist',
+                    wa.url, this.istService,combo.getValue()),
+                scope: nonmembers,
+                method: "GET",
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    this.getStore().loadData(json.data);
+                    this.mask.hide();
+                }
+            });
+            
+        },this);
+        
+        Ext.getCmp('gridNonMembers').view.on("beforedrop",
+            function ( node, data, overModel, dropPosition, dropFunction, eOpts ) {
+                console.dir(data.records);
+                dropFunction.wait=true;
+                Ext.Ajax.request({
+                    url: Ext.String.format(
+                        '{0}/istsos/services/{1}/offerings/{2}/procedures/{3}',
+                        wa.url, this.istService,Ext.getCmp('cbOfferings').getValue(),data.records[0].get("name")),
+                    scope: dropFunction,
+                    method: "DELETE",
+                    success: function(response){
+                        var json = Ext.decode(response.responseText);
+                        if (json['success']) {
+                            this.processDrop();
+                        }else{
+                            dropFunction.cancelDrop();
+                            Ext.Msg.alert("Server message", "\"" + json['message'] + "\"<br/><br/>" + 
+                                "<small>Status response: " + response.statusText + "</small>");
+                        }
+                    }
+                });
+                return 0; 
+            },this);
+            
+        Ext.getCmp('gridMembers').view.on("beforedrop",
+            function ( node, data, overModel, dropPosition, dropFunction, eOpts ) {
+                console.dir(data.records);
+                dropFunction.wait=true;
+                var jsonData = [];
+                for (var i = 0; i < data.records.length; i++) {
+                    jsonData.push({
+                        "offering": Ext.getCmp('cbOfferings').getValue(),
+                        "procedure": data.records[i].get("name")
+                    });
+                }
+                Ext.Ajax.request({
+                    url: Ext.String.format(
+                        '{0}/istsos/services/{1}/offerings/{2}/procedures',
+                        wa.url, this.istService,Ext.getCmp('cbOfferings').getValue()),
+                    scope: dropFunction,
+                    jsonData: jsonData,
+                    method: "POST",
+                    success: function(response){
+                        var json = Ext.decode(response.responseText);
+                        if (json['success']) {
+                            this.processDrop();
+                        }else{
+                            dropFunction.cancelDrop();
+                            Ext.Msg.alert("Server message", "\"" + json['message'] + "\"<br/><br/>" + 
+                                "<small>Status response: " + response.statusText + "</small>");
+                        }
+                    }
+                });
+                return 0; 
+            },this);
+    },
+    operationLoad: function(){
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services/{1}/offerings',wa.url, this.istService),
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    Ext.getStore("gridofferings").loadData(json.data);
+                }
+                this.mask.hide();
+            }
+        });
+    },
+    resetForm: function(){
+        
+        Ext.getCmp('frmOfferings').loadRecord({
+            'data': {
+                "name": null,
+                "description": null,
+                "procedures": null,
+                "expiration": null,
+                "active": null
+            }
+        });
+        Ext.getCmp('offName').clearInvalid();
+        Ext.getCmp('btnForm').setText('Insert');
+        Ext.getCmp('btnRemove').disable();
+        Ext.getCmp("gridoff").getSelectionModel().deselectAll();
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/paths.js b/interface/app/view/paths.js
new file mode 100755
index 0000000..acd0b8a
--- /dev/null
+++ b/interface/app/view/paths.js
@@ -0,0 +1,24 @@
+/*
+ * File: app/view/paths.js
+ * Date: Wed Apr 11 2012 11:03:45 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.paths', {
+    extend: 'istsos.view.ui.paths',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    },
+    test: function() {
+        console.log("ciao genio: Arg: " + arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/procedure.js b/interface/app/view/procedure.js
new file mode 100755
index 0000000..d06365a
--- /dev/null
+++ b/interface/app/view/procedure.js
@@ -0,0 +1,1313 @@
+Ext.define('istsos.view.procedure', {
+    extend: 'istsos.view.ui.procedure',
+    initComponent: function() {
+        
+        var me = this;
+        
+        var systy = Ext.create('istsos.store.cmbSystemType');
+        systy.getProxy().url = Ext.String.format('{0}/istsos/services/{1}/systemtypes', 
+            wa.url, this.istService);
+        Ext.create('istsos.store.cmbDocumentFormat');
+        Ext.create('istsos.store.gridDocumentation');
+        Ext.create('istsos.store.gridOutputs');
+        Ext.create('istsos.store.Constraint');
+        
+        // Identification SML tool
+        Ext.create('istsos.store.cmbSml',{
+            "storeId": 'cmbidentification',
+            "proxy": {
+                "type": 'ajax',
+                "url": 'app/data/cmbidentification.json',
+                "reader": {
+                    "type": 'json',
+                    "idProperty": 'definition',
+                    "root": 'data'
+                }
+            }
+        });
+        
+        Ext.create('istsos.store.cmbSml',{
+            "storeId": 'grididentification'
+        });
+        
+        // Capabilites SML tool
+        
+        Ext.create('Ext.data.Store', {
+            storeId: 'cmbCapabilities',
+            autoLoad: true,
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbcapabilities.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+            {
+                name: 'combo',
+                convert: function(v, record){
+                    return record.get('name')  + " (" + record.get('uom') + ")";
+                }
+            },
+            {
+                name: 'name',
+                type: 'string'
+            },
+            {
+                name: 'definition',
+                type: 'string'
+            },
+            {
+                name: 'uom',
+                type: 'string'
+            }
+            ]
+        });
+        
+        Ext.create('Ext.data.Store', {
+            storeId: 'cmbcapabilitiesuom',
+            autoLoad: true,
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbcapabilitiesuom.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+            {
+                name: 'combo',
+                convert: function(v, record){
+                    return record.get('name')  + " (" + record.get('uom') + ")";
+                }
+            },
+            {
+                name: 'name',
+                type: 'string'
+            },
+            {
+                name: 'uom',
+                type: 'string'
+            }
+            ]
+        });
+        
+        Ext.create('Ext.data.Store', {
+            storeId: 'cmbcapabilitiesuom2',
+            autoLoad: true,
+            proxy: {
+                type: 'ajax',
+                url: 'app/data/cmbcapabilitiesuom.json',
+                reader: {
+                    type: 'json',
+                    idProperty: 'definition',
+                    root: 'data'
+                }
+            },
+            fields: [
+            {
+                name: 'combo',
+                convert: function(v, record){
+                    return record.get('name')  + " (" + record.get('uom') + ")";
+                }
+            },
+            {
+                name: 'name',
+                type: 'string'
+            },
+            {
+                name: 'uom',
+                type: 'string'
+            }
+            ]
+        });
+        
+        Ext.create('istsos.store.cmbSml',{
+            "storeId": 'gridCapabilities'
+        });
+        
+        Ext.create('istsos.store.cmbName',{
+            "storeId": 'locationEPSG',
+            "autoLoad": true,
+            "proxy": {
+                "type": 'ajax',
+                "url": Ext.String.format('{0}/istsos/services/{1}/epsgs', wa.url,
+                    this.istService),
+                "reader": {
+                    "type": 'json',
+                    "idProperty": 'name',
+                    "root": 'data'
+                }
+            }
+        });
+        
+        Ext.create('istsos.store.cmbSml',{
+            "storeId": 'gridinput'
+        });
+        
+        Ext.create('istsos.store.cmbSml',{
+            "storeId": 'cmbphenomenon',
+            "proxy": {
+                "type": 'ajax',
+                "url": 'app/data/cmbphenomenon.json',
+                "reader": {
+                    "type": 'json',
+                    "idProperty": 'definition',
+                    "root": 'data'
+                }
+            }
+        });
+        Ext.create('istsos.store.cmbSml',{
+            "storeId": 'cmbobservedproperties',
+            "proxy": {
+                "type": 'ajax',
+                "url": Ext.String.format('{0}/istsos/services/{1}/observedproperties', wa.url,
+                    this.istService),
+                "reader": {
+                    "type": 'json',
+                    "idProperty": 'definition',
+                    "root": 'data'
+                }
+            }
+        });
+        
+        Ext.create('istsos.store.cmbSml',{
+            "storeId": 'cmbuom',
+            "proxy": {
+                "type": 'ajax',
+                "url": Ext.String.format('{0}/istsos/services/{1}/uoms', wa.url,
+                    this.istService),
+                "reader": {
+                    "type": 'json',
+                    "idProperty": 'definition',
+                    "root": 'data'
+                }
+            }
+        });
+        
+        Ext.define('smlfield', {
+            extend: 'Ext.data.Model',
+            fields: [
+            {
+                name: 'name', 
+                type: 'string'
+            },
+            {
+                name: 'value', 
+                type: 'string'
+            },
+            {
+                name: 'definition', 
+                type: 'string'
+            }
+            ]
+        });
+        
+        
+        // Stores used for the utils - copy template
+        Ext.create('istsos.store.Offerings');
+        Ext.create('istsos.store.gridProceduresList');
+        var ssrv = Ext.create('istsos.store.Services');
+        ssrv.getProxy().url = Ext.String.format('{0}/istsos/services',wa.url);
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp('procedurename').on('change',function(field, newValue, oldValue, eOpts){
+            var gridIdentification = Ext.getCmp('gridIdentification');
+            var rec = gridIdentification.store.findRecord(
+                'definition',
+                'urn:ogc:def:identifier:OGC:uniqueID'
+            );
+            if (Ext.isEmpty(rec)){ // unique id still not exist
+                gridIdentification.store.insert(0, 
+                    Ext.create('smlfield', {
+                        'name': 'uniqueID',
+                        'definition': 'urn:ogc:def:identifier:OGC:uniqueID',
+                        'value': this.istSections.urn.procedure+newValue
+                    })
+                );
+            }else{ // UniqueID exist and must be updated
+                rec.set('value',this.istSections.urn.procedure+newValue);
+            }
+        },this);
+        
+        Ext.getCmp("constrChoose").select(0);
+
+        Ext.getCmp("constrChoose").on("select",function(combo, records, eOpts){
+        
+            var value = combo.getValue();
+            
+            var from = Ext.getCmp('constrFrom');
+            var to = Ext.getCmp('constrTo');
+            var list = Ext.getCmp('constrList');
+            
+            switch (value) {
+                case 0:
+                  from.setVisible(false);
+                  to.setVisible(false);
+                  list.setVisible(false);
+                  break;
+                case 1:
+                  from.setVisible(true);
+                  to.setVisible(false);
+                  list.setVisible(false);
+                  break;
+                case 2:
+                  from.setVisible(false);
+                  to.setVisible(true);
+                  list.setVisible(false);
+                  break;
+                case 3:
+                  from.setVisible(true);
+                  to.setVisible(true);
+                  list.setVisible(false);
+                  break;
+                case 4:
+                  from.setVisible(false);
+                  to.setVisible(false);
+                  list.setVisible(true);
+                  break;
+            }
+        });
+        
+        // Combos used for the utils - copy template
+        Ext.getCmp("cmbServices").on("select",function(combo, records, eOpts){
+        
+            var pr = Ext.getCmp('oeCbProcedure');
+            pr.reset();
+            pr.getStore().removeAll();
+            pr.disable();
+            
+            var o = Ext.getCmp('oeCbOffering');
+            o.reset();
+            o.getStore().removeAll();
+            o.disable();
+            
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/operations/getlist',
+                    wa.url,combo.getValue()),
+                scope: o,
+                method: "GET",
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    if (json.data.length>0) {
+                        this.getStore().loadData(json.data);
+                        this.enable();
+                    }else{
+                        this.disable();
+                        Ext.Msg.alert("Server message", "\"" + json['message'] + "\"<br/><br/>" + 
+                                "<small>Status response: " + response.statusText + "</small>");
+                    }
+                }
+            });
+        });
+        
+        Ext.getCmp("oeCbOffering").on("select",function(combo, records, eOpts){
+            
+            var pr = Ext.getCmp('oeCbProcedure');
+            pr.reset();
+            pr.getStore().removeAll();
+            pr.disable();
+            
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/services/{1}/offerings/{2}/procedures/operations/memberslist',
+                    wa.url,Ext.getCmp('cmbServices').getValue(),combo.getValue()),
+                scope: pr,
+                method: "GET",
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    if (json.data.length>0) {
+                        this.getStore().loadData(json.data);
+                        this.enable();
+                    }else{
+                        this.disable();
+                        Ext.Msg.alert("Server message", "\"" + json['message'] + "\"<br/><br/>" + 
+                                "<small>Status response: " + response.statusText + "</small>");
+                    }
+                }
+            });
+        });
+        Ext.getCmp("btnTemplateFill").on("click",this.executeCopy,this);
+        
+        this.initSmlFieldPanel('smlIdentification');
+        this.initSmlFieldPanel('smlCapabilities');
+        this.initSmlFieldPanel('smlDocumentation');
+        this.initSmlFieldPanel('smlInputs');
+        
+        var cmp = Ext.getCmp('smlOutputs');
+        
+        cmp.getComponent('frmSml').getComponent('btnAddSml').on('click',function(){
+            var main = Ext.getCmp('smlOutputs');
+            var form = main.getComponent('frmSml');
+            var cmb = form.getComponent('cmbSml');
+            var store = main.getComponent('gridSml').getStore();
+            if (!form.getForm().isValid()) {
+                Ext.MessageBox.show({
+                    title: 'Warning',
+                    msg: 'Mandatory params are not filled correctly',
+                    buttons: Ext.MessageBox.OK,
+                    animateTarget: form
+                });
+                return;
+            }
+            var json = form.getForm().getValues();
+            // Check if optional quality index check is filled correctly
+            if (json.ctype>0){
+                var msg;
+                switch (json.ctype) {
+                    case 1: // Greater then
+                        if (Ext.isEmpty(json['from'])){
+                            msg = "You have to set the minimal value " +
+                            "statisticallly accepted by this observed property";
+                        }
+                        break;
+                    case 2: // Less then
+                        if (Ext.isEmpty(json['to'])){
+                            msg = "You have to set the maximal value " +
+                            "statisticallly accepted by this observed property";
+                        }
+                        break;
+                    case 3: // Between
+                        if (Ext.isEmpty(json['from']) || Ext.isEmpty(json['to'])){
+                            msg = "You have to set the interval value " +
+                            "statisticallly accepted by this observed property";
+                        }
+                        break;
+                    case 4: // List
+                        if (Ext.isEmpty(json['list'])){
+                            msg = "You have to set a numeric (comma separated) list " +
+                            "accepted by this observed property";
+                        }else{ // Check CSNum list
+                            var vals = json['list'].split(',');
+                            for (var c = 0; c < vals.length; c++){
+                                if(!Ext.isNumeric(vals[c])){
+                                    msg = "Value ("+vals[c]+") inserted is not " + 
+                                    "numeric, and it should be numeric";
+                                    break;
+                                }
+                            }
+                        }
+                        break;
+                }
+                
+                if (msg){
+                    Ext.MessageBox.show({
+                        title: 'Warning',
+                        msg: msg,
+                        buttons: Ext.MessageBox.OK,
+                        animateTarget: form
+                    });
+                    return;
+                }
+                
+            }
+            
+            var role = "urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable";
+            
+            var rec = cmb.findRecord('definition',cmb.getValue()), r = null;
+            
+            switch (json.ctype) {
+                case 1: // Greater then
+                    r = Ext.create('smlfield', {
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : json.uom,
+                        "description" : json.description,
+                        "role" : role,
+                        "from" : json.from
+                        //,"ctype": json.ctype
+                    });
+                    break;
+                case 2: // Less then
+                    r = Ext.create('smlfield', {
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : json.uom,
+                        "description" : json.description,
+                        "role" : role,
+                        "to" : json.to
+                        //,"ctype": json.ctype
+                    });
+                    break;
+                case 3: // Between
+                    r = Ext.create('smlfield', {
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : json.uom,
+                        "description" : json.description,
+                        "role" : role,
+                        "to" : json['to'],
+                        "from" : json['from']
+                        //,"ctype": json.ctype
+                    });
+                    break;
+                case 4: // List
+                    r = Ext.create('smlfield', {
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : json.uom,
+                        "description" : json.description,
+                        "role" : role,
+                        "list" : json.list.split(",").toString()
+                        //,"ctype": json.ctype
+                    });
+                    break;
+                default:
+                    r = Ext.create('smlfield', {
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : json.uom,
+                        "description" : json.description
+                    });
+                    
+            }
+        
+            
+            var last = store.getCount();
+            /*if (last>0) {
+                last--;
+            }*/
+            store.insert(last, r);
+            form.getForm().reset();
+        
+            //store.insert(0, r);
+            form.getForm().reset();
+        },this);
+        
+        cmp.getComponent('gridSml').getComponent('gridToolbar').getComponent(
+            'btnRemoveSml').on('click',function(){
+            this.removeSmlfield('smlOutputs',{
+                "skipInsert":true
+            });
+        },this);
+        
+        Ext.getCmp('applicationType').on("select",function(){
+            var cb = Ext.getCmp('cbDetailsDefinition');
+            var tf = Ext.getCmp('cbDetailsMeasure');
+             
+            var v = cb.getValue();
+            var rec = cb.findRecord(cb.valueField || cb.displayField, v);
+            tf.setValue(rec.get("defaultMeasure"));
+        });
+        
+        var caricami = function(field){
+            field.store.load();
+            field.un("focus",caricami);
+        }
+        Ext.getCmp('applicationType').on("focus", caricami);
+        
+        
+    },
+    executeCopy: function(){
+        // Load data from a /istsos/services/this.istService/procedures/{name} GET request
+        
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services/{1}/procedures/{2}', 
+                wa.url, 
+                Ext.getCmp('cmbServices').getValue(), 
+                Ext.getCmp('oeCbProcedure').getValue()),
+            //url: 'app/data/procedure.json',
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    delete json.data.assignedSensorId;
+                    delete json.data.system;
+                    delete json.data.system_id;
+                    if (!Ext.isEmpty(this.istForm)) {
+                        this.istForm.loadJSON(json);
+                    } else {
+                        this.loadJSON(json,false);
+                    }
+                }
+                this.mask.hide();
+            }
+        });
+    },
+    executeGet: function(){
+        // Load data from a /istsos/services/this.istService/procedures/{name} GET request
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services/{1}/procedures/{2}', wa.url,this.istService, this.istProcedure),
+            //url: 'app/data/procedure.json',
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    this.istForm.loadJSON(json);
+                }
+                this.mask.hide();
+            }
+        });
+    },
+    loadJSON: function(json, hidefield){
+    
+        //console.dir(json);
+        if (!Ext.isBoolean(hidefield)) {
+            hidefield=true;
+        }
+        if (hidefield) {
+            Ext.getCmp('toolspanel').setVisible(false); // tools panel 
+            Ext.getCmp('asid').setVisible(true); // assigned sensor id field
+            Ext.getCmp('frmSmlOutputs').setVisible(false); // Editing panel of observed properties
+            Ext.getCmp('smlOutputs').getComponent('gridSml').removeDocked(Ext.getCmp('smlOutputs').getComponent('gridSml').getComponent('gridToolbar'),true);
+        //Ext.getCmp('smlOutputs').getComponent('gridSml').getComponent('gridToolbar').setVisible(false); // Remove observed property button
+        }
+        
+        this.loadedJson = json;
+        
+        
+        // IDENTIFICATION
+        var store = Ext.getCmp("smlIdentification").getComponent('gridSml').getStore();
+        var c = json["data"]["identification"];
+        for (var i in c) {
+            var r = Ext.create('smlfield', Ext.apply({}, c[i]));
+            store.insert(0, r);
+        }
+        
+        // GENERAL INFORMATION
+        Ext.getCmp('generalInfo').loadRecord(json);
+        
+        
+        // CLASSIFICATION
+        var data = {}
+        for (var i in json["data"]["classification"]) {
+            var cl = json["data"]["classification"][i];
+            if (cl["definition"]=='urn:ogc:def:classifier:x-istsos:1.0:systemType') {
+                data["systemtype"]=cl["value"];
+            }else if (cl["definition"]=='urn:ogc:def:classifier:x-istsos:1.0:sensorType') {
+                data["sensortype"]=cl["value"];
+            }
+        }
+        Ext.getCmp("classification").loadRecord({
+            data: data
+        });
+        
+        // CHARACTERISTICS
+        Ext.getCmp('characteristics').loadRecord(json);
+        
+        // CONTACTS
+        var data = {}
+        for (var i in json["data"]["contacts"]) {
+            var c = json["data"]["contacts"][i];
+            if (c["role"]=='urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:owner') {
+                Ext.getCmp("frmOwner").loadRecord({
+                    data:c
+                });
+            }else if (c["role"]=='urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:manufacturer') {
+                Ext.getCmp("frmManufacturer").loadRecord({
+                    data:c
+                });
+            }else if (c["role"]=='urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:operator') {
+                Ext.getCmp("frmOperator").loadRecord({
+                    data:c
+                });
+            }
+        }
+        
+        // DOCUMENTATION
+        store = Ext.getCmp("smlDocumentation").getComponent('gridSml').getStore();
+        var c = json["data"]["documentation"];
+        for (var i in c) {
+            var r = Ext.create('smlfield', Ext.apply({}, c[i]));
+            store.insert(0, r);
+        }
+        
+        // LOCATION
+        c = json["data"]["location"];
+        var epsg = c["crs"]["properties"]['name'];
+        if (Ext.isString(epsg)){
+            epsg = epsg.replace("EPSG:", "");
+        }
+        Ext.getCmp("frmLocation").loadRecord({
+            data:{
+                x: c["geometry"]["coordinates"][0],
+                y: c["geometry"]["coordinates"][1],
+                z: c["geometry"]["coordinates"][2],
+                epsg: epsg,
+                name: c["properties"]['name']
+            }
+        });
+        
+        /*if (Ext.isEmpty(c["crs"]["properties"]['name'])) {
+            Ext.getCmp('cbepsg').setValue(c["crs"]["properties"]['name']);
+        }*/
+        
+        // INTERFACES
+        Ext.getCmp('frmInterfaces').loadRecord(json);
+        
+        // INPUTS
+        store = Ext.getCmp("smlInputs").getComponent('gridSml').getStore();
+        store.removeAll();
+        var c = json["data"]["inputs"];
+        for (var i in c) {
+            var r = Ext.create('smlfield', Ext.apply({}, c[i]));
+            store.insert(0, r);
+        }
+        
+        // OUTPUTS
+        store = Ext.getCmp("smlOutputs").getComponent('gridSml').getStore();
+        store.removeAll();
+        var c = json["data"]["outputs"];
+        
+        for (var i = 0; i < c.length; i++) {
+            if (c[i]['name']!='Time') {
+               
+                var cnf = {
+                    "name" : c[i]['name'],
+                    "definition" : c[i]['definition'],
+                    "uom" : c[i]['uom'],
+                    "description" : c[i]['description'],
+                    "role" : "",
+                    "from" : "", 
+                    "to": "", 
+                    "list": ""
+                };
+               
+                if (c[i]['constraint']){
+                    if (c[i]['constraint']["role"]){
+                        cnf.role = c[i]['constraint']["role"];
+                    }
+                    if (c[i]['constraint']["interval"]){
+                         cnf.from = c[i]['constraint']["interval"][0];
+                         cnf.to = c[i]['constraint']["interval"][1];
+                    }else if(c[i]['constraint']["valueList"]){
+                         cnf.list = c[i]['constraint']["valueList"].join(", ");
+                    }else if(c[i]['constraint']["max"]){
+                         cnf.to = c[i]['constraint']["max"];
+                    }else if(c[i]['constraint']["min"]){
+                         cnf.from = c[i]['constraint']["min"];
+                    }
+                }
+                
+                var r = Ext.create('smlfield', cnf);
+                store.insert(0, r);
+            }
+        }
+        
+        // CAPABILITIES
+        
+        store = Ext.getCmp("smlCapabilities").getComponent('gridSml').getStore();
+        var c = json["data"]["capabilities"];
+        for (var i in c) {
+            if (c[i]['definition']=='urn:x-ogc:def:classifier:x-istsos:1.0:acquisitionTimeResolution') {
+                
+                // Set combo
+                Ext.getCmp('atrCombo').setValue(c[i]['uom']);
+                // Set value
+                Ext.getCmp('atrValue').setValue(c[i]['value']);
+                
+                //Ext.getCmp("tfAcquisitionResolution").setValue(c[i]['value']);
+            }else if (c[i]['definition']=='urn:x-ogc:def:classifier:x-istsos:1.0:samplingTimeResolution') {
+                
+                // Set combo
+                Ext.getCmp('strCombo').setValue(c[i]['uom']);
+                // Set value
+                Ext.getCmp('strValue').setValue(c[i]['value']);
+                
+                //Ext.getCmp("tfSamplingResolution").setValue(c[i]['value']);
+            }else if (c[i]['definition'].indexOf('urn:x-ogc:def:classifier:x-istsos:1.0:storageType')>-1) {
+                
+                // Set combo
+                Ext.getCmp('storeTypeValue').setValue(c[i]['definition'].replace('urn:x-ogc:def:classifier:x-istsos:1.0:storageType:',''));
+                
+                //Ext.getCmp("tfSamplingResolution").setValue(c[i]['value']);
+            }else{
+                store.insert(0, Ext.create('smlfield', c[i]));
+            }
+        }
+    },
+    createJSON: function(){
+        // Insert data from a /istsos/services/{name}/procedures POST request
+        var jsonData = {};
+        var me = null;
+        if (!Ext.isEmpty(this.istForm)) {
+            me = this.istForm;
+        }else{
+            me = this;
+        }
+        jsonData = Ext.apply(jsonData,me.getSystemInfo());
+            
+        jsonData = Ext.apply(jsonData,{
+            "identification": me.getSmlStore("smlIdentification")
+        });
+            
+        jsonData['classification']=me.getClassification();
+        jsonData = Ext.apply(jsonData,me.getCharacteristics());
+            
+        jsonData['contacts']=me.getContacts();
+            
+        jsonData = Ext.apply(jsonData,{
+            "documentation": me.getSmlStore("smlDocumentation")
+        });
+        
+        jsonData = Ext.apply(jsonData,{
+            "capabilities": me.getCapabilities()
+        });
+            
+        jsonData['location']=me.getLocation();
+            
+        jsonData = Ext.apply(jsonData,me.getInterfaces());
+            
+        jsonData = Ext.apply(jsonData,{
+            "inputs": me.getSmlStore("smlInputs")
+        });
+            
+        jsonData = Ext.apply(jsonData,{
+            "outputs": me.getOutputs()
+        });
+            
+        jsonData["history"] = [];
+            
+        return jsonData;
+            
+    },
+    executePut: function(){
+        try{
+            if (Ext.isEmpty(this.mask)) {
+                this.mask = new Ext.LoadMask(this.body, {
+                    msg:"Please wait..."
+                });
+            }
+            this.mask.show();
+            
+            var me = null;
+            if (!Ext.isEmpty(this.istForm)) {
+                me = this.istForm;
+            }else{
+                me = this;
+            }
+        
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/services/{1}/procedures/{2}', wa.url,
+                    this.istService, me.loadedJson['data']['system']),
+                scope: this,
+                method: "PUT",
+                jsonData: this.istForm.createJSON(),
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    this.mask.hide();
+                    this.fireEvent("operationSubmit",json);
+                }
+            });
+        } catch (ex) {
+            this.mask.hide();
+            Ext.MessageBox.show({
+                title: 'Warning',
+                msg: ex.type,
+                buttons: Ext.MessageBox.OK,
+                animateTarget: ex.cmp
+            });
+        }
+    },
+    executePost: function(){
+        // Insert data from a /istsos/services/{name}/procedures POST request
+        var jsonData = {};
+        var me = null;
+        if (!Ext.isEmpty(this.istForm)) {
+            me = this.istForm;
+        }else{
+            me = this;
+        }
+        try {
+            if (Ext.isEmpty(this.mask)) {
+                this.mask = new Ext.LoadMask(this.body, {
+                    msg:"Please wait..."
+                });
+            }
+            this.mask.show();
+            
+            jsonData = Ext.apply(jsonData,me.getSystemInfo());
+            
+            jsonData = Ext.apply(jsonData,{
+                "identification": me.getSmlStore("smlIdentification")
+            });
+            
+            
+            jsonData['classification']=me.getClassification();
+            jsonData = Ext.apply(jsonData,me.getCharacteristics());
+            
+            jsonData['contacts']=me.getContacts();
+            
+            jsonData = Ext.apply(jsonData,{
+                "documentation": me.getSmlStore("smlDocumentation")
+            });
+            
+            jsonData = Ext.apply(jsonData,{
+                "capabilities": me.getCapabilities()
+            });
+            
+            jsonData['location']=me.getLocation();
+            
+            jsonData = Ext.apply(jsonData,me.getInterfaces());
+            
+            jsonData = Ext.apply(jsonData,{
+                "inputs": me.getSmlStore("smlInputs")
+            });
+            
+            jsonData = Ext.apply(jsonData,{
+                "outputs": me.getOutputs()
+            });
+            
+            jsonData["history"] = [];
+            
+            //console.dir(jsonData);
+            
+            this.loadedJson = {
+                data: jsonData
+            };
+            me.loadedJson = {
+                data: jsonData
+            };
+            
+            var posturl = Ext.String.format(
+                '{0}/istsos/services/{1}/procedures', 
+                wa.url,this.istService
+            );
+            
+            if (jsonData['classification']['systemtype']=='virtual'){
+                posturl = Ext.String.format(
+                    '{0}/istsos/services/{1}/virtualprocedures', 
+                    wa.url,this.istService
+                );
+            }
+            
+            Ext.Ajax.request({
+                url: posturl,
+                scope: this,
+                method: "POST",
+                jsonData: jsonData,
+                success: function(response, request){
+                    var json = Ext.decode(response.responseText);
+                    this.mask.hide();
+                    if (json.success) {
+                        this.fireEvent("operationSubmit",json);
+                        /*this.istFunction= {  
+                            onLoad: 'executeGet', 
+                            onSubmit: 'executePut' 
+                        }*/
+                        istsos.engine.pageManager.openPage({  
+                            istTitle: 'Edit procedure',  
+                            istBody: ['istsos.view.procedure'],  
+                            istFooter: istsos.SUBMIT,  
+                            istService: this.istService,  
+                            istProcedure: request.jsonData.system,  
+                            istFunction: {  
+                                onLoad: 'executeGet', 
+                                onSubmit: 'executePut' 
+                            }
+                        });
+                    }
+                }
+            });
+        
+        } catch (ex) { 
+            this.mask.hide();
+            Ext.MessageBox.show({
+                title: 'Warning',
+                msg: ex.message,
+                buttons: Ext.MessageBox.OK,
+                animateTarget: ex.cmp
+            });
+        }
+    },
+    getSystemInfo: function(){
+        var form = Ext.getCmp('generalInfo').getForm();
+        if (!form.isValid()) {
+            throw {
+                message: 'General info: mandatory params not filled.', 
+                cmp: "generalInfo"
+            };
+        }
+        var json = form.getValues();
+        return Ext.apply({
+            'system_id': json['system']
+        },json);
+    },
+    getCapabilities: function(){
+        var ret = this.getSmlStore("smlCapabilities");
+        var sr = Ext.getCmp("strValue");
+        var ar = Ext.getCmp("atrValue");
+        var str = Ext.getCmp("storeTypeValue");
+        
+        if (!Ext.isEmpty(sr.getValue())) {
+            ret.push({
+                "name": "Sampling time resolution",
+                "definition": "urn:x-ogc:def:classifier:x-istsos:1.0:samplingTimeResolution",
+                "uom": Ext.getCmp("strCombo").getValue(),
+                "value": ""+sr.getValue()
+            });
+        }
+        
+        if (!Ext.isEmpty(ar.getValue())) {
+            ret.push({
+                "name": "Acquisition time resolution",
+                "definition": "urn:x-ogc:def:classifier:x-istsos:1.0:acquisitionTimeResolution",
+                "uom": Ext.getCmp("atrCombo").getValue(),
+                "value": ""+ar.getValue()
+            });
+        }
+        if (!Ext.isEmpty(str.getValue())) {
+            ret.push({
+                "name": "Storage Type",
+                "definition": "urn:x-ogc:def:classifier:x-istsos:1.0:storageType:" + str.getValue()
+            });
+        }
+        
+        /*var sr = Ext.getCmp("tfSamplingResolution");
+        var ar = Ext.getCmp("tfAcquisitionResolution");
+        if (sr.isDirty()) {
+            ret.push({
+                "name": "Sampling time resolution",
+                "definition": "urn:x-ogc:def:classifier:x-istsos:1.0:samplingTimeResolution",
+                "uom": "iso8601",
+                "value": sr.getValue()
+            });
+        }
+        if (ar.isDirty()) {
+            ret.push({
+                "name": "Acquisition time resolution",
+                "definition": "urn:x-ogc:def:classifier:x-istsos:1.0:acquisitionTimeResolution",
+                "uom": "iso8601",
+                "value": ar.getValue()
+            });
+        }*/
+        return ret;
+    },
+    getClassification: function(){
+        var form = Ext.getCmp('classification').getForm();
+        if (!form.isValid()) {
+            throw {
+                message: 'Classification: mandatory params not filled.', 
+                cmp: "classification"
+            };
+        }
+        var json = form.getValues();
+        return [
+        {
+            "name" : "System Type",
+            "definition" : "urn:ogc:def:classifier:x-istsos:1.0:systemType",
+            "value" : json["systemtype"]
+        },{
+            "name" : "Sensor Type",
+            "definition" : "urn:ogc:def:classifier:x-istsos:1.0:sensorType",
+            "value" : json["sensortype"]
+        }
+        ];
+    },
+    getCharacteristics: function(){
+        var form = Ext.getCmp('characteristics').getForm();
+        if (!form.isValid()) {
+            throw {
+                message: 'Characteristics: mandatory params not filled.', 
+                cmp: "characteristics"
+            };
+        }
+        return form.getValues();
+    },
+    getContacts: function(){
+        var contacts = [];
+        var form = Ext.getCmp('frmOwner').getForm();
+        if (form.isDirty() && form.isValid()) {
+            contacts.push(form.getValues());
+        }
+        form = Ext.getCmp('frmManufacturer').getForm();
+        if (form.isDirty() && form.isValid()) {
+            contacts.push(form.getValues());
+        }
+        form = Ext.getCmp('frmOperator').getForm();
+        if (form.isDirty() && form.isValid()) {
+            contacts.push(form.getValues());
+        }
+        return contacts;
+    },
+    getLocation: function(){
+        
+        var form = Ext.getCmp('frmLocation').getForm();
+        if (!form.isValid()) {
+            throw {
+                message: 'Location: mandatory params not filled.', 
+                cmp: "frmLocation"
+            };
+        }
+        var json = form.getValues();
+        return {
+            "type": "Feature", 
+            "geometry": {
+                "type": "Point", 
+                "coordinates": [json['x'],json['y'],json['z']]
+            }, 
+            "crs": {
+                "type": "name", 
+                "properties": {
+                    "name": json['epsg']
+                }
+            },
+            "properties": {
+                "name": json['name']
+            }
+        }
+    },
+    getInterfaces: function(){
+        var form = Ext.getCmp('frmInterfaces').getForm();
+        if (!form.isValid()) {
+            throw {
+                message: 'Interfaces: mandatory params not filled.', 
+                cmp: "frmInterfaces"
+            };
+        }
+        return form.getValues();
+    },
+    getOutputs: function(){
+        var store = Ext.getStore("gridoutputs");
+        if (store.getCount()==0) {
+            throw {
+                message: 'Outputs: at leas one oberved property must be added', 
+                cmp: "frmSmlOutputs"
+            };
+        }
+        var ret = [
+        {
+            "name" : "Time",
+            "definition" : wa.isodef,
+            "uom" : "iso8601",
+            "description" : "",
+            "constraint" : {}
+        }];
+        for (var i = 0; i < store.getCount(); i++) {
+            var rec = store.getAt(i);
+            
+            if (!Ext.isEmpty(rec.get('from')) && !Ext.isEmpty(rec.get('to'))){
+                // Between
+                ret.push({
+                    "name" : rec.get('name'),
+                    "definition" : rec.get('definition'),
+                    "uom" : rec.get('uom'),
+                    "description" : rec.get('description'),
+                    "constraint" : {
+                        "role" : rec.get('role'),
+                        "interval" : [rec.get('from'), rec.get('to')]
+                    }
+                });
+            }else if(!Ext.isEmpty(rec.get('from'))){
+                // Greater then
+                ret.push({
+                    "name" : rec.get('name'),
+                    "definition" : rec.get('definition'),
+                    "uom" : rec.get('uom'),
+                    "description" : rec.get('description'),
+                    "constraint" : {
+                        "role" : rec.get('role'),
+                        "min" : rec.get('from')
+                    }
+                });
+            }else if (!Ext.isEmpty(rec.get('to'))){
+                // Less then
+                ret.push({
+                    "name" : rec.get('name'),
+                    "definition" : rec.get('definition'),
+                    "uom" : rec.get('uom'),
+                    "description" : rec.get('description'),
+                    "constraint" : {
+                        "role" : rec.get('role'),
+                        "max" : rec.get('to')
+                    }
+                });
+            }else if (!Ext.isEmpty(rec.get('list'))){
+                // List
+                ret.push({
+                    "name" : rec.get('name'),
+                    "definition" : rec.get('definition'),
+                    "uom" : rec.get('uom'),
+                    "description" : rec.get('description'),
+                    "constraint" : {
+                        "role" : rec.get('role'),
+                        "valueList" : rec.get('list').split(",")
+                    }
+                });
+            }else{
+                ret.push({
+                    "name" : rec.get('name'),
+                    "definition" : rec.get('definition'),
+                    "uom" : rec.get('uom'),
+                    "description" : rec.get('description'),
+                    "constraint" : {}
+                });         
+            }
+            
+            /*switch (rec.get('ctype')) {
+                case 1: // Greater then
+                    ret.push({
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : rec.get('uom'),
+                        "description" : rec.get('description'),
+                        "constraint" : {
+                            "role" : rec.get('role'),
+                            "min" : rec.get('from')
+                        }
+                    });
+                    break;
+                case 2: // Less then
+                    ret.push({
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : rec.get('uom'),
+                        "description" : rec.get('description'),
+                        "constraint" : {
+                            "role" : rec.get('role'),
+                            "max" : rec.get('to')
+                        }
+                    });
+                    break;
+                case 3: // Between
+                    ret.push({
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : rec.get('uom'),
+                        "description" : rec.get('description'),
+                        "constraint" : {
+                            "role" : rec.get('role'),
+                            "interval" : [rec.get('from'), rec.get('to')]
+                        }
+                    });
+                    break;
+                case 4: // List
+                    ret.push({
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : rec.get('uom'),
+                        "description" : rec.get('description'),
+                        "constraint" : {
+                            "role" : rec.get('role'),
+                            "valueList" : rec.get('list').split(",")
+                        }
+                    });
+                    break;
+                default: // List
+                    ret.push({
+                        "name" : rec.get('name'),
+                        "definition" : rec.get('definition'),
+                        "uom" : rec.get('uom'),
+                        "description" : rec.get('description'),
+                        "constraint" : {}
+                    });
+                    break;
+            }*/
+            
+            
+        }
+        return ret;
+    },
+    // Return the array of json of a given store
+    getSmlStore: function(name){
+        var main = Ext.getCmp(name);
+        var store = main.getComponent('gridSml').getStore();
+        var ret = [];
+        for (var i = 0; i < store.getCount(); i++) {
+            var rec = store.getAt(i);
+            ret.push(rec.data);
+        }
+        return ret;
+    },
+    initSmlFieldPanel: function(name, config){
+        var cmp = Ext.getCmp(name);
+        var skipRemove = false;
+        var skipInsert = false;
+        if (Ext.isObject(config) && !Ext.isEmpty(config["removeCmb"])) {
+            skipRemove = config["skipRemove"];
+        }
+        if (Ext.isObject(config) && !Ext.isEmpty(config["insertCmb"])) {
+            skipInsert = config["skipInsert"];
+        }
+        cmp.getComponent('frmSml').getComponent('btnAddSml').on('click',function(){
+            this.addSmlfield(name,skipRemove);
+        },this);
+        cmp.getComponent('gridSml').getComponent('gridToolbar').getComponent('btnRemoveSml').on('click',function(){
+            var recs = Ext.getCmp('gridIdentification').getSelectionModel().getSelection();
+            if (recs.length>0){
+                if (recs[0].get('definition') == 'urn:ogc:def:identifier:OGC:uniqueID'){
+                    Ext.MessageBox.show({
+                        title: 'Warning',
+                        msg: 'UniqueID is mandatory and cannot be removed',
+                        buttons: Ext.MessageBox.OK
+                    });
+                    return
+                }
+            }
+            this.removeSmlfield(name,skipInsert);
+        },this);
+    },
+    addSmlfield: function(name, skipRemove){
+        var main = Ext.getCmp(name);
+        var form = main.getComponent('frmSml');
+        var cmb = form.getComponent('cmbSml');
+        var store = main.getComponent('gridSml').getStore();
+        if (!form.getForm().isValid()) {
+            Ext.MessageBox.show({
+                title: 'Warning',
+                msg: 'Mandatory params are not filled correctly',
+                buttons: Ext.MessageBox.OK,
+                animateTarget: form
+            });
+            return;
+        }
+        var json = form.getForm().getValues();
+        var rec = cmb.findRecord(cmb.name,cmb.getValue());
+        var r = Ext.create('smlfield', Ext.apply({}, json, rec.data));
+        if (Ext.isEmpty(skipRemove) || skipRemove===false) {
+            cmb.getStore().remove(rec);
+        }
+        var last = store.getCount();
+        store.insert(last, r);
+        form.getForm().reset();
+    },
+    removeSmlfield: function(name, skipInsert){
+        var main = Ext.getCmp(name);
+        var form = main.getComponent('frmSml');
+        var cmb = form.getComponent('cmbSml');
+        var grid = main.getComponent('gridSml');
+        var store = grid.getStore();
+        form.getForm().reset();
+        var rec = grid.getSelectionModel().getSelection();
+        if (Ext.isEmpty(skipInsert) || skipInsert===false) {
+            cmb.getStore().insert(0,rec);
+        }
+        store.remove(rec);
+    },
+    openObsPropEditorWin: function(){
+        var win = openObsPropEditorWin(this.istService);
+        win.on("beforeclose",function(){
+            Ext.getStore('cmbobservedproperties').removeAll();
+            var cb = Ext.getCmp("cmbObservedProperty");
+            cb.reset();
+            cb.lastQuery = null;
+        });
+    },
+    openUomsEditorWin: function(){
+        var win = openUomsEditorWin(this.istService);
+        win.on("beforeclose",function(){
+            Ext.getStore('cmbuom').removeAll();
+            var cb = Ext.getCmp("cmbUom");
+            cb.reset();
+            cb.lastQuery = null;
+        });
+    }
+});
diff --git a/interface/app/view/proceduresList.js b/interface/app/view/proceduresList.js
new file mode 100755
index 0000000..9315993
--- /dev/null
+++ b/interface/app/view/proceduresList.js
@@ -0,0 +1,146 @@
+/*
+ * File: app/view/proceduresList.js
+ * Date: Thu Apr 26 2012 16:35:17 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.proceduresList', {
+    extend: 'istsos.view.ui.proceduresList',
+
+    initComponent: function() {
+        var me = this;
+        Ext.create('istsos.store.gridProceduresList');
+        me.callParent(arguments);
+        
+        
+        Ext.getCmp("btnRemove").on("click",function(){
+            var sm = this.getSelectionModel();
+            var rec = sm.getSelection();
+            if (rec.length==1) {
+                
+                var msg = '', deleteurl='';
+                if (rec[0].get('sensortype')=='virtual'){
+                    deleteurl=Ext.String.format('{0}/istsos/services/{1}/virtualprocedures/{2}', 
+                        wa.url, this.istService, rec[0].get('name')
+                    );
+                    msg = "Are you sure you want to erase the virtual " +
+                        "procedure and all of its python code?";
+                }else{
+                    deleteurl=Ext.String.format('{0}/istsos/services/{1}/procedures/{2}', 
+                        wa.url, this.istService, rec[0].get('name')
+                    );
+                    msg = "Are you sure you want to erase the procedure and all of its observations?";
+                }
+                
+                Ext.Msg.show({
+                    title:'Erasing procedure',
+                    msg: msg,
+                    buttons: Ext.Msg.YESNO,
+                    icon: Ext.Msg.QUESTION,
+                    fn: function(btn){
+                        if (btn == 'yes'){
+                            var sm = this.getSelectionModel();
+                            var rec = sm.getSelection();
+                            if (Ext.isEmpty(this.mask)) {
+                                this.mask = new Ext.LoadMask(this.body, {
+                                    msg:"Please wait..."
+                                });
+                            }
+                            this.mask.show();
+                            Ext.Ajax.request({
+                                url: deleteurl,
+                                scope: this,
+                                method: "DELETE",
+                                success: function(response){
+                                    Ext.Ajax.request({
+                                        url: Ext.String.format('{0}/istsos/services/{1}/procedures/operations/getlist', wa.url,this.istService),
+                                        scope: this,
+                                        method: "GET",
+                                        success: function(response){
+                                            var json = Ext.decode(response.responseText);
+                                            if (json.success) {
+                                                this.getStore().loadData(json.data);
+                                            }
+                                            this.mask.hide();
+                                        }
+                                    });
+                                },
+                                failure: function(){
+                                    
+                                }
+                            });      
+                        }
+                    },
+                    scope: this
+                });       
+            }
+        },this);
+        
+        this.columns[0].renderer = function(value, p, record){
+            var func=Ext.String.format("istsos.engine.pageManager.openPage({" + 
+                "istTitle: 'Edit procedure', " +
+                "istBody: ['istsos.view.procedure'], " +
+                "istFooter: istsos.SUBMIT, " +
+                "istService: '{0}'," + 
+                "istProcedure: '{1}'," + 
+                "istFunction: { " +
+                "   onLoad: 'executeGet'," +
+                "   onSubmit: 'executePut'" +
+                "}" +
+                "})",
+                this.istService,value);
+            return Ext.String.format('<span class="softLink" onclick="{0}">{1}</span>',func,value);
+        }
+        this.columns[3].renderer = function(value, p, record){
+            var ret = [];
+            for (var i = 0; i < value.length; i++) {
+                //var s = Ext.String.format('<span class="softLink" onclick="alert(\'load editor for: '+value[i]+'\')">{0}</span>',value[i]);
+                var s = Ext.String.format('{0}',value[i]);
+                ret.push(s);
+            }  
+            return ret.join(", ")
+        };
+        this.columns[4].renderer = function(value, p, record){
+            var ret = [];
+            for (var i = 0; i < value.length; i++) {
+                var v = value[i]['name'].split(':');
+                var s = Ext.String.format('{0} [{1}]',v[v.length-1],value[i]['uom']);
+                ret.push(s);
+            }  
+            return ret.join(", ")
+        };
+        this.columns[5].renderer = function(value, p, record){
+            return value['beginposition']
+        };
+        this.columns[6].renderer = function(value, p, record){
+            return value['endposition']
+        };
+    },
+    operationLoad: function(){
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        Ext.Ajax.request({
+            url: Ext.String.format('{0}/istsos/services/{1}/procedures/operations/getlist', wa.url,this.istService),
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    this.istForm.getStore().loadData(json.data);
+                }
+                this.mask.hide();
+            }
+        });
+    }
+});
diff --git a/interface/app/view/provider.js b/interface/app/view/provider.js
new file mode 100755
index 0000000..c2119df
--- /dev/null
+++ b/interface/app/view/provider.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/provider.js
+ * Date: Thu Apr 12 2012 09:08:03 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.provider', {
+    extend: 'istsos.view.ui.provider',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/qualityindexEditor.js b/interface/app/view/qualityindexEditor.js
new file mode 100755
index 0000000..b0fa268
--- /dev/null
+++ b/interface/app/view/qualityindexEditor.js
@@ -0,0 +1,154 @@
+/*
+ * File: app/view/obsPropEditor.js
+ * Date: Thu May 03 2012 15:10:30 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.qualityindexEditor', {
+    extend: 'istsos.view.ui.qualityindexEditor',
+
+    initComponent: function() {
+        var me = this;
+        
+        var gs = Ext.getStore("qistore");
+        if (Ext.isEmpty(gs)){
+            gs = Ext.create('Ext.data.Store', {
+                storeId: 'qistore',
+                autoLoad: true,
+                proxy: {
+                    type: 'ajax',
+                    url: Ext.String.format('{0}/istsos/services/{1}/dataqualities',wa.url, this.istService),
+                    reader: {
+                        type: 'json',
+                        idProperty: 'code',
+                        root: 'data'
+                    }
+                },
+                fields: [
+                {
+                    name: 'code'
+                },            
+                {
+                    name: 'name'
+                },
+                {
+                    name: 'description'
+                },
+                {
+                    name: 'display',
+                    convert: function(v, record){
+                        return record.get('code') + " - " + record.get('name') + " (" + record.get('description') + ")";
+                    }
+                }
+                ]
+            });
+        }
+        
+        //var gs = Ext.create('istsos.store.cmbNameDescription');
+        
+        me.callParent(arguments);
+        
+        Ext.getCmp("btnNew").on("click",function(){
+            this.resetForm();
+            Ext.getCmp('frmQuality').show();
+        },this);
+                
+        Ext.getCmp("btnForm").on("click",function(){
+            var f = Ext.getCmp('frmQuality');
+            var btn = Ext.getCmp("btnForm");
+            if (f.getForm().isValid()) {
+                var jsonData = f.getValues();
+                if (btn.getText()=='New') {
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}/dataqualities', 
+                            wa.url,this.istService),
+                        scope: this,
+                        method: "POST",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            Ext.getStore("qistore").load();
+                            Ext.getCmp('frmQuality').hide();
+                        }
+                    });
+                }else{
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}/dataqualities/{2}', wa.url,this.istService,Ext.getCmp('opCode').originalValue),
+                        scope: this,
+                        method: "PUT",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            Ext.getStore("qistore").load();
+                            Ext.getCmp('frmQuality').hide();
+                        }
+                    });
+                }
+            }else{
+                Ext.MessageBox.show({
+                    title: 'Validation error',
+                    msg: "Filled data is invalid",
+                    buttons: Ext.MessageBox.OK,
+                    animateTarget: f
+                });
+                return;
+            }
+        },this);
+        
+        Ext.getCmp("gridop").on("select",function(rowmodel, record, index, eOpts ){
+            Ext.getCmp('frmQuality').loadRecord(record);
+            Ext.getCmp('btnForm').setText('Update');
+            Ext.getCmp('btnRemove').enable();
+            Ext.getCmp('frmQuality').show();
+        });
+        
+        Ext.getCmp("btnRemove").on("click",function(){
+            var sm = Ext.getCmp("gridop").getSelectionModel();
+            var rec = sm.getSelection();
+            if (rec.length>0) {
+                Ext.Ajax.request({
+                    url: Ext.String.format('{0}/istsos/services/{1}/dataqualities/{2}', wa.url,this.istService,Ext.getCmp('opCode').originalValue),
+                    scope: this,
+                    method: "DELETE",
+                    jsonData: {
+                        'code': rec[0].get('code'),
+                        'name': rec[0].get('name'),
+                        'description': rec[0].get('description')
+                    },
+                    success: function(response){
+                        this.resetForm();
+                        Ext.getStore("qistore").load();
+                        Ext.getCmp('frmQuality').hide();
+                    }
+                });                
+            }
+        },this);
+        
+        //this.istService="sosmilan";
+        //gs.getProxy().url=Ext.String.format('{0}/istsos/services/{1}/dataqualities', wa.url ,this.istService);
+    },
+    operationLoad: function(){
+        Ext.getStore("qistore").load();
+    },
+    resetForm: function(){
+        Ext.getCmp('frmQuality').loadRecord({
+            'data': { 
+                'code': '',
+                'name': '',
+                'description': ''
+            }
+        });
+        Ext.getCmp('opName').clearInvalid();
+        Ext.getCmp('opCode').clearInvalid();
+        Ext.getCmp('btnForm').setText('New');
+        Ext.getCmp('btnRemove').disable();
+        Ext.getCmp("gridop").getSelectionModel().deselectAll();
+    }
+});
diff --git a/interface/app/view/serviceEditor.js b/interface/app/view/serviceEditor.js
new file mode 100755
index 0000000..246ab17
--- /dev/null
+++ b/interface/app/view/serviceEditor.js
@@ -0,0 +1,114 @@
+Ext.define('istsos.view.serviceEditor', {
+    extend: 'istsos.view.ui.serviceEditor',
+
+    initComponent: function() {
+        var me = this;
+        var strsrv = Ext.create('istsos.store.Services');
+        strsrv.getProxy().url = Ext.String.format('{0}/istsos/services', wa.url);
+            
+        me.callParent(arguments);
+        
+        Ext.getCmp("btnNew").on("click",function(){
+            this.resetForm();
+        },this);
+        
+        Ext.getCmp("btnForm").on("click",function(){
+            var f = Ext.getCmp('frmServices');
+            var btn = Ext.getCmp("btnForm");
+            if (f.getForm().isValid()) {
+                var jsonData = f.getValues();
+                if (btn.getText()=='New') {
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services', wa.url,Ext.getCmp('opService').originalValue),
+                        scope: this,
+                        method: "POST",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            Ext.getStore("storeServices").load();
+                            Ext.getCmp('webadmincmp').loadServiceMenu();
+                        }
+                    });
+                }else{
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}', wa.url,Ext.getCmp('opService').originalValue),
+                        scope: this,
+                        method: "PUT",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            Ext.getStore("storeServices").load();
+                            Ext.getCmp('webadmincmp').loadServiceMenu();
+                        }
+                    });
+                }
+            }else{
+                Ext.MessageBox.show({
+                    title: 'Validation error',
+                    msg: "Filled data is invalid",
+                    buttons: Ext.MessageBox.OK,
+                    animateTarget: f
+                });
+                return;
+            }
+        },this);
+        
+        
+        Ext.getCmp("gridop").on("select",function(rowmodel, record, index, eOpts ){
+            Ext.getCmp('frmServices').loadRecord(record);
+            Ext.getCmp('btnForm').setText('Update');
+            Ext.getCmp('btnRemove').enable();
+        });
+        
+        
+        Ext.getCmp("btnRemove").on("click",function(){
+        
+            Ext.Msg.show({
+                    title:'Erasing service',
+                    styleHtmlContent: true,
+                    msg: '<strong>This operation cannot be undone!</strong><br/><br/>are you sure you want to erase the selected service and all of its procedures/observations?',
+                    buttons: Ext.Msg.YESNO,
+                    icon: Ext.Msg.QUESTION,
+                    fn: function(btn){
+                        if (btn == 'yes'){
+                            var sm = Ext.getCmp("gridop").getSelectionModel();
+                            var rec = sm.getSelection();
+                            if (rec.length>0) {
+                                Ext.Ajax.request({
+                                    url: Ext.String.format('{0}/istsos/services/{1}', wa.url,Ext.getCmp('opService').originalValue),
+                                    scope: this,
+                                    method: "DELETE",
+                                    jsonData: {
+                                        'service': rec[0].get('service')
+                                    },
+                                    success: function(response){
+                                        this.resetForm();
+                                        Ext.getStore("storeServices").load();
+                                        Ext.getCmp('webadmincmp').loadServiceMenu();
+                                    }
+                                });                
+                            } 
+                        }
+                    },
+                    scope: this
+                });     
+        
+            
+        },this);
+        
+    },
+    operationLoad: function(){
+        Ext.getStore("storeServices").load();
+    },
+    resetForm: function(){
+        Ext.getCmp('frmServices').loadRecord({
+            'data': { 
+                'service': ''
+            }
+        });
+        Ext.getCmp('opService').clearInvalid();
+        Ext.getCmp('btnForm').setText('New');
+        Ext.getCmp('btnRemove').disable();
+        Ext.getCmp("gridop").getSelectionModel().deselectAll();
+    }
+});
diff --git a/interface/app/view/serviceconfig.js b/interface/app/view/serviceconfig.js
new file mode 100755
index 0000000..a40c354
--- /dev/null
+++ b/interface/app/view/serviceconfig.js
@@ -0,0 +1,112 @@
+/*
+ * File: app/view/serviceconfig.js
+ * Date: Tue Apr 17 2012 17:03:01 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.serviceconfig', {
+    extend: 'istsos.view.ui.serviceconfig',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    },
+    operationLoad: function () {
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        var url = Ext.String.format('{0}/istsos/services/{1}/configsections', wa.url,this.servicename);
+        Ext.Ajax.request({
+            url: url,
+            scope: this,
+            method: "GET",
+            success: function(response){
+                try {
+                    var json = Ext.decode(response.responseText);
+                    var data = {};
+                    for (var key in json['data']) {
+                        data = Ext.apply(data, json['data'][key]);
+                    }
+                    json['data'] = data;
+                    this.istForm.loadRecord(json);
+                } catch (exception) {
+                    console.error(exception);
+                }
+                this.mask.hide();
+                this.fireEvent("operationGet",json);
+            }
+        });
+    },
+    operationPost: function () {
+        if (Ext.isEmpty(this.mask)) {
+            this.mask = new Ext.LoadMask(this.body, {
+                msg:"Please wait..."
+            });
+        }
+        this.mask.show();
+        var jsonData = {};
+        var custom = false;
+        var valid = true;
+        var formItems = this.istForm.items.items;
+        for (var i in formItems) {
+            if (Ext.getClassName(formItems[i])=="Ext.form.FieldSet") {
+                if(!formItems[i].collapsed){
+                    custom = true;
+                    jsonData[formItems[i].getId()] = {};
+                    var fieldSetItems = formItems[i].items.items;
+                    for (var m in fieldSetItems) {
+                        if (Ext.getClassName(fieldSetItems[m])=="Ext.form.field.Text" || Ext.getClassName(fieldSetItems[m])=="Ext.form.field.Number") {
+                            var field = fieldSetItems[m];
+                            jsonData[formItems[i].getId()][field.getName()] = field.getValue();
+                            if (!field.isValid()) {
+                                valid = false;
+                            }               
+                        }
+                    }
+                }
+            }
+        }
+        if (!valid) {
+            this.mask.hide();
+            Ext.Msg.alert('Validation error', 'Please correct the invalid values');
+        } else if (valid && custom) {
+            var url = Ext.String.format('{0}/istsos/services/{1}/configsections', wa.url,this.servicename);
+            Ext.Ajax.request({
+                url: url,
+                scope: this,
+                method: "PUT",
+                jsonData: jsonData,
+                success: function(response){
+                    try {
+                        var json = Ext.decode(response.responseText);
+                        var data = {};
+                        for (var key in json['data']) {
+                            data = Ext.apply(data, json['data'][key]);
+                        }
+                        json['data'] = data;
+                        this.istForm.loadRecord(json);
+                    } catch (exception) {
+                        console.error(exception);
+                    }
+                    this.mask.hide();
+                    this.fireEvent("operationSubmit",json);
+                }
+            });
+        }else{
+            this.mask.hide();
+            this.fireEvent("operationSubmit",{
+                "success": true
+            });
+        }
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/serviceurl.js b/interface/app/view/serviceurl.js
new file mode 100755
index 0000000..4dc71ea
--- /dev/null
+++ b/interface/app/view/serviceurl.js
@@ -0,0 +1,21 @@
+/*
+ * File: app/view/serviceurl.js
+ * Date: Fri Apr 20 2012 14:33:11 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.serviceurl', {
+    extend: 'istsos.view.ui.serviceurl',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/status.js b/interface/app/view/status.js
new file mode 100755
index 0000000..b9d49b0
--- /dev/null
+++ b/interface/app/view/status.js
@@ -0,0 +1,64 @@
+/*
+ * File: app/view/status.js
+ * Date: Fri Apr 20 2012 10:13:38 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('istsos.view.status', {
+    extend: 'istsos.view.ui.status',
+
+    initComponent: function() {
+        var me = this;
+        var procs = Ext.create('istsos.store.serverstatus');
+        me.callParent(arguments);
+        var colorize = function (val) {
+            if (val == 'active') {
+                return '<span style="color:green;">' + val + '</span>';
+            } else if (val == 'up') {
+                return '<span style="color:green;">' + val + '</span>';
+            } else {
+                return '<span style="color:red;">' + val + '</span>';
+            }
+            return val;
+        };
+        Ext.getCmp('colDatabase').renderer = colorize;
+        Ext.getCmp('colAvailability').renderer = colorize;
+        var requests = function (val) {
+            if (val) {
+                return '<img src="images/icon/ok.svg" height="16px"/>';
+            } else {
+                return '<img src="images/icon/ko.svg" height="16px"/>';
+            }
+            return val;
+        };
+        Ext.getCmp('colGetcapabilities').renderer = requests;
+        Ext.getCmp('colDescribesensor').renderer = requests;
+        Ext.getCmp('colGetobservation').renderer = requests;
+        Ext.getCmp('colGetfeatureofinterest').renderer = requests;
+        Ext.getCmp('colInsertobservation').renderer = requests;
+        Ext.getCmp('colRegistersensor').renderer = requests;
+    },
+    operationLoad: function(){
+        Ext.getCmp('webadmincmp').showMask("Loading status info..")
+        Ext.Ajax.request({
+            url: Ext.String.format("{0}/istsos/operations/status", wa.url),
+            scope: this,
+            method: "GET",
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (json.success) {
+                    this.istForm.getStore().loadData(json.data);
+                }
+                //this.mask.hide();
+                Ext.getCmp('webadmincmp').hideMask();
+            }
+        });
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/BasePage.js b/interface/app/view/ui/BasePage.js
new file mode 100755
index 0000000..f2525f7
--- /dev/null
+++ b/interface/app/view/ui/BasePage.js
@@ -0,0 +1,62 @@
+/*
+ * File: app/view/ui/BasePage.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.BasePage', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    layout: {
+        type: 'border'
+    },
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    hidden: true,
+                    layout: {
+                        type: 'fit'
+                    },
+                    bodyBorder: true,
+                    bodyCls: 'centerTitle',
+                    bodyPadding: '8px',
+                    region: 'north'
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    styleHtmlContent: true,
+                    autoScroll: true,
+                    layout: {
+                        type: 'anchor'
+                    },
+                    bodyBorder: true,
+                    bodyCls: 'centerBody',
+                    region: 'center'
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    height: 20,
+                    hidden: true,
+                    bodyPadding: '8px',
+                    region: 'south'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/Calc.js b/interface/app/view/ui/Calc.js
new file mode 100755
index 0000000..85ce387
--- /dev/null
+++ b/interface/app/view/ui/Calc.js
@@ -0,0 +1,335 @@
+/*
+ * File: app/view/ui/Calc.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.Calc', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    height: 150,
+    minWidth: 450,
+    width: 450,
+    layout: {
+        type: 'border'
+    },
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    height: 100,
+                    layout: {
+                        align: 'stretch',
+                        type: 'hbox'
+                    },
+                    title: '',
+                    region: 'north',
+                    items: [
+                        {
+                            xtype: 'gridpanel',
+                            border: 0,
+                            id: 'editableProcedureGrid',
+                            width: 180,
+                            title: '',
+                            store: 'editableProcedure',
+                            flex: 0.3,
+                            columns: [
+                                {
+                                    xtype: 'gridcolumn',
+                                    border: 0,
+                                    dataIndex: 'name',
+                                    flex: 1,
+                                    text: 'Procedures'
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            layout: {
+                                align: 'stretch',
+                                type: 'vbox'
+                            },
+                            title: '',
+                            flex: 0.7,
+                            items: [
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    height: 30,
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'hbox'
+                                    },
+                                    title: '',
+                                    flex: 1,
+                                    items: [
+                                        {
+                                            xtype: 'button',
+                                            id: 'plus',
+                                            text: '+',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'moltiply',
+                                            text: '*',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'sqrt',
+                                            text: 'sqrt',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'sin',
+                                            text: 'sin',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'exp',
+                                            text: '^',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'acos',
+                                            text: 'acos',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'openparentesis',
+                                            text: '(',
+                                            flex: 1
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    height: 30,
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'hbox'
+                                    },
+                                    title: '',
+                                    flex: 1,
+                                    items: [
+                                        {
+                                            xtype: 'button',
+                                            id: 'minus',
+                                            text: '-',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'divide',
+                                            text: '/',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'cos',
+                                            text: 'cos',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'asin',
+                                            text: 'asin',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'tan',
+                                            text: 'tan',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'atan',
+                                            text: 'atan',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'closedparentesis',
+                                            text: ')',
+                                            flex: 1
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    height: 30,
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'hbox'
+                                    },
+                                    title: '',
+                                    flex: 1,
+                                    items: [
+                                        {
+                                            xtype: 'button',
+                                            id: 'less',
+                                            text: '<',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'grater',
+                                            text: '>',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'equal',
+                                            text: '=',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'lesseq',
+                                            text: '≤',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'gretereq',
+                                            text: '≥',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'andop',
+                                            text: 'AND',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'orop',
+                                            text: 'OR',
+                                            flex: 1
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    layout: {
+                        type: 'border'
+                    },
+                    title: '',
+                    region: 'center',
+                    items: [
+                        {
+                            xtype: 'form',
+                            border: 0,
+                            width: 120,
+                            bodyPadding: 10,
+                            title: '',
+                            region: 'west',
+                            items: [
+                                {
+                                    xtype: 'displayfield',
+                                    id: 'pEditing',
+                                    hideLabel: true,
+                                    anchor: '100%'
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            layout: {
+                                align: 'stretch',
+                                type: 'hbox'
+                            },
+                            title: '',
+                            region: 'center',
+                            items: [
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    id: 'codePanel',
+                                    layout: {
+                                        align: 'stretch',
+                                        padding: '6 0 0 0',
+                                        type: 'hbox'
+                                    },
+                                    title: '',
+                                    flex: 0.5
+                                },
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    bodyPadding: 10,
+                                    title: '',
+                                    flex: 0.5,
+                                    items: [
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'calcQiCombo',
+                                            fieldLabel: 'QI',
+                                            labelSeparator: '=',
+                                            labelWidth: 40,
+                                            emptyText: 'choosing a qi will update the selectded values..',
+                                            displayField: 'combo',
+                                            queryMode: 'local',
+                                            store: 'calcQiStore',
+                                            valueField: 'code',
+                                            anchor: '100%'
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            width: 40,
+                            layout: {
+                                align: 'stretch',
+                                padding: '5px',
+                                type: 'vbox'
+                            },
+                            title: '',
+                            region: 'east',
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnExecute',
+                                    text: '↵',
+                                    flex: 1
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/CenterPage.js b/interface/app/view/ui/CenterPage.js
new file mode 100755
index 0000000..b7cbacd
--- /dev/null
+++ b/interface/app/view/ui/CenterPage.js
@@ -0,0 +1,384 @@
+Ext.define('istsos.view.ui.CenterPage', {
+    extend: 'istsos.view.ui.BasePage',
+    constructor: function(config) {
+        if(Ext.isObject(config)){
+            Ext.apply(this,config);
+        }
+        this.istDocId = Ext.id();
+        this.addEvents('operationSubmit', 'operationPost', 'operationPut', 
+            'operationDelete', 'operationGet');
+        this.callParent(arguments);
+    },
+    initComponent: function() {
+        this.callParent(arguments);
+        
+        /*if(this.istTitle){
+            this.setTitle(this.istTitle);
+        }
+        if(this.istBody) {
+            if (this.istService) {
+                this.setBody(this.istBody,this.istService); 
+            }else{
+                this.setBody(this.istBody); 
+            }
+        }*/
+        
+        if(this.istService){
+            Ext.Ajax.request({
+                url: Ext.String.format('{0}/istsos/services/{1}/configsections',wa.url, this.istService),
+                scope: this,
+                method: "GET",
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    if (json.success) {
+                        this.configsections = json.data;
+                    }
+                    if(this.istTitle){
+                        this.setTitle(this.istTitle);
+                    }
+                    if(this.istBody) {
+                        if (this.istService) {
+                            this.setBody(this.istBody,this.istService); 
+                        }else{
+                            this.setBody(this.istBody); 
+                        }
+                    }
+                }
+            });
+        }else{
+            if(this.istTitle){
+                this.setTitle(this.istTitle);
+            }
+            if(this.istBody) {
+                if (this.istService) {
+                    this.setBody(this.istBody,this.istService); 
+                }else{
+                    this.setBody(this.istBody); 
+                }
+            }
+        }
+    },
+    resetIstConfig: function(){
+        Ext.apply(this,{
+            istTitle: null,
+            istService: null,
+            istProcedure: null,
+            istDescription: null,
+            istBody: null,
+            istFunction: null,
+            istOperation: null,
+            istFooter: null
+        });
+    },
+    getIstConfig: function(){
+        return {
+            istTitle: this.istTitle,
+            istService: this.istService,
+            istProcedure: this.istProcedure,
+            istDescription: this.istDescription,
+            istBody: this.istBody,
+            istFunction: this.istFunction,
+            istOperation: this.istOperation,
+            istFooter: this.istFooter,
+            istSections: this.configsections  
+        };
+    },
+    initWaurl: function(){
+        this.waurl = this.istOperation.restUrl.replace("","");
+    },
+    setTitle: function(title){
+        
+        this.getComponent(1).setTitle( (!Ext.isEmpty(this.istService) ? this.istService: '') + " > " + title);
+        
+    /*this.getComponent(0).removeAll(true);
+        
+        if(Ext.isString(title)){
+            this.getComponent(0).update(title);
+        }else{
+            if(Ext.isArray(title)){
+                if(title.length==1){
+                    this.getComponent(0).add(Ext.create(title[0]));
+                }else{
+                    throw "CenterPage can't handle the configuration array given.";
+                }
+            }
+        }*/
+        
+    /*this.getComponent(0).add(
+            Ext.create('Ext.draw.Component', {
+                items: [{
+                    type: 'text',
+                    text: title,
+                    fill: '#FFFFFF',
+                    font: "20px 'Nova Square'",
+                    y: 5,
+                    rotate: {
+                        degrees: -90
+                    }
+                }]
+            })
+        );*/
+        
+    },
+    setBody: function(){
+        this.getComponent(1).removeAll(true);
+        // Removing docked button toolbar
+        var doc = Ext.getCmp(this.istDocId);
+        if (!Ext.isEmpty(doc)) {
+            this.getComponent(1).removeDocked(doc,true);
+        }
+        this.istForm = null;
+        // Creating Description panel just over body panel
+        if(this.istDescription){
+            this.getComponent(1).add({
+                xtype: 'panel',
+                title: null,
+                bodyStyle: 'color: BLACK; font-size: 14px;',
+                html: this.istDescription,
+                flex: 0.5,
+                border: 0,
+                bodyPadding: "5px 0px 5px 0px"
+            });
+        }
+        // If istBody is a String that that means that is an html page
+        if(Ext.isString(this.istBody)){
+            this.getComponent(1).add({
+                xtype: 'panel',
+                title: null,
+                html: this.istBody,
+                flex: 0.5,
+                border: 0,
+                bodyPadding: "5px 0px 5px 0px"
+            });
+        }else{
+            // If istBody is an array then a container is initialized
+            if(Ext.isArray(this.istBody)){
+                if(this.istBody.length==1){
+                    this.istForm = Ext.create(this.istBody[0],Ext.apply({
+                        flex: 1
+                    },this.getIstConfig()));  
+                    this.initListeners();
+                    this.getComponent(1).add({
+                        xtype: 'panel',
+                        title: null,
+                        items: this.istForm,
+                        layout: 'fit',
+                        flex: 1,
+                        border: 0
+                    });
+                }else{
+                    throw "CenterPage can't handle the given body configuration array.";
+                }
+            }
+        }
+        // Construct and initialize actions on button toolbar
+        this.initFooter();
+    },
+    initListeners: function () {
+        // Initialize the function to call when the page is displayed.
+        // in the config the paramenters to are:
+        // istOperation: the url where the standard REST call must be done
+        // istBodyOnLoad: the function name of the panel (this.istForm) 
+        //                  that is loaded inside.
+        
+        if (!Ext.isEmpty(this.istOperation) || !Ext.isEmpty(this.istFunction)) {
+            this.istForm.on("afterrender",function(cmp, eOpts){
+                
+                if (!Ext.isEmpty(this.istFunction) && !Ext.isEmpty(this.istFunction.onLoad)){
+                    Ext.callback(this.istForm[this.istFunction.onLoad], this);
+                }
+                
+                if (!Ext.isEmpty(this.istOperation)){
+                    this.operationGet();
+                }
+                
+            },this, {
+                single: true
+            });
+        }
+    },
+    initFooter: function(){
+        if (!Ext.isEmpty(this["istFooter"])){
+            if (this["istFooter"] == istsos.SUBMIT) {
+                this.getComponent(1).addDocked({
+                    id: this.istDocId,
+                    xtype: 'toolbar',
+                    //ui: 'footer',
+                    //dock: 'bottom',
+                    layout: {
+                        pack: 'start',
+                        //padding: 6,
+                        type: 'hbox'
+                    },
+                    items: [
+                    /*{
+                        xtype: 'button',
+                        id: 'configcancel',
+                        //scale: 'medium',
+                        text: 'Cancel'
+                    },*/
+                    {
+                        xtype: 'panel',
+                        id: "messagesbox",
+                        border: 0,
+                        html: " ",
+                        bodyStyle: 'background-color: transparent; color: white; text-align: right; opacity: 1;',
+                        flex: 1
+                    },
+                    {
+                        xtype: 'button',
+                        id: 'configsubmit',
+                        scope: this,
+                        handler: this.operationSubmit,
+                        //scale: 'medium',
+                        text: 'Submit',
+                        //width: 180,
+                        flex: 0
+                    }
+                    ]
+                });
+            }
+        }
+    },
+    operationSubmit: function(){
+        if (!Ext.isEmpty(this.istFunction)) {
+            Ext.callback(this.istForm[this.istFunction.onSubmit], this);
+        }
+        if (!Ext.isEmpty(this.istForm) && !Ext.isEmpty(this.istOperation)){
+            
+            if (Ext.isEmpty(this.mask)) {
+                this.mask = new Ext.LoadMask(this.body, {
+                    msg:"Inserting data..."
+                });
+            }
+            this.mask.show();
+            var json = this.istForm.getValues();
+            var url = null;
+            var method = "PUT";
+            if (Ext.isObject(this.istOperation)) {
+                url = this.istOperation.restUrl;
+                method = this.istOperation.onSubmitMethod?this.istOperation.onSubmitMethod:"POST";
+            }else if (Ext.isString(this.istOperation)) {
+                url = this.istOperation;
+            }else{
+                throw "Misconfiguration in pageConfig";
+            }
+            
+            Ext.Ajax.request({
+                url: url,
+                scope: this,
+                method: method,
+                jsonData: json,
+                success: function(response){
+                    var json = Ext.decode(response.responseText);
+                    /*
+                    if (Ext.getCmp('messageField') != undefined) {
+                        if (json.success && !Ext.isEmpty(json.message)) {
+                            Ext.getCmp('messageField').setVisible(true);
+                            json['data']['message']=json['message']
+                        }else{
+                            Ext.getCmp('messageField').setVisible(false);
+                        }
+                    }var msg = Ext.getCmp('messagesbox');
+                    if (msg){
+                        var el = msg.getEl();
+                        msg.update(json['message']);
+                        el.fadeIn({
+                            duration: 500,
+                            easing: 'elasticIn'
+                        }).fadeOut({
+                            delay: 3000,
+                            duration: 500,
+                            easing: null
+                        });
+                        
+                    }*/
+                    this.istForm.loadRecord(json);
+                    this.mask.hide();
+                    this.fireEvent("operationSubmit",json);
+                }
+            });
+        }
+                
+    },
+    operationGet: function(){
+        if (!Ext.isEmpty(this.istOperation)) {
+            Ext.getCmp('webadmincmp').showMask("Please wait...");
+            
+            var url = null;
+            if (Ext.isObject(this.istOperation)) {
+                url = this.istOperation.restUrl;
+            }else if (Ext.isString(this.istOperation)) {
+                url = this.istOperation;
+            }else{
+                throw "Misconfiguration in pageConfig";
+            }
+            Ext.Ajax.request({
+                url: url,
+                scope: this,
+                method: "GET",
+                success: function(response){
+                    try {
+                        var json = Ext.decode(response.responseText);
+                        this.istForm.loadRecord(json);
+                    } catch (exception) {
+                        console.error(exception);
+                    }
+                    Ext.getCmp('webadmincmp').hideMask();
+                    this.fireEvent("operationGet",json);
+                }
+            });
+        }
+    },
+    operationPost: function(){  
+        Ext.getCmp('webadmincmp').showMask("Inserting data...");
+        
+        var json = this.istForm.getValues();
+        
+        Ext.Ajax.request({
+            url: this.waurl,
+            scope: this,
+            method: 'POST',
+            jsonData: json,
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (Ext.getCmp('messageField') != undefined) {
+                    if (json.success && !Ext.isEmpty(json.message)) {
+                        Ext.getCmp('messageField').setVisible(true);
+                        json['data']['message']=json['message']
+                    }else{
+                        Ext.getCmp('messageField').setVisible(false);
+                    }
+                }
+                this.istForm.loadRecord(json);
+                Ext.getCmp('webadmincmp').hideMask();
+                this.fireEvent("operationPost",json);
+            }
+        });
+    },
+    operationPut: function(){  
+        Ext.getCmp('webadmincmp').showMask("Updating data...");
+        var json = this.istForm.getValues();
+        
+        Ext.Ajax.request({
+            url: this.waurl,
+            scope: this,
+            method: 'PUT',
+            jsonData: json,
+            success: function(response){
+                var json = Ext.decode(response.responseText);
+                if (Ext.getCmp('messageField') != undefined) {
+                    if (json.success && !Ext.isEmpty(json.message)) {
+                        Ext.getCmp('messageField').setVisible(true);
+                        json['data']['message']=json['message']
+                    }else{
+                        Ext.getCmp('messageField').setVisible(false);
+                    }
+                }
+                this.istForm.loadRecord(json);
+                Ext.getCmp('webadmincmp').hideMask();
+                this.fireEvent("operationPut",json);
+            }
+        });
+    }
+});
diff --git a/interface/app/view/ui/Chart.js b/interface/app/view/ui/Chart.js
new file mode 100755
index 0000000..5491f5d
--- /dev/null
+++ b/interface/app/view/ui/Chart.js
@@ -0,0 +1,260 @@
+/*
+ * File: app/view/ui/Chart.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.Chart', {
+    extend: 'Ext.panel.Panel',
+    requires: [
+        'istsos.view.ProcedurePlotter',
+        'istsos.view.ProcedureChooser'
+    ],
+
+    border: 0,
+    height: 600,
+    id: 'chartpanel',
+    minHeight: 400,
+    minWidth: 1130,
+    autoScroll: true,
+    layout: {
+        type: 'border'
+    },
+    bodyStyle: 'background-color: white;',
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    id: 'charttwo',
+                    minWidth: 500,
+                    layout: {
+                        align: 'stretch',
+                        type: 'vbox'
+                    },
+                    title: '',
+                    region: 'center',
+                    items: [
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            height: 150,
+                            id: 'plotcalc',
+                            activeItem: 0,
+                            layout: {
+                                type: 'card'
+                            },
+                            title: '',
+                            items: [
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    padding: '0px 5px 5px 5px ',
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'fieldset',
+                                            title: '2. Plot data',
+                                            items: [
+                                                {
+                                                    xtype: 'procedureplotter',
+                                                    id: 'plotdatafrm'
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    id: 'calccnt',
+                                    padding: '9 10 0 10',
+                                    layout: {
+                                        type: 'fit'
+                                    },
+                                    title: ''
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            html: '<div style=\'border-radius: 3px 3px 3px 3px !important; background-color: white; border: thin solid green; width: 100%; height: 100%;\' id=\'chartCnt\'></div>',
+                            title: '',
+                            flex: 0.7,
+                            margins: '0 10 5 10'
+                        },
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            height: 30,
+                            padding: '0 10 5 10',
+                            layout: {
+                                align: 'middle',
+                                padding: '0 10 5 10',
+                                type: 'hbox'
+                            },
+                            title: '',
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnRangeDay',
+                                    enableToggle: true,
+                                    text: 'Day',
+                                    toggleGroup: 'timeline',
+                                    flex: 1
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnRangeWeek',
+                                    enableToggle: true,
+                                    text: 'Week',
+                                    toggleGroup: 'timeline',
+                                    flex: 1
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnRangeAll',
+                                    enableToggle: true,
+                                    pressed: true,
+                                    text: 'All',
+                                    toggleGroup: 'timeline',
+                                    flex: 1
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    id: 'chartthree',
+                    minWidth: 350,
+                    width: 350,
+                    layout: {
+                        align: 'stretch',
+                        type: 'vbox'
+                    },
+                    collapsed: false,
+                    region: 'east',
+                    items: [
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            height: 105,
+                            layout: {
+                                type: 'fit'
+                            },
+                            title: '',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    id: 'chartfilterFrm',
+                                    bodyPadding: '0 10 5 0',
+                                    collapseFirst: false,
+                                    collapsed: false,
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'fieldset',
+                                            padding: 5,
+                                            title: '3. Start editing',
+                                            items: [
+                                                {
+                                                    xtype: 'combobox',
+                                                    id: 'oeCbEditableProcedures',
+                                                    name: 'procedure',
+                                                    fieldLabel: 'Procedure',
+                                                    labelWidth: 70,
+                                                    displayField: 'name',
+                                                    queryMode: 'local',
+                                                    store: 'editableProcedure',
+                                                    valueField: 'name',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'container',
+                                                    height: 25,
+                                                    layout: {
+                                                        align: 'stretch',
+                                                        type: 'hbox'
+                                                    },
+                                                    items: [
+                                                        {
+                                                            xtype: 'button',
+                                                            hidden: true,
+                                                            id: 'btnCancelEditor',
+                                                            text: 'Cancel',
+                                                            flex: 1
+                                                        },
+                                                        {
+                                                            xtype: 'button',
+                                                            id: 'btnStartEditor',
+                                                            text: 'Start editing',
+                                                            flex: 1
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            id: 'chartgridcnt',
+                            layout: {
+                                type: 'fit'
+                            },
+                            title: '',
+                            flex: 1,
+                            margins: '0 10 5 0'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    width: 300,
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    region: 'west',
+                    items: [
+                        {
+                            xtype: 'fieldset',
+                            padding: 5,
+                            layout: {
+                                type: 'fit'
+                            },
+                            title: '1. Choose procedure',
+                            items: [
+                                {
+                                    xtype: 'procedurechooser',
+                                    id: 'pchoose'
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ChartContainer.js b/interface/app/view/ui/ChartContainer.js
new file mode 100755
index 0000000..5b98305
--- /dev/null
+++ b/interface/app/view/ui/ChartContainer.js
@@ -0,0 +1,37 @@
+/*
+ * File: app/view/ui/ChartContainer.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ChartContainer', {
+    extend: 'Ext.panel.Panel',
+    requires: [
+        'istsos.view.Chart'
+    ],
+
+    border: 0,
+    layout: {
+        type: 'fit'
+    },
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'chart'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/CheckColumn.js b/interface/app/view/ui/CheckColumn.js
new file mode 100755
index 0000000..5f79e73
--- /dev/null
+++ b/interface/app/view/ui/CheckColumn.js
@@ -0,0 +1,23 @@
+/*
+ * File: app/view/ui/CheckColumn.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.CheckColumn', {
+    extend: 'Ext.grid.column.Column',
+
+    text: 'Interpolation',
+
+    initComponent: function() {
+        var me = this;
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/Editor1.js b/interface/app/view/ui/Editor1.js
new file mode 100755
index 0000000..fe052ca
--- /dev/null
+++ b/interface/app/view/ui/Editor1.js
@@ -0,0 +1,75 @@
+/*
+ * File: app/view/ui/Editor1.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.Editor1', {
+    extend: 'Ext.panel.Panel',
+    requires: [
+        'istsos.view.ProcedureChart',
+        'istsos.view.ProcedureChooser',
+        'istsos.view.ProcedureGridEditor'
+    ],
+
+    border: 0,
+    padding: 0,
+    layout: {
+        type: 'border'
+    },
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    layout: {
+                        type: 'border'
+                    },
+                    title: '',
+                    region: 'center',
+                    items: [
+                        {
+                            xtype: 'procedurechart',
+                            region: 'center'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'tabpanel',
+                    width: 450,
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    activeTab: 0,
+                    region: 'west',
+                    items: [
+                        {
+                            xtype: 'procedurechooser',
+                            border: 0,
+                            id: 'pchoose',
+                            title: 'Choose procedure'
+                        },
+                        {
+                            xtype: 'proceduregrideditor',
+                            id: 'proceduregrideditor',
+                            title: 'Editor'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/FormDataQuality.js b/interface/app/view/ui/FormDataQuality.js
new file mode 100755
index 0000000..d7081ed
--- /dev/null
+++ b/interface/app/view/ui/FormDataQuality.js
@@ -0,0 +1,99 @@
+/*
+ * File: app/view/ui/FormDataQuality.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.FormDataQuality', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    layout: {
+        type: 'anchor'
+    },
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'form',
+                    border: 0,
+                    bodyPadding: 10,
+                    title: '',
+                    items: [
+                        {
+                            xtype: 'fieldset',
+                            title: 'Add new index',
+                            items: [
+                                {
+                                    xtype: 'textfield',
+                                    fieldLabel: 'Code',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'textfield',
+                                    fieldLabel: 'Description',
+                                    anchor: '100%'
+                                }
+                            ]
+                        }
+                    ],
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            ui: 'footer',
+                            anchor: '100%',
+                            dock: 'bottom',
+                            layout: {
+                                pack: 'end',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    text: 'Cancel'
+                                },
+                                {
+                                    xtype: 'button',
+                                    text: 'Add'
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'gridpanel',
+                    padding: '16 8 0 8',
+                    title: 'Quality indexes',
+                    store: 'dataQualityStore',
+                    viewConfig: {
+                        height: 120
+                    },
+                    columns: [
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'code',
+                            text: 'Code'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'description',
+                            text: 'Description'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/FormPaths.js b/interface/app/view/ui/FormPaths.js
new file mode 100755
index 0000000..715caea
--- /dev/null
+++ b/interface/app/view/ui/FormPaths.js
@@ -0,0 +1,44 @@
+/*
+ * File: app/view/ui/FormPaths.js
+ * Date: Wed Apr 11 2012 11:02:26 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.FormPaths', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    id: 'contactinfo',
+    bodyPadding: 10,
+    bodyStyle: 'centerBody',
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'textfield',
+                    name: 'contact',
+                    fieldLabel: 'istSOS lib',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'organization',
+                    fieldLabel: 'istSOS config',
+                    anchor: '100%'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/MainMenu.js b/interface/app/view/ui/MainMenu.js
new file mode 100755
index 0000000..492693d
--- /dev/null
+++ b/interface/app/view/ui/MainMenu.js
@@ -0,0 +1,225 @@
+/*
+ * File: app/view/ui/MainMenu.js
+ * Date: Mon Jun 04 2012 15:17:46 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.MainMenu', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    layout: {
+        type: 'border'
+    },
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    activeItem: 0,
+                    layout: {
+                        type: 'card'
+                    },
+                    title: '',
+                    region: 'center',
+                    items: [
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            layout: {
+                                align: 'stretch',
+                                type: 'hbox'
+                            },
+                            title: '',
+                            dockedItems: [
+                                {
+                                    xtype: 'toolbar',
+                                    ui: 'footer',
+                                    flex: 1,
+                                    margins: 4,
+                                    dock: 'top',
+                                    items: [
+                                        {
+                                            xtype: 'buttongroup',
+                                            title: 'Server',
+                                            columns: 1,
+                                            layout: {
+                                                columns: 1,
+                                                type: 'table'
+                                            },
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Status'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'About'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Logs'
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            xtype: 'buttongroup',
+                                            title: 'Default Settings',
+                                            columns: 1,
+                                            layout: {
+                                                columns: 1,
+                                                type: 'table'
+                                            },
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Database'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Service provider'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Service identification'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Coordinates system'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'GetObservation '
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Configuration'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Proxy Configuration'
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            xtype: 'buttongroup',
+                                            title: 'Wizards',
+                                            columns: 1,
+                                            layout: {
+                                                columns: 1,
+                                                type: 'table'
+                                            },
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'New service'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Delete service'
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            xtype: 'buttongroup',
+                                            title: 'Default settings',
+                                            columns: 2,
+                                            layout: {
+                                                columns: 2,
+                                                type: 'table'
+                                            },
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Button 1'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    text: 'Button 2'
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            title: 'My Panel'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    height: 40,
+                    layout: {
+                        type: 'border'
+                    },
+                    title: '',
+                    region: 'north',
+                    items: [
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            layout: {
+                                type: 'hbox'
+                            },
+                            title: '',
+                            region: 'center',
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    text: 'Server',
+                                    flex: 1
+                                },
+                                {
+                                    xtype: 'button',
+                                    text: 'Services',
+                                    flex: 1,
+                                    menu: {
+                                        xtype: 'menu',
+                                        items: [
+                                            {
+                                                xtype: 'menuitem',
+                                                text: 'Menu Item'
+                                            }
+                                        ]
+                                    }
+                                },
+                                {
+                                    xtype: 'button',
+                                    text: 'Data',
+                                    flex: 1
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            html: '<div class=\'mainHeaderTitle\'>istSOS manager</div>\n<div class=\'mainHeaderSubtitle\'> > Control Panel for Sensor Observation Service</div>',
+                            width: 300,
+                            bodyPadding: 4,
+                            title: '',
+                            region: 'east'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/MainMenu2.js b/interface/app/view/ui/MainMenu2.js
new file mode 100755
index 0000000..beaead0
--- /dev/null
+++ b/interface/app/view/ui/MainMenu2.js
@@ -0,0 +1,112 @@
+/*
+ * File: app/view/ui/MainMenu2.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.MainMenu2', {
+    extend: 'Ext.panel.Panel',
+
+    id: 'webadmincmp',
+    layout: {
+        type: 'border'
+    },
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    id: 'mainCenter',
+                    autoScroll: true,
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    region: 'center'
+                },
+                {
+                    xtype: 'panel',
+                    height: 150,
+                    id: 'submenu',
+                    margin: '0px 0px 1px 0px ',
+                    layout: {
+                        align: 'stretch',
+                        type: 'hbox'
+                    },
+                    collapsed: true,
+                    hideCollapseTool: true,
+                    title: '',
+                    region: 'north',
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            flex: 1,
+                            dock: 'top',
+                            layout: {
+                                padding: '4 0 4 0',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    componentCls: 'test',
+                                    id: 'menuServer',
+                                    enableToggle: true,
+                                    pressed: true,
+                                    text: 'Server',
+                                    toggleGroup: 'mainmenu'
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnService',
+                                    enableToggle: true,
+                                    text: 'Services',
+                                    toggleGroup: 'mainmenu',
+                                    menu: {
+                                        xtype: 'menu',
+                                        id: 'menuServices'
+                                    }
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnObservations',
+                                    enableToggle: true,
+                                    text: 'Data viewer',
+                                    toggleGroup: 'mainmenu'
+                                },
+                                {
+                                    xtype: 'container',
+                                    html: ' <div class=\'mainHeaderTitle\'><a href=\'http://istgeo.ist.supsi.ch/software/istsos/\' target=\'_BLANK\'><img height=28 src=\'images/istsos-logo.png\'/></a></div>',
+                                    flex: 1
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    height: 25,
+                    html: '<a style=\'color: white; text-decoration: none;\' href=\'http://www.supsi.ch/ist\' target=\'_BLANK\'>Open Source Software by Institute of Earth Science - SUPSI</a>',
+                    id: 'mainFoot',
+                    bodyCls: 'mainFooter',
+                    bodyPadding: 8,
+                    title: '',
+                    region: 'south'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/MainPanel.js b/interface/app/view/ui/MainPanel.js
new file mode 100755
index 0000000..017f681
--- /dev/null
+++ b/interface/app/view/ui/MainPanel.js
@@ -0,0 +1,149 @@
+/*
+ * File: app/view/ui/MainPanel.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.MainPanel', {
+    extend: 'Ext.container.Viewport',
+
+    id: 'mainPanel',
+    itemId: '',
+    layout: {
+        type: 'border'
+    },
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    id: 'mainCenter',
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    region: 'center'
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    height: 70,
+                    html: '<div class=\'mainHeaderTitle\'>istSOS manager</div>\n<div class=\'mainHeaderSubtitle\'> > Control Panel for Sensor Observation Service</div>',
+                    id: 'mainHead',
+                    bodyCls: 'mainHeader',
+                    bodyPadding: '15 0 0 8',
+                    title: '',
+                    region: 'north'
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    height: 25,
+                    html: 'Open Source Software by Institute of Earth Science - SUPSI',
+                    id: 'mainFoot',
+                    bodyCls: 'mainFooter',
+                    bodyPadding: 8,
+                    title: '',
+                    region: 'south'
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    id: 'panelMenu',
+                    width: 210,
+                    layout: {
+                        type: 'border'
+                    },
+                    title: '',
+                    region: 'west',
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            height: 30,
+                            style: 'background-color: white !important;',
+                            region: 'north',
+                            dock: 'top',
+                            layout: {
+                                align: 'stretch',
+                                padding: 2,
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnMainMenu',
+                                    enableToggle: true,
+                                    pressed: true,
+                                    text: 'Server',
+                                    toggleGroup: 'menugroup',
+                                    flex: 1
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnServicesMenu',
+                                    enableToggle: true,
+                                    text: 'Services',
+                                    toggleGroup: 'menugroup',
+                                    flex: 1
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnDataMenu',
+                                    enableToggle: true,
+                                    text: 'Data',
+                                    toggleGroup: 'menugroup',
+                                    flex: 1
+                                }
+                            ]
+                        }
+                    ],
+                    items: [
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            id: 'menuCard',
+                            activeItem: 0,
+                            layout: {
+                                type: 'card'
+                            },
+                            title: '',
+                            region: 'center',
+                            items: [
+                                {
+                                    xtype: 'component',
+                                    id: 'mainMenu',
+                                    padding: '10px',
+                                    style: 'background: #fff;',
+                                    styleHtmlContent: true,
+                                    width: 150
+                                },
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    id: 'servicesMenu',
+                                    layout: {
+                                        type: 'accordion'
+                                    },
+                                    bodyPadding: '10px',
+                                    title: ''
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/MyGridPanel15.js b/interface/app/view/ui/MyGridPanel15.js
new file mode 100755
index 0000000..f69a91c
--- /dev/null
+++ b/interface/app/view/ui/MyGridPanel15.js
@@ -0,0 +1,44 @@
+/*
+ * File: app/view/ui/MyGridPanel15.js
+ * Date: Fri Jul 06 2012 10:15:34 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.MyGridPanel15', {
+    extend: 'Ext.grid.Panel',
+
+    height: 250,
+    width: 400,
+    title: 'My Grid Panel',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            columns: [
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'string',
+                    text: 'String',
+                    field: {
+                        xtype: 'combobox',
+                        fieldLabel: 'Label'
+                    }
+                }
+            ],
+            plugins: [
+                Ext.create('Ext.grid.plugin.CellEditing', {
+
+                })
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ObservationEditor.js b/interface/app/view/ui/ObservationEditor.js
new file mode 100755
index 0000000..79cf224
--- /dev/null
+++ b/interface/app/view/ui/ObservationEditor.js
@@ -0,0 +1,213 @@
+/*
+ * File: app/view/ui/ObservationEditor.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ObservationEditor', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    height: 600,
+    width: 900,
+    layout: {
+        type: 'border'
+    },
+    bodyStyle: 'background-color: transparent;',
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'form',
+                    border: 0,
+                    height: 140,
+                    id: 'oeSettings',
+                    bodyPadding: 10,
+                    title: '',
+                    region: 'north',
+                    items: [
+                        {
+                            xtype: 'fieldset',
+                            title: 'Choose the procedure',
+                            items: [
+                                {
+                                    xtype: 'fieldcontainer',
+                                    height: 30,
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'hbox'
+                                    },
+                                    fieldLabel: 'Label',
+                                    hideLabel: true,
+                                    anchor: '100%',
+                                    items: [
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'cmbServices',
+                                            fieldLabel: 'Service',
+                                            displayField: 'service',
+                                            store: 'storeServices',
+                                            valueField: 'service',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            disabled: true,
+                                            id: 'oeCbOffering',
+                                            name: 'offering',
+                                            fieldLabel: 'Offering',
+                                            labelAlign: 'right',
+                                            labelWidth: 60,
+                                            displayField: 'name',
+                                            queryMode: 'local',
+                                            store: 'offerings',
+                                            valueField: 'name',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            disabled: true,
+                                            id: 'oeCbProcedure',
+                                            name: 'procedure',
+                                            fieldLabel: 'Procedure',
+                                            labelAlign: 'right',
+                                            labelWidth: 80,
+                                            displayField: 'name',
+                                            queryMode: 'local',
+                                            store: 'procedurelist',
+                                            valueField: 'name',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            disabled: true,
+                                            id: 'oeCbObservedProperty',
+                                            name: 'observedproperty',
+                                            fieldLabel: 'Property',
+                                            labelAlign: 'right',
+                                            labelWidth: 80,
+                                            displayField: 'name',
+                                            queryMode: 'local',
+                                            store: 'observedproperties',
+                                            valueField: 'name',
+                                            flex: 1
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'fieldcontainer',
+                                    height: 25,
+                                    defaults: {
+                                        flex: 1,
+                                        hideLabel: true
+                                    },
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'hbox'
+                                    },
+                                    fieldLabel: 'Time period',
+                                    anchor: '100%',
+                                    items: [
+                                        {
+                                            xtype: 'datefield',
+                                            disabled: true,
+                                            id: 'oeBegin',
+                                            name: 'begin',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'timefield',
+                                            disabled: true,
+                                            id: 'oeBeginTime',
+                                            name: 'begintime',
+                                            value: '00:00',
+                                            fieldLabel: 'Label',
+                                            format: 'G:i',
+                                            increment: 10,
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'container',
+                                            html: '<div style=\'text-align: center; width: 100%;\'>-</div>',
+                                            padding: '5 0 0 0 ',
+                                            width: 20,
+                                            layout: {
+                                                type: 'fit'
+                                            },
+                                            flex: 0
+                                        },
+                                        {
+                                            xtype: 'datefield',
+                                            disabled: true,
+                                            id: 'oeEnd',
+                                            name: 'end',
+                                            fieldLabel: 'Label',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'timefield',
+                                            disabled: true,
+                                            id: 'oeEndTime',
+                                            name: 'endtime',
+                                            value: '00:00',
+                                            fieldLabel: 'Label',
+                                            format: 'G:i',
+                                            increment: 10,
+                                            flex: 1
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ],
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            ui: 'footer',
+                            dock: 'bottom',
+                            layout: {
+                                align: 'middle',
+                                pack: 'center',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'oeBtnReset',
+                                    text: 'Reset'
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'oeBtnLoad',
+                                    text: 'Load'
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    id: 'oeEditor',
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    region: 'center'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ObservationEditorAdvancedOperations.js b/interface/app/view/ui/ObservationEditorAdvancedOperations.js
new file mode 100755
index 0000000..3ad189b
--- /dev/null
+++ b/interface/app/view/ui/ObservationEditorAdvancedOperations.js
@@ -0,0 +1,40 @@
+/*
+ * File: app/view/ui/ObservationEditorAdvancedOperations.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ObservationEditorAdvancedOperations', {
+    extend: 'Ext.form.Panel',
+
+    border: 1,
+    height: 45,
+    width: 300,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'textfield',
+                    id: 'oeaTf',
+                    name: 'val',
+                    fieldLabel: 'New value',
+                    enableKeyEvents: true,
+                    anchor: '100%'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ObservationEditorColumn.js b/interface/app/view/ui/ObservationEditorColumn.js
new file mode 100755
index 0000000..f64a72e
--- /dev/null
+++ b/interface/app/view/ui/ObservationEditorColumn.js
@@ -0,0 +1,56 @@
+/*
+ * File: app/view/ui/ObservationEditorColumn.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ObservationEditorColumn', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    layout: {
+        align: 'stretch',
+        type: 'hbox'
+    },
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    id: 'chartContainer',
+                    padding: '16px',
+                    maintainFlex: true,
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    flex: 0.9
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    id: 'gridContainer',
+                    width: 300,
+                    maintainFlex: true,
+                    layout: {
+                        type: 'fit'
+                    },
+                    bodyPadding: '16px',
+                    title: ''
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ProcedureChart.js b/interface/app/view/ui/ProcedureChart.js
new file mode 100755
index 0000000..84f7f8a
--- /dev/null
+++ b/interface/app/view/ui/ProcedureChart.js
@@ -0,0 +1,197 @@
+/*
+ * File: app/view/ui/ProcedureChart.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ProcedureChart', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    id: 'chartpanel',
+    layout: {
+        type: 'border'
+    },
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    title: '',
+                    region: 'north',
+                    items: [
+                        {
+                            xtype: 'form',
+                            border: 0,
+                            id: 'plotdatafrm',
+                            padding: '5 10 0 10',
+                            title: '',
+                            items: [
+                                {
+                                    xtype: 'fieldcontainer',
+                                    border: 0,
+                                    defaults: {
+                                        flex: 1,
+                                        hideLabel: true
+                                    },
+                                    layout: {
+                                        type: 'hbox'
+                                    },
+                                    fieldLabel: 'From',
+                                    labelWidth: 35,
+                                    anchor: '100%',
+                                    items: [
+                                        {
+                                            xtype: 'datefield',
+                                            id: 'oeBegin',
+                                            name: 'begin',
+                                            format: 'Y-m-d',
+                                            flex: 0.3
+                                        },
+                                        {
+                                            xtype: 'timefield',
+                                            id: 'oeBeginTime',
+                                            name: 'begintime',
+                                            fieldLabel: 'Label',
+                                            format: 'H:i ',
+                                            increment: 10,
+                                            flex: 0.2
+                                        },
+                                        {
+                                            xtype: 'label',
+                                            height: 22,
+                                            padding: '2px 0px 0px 10px',
+                                            width: 30,
+                                            text: 'To:',
+                                            flex: 0
+                                        },
+                                        {
+                                            xtype: 'datefield',
+                                            id: 'oeEnd',
+                                            name: 'end',
+                                            fieldLabel: 'Label',
+                                            format: 'Y-m-d',
+                                            flex: 0.3
+                                        },
+                                        {
+                                            xtype: 'timefield',
+                                            id: 'oeEndTime',
+                                            name: 'endtime',
+                                            fieldLabel: 'Label',
+                                            format: 'H:i ',
+                                            increment: 10,
+                                            flex: 0.2
+                                        },
+                                        {
+                                            xtype: 'label',
+                                            height: 22,
+                                            padding: '2px 0px 0px 10px',
+                                            width: 70,
+                                            text: 'Property:',
+                                            flex: 0
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'oeCbObservedProperty',
+                                            name: 'observedproperty',
+                                            fieldLabel: 'Property',
+                                            labelWidth: 70,
+                                            displayField: 'name',
+                                            queryMode: 'local',
+                                            store: 'observedproperties',
+                                            valueField: 'definition',
+                                            flex: 0.6
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            disabled: true,
+                                            id: 'btnPlot',
+                                            text: 'Plot',
+                                            flex: 0.4
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    style: 'background-color: white;',
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    region: 'center',
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            dock: 'bottom',
+                            layout: {
+                                align: 'middle',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'tbspacer',
+                                    flex: 1
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnRangeDay',
+                                    width: 60,
+                                    enableToggle: true,
+                                    text: 'Day',
+                                    toggleGroup: 'timeline'
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnRangeWeek',
+                                    width: 60,
+                                    enableToggle: true,
+                                    text: 'Week',
+                                    toggleGroup: 'timeline'
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnRangeAll',
+                                    width: 60,
+                                    enableToggle: true,
+                                    pressed: true,
+                                    text: 'All',
+                                    toggleGroup: 'timeline'
+                                }
+                            ]
+                        }
+                    ],
+                    items: [
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            id: 'chartCnt',
+                            layout: {
+                                type: 'fit'
+                            },
+                            bodyCls: 'viewerChart',
+                            title: ''
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ProcedureChooser.js b/interface/app/view/ui/ProcedureChooser.js
new file mode 100755
index 0000000..2961d56
--- /dev/null
+++ b/interface/app/view/ui/ProcedureChooser.js
@@ -0,0 +1,98 @@
+/*
+ * File: app/view/ui/ProcedureChooser.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ProcedureChooser', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    itemId: 'chartone',
+    minWidth: 280,
+    padding: '10px 0px 0px 0px',
+    layout: {
+        type: 'border'
+    },
+    bodyPadding: '',
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'form',
+                    border: 0,
+                    height: 120,
+                    id: 'oeSettings',
+                    bodyPadding: '0 10 0 10',
+                    title: '',
+                    region: 'north',
+                    items: [
+                        {
+                            xtype: 'combobox',
+                            id: 'cmbServices',
+                            fieldLabel: 'Service',
+                            labelWidth: 70,
+                            displayField: 'service',
+                            store: 'storeServices',
+                            valueField: 'service',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'combobox',
+                            disabled: true,
+                            id: 'oeCbOffering',
+                            name: 'offering',
+                            fieldLabel: 'Offering',
+                            labelWidth: 70,
+                            displayField: 'name',
+                            queryMode: 'local',
+                            store: 'offerings',
+                            valueField: 'name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'combobox',
+                            disabled: true,
+                            id: 'oeCbProcedure',
+                            name: 'procedure',
+                            fieldLabel: 'Procedure',
+                            labelWidth: 70,
+                            displayField: 'name',
+                            queryMode: 'local',
+                            store: 'procedurelist',
+                            valueField: 'name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'button',
+                            id: 'btnAdd',
+                            text: 'Add',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'form',
+                    border: 0,
+                    id: 'proceduresTree',
+                    autoScroll: true,
+                    bodyPadding: '0 10 0 10',
+                    title: '',
+                    region: 'center'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ProcedureGrid.js b/interface/app/view/ui/ProcedureGrid.js
new file mode 100755
index 0000000..fabee0e
--- /dev/null
+++ b/interface/app/view/ui/ProcedureGrid.js
@@ -0,0 +1,26 @@
+/*
+ * File: app/view/ui/ProcedureGrid.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ProcedureGrid', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    layout: {
+        type: 'fit'
+    },
+
+    initComponent: function() {
+        var me = this;
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ProcedureGridEditor.js b/interface/app/view/ui/ProcedureGridEditor.js
new file mode 100755
index 0000000..88b22e3
--- /dev/null
+++ b/interface/app/view/ui/ProcedureGridEditor.js
@@ -0,0 +1,98 @@
+/*
+ * File: app/view/ui/ProcedureGridEditor.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ProcedureGridEditor', {
+    extend: 'Ext.panel.Panel',
+    requires: [
+        'istsos.view.ProcedureGrid'
+    ],
+
+    id: 'proceduregrideditor',
+    minWidth: 350,
+    width: 350,
+    layout: {
+        type: 'border'
+    },
+    collapsed: false,
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    height: 30,
+                    itemId: 'buttonspanel',
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    region: 'north',
+                    items: [
+                        {
+                            xtype: 'form',
+                            border: 0,
+                            id: 'chartfilterFrm',
+                            layout: {
+                                align: 'middle',
+                                type: 'hbox'
+                            },
+                            bodyPadding: '0 10 0 10',
+                            collapseFirst: false,
+                            collapsed: false,
+                            title: '',
+                            items: [
+                                {
+                                    xtype: 'combobox',
+                                    id: 'oeCbEditableProcedures',
+                                    name: 'procedure',
+                                    fieldLabel: 'Procedure',
+                                    labelWidth: 70,
+                                    allowBlank: false,
+                                    displayField: 'name',
+                                    queryMode: 'local',
+                                    store: 'editableProcedure',
+                                    valueField: 'name',
+                                    flex: 1
+                                },
+                                {
+                                    xtype: 'button',
+                                    hidden: true,
+                                    id: 'btnCancelEditor',
+                                    minWidth: 60,
+                                    text: 'Cancel',
+                                    flex: 0.5
+                                },
+                                {
+                                    xtype: 'button',
+                                    id: 'btnStartEditor',
+                                    minWidth: 60,
+                                    text: 'Start editing',
+                                    flex: 0.5
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'proceduregrid',
+                    region: 'center',
+                    id: 'proceduregrid'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/ProcedurePlotter.js b/interface/app/view/ui/ProcedurePlotter.js
new file mode 100755
index 0000000..a839bde
--- /dev/null
+++ b/interface/app/view/ui/ProcedurePlotter.js
@@ -0,0 +1,115 @@
+/*
+ * File: app/view/ui/ProcedurePlotter.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.ProcedurePlotter', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    id: 'plotdatafrm',
+    padding: '5 10 0 10',
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'fieldcontainer',
+                    border: 0,
+                    defaults: {
+                        flex: 1,
+                        hideLabel: true
+                    },
+                    layout: {
+                        type: 'hbox'
+                    },
+                    fieldLabel: 'From',
+                    labelWidth: 35,
+                    anchor: '100%',
+                    items: [
+                        {
+                            xtype: 'datefield',
+                            id: 'oeBegin',
+                            name: 'begin',
+                            format: 'Y-m-d',
+                            flex: 0.3
+                        },
+                        {
+                            xtype: 'timefield',
+                            id: 'oeBeginTime',
+                            name: 'begintime',
+                            fieldLabel: 'Label',
+                            format: 'H:i ',
+                            increment: 10,
+                            flex: 0.2
+                        },
+                        {
+                            xtype: 'label',
+                            height: 22,
+                            padding: '2px 0px 0px 10px',
+                            width: 30,
+                            text: 'To:',
+                            flex: 0
+                        },
+                        {
+                            xtype: 'datefield',
+                            id: 'oeEnd',
+                            name: 'end',
+                            fieldLabel: 'Label',
+                            format: 'Y-m-d',
+                            flex: 0.3
+                        },
+                        {
+                            xtype: 'timefield',
+                            id: 'oeEndTime',
+                            name: 'endtime',
+                            fieldLabel: 'Label',
+                            format: 'H:i ',
+                            increment: 10,
+                            flex: 0.2
+                        },
+                        {
+                            xtype: 'label',
+                            height: 22,
+                            padding: '2px 0px 0px 10px',
+                            width: 70,
+                            text: 'Property:',
+                            flex: 0
+                        },
+                        {
+                            xtype: 'combobox',
+                            id: 'oeCbObservedProperty',
+                            name: 'observedproperty',
+                            fieldLabel: 'Property',
+                            labelWidth: 70,
+                            displayField: 'name',
+                            queryMode: 'local',
+                            store: 'observedproperties',
+                            valueField: 'definition',
+                            flex: 0.6
+                        },
+                        {
+                            xtype: 'button',
+                            disabled: true,
+                            id: 'btnPlot',
+                            text: 'Plot',
+                            flex: 0.4
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/TestCsv.js b/interface/app/view/ui/TestCsv.js
new file mode 100755
index 0000000..7b320ef
--- /dev/null
+++ b/interface/app/view/ui/TestCsv.js
@@ -0,0 +1,123 @@
+/*
+ * File: app/view/ui/TestCsv.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.TestCsv', {
+    extend: 'Ext.container.Viewport',
+
+    layout: {
+        type: 'fit'
+    },
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    layout: {
+                        type: 'border'
+                    },
+                    title: '',
+                    items: [
+                        {
+                            xtype: 'form',
+                            width: 300,
+                            bodyPadding: 16,
+                            title: 'FILE',
+                            region: 'west',
+                            items: [
+                                {
+                                    xtype: 'combobox',
+                                    id: 'cmbServices',
+                                    fieldLabel: 'Service',
+                                    labelWidth: 70,
+                                    displayField: 'service',
+                                    store: 'storeServices',
+                                    valueField: 'service',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'combobox',
+                                    id: 'oeCbOffering',
+                                    name: 'offering',
+                                    fieldLabel: 'Offering',
+                                    labelWidth: 70,
+                                    displayField: 'name',
+                                    queryMode: 'local',
+                                    store: 'offerings',
+                                    valueField: 'name',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'combobox',
+                                    id: 'oeCbProcedure',
+                                    name: 'procedure',
+                                    fieldLabel: 'Procedure',
+                                    labelWidth: 70,
+                                    displayField: 'name',
+                                    queryMode: 'local',
+                                    store: 'procedurelist',
+                                    valueField: 'name',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'filefield',
+                                    id: 'btncsv',
+                                    fieldLabel: 'CSV',
+                                    labelWidth: 70,
+                                    anchor: '100%'
+                                }
+                            ],
+                            dockedItems: [
+                                {
+                                    xtype: 'toolbar',
+                                    dock: 'top',
+                                    layout: {
+                                        align: 'middle',
+                                        type: 'hbox'
+                                    },
+                                    items: [
+                                        {
+                                            xtype: 'button',
+                                            text: 'Action!',
+                                            flex: 1
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'form',
+                            bodyPadding: 16,
+                            title: '',
+                            region: 'center',
+                            items: [
+                                {
+                                    xtype: 'textareafield',
+                                    height: 155,
+                                    id: 'logger',
+                                    readOnly: true,
+                                    fieldLabel: 'Log',
+                                    hideLabel: true,
+                                    anchor: '100%'
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/Viewer.js b/interface/app/view/ui/Viewer.js
new file mode 100755
index 0000000..6665006
--- /dev/null
+++ b/interface/app/view/ui/Viewer.js
@@ -0,0 +1,96 @@
+/*
+ * File: app/view/ui/Viewer.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.Viewer', {
+    extend: 'Ext.container.Viewport',
+    requires: [
+        'istsos.view.ProcedureChart',
+        'istsos.view.ProcedureGrid',
+        'istsos.view.ProcedureChooser'
+    ],
+
+    border: 0,
+    layout: {
+        type: 'border'
+    },
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    layout: {
+                        type: 'border'
+                    },
+                    title: '',
+                    region: 'center',
+                    items: [
+                        {
+                            xtype: 'procedurechart',
+                            region: 'center',
+                            id: 'chartpanel'
+                        },
+                        {
+                            xtype: 'panel',
+                            height: 250,
+                            layout: {
+                                type: 'fit'
+                            },
+                            collapsible: true,
+                            title: 'Grid',
+                            region: 'south',
+                            split: true,
+                            items: [
+                                {
+                                    xtype: 'proceduregrid',
+                                    id: 'gridpanel'
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    border: 0,
+                    height: 25,
+                    html: '<a style=\'color: white; text-decoration: none;\' href=\'http://www.supsi.ch/ist\' target=\'_BLANK\'>Open Source Software by Institute of Earth Science - SUPSI</a>',
+                    id: 'mainFoot',
+                    bodyCls: 'mainFooter',
+                    bodyPadding: 8,
+                    title: '',
+                    region: 'south'
+                },
+                {
+                    xtype: 'panel',
+                    width: 300,
+                    layout: {
+                        type: 'fit'
+                    },
+                    title: '',
+                    region: 'west',
+                    items: [
+                        {
+                            xtype: 'procedurechooser',
+                            border: 0,
+                            id: 'pchoose'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/VirtualProcedureEditor.js b/interface/app/view/ui/VirtualProcedureEditor.js
new file mode 100755
index 0000000..c00dc10
--- /dev/null
+++ b/interface/app/view/ui/VirtualProcedureEditor.js
@@ -0,0 +1,342 @@
+/*
+ * File: app/view/ui/VirtualProcedureEditor.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.VirtualProcedureEditor', {
+    extend: 'Ext.panel.Panel',
+
+    layout: {
+        type: 'border'
+    },
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'form',
+                    height: 50,
+                    bodyPadding: 10,
+                    title: '',
+                    region: 'north',
+                    items: [
+                        {
+                            xtype: 'combobox',
+                            id: 'vpcmbplist',
+                            fieldLabel: 'Virtual procedure',
+                            labelWidth: 150,
+                            allowBlank: false,
+                            displayField: 'name',
+                            forceSelection: true,
+                            store: 'vplist',
+                            valueField: 'name',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'tabpanel',
+                    id: 'vppanel',
+                    activeItem: 0,
+                    title: '',
+                    activeTab: 1,
+                    flex: 1,
+                    region: 'center',
+                    items: [
+                        {
+                            xtype: 'panel',
+                            layout: {
+                                align: 'stretch',
+                                type: 'vbox'
+                            },
+                            title: 'Rating curve',
+                            dockedItems: [
+                                {
+                                    xtype: 'toolbar',
+                                    flex: 1,
+                                    dock: 'top',
+                                    items: [
+                                        {
+                                            xtype: 'tbtext',
+                                            text: 'ADD'
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'vpbtnaddrc',
+                                            text: '> at end'
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            disabled: true,
+                                            id: 'vpbtnaddaboverc',
+                                            text: '> above selected'
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            disabled: true,
+                                            id: 'vpbtnaddbelowrc',
+                                            text: '> below selected'
+                                        },
+                                        {
+                                            xtype: 'tbseparator',
+                                            margin: '0px 8px 0px 8px'
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            disabled: true,
+                                            id: 'vpbtnremoverc',
+                                            text: 'Remove selected'
+                                        }
+                                    ]
+                                }
+                            ],
+                            items: [
+                                {
+                                    xtype: 'gridpanel',
+                                    border: 0,
+                                    id: 'vpgridratingcurve',
+                                    title: '',
+                                    store: 'ratingcurve',
+                                    flex: 1,
+                                    columns: [
+                                        {
+                                            xtype: 'datecolumn',
+                                            sortable: false,
+                                            dataIndex: 'from',
+                                            flex: 0.13,
+                                            text: 'From',
+                                            format: 'Y-m-d',
+                                            field: {
+                                                xtype: 'datefield',
+                                                name: 'from',
+                                                fieldLabel: 'Label',
+                                                hideLabel: true,
+                                                format: 'Y-m-d'
+                                            }
+                                        },
+                                        {
+                                            xtype: 'datecolumn',
+                                            sortable: false,
+                                            dataIndex: 'to',
+                                            flex: 0.13,
+                                            text: 'To',
+                                            format: 'Y-m-d',
+                                            field: {
+                                                xtype: 'datefield',
+                                                name: 'to',
+                                                fieldLabel: 'Label',
+                                                hideLabel: true,
+                                                format: 'Y-m-d'
+                                            }
+                                        },
+                                        {
+                                            xtype: 'numbercolumn',
+                                            sortable: false,
+                                            dataIndex: 'low_val',
+                                            flex: 0.13,
+                                            text: 'Low',
+                                            format: '0,000.0000',
+                                            field: {
+                                                xtype: 'numberfield',
+                                                fieldLabel: 'Label',
+                                                hideLabel: true,
+                                                decimalPrecision: 4
+                                            }
+                                        },
+                                        {
+                                            xtype: 'numbercolumn',
+                                            sortable: false,
+                                            dataIndex: 'up_val',
+                                            flex: 0.13,
+                                            text: 'Up',
+                                            format: '0,000.0000',
+                                            field: {
+                                                xtype: 'numberfield',
+                                                fieldLabel: 'Label',
+                                                hideLabel: true,
+                                                decimalPrecision: 4
+                                            }
+                                        },
+                                        {
+                                            xtype: 'numbercolumn',
+                                            sortable: false,
+                                            dataIndex: 'A',
+                                            flex: 0.13,
+                                            text: 'A',
+                                            format: '0,000.0000',
+                                            field: {
+                                                xtype: 'numberfield',
+                                                fieldLabel: 'Label',
+                                                hideLabel: true,
+                                                decimalPrecision: 4
+                                            }
+                                        },
+                                        {
+                                            xtype: 'numbercolumn',
+                                            sortable: false,
+                                            dataIndex: 'B',
+                                            flex: 0.13,
+                                            text: 'B',
+                                            format: '0,000.0000',
+                                            field: {
+                                                xtype: 'numberfield',
+                                                fieldLabel: 'Label',
+                                                hideLabel: true,
+                                                decimalPrecision: 4
+                                            }
+                                        },
+                                        {
+                                            xtype: 'numbercolumn',
+                                            sortable: false,
+                                            dataIndex: 'C',
+                                            flex: 0.13,
+                                            text: 'C',
+                                            format: '0,000.0000',
+                                            field: {
+                                                xtype: 'numberfield',
+                                                fieldLabel: 'Label',
+                                                hideLabel: true,
+                                                decimalPrecision: 4
+                                            }
+                                        },
+                                        {
+                                            xtype: 'numbercolumn',
+                                            sortable: false,
+                                            dataIndex: 'K',
+                                            flex: 0.13,
+                                            text: 'K',
+                                            format: '0,000.0000',
+                                            field: {
+                                                xtype: 'numberfield',
+                                                fieldLabel: 'Label',
+                                                hideLabel: true,
+                                                decimalPrecision: 4
+                                            }
+                                        }
+                                    ],
+                                    viewConfig: {
+
+                                    },
+                                    plugins: [
+                                        Ext.create('Ext.grid.plugin.CellEditing', {
+
+                                        })
+                                    ],
+                                    selModel: Ext.create('Ext.selection.RowModel', {
+                                        allowDeselect: true
+                                    })
+                                },
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    height: 60,
+                                    layout: {
+                                        align: 'stretch',
+                                        padding: '8px 0px 8px 0px',
+                                        type: 'hbox'
+                                    },
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'container',
+                                            width: 40
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'vpbtndeleterc',
+                                            text: 'Delete Rating Curve File',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'container',
+                                            width: 40
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'vpbtnsaverc',
+                                            text: 'Store the File',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'container',
+                                            width: 40
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'panel',
+                            layout: {
+                                align: 'stretch',
+                                type: 'vbox'
+                            },
+                            title: 'Code',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    id: 'vpcodingform',
+                                    layout: {
+                                        type: 'fit'
+                                    },
+                                    bodyPadding: 10,
+                                    title: '',
+                                    flex: 1
+                                },
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    height: 60,
+                                    layout: {
+                                        align: 'stretch',
+                                        padding: '8px 0px 8px 0px',
+                                        type: 'hbox'
+                                    },
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'container',
+                                            width: 40
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'vpbtndeletecode',
+                                            text: 'Delete Code File',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'container',
+                                            width: 40
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'vpbtnsavecode',
+                                            text: 'Save the Python Code',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'container',
+                                            width: 40
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/Wizard.js b/interface/app/view/ui/Wizard.js
new file mode 100755
index 0000000..a2aa6ab
--- /dev/null
+++ b/interface/app/view/ui/Wizard.js
@@ -0,0 +1,67 @@
+/*
+ * File: app/view/ui/Wizard.js
+ * Date: Tue Apr 10 2012 16:56:38 GMT+0200 (CEST)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.Wizard', {
+    extend: 'Ext.panel.Panel',
+
+    id: 'wizard',
+    activeItem: 0,
+    layout: {
+        type: 'border'
+    },
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            dockedItems: [
+                {
+                    xtype: 'toolbar',
+                    height: 40,
+                    dock: 'bottom',
+                    layout: {
+                        pack: 'end',
+                        type: 'hbox'
+                    },
+                    items: [
+                        {
+                            xtype: 'button',
+                            scale: 'medium',
+                            text: '<< Back'
+                        },
+                        {
+                            xtype: 'button',
+                            scale: 'medium',
+                            text: 'Next >>'
+                        }
+                    ]
+                }
+            ],
+            items: [
+                {
+                    xtype: 'panel',
+                    title: 'My Panel',
+                    region: 'center'
+                },
+                {
+                    xtype: 'panel',
+                    height: 150,
+                    title: '',
+                    region: 'north'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/WizardPage.js b/interface/app/view/ui/WizardPage.js
new file mode 100755
index 0000000..fa8793f
--- /dev/null
+++ b/interface/app/view/ui/WizardPage.js
@@ -0,0 +1,183 @@
+Ext.define('istsos.view.ui.WizardPage', {
+    extend: 'istsos.view.ui.CenterPage',
+    constructor: function(config) {
+        if(Ext.isObject(config)){
+            Ext.apply(this,config);
+            // Get first configured wizard page
+            for (var k in config.istConfig){
+                Ext.apply(this,config.istConfig[k],{
+                    istWizardPage: k
+                });
+                break;
+            }
+        }
+        this.callParent(arguments);
+        this.on('operationSubmit', function(json){
+            if (json.success) {
+                this.nextPage();
+            }
+        }, this);
+    },
+    initFooter: function(){
+        if (!Ext.isEmpty(this["istFooter"])){
+            if(this["istFooter"] == istsos.WIZARD_JUST_NEXT){
+                this.getComponent(1).addDocked({
+                    xtype: 'toolbar',
+                    id: this.istDocId,
+                    //ui: 'footer',
+                    //dock: 'bottom',
+                    layout: {
+                        pack: 'end',
+                        padding: 6,
+                        type: 'hbox'
+                    },
+                    items: [
+                    {
+                        xtype: 'button',
+                        id: 'wizardnext',
+                        //scale: 'medium',
+                        scope: this,
+                        handler: this.nextPage,
+                        text: 'Next'
+                    }
+                    ]
+                });
+            } else if(this["istFooter"] == istsos.WIZARD){
+                this.getComponent(1).addDocked({
+                    xtype: 'toolbar',
+                    id: this.istDocId,
+                    //ui: 'footer',
+                    //dock: 'bottom',
+                    layout: {
+                        pack: 'end',
+                        padding: 6,
+                        type: 'hbox'
+                    },
+                    items: [
+                    {
+                        xtype: 'button',
+                        id: 'wizardback',
+                        //scale: 'medium',
+                        handler: this.backPage,
+                        scope: this,
+                        text: 'Back'
+                    },
+                    {
+                        xtype: 'button',
+                        id: 'wizardnext',
+                        scope: this,
+                        handler: this.operationSubmit,
+                        //scale: 'medium',
+                        text: 'Next'
+                    }
+                    ]
+                });
+            } else if(this["istFooter"] == istsos.WIZARD_NEXT_FINISH){
+                this.getComponent(1).addDocked({
+                    xtype: 'toolbar',
+                    id: this.istDocId,
+                    //ui: 'footer',
+                    //dock: 'bottom',
+                    layout: {
+                        pack: 'end',
+                        padding: 6,
+                        type: 'hbox'
+                    },
+                    items: [
+                    {
+                        xtype: 'button',
+                        id: 'wizardfinish',
+                        scope: this,
+                        handler: this.finishPage,
+                        //scale: 'medium',
+                        text: 'Finish'
+                    },
+                    {
+                        xtype: 'tbspacer',
+                        width: 20
+                    },
+                    {
+                        xtype: 'button',
+                        id: 'wizardback',
+                        //scale: 'medium',
+                        handler: this.backPage,
+                        scope: this,
+                        text: 'Back'
+                    },
+                    {
+                        xtype: 'button',
+                        id: 'wizardnext',
+                        scope: this,
+                        handler: this.operationSubmit,
+                        //scale: 'medium',
+                        text: 'Next'
+                    }
+                    ]
+                });
+            } else if(this["istFooter"] == istsos.WIZARD_FINISH){
+                this.getComponent(1).addDocked({
+                    xtype: 'toolbar',
+                    id: this.istDocId,
+                    //ui: 'footer',
+                    //dock: 'bottom',
+                    layout: {
+                        pack: 'end',
+                        padding: 6,
+                        type: 'hbox'
+                    },
+                    items: [
+                    {
+                        xtype: 'button',
+                        id: 'wizardfinish',
+                        scope: this,
+                        handler: this.finishPage,
+                        //scale: 'medium',
+                        text: 'Finish'
+                    }
+                    ]
+                });
+            }
+            this.callParent();
+        }        
+    },
+    /*operationSubmit: function(){
+        this.callParent(arguments);
+    },*/
+    nextPage: function(){
+        var onemore = false;
+        for (var k in this.istConfig){
+            if (onemore) {
+                this.resetIstConfig();
+                Ext.apply(this,this.istConfig[k],{
+                    istWizardPage: k
+                });
+                break;
+            }
+            if (k == this.istWizardPage) {
+                onemore = true;
+            }
+        }
+        this.setTitle(this.istTitle);
+        this.setBody();
+    },
+    backPage: function(){
+        var page = "";
+        for (var k in this.istConfig){
+            if (k == this.istWizardPage) {
+                Ext.apply(this,this.istConfig[page],{
+                    istWizardPage: page
+                });
+                break;
+            }
+            page = k;
+        }
+        this.setTitle(this.istTitle);
+        this.setBody();
+    },
+    finishPage: function(){
+        var mainCenter = Ext.getCmp("mainCenter");
+        mainCenter.removeAll(true);
+        Ext.getCmp('submenu').expand();
+        this.loadServiceMenu();
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/about.js b/interface/app/view/ui/about.js
new file mode 100755
index 0000000..b6cd885
--- /dev/null
+++ b/interface/app/view/ui/about.js
@@ -0,0 +1,73 @@
+/*
+ * File: app/view/ui/about.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.about', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'fieldset',
+                    title: 'istSOS',
+                    items: [
+                        {
+                            xtype: 'displayfield',
+                            name: 'istsos_version',
+                            fieldLabel: 'Version',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'displayfield',
+                            id: 'updates',
+                            name: 'istsos_message',
+                            fieldLabel: 'Updates',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'displayfield',
+                            hidden: true,
+                            id: 'download',
+                            name: 'download_url',
+                            fieldLabel: 'Download',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textareafield',
+                            hidden: true,
+                            id: 'changelog',
+                            name: 'latest_istsos_changelog',
+                            readOnly: true,
+                            fieldLabel: 'Change log',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'container',
+                    html: '<p>istSOS (Istituto Scienze della Terra Sensor Observation Service) is an implementation of the Sensor Observation Service standard from Open Geospatial Consortium.\n</p>\n<p>\nThe developement of istSOS has started in 2009 in order to provide a simple implementation of the SOS standard for the management, provision and integration of hydro-meteorological data collected in Canton Ticino (Switzerland).\n</p>\n<p>\nistSOS is entirely written in <a href="http://py [...]
+                    padding: '10 0 0 0',
+                    styleHtmlContent: true,
+                    anchor: '100%'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/config.js b/interface/app/view/ui/config.js
new file mode 100755
index 0000000..e9b1c8f
--- /dev/null
+++ b/interface/app/view/ui/config.js
@@ -0,0 +1,117 @@
+/*
+ * File: app/view/ui/config.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.config', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'displayfield',
+                    hidden: true,
+                    id: 'messageField',
+                    fieldStyle: 'color: red;',
+                    name: 'message',
+                    fieldLabel: 'Message',
+                    labelStyle: 'color: red;',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'Proxy URL (optional)',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            fieldLabel: 'Url',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            hidden: true,
+                            fieldLabel: 'POST',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'SensorML folder',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'smlpath',
+                            fieldLabel: 'Path',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'Virtual procedures',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'vppath',
+                            fieldLabel: 'Path',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'Coordinate system',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'defaultepsg',
+                            fieldLabel: 'Default EPSG',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'permittedepsg',
+                            fieldLabel: 'Permitted EPSG',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'xaxisname',
+                            fieldLabel: 'X axis name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'yaxisname',
+                            fieldLabel: 'Y axis name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'zaxisname',
+                            fieldLabel: 'Z axis name',
+                            anchor: '100%'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/contactinfo.js b/interface/app/view/ui/contactinfo.js
new file mode 100755
index 0000000..011fa7f
--- /dev/null
+++ b/interface/app/view/ui/contactinfo.js
@@ -0,0 +1,114 @@
+/*
+ * File: app/view/ui/contactinfo.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.contactinfo', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    id: 'contactinfo',
+    bodyPadding: 10,
+    bodyStyle: 'centerBody',
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'displayfield',
+                    hidden: true,
+                    id: 'messageField',
+                    fieldStyle: 'color: red;',
+                    name: 'message',
+                    fieldLabel: 'Message',
+                    labelStyle: 'color: red;',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'contact',
+                    fieldLabel: 'Contact',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'organization',
+                    fieldLabel: 'Organization',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'position',
+                    fieldLabel: 'Position',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'addressType',
+                    fieldLabel: 'Address type',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'address',
+                    fieldLabel: 'Address',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'city',
+                    fieldLabel: 'City',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'state',
+                    fieldLabel: 'State',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'zipCode',
+                    fieldLabel: 'ZIP code',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'country',
+                    fieldLabel: 'Coutry',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'telephone',
+                    fieldLabel: 'Telephone',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'fax',
+                    fieldLabel: 'Fax',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'email',
+                    fieldLabel: 'Email',
+                    anchor: '100%'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/contacts.js b/interface/app/view/ui/contacts.js
new file mode 100755
index 0000000..b57f1b8
--- /dev/null
+++ b/interface/app/view/ui/contacts.js
@@ -0,0 +1,94 @@
+/*
+ * File: app/view/ui/contacts.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.contacts', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'displayfield',
+                    hidden: true,
+                    id: 'messageField',
+                    fieldStyle: 'color: red;',
+                    name: 'message',
+                    fieldLabel: 'Message',
+                    labelStyle: 'color: red;',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'Authority',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'name',
+                            fieldLabel: 'Name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'version',
+                            fieldLabel: 'Version',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'Service Identification:',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'title',
+                            fieldLabel: 'Title',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'abstract',
+                            fieldLabel: 'Abstract',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'keywords',
+                            fieldLabel: 'Keywords',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'fees',
+                            fieldLabel: 'Fees',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'accessconstrains',
+                            fieldLabel: 'Access constrains',
+                            anchor: '100%'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/database.js b/interface/app/view/ui/database.js
new file mode 100755
index 0000000..af0ed26
--- /dev/null
+++ b/interface/app/view/ui/database.js
@@ -0,0 +1,97 @@
+/*
+ * File: app/view/ui/database.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.database', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'displayfield',
+                    hidden: true,
+                    id: 'messageField',
+                    fieldStyle: 'color: red;',
+                    name: 'message',
+                    fieldLabel: 'Message',
+                    labelStyle: 'color: red;',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'PostGIS database',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'user',
+                            fieldLabel: 'User',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            inputType: 'password',
+                            name: 'password',
+                            fieldLabel: 'Password',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'host',
+                            fieldLabel: 'Host',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'port',
+                            fieldLabel: 'Port',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'dbname',
+                            fieldLabel: 'DB name',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'container',
+                    items: [
+                        {
+                            xtype: 'toolbar',
+                            ui: 'footer',
+                            layout: {
+                                pack: 'center',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnTestConnection',
+                                    text: 'Test connection'
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/geo.js b/interface/app/view/ui/geo.js
new file mode 100755
index 0000000..ceca0da
--- /dev/null
+++ b/interface/app/view/ui/geo.js
@@ -0,0 +1,77 @@
+/*
+ * File: app/view/ui/geo.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.geo', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'displayfield',
+                    hidden: true,
+                    id: 'messageField',
+                    fieldStyle: 'color: red;',
+                    name: 'message',
+                    fieldLabel: 'Message',
+                    labelStyle: 'color: red;',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'Coordinate system',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            id: 'defaultepsg',
+                            name: 'istsosepsg',
+                            fieldLabel: 'Default EPSG',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'allowedepsg',
+                            fieldLabel: 'Permitted EPSG',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'xaxisname',
+                            fieldLabel: 'X axis name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'yaxisname',
+                            fieldLabel: 'Y axis name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'zaxisname',
+                            fieldLabel: 'Z axis name',
+                            anchor: '100%'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/getobservation.js b/interface/app/view/ui/getobservation.js
new file mode 100755
index 0000000..d525eb5
--- /dev/null
+++ b/interface/app/view/ui/getobservation.js
@@ -0,0 +1,43 @@
+/*
+ * File: app/view/ui/getobservation.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.getobservation', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'fieldset',
+                    id: 'getobsconfig',
+                    title: 'GetObservation configuration:',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'maxgoperiod',
+                            fieldLabel: 'Max request interval (hours)',
+                            anchor: '100%'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/identification.js b/interface/app/view/ui/identification.js
new file mode 100755
index 0000000..990d4ca
--- /dev/null
+++ b/interface/app/view/ui/identification.js
@@ -0,0 +1,88 @@
+/*
+ * File: app/view/ui/identification.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.identification', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'displayfield',
+                    hidden: true,
+                    id: 'messageField',
+                    fieldStyle: 'color: red;',
+                    name: 'message',
+                    fieldLabel: 'Message',
+                    labelStyle: 'color: red;',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'Service Identification:',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'title',
+                            fieldLabel: 'Title',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'abstract',
+                            fieldLabel: 'Abstract',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'keywords',
+                            fieldLabel: 'Keywords',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'fees',
+                            fieldLabel: 'Fees',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'accessconstrains',
+                            fieldLabel: 'Access constrains',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'authority',
+                            fieldLabel: 'URN authority',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'urnversion',
+                            fieldLabel: 'URN version',
+                            anchor: '100%'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/newservice.js b/interface/app/view/ui/newservice.js
new file mode 100755
index 0000000..a02f80c
--- /dev/null
+++ b/interface/app/view/ui/newservice.js
@@ -0,0 +1,134 @@
+/*
+ * File: app/view/ui/newservice.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.newservice', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'fieldset',
+                    title: 'Sensor Observation Service',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            id: 'nsservice',
+                            invalidText: 'The serivice name must be a single lower case word',
+                            name: 'service',
+                            fieldLabel: 'Service name',
+                            allowBlank: false,
+                            regex: /^[a-z]+$/,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'epsg',
+                            fieldLabel: 'EPSG',
+                            emptyText: 'if empty, the default EPSG will be used',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'container',
+                    padding: 10
+                },
+                {
+                    xtype: 'displayfield',
+                    hidden: true,
+                    id: 'messageField',
+                    fieldStyle: 'color: red;',
+                    name: 'message',
+                    fieldLabel: 'Message',
+                    labelStyle: 'color: red;',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'fieldset',
+                    id: 'fscustomdb',
+                    checkboxName: 'customdb',
+                    checkboxToggle: true,
+                    collapsed: true,
+                    collapsible: true,
+                    title: 'Customize database',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'user',
+                            fieldLabel: 'User',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'password',
+                            fieldLabel: 'Password',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'host',
+                            fieldLabel: 'Host',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'port',
+                            fieldLabel: 'Port',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'dbname',
+                            fieldLabel: 'DB name',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'container',
+                            items: [
+                                {
+                                    xtype: 'toolbar',
+                                    margin: '0 0 5 0',
+                                    ui: 'footer',
+                                    layout: {
+                                        pack: 'end',
+                                        type: 'hbox'
+                                    },
+                                    items: [
+                                        {
+                                            xtype: 'button',
+                                            id: 'btnTestConnection',
+                                            text: 'Test connection'
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/obsPropEditor.js b/interface/app/view/ui/obsPropEditor.js
new file mode 100755
index 0000000..30a13b5
--- /dev/null
+++ b/interface/app/view/ui/obsPropEditor.js
@@ -0,0 +1,201 @@
+/*
+ * File: app/view/ui/obsPropEditor.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.obsPropEditor', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'gridpanel',
+                    id: 'gridop',
+                    margin: 8,
+                    maxHeight: 250,
+                    title: '',
+                    forceFit: true,
+                    store: 'gridobservedproperties',
+                    viewConfig: {
+
+                    },
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            dock: 'top',
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnNew',
+                                    text: 'New'
+                                },
+                                {
+                                    xtype: 'button',
+                                    disabled: true,
+                                    id: 'btnRemove',
+                                    text: 'Remove selected'
+                                }
+                            ]
+                        }
+                    ],
+                    columns: [
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'name',
+                            flex: 1,
+                            text: 'Name'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'definition',
+                            flex: 1,
+                            text: 'Definition'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'description',
+                            flex: 1,
+                            text: 'Description'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'procedures',
+                            flex: 1,
+                            text: 'Procedures'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'constraint2str',
+                            flex: 1,
+                            text: 'Constraint'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'form',
+                    border: 0,
+                    hidden: true,
+                    id: 'frmObservedProperties',
+                    bodyPadding: 10,
+                    title: '',
+                    trackResetOnLoad: true,
+                    items: [
+                        {
+                            xtype: 'fieldset',
+                            title: 'Observed property',
+                            items: [
+                                {
+                                    xtype: 'textfield',
+                                    id: 'opName',
+                                    name: 'name',
+                                    fieldLabel: 'Name',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'textfield',
+                                    id: 'opDefinition',
+                                    name: 'definition',
+                                    fieldLabel: 'Definition URN',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'textfield',
+                                    name: 'description',
+                                    fieldLabel: 'Description',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'fieldcontainer',
+                                    height: 28,
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'hbox'
+                                    },
+                                    fieldLabel: 'Correct Quality Index Constraints',
+                                    items: [
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'sqiChoose',
+                                            width: 110,
+                                            name: 'ctype',
+                                            fieldLabel: '',
+                                            labelWidth: 50,
+                                            emptyText: 'Choose...',
+                                            displayField: 'name',
+                                            queryMode: 'local',
+                                            store: 'constraint',
+                                            valueField: 'value'
+                                        },
+                                        {
+                                            xtype: 'numberfield',
+                                            hidden: true,
+                                            id: 'sqiFrom',
+                                            name: 'from',
+                                            fieldLabel: 'From',
+                                            labelAlign: 'right',
+                                            labelWidth: 50,
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'numberfield',
+                                            hidden: true,
+                                            id: 'sqiTo',
+                                            name: 'to',
+                                            fieldLabel: 'To',
+                                            labelAlign: 'right',
+                                            labelWidth: 40,
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            hidden: true,
+                                            id: 'sqiList',
+                                            name: 'list',
+                                            fieldLabel: 'List',
+                                            labelAlign: 'right',
+                                            labelWidth: 40,
+                                            flex: 1
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ],
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            ui: 'footer',
+                            dock: 'bottom',
+                            layout: {
+                                pack: 'center',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnForm',
+                                    text: 'Insert'
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/offeringsEditor.js b/interface/app/view/ui/offeringsEditor.js
new file mode 100755
index 0000000..d398d6f
--- /dev/null
+++ b/interface/app/view/ui/offeringsEditor.js
@@ -0,0 +1,305 @@
+/*
+ * File: app/view/ui/offeringsEditor.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.offeringsEditor', {
+    extend: 'Ext.tab.Panel',
+
+    minHeight: 400,
+    title: '',
+    activeTab: 0,
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'panel',
+                    height: 450,
+                    minHeight: 400,
+                    title: 'Offerings',
+                    items: [
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            title: '',
+                            items: [
+                                {
+                                    xtype: 'gridpanel',
+                                    id: 'gridoff',
+                                    margin: 8,
+                                    maxHeight: 250,
+                                    minHeight: 150,
+                                    title: '',
+                                    forceFit: true,
+                                    store: 'gridofferings',
+                                    viewConfig: {
+
+                                    },
+                                    dockedItems: [
+                                        {
+                                            xtype: 'toolbar',
+                                            dock: 'top',
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    id: 'btnNew',
+                                                    text: 'New'
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    disabled: true,
+                                                    id: 'btnRemove',
+                                                    text: 'Remove selected'
+                                                }
+                                            ]
+                                        }
+                                    ],
+                                    columns: [
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'name',
+                                            text: 'Name'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'description',
+                                            text: 'Description'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'procedures',
+                                            text: 'Procedures'
+                                        },
+                                        {
+                                            xtype: 'datecolumn',
+                                            dataIndex: 'expiration',
+                                            text: 'Expiration',
+                                            format: 'c'
+                                        },
+                                        {
+                                            xtype: 'booleancolumn',
+                                            dataIndex: 'active',
+                                            text: 'Active'
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    hidden: true,
+                                    id: 'frmOfferings',
+                                    bodyPadding: 10,
+                                    title: '',
+                                    trackResetOnLoad: true,
+                                    items: [
+                                        {
+                                            xtype: 'fieldset',
+                                            title: 'Offerings',
+                                            items: [
+                                                {
+                                                    xtype: 'textfield',
+                                                    id: 'offName',
+                                                    name: 'name',
+                                                    fieldLabel: 'Name',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'textfield',
+                                                    name: 'description',
+                                                    fieldLabel: 'Description',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'datefield',
+                                                    name: 'expiration',
+                                                    fieldLabel: 'Expiration',
+                                                    format: 'c',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'checkboxfield',
+                                                    name: 'active',
+                                                    fieldLabel: 'Visibility',
+                                                    boxLabel: 'enabled',
+                                                    anchor: '100%'
+                                                }
+                                            ]
+                                        }
+                                    ],
+                                    dockedItems: [
+                                        {
+                                            xtype: 'toolbar',
+                                            ui: 'footer',
+                                            dock: 'bottom',
+                                            layout: {
+                                                pack: 'center',
+                                                type: 'hbox'
+                                            },
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    id: 'btnForm',
+                                                    text: 'Insert'
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'panel',
+                    height: 450,
+                    layout: {
+                        align: 'stretch',
+                        type: 'vbox'
+                    },
+                    title: 'Offering-Procedure memberships',
+                    items: [
+                        {
+                            xtype: 'panel',
+                            border: 0,
+                            height: 40,
+                            html: 'Click & Drag procedures to add or remove membership',
+                            padding: '16 16 8 16',
+                            title: ''
+                        },
+                        {
+                            xtype: 'panel',
+                            autoRender: true,
+                            border: 0,
+                            minHeight: 400,
+                            layout: {
+                                align: 'stretch',
+                                type: 'hbox'
+                            },
+                            flex: 1,
+                            items: [
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    height: 300,
+                                    minHeight: 350,
+                                    layout: {
+                                        type: 'fit'
+                                    },
+                                    bodyPadding: 8,
+                                    title: '',
+                                    flex: 0.5,
+                                    items: [
+                                        {
+                                            xtype: 'gridpanel',
+                                            id: 'gridMembers',
+                                            autoScroll: true,
+                                            title: '',
+                                            forceFit: true,
+                                            store: 'proceduresMembers',
+                                            viewConfig: {
+                                                multiSelect: true,
+                                                plugins: [
+                                                    Ext.create('Ext.grid.plugin.DragDrop', {
+                                                        ddGroup: 'offeringsprocedures',
+                                                        dragGroup: 'gridMembers',
+                                                        dropGroup: 'gridNonMembers'
+                                                    })
+                                                ]
+                                            },
+                                            dockedItems: [
+                                                {
+                                                    xtype: 'toolbar',
+                                                    dock: 'top',
+                                                    items: [
+                                                        {
+                                                            xtype: 'combobox',
+                                                            id: 'cbOfferings',
+                                                            fieldLabel: 'Choose an offering',
+                                                            labelStyle: 'color: white;',
+                                                            labelWidth: 140,
+                                                            displayField: 'name',
+                                                            store: 'cmbname',
+                                                            valueField: 'name',
+                                                            flex: 1
+                                                        }
+                                                    ]
+                                                }
+                                            ],
+                                            columns: [
+                                                {
+                                                    xtype: 'gridcolumn',
+                                                    dataIndex: 'name',
+                                                    text: 'Name'
+                                                },
+                                                {
+                                                    xtype: 'gridcolumn',
+                                                    dataIndex: 'description',
+                                                    text: 'Description'
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'panel',
+                                    border: 0,
+                                    height: 300,
+                                    minHeight: 350,
+                                    layout: {
+                                        type: 'fit'
+                                    },
+                                    bodyPadding: 8,
+                                    title: '',
+                                    flex: 0.5,
+                                    items: [
+                                        {
+                                            xtype: 'gridpanel',
+                                            id: 'gridNonMembers',
+                                            title: 'Not members',
+                                            forceFit: true,
+                                            store: 'proceduresNonmembers',
+                                            viewConfig: {
+                                                multiSelect: true,
+                                                plugins: [
+                                                    Ext.create('Ext.grid.plugin.DragDrop', {
+                                                        ddGroup: 'offeringsprocedures',
+                                                        dragGroup: 'gridNonMembers',
+                                                        dropGroup: 'gridMembers'
+                                                    })
+                                                ]
+                                            },
+                                            columns: [
+                                                {
+                                                    xtype: 'gridcolumn',
+                                                    dataIndex: 'name',
+                                                    text: 'Name'
+                                                },
+                                                {
+                                                    xtype: 'gridcolumn',
+                                                    dataIndex: 'description',
+                                                    text: 'Description'
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/paths.js b/interface/app/view/ui/paths.js
new file mode 100755
index 0000000..4ee54e4
--- /dev/null
+++ b/interface/app/view/ui/paths.js
@@ -0,0 +1,43 @@
+/*
+ * File: app/view/ui/paths.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.paths', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    bodyStyle: 'centerBody',
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'textfield',
+                    name: 'istsos',
+                    fieldLabel: 'istSOS lib',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'textfield',
+                    name: 'services',
+                    fieldLabel: 'istSOS config',
+                    anchor: '100%'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/procedure.js b/interface/app/view/ui/procedure.js
new file mode 100755
index 0000000..1638d7e
--- /dev/null
+++ b/interface/app/view/ui/procedure.js
@@ -0,0 +1,1421 @@
+/*
+ * File: app/view/ui/procedure.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.procedure', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    id: 'newprocpanel',
+    autoScroll: true,
+    defaults: 'defaults: {\nanchor: \'100%\',\npadding: \'10px\',\n }',
+    layout: {
+        type: 'anchor'
+    },
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'container',
+                    border: 0,
+                    padding: 8,
+                    layout: {
+                        type: 'anchor'
+                    },
+                    items: [
+                        {
+                            xtype: 'fieldset',
+                            id: 'toolspanel',
+                            title: 'Tools',
+                            items: [
+                                {
+                                    xtype: 'container',
+                                    html: '<H4>Copy configuration from an existing procedure:</H4>'
+                                },
+                                {
+                                    xtype: 'fieldcontainer',
+                                    id: 'oeSettings',
+                                    layout: {
+                                        type: 'hbox'
+                                    },
+                                    fieldLabel: '',
+                                    items: [
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'cmbServices',
+                                            fieldLabel: 'Service',
+                                            labelWidth: 60,
+                                            displayField: 'service',
+                                            store: 'storeServices',
+                                            valueField: 'service',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'container',
+                                            width: 15
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'oeCbOffering',
+                                            name: 'offering',
+                                            fieldLabel: 'Offering',
+                                            labelWidth: 60,
+                                            displayField: 'name',
+                                            queryMode: 'local',
+                                            store: 'offerings',
+                                            valueField: 'name',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'container',
+                                            width: 15
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'oeCbProcedure',
+                                            name: 'procedure',
+                                            fieldLabel: 'Procedure',
+                                            labelWidth: 70,
+                                            displayField: 'name',
+                                            queryMode: 'local',
+                                            store: 'procedurelist',
+                                            valueField: 'name',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'container',
+                                            width: 15
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'btnTemplateFill',
+                                            text: 'Fill form',
+                                            flex: 1
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'container',
+                            height: 30,
+                            html: '<h2>Procedure:</h2>',
+                            padding: '0 0 16 0'
+                        },
+                        {
+                            xtype: 'form',
+                            border: 10,
+                            id: 'generalInfo',
+                            title: '',
+                            items: [
+                                {
+                                    xtype: 'fieldset',
+                                    border: 0,
+                                    margin: 0,
+                                    padding: 10,
+                                    checkboxName: 'cbproxy',
+                                    title: 'General info',
+                                    items: [
+                                        {
+                                            xtype: 'displayfield',
+                                            hidden: true,
+                                            id: 'asid',
+                                            name: 'assignedSensorId',
+                                            fieldLabel: 'Sensor ID',
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            id: 'procedurename',
+                                            name: 'system',
+                                            fieldLabel: 'Name',
+                                            allowBlank: false,
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'description',
+                                            fieldLabel: 'Description',
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'keywords',
+                                            fieldLabel: 'Keywords',
+                                            anchor: '100%'
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'form',
+                            border: 0,
+                            id: 'classification',
+                            title: '',
+                            items: [
+                                {
+                                    xtype: 'fieldset',
+                                    border: 0,
+                                    margin: 0,
+                                    title: 'Classification',
+                                    items: [
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'cmbsystemtype',
+                                            name: 'systemtype',
+                                            fieldLabel: 'System type',
+                                            allowBlank: false,
+                                            displayField: 'name',
+                                            forceSelection: true,
+                                            store: 'systemtype',
+                                            valueField: 'name',
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'sensortype',
+                                            fieldLabel: 'Sensor Type',
+                                            allowBlank: false,
+                                            emptyText: 'tipping-bucket gauge, ...',
+                                            anchor: '100%'
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'fieldset',
+                            margin: 0,
+                            title: 'Location',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    id: 'frmLocation',
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'name',
+                                            fieldLabel: 'FOI name',
+                                            allowBlank: false,
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'cbepsg',
+                                            name: 'epsg',
+                                            fieldLabel: 'EPSG',
+                                            allowBlank: false,
+                                            displayField: 'name',
+                                            forceSelection: true,
+                                            store: 'locationEPSG',
+                                            valueField: 'name',
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'fieldcontainer',
+                                            height: 30,
+                                            layout: {
+                                                type: 'column'
+                                            },
+                                            fieldLabel: 'Coordinates',
+                                            items: [
+                                                {
+                                                    xtype: 'textfield',
+                                                    name: 'x',
+                                                    fieldLabel: 'X',
+                                                    labelWidth: 20,
+                                                    allowBlank: false,
+                                                    columnWidth: 0.33
+                                                },
+                                                {
+                                                    xtype: 'textfield',
+                                                    name: 'y',
+                                                    fieldLabel: 'Y',
+                                                    labelAlign: 'right',
+                                                    labelWidth: 20,
+                                                    allowBlank: false,
+                                                    columnWidth: 0.33
+                                                },
+                                                {
+                                                    xtype: 'textfield',
+                                                    name: 'z',
+                                                    fieldLabel: 'Z',
+                                                    labelAlign: 'right',
+                                                    labelWidth: 20,
+                                                    allowBlank: false,
+                                                    columnWidth: 0.34
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'fieldset',
+                            id: 'smlOutputs',
+                            margin: 0,
+                            padding: 8,
+                            title: 'Outputs',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    id: 'frmSmlOutputs',
+                                    itemId: 'frmSml',
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'cmbObservedProperty',
+                                            itemId: 'cmbSml',
+                                            name: 'name',
+                                            fieldLabel: '<span class=\'softLink\' onclick=\'Ext.getCmp("newprocpanel").openObsPropEditorWin();\'>Observed property</span>',
+                                            labelWidth: 120,
+                                            allowBlank: false,
+                                            displayField: 'definition',
+                                            forceSelection: true,
+                                            store: 'cmbobservedproperties',
+                                            valueField: 'definition',
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'cmbUom',
+                                            name: 'uom',
+                                            fieldLabel: '<span class=\'softLink\' onclick=\'Ext.getCmp("newprocpanel").openUomsEditorWin();\'>Unit of measure</span>',
+                                            labelWidth: 120,
+                                            allowBlank: false,
+                                            displayField: 'name',
+                                            forceSelection: true,
+                                            store: 'cmbuom',
+                                            valueField: 'name',
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'description',
+                                            fieldLabel: 'Description',
+                                            labelWidth: 120,
+                                            anchor: '100%'
+                                        },
+                                        {
+                                            xtype: 'fieldcontainer',
+                                            height: 28,
+                                            layout: {
+                                                align: 'stretch',
+                                                type: 'hbox'
+                                            },
+                                            fieldLabel: 'Statistical Quality Index Constraints',
+                                            labelWidth: 230,
+                                            items: [
+                                                {
+                                                    xtype: 'combobox',
+                                                    id: 'constrChoose',
+                                                    width: 150,
+                                                    name: 'ctype',
+                                                    fieldLabel: '',
+                                                    labelWidth: 50,
+                                                    emptyText: 'Choose...',
+                                                    displayField: 'name',
+                                                    queryMode: 'local',
+                                                    store: 'constraint',
+                                                    valueField: 'value'
+                                                },
+                                                {
+                                                    xtype: 'numberfield',
+                                                    hidden: true,
+                                                    id: 'constrFrom',
+                                                    name: 'from',
+                                                    fieldLabel: 'From',
+                                                    labelAlign: 'right',
+                                                    labelWidth: 50,
+                                                    flex: 1
+                                                },
+                                                {
+                                                    xtype: 'numberfield',
+                                                    hidden: true,
+                                                    id: 'constrTo',
+                                                    name: 'to',
+                                                    fieldLabel: 'To',
+                                                    labelAlign: 'right',
+                                                    labelWidth: 40,
+                                                    flex: 1
+                                                },
+                                                {
+                                                    xtype: 'textfield',
+                                                    hidden: true,
+                                                    id: 'constrList',
+                                                    name: 'list',
+                                                    fieldLabel: 'List',
+                                                    labelAlign: 'right',
+                                                    labelWidth: 40,
+                                                    flex: 1
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            itemId: 'btnAddSml',
+                                            margin: '0 0 10 0',
+                                            text: 'Add',
+                                            anchor: '100%'
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'gridpanel',
+                                    height: 120,
+                                    itemId: 'gridSml',
+                                    minHeight: 120,
+                                    title: '',
+                                    forceFit: true,
+                                    store: 'gridoutputs',
+                                    viewConfig: {
+
+                                    },
+                                    dockedItems: [
+                                        {
+                                            xtype: 'toolbar',
+                                            itemId: 'gridToolbar',
+                                            dock: 'top',
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    itemId: 'btnRemoveSml',
+                                                    text: 'Remove selected'
+                                                }
+                                            ]
+                                        }
+                                    ],
+                                    columns: [
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'name',
+                                            text: 'Name'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'description',
+                                            text: 'Description'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'definition',
+                                            text: 'Definition'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'uom',
+                                            text: 'Uom'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            hidden: true,
+                                            dataIndex: 'role',
+                                            text: 'Role'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'from',
+                                            text: 'From'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'to',
+                                            text: 'To'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'list',
+                                            text: 'List'
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'container',
+                    border: 0,
+                    padding: 8,
+                    layout: {
+                        type: 'anchor'
+                    },
+                    items: [
+                        {
+                            xtype: 'container',
+                            height: 30,
+                            html: '<h4>Optional parameters:</h4>',
+                            layout: {
+                                type: 'fit'
+                            }
+                        },
+                        {
+                            xtype: 'fieldset',
+                            checkboxToggle: true,
+                            collapsed: true,
+                            collapsible: true,
+                            title: 'Contacts (optional)',
+                            items: [
+                                {
+                                    xtype: 'container',
+                                    anchor: '100%',
+                                    items: [
+                                        {
+                                            xtype: 'form',
+                                            border: 0,
+                                            id: 'frmOwner',
+                                            title: '',
+                                            items: [
+                                                {
+                                                    xtype: 'hiddenfield',
+                                                    name: 'role',
+                                                    value: 'urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:owner',
+                                                    fieldLabel: 'Label',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'textfield',
+                                                    name: 'organizationName',
+                                                    fieldLabel: 'Owner',
+                                                    labelWidth: 130,
+                                                    allowBlank: false,
+                                                    emptyText: 'Organization name...',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'fieldset',
+                                                    collapsed: true,
+                                                    collapsible: true,
+                                                    title: 'Details (optional)',
+                                                    anchor: '100%',
+                                                    items: [
+                                                        {
+                                                            xtype: 'container',
+                                                            layout: {
+                                                                type: 'column'
+                                                            },
+                                                            anchor: '100%',
+                                                            items: [
+                                                                {
+                                                                    xtype: 'container',
+                                                                    padding: 6,
+                                                                    layout: {
+                                                                        type: 'anchor'
+                                                                    },
+                                                                    columnWidth: 0.5,
+                                                                    items: [
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'individualName',
+                                                                            fieldLabel: 'Person',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'voice',
+                                                                            fieldLabel: 'Telephone',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'fax',
+                                                                            fieldLabel: 'Fax',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'email',
+                                                                            fieldLabel: 'email',
+                                                                            anchor: '100%'
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    xtype: 'container',
+                                                                    padding: 6,
+                                                                    layout: {
+                                                                        type: 'anchor'
+                                                                    },
+                                                                    columnWidth: 0.5,
+                                                                    items: [
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'web',
+                                                                            fieldLabel: 'Web',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'deliveryPoint',
+                                                                            fieldLabel: 'Address',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'city',
+                                                                            fieldLabel: 'City',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'administrativeArea',
+                                                                            fieldLabel: 'Admin area',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'postalcode',
+                                                                            fieldLabel: 'Postal code',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'country',
+                                                                            fieldLabel: 'Country',
+                                                                            anchor: '100%'
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'container',
+                                    anchor: '100%',
+                                    items: [
+                                        {
+                                            xtype: 'form',
+                                            border: 0,
+                                            id: 'frmManufacturer',
+                                            title: '',
+                                            items: [
+                                                {
+                                                    xtype: 'hiddenfield',
+                                                    name: 'role',
+                                                    value: 'urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:manufacturer',
+                                                    fieldLabel: 'Label',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'textfield',
+                                                    name: 'organizationName',
+                                                    fieldLabel: 'Manufacturer',
+                                                    labelWidth: 130,
+                                                    allowBlank: false,
+                                                    emptyText: 'Organization name...',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'fieldset',
+                                                    collapsed: true,
+                                                    collapsible: true,
+                                                    title: 'Details (optional)',
+                                                    items: [
+                                                        {
+                                                            xtype: 'container',
+                                                            layout: {
+                                                                type: 'column'
+                                                            },
+                                                            anchor: '100%',
+                                                            items: [
+                                                                {
+                                                                    xtype: 'container',
+                                                                    padding: 6,
+                                                                    layout: {
+                                                                        type: 'anchor'
+                                                                    },
+                                                                    columnWidth: 0.5,
+                                                                    items: [
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'individualName',
+                                                                            fieldLabel: 'Person',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'voice',
+                                                                            fieldLabel: 'Telephone',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'fax',
+                                                                            fieldLabel: 'Fax',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'email',
+                                                                            fieldLabel: 'email',
+                                                                            anchor: '100%'
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    xtype: 'container',
+                                                                    padding: 6,
+                                                                    layout: {
+                                                                        type: 'anchor'
+                                                                    },
+                                                                    columnWidth: 0.5,
+                                                                    items: [
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'web',
+                                                                            fieldLabel: 'Web',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'deliveryPoint',
+                                                                            fieldLabel: 'Address',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'city',
+                                                                            fieldLabel: 'City',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'administrativeArea',
+                                                                            fieldLabel: 'Admin area',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'postalcode',
+                                                                            fieldLabel: 'Postal code',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'country',
+                                                                            fieldLabel: 'Country',
+                                                                            anchor: '100%'
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'container',
+                                    anchor: '100%',
+                                    items: [
+                                        {
+                                            xtype: 'form',
+                                            border: 0,
+                                            id: 'frmOperator',
+                                            title: '',
+                                            items: [
+                                                {
+                                                    xtype: 'hiddenfield',
+                                                    name: 'role',
+                                                    value: 'urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:operator',
+                                                    fieldLabel: 'Label',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'textfield',
+                                                    name: 'organizationName',
+                                                    fieldLabel: 'Operator',
+                                                    labelWidth: 130,
+                                                    allowBlank: false,
+                                                    emptyText: 'Organization name...',
+                                                    anchor: '100%'
+                                                },
+                                                {
+                                                    xtype: 'fieldset',
+                                                    collapsed: true,
+                                                    collapsible: true,
+                                                    title: 'Details (optional)',
+                                                    items: [
+                                                        {
+                                                            xtype: 'container',
+                                                            layout: {
+                                                                type: 'column'
+                                                            },
+                                                            anchor: '100%',
+                                                            items: [
+                                                                {
+                                                                    xtype: 'container',
+                                                                    padding: 6,
+                                                                    layout: {
+                                                                        type: 'anchor'
+                                                                    },
+                                                                    columnWidth: 0.5,
+                                                                    items: [
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'individualName',
+                                                                            fieldLabel: 'Person',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'voice',
+                                                                            fieldLabel: 'Telephone',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'fax',
+                                                                            fieldLabel: 'Fax',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'email',
+                                                                            fieldLabel: 'email',
+                                                                            anchor: '100%'
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    xtype: 'container',
+                                                                    padding: 6,
+                                                                    layout: {
+                                                                        type: 'anchor'
+                                                                    },
+                                                                    columnWidth: 0.5,
+                                                                    items: [
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'web',
+                                                                            fieldLabel: 'Web',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'deliveryPoint',
+                                                                            fieldLabel: 'Address',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'city',
+                                                                            fieldLabel: 'City',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'administrativeArea',
+                                                                            fieldLabel: 'Admin area',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'postalcode',
+                                                                            fieldLabel: 'Postal code',
+                                                                            anchor: '100%'
+                                                                        },
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            name: 'country',
+                                                                            fieldLabel: 'Country',
+                                                                            anchor: '100%'
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'fieldset',
+                            id: 'smlDocumentation',
+                            checkboxToggle: true,
+                            collapsed: true,
+                            collapsible: true,
+                            title: 'Documents (optional)',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    height: 150,
+                                    itemId: 'frmSml',
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'vbox'
+                                    },
+                                    bodyPadding: '10 0 5 0',
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'description',
+                                            fieldLabel: 'Description',
+                                            allowBlank: false
+                                        },
+                                        {
+                                            xtype: 'combobox',
+                                            id: 'applicationType',
+                                            itemId: 'cmbSml',
+                                            name: 'format',
+                                            fieldLabel: 'Format',
+                                            displayField: 'format',
+                                            forceSelection: true,
+                                            queryMode: 'local',
+                                            store: 'cmbdocumentformat',
+                                            typeAhead: true,
+                                            valueField: 'format',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'datefield',
+                                            name: 'date',
+                                            fieldLabel: 'Date',
+                                            format: 'Y-m-d',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'link',
+                                            fieldLabel: 'Link',
+                                            allowBlank: false,
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            itemId: 'btnAddSml',
+                                            width: 30,
+                                            text: 'Add'
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'gridpanel',
+                                    height: 120,
+                                    itemId: 'gridSml',
+                                    minHeight: 120,
+                                    title: '',
+                                    forceFit: true,
+                                    store: 'griddocumentation',
+                                    viewConfig: {
+
+                                    },
+                                    dockedItems: [
+                                        {
+                                            xtype: 'toolbar',
+                                            itemId: 'gridToolbar',
+                                            dock: 'top',
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    itemId: 'btnRemoveSml',
+                                                    text: 'Remove selected'
+                                                }
+                                            ]
+                                        }
+                                    ],
+                                    columns: [
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'description',
+                                            text: 'Description'
+                                        },
+                                        {
+                                            xtype: 'datecolumn',
+                                            dataIndex: 'date',
+                                            text: 'Date',
+                                            format: 'Y-m-d'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'format',
+                                            text: 'Format'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'link',
+                                            text: 'Link'
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'fieldset',
+                            checkboxToggle: true,
+                            collapsed: true,
+                            collapsible: true,
+                            title: 'Interfaces (optional)',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    id: 'frmInterfaces',
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'interfaces',
+                                            fieldLabel: 'Name list (csv)',
+                                            emptyText: 'RS-232,RS-485,BLUETOOTH,WIFI,IR ...',
+                                            anchor: '100%'
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'fieldset',
+                            hidden: true,
+                            id: 'smlInputs',
+                            padding: 8,
+                            checkboxToggle: true,
+                            collapsed: true,
+                            collapsible: true,
+                            title: 'Inputs (optional)',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    height: 30,
+                                    itemId: 'frmSml',
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'hbox'
+                                    },
+                                    title: '',
+                                    anchor: '100%',
+                                    items: [
+                                        {
+                                            xtype: 'combobox',
+                                            itemId: 'cmbSml',
+                                            margin: '0 6 0 0',
+                                            name: 'name',
+                                            fieldLabel: '<span class=\'softLink\' onclick=\'alert(\"to do\");\'>Name</span>',
+                                            labelWidth: 40,
+                                            allowBlank: false,
+                                            displayField: 'name',
+                                            store: 'cmbphenomenon',
+                                            valueField: 'name',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'description',
+                                            fieldLabel: 'Description',
+                                            labelAlign: 'right',
+                                            labelWidth: 80,
+                                            allowBlank: false,
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            itemId: 'btnAddSml',
+                                            margin: '0 0 0 6',
+                                            width: 50,
+                                            text: 'Add'
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'gridpanel',
+                                    height: 120,
+                                    itemId: 'gridSml',
+                                    margin: 8,
+                                    minHeight: 120,
+                                    title: '',
+                                    store: 'gridinput',
+                                    viewConfig: {
+
+                                    },
+                                    dockedItems: [
+                                        {
+                                            xtype: 'toolbar',
+                                            itemId: 'gridToolbar',
+                                            dock: 'top',
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    itemId: 'btnRemoveSml',
+                                                    text: 'Remove selected'
+                                                }
+                                            ]
+                                        }
+                                    ],
+                                    columns: [
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'name',
+                                            text: 'Name'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'description',
+                                            flex: 0.5,
+                                            text: 'Description'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'definition',
+                                            flex: 1,
+                                            text: 'Definition'
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'fieldset',
+                            id: 'smlIdentification',
+                            checkboxToggle: true,
+                            collapsed: true,
+                            collapsible: true,
+                            title: 'Identification (optional)',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    height: 30,
+                                    id: 'frmIdentification',
+                                    itemId: 'frmSml',
+                                    layout: {
+                                        align: 'stretch',
+                                        type: 'hbox'
+                                    },
+                                    title: '',
+                                    anchor: '100%',
+                                    items: [
+                                        {
+                                            xtype: 'combobox',
+                                            itemId: 'cmbSml',
+                                            margin: '0 6 0 0',
+                                            name: 'name',
+                                            fieldLabel: 'Name',
+                                            labelWidth: 40,
+                                            allowBlank: false,
+                                            displayField: 'name',
+                                            store: 'cmbidentification',
+                                            valueField: 'name',
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'value',
+                                            fieldLabel: 'Value',
+                                            labelAlign: 'right',
+                                            labelWidth: 40,
+                                            allowBlank: false,
+                                            flex: 1
+                                        },
+                                        {
+                                            xtype: 'button',
+                                            id: 'btnAddIdentification',
+                                            itemId: 'btnAddSml',
+                                            margin: '0 0 0 6',
+                                            width: 50,
+                                            text: 'Add'
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'gridpanel',
+                                    height: 120,
+                                    id: 'gridIdentification',
+                                    itemId: 'gridSml',
+                                    margin: 8,
+                                    minHeight: 120,
+                                    title: '',
+                                    store: 'grididentification',
+                                    viewConfig: {
+
+                                    },
+                                    dockedItems: [
+                                        {
+                                            xtype: 'toolbar',
+                                            itemId: 'gridToolbar',
+                                            dock: 'top',
+                                            items: [
+                                                {
+                                                    xtype: 'button',
+                                                    id: 'btnRemoveIdentification',
+                                                    itemId: 'btnRemoveSml',
+                                                    text: 'Remove selected'
+                                                }
+                                            ]
+                                        }
+                                    ],
+                                    columns: [
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'name',
+                                            text: 'Name'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'value',
+                                            flex: 0.5,
+                                            text: 'Value'
+                                        },
+                                        {
+                                            xtype: 'gridcolumn',
+                                            dataIndex: 'definition',
+                                            flex: 1,
+                                            text: 'Definition'
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'fieldset',
+                            checkboxToggle: true,
+                            collapsed: true,
+                            collapsible: true,
+                            title: 'Characteristics (optional)',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    id: 'characteristics',
+                                    margin: 0,
+                                    padding: 0,
+                                    collapsed: false,
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'textfield',
+                                            name: 'characteristics',
+                                            fieldLabel: 'Technical specification sheet URL',
+                                            labelWidth: 210,
+                                            anchor: '100%'
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'fieldset',
+                            checkboxToggle: true,
+                            collapsed: true,
+                            collapsible: true,
+                            title: 'Capabilities',
+                            items: [
+                                {
+                                    xtype: 'form',
+                                    border: 0,
+                                    id: 'frmCapabilities',
+                                    collapsed: false,
+                                    title: '',
+                                    items: [
+                                        {
+                                            xtype: 'fieldcontainer',
+                                            height: 30,
+                                            layout: {
+                                                type: 'column'
+                                            },
+                                            fieldLabel: 'Sampling time resolution',
+                                            labelWidth: 180,
+                                            items: [
+                                                {
+                                                    xtype: 'combobox',
+                                                    id: 'strCombo',
+                                                    fieldLabel: 'Label',
+                                                    hideLabel: true,
+                                                    displayField: 'combo',
+                                                    store: 'cmbcapabilitiesuom',
+                                                    valueField: 'uom',
+                                                    columnWidth: 0.5
+                                                },
+                                                {
+                                                    xtype: 'numberfield',
+                                                    id: 'strValue',
+                                                    fieldLabel: 'Value',
+                                                    labelAlign: 'right',
+                                                    labelWidth: 60,
+                                                    columnWidth: 0.5
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            xtype: 'fieldcontainer',
+                                            height: 30,
+                                            id: 'MyFieldContainer8',
+                                            layout: {
+                                                type: 'column'
+                                            },
+                                            fieldLabel: 'Acquisition time resolution',
+                                            labelWidth: 180,
+                                            items: [
+                                                {
+                                                    xtype: 'combobox',
+                                                    id: 'atrCombo',
+                                                    fieldLabel: 'Label',
+                                                    hideLabel: true,
+                                                    displayField: 'combo',
+                                                    store: 'cmbcapabilitiesuom2',
+                                                    valueField: 'uom',
+                                                    columnWidth: 0.5
+                                                },
+                                                {
+                                                    xtype: 'numberfield',
+                                                    id: 'atrValue',
+                                                    fieldLabel: 'Value',
+                                                    labelAlign: 'right',
+                                                    labelWidth: 60,
+                                                    columnWidth: 0.5
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            xtype: 'textfield',
+                                            id: 'storeTypeValue',
+                                            fieldLabel: 'Storage type',
+                                            labelWidth: 180,
+                                            anchor: '100%'
+                                        }
+                                    ]
+                                },
+                                {
+                                    xtype: 'fieldset',
+                                    id: 'smlCapabilities',
+                                    padding: 8,
+                                    collapsed: true,
+                                    collapsible: true,
+                                    title: 'Additional Capabilities (optional)',
+                                    items: [
+                                        {
+                                            xtype: 'form',
+                                            border: 0,
+                                            height: 30,
+                                            itemId: 'frmSml',
+                                            layout: {
+                                                align: 'stretch',
+                                                type: 'hbox'
+                                            },
+                                            title: '',
+                                            anchor: '100%',
+                                            items: [
+                                                {
+                                                    xtype: 'combobox',
+                                                    itemId: 'cmbSml',
+                                                    margin: '0 6 0 0',
+                                                    name: 'name',
+                                                    fieldLabel: 'Name',
+                                                    labelWidth: 60,
+                                                    allowBlank: false,
+                                                    displayField: 'combo',
+                                                    store: 'cmbCapabilities',
+                                                    valueField: 'name',
+                                                    flex: 1
+                                                },
+                                                {
+                                                    xtype: 'textfield',
+                                                    name: 'value',
+                                                    fieldLabel: 'Value',
+                                                    labelAlign: 'right',
+                                                    labelWidth: 60,
+                                                    allowBlank: false,
+                                                    flex: 1
+                                                },
+                                                {
+                                                    xtype: 'button',
+                                                    itemId: 'btnAddSml',
+                                                    margin: '0 0 0 6',
+                                                    width: 50,
+                                                    text: 'Add'
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            xtype: 'gridpanel',
+                                            height: 120,
+                                            itemId: 'gridSml',
+                                            margin: 8,
+                                            minHeight: 120,
+                                            title: '',
+                                            store: 'gridCapabilities',
+                                            viewConfig: {
+
+                                            },
+                                            dockedItems: [
+                                                {
+                                                    xtype: 'toolbar',
+                                                    itemId: 'gridToolbar',
+                                                    dock: 'top',
+                                                    items: [
+                                                        {
+                                                            xtype: 'button',
+                                                            itemId: 'btnRemoveSml',
+                                                            text: 'Remove selected'
+                                                        }
+                                                    ]
+                                                }
+                                            ],
+                                            columns: [
+                                                {
+                                                    xtype: 'gridcolumn',
+                                                    dataIndex: 'name',
+                                                    text: 'Name'
+                                                },
+                                                {
+                                                    xtype: 'gridcolumn',
+                                                    dataIndex: 'value',
+                                                    flex: 0.5,
+                                                    text: 'Value'
+                                                },
+                                                {
+                                                    xtype: 'gridcolumn',
+                                                    dataIndex: 'uom',
+                                                    text: 'Unit of measure'
+                                                },
+                                                {
+                                                    xtype: 'gridcolumn',
+                                                    dataIndex: 'definition',
+                                                    flex: 1,
+                                                    text: 'Definition'
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/proceduresList.js b/interface/app/view/ui/proceduresList.js
new file mode 100755
index 0000000..7c094ca
--- /dev/null
+++ b/interface/app/view/ui/proceduresList.js
@@ -0,0 +1,82 @@
+/*
+ * File: app/view/ui/proceduresList.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.proceduresList', {
+    extend: 'Ext.grid.Panel',
+
+    height: 400,
+    autoScroll: true,
+    forceFit: true,
+    store: 'procedurelist',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            dockedItems: [
+                {
+                    xtype: 'toolbar',
+                    dock: 'top',
+                    items: [
+                        {
+                            xtype: 'button',
+                            id: 'btnRemove',
+                            text: 'Delete selected'
+                        }
+                    ]
+                }
+            ],
+            viewConfig: {
+
+            },
+            columns: [
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'name',
+                    text: 'Name'
+                },
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'description',
+                    text: 'Description'
+                },
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'sensortype',
+                    text: 'Sensor Type'
+                },
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'offerings',
+                    text: 'Offerings'
+                },
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'observedproperties',
+                    text: 'Observedproperties'
+                },
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'samplingTime',
+                    text: 'BeginPosition'
+                },
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'samplingTime',
+                    text: 'EndPosition'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/provider.js b/interface/app/view/ui/provider.js
new file mode 100755
index 0000000..6bf17d2
--- /dev/null
+++ b/interface/app/view/ui/provider.js
@@ -0,0 +1,118 @@
+/*
+ * File: app/view/ui/provider.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.provider', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'displayfield',
+                    hidden: true,
+                    id: 'messageField',
+                    fieldStyle: 'color: red;',
+                    name: 'message',
+                    fieldLabel: 'Message',
+                    labelStyle: 'color: red;',
+                    anchor: '100%'
+                },
+                {
+                    xtype: 'fieldset',
+                    title: 'Service Provider:',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'providername',
+                            fieldLabel: 'Name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'providersite',
+                            fieldLabel: 'Web site',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactname',
+                            fieldLabel: 'Contact name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactposition',
+                            fieldLabel: 'Contact position',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactvoice',
+                            fieldLabel: 'Voice',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactfax',
+                            fieldLabel: 'Fax',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactemail',
+                            fieldLabel: 'Email',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactdeliverypoint',
+                            fieldLabel: 'Address',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactpostalcode',
+                            fieldLabel: 'Postal code',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactcity',
+                            fieldLabel: 'City',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactadminarea',
+                            fieldLabel: 'State',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactcountry',
+                            fieldLabel: 'Country',
+                            anchor: '100%'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/qualityindexEditor.js b/interface/app/view/ui/qualityindexEditor.js
new file mode 100755
index 0000000..f3300b0
--- /dev/null
+++ b/interface/app/view/ui/qualityindexEditor.js
@@ -0,0 +1,132 @@
+/*
+ * File: app/view/ui/qualityindexEditor.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.qualityindexEditor', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'gridpanel',
+                    id: 'gridop',
+                    margin: 8,
+                    maxHeight: 250,
+                    title: '',
+                    forceFit: true,
+                    store: 'qistore',
+                    viewConfig: {
+
+                    },
+                    columns: [
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'code',
+                            text: 'Code'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'name',
+                            text: 'Name'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'description',
+                            text: 'Description'
+                        }
+                    ],
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            dock: 'top',
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnNew',
+                                    text: 'New'
+                                },
+                                {
+                                    xtype: 'button',
+                                    disabled: true,
+                                    id: 'btnRemove',
+                                    text: 'Remove selected'
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'form',
+                    border: 0,
+                    hidden: true,
+                    id: 'frmQuality',
+                    bodyPadding: 10,
+                    title: '',
+                    trackResetOnLoad: true,
+                    items: [
+                        {
+                            xtype: 'fieldset',
+                            title: 'Quality index',
+                            items: [
+                                {
+                                    xtype: 'textfield',
+                                    id: 'opCode',
+                                    name: 'code',
+                                    fieldLabel: 'Code',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'textfield',
+                                    id: 'opName',
+                                    name: 'name',
+                                    fieldLabel: 'Name',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'textfield',
+                                    name: 'description',
+                                    fieldLabel: 'Description',
+                                    anchor: '100%'
+                                }
+                            ]
+                        }
+                    ],
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            ui: 'footer',
+                            dock: 'bottom',
+                            layout: {
+                                pack: 'center',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnForm',
+                                    text: 'Insert'
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/serviceEditor.js b/interface/app/view/ui/serviceEditor.js
new file mode 100755
index 0000000..d6bdff8
--- /dev/null
+++ b/interface/app/view/ui/serviceEditor.js
@@ -0,0 +1,112 @@
+/*
+ * File: app/view/ui/serviceEditor.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.serviceEditor', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'form',
+                    border: 0,
+                    id: 'frmServices',
+                    bodyPadding: 10,
+                    title: '',
+                    trackResetOnLoad: true,
+                    items: [
+                        {
+                            xtype: 'fieldset',
+                            title: 'Quality index',
+                            items: [
+                                {
+                                    xtype: 'textfield',
+                                    id: 'opService',
+                                    name: 'service',
+                                    fieldLabel: 'Name',
+                                    anchor: '100%'
+                                }
+                            ]
+                        }
+                    ],
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            ui: 'footer',
+                            dock: 'bottom',
+                            layout: {
+                                pack: 'center',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnForm',
+                                    text: 'New'
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    xtype: 'gridpanel',
+                    id: 'gridop',
+                    margin: 8,
+                    title: '',
+                    forceFit: true,
+                    store: 'storeServices',
+                    viewConfig: {
+
+                    },
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            dock: 'top',
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnNew',
+                                    text: 'New'
+                                },
+                                {
+                                    xtype: 'button',
+                                    disabled: true,
+                                    id: 'btnRemove',
+                                    text: 'Remove'
+                                }
+                            ]
+                        }
+                    ],
+                    columns: [
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'service',
+                            text: 'Service'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'path',
+                            text: 'Path'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/serviceconfig.js b/interface/app/view/ui/serviceconfig.js
new file mode 100755
index 0000000..b252f91
--- /dev/null
+++ b/interface/app/view/ui/serviceconfig.js
@@ -0,0 +1,286 @@
+/*
+ * File: app/view/ui/serviceconfig.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.serviceconfig', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'container',
+                    html: '<h3>Service Provider:</h3>Here you can personalize the service provider information. It will be displayed in the getCapabilities document.',
+                    padding: '10 0 10 0'
+                },
+                {
+                    xtype: 'fieldset',
+                    id: 'provider',
+                    padding: 10,
+                    checkboxName: 'cbprovider',
+                    checkboxToggle: true,
+                    collapsed: true,
+                    collapsible: true,
+                    title: 'check to apply customizations',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'providername',
+                            fieldLabel: 'Name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'providersite',
+                            fieldLabel: 'Web site',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactname',
+                            fieldLabel: 'Contact name',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactposition',
+                            fieldLabel: 'Contact position',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactvoice',
+                            fieldLabel: 'Voice',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactfax',
+                            fieldLabel: 'Fax',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactemail',
+                            fieldLabel: 'Email',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactdeliverypoint',
+                            fieldLabel: 'Address',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactpostalcode',
+                            fieldLabel: 'Postal code',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactcity',
+                            fieldLabel: 'City',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactadminarea',
+                            fieldLabel: 'State',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'contactcountry',
+                            fieldLabel: 'Country',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'container',
+                    html: '<h3>Service Identification:</h3>Here you can personalize..',
+                    padding: '10 0 10 0'
+                },
+                {
+                    xtype: 'fieldset',
+                    id: 'identification',
+                    padding: 10,
+                    checkboxName: 'cbidentification',
+                    checkboxToggle: true,
+                    collapsed: true,
+                    collapsible: true,
+                    title: 'check to apply customizations',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'title',
+                            fieldLabel: 'Title',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'abstract',
+                            fieldLabel: 'Abstract',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'keywords',
+                            fieldLabel: 'Keywords',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'fees',
+                            fieldLabel: 'Fees',
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'accessconstrains',
+                            fieldLabel: 'Access constrains',
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'container',
+                    html: '<h3>Coordinate system:</h3>Here you can personalize..',
+                    padding: '10 0 10 0'
+                },
+                {
+                    xtype: 'fieldset',
+                    id: 'geo',
+                    padding: 10,
+                    checkboxName: 'cbcoordinates',
+                    checkboxToggle: true,
+                    collapsed: true,
+                    collapsible: true,
+                    title: 'check to apply customizations',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'istsosepsg',
+                            fieldLabel: 'Default EPSG',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'allowedepsg',
+                            fieldLabel: 'Permitted EPSG',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'xaxisname',
+                            fieldLabel: 'X axis name',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'yaxisname',
+                            fieldLabel: 'Y axis name',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'textfield',
+                            name: 'zaxisname',
+                            fieldLabel: 'Z axis name',
+                            allowBlank: false,
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'container',
+                    html: '<h3>GetObservation configuration:</h3>Here you can personalize..',
+                    padding: '10 0 10 0'
+                },
+                {
+                    xtype: 'fieldset',
+                    id: 'getobservation',
+                    padding: 10,
+                    checkboxName: 'cbgetobservation',
+                    checkboxToggle: true,
+                    collapsed: true,
+                    collapsible: true,
+                    title: 'check to apply customizations',
+                    items: [
+                        {
+                            xtype: 'numberfield',
+                            name: 'maxgoperiod',
+                            fieldLabel: 'Max request interval (hours)',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'numberfield',
+                            name: 'defaultqi',
+                            fieldLabel: 'Default quality index',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'numberfield',
+                            name: 'aggregatenodataqi',
+                            fieldLabel: 'Aggregation no-data quality index',
+                            allowBlank: false,
+                            anchor: '100%'
+                        },
+                        {
+                            xtype: 'numberfield',
+                            name: 'aggregatenodata',
+                            fieldLabel: 'Aggregation no-data value',
+                            allowBlank: false,
+                            anchor: '100%'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'container',
+                    html: '<h3>Proxy URL:</h3>Here you can personalize..',
+                    padding: '10 0 10 0'
+                },
+                {
+                    xtype: 'fieldset',
+                    id: 'proxyurl',
+                    padding: 10,
+                    checkboxName: 'cbgetobservation',
+                    checkboxToggle: true,
+                    collapsed: true,
+                    collapsible: true,
+                    title: 'check to apply customizations',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'url',
+                            fieldLabel: 'Url',
+                            allowBlank: false,
+                            anchor: '100%'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/serviceurl.js b/interface/app/view/ui/serviceurl.js
new file mode 100755
index 0000000..5fa2ecb
--- /dev/null
+++ b/interface/app/view/ui/serviceurl.js
@@ -0,0 +1,45 @@
+/*
+ * File: app/view/ui/serviceurl.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.serviceurl', {
+    extend: 'Ext.form.Panel',
+
+    border: 0,
+    bodyPadding: 10,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'fieldset',
+                    padding: 10,
+                    checkboxName: 'cbproxy',
+                    title: 'Proxy url',
+                    items: [
+                        {
+                            xtype: 'textfield',
+                            name: 'url',
+                            fieldLabel: 'Url',
+                            allowBlank: false,
+                            anchor: '100%'
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/status.js b/interface/app/view/ui/status.js
new file mode 100755
index 0000000..095cb5f
--- /dev/null
+++ b/interface/app/view/ui/status.js
@@ -0,0 +1,110 @@
+/*
+ * File: app/view/ui/status.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.status', {
+    extend: 'Ext.grid.Panel',
+
+    title: '',
+    forceFit: true,
+    store: 'serverstatus',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            viewConfig: {
+
+            },
+            columns: [
+                {
+                    xtype: 'gridcolumn',
+                    dataIndex: 'service',
+                    text: 'Service'
+                },
+                {
+                    xtype: 'numbercolumn',
+                    dataIndex: 'featuresOfInterest',
+                    text: 'Features Of Interest',
+                    format: 0
+                },
+                {
+                    xtype: 'numbercolumn',
+                    dataIndex: 'offerings',
+                    text: 'Offerings',
+                    format: 0
+                },
+                {
+                    xtype: 'numbercolumn',
+                    dataIndex: 'procedures',
+                    text: 'Procedures',
+                    format: 0
+                },
+                {
+                    xtype: 'numbercolumn',
+                    dataIndex: 'observedProperties',
+                    text: 'Observed Properties',
+                    format: 0
+                },
+                {
+                    xtype: 'gridcolumn',
+                    id: 'colAvailability',
+                    dataIndex: 'availability',
+                    text: 'Availability'
+                },
+                {
+                    xtype: 'gridcolumn',
+                    id: 'colDatabase',
+                    dataIndex: 'database',
+                    text: 'Database'
+                },
+                {
+                    xtype: 'booleancolumn',
+                    id: 'colGetcapabilities',
+                    dataIndex: 'getcapabilities',
+                    text: 'GetCapabilities'
+                },
+                {
+                    xtype: 'booleancolumn',
+                    id: 'colDescribesensor',
+                    dataIndex: 'describesensor',
+                    text: 'DescribeSensor'
+                },
+                {
+                    xtype: 'booleancolumn',
+                    id: 'colGetobservation',
+                    dataIndex: 'getobservation',
+                    text: 'GetObservation'
+                },
+                {
+                    xtype: 'booleancolumn',
+                    id: 'colGetfeatureofinterest',
+                    dataIndex: 'getfeatureofinterest',
+                    text: 'GetFeatureOfInterest'
+                },
+                {
+                    xtype: 'booleancolumn',
+                    id: 'colInsertobservation',
+                    dataIndex: 'insertobservation',
+                    text: 'InsertObservation'
+                },
+                {
+                    xtype: 'booleancolumn',
+                    id: 'colRegistersensor',
+                    dataIndex: 'registersensor',
+                    text: 'RegisterSensor'
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/ui/uomsEditor.js b/interface/app/view/ui/uomsEditor.js
new file mode 100755
index 0000000..0777837
--- /dev/null
+++ b/interface/app/view/ui/uomsEditor.js
@@ -0,0 +1,125 @@
+/*
+ * File: app/view/ui/uomsEditor.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('istsos.view.ui.uomsEditor', {
+    extend: 'Ext.panel.Panel',
+
+    border: 0,
+    title: '',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'gridpanel',
+                    id: 'gridop',
+                    margin: 8,
+                    maxHeight: 250,
+                    title: '',
+                    forceFit: true,
+                    store: 'griduoms',
+                    viewConfig: {
+
+                    },
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            dock: 'top',
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnNew',
+                                    text: 'New'
+                                },
+                                {
+                                    xtype: 'button',
+                                    disabled: true,
+                                    id: 'btnRemove',
+                                    text: 'Remove selected'
+                                }
+                            ]
+                        }
+                    ],
+                    columns: [
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'name',
+                            text: 'Code'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'description',
+                            text: 'Description'
+                        },
+                        {
+                            xtype: 'gridcolumn',
+                            dataIndex: 'procedures',
+                            text: 'Procedures'
+                        }
+                    ]
+                },
+                {
+                    xtype: 'form',
+                    border: 0,
+                    hidden: true,
+                    id: 'frmUoms',
+                    bodyPadding: 10,
+                    title: '',
+                    trackResetOnLoad: true,
+                    items: [
+                        {
+                            xtype: 'fieldset',
+                            title: 'Observed property',
+                            items: [
+                                {
+                                    xtype: 'textfield',
+                                    id: 'opName',
+                                    name: 'name',
+                                    fieldLabel: 'Code',
+                                    anchor: '100%'
+                                },
+                                {
+                                    xtype: 'textfield',
+                                    name: 'description',
+                                    fieldLabel: 'Description',
+                                    anchor: '100%'
+                                }
+                            ]
+                        }
+                    ],
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            ui: 'footer',
+                            dock: 'bottom',
+                            layout: {
+                                pack: 'center',
+                                type: 'hbox'
+                            },
+                            items: [
+                                {
+                                    xtype: 'button',
+                                    id: 'btnForm',
+                                    text: 'Insert'
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/app/view/uomsEditor.js b/interface/app/view/uomsEditor.js
new file mode 100755
index 0000000..c4862e1
--- /dev/null
+++ b/interface/app/view/uomsEditor.js
@@ -0,0 +1,131 @@
+Ext.define('istsos.view.uomsEditor', {
+    extend: 'istsos.view.ui.uomsEditor',
+
+    initComponent: function() {
+        var me = this;
+        var gs = Ext.create('istsos.store.gridUoms');
+        
+        me.callParent(arguments);
+        
+        
+        Ext.getCmp("btnNew").on("click",function(){
+            this.resetForm();
+            Ext.getCmp('frmUoms').show();
+        },this);
+                
+        Ext.getCmp("btnForm").on("click",function(){
+            var f = Ext.getCmp('frmUoms');
+            var btn = Ext.getCmp("btnForm");
+            if (f.getForm().isValid()) {
+                var jsonData = f.getValues();
+                if (btn.getText()=='New') {
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}/uoms', wa.url,this.istService),
+                        scope: this,
+                        method: "POST",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            Ext.getStore("griduoms").load();
+            Ext.getCmp('frmUoms').hide();
+                        }
+                    });
+                }else{
+                    Ext.Ajax.request({
+                        url: Ext.String.format('{0}/istsos/services/{1}/uoms/{2}', wa.url,this.istService,escape(Ext.getCmp('opName').originalValue)),
+                        scope: this,
+                        method: "PUT",
+                        jsonData: jsonData,
+                        success: function(response){
+                            this.resetForm();
+                            Ext.getStore("griduoms").load();
+            Ext.getCmp('frmUoms').hide();
+                        }
+                    });
+                }
+            }else{
+                Ext.MessageBox.show({
+                    title: 'Validation error',
+                    msg: "Filled data is invalid",
+                    buttons: Ext.MessageBox.OK,
+                    animateTarget: f
+                });
+                return;
+            }
+        },this);
+        
+        Ext.getCmp("gridop").columns[2].renderer = function (value, p, record) {
+            var ret = [];
+            for (var i = 0; i < value.length; i++) {
+                var s = Ext.String.format('<span class="softLink" onclick="alert(\'load editor for: '+value[i]+'\')">{0}</span>',value[i]);
+                ret.push(s);
+            }
+            return ret.join(", ")
+        };
+        
+        Ext.getCmp("gridop").on("select",function(rowmodel, record, index, eOpts ){
+            Ext.getCmp('frmUoms').loadRecord(record);
+            Ext.getCmp('btnForm').setText('Update');
+            Ext.getCmp('btnRemove').enable();
+            Ext.getCmp('frmUoms').show();
+        });
+        
+        
+        Ext.getCmp("btnRemove").on("click",function(){
+            var sm = Ext.getCmp("gridop").getSelectionModel();
+            var rec = sm.getSelection();
+            if (rec.length>0) {
+                Ext.Ajax.request({
+                    url: Ext.String.format('{0}/istsos/services/{1}/uoms/{2}', wa.url,this.istService,Ext.getCmp('opName').originalValue),
+                    scope: this,
+                    method: "DELETE",
+                    jsonData: {
+                        'name': rec[0].get('name'),
+                        'description': rec[0].get('description')
+                    },
+                    success: function(response){
+                        this.resetForm();
+                        Ext.getStore("griduoms").load();
+            Ext.getCmp('frmUoms').hide();
+                    }
+                });                
+            }
+        },this);
+        
+        //this.istService="sosmilan";
+        gs.getProxy().url=Ext.String.format('{0}/istsos/services/{1}/uoms',wa.url,this.istService);
+    },
+    operationLoad: function(){
+        Ext.getStore("griduoms").load();
+    },
+    resetForm: function(){
+        Ext.getCmp('frmUoms').loadRecord({
+            'data': { 
+                'name': '',
+                'description': ''
+            }
+        });
+        Ext.getCmp('opName').clearInvalid();
+        Ext.getCmp('btnForm').setText('New');
+        Ext.getCmp('btnRemove').disable();
+        Ext.getCmp("gridop").getSelectionModel().deselectAll();
+    }
+});
+
+
+function openUomsEditorWin(istService) {
+    var editor = Ext.create("istsos.view.uomsEditor",{
+        istService: istService
+    });
+    var win = Ext.create('Ext.window.Window', {
+        title: 'Units of measures - EDITOR',
+        height: 400,
+        width: 800,
+        layout: 'fit',
+        items: editor,
+        modal: true
+    });
+    win.show();
+    editor.operationLoad();
+    return win;
+}
diff --git a/interface/codemirror/LICENSE b/interface/codemirror/LICENSE
new file mode 100755
index 0000000..3916e96
--- /dev/null
+++ b/interface/codemirror/LICENSE
@@ -0,0 +1,23 @@
+Copyright (C) 2012 by Marijn Haverbeke <marijnh at gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Please note that some subdirectories of the CodeMirror distribution
+include their own LICENSE files, and are released under different
+licences.
diff --git a/interface/codemirror/README.md b/interface/codemirror/README.md
new file mode 100755
index 0000000..09e6760
--- /dev/null
+++ b/interface/codemirror/README.md
@@ -0,0 +1,6 @@
+# CodeMirror 2
+
+CodeMirror 2 is a rewrite of [CodeMirror
+1](http://github.com/marijnh/CodeMirror). The docs live
+[here](http://codemirror.net/doc/manual.html), and the project page is
+[http://codemirror.net/](http://codemirror.net/).
diff --git a/interface/codemirror/demo/activeline.html b/interface/codemirror/demo/activeline.html
new file mode 100755
index 0000000..a5b3c2c
--- /dev/null
+++ b/interface/codemirror/demo/activeline.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Active Line Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/xml/xml.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
+      .activeline {background: #e8f2ff !important;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Active Line Demo</h1>
+
+    <form><textarea id="code" name="code">
+<?xml version="1.0" encoding="UTF-8"?>
+<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"
+     xmlns:georss="http://www.georss.org/georss"
+     xmlns:twitter="http://api.twitter.com">
+  <channel>
+    <title>Twitter / codemirror</title>
+    <link>http://twitter.com/codemirror</link>
+    <atom:link type="application/rss+xml"
+               href="http://twitter.com/statuses/user_timeline/242283288.rss" rel="self"/>
+    <description>Twitter updates from CodeMirror / codemirror.</description>
+    <language>en-us</language>
+    <ttl>40</ttl>
+  <item>
+    <title>codemirror: http://cloud-ide.com — they're springing up like mushrooms. This one
+      uses CodeMirror as its editor.</title>
+    <description>codemirror: http://cloud-ide.com — they're springing up like mushrooms. This
+      one uses CodeMirror as its editor.</description>
+    <pubDate>Thu, 17 Mar 2011 23:34:47 +0000</pubDate>
+    <guid>http://twitter.com/codemirror/statuses/48527733722058752</guid>
+    <link>http://twitter.com/codemirror/statuses/48527733722058752</link>
+    <twitter:source>web</twitter:source>
+    <twitter:place/>
+  </item>
+  <item>
+    <title>codemirror: Posted a description of the CodeMirror 2 internals at
+      http://codemirror.net/2/internals.html</title>
+    <description>codemirror: Posted a description of the CodeMirror 2 internals at
+      http://codemirror.net/2/internals.html</description>
+    <pubDate>Wed, 02 Mar 2011 12:15:09 +0000</pubDate>
+    <guid>http://twitter.com/codemirror/statuses/42920879788789760</guid>
+    <link>http://twitter.com/codemirror/statuses/42920879788789760</link>
+    <twitter:source>web</twitter:source>
+    <twitter:place/>
+  </item>
+  </channel>
+</rss></textarea></form>
+
+    <script>
+var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+  mode: "application/xml",
+  lineNumbers: true,
+  lineWrapping: true,
+  onCursorActivity: function() {
+    editor.setLineClass(hlLine, null, null);
+    hlLine = editor.setLineClass(editor.getCursor().line, null, "activeline");
+  }
+});
+var hlLine = editor.setLineClass(0, "activeline");
+</script>
+
+    <p>Styling the current cursor line.</p>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/changemode.html b/interface/codemirror/demo/changemode.html
new file mode 100755
index 0000000..f5e0661
--- /dev/null
+++ b/interface/codemirror/demo/changemode.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Mode-Changing Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/javascript/javascript.js"></script>
+    <script src="../mode/scheme/scheme.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border: 1px solid black;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Mode-Changing demo</h1>
+
+    <form><textarea id="code" name="code">
+;; If there is Scheme code in here, the editor will be in Scheme mode.
+;; If you put in JS instead, it'll switch to JS mode.
+
+(define (double x)
+  (* x x))
+</textarea></form>
+
+<p>On changes to the content of the above editor, a (crude) script
+tries to auto-detect the language used, and switches the editor to
+either JavaScript or Scheme mode based on that.</p>
+
+<script>
+  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+    mode: "scheme",
+    lineNumbers: true,
+    matchBrackets: true,
+    tabMode: "indent",
+    onChange: function() {
+      clearTimeout(pending);
+      setTimeout(update, 400);
+    }
+  });
+  var pending;
+  function looksLikeScheme(code) {
+    return !/^\s*\(\s*function\b/.test(code) && /^\s*[;\(]/.test(code);
+  }
+  function update() {
+    editor.setOption("mode", looksLikeScheme(editor.getValue()) ? "scheme" : "javascript");
+  }
+</script>
+  </body>
+</html>
diff --git a/interface/codemirror/demo/closetag.html b/interface/codemirror/demo/closetag.html
new file mode 100755
index 0000000..57cd4be
--- /dev/null
+++ b/interface/codemirror/demo/closetag.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+	<head>
+		<title>CodeMirror: Close-Tag Demo</title>
+		<link rel="stylesheet" href="../lib/codemirror.css">
+		<script src="../lib/codemirror.js"></script>
+		<script src="../lib/util/closetag.js"></script>
+		<script src="../mode/xml/xml.js"></script>
+		<script src="../mode/javascript/javascript.js"></script>
+		<script src="../mode/css/css.js"></script>
+		<script src="../mode/htmlmixed/htmlmixed.js"></script>
+		<link rel="stylesheet" href="../doc/docs.css">
+		<style type="text/css">
+			.CodeMirror {border-top: 1px solid #eee; border-bottom: 1px solid #eee;}
+		</style>
+	</head>
+	<body>
+	
+		<h1>Close-Tag Demo</h1>
+		<ul>
+			<li>Type an html tag.  When you type '>' or '/', the tag will auto-close/complete.  Block-level tags will indent.</li>
+			<li>There are options for disabling tag closing or customizing the list of tags to indent.</li>
+			<li>Works with "text/html" (based on htmlmixed.js or xml.js) mode.</li>
+			<li>View source for key binding details.</li>
+		</p>
+
+		<form><textarea id="code" name="code"></textarea></form>
+
+		<script type="text/javascript">
+		var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+			mode: 'text/html',
+			
+			//closeTagEnabled: false, // Set this option to disable tag closing behavior without having to remove the key bindings.
+			//closeTagIndent: false, // Pass false or an array of tag names to override the default indentation behavior.
+			
+			extraKeys: {
+				"'>'": function(cm) { cm.closeTag(cm, '>'); },
+				"'/'": function(cm) { cm.closeTag(cm, '/'); }
+			},
+			
+			/*
+			// extraKeys is the easier way to go, but if you need native key event processing, this should work too.
+			onKeyEvent: function(cm, e) {
+				if (e.type == 'keydown') {
+					var c = e.keyCode || e.which;
+					if (c == 190 || c == 191) {
+						try {
+							cm.closeTag(cm, c == 190 ? '>' : '/');
+							e.stop();
+							return true;
+						} catch (e) {
+							if (e != CodeMirror.Pass) throw e;
+						}
+					}
+				}
+				return false;
+			},
+			*/
+			
+			wordWrap: true
+		});
+		</script>
+
+	</body>
+</html>
diff --git a/interface/codemirror/demo/complete.html b/interface/codemirror/demo/complete.html
new file mode 100755
index 0000000..95ae397
--- /dev/null
+++ b/interface/codemirror/demo/complete.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Autocomplete Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../lib/util/simple-hint.js"></script>
+    <link rel="stylesheet" href="../lib/util/simple-hint.css">
+    <script src="../lib/util/javascript-hint.js"></script>
+    <script src="../mode/javascript/javascript.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+    <style type="text/css">.CodeMirror {border: 1px solid #eee;} .CodeMirror-scroll { height: 100% }</style>
+  </head>
+  <body>
+    <h1>CodeMirror: Autocomplete demo</h1>
+
+    <form><textarea id="code" name="code">
+function getCompletions(token, context) {
+  var found = [], start = token.string;
+  function maybeAdd(str) {
+    if (str.indexOf(start) == 0) found.push(str);
+  }
+  function gatherCompletions(obj) {
+    if (typeof obj == "string") forEach(stringProps, maybeAdd);
+    else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
+    else if (obj instanceof Function) forEach(funcProps, maybeAdd);
+    for (var name in obj) maybeAdd(name);
+  }
+
+  if (context) {
+    // If this is a property, see if it belongs to some object we can
+    // find in the current environment.
+    var obj = context.pop(), base;
+    if (obj.className == "js-variable")
+      base = window[obj.string];
+    else if (obj.className == "js-string")
+      base = "";
+    else if (obj.className == "js-atom")
+      base = 1;
+    while (base != null && context.length)
+      base = base[context.pop().string];
+    if (base != null) gatherCompletions(base);
+  }
+  else {
+    // If not, just look in the window object and any local scope
+    // (reading into JS mode internals to get at the local variables)
+    for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
+    gatherCompletions(window);
+    forEach(keywords, maybeAdd);
+  }
+  return found;
+}
+</textarea></form>
+
+<p>Press <strong>ctrl-space</strong> to activate autocompletion. See
+the code (<a href="../lib/util/simple-hint.js">here</a>
+and <a href="../lib/util/javascript-hint.js">here</a>) to figure out
+how it works.</p>
+
+    <script>
+      CodeMirror.commands.autocomplete = function(cm) {
+        CodeMirror.simpleHint(cm, CodeMirror.javascriptHint);
+      }
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        extraKeys: {"Ctrl-Space": "autocomplete"}
+      });
+    </script>
+  </body>
+</html>
diff --git a/interface/codemirror/demo/emacs.html b/interface/codemirror/demo/emacs.html
new file mode 100755
index 0000000..87190c5
--- /dev/null
+++ b/interface/codemirror/demo/emacs.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Emacs bindings demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/clike/clike.js"></script>
+    <script src="../keymap/emacs.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border-top: 1px solid #eee; border-bottom: 1px solid #eee;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Emacs bindings demo</h1>
+
+    <form><textarea id="code" name="code">
+#include "syscalls.h"
+/* getchar:  simple buffered version */
+int getchar(void)
+{
+  static char buf[BUFSIZ];
+  static char *bufp = buf;
+  static int n = 0;
+  if (n == 0) {  /* buffer is empty */
+    n = read(0, buf, sizeof buf);
+    bufp = buf;
+  }
+  return (--n >= 0) ? (unsigned char) *bufp++ : EOF;
+}
+</textarea></form>
+
+<p>The emacs keybindings are enabled by
+including <a href="../keymap/emacs.js">keymap/emacs.js</a> and setting
+the <code>keyMap</code> option to <code>"emacs"</code>. Because
+CodeMirror's internal API is quite different from Emacs, they are only
+a loose approximation of actual emacs bindings, though.</p>
+
+<p>Also note that a lot of browsers disallow certain keys from being
+captured. For example, Chrome blocks both Ctrl-W and Ctrl-N, with the
+result that idiomatic use of Emacs keys will constantly close your tab
+or open a new window.</p>
+
+    <script>
+      CodeMirror.commands.save = function() {
+        var elt = editor.getWrapperElement();
+        elt.style.background = "#def";
+        setTimeout(function() { elt.style.background = ""; }, 300);
+      };
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        mode: "text/x-csrc",
+        keyMap: "emacs"
+      });
+    </script>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/folding.html b/interface/codemirror/demo/folding.html
new file mode 100755
index 0000000..2e05e9b
--- /dev/null
+++ b/interface/codemirror/demo/folding.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Code Folding Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../lib/util/foldcode.js"></script>
+    <script src="../mode/javascript/javascript.js"></script>
+    <script src="../mode/xml/xml.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
+      .CodeMirror-gutter {min-width: 2.6em; cursor: pointer;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Code Folding Demo</h1>
+
+    <p>Demonstration of code folding using the code
+    in <a href="../lib/util/foldcode.js"><code>foldcode.js</code></a>.
+    Press ctrl-q or click on the gutter to fold a block, again
+    to unfold.</p>
+    <form>
+      <div style="max-width: 50em; margin-bottom: 1em">JavaScript:<br><textarea id="code" name="code"></textarea></div>
+      <div style="max-width: 50em">HTML:<br><textarea id="code-html" name="code-html"></textarea></div>
+    </form>
+    <script id="script">
+window.onload = function() {
+  var te = document.getElementById("code");
+  var sc = document.getElementById("script");
+  te.value = (sc.textContent || sc.innerText || sc.innerHTML).replace(/^\s*/, "");
+  sc.innerHTML = "";
+  var te_html = document.getElementById("code-html");
+  te_html.value = "<html>\n  " + document.documentElement.innerHTML + "\n</html>";
+
+  var foldFunc = CodeMirror.newFoldFunction(CodeMirror.braceRangeFinder);
+  window.editor = CodeMirror.fromTextArea(te, {
+    mode: "javascript",
+    lineNumbers: true,
+    lineWrapping: true,
+    onGutterClick: foldFunc,
+    extraKeys: {"Ctrl-Q": function(cm){foldFunc(cm, cm.getCursor().line);}}
+  });
+  foldFunc(editor, 9);
+  foldFunc(editor, 20);
+
+  var foldFunc_html = CodeMirror.newFoldFunction(CodeMirror.tagRangeFinder);
+  window.editor_html = CodeMirror.fromTextArea(te_html, {
+    mode: "text/html",
+    lineNumbers: true,
+    lineWrapping: true,
+    onGutterClick: foldFunc_html,
+    extraKeys: {"Ctrl-Q": function(cm){foldFunc_html(cm, cm.getCursor().line);}}
+  })
+  foldFunc_html(editor_html, 1);
+  foldFunc_html(editor_html, 15);
+};
+</script>
+  </body>
+</html>
diff --git a/interface/codemirror/demo/formatting.html b/interface/codemirror/demo/formatting.html
new file mode 100755
index 0000000..e4faf5f
--- /dev/null
+++ b/interface/codemirror/demo/formatting.html
@@ -0,0 +1,80 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Formatting Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../lib/util/formatting.js"></script>
+    <script src="../mode/css/css.js"></script>
+    <script src="../mode/xml/xml.js"></script>
+    <script src="../mode/javascript/javascript.js"></script>
+    <script src="../mode/htmlmixed/htmlmixed.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {
+        border: 1px solid #eee;
+      }
+      td {
+        padding-right: 20px;
+      }
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Formatting demo</h1>
+
+    <form><textarea id="code" name="code"><script> function (s,e){ for(var i=0; i < 1; i++) test("test();a=1");} </script>
+<script>
+function test(c){  for (var i = 0; i < 10; i++){	          process("a.b();c = null;", 300);}
+}
+</script>
+<table><tr><td>test 1</td></tr><tr><td>test 2</td></tr></table>
+<script> function test() { return 1;} </script>
+<style> .test { font-size: medium; font-family: monospace; }
+</style></textarea></form>
+
+<p>Select a piece of code and click one of the links below to apply automatic formatting to the selected text or comment/uncomment the selected text. Note that the formatting behavior depends on the current block's mode.
+    <table>
+      <tr>
+        <td>
+          <a href="javascript:autoFormatSelection()">
+            Autoformat Selected
+          </a>
+        </td>
+        <td>
+          <a href="javascript:commentSelection(true)">
+            Comment Selected
+          </a>
+        </td>
+        <td>
+          <a href="javascript:commentSelection(false)">
+            Uncomment Selected
+          </a>
+        </td>
+      </tr>
+    </table>
+</p>    
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        mode: "htmlmixed"
+      });
+      CodeMirror.commands["selectAll"](editor);
+      
+      function getSelectedRange() {
+        return { from: editor.getCursor(true), to: editor.getCursor(false) };
+      }
+      
+      function autoFormatSelection() {
+        var range = getSelectedRange();
+        editor.autoFormatRange(range.from, range.to);
+      }
+      
+      function commentSelection(isComment) {
+        var range = getSelectedRange();
+        editor.commentRange(isComment, range.from, range.to);
+      }      
+    </script>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/fullscreen.html b/interface/codemirror/demo/fullscreen.html
new file mode 100755
index 0000000..0e2b5ec
--- /dev/null
+++ b/interface/codemirror/demo/fullscreen.html
@@ -0,0 +1,152 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Full Screen Editing</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <link rel="stylesheet" href="../theme/night.css">
+    <script src="../mode/xml/xml.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+        .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
+        .CodeMirror-fullscreen {
+            display: block;
+            position: absolute;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: 100%;
+            z-index: 9999;
+            margin: 0;
+            padding: 0;
+            border: 0px solid #BBBBBB;
+            opacity: 1;
+        }
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Full Screen Editing</h1>
+
+    <form><textarea id="code" name="code" rows="5">
+  <dt id="option_indentWithTabs"><code>indentWithTabs (boolean)</code></dt>
+  <dd>Whether, when indenting, the first N*8 spaces should be
+  replaced by N tabs. Default is false.</dd>
+
+  <dt id="option_tabMode"><code>tabMode (string)</code></dt>
+  <dd>Determines what happens when the user presses the tab key.
+  Must be one of the following:
+    <dl>
+      <dt><code>"classic" (the default)</code></dt>
+      <dd>When nothing is selected, insert a tab. Otherwise,
+      behave like the <code>"shift"</code> mode. (When shift is
+      held, this behaves like the <code>"indent"</code> mode.)</dd>
+      <dt><code>"shift"</code></dt>
+      <dd>Indent all selected lines by
+      one <a href="#option_indentUnit"><code>indentUnit</code></a>.
+      If shift was held while pressing tab, un-indent all selected
+      lines one unit.</dd>
+      <dt><code>"indent"</code></dt>
+      <dd>Indent the line the 'correctly', based on its syntactic
+      context. Only works if the
+      mode <a href="#indent">supports</a> it.</dd>
+      <dt><code>"default"</code></dt>
+      <dd>Do not capture tab presses, let the browser apply its
+      default behaviour (which usually means it skips to the next
+      control).</dd>
+    </dl></dd>
+
+  <dt id="option_enterMode"><code>enterMode (string)</code></dt>
+  <dd>Determines whether and how new lines are indented when the
+  enter key is pressed. The following modes are supported:
+    <dl>
+      <dt><code>"indent" (the default)</code></dt>
+      <dd>Use the mode's indentation rules to give the new line
+      the correct indentation.</dd>
+      <dt><code>"keep"</code></dt>
+      <dd>Indent the line the same as the previous line.</dd>
+      <dt><code>"flat"</code></dt>
+      <dd>Do not indent the new line.</dd>
+    </dl></dd>
+
+  <dt id="option_enterMode"><code>enterMode (string)</code></dt>
+  <dd>Determines whether and how new lines are indented when the
+  enter key is pressed. The following modes are supported:
+    <dl>
+      <dt><code>"indent" (the default)</code></dt>
+      <dd>Use the mode's indentation rules to give the new line
+      the correct indentation.</dd>
+      <dt><code>"keep"</code></dt>
+      <dd>Indent the line the same as the previous line.</dd>
+      <dt><code>"flat"</code></dt>
+      <dd>Do not indent the new line.</dd>
+    </dl></dd>
+
+  <dt id="option_enterMode"><code>enterMode (string)</code></dt>
+  <dd>Determines whether and how new lines are indented when the
+  enter key is pressed. The following modes are supported:
+    <dl>
+      <dt><code>"indent" (the default)</code></dt>
+      <dd>Use the mode's indentation rules to give the new line
+      the correct indentation.</dd>
+      <dt><code>"keep"</code></dt>
+      <dd>Indent the line the same as the previous line.</dd>
+      <dt><code>"flat"</code></dt>
+      <dd>Do not indent the new line.</dd>
+    </dl></dd>
+
+  <dt id="option_enterMode"><code>enterMode (string)</code></dt>
+  <dd>Determines whether and how new lines are indented when the
+  enter key is pressed. The following modes are supported:
+    <dl>
+      <dt><code>"indent" (the default)</code></dt>
+      <dd>Use the mode's indentation rules to give the new line
+      the correct indentation.</dd>
+      <dt><code>"keep"</code></dt>
+      <dd>Indent the line the same as the previous line.</dd>
+      <dt><code>"flat"</code></dt>
+      <dd>Do not indent the new line.</dd>
+    </dl></dd>
+
+</textarea></form>
+ <script>
+    var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        theme: "night",
+        extraKeys: {
+            "F11": function() {
+              var scroller = editor.getScrollerElement();
+              if (scroller.className.search(/\bCodeMirror-fullscreen\b/) === -1) {
+                scroller.className += " CodeMirror-fullscreen";
+                scroller.style.height = "100%";
+                scroller.style.width = "100%";
+                editor.refresh();
+              } else {
+                scroller.className = scroller.className.replace(" CodeMirror-fullscreen", "");
+                scroller.style.height = '';
+                scroller.style.width = '';
+                editor.refresh();
+              }
+            },
+            "Esc": function() {
+              var scroller = editor.getScrollerElement();
+              if (scroller.className.search(/\bCodeMirror-fullscreen\b/) !== -1) {
+                scroller.className = scroller.className.replace(" CodeMirror-fullscreen", "");
+                scroller.style.height = '';
+                scroller.style.width = '';
+                editor.refresh();
+              }
+            }
+        }
+    });
+
+</script>
+
+    <p>Press <strong>F11</strong> when cursor is in the editor to toggle full screen editing. <strong>Esc</strong> can also be used to <i>exit</i> full screen editing.</p>
+
+    <p><strong>Note:</strong> Does not currently work correctly in IE
+    6 and 7, where setting the height of something
+    to <code>100%</code> doesn't make it full screen.</p>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/loadmode.html b/interface/codemirror/demo/loadmode.html
new file mode 100755
index 0000000..3d7015e
--- /dev/null
+++ b/interface/codemirror/demo/loadmode.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Lazy Mode Loading Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../lib/util/loadmode.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Lazy Mode Loading</h1>
+
+    <form><textarea id="code" name="code">This is the editor.
+// It starts out in plain text mode,
+#  use the control below to load and apply a mode
+  "you'll see the highlighting of" this text /*change*/.
+</textarea></form>
+<p><input type=text value=javascript id=mode> <button type=button onclick="change()">change mode</button></p>
+
+    <script>
+CodeMirror.modeURL = "../mode/%N/%N.js";
+var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+  lineNumbers: true
+});
+var modeInput = document.getElementById("mode");
+CodeMirror.connect(modeInput, "keypress", function(e) {
+  if (e.keyCode == 13) change();
+});
+function change() {
+   editor.setOption("mode", modeInput.value);
+   CodeMirror.autoLoadMode(editor, modeInput.value);
+}
+</script>
+  </body>
+</html>
diff --git a/interface/codemirror/demo/marker.html b/interface/codemirror/demo/marker.html
new file mode 100755
index 0000000..00a89ce
--- /dev/null
+++ b/interface/codemirror/demo/marker.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Breakpoint Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/javascript/javascript.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror-gutter {
+        width: 3em;
+        background: white;
+      }
+      .CodeMirror {
+        border: 1px solid #aaa;
+      }
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Breakpoint demo</h1>
+
+    <form><textarea id="code" name="code">
+CodeMirror.fromTextArea(document.getElementById("code"), {
+  lineNumbers: true,
+  onGutterClick: function(cm, n) {
+    var info = cm.lineInfo(n);
+    if (info.markerText)
+      cm.clearMarker(n);
+    else
+      cm.setMarker(n, "<span style=\"color: #900\">●</span> %N%");
+  }
+});
+</textarea></form>
+
+<p>Click the line-number gutter to add or remove 'breakpoints'.</p>
+
+    <script>
+      CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        onGutterClick: function(cm, n) {
+          var info = cm.lineInfo(n);
+          if (info.markerText)
+            cm.clearMarker(n);
+          else
+            cm.setMarker(n, "<span style=\"color: #900\">●</span> %N%");
+        }
+      });
+    </script>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/matchhighlighter.html b/interface/codemirror/demo/matchhighlighter.html
new file mode 100755
index 0000000..768c51e
--- /dev/null
+++ b/interface/codemirror/demo/matchhighlighter.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Match Highlighter Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../lib/util/searchcursor.js"></script>
+    <script src="../lib/util/match-highlighter.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
+	  
+      span.CodeMirror-matchhighlight { background: #e9e9e9 }
+      .CodeMirror-focused span.CodeMirror-matchhighlight { background: #e7e4ff; !important }
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Match Highlighter Demo</h1>
+
+    <form><textarea id="code" name="code">Select this text: hardToSpotVar
+	And everywhere else in your code where hardToSpotVar appears will automatically illuminate.
+Give it a try!  No more hardToSpotVars.</textarea></form>
+
+    <script>
+var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+  lineNumbers : true,
+  onCursorActivity: function() {
+    editor.matchHighlight("CodeMirror-matchhighlight");
+  }
+});
+</script>
+
+    <p>Highlight matches of selected text on select</p>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/mustache.html b/interface/codemirror/demo/mustache.html
new file mode 100755
index 0000000..41bbd11
--- /dev/null
+++ b/interface/codemirror/demo/mustache.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Overlay Parser Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../lib/util/overlay.js"></script>
+    <script src="../mode/xml/xml.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border: 1px solid black;}
+      .cm-mustache {color: #0ca;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Overlay Parser Demo</h1>
+
+    <form><textarea id="code" name="code">
+<html>
+  <body>
+    <h1>{{title}}</h1>
+    <p>These are links to {{things}}:</p>
+    <ul>{{#links}}
+      <li><a href="{{url}}">{{text}}</a></li>
+    {{/links}}</ul>
+  </body>
+</html>
+</textarea></form>
+
+    <script>
+CodeMirror.defineMode("mustache", function(config, parserConfig) {
+  var mustacheOverlay = {
+    token: function(stream, state) {
+      var ch;
+      if (stream.match("{{")) {
+        while ((ch = stream.next()) != null)
+          if (ch == "}" && stream.next() == "}") break;
+        return "mustache";
+      }
+      while (stream.next() != null && !stream.match("{{", false)) {}
+      return null;
+    }
+  };
+  return CodeMirror.overlayParser(CodeMirror.getMode(config, parserConfig.backdrop || "text/html"), mustacheOverlay);
+});
+var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "mustache"});
+</script>
+
+    <p>Demonstration of a mode that parses HTML, highlighting
+    the <a href="http://mustache.github.com/">Mustache</a> templating
+    directives inside of it by using the code
+    in <a href="../lib/util/overlay.js"><code>overlay.js</code></a>. View
+    source to see the 15 lines of code needed to accomplish this.</p>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/preview.html b/interface/codemirror/demo/preview.html
new file mode 100755
index 0000000..607a621
--- /dev/null
+++ b/interface/codemirror/demo/preview.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: HTML5 preview</title>
+    <meta charset=utf-8>
+    <script src=../lib/codemirror.js></script>
+    <script src=../mode/xml/xml.js></script>
+    <script src=../mode/javascript/javascript.js></script>
+    <script src=../mode/css/css.js></script>
+    <script src=../mode/htmlmixed/htmlmixed.js></script>
+    <link rel=stylesheet href=../lib/codemirror.css>
+    <link rel=stylesheet href=../doc/docs.css>
+    <style type=text/css>
+      .CodeMirror {
+        float: left;
+        width: 50%;
+        border: 1px solid black;
+      }
+      iframe {
+        width: 49%;
+        float: left;
+        height: 300px;
+        border: 1px solid black;
+        border-left: 0px;
+      }
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: HTML5 preview</h1>
+    <textarea id=code name=code>
+<!doctype html>
+<html>
+  <head>
+    <meta charset=utf-8>
+    <title>HTML5 canvas demo</title>
+    <style>p {font-family: monospace;}</style>
+  </head>
+  <body>
+    <p>Canvas pane goes here:</p>
+    <canvas id=pane width=300 height=200></canvas>
+    <script>
+      var canvas = document.getElementById('pane');
+      var context = canvas.getContext('2d');
+
+      context.fillStyle = 'rgb(250,0,0)';
+      context.fillRect(10, 10, 55, 50);
+
+      context.fillStyle = 'rgba(0, 0, 250, 0.5)';
+      context.fillRect(30, 30, 55, 50);
+    </script>
+  </body>
+</html></textarea>
+    <iframe id=preview></iframe>
+    <script>
+      var delay;
+      // Initialize CodeMirror editor with a nice html5 canvas demo.
+      var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
+        mode: 'text/html',
+        tabMode: 'indent',
+        onChange: function() {
+          clearTimeout(delay);
+          delay = setTimeout(updatePreview, 300);
+        }
+      });
+      
+      function updatePreview() {
+        var previewFrame = document.getElementById('preview');
+        var preview =  previewFrame.contentDocument ||  previewFrame.contentWindow.document;
+        preview.open();
+        preview.write(editor.getValue());
+        preview.close();
+      }
+      setTimeout(updatePreview, 300);
+    </script>
+  </body>
+</html>
diff --git a/interface/codemirror/demo/resize.html b/interface/codemirror/demo/resize.html
new file mode 100755
index 0000000..221405e
--- /dev/null
+++ b/interface/codemirror/demo/resize.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Autoresize Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/css/css.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {
+        border: 1px solid #eee;
+      }
+      .CodeMirror-scroll {
+        height: auto;
+        overflow-y: hidden;
+        overflow-x: auto;
+        width: 100%;
+      }
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Autoresize demo</h1>
+
+    <form><textarea id="code" name="code">
+.CodeMirror-scroll {
+  height: auto;
+  overflow-y: hidden;
+  overflow-x: auto;
+  width: 100%
+}</textarea></form>
+
+<p>By setting a few CSS properties, CodeMirror can be made to
+automatically resize to fit its content.</p>
+
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true
+      });
+    </script>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/runmode.html b/interface/codemirror/demo/runmode.html
new file mode 100755
index 0000000..d6ee17e
--- /dev/null
+++ b/interface/codemirror/demo/runmode.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Mode Runner Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../lib/util/runmode.js"></script>
+    <script src="../mode/xml/xml.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+  </head>
+  <body>
+    <h1>CodeMirror: Mode Runner Demo</h1>
+
+    <textarea id="code" style="width: 90%; height: 7em; border: 1px solid black; padding: .2em .4em;">
+<foobar>
+  <blah>Enter your xml here and press the button below to display
+    it as highlighted by the CodeMirror XML mode</blah>
+  <tag2 foo="2" bar="&quot;bar&quot;"/>
+</foobar></textarea><br>
+    <button onclick="doHighlight();">Highlight!</button>
+    <pre id="output" class="cm-s-default"></pre>
+
+    <script>
+function doHighlight() {
+  CodeMirror.runMode(document.getElementById("code").value, "application/xml",
+                     document.getElementById("output"));
+}
+</script>
+
+    <p>Running a CodeMirror mode outside of the editor.
+    The <code>CodeMirror.runMode</code> function, defined
+    in <code><a href="../lib/util/runmode.js">lib/runmode.js</a></code> takes the following arguments:</p>
+
+    <dl>
+      <dt><code>text (string)</code></dt>
+      <dd>The document to run through the highlighter.</dd>
+      <dt><code>mode (<a href="../doc/manual.html#option_mode">mode spec</a>)</code></dt>
+      <dd>The mode to use (must be loaded as normal).</dd>
+      <dt><code>output (function or DOM node)</code></dt>
+      <dd>If this is a function, it will be called for each token with
+      two arguments, the token's text and the token's style class (may
+      be <code>null</code> for unstyled tokens). If it is a DOM node,
+      the tokens will be converted to <code>span</code> elements as in
+      an editor, and inserted into the node
+      (through <code>innerHTML</code>).</dd>
+    </dl>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/search.html b/interface/codemirror/demo/search.html
new file mode 100755
index 0000000..c385e6b
--- /dev/null
+++ b/interface/codemirror/demo/search.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Search/Replace Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/xml/xml.js"></script>
+    <script src="../lib/util/dialog.js"></script>
+    <link rel="stylesheet" href="../lib/util/dialog.css">
+    <script src="../lib/util/searchcursor.js"></script>
+    <script src="../lib/util/search.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
+      dt {font-family: monospace; color: #666;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Search/Replace Demo</h1>
+
+    <form><textarea id="code" name="code">
+  <dt id="option_indentWithTabs"><code>indentWithTabs (boolean)</code></dt>
+  <dd>Whether, when indenting, the first N*8 spaces should be
+  replaced by N tabs. Default is false.</dd>
+
+  <dt id="option_tabMode"><code>tabMode (string)</code></dt>
+  <dd>Determines what happens when the user presses the tab key.
+  Must be one of the following:
+    <dl>
+      <dt><code>"classic" (the default)</code></dt>
+      <dd>When nothing is selected, insert a tab. Otherwise,
+      behave like the <code>"shift"</code> mode. (When shift is
+      held, this behaves like the <code>"indent"</code> mode.)</dd>
+      <dt><code>"shift"</code></dt>
+      <dd>Indent all selected lines by
+      one <a href="#option_indentUnit"><code>indentUnit</code></a>.
+      If shift was held while pressing tab, un-indent all selected
+      lines one unit.</dd>
+      <dt><code>"indent"</code></dt>
+      <dd>Indent the line the 'correctly', based on its syntactic
+      context. Only works if the
+      mode <a href="#indent">supports</a> it.</dd>
+      <dt><code>"default"</code></dt>
+      <dd>Do not capture tab presses, let the browser apply its
+      default behaviour (which usually means it skips to the next
+      control).</dd>
+    </dl></dd>
+
+  <dt id="option_enterMode"><code>enterMode (string)</code></dt>
+  <dd>Determines whether and how new lines are indented when the
+  enter key is pressed. The following modes are supported:
+    <dl>
+      <dt><code>"indent" (the default)</code></dt>
+      <dd>Use the mode's indentation rules to give the new line
+      the correct indentation.</dd>
+      <dt><code>"keep"</code></dt>
+      <dd>Indent the line the same as the previous line.</dd>
+      <dt><code>"flat"</code></dt>
+      <dd>Do not indent the new line.</dd>
+    </dl></dd>
+</textarea></form>
+
+    <script>
+var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "text/html", lineNumbers: true});
+</script>
+
+    <p>Demonstration of primitive search/replace functionality. The
+    keybindings (which can be overridden by custom keymaps) are:</p>
+    <dl>
+      <dt>Ctrl-F / Cmd-F</dt><dd>Start searching</dd>
+      <dt>Ctrl-G / Cmd-G</dt><dd>Find next</dd>
+      <dt>Shift-Ctrl-G / Shift-Cmd-G</dt><dd>Find previous</dd>
+      <dt>Shift-Ctrl-F / Cmd-Option-F</dt><dd>Replace</dd>
+      <dt>Shift-Ctrl-R / Shift-Cmd-Option-F</dt><dd>Replace all</dd>
+    </dl>
+    <p>Searching is enabled by
+    including <a href="../lib/util/search.js">lib/util/search.js</a>.
+    For good-looking input dialogs, you also want to include
+    <a href="../lib/util/dialog.js">lib/util/dialog.js</a>
+    and <a href="../lib/util/dialog.css">lib/util/dialog.css</a>.</p>
+  </body>
+</html>
diff --git a/interface/codemirror/demo/theme.html b/interface/codemirror/demo/theme.html
new file mode 100755
index 0000000..6ce0940
--- /dev/null
+++ b/interface/codemirror/demo/theme.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Theme Demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <link rel="stylesheet" href="../theme/neat.css">
+    <link rel="stylesheet" href="../theme/elegant.css">
+    <link rel="stylesheet" href="../theme/erlang-dark.css">
+    <link rel="stylesheet" href="../theme/night.css">
+    <link rel="stylesheet" href="../theme/monokai.css">
+    <link rel="stylesheet" href="../theme/cobalt.css">
+    <link rel="stylesheet" href="../theme/eclipse.css">
+    <link rel="stylesheet" href="../theme/rubyblue.css">
+    <link rel="stylesheet" href="../theme/lesser-dark.css">
+    <link rel="stylesheet" href="../theme/xq-dark.css">
+    <link rel="stylesheet" href="../theme/ambiance.css">
+    <link rel="stylesheet" href="../theme/blackboard.css">
+    <script src="../mode/javascript/javascript.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border: 1px solid black;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Theme demo</h1>
+
+    <form><textarea id="code" name="code">
+function findSequence(goal) {
+  function find(start, history) {
+    if (start == goal)
+      return history;
+    else if (start > goal)
+      return null;
+    else
+      return find(start + 5, "(" + history + " + 5)") ||
+             find(start * 3, "(" + history + " * 3)");
+  }
+  return find(1, "1");
+}</textarea></form>
+
+<p>Select a theme: <select onchange="selectTheme()" id=select>
+    <option selected>default</option>
+    <option>ambiance</option>
+    <option>blackboard</option>
+    <option>cobalt</option>
+    <option>eclipse</option>
+    <option>elegant</option>
+    <option>erlang-dark</option>
+    <option>lesser-dark</option>
+    <option>monokai</option>
+    <option>neat</option>
+    <option>night</option>
+    <option>rubyblue</option>
+    <option>xq-dark</option>
+</select>
+</p>
+
+<script>
+  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+    lineNumbers: true
+  });
+  var input = document.getElementById("select");
+  function selectTheme() {
+    var theme = input.options[input.selectedIndex].innerHTML;
+    editor.setOption("theme", theme);
+  }
+  var choice = document.location.search && document.location.search.slice(1);
+  if (choice) {
+    input.value = choice;
+    editor.setOption("theme", choice);
+  }
+</script>
+  </body>
+</html>
diff --git a/interface/codemirror/demo/vim.html b/interface/codemirror/demo/vim.html
new file mode 100755
index 0000000..76ad6da
--- /dev/null
+++ b/interface/codemirror/demo/vim.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Vim bindings demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/clike/clike.js"></script>
+    <script src="../keymap/vim.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border-top: 1px solid #eee; border-bottom: 1px solid #eee;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Vim bindings demo</h1>
+
+    <form><textarea id="code" name="code">
+#include "syscalls.h"
+/* getchar:  simple buffered version */
+int getchar(void)
+{
+  static char buf[BUFSIZ];
+  static char *bufp = buf;
+  static int n = 0;
+  if (n == 0) {  /* buffer is empty */
+    n = read(0, buf, sizeof buf);
+    bufp = buf;
+  }
+  return (--n >= 0) ? (unsigned char) *bufp++ : EOF;
+}
+</textarea></form>
+
+<p>The vim keybindings are enabled by
+including <a href="../keymap/vim.js">keymap/vim.js</a> and setting
+the <code>keyMap</code> option to <code>"vim"</code>. Because
+CodeMirror's internal API is quite different from Vim, they are only
+a loose approximation of actual vim bindings, though.</p>
+
+    <script>
+      CodeMirror.commands.save = function(){ alert("Saving"); };
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        mode: "text/x-csrc",
+        keyMap: "vim"
+      });
+    </script>
+
+  </body>
+</html>
diff --git a/interface/codemirror/demo/visibletabs.html b/interface/codemirror/demo/visibletabs.html
new file mode 100755
index 0000000..96d1ea5
--- /dev/null
+++ b/interface/codemirror/demo/visibletabs.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Visible tabs demo</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/clike/clike.js"></script>
+    <link rel="stylesheet" href="../doc/docs.css">
+
+    <style type="text/css">
+      .CodeMirror {border-top: 1px solid #eee; border-bottom: 1px solid #eee;}
+      .cm-tab:after {
+        content: "\21e5";
+        display: -moz-inline-block;
+        display: -webkit-inline-block;
+        display: inline-block;
+        width: 0px;
+        position: relative;
+        overflow: visible;
+        left: -1.4em;
+        color: #aaa;
+      }
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Visible tabs demo</h1>
+
+    <form><textarea id="code" name="code">
+#include "syscalls.h"
+/* getchar:  simple buffered version */
+int getchar(void)
+{
+	static char buf[BUFSIZ];
+	static char *bufp = buf;
+	static int n = 0;
+	if (n == 0) {  /* buffer is empty */
+		n = read(0, buf, sizeof buf);
+		bufp = buf;
+	}
+	return (--n >= 0) ? (unsigned char) *bufp++ : EOF;
+}
+</textarea></form>
+
+<p>Tabs inside the editor are spans with the
+class <code>cm-tab</code>, and can be styled. This demo uses
+an <code>:after</code> pseudo-class CSS hack that will not work on old
+browsers. You can use a more conservative technique like a background
+image as an alternative.</p>
+
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        tabSize: 4,
+        indentUnit: 4,
+        indentWithTabs: true,
+        mode: "text/x-csrc"
+      });
+    </script>
+
+  </body>
+</html>
diff --git a/interface/codemirror/doc/baboon.png b/interface/codemirror/doc/baboon.png
new file mode 100755
index 0000000..55d97f7
Binary files /dev/null and b/interface/codemirror/doc/baboon.png differ
diff --git a/interface/codemirror/doc/baboon_vector.svg b/interface/codemirror/doc/baboon_vector.svg
new file mode 100755
index 0000000..dc1667a
--- /dev/null
+++ b/interface/codemirror/doc/baboon_vector.svg
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg3181"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   width="1750"
+   height="960"
+   xml:space="preserve"
+   sodipodi:docname="baboon_vector.svg"><metadata
+     id="metadata3187"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs3185"><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3195"><path
+         d="M 0,768 1400,768 1400,0 0,0 0,768 z"
+         id="path3197" /></clipPath><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3215"><path
+         d="M 0,768 1400,768 1400,0 0,0 0,768 z"
+         id="path3217" /></clipPath></defs><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1440"
+     inkscape:window-height="851"
+     id="namedview3183"
+     showgrid="false"
+     inkscape:zoom="0.20550291"
+     inkscape:cx="1534.1667"
+     inkscape:cy="795.78156"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g3189" /><g
+     id="g3189"
+     inkscape:groupmode="layer"
+     inkscape:label="baboon_vector"
+     transform="matrix(1.25,0,0,-1.25,0,960)"><g
+       id="g3191"><g
+         id="g3193"
+         clip-path="url(#clipPath3195)"><g
+           id="g3199"
+           transform="translate(458.9561,569.9678)"><path
+             d="m 0,0 59.835,69.355 87.034,26.518 133.949,-7.479 c 0,0 74.116,-32.639 74.795,-34.678 0.68,-2.04 84.314,-59.155 84.314,-59.155 l 12.238,-74.795 5.439,-97.912 -13.598,-25.159 -4.76,-40.797 -18.358,-23.118 24.39,-5.561 0.501,-5.192 -14.012,-60.641 16.477,-93.368 7.223,-49.972 -208.295,-51.754 -18.552,4.005 -37.468,8.325 -10.036,4.036 -66.885,10.101 c 0,0 -14.959,74.793 -16.999,73.433 -2.039,-1.359 -42.836,56.437 -42.836,56.437 l -19.719,65.274 12.48,74.571 -7.961,9.643 -26.4 [...]
+             style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path3201" /></g><g
+           id="g3203"
+           transform="translate(78.8657,682.1582)"><path
+             d="M 0,0 142.789,40.797 259.74,52.355 313.457,-232.543 204.665,-291.698 78.194,-293.738 0,0 z"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path3205" /></g><g
+           id="g3207"
+           transform="translate(269.5122,345.2344)"><path
+             d="M 0,0 18.801,-74.425 40.728,-85.408 59.539,-59.541 40.259,13.503 36.821,15.669 0,0 z"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path3209" /></g></g></g><g
+       id="g3223"
+       transform="translate(741.918,109.0332)"><path
+         d="m 0,0 -17.236,-9.401 -16.452,-22.721 -0.783,12.537 6.268,17.234 13.317,6.268 L 0,7.833 14.884,3.917 0,0 z m 172.622,-21.824 c -0.031,0.271 -0.081,0.535 -0.117,0.804 -20.85,7.653 -49.59,7.327 -66.874,10.927 -13.849,2.886 -23.047,9.119 -27.032,12.298 -9.863,-8.494 -12.025,-14.377 -12.025,-14.377 0,0 -9.816,15.309 -30.17,25.76 -7.05,3.621 -17.767,5.691 -29.341,5.691 -24.297,0 -52.384,-9.155 -58.339,-32.223 -10.458,-40.511 9.697,-76.594 49.814,-77.623 1.325,-0.034 2.623,-0.12 3.8 [...]
+         style="fill:#df0019;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="path3225"
+         inkscape:connector-curvature="0" /></g><g
+       id="g3227"
+       transform="translate(300.8481,270.0254)"><path
+         d="m 0,0 c -3.063,-0.691 -12.535,0.784 -12.535,0.784 l 6.267,-25.853 43.481,13.319 -9.01,27.418 C 28.203,15.668 7.867,1.777 0,0"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="path3229"
+         inkscape:connector-curvature="0" /></g><g
+       id="g3231"
+       transform="translate(211.66052,615.85984)"><path
+         d="m 0,0 -16.243,-2.871 -15.462,-9.4 4.323,-10.938 14.568,9.89 L 2.75,-8.771 0,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="path3233"
+         inkscape:connector-curvature="0" /></g><g
+       id="g3235"
+       transform="translate(274.15732,626.4084)"><path
+         d="m 0,0 -15.64,0.407 -14.279,-3.608 2.008,-9.747 14.756,4.208 L 1.111,-8.215 0,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="path3237"
+         inkscape:connector-curvature="0" /></g><path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 436.65625 22.28125 C 436.65625 22.28125 338.18375 25.385 251 42.8125 C 163.24875 60.35375 70.40625 99.65625 70.40625 99.65625 L 175.1875 495.28125 L 327.96875 492.34375 L 337.75 527.59375 C 337.75 527.59375 365.095 523.25875 373 518.78125 C 376.31375 516.90375 383.78125 508 383.78125 508 L 377.75 484.65625 L 504.21875 407.15625 L 436.65625 22.28125 z M 410.53125 55.1875 L 465.6875 393.3125 L 346.59375 456.625 L 202.75 466.46875 L 112 114.40625 L 263 79.1875 L 410.53125 55.1875 z "
+       transform="matrix(0.8,0,0,-0.8,0,768)"
+       id="path3253" /><g
+       id="g3247"
+       transform="matrix(1.199238,-0.02879331,0.02673084,1.0520756,172.41935,498.37339)"><path
+         d="m 0,0 c 0,0 -1.861,1.481 -9.143,-1.457 9.712,18.867 9.439,39.989 9.439,39.989 0,0 -3.106,-2.465 -11.311,-8.47 9.241,23.044 5.338,72.525 5.338,72.525 0,0 -17.493,40.746 -13.657,45.799 8.841,11.65 23.834,23.968 44.295,25.594 17.935,1.424 44.606,-4.953 55.865,-15.284 4.536,-4.161 23.367,-47.493 23.367,-47.493 0,0 6.104,-35.271 11.619,-54.108 5.513,-18.839 11.054,-26.674 21.284,-34.825 17.831,-14.207 27.076,-29.938 27.076,-29.938 L 143.399,3.945 c 3.655,-17.356 14.875,-34.28 27.3 [...]
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="path3249"
+         inkscape:connector-curvature="0" /></g><g
+       id="g3255"
+       transform="translate(204.22134,580.88353)"><path
+         d="m 0,0 c 0,-1.418 0.43,-2.736 1.168,-3.83 1.523,0.677 3.551,1.094 5.786,1.094 2.164,0 4.133,-0.39 5.639,-1.029 0.711,1.081 1.129,2.374 1.129,3.765 0,3.79 -3.072,6.861 -6.861,6.861 C 3.071,6.861 0,3.79 0,0"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="path3257"
+         inkscape:connector-curvature="0" /></g><g
+       id="g3259"
+       transform="translate(256.3311,595.31646)"><path
+         d="m 0,0 c 0,-1.418 0.43,-2.736 1.168,-3.83 1.524,0.677 3.552,1.094 5.787,1.094 2.163,0 4.132,-0.39 5.638,-1.029 0.712,1.081 1.129,2.373 1.129,3.765 0,3.79 -3.072,6.861 -6.861,6.861 C 3.071,6.861 0,3.79 0,0"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="path3261"
+         inkscape:connector-curvature="0" /></g><g
+       id="g4174"
+       transform="matrix(0.99694509,0.07810563,-0.07810563,0.99694509,47.348748,-15.348299)"><g
+         transform="translate(222.5098,610.1558)"
+         id="g3219"><path
+           inkscape:connector-curvature="0"
+           id="path3221"
+           style="fill:#df0019;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="m 0,0 4.45,2.752 5.34,3.785 7.05,-8.226 7.093,-33.359 17.801,-51.259 13.86,-30.215 26.261,-1.55 -6.685,-35.653 c 0,0 -49.98,-21.871 -49.545,-21.911 -42.657,4.001 -12.553,43.066 -8.631,47.301 L 3.666,-47.869 0,0 z" /></g><g
+         transform="translate(247.626,467.3545)"
+         id="g3239"><path
+           inkscape:connector-curvature="0"
+           id="path3241"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="M 0,0 C -3.044,-0.345 -5.232,-3.092 -4.888,-6.136 -4.543,-9.18 1.576,-2.254 13.308,-4.961 13.971,-1.97 3.044,0.344 0,0" /></g><g
+         transform="translate(279.4419,476.5762)"
+         id="g3243"><path
+           inkscape:connector-curvature="0"
+           id="path3245"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="M 0,0 C 3.271,1.08 6.798,-0.697 7.88,-3.969 8.96,-7.24 -0.55,-3.044 -11.258,-11.329 -13.345,-8.586 -3.272,-1.081 0,0" /></g><g
+         transform="translate(284.1929,525.9082)"
+         id="g3263"><path
+           inkscape:connector-curvature="0"
+           id="path3265"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="M 0,0 C 0,0 -6.972,28.671 -6.972,29.355 L 1.585,2.864 9.999,-10.564 13.634,-32.697 7.922,-11.098 0,0 z M -0.633,-15.036 -9.19,-4.86 -16.478,25.776 c -0.202,0.684 9.106,-28.811 9.106,-28.811 l 8.64,-11.642 2.469,-17.336 -4.37,16.977 z m -6.339,-6.085 -10.457,16.826 -5.444,28.646 6.614,-27.842 11.311,-18.026 1.413,-9.583 -3.437,9.979 z m -53.462,-13.246 -1.437,24.944 -2.682,28.754 5.106,-29.895 1.212,-21.677 4.139,-18.236 -6.338,16.11 z m -4.265,-19.55 -6.665,15.516 0.404,29. [...]
+       id="g3267"
+       transform="translate(847.2637,321.5059)"><path
+         d="m 0,0 c 2.252,3.516 6.693,15.3 6.693,15.3 0,0 3.778,-13.306 1.912,-17.213 -3.056,-6.404 -23.905,-15.3 -23.905,-15.3 0,0 12.196,12.364 15.3,17.213 m -33.514,23.16 -0.757,56.352 c 0,0 11.136,-14.028 11.843,-19.739 1.176,-9.491 -11.086,-36.613 -11.086,-36.613 m -17.575,236.921 c 0,0 12.453,-15.338 14.854,-21.39 1.424,-3.591 2.286,-15.287 2.286,-15.287 l -17.14,36.677 z M -98.574,-86.136 c -9.757,-0.906 -29.836,1.016 -38.912,4.708 -7.499,3.05 -25.734,19.656 -25.734,19.656 l 24.18 [...]
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="path3269"
+         inkscape:connector-curvature="0" /></g><path
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 329.26398,723.3082 -118.025,-19.2 -120.800003,-28.175 72.600003,-281.65 115.075,7.875 95.275,50.65 -44.125,270.5 z m -6.55,-10.575 40.675,-252.4 -87.85,-47.275 -106.125,-7.325 -66.95,262.8 111.4,26.275 108.85,17.925 z"
+       id="path3253-3" /></g></svg>
\ No newline at end of file
diff --git a/interface/codemirror/doc/compress.html b/interface/codemirror/doc/compress.html
new file mode 100755
index 0000000..c386ceb
--- /dev/null
+++ b/interface/codemirror/doc/compress.html
@@ -0,0 +1,146 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Compression Helper</title>
+    <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans:bold"/>
+    <link rel="stylesheet" type="text/css" href="docs.css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+  </head>
+  <body>
+
+<h1><span class="logo-braces">{ }</span> <a href="http://codemirror.net/">CodeMirror</a></h1>
+
+<pre class="grey">
+<img src="baboon.png" class="logo" alt="logo"/>/* Script compression
+   helper */
+</pre>
+
+    <p>To optimize loading CodeMirror, especially when including a
+    bunch of different modes, it is recommended that you combine and
+    minify (and preferably also gzip) the scripts. This page makes
+    those first two steps very easy. Simply select the version and
+    scripts you need in the form below, and
+    click <strong>Compress</strong> to download the minified script
+    file.</p>
+
+    <form id="form" action="http://marijnhaverbeke.nl/uglifyjs" method="post">
+      <input type="hidden" id="download" name="download" value="codemirror-compressed.js"/>
+      <p>Version: <select id="version" onchange="setVersion(this);" style="padding: 1px">
+        <option value="http://codemirror.net/">HEAD</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.24;f=">2.24</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.23;f=">2.23</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.22;f=">2.22</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.21;f=">2.21</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.2;f=">2.2</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.18;f=">2.18</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.16;f=">2.16</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.15;f=">2.15</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.13;f=">2.13</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.12;f=">2.12</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.11;f=">2.11</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.1;f=">2.1</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.02;f=">2.02</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.01;f=">2.01</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=v2.0;f=">2.0</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=beta2;f=">beta2</option>
+        <option value="http://marijnhaverbeke.nl/git/codemirror2?a=blob_plain;hb=beta1;f=">beta1</option>
+      </select></p>
+
+      <select multiple="multiple" size="20" name="code_url" style="width: 40em;" class="field" id="files">
+        <optgroup label="CodeMirror Library">
+          <option value="http://codemirror.net/lib/codemirror.js" selected>codemirror.js</option>
+        </optgroup>
+        <optgroup label="Modes">
+          <option value="http://codemirror.net/mode/clike/clike.js">clike.js</option>
+          <option value="http://codemirror.net/mode/clojure/clojure.js">clojure.js</option>
+          <option value="http://codemirror.net/mode/coffeescript/coffeescript.js">coffeescript.js</option>
+          <option value="http://codemirror.net/mode/css/css.js">css.js</option>
+          <option value="http://codemirror.net/mode/diff/diff.js">diff.js</option>
+          <option value="http://codemirror.net/mode/ecl/ecl.js">ecl.js</option>
+          <option value="http://codemirror.net/mode/erlang/erlang.js">erlang.js</option>
+          <option value="http://codemirror.net/mode/gfm/gfm.js">gfm.js</option>
+          <option value="http://codemirror.net/mode/go/go.js">go.js</option>
+          <option value="http://codemirror.net/mode/groovy/groovy.js">groovy.js</option>
+          <option value="http://codemirror.net/mode/haskell/haskell.js">haskell.js</option>
+          <option value="http://codemirror.net/mode/htmlembedded/htmlembedded.js">htmlembedded.js</option>
+          <option value="http://codemirror.net/mode/htmlmixed/htmlmixed.js">htmlmixed.js</option>
+          <option value="http://codemirror.net/mode/javascript/javascript.js">javascript.js</option>
+          <option value="http://codemirror.net/mode/jinja2/jinja2.js">jinja2.js</option>
+          <option value="http://codemirror.net/mode/less/less.js">less.js</option>
+          <option value="http://codemirror.net/mode/lua/lua.js">lua.js</option>
+          <option value="http://codemirror.net/mode/markdown/markdown.js">markdown.js</option>
+          <option value="http://codemirror.net/mode/mysql/mysql.js">mysql.js</option>
+          <option value="http://codemirror.net/mode/ntriples/ntriples.js">ntriples.js</option>
+          <option value="http://codemirror.net/mode/pascal/pascal.js">pascal.js</option>
+          <option value="http://codemirror.net/mode/perl/perl.js">perl.js</option>
+          <option value="http://codemirror.net/mode/php/php.js">php.js</option>
+          <option value="http://codemirror.net/mode/pig/pig.js">pig.js</option>
+          <option value="http://codemirror.net/mode/plsql/plsql.js">plsql.js</option>
+          <option value="http://codemirror.net/mode/properties/properties.js">properties.js</option>
+          <option value="http://codemirror.net/mode/python/python.js">python.js</option>
+          <option value="http://codemirror.net/mode/r/r.js">r.js</option>
+          <option value="http://codemirror.net/mode/rpm/changes/changes.js">rpm/changes.js</option>
+          <option value="http://codemirror.net/mode/rpm/spec/spec.js">rpm/spec.js</option>
+          <option value="http://codemirror.net/mode/rst/rst.js">rst.js</option>
+          <option value="http://codemirror.net/mode/ruby/ruby.js">ruby.js</option>
+          <option value="http://codemirror.net/mode/rust/rust.js">rust.js</option>
+          <option value="http://codemirror.net/mode/scheme/scheme.js">scheme.js</option>
+          <option value="http://codemirror.net/mode/shell/shell.js">shell.js</option>
+          <option value="http://codemirror.net/mode/smalltalk/smalltalk.js">smalltalk.js</option>
+          <option value="http://codemirror.net/mode/smarty/smarty.js">smarty.js</option>
+          <option value="http://codemirror.net/mode/sparql/sparql.js">sparql.js</option>
+          <option value="http://codemirror.net/mode/stex/stex.js">stex.js</option>
+          <option value="http://codemirror.net/mode/tiddlywiki/tiddlywiki.js">tiddlywiki.js</option>
+          <option value="http://codemirror.net/mode/tiki/tiki.js">tiki.js</option>
+          <option value="http://codemirror.net/mode/vbscript/vbscript.js">vbscript.js</option>
+          <option value="http://codemirror.net/mode/velocity/velocity.js">velocity.js</option>
+          <option value="http://codemirror.net/mode/verilog/verilog.js">verilog.js</option>
+          <option value="http://codemirror.net/mode/xml/xml.js">xml.js</option>
+          <option value="http://codemirror.net/mode/xquery/xquery.js">xquery.js</option>
+          <option value="http://codemirror.net/mode/yaml/yaml.js">yaml.js</option>
+        </optgroup>
+        <optgroup label="Utilities and add-ons">
+          <option value="http://codemirror.net/lib/util/overlay.js">overlay.js</option>
+          <option value="http://codemirror.net/lib/util/runmode.js">runmode.js</option>
+          <option value="http://codemirror.net/lib/util/simple-hint.js">simple-hint.js</option>
+          <option value="http://codemirror.net/lib/util/javascript-hint.js">javascript-hint.js</option>
+          <option value="http://codemirror.net/lib/util/foldcode.js">foldcode.js</option>
+          <option value="http://codemirror.net/lib/util/dialog.js">dialog.js</option>
+          <option value="http://codemirror.net/lib/util/search.js">search.js</option>
+          <option value="http://codemirror.net/lib/util/searchcursor.js">searchcursor.js</option>
+          <option value="http://codemirror.net/lib/util/formatting.js">formatting.js</option>
+          <option value="http://codemirror.net/lib/util/match-highlighter.js">match-highlighter.js</option>
+          <option value="http://codemirror.net/lib/util/closetag.js">closetag.js</option>
+          <option value="http://codemirror.net/lib/util/loadmode.js">loadmode.js</option>
+        </optgroup>
+        <optgroup label="Keymaps">
+          <option value="http://codemirror.net/keymap/emacs.js">emacs.js</option>
+          <option value="http://codemirror.net/keymap/vim.js">vim.js</option>
+        </optgroup>
+      </select></p>
+
+      <p>
+        <button type="submit">Compress</button> with <a href="http://github.com/mishoo/UglifyJS/">UglifyJS</a>
+      </p>
+
+      <p>Custom code to add to the compressed file:<textarea name="js_code" style="width: 100%; height: 15em;" class="field"></textarea></p>
+    </form>
+
+    <script type="text/javascript">
+      function setVersion(ver) {
+        var urlprefix = ver.options[ver.selectedIndex].value;
+        var select = document.getElementById("files"), m;
+        for (var optgr = select.firstChild; optgr; optgr = optgr.nextSibling)
+          for (var opt = optgr.firstChild; opt; opt = opt.nextSibling) {
+            if (opt.nodeName != "OPTION")
+              continue;
+            else if (m = opt.value.match(/^http:\/\/codemirror.net\/(.*)$/))
+              opt.value = urlprefix + m[1];
+            else if (m = opt.value.match(/http:\/\/marijnhaverbeke.nl\/git\/codemirror2\?a=blob_plain;hb=[^;]+;f=(.*)$/))
+              opt.value = urlprefix + m[1];
+          }
+       }
+    </script>
+
+  </body>
+</html>
diff --git a/interface/codemirror/doc/docs.css b/interface/codemirror/doc/docs.css
new file mode 100755
index 0000000..9ea1866
--- /dev/null
+++ b/interface/codemirror/doc/docs.css
@@ -0,0 +1,154 @@
+body {
+  font-family: Droid Sans, Arial, sans-serif;
+  line-height: 1.5;
+  max-width: 64.3em;
+  margin: 3em auto;
+  padding: 0 1em;
+}
+
+h1 {
+  letter-spacing: -3px;
+  font-size: 3.23em;
+  font-weight: bold;
+  margin: 0;
+}
+
+h2 {
+  font-size: 1.23em;
+  font-weight: bold;
+  margin: .5em 0;
+  letter-spacing: -1px;
+}
+
+h3 {
+  font-size: 1em;
+  font-weight: bold;
+  margin: .4em 0;
+}
+
+pre {
+  background-color: #eee;
+  -moz-border-radius: 6px;
+  -webkit-border-radius: 6px;
+  border-radius: 6px;
+  padding: 1em;
+}
+
+pre.code {
+  margin: 0 1em;
+}
+
+.grey {
+  font-size: 2.2em;
+  padding: .5em 1em;
+  line-height: 1.2em;
+  margin-top: .5em;
+  position: relative;
+}
+
+img.logo {
+  position: absolute;
+  right: -25px;
+  bottom: 4px;
+}
+
+a:link, a:visited, .quasilink {
+  color: #df0019;
+  cursor: pointer;
+  text-decoration: none;
+}
+
+a:hover, .quasilink:hover {
+  color: #800004;
+}
+
+h1 a:link, h1 a:visited, h1 a:hover {
+  color: black;
+}
+
+ul {
+  margin: 0;
+  padding-left: 1.2em;
+}
+
+a.download {
+  color: white;
+  background-color: #df0019;
+  width: 100%;
+  display: block;
+  text-align: center;
+  font-size: 1.23em;
+  font-weight: bold;
+  text-decoration: none;
+  -moz-border-radius: 6px;
+  -webkit-border-radius: 6px;
+  border-radius: 6px;
+  padding: .5em 0;
+  margin-bottom: 1em;
+}
+
+a.download:hover {
+  background-color: #bb0010;
+}
+
+.rel {
+  margin-bottom: 0;
+}
+
+.rel-note {
+  color: #777;
+  font-size: .9em;
+  margin-top: .1em;
+}
+
+.logo-braces {
+  color: #df0019;
+  position: relative;
+  top: -4px;
+}
+
+.blk {
+  float: left;
+}
+
+.left {
+  width: 37em;
+  padding-right: 6.53em;
+  padding-bottom: 1em;
+}
+
+.left1 {
+  width: 15.24em;
+  padding-right: 6.45em;
+}
+
+.left2 {
+  width: 15.24em;
+}
+
+.right {
+  width: 20.68em;
+}
+
+.leftbig {
+  width: 42.44em;
+  padding-right: 6.53em;
+}
+
+.rightsmall {
+  width: 15.24em;
+}
+
+.clear:after {
+  visibility: hidden;
+  display: block;
+  font-size: 0;
+  content: " ";
+  clear: both;
+  height: 0;
+}
+.clear { display: inline-block; }
+/* start commented backslash hack \*/
+* html .clear { height: 1%; }
+.clear { display: block; }
+/* close commented backslash hack */
diff --git a/interface/codemirror/doc/internals.html b/interface/codemirror/doc/internals.html
new file mode 100755
index 0000000..338c9bb
--- /dev/null
+++ b/interface/codemirror/doc/internals.html
@@ -0,0 +1,494 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Internals</title>
+    <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans:bold"/>
+    <link rel="stylesheet" type="text/css" href="docs.css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <style>dl dl {margin: 0;} .update {color: #d40 !important}</style>
+  </head>
+  <body>
+
+<h1><span class="logo-braces">{ }</span> <a href="http://codemirror.net/">CodeMirror</a></h1>
+
+<pre class="grey">
+<img src="baboon.png" class="logo" alt="logo"/>/* (Re-) Implementing A Syntax-
+   Highlighting Editor in JavaScript */
+</pre>
+
+<div class="clear"><div class="leftbig blk">
+
+<p style="font-size: 85%" id="intro">
+  <strong>Topic:</strong> JavaScript, code editor implementation<br>
+  <strong>Author:</strong> Marijn Haverbeke<br>
+  <strong>Date:</strong> March 2nd 2011 (updated November 13th 2011)
+</p>
+
+<p>This is a followup to
+my <a href="http://codemirror.net/story.html">Brutal Odyssey to the
+Dark Side of the DOM Tree</a> story. That one describes the
+mind-bending process of implementing (what would become) CodeMirror 1.
+This one describes the internals of CodeMirror 2, a complete rewrite
+and rethink of the old code base. I wanted to give this piece another
+Hunter Thompson copycat subtitle, but somehow that would be out of
+place—the process this time around was one of straightforward
+engineering, requiring no serious mind-bending whatsoever.</p>
+
+<p>So, what is wrong with CodeMirror 1? I'd estimate, by mailing list
+activity and general search-engine presence, that it has been
+integrated into about a thousand systems by now. The most prominent
+one, since a few weeks,
+being <a href="http://googlecode.blogspot.com/2011/01/make-quick-fixes-quicker-on-google.html">Google
+code's project hosting</a>. It works, and it's being used widely.</a>
+
+<p>Still, I did not start replacing it because I was bored. CodeMirror
+1 was heavily reliant on <code>designMode</code>
+or <code>contentEditable</code> (depending on the browser). Neither of
+these are well specified (HTML5 tries
+to <a href="http://www.w3.org/TR/html5/editing.html#contenteditable">specify</a>
+their basics), and, more importantly, they tend to be one of the more
+obscure and buggy areas of browser functionality—CodeMirror, by using
+this functionality in a non-typical way, was constantly running up
+against browser bugs. WebKit wouldn't show an empty line at the end of
+the document, and in some releases would suddenly get unbearably slow.
+Firefox would show the cursor in the wrong place. Internet Explorer
+would insist on linkifying everything that looked like a URL or email
+address, a behaviour that can't be turned off. Some bugs I managed to
+work around (which was often a frustrating, painful process), others,
+such as the Firefox cursor placement, I gave up on, and had to tell
+user after user that they were known problems, but not something I
+could help.</p>
+
+<p>Also, there is the fact that <code>designMode</code> (which seemed
+to be less buggy than <code>contentEditable</code> in Webkit and
+Firefox, and was thus used by CodeMirror 1 in those browsers) requires
+a frame. Frames are another tricky area. It takes some effort to
+prevent getting tripped up by domain restrictions, they don't
+initialize synchronously, behave strangely in response to the back
+button, and, on several browsers, can't be moved around the DOM
+without having them re-initialize. They did provide a very nice way to
+namespace the library, though—CodeMirror 1 could freely pollute the
+namespace inside the frame.</p>
+
+<p>Finally, working with an editable document means working with
+selection in arbitrary DOM structures. Internet Explorer (8 and
+before) has an utterly different (and awkward) selection API than all
+of the other browsers, and even among the different implementations of
+<code>document.selection</code>, details about how exactly a selection
+is represented vary quite a bit. Add to that the fact that Opera's
+selection support tended to be very buggy until recently, and you can
+imagine why CodeMirror 1 contains 700 lines of selection-handling
+code.</p>
+
+<p>And that brings us to the main issue with the CodeMirror 1
+code base: The proportion of browser-bug-workarounds to real
+application code was getting dangerously high. By building on top of a
+few dodgy features, I put the system in a vulnerable position—any
+incompatibility and bugginess in these features, I had to paper over
+with my own code. Not only did I have to do some serious stunt-work to
+get it to work on older browsers (as detailed in the
+previous <a href="http://codemirror.net/story.html">story</a>), things
+also kept breaking in newly released versions, requiring me to come up
+with <em>new</em> scary hacks in order to keep up. This was starting
+to lose its appeal.</p>
+
+<h2 id="approach">General Approach</h2>
+
+<p>What CodeMirror 2 does is try to sidestep most of the hairy hacks
+that came up in version 1. I owe a lot to the
+<a href="http://ace.ajax.org">ACE</a> editor for inspiration on how to
+approach this.</p>
+
+<p>I absolutely did not want to be completely reliant on key events to
+generate my input. Every JavaScript programmer knows that key event
+information is horrible and incomplete. Some people (most awesomely
+Mihai Bazon with <a href="http://ymacs.org">Ymacs</a>) have been able
+to build more or less functioning editors by directly reading key
+events, but it takes a lot of work (the kind of never-ending, fragile
+work I described earlier), and will never be able to properly support
+things like multi-keystoke international character
+input. <a href="#keymap" class="update">[see below for caveat]</a></p>
+
+<p>So what I do is focus a hidden textarea, and let the browser
+believe that the user is typing into that. What we show to the user is
+a DOM structure we built to represent his document. If this is updated
+quickly enough, and shows some kind of believable cursor, it feels
+like a real text-input control.</p>
+
+<p>Another big win is that this DOM representation does not have to
+span the whole document. Some CodeMirror 1 users insisted that they
+needed to put a 30 thousand line XML document into CodeMirror. Putting
+all that into the DOM takes a while, especially since, for some
+reason, an editable DOM tree is slower than a normal one on most
+browsers. If we have full control over what we show, we must only
+ensure that the visible part of the document has been added, and can
+do the rest only when needed. (Fortunately, the <code>onscroll</code>
+event works almost the same on all browsers, and lends itself well to
+displaying things only as they are scrolled into view.)</p>
+
+<h2 id="input">Input</h2>
+
+<p>ACE uses its hidden textarea only as a text input shim, and does
+all cursor movement and things like text deletion itself by directly
+handling key events. CodeMirror's way is to let the browser do its
+thing as much as possible, and not, for example, define its own set of
+key bindings. One way to do this would have been to have the whole
+document inside the hidden textarea, and after each key event update
+the display DOM to reflect what's in that textarea.</p>
+
+<p>That'd be simple, but it is not realistic. For even medium-sized
+document the editor would be constantly munging huge strings, and get
+terribly slow. What CodeMirror 2 does is put the current selection,
+along with an extra line on the top and on the bottom, into the
+textarea.</p>
+
+<p>This means that the arrow keys (and their ctrl-variations), home,
+end, etcetera, do not have to be handled specially. We just read the
+cursor position in the textarea, and update our cursor to match it.
+Also, copy and paste work pretty much for free, and people get their
+native key bindings, without any special work on my part. For example,
+I have emacs key bindings configured for Chrome and Firefox. There is
+no way for a script to detect this. <a class="update"
+href="#keymap">[no longer the case]</a></p>
+
+<p>Of course, since only a small part of the document sits in the
+textarea, keys like page up and ctrl-end won't do the right thing.
+CodeMirror is catching those events and handling them itself.</p>
+
+<h2 id="selection">Selection</h2>
+
+<p>Getting and setting the selection range of a textarea in modern
+browsers is trivial—you just use the <code>selectionStart</code>
+and <code>selectionEnd</code> properties. On IE you have to do some
+insane stuff with temporary ranges and compensating for the fact that
+moving the selection by a 'character' will treat \r\n as a single
+character, but even there it is possible to build functions that
+reliably set and get the selection range.</p>
+
+<p>But consider this typical case: When I'm somewhere in my document,
+press shift, and press the up arrow, something gets selected. Then, if
+I, still holding shift, press the up arrow again, the top of my
+selection is adjusted. The selection remembers where its <em>head</em>
+and its <em>anchor</em> are, and moves the head when we shift-move.
+This is a generally accepted property of selections, and done right by
+every editing component built in the past twenty years.</p>
+
+<p>But not something that the browser selection APIs expose.</p>
+
+<p>Great. So when someone creates an 'upside-down' selection, the next
+time CodeMirror has to update the textarea, it'll re-create the
+selection as an 'upside-up' selection, with the anchor at the top, and
+the next cursor motion will behave in an unexpected way—our second
+up-arrow press in the example above will not do anything, since it is
+interpreted in exactly the same way as the first.</p>
+
+<p>No problem. We'll just, ehm, detect that the selection is
+upside-down (you can tell by the way it was created), and then, when
+an upside-down selection is present, and a cursor-moving key is
+pressed in combination with shift, we quickly collapse the selection
+in the textarea to its start, allow the key to take effect, and then
+combine its new head with its old anchor to get the <em>real</em>
+selection.</p>
+
+<p>In short, scary hacks could not be avoided entirely in CodeMirror
+2.</p>
+
+<p>And, the observant reader might ask, how do you even know that a
+key combo is a cursor-moving combo, if you claim you support any
+native key bindings? Well, we don't, but we can learn. The editor
+keeps a set known cursor-movement combos (initialized to the
+predictable defaults), and updates this set when it observes that
+pressing a certain key had (only) the effect of moving the cursor.
+This, of course, doesn't work if the first time the key is used was
+for extending an inverted selection, but it works most of the
+time.</p>
+
+<h2 id="update">Intelligent Updating</h2>
+
+<p>One thing that always comes up when you have a complicated internal
+state that's reflected in some user-visible external representation
+(in this case, the displayed code and the textarea's content) is
+keeping the two in sync. The naive way is to just update the display
+every time you change your state, but this is not only error prone
+(you'll forget), it also easily leads to duplicate work on big,
+composite operations. Then you start passing around flags indicating
+whether the display should be updated in an attempt to be efficient
+again and, well, at that point you might as well give up completely.</p>
+
+<p>I did go down that road, but then switched to a much simpler model:
+simply keep track of all the things that have been changed during an
+action, and then, only at the end, use this information to update the
+user-visible display.</p>
+
+<p>CodeMirror uses a concept of <em>operations</em>, which start by
+calling a specific set-up function that clears the state and end by
+calling another function that reads this state and does the required
+updating. Most event handlers, and all the user-visible methods that
+change state are wrapped like this. There's a method
+called <code>operation</code> that accepts a function, and returns
+another function that wraps the given function as an operation.</p>
+
+<p>It's trivial to extend this (as CodeMirror does) to detect nesting,
+and, when an operation is started inside an operation, simply
+increment the nesting count, and only do the updating when this count
+reaches zero again.</p>
+
+<p>If we have a set of changed ranges and know the currently shown
+range, we can (with some awkward code to deal with the fact that
+changes can add and remove lines, so we're dealing with a changing
+coordinate system) construct a map of the ranges that were left
+intact. We can then compare this map with the part of the document
+that's currently visible (based on scroll offset and editor height) to
+determine whether something needs to be updated.</p>
+
+<p>CodeMirror uses two update algorithms—a full refresh, where it just
+discards the whole part of the DOM that contains the edited text and
+rebuilds it, and a patch algorithm, where it uses the information
+about changed and intact ranges to update only the out-of-date parts
+of the DOM. When more than 30 percent (which is the current heuristic,
+might change) of the lines need to be updated, the full refresh is
+chosen (since it's faster to do than painstakingly finding and
+updating all the changed lines), in the other case it does the
+patching (so that, if you scroll a line or select another character,
+the whole screen doesn't have to be
+re-rendered). <span class="update">[the full-refresh
+algorithm was dropped, it wasn't really faster than the patching
+one]</span></p>
+
+<p>All updating uses <code>innerHTML</code> rather than direct DOM
+manipulation, since that still seems to be by far the fastest way to
+build documents. There's a per-line function that combines the
+highlighting, <a href="manual.html#markText">marking</a>, and
+selection info for that line into a snippet of HTML. The patch updater
+uses this to reset individual lines, the refresh updater builds an
+HTML chunk for the whole visible document at once, and then uses a
+single <code>innerHTML</code> update to do the refresh.</p>
+
+<h2 id="parse">Parsers can be Simple</h2>
+
+<p>When I wrote CodeMirror 1, I
+thought <a href="http://codemirror.net/story.html#parser">interruptable
+parsers</a> were a hugely scary and complicated thing, and I used a
+bunch of heavyweight abstractions to keep this supposed complexity
+under control: parsers
+were <a href="http://bob.pythonmac.org/archives/2005/07/06/iteration-in-javascript/">iterators</a>
+that consumed input from another iterator, and used funny
+closure-resetting tricks to copy and resume themselves.</p>
+
+<p>This made for a rather nice system, in that parsers formed strictly
+separate modules, and could be composed in predictable ways.
+Unfortunately, it was quite slow (stacking three or four iterators on
+top of each other), and extremely intimidating to people not used to a
+functional programming style.</p>
+
+<p>With a few small changes, however, we can keep all those
+advantages, but simplify the API and make the whole thing less
+indirect and inefficient. CodeMirror
+2's <a href="manual.html#modeapi">mode API</a> uses explicit state
+objects, and makes the parser/tokenizer a function that simply takes a
+state and a character stream abstraction, advances the stream one
+token, and returns the way the token should be styled. This state may
+be copied, optionally in a mode-defined way, in order to be able to
+continue a parse at a given point. Even someone who's never touched a
+lambda in his life can understand this approach. Additionally, far
+fewer objects are allocated in the course of parsing now.</p>
+
+<p>The biggest speedup comes from the fact that the parsing no longer
+has to touch the DOM though. In CodeMirror 1, on an older browser, you
+could <em>see</em> the parser work its way through the document,
+managing some twenty lines in each 50-millisecond time slice it got. It
+was reading its input from the DOM, and updating the DOM as it went
+along, which any experienced JavaScript programmer will immediately
+spot as a recipe for slowness. In CodeMirror 2, the parser usually
+finishes the whole document in a single 100-millisecond time slice—it
+manages some 1500 lines during that time on Chrome. All it has to do
+is munge strings, so there is no real reason for it to be slow
+anymore.</p>
+
+<h2 id="summary">What Gives?</h2>
+
+<p>Given all this, what can you expect from CodeMirror 2?</p>
+
+<ul>
+
+<li><strong>Small.</strong> the base library is
+some <span class="update">45k</span> when minified
+now, <span class="update">17k</span> when gzipped. It's smaller than
+its own logo.</li>
+
+<li><strong>Lightweight.</strong> CodeMirror 2 initializes very
+quickly, and does almost no work when it is not focused. This means
+you can treat it almost like a textarea, have multiple instances on a
+page without trouble.</li>
+
+<li><strong>Huge document support.</strong> Since highlighting is
+really fast, and no DOM structure is being built for non-visible
+content, you don't have to worry about locking up your browser when a
+user enters a megabyte-sized document.</li>
+
+<li><strong>Extended API.</strong> Some things kept coming up in the
+mailing list, such as marking pieces of text or lines, which were
+extremely hard to do with CodeMirror 1. The new version has proper
+support for these built in.</li>
+
+<li><strong>Tab support.</strong> Tabs inside editable documents were,
+for some reason, a no-go. At least six different people announced they
+were going to add tab support to CodeMirror 1, none survived (I mean,
+none delivered a working version). CodeMirror 2 no longer removes tabs
+from your document.</li>
+
+<li><strong>Sane styling.</strong> <code>iframe</code> nodes aren't
+really known for respecting document flow. Now that an editor instance
+is a plain <code>div</code> element, it is much easier to size it to
+fit the surrounding elements. You don't even have to make it scroll if
+you do not <a href="../demo/resize.html">want to</a>.</li>
+
+</ul>
+
+<p>On the downside, a CodeMirror 2 instance is <em>not</em> a native
+editable component. Though it does its best to emulate such a
+component as much as possible, there is functionality that browsers
+just do not allow us to hook into. Doing select-all from the context
+menu, for example, is not currently detected by CodeMirror.</p>
+
+<p id="changes" style="margin-top: 2em;"><span style="font-weight:
+bold">[Updates from November 13th 2011]</span> Recently, I've made
+some changes to the codebase that cause some of the text above to no
+longer be current. I've left the text intact, but added markers at the
+passages that are now inaccurate. The new situation is described
+below.</p>
+
+<h2 id="btree">Content Representation</h2>
+
+<p>The original implementation of CodeMirror 2 represented the
+document as a flat array of line objects. This worked well—splicing
+arrays will require the part of the array after the splice to be
+moved, but this is basically just a simple <code>memmove</code> of a
+bunch of pointers, so it is cheap even for huge documents.</p>
+
+<p>However, I recently added line wrapping and code folding (line
+collapsing, basically). Once lines start taking up a non-constant
+amount of vertical space, looking up a line by vertical position
+(which is needed when someone clicks the document, and to determine
+the visible part of the document during scrolling) can only be done
+with a linear scan through the whole array, summing up line heights as
+you go. Seeing how I've been going out of my way to make big documents
+fast, this is not acceptable.</p>
+
+<p>The new representation is based on a B-tree. The leaves of the tree
+contain arrays of line objects, with a fixed minimum and maximum size,
+and the non-leaf nodes simply hold arrays of child nodes. Each node
+stores both the amount of lines that live below them and the vertical
+space taken up by these lines. This allows the tree to be indexed both
+by line number and by vertical position, and all access has
+logarithmic complexity in relation to the document size.</p>
+
+<p>I gave line objects and tree nodes parent pointers, to the node
+above them. When a line has to update its height, it can simply walk
+these pointers to the top of the tree, adding or subtracting the
+difference in height from each node it encounters. The parent pointers
+also make it cheaper (in complexity terms, the difference is probably
+tiny in normal-sized documents) to find the current line number when
+given a line object. In the old approach, the whole document array had
+to be searched. Now, we can just walk up the tree and count the sizes
+of the nodes coming before us at each level.</p>
+
+<p>I chose B-trees, not regular binary trees, mostly because they
+allow for very fast bulk insertions and deletions. When there is a big
+change to a document, it typically involves adding, deleting, or
+replacing a chunk of subsequent lines. In a regular balanced tree, all
+these inserts or deletes would have to be done separately, which could
+be really expensive. In a B-tree, to insert a chunk, you just walk
+down the tree once to find where it should go, insert them all in one
+shot, and then break up the node if needed. This breaking up might
+involve breaking up nodes further up, but only requires a single pass
+back up the tree. For deletion, I'm somewhat lax in keeping things
+balanced—I just collapse nodes into a leaf when their child count goes
+below a given number. This means that there are some weird editing
+patterns that may result in a seriously unbalanced tree, but even such
+an unbalanced tree will perform well, unless you spend a day making
+strangely repeating edits to a really big document.</p>
+
+<h2 id="keymap">Keymaps</h2>
+
+<p><a href="#approach">Above</a>, I claimed that directly catching key
+events for things like cursor movement is impractical because it
+requires some browser-specific kludges. I then proceeded to explain
+some awful <a href="#selection">hacks</a> that were needed to make it
+possible for the selection changes to be detected through the
+textarea. In fact, the second hack is about as bad as the first.</p>
+
+<p>On top of that, in the presence of user-configurable tab sizes and
+collapsed and wrapped lines, lining up cursor movement in the textarea
+with what's visible on the screen becomes a nightmare. Thus, I've
+decided to move to a model where the textarea's selection is no longer
+depended on.</p>
+
+<p>So I moved to a model where all cursor movement is handled by my
+own code. This adds support for a goal column, proper interaction of
+cursor movement with collapsed lines, and makes it possible for
+vertical movement to move through wrapped lines properly, instead of
+just treating them like non-wrapped lines.</p>
+
+<p>The key event handlers now translate the key event into a string,
+something like <code>Ctrl-Home</code> or <code>Shift-Cmd-R</code>, and
+use that string to look up an action to perform. To make keybinding
+customizable, this lookup goes through
+a <a href="manual.html#option_keyMap">table</a>, using a scheme that
+allows such tables to be chained together (for example, the default
+Mac bindings fall through to a table named 'emacsy', which defines
+basic Emacs-style bindings like <code>Ctrl-F</code>, and which is also
+used by the custom Emacs bindings).</p>
+
+<p>A new
+option <a href="manual.html#option_extraKeys"><code>extraKeys</code></a>
+allows ad-hoc keybindings to be defined in a much nicer way than what
+was possible with the
+old <a href="manual.html#option_onKeyEvent"><code>onKeyEvent</code></a>
+callback. You simply provide an object mapping key identifiers to
+functions, instead of painstakingly looking at raw key events.</p>
+
+<p>Built-in commands map to strings, rather than functions, for
+example <code>"goLineUp"</code> is the default action bound to the up
+arrow key. This allows new keymaps to refer to them without
+duplicating any code. New commands can be defined by assigning to
+the <code>CodeMirror.commands</code> object, which maps such commands
+to functions.</p>
+
+<p>The hidden textarea now only holds the current selection, with no
+extra characters around it. This has a nice advantage: polling for
+input becomes much, much faster. If there's a big selection, this text
+does not have to be read from the textarea every time—when we poll,
+just noticing that something is still selected is enough to tell us
+that no new text was typed.</p>
+
+<p>The reason that cheap polling is important is that many browsers do
+not fire useful events on IME (input method engine) input, which is
+the thing where people inputting a language like Japanese or Chinese
+use multiple keystrokes to create a character or sequence of
+characters. Most modern browsers fire <code>input</code> when the
+composing is finished, but many don't fire anything when the character
+is updated <em>during</em> composition. So we poll, whenever the
+editor is focused, to provide immediate updates of the display.</p>
+
+</div><div class="rightsmall blk">
+
+    <h2>Contents</h2>
+
+    <ul>
+      <li><a href="#intro">Introduction</a></li>
+      <li><a href="#approach">General Approach</a></li>
+      <li><a href="#input">Input</a></li>
+      <li><a href="#selection">Selection</a></li>
+      <li><a href="#update">Intelligent Updating</a></li>
+      <li><a href="#parse">Parsing</a></li>
+      <li><a href="#summary">What Gives?</a></li>
+      <li><a href="#btree">Content Representation</a></li>
+      <li><a href="#keymap">Key Maps</a></li>
+    </ul>
+
+</div></div>
+
+<div style="height: 2em"> </div>
+
+</body></html>
diff --git a/interface/codemirror/doc/manual.html b/interface/codemirror/doc/manual.html
new file mode 100755
index 0000000..e13e591
--- /dev/null
+++ b/interface/codemirror/doc/manual.html
@@ -0,0 +1,1100 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: User Manual</title>
+    <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans:bold"/>
+    <link rel="stylesheet" type="text/css" href="docs.css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <style>dl dl {margin: 0;}</style>
+  </head>
+  <body>
+
+<h1><span class="logo-braces">{ }</span> <a href="http://codemirror.net/">CodeMirror</a></h1>
+
+<pre class="grey">
+<img src="baboon.png" class="logo" alt="logo"/>/* User manual and
+   reference guide */
+</pre>
+
+<div class="clear"><div class="leftbig blk">
+
+    <h2 id="overview">Overview</h2>
+
+    <p>CodeMirror is a code-editor component that can be embedded in
+    Web pages. The code library provides <em>only</em> the editor
+    component, no accompanying buttons, auto-completion, or other IDE
+    functionality. It does provide a rich API on top of which such
+    functionality can be straightforwardly implemented. See
+    the <a href="#addons">add-ons</a> included in the distribution,
+    and
+    the <a href="https://github.com/jagthedrummer/codemirror-ui">CodeMirror
+    UI</a> project, for reusable implementations of extra features.</p>
+
+    <p>CodeMirror works with language-specific modes. Modes are
+    JavaScript programs that help color (and optionally indent) text
+    written in a given language. The distribution comes with a number
+    of modes (see the <code>mode/</code> directory), and it isn't hard
+    to <a href="#modeapi">write new ones</a> for other languages.</p>
+
+    <h2 id="usage">Basic Usage</h2>
+
+    <p>The easiest way to use CodeMirror is to simply load the script
+    and style sheet found under <code>lib/</code> in the distribution,
+    plus a mode script from one of the <code>mode/</code> directories
+    and a theme stylesheet from <code>theme/</code>. (See
+    also <a href="compress.html">the compression helper</a>.) For
+    example:</p>
+
+    <pre><script src="lib/codemirror.js"></script>
+<link rel="stylesheet" href="../lib/codemirror.css">
+<script src="mode/javascript/javascript.js"></script></pre>
+
+    <p>Having done this, an editor instance can be created like
+    this:</p>
+
+    <pre>var myCodeMirror = CodeMirror(document.body);</pre>
+
+    <p>The editor will be appended to the document body, will start
+    empty, and will use the mode that we loaded. To have more control
+    over the new editor, a configuration object can be passed
+    to <code>CodeMirror</code> as a second argument:</p>
+
+    <pre>var myCodeMirror = CodeMirror(document.body, {
+  value: "function myScript(){return 100;}\n",
+  mode:  "javascript"
+});</pre>
+
+    <p>This will initialize the editor with a piece of code already in
+    it, and explicitly tell it to use the JavaScript mode (which is
+    useful when multiple modes are loaded).
+    See <a href="#config">below</a> for a full discussion of the
+    configuration options that CodeMirror accepts.</p>
+
+    <p>In cases where you don't want to append the editor to an
+    element, and need more control over the way it is inserted, the
+    first argument to the <code>CodeMirror</code> function can also
+    be a function that, when given a DOM element, inserts it into the
+    document somewhere. This could be used to, for example, replace a
+    textarea with a real editor:</p>
+
+    <pre>var myCodeMirror = CodeMirror(function(elt) {
+  myTextArea.parentNode.replaceChild(elt, myTextArea);
+}, {value: myTextArea.value});</pre>
+
+    <p>However, for this use case, which is a common way to use
+    CodeMirror, the library provides a much more powerful
+    shortcut:</p>
+
+    <pre>var myCodeMirror = CodeMirror.fromTextArea(myTextArea);</pre>
+
+    <p>This will, among other things, ensure that the textarea's value
+    is updated when the form (if it is part of a form) is submitted.
+    See the <a href="#fromTextArea">API reference</a> for a full
+    description of this method.</p>
+
+    <h2 id="config">Configuration</h2>
+
+    <p>Both the <code>CodeMirror</code> function and
+    its <code>fromTextArea</code> method take as second (optional)
+    argument an object containing configuration options. Any option
+    not supplied like this will be taken
+    from <code>CodeMirror.defaults</code>, an object containing the
+    default options. You can update this object to change the defaults
+    on your page.</p>
+
+    <p>Options are not checked in any way, so setting bogus option
+    values is bound to lead to odd errors.</p>
+
+    <p>These are the supported options:</p>
+
+    <dl>
+      <dt id="option_value"><code>value (string)</code></dt>
+      <dd>The starting value of the editor.</dd>
+
+      <dt id="option_mode"><code>mode (string or object)</code></dt>
+      <dd>The mode to use. When not given, this will default to the
+      first mode that was loaded. It may be a string, which either
+      simply names the mode or is
+      a <a href="http://en.wikipedia.org/wiki/MIME">MIME</a> type
+      associated with the mode. Alternatively, it may be an object
+      containing configuration options for the mode, with
+      a <code>name</code> property that names the mode (for
+      example <code>{name: "javascript", json: true}</code>). The demo
+      pages for each mode contain information about what configuration
+      parameters the mode supports. You can ask CodeMirror which modes
+      and MIME types are loaded with
+      the <code>CodeMirror.listModes</code>
+      and <code>CodeMirror.listMIMEs</code> functions.</dd>
+
+      <dt id="option_theme"><code>theme (string)</code></dt>
+      <dd>The theme to style the editor with. You must make sure the
+      CSS file defining the corresponding <code>.cm-s-[name]</code>
+      styles is loaded (see
+      the <a href="../theme/"><code>theme</code></a> directory in the
+      distribution). The default is <code>"default"</code>, for which
+      colors are included in <code>codemirror.css</code>. It is
+      possible to use multiple theming classes at once—for
+      example <code>"foo bar"</code> will assign both
+      the <code>cm-s-foo</code> and the <code>cm-s-bar</code> classes
+      to the editor.</dd>
+
+      <dt id="option_indentUnit"><code>indentUnit (integer)</code></dt>
+      <dd>How many spaces a block (whatever that means in the edited
+      language) should be indented. The default is 2.</dd>
+
+      <dt id="option_smartIndent"><code>smartIndent (boolean)</code></dt>
+      <dd>Whether to use the context-sensitive indentation that the
+      mode provides (or just indent the same as the line before).
+      Defaults to true.</dd>
+
+      <dt id="option_tabSize"><code>tabSize (integer)</code></dt>
+      <dd>The width of a tab character. Defaults to 4.</dd>
+
+      <dt id="option_indentWithTabs"><code>indentWithTabs (boolean)</code></dt>
+      <dd>Whether, when indenting, the first N*<code>tabSize</code>
+      spaces should be replaced by N tabs. Default is false.</dd>
+
+      <dt id="option_electricChars"><code>electricChars (boolean)</code></dt>
+      <dd>Configures whether the editor should re-indent the current
+      line when a character is typed that might change its proper
+      indentation (only works if the mode supports indentation).
+      Default is true.</dd>
+
+      <dt id="option_autoClearEmptyLines"><code>autoClearEmptyLines (boolean)</code></dt>
+      <dd>When turned on (default is off), this will clear
+      automatically clear lines consisting only of whitespace when the
+      cursor leaves them. This is mostly useful to prevent auto
+      indentation from introducing trailing whitespace in a file.</dd>
+
+      <dt id="option_keyMap"><code>keyMap (string)</code></dt>
+      <dd>Configures the keymap to use. The default
+      is <code>"default"</code>, which is the only keymap defined
+      in <code>codemirror.js</code> itself. Extra keymaps are found in
+      the <a href="../keymap/"><code>keymap</code></a> directory. See
+      the <a href="#keymaps">section on keymaps</a> for more
+      information.</dd>
+
+      <dt id="option_extraKeys"><code>extraKeys (object)</code></dt>
+      <dd>Can be used to specify extra keybindings for the editor,
+      alongside the ones defined
+      by <a href="#option_keyMap"><code>keyMap</code></a>. Should be
+      either null, or a valid <a href="#keymaps">keymap</a> value.</dd>
+
+      <dt id="option_lineWrapping"><code>lineWrapping (boolean)</code></dt>
+      <dd>Whether CodeMirror should scroll or wrap for long lines.
+      Defaults to <code>false</code> (scroll).</dd>
+
+      <dt id="option_lineNumbers"><code>lineNumbers (boolean)</code></dt>
+      <dd>Whether to show line numbers to the left of the editor.</dd>
+
+      <dt id="option_firstLineNumber"><code>firstLineNumber (integer)</code></dt>
+      <dd>At which number to start counting lines. Default is 1.</dd>
+
+      <dt id="option_gutter"><code>gutter (boolean)</code></dt>
+      <dd>Can be used to force a 'gutter' (empty space on the left of
+      the editor) to be shown even when no line numbers are active.
+      This is useful for setting <a href="#setMarker">markers</a>.</dd>
+
+      <dt id="option_fixedGutter"><code>fixedGutter (boolean)</code></dt>
+      <dd>When enabled (off by default), this will make the gutter
+      stay visible when the document is scrolled horizontally.</dd>
+
+      <dt id="option_readOnly"><code>readOnly (boolean)</code></dt>
+      <dd>This disables editing of the editor content by the user. If
+      the special value <code>"nocursor"</code> is given (instead of
+      simply <code>true</code>), focusing of the editor is also
+      disallowed.</dd>
+
+      <dt id="option_onChange"><code>onChange (function)</code></dt>
+      <dd>When given, this function will be called every time the
+      content of the editor is changed. It will be given the editor
+      instance as first argument, and an <code>{from, to, text, next}</code>
+      object containing information about the changes
+      that occurred as second argument. <code>from</code>
+      and <code>to</code> are the positions (in the pre-change
+      coordinate system) where the change started and
+      ended (for example, it might be <code>{ch:0, line:18}</code> if the
+      position is at the beginning of line #19). <code>text</code>
+      is an array of strings representing the text that replaced the changed
+      range (split by line). If multiple changes happened during a single
+      operation, the object will have a <code>next</code> property pointing to
+      another change object (which may point to another, etc).</dd>
+
+      <dt id="option_onCursorActivity"><code>onCursorActivity (function)</code></dt>
+      <dd>Will be called when the cursor or selection moves, or any
+      change is made to the editor content.</dd>
+
+      <dt id="option_onGutterClick"><code>onGutterClick (function)</code></dt>
+      <dd>When given, will be called whenever the editor gutter (the
+      line-number area) is clicked. Will be given the editor instance
+      as first argument, the (zero-based) number of the line that was
+      clicked as second argument, and the raw <code>mousedown</code>
+      event object as third argument.</dd>
+
+      <dt id="option_onFocus"><code>onFocus, onBlur (function)</code></dt>
+      <dd>The given functions will be called whenever the editor is
+      focused or unfocused.</dd>
+
+      <dt id="option_onScroll"><code>onScroll (function)</code></dt>
+      <dd>When given, will be called whenever the editor is
+      scrolled.</dd>
+
+      <dt id="option_onHighlightComplete"><code>onHighlightComplete (function)</code></dt>
+      <dd>Whenever the editor's content has been fully highlighted,
+      this function (if given) will be called. It'll be given a single
+      argument, the editor instance.</dd>
+
+      <dt id="option_onUpdate"><code>onUpdate (function)</code></dt>
+      <dd>Will be called whenever CodeMirror updates its DOM display.</dd>
+
+      <dt id="option_matchBrackets"><code>matchBrackets (boolean)</code></dt>
+      <dd>Determines whether brackets are matched whenever the cursor
+      is moved next to a bracket.</dd>
+
+      <dt id="option_workTime"><code>workTime, workDelay (number)</code></dt>
+      <dd>Highlighting is done by a pseudo background-thread that will
+      work for <code>workTime</code> milliseconds, and then use
+      timeout to sleep for <code>workDelay</code> milliseconds. The
+      defaults are 200 and 300, you can change these options to make
+      the highlighting more or less aggressive.</dd>
+
+      <dt id="option_pollInterval"><code>pollInterval (number)</code></dt>
+      <dd>Indicates how quickly CodeMirror should poll its input
+      textarea for changes. Most input is captured by events, but some
+      things, like IME input on some browsers, doesn't generate events
+      that allow CodeMirror to properly detect it. Thus, it polls.
+      Default is 100 milliseconds.</dd>
+
+      <dt id="option_undoDepth"><code>undoDepth (integer)</code></dt>
+      <dd>The maximum number of undo levels that the editor stores.
+      Defaults to 40.</dd>
+
+      <dt id="option_tabindex"><code>tabindex (integer)</code></dt>
+      <dd>The <a href="http://www.w3.org/TR/html401/interact/forms.html#adef-tabindex">tab
+      index</a> to assign to the editor. If not given, no tab index
+      will be assigned.</dd>
+
+      <dt id="option_autofocus"><code>autofocus (boolean)</code></dt>
+      <dd>Can be used to make CodeMirror focus itself on
+      initialization. Defaults to off.
+      When <a href="#fromTextArea"><code>fromTextArea</code></a> is
+      used, and no explicit value is given for this option, it will
+      inherit the setting from the textarea's <code>autofocus</code>
+      attribute.</dd>
+
+      <dt id="option_dragDrop"><code>dragDrop (boolean)</code></dt>
+      <dd>Controls whether drag-and-drop is enabled. On by default.</dd>
+
+      <dt id="option_onDragEvent"><code>onDragEvent (function)</code></dt>
+      <dd>When given, this will be called when the editor is handling
+      a <code>dragenter</code>, <code>dragover</code>,
+      or <code>drop</code> event. It will be passed the editor instance
+      and the event object as arguments. The callback can choose to
+      handle the event itself, in which case it should
+      return <code>true</code> to indicate that CodeMirror should not
+      do anything further.</dd>
+
+      <dt id="option_onKeyEvent"><code>onKeyEvent (function)</code></dt>
+      <dd>This provides a rather low-level hook into CodeMirror's key
+      handling. If provided, this function will be called on
+      every <code>keydown</code>, <code>keyup</code>,
+      and <code>keypress</code> event that CodeMirror captures. It
+      will be passed two arguments, the editor instance and the key
+      event. This key event is pretty much the raw key event, except
+      that a <code>stop()</code> method is always added to it. You
+      could feed it to, for example, <code>jQuery.Event</code> to
+      further normalize it.<br>This function can inspect the key
+      event, and handle it if it wants to. It may return true to tell
+      CodeMirror to ignore the event. Be wary that, on some browsers,
+      stopping a <code>keydown</code> does not stop
+      the <code>keypress</code> from firing, whereas on others it
+      does. If you respond to an event, you should probably inspect
+      its <code>type</code> property and only do something when it
+      is <code>keydown</code> (or <code>keypress</code> for actions
+      that need character data).</dd>
+    </dl>
+
+    <h2 id="keymaps">Keymaps</h2>
+
+    <p>Keymaps are ways to associate keys with functionality. A keymap
+    is an object mapping strings that identify the keys to functions
+    that implement their functionality.</p>
+
+    <p>Keys are identified either by name or by character.
+    The <code>CodeMirror.keyNames</code> object defines names for
+    common keys and associates them with their key codes. Examples of
+    names defined here are <code>Enter</code>, <code>F5</code>,
+    and <code>Q</code>. These can be prefixed
+    with <code>Shift-</code>, <code>Cmd-</code>, <code>Ctrl-</code>,
+    and <code>Alt-</code> (in that order!) to specify a modifier. So
+    for example, <code>Shift-Ctrl-Space</code> would be a valid key
+    identifier.</p>
+
+    <p>Alternatively, a character can be specified directly by
+    surrounding it in single quotes, for example <code>'$'</code>
+    or <code>'q'</code>. Due to limitations in the way browsers fire
+    key events, these may not be prefixed with modifiers.</p>
+
+    <p>The <code>CodeMirror.keyMap</code> object associates keymaps
+    with names. User code and keymap definitions can assign extra
+    properties to this object. Anywhere where a keymap is expected, a
+    string can be given, which will be looked up in this object. It
+    also contains the <code>"default"</code> keymap holding the
+    default bindings.</p>
+
+    <p>The values of properties in keymaps can be either functions of
+    a single argument (the CodeMirror instance), or strings. Such
+    strings refer to properties of the
+    <code>CodeMirror.commands</code> object, which defines a number of
+    common commands that are used by the default keybindings, and maps
+    them to functions. A key handler function may throw
+    <code>CodeMirror.Pass</code> to indicate that it has decided not
+    to handle the key, and other handlers (or the default behavior)
+    should be given a turn.</p>
+
+    <p>Keys mapped to command names that start with the
+    characters <code>"go"</code> (which should be used for
+    cursor-movement actions) will be fired even when an
+    extra <code>Shift</code> modifier is present (i.e. <code>"Up":
+    "goLineUp"</code> matches both up and shift-up). This is used to
+    easily implement shift-selection.</p>
+
+    <p>Keymaps can defer to each other by defining
+    a <code>fallthrough</code> property. This indicates that when a
+    key is not found in the map itself, one or more other maps should
+    be searched. It can hold either a single keymap or an array of
+    keymaps.</p>
+
+    <p>When a keymap contains a <code>nofallthrough</code> property
+    set to <code>true</code>, keys matched against that map will be
+    ignored if they don't match any of the bindings in the map (no
+    further child maps will be tried, and the default effect of
+    inserting a character will not occur).</p>
+
+    <h2 id="styling">Customized Styling</h2>
+
+    <p>Up to a certain extent, CodeMirror's look can be changed by
+    modifying style sheet files. The style sheets supplied by modes
+    simply provide the colors for that mode, and can be adapted in a
+    very straightforward way. To style the editor itself, it is
+    possible to alter or override the styles defined
+    in <a href="../lib/codemirror.css"><code>codemirror.css</code></a>.</p>
+
+    <p>Some care must be taken there, since a lot of the rules in this
+    file are necessary to have CodeMirror function properly. Adjusting
+    colors should be safe, of course, and with some care a lot of
+    other things can be changed as well. The CSS classes defined in
+    this file serve the following roles:</p>
+
+    <dl>
+      <dt id="class_CodeMirror"><code>CodeMirror</code></dt>
+      <dd>The outer element of the editor. This should be used for
+      borders and positioning. Can also be used to set styles that
+      should hold for everything inside the editor (such as font
+      and font size), or to set a background.</dd>
+
+      <dt id="class_CodeMirror_scroll"><code>CodeMirror-scroll</code></dt>
+      <dd>This determines whether the editor scrolls (<code>overflow:
+      auto</code> + fixed height). By default, it does. Giving
+      this <code>height: auto; overflow: visible;</code> will cause
+      the editor to resize to fit its content.</dd>
+
+      <dt id="class_CodeMirror_focused"><code>CodeMirror-focused</code></dt>
+      <dd>Whenever the editor is focused, the top element gets this
+      class. This is used to hide the cursor and give the selection a
+      different color when the editor is not focused.</dd>
+
+      <dt id="class_CodeMirror_gutter"><code>CodeMirror-gutter</code></dt>
+      <dd>Use this for giving a background or a border to the editor
+      gutter. Don't set any padding here,
+      use <code>CodeMirror-gutter-text</code> for that. By default,
+      the gutter is 'fluid', meaning it will adjust its width to the
+      maximum line number or line marker width. You can also set a
+      fixed width if you want.</dd>
+
+      <dt id="class_CodeMirror_gutter_text"><code>CodeMirror-gutter-text</code></dt>
+      <dd>Used to style the actual line numbers. For the numbers to
+      line up, you must make sure that the font in the gutter is the
+      same as the one in the rest of the editor, so you should
+      probably only set font style and size in
+      the <code>CodeMirror</code> class.</dd>
+
+      <dt id="class_CodeMirror_lines"><code>CodeMirror-lines</code></dt>
+      <dd>The visible lines. If this has vertical
+      padding, <code>CodeMirror-gutter</code> should have the same
+      padding.</dd>
+
+      <dt id="class_CodeMirror_cursor"><code>CodeMirror-cursor</code></dt>
+      <dd>The cursor is a block element that is absolutely positioned.
+      You can make it look whichever way you want.</dd>
+
+      <dt id="class_CodeMirror_selected"><code>CodeMirror-selected</code></dt>
+      <dd>The selection is represented by <code>span</code> elements
+      with this class.</dd>
+
+      <dt id="class_CodeMirror_matchingbracket"><code>CodeMirror-matchingbracket</code>,
+        <code>CodeMirror-nonmatchingbracket</code></dt>
+      <dd>These are used to style matched (or unmatched) brackets.</dd>
+    </dl>
+
+    <p>The actual lines, as well as the cursor, are represented
+    by <code>pre</code> elements. By default no text styling (such as
+    bold) that might change line height is applied. If you do want
+    such effects, you'll have to give <code>CodeMirror pre</code> a
+    fixed height. Also, you must still take care that character width
+    is constant.</p>
+
+    <p>If your page's style sheets do funky things to
+    all <code>div</code> or <code>pre</code> elements (you probably
+    shouldn't do that), you'll have to define rules to cancel these
+    effects out again for elements under the <code>CodeMirror</code>
+    class.</p>
+
+    <p>Themes are also simply CSS files, which define colors for
+    various syntactic elements. See the files in
+    the <a href="../theme/"><code>theme</code></a> directory.</p>
+
+    <h2 id="api">Programming API</h2>
+
+    <p>A lot of CodeMirror features are only available through its API.
+    This has the disadvantage that you need to do work to enable them,
+    and the advantage that CodeMirror will fit seamlessly into your
+    application.</p>
+
+    <p>Whenever points in the document are represented, the API uses
+    objects with <code>line</code> and <code>ch</code> properties.
+    Both are zero-based. CodeMirror makes sure to 'clip' any positions
+    passed by client code so that they fit inside the document, so you
+    shouldn't worry too much about sanitizing your coordinates. If you
+    give <code>ch</code> a value of <code>null</code>, or don't
+    specify it, it will be replaced with the length of the specified
+    line.</p>
+
+    <dl>
+      <dt id="getValue"><code>getValue() → string</code></dt>
+      <dd>Get the current editor content.</dd>
+      <dt id="setValue"><code>setValue(string)</code></dt>
+      <dd>Set the editor content.</dd>
+
+      <dt id="getSelection"><code>getSelection() → string</code></dt>
+      <dd>Get the currently selected code.</dd>
+      <dt id="replaceSelection"><code>replaceSelection(string)</code></dt>
+      <dd>Replace the selection with the given string.</dd>
+
+      <dt id="focus"><code>focus()</code></dt>
+      <dd>Give the editor focus.</dd>
+      <dt id="scrollTo"><code>scrollTo(x, y)</code></dt>
+      <dd>Scroll the editor to a given (pixel) position. Both
+      arguments may be left as <code>null</code>
+      or <code>undefined</code> to have no effect.</dd>
+
+      <dt id="setOption"><code>setOption(option, value)</code></dt>
+      <dd>Change the configuration of the editor. <code>option</code>
+      should the name of an <a href="#config">option</a>,
+      and <code>value</code> should be a valid value for that
+      option.</dd>
+      <dt id="getOption"><code>getOption(option) → value</code></dt>
+      <dd>Retrieves the current value of the given option for this
+      editor instance.</dd>
+
+      <dt id="cursorCoords"><code>cursorCoords(start, mode) → object</code></dt>
+      <dd>Returns an <code>{x, y, yBot}</code> object containing the
+      coordinates of the cursor. If <code>mode</code>
+      is <code>"local"</code>, they will be relative to the top-left
+      corner of the editable document. If it is <code>"page"</code> or
+      not given, they are relative to the top-left corner of the
+      page. <code>yBot</code> is the coordinate of the bottom of the
+      cursor. <code>start</code> is a boolean indicating whether you
+      want the start or the end of the selection.</dd>
+      <dt id="charCoords"><code>charCoords(pos, mode) → object</code></dt>
+      <dd>Like <code>cursorCoords</code>, but returns the position of
+      an arbitrary characters. <code>pos</code> should be
+      a <code>{line, ch}</code> object.</dd>
+      <dt id="coordsChar"><code>coordsChar(object) → pos</code></dt>
+      <dd>Given an <code>{x, y}</code> object (in page coordinates),
+      returns the <code>{line, ch}</code> position that corresponds to
+      it.</dd>
+
+      <dt id="undo"><code>undo()</code></dt>
+      <dd>Undo one edit (if any undo events are stored).</dd>
+      <dt id="redo"><code>redo()</code></dt>
+      <dd>Redo one undone edit.</dd>
+      <dt id="historySize"><code>historySize() → object</code></dt>
+      <dd>Returns an object with <code>{undo, redo}</code> properties,
+      both of which hold integers, indicating the amount of stored
+      undo and redo operations.</dd>
+      <dt id="clearHistory"><code>clearHistory()</code></dt>
+      <dd>Clears the editor's undo history.</dd>
+
+      <dt id="indentLine"><code>indentLine(line, dir)</code></dt>
+      <dd>Reset the given line's indentation to the indentation
+      prescribed by the mode. If the second argument is given,
+      indentation will be increased (if <code>dir</code> is true) or
+      decreased (if false) by an <a href="#option_indentUnit">indent
+      unit</a> instead.</dd>
+
+      <dt id="getTokenAt"><code>getTokenAt(pos) → object</code></dt>
+      <dd>Retrieves information about the token the current mode found
+      at the given position (a <code>{line, ch}</code> object). The
+      returned object has the following properties:
+      <dl>
+        <dt><code>start</code></dt><dd>The character (on the given line) at which the token starts.</dd>
+        <dt><code>end</code></dt><dd>The character at which the token ends.</dd>
+        <dt><code>string</code></dt><dd>The token's string.</dd>
+        <dt><code>className</code></dt><dd>The class the mode assigned
+        to the token. (Can be null when no class was assigned.)</dd>
+        <dt><code>state</code></dt><dd>The mode's state at the end of this token.</dd>
+      </dl></dd>
+
+      <dt id="markText"><code>markText(from, to, className) → object</code></dt>
+      <dd>Can be used to mark a range of text with a specific CSS
+      class name. <code>from</code> and <code>to</code> should
+      be <code>{line, ch}</code> objects. The method will return an
+      object with two methods, <code>clear()</code>, which removes the
+      mark, and <code>find()</code>, which returns a <code>{from,
+      to}</code> (both document positions), indicating the current
+      position of the marked range.</dd>
+
+      <dt id="setBookmark"><code>setBookmark(pos) → object</code></dt>
+      <dd>Inserts a bookmark, a handle that follows the text around it
+      as it is being edited, at the given position. A bookmark has two
+      methods <code>find()</code> and <code>clear()</code>. The first
+      returns the current position of the bookmark, if it is still in
+      the document, and the second explicitly removes the
+      bookmark.</dd>
+
+      <dt id="findMarksAt"><code>findMarksAt(pos) → array</code></dt>
+      <dd>Returns an array of all the bookmarks and marked ranges
+      present at the given position.</dd>
+
+      <dt id="setMarker"><code>setMarker(line, text, className) → lineHandle</code></dt>
+      <dd>Add a gutter marker for the given line. Gutter markers are
+      shown in the line-number area (instead of the number for this
+      line). Both <code>text</code> and <code>className</code> are
+      optional. Setting <code>text</code> to a Unicode character like
+      ● tends to give a nice effect. To put a picture in the gutter,
+      set <code>text</code> to a space and <code>className</code> to
+      something that sets a background image. If you
+      specify <code>text</code>, the given text (which may contain
+      HTML) will, by default, replace the line number for that line.
+      If this is not what you want, you can include the
+      string <code>%N%</code> in the text, which will be replaced by
+      the line number.</dd>
+      <dt id="clearMarker"><code>clearMarker(line)</code></dt>
+      <dd>Clears a marker created
+      with <code>setMarker</code>. <code>line</code> can be either a
+      number or a handle returned by <code>setMarker</code> (since a
+      number may now refer to a different line if something was added
+      or deleted).</dd>
+      <dt id="setLineClass"><code>setLineClass(line, className, backgroundClassName) → lineHandle</code></dt>
+      <dd>Set a CSS class name for the given line. <code>line</code>
+      can be a number or a line handle (as returned
+      by <code>setMarker</code> or this
+      function). <code>className</code> will be used to style the text
+      for the line, and <code>backgroundClassName</code> to style its
+      background (which lies behind the selection).
+      Pass <code>null</code> to clear the classes for a line.</dd>
+      <dt id="hideLine"><code>hideLine(line) → lineHandle</code></dt>
+      <dd>Hide the given line (either by number or by handle). Hidden
+      lines don't show up in the editor, and their numbers are skipped
+      when <a href="#option_lineNumbers">line numbers</a> are enabled.
+      Deleting a region around them does delete them, and coping a
+      region around will include them in the copied text.</dd>
+      <dt id="showLine"><code>showLine(line) → lineHandle</code></dt>
+      <dd>The inverse of <code>hideLine</code>—re-shows a previously
+      hidden line, by number or by handle.</dd>
+
+      <dt id="onDeleteLine"><code>onDeleteLine(line, func)</code></dt>
+      <dd>Register a function that should be called when the line is
+      deleted from the document.</dd>
+
+      <dt id="lineInfo"><code>lineInfo(line) → object</code></dt>
+      <dd>Returns the line number, text content, and marker status of
+      the given line, which can be either a number or a handle
+      returned by <code>setMarker</code>. The returned object has the
+      structure <code>{line, handle, text, markerText, markerClass,
+      lineClass, bgClass}</code>.</dd>
+
+      <dt id="getLineHandle"><code>getLineHandle(num) → lineHandle</code></dt>
+      <dd>Fetches the line handle for the given line number.</dd>
+
+      <dt id="addWidget"><code>addWidget(pos, node, scrollIntoView)</code></dt>
+      <dd>Puts <code>node</code>, which should be an absolutely
+      positioned DOM node, into the editor, positioned right below the
+      given <code>{line, ch}</code> position.
+      When <code>scrollIntoView</code> is true, the editor will ensure
+      that the entire node is visible (if possible). To remove the
+      widget again, simply use DOM methods (move it somewhere else, or
+      call <code>removeChild</code> on its parent).</dd>
+
+      <dt id="matchBrackets"><code>matchBrackets()</code></dt>
+      <dd>Force matching-bracket-highlighting to happen.</dd>
+
+      <dt id="lineCount"><code>lineCount() → number</code></dt>
+      <dd>Get the number of lines in the editor.</dd>
+
+      <dt id="getCursor"><code>getCursor(start) → object</code></dt>
+      <dd><code>start</code> is a boolean indicating whether the start
+      or the end of the selection must be retrieved. If it is not
+      given, the current cursor pos, i.e. the side of the selection
+      that would move if you pressed an arrow key, is chosen.
+      A <code>{line, ch}</code> object will be returned.</dd>
+      <dt id="somethingSelected"><code>somethingSelected() → boolean</code></dt>
+      <dd>Return true if any text is selected.</dd>
+      <dt id="setCursor"><code>setCursor(pos)</code></dt>
+      <dd>Set the cursor position. You can either pass a
+      single <code>{line, ch}</code> object, or the line and the
+      character as two separate parameters.</dd>
+      <dt id="setSelection"><code>setSelection(start, end)</code></dt>
+      <dd>Set the selection range. <code>start</code>
+      and <code>end</code> should be <code>{line, ch}</code> objects.</dd>
+
+      <dt id="getLine"><code>getLine(n) → string</code></dt>
+      <dd>Get the content of line <code>n</code>.</dd>
+      <dt id="setLine"><code>setLine(n, text)</code></dt>
+      <dd>Set the content of line <code>n</code>.</dd>
+      <dt id="removeLine"><code>removeLine(n)</code></dt>
+      <dd>Remove the given line from the document.</dd>
+
+      <dt id="getRange"><code>getRange(from, to) → string</code></td>
+      <dd>Get the text between the given points in the editor, which
+      should be <code>{line, ch}</code> objects.</dd>
+      <dt id="replaceRange"><code>replaceRange(string, from, to)</code></dt>
+      <dd>Replace the part of the document between <code>from</code>
+      and <code>to</code> with the given string. <code>from</code>
+      and <code>to</code> must be <code>{line, ch}</code>
+      objects. <code>to</code> can be left off to simply insert the
+      string at position <code>from</code>.</dd>
+
+      <dt id="posFromIndex"><code>posFromIndex(index) → object</code></dt>
+      <dd>Calculates and returns a <code>{line, ch}</code> object for a
+      zero-based <code>index</code> who's value is relative to the start of the
+      editor's text. If the <code>index</code> is out of range of the text then
+      the returned object is clipped to start or end of the text
+      respectively.</dd>
+      <dt id="indexFromPos"><code>indexFromPos(object) → number</code></dt>
+      <dd>The reverse of <a href="#posFromIndex"><code>posFromIndex</code></a>.</dd>
+    </dl>
+
+    <p>The following are more low-level methods:</p>
+
+    <dl>
+      <dt id="operation"><code>operation(func) → result</code></dt>
+      <dd>CodeMirror internally buffers changes and only updates its
+      DOM structure after it has finished performing some operation.
+      If you need to perform a lot of operations on a CodeMirror
+      instance, you can call this method with a function argument. It
+      will call the function, buffering up all changes, and only doing
+      the expensive update after the function returns. This can be a
+      lot faster. The return value from this method will be the return
+      value of your function.</dd>
+
+      <dt id="compoundChange"><code>compoundChange(func) → result</code></dt>
+      <dd>Will call the given function (and return its result),
+      combining all changes made while that function executes into a
+      single undo event.</dd>
+
+      <dt id="refresh"><code>refresh()</code></dt>
+      <dd>If your code does something to change the size of the editor
+      element (window resizes are already listened for), or unhides
+      it, you should probably follow up by calling this method to
+      ensure CodeMirror is still looking as intended.</dd>
+
+      <dt id="getInputField"><code>getInputField() → textarea</code></dt>
+      <dd>Returns the hidden textarea used to read input.</dd>
+      <dt id="getWrapperElement"><code>getWrapperElement() → node</code></dt>
+      <dd>Returns the DOM node that represents the editor. Remove this
+      from your tree to delete an editor instance.</dd>
+      <dt id="getScrollerElement"><code>getScrollerElement() → node</code></dt>
+      <dd>Returns the DOM node that is responsible for the sizing and
+      the scrolling of the editor. You can change
+      the <code>height</code> and <code>width</code> styles of this
+      element to resize an editor. (You might have to call
+      the <a href="#refresh"><code>refresh</code></a> method
+      afterwards.)</dd>
+      <dt id="getGutterElement"><code>getGutterElement() → node</code></dt>
+      <dd>Fetches the DOM node that represents the editor gutter.</dd>
+
+      <dt id="getStateAfter"><code>getStateAfter(line) → state</code></dt>
+      <dd>Returns the mode's parser state, if any, at the end of the
+      given line number. If no line number is given, the state at the
+      end of the document is returned. This can be useful for storing
+      parsing errors in the state, or getting other kinds of
+      contextual information for a line.</dd>
+    </dl>
+
+    <p id="fromTextArea">Finally, the <code>CodeMirror</code> object
+    itself has a method <code>fromTextArea</code>. This takes a
+    textarea DOM node as first argument and an optional configuration
+    object as second. It will replace the textarea with a CodeMirror
+    instance, and wire up the form of that textarea (if any) to make
+    sure the editor contents are put into the textarea when the form
+    is submitted. A CodeMirror instance created this way has two
+    additional methods:</p>
+
+    <dl>
+      <dt id="save"><code>save()</code></dt>
+      <dd>Copy the content of the editor into the textarea.</dd>
+
+      <dt id="toTextArea"><code>toTextArea()</code></dt>
+      <dd>Remove the editor, and restore the original textarea (with
+      the editor's current content).</dd>
+
+      <dt id="getTextArea"><code>getTextArea() → textarea</code></dt>
+      <dd>Returns the textarea that the instance was based on.</dd>
+    </dl>
+
+    <p id="defineExtension">If you want to define extra methods in terms
+    of the CodeMirror API, it is possible to
+    use <code>CodeMirror.defineExtension(name, value)</code>. This
+    will cause the given value (usually a method) to be added to all
+    CodeMirror instances created from then on.</p>
+
+    <h2 id="addons">Add-ons</h2>
+
+    <p>The <code>lib/util</code> directory in the distribution
+    contains a number of reusable components that implement extra
+    editor functionality. In brief, they are:</p>
+
+    <dl>
+      <dt id="util_dialog"><a href="../lib/util/dialog.js"><code>dialog.js</code></a></dt>
+      <dd>Provides a very simple way to query users for text input.
+      Adds an <code>openDialog</code> method to CodeMirror instances,
+      which can be called with an HTML fragment that provides the
+      prompt (should include an <code>input</code> tag), and a
+      callback function that is called when text has been entered.
+      Depends on <code>lib/util/dialog.css</code>.</dd>
+      <dt id="util_searchcursor"><a href="../lib/util/searchcursor.js"><code>searchcursor.js</code></a></dt>
+      <dd>Adds the <code>getSearchCursor(query, start, caseFold) →
+      cursor</code> method to CodeMirror instances, which can be used
+      to implement search/replace functionality. <code>query</code>
+      can be a regular expression or a string (only strings will match
+      across lines—if they contain newlines). <code>start</code>
+      provides the starting position of the search. It can be
+      a <code>{line, ch}</code> object, or can be left off to default
+      to the start of the document. <code>caseFold</code> is only
+      relevant when matching a string. It will cause the search to be
+      case-insensitive. A search cursor has the following methods:
+        <dl>
+          <dt><code>findNext(), findPrevious() → boolean</code></dt>
+          <dd>Search forward or backward from the current position.
+          The return value indicates whether a match was found. If
+          matching a regular expression, the return value will be the
+          array returned by the <code>match</code> method, in case you
+          want to extract matched groups.</dd>
+          <dt><code>from(), to() → object</code></dt>
+          <dd>These are only valid when the last call
+          to <code>findNext</code> or <code>findPrevious</code> did
+          not return false. They will return <code>{line, ch}</code>
+          objects pointing at the start and end of the match.</dd>
+          <dt><code>replace(text)</code></dt>
+          <dd>Replaces the currently found match with the given text
+          and adjusts the cursor position to reflect the
+          replacement.</dd>
+        </dl></dd>
+
+      <dt id="util_search"><a href="../lib/util/search.js"><code>search.js</code></a></dt>
+      <dd>Implements the search commands. CodeMirror has keys bound to
+      these by default, but will not do anything with them unless an
+      implementation is provided. Depends
+      on <code>searchcursor.js</code>, and will make use
+      of <a href="#util_dialog"><code>openDialog</code></a> when
+      available to make prompting for search queries less ugly.</dd>
+      <dt id="util_foldcode"><a href="../lib/util/foldcode.js"><code>foldcode.js</code></a></dt>
+      <dd>Helps with code folding.
+      See <a href="../demo/folding.html">the demo</a> for an example.
+      Call <code>CodeMirror.newFoldFunction</code> with a range-finder
+      helper function to create a function that will, when applied to
+      a CodeMirror instance and a line number, attempt to fold or
+      unfold the block starting at the given line. A range-finder is a
+      language-specific function that also takes an instance and a
+      line number, and returns an end line for the block, or null if
+      no block is started on that line. This file
+      provides <code>CodeMirror.braceRangeFinder</code>, which finds
+      blocks in brace languages (JavaScript, C, Java,
+      etc), <code>CodeMirror.indentRangeFinder</code>, for languages
+      where indentation determines block structure (Python, Haskell),
+      and <code>CodeMirror.tagRangeFinder</code>, for XML-style
+      languages.</dd>
+      <dt id="util_runmode"><a href="../lib/util/runmode.js"><code>runmode.js</code></a></dt>
+      <dd>Can be used to run a CodeMirror mode over text without
+      actually opening an editor instance.
+      See <a href="../demo/runmode.html">the demo</a> for an
+      example.</dd>
+      <dt id="util_simple-hint"><a href="../lib/util/simple-hint.js"><code>simple-hint.js</code></a></dt>
+      <dd>Provides a framework for showing autocompletion hints.
+      Defines <code>CodeMirror.simpleHint</code>, which takes a
+      CodeMirror instance and a hinting function, and pops up a widget
+      that allows the user to select a completion. Hinting functions
+      are function that take an editor instance, and return
+      a <code>{list, from, to}</code> object, where <code>list</code>
+      is an array of strings (the completions), and <code>from</code>
+      and <code>to</code> give the start and end of the token that is
+      being completed. Depends
+      on <code>lib/util/simple-hint.css</code>.</dd>
+      <dt id="util_javascript-hint"><a href="../lib/util/javascript-hint.js"><code>javascript-hint.js</code></a></dt>
+      <dd>Defines <code>CodeMirror.javascriptHint</code>
+      and <code>CodeMirror.coffeescriptHint</code>, which are simple
+      hinting functions for the JavaScript and CoffeeScript
+      modes.</dd>
+      <dt id="util_match-highlighter"><a href="../lib/util/match-highlighter.js"><code>match-highlighter.js</code></a></dt>
+      <dd>Adds a <code>matchHighlight</code> method to CodeMirror
+      instances that can be called (typically from
+      a <a href="#option_onCursorActivity"><code>onCursorActivity</code></a>
+      handler) to highlight all instances of a currently selected word
+      with the a classname given as a first argument to the method.
+      Depends on
+      the <a href="#util_searchcursor"><code>searchcursor</code></a>
+      add-on. Demo <a href="../demo/matchhighlighter.html">here</a>.</dd>
+      <dt id="util_closetag"><a href="../lib/util/closetag.js"><code>closetag.js</code></a></dt>
+      <dd>Provides utility functions for adding automatic tag closing
+      to XML modes. See
+      the <a href="../demo/closetag.html">demo</a>.</dd>
+      <dt id="util_loadmode"><a href="../lib/util/loadmode.js"><code>loadmode.js</code></a></dt>
+      <dd>Defines a <code>CodeMirror.requireMode(modename,
+      callback)</code> function that will try to load a given mode and
+      call the callback when it succeeded. You'll have to
+      set <code>CodeMirror.modeURL</code> to a string that mode paths
+      can be constructed from, for
+      example <code>"mode/%N/%N.js"</code>—the <code>%N</code>'s will
+      be replaced with the mode name. Also
+      defines <code>CodeMirror.autoLoadMode(instance, mode)</code>,
+      which will ensure the given mode is loaded and cause the given
+      editor instance to refresh its mode when the loading
+      succeeded. See the <a href="../demo/loadmode.html">demo</a>.</dd>
+    </dl>
+
+    <h2 id="modeapi">Writing CodeMirror Modes</h2>
+
+    <p>Modes typically consist of a single JavaScript file. This file
+    defines, in the simplest case, a lexer (tokenizer) for your
+    language—a function that takes a character stream as input,
+    advances it past a token, and returns a style for that token. More
+    advanced modes can also handle indentation for the language.</p>
+
+    <p id="defineMode">The mode script should
+    call <code>CodeMirror.defineMode</code> to register itself with
+    CodeMirror. This function takes two arguments. The first should be
+    the name of the mode, for which you should use a lowercase string,
+    preferably one that is also the name of the files that define the
+    mode (i.e. <code>"xml"</code> is defined <code>xml.js</code>). The
+    second argument should be a function that, given a CodeMirror
+    configuration object (the thing passed to
+    the <code>CodeMirror</code> function) and an optional mode
+    configuration object (as in
+    the <a href="#option_mode"><code>mode</code></a> option), returns
+    a mode object.</p>
+
+    <p>Typically, you should use this second argument
+    to <code>defineMode</code> as your module scope function (modes
+    should not leak anything into the global scope!), i.e. write your
+    whole mode inside this function.</p>
+
+    <p>The main responsibility of a mode script is <em>parsing</em>
+    the content of the editor. Depending on the language and the
+    amount of functionality desired, this can be done in really easy
+    or extremely complicated ways. Some parsers can be stateless,
+    meaning that they look at one element (<em>token</em>) of the code
+    at a time, with no memory of what came before. Most, however, will
+    need to remember something. This is done by using a <em>state
+    object</em>, which is an object that is always passed when
+    reading a token, and which can be mutated by the tokenizer.</p>
+
+    <p id="startState">Modes that use a state must define
+    a <code>startState</code> method on their mode object. This is a
+    function of no arguments that produces a state object to be used
+    at the start of a document.</p>
+
+    <p id="token">The most important part of a mode object is
+    its <code>token(stream, state)</code> method. All modes must
+    define this method. It should read one token from the stream it is
+    given as an argument, optionally update its state, and return a
+    style string, or <code>null</code> for tokens that do not have to
+    be styled. For your styles, you can either use the 'standard' ones
+    defined in the themes (without the <code>cm-</code> prefix), or
+    define your own and have people include a custom CSS file for your
+    mode.<p>
+
+    <p id="StringStream">The stream object encapsulates a line of code
+    (tokens may never span lines) and our current position in that
+    line. It has the following API:</p>
+
+    <dl>
+      <dt><code>eol() → boolean</code></dt>
+      <dd>Returns true only if the stream is at the end of the
+      line.</dd>
+      <dt><code>sol() → boolean</code></dt>
+      <dd>Returns true only if the stream is at the start of the
+      line.</dd>
+
+      <dt><code>peek() → character</code></dt>
+      <dd>Returns the next character in the stream without advancing
+      it. Will return <code>undefined</code> at the end of the
+      line.</dd>
+      <dt><code>next() → character</code></dt>
+      <dd>Returns the next character in the stream and advances it.
+      Also returns <code>undefined</code> when no more characters are
+      available.</dd>
+
+      <dt><code>eat(match) → character</code></dt>
+      <dd><code>match</code> can be a character, a regular expression,
+      or a function that takes a character and returns a boolean. If
+      the next character in the stream 'matches' the given argument,
+      it is consumed and returned. Otherwise, <code>undefined</code>
+      is returned.</dd>
+      <dt><code>eatWhile(match) → boolean</code></dt>
+      <dd>Repeatedly calls <code>eat</code> with the given argument,
+      until it fails. Returns true if any characters were eaten.</dd>
+      <dt><code>eatSpace() → boolean</code></dt>
+      <dd>Shortcut for <code>eatWhile</code> when matching
+      white-space.</dd>
+      <dt><code>skipToEnd()</code></dt>
+      <dd>Moves the position to the end of the line.</dd>
+      <dt><code>skipTo(ch) → boolean</code></dt>
+      <dd>Skips to the next occurrence of the given character, if
+      found on the current line (doesn't advance the stream if the
+      character does not occur on the line). Returns true if the
+      character was found.</dd>
+      <dt><code>match(pattern, consume, caseFold) → boolean</code></dt>
+      <dd>Act like a
+      multi-character <code>eat</code>—if <code>consume</code> is true
+      or not given—or a look-ahead that doesn't update the stream
+      position—if it is false. <code>pattern</code> can be either a
+      string or a regular expression starting with <code>^</code>.
+      When it is a string, <code>caseFold</code> can be set to true to
+      make the match case-insensitive. When successfully matching a
+      regular expression, the returned value will be the array
+      returned by <code>match</code>, in case you need to extract
+      matched groups.</dd>
+
+      <dt><code>backUp(n)</code></dt>
+      <dd>Backs up the stream <code>n</code> characters. Backing it up
+      further than the start of the current token will cause things to
+      break, so be careful.</dd>
+      <dt><code>column() → integer</code></dt>
+      <dd>Returns the column (taking into account tabs) at which the
+      current token starts. Can be used to find out whether a token
+      starts a new line.</dd>
+      <dt><code>indentation() → integer</code></dt>
+      <dd>Tells you how far the current line has been indented, in
+      spaces. Corrects for tab characters.</dd>
+
+      <dt><code>current() → string</code></dt>
+      <dd>Get the string between the start of the current token and
+      the current stream position.</dd>
+    </dl>
+
+    <p id="blankLine">By default, blank lines are simply skipped when
+    tokenizing a document. For languages that have significant blank
+    lines, you can define a <code>blankLine(state)</code> method on
+    your mode that will get called whenever a blank line is passed
+    over, so that it can update the parser state.</p>
+
+    <p id="copyState">Because state object are mutated, and CodeMirror
+    needs to keep valid versions of a state around so that it can
+    restart a parse at any line, copies must be made of state objects.
+    The default algorithm used is that a new state object is created,
+    which gets all the properties of the old object. Any properties
+    which hold arrays get a copy of these arrays (since arrays tend to
+    be used as mutable stacks). When this is not correct, for example
+    because a mode mutates non-array properties of its state object, a
+    mode object should define a <code>copyState</code> method,
+    which is given a state and should return a safe copy of that
+    state.</p>
+
+    <p id="compareStates">By default, CodeMirror will stop re-parsing
+    a document as soon as it encounters a few lines that were
+    highlighted the same in the old parse as in the new one. It is
+    possible to provide an explicit way to test whether a state is
+    equivalent to another one, which CodeMirror will use (instead of
+    the unchanged-lines heuristic) to decide when to stop
+    highlighting. You do this by providing
+    a <code>compareStates</code> method on your mode object, which
+    takes two state arguments and returns a boolean indicating whether
+    they are equivalent. See the XML mode, which uses this to provide
+    reliable highlighting of bad closing tags, as an example.</p>
+
+    <p id="indent">If you want your mode to provide smart indentation
+    (though the <a href="#indentLine"><code>indentLine</code></a>
+    method and the <code>indentAuto</code>
+    and <code>newlineAndIndent</code> commands, which keys can be
+    <a href="#option_extraKeys">bound</a> to), you must define
+    an <code>indent(state, textAfter)</code> method on your mode
+    object.</p>
+
+    <p>The indentation method should inspect the given state object,
+    and optionally the <code>textAfter</code> string, which contains
+    the text on the line that is being indented, and return an
+    integer, the amount of spaces to indent. It should usually take
+    the <a href="#option_indentUnit"><code>indentUnit</code></a>
+    option into account.</p>
+
+    <p id="electricChars">Finally, a mode may define
+    an <code>electricChars</code> property, which should hold a string
+    containing all the characters that should trigger the behaviour
+    described for
+    the <a href="#option_electricChars"><code>electricChars</code></a>
+    option.</p>
+
+    <p>So, to summarize, a mode <em>must</em> provide
+    a <code>token</code> method, and it <em>may</em>
+    provide <code>startState</code>, <code>copyState</code>,
+    <code>compareStates</code>, and <code>indent</code> methods. For
+    an example of a trivial mode, see
+    the <a href="../mode/diff/diff.js">diff mode</a>, for a more involved
+    example, see the <a href="../mode/clike/clike.js">C-like
+    mode</a>.</p>
+
+    <p>Sometimes, it is useful for modes to <em>nest</em>—to have one
+    mode delegate work to another mode. An example of this kind of
+    mode is the <a href="../mode/htmlmixed/htmlmixed.js">mixed-mode HTML
+    mode</a>. To implement such nesting, it is usually necessary to
+    create mode objects and copy states yourself. To create a mode
+    object, there are <code>CodeMirror.getMode(options,
+    parserConfig)</code>, where the first argument is a configuration
+    object as passed to the mode constructor function, and the second
+    argument is a mode specification as in
+    the <a href="#option_mode"><code>mode</code></a> option. To copy a
+    state object, call <code>CodeMirror.copyState(mode, state)</code>,
+    where <code>mode</code> is the mode that created the given
+    state.</p>
+
+    <p>To make indentation work properly in a nested parser, it is
+    advisable to give the <code>startState</code> method of modes that
+    are intended to be nested an optional argument that provides the
+    base indentation for the block of code. The JavaScript and CSS
+    parser do this, for example, to allow JavaScript and CSS code
+    inside the mixed-mode HTML mode to be properly indented.</p>
+
+    <p>Finally, it is possible to associate your mode, or a certain
+    configuration of your mode, with
+    a <a href="http://en.wikipedia.org/wiki/MIME">MIME</a> type. For
+    example, the JavaScript mode associates itself
+    with <code>text/javascript</code>, and its JSON variant
+    with <code>application/json</code>. To do this,
+    call <code>CodeMirror.defineMIME(mime, modeSpec)</code>,
+    where <code>modeSpec</code> can be a string or object specifying a
+    mode, as in the <a href="#option_mode"><code>mode</code></a>
+    option.</p>
+
+</div><div class="rightsmall blk">
+
+    <h2>Contents</h2>
+
+    <ul>
+      <li><a href="#overview">Overview</a></li>
+      <li><a href="#usage">Basic Usage</a></li>
+      <li><a href="#config">Configuration</a></li>
+      <li><a href="#keymaps">Keymaps</a></li>
+      <li><a href="#styling">Customized Styling</a></li>
+      <li><a href="#api">Programming API</a></li>
+      <li><a href="#addons">Add-ons</a></li>
+      <li><a href="#modeapi">Writing CodeMirror Modes</a></li>
+    </ul>
+
+</div></div>
+
+<div style="height: 2em"> </div>
+
+  </body>
+</html>
diff --git a/interface/codemirror/doc/oldrelease.html b/interface/codemirror/doc/oldrelease.html
new file mode 100755
index 0000000..a5cbbe1
--- /dev/null
+++ b/interface/codemirror/doc/oldrelease.html
@@ -0,0 +1,251 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror</title>
+    <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans:bold"/>
+    <link rel="stylesheet" type="text/css" href="docs.css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <link rel="alternate" href="http://twitter.com/statuses/user_timeline/242283288.rss" type="application/rss+xml"/>
+  </head>
+  <body>
+
+<h1><span class="logo-braces">{ }</span> <a href="http://codemirror.net/">CodeMirror</a></h1>
+
+<pre class="grey">
+<img src="baboon.png" class="logo" alt="logo"/>/* Old release history */
+
+</pre>
+
+  <p class="rel">23-08-2011: <a href="http://codemirror.net/codemirror-2.13.zip">Version 2.13</a>:</p>
+  <ul class="rel-note">
+    <li>Add <a href="../mode/ruby/index.html">Ruby</a>, <a href="../mode/r/index.html">R</a>, <a href="../mode/coffeescript/index.html">CoffeeScript</a>, and <a href="../mode/velocity/index.html">Velocity</a> modes.</li>
+    <li>Add <a href="manual.html#getGutterElement"><code>getGutterElement</code></a> to API.</li>
+    <li>Several fixes to scrolling and positioning.</li>
+    <li>Add <a href="manual.html#option_smartHome"><code>smartHome</code></a> option.</li>
+    <li>Add an experimental <a href="../mode/xmlpure/index.html">pure XML</a> mode.</li>
+  </ul>
+
+  <p class="rel">25-07-2011: <a href="http://codemirror.net/codemirror-2.12.zip">Version 2.12</a>:</p>
+  <ul class="rel-note">
+    <li>Add a <a href="../mode/sparql/index.html">SPARQL</a> mode.</li>
+    <li>Fix bug with cursor jumping around in an unfocused editor in IE.</li>
+    <li>Allow key and mouse events to bubble out of the editor. Ignore widget clicks.</li>
+    <li>Solve cursor flakiness after undo/redo.</li>
+    <li>Fix block-reindent ignoring the last few lines.</li>
+    <li>Fix parsing of multi-line attrs in XML mode.</li>
+    <li>Use <code>innerHTML</code> for HTML-escaping.</li>
+    <li>Some fixes to indentation in C-like mode.</li>
+    <li>Shrink horiz scrollbars when long lines removed.</li>
+    <li>Fix width feedback loop bug that caused the width of an inner DIV to shrink.</li>
+  </ul>
+
+  <p class="rel">04-07-2011: <a href="http://codemirror.net/codemirror-2.11.zip">Version 2.11</a>:</p>
+  <ul class="rel-note">
+    <li>Add a <a href="../mode/scheme/index.html">Scheme mode</a>.</li>
+    <li>Add a <code>replace</code> method to search cursors, for cursor-preserving replacements.</li>
+    <li>Make the <a href="../mode/clike/index.html">C-like mode</a> mode more customizable.</li>
+    <li>Update XML mode to spot mismatched tags.</li>
+    <li>Add <code>getStateAfter</code> API and <code>compareState</code> mode API methods for finer-grained mode magic.</li>
+    <li>Add a <code>getScrollerElement</code> API method to manipulate the scrolling DIV.</li>
+    <li>Fix drag-and-drop for Firefox.</li>
+    <li>Add a C# configuration for the <a href="../mode/clike/index.html">C-like mode</a>.</li>
+    <li>Add <a href="../demo/fullscreen.html">full-screen editing</a> and <a href="../demo/changemode.html">mode-changing</a> demos.</li>
+  </ul>
+
+  <p class="rel">07-06-2011: <a href="http://codemirror.net/codemirror-2.1.zip">Version 2.1</a>:</p>
+  <p class="rel-note">Add
+  a <a href="manual.html#option_theme">theme</a> system
+  (<a href="../demo/theme.html">demo</a>). Note that this is not
+  backwards-compatible—you'll have to update your styles and
+  modes!</p>
+
+  <p class="rel">07-06-2011: <a href="http://codemirror.net/codemirror-2.02.zip">Version 2.02</a>:</p>
+  <ul class="rel-note">
+    <li>Add a <a href="../mode/lua/index.html">Lua mode</a>.</li>
+    <li>Fix reverse-searching for a regexp.</li>
+    <li>Empty lines can no longer break highlighting.</li>
+    <li>Rework scrolling model (the outer wrapper no longer does the scrolling).</li>
+    <li>Solve horizontal jittering on long lines.</li>
+    <li>Add <a href="../demo/runmode.html">runmode.js</a>.</li>
+    <li>Immediately re-highlight text when typing.</li>
+    <li>Fix problem with 'sticking' horizontal scrollbar.</li>
+  </ul>
+
+  <p class="rel">26-05-2011: <a href="http://codemirror.net/codemirror-2.01.zip">Version 2.01</a>:</p>
+  <ul class="rel-note">
+    <li>Add a <a href="../mode/smalltalk/index.html">Smalltalk mode</a>.</li>
+    <li>Add a <a href="../mode/rst/index.html">reStructuredText mode</a>.</li>
+    <li>Add a <a href="../mode/python/index.html">Python mode</a>.</li>
+    <li>Add a <a href="../mode/plsql/index.html">PL/SQL mode</a>.</li>
+    <li><code>coordsChar</code> now works</li>
+    <li>Fix a problem where <code>onCursorActivity</code> interfered with <code>onChange</code>.</li>
+    <li>Fix a number of scrolling and mouse-click-position glitches.</li>
+    <li>Pass information about the changed lines to <code>onChange</code>.</li>
+    <li>Support cmd-up/down on OS X.</li>
+    <li>Add triple-click line selection.</li>
+    <li>Don't handle shift when changing the selection through the API.</li>
+    <li>Support <code>"nocursor"</code> mode for <code>readOnly</code> option.</li>
+    <li>Add an <code>onHighlightComplete</code> option.</li>
+    <li>Fix the context menu for Firefox.</li>
+  </ul>
+
+  <p class="rel">28-03-2011: <a href="http://codemirror.net/codemirror-2.0.zip">Version 2.0</a>:</p>
+  <p class="rel-note">CodeMirror 2 is a complete rewrite that's
+  faster, smaller, simpler to use, and less dependent on browser
+  quirks. See <a href="internals.html">this</a>
+  and <a href="http://groups.google.com/group/codemirror/browse_thread/thread/5a8e894024a9f580">this</a>
+  for more information.</a>
+
+  <p class="rel">28-03-2011: <a href="http://codemirror.net/codemirror-1.0.zip">Version 1.0</a>:</p>
+  <ul class="rel-note">
+    <li>Fix error when debug history overflows.</li>
+    <li>Refine handling of C# verbatim strings.</li>
+    <li>Fix some issues with JavaScript indentation.</li>
+  </ul>
+
+  <p class="rel">22-02-2011: <a href="https://github.com/marijnh/codemirror2/tree/beta2">Version 2.0 beta 2</a>:</p>
+  <p class="rel-note">Somewhat more mature API, lots of bugs shaken out.</a>
+
+  <p class="rel">17-02-2011: <a href="http://codemirror.net/codemirror-0.94.zip">Version 0.94</a>:</p>
+  <ul class="rel-note">
+    <li><code>tabMode: "spaces"</code> was modified slightly (now indents when something is selected).</li>
+    <li>Fixes a bug that would cause the selection code to break on some IE versions.</li>
+    <li>Disabling spell-check on WebKit browsers now works.</li>
+  </ul>
+
+  <p class="rel">08-02-2011: <a href="http://codemirror.net/">Version 2.0 beta 1</a>:</p>
+  <p class="rel-note">CodeMirror 2 is a complete rewrite of
+  CodeMirror, no longer depending on an editable frame.</p>
+
+  <p class="rel">19-01-2011: <a href="http://codemirror.net/codemirror-0.93.zip">Version 0.93</a>:</p>
+  <ul class="rel-note">
+    <li>Added a <a href="contrib/regex/index.html">Regular Expression</a> parser.</li>
+    <li>Fixes to the PHP parser.</li>
+    <li>Support for regular expression in search/replace.</li>
+    <li>Add <code>save</code> method to instances created with <code>fromTextArea</code>.</li>
+    <li>Add support for MS T-SQL in the SQL parser.</li>
+    <li>Support use of CSS classes for highlighting brackets.</li>
+    <li>Fix yet another hang with line-numbering in hidden editors.</li>
+  </ul>
+
+  <p class="rel">17-12-2010: <a href="http://codemirror.net/codemirror-0.92.zip">Version 0.92</a>:</p>
+  <ul class="rel-note">
+    <li>Make CodeMirror work in XHTML documents.</li>
+    <li>Fix bug in handling of backslashes in Python strings.</li>
+    <li>The <code>styleNumbers</code> option is now officially
+    supported and documented.</li>
+    <li><code>onLineNumberClick</code> option added.</li>
+    <li>More consistent names <code>onLoad</code> and
+    <code>onCursorActivity</code> callbacks. Old names still work, but
+    are deprecated.</li>
+    <li>Add a <a href="contrib/freemarker/index.html">Freemarker</a> mode.</li>
+  </ul>
+
+  <p class="rel">11-11-2010: <a
+  href="http://codemirror.net/codemirror-0.91.zip">Version 0.91</a>:</p>
+  <ul class="rel-note">
+    <li>Adds support for <a href="contrib/java">Java</a>.</li>
+    <li>Small additions to the <a href="contrib/php">PHP</a> and <a href="contrib/sql">SQL</a> parsers.</li>
+    <li>Work around various <a href="https://bugs.webkit.org/show_bug.cgi?id=47806">Webkit</a> <a href="https://bugs.webkit.org/show_bug.cgi?id=23474">issues</a>.</li>
+    <li>Fix <code>toTextArea</code> to update the code in the textarea.</li>
+    <li>Add a <code>noScriptCaching</code> option (hack to ease development).</li>
+    <li>Make sub-modes of <a href="mixedtest.html">HTML mixed</a> mode configurable.</li>
+  </ul>
+
+  <p class="rel">02-10-2010: <a
+  href="http://codemirror.net/codemirror-0.9.zip">Version 0.9</a>:</p>
+  <ul class="rel-note">
+    <li>Add support for searching backwards.</li>
+    <li>There are now parsers for <a href="contrib/scheme/index.html">Scheme</a>, <a href="contrib/xquery/index.html">XQuery</a>, and <a href="contrib/ometa/index.html">OmetaJS</a>.</li>
+    <li>Makes <code>height: "dynamic"</code> more robust.</li>
+    <li>Fixes bug where paste did not work on OS X.</li>
+    <li>Add a <code>enterMode</code> and <code>electricChars</code> options to make indentation even more customizable.</li>
+    <li>Add <code>firstLineNumber</code> option.</li>
+    <li>Fix bad handling of <code>@media</code> rules by the CSS parser.</li>
+    <li>Take a new, more robust approach to working around the invisible-last-line bug in WebKit.</li>
+  </ul>
+
+  <p class="rel">22-07-2010: <a
+  href="http://codemirror.net/codemirror-0.8.zip">Version 0.8</a>:</p>
+  <ul class="rel-note">
+    <li>Add a <code>cursorCoords</code> method to find the screen
+    coordinates of the cursor.</li>
+    <li>A number of fixes and support for more syntax in the PHP parser.</li>
+    <li>Fix indentation problem with JSON-mode JS parser in Webkit.</li>
+    <li>Add a <a href="compress.html">minification</a> UI.</li>
+    <li>Support a <code>height: dynamic</code> mode, where the editor's
+    height will adjust to the size of its content.</li>
+    <li>Better support for IME input mode.</li>
+    <li>Fix JavaScript parser getting confused when seeing a no-argument
+    function call.</li>
+    <li>Have CSS parser see the difference between selectors and other
+    identifiers.</li>
+    <li>Fix scrolling bug when pasting in a horizontally-scrolled
+    editor.</li>
+    <li>Support <code>toTextArea</code> method in instances created with
+    <code>fromTextArea</code>.</li>
+    <li>Work around new Opera cursor bug that causes the cursor to jump
+    when pressing backspace at the end of a line.</li>
+  </ul>
+
+  <p class="rel">27-04-2010: <a
+  href="http://codemirror.net/codemirror-0.67.zip">Version
+  0.67</a>:</p>
+  <p class="rel-note">More consistent page-up/page-down behaviour
+  across browsers. Fix some issues with hidden editors looping forever
+  when line-numbers were enabled. Make PHP parser parse
+  <code>"\\"</code> correctly. Have <code>jumpToLine</code> work on
+  line handles, and add <code>cursorLine</code> function to fetch the
+  line handle where the cursor currently is. Add new
+  <code>setStylesheet</code> function to switch style-sheets in a
+  running editor.</p>
+
+  <p class="rel">01-03-2010: <a
+  href="http://codemirror.net/codemirror-0.66.zip">Version
+  0.66</a>:</p>
+  <p class="rel-note">Adds <code>removeLine</code> method to API.
+  Introduces the <a href="contrib/plsql/index.html">PLSQL parser</a>.
+  Marks XML errors by adding (rather than replacing) a CSS class, so
+  that they can be disabled by modifying their style. Fixes several
+  selection bugs, and a number of small glitches.</p>
+
+  <p class="rel">12-11-2009: <a
+  href="http://codemirror.net/codemirror-0.65.zip">Version
+  0.65</a>:</p>
+  <p class="rel-note">Add support for having both line-wrapping and
+  line-numbers turned on, make paren-highlighting style customisable
+  (<code>markParen</code> and <code>unmarkParen</code> config
+  options), work around a selection bug that Opera
+  <em>re</em>introduced in version 10.</p>
+
+  <p class="rel">23-10-2009: <a
+  href="http://codemirror.net/codemirror-0.64.zip">Version
+  0.64</a>:</p>
+  <p class="rel-note">Solves some issues introduced by the
+  paste-handling changes from the previous release. Adds
+  <code>setSpellcheck</code>, <code>setTextWrapping</code>,
+  <code>setIndentUnit</code>, <code>setUndoDepth</code>,
+  <code>setTabMode</code>, and <code>setLineNumbers</code> to
+  customise a running editor. Introduces an <a
+  href="contrib/sql/index.html">SQL</a> parser. Fixes a few small
+  problems in the <a href="contrib/python/index.html">Python</a>
+  parser. And, as usual, add workarounds for various newly discovered
+  browser incompatibilities.</p>
+
+<p class="rel"><em>31-08-2009</em>: <a
+href="http://codemirror.net/codemirror-0.63.zip">Version
+0.63</a>:</p>
+<p class="rel-note"> Overhaul of paste-handling (less fragile), fixes for several
+serious IE8 issues (cursor jumping, end-of-document bugs) and a number
+of small problems.</p>
+
+<p class="rel"><em>30-05-2009</em>: <a
+href="http://codemirror.net/codemirror-0.62.zip">Version
+0.62</a>:</p>
+<p class="rel-note">Introduces <a href="contrib/python/index.html">Python</a>
+and <a href="contrib/lua/index.html">Lua</a> parsers. Add
+<code>setParser</code> (on-the-fly mode changing) and
+<code>clearHistory</code> methods. Make parsing passes time-based
+instead of lines-based (see the <code>passTime</code> option).</p>
+
+</body></html>
diff --git a/interface/codemirror/doc/reporting.html b/interface/codemirror/doc/reporting.html
new file mode 100755
index 0000000..915fa52
--- /dev/null
+++ b/interface/codemirror/doc/reporting.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Reporting Bugs</title>
+    <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans:bold"/>
+    <link rel="stylesheet" type="text/css" href="docs.css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <style>li { margin-top: 1em; }</style>
+  </head>
+  <body>
+
+<h1><span class="logo-braces">{ }</span> <a href="http://codemirror.net/">CodeMirror</a></h1>
+
+<pre class="grey">
+<img src="baboon.png" class="logo" alt="logo"/>/* Reporting bugs
+   effectively */
+</pre>
+
+<div class="left">
+
+<p>So you found a problem in CodeMirror. By all means, report it! Bug
+reports from users are the main drive behind improvements to
+CodeMirror. But first, please read over these points:</p>
+
+<ol>
+  <li>CodeMirror is maintained by volunteers. They don't owe you
+  anything, so be polite. Reports with an indignant or belligerent
+  tone tend to be moved to the bottom of the pile.</li>
+
+  <li>Include information about <strong>the browser in which the
+  problem occurred</strong>. Even if you tested several browsers, and
+  the problem occurred in all of them, mention this fact in the bug
+  report. Also include browser version numbers and the operating
+  system that you're on.</li>
+
+  <li>Mention which release of CodeMirror you're using. Preferably,
+  try also with the current development snapshot, to ensure the
+  problem has not already been fixed.</li>
+
+  <li>Mention very precisely what went wrong. "X is broken" is not a
+  good bug report. What did you expect to happen? What happened
+  instead? Describe the exact steps a maintainer has to take to make
+  the problem occur. We can not fix something that we can not
+  observe.</li>
+
+  <li>If the problem can not be reproduced in any of the demos
+  included in the CodeMirror distribution, please provide an HTML
+  document that demonstrates the problem. The best way to do this is
+  to go to <a href="http://jsbin.com/ihunin/edit">jsbin.com</a>, enter
+  it there, press save, and include the resulting link in your bug
+  report.</li>
+</ol>
+
+</div>
+
+  </body>
+</html>
diff --git a/interface/codemirror/doc/upgrade_v2.2.html b/interface/codemirror/doc/upgrade_v2.2.html
new file mode 100755
index 0000000..a6d0236
--- /dev/null
+++ b/interface/codemirror/doc/upgrade_v2.2.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Upgrading to v2.2</title>
+    <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans:bold"/>
+    <link rel="stylesheet" type="text/css" href="docs.css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+  </head>
+  <body>
+
+<h1><span class="logo-braces">{ }</span> <a href="http://codemirror.net/">CodeMirror</a></h1>
+
+<pre class="grey">
+<img src="baboon.png" class="logo" alt="logo"/>/* Upgrading to v2.2
+ */
+</pre>
+
+<div class="left">
+
+<p>There are a few things in the 2.2 release that require some care
+when upgrading.</p>
+
+<h2>No more default.css</h2>
+
+<p>The default theme is now included
+in <a href="../lib/codemirror.css"><code>codemirror.css</code></a>, so
+you do not have to included it separately anymore. (It was tiny, so
+even if you're not using it, the extra data overhead is negligible.)
+
+<h2>Different key customization</h2>
+
+<p>CodeMirror has moved to a system
+where <a href="manual.html#option_keyMap">keymaps</a> are used to
+bind behavior to keys. This means <a href="../demo/emacs.html">custom
+bindings</a> are now possible.</p>
+
+<p>Three options that influenced key
+behavior, <code>tabMode</code>, <code>enterMode</code>,
+and <code>smartHome</code>, are no longer supported. Instead, you can
+provide custom bindings to influence the way these keys act. This is
+done through the
+new <a href="manual.html#option_extraKeys"><code>extraKeys</code></a>
+option, which can hold an object mapping key names to functionality. A
+simple example would be:</p>
+
+<pre>  extraKeys: {
+    "Ctrl-S": function(instance) { saveText(instance.getValue()); },
+    "Ctrl-/": "undo"
+  }</pre>
+
+<p>Keys can be mapped either to functions, which will be given the
+editor instance as argument, or to strings, which are mapped through
+functions through the <code>CodeMirror.commands</code> table, which
+contains all the built-in editing commands, and can be inspected and
+extended by external code.</p>
+
+<p>By default, the <code>Home</code> key is bound to
+the <code>"goLineStartSmart"</code> command, which moves the cursor to
+the first non-whitespace character on the line. You can set do this to
+make it always go to the very start instead:</p>
+
+<pre>  extraKeys: {"Home": "goLineStart"}</pre>
+
+<p>Similarly, <code>Enter</code> is bound
+to <code>"newlineAndIndent"</code> by default. You can bind it to
+something else to get different behavior. To disable special handling
+completely and only get a newline character inserted, you can bind it
+to <code>false</code>:</p>
+
+<pre>  extraKeys: {"Enter": false}</pre>
+
+<p>The same works for <code>Tab</code>. If you don't want CodeMirror
+to handle it, bind it to <code>false</code>. The default behaviour is
+to indent the current line more (<code>"indentMore"</code> command),
+and indent it less when shift is held (<code>"indentLess"</code>).
+There are also <code>"indentAuto"</code> (smart indent)
+and <code>"insertTab"</code> commands provided for alternate
+behaviors. Or you can write your own handler function to do something
+different altogether.</p>
+
+<h2>Tabs</h2>
+
+<p>Handling of tabs changed completely. The display width of tabs can
+now be set with the <code>tabSize</code> option, and tabs can
+be <a href="../demo/visibletabs.html">styled</a> by setting CSS rules
+for the <code>cm-tab</code> class.</p>
+
+<p>The default width for tabs is now 4, as opposed to the 8 that is
+hard-wired into browsers. If you are relying on 8-space tabs, make
+sure you explicitly set <code>tabSize: 8</code> in your options.</p>
+
+</div>
+
+  </body>
+</html>
diff --git a/interface/codemirror/index.html b/interface/codemirror/index.html
new file mode 100755
index 0000000..16f8fa9
--- /dev/null
+++ b/interface/codemirror/index.html
@@ -0,0 +1,411 @@
+<!doctype html>
+<html>  
+  <head>
+    <title>CodeMirror</title>
+    <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans:bold"/>
+    <link rel="stylesheet" type="text/css" href="doc/docs.css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <link rel="alternate" href="http://twitter.com/statuses/user_timeline/242283288.rss" type="application/rss+xml"/>
+  </head>
+  <body>
+
+<h1><span class="logo-braces">{ }</span> <a href="http://codemirror.net/">CodeMirror</a></h1>
+
+<pre class="grey">
+<img src="doc/baboon.png" class="logo" alt="logo"/>/* In-browser code editing
+   made bearable */
+</pre>
+
+<div class="clear"><div class="left blk">
+
+  <p style="margin-top: 0">CodeMirror is a JavaScript component that
+  provides a code editor in the browser. When a mode is available for
+  the language you are coding in, it will color your code, and
+  optionally help with indentation.</p>
+
+  <p>A <a href="doc/manual.html">rich programming API</a> and a CSS
+  theming system are available for customizing CodeMirror to fit your
+  application, and extending it with new functionality.</p>
+
+  <div class="clear"><div class="left1 blk">
+
+    <h2 style="margin-top: 0">Supported modes:</h2>
+
+    <ul>
+      <li><a href="mode/clike/index.html">C, C++, C#, Java, and similar</a></li>
+      <li><a href="mode/clojure/index.html">Clojure</a></li>
+      <li><a href="mode/coffeescript/index.html">CoffeeScript</a></li>
+      <li><a href="mode/css/index.html">CSS</a></li>
+      <li><a href="mode/diff/index.html">diff</a></li>
+      <li><a href="mode/ecl/index.html">ECL</a></li>
+      <li><a href="mode/erlang/index.html">Erlang</a></li>
+      <li><a href="mode/go/index.html">Go</a></li>
+      <li><a href="mode/groovy/index.html">Groovy</a></li>
+      <li><a href="mode/haskell/index.html">Haskell</a></li>
+      <li><a href="mode/htmlembedded/index.html">HTML embedded scripts</a></li>
+      <li><a href="mode/htmlmixed/index.html">HTML mixed-mode</a></li>
+      <li><a href="mode/javascript/index.html">JavaScript</a></li>
+      <li><a href="mode/jinja2/index.html">Jinja2</a></li>
+      <li><a href="mode/less/index.html">LESS</a></li>
+      <li><a href="mode/lua/index.html">Lua</a></li>
+      <li><a href="mode/markdown/index.html">Markdown</a> (<a href="mode/gfm/index.html">Github-flavour</a>)</li>
+      <li><a href="mode/mysql/index.html">MySQL</a></li>
+      <li><a href="mode/ntriples/index.html">NTriples</a></li>
+      <li><a href="mode/pascal/index.html">Pascal</a></li>
+      <li><a href="mode/perl/index.html">Perl</a></li>
+      <li><a href="mode/php/index.html">PHP</a></li>
+      <li><a href="mode/pig/index.html">Pig Latin</a></li>
+      <li><a href="mode/plsql/index.html">PL/SQL</a></li>
+      <li><a href="mode/properties/index.html">Properties files</a></li>
+      <li><a href="mode/python/index.html">Python</a></li>
+      <li><a href="mode/r/index.html">R</a></li>
+      <li>RPM <a href="mode/rpm/spec/index.html">spec</a> and <a href="mode/rpm/changes/index.html">changelog</a></li>
+      <li><a href="mode/rst/index.html">reStructuredText</a></li>
+      <li><a href="mode/ruby/index.html">Ruby</a></li>
+      <li><a href="mode/rust/index.html">Rust</a></li>
+      <li><a href="mode/scheme/index.html">Scheme</a></li>
+      <li><a href="mode/shell/index.html">Shell</a></li>
+      <li><a href="mode/smalltalk/index.html">Smalltalk</a></li>
+      <li><a href="mode/smarty/index.html">Smarty</a></li>
+      <li><a href="mode/sparql/index.html">SPARQL</a></li>
+      <li><a href="mode/stex/index.html">sTeX, LaTeX</a></li>
+      <li><a href="mode/tiddlywiki/index.html">Tiddlywiki</a></li>
+      <li><a href="mode/tiki/index.html">Tiki wiki</a></li>
+      <li><a href="mode/vbscript/index.html">VBScript</a></li>
+      <li><a href="mode/velocity/index.html">Velocity</a></li>
+      <li><a href="mode/verilog/index.html">Verilog</a></li>
+      <li><a href="mode/xml/index.html">XML/HTML</a></li>
+      <li><a href="mode/xquery/index.html">XQuery</a></li>
+      <li><a href="mode/yaml/index.html">YAML</a></li>
+    </ul>
+
+  </div><div class="left2 blk">
+
+    <h2 style="margin-top: 0">Usage demos:</h2>
+
+    <ul>
+      <li><a href="demo/complete.html">Autocompletion</a></li>
+      <li><a href="demo/mustache.html">Mode overlays</a></li>
+      <li><a href="demo/search.html">Search/replace</a></li>
+      <li><a href="demo/folding.html">Code folding</a></li>
+      <li><a href="demo/preview.html">HTML editor with preview</a></li>
+      <li><a href="demo/resize.html">Auto-resizing editor</a></li>
+      <li><a href="demo/marker.html">Setting breakpoints</a></li>
+      <li><a href="demo/activeline.html">Highlighting the current line</a></li>
+      <li><a href="demo/matchhighlighter.html">Highlighting selection matches</a></li>
+      <li><a href="demo/theme.html">Theming</a></li>
+      <li><a href="demo/runmode.html">Stand-alone highlighting</a></li>
+      <li><a href="demo/fullscreen.html">Full-screen editing</a></li>
+      <li><a href="demo/changemode.html">Mode auto-changing</a></li>
+      <li><a href="demo/visibletabs.html">Visible tabs</a></li>
+      <li><a href="demo/formatting.html">Autoformatting of code</a></li>
+      <li><a href="demo/emacs.html">Emacs keybindings</a></li>
+      <li><a href="demo/vim.html">Vim keybindings</a></li>
+      <li><a href="demo/closetag.html">Automatic xml tag closing</a></li>
+      <li><a href="demo/loadmode.html">Lazy mode loading</a></li>
+    </ul>
+
+    <h2>Real-world uses:</h2>
+
+    <ul>
+      <li><a href="http://jsbin.com">jsbin.com</a> (JS playground)</li>
+      <li><a href="http://buzzard.ups.edu/">Sage demo</a> (math system)</li>
+      <li><a href="http://www.sourcelair.com/">sourceLair</a> (online IDE)</li>
+      <li><a href="http://eloquentjavascript.net/chapter1.html">Eloquent JavaScript</a> (book)</a></li>
+      <li><a href="http://www.mergely.com/">Mergely</a> (interactive diffing)</li>
+      <li><a href="http://paperjs.org/">Paper.js</a> (graphics scripting)</li>
+      <li><a href="http://www.wescheme.org/">WeScheme</a> (learning tool)</li>
+      <li><a href="http://webglplayground.net/">WebGL playground</a></li>
+      <li><a href="http://ql.io/">ql.io</a> (http API query helper)</li>
+      <li><a href="http://elm-lang.org/Examples.elm">Elm language examples</a></li>
+      <li><a href="http://bluegriffon.org/">BlueGriffon</a> (HTML editor)</li>
+      <li><a href="http://www.jshint.com/">JSHint</a> (JS linter)</li>
+      <li><a href="http://kl1p.com/cmtest/1">kl1p</a> (paste service)</li>
+      <li><a href="http://sqlfiddle.com">SQLFiddle</a> (SQL playground)</li>
+      <li><a href="http://tour.golang.org">Go language tour</a></li>
+      <li><a href="http://cssdeck.com/">CSSDeck</a> (CSS showcase)</li>
+      <li><a href="http://www.ckwnc.com/">CKWNC</a> (UML editor)</li>
+      <li><a href="http://www.sketchpatch.net/labs/livecodelabIntro.html">sketchPatch Livecodelab</a></li>
+      <li><a href="https://thefiletree.com">The File Tree</a> (collab editor)</li>
+      <li><a href="http://enjalot.com/tributary/2636296/sinwaves.js">Tributary</a> (augmented editing)</li>
+    </ul>
+
+  </div></div>
+
+  <h2 id="code">Getting the code</h2>
+
+  <p>All of CodeMirror is released under a <a
+  href="LICENSE">MIT-style</a> license. To get it, you can download
+  the <a href="http://codemirror.net/codemirror.zip">latest
+  release</a> or the current <a
+  href="http://codemirror.net/codemirror2-latest.zip">development
+  snapshot</a> as zip files. To create a custom minified script file,
+  you can use the <a href="doc/compress.html">compression API</a>.</p>
+
+  <p>We use <a href="http://git-scm.com/">git</a> for version control.
+  The main repository can be fetched in this way:</p>
+
+  <pre class="code">git clone http://marijnhaverbeke.nl/git/codemirror2</pre>
+
+  <p>CodeMirror can also be found on GitHub at <a
+  href="http://github.com/marijnh/CodeMirror2">marijnh/CodeMirror2</a>.
+  If you plan to hack on the code and contribute patches, the best way
+  to do it is to create a GitHub fork, and send pull requests.</p>
+
+  <h2 id="documention">Documentation</h2>
+
+  <p>The <a href="doc/manual.html">manual</a> is your first stop for
+  learning how to use this library. It starts with a quick explanation
+  of how to use the editor, and then describes the API in detail.</p>
+
+  <p>For those who want to learn more about the code, there is
+  an <a href="doc/internals.html">overview of the internals</a> available.
+  The <a href="http://github.com/marijnh/CodeMirror2">source code</a>
+  itself is, for the most part, also well commented.</p>
+
+  <h2 id="support">Support and bug reports</h2>
+
+  <p>There is
+  a <a href="http://groups.google.com/group/codemirror">Google
+  group</a> (a sort of mailing list/newsgroup thing) for discussion
+  and news related to CodeMirror. When reporting a bug,
+  <a href="doc/reporting.html">read this first</a>. If you have
+  a <a href="http://github.com">github</a> account,
+  simply <a href="http://github.com/marijnh/CodeMirror2/issues">open
+  an issue there</a>. Otherwise, post something to
+  the <a href="http://groups.google.com/group/codemirror">group</a>,
+  or e-mail me directly: <a href="mailto:marijnh at gmail.com">Marijn
+  Haverbeke</a>.</p>
+
+  <h2 id="supported">Supported browsers</h2>
+
+  <p>The following browsers are able to run CodeMirror:</p>
+
+  <ul>
+    <li>Firefox 2 or higher</li>
+    <li>Chrome, any version</li>
+    <li>Safari 3 or higher</li>
+    <li>Internet Explorer 7 or higher in standards (<strong>non-quirks</strong>) mode</li>
+    <li>Opera 9 or higher (with some key-handling problems on OS X)</li>
+  </ul>
+
+  <p>I am not actively testing against every new browser release, and
+  vendors have a habit of introducing bugs all the time, so I am
+  relying on the community to tell me when something breaks.
+  See <a href="#support">here</a> for information on how to contact
+  me.</p>
+
+  <h2 id="commercial">Commercial support</h2>
+
+  <p>CodeMirror is developed and maintained by me, Marijn Haverbeke,
+  in my own time. If your company is getting value out of CodeMirror,
+  please consider purchasing a support contract.</p>
+
+  <ul>
+    <li>You'll be funding further work on CodeMirror.</li>
+    <li>You ensure that you get a quick response when you have a
+    problem, even when I am otherwise busy.</li>
+  </ul>
+
+  <p>CodeMirror support contracts exist in two
+  forms—<strong>basic</strong> at €100 per month,
+  and <strong>premium</strong> at €500 per
+  month. <a href="mailto:marijnh at gmail.com">Contact me</a> for further
+  information.</p>
+
+</div>
+
+<div class="right blk">
+
+  <a href="http://codemirror.net/codemirror.zip" class="download">Download the latest release</a>
+
+  <h2>Support CodeMirror</h2>
+
+  <ul>
+    <li>Donate
+    (<span onclick="document.getElementById('paypal').submit();"
+    class="quasilink">Paypal</span>
+    or <span onclick="document.getElementById('bankinfo').style.display = 'block';"
+             class="quasilink">bank</span>)</li>
+    <li>Purchase <a href="#commercial">commercial support</a></li>
+  </ul>
+
+  <p id="bankinfo" style="display: none;">
+    Bank: <i>Rabobank</i><br/>
+    Country: <i>Netherlands</i><br/>
+    SWIFT: <i>RABONL2U</i><br/>
+    Account: <i>147850770</i><br/>
+    Name: <i>Marijn Haverbeke</i><br/>
+    IBAN: <i>NL26 RABO 0147 8507 70</i>
+  </p>
+
+  <h2>Releases:</h2>
+
+  <p class="rel">23-05-2012: <a href="http://codemirror.net/codemirror-2.25.zip">Version 2.25</a>:</p>
+
+  <ul class="rel-note">
+    <li>New mode: <a href="mode/erlang/index.html">Erlang</a>.</li>
+    <li><strong>Remove xmlpure mode</strong> (use <a href="mode/xml/index.html">xml.js</a>).</li>
+    <li>Fix line-wrapping in Opera.</li>
+    <li>Fix X Windows middle-click paste in Chrome.</li>
+    <li>Fix bug that broke pasting of huge documents.</li>
+    <li>Fix backspace and tab key repeat in Opera.</li>
+  </ul>
+
+  <p class="rel">23-04-2012: <a href="http://codemirror.net/codemirror-2.24.zip">Version 2.24</a>:</p>
+
+  <ul class="rel-note">
+    <li><strong>Drop support for Internet Explorer 6</strong>.</li>
+    <li>New
+    modes: <a href="mode/shell/index.html">Shell</a>, <a href="mode/tiki/index.html">Tiki
+    wiki</a>, <a href="mode/pig/index.html">Pig Latin</a>.</li>
+    <li>New themes: <a href="demo/theme.html?ambiance">Ambiance</a>, <a href="demo/theme.html?blackboard">Blackboard</a>.</li>
+    <li>More control over drag/drop
+    with <a href="doc/manual.html#option_dragDrop"><code>dragDrop</code></a>
+    and <a href="doc/manual.html#option_onDragEvent"><code>onDragEvent</code></a>
+    options.</li>
+    <li>Make HTML mode a bit less pedantic.</li>
+    <li>Add <a href="doc/manual.html#compoundChange"><code>compoundChange</code></a> API method.</li>
+    <li>Several fixes in undo history and line hiding.</li>
+    <li>Remove (broken) support for <code>catchall</code> in key maps,
+    add <code>nofallthrough</code> boolean field instead.</li>
+  </ul>
+
+  <p class="rel">26-03-2012: <a href="http://codemirror.net/codemirror-2.23.zip">Version 2.23</a>:</p>
+
+  <ul class="rel-note">
+    <li>Change <strong>default binding for tab</strong> <a href="javascript:void(document.getElementById('tabbinding').style.display='')">[more]</a>
+      <div style="display: none" id=tabbinding>
+        Starting in 2.23, these bindings are default:
+        <ul><li>Tab: Insert tab character</li>
+          <li>Shift-tab: Reset line indentation to default</li>
+          <li>Ctrl/Cmd-[: Reduce line indentation (old tab behaviour)</li>
+          <li>Ctrl/Cmd-]: Increase line indentation (old shift-tab behaviour)</li>
+        </ul>
+      </div>
+    </li>
+    <li>New modes: <a href="mode/xquery/index.html">XQuery</a> and <a href="mode/vbscript/index.html">VBScript</a>.</li>
+    <li>Two new themes: <a href="mode/less/index.html">lesser-dark</a> and <a href="mode/xquery/index.html">xq-dark</a>.</li>
+    <li>Differentiate between background and text styles in <a href="doc/manual.html#setLineClass"><code>setLineClass</code></a>.</li>
+    <li>Fix drag-and-drop in IE9+.</li>
+    <li>Extend <a href="doc/manual.html#charCoords"><code>charCoords</code></a>
+    and <a href="doc/manual.html#cursorCoords"><code>cursorCoords</code></a> with a <code>mode</code> argument.</li>
+    <li>Add <a href="doc/manual.html#option_autofocus"><code>autofocus</code></a> option.</li>
+    <li>Add <a href="doc/manual.html#findMarksAt"><code>findMarksAt</code></a> method.</li>
+  </ul>
+
+  <p class="rel">27-02-2012: <a href="http://codemirror.net/codemirror-2.22.zip">Version 2.22</a>:</p>
+
+  <ul class="rel-note">
+    <li>Allow <a href="doc/manual.html#keymaps">key handlers</a> to pass up events, allow binding characters.</li>
+    <li>Add <a href="doc/manual.html#option_autoClearEmptyLines"><code>autoClearEmptyLines</code></a> option.</li>
+    <li>Properly use tab stops when rendering tabs.</li>
+    <li>Make PHP mode more robust.</li>
+    <li>Support indentation blocks in <a href="doc/manual.html#util_foldcode">code folder</a>.</li>
+    <li>Add a script for <a href="doc/manual.html#util_match-highlighter">highlighting instances of the selection</a>.</li>
+    <li>New <a href="mode/properties/index.html">.properties</a> mode.</li>
+    <li>Fix many bugs.</li>
+  </ul>
+
+  <p class="rel">27-01-2012: <a href="http://codemirror.net/codemirror-2.21.zip">Version 2.21</a>:</p>
+
+  <ul class="rel-note">
+    <li>Added <a href="mode/less/index.html">LESS</a>, <a href="mode/mysql/index.html">MySQL</a>,
+    <a href="mode/go/index.html">Go</a>, and <a href="mode/verilog/index.html">Verilog</a> modes.</li>
+    <li>Add <a href="doc/manual.html#option_smartIndent"><code>smartIndent</code></a>
+    option.</li>
+    <li>Support a cursor in <a href="doc/manual.html#option_readOnly"><code>readOnly</code></a>-mode.</li>
+    <li>Support assigning multiple styles to a token.</li>
+    <li>Use a new approach to drawing the selection.</li>
+    <li>Add <a href="doc/manual.html#scrollTo"><code>scrollTo</code></a> method.</li>
+    <li>Allow undo/redo events to span non-adjacent lines.</li>
+    <li>Lots and lots of bugfixes.</li>
+  </ul>
+
+  <p class="rel">20-12-2011: <a href="http://codemirror.net/codemirror-2.2.zip">Version 2.2</a>:</p>
+
+  <ul class="rel-note">
+    <li>Slightly incompatible API changes. Read <a href="doc/upgrade_v2.2.html">this</a>.</li>
+    <li>New approach
+    to <a href="doc/manual.html#option_extraKeys">binding</a> keys,
+    support for <a href="doc/manual.html#option_keyMap">custom
+    bindings</a>.</li>
+    <li>Support for overwrite (insert).</li>
+    <li><a href="doc/manual.html#option_tabSize">Custom-width</a>
+    and <a href="demo/visibletabs.html">stylable</a> tabs.</li>
+    <li>Moved more code into <a href="doc/manual.html#addons">add-on scripts</a>.</li>
+    <li>Support for sane vertical cursor movement in wrapped lines.</li>
+    <li>More reliable handling of
+    editing <a href="doc/manual.html#markText">marked text</a>.</li>
+    <li>Add minimal <a href="demo/emacs.html">emacs</a>
+    and <a href="demo/vim.html">vim</a> bindings.</li>
+    <li>Rename <code>coordsFromIndex</code>
+    to <a href="doc/manual.html#posFromIndex"><code>posFromIndex</code></a>,
+    add <a href="doc/manual.html#indexFromPos"><code>indexFromPos</code></a>
+    method.</li>
+  </ul>
+
+  <p class="rel">21-11-2011: <a href="http://codemirror.net/codemirror-2.18.zip">Version 2.18</a>:</p>
+  <p class="rel-note">Fixes <code>TextMarker.clear</code>, which is broken in 2.17.</p>
+
+  <p class="rel">21-11-2011: <a href="http://codemirror.net/codemirror-2.17.zip">Version 2.17</a>:</p>
+  <ul class="rel-note">
+    <li>Add support for <a href="doc/manual.html#option_lineWrapping">line
+    wrapping</a> and <a href="doc/manual.html#hideLine">code
+    folding</a>.</li>
+    <li>Add <a href="mode/gfm/index.html">Github-style Markdown</a> mode.</li>
+    <li>Add <a href="theme/monokai.css">Monokai</a>
+    and <a href="theme/rubyblue.css">Rubyblue</a> themes.</li>
+    <li>Add <a href="doc/manual.html#setBookmark"><code>setBookmark</code></a> method.</li>
+    <li>Move some of the demo code into reusable components
+    under <a href="lib/util/"><code>lib/util</code></a>.</li>
+    <li>Make screen-coord-finding code faster and more reliable.</li>
+    <li>Fix drag-and-drop in Firefox.</li>
+    <li>Improve support for IME.</li>
+    <li>Speed up content rendering.</li>
+    <li>Fix browser's built-in search in Webkit.</li>
+    <li>Make double- and triple-click work in IE.</li>
+    <li>Various fixes to modes.</li>
+  </ul>
+
+  <p class="rel">27-10-2011: <a href="http://codemirror.net/codemirror-2.16.zip">Version 2.16</a>:</p>
+  <ul class="rel-note">
+    <li>Add <a href="mode/perl/index.html">Perl</a>, <a href="mode/rust/index.html">Rust</a>, <a href="mode/tiddlywiki/index.html">TiddlyWiki</a>, and <a href="mode/groovy/index.html">Groovy</a> modes.</li>
+    <li>Dragging text inside the editor now moves, rather than copies.</li>
+    <li>Add a <a href="doc/manual.html#coordsFromIndex"><code>coordsFromIndex</code></a> method.</li>
+    <li><strong>API change</strong>: <code>setValue</code> now no longer clears history. Use <a href="doc/manual.html#clearHistory"><code>clearHistory</code></a> for that.</li>
+    <li><strong>API change</strong>: <a href="doc/manual.html#markText"><code>markText</code></a> now
+    returns an object with <code>clear</code> and <code>find</code>
+    methods. Marked text is now more robust when edited.</li>
+    <li>Fix editing code with tabs in Internet Explorer.</li>
+  </ul>
+
+  <p class="rel">26-09-2011: <a href="http://codemirror.net/codemirror-2.15.zip">Version 2.15</a>:</p>
+  <p class="rel-note">Fix bug that snuck into 2.14: Clicking the
+  character that currently has the cursor didn't re-focus the
+  editor.</p>
+
+  <p class="rel">26-09-2011: <a href="http://codemirror.net/codemirror-2.14.zip">Version 2.14</a>:</p>
+  <ul class="rel-note">
+    <li>Add <a href="mode/clojure/index.html">Clojure</a>, <a href="mode/pascal/index.html">Pascal</a>, <a href="mode/ntriples/index.html">NTriples</a>, <a href="mode/jinja2/index.html">Jinja2</a>, and <a href="mode/markdown/index.html">Markdown</a> modes.</li>
+    <li>Add <a href="theme/cobalt.css">Cobalt</a> and <a href="theme/eclipse.css">Eclipse</a> themes.</li>
+    <li>Add a <a href="doc/manual.html#option_fixedGutter"><code>fixedGutter</code></a> option.</li>
+    <li>Fix bug with <code>setValue</code> breaking cursor movement.</li>
+    <li>Make gutter updates much more efficient.</li>
+    <li>Allow dragging of text out of the editor (on modern browsers).</li>
+  </ul>
+
+  <p><a href="doc/oldrelease.html">Older releases...</a></p>
+
+</div></div>
+
+<div style="height: 2em"> </div>
+
+  <form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="paypal">
+    <input type="hidden" name="cmd" value="_s-xclick"/>
+    <input type="hidden" name="hosted_button_id" value="3FVHS5FGUY7CC"/>
+  </form>
+
+  </body>
+</html>
+
diff --git a/interface/codemirror/keymap/emacs.js b/interface/codemirror/keymap/emacs.js
new file mode 100755
index 0000000..2a57e2f
--- /dev/null
+++ b/interface/codemirror/keymap/emacs.js
@@ -0,0 +1,29 @@
+// TODO number prefixes
+(function() {
+  // Really primitive kill-ring implementation.
+  var killRing = [];
+  function addToRing(str) {
+    killRing.push(str);
+    if (killRing.length > 50) killRing.shift();
+  }
+  function getFromRing() { return killRing[killRing.length - 1] || ""; }
+  function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); }
+
+  CodeMirror.keyMap.emacs = {
+    "Ctrl-X": function(cm) {cm.setOption("keyMap", "emacs-Ctrl-X");},
+    "Ctrl-W": function(cm) {addToRing(cm.getSelection()); cm.replaceSelection("");},
+    "Ctrl-Alt-W": function(cm) {addToRing(cm.getSelection()); cm.replaceSelection("");},
+    "Alt-W": function(cm) {addToRing(cm.getSelection());},
+    "Ctrl-Y": function(cm) {cm.replaceSelection(getFromRing());},
+    "Alt-Y": function(cm) {cm.replaceSelection(popFromRing());},
+    "Ctrl-/": "undo", "Shift-Ctrl--": "undo", "Shift-Alt-,": "goDocStart", "Shift-Alt-.": "goDocEnd",
+    "Ctrl-S": "findNext", "Ctrl-R": "findPrev", "Ctrl-G": "clearSearch", "Shift-Alt-5": "replace",
+    "Ctrl-Z": "undo", "Cmd-Z": "undo", "Alt-/": "autocomplete",
+    fallthrough: ["basic", "emacsy"]
+  };
+
+  CodeMirror.keyMap["emacs-Ctrl-X"] = {
+    "Ctrl-S": "save", "Ctrl-W": "save", "S": "saveAll", "F": "open", "U": "undo", "K": "close",
+    auto: "emacs", nofallthrough: true
+  };
+})();
diff --git a/interface/codemirror/keymap/vim.js b/interface/codemirror/keymap/vim.js
new file mode 100755
index 0000000..6fbfcbc
--- /dev/null
+++ b/interface/codemirror/keymap/vim.js
@@ -0,0 +1,500 @@
+// Supported keybindings:
+// 
+// Cursor movement:
+// h, j, k, l
+// e, E, w, W, b, B
+// Ctrl-f, Ctrl-b
+// Ctrl-n, Ctrl-p
+// $, ^, 0
+// G
+// ge, gE
+// gg
+// f<char>, F<char>, t<char>, T<char> 
+// Ctrl-o, Ctrl-i TODO (FIXME - Ctrl-O wont work in Chrome)
+// /, ?, n, N TODO (does not work)
+// #, * TODO
+//
+// Entering insert mode:
+// i, I, a, A, o, O
+// s
+// ce, cb (without support for number of actions like c3e - TODO)
+// cc
+// S, C TODO
+// cf<char>, cF<char>, ct<char>, cT<char>
+//
+// Deleting text:
+// x, X 
+// J
+// dd, D
+// de, db (without support for number of actions like d3e - TODO)
+// df<char>, dF<char>, dt<char>, dT<char> 
+//
+// Yanking and pasting:
+// yy, Y
+// p, P
+// p'<char> TODO - test
+// y'<char> TODO - test
+// m<char> TODO - test
+//
+// Changing text in place:
+// ~
+// r<char>
+//
+// Visual mode:
+// v, V TODO
+//
+// Misc:
+// . TODO
+//
+
+
+(function() {
+  var count = "";
+  var sdir = "f";
+  var buf = "";
+  var yank = 0;
+  var mark = [];
+  function emptyBuffer() { buf = ""; }
+  function pushInBuffer(str) { buf += str; };
+  function pushCountDigit(digit) { return function(cm) {count += digit;} }
+  function popCount() { var i = parseInt(count); count = ""; return i || 1; }
+  function iterTimes(func) {
+    for (var i = 0, c = popCount(); i < c; ++i) func(i, i == c - 1);
+  }
+  function countTimes(func) {
+    if (typeof func == "string") func = CodeMirror.commands[func];
+    return function(cm) { iterTimes(function () { func(cm); }) };
+  }
+
+  function iterObj(o, f) {
+    for (var prop in o) if (o.hasOwnProperty(prop)) f(prop, o[prop]);
+  }
+  function iterList(l, f) {
+    for (var i in l) f(l[i]);
+  }
+  function toLetter(ch) {
+    // T -> t, Shift-T -> T, '*' -> *, "Space" -> " "
+    if (ch.slice(0, 6) == "Shift-") {
+      return ch.slice(0, 1);
+    } else {
+      if (ch == "Space") return " ";
+      if (ch.length == 3 && ch[0] == "'" && ch[2] == "'") return ch[1];
+      return ch.toLowerCase();
+    }
+  }
+  var SPECIAL_SYMBOLS = "~`!@#$%^&*()_-+=[{}]\\|/?.,<>:;\"\'1234567890"; 
+  function toCombo(ch) { 
+    // t -> T, T -> Shift-T, * -> '*', " " -> "Space"
+    if (ch == " ") return "Space";
+    var specialIdx = SPECIAL_SYMBOLS.indexOf(ch);
+    if (specialIdx != -1) return "'" + ch + "'";
+    if (ch.toLowerCase() == ch) return ch.toUpperCase();
+    return "Shift-" + ch.toUpperCase();
+  }
+
+  var word = [/\w/, /[^\w\s]/], bigWord = [/\S/];
+  function findWord(line, pos, dir, regexps) {
+    var stop = 0, next = -1;
+    if (dir > 0) { stop = line.length; next = 0; }
+    var start = stop, end = stop;
+    // Find bounds of next one.
+    outer: for (; pos != stop; pos += dir) {
+      for (var i = 0; i < regexps.length; ++i) {
+        if (regexps[i].test(line.charAt(pos + next))) {
+          start = pos;
+          for (; pos != stop; pos += dir) {
+            if (!regexps[i].test(line.charAt(pos + next))) break;
+          }
+          end = pos;
+          break outer;
+        }
+      }
+    }
+    return {from: Math.min(start, end), to: Math.max(start, end)};
+  }
+  function moveToWord(cm, regexps, dir, where) {
+    var cur = cm.getCursor(), ch = cur.ch, line = cm.getLine(cur.line), word;
+    while (true) {
+      word = findWord(line, ch, dir, regexps);
+      ch = word[where == "end" ? "to" : "from"];
+      if (ch == cur.ch && word.from != word.to) ch = word[dir < 0 ? "from" : "to"];
+      else break;
+    }
+    cm.setCursor(cur.line, word[where == "end" ? "to" : "from"], true);
+  }
+  function joinLineNext(cm) {
+    var cur = cm.getCursor(), ch = cur.ch, line = cm.getLine(cur.line);
+    CodeMirror.commands.goLineEnd(cm); 
+    if (cur.line != cm.lineCount()) {
+      CodeMirror.commands.goLineEnd(cm);
+      cm.replaceSelection(" ", "end");
+      CodeMirror.commands.delCharRight(cm);
+    } 
+  }
+  function delTillMark(cm, cHar) { 
+    var i = mark[cHar];
+    if (i === undefined) {
+      // console.log("Mark not set"); // TODO - show in status bar
+      return;
+    }
+    var l = cm.getCursor().line, start = i > l ? l : i, end = i > l ? i : l;
+    cm.setCursor(start);
+    for (var c = start; c <= end; c++) {
+      pushInBuffer("\n"+cm.getLine(start)); 
+      cm.removeLine(start);
+    }
+  }
+  function yankTillMark(cm, cHar) { 
+    var i = mark[cHar];
+    if (i === undefined) {
+      // console.log("Mark not set"); // TODO - show in status bar
+      return;
+    }
+    var l = cm.getCursor().line, start = i > l ? l : i, end = i > l ? i : l;
+    for (var c = start; c <= end; c++) {
+      pushInBuffer("\n"+cm.getLine(c));
+    }
+    cm.setCursor(start);
+  }
+  function goLineStartText(cm) {
+    // Go to the start of the line where the text begins, or the end for whitespace-only lines
+    var cur = cm.getCursor(), firstNonWS = cm.getLine(cur.line).search(/\S/);
+    cm.setCursor(cur.line, firstNonWS == -1 ? line.length : firstNonWS, true);
+  }
+
+  function charIdxInLine(cm, cHar, motion_options) {
+    // Search for cHar in line. 
+    // motion_options: {forward, inclusive}
+    // If inclusive = true, include it too.
+    // If forward = true, search forward, else search backwards.
+    // If char is not found on this line, do nothing
+    var cur = cm.getCursor(), line = cm.getLine(cur.line), idx;
+    var ch = toLetter(cHar), mo = motion_options;
+    if (mo.forward) {
+      idx = line.indexOf(ch, cur.ch + 1); 
+      if (idx != -1 && mo.inclusive) idx += 1;
+    } else {
+      idx = line.lastIndexOf(ch, cur.ch);
+      if (idx != -1 && !mo.inclusive) idx += 1;
+    }
+    return idx;
+  }
+
+  function moveTillChar(cm, cHar, motion_options) {
+    // Move to cHar in line, as found by charIdxInLine. 
+    var idx = charIdxInLine(cm, cHar, motion_options), cur = cm.getCursor();
+    if (idx != -1) cm.setCursor({line: cur.line, ch: idx}); 
+  }
+
+  function delTillChar(cm, cHar, motion_options) {
+    // delete text in this line, untill cHar is met,
+    // as found by charIdxInLine.
+    // If char is not found on this line, do nothing
+    var idx = charIdxInLine(cm, cHar, motion_options);
+    var cur = cm.getCursor();
+    if (idx !== -1) {
+      if (motion_options.forward) {
+        cm.replaceRange("", {line: cur.line, ch: cur.ch}, {line: cur.line, ch: idx});
+      } else {
+        cm.replaceRange("", {line: cur.line, ch: idx}, {line: cur.line, ch: cur.ch});
+      }
+    }
+  }
+
+  function enterInsertMode(cm) {
+    // enter insert mode: switch mode and cursor
+    if (!cm) console.log("call enterInsertMode with 'cm' as an argument");
+    popCount();
+    cm.setOption("keyMap", "vim-insert");
+  }
+
+  // main keymap
+  var map = CodeMirror.keyMap.vim = {
+    // Pipe (|); TODO: should be *screen* chars, so need a util function to turn tabs into spaces?
+    "'|'": function(cm) {
+      cm.setCursor(cm.getCursor().line, popCount() - 1, true);
+    },
+    "'^'": function(cm) { popCount(); goLineStartText(cm);},
+    "A": function(cm) {
+      cm.setCursor(cm.getCursor().line, cm.getCursor().ch+1, true);
+      enterInsertMode(cm);
+    },
+    "Shift-A": function(cm) { CodeMirror.commands.goLineEnd(cm); enterInsertMode(cm);},
+    "I": function(cm) { enterInsertMode(cm);},
+    "Shift-I": function(cm) { goLineStartText(cm); enterInsertMode(cm);},
+    "O": function(cm) {
+      CodeMirror.commands.goLineEnd(cm);
+      CodeMirror.commands.newlineAndIndent(cm);
+      enterInsertMode(cm);
+    },
+    "Shift-O": function(cm) {
+      CodeMirror.commands.goLineStart(cm);
+      cm.replaceSelection("\n", "start");
+      cm.indentLine(cm.getCursor().line);
+      enterInsertMode(cm);
+    },
+    "G": function(cm) { cm.setOption("keyMap", "vim-prefix-g");},
+    "Shift-D": function(cm) {
+      // commented out verions works, but I left original, cause maybe 
+      // I don't know vim enouth to see what it does
+      /* var cur = cm.getCursor();
+      var f = {line: cur.line, ch: cur.ch}, t = {line: cur.line};
+      pushInBuffer(cm.getRange(f, t));
+      cm.replaceRange("", f, t);
+      */
+      emptyBuffer();
+      mark["Shift-D"] = cm.getCursor(false).line;
+      cm.setCursor(cm.getCursor(true).line);
+      delTillMark(cm,"Shift-D"); mark = [];
+    },
+
+    "S": function (cm) {
+      countTimes(function (_cm) {
+        CodeMirror.commands.delCharRight(_cm);
+      })(cm);
+      enterInsertMode(cm);
+    },
+    "M": function(cm) {cm.setOption("keyMap", "vim-prefix-m"); mark = [];},
+    "Y": function(cm) {cm.setOption("keyMap", "vim-prefix-y"); emptyBuffer(); yank = 0;},
+    "Shift-Y": function(cm) {
+      emptyBuffer();
+      mark["Shift-D"] = cm.getCursor(false).line;
+      cm.setCursor(cm.getCursor(true).line);
+      yankTillMark(cm,"Shift-D"); mark = [];
+    },
+    "/": function(cm) {var f = CodeMirror.commands.find; f && f(cm); sdir = "f";},
+    "'?'": function(cm) {
+      var f = CodeMirror.commands.find;
+      if (f) { f(cm); CodeMirror.commands.findPrev(cm); sdir = "r"; }
+    },
+    "N": function(cm) {
+      var fn = CodeMirror.commands.findNext;
+      if (fn) sdir != "r" ? fn(cm) : CodeMirror.commands.findPrev(cm);
+    },
+    "Shift-N": function(cm) {
+      var fn = CodeMirror.commands.findNext;
+      if (fn) sdir != "r" ? CodeMirror.commands.findPrev(cm) : fn.findNext(cm);
+    },
+    "Shift-G": function(cm) {
+      count == "" ? cm.setCursor(cm.lineCount()) : cm.setCursor(parseInt(count)-1);
+      popCount();
+      CodeMirror.commands.goLineStart(cm);
+    },
+    "'$'": function (cm) {
+      countTimes("goLineEnd")(cm);
+      if (cm.getCursor().ch) CodeMirror.commands.goColumnLeft(cm);
+    },
+    nofallthrough: true, style: "fat-cursor"
+  };
+
+  // standard mode switching
+  iterList(["d", "t", "T", "f", "F", "c", "r"],
+      function (ch) {
+        CodeMirror.keyMap.vim[toCombo(ch)] = function (cm) {
+          cm.setOption("keyMap", "vim-prefix-" + ch);
+          emptyBuffer();
+        };
+      });
+
+  function addCountBindings(keyMap) {
+    // Add bindings for number keys
+    keyMap["0"] = function(cm) {
+      count.length > 0 ? pushCountDigit("0")(cm) : CodeMirror.commands.goLineStart(cm);
+    };
+    for (var i = 1; i < 10; ++i) keyMap[i] = pushCountDigit(i);
+  }
+  addCountBindings(CodeMirror.keyMap.vim);
+
+  // main num keymap
+  // Add bindings that are influenced by number keys
+  iterObj({
+    "H": "goColumnLeft", "L": "goColumnRight", "J": "goLineDown",
+    "K": "goLineUp", "Left": "goColumnLeft", "Right": "goColumnRight",
+    "Down": "goLineDown", "Up": "goLineUp", "Backspace": "goCharLeft",
+    "Space": "goCharRight",
+    "B": function(cm) {moveToWord(cm, word, -1, "end");},
+    "E": function(cm) {moveToWord(cm, word, 1, "end");},
+    "W": function(cm) {moveToWord(cm, word, 1, "start");},
+    "Shift-B": function(cm) {moveToWord(cm, bigWord, -1, "end");},
+    "Shift-E": function(cm) {moveToWord(cm, bigWord, 1, "end");},
+    "Shift-W": function(cm) {moveToWord(cm, bigWord, 1, "start");},
+    "X": function(cm) {CodeMirror.commands.delCharRight(cm);},
+    "P": function(cm) {
+      var cur = cm.getCursor().line;
+      if (buf!= "") {
+        CodeMirror.commands.goLineEnd(cm); 
+        cm.replaceSelection(buf, "end");
+      }
+      cm.setCursor(cur+1);
+    },
+    "Shift-X": function(cm) {CodeMirror.commands.delCharLeft(cm);},
+    "Shift-J": function(cm) {joinLineNext(cm);},
+    "Shift-P": function(cm) {
+      var cur = cm.getCursor().line;
+      if (buf!= "") {
+        CodeMirror.commands.goLineUp(cm); 
+        CodeMirror.commands.goLineEnd(cm); 
+        cm.replaceSelection(buf, "end");
+      }
+      cm.setCursor(cur+1);
+    },
+    "'~'": function(cm) {
+      var cur = cm.getCursor(), cHar = cm.getRange({line: cur.line, ch: cur.ch}, {line: cur.line, ch: cur.ch+1});
+      cHar = cHar != cHar.toLowerCase() ? cHar.toLowerCase() : cHar.toUpperCase();
+      cm.replaceRange(cHar, {line: cur.line, ch: cur.ch}, {line: cur.line, ch: cur.ch+1});
+      cm.setCursor(cur.line, cur.ch+1);
+    },
+    "Ctrl-B": function(cm) {CodeMirror.commands.goPageUp(cm);},
+    "Ctrl-F": function(cm) {CodeMirror.commands.goPageDown(cm);},
+    "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", 
+    "U": "undo", "Ctrl-R": "redo"
+  }, function(key, cmd) { map[key] = countTimes(cmd); });
+
+  // empty key maps
+  iterList([
+      "vim-prefix-d'", 
+      "vim-prefix-y'", 
+      "vim-prefix-df",
+      "vim-prefix-dF",
+      "vim-prefix-dt",
+      "vim-prefix-dT",
+      "vim-prefix-c",
+      "vim-prefix-cf",
+      "vim-prefix-cF",
+      "vim-prefix-ct",
+      "vim-prefix-cT",
+      "vim-prefix-",
+      "vim-prefix-f",
+      "vim-prefix-F",
+      "vim-prefix-t",
+      "vim-prefix-T",
+      "vim-prefix-r",
+      "vim-prefix-m"
+      ], 
+      function (prefix) {
+        CodeMirror.keyMap[prefix] = {
+          auto: "vim", 
+          nofallthrough: true
+        };
+      });
+
+  CodeMirror.keyMap["vim-prefix-g"] = {
+    "E": countTimes(function(cm) { moveToWord(cm, word, -1, "start");}),
+    "Shift-E": countTimes(function(cm) { moveToWord(cm, bigWord, -1, "start");}),
+    "G": function (cm) { cm.setCursor({line: 0, ch: cm.getCursor().ch});},
+    auto: "vim", nofallthrough: true, style: "fat-cursor"
+  };
+
+  CodeMirror.keyMap["vim-prefix-d"] = {
+    "D": countTimes(function(cm) {
+      pushInBuffer("\n"+cm.getLine(cm.getCursor().line));
+      cm.removeLine(cm.getCursor().line);
+    }),
+    "'": function(cm) {
+      cm.setOption("keyMap", "vim-prefix-d'");
+      emptyBuffer();
+    },
+    "E": countTimes("delWordRight"),
+    "B": countTimes("delWordLeft"),
+    auto: "vim", nofallthrough: true, style: "fat-cursor"
+  }; 
+  // FIXME - does not work for bindings like "d3e"
+  addCountBindings(CodeMirror.keyMap["vim-prefix-d"]);
+
+  CodeMirror.keyMap["vim-prefix-c"] = {
+    "E": function (cm) {
+      countTimes("delWordRight")(cm);
+      enterInsertMode(cm);
+    },
+    "B": function (cm) {
+      countTimes("delWordLeft")(cm);
+      enterInsertMode(cm);
+    },
+    "C": function (cm) {
+      iterTimes(function (i, last) {
+        CodeMirror.commands.deleteLine(cm);
+        if (i) {
+          CodeMirror.commands.delCharRight(cm);
+          if (last) CodeMirror.commands.deleteLine(cm);
+        }
+      });
+      enterInsertMode(cm);
+    },
+    auto: "vim", nofallthrough: true, style: "fat-cursor"
+  };
+
+  iterList(["vim-prefix-d", "vim-prefix-c", "vim-prefix-"], function (prefix) {
+    iterList(["f", "F", "T", "t"],
+      function (ch) {
+        CodeMirror.keyMap[prefix][toCombo(ch)] = function (cm) {
+          cm.setOption("keyMap", prefix + ch);
+          emptyBuffer();
+        };
+      });
+  });
+
+  var MOTION_OPTIONS = {
+    "t": {inclusive: false, forward: true},
+    "f": {inclusive: true,  forward: true},
+    "T": {inclusive: false, forward: false},
+    "F": {inclusive: true,  forward: false}
+  };
+
+  function setupPrefixBindingForKey(m) {
+    CodeMirror.keyMap["vim-prefix-m"][m] = function(cm) {
+      mark[m] = cm.getCursor().line;
+    };
+    CodeMirror.keyMap["vim-prefix-d'"][m] = function(cm) {
+      delTillMark(cm,m);
+    };
+    CodeMirror.keyMap["vim-prefix-y'"][m] = function(cm) {
+      yankTillMark(cm,m);
+    };
+    CodeMirror.keyMap["vim-prefix-r"][m] = function (cm) {
+      var cur = cm.getCursor();
+      cm.replaceRange(toLetter(m), 
+          {line: cur.line, ch: cur.ch},
+          {line: cur.line, ch: cur.ch + 1});
+      CodeMirror.commands.goColumnLeft(cm);
+    };
+    // all commands, related to motions till char in line
+    iterObj(MOTION_OPTIONS, function (ch, options) {
+      CodeMirror.keyMap["vim-prefix-" + ch][m] = function(cm) {
+        moveTillChar(cm, m, options);
+      };
+      CodeMirror.keyMap["vim-prefix-d" + ch][m] = function(cm) {
+        delTillChar(cm, m, options);
+      };
+      CodeMirror.keyMap["vim-prefix-c" + ch][m] = function(cm) {
+        delTillChar(cm, m, options);
+        enterInsertMode(cm);
+      };
+    });
+  };
+  for (var i = 65; i < 65 + 26; i++) { // uppercase alphabet char codes
+    var ch = String.fromCharCode(i);
+    setupPrefixBindingForKey(toCombo(ch));
+    setupPrefixBindingForKey(toCombo(ch.toLowerCase()));
+  }
+  iterList(SPECIAL_SYMBOLS, function (ch) {
+    setupPrefixBindingForKey(toCombo(ch));
+  });
+  setupPrefixBindingForKey("Space");
+
+  CodeMirror.keyMap["vim-prefix-y"] = {
+    "Y": countTimes(function(cm) { pushInBuffer("\n"+cm.getLine(cm.getCursor().line+yank)); yank++; }),
+    "'": function(cm) {cm.setOption("keyMap", "vim-prefix-y'"); emptyBuffer();},
+    auto: "vim", nofallthrough: true, style: "fat-cursor"
+  };
+
+  CodeMirror.keyMap["vim-insert"] = {
+    // TODO: override navigation keys so that Esc will cancel automatic indentation from o, O, i_<CR>
+    "Esc": function(cm) {
+      cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true); 
+      cm.setOption("keyMap", "vim");
+    },
+    "Ctrl-N": "autocomplete",
+    "Ctrl-P": "autocomplete",
+    fallthrough: ["default"]
+  };
+})();
diff --git a/interface/codemirror/lib/codemirror.css b/interface/codemirror/lib/codemirror.css
new file mode 100755
index 0000000..cfe2eb2
--- /dev/null
+++ b/interface/codemirror/lib/codemirror.css
@@ -0,0 +1,126 @@
+.CodeMirror {
+  line-height: 1em;
+  font-family: monospace;
+}
+
+.CodeMirror-scroll {
+  overflow: auto;
+  height: 300px;
+  /* This is needed to prevent an IE[67] bug where the scrolled content
+     is visible outside of the scrolling box. */
+  position: relative;
+  outline: none;
+}
+
+.CodeMirror-gutter {
+  position: absolute; left: 0; top: 0;
+  z-index: 10;
+  background-color: #f7f7f7;
+  border-right: 1px solid #eee;
+  min-width: 2em;
+  height: 100%;
+}
+.CodeMirror-gutter-text {
+  color: #aaa;
+  text-align: right;
+  padding: .4em .2em .4em .4em;
+  white-space: pre !important;
+}
+.CodeMirror-lines {
+  padding: .4em;
+  white-space: pre;
+}
+
+.CodeMirror pre {
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  border-width: 0; margin: 0; padding: 0; background: transparent;
+  font-family: inherit;
+  font-size: inherit;
+  padding: 0; margin: 0;
+  white-space: pre;
+  word-wrap: normal;
+  line-height: inherit;
+  color: inherit;
+}
+
+.CodeMirror-wrap pre {
+  word-wrap: break-word;
+  white-space: pre-wrap;
+  word-break: normal;
+}
+.CodeMirror-wrap .CodeMirror-scroll {
+  overflow-x: hidden;
+}
+
+.CodeMirror textarea {
+  outline: none !important;
+}
+
+.CodeMirror pre.CodeMirror-cursor {
+  z-index: 10;
+  position: absolute;
+  visibility: hidden;
+  border-left: 1px solid black;
+  border-right: none;
+  width: 0;
+}
+.cm-keymap-fat-cursor pre.CodeMirror-cursor {
+  width: auto;
+  border: 0;
+  background: transparent;
+  background: rgba(0, 200, 0, .4);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800);
+}
+/* Kludge to turn off filter in ie9+, which also accepts rgba */
+.cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id) {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+.CodeMirror pre.CodeMirror-cursor.CodeMirror-overwrite {}
+.CodeMirror-focused pre.CodeMirror-cursor {
+  visibility: visible;
+}
+
+div.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused div.CodeMirror-selected { background: #d7d4f0; }
+
+.CodeMirror-searching {
+  background: #ffa;
+  background: rgba(255, 255, 0, .4);
+}
+
+/* Default theme */
+
+.cm-s-default span.cm-keyword {color: #708;}
+.cm-s-default span.cm-atom {color: #219;}
+.cm-s-default span.cm-number {color: #164;}
+.cm-s-default span.cm-def {color: #00f;}
+.cm-s-default span.cm-variable {color: black;}
+.cm-s-default span.cm-variable-2 {color: #05a;}
+.cm-s-default span.cm-variable-3 {color: #085;}
+.cm-s-default span.cm-property {color: black;}
+.cm-s-default span.cm-operator {color: black;}
+.cm-s-default span.cm-comment {color: #a50;}
+.cm-s-default span.cm-string {color: #a11;}
+.cm-s-default span.cm-string-2 {color: #f50;}
+.cm-s-default span.cm-meta {color: #555;}
+.cm-s-default span.cm-error {color: #f00;}
+.cm-s-default span.cm-qualifier {color: #555;}
+.cm-s-default span.cm-builtin {color: #30a;}
+.cm-s-default span.cm-bracket {color: #cc7;}
+.cm-s-default span.cm-tag {color: #170;}
+.cm-s-default span.cm-attribute {color: #00c;}
+.cm-s-default span.cm-header {color: blue;}
+.cm-s-default span.cm-quote {color: #090;}
+.cm-s-default span.cm-hr {color: #999;}
+.cm-s-default span.cm-link {color: #00c;}
+
+span.cm-header, span.cm-strong {font-weight: bold;}
+span.cm-em {font-style: italic;}
+span.cm-emstrong {font-style: italic; font-weight: bold;}
+span.cm-link {text-decoration: underline;}
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
diff --git a/interface/codemirror/lib/codemirror.js b/interface/codemirror/lib/codemirror.js
new file mode 100755
index 0000000..be4cb30
--- /dev/null
+++ b/interface/codemirror/lib/codemirror.js
@@ -0,0 +1,3076 @@
+// CodeMirror version 2.25
+//
+// All functions that need access to the editor's state live inside
+// the CodeMirror function. Below that, at the bottom of the file,
+// some utilities are defined.
+
+// CodeMirror is the only global var we claim
+var CodeMirror = (function() {
+  // This is the function that produces an editor instance. Its
+  // closure is used to store the editor state.
+  function CodeMirror(place, givenOptions) {
+    // Determine effective options based on given values and defaults.
+    var options = {}, defaults = CodeMirror.defaults;
+    for (var opt in defaults)
+      if (defaults.hasOwnProperty(opt))
+        options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
+
+    // The element in which the editor lives.
+    var wrapper = document.createElement("div");
+    wrapper.className = "CodeMirror" + (options.lineWrapping ? " CodeMirror-wrap" : "");
+    // This mess creates the base DOM structure for the editor.
+    wrapper.innerHTML =
+      '<div style="overflow: hidden; position: relative; width: 3px; height: 0px;">' + // Wraps and hides input textarea
+        '<textarea style="position: absolute; padding: 0; width: 1px; height: 1em" wrap="off" ' +
+          'autocorrect="off" autocapitalize="off"></textarea></div>' +
+      '<div class="CodeMirror-scroll" tabindex="-1">' +
+        '<div style="position: relative">' + // Set to the height of the text, causes scrolling
+          '<div style="position: relative">' + // Moved around its parent to cover visible view
+            '<div class="CodeMirror-gutter"><div class="CodeMirror-gutter-text"></div></div>' +
+            // Provides positioning relative to (visible) text origin
+            '<div class="CodeMirror-lines"><div style="position: relative; z-index: 0">' +
+              '<div style="position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden;"></div>' +
+              '<pre class="CodeMirror-cursor"> </pre>' + // Absolutely positioned blinky cursor
+              '<div style="position: relative; z-index: -1"></div><div></div>' + // DIVs containing the selection and the actual code
+            '</div></div></div></div></div>';
+    if (place.appendChild) place.appendChild(wrapper); else place(wrapper);
+    // I've never seen more elegant code in my life.
+    var inputDiv = wrapper.firstChild, input = inputDiv.firstChild,
+        scroller = wrapper.lastChild, code = scroller.firstChild,
+        mover = code.firstChild, gutter = mover.firstChild, gutterText = gutter.firstChild,
+        lineSpace = gutter.nextSibling.firstChild, measure = lineSpace.firstChild,
+        cursor = measure.nextSibling, selectionDiv = cursor.nextSibling,
+        lineDiv = selectionDiv.nextSibling;
+    themeChanged(); keyMapChanged();
+    // Needed to hide big blue blinking cursor on Mobile Safari
+    if (ios) input.style.width = "0px";
+    if (!webkit) lineSpace.draggable = true;
+    lineSpace.style.outline = "none";
+    if (options.tabindex != null) input.tabIndex = options.tabindex;
+    if (options.autofocus) focusInput();
+    if (!options.gutter && !options.lineNumbers) gutter.style.display = "none";
+    // Needed to handle Tab key in KHTML
+    if (khtml) inputDiv.style.height = "1px", inputDiv.style.position = "absolute";
+
+    // Check for problem with IE innerHTML not working when we have a
+    // P (or similar) parent node.
+    try { stringWidth("x"); }
+    catch (e) {
+      if (e.message.match(/runtime/i))
+        e = new Error("A CodeMirror inside a P-style element does not work in Internet Explorer. (innerHTML bug)");
+      throw e;
+    }
+
+    // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval.
+    var poll = new Delayed(), highlight = new Delayed(), blinker;
+
+    // mode holds a mode API object. doc is the tree of Line objects,
+    // work an array of lines that should be parsed, and history the
+    // undo history (instance of History constructor).
+    var mode, doc = new BranchChunk([new LeafChunk([new Line("")])]), work, focused;
+    loadMode();
+    // The selection. These are always maintained to point at valid
+    // positions. Inverted is used to remember that the user is
+    // selecting bottom-to-top.
+    var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false};
+    // Selection-related flags. shiftSelecting obviously tracks
+    // whether the user is holding shift.
+    var shiftSelecting, lastClick, lastDoubleClick, lastScrollPos = 0, draggingText,
+        overwrite = false, suppressEdits = false;
+    // Variables used by startOperation/endOperation to track what
+    // happened during the operation.
+    var updateInput, userSelChange, changes, textChanged, selectionChanged, leaveInputAlone,
+        gutterDirty, callbacks, maxLengthChanged;
+    // Current visible range (may be bigger than the view window).
+    var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0;
+    // bracketHighlighted is used to remember that a bracket has been
+    // marked.
+    var bracketHighlighted;
+    // Tracks the maximum line length so that the horizontal scrollbar
+    // can be kept static when scrolling.
+    var maxLine = "", maxWidth;
+    var tabCache = {};
+
+    // Initialize the content.
+    operation(function(){setValue(options.value || ""); updateInput = false;})();
+    var history = new History();
+
+    // Register our event handlers.
+    connect(scroller, "mousedown", operation(onMouseDown));
+    connect(scroller, "dblclick", operation(onDoubleClick));
+    connect(lineSpace, "selectstart", e_preventDefault);
+    // Gecko browsers fire contextmenu *after* opening the menu, at
+    // which point we can't mess with it anymore. Context menu is
+    // handled in onMouseDown for Gecko.
+    if (!gecko) connect(scroller, "contextmenu", onContextMenu);
+    connect(scroller, "scroll", function() {
+      lastScrollPos = scroller.scrollTop;
+      updateDisplay([]);
+      if (options.fixedGutter) gutter.style.left = scroller.scrollLeft + "px";
+      if (options.onScroll) options.onScroll(instance);
+    });
+    connect(window, "resize", function() {updateDisplay(true);});
+    connect(input, "keyup", operation(onKeyUp));
+    connect(input, "input", fastPoll);
+    connect(input, "keydown", operation(onKeyDown));
+    connect(input, "keypress", operation(onKeyPress));
+    connect(input, "focus", onFocus);
+    connect(input, "blur", onBlur);
+
+    if (options.dragDrop) {
+      connect(lineSpace, "dragstart", onDragStart);
+      function drag_(e) {
+        if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return;
+        e_stop(e);
+      }
+      connect(scroller, "dragenter", drag_);
+      connect(scroller, "dragover", drag_);
+      connect(scroller, "drop", operation(onDrop));
+    }
+    connect(scroller, "paste", function(){focusInput(); fastPoll();});
+    connect(input, "paste", fastPoll);
+    connect(input, "cut", operation(function(){
+      if (!options.readOnly) replaceSelection("");
+    }));
+
+    // Needed to handle Tab key in KHTML
+    if (khtml) connect(code, "mouseup", function() {
+        if (document.activeElement == input) input.blur();
+        focusInput();
+    });
+
+    // IE throws unspecified error in certain cases, when
+    // trying to access activeElement before onload
+    var hasFocus; try { hasFocus = (document.activeElement == input); } catch(e) { }
+    if (hasFocus || options.autofocus) setTimeout(onFocus, 20);
+    else onBlur();
+
+    function isLine(l) {return l >= 0 && l < doc.size;}
+    // The instance object that we'll return. Mostly calls out to
+    // local functions in the CodeMirror function. Some do some extra
+    // range checking and/or clipping. operation is used to wrap the
+    // call so that changes it makes are tracked, and the display is
+    // updated afterwards.
+    var instance = wrapper.CodeMirror = {
+      getValue: getValue,
+      setValue: operation(setValue),
+      getSelection: getSelection,
+      replaceSelection: operation(replaceSelection),
+      focus: function(){window.focus(); focusInput(); onFocus(); fastPoll();},
+      setOption: function(option, value) {
+        var oldVal = options[option];
+        options[option] = value;
+        if (option == "mode" || option == "indentUnit") loadMode();
+        else if (option == "readOnly" && value == "nocursor") {onBlur(); input.blur();}
+        else if (option == "readOnly" && !value) {resetInput(true);}
+        else if (option == "theme") themeChanged();
+        else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)();
+        else if (option == "tabSize") updateDisplay(true);
+        else if (option == "keyMap") keyMapChanged();
+        if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" || option == "theme") {
+          gutterChanged();
+          updateDisplay(true);
+        }
+      },
+      getOption: function(option) {return options[option];},
+      undo: operation(undo),
+      redo: operation(redo),
+      indentLine: operation(function(n, dir) {
+        if (typeof dir != "string") {
+          if (dir == null) dir = options.smartIndent ? "smart" : "prev";
+          else dir = dir ? "add" : "subtract";
+        }
+        if (isLine(n)) indentLine(n, dir);
+      }),
+      indentSelection: operation(indentSelected),
+      historySize: function() {return {undo: history.done.length, redo: history.undone.length};},
+      clearHistory: function() {history = new History();},
+      matchBrackets: operation(function(){matchBrackets(true);}),
+      getTokenAt: operation(function(pos) {
+        pos = clipPos(pos);
+        return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), pos.ch);
+      }),
+      getStateAfter: function(line) {
+        line = clipLine(line == null ? doc.size - 1: line);
+        return getStateBefore(line + 1);
+      },
+      cursorCoords: function(start, mode) {
+        if (start == null) start = sel.inverted;
+        return this.charCoords(start ? sel.from : sel.to, mode);
+      },
+      charCoords: function(pos, mode) {
+        pos = clipPos(pos);
+        if (mode == "local") return localCoords(pos, false);
+        if (mode == "div") return localCoords(pos, true);
+        return pageCoords(pos);
+      },
+      coordsChar: function(coords) {
+        var off = eltOffset(lineSpace);
+        return coordsChar(coords.x - off.left, coords.y - off.top);
+      },
+      markText: operation(markText),
+      setBookmark: setBookmark,
+      findMarksAt: findMarksAt,
+      setMarker: operation(addGutterMarker),
+      clearMarker: operation(removeGutterMarker),
+      setLineClass: operation(setLineClass),
+      hideLine: operation(function(h) {return setLineHidden(h, true);}),
+      showLine: operation(function(h) {return setLineHidden(h, false);}),
+      onDeleteLine: function(line, f) {
+        if (typeof line == "number") {
+          if (!isLine(line)) return null;
+          line = getLine(line);
+        }
+        (line.handlers || (line.handlers = [])).push(f);
+        return line;
+      },
+      lineInfo: lineInfo,
+      addWidget: function(pos, node, scroll, vert, horiz) {
+        pos = localCoords(clipPos(pos));
+        var top = pos.yBot, left = pos.x;
+        node.style.position = "absolute";
+        code.appendChild(node);
+        if (vert == "over") top = pos.y;
+        else if (vert == "near") {
+          var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()),
+              hspace = Math.max(code.clientWidth, lineSpace.clientWidth) - paddingLeft();
+          if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight)
+            top = pos.y - node.offsetHeight;
+          if (left + node.offsetWidth > hspace)
+            left = hspace - node.offsetWidth;
+        }
+        node.style.top = (top + paddingTop()) + "px";
+        node.style.left = node.style.right = "";
+        if (horiz == "right") {
+          left = code.clientWidth - node.offsetWidth;
+          node.style.right = "0px";
+        } else {
+          if (horiz == "left") left = 0;
+          else if (horiz == "middle") left = (code.clientWidth - node.offsetWidth) / 2;
+          node.style.left = (left + paddingLeft()) + "px";
+        }
+        if (scroll)
+          scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight);
+      },
+
+      lineCount: function() {return doc.size;},
+      clipPos: clipPos,
+      getCursor: function(start) {
+        if (start == null) start = sel.inverted;
+        return copyPos(start ? sel.from : sel.to);
+      },
+      somethingSelected: function() {return !posEq(sel.from, sel.to);},
+      setCursor: operation(function(line, ch, user) {
+        if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch, user);
+        else setCursor(line, ch, user);
+      }),
+      setSelection: operation(function(from, to, user) {
+        (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from));
+      }),
+      getLine: function(line) {if (isLine(line)) return getLine(line).text;},
+      getLineHandle: function(line) {if (isLine(line)) return getLine(line);},
+      setLine: operation(function(line, text) {
+        if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
+      }),
+      removeLine: operation(function(line) {
+        if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0}));
+      }),
+      replaceRange: operation(replaceRange),
+      getRange: function(from, to) {return getRange(clipPos(from), clipPos(to));},
+
+      triggerOnKeyDown: operation(onKeyDown),
+      execCommand: function(cmd) {return commands[cmd](instance);},
+      // Stuff used by commands, probably not much use to outside code.
+      moveH: operation(moveH),
+      deleteH: operation(deleteH),
+      moveV: operation(moveV),
+      toggleOverwrite: function() {
+        if(overwrite){
+          overwrite = false;
+          cursor.className = cursor.className.replace(" CodeMirror-overwrite", "");
+        } else {
+          overwrite = true;
+          cursor.className += " CodeMirror-overwrite";
+        }
+      },
+
+      posFromIndex: function(off) {
+        var lineNo = 0, ch;
+        doc.iter(0, doc.size, function(line) {
+          var sz = line.text.length + 1;
+          if (sz > off) { ch = off; return true; }
+          off -= sz;
+          ++lineNo;
+        });
+        return clipPos({line: lineNo, ch: ch});
+      },
+      indexFromPos: function (coords) {
+        if (coords.line < 0 || coords.ch < 0) return 0;
+        var index = coords.ch;
+        doc.iter(0, coords.line, function (line) {
+          index += line.text.length + 1;
+        });
+        return index;
+      },
+      scrollTo: function(x, y) {
+        if (x != null) scroller.scrollLeft = x;
+        if (y != null) scroller.scrollTop = y;
+        updateDisplay([]);
+      },
+
+      operation: function(f){return operation(f)();},
+      compoundChange: function(f){return compoundChange(f);},
+      refresh: function(){
+        updateDisplay(true);
+        if (scroller.scrollHeight > lastScrollPos)
+          scroller.scrollTop = lastScrollPos;
+      },
+      getInputField: function(){return input;},
+      getWrapperElement: function(){return wrapper;},
+      getScrollerElement: function(){return scroller;},
+      getGutterElement: function(){return gutter;}
+    };
+
+    function getLine(n) { return getLineAt(doc, n); }
+    function updateLineHeight(line, height) {
+      gutterDirty = true;
+      var diff = height - line.height;
+      for (var n = line; n; n = n.parent) n.height += diff;
+    }
+
+    function setValue(code) {
+      var top = {line: 0, ch: 0};
+      updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length},
+                  splitLines(code), top, top);
+      updateInput = true;
+    }
+    function getValue() {
+      var text = [];
+      doc.iter(0, doc.size, function(line) { text.push(line.text); });
+      return text.join("\n");
+    }
+
+    function onMouseDown(e) {
+      setShift(e_prop(e, "shiftKey"));
+      // Check whether this is a click in a widget
+      for (var n = e_target(e); n != wrapper; n = n.parentNode)
+        if (n.parentNode == code && n != mover) return;
+
+      // See if this is a click in the gutter
+      for (var n = e_target(e); n != wrapper; n = n.parentNode)
+        if (n.parentNode == gutterText) {
+          if (options.onGutterClick)
+            options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e);
+          return e_preventDefault(e);
+        }
+
+      var start = posFromMouse(e);
+
+      switch (e_button(e)) {
+      case 3:
+        if (gecko && !mac) onContextMenu(e);
+        return;
+      case 2:
+        if (start) setCursor(start.line, start.ch, true);
+        setTimeout(focusInput, 20);
+        return;
+      }
+      // For button 1, if it was clicked inside the editor
+      // (posFromMouse returning non-null), we have to adjust the
+      // selection.
+      if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;}
+
+      if (!focused) onFocus();
+
+      var now = +new Date;
+      if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
+        e_preventDefault(e);
+        setTimeout(focusInput, 20);
+        return selectLine(start.line);
+      } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
+        lastDoubleClick = {time: now, pos: start};
+        e_preventDefault(e);
+        return selectWordAt(start);
+      } else { lastClick = {time: now, pos: start}; }
+
+      var last = start, going;
+      if (options.dragDrop && dragAndDrop && !options.readOnly && !posEq(sel.from, sel.to) &&
+          !posLess(start, sel.from) && !posLess(sel.to, start)) {
+        // Let the drag handler handle this.
+        if (webkit) lineSpace.draggable = true;
+        function dragEnd(e2) {
+          if (webkit) lineSpace.draggable = false;
+          draggingText = false;
+          up(); drop();
+          if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
+            e_preventDefault(e2);
+            setCursor(start.line, start.ch, true);
+            focusInput();
+          }
+        }
+        var up = connect(document, "mouseup", operation(dragEnd), true);
+        var drop = connect(scroller, "drop", operation(dragEnd), true);
+        draggingText = true;
+        // IE's approach to draggable
+        if (lineSpace.dragDrop) lineSpace.dragDrop();
+        return;
+      }
+      e_preventDefault(e);
+      setCursor(start.line, start.ch, true);
+
+      function extend(e) {
+        var cur = posFromMouse(e, true);
+        if (cur && !posEq(cur, last)) {
+          if (!focused) onFocus();
+          last = cur;
+          setSelectionUser(start, cur);
+          updateInput = false;
+          var visible = visibleLines();
+          if (cur.line >= visible.to || cur.line < visible.from)
+            going = setTimeout(operation(function(){extend(e);}), 150);
+        }
+      }
+
+      function done(e) {
+        clearTimeout(going);
+        var cur = posFromMouse(e);
+        if (cur) setSelectionUser(start, cur);
+        e_preventDefault(e);
+        focusInput();
+        updateInput = true;
+        move(); up();
+      }
+      var move = connect(document, "mousemove", operation(function(e) {
+        clearTimeout(going);
+        e_preventDefault(e);
+        if (!ie && !e_button(e)) done(e);
+        else extend(e);
+      }), true);
+      var up = connect(document, "mouseup", operation(done), true);
+    }
+    function onDoubleClick(e) {
+      for (var n = e_target(e); n != wrapper; n = n.parentNode)
+        if (n.parentNode == gutterText) return e_preventDefault(e);
+      var start = posFromMouse(e);
+      if (!start) return;
+      lastDoubleClick = {time: +new Date, pos: start};
+      e_preventDefault(e);
+      selectWordAt(start);
+    }
+    function onDrop(e) {
+      if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return;
+      e.preventDefault();
+      var pos = posFromMouse(e, true), files = e.dataTransfer.files;
+      if (!pos || options.readOnly) return;
+      if (files && files.length && window.FileReader && window.File) {
+        function loadFile(file, i) {
+          var reader = new FileReader;
+          reader.onload = function() {
+            text[i] = reader.result;
+            if (++read == n) {
+              pos = clipPos(pos);
+              operation(function() {
+                var end = replaceRange(text.join(""), pos, pos);
+                setSelectionUser(pos, end);
+              })();
+            }
+          };
+          reader.readAsText(file);
+        }
+        var n = files.length, text = Array(n), read = 0;
+        for (var i = 0; i < n; ++i) loadFile(files[i], i);
+      }
+      else {
+        try {
+          var text = e.dataTransfer.getData("Text");
+          if (text) {
+            compoundChange(function() {
+              var curFrom = sel.from, curTo = sel.to;
+              setSelectionUser(pos, pos);
+              if (draggingText) replaceRange("", curFrom, curTo);
+              replaceSelection(text);
+              focusInput();
+            });
+          }
+        }
+        catch(e){}
+      }
+    }
+    function onDragStart(e) {
+      var txt = getSelection();
+      e.dataTransfer.setData("Text", txt);
+      
+      // Use dummy image instead of default browsers image.
+      if (gecko || chrome) {
+        var img = document.createElement('img');
+        img.scr = 'data:image/gif;base64,R0lGODdhAgACAIAAAAAAAP///ywAAAAAAgACAAACAoRRADs='; //1x1 image
+        e.dataTransfer.setDragImage(img, 0, 0);
+      }
+    }
+
+    function doHandleBinding(bound, dropShift) {
+      if (typeof bound == "string") {
+        bound = commands[bound];
+        if (!bound) return false;
+      }
+      var prevShift = shiftSelecting;
+      try {
+        if (options.readOnly) suppressEdits = true;
+        if (dropShift) shiftSelecting = null;
+        bound(instance);
+      } catch(e) {
+        if (e != Pass) throw e;
+        return false;
+      } finally {
+        shiftSelecting = prevShift;
+        suppressEdits = false;
+      }
+      return true;
+    }
+    function handleKeyBinding(e) {
+      // Handle auto keymap transitions
+      var startMap = getKeyMap(options.keyMap), next = startMap.auto;
+      clearTimeout(maybeTransition);
+      if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
+        if (getKeyMap(options.keyMap) == startMap) {
+          options.keyMap = (next.call ? next.call(null, instance) : next);
+        }
+      }, 50);
+
+      var name = keyNames[e_prop(e, "keyCode")], handled = false;
+      if (name == null || e.altGraphKey) return false;
+      if (e_prop(e, "altKey")) name = "Alt-" + name;
+      if (e_prop(e, "ctrlKey")) name = "Ctrl-" + name;
+      if (e_prop(e, "metaKey")) name = "Cmd-" + name;
+
+      var stopped = false;
+      function stop() { stopped = true; }
+
+      if (e_prop(e, "shiftKey")) {
+        handled = lookupKey("Shift-" + name, options.extraKeys, options.keyMap,
+                            function(b) {return doHandleBinding(b, true);}, stop)
+               || lookupKey(name, options.extraKeys, options.keyMap, function(b) {
+                 if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(b);
+               }, stop);
+      } else {
+        handled = lookupKey(name, options.extraKeys, options.keyMap, doHandleBinding, stop);
+      }
+      if (stopped) handled = false;
+      if (handled) {
+        e_preventDefault(e);
+        restartBlink();
+        if (ie) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
+      }
+      return handled;
+    }
+    function handleCharBinding(e, ch) {
+      var handled = lookupKey("'" + ch + "'", options.extraKeys,
+                              options.keyMap, function(b) { return doHandleBinding(b, true); });
+      if (handled) {
+        e_preventDefault(e);
+        restartBlink();
+      }
+      return handled;
+    }
+
+    var lastStoppedKey = null, maybeTransition;
+    function onKeyDown(e) {
+      if (!focused) onFocus();
+      if (ie && e.keyCode == 27) { e.returnValue = false; }
+      if (pollingFast) { if (readInput()) pollingFast = false; }
+      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+      var code = e_prop(e, "keyCode");
+      // IE does strange things with escape.
+      setShift(code == 16 || e_prop(e, "shiftKey"));
+      // First give onKeyEvent option a chance to handle this.
+      var handled = handleKeyBinding(e);
+      if (window.opera) {
+        lastStoppedKey = handled ? code : null;
+        // Opera has no cut event... we try to at least catch the key combo
+        if (!handled && code == 88 && e_prop(e, mac ? "metaKey" : "ctrlKey"))
+          replaceSelection("");
+      }
+    }
+    function onKeyPress(e) {
+      if (pollingFast) readInput();
+      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+      var keyCode = e_prop(e, "keyCode"), charCode = e_prop(e, "charCode");
+      if (window.opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
+      if (((window.opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(e)) return;
+      var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
+      if (options.electricChars && mode.electricChars && options.smartIndent && !options.readOnly) {
+        if (mode.electricChars.indexOf(ch) > -1)
+          setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 75);
+      }
+      if (handleCharBinding(e, ch)) return;
+      fastPoll();
+    }
+    function onKeyUp(e) {
+      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+      if (e_prop(e, "keyCode") == 16) shiftSelecting = null;
+    }
+
+    function onFocus() {
+      if (options.readOnly == "nocursor") return;
+      if (!focused) {
+        if (options.onFocus) options.onFocus(instance);
+        focused = true;
+        if (wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
+          wrapper.className += " CodeMirror-focused";
+        if (!leaveInputAlone) resetInput(true);
+      }
+      slowPoll();
+      restartBlink();
+    }
+    function onBlur() {
+      if (focused) {
+        if (options.onBlur) options.onBlur(instance);
+        focused = false;
+        if (bracketHighlighted)
+          operation(function(){
+            if (bracketHighlighted) { bracketHighlighted(); bracketHighlighted = null; }
+          })();
+        wrapper.className = wrapper.className.replace(" CodeMirror-focused", "");
+      }
+      clearInterval(blinker);
+      setTimeout(function() {if (!focused) shiftSelecting = null;}, 150);
+    }
+
+    // Replace the range from from to to by the strings in newText.
+    // Afterwards, set the selection to selFrom, selTo.
+    function updateLines(from, to, newText, selFrom, selTo) {
+      if (suppressEdits) return;
+      if (history) {
+        var old = [];
+        doc.iter(from.line, to.line + 1, function(line) { old.push(line.text); });
+        history.addChange(from.line, newText.length, old);
+        while (history.done.length > options.undoDepth) history.done.shift();
+      }
+      updateLinesNoUndo(from, to, newText, selFrom, selTo);
+    }
+    function unredoHelper(from, to) {
+      if (!from.length) return;
+      var set = from.pop(), out = [];
+      for (var i = set.length - 1; i >= 0; i -= 1) {
+        var change = set[i];
+        var replaced = [], end = change.start + change.added;
+        doc.iter(change.start, end, function(line) { replaced.push(line.text); });
+        out.push({start: change.start, added: change.old.length, old: replaced});
+        var pos = clipPos({line: change.start + change.old.length - 1,
+                           ch: editEnd(replaced[replaced.length-1], change.old[change.old.length-1])});
+        updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length}, change.old, pos, pos);
+      }
+      updateInput = true;
+      to.push(out);
+    }
+    function undo() {unredoHelper(history.done, history.undone);}
+    function redo() {unredoHelper(history.undone, history.done);}
+
+    function updateLinesNoUndo(from, to, newText, selFrom, selTo) {
+      if (suppressEdits) return;
+      var recomputeMaxLength = false, maxLineLength = maxLine.length;
+      if (!options.lineWrapping)
+        doc.iter(from.line, to.line + 1, function(line) {
+          if (!line.hidden && line.text.length == maxLineLength) {recomputeMaxLength = true; return true;}
+        });
+      if (from.line != to.line || newText.length > 1) gutterDirty = true;
+
+      var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line);
+      // First adjust the line structure, taking some care to leave highlighting intact.
+      if (from.ch == 0 && to.ch == 0 && newText[newText.length - 1] == "") {
+        // This is a whole-line replace. Treated specially to make
+        // sure line objects move the way they are supposed to.
+        var added = [], prevLine = null;
+        if (from.line) {
+          prevLine = getLine(from.line - 1);
+          prevLine.fixMarkEnds(lastLine);
+        } else lastLine.fixMarkStarts();
+        for (var i = 0, e = newText.length - 1; i < e; ++i)
+          added.push(Line.inheritMarks(newText[i], prevLine));
+        if (nlines) doc.remove(from.line, nlines, callbacks);
+        if (added.length) doc.insert(from.line, added);
+      } else if (firstLine == lastLine) {
+        if (newText.length == 1)
+          firstLine.replace(from.ch, to.ch, newText[0]);
+        else {
+          lastLine = firstLine.split(to.ch, newText[newText.length-1]);
+          firstLine.replace(from.ch, null, newText[0]);
+          firstLine.fixMarkEnds(lastLine);
+          var added = [];
+          for (var i = 1, e = newText.length - 1; i < e; ++i)
+            added.push(Line.inheritMarks(newText[i], firstLine));
+          added.push(lastLine);
+          doc.insert(from.line + 1, added);
+        }
+      } else if (newText.length == 1) {
+        firstLine.replace(from.ch, null, newText[0]);
+        lastLine.replace(null, to.ch, "");
+        firstLine.append(lastLine);
+        doc.remove(from.line + 1, nlines, callbacks);
+      } else {
+        var added = [];
+        firstLine.replace(from.ch, null, newText[0]);
+        lastLine.replace(null, to.ch, newText[newText.length-1]);
+        firstLine.fixMarkEnds(lastLine);
+        for (var i = 1, e = newText.length - 1; i < e; ++i)
+          added.push(Line.inheritMarks(newText[i], firstLine));
+        if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks);
+        doc.insert(from.line + 1, added);
+      }
+      if (options.lineWrapping) {
+        var perLine = Math.max(5, scroller.clientWidth / charWidth() - 3);
+        doc.iter(from.line, from.line + newText.length, function(line) {
+          if (line.hidden) return;
+          var guess = Math.ceil(line.text.length / perLine) || 1;
+          if (guess != line.height) updateLineHeight(line, guess);
+        });
+      } else {
+        doc.iter(from.line, from.line + newText.length, function(line) {
+          var l = line.text;
+          if (!line.hidden && l.length > maxLineLength) {
+            maxLine = l; maxLineLength = l.length; maxWidth = null;
+            recomputeMaxLength = false;
+          }
+        });
+        if (recomputeMaxLength) maxLengthChanged = true;
+      }
+
+      // Add these lines to the work array, so that they will be
+      // highlighted. Adjust work lines if lines were added/removed.
+      var newWork = [], lendiff = newText.length - nlines - 1;
+      for (var i = 0, l = work.length; i < l; ++i) {
+        var task = work[i];
+        if (task < from.line) newWork.push(task);
+        else if (task > to.line) newWork.push(task + lendiff);
+      }
+      var hlEnd = from.line + Math.min(newText.length, 500);
+      highlightLines(from.line, hlEnd);
+      newWork.push(hlEnd);
+      work = newWork;
+      startWorker(100);
+      // Remember that these lines changed, for updating the display
+      changes.push({from: from.line, to: to.line + 1, diff: lendiff});
+      var changeObj = {from: from, to: to, text: newText};
+      if (textChanged) {
+        for (var cur = textChanged; cur.next; cur = cur.next) {}
+        cur.next = changeObj;
+      } else textChanged = changeObj;
+
+      // Update the selection
+      function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;}
+      setSelection(selFrom, selTo, updateLine(sel.from.line), updateLine(sel.to.line));
+
+      // Make sure the scroll-size div has the correct height.
+      if (scroller.clientHeight)
+        code.style.height = (doc.height * textHeight() + 2 * paddingTop()) + "px";
+    }
+    
+    function computeMaxLength() {
+      var maxLineLength = 0; 
+      maxLine = ""; maxWidth = null;
+      doc.iter(0, doc.size, function(line) {
+        var l = line.text;
+        if (!line.hidden && l.length > maxLineLength) {
+          maxLineLength = l.length; maxLine = l;
+        }
+      });
+      maxLengthChanged = false;
+    }
+
+    function replaceRange(code, from, to) {
+      from = clipPos(from);
+      if (!to) to = from; else to = clipPos(to);
+      code = splitLines(code);
+      function adjustPos(pos) {
+        if (posLess(pos, from)) return pos;
+        if (!posLess(to, pos)) return end;
+        var line = pos.line + code.length - (to.line - from.line) - 1;
+        var ch = pos.ch;
+        if (pos.line == to.line)
+          ch += code[code.length-1].length - (to.ch - (to.line == from.line ? from.ch : 0));
+        return {line: line, ch: ch};
+      }
+      var end;
+      replaceRange1(code, from, to, function(end1) {
+        end = end1;
+        return {from: adjustPos(sel.from), to: adjustPos(sel.to)};
+      });
+      return end;
+    }
+    function replaceSelection(code, collapse) {
+      replaceRange1(splitLines(code), sel.from, sel.to, function(end) {
+        if (collapse == "end") return {from: end, to: end};
+        else if (collapse == "start") return {from: sel.from, to: sel.from};
+        else return {from: sel.from, to: end};
+      });
+    }
+    function replaceRange1(code, from, to, computeSel) {
+      var endch = code.length == 1 ? code[0].length + from.ch : code[code.length-1].length;
+      var newSel = computeSel({line: from.line + code.length - 1, ch: endch});
+      updateLines(from, to, code, newSel.from, newSel.to);
+    }
+
+    function getRange(from, to) {
+      var l1 = from.line, l2 = to.line;
+      if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch);
+      var code = [getLine(l1).text.slice(from.ch)];
+      doc.iter(l1 + 1, l2, function(line) { code.push(line.text); });
+      code.push(getLine(l2).text.slice(0, to.ch));
+      return code.join("\n");
+    }
+    function getSelection() {
+      return getRange(sel.from, sel.to);
+    }
+
+    var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll
+    function slowPoll() {
+      if (pollingFast) return;
+      poll.set(options.pollInterval, function() {
+        startOperation();
+        readInput();
+        if (focused) slowPoll();
+        endOperation();
+      });
+    }
+    function fastPoll() {
+      var missed = false;
+      pollingFast = true;
+      function p() {
+        startOperation();
+        var changed = readInput();
+        if (!changed && !missed) {missed = true; poll.set(60, p);}
+        else {pollingFast = false; slowPoll();}
+        endOperation();
+      }
+      poll.set(20, p);
+    }
+
+    // Previnput is a hack to work with IME. If we reset the textarea
+    // on every change, that breaks IME. So we look for changes
+    // compared to the previous content instead. (Modern browsers have
+    // events that indicate IME taking place, but these are not widely
+    // supported or compatible enough yet to rely on.)
+    var prevInput = "";
+    function readInput() {
+      if (leaveInputAlone || !focused || hasSelection(input) || options.readOnly) return false;
+      var text = input.value;
+      if (text == prevInput) return false;
+      shiftSelecting = null;
+      var same = 0, l = Math.min(prevInput.length, text.length);
+      while (same < l && prevInput[same] == text[same]) ++same;
+      if (same < prevInput.length)
+        sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)};
+      else if (overwrite && posEq(sel.from, sel.to))
+        sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))};
+      replaceSelection(text.slice(same), "end");
+      if (text.length > 1000) { input.value = prevInput = ""; }
+      else prevInput = text;
+      return true;
+    }
+    function resetInput(user) {
+      if (!posEq(sel.from, sel.to)) {
+        prevInput = "";
+        input.value = getSelection();
+        selectInput(input);
+      } else if (user) prevInput = input.value = "";
+    }
+
+    function focusInput() {
+      if (options.readOnly != "nocursor") input.focus();
+    }
+
+    function scrollEditorIntoView() {
+      if (!cursor.getBoundingClientRect) return;
+      var rect = cursor.getBoundingClientRect();
+      // IE returns bogus coordinates when the instance sits inside of an iframe and the cursor is hidden
+      if (ie && rect.top == rect.bottom) return;
+      var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
+      if (rect.top < 0 || rect.bottom > winH) cursor.scrollIntoView();
+    }
+    function scrollCursorIntoView() {
+      var cursor = localCoords(sel.inverted ? sel.from : sel.to);
+      var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x;
+      return scrollIntoView(x, cursor.y, x, cursor.yBot);
+    }
+    function scrollIntoView(x1, y1, x2, y2) {
+      var pl = paddingLeft(), pt = paddingTop();
+      y1 += pt; y2 += pt; x1 += pl; x2 += pl;
+      var screen = scroller.clientHeight, screentop = scroller.scrollTop, scrolled = false, result = true;
+      if (y1 < screentop) {scroller.scrollTop = Math.max(0, y1); scrolled = true;}
+      else if (y2 > screentop + screen) {scroller.scrollTop = y2 - screen; scrolled = true;}
+
+      var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft;
+      var gutterw = options.fixedGutter ? gutter.clientWidth : 0;
+      var atLeft = x1 < gutterw + pl + 10;
+      if (x1 < screenleft + gutterw || atLeft) {
+        if (atLeft) x1 = 0;
+        scroller.scrollLeft = Math.max(0, x1 - 10 - gutterw);
+        scrolled = true;
+      }
+      else if (x2 > screenw + screenleft - 3) {
+        scroller.scrollLeft = x2 + 10 - screenw;
+        scrolled = true;
+        if (x2 > code.clientWidth) result = false;
+      }
+      if (scrolled && options.onScroll) options.onScroll(instance);
+      return result;
+    }
+
+    function visibleLines() {
+      var lh = textHeight(), top = scroller.scrollTop - paddingTop();
+      var fromHeight = Math.max(0, Math.floor(top / lh));
+      var toHeight = Math.ceil((top + scroller.clientHeight) / lh);
+      return {from: lineAtHeight(doc, fromHeight),
+              to: lineAtHeight(doc, toHeight)};
+    }
+    // Uses a set of changes plus the current scroll position to
+    // determine which DOM updates have to be made, and makes the
+    // updates.
+    function updateDisplay(changes, suppressCallback) {
+      if (!scroller.clientWidth) {
+        showingFrom = showingTo = displayOffset = 0;
+        return;
+      }
+      // Compute the new visible window
+      var visible = visibleLines();
+      // Bail out if the visible area is already rendered and nothing changed.
+      if (changes !== true && changes.length == 0 && visible.from > showingFrom && visible.to < showingTo) return;
+      var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100);
+      if (showingFrom < from && from - showingFrom < 20) from = showingFrom;
+      if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo);
+
+      // Create a range of theoretically intact lines, and punch holes
+      // in that using the change info.
+      var intact = changes === true ? [] :
+        computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes);
+      // Clip off the parts that won't be visible
+      var intactLines = 0;
+      for (var i = 0; i < intact.length; ++i) {
+        var range = intact[i];
+        if (range.from < from) {range.domStart += (from - range.from); range.from = from;}
+        if (range.to > to) range.to = to;
+        if (range.from >= range.to) intact.splice(i--, 1);
+        else intactLines += range.to - range.from;
+      }
+      if (intactLines == to - from && from == showingFrom && to == showingTo) return;
+      intact.sort(function(a, b) {return a.domStart - b.domStart;});
+
+      var th = textHeight(), gutterDisplay = gutter.style.display;
+      lineDiv.style.display = "none";
+      patchDisplay(from, to, intact);
+      lineDiv.style.display = gutter.style.display = "";
+
+      // Position the mover div to align with the lines it's supposed
+      // to be showing (which will cover the visible display)
+      var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th;
+      // This is just a bogus formula that detects when the editor is
+      // resized or the font size changes.
+      if (different) lastSizeC = scroller.clientHeight + th;
+      showingFrom = from; showingTo = to;
+      displayOffset = heightAtLine(doc, from);
+      mover.style.top = (displayOffset * th) + "px";
+      if (scroller.clientHeight)
+        code.style.height = (doc.height * th + 2 * paddingTop()) + "px";
+
+      // Since this is all rather error prone, it is honoured with the
+      // only assertion in the whole file.
+      if (lineDiv.childNodes.length != showingTo - showingFrom)
+        throw new Error("BAD PATCH! " + JSON.stringify(intact) + " size=" + (showingTo - showingFrom) +
+                        " nodes=" + lineDiv.childNodes.length);
+
+      function checkHeights() {
+        maxWidth = scroller.clientWidth;
+        var curNode = lineDiv.firstChild, heightChanged = false;
+        doc.iter(showingFrom, showingTo, function(line) {
+          if (!line.hidden) {
+            var height = Math.round(curNode.offsetHeight / th) || 1;
+            if (line.height != height) {
+              updateLineHeight(line, height);
+              gutterDirty = heightChanged = true;
+            }
+          }
+          curNode = curNode.nextSibling;
+        });
+        if (heightChanged)
+          code.style.height = (doc.height * th + 2 * paddingTop()) + "px";
+        return heightChanged;
+      }
+
+      if (options.lineWrapping) {
+        checkHeights();
+      } else {
+        if (maxWidth == null) maxWidth = stringWidth(maxLine);
+        if (maxWidth > scroller.clientWidth) {
+          lineSpace.style.width = maxWidth + "px";
+          // Needed to prevent odd wrapping/hiding of widgets placed in here.
+          code.style.width = "";
+          code.style.width = scroller.scrollWidth + "px";
+        } else {
+          lineSpace.style.width = code.style.width = "";
+        }
+      }
+
+      gutter.style.display = gutterDisplay;
+      if (different || gutterDirty) {
+        // If the gutter grew in size, re-check heights. If those changed, re-draw gutter.
+        updateGutter() && options.lineWrapping && checkHeights() && updateGutter();
+      }
+      updateSelection();
+      if (!suppressCallback && options.onUpdate) options.onUpdate(instance);
+      return true;
+    }
+
+    function computeIntact(intact, changes) {
+      for (var i = 0, l = changes.length || 0; i < l; ++i) {
+        var change = changes[i], intact2 = [], diff = change.diff || 0;
+        for (var j = 0, l2 = intact.length; j < l2; ++j) {
+          var range = intact[j];
+          if (change.to <= range.from && change.diff)
+            intact2.push({from: range.from + diff, to: range.to + diff,
+                          domStart: range.domStart});
+          else if (change.to <= range.from || change.from >= range.to)
+            intact2.push(range);
+          else {
+            if (change.from > range.from)
+              intact2.push({from: range.from, to: change.from, domStart: range.domStart});
+            if (change.to < range.to)
+              intact2.push({from: change.to + diff, to: range.to + diff,
+                            domStart: range.domStart + (change.to - range.from)});
+          }
+        }
+        intact = intact2;
+      }
+      return intact;
+    }
+
+    function patchDisplay(from, to, intact) {
+      // The first pass removes the DOM nodes that aren't intact.
+      if (!intact.length) lineDiv.innerHTML = "";
+      else {
+        function killNode(node) {
+          var tmp = node.nextSibling;
+          node.parentNode.removeChild(node);
+          return tmp;
+        }
+        var domPos = 0, curNode = lineDiv.firstChild, n;
+        for (var i = 0; i < intact.length; ++i) {
+          var cur = intact[i];
+          while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;}
+          for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;}
+        }
+        while (curNode) curNode = killNode(curNode);
+      }
+      // This pass fills in the lines that actually changed.
+      var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from;
+      var scratch = document.createElement("div");
+      doc.iter(from, to, function(line) {
+        if (nextIntact && nextIntact.to == j) nextIntact = intact.shift();
+        if (!nextIntact || nextIntact.from > j) {
+          if (line.hidden) var html = scratch.innerHTML = "<pre></pre>";
+          else {
+            var html = '<pre' + (line.className ? ' class="' + line.className + '"' : '') + '>'
+              + line.getHTML(makeTab) + '</pre>';
+            // Kludge to make sure the styled element lies behind the selection (by z-index)
+            if (line.bgClassName)
+              html = '<div style="position: relative"><pre class="' + line.bgClassName +
+              '" style="position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -2"> </pre>' + html + "</div>";
+          }
+          scratch.innerHTML = html;
+          lineDiv.insertBefore(scratch.firstChild, curNode);
+        } else {
+          curNode = curNode.nextSibling;
+        }
+        ++j;
+      });
+    }
+
+    function updateGutter() {
+      if (!options.gutter && !options.lineNumbers) return;
+      var hText = mover.offsetHeight, hEditor = scroller.clientHeight;
+      gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px";
+      var html = [], i = showingFrom, normalNode;
+      doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) {
+        if (line.hidden) {
+          html.push("<pre></pre>");
+        } else {
+          var marker = line.gutterMarker;
+          var text = options.lineNumbers ? i + options.firstLineNumber : null;
+          if (marker && marker.text)
+            text = marker.text.replace("%N%", text != null ? text : "");
+          else if (text == null)
+            text = "\u00a0";
+          html.push((marker && marker.style ? '<pre class="' + marker.style + '">' : "<pre>"), text);
+          for (var j = 1; j < line.height; ++j) html.push("<br/> ");
+          html.push("</pre>");
+          if (!marker) normalNode = i;
+        }
+        ++i;
+      });
+      gutter.style.display = "none";
+      gutterText.innerHTML = html.join("");
+      // Make sure scrolling doesn't cause number gutter size to pop
+      if (normalNode != null) {
+        var node = gutterText.childNodes[normalNode - showingFrom];
+        var minwidth = String(doc.size).length, val = eltText(node), pad = "";
+        while (val.length + pad.length < minwidth) pad += "\u00a0";
+        if (pad) node.insertBefore(document.createTextNode(pad), node.firstChild);
+      }
+      gutter.style.display = "";
+      var resized = Math.abs((parseInt(lineSpace.style.marginLeft) || 0) - gutter.offsetWidth) > 2;
+      lineSpace.style.marginLeft = gutter.offsetWidth + "px";
+      gutterDirty = false;
+      return resized;
+    }
+    function updateSelection() {
+      var collapsed = posEq(sel.from, sel.to);
+      var fromPos = localCoords(sel.from, true);
+      var toPos = collapsed ? fromPos : localCoords(sel.to, true);
+      var headPos = sel.inverted ? fromPos : toPos, th = textHeight();
+      var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv);
+      inputDiv.style.top = Math.max(0, Math.min(scroller.offsetHeight, headPos.y + lineOff.top - wrapOff.top)) + "px";
+      inputDiv.style.left = Math.max(0, Math.min(scroller.offsetWidth, headPos.x + lineOff.left - wrapOff.left)) + "px";
+      if (collapsed) {
+        cursor.style.top = headPos.y + "px";
+        cursor.style.left = (options.lineWrapping ? Math.min(headPos.x, lineSpace.offsetWidth) : headPos.x) + "px";
+        cursor.style.display = "";
+        selectionDiv.style.display = "none";
+      } else {
+        var sameLine = fromPos.y == toPos.y, html = "";
+        var clientWidth = lineSpace.clientWidth || lineSpace.offsetWidth;
+        var clientHeight = lineSpace.clientHeight || lineSpace.offsetHeight;
+        function add(left, top, right, height) {
+          var rstyle = quirksMode ? "width: " + (!right ? clientWidth : clientWidth - right - left) + "px"
+                                  : "right: " + right + "px";
+          html += '<div class="CodeMirror-selected" style="position: absolute; left: ' + left +
+            'px; top: ' + top + 'px; ' + rstyle + '; height: ' + height + 'px"></div>';
+        }
+        if (sel.from.ch && fromPos.y >= 0) {
+          var right = sameLine ? clientWidth - toPos.x : 0;
+          add(fromPos.x, fromPos.y, right, th);
+        }
+        var middleStart = Math.max(0, fromPos.y + (sel.from.ch ? th : 0));
+        var middleHeight = Math.min(toPos.y, clientHeight) - middleStart;
+        if (middleHeight > 0.2 * th)
+          add(0, middleStart, 0, middleHeight);
+        if ((!sameLine || !sel.from.ch) && toPos.y < clientHeight - .5 * th)
+          add(0, toPos.y, clientWidth - toPos.x, th);
+        selectionDiv.innerHTML = html;
+        cursor.style.display = "none";
+        selectionDiv.style.display = "";
+      }
+    }
+
+    function setShift(val) {
+      if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from);
+      else shiftSelecting = null;
+    }
+    function setSelectionUser(from, to) {
+      var sh = shiftSelecting && clipPos(shiftSelecting);
+      if (sh) {
+        if (posLess(sh, from)) from = sh;
+        else if (posLess(to, sh)) to = sh;
+      }
+      setSelection(from, to);
+      userSelChange = true;
+    }
+    // Update the selection. Last two args are only used by
+    // updateLines, since they have to be expressed in the line
+    // numbers before the update.
+    function setSelection(from, to, oldFrom, oldTo) {
+      goalColumn = null;
+      if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;}
+      if (posEq(sel.from, from) && posEq(sel.to, to)) return;
+      if (posLess(to, from)) {var tmp = to; to = from; from = tmp;}
+
+      // Skip over hidden lines.
+      if (from.line != oldFrom) {
+        var from1 = skipHidden(from, oldFrom, sel.from.ch);
+        // If there is no non-hidden line left, force visibility on current line
+        if (!from1) setLineHidden(from.line, false);
+        else from = from1;
+      }
+      if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch);
+
+      if (posEq(from, to)) sel.inverted = false;
+      else if (posEq(from, sel.to)) sel.inverted = false;
+      else if (posEq(to, sel.from)) sel.inverted = true;
+
+      if (options.autoClearEmptyLines && posEq(sel.from, sel.to)) {
+        var head = sel.inverted ? from : to;
+        if (head.line != sel.from.line && sel.from.line < doc.size) {
+          var oldLine = getLine(sel.from.line);
+          if (/^\s+$/.test(oldLine.text))
+            setTimeout(operation(function() {
+              if (oldLine.parent && /^\s+$/.test(oldLine.text)) {
+                var no = lineNo(oldLine);
+                replaceRange("", {line: no, ch: 0}, {line: no, ch: oldLine.text.length});
+              }
+            }, 10));
+        }
+      }
+
+      sel.from = from; sel.to = to;
+      selectionChanged = true;
+    }
+    function skipHidden(pos, oldLine, oldCh) {
+      function getNonHidden(dir) {
+        var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1;
+        while (lNo != end) {
+          var line = getLine(lNo);
+          if (!line.hidden) {
+            var ch = pos.ch;
+            if (toEnd || ch > oldCh || ch > line.text.length) ch = line.text.length;
+            return {line: lNo, ch: ch};
+          }
+          lNo += dir;
+        }
+      }
+      var line = getLine(pos.line);
+      var toEnd = pos.ch == line.text.length && pos.ch != oldCh;
+      if (!line.hidden) return pos;
+      if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1);
+      else return getNonHidden(-1) || getNonHidden(1);
+    }
+    function setCursor(line, ch, user) {
+      var pos = clipPos({line: line, ch: ch || 0});
+      (user ? setSelectionUser : setSelection)(pos, pos);
+    }
+
+    function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));}
+    function clipPos(pos) {
+      if (pos.line < 0) return {line: 0, ch: 0};
+      if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length};
+      var ch = pos.ch, linelen = getLine(pos.line).text.length;
+      if (ch == null || ch > linelen) return {line: pos.line, ch: linelen};
+      else if (ch < 0) return {line: pos.line, ch: 0};
+      else return pos;
+    }
+
+    function findPosH(dir, unit) {
+      var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch;
+      var lineObj = getLine(line);
+      function findNextLine() {
+        for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) {
+          var lo = getLine(l);
+          if (!lo.hidden) { line = l; lineObj = lo; return true; }
+        }
+      }
+      function moveOnce(boundToLine) {
+        if (ch == (dir < 0 ? 0 : lineObj.text.length)) {
+          if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0;
+          else return false;
+        } else ch += dir;
+        return true;
+      }
+      if (unit == "char") moveOnce();
+      else if (unit == "column") moveOnce(true);
+      else if (unit == "word") {
+        var sawWord = false;
+        for (;;) {
+          if (dir < 0) if (!moveOnce()) break;
+          if (isWordChar(lineObj.text.charAt(ch))) sawWord = true;
+          else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;}
+          if (dir > 0) if (!moveOnce()) break;
+        }
+      }
+      return {line: line, ch: ch};
+    }
+    function moveH(dir, unit) {
+      var pos = dir < 0 ? sel.from : sel.to;
+      if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit);
+      setCursor(pos.line, pos.ch, true);
+    }
+    function deleteH(dir, unit) {
+      if (!posEq(sel.from, sel.to)) replaceRange("", sel.from, sel.to);
+      else if (dir < 0) replaceRange("", findPosH(dir, unit), sel.to);
+      else replaceRange("", sel.from, findPosH(dir, unit));
+      userSelChange = true;
+    }
+    var goalColumn = null;
+    function moveV(dir, unit) {
+      var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true);
+      if (goalColumn != null) pos.x = goalColumn;
+      if (unit == "page") dist = Math.min(scroller.clientHeight, window.innerHeight || document.documentElement.clientHeight);
+      else if (unit == "line") dist = textHeight();
+      var target = coordsChar(pos.x, pos.y + dist * dir + 2);
+      if (unit == "page") scroller.scrollTop += localCoords(target, true).y - pos.y;
+      setCursor(target.line, target.ch, true);
+      goalColumn = pos.x;
+    }
+
+    function selectWordAt(pos) {
+      var line = getLine(pos.line).text;
+      var start = pos.ch, end = pos.ch;
+      while (start > 0 && isWordChar(line.charAt(start - 1))) --start;
+      while (end < line.length && isWordChar(line.charAt(end))) ++end;
+      setSelectionUser({line: pos.line, ch: start}, {line: pos.line, ch: end});
+    }
+    function selectLine(line) {
+      setSelectionUser({line: line, ch: 0}, clipPos({line: line + 1, ch: 0}));
+    }
+    function indentSelected(mode) {
+      if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode);
+      var e = sel.to.line - (sel.to.ch ? 0 : 1);
+      for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode);
+    }
+
+    function indentLine(n, how) {
+      if (!how) how = "add";
+      if (how == "smart") {
+        if (!mode.indent) how = "prev";
+        else var state = getStateBefore(n);
+      }
+
+      var line = getLine(n), curSpace = line.indentation(options.tabSize),
+          curSpaceString = line.text.match(/^\s*/)[0], indentation;
+      if (how == "prev") {
+        if (n) indentation = getLine(n-1).indentation(options.tabSize);
+        else indentation = 0;
+      }
+      else if (how == "smart") indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text);
+      else if (how == "add") indentation = curSpace + options.indentUnit;
+      else if (how == "subtract") indentation = curSpace - options.indentUnit;
+      indentation = Math.max(0, indentation);
+      var diff = indentation - curSpace;
+
+      if (!diff) {
+        if (sel.from.line != n && sel.to.line != n) return;
+        var indentString = curSpaceString;
+      }
+      else {
+        var indentString = "", pos = 0;
+        if (options.indentWithTabs)
+          for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += "\t";}
+        while (pos < indentation) {++pos; indentString += " ";}
+      }
+
+      replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});
+    }
+
+    function loadMode() {
+      mode = CodeMirror.getMode(options, options.mode);
+      doc.iter(0, doc.size, function(line) { line.stateAfter = null; });
+      work = [0];
+      startWorker();
+    }
+    function gutterChanged() {
+      var visible = options.gutter || options.lineNumbers;
+      gutter.style.display = visible ? "" : "none";
+      if (visible) gutterDirty = true;
+      else lineDiv.parentNode.style.marginLeft = 0;
+    }
+    function wrappingChanged(from, to) {
+      if (options.lineWrapping) {
+        wrapper.className += " CodeMirror-wrap";
+        var perLine = scroller.clientWidth / charWidth() - 3;
+        doc.iter(0, doc.size, function(line) {
+          if (line.hidden) return;
+          var guess = Math.ceil(line.text.length / perLine) || 1;
+          if (guess != 1) updateLineHeight(line, guess);
+        });
+        lineSpace.style.width = code.style.width = "";
+      } else {
+        wrapper.className = wrapper.className.replace(" CodeMirror-wrap", "");
+        maxWidth = null; maxLine = "";
+        doc.iter(0, doc.size, function(line) {
+          if (line.height != 1 && !line.hidden) updateLineHeight(line, 1);
+          if (line.text.length > maxLine.length) maxLine = line.text;
+        });
+      }
+      changes.push({from: 0, to: doc.size});
+    }
+    function makeTab(col) {
+      var w = options.tabSize - col % options.tabSize, cached = tabCache[w];
+      if (cached) return cached;
+      for (var str = '<span class="cm-tab">', i = 0; i < w; ++i) str += " ";
+      return (tabCache[w] = {html: str + "</span>", width: w});
+    }
+    function themeChanged() {
+      scroller.className = scroller.className.replace(/\s*cm-s-\S+/g, "") +
+        options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+    }
+    function keyMapChanged() {
+      var style = keyMap[options.keyMap].style;
+      wrapper.className = wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
+        (style ? " cm-keymap-" + style : "");
+    }
+
+    function TextMarker() { this.set = []; }
+    TextMarker.prototype.clear = operation(function() {
+      var min = Infinity, max = -Infinity;
+      for (var i = 0, e = this.set.length; i < e; ++i) {
+        var line = this.set[i], mk = line.marked;
+        if (!mk || !line.parent) continue;
+        var lineN = lineNo(line);
+        min = Math.min(min, lineN); max = Math.max(max, lineN);
+        for (var j = 0; j < mk.length; ++j)
+          if (mk[j].marker == this) mk.splice(j--, 1);
+      }
+      if (min != Infinity)
+        changes.push({from: min, to: max + 1});
+    });
+    TextMarker.prototype.find = function() {
+      var from, to;
+      for (var i = 0, e = this.set.length; i < e; ++i) {
+        var line = this.set[i], mk = line.marked;
+        for (var j = 0; j < mk.length; ++j) {
+          var mark = mk[j];
+          if (mark.marker == this) {
+            if (mark.from != null || mark.to != null) {
+              var found = lineNo(line);
+              if (found != null) {
+                if (mark.from != null) from = {line: found, ch: mark.from};
+                if (mark.to != null) to = {line: found, ch: mark.to};
+              }
+            }
+          }
+        }
+      }
+      return {from: from, to: to};
+    };
+
+    function markText(from, to, className) {
+      from = clipPos(from); to = clipPos(to);
+      var tm = new TextMarker();
+      if (!posLess(from, to)) return tm;
+      function add(line, from, to, className) {
+        getLine(line).addMark(new MarkedText(from, to, className, tm));
+      }
+      if (from.line == to.line) add(from.line, from.ch, to.ch, className);
+      else {
+        add(from.line, from.ch, null, className);
+        for (var i = from.line + 1, e = to.line; i < e; ++i)
+          add(i, null, null, className);
+        add(to.line, null, to.ch, className);
+      }
+      changes.push({from: from.line, to: to.line + 1});
+      return tm;
+    }
+
+    function setBookmark(pos) {
+      pos = clipPos(pos);
+      var bm = new Bookmark(pos.ch);
+      getLine(pos.line).addMark(bm);
+      return bm;
+    }
+
+    function findMarksAt(pos) {
+      pos = clipPos(pos);
+      var markers = [], marked = getLine(pos.line).marked;
+      if (!marked) return markers;
+      for (var i = 0, e = marked.length; i < e; ++i) {
+        var m = marked[i];
+        if ((m.from == null || m.from <= pos.ch) &&
+            (m.to == null || m.to >= pos.ch))
+          markers.push(m.marker || m);
+      }
+      return markers;
+    }
+
+    function addGutterMarker(line, text, className) {
+      if (typeof line == "number") line = getLine(clipLine(line));
+      line.gutterMarker = {text: text, style: className};
+      gutterDirty = true;
+      return line;
+    }
+    function removeGutterMarker(line) {
+      if (typeof line == "number") line = getLine(clipLine(line));
+      line.gutterMarker = null;
+      gutterDirty = true;
+    }
+
+    function changeLine(handle, op) {
+      var no = handle, line = handle;
+      if (typeof handle == "number") line = getLine(clipLine(handle));
+      else no = lineNo(handle);
+      if (no == null) return null;
+      if (op(line, no)) changes.push({from: no, to: no + 1});
+      else return null;
+      return line;
+    }
+    function setLineClass(handle, className, bgClassName) {
+      return changeLine(handle, function(line) {
+        if (line.className != className || line.bgClassName != bgClassName) {
+          line.className = className;
+          line.bgClassName = bgClassName;
+          return true;
+        }
+      });
+    }
+    function setLineHidden(handle, hidden) {
+      return changeLine(handle, function(line, no) {
+        if (line.hidden != hidden) {
+          line.hidden = hidden;
+          if (!options.lineWrapping) {
+            var l = line.text;
+            if (hidden && l.length == maxLine.length) {
+              maxLengthChanged = true;
+            }
+            else if (!hidden && l.length > maxLine.length) {
+              maxLine = l; maxWidth = null;
+              maxLengthChanged = false;
+            }
+          }
+          updateLineHeight(line, hidden ? 0 : 1);
+          var fline = sel.from.line, tline = sel.to.line;
+          if (hidden && (fline == no || tline == no)) {
+            var from = fline == no ? skipHidden({line: fline, ch: 0}, fline, 0) : sel.from;
+            var to = tline == no ? skipHidden({line: tline, ch: 0}, tline, 0) : sel.to;
+            // Can't hide the last visible line, we'd have no place to put the cursor
+            if (!to) return;
+            setSelection(from, to);
+          }
+          return (gutterDirty = true);
+        }
+      });
+    }
+
+    function lineInfo(line) {
+      if (typeof line == "number") {
+        if (!isLine(line)) return null;
+        var n = line;
+        line = getLine(line);
+        if (!line) return null;
+      }
+      else {
+        var n = lineNo(line);
+        if (n == null) return null;
+      }
+      var marker = line.gutterMarker;
+      return {line: n, handle: line, text: line.text, markerText: marker && marker.text,
+              markerClass: marker && marker.style, lineClass: line.className, bgClass: line.bgClassName};
+    }
+
+    function stringWidth(str) {
+      measure.innerHTML = "<pre><span>x</span></pre>";
+      measure.firstChild.firstChild.firstChild.nodeValue = str;
+      return measure.firstChild.firstChild.offsetWidth || 10;
+    }
+    // These are used to go from pixel positions to character
+    // positions, taking varying character widths into account.
+    function charFromX(line, x) {
+      if (x <= 0) return 0;
+      var lineObj = getLine(line), text = lineObj.text;
+      function getX(len) {
+        return measureLine(lineObj, len).left;
+      }
+      var from = 0, fromX = 0, to = text.length, toX;
+      // Guess a suitable upper bound for our search.
+      var estimated = Math.min(to, Math.ceil(x / charWidth()));
+      for (;;) {
+        var estX = getX(estimated);
+        if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
+        else {toX = estX; to = estimated; break;}
+      }
+      if (x > toX) return to;
+      // Try to guess a suitable lower bound as well.
+      estimated = Math.floor(to * 0.8); estX = getX(estimated);
+      if (estX < x) {from = estimated; fromX = estX;}
+      // Do a binary search between these bounds.
+      for (;;) {
+        if (to - from <= 1) return (toX - x > x - fromX) ? from : to;
+        var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
+        if (middleX > x) {to = middle; toX = middleX;}
+        else {from = middle; fromX = middleX;}
+      }
+    }
+
+    var tempId = "CodeMirror-temp-" + Math.floor(Math.random() * 0xffffff).toString(16);
+    function measureLine(line, ch) {
+      if (ch == 0) return {top: 0, left: 0};
+      var wbr = options.lineWrapping && ch < line.text.length &&
+                spanAffectsWrapping.test(line.text.slice(ch - 1, ch + 1));
+      measure.innerHTML = "<pre>" + line.getHTML(makeTab, ch, tempId, wbr) + "</pre>";
+      var elt = document.getElementById(tempId);
+      var top = elt.offsetTop, left = elt.offsetLeft;
+      // Older IEs report zero offsets for spans directly after a wrap
+      if (ie && top == 0 && left == 0) {
+        var backup = document.createElement("span");
+        backup.innerHTML = "x";
+        elt.parentNode.insertBefore(backup, elt.nextSibling);
+        top = backup.offsetTop;
+      }
+      return {top: top, left: left};
+    }
+    function localCoords(pos, inLineWrap) {
+      var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0));
+      if (pos.ch == 0) x = 0;
+      else {
+        var sp = measureLine(getLine(pos.line), pos.ch);
+        x = sp.left;
+        if (options.lineWrapping) y += Math.max(0, sp.top);
+      }
+      return {x: x, y: y, yBot: y + lh};
+    }
+    // Coords must be lineSpace-local
+    function coordsChar(x, y) {
+      if (y < 0) y = 0;
+      var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th);
+      var lineNo = lineAtHeight(doc, heightPos);
+      if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length};
+      var lineObj = getLine(lineNo), text = lineObj.text;
+      var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0;
+      if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0};
+      function getX(len) {
+        var sp = measureLine(lineObj, len);
+        if (tw) {
+          var off = Math.round(sp.top / th);
+          return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth);
+        }
+        return sp.left;
+      }
+      var from = 0, fromX = 0, to = text.length, toX;
+      // Guess a suitable upper bound for our search.
+      var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw));
+      for (;;) {
+        var estX = getX(estimated);
+        if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
+        else {toX = estX; to = estimated; break;}
+      }
+      if (x > toX) return {line: lineNo, ch: to};
+      // Try to guess a suitable lower bound as well.
+      estimated = Math.floor(to * 0.8); estX = getX(estimated);
+      if (estX < x) {from = estimated; fromX = estX;}
+      // Do a binary search between these bounds.
+      for (;;) {
+        if (to - from <= 1) return {line: lineNo, ch: (toX - x > x - fromX) ? from : to};
+        var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
+        if (middleX > x) {to = middle; toX = middleX;}
+        else {from = middle; fromX = middleX;}
+      }
+    }
+    function pageCoords(pos) {
+      var local = localCoords(pos, true), off = eltOffset(lineSpace);
+      return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot};
+    }
+
+    var cachedHeight, cachedHeightFor, measureText;
+    function textHeight() {
+      if (measureText == null) {
+        measureText = "<pre>";
+        for (var i = 0; i < 49; ++i) measureText += "x<br/>";
+        measureText += "x</pre>";
+      }
+      var offsetHeight = lineDiv.clientHeight;
+      if (offsetHeight == cachedHeightFor) return cachedHeight;
+      cachedHeightFor = offsetHeight;
+      measure.innerHTML = measureText;
+      cachedHeight = measure.firstChild.offsetHeight / 50 || 1;
+      measure.innerHTML = "";
+      return cachedHeight;
+    }
+    var cachedWidth, cachedWidthFor = 0;
+    function charWidth() {
+      if (scroller.clientWidth == cachedWidthFor) return cachedWidth;
+      cachedWidthFor = scroller.clientWidth;
+      return (cachedWidth = stringWidth("x"));
+    }
+    function paddingTop() {return lineSpace.offsetTop;}
+    function paddingLeft() {return lineSpace.offsetLeft;}
+
+    function posFromMouse(e, liberal) {
+      var offW = eltOffset(scroller, true), x, y;
+      // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+      try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
+      // This is a mess of a heuristic to try and determine whether a
+      // scroll-bar was clicked or not, and to return null if one was
+      // (and !liberal).
+      if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight))
+        return null;
+      var offL = eltOffset(lineSpace, true);
+      return coordsChar(x - offL.left, y - offL.top);
+    }
+    function onContextMenu(e) {
+      var pos = posFromMouse(e), scrollPos = scroller.scrollTop;
+      if (!pos || window.opera) return; // Opera is difficult.
+      if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
+        operation(setCursor)(pos.line, pos.ch);
+
+      var oldCSS = input.style.cssText;
+      inputDiv.style.position = "absolute";
+      input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
+        "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; " +
+        "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
+      leaveInputAlone = true;
+      var val = input.value = getSelection();
+      focusInput();
+      selectInput(input);
+      function rehide() {
+        var newVal = splitLines(input.value).join("\n");
+        if (newVal != val) operation(replaceSelection)(newVal, "end");
+        inputDiv.style.position = "relative";
+        input.style.cssText = oldCSS;
+        if (ie_lt9) scroller.scrollTop = scrollPos;
+        leaveInputAlone = false;
+        resetInput(true);
+        slowPoll();
+      }
+
+      if (gecko) {
+        e_stop(e);
+        var mouseup = connect(window, "mouseup", function() {
+          mouseup();
+          setTimeout(rehide, 20);
+        }, true);
+      } else {
+        setTimeout(rehide, 50);
+      }
+    }
+
+    // Cursor-blinking
+    function restartBlink() {
+      clearInterval(blinker);
+      var on = true;
+      cursor.style.visibility = "";
+      blinker = setInterval(function() {
+        cursor.style.visibility = (on = !on) ? "" : "hidden";
+      }, 650);
+    }
+
+    var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
+    function matchBrackets(autoclear) {
+      var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1;
+      var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
+      if (!match) return;
+      var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles;
+      for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2)
+        if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;}
+
+      var stack = [line.text.charAt(pos)], re = /[(){}[\]]/;
+      function scan(line, from, to) {
+        if (!line.text) return;
+        var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur;
+        for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) {
+          var text = st[i];
+          if (st[i+1] != null && st[i+1] != style) {pos += d * text.length; continue;}
+          for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) {
+            if (pos >= from && pos < to && re.test(cur = text.charAt(j))) {
+              var match = matching[cur];
+              if (match.charAt(1) == ">" == forward) stack.push(cur);
+              else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};
+              else if (!stack.length) return {pos: pos, match: true};
+            }
+          }
+        }
+      }
+      for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) {
+        var line = getLine(i), first = i == head.line;
+        var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length);
+        if (found) break;
+      }
+      if (!found) found = {pos: null, match: false};
+      var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
+      var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style),
+          two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style);
+      var clear = operation(function(){one.clear(); two && two.clear();});
+      if (autoclear) setTimeout(clear, 800);
+      else bracketHighlighted = clear;
+    }
+
+    // Finds the line to start with when starting a parse. Tries to
+    // find a line with a stateAfter, so that it can start with a
+    // valid state. If that fails, it returns the line with the
+    // smallest indentation, which tends to need the least context to
+    // parse correctly.
+    function findStartLine(n) {
+      var minindent, minline;
+      for (var search = n, lim = n - 40; search > lim; --search) {
+        if (search == 0) return 0;
+        var line = getLine(search-1);
+        if (line.stateAfter) return search;
+        var indented = line.indentation(options.tabSize);
+        if (minline == null || minindent > indented) {
+          minline = search - 1;
+          minindent = indented;
+        }
+      }
+      return minline;
+    }
+    function getStateBefore(n) {
+      var start = findStartLine(n), state = start && getLine(start-1).stateAfter;
+      if (!state) state = startState(mode);
+      else state = copyState(mode, state);
+      doc.iter(start, n, function(line) {
+        line.highlight(mode, state, options.tabSize);
+        line.stateAfter = copyState(mode, state);
+      });
+      if (start < n) changes.push({from: start, to: n});
+      if (n < doc.size && !getLine(n).stateAfter) work.push(n);
+      return state;
+    }
+    function highlightLines(start, end) {
+      var state = getStateBefore(start);
+      doc.iter(start, end, function(line) {
+        line.highlight(mode, state, options.tabSize);
+        line.stateAfter = copyState(mode, state);
+      });
+    }
+    function highlightWorker() {
+      var end = +new Date + options.workTime;
+      var foundWork = work.length;
+      while (work.length) {
+        if (!getLine(showingFrom).stateAfter) var task = showingFrom;
+        else var task = work.pop();
+        if (task >= doc.size) continue;
+        var start = findStartLine(task), state = start && getLine(start-1).stateAfter;
+        if (state) state = copyState(mode, state);
+        else state = startState(mode);
+
+        var unchanged = 0, compare = mode.compareStates, realChange = false,
+            i = start, bail = false;
+        doc.iter(i, doc.size, function(line) {
+          var hadState = line.stateAfter;
+          if (+new Date > end) {
+            work.push(i);
+            startWorker(options.workDelay);
+            if (realChange) changes.push({from: task, to: i + 1});
+            return (bail = true);
+          }
+          var changed = line.highlight(mode, state, options.tabSize);
+          if (changed) realChange = true;
+          line.stateAfter = copyState(mode, state);
+          var done = null;
+          if (compare) {
+            var same = hadState && compare(hadState, state);
+            if (same != Pass) done = !!same;
+          }
+          if (done == null) {
+            if (changed !== false || !hadState) unchanged = 0;
+            else if (++unchanged > 3 && (!mode.indent || mode.indent(hadState, "") == mode.indent(state, "")))
+              done = true;
+          }
+          if (done) return true;
+          ++i;
+        });
+        if (bail) return;
+        if (realChange) changes.push({from: task, to: i + 1});
+      }
+      if (foundWork && options.onHighlightComplete)
+        options.onHighlightComplete(instance);
+    }
+    function startWorker(time) {
+      if (!work.length) return;
+      highlight.set(time, operation(highlightWorker));
+    }
+
+    // Operations are used to wrap changes in such a way that each
+    // change won't have to update the cursor and display (which would
+    // be awkward, slow, and error-prone), but instead updates are
+    // batched and then all combined and executed at once.
+    function startOperation() {
+      updateInput = userSelChange = textChanged = null;
+      changes = []; selectionChanged = false; callbacks = [];
+    }
+    function endOperation() {
+      var reScroll = false, updated;
+      if (maxLengthChanged) computeMaxLength();
+      if (selectionChanged) reScroll = !scrollCursorIntoView();
+      if (changes.length) updated = updateDisplay(changes, true);
+      else {
+        if (selectionChanged) updateSelection();
+        if (gutterDirty) updateGutter();
+      }
+      if (reScroll) scrollCursorIntoView();
+      if (selectionChanged) {scrollEditorIntoView(); restartBlink();}
+
+      if (focused && !leaveInputAlone &&
+          (updateInput === true || (updateInput !== false && selectionChanged)))
+        resetInput(userSelChange);
+
+      if (selectionChanged && options.matchBrackets)
+        setTimeout(operation(function() {
+          if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;}
+          if (posEq(sel.from, sel.to)) matchBrackets(false);
+        }), 20);
+      var tc = textChanged, cbs = callbacks; // these can be reset by callbacks
+      if (selectionChanged && options.onCursorActivity)
+        options.onCursorActivity(instance);
+      if (tc && options.onChange && instance)
+        options.onChange(instance, tc);
+      for (var i = 0; i < cbs.length; ++i) cbs[i](instance);
+      if (updated && options.onUpdate) options.onUpdate(instance);
+    }
+    var nestedOperation = 0;
+    function operation(f) {
+      return function() {
+        if (!nestedOperation++) startOperation();
+        try {var result = f.apply(this, arguments);}
+        finally {if (!--nestedOperation) endOperation();}
+        return result;
+      };
+    }
+
+    function compoundChange(f) {
+      history.startCompound();
+      try { return f(); } finally { history.endCompound(); }
+    }
+
+    for (var ext in extensions)
+      if (extensions.propertyIsEnumerable(ext) &&
+          !instance.propertyIsEnumerable(ext))
+        instance[ext] = extensions[ext];
+    return instance;
+  } // (end of function CodeMirror)
+
+  // The default configuration options.
+  CodeMirror.defaults = {
+    value: "",
+    mode: null,
+    theme: "default",
+    indentUnit: 2,
+    indentWithTabs: false,
+    smartIndent: true,
+    tabSize: 4,
+    keyMap: "default",
+    extraKeys: null,
+    electricChars: true,
+    autoClearEmptyLines: false,
+    onKeyEvent: null,
+    onDragEvent: null,
+    lineWrapping: false,
+    lineNumbers: false,
+    gutter: false,
+    fixedGutter: false,
+    firstLineNumber: 1,
+    readOnly: false,
+    dragDrop: true,
+    onChange: null,
+    onCursorActivity: null,
+    onGutterClick: null,
+    onHighlightComplete: null,
+    onUpdate: null,
+    onFocus: null, onBlur: null, onScroll: null,
+    matchBrackets: false,
+    workTime: 100,
+    workDelay: 200,
+    pollInterval: 100,
+    undoDepth: 40,
+    tabindex: null,
+    autofocus: null
+  };
+
+  var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
+  var mac = ios || /Mac/.test(navigator.platform);
+  var win = /Win/.test(navigator.platform);
+
+  // Known modes, by name and by MIME
+  var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
+  CodeMirror.defineMode = function(name, mode) {
+    if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
+    if (arguments.length > 2) {
+      mode.dependencies = [];
+      for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
+    }
+    modes[name] = mode;
+  };
+  CodeMirror.defineMIME = function(mime, spec) {
+    mimeModes[mime] = spec;
+  };
+  CodeMirror.resolveMode = function(spec) {
+    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
+      spec = mimeModes[spec];
+    else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec))
+      return CodeMirror.resolveMode("application/xml");
+    if (typeof spec == "string") return {name: spec};
+    else return spec || {name: "null"};
+  };
+  CodeMirror.getMode = function(options, spec) {
+    var spec = CodeMirror.resolveMode(spec);
+    var mfactory = modes[spec.name];
+    if (!mfactory) return CodeMirror.getMode(options, "text/plain");
+    return mfactory(options, spec);
+  };
+  CodeMirror.listModes = function() {
+    var list = [];
+    for (var m in modes)
+      if (modes.propertyIsEnumerable(m)) list.push(m);
+    return list;
+  };
+  CodeMirror.listMIMEs = function() {
+    var list = [];
+    for (var m in mimeModes)
+      if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]});
+    return list;
+  };
+
+  var extensions = CodeMirror.extensions = {};
+  CodeMirror.defineExtension = function(name, func) {
+    extensions[name] = func;
+  };
+
+  var commands = CodeMirror.commands = {
+    selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});},
+    killLine: function(cm) {
+      var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
+      if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, {line: from.line + 1, ch: 0});
+      else cm.replaceRange("", from, sel ? to : {line: from.line});
+    },
+    deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange("", {line: l, ch: 0}, {line: l});},
+    undo: function(cm) {cm.undo();},
+    redo: function(cm) {cm.redo();},
+    goDocStart: function(cm) {cm.setCursor(0, 0, true);},
+    goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);},
+    goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);},
+    goLineStartSmart: function(cm) {
+      var cur = cm.getCursor();
+      var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\S/));
+      cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true);
+    },
+    goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);},
+    goLineUp: function(cm) {cm.moveV(-1, "line");},
+    goLineDown: function(cm) {cm.moveV(1, "line");},
+    goPageUp: function(cm) {cm.moveV(-1, "page");},
+    goPageDown: function(cm) {cm.moveV(1, "page");},
+    goCharLeft: function(cm) {cm.moveH(-1, "char");},
+    goCharRight: function(cm) {cm.moveH(1, "char");},
+    goColumnLeft: function(cm) {cm.moveH(-1, "column");},
+    goColumnRight: function(cm) {cm.moveH(1, "column");},
+    goWordLeft: function(cm) {cm.moveH(-1, "word");},
+    goWordRight: function(cm) {cm.moveH(1, "word");},
+    delCharLeft: function(cm) {cm.deleteH(-1, "char");},
+    delCharRight: function(cm) {cm.deleteH(1, "char");},
+    delWordLeft: function(cm) {cm.deleteH(-1, "word");},
+    delWordRight: function(cm) {cm.deleteH(1, "word");},
+    indentAuto: function(cm) {cm.indentSelection("smart");},
+    indentMore: function(cm) {cm.indentSelection("add");},
+    indentLess: function(cm) {cm.indentSelection("subtract");},
+    insertTab: function(cm) {cm.replaceSelection("\t", "end");},
+    defaultTab: function(cm) {
+      if (cm.somethingSelected()) cm.indentSelection("add");
+      else cm.replaceSelection("\t", "end");
+    },
+    transposeChars: function(cm) {
+      var cur = cm.getCursor(), line = cm.getLine(cur.line);
+      if (cur.ch > 0 && cur.ch < line.length - 1)
+        cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
+                        {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1});
+    },
+    newlineAndIndent: function(cm) {
+      cm.replaceSelection("\n", "end");
+      cm.indentLine(cm.getCursor().line);
+    },
+    toggleOverwrite: function(cm) {cm.toggleOverwrite();}
+  };
+
+  var keyMap = CodeMirror.keyMap = {};
+  keyMap.basic = {
+    "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
+    "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
+    "Delete": "delCharRight", "Backspace": "delCharLeft", "Tab": "defaultTab", "Shift-Tab": "indentAuto",
+    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
+  };
+  // Note that the save and find-related commands aren't defined by
+  // default. Unknown commands are simply ignored.
+  keyMap.pcDefault = {
+    "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
+    "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
+    "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
+    "Ctrl-Backspace": "delWordLeft", "Ctrl-Delete": "delWordRight", "Ctrl-S": "save", "Ctrl-F": "find",
+    "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
+    "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
+    fallthrough: "basic"
+  };
+  keyMap.macDefault = {
+    "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
+    "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft",
+    "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordLeft",
+    "Ctrl-Alt-Backspace": "delWordRight", "Alt-Delete": "delWordRight", "Cmd-S": "save", "Cmd-F": "find",
+    "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
+    "Cmd-[": "indentLess", "Cmd-]": "indentMore",
+    fallthrough: ["basic", "emacsy"]
+  };
+  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+  keyMap.emacsy = {
+    "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
+    "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
+    "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft",
+    "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
+  };
+
+  function getKeyMap(val) {
+    if (typeof val == "string") return keyMap[val];
+    else return val;
+  }
+  function lookupKey(name, extraMap, map, handle, stop) {
+    function lookup(map) {
+      map = getKeyMap(map);
+      var found = map[name];
+      if (found != null && handle(found)) return true;
+      if (map.nofallthrough) {
+        if (stop) stop();
+        return true;
+      }
+      var fallthrough = map.fallthrough;
+      if (fallthrough == null) return false;
+      if (Object.prototype.toString.call(fallthrough) != "[object Array]")
+        return lookup(fallthrough);
+      for (var i = 0, e = fallthrough.length; i < e; ++i) {
+        if (lookup(fallthrough[i])) return true;
+      }
+      return false;
+    }
+    if (extraMap && lookup(extraMap)) return true;
+    return lookup(map);
+  }
+  function isModifierKey(event) {
+    var name = keyNames[e_prop(event, "keyCode")];
+    return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
+  }
+
+  CodeMirror.fromTextArea = function(textarea, options) {
+    if (!options) options = {};
+    options.value = textarea.value;
+    if (!options.tabindex && textarea.tabindex)
+      options.tabindex = textarea.tabindex;
+    if (options.autofocus == null && textarea.getAttribute("autofocus") != null)
+      options.autofocus = true;
+
+    function save() {textarea.value = instance.getValue();}
+    if (textarea.form) {
+      // Deplorable hack to make the submit method do the right thing.
+      var rmSubmit = connect(textarea.form, "submit", save, true);
+      if (typeof textarea.form.submit == "function") {
+        var realSubmit = textarea.form.submit;
+        function wrappedSubmit() {
+          save();
+          textarea.form.submit = realSubmit;
+          textarea.form.submit();
+          textarea.form.submit = wrappedSubmit;
+        }
+        textarea.form.submit = wrappedSubmit;
+      }
+    }
+
+    textarea.style.display = "none";
+    var instance = CodeMirror(function(node) {
+      textarea.parentNode.insertBefore(node, textarea.nextSibling);
+    }, options);
+    instance.save = save;
+    instance.getTextArea = function() { return textarea; };
+    instance.toTextArea = function() {
+      save();
+      textarea.parentNode.removeChild(instance.getWrapperElement());
+      textarea.style.display = "";
+      if (textarea.form) {
+        rmSubmit();
+        if (typeof textarea.form.submit == "function")
+          textarea.form.submit = realSubmit;
+      }
+    };
+    return instance;
+  };
+
+  // Utility functions for working with state. Exported because modes
+  // sometimes need to do this.
+  function copyState(mode, state) {
+    if (state === true) return state;
+    if (mode.copyState) return mode.copyState(state);
+    var nstate = {};
+    for (var n in state) {
+      var val = state[n];
+      if (val instanceof Array) val = val.concat([]);
+      nstate[n] = val;
+    }
+    return nstate;
+  }
+  CodeMirror.copyState = copyState;
+  function startState(mode, a1, a2) {
+    return mode.startState ? mode.startState(a1, a2) : true;
+  }
+  CodeMirror.startState = startState;
+
+  // The character stream used by a mode's parser.
+  function StringStream(string, tabSize) {
+    this.pos = this.start = 0;
+    this.string = string;
+    this.tabSize = tabSize || 8;
+  }
+  StringStream.prototype = {
+    eol: function() {return this.pos >= this.string.length;},
+    sol: function() {return this.pos == 0;},
+    peek: function() {return this.string.charAt(this.pos);},
+    next: function() {
+      if (this.pos < this.string.length)
+        return this.string.charAt(this.pos++);
+    },
+    eat: function(match) {
+      var ch = this.string.charAt(this.pos);
+      if (typeof match == "string") var ok = ch == match;
+      else var ok = ch && (match.test ? match.test(ch) : match(ch));
+      if (ok) {++this.pos; return ch;}
+    },
+    eatWhile: function(match) {
+      var start = this.pos;
+      while (this.eat(match)){}
+      return this.pos > start;
+    },
+    eatSpace: function() {
+      var start = this.pos;
+      while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
+      return this.pos > start;
+    },
+    skipToEnd: function() {this.pos = this.string.length;},
+    skipTo: function(ch) {
+      var found = this.string.indexOf(ch, this.pos);
+      if (found > -1) {this.pos = found; return true;}
+    },
+    backUp: function(n) {this.pos -= n;},
+    column: function() {return countColumn(this.string, this.start, this.tabSize);},
+    indentation: function() {return countColumn(this.string, null, this.tabSize);},
+    match: function(pattern, consume, caseInsensitive) {
+      if (typeof pattern == "string") {
+        function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
+        if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
+          if (consume !== false) this.pos += pattern.length;
+          return true;
+        }
+      }
+      else {
+        var match = this.string.slice(this.pos).match(pattern);
+        if (match && consume !== false) this.pos += match[0].length;
+        return match;
+      }
+    },
+    current: function(){return this.string.slice(this.start, this.pos);}
+  };
+  CodeMirror.StringStream = StringStream;
+
+  function MarkedText(from, to, className, marker) {
+    this.from = from; this.to = to; this.style = className; this.marker = marker;
+  }
+  MarkedText.prototype = {
+    attach: function(line) { this.marker.set.push(line); },
+    detach: function(line) {
+      var ix = indexOf(this.marker.set, line);
+      if (ix > -1) this.marker.set.splice(ix, 1);
+    },
+    split: function(pos, lenBefore) {
+      if (this.to <= pos && this.to != null) return null;
+      var from = this.from < pos || this.from == null ? null : this.from - pos + lenBefore;
+      var to = this.to == null ? null : this.to - pos + lenBefore;
+      return new MarkedText(from, to, this.style, this.marker);
+    },
+    dup: function() { return new MarkedText(null, null, this.style, this.marker); },
+    clipTo: function(fromOpen, from, toOpen, to, diff) {
+      if (fromOpen && to > this.from && (to < this.to || this.to == null))
+        this.from = null;
+      else if (this.from != null && this.from >= from)
+        this.from = Math.max(to, this.from) + diff;
+      if (toOpen && (from < this.to || this.to == null) && (from > this.from || this.from == null))
+        this.to = null;
+      else if (this.to != null && this.to > from)
+        this.to = to < this.to ? this.to + diff : from;
+    },
+    isDead: function() { return this.from != null && this.to != null && this.from >= this.to; },
+    sameSet: function(x) { return this.marker == x.marker; }
+  };
+
+  function Bookmark(pos) {
+    this.from = pos; this.to = pos; this.line = null;
+  }
+  Bookmark.prototype = {
+    attach: function(line) { this.line = line; },
+    detach: function(line) { if (this.line == line) this.line = null; },
+    split: function(pos, lenBefore) {
+      if (pos < this.from) {
+        this.from = this.to = (this.from - pos) + lenBefore;
+        return this;
+      }
+    },
+    isDead: function() { return this.from > this.to; },
+    clipTo: function(fromOpen, from, toOpen, to, diff) {
+      if ((fromOpen || from < this.from) && (toOpen || to > this.to)) {
+        this.from = 0; this.to = -1;
+      } else if (this.from > from) {
+        this.from = this.to = Math.max(to, this.from) + diff;
+      }
+    },
+    sameSet: function(x) { return false; },
+    find: function() {
+      if (!this.line || !this.line.parent) return null;
+      return {line: lineNo(this.line), ch: this.from};
+    },
+    clear: function() {
+      if (this.line) {
+        var found = indexOf(this.line.marked, this);
+        if (found != -1) this.line.marked.splice(found, 1);
+        this.line = null;
+      }
+    }
+  };
+
+  // Line objects. These hold state related to a line, including
+  // highlighting info (the styles array).
+  function Line(text, styles) {
+    this.styles = styles || [text, null];
+    this.text = text;
+    this.height = 1;
+    this.marked = this.gutterMarker = this.className = this.bgClassName = this.handlers = null;
+    this.stateAfter = this.parent = this.hidden = null;
+  }
+  Line.inheritMarks = function(text, orig) {
+    var ln = new Line(text), mk = orig && orig.marked;
+    if (mk) {
+      for (var i = 0; i < mk.length; ++i) {
+        if (mk[i].to == null && mk[i].style) {
+          var newmk = ln.marked || (ln.marked = []), mark = mk[i];
+          var nmark = mark.dup(); newmk.push(nmark); nmark.attach(ln);
+        }
+      }
+    }
+    return ln;
+  }
+  Line.prototype = {
+    // Replace a piece of a line, keeping the styles around it intact.
+    replace: function(from, to_, text) {
+      var st = [], mk = this.marked, to = to_ == null ? this.text.length : to_;
+      copyStyles(0, from, this.styles, st);
+      if (text) st.push(text, null);
+      copyStyles(to, this.text.length, this.styles, st);
+      this.styles = st;
+      this.text = this.text.slice(0, from) + text + this.text.slice(to);
+      this.stateAfter = null;
+      if (mk) {
+        var diff = text.length - (to - from);
+        for (var i = 0; i < mk.length; ++i) {
+          var mark = mk[i];
+          mark.clipTo(from == null, from || 0, to_ == null, to, diff);
+          if (mark.isDead()) {mark.detach(this); mk.splice(i--, 1);}
+        }
+      }
+    },
+    // Split a part off a line, keeping styles and markers intact.
+    split: function(pos, textBefore) {
+      var st = [textBefore, null], mk = this.marked;
+      copyStyles(pos, this.text.length, this.styles, st);
+      var taken = new Line(textBefore + this.text.slice(pos), st);
+      if (mk) {
+        for (var i = 0; i < mk.length; ++i) {
+          var mark = mk[i];
+          var newmark = mark.split(pos, textBefore.length);
+          if (newmark) {
+            if (!taken.marked) taken.marked = [];
+            taken.marked.push(newmark); newmark.attach(taken);
+            if (newmark == mark) mk.splice(i--, 1);
+          }
+        }
+      }
+      return taken;
+    },
+    append: function(line) {
+      var mylen = this.text.length, mk = line.marked, mymk = this.marked;
+      this.text += line.text;
+      copyStyles(0, line.text.length, line.styles, this.styles);
+      if (mymk) {
+        for (var i = 0; i < mymk.length; ++i)
+          if (mymk[i].to == null) mymk[i].to = mylen;
+      }
+      if (mk && mk.length) {
+        if (!mymk) this.marked = mymk = [];
+        outer: for (var i = 0; i < mk.length; ++i) {
+          var mark = mk[i];
+          if (!mark.from) {
+            for (var j = 0; j < mymk.length; ++j) {
+              var mymark = mymk[j];
+              if (mymark.to == mylen && mymark.sameSet(mark)) {
+                mymark.to = mark.to == null ? null : mark.to + mylen;
+                if (mymark.isDead()) {
+                  mymark.detach(this);
+                  mk.splice(i--, 1);
+                }
+                continue outer;
+              }
+            }
+          }
+          mymk.push(mark);
+          mark.attach(this);
+          mark.from += mylen;
+          if (mark.to != null) mark.to += mylen;
+        }
+      }
+    },
+    fixMarkEnds: function(other) {
+      var mk = this.marked, omk = other.marked;
+      if (!mk) return;
+      for (var i = 0; i < mk.length; ++i) {
+        var mark = mk[i], close = mark.to == null;
+        if (close && omk) {
+          for (var j = 0; j < omk.length; ++j)
+            if (omk[j].sameSet(mark)) {close = false; break;}
+        }
+        if (close) mark.to = this.text.length;
+      }
+    },
+    fixMarkStarts: function() {
+      var mk = this.marked;
+      if (!mk) return;
+      for (var i = 0; i < mk.length; ++i)
+        if (mk[i].from == null) mk[i].from = 0;
+    },
+    addMark: function(mark) {
+      mark.attach(this);
+      if (this.marked == null) this.marked = [];
+      this.marked.push(mark);
+      this.marked.sort(function(a, b){return (a.from || 0) - (b.from || 0);});
+    },
+    // Run the given mode's parser over a line, update the styles
+    // array, which contains alternating fragments of text and CSS
+    // classes.
+    highlight: function(mode, state, tabSize) {
+      var stream = new StringStream(this.text, tabSize), st = this.styles, pos = 0;
+      var changed = false, curWord = st[0], prevWord;
+      if (this.text == "" && mode.blankLine) mode.blankLine(state);
+      while (!stream.eol()) {
+        var style = mode.token(stream, state);
+        var substr = this.text.slice(stream.start, stream.pos);
+        stream.start = stream.pos;
+        if (pos && st[pos-1] == style)
+          st[pos-2] += substr;
+        else if (substr) {
+          if (!changed && (st[pos+1] != style || (pos && st[pos-2] != prevWord))) changed = true;
+          st[pos++] = substr; st[pos++] = style;
+          prevWord = curWord; curWord = st[pos];
+        }
+        // Give up when line is ridiculously long
+        if (stream.pos > 5000) {
+          st[pos++] = this.text.slice(stream.pos); st[pos++] = null;
+          break;
+        }
+      }
+      if (st.length != pos) {st.length = pos; changed = true;}
+      if (pos && st[pos-2] != prevWord) changed = true;
+      // Short lines with simple highlights return null, and are
+      // counted as changed by the driver because they are likely to
+      // highlight the same way in various contexts.
+      return changed || (st.length < 5 && this.text.length < 10 ? null : false);
+    },
+    // Fetch the parser token for a given character. Useful for hacks
+    // that want to inspect the mode state (say, for completion).
+    getTokenAt: function(mode, state, ch) {
+      var txt = this.text, stream = new StringStream(txt);
+      while (stream.pos < ch && !stream.eol()) {
+        stream.start = stream.pos;
+        var style = mode.token(stream, state);
+      }
+      return {start: stream.start,
+              end: stream.pos,
+              string: stream.current(),
+              className: style || null,
+              state: state};
+    },
+    indentation: function(tabSize) {return countColumn(this.text, null, tabSize);},
+    // Produces an HTML fragment for the line, taking selection,
+    // marking, and highlighting into account.
+    getHTML: function(makeTab, wrapAt, wrapId, wrapWBR) {
+      var html = [], first = true, col = 0;
+      function span_(text, style) {
+        if (!text) return;
+        // Work around a bug where, in some compat modes, IE ignores leading spaces
+        if (first && ie && text.charAt(0) == " ") text = "\u00a0" + text.slice(1);
+        first = false;
+        if (text.indexOf("\t") == -1) {
+          col += text.length;
+          var escaped = htmlEscape(text);
+        } else {
+          var escaped = "";
+          for (var pos = 0;;) {
+            var idx = text.indexOf("\t", pos);
+            if (idx == -1) {
+              escaped += htmlEscape(text.slice(pos));
+              col += text.length - pos;
+              break;
+            } else {
+              col += idx - pos;
+              var tab = makeTab(col);
+              escaped += htmlEscape(text.slice(pos, idx)) + tab.html;
+              col += tab.width;
+              pos = idx + 1;
+            }
+          }
+        }
+        if (style) html.push('<span class="', style, '">', escaped, "</span>");
+        else html.push(escaped);
+      }
+      var span = span_;
+      if (wrapAt != null) {
+        var outPos = 0, open = "<span id=\"" + wrapId + "\">";
+        span = function(text, style) {
+          var l = text.length;
+          if (wrapAt >= outPos && wrapAt < outPos + l) {
+            if (wrapAt > outPos) {
+              span_(text.slice(0, wrapAt - outPos), style);
+              // See comment at the definition of spanAffectsWrapping
+              if (wrapWBR) html.push("<wbr>");
+            }
+            html.push(open);
+            var cut = wrapAt - outPos;
+            span_(window.opera ? text.slice(cut, cut + 1) : text.slice(cut), style);
+            html.push("</span>");
+            if (window.opera) span_(text.slice(cut + 1), style);
+            wrapAt--;
+            outPos += l;
+          } else {
+            outPos += l;
+            span_(text, style);
+            // Output empty wrapper when at end of line
+            if (outPos == wrapAt && outPos == len) html.push(open + " </span>");
+            // Stop outputting HTML when gone sufficiently far beyond measure
+            else if (outPos > wrapAt + 10 && /\s/.test(text)) span = function(){};
+          }
+        }
+      }
+
+      var st = this.styles, allText = this.text, marked = this.marked;
+      var len = allText.length;
+      function styleToClass(style) {
+        if (!style) return null;
+        return "cm-" + style.replace(/ +/g, " cm-");
+      }
+
+      if (!allText && wrapAt == null) {
+        span(" ");
+      } else if (!marked || !marked.length) {
+        for (var i = 0, ch = 0; ch < len; i+=2) {
+          var str = st[i], style = st[i+1], l = str.length;
+          if (ch + l > len) str = str.slice(0, len - ch);
+          ch += l;
+          span(str, styleToClass(style));
+        }
+      } else {
+        var pos = 0, i = 0, text = "", style, sg = 0;
+        var nextChange = marked[0].from || 0, marks = [], markpos = 0;
+        function advanceMarks() {
+          var m;
+          while (markpos < marked.length &&
+                 ((m = marked[markpos]).from == pos || m.from == null)) {
+            if (m.style != null) marks.push(m);
+            ++markpos;
+          }
+          nextChange = markpos < marked.length ? marked[markpos].from : Infinity;
+          for (var i = 0; i < marks.length; ++i) {
+            var to = marks[i].to || Infinity;
+            if (to == pos) marks.splice(i--, 1);
+            else nextChange = Math.min(to, nextChange);
+          }
+        }
+        var m = 0;
+        while (pos < len) {
+          if (nextChange == pos) advanceMarks();
+          var upto = Math.min(len, nextChange);
+          while (true) {
+            if (text) {
+              var end = pos + text.length;
+              var appliedStyle = style;
+              for (var j = 0; j < marks.length; ++j)
+                appliedStyle = (appliedStyle ? appliedStyle + " " : "") + marks[j].style;
+              span(end > upto ? text.slice(0, upto - pos) : text, appliedStyle);
+              if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
+              pos = end;
+            }
+            text = st[i++]; style = styleToClass(st[i++]);
+          }
+        }
+      }
+      return html.join("");
+    },
+    cleanUp: function() {
+      this.parent = null;
+      if (this.marked)
+        for (var i = 0, e = this.marked.length; i < e; ++i) this.marked[i].detach(this);
+    }
+  };
+  // Utility used by replace and split above
+  function copyStyles(from, to, source, dest) {
+    for (var i = 0, pos = 0, state = 0; pos < to; i+=2) {
+      var part = source[i], end = pos + part.length;
+      if (state == 0) {
+        if (end > from) dest.push(part.slice(from - pos, Math.min(part.length, to - pos)), source[i+1]);
+        if (end >= from) state = 1;
+      }
+      else if (state == 1) {
+        if (end > to) dest.push(part.slice(0, to - pos), source[i+1]);
+        else dest.push(part, source[i+1]);
+      }
+      pos = end;
+    }
+  }
+
+  // Data structure that holds the sequence of lines.
+  function LeafChunk(lines) {
+    this.lines = lines;
+    this.parent = null;
+    for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
+      lines[i].parent = this;
+      height += lines[i].height;
+    }
+    this.height = height;
+  }
+  LeafChunk.prototype = {
+    chunkSize: function() { return this.lines.length; },
+    remove: function(at, n, callbacks) {
+      for (var i = at, e = at + n; i < e; ++i) {
+        var line = this.lines[i];
+        this.height -= line.height;
+        line.cleanUp();
+        if (line.handlers)
+          for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]);
+      }
+      this.lines.splice(at, n);
+    },
+    collapse: function(lines) {
+      lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
+    },
+    insertHeight: function(at, lines, height) {
+      this.height += height;
+      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
+      for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
+    },
+    iterN: function(at, n, op) {
+      for (var e = at + n; at < e; ++at)
+        if (op(this.lines[at])) return true;
+    }
+  };
+  function BranchChunk(children) {
+    this.children = children;
+    var size = 0, height = 0;
+    for (var i = 0, e = children.length; i < e; ++i) {
+      var ch = children[i];
+      size += ch.chunkSize(); height += ch.height;
+      ch.parent = this;
+    }
+    this.size = size;
+    this.height = height;
+    this.parent = null;
+  }
+  BranchChunk.prototype = {
+    chunkSize: function() { return this.size; },
+    remove: function(at, n, callbacks) {
+      this.size -= n;
+      for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at < sz) {
+          var rm = Math.min(n, sz - at), oldHeight = child.height;
+          child.remove(at, rm, callbacks);
+          this.height -= oldHeight - child.height;
+          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
+          if ((n -= rm) == 0) break;
+          at = 0;
+        } else at -= sz;
+      }
+      if (this.size - n < 25) {
+        var lines = [];
+        this.collapse(lines);
+        this.children = [new LeafChunk(lines)];
+        this.children[0].parent = this;
+      }
+    },
+    collapse: function(lines) {
+      for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
+    },
+    insert: function(at, lines) {
+      var height = 0;
+      for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
+      this.insertHeight(at, lines, height);
+    },
+    insertHeight: function(at, lines, height) {
+      this.size += lines.length;
+      this.height += height;
+      for (var i = 0, e = this.children.length; i < e; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at <= sz) {
+          child.insertHeight(at, lines, height);
+          if (child.lines && child.lines.length > 50) {
+            while (child.lines.length > 50) {
+              var spilled = child.lines.splice(child.lines.length - 25, 25);
+              var newleaf = new LeafChunk(spilled);
+              child.height -= newleaf.height;
+              this.children.splice(i + 1, 0, newleaf);
+              newleaf.parent = this;
+            }
+            this.maybeSpill();
+          }
+          break;
+        }
+        at -= sz;
+      }
+    },
+    maybeSpill: function() {
+      if (this.children.length <= 10) return;
+      var me = this;
+      do {
+        var spilled = me.children.splice(me.children.length - 5, 5);
+        var sibling = new BranchChunk(spilled);
+        if (!me.parent) { // Become the parent node
+          var copy = new BranchChunk(me.children);
+          copy.parent = me;
+          me.children = [copy, sibling];
+          me = copy;
+        } else {
+          me.size -= sibling.size;
+          me.height -= sibling.height;
+          var myIndex = indexOf(me.parent.children, me);
+          me.parent.children.splice(myIndex + 1, 0, sibling);
+        }
+        sibling.parent = me.parent;
+      } while (me.children.length > 10);
+      me.parent.maybeSpill();
+    },
+    iter: function(from, to, op) { this.iterN(from, to - from, op); },
+    iterN: function(at, n, op) {
+      for (var i = 0, e = this.children.length; i < e; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at < sz) {
+          var used = Math.min(n, sz - at);
+          if (child.iterN(at, used, op)) return true;
+          if ((n -= used) == 0) break;
+          at = 0;
+        } else at -= sz;
+      }
+    }
+  };
+
+  function getLineAt(chunk, n) {
+    while (!chunk.lines) {
+      for (var i = 0;; ++i) {
+        var child = chunk.children[i], sz = child.chunkSize();
+        if (n < sz) { chunk = child; break; }
+        n -= sz;
+      }
+    }
+    return chunk.lines[n];
+  }
+  function lineNo(line) {
+    if (line.parent == null) return null;
+    var cur = line.parent, no = indexOf(cur.lines, line);
+    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+      for (var i = 0, e = chunk.children.length; ; ++i) {
+        if (chunk.children[i] == cur) break;
+        no += chunk.children[i].chunkSize();
+      }
+    }
+    return no;
+  }
+  function lineAtHeight(chunk, h) {
+    var n = 0;
+    outer: do {
+      for (var i = 0, e = chunk.children.length; i < e; ++i) {
+        var child = chunk.children[i], ch = child.height;
+        if (h < ch) { chunk = child; continue outer; }
+        h -= ch;
+        n += child.chunkSize();
+      }
+      return n;
+    } while (!chunk.lines);
+    for (var i = 0, e = chunk.lines.length; i < e; ++i) {
+      var line = chunk.lines[i], lh = line.height;
+      if (h < lh) break;
+      h -= lh;
+    }
+    return n + i;
+  }
+  function heightAtLine(chunk, n) {
+    var h = 0;
+    outer: do {
+      for (var i = 0, e = chunk.children.length; i < e; ++i) {
+        var child = chunk.children[i], sz = child.chunkSize();
+        if (n < sz) { chunk = child; continue outer; }
+        n -= sz;
+        h += child.height;
+      }
+      return h;
+    } while (!chunk.lines);
+    for (var i = 0; i < n; ++i) h += chunk.lines[i].height;
+    return h;
+  }
+
+  // The history object 'chunks' changes that are made close together
+  // and at almost the same time into bigger undoable units.
+  function History() {
+    this.time = 0;
+    this.done = []; this.undone = [];
+    this.compound = 0;
+    this.closed = false;
+  }
+  History.prototype = {
+    addChange: function(start, added, old) {
+      this.undone.length = 0;
+      var time = +new Date, cur = this.done[this.done.length - 1], last = cur && cur[cur.length - 1];
+      var dtime = time - this.time;
+
+      if (this.compound && cur && !this.closed) {
+        cur.push({start: start, added: added, old: old});
+      } else if (dtime > 400 || !last || this.closed ||
+                 last.start > start + old.length || last.start + last.added < start) {
+        this.done.push([{start: start, added: added, old: old}]);
+        this.closed = false;
+      } else {
+        var startBefore = Math.max(0, last.start - start),
+            endAfter = Math.max(0, (start + old.length) - (last.start + last.added));
+        for (var i = startBefore; i > 0; --i) last.old.unshift(old[i - 1]);
+        for (var i = endAfter; i > 0; --i) last.old.push(old[old.length - i]);
+        if (startBefore) last.start = start;
+        last.added += added - (old.length - startBefore - endAfter);
+      }
+      this.time = time;
+    },
+    startCompound: function() {
+      if (!this.compound++) this.closed = true;
+    },
+    endCompound: function() {
+      if (!--this.compound) this.closed = true;
+    }
+  };
+
+  function stopMethod() {e_stop(this);}
+  // Ensure an event has a stop method.
+  function addStop(event) {
+    if (!event.stop) event.stop = stopMethod;
+    return event;
+  }
+
+  function e_preventDefault(e) {
+    if (e.preventDefault) e.preventDefault();
+    else e.returnValue = false;
+  }
+  function e_stopPropagation(e) {
+    if (e.stopPropagation) e.stopPropagation();
+    else e.cancelBubble = true;
+  }
+  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
+  CodeMirror.e_stop = e_stop;
+  CodeMirror.e_preventDefault = e_preventDefault;
+  CodeMirror.e_stopPropagation = e_stopPropagation;
+
+  function e_target(e) {return e.target || e.srcElement;}
+  function e_button(e) {
+    if (e.which) return e.which;
+    else if (e.button & 1) return 1;
+    else if (e.button & 2) return 3;
+    else if (e.button & 4) return 2;
+  }
+
+  // Allow 3rd-party code to override event properties by adding an override
+  // object to an event object.
+  function e_prop(e, prop) {
+    var overridden = e.override && e.override.hasOwnProperty(prop);
+    return overridden ? e.override[prop] : e[prop];
+  }
+
+  // Event handler registration. If disconnect is true, it'll return a
+  // function that unregisters the handler.
+  function connect(node, type, handler, disconnect) {
+    if (typeof node.addEventListener == "function") {
+      node.addEventListener(type, handler, false);
+      if (disconnect) return function() {node.removeEventListener(type, handler, false);};
+    }
+    else {
+      var wrapHandler = function(event) {handler(event || window.event);};
+      node.attachEvent("on" + type, wrapHandler);
+      if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);};
+    }
+  }
+  CodeMirror.connect = connect;
+
+  function Delayed() {this.id = null;}
+  Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
+
+  var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
+
+  var gecko = /gecko\/\d{7}/i.test(navigator.userAgent);
+  var ie = /MSIE \d/.test(navigator.userAgent);
+  var ie_lt9 = /MSIE [1-8]\b/.test(navigator.userAgent);
+  var quirksMode = ie && document.documentMode == 5;
+  var webkit = /WebKit\//.test(navigator.userAgent);
+  var chrome = /Chrome\//.test(navigator.userAgent);
+  var safari = /Apple Computer/.test(navigator.vendor);
+  var khtml = /KHTML\//.test(navigator.userAgent);
+
+  // Detect drag-and-drop
+  var dragAndDrop = function() {
+    // There is *some* kind of drag-and-drop support in IE6-8, but I
+    // couldn't get it to work yet.
+    if (ie_lt9) return false;
+    var div = document.createElement('div');
+    return "draggable" in div || "dragDrop" in div;
+  }();
+
+  // Feature-detect whether newlines in textareas are converted to \r\n
+  var lineSep = function () {
+    var te = document.createElement("textarea");
+    te.value = "foo\nbar";
+    if (te.value.indexOf("\r") > -1) return "\r\n";
+    return "\n";
+  }();
+
+  // For a reason I have yet to figure out, some browsers disallow
+  // word wrapping between certain characters *only* if a new inline
+  // element is started between them. This makes it hard to reliably
+  // measure the position of things, since that requires inserting an
+  // extra span. This terribly fragile set of regexps matches the
+  // character combinations that suffer from this phenomenon on the
+  // various browsers.
+  var spanAffectsWrapping = /^$/; // Won't match any two-character string
+  if (gecko) spanAffectsWrapping = /$'/;
+  else if (safari) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/;
+  else if (chrome) spanAffectsWrapping = /\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/;
+
+  // Counts the column offset in a string, taking tabs into account.
+  // Used mostly to find indentation.
+  function countColumn(string, end, tabSize) {
+    if (end == null) {
+      end = string.search(/[^\s\u00a0]/);
+      if (end == -1) end = string.length;
+    }
+    for (var i = 0, n = 0; i < end; ++i) {
+      if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
+      else ++n;
+    }
+    return n;
+  }
+
+  function computedStyle(elt) {
+    if (elt.currentStyle) return elt.currentStyle;
+    return window.getComputedStyle(elt, null);
+  }
+
+  // Find the position of an element by following the offsetParent chain.
+  // If screen==true, it returns screen (rather than page) coordinates.
+  function eltOffset(node, screen) {
+    var bod = node.ownerDocument.body;
+    var x = 0, y = 0, skipBody = false;
+    for (var n = node; n; n = n.offsetParent) {
+      var ol = n.offsetLeft, ot = n.offsetTop;
+      // Firefox reports weird inverted offsets when the body has a border.
+      if (n == bod) { x += Math.abs(ol); y += Math.abs(ot); }
+      else { x += ol, y += ot; }
+      if (screen && computedStyle(n).position == "fixed")
+        skipBody = true;
+    }
+    var e = screen && !skipBody ? null : bod;
+    for (var n = node.parentNode; n != e; n = n.parentNode)
+      if (n.scrollLeft != null) { x -= n.scrollLeft; y -= n.scrollTop;}
+    return {left: x, top: y};
+  }
+  // Use the faster and saner getBoundingClientRect method when possible.
+  if (document.documentElement.getBoundingClientRect != null) eltOffset = function(node, screen) {
+    // Take the parts of bounding client rect that we are interested in so we are able to edit if need be,
+    // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page)
+    try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; }
+    catch(e) { box = {top: 0, left: 0}; }
+    if (!screen) {
+      // Get the toplevel scroll, working around browser differences.
+      if (window.pageYOffset == null) {
+        var t = document.documentElement || document.body.parentNode;
+        if (t.scrollTop == null) t = document.body;
+        box.top += t.scrollTop; box.left += t.scrollLeft;
+      } else {
+        box.top += window.pageYOffset; box.left += window.pageXOffset;
+      }
+    }
+    return box;
+  };
+
+  // Get a node's text content.
+  function eltText(node) {
+    return node.textContent || node.innerText || node.nodeValue || "";
+  }
+  function selectInput(node) {
+    if (ios) { // Mobile Safari apparently has a bug where select() is broken.
+      node.selectionStart = 0;
+      node.selectionEnd = node.value.length;
+    } else node.select();
+  }
+
+  // Operations on {line, ch} objects.
+  function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
+  function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
+  function copyPos(x) {return {line: x.line, ch: x.ch};}
+
+  var escapeElement = document.createElement("pre");
+  function htmlEscape(str) {
+    escapeElement.textContent = str;
+    return escapeElement.innerHTML;
+  }
+  // Recent (late 2011) Opera betas insert bogus newlines at the start
+  // of the textContent, so we strip those.
+  if (htmlEscape("a") == "\na")
+    htmlEscape = function(str) {
+      escapeElement.textContent = str;
+      return escapeElement.innerHTML.slice(1);
+    };
+  // Some IEs don't preserve tabs through innerHTML
+  else if (htmlEscape("\t") != "\t")
+    htmlEscape = function(str) {
+      escapeElement.innerHTML = "";
+      escapeElement.appendChild(document.createTextNode(str));
+      return escapeElement.innerHTML;
+    };
+  CodeMirror.htmlEscape = htmlEscape;
+
+  // Used to position the cursor after an undo/redo by finding the
+  // last edited character.
+  function editEnd(from, to) {
+    if (!to) return 0;
+    if (!from) return to.length;
+    for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)
+      if (from.charAt(i) != to.charAt(j)) break;
+    return j + 1;
+  }
+
+  function indexOf(collection, elt) {
+    if (collection.indexOf) return collection.indexOf(elt);
+    for (var i = 0, e = collection.length; i < e; ++i)
+      if (collection[i] == elt) return i;
+    return -1;
+  }
+  function isWordChar(ch) {
+    return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase();
+  }
+
+  // See if "".split is the broken IE version, if so, provide an
+  // alternative way to split lines.
+  var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
+    var pos = 0, nl, result = [];
+    while ((nl = string.indexOf("\n", pos)) > -1) {
+      result.push(string.slice(pos, string.charAt(nl-1) == "\r" ? nl - 1 : nl));
+      pos = nl + 1;
+    }
+    result.push(string.slice(pos));
+    return result;
+  } : function(string){return string.split(/\r?\n/);};
+  CodeMirror.splitLines = splitLines;
+
+  var hasSelection = window.getSelection ? function(te) {
+    try { return te.selectionStart != te.selectionEnd; }
+    catch(e) { return false; }
+  } : function(te) {
+    try {var range = te.ownerDocument.selection.createRange();}
+    catch(e) {}
+    if (!range || range.parentElement() != te) return false;
+    return range.compareEndPoints("StartToEnd", range) != 0;
+  };
+
+  CodeMirror.defineMode("null", function() {
+    return {token: function(stream) {stream.skipToEnd();}};
+  });
+  CodeMirror.defineMIME("text/plain", "null");
+
+  var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
+                  19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
+                  36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
+                  46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 127: "Delete", 186: ";", 187: "=", 188: ",",
+                  189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63276: "PageUp",
+                  63277: "PageDown", 63275: "End", 63273: "Home", 63234: "Left", 63232: "Up", 63235: "Right",
+                  63233: "Down", 63302: "Insert", 63272: "Delete"};
+  CodeMirror.keyNames = keyNames;
+  (function() {
+    // Number keys
+    for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
+    // Alphabetic keys
+    for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
+    // Function keys
+    for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
+  })();
+
+  return CodeMirror;
+})();
diff --git a/interface/codemirror/lib/util/closetag.js b/interface/codemirror/lib/util/closetag.js
new file mode 100755
index 0000000..20a43b9
--- /dev/null
+++ b/interface/codemirror/lib/util/closetag.js
@@ -0,0 +1,146 @@
+/**
+ * Tag-closer extension for CodeMirror.
+ *
+ * This extension adds a "closeTag" utility function that can be used with key bindings to 
+ * insert a matching end tag after the ">" character of a start tag has been typed.  It can
+ * also complete "</" if a matching start tag is found.  It will correctly ignore signal
+ * characters for empty tags, comments, CDATA, etc.
+ *
+ * The function depends on internal parser state to identify tags.  It is compatible with the
+ * following CodeMirror modes and will ignore all others:
+ * - htmlmixed
+ * - xml
+ *
+ * See demos/closetag.html for a usage example.
+ * 
+ * @author Nathan Williams <nathan at nlwillia.net>
+ * Contributed under the same license terms as CodeMirror.
+ */
+(function() {
+	/** Option that allows tag closing behavior to be toggled.  Default is true. */
+	CodeMirror.defaults['closeTagEnabled'] = true;
+	
+	/** Array of tag names to add indentation after the start tag for.  Default is the list of block-level html tags. */
+	CodeMirror.defaults['closeTagIndent'] = ['applet', 'blockquote', 'body', 'button', 'div', 'dl', 'fieldset', 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'html', 'iframe', 'layer', 'legend', 'object', 'ol', 'p', 'select', 'table', 'ul'];
+
+	/**
+	 * Call during key processing to close tags.  Handles the key event if the tag is closed, otherwise throws CodeMirror.Pass.
+	 * - cm: The editor instance.
+	 * - ch: The character being processed.
+	 * - indent: Optional.  Omit or pass true to use the default indentation tag list defined in the 'closeTagIndent' option.
+	 *   Pass false to disable indentation.  Pass an array to override the default list of tag names.
+	 */
+	CodeMirror.defineExtension("closeTag", function(cm, ch, indent) {
+		if (!cm.getOption('closeTagEnabled')) {
+			throw CodeMirror.Pass;
+		}
+		
+		var mode = cm.getOption('mode');
+		
+		if (mode == 'text/html') {
+		
+			/*
+			 * Relevant structure of token:
+			 *
+			 * htmlmixed
+			 * 		className
+			 * 		state
+			 * 			htmlState
+			 * 				type
+			 * 				context
+			 * 					tagName
+			 * 			mode
+			 * 
+			 * xml
+			 * 		className
+			 * 		state
+			 * 			tagName
+			 * 			type
+			 */
+		
+			var pos = cm.getCursor();
+			var tok = cm.getTokenAt(pos);
+			var state = tok.state;
+			
+			if (state.mode && state.mode != 'html') {
+				throw CodeMirror.Pass; // With htmlmixed, we only care about the html sub-mode.
+			}
+			
+			if (ch == '>') {
+				var type = state.htmlState ? state.htmlState.type : state.type; // htmlmixed : xml
+				
+				if (tok.className == 'tag' && type == 'closeTag') {
+					throw CodeMirror.Pass; // Don't process the '>' at the end of an end-tag.
+				}
+			
+				cm.replaceSelection('>'); // Mode state won't update until we finish the tag.
+				pos = {line: pos.line, ch: pos.ch + 1};
+				cm.setCursor(pos);
+		
+				tok = cm.getTokenAt(cm.getCursor());
+				state = tok.state;
+				type = state.htmlState ? state.htmlState.type : state.type; // htmlmixed : xml
+
+				if (tok.className == 'tag' && type != 'selfcloseTag') {
+					var tagName = state.htmlState ? state.htmlState.context.tagName : state.tagName; // htmlmixed : xml
+					if (tagName.length > 0) {
+						insertEndTag(cm, indent, pos, tagName);
+					}
+					return;
+				}
+				
+				// Undo the '>' insert and allow cm to handle the key instead.
+				cm.setSelection({line: pos.line, ch: pos.ch - 1}, pos);
+				cm.replaceSelection("");
+			
+			} else if (ch == '/') {
+				if (tok.className == 'tag' && tok.string == '<') {
+					var tagName = state.htmlState ? (state.htmlState.context ? state.htmlState.context.tagName : '') : state.context.tagName; // htmlmixed : xml # extra htmlmized check is for '</' edge case
+					if (tagName.length > 0) {
+						completeEndTag(cm, pos, tagName);
+						return;
+					}
+				}
+			}
+		
+		}
+		
+		throw CodeMirror.Pass; // Bubble if not handled
+	});
+
+	function insertEndTag(cm, indent, pos, tagName) {
+		if (shouldIndent(cm, indent, tagName)) {
+			cm.replaceSelection('\n\n</' + tagName + '>', 'end');
+			cm.indentLine(pos.line + 1);
+			cm.indentLine(pos.line + 2);
+			cm.setCursor({line: pos.line + 1, ch: cm.getLine(pos.line + 1).length});
+		} else {
+			cm.replaceSelection('</' + tagName + '>');
+			cm.setCursor(pos);
+		}
+	}
+	
+	function shouldIndent(cm, indent, tagName) {
+		if (typeof indent == 'undefined' || indent == null || indent == true) {
+			indent = cm.getOption('closeTagIndent');
+		}
+		if (!indent) {
+			indent = [];
+		}
+		return indexOf(indent, tagName.toLowerCase()) != -1;
+	}
+	
+	// C&P from codemirror.js...would be nice if this were visible to utilities.
+	function indexOf(collection, elt) {
+		if (collection.indexOf) return collection.indexOf(elt);
+		for (var i = 0, e = collection.length; i < e; ++i)
+			if (collection[i] == elt) return i;
+		return -1;
+	}
+
+	function completeEndTag(cm, pos, tagName) {
+		cm.replaceSelection('/' + tagName + '>');
+		cm.setCursor({line: pos.line, ch: pos.ch + tagName.length + 2 });
+	}
+	
+})();
diff --git a/interface/codemirror/lib/util/dialog.css b/interface/codemirror/lib/util/dialog.css
new file mode 100755
index 0000000..4cb467e
--- /dev/null
+++ b/interface/codemirror/lib/util/dialog.css
@@ -0,0 +1,23 @@
+.CodeMirror-dialog {
+  position: relative;
+}
+
+.CodeMirror-dialog > div {
+  position: absolute;
+  top: 0; left: 0; right: 0;
+  background: white;
+  border-bottom: 1px solid #eee;
+  z-index: 15;
+  padding: .1em .8em;
+  overflow: hidden;
+  color: #333;
+}
+
+.CodeMirror-dialog input {
+  border: none;
+  outline: none;
+  background: transparent;
+  width: 20em;
+  color: inherit;
+  font-family: monospace;
+}
diff --git a/interface/codemirror/lib/util/dialog.js b/interface/codemirror/lib/util/dialog.js
new file mode 100755
index 0000000..8950bf0
--- /dev/null
+++ b/interface/codemirror/lib/util/dialog.js
@@ -0,0 +1,63 @@
+// Open simple dialogs on top of an editor. Relies on dialog.css.
+
+(function() {
+  function dialogDiv(cm, template) {
+    var wrap = cm.getWrapperElement();
+    var dialog = wrap.insertBefore(document.createElement("div"), wrap.firstChild);
+    dialog.className = "CodeMirror-dialog";
+    dialog.innerHTML = '<div>' + template + '</div>';
+    return dialog;
+  }
+
+  CodeMirror.defineExtension("openDialog", function(template, callback) {
+    var dialog = dialogDiv(this, template);
+    var closed = false, me = this;
+    function close() {
+      if (closed) return;
+      closed = true;
+      dialog.parentNode.removeChild(dialog);
+    }
+    var inp = dialog.getElementsByTagName("input")[0];
+    if (inp) {
+      CodeMirror.connect(inp, "keydown", function(e) {
+        if (e.keyCode == 13 || e.keyCode == 27) {
+          CodeMirror.e_stop(e);
+          close();
+          me.focus();
+          if (e.keyCode == 13) callback(inp.value);
+        }
+      });
+      inp.focus();
+      CodeMirror.connect(inp, "blur", close);
+    }
+    return close;
+  });
+
+  CodeMirror.defineExtension("openConfirm", function(template, callbacks) {
+    var dialog = dialogDiv(this, template);
+    var buttons = dialog.getElementsByTagName("button");
+    var closed = false, me = this, blurring = 1;
+    function close() {
+      if (closed) return;
+      closed = true;
+      dialog.parentNode.removeChild(dialog);
+      me.focus();
+    }
+    buttons[0].focus();
+    for (var i = 0; i < buttons.length; ++i) {
+      var b = buttons[i];
+      (function(callback) {
+        CodeMirror.connect(b, "click", function(e) {
+          CodeMirror.e_preventDefault(e);
+          close();
+          if (callback) callback(me);
+        });
+      })(callbacks[i]);
+      CodeMirror.connect(b, "blur", function() {
+        --blurring;
+        setTimeout(function() { if (blurring <= 0) close(); }, 200);
+      });
+      CodeMirror.connect(b, "focus", function() { ++blurring; });
+    }
+  });
+})();
\ No newline at end of file
diff --git a/interface/codemirror/lib/util/foldcode.js b/interface/codemirror/lib/util/foldcode.js
new file mode 100755
index 0000000..56e6144
--- /dev/null
+++ b/interface/codemirror/lib/util/foldcode.js
@@ -0,0 +1,191 @@
+// the tagRangeFinder function is
+//   Copyright (C) 2011 by Daniel Glazman <daniel at glazman.org>
+// released under the MIT license (../../LICENSE) like the rest of CodeMirror
+CodeMirror.tagRangeFinder = function(cm, line, hideEnd) {
+  var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
+  var nameChar = nameStartChar + "\-\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
+  var xmlNAMERegExp = new RegExp("^[" + nameStartChar + "][" + nameChar + "]*");
+
+  var lineText = cm.getLine(line);
+  var found = false;
+  var tag = null;
+  var pos = 0;
+  while (!found) {
+    pos = lineText.indexOf("<", pos);
+    if (-1 == pos) // no tag on line
+      return;
+    if (pos + 1 < lineText.length && lineText[pos + 1] == "/") { // closing tag
+      pos++;
+      continue;
+    }
+    // ok we weem to have a start tag
+    if (!lineText.substr(pos + 1).match(xmlNAMERegExp)) { // not a tag name...
+      pos++;
+      continue;
+    }
+    var gtPos = lineText.indexOf(">", pos + 1);
+    if (-1 == gtPos) { // end of start tag not in line
+      var l = line + 1;
+      var foundGt = false;
+      var lastLine = cm.lineCount();
+      while (l < lastLine && !foundGt) {
+        var lt = cm.getLine(l);
+        var gt = lt.indexOf(">");
+        if (-1 != gt) { // found a >
+          foundGt = true;
+          var slash = lt.lastIndexOf("/", gt);
+          if (-1 != slash && slash < gt) {
+            var str = lineText.substr(slash, gt - slash + 1);
+            if (!str.match( /\/\s*\>/ )) { // yep, that's the end of empty tag
+              if (hideEnd === true) l++;
+              return l;
+            }
+          }
+        }
+        l++;
+      }
+      found = true;
+    }
+    else {
+      var slashPos = lineText.lastIndexOf("/", gtPos);
+      if (-1 == slashPos) { // cannot be empty tag
+        found = true;
+        // don't continue
+      }
+      else { // empty tag?
+        // check if really empty tag
+        var str = lineText.substr(slashPos, gtPos - slashPos + 1);
+        if (!str.match( /\/\s*\>/ )) { // finally not empty
+          found = true;
+          // don't continue
+        }
+      }
+    }
+    if (found) {
+      var subLine = lineText.substr(pos + 1);
+      tag = subLine.match(xmlNAMERegExp);
+      if (tag) {
+        // we have an element name, wooohooo !
+        tag = tag[0];
+        // do we have the close tag on same line ???
+        if (-1 != lineText.indexOf("</" + tag + ">", pos)) // yep
+        {
+          found = false;
+        }
+        // we don't, so we have a candidate...
+      }
+      else
+        found = false;
+    }
+    if (!found)
+      pos++;
+  }
+
+  if (found) {
+    var startTag = "(\\<\\/" + tag + "\\>)|(\\<" + tag + "\\>)|(\\<" + tag + "\\s)|(\\<" + tag + "$)";
+    var startTagRegExp = new RegExp(startTag, "g");
+    var endTag = "</" + tag + ">";
+    var depth = 1;
+    var l = line + 1;
+    var lastLine = cm.lineCount();
+    while (l < lastLine) {
+      lineText = cm.getLine(l);
+      var match = lineText.match(startTagRegExp);
+      if (match) {
+        for (var i = 0; i < match.length; i++) {
+          if (match[i] == endTag)
+            depth--;
+          else
+            depth++;
+          if (!depth) {
+            if (hideEnd === true) l++;
+            return l;
+          }
+        }
+      }
+      l++;
+    }
+    return;
+  }
+};
+
+CodeMirror.braceRangeFinder = function(cm, line, hideEnd) {
+  var lineText = cm.getLine(line);
+  var startChar = lineText.lastIndexOf("{");
+  if (startChar < 0 || lineText.lastIndexOf("}") > startChar) return;
+  var tokenType = cm.getTokenAt({line: line, ch: startChar}).className;
+  var count = 1, lastLine = cm.lineCount(), end;
+  outer: for (var i = line + 1; i < lastLine; ++i) {
+    var text = cm.getLine(i), pos = 0;
+    for (;;) {
+      var nextOpen = text.indexOf("{", pos), nextClose = text.indexOf("}", pos);
+      if (nextOpen < 0) nextOpen = text.length;
+      if (nextClose < 0) nextClose = text.length;
+      pos = Math.min(nextOpen, nextClose);
+      if (pos == text.length) break;
+      if (cm.getTokenAt({line: i, ch: pos + 1}).className == tokenType) {
+        if (pos == nextOpen) ++count;
+        else if (!--count) { end = i; break outer; }
+      }
+      ++pos;
+    }
+  }
+  if (end == null || end == line + 1) return;
+  if (hideEnd === true) end++;
+  return end;
+};
+
+CodeMirror.indentRangeFinder = function(cm, line) {
+  var tabSize = cm.getOption("tabSize");
+  var myIndent = cm.getLineHandle(line).indentation(tabSize), last;
+  for (var i = line + 1, end = cm.lineCount(); i < end; ++i) {
+    var handle = cm.getLineHandle(i);
+    if (!/^\s*$/.test(handle.text)) {
+      if (handle.indentation(tabSize) <= myIndent) break;
+      last = i;
+    }
+  }
+  if (!last) return null;
+  return last + 1;
+};
+
+CodeMirror.newFoldFunction = function(rangeFinder, markText, hideEnd) {
+  var folded = [];
+  if (markText == null) markText = '<div style="position: absolute; left: 2px; color:#600">&#x25bc;</div>%N%';
+
+  function isFolded(cm, n) {
+    for (var i = 0; i < folded.length; ++i) {
+      var start = cm.lineInfo(folded[i].start);
+      if (!start) folded.splice(i--, 1);
+      else if (start.line == n) return {pos: i, region: folded[i]};
+    }
+  }
+
+  function expand(cm, region) {
+    cm.clearMarker(region.start);
+    for (var i = 0; i < region.hidden.length; ++i)
+      cm.showLine(region.hidden[i]);
+  }
+
+  return function(cm, line) {
+    cm.operation(function() {
+      var known = isFolded(cm, line);
+      if (known) {
+        folded.splice(known.pos, 1);
+        expand(cm, known.region);
+      } else {
+        var end = rangeFinder(cm, line, hideEnd);
+        if (end == null) return;
+        var hidden = [];
+        for (var i = line + 1; i < end; ++i) {
+          var handle = cm.hideLine(i);
+          if (handle) hidden.push(handle);
+        }
+        var first = cm.setMarker(line, markText);
+        var region = {start: first, hidden: hidden};
+        cm.onDeleteLine(first, function() { expand(cm, region); });
+        folded.push(region);
+      }
+    });
+  };
+};
diff --git a/interface/codemirror/lib/util/formatting.js b/interface/codemirror/lib/util/formatting.js
new file mode 100755
index 0000000..e189119
--- /dev/null
+++ b/interface/codemirror/lib/util/formatting.js
@@ -0,0 +1,294 @@
+// ============== Formatting extensions ============================
+// A common storage for all mode-specific formatting features
+if (!CodeMirror.modeExtensions) CodeMirror.modeExtensions = {};
+
+// Returns the extension of the editor's current mode
+CodeMirror.defineExtension("getModeExt", function () {
+  var mname = CodeMirror.resolveMode(this.getOption("mode")).name;
+  var ext = CodeMirror.modeExtensions[mname];
+  if (!ext) throw new Error("No extensions found for mode " + mname);
+  return ext;
+});
+
+// If the current mode is 'htmlmixed', returns the extension of a mode located at
+// the specified position (can be htmlmixed, css or javascript). Otherwise, simply
+// returns the extension of the editor's current mode.
+CodeMirror.defineExtension("getModeExtAtPos", function (pos) {
+  var token = this.getTokenAt(pos);
+  if (token && token.state && token.state.mode)
+    return CodeMirror.modeExtensions[token.state.mode == "html" ? "htmlmixed" : token.state.mode];
+  else
+    return this.getModeExt();
+});
+
+// Comment/uncomment the specified range
+CodeMirror.defineExtension("commentRange", function (isComment, from, to) {
+  var curMode = this.getModeExtAtPos(this.getCursor());
+  if (isComment) { // Comment range
+    var commentedText = this.getRange(from, to);
+    this.replaceRange(curMode.commentStart + this.getRange(from, to) + curMode.commentEnd
+      , from, to);
+    if (from.line == to.line && from.ch == to.ch) { // An empty comment inserted - put cursor inside
+      this.setCursor(from.line, from.ch + curMode.commentStart.length);
+    }
+  }
+  else { // Uncomment range
+    var selText = this.getRange(from, to);
+    var startIndex = selText.indexOf(curMode.commentStart);
+    var endIndex = selText.lastIndexOf(curMode.commentEnd);
+    if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) {
+      // Take string till comment start
+      selText = selText.substr(0, startIndex)
+      // From comment start till comment end
+        + selText.substring(startIndex + curMode.commentStart.length, endIndex)
+      // From comment end till string end
+        + selText.substr(endIndex + curMode.commentEnd.length);
+    }
+    this.replaceRange(selText, from, to);
+  }
+});
+
+// Applies automatic mode-aware indentation to the specified range
+CodeMirror.defineExtension("autoIndentRange", function (from, to) {
+  var cmInstance = this;
+  this.operation(function () {
+    for (var i = from.line; i <= to.line; i++) {
+      cmInstance.indentLine(i, "smart");
+    }
+  });
+});
+
+// Applies automatic formatting to the specified range
+CodeMirror.defineExtension("autoFormatRange", function (from, to) {
+  var absStart = this.indexFromPos(from);
+  var absEnd = this.indexFromPos(to);
+  // Insert additional line breaks where necessary according to the
+  // mode's syntax
+  var res = this.getModeExt().autoFormatLineBreaks(this.getValue(), absStart, absEnd);
+  var cmInstance = this;
+
+  // Replace and auto-indent the range
+  this.operation(function () {
+    cmInstance.replaceRange(res, from, to);
+    var startLine = cmInstance.posFromIndex(absStart).line;
+    var endLine = cmInstance.posFromIndex(absStart + res.length).line;
+    for (var i = startLine; i <= endLine; i++) {
+      cmInstance.indentLine(i, "smart");
+    }
+  });
+});
+
+// Define extensions for a few modes
+
+CodeMirror.modeExtensions["css"] = {
+  commentStart: "/*",
+  commentEnd: "*/",
+  wordWrapChars: [";", "\\{", "\\}"],
+  autoFormatLineBreaks: function (text) {
+    return text.replace(new RegExp("(;|\\{|\\})([^\r\n])", "g"), "$1\n$2");
+  }
+};
+
+CodeMirror.modeExtensions["javascript"] = {
+  commentStart: "/*",
+  commentEnd: "*/",
+  wordWrapChars: [";", "\\{", "\\}"],
+
+  getNonBreakableBlocks: function (text) {
+    var nonBreakableRegexes = [
+        new RegExp("for\\s*?\\(([\\s\\S]*?)\\)"),
+        new RegExp("'([\\s\\S]*?)('|$)"),
+        new RegExp("\"([\\s\\S]*?)(\"|$)"),
+        new RegExp("//.*([\r\n]|$)")
+      ];
+    var nonBreakableBlocks = new Array();
+    for (var i = 0; i < nonBreakableRegexes.length; i++) {
+      var curPos = 0;
+      while (curPos < text.length) {
+        var m = text.substr(curPos).match(nonBreakableRegexes[i]);
+        if (m != null) {
+          nonBreakableBlocks.push({
+            start: curPos + m.index,
+            end: curPos + m.index + m[0].length
+          });
+          curPos += m.index + Math.max(1, m[0].length);
+        }
+        else { // No more matches
+          break;
+        }
+      }
+    }
+    nonBreakableBlocks.sort(function (a, b) {
+      return a.start - b.start;
+    });
+
+    return nonBreakableBlocks;
+  },
+
+  autoFormatLineBreaks: function (text) {
+    var curPos = 0;
+    var reLinesSplitter = new RegExp("(;|\\{|\\})([^\r\n])", "g");
+    var nonBreakableBlocks = this.getNonBreakableBlocks(text);
+    if (nonBreakableBlocks != null) {
+      var res = "";
+      for (var i = 0; i < nonBreakableBlocks.length; i++) {
+        if (nonBreakableBlocks[i].start > curPos) { // Break lines till the block
+          res += text.substring(curPos, nonBreakableBlocks[i].start).replace(reLinesSplitter, "$1\n$2");
+          curPos = nonBreakableBlocks[i].start;
+        }
+        if (nonBreakableBlocks[i].start <= curPos
+          && nonBreakableBlocks[i].end >= curPos) { // Skip non-breakable block
+          res += text.substring(curPos, nonBreakableBlocks[i].end);
+          curPos = nonBreakableBlocks[i].end;
+        }
+      }
+      if (curPos < text.length - 1) {
+        res += text.substr(curPos).replace(reLinesSplitter, "$1\n$2");
+      }
+      return res;
+    }
+    else {
+      return text.replace(reLinesSplitter, "$1\n$2");
+    }
+  }
+};
+
+CodeMirror.modeExtensions["xml"] = {
+  commentStart: "<!--",
+  commentEnd: "-->",
+  wordWrapChars: [">"],
+
+  autoFormatLineBreaks: function (text) {
+    var lines = text.split("\n");
+    var reProcessedPortion = new RegExp("(^\\s*?<|^[^<]*?)(.+)(>\\s*?$|[^>]*?$)");
+    var reOpenBrackets = new RegExp("<", "g");
+    var reCloseBrackets = new RegExp("(>)([^\r\n])", "g");
+    for (var i = 0; i < lines.length; i++) {
+      var mToProcess = lines[i].match(reProcessedPortion);
+      if (mToProcess != null && mToProcess.length > 3) { // The line starts with whitespaces and ends with whitespaces
+        lines[i] = mToProcess[1]
+            + mToProcess[2].replace(reOpenBrackets, "\n$&").replace(reCloseBrackets, "$1\n$2")
+            + mToProcess[3];
+        continue;
+      }
+    }
+
+    return lines.join("\n");
+  }
+};
+
+CodeMirror.modeExtensions["htmlmixed"] = {
+  commentStart: "<!--",
+  commentEnd: "-->",
+  wordWrapChars: [">", ";", "\\{", "\\}"],
+
+  getModeInfos: function (text, absPos) {
+    var modeInfos = new Array();
+    modeInfos[0] =
+      {
+        pos: 0,
+        modeExt: CodeMirror.modeExtensions["xml"],
+        modeName: "xml"
+      };
+
+    var modeMatchers = new Array();
+    modeMatchers[0] =
+      {
+        regex: new RegExp("<style[^>]*>([\\s\\S]*?)(</style[^>]*>|$)", "i"),
+        modeExt: CodeMirror.modeExtensions["css"],
+        modeName: "css"
+      };
+    modeMatchers[1] =
+      {
+        regex: new RegExp("<script[^>]*>([\\s\\S]*?)(</script[^>]*>|$)", "i"),
+        modeExt: CodeMirror.modeExtensions["javascript"],
+        modeName: "javascript"
+      };
+
+    var lastCharPos = (typeof (absPos) !== "undefined" ? absPos : text.length - 1);
+    // Detect modes for the entire text
+    for (var i = 0; i < modeMatchers.length; i++) {
+      var curPos = 0;
+      while (curPos <= lastCharPos) {
+        var m = text.substr(curPos).match(modeMatchers[i].regex);
+        if (m != null) {
+          if (m.length > 1 && m[1].length > 0) {
+            // Push block begin pos
+            var blockBegin = curPos + m.index + m[0].indexOf(m[1]);
+            modeInfos.push(
+              {
+                pos: blockBegin,
+                modeExt: modeMatchers[i].modeExt,
+                modeName: modeMatchers[i].modeName
+              });
+            // Push block end pos
+            modeInfos.push(
+              {
+                pos: blockBegin + m[1].length,
+                modeExt: modeInfos[0].modeExt,
+                modeName: modeInfos[0].modeName
+              });
+            curPos += m.index + m[0].length;
+            continue;
+          }
+          else {
+            curPos += m.index + Math.max(m[0].length, 1);
+          }
+        }
+        else { // No more matches
+          break;
+        }
+      }
+    }
+    // Sort mode infos
+    modeInfos.sort(function sortModeInfo(a, b) {
+      return a.pos - b.pos;
+    });
+
+    return modeInfos;
+  },
+
+  autoFormatLineBreaks: function (text, startPos, endPos) {
+    var modeInfos = this.getModeInfos(text);
+    var reBlockStartsWithNewline = new RegExp("^\\s*?\n");
+    var reBlockEndsWithNewline = new RegExp("\n\\s*?$");
+    var res = "";
+    // Use modes info to break lines correspondingly
+    if (modeInfos.length > 1) { // Deal with multi-mode text
+      for (var i = 1; i <= modeInfos.length; i++) {
+        var selStart = modeInfos[i - 1].pos;
+        var selEnd = (i < modeInfos.length ? modeInfos[i].pos : endPos);
+
+        if (selStart >= endPos) { // The block starts later than the needed fragment
+          break;
+        }
+        if (selStart < startPos) {
+          if (selEnd <= startPos) { // The block starts earlier than the needed fragment
+            continue;
+          }
+          selStart = startPos;
+        }
+        if (selEnd > endPos) {
+          selEnd = endPos;
+        }
+        var textPortion = text.substring(selStart, selEnd);
+        if (modeInfos[i - 1].modeName != "xml") { // Starting a CSS or JavaScript block
+          if (!reBlockStartsWithNewline.test(textPortion)
+              && selStart > 0) { // The block does not start with a line break
+            textPortion = "\n" + textPortion;
+          }
+          if (!reBlockEndsWithNewline.test(textPortion)
+              && selEnd < text.length - 1) { // The block does not end with a line break
+            textPortion += "\n";
+          }
+        }
+        res += modeInfos[i - 1].modeExt.autoFormatLineBreaks(textPortion);
+      }
+    }
+    else { // Single-mode text
+      res = modeInfos[0].modeExt.autoFormatLineBreaks(text.substring(startPos, endPos));
+    }
+
+    return res;
+  }
+};
diff --git a/interface/codemirror/lib/util/javascript-hint.js b/interface/codemirror/lib/util/javascript-hint.js
new file mode 100755
index 0000000..2117e5a
--- /dev/null
+++ b/interface/codemirror/lib/util/javascript-hint.js
@@ -0,0 +1,134 @@
+(function () {
+  function forEach(arr, f) {
+    for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
+  }
+  
+  function arrayContains(arr, item) {
+    if (!Array.prototype.indexOf) {
+      var i = arr.length;
+      while (i--) {
+        if (arr[i] === item) {
+          return true;
+        }
+      }
+      return false;
+    }
+    return arr.indexOf(item) != -1;
+  }
+
+  function scriptHint(editor, keywords, getToken) {
+    // Find the token at the cursor
+    var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token;
+    // If it's not a 'word-style' token, ignore the token.
+		if (!/^[\w$_]*$/.test(token.string)) {
+      token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state,
+                       className: token.string == "." ? "property" : null};
+    }
+    // If it is a property, find out what it is a property of.
+    while (tprop.className == "property") {
+      tprop = getToken(editor, {line: cur.line, ch: tprop.start});
+      if (tprop.string != ".") return;
+      tprop = getToken(editor, {line: cur.line, ch: tprop.start});
+      if (tprop.string == ')') {
+        var level = 1;
+        do {
+          tprop = getToken(editor, {line: cur.line, ch: tprop.start});
+          switch (tprop.string) {
+          case ')': level++; break;
+          case '(': level--; break;
+          default: break;
+          }
+        } while (level > 0)
+        tprop = getToken(editor, {line: cur.line, ch: tprop.start});
+				if (tprop.className == 'variable')
+					tprop.className = 'function';
+				else return; // no clue
+      }
+      if (!context) var context = [];
+      context.push(tprop);
+    }
+    return {list: getCompletions(token, context, keywords),
+            from: {line: cur.line, ch: token.start},
+            to: {line: cur.line, ch: token.end}};
+  }
+
+  CodeMirror.javascriptHint = function(editor) {
+    return scriptHint(editor, javascriptKeywords,
+                      function (e, cur) {return e.getTokenAt(cur);});
+  }
+
+  function getCoffeeScriptToken(editor, cur) {
+  // This getToken, it is for coffeescript, imitates the behavior of
+  // getTokenAt method in javascript.js, that is, returning "property"
+  // type and treat "." as indepenent token.
+    var token = editor.getTokenAt(cur);
+    if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
+      token.end = token.start;
+      token.string = '.';
+      token.className = "property";
+    }
+    else if (/^\.[\w$_]*$/.test(token.string)) {
+      token.className = "property";
+      token.start++;
+      token.string = token.string.replace(/\./, '');
+    }
+    return token;
+  }
+
+  CodeMirror.coffeescriptHint = function(editor) {
+    return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken);
+  }
+
+  var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
+                     "toUpperCase toLowerCase split concat match replace search").split(" ");
+  var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " +
+                    "lastIndexOf every some filter forEach map reduce reduceRight ").split(" ");
+  var funcProps = "prototype apply call bind".split(" ");
+  var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " +
+                  "if in instanceof new null return switch throw true try typeof var void while with").split(" ");
+  var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " +
+                  "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");
+
+  function getCompletions(token, context, keywords) {
+    var found = [], start = token.string;
+    function maybeAdd(str) {
+      if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str);
+    }
+    function gatherCompletions(obj) {
+      if (typeof obj == "string") forEach(stringProps, maybeAdd);
+      else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
+      else if (obj instanceof Function) forEach(funcProps, maybeAdd);
+      for (var name in obj) maybeAdd(name);
+    }
+
+    if (context) {
+      // If this is a property, see if it belongs to some object we can
+      // find in the current environment.
+      var obj = context.pop(), base;
+      if (obj.className == "variable")
+        base = window[obj.string];
+      else if (obj.className == "string")
+        base = "";
+      else if (obj.className == "atom")
+        base = 1;
+      else if (obj.className == "function") {
+        if (window.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&
+            (typeof window.jQuery == 'function'))
+          base = window.jQuery();
+        else if (window._ != null && (obj.string == '_') && (typeof window._ == 'function'))
+          base = window._();
+      }
+      while (base != null && context.length)
+        base = base[context.pop().string];
+      if (base != null) gatherCompletions(base);
+    }
+    else {
+      // If not, just look in the window object and any local scope
+      // (reading into JS mode internals to get at the local variables)
+      for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
+      gatherCompletions(window);
+      forEach(keywords, maybeAdd);
+    }
+    return found;
+  }
+})();
diff --git a/interface/codemirror/lib/util/loadmode.js b/interface/codemirror/lib/util/loadmode.js
new file mode 100755
index 0000000..48d5a7a
--- /dev/null
+++ b/interface/codemirror/lib/util/loadmode.js
@@ -0,0 +1,51 @@
+(function() {
+  if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js";
+
+  var loading = {};
+  function splitCallback(cont, n) {
+    var countDown = n;
+    return function() { if (--countDown == 0) cont(); }
+  }
+  function ensureDeps(mode, cont) {
+    var deps = CodeMirror.modes[mode].dependencies;
+    if (!deps) return cont();
+    var missing = [];
+    for (var i = 0; i < deps.length; ++i) {
+      if (!CodeMirror.modes.hasOwnProperty(deps[i]))
+        missing.push(deps[i]);
+    }
+    if (!missing.length) return cont();
+    var split = splitCallback(cont, missing.length);
+    for (var i = 0; i < missing.length; ++i)
+      CodeMirror.requireMode(missing[i], split);
+  }
+
+  CodeMirror.requireMode = function(mode, cont) {
+    if (typeof mode != "string") mode = mode.name;
+    if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont);
+    if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);
+
+    var script = document.createElement("script");
+    script.src = CodeMirror.modeURL.replace(/%N/g, mode);
+    var others = document.getElementsByTagName("script")[0];
+    others.parentNode.insertBefore(script, others);
+    var list = loading[mode] = [cont];
+    var count = 0, poll = setInterval(function() {
+      if (++count > 100) return clearInterval(poll);
+      if (CodeMirror.modes.hasOwnProperty(mode)) {
+        clearInterval(poll);
+        loading[mode] = null;
+        ensureDeps(mode, function() {
+          for (var i = 0; i < list.length; ++i) list[i]();
+        });
+      }
+    }, 200);
+  };
+
+  CodeMirror.autoLoadMode = function(instance, mode) {
+    if (!CodeMirror.modes.hasOwnProperty(mode))
+      CodeMirror.requireMode(mode, function() {
+        instance.setOption("mode", instance.getOption("mode"));
+      });
+  };
+}());
diff --git a/interface/codemirror/lib/util/match-highlighter.js b/interface/codemirror/lib/util/match-highlighter.js
new file mode 100755
index 0000000..59098ff
--- /dev/null
+++ b/interface/codemirror/lib/util/match-highlighter.js
@@ -0,0 +1,44 @@
+// Define match-highlighter commands. Depends on searchcursor.js
+// Use by attaching the following function call to the onCursorActivity event:
+	//myCodeMirror.matchHighlight(minChars);
+// And including a special span.CodeMirror-matchhighlight css class (also optionally a separate one for .CodeMirror-focused -- see demo matchhighlighter.html)
+
+(function() {
+  var DEFAULT_MIN_CHARS = 2;
+  
+  function MatchHighlightState() {
+	this.marked = [];
+  }
+  function getMatchHighlightState(cm) {
+	return cm._matchHighlightState || (cm._matchHighlightState = new MatchHighlightState());
+  }
+  
+  function clearMarks(cm) {
+	var state = getMatchHighlightState(cm);
+	for (var i = 0; i < state.marked.length; ++i)
+		state.marked[i].clear();
+	state.marked = [];
+  }
+  
+  function markDocument(cm, className, minChars) {
+    clearMarks(cm);
+	minChars = (typeof minChars !== 'undefined' ? minChars : DEFAULT_MIN_CHARS);
+	if (cm.somethingSelected() && cm.getSelection().replace(/^\s+|\s+$/g, "").length >= minChars) {
+		var state = getMatchHighlightState(cm);
+		var query = cm.getSelection();
+		cm.operation(function() {
+			if (cm.lineCount() < 2000) { // This is too expensive on big documents.
+			  for (var cursor = cm.getSearchCursor(query); cursor.findNext();) {
+				//Only apply matchhighlight to the matches other than the one actually selected
+				if (!(cursor.from().line === cm.getCursor(true).line && cursor.from().ch === cm.getCursor(true).ch))
+					state.marked.push(cm.markText(cursor.from(), cursor.to(), className));
+			  }
+			}
+		  });
+	}
+  }
+
+  CodeMirror.defineExtension("matchHighlight", function(className, minChars) {
+    markDocument(this, className, minChars);
+  });
+})();
diff --git a/interface/codemirror/lib/util/overlay.js b/interface/codemirror/lib/util/overlay.js
new file mode 100755
index 0000000..6471a5e
--- /dev/null
+++ b/interface/codemirror/lib/util/overlay.js
@@ -0,0 +1,51 @@
+// Utility function that allows modes to be combined. The mode given
+// as the base argument takes care of most of the normal mode
+// functionality, but a second (typically simple) mode is used, which
+// can override the style of text. Both modes get to parse all of the
+// text, but when both assign a non-null style to a piece of code, the
+// overlay wins, unless the combine argument was true, in which case
+// the styles are combined.
+
+CodeMirror.overlayParser = function(base, overlay, combine) {
+  return {
+    startState: function() {
+      return {
+        base: CodeMirror.startState(base),
+        overlay: CodeMirror.startState(overlay),
+        basePos: 0, baseCur: null,
+        overlayPos: 0, overlayCur: null
+      };
+    },
+    copyState: function(state) {
+      return {
+        base: CodeMirror.copyState(base, state.base),
+        overlay: CodeMirror.copyState(overlay, state.overlay),
+        basePos: state.basePos, baseCur: null,
+        overlayPos: state.overlayPos, overlayCur: null
+      };
+    },
+
+    token: function(stream, state) {
+      if (stream.start == state.basePos) {
+        state.baseCur = base.token(stream, state.base);
+        state.basePos = stream.pos;
+      }
+      if (stream.start == state.overlayPos) {
+        stream.pos = stream.start;
+        state.overlayCur = overlay.token(stream, state.overlay);
+        state.overlayPos = stream.pos;
+      }
+      stream.pos = Math.min(state.basePos, state.overlayPos);
+      if (stream.eol()) state.basePos = state.overlayPos = 0;
+
+      if (state.overlayCur == null) return state.baseCur;
+      if (state.baseCur != null && combine) return state.baseCur + " " + state.overlayCur;
+      else return state.overlayCur;
+    },
+    
+    indent: base.indent && function(state, textAfter) {
+      return base.indent(state.base, textAfter);
+    },
+    electricChars: base.electricChars
+  };
+};
diff --git a/interface/codemirror/lib/util/runmode.js b/interface/codemirror/lib/util/runmode.js
new file mode 100755
index 0000000..fc58d85
--- /dev/null
+++ b/interface/codemirror/lib/util/runmode.js
@@ -0,0 +1,49 @@
+CodeMirror.runMode = function(string, modespec, callback, options) {
+  var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);
+  var isNode = callback.nodeType == 1;
+  var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;
+  if (isNode) {
+    var node = callback, accum = [], col = 0;
+    callback = function(text, style) {
+      if (text == "\n") {
+        accum.push("<br>");
+        col = 0;
+        return;
+      }
+      var escaped = "";
+      // HTML-escape and replace tabs
+      for (var pos = 0;;) {
+        var idx = text.indexOf("\t", pos);
+        if (idx == -1) {
+          escaped += CodeMirror.htmlEscape(text.slice(pos));
+          col += text.length - pos;
+          break;
+        } else {
+          col += idx - pos;
+          escaped += CodeMirror.htmlEscape(text.slice(pos, idx));
+          var size = tabSize - col % tabSize;
+          col += size;
+          for (var i = 0; i < size; ++i) escaped += " ";
+          pos = idx + 1;
+        }
+      }
+
+      if (style) 
+        accum.push("<span class=\"cm-" + CodeMirror.htmlEscape(style) + "\">" + escaped + "</span>");
+      else
+        accum.push(escaped);
+    }
+  }
+  var lines = CodeMirror.splitLines(string), state = CodeMirror.startState(mode);
+  for (var i = 0, e = lines.length; i < e; ++i) {
+    if (i) callback("\n");
+    var stream = new CodeMirror.StringStream(lines[i]);
+    while (!stream.eol()) {
+      var style = mode.token(stream, state);
+      callback(stream.current(), style, i, stream.start);
+      stream.start = stream.pos;
+    }
+  }
+  if (isNode)
+    node.innerHTML = accum.join("");
+};
diff --git a/interface/codemirror/lib/util/search.js b/interface/codemirror/lib/util/search.js
new file mode 100755
index 0000000..f194c63
--- /dev/null
+++ b/interface/codemirror/lib/util/search.js
@@ -0,0 +1,114 @@
+// Define search commands. Depends on dialog.js or another
+// implementation of the openDialog method.
+
+// Replace works a little oddly -- it will do the replace on the next
+// Ctrl-G (or whatever is bound to findNext) press. You prevent a
+// replace by making sure the match is no longer selected when hitting
+// Ctrl-G.
+
+(function() {
+  function SearchState() {
+    this.posFrom = this.posTo = this.query = null;
+    this.marked = [];
+  }
+  function getSearchState(cm) {
+    return cm._searchState || (cm._searchState = new SearchState());
+  }
+  function dialog(cm, text, shortText, f) {
+    if (cm.openDialog) cm.openDialog(text, f);
+    else f(prompt(shortText, ""));
+  }
+  function confirmDialog(cm, text, shortText, fs) {
+    if (cm.openConfirm) cm.openConfirm(text, fs);
+    else if (confirm(shortText)) fs[0]();
+  }
+  function parseQuery(query) {
+    var isRE = query.match(/^\/(.*)\/$/);
+    return isRE ? new RegExp(isRE[1]) : query;
+  }
+  var queryDialog =
+    'Search: <input type="text" style="width: 10em"/> <span style="color: #888">(Use /re/ syntax for regexp search)</span>';
+  function doSearch(cm, rev) {
+    var state = getSearchState(cm);
+    if (state.query) return findNext(cm, rev);
+    dialog(cm, queryDialog, "Search for:", function(query) {
+      cm.operation(function() {
+        if (!query || state.query) return;
+        state.query = parseQuery(query);
+        if (cm.lineCount() < 2000) { // This is too expensive on big documents.
+          for (var cursor = cm.getSearchCursor(query); cursor.findNext();)
+            state.marked.push(cm.markText(cursor.from(), cursor.to(), "CodeMirror-searching"));
+        }
+        state.posFrom = state.posTo = cm.getCursor();
+        findNext(cm, rev);
+      });
+    });
+  }
+  function findNext(cm, rev) {cm.operation(function() {
+    var state = getSearchState(cm);
+    var cursor = cm.getSearchCursor(state.query, rev ? state.posFrom : state.posTo);
+    if (!cursor.find(rev)) {
+      cursor = cm.getSearchCursor(state.query, rev ? {line: cm.lineCount() - 1} : {line: 0, ch: 0});
+      if (!cursor.find(rev)) return;
+    }
+    cm.setSelection(cursor.from(), cursor.to());
+    state.posFrom = cursor.from(); state.posTo = cursor.to();
+  })}
+  function clearSearch(cm) {cm.operation(function() {
+    var state = getSearchState(cm);
+    if (!state.query) return;
+    state.query = null;
+    for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear();
+    state.marked.length = 0;
+  })}
+
+  var replaceQueryDialog =
+    'Replace: <input type="text" style="width: 10em"/> <span style="color: #888">(Use /re/ syntax for regexp search)</span>';
+  var replacementQueryDialog = 'With: <input type="text" style="width: 10em"/>';
+  var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
+  function replace(cm, all) {
+    dialog(cm, replaceQueryDialog, "Replace:", function(query) {
+      if (!query) return;
+      query = parseQuery(query);
+      dialog(cm, replacementQueryDialog, "Replace with:", function(text) {
+        if (all) {
+          cm.compoundChange(function() { cm.operation(function() {
+            for (var cursor = cm.getSearchCursor(query); cursor.findNext();) {
+              if (typeof query != "string") {
+                var match = cm.getRange(cursor.from(), cursor.to()).match(query);
+                cursor.replace(text.replace(/\$(\d)/, function(w, i) {return match[i];}));
+              } else cursor.replace(text);
+            }
+          })});
+        } else {
+          clearSearch(cm);
+          var cursor = cm.getSearchCursor(query, cm.getCursor());
+          function advance() {
+            var start = cursor.from(), match;
+            if (!(match = cursor.findNext())) {
+              cursor = cm.getSearchCursor(query);
+              if (!(match = cursor.findNext()) ||
+                  (cursor.from().line == start.line && cursor.from().ch == start.ch)) return;
+            }
+            cm.setSelection(cursor.from(), cursor.to());
+            confirmDialog(cm, doReplaceConfirm, "Replace?",
+                          [function() {doReplace(match);}, advance]);
+          }
+          function doReplace(match) {
+            cursor.replace(typeof query == "string" ? text :
+                           text.replace(/\$(\d)/, function(w, i) {return match[i];}));
+            advance();
+          }
+          advance();
+        }
+      });
+    });
+  }
+
+  CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);};
+  CodeMirror.commands.findNext = doSearch;
+  CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);};
+  CodeMirror.commands.clearSearch = clearSearch;
+  CodeMirror.commands.replace = replace;
+  CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);};
+})();
diff --git a/interface/codemirror/lib/util/searchcursor.js b/interface/codemirror/lib/util/searchcursor.js
new file mode 100755
index 0000000..ec3f73c
--- /dev/null
+++ b/interface/codemirror/lib/util/searchcursor.js
@@ -0,0 +1,117 @@
+(function(){
+  function SearchCursor(cm, query, pos, caseFold) {
+    this.atOccurrence = false; this.cm = cm;
+    if (caseFold == null && typeof query == "string") caseFold = false;
+
+    pos = pos ? cm.clipPos(pos) : {line: 0, ch: 0};
+    this.pos = {from: pos, to: pos};
+
+    // The matches method is filled in based on the type of query.
+    // It takes a position and a direction, and returns an object
+    // describing the next occurrence of the query, or null if no
+    // more matches were found.
+    if (typeof query != "string") // Regexp match
+      this.matches = function(reverse, pos) {
+        if (reverse) {
+          var line = cm.getLine(pos.line).slice(0, pos.ch), match = line.match(query), start = 0;
+          while (match) {
+            var ind = line.indexOf(match[0]);
+            start += ind;
+            line = line.slice(ind + 1);
+            var newmatch = line.match(query);
+            if (newmatch) match = newmatch;
+            else break;
+            start++;
+          }
+        }
+        else {
+          var line = cm.getLine(pos.line).slice(pos.ch), match = line.match(query),
+          start = match && pos.ch + line.indexOf(match[0]);
+        }
+        if (match)
+          return {from: {line: pos.line, ch: start},
+                  to: {line: pos.line, ch: start + match[0].length},
+                  match: match};
+      };
+    else { // String query
+      if (caseFold) query = query.toLowerCase();
+      var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
+      var target = query.split("\n");
+      // Different methods for single-line and multi-line queries
+      if (target.length == 1)
+        this.matches = function(reverse, pos) {
+          var line = fold(cm.getLine(pos.line)), len = query.length, match;
+          if (reverse ? (pos.ch >= len && (match = line.lastIndexOf(query, pos.ch - len)) != -1)
+              : (match = line.indexOf(query, pos.ch)) != -1)
+            return {from: {line: pos.line, ch: match},
+                    to: {line: pos.line, ch: match + len}};
+        };
+      else
+        this.matches = function(reverse, pos) {
+          var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(cm.getLine(ln));
+          var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match));
+          if (reverse ? offsetA >= pos.ch || offsetA != match.length
+              : offsetA <= pos.ch || offsetA != line.length - match.length)
+            return;
+          for (;;) {
+            if (reverse ? !ln : ln == cm.lineCount() - 1) return;
+            line = fold(cm.getLine(ln += reverse ? -1 : 1));
+            match = target[reverse ? --idx : ++idx];
+            if (idx > 0 && idx < target.length - 1) {
+              if (line != match) return;
+              else continue;
+            }
+            var offsetB = (reverse ? line.lastIndexOf(match) : line.indexOf(match) + match.length);
+            if (reverse ? offsetB != line.length - match.length : offsetB != match.length)
+              return;
+            var start = {line: pos.line, ch: offsetA}, end = {line: ln, ch: offsetB};
+            return {from: reverse ? end : start, to: reverse ? start : end};
+          }
+        };
+    }
+  }
+
+  SearchCursor.prototype = {
+    findNext: function() {return this.find(false);},
+    findPrevious: function() {return this.find(true);},
+
+    find: function(reverse) {
+      var self = this, pos = this.cm.clipPos(reverse ? this.pos.from : this.pos.to);
+      function savePosAndFail(line) {
+        var pos = {line: line, ch: 0};
+        self.pos = {from: pos, to: pos};
+        self.atOccurrence = false;
+        return false;
+      }
+
+      for (;;) {
+        if (this.pos = this.matches(reverse, pos)) {
+          this.atOccurrence = true;
+          return this.pos.match || true;
+        }
+        if (reverse) {
+          if (!pos.line) return savePosAndFail(0);
+          pos = {line: pos.line-1, ch: this.cm.getLine(pos.line-1).length};
+        }
+        else {
+          var maxLine = this.cm.lineCount();
+          if (pos.line == maxLine - 1) return savePosAndFail(maxLine);
+          pos = {line: pos.line+1, ch: 0};
+        }
+      }
+    },
+
+    from: function() {if (this.atOccurrence) return this.pos.from;},
+    to: function() {if (this.atOccurrence) return this.pos.to;},
+
+    replace: function(newText) {
+      var self = this;
+      if (this.atOccurrence)
+        self.pos.to = this.cm.replaceRange(newText, self.pos.from, self.pos.to);
+    }
+  };
+
+  CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) {
+    return new SearchCursor(this, query, pos, caseFold);
+  });
+})();
diff --git a/interface/codemirror/lib/util/simple-hint.css b/interface/codemirror/lib/util/simple-hint.css
new file mode 100755
index 0000000..4387cb9
--- /dev/null
+++ b/interface/codemirror/lib/util/simple-hint.css
@@ -0,0 +1,16 @@
+.CodeMirror-completions {
+  position: absolute;
+  z-index: 10;
+  overflow: hidden;
+  -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
+  -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
+  box-shadow: 2px 3px 5px rgba(0,0,0,.2);
+}
+.CodeMirror-completions select {
+  background: #fafafa;
+  outline: none;
+  border: none;
+  padding: 0;
+  margin: 0;
+  font-family: monospace;
+}
diff --git a/interface/codemirror/lib/util/simple-hint.js b/interface/codemirror/lib/util/simple-hint.js
new file mode 100755
index 0000000..7decd58
--- /dev/null
+++ b/interface/codemirror/lib/util/simple-hint.js
@@ -0,0 +1,72 @@
+(function() {
+  CodeMirror.simpleHint = function(editor, getHints) {
+    // We want a single cursor position.
+    if (editor.somethingSelected()) return;
+    var result = getHints(editor);
+    if (!result || !result.list.length) return;
+    var completions = result.list;
+    function insert(str) {
+      editor.replaceRange(str, result.from, result.to);
+    }
+    // When there is only one completion, use it directly.
+    if (completions.length == 1) {insert(completions[0]); return true;}
+
+    // Build the select widget
+    var complete = document.createElement("div");
+    complete.className = "CodeMirror-completions";
+    var sel = complete.appendChild(document.createElement("select"));
+    // Opera doesn't move the selection when pressing up/down in a
+    // multi-select, but it does properly support the size property on
+    // single-selects, so no multi-select is necessary.
+    if (!window.opera) sel.multiple = true;
+    for (var i = 0; i < completions.length; ++i) {
+      var opt = sel.appendChild(document.createElement("option"));
+      opt.appendChild(document.createTextNode(completions[i]));
+    }
+    sel.firstChild.selected = true;
+    sel.size = Math.min(10, completions.length);
+    var pos = editor.cursorCoords();
+    complete.style.left = pos.x + "px";
+    complete.style.top = pos.yBot + "px";
+    document.body.appendChild(complete);
+    // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
+    var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
+    if(winW - pos.x < sel.clientWidth)
+      complete.style.left = (pos.x - sel.clientWidth) + "px";
+    // Hack to hide the scrollbar.
+    if (completions.length <= 10)
+      complete.style.width = (sel.clientWidth - 1) + "px";
+
+    var done = false;
+    function close() {
+      if (done) return;
+      done = true;
+      complete.parentNode.removeChild(complete);
+    }
+    function pick() {
+      insert(completions[sel.selectedIndex]);
+      close();
+      setTimeout(function(){editor.focus();}, 50);
+    }
+    CodeMirror.connect(sel, "blur", close);
+    CodeMirror.connect(sel, "keydown", function(event) {
+      var code = event.keyCode;
+      // Enter
+      if (code == 13) {CodeMirror.e_stop(event); pick();}
+      // Escape
+      else if (code == 27) {CodeMirror.e_stop(event); close(); editor.focus();}
+      else if (code != 38 && code != 40) {
+        close(); editor.focus();
+        // Pass the event to the CodeMirror instance so that it can handle things like backspace properly.
+        editor.triggerOnKeyDown(event);
+        setTimeout(function(){CodeMirror.simpleHint(editor, getHints);}, 50);
+      }
+    });
+    CodeMirror.connect(sel, "dblclick", pick);
+
+    sel.focus();
+    // Opera sometimes ignores focusing a freshly created node
+    if (window.opera) setTimeout(function(){if (!done) sel.focus();}, 100);
+    return true;
+  };
+})();
diff --git a/interface/codemirror/mode/javascript/index.html b/interface/codemirror/mode/javascript/index.html
new file mode 100755
index 0000000..c3ab91d
--- /dev/null
+++ b/interface/codemirror/mode/javascript/index.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: JavaScript mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="javascript.js"></script>
+    <link rel="stylesheet" href="../../doc/docs.css">
+    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
+  </head>
+  <body>
+    <h1>CodeMirror: JavaScript mode</h1>
+
+<div><textarea id="code" name="code">
+// Demo code (the actual new parser character stream implementation)
+
+function StringStream(string) {
+  this.pos = 0;
+  this.string = string;
+}
+
+StringStream.prototype = {
+  done: function() {return this.pos >= this.string.length;},
+  peek: function() {return this.string.charAt(this.pos);},
+  next: function() {
+    if (this.pos < this.string.length)
+      return this.string.charAt(this.pos++);
+  },
+  eat: function(match) {
+    var ch = this.string.charAt(this.pos);
+    if (typeof match == "string") var ok = ch == match;
+    else var ok = ch && match.test ? match.test(ch) : match(ch);
+    if (ok) {this.pos++; return ch;}
+  },
+  eatWhile: function(match) {
+    var start = this.pos;
+    while (this.eat(match));
+    if (this.pos > start) return this.string.slice(start, this.pos);
+  },
+  backUp: function(n) {this.pos -= n;},
+  column: function() {return this.pos;},
+  eatSpace: function() {
+    var start = this.pos;
+    while (/\s/.test(this.string.charAt(this.pos))) this.pos++;
+    return this.pos - start;
+  },
+  match: function(pattern, consume, caseInsensitive) {
+    if (typeof pattern == "string") {
+      function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
+      if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
+        if (consume !== false) this.pos += str.length;
+        return true;
+      }
+    }
+    else {
+      var match = this.string.slice(this.pos).match(pattern);
+      if (match && consume !== false) this.pos += match[0].length;
+      return match;
+    }
+  }
+};
+</textarea></div>
+
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        matchBrackets: true
+      });
+    </script>
+
+    <p>JavaScript mode supports a single configuration
+    option, <code>json</code>, which will set the mode to expect JSON
+    data rather than a JavaScript program.</p>
+
+    <p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/json</code>.</p>
+  </body>
+</html>
diff --git a/interface/codemirror/mode/javascript/javascript.js b/interface/codemirror/mode/javascript/javascript.js
new file mode 100755
index 0000000..65f11c5
--- /dev/null
+++ b/interface/codemirror/mode/javascript/javascript.js
@@ -0,0 +1,361 @@
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+  var indentUnit = config.indentUnit;
+  var jsonMode = parserConfig.json;
+
+  // Tokenizer
+
+  var keywords = function(){
+    function kw(type) {return {type: type, style: "keyword"};}
+    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
+    var operator = kw("operator"), atom = {type: "atom", style: "atom"};
+    return {
+      "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+      "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
+      "var": kw("var"), "const": kw("var"), "let": kw("var"),
+      "function": kw("function"), "catch": kw("catch"),
+      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+      "in": operator, "typeof": operator, "instanceof": operator,
+      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom
+    };
+  }();
+
+  var isOperatorChar = /[+\-*&%=<>!?|]/;
+
+  function chain(stream, state, f) {
+    state.tokenize = f;
+    return f(stream, state);
+  }
+
+  function nextUntilUnescaped(stream, end) {
+    var escaped = false, next;
+    while ((next = stream.next()) != null) {
+      if (next == end && !escaped)
+        return false;
+      escaped = !escaped && next == "\\";
+    }
+    return escaped;
+  }
+
+  // Used as scratch variables to communicate multiple values without
+  // consing up tons of objects.
+  var type, content;
+  function ret(tp, style, cont) {
+    type = tp; content = cont;
+    return style;
+  }
+
+  function jsTokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == '"' || ch == "'")
+      return chain(stream, state, jsTokenString(ch));
+    else if (/[\[\]{}\(\),;\:\.]/.test(ch))
+      return ret(ch);
+    else if (ch == "0" && stream.eat(/x/i)) {
+      stream.eatWhile(/[\da-f]/i);
+      return ret("number", "number");
+    }      
+    else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) {
+      stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
+      return ret("number", "number");
+    }
+    else if (ch == "/") {
+      if (stream.eat("*")) {
+        return chain(stream, state, jsTokenComment);
+      }
+      else if (stream.eat("/")) {
+        stream.skipToEnd();
+        return ret("comment", "comment");
+      }
+      else if (state.reAllowed) {
+        nextUntilUnescaped(stream, "/");
+        stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
+        return ret("regexp", "string-2");
+      }
+      else {
+        stream.eatWhile(isOperatorChar);
+        return ret("operator", null, stream.current());
+      }
+    }
+    else if (ch == "#") {
+        stream.skipToEnd();
+        return ret("error", "error");
+    }
+    else if (isOperatorChar.test(ch)) {
+      stream.eatWhile(isOperatorChar);
+      return ret("operator", null, stream.current());
+    }
+    else {
+      stream.eatWhile(/[\w\$_]/);
+      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
+      return (known && state.kwAllowed) ? ret(known.type, known.style, word) :
+                     ret("variable", "variable", word);
+    }
+  }
+
+  function jsTokenString(quote) {
+    return function(stream, state) {
+      if (!nextUntilUnescaped(stream, quote))
+        state.tokenize = jsTokenBase;
+      return ret("string", "string");
+    };
+  }
+
+  function jsTokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = jsTokenBase;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ret("comment", "comment");
+  }
+
+  // Parser
+
+  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
+
+  function JSLexical(indented, column, type, align, prev, info) {
+    this.indented = indented;
+    this.column = column;
+    this.type = type;
+    this.prev = prev;
+    this.info = info;
+    if (align != null) this.align = align;
+  }
+
+  function inScope(state, varname) {
+    for (var v = state.localVars; v; v = v.next)
+      if (v.name == varname) return true;
+  }
+
+  function parseJS(state, style, type, content, stream) {
+    var cc = state.cc;
+    // Communicate our context to the combinators.
+    // (Less wasteful than consing up a hundred closures on every call.)
+    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
+  
+    if (!state.lexical.hasOwnProperty("align"))
+      state.lexical.align = true;
+
+    while(true) {
+      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+      if (combinator(type, content)) {
+        while(cc.length && cc[cc.length - 1].lex)
+          cc.pop()();
+        if (cx.marked) return cx.marked;
+        if (type == "variable" && inScope(state, content)) return "variable-2";
+        return style;
+      }
+    }
+  }
+
+  // Combinator utils
+
+  var cx = {state: null, column: null, marked: null, cc: null};
+  function pass() {
+    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+  }
+  function cont() {
+    pass.apply(null, arguments);
+    return true;
+  }
+  function register(varname) {
+    var state = cx.state;
+    if (state.context) {
+      cx.marked = "def";
+      for (var v = state.localVars; v; v = v.next)
+        if (v.name == varname) return;
+      state.localVars = {name: varname, next: state.localVars};
+    }
+  }
+
+  // Combinators
+
+  var defaultVars = {name: "this", next: {name: "arguments"}};
+  function pushcontext() {
+    if (!cx.state.context) cx.state.localVars = defaultVars;
+    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
+  }
+  function popcontext() {
+    cx.state.localVars = cx.state.context.vars;
+    cx.state.context = cx.state.context.prev;
+  }
+  function pushlex(type, info) {
+    var result = function() {
+      var state = cx.state;
+      state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
+    };
+    result.lex = true;
+    return result;
+  }
+  function poplex() {
+    var state = cx.state;
+    if (state.lexical.prev) {
+      if (state.lexical.type == ")")
+        state.indented = state.lexical.indented;
+      state.lexical = state.lexical.prev;
+    }
+  }
+  poplex.lex = true;
+
+  function expect(wanted) {
+    return function expecting(type) {
+      if (type == wanted) return cont();
+      else if (wanted == ";") return pass();
+      else return cont(arguments.callee);
+    };
+  }
+
+  function statement(type) {
+    if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
+    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
+    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+    if (type == "{") return cont(pushlex("}"), block, poplex);
+    if (type == ";") return cont();
+    if (type == "function") return cont(functiondef);
+    if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
+                                      poplex, statement, poplex);
+    if (type == "variable") return cont(pushlex("stat"), maybelabel);
+    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
+                                         block, poplex, poplex);
+    if (type == "case") return cont(expression, expect(":"));
+    if (type == "default") return cont(expect(":"));
+    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
+                                        statement, poplex, popcontext);
+    return pass(pushlex("stat"), expression, expect(";"), poplex);
+  }
+  function expression(type) {
+    if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
+    if (type == "function") return cont(functiondef);
+    if (type == "keyword c") return cont(maybeexpression);
+    if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator);
+    if (type == "operator") return cont(expression);
+    if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
+    if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
+    return cont();
+  }
+  function maybeexpression(type) {
+    if (type.match(/[;\}\)\],]/)) return pass();
+    return pass(expression);
+  }
+    
+  function maybeoperator(type, value) {
+    if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
+    if (type == "operator" || type == ":") return cont(expression);
+    if (type == ";") return;
+    if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
+    if (type == ".") return cont(property, maybeoperator);
+    if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
+  }
+  function maybelabel(type) {
+    if (type == ":") return cont(poplex, statement);
+    return pass(maybeoperator, expect(";"), poplex);
+  }
+  function property(type) {
+    if (type == "variable") {cx.marked = "property"; return cont();}
+  }
+  function objprop(type) {
+    if (type == "variable") cx.marked = "property";
+    if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
+  }
+  function commasep(what, end) {
+    function proceed(type) {
+      if (type == ",") return cont(what, proceed);
+      if (type == end) return cont();
+      return cont(expect(end));
+    }
+    return function commaSeparated(type) {
+      if (type == end) return cont();
+      else return pass(what, proceed);
+    };
+  }
+  function block(type) {
+    if (type == "}") return cont();
+    return pass(statement, block);
+  }
+  function vardef1(type, value) {
+    if (type == "variable"){register(value); return cont(vardef2);}
+    return cont();
+  }
+  function vardef2(type, value) {
+    if (value == "=") return cont(expression, vardef2);
+    if (type == ",") return cont(vardef1);
+  }
+  function forspec1(type) {
+    if (type == "var") return cont(vardef1, forspec2);
+    if (type == ";") return pass(forspec2);
+    if (type == "variable") return cont(formaybein);
+    return pass(forspec2);
+  }
+  function formaybein(type, value) {
+    if (value == "in") return cont(expression);
+    return cont(maybeoperator, forspec2);
+  }
+  function forspec2(type, value) {
+    if (type == ";") return cont(forspec3);
+    if (value == "in") return cont(expression);
+    return cont(expression, expect(";"), forspec3);
+  }
+  function forspec3(type) {
+    if (type != ")") cont(expression);
+  }
+  function functiondef(type, value) {
+    if (type == "variable") {register(value); return cont(functiondef);}
+    if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
+  }
+  function funarg(type, value) {
+    if (type == "variable") {register(value); return cont();}
+  }
+
+  // Interface
+
+  return {
+    startState: function(basecolumn) {
+      return {
+        tokenize: jsTokenBase,
+        reAllowed: true,
+        kwAllowed: true,
+        cc: [],
+        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+        localVars: parserConfig.localVars,
+        context: parserConfig.localVars && {vars: parserConfig.localVars},
+        indented: 0
+      };
+    },
+
+    token: function(stream, state) {
+      if (stream.sol()) {
+        if (!state.lexical.hasOwnProperty("align"))
+          state.lexical.align = false;
+        state.indented = stream.indentation();
+      }
+      if (stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      if (type == "comment") return style;
+      state.reAllowed = !!(type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/));
+      state.kwAllowed = type != '.';
+      return parseJS(state, style, type, content, stream);
+    },
+
+    indent: function(state, textAfter) {
+      if (state.tokenize != jsTokenBase) return 0;
+      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
+      if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
+      var type = lexical.type, closing = firstChar == type;
+      if (type == "vardef") return lexical.indented + 4;
+      else if (type == "form" && firstChar == "{") return lexical.indented;
+      else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
+      else if (lexical.info == "switch" && !closing)
+        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+      else return lexical.indented + (closing ? 0 : indentUnit);
+    },
+
+    electricChars: ":{}"
+  };
+});
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
diff --git a/interface/codemirror/mode/python/LICENSE.txt b/interface/codemirror/mode/python/LICENSE.txt
new file mode 100755
index 0000000..918866b
--- /dev/null
+++ b/interface/codemirror/mode/python/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2010 Timothy Farrell
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/interface/codemirror/mode/python/index.html b/interface/codemirror/mode/python/index.html
new file mode 100755
index 0000000..47e0e9d
--- /dev/null
+++ b/interface/codemirror/mode/python/index.html
@@ -0,0 +1,122 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Python mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="python.js"></script>
+    <link rel="stylesheet" href="../../doc/docs.css">
+    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
+  </head>
+  <body>
+    <h1>CodeMirror: Python mode</h1>
+    
+    <div><textarea id="code" name="code">
+# Literals
+1234
+0.0e101
+.123
+0b01010011100
+0o01234567
+0x0987654321abcdef
+7
+2147483647
+3L
+79228162514264337593543950336L
+0x100000000L
+79228162514264337593543950336
+0xdeadbeef
+3.14j
+10.j
+10j
+.001j
+1e100j
+3.14e-10j
+
+
+# String Literals
+'For\''
+"God\""
+"""so loved
+the world"""
+'''that he gave
+his only begotten\' '''
+'that whosoever believeth \
+in him'
+''
+
+# Identifiers
+__a__
+a.b
+a.b.c
+
+# Operators
++ - * / % & | ^ ~ < >
+== != <= >= <> << >> // **
+and or not in is
+
+# Delimiters
+() [] {} , : ` = ; @ .  # Note that @ and . require the proper context.
++= -= *= /= %= &= |= ^=
+//= >>= <<= **=
+
+# Keywords
+as assert break class continue def del elif else except
+finally for from global if import lambda pass raise
+return try while with yield
+
+# Python 2 Keywords (otherwise Identifiers)
+exec print
+
+# Python 3 Keywords (otherwise Identifiers)
+nonlocal
+
+# Types
+bool classmethod complex dict enumerate float frozenset int list object
+property reversed set slice staticmethod str super tuple type
+
+# Python 2 Types (otherwise Identifiers)
+basestring buffer file long unicode xrange
+
+# Python 3 Types (otherwise Identifiers)
+bytearray bytes filter map memoryview open range zip
+
+# Some Example code
+import os
+from package import ParentClass
+
+ at nonsenseDecorator
+def doesNothing():
+    pass
+
+class ExampleClass(ParentClass):
+    @staticmethod
+    def example(inputStr):
+        a = list(inputStr)
+        a.reverse()
+        return ''.join(a)
+
+    def __init__(self, mixin = 'Hello'):
+        self.mixin = mixin
+
+</textarea></div>
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        mode: {name: "python",
+               version: 2,
+               singleLineStringErrors: false},
+        lineNumbers: true,
+        indentUnit: 4,
+        tabMode: "shift",
+        matchBrackets: true
+      });
+    </script>
+    <h2>Configuration Options:</h2>
+    <ul>
+      <li>version - 2/3 - The version of Python to recognize.  Default is 2.</li>
+      <li>singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.</li>
+    </ul>
+
+    <p><strong>MIME types defined:</strong> <code>text/x-python</code>.</p>
+  </body>
+</html>
diff --git a/interface/codemirror/mode/python/python.js b/interface/codemirror/mode/python/python.js
new file mode 100755
index 0000000..d6888e8
--- /dev/null
+++ b/interface/codemirror/mode/python/python.js
@@ -0,0 +1,338 @@
+CodeMirror.defineMode("python", function(conf, parserConf) {
+    var ERRORCLASS = 'error';
+    
+    function wordRegexp(words) {
+        return new RegExp("^((" + words.join(")|(") + "))\\b");
+    }
+    
+    var singleOperators = new RegExp("^[\\+\\-\\*/%&|\\^~<>!]");
+    var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]');
+    var doubleOperators = new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))");
+    var doubleDelimiters = new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))");
+    var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");
+    var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*");
+
+    var wordOperators = wordRegexp(['and', 'or', 'not', 'is', 'in']);
+    var commonkeywords = ['as', 'assert', 'break', 'class', 'continue',
+                          'def', 'del', 'elif', 'else', 'except', 'finally',
+                          'for', 'from', 'global', 'if', 'import',
+                          'lambda', 'pass', 'raise', 'return',
+                          'try', 'while', 'with', 'yield'];
+    var commonBuiltins = ['abs', 'all', 'any', 'bin', 'bool', 'bytearray', 'callable', 'chr',
+                          'classmethod', 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod',
+                          'enumerate', 'eval', 'filter', 'float', 'format', 'frozenset',
+                          'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id',
+                          'input', 'int', 'isinstance', 'issubclass', 'iter', 'len',
+                          'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next',
+                          'object', 'oct', 'open', 'ord', 'pow', 'property', 'range',
+                          'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
+                          'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple',
+                          'type', 'vars', 'zip', '__import__', 'NotImplemented',
+                          'Ellipsis', '__debug__'];
+    var py2 = {'builtins': ['apply', 'basestring', 'buffer', 'cmp', 'coerce', 'execfile',
+                            'file', 'intern', 'long', 'raw_input', 'reduce', 'reload',
+                            'unichr', 'unicode', 'xrange', 'False', 'True', 'None'],
+               'keywords': ['exec', 'print']};
+    var py3 = {'builtins': ['ascii', 'bytes', 'exec', 'print'],
+               'keywords': ['nonlocal', 'False', 'True', 'None']};
+
+    if (!!parserConf.version && parseInt(parserConf.version, 10) === 3) {
+        commonkeywords = commonkeywords.concat(py3.keywords);
+        commonBuiltins = commonBuiltins.concat(py3.builtins);
+        var stringPrefixes = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i");
+    } else {
+        commonkeywords = commonkeywords.concat(py2.keywords);
+        commonBuiltins = commonBuiltins.concat(py2.builtins);
+        var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i");
+    }
+    var keywords = wordRegexp(commonkeywords);
+    var builtins = wordRegexp(commonBuiltins);
+
+    var indentInfo = null;
+
+    // tokenizers
+    function tokenBase(stream, state) {
+        // Handle scope changes
+        if (stream.sol()) {
+            var scopeOffset = state.scopes[0].offset;
+            if (stream.eatSpace()) {
+                var lineOffset = stream.indentation();
+                if (lineOffset > scopeOffset) {
+                    indentInfo = 'indent';
+                } else if (lineOffset < scopeOffset) {
+                    indentInfo = 'dedent';
+                }
+                return null;
+            } else {
+                if (scopeOffset > 0) {
+                    dedent(stream, state);
+                }
+            }
+        }
+        if (stream.eatSpace()) {
+            return null;
+        }
+        
+        var ch = stream.peek();
+        
+        // Handle Comments
+        if (ch === '#') {
+            stream.skipToEnd();
+            return 'comment';
+        }
+        
+        // Handle Number Literals
+        if (stream.match(/^[0-9\.]/, false)) {
+            var floatLiteral = false;
+            // Floats
+            if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; }
+            if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; }
+            if (stream.match(/^\.\d+/)) { floatLiteral = true; }
+            if (floatLiteral) {
+                // Float literals may be "imaginary"
+                stream.eat(/J/i);
+                return 'number';
+            }
+            // Integers
+            var intLiteral = false;
+            // Hex
+            if (stream.match(/^0x[0-9a-f]+/i)) { intLiteral = true; }
+            // Binary
+            if (stream.match(/^0b[01]+/i)) { intLiteral = true; }
+            // Octal
+            if (stream.match(/^0o[0-7]+/i)) { intLiteral = true; }
+            // Decimal
+            if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) {
+                // Decimal literals may be "imaginary"
+                stream.eat(/J/i);
+                // TODO - Can you have imaginary longs?
+                intLiteral = true;
+            }
+            // Zero by itself with no other piece of number.
+            if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; }
+            if (intLiteral) {
+                // Integer literals may be "long"
+                stream.eat(/L/i);
+                return 'number';
+            }
+        }
+        
+        // Handle Strings
+        if (stream.match(stringPrefixes)) {
+            state.tokenize = tokenStringFactory(stream.current());
+            return state.tokenize(stream, state);
+        }
+        
+        // Handle operators and Delimiters
+        if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) {
+            return null;
+        }
+        if (stream.match(doubleOperators)
+            || stream.match(singleOperators)
+            || stream.match(wordOperators)) {
+            return 'operator';
+        }
+        if (stream.match(singleDelimiters)) {
+            return null;
+        }
+        
+        if (stream.match(keywords)) {
+            return 'keyword';
+        }
+        
+        if (stream.match(builtins)) {
+            return 'builtin';
+        }
+        
+        if (stream.match(identifiers)) {
+            return 'variable';
+        }
+        
+        // Handle non-detected items
+        stream.next();
+        return ERRORCLASS;
+    }
+    
+    function tokenStringFactory(delimiter) {
+        while ('rub'.indexOf(delimiter.charAt(0).toLowerCase()) >= 0) {
+            delimiter = delimiter.substr(1);
+        }
+        var singleline = delimiter.length == 1;
+        var OUTCLASS = 'string';
+        
+        return function tokenString(stream, state) {
+            while (!stream.eol()) {
+                stream.eatWhile(/[^'"\\]/);
+                if (stream.eat('\\')) {
+                    stream.next();
+                    if (singleline && stream.eol()) {
+                        return OUTCLASS;
+                    }
+                } else if (stream.match(delimiter)) {
+                    state.tokenize = tokenBase;
+                    return OUTCLASS;
+                } else {
+                    stream.eat(/['"]/);
+                }
+            }
+            if (singleline) {
+                if (parserConf.singleLineStringErrors) {
+                    return ERRORCLASS;
+                } else {
+                    state.tokenize = tokenBase;
+                }
+            }
+            return OUTCLASS;
+        };
+    }
+    
+    function indent(stream, state, type) {
+        type = type || 'py';
+        var indentUnit = 0;
+        if (type === 'py') {
+            if (state.scopes[0].type !== 'py') {
+                state.scopes[0].offset = stream.indentation();
+                return;
+            }
+            for (var i = 0; i < state.scopes.length; ++i) {
+                if (state.scopes[i].type === 'py') {
+                    indentUnit = state.scopes[i].offset + conf.indentUnit;
+                    break;
+                }
+            }
+        } else {
+            indentUnit = stream.column() + stream.current().length;
+        }
+        state.scopes.unshift({
+            offset: indentUnit,
+            type: type
+        });
+    }
+    
+    function dedent(stream, state, type) {
+        type = type || 'py';
+        if (state.scopes.length == 1) return;
+        if (state.scopes[0].type === 'py') {
+            var _indent = stream.indentation();
+            var _indent_index = -1;
+            for (var i = 0; i < state.scopes.length; ++i) {
+                if (_indent === state.scopes[i].offset) {
+                    _indent_index = i;
+                    break;
+                }
+            }
+            if (_indent_index === -1) {
+                return true;
+            }
+            while (state.scopes[0].offset !== _indent) {
+                state.scopes.shift();
+            }
+            return false
+        } else {
+            if (type === 'py') {
+                state.scopes[0].offset = stream.indentation();
+                return false;
+            } else {
+                if (state.scopes[0].type != type) {
+                    return true;
+                }
+                state.scopes.shift();
+                return false;
+            }
+        }
+    }
+
+    function tokenLexer(stream, state) {
+        indentInfo = null;
+        var style = state.tokenize(stream, state);
+        var current = stream.current();
+
+        // Handle '.' connected identifiers
+        if (current === '.') {
+            style = stream.match(identifiers, false) ? null : ERRORCLASS;
+            if (style === null && state.lastToken === 'meta') {
+                // Apply 'meta' style to '.' connected identifiers when
+                // appropriate.
+                style = 'meta';
+            }
+            return style;
+        }
+        
+        // Handle decorators
+        if (current === '@') {
+            return stream.match(identifiers, false) ? 'meta' : ERRORCLASS;
+        }
+
+        if ((style === 'variable' || style === 'builtin')
+            && state.lastToken === 'meta') {
+            style = 'meta';
+        }
+        
+        // Handle scope changes.
+        if (current === 'pass' || current === 'return') {
+            state.dedent += 1;
+        }
+        if (current === 'lambda') state.lambda = true;
+        if ((current === ':' && !state.lambda && state.scopes[0].type == 'py')
+            || indentInfo === 'indent') {
+            indent(stream, state);
+        }
+        var delimiter_index = '[({'.indexOf(current);
+        if (delimiter_index !== -1) {
+            indent(stream, state, '])}'.slice(delimiter_index, delimiter_index+1));
+        }
+        if (indentInfo === 'dedent') {
+            if (dedent(stream, state)) {
+                return ERRORCLASS;
+            }
+        }
+        delimiter_index = '])}'.indexOf(current);
+        if (delimiter_index !== -1) {
+            if (dedent(stream, state, current)) {
+                return ERRORCLASS;
+            }
+        }
+        if (state.dedent > 0 && stream.eol() && state.scopes[0].type == 'py') {
+            if (state.scopes.length > 1) state.scopes.shift();
+            state.dedent -= 1;
+        }
+        
+        return style;
+    }
+
+    var external = {
+        startState: function(basecolumn) {
+            return {
+              tokenize: tokenBase,
+              scopes: [{offset:basecolumn || 0, type:'py'}],
+              lastToken: null,
+              lambda: false,
+              dedent: 0
+          };
+        },
+        
+        token: function(stream, state) {
+            var style = tokenLexer(stream, state);
+            
+            state.lastToken = style;
+            
+            if (stream.eol() && stream.lambda) {
+                state.lambda = false;
+            }
+            
+            return style;
+        },
+        
+        indent: function(state, textAfter) {
+            if (state.tokenize != tokenBase) {
+                return 0;
+            }
+            
+            return state.scopes[0].offset;
+        }
+        
+    };
+    return external;
+});
+
+CodeMirror.defineMIME("text/x-python", "python");
diff --git a/interface/codemirror/test/index.html b/interface/codemirror/test/index.html
new file mode 100755
index 0000000..53471b1
--- /dev/null
+++ b/interface/codemirror/test/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror: Test Suite</title>
+    <link rel="stylesheet" href="../lib/codemirror.css">
+    <script src="../lib/codemirror.js"></script>
+    <script src="../mode/javascript/javascript.js"></script>
+
+    <style type="text/css">
+      .ok {color: #0e0;}
+      .failure {color: #e00;}
+      .error {color: #c90;}
+    </style>
+  </head>
+  <body>
+    <h1>CodeMirror: Test Suite</h1>
+
+    <p>A limited set of programmatic sanity tests for CodeMirror.</p>
+
+    <pre id=output></pre>
+
+    <div style="visibility: hidden" id=testground>
+      <form><textarea id="code" name="code"></textarea><input type=submit value=ok name=submit></form>
+    </div>
+
+    <script src="test.js"></script>
+  </body>
+</html>
diff --git a/interface/codemirror/test/mode_test.css b/interface/codemirror/test/mode_test.css
new file mode 100755
index 0000000..f425922
--- /dev/null
+++ b/interface/codemirror/test/mode_test.css
@@ -0,0 +1,22 @@
+.mt-output .mt-token {
+  border: 1px solid #ddd;
+  white-space: pre;
+  font-family: "Consolas", monospace;
+  text-align: center;
+}
+
+.mt-output .mt-style {
+  font-size: x-small;
+}
+
+.mt-test {
+  border-left: 10px solid #fff;
+}
+
+.mt-pass {
+  border-left: 10px solid #cfc;
+}
+
+.mt-fail {
+  border-left: 10px solid #fcc;
+}
diff --git a/interface/codemirror/test/mode_test.js b/interface/codemirror/test/mode_test.js
new file mode 100755
index 0000000..d77ac14
--- /dev/null
+++ b/interface/codemirror/test/mode_test.js
@@ -0,0 +1,164 @@
+/**
+ * Helper to test CodeMirror highlighting modes. It pretty prints output of the
+ * highlighter and can check against expected styles.
+ *
+ * See test.html in the stex mode for examples.
+ */
+ModeTest = {};
+
+ModeTest.modeOptions = {};
+ModeTest.modeName = CodeMirror.defaults.mode;
+
+/* keep track of results for printSummary */
+ModeTest.tests = 0;
+ModeTest.passes = 0;
+
+/**
+ * Run a test; prettyprints the results using document.write().
+ *
+ * @param string to highlight
+ *
+ * @param style[i] expected style of the i'th token in string
+ *
+ * @param token[i] expected value for the i'th token in string
+ */
+ModeTest.test = function() {
+  ModeTest.tests += 1;
+
+  var mode = CodeMirror.getMode(ModeTest.modeOptions, ModeTest.modeName);
+
+  if (arguments.length < 1) {
+    throw "must have text for test";
+  }
+  if (arguments.length % 2 != 1) {
+    throw "must have text for test plus expected (style, token) pairs";
+  }
+
+  var text = arguments[0];
+  var expectedOutput = [];
+  for (var i = 1; i < arguments.length; i += 2) {
+    expectedOutput.push([arguments[i],arguments[i + 1]]);
+  }
+
+  var observedOutput = ModeTest.highlight(text, mode)
+
+  var pass, passStyle = "";
+  if (expectedOutput.length > 0) {
+    pass = ModeTest.highlightOutputsEqual(expectedOutput, observedOutput);
+    passStyle = pass ? 'mt-pass' : 'mt-fail';
+    ModeTest.passes += pass ? 1 : 0;
+  }
+
+  var s = '';
+  s += '<div class="mt-test ' + passStyle + '">';
+  s +=   '<pre>' + ModeTest.htmlEscape(text) + '</pre>';
+  s +=   '<div class="cm-s-default">';
+  if (pass || expectedOutput.length == 0) {
+    s +=   ModeTest.prettyPrintOutputTable(observedOutput);
+  } else {
+    s += 'expected:';
+    s +=   ModeTest.prettyPrintOutputTable(expectedOutput);
+    s += 'observed:';
+    s +=   ModeTest.prettyPrintOutputTable(observedOutput);
+  }
+  s +=   '</div>';
+  s += '</div>';
+  document.write(s);
+}
+
+/**
+ * Emulation of CodeMirror's internal highlight routine for testing. Multi-line
+ * input is supported.
+ *
+ * @param string to highlight
+ *
+ * @param mode the mode that will do the actual highlighting
+ *
+ * @return array of [style, token] pairs
+ */
+ModeTest.highlight = function(string, mode) {
+  var state = mode.startState()
+
+  var lines = string.replace(/\r\n/g,'\n').split('\n');
+  var output = [];
+  for (var i = 0; i < lines.length; ++i) {
+    var line = lines[i];
+    var stream = new CodeMirror.StringStream(line);
+    if (line == "" && mode.blankLine) mode.blankLine(state);
+    while (!stream.eol()) {
+      var style = mode.token(stream, state);
+      var substr = line.slice(stream.start, stream.pos);
+      output.push([style, substr]);
+      stream.start = stream.pos;
+    }
+  }
+
+  return output;
+}
+
+/**
+ * Compare two arrays of output from ModeTest.highlight.
+ *
+ * @param o1 array of [style, token] pairs
+ *
+ * @param o2 array of [style, token] pairs
+ *
+ * @return boolean; true iff outputs equal
+ */
+ModeTest.highlightOutputsEqual = function(o1, o2) {
+  var eq = (o1.length == o2.length);
+  if (eq) {
+    for (var j in o1) {
+      eq = eq &&
+        o1[j].length == 2 && o1[j][0] == o2[j][0] && o1[j][1] == o2[j][1];
+    }
+  }
+  return eq;
+}
+
+/**
+ * Print tokens and corresponding styles in a table. Spaces in the token are
+ * replaced with 'interpunct' dots (·).
+ *
+ * @param output array of [style, token] pairs
+ *
+ * @return html string
+ */
+ModeTest.prettyPrintOutputTable = function(output) {
+  var s = '<table class="mt-output">';
+  s += '<tr>';
+  for (var i = 0; i < output.length; ++i) {
+    var token = output[i];
+    s +=
+      '<td class="mt-token">' +
+        '<span class="cm-' + token[0] + '">' +
+          ModeTest.htmlEscape(token[1]).replace(/ /g,'·') +
+        '</span>' +
+      '</td>';
+  }
+  s += '</tr><tr>';
+  for (var i = 0; i < output.length; ++i) {
+    var token = output[i];
+    s +=
+      '<td class="mt-style"><span>' + token[0] + '</span></td>';
+  }
+  s += '</table>';
+  return s;
+}
+
+/**
+ * Print how many tests have run so far and how many of those passed.
+ */
+ModeTest.printSummary = function() {
+  document.write(ModeTest.passes + ' passes for ' + ModeTest.tests + ' tests');
+}
+
+/**
+ * Basic HTML escaping.
+ */
+ModeTest.htmlEscape = function(str) {
+  str = str.toString();
+  return str.replace(/[<&]/g,
+      function(str) {return str == "&" ? "&" : "<";});
+}
+
diff --git a/interface/codemirror/test/test.js b/interface/codemirror/test/test.js
new file mode 100755
index 0000000..1d25a26
--- /dev/null
+++ b/interface/codemirror/test/test.js
@@ -0,0 +1,337 @@
+var tests = [];
+
+test("fromTextArea", function() {
+  var te = document.getElementById("code");
+  te.value = "CONTENT";
+  var cm = CodeMirror.fromTextArea(te);
+  is(!te.offsetHeight);
+  eq(cm.getValue(), "CONTENT");
+  cm.setValue("foo\nbar");
+  eq(cm.getValue(), "foo\nbar");
+  cm.save();
+  is(/^foo\r?\nbar$/.test(te.value));
+  cm.setValue("xxx");
+  cm.toTextArea();
+  is(te.offsetHeight);
+  eq(te.value, "xxx");
+});
+
+testCM("getRange", function(cm) {
+  eq(cm.getLine(0), "1234");
+  eq(cm.getLine(1), "5678");
+  eq(cm.getLine(2), null);
+  eq(cm.getLine(-1), null);
+  eq(cm.getRange({line: 0, ch: 0}, {line: 0, ch: 3}), "123");
+  eq(cm.getRange({line: 0, ch: -1}, {line: 0, ch: 200}), "1234");
+  eq(cm.getRange({line: 0, ch: 2}, {line: 1, ch: 2}), "34\n56");
+  eq(cm.getRange({line: 1, ch: 2}, {line: 100, ch: 0}), "78");
+}, {value: "1234\n5678"});
+
+testCM("replaceRange", function(cm) {
+  eq(cm.getValue(), "");
+  cm.replaceRange("foo\n", {line: 0, ch: 0});
+  eq(cm.getValue(), "foo\n");
+  cm.replaceRange("a\nb", {line: 0, ch: 1});
+  eq(cm.getValue(), "fa\nboo\n");
+  eq(cm.lineCount(), 3);
+  cm.replaceRange("xyzzy", {line: 0, ch: 0}, {line: 1, ch: 1});
+  eq(cm.getValue(), "xyzzyoo\n");
+  cm.replaceRange("abc", {line: 0, ch: 0}, {line: 10, ch: 0});
+  eq(cm.getValue(), "abc");
+  eq(cm.lineCount(), 1);
+});
+
+testCM("selection", function(cm) {
+  cm.setSelection({line: 0, ch: 4}, {line: 2, ch: 2});
+  is(cm.somethingSelected());
+  eq(cm.getSelection(), "11\n222222\n33");
+  eqPos(cm.getCursor(false), {line: 2, ch: 2});
+  eqPos(cm.getCursor(true), {line: 0, ch: 4});
+  cm.setSelection({line: 1, ch: 0});
+  is(!cm.somethingSelected());
+  eq(cm.getSelection(), "");
+  eqPos(cm.getCursor(true), {line: 1, ch: 0});
+  cm.replaceSelection("abc");
+  eq(cm.getSelection(), "abc");
+  eq(cm.getValue(), "111111\nabc222222\n333333");
+  cm.replaceSelection("def", "end");
+  eq(cm.getSelection(), "");
+  eqPos(cm.getCursor(true), {line: 1, ch: 3});
+  cm.setCursor({line: 2, ch: 1});
+  eqPos(cm.getCursor(true), {line: 2, ch: 1});
+  cm.setCursor(1, 2);
+  eqPos(cm.getCursor(true), {line: 1, ch: 2});
+}, {value: "111111\n222222\n333333"});
+
+testCM("lines", function(cm) {
+  eq(cm.getLine(0), "111111");
+  eq(cm.getLine(1), "222222");
+  eq(cm.getLine(-1), null);
+  cm.removeLine(1);
+  cm.setLine(1, "abc");
+  eq(cm.getValue(), "111111\nabc");
+}, {value: "111111\n222222\n333333"});
+
+testCM("indent", function(cm) {
+  cm.indentLine(1);
+  eq(cm.getLine(1), "   blah();");
+  cm.setOption("indentUnit", 8);
+  cm.indentLine(1);
+  eq(cm.getLine(1), "\tblah();");
+}, {value: "if (x) {\nblah();\n}", indentUnit: 3, indentWithTabs: true, tabSize: 8});
+
+test("defaults", function() {
+  var olddefaults = CodeMirror.defaults, defs = CodeMirror.defaults = {};
+  for (var opt in olddefaults) defs[opt] = olddefaults[opt];
+  defs.indentUnit = 5;
+  defs.value = "uu";
+  defs.enterMode = "keep";
+  defs.tabindex = 55;
+  var place = document.getElementById("testground"), cm = CodeMirror(place);
+  try {
+    eq(cm.getOption("indentUnit"), 5);
+    cm.setOption("indentUnit", 10);
+    eq(defs.indentUnit, 5);
+    eq(cm.getValue(), "uu");
+    eq(cm.getOption("enterMode"), "keep");
+    eq(cm.getInputField().tabIndex, 55);
+  }
+  finally {
+    CodeMirror.defaults = olddefaults;
+    place.removeChild(cm.getWrapperElement());
+  }
+});
+
+testCM("lineInfo", function(cm) {
+  eq(cm.lineInfo(-1), null);
+  var lh = cm.setMarker(1, "FOO", "bar");
+  var info = cm.lineInfo(1);
+  eq(info.text, "222222");
+  eq(info.markerText, "FOO");
+  eq(info.markerClass, "bar");
+  eq(info.line, 1);
+  eq(cm.lineInfo(2).markerText, null);
+  cm.clearMarker(lh);
+  eq(cm.lineInfo(1).markerText, null);
+}, {value: "111111\n222222\n333333"});
+
+testCM("coords", function(cm) {
+  var scroller = cm.getScrollerElement();
+  scroller.style.height = "100px";
+  var content = [];
+  for (var i = 0; i < 200; ++i) content.push("------------------------------" + i);
+  cm.setValue(content.join("\n"));
+  var top = cm.charCoords({line: 0, ch: 0});
+  var bot = cm.charCoords({line: 200, ch: 30});
+  is(top.x < bot.x);
+  is(top.y < bot.y);
+  is(top.y < top.yBot);
+  cm.scrollTo(null, 100);
+  var top2 = cm.charCoords({line: 0, ch: 0});
+  is(top.y > top2.y);
+  eq(top.x, top2.x);
+});
+
+testCM("coordsChar", function(cm) {
+  var content = [];
+  for (var i = 0; i < 70; ++i) content.push("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+  cm.setValue(content.join("\n"));
+  for (var ch = 0; ch < 35; ch += 2) {
+    for (var line = 0; line < 70; line += 5) {
+      cm.setCursor(line, ch);
+      var coords = cm.charCoords({line: line, ch: ch});
+      var pos = cm.coordsChar({x: coords.x, y: coords.y + 1});
+      eq(pos.line, line);
+      eq(pos.ch, ch);
+    }
+  }
+});
+
+testCM("posFromIndex", function(cm) {
+  cm.setValue(
+    "This function should\n" +
+    "convert a zero based index\n" +
+    "to line and ch."
+  );
+
+  var examples = [
+    { index: -1, line: 0, ch: 0  }, // <- Tests clipping
+    { index: 0,  line: 0, ch: 0  },
+    { index: 10, line: 0, ch: 10 },
+    { index: 39, line: 1, ch: 18 },
+    { index: 55, line: 2, ch: 7  },
+    { index: 63, line: 2, ch: 15 },
+    { index: 64, line: 2, ch: 15 }  // <- Tests clipping
+  ];
+
+  for (var i = 0; i < examples.length; i++) {
+    var example = examples[i];
+    var pos = cm.posFromIndex(example.index);
+    eq(pos.line, example.line);
+    eq(pos.ch, example.ch);
+    if (example.index >= 0 && example.index < 64)
+      eq(cm.indexFromPos(pos), example.index);
+  }  
+});
+
+testCM("undo", function(cm) {
+  cm.setLine(0, "def");
+  eq(cm.historySize().undo, 1);
+  cm.undo();
+  eq(cm.getValue(), "abc");
+  eq(cm.historySize().undo, 0);
+  eq(cm.historySize().redo, 1);
+  cm.redo();
+  eq(cm.getValue(), "def");
+  eq(cm.historySize().undo, 1);
+  eq(cm.historySize().redo, 0);
+  cm.setValue("1\n\n\n2");
+  cm.clearHistory();
+  eq(cm.historySize().undo, 0);
+  for (var i = 0; i < 20; ++i) {
+    cm.replaceRange("a", {line: 0, ch: 0});
+    cm.replaceRange("b", {line: 3, ch: 0});
+  }
+  eq(cm.historySize().undo, 40);
+  for (var i = 0; i < 40; ++i)
+    cm.undo();
+  eq(cm.historySize().redo, 40);
+  eq(cm.getValue(), "1\n\n\n2");
+}, {value: "abc"});
+
+testCM("undoMultiLine", function(cm) {
+  cm.replaceRange("x", {line:0, ch: 0});
+  cm.replaceRange("y", {line:1, ch: 0});
+  cm.undo();
+  eq(cm.getValue(), "abc\ndef\nghi");
+  cm.replaceRange("y", {line:1, ch: 0});
+  cm.replaceRange("x", {line:0, ch: 0});
+  cm.undo();
+  eq(cm.getValue(), "abc\ndef\nghi");
+  cm.replaceRange("y", {line:2, ch: 0});
+  cm.replaceRange("x", {line:1, ch: 0});
+  cm.replaceRange("z", {line:2, ch: 0});
+  cm.undo();
+  eq(cm.getValue(), "abc\ndef\nghi");
+}, {value: "abc\ndef\nghi"});
+
+testCM("markTextSingleLine", function(cm) {
+  forEach([{a: 0, b: 1, c: "", f: 2, t: 5},
+           {a: 0, b: 4, c: "", f: 0, t: 2},
+           {a: 1, b: 2, c: "x", f: 3, t: 6},
+           {a: 4, b: 5, c: "", f: 3, t: 5},
+           {a: 4, b: 5, c: "xx", f: 3, t: 7},
+           {a: 2, b: 5, c: "", f: 2, t: 3},
+           {a: 2, b: 5, c: "abcd", f: 6, t: 7},
+           {a: 2, b: 6, c: "x", f: null, t: null},
+           {a: 3, b: 6, c: "", f: null, t: null},
+           {a: 0, b: 9, c: "hallo", f: null, t: null},
+           {a: 4, b: 6, c: "x", f: 3, t: 4},
+           {a: 4, b: 8, c: "", f: 3, t: 4},
+           {a: 6, b: 6, c: "a", f: 3, t: 6},
+           {a: 8, b: 9, c: "", f: 3, t: 6}], function(test) {
+    cm.setValue("1234567890");
+    var r = cm.markText({line: 0, ch: 3}, {line: 0, ch: 6}, "foo");
+    cm.replaceRange(test.c, {line: 0, ch: test.a}, {line: 0, ch: test.b});
+    var f = r.find();
+    eq(f.from && f.from.ch, test.f); eq(f.to && f.to.ch, test.t);
+  });
+});
+
+testCM("markTextMultiLine", function(cm) {
+  function p(v) { return v && {line: v[0], ch: v[1]}; }
+  forEach([{a: [0, 0], b: [0, 5], c: "", f: [0, 0], t: [2, 5]},
+           {a: [0, 1], b: [0, 10], c: "", f: [0, 1], t: [2, 5]},
+           {a: [0, 5], b: [0, 6], c: "x", f: [0, 6], t: [2, 5]},
+           {a: [0, 0], b: [1, 0], c: "", f: [0, 0], t: [1, 5]},
+           {a: [0, 6], b: [2, 4], c: "", f: [0, 5], t: [0, 7]},
+           {a: [0, 6], b: [2, 4], c: "aa", f: [0, 5], t: [0, 9]},
+           {a: [1, 2], b: [1, 8], c: "", f: [0, 5], t: [2, 5]},
+           {a: [0, 5], b: [2, 5], c: "xx", f: null, t: null},
+           {a: [0, 0], b: [2, 10], c: "x", f: null, t: null},
+           {a: [1, 5], b: [2, 5], c: "", f: [0, 5], t: [1, 5]},
+           {a: [2, 0], b: [2, 3], c: "", f: [0, 5], t: [2, 2]},
+           {a: [2, 5], b: [3, 0], c: "a\nb", f: [0, 5], t: [2, 5]},
+           {a: [2, 3], b: [3, 0], c: "x", f: [0, 5], t: [2, 4]},
+           {a: [1, 1], b: [1, 9], c: "1\n2\n3", f: [0, 5], t: [4, 5]}], function(test) {
+    cm.setValue("aaaaaaaaaa\nbbbbbbbbbb\ncccccccccc\ndddddddd\n");
+    var r = cm.markText({line: 0, ch: 5}, {line: 2, ch: 5}, "foo");
+    cm.replaceRange(test.c, p(test.a), p(test.b));
+    var f = r.find();
+    eqPos(f.from, p(test.f)); eqPos(f.to, p(test.t));
+  });
+});
+
+testCM("bookmark", function(cm) {
+  function p(v) { return v && {line: v[0], ch: v[1]}; }
+  forEach([{a: [1, 0], b: [1, 1], c: "", d: [1, 4]},
+           {a: [1, 1], b: [1, 1], c: "xx", d: [1, 7]},
+           {a: [1, 4], b: [1, 5], c: "ab", d: [1, 6]},
+           {a: [1, 4], b: [1, 6], c: "", d: null},
+           {a: [1, 5], b: [1, 6], c: "abc", d: [1, 5]},
+           {a: [1, 6], b: [1, 8], c: "", d: [1, 5]},
+           {a: [1, 4], b: [1, 4], c: "\n\n", d: [3, 1]},
+           {bm: [1, 9], a: [1, 1], b: [1, 1], c: "\n", d: [2, 8]}], function(test) {
+    cm.setValue("1234567890\n1234567890\n1234567890");
+    var b = cm.setBookmark(p(test.bm) || {line: 1, ch: 5});
+    cm.replaceRange(test.c, p(test.a), p(test.b));
+    eqPos(b.find(), p(test.d));
+  });
+});
+
+// Scaffolding
+
+function htmlEscape(str) {
+  return str.replace(/[<&]/g, function(str) {return str == "&" ? "&" : "<";});
+}
+function forEach(arr, f) {
+  for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
+}
+
+function Failure(why) {this.message = why;}
+
+function test(name, run) {tests.push({name: name, func: run});}
+function testCM(name, run, opts) {
+  test(name, function() {
+    var place = document.getElementById("testground"), cm = CodeMirror(place, opts);
+    try {run(cm);}
+    finally {place.removeChild(cm.getWrapperElement());}
+  });
+}
+
+function runTests() {
+  var failures = [], run = 0;
+  for (var i = 0; i < tests.length; ++i) {
+    var test = tests[i];
+    try {test.func();}
+    catch(e) {
+      if (e instanceof Failure)
+        failures.push({type: "failure", test: test.name, text: e.message});
+      else
+        failures.push({type: "error", test: test.name, text: e.toString()});
+    }
+    run++;
+  }
+  var html = [run + " tests run."];
+  if (failures.length)
+    forEach(failures, function(fail) {
+      html.push(fail.test + ': <span class="' + fail.type + '">' + htmlEscape(fail.text) + "</span>");
+    });
+  else html.push('<span class="ok">All passed.</span>');
+  document.getElementById("output").innerHTML = html.join("\n");
+}
+
+function eq(a, b, msg) {
+  if (a != b) throw new Failure(a + " != " + b + (msg ? " (" + msg + ")" : ""));
+}
+function eqPos(a, b, msg) {
+  if (a == b) return;
+  if (a == null || b == null) throw new Failure("comparing point to null");
+  eq(a.line, b.line, msg);
+  eq(a.ch, b.ch, msg);
+}
+function is(a, msg) {
+  if (!a) throw new Failure("assertion failed" + (msg ? " (" + msg + ")" : ""));
+}
+
+window.onload = runTests;
diff --git a/interface/codemirror/theme/ambiance.css b/interface/codemirror/theme/ambiance.css
new file mode 100755
index 0000000..ce13212
--- /dev/null
+++ b/interface/codemirror/theme/ambiance.css
@@ -0,0 +1,82 @@
+/* ambiance theme for code-mirror */
+
+/* Color scheme */
+
+.cm-s-ambiance .cm-keyword { color: #cda869; }
+.cm-s-ambiance .cm-atom { color: #CF7EA9; }
+.cm-s-ambiance .cm-number { color: #78CF8A; }
+.cm-s-ambiance .cm-def { color: #aac6e3; }
+.cm-s-ambiance .cm-variable { color: #ffb795; }
+.cm-s-ambiance .cm-variable-2 { color: #eed1b3; }
+.cm-s-ambiance .cm-variable-3 { color: #faded3; }
+.cm-s-ambiance .cm-property { color: #eed1b3; }
+.cm-s-ambiance .cm-operator {color: #fa8d6a;}
+.cm-s-ambiance .cm-comment { color: #555; font-style:italic; }
+.cm-s-ambiance .cm-string { color: #8f9d6a; }
+.cm-s-ambiance .cm-string-2 { color: #9d937c; }
+.cm-s-ambiance .cm-meta { color: #D2A8A1; }
+.cm-s-ambiance .cm-error { color: #AF2018; }
+.cm-s-ambiance .cm-qualifier { color: yellow; }
+.cm-s-ambiance .cm-builtin { color: #9999cc; }
+.cm-s-ambiance .cm-bracket { color: #24C2C7; }
+.cm-s-ambiance .cm-tag { color: #fee4ff }
+.cm-s-ambiance .cm-attribute {  color: #9B859D; }
+.cm-s-ambiance .cm-header {color: #blue;}
+.cm-s-ambiance .cm-quote { color: #24C2C7; }
+.cm-s-ambiance .cm-hr { color: pink; }
+.cm-s-ambiance .cm-link { color: #F4C20B; }
+.cm-s-ambiance .cm-special { color: #FF9D00; }
+
+.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; }
+.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; }
+
+.cm-s-ambiance .CodeMirror-selected {
+  background: rgba(255, 255, 255, 0.15);
+}
+.CodeMirror-focused .cm-s-ambiance .CodeMirror-selected {
+  background: rgba(255, 255, 255, 0.10);
+}
+
+/* Editor styling */
+
+.cm-s-ambiance {
+  line-height: 1.40em;
+  font-family: Monaco, Menlo,"Andale Mono","lucida console","Courier New",monospace !important;
+  font-size: 12px;
+  color: #E6E1DC;
+  background-color: #202020;
+  -webkit-box-shadow: inset 0 0 10px black;
+  -moz-box-shadow: inset 0 0 10px black;
+  -o-box-shadow: inset 0 0 10px black;
+  box-shadow: inset 0 0 10px black;
+}
+
+.cm-s-ambiance .CodeMirror-gutter {
+  background: #3D3D3D;
+  padding: 0 5px;
+  text-shadow: #333 1px 1px;
+  border-right: 1px solid #4D4D4D;
+  box-shadow: 0 10px 20px black;
+}
+
+.cm-s-ambiance .CodeMirror-gutter .CodeMirror-gutter-text {
+  text-shadow: 0px 1px 1px #4d4d4d;
+  color: #222;
+}
+
+.cm-s-ambiance .CodeMirror-lines {
+  
+}
+
+.cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor {
+  border-left: 1px solid #7991E8;
+}
+
+.cm-s-ambiance .activeline {
+  background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031);
+}
+
+.cm-s-ambiance,
+.cm-s-ambiance .CodeMirror-gutter {
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5 [...]
+}
diff --git a/interface/codemirror/theme/blackboard.css b/interface/codemirror/theme/blackboard.css
new file mode 100755
index 0000000..7b73a92
--- /dev/null
+++ b/interface/codemirror/theme/blackboard.css
@@ -0,0 +1,25 @@
+/* Port of TextMate's Blackboard theme */
+
+.cm-s-blackboard { background: #0C1021; color: #F8F8F8; }
+.cm-s-blackboard .CodeMirror-selected { background: #253B76 !important; }
+.cm-s-blackboard .CodeMirror-gutter { background: #0C1021; border-right: 0; }
+.cm-s-blackboard .CodeMirror-gutter-text { color: #888; }
+.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; }
+
+.cm-s-blackboard .cm-keyword { color: #FBDE2D; }
+.cm-s-blackboard .cm-atom { color: #D8FA3C; }
+.cm-s-blackboard .cm-number { color: #D8FA3C; }
+.cm-s-blackboard .cm-def { color: #8DA6CE; }
+.cm-s-blackboard .cm-variable { color: #FF6400; }
+.cm-s-blackboard .cm-operator { color: #FBDE2D;}
+.cm-s-blackboard .cm-comment { color: #AEAEAE; }
+.cm-s-blackboard .cm-string { color: #61CE3C; }
+.cm-s-blackboard .cm-string-2 { color: #61CE3C; }
+.cm-s-blackboard .cm-meta { color: #D8FA3C; }
+.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; }
+.cm-s-blackboard .cm-builtin { color: #8DA6CE; }
+.cm-s-blackboard .cm-tag { color: #8DA6CE; }
+.cm-s-blackboard .cm-attribute { color: #8DA6CE; }
+.cm-s-blackboard .cm-header { color: #FF6400; }
+.cm-s-blackboard .cm-hr { color: #AEAEAE; }
+.cm-s-blackboard .cm-link { color: #8DA6CE; }
diff --git a/interface/codemirror/theme/cobalt.css b/interface/codemirror/theme/cobalt.css
new file mode 100755
index 0000000..dbbb7e4
--- /dev/null
+++ b/interface/codemirror/theme/cobalt.css
@@ -0,0 +1,18 @@
+.cm-s-cobalt { background: #002240; color: white; }
+.cm-s-cobalt div.CodeMirror-selected { background: #b36539 !important; }
+.cm-s-cobalt .CodeMirror-gutter { background: #002240; border-right: 1px solid #aaa; }
+.cm-s-cobalt .CodeMirror-gutter-text { color: #d0d0d0; }
+.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white !important; }
+
+.cm-s-cobalt span.cm-comment { color: #08f; }
+.cm-s-cobalt span.cm-atom { color: #845dc4; }
+.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; }
+.cm-s-cobalt span.cm-keyword { color: #ffee80; }
+.cm-s-cobalt span.cm-string { color: #3ad900; }
+.cm-s-cobalt span.cm-meta { color: #ff9d00; }
+.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; }
+.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; }
+.cm-s-cobalt span.cm-error { color: #9d1e15; }
+.cm-s-cobalt span.cm-bracket { color: #d8d8d8; }
+.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; }
+.cm-s-cobalt span.cm-link { color: #845dc4; }
diff --git a/interface/codemirror/theme/eclipse.css b/interface/codemirror/theme/eclipse.css
new file mode 100755
index 0000000..47d66a0
--- /dev/null
+++ b/interface/codemirror/theme/eclipse.css
@@ -0,0 +1,25 @@
+.cm-s-eclipse span.cm-meta {color: #FF1717;}
+.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; }
+.cm-s-eclipse span.cm-atom {color: #219;}
+.cm-s-eclipse span.cm-number {color: #164;}
+.cm-s-eclipse span.cm-def {color: #00f;}
+.cm-s-eclipse span.cm-variable {color: black;}
+.cm-s-eclipse span.cm-variable-2 {color: #0000C0;}
+.cm-s-eclipse span.cm-variable-3 {color: #0000C0;}
+.cm-s-eclipse span.cm-property {color: black;}
+.cm-s-eclipse span.cm-operator {color: black;}
+.cm-s-eclipse span.cm-comment {color: #3F7F5F;}
+.cm-s-eclipse span.cm-string {color: #2A00FF;}
+.cm-s-eclipse span.cm-string-2 {color: #f50;}
+.cm-s-eclipse span.cm-error {color: #f00;}
+.cm-s-eclipse span.cm-qualifier {color: #555;}
+.cm-s-eclipse span.cm-builtin {color: #30a;}
+.cm-s-eclipse span.cm-bracket {color: #cc7;}
+.cm-s-eclipse span.cm-tag {color: #170;}
+.cm-s-eclipse span.cm-attribute {color: #00c;}
+.cm-s-eclipse span.cm-link {color: #219;}
+
+.cm-s-eclipse .CodeMirror-matchingbracket {
+	border:1px solid grey;
+	color:black !important;;
+}
diff --git a/interface/codemirror/theme/elegant.css b/interface/codemirror/theme/elegant.css
new file mode 100755
index 0000000..d0ce0cb
--- /dev/null
+++ b/interface/codemirror/theme/elegant.css
@@ -0,0 +1,10 @@
+.cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;}
+.cm-s-elegant span.cm-comment {color: #262; font-style: italic; line-height: 1em;}
+.cm-s-elegant span.cm-meta {color: #555; font-style: italic; line-height: 1em;}
+.cm-s-elegant span.cm-variable {color: black;}
+.cm-s-elegant span.cm-variable-2 {color: #b11;}
+.cm-s-elegant span.cm-qualifier {color: #555;}
+.cm-s-elegant span.cm-keyword {color: #730;}
+.cm-s-elegant span.cm-builtin {color: #30a;}
+.cm-s-elegant span.cm-error {background-color: #fdd;}
+.cm-s-elegant span.cm-link {color: #762;}
diff --git a/interface/codemirror/theme/erlang-dark.css b/interface/codemirror/theme/erlang-dark.css
new file mode 100755
index 0000000..486b1c4
--- /dev/null
+++ b/interface/codemirror/theme/erlang-dark.css
@@ -0,0 +1,21 @@
+.cm-s-erlang-dark { background: #002240; color: white; }
+.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539 !important; }
+.cm-s-erlang-dark .CodeMirror-gutter { background: #002240; border-right: 1px solid #aaa; }
+.cm-s-erlang-dark .CodeMirror-gutter-text { color: #d0d0d0; }
+.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white !important; }
+
+.cm-s-erlang-dark span.cm-atom       { color: #845dc4; }
+.cm-s-erlang-dark span.cm-attribute  { color: #ff80e1; }
+.cm-s-erlang-dark span.cm-bracket    { color: #ff9d00; }
+.cm-s-erlang-dark span.cm-builtin    { color: #eeaaaa; }
+.cm-s-erlang-dark span.cm-comment    { color: #7777ff; }
+.cm-s-erlang-dark span.cm-def        { color: #ee77aa; }
+.cm-s-erlang-dark span.cm-error      { color: #9d1e15; }
+.cm-s-erlang-dark span.cm-keyword    { color: #ffee80; }
+.cm-s-erlang-dark span.cm-meta       { color: #50fefe; }
+.cm-s-erlang-dark span.cm-number     { color: #ffd0d0; }
+.cm-s-erlang-dark span.cm-operator   { color: #dd1111; }
+.cm-s-erlang-dark span.cm-string     { color: #3ad900; }
+.cm-s-erlang-dark span.cm-tag        { color: #9effff; }
+.cm-s-erlang-dark span.cm-variable   { color: #50fe50; }
+.cm-s-erlang-dark span.cm-variable-2 { color: #ee00ee; }
diff --git a/interface/codemirror/theme/lesser-dark.css b/interface/codemirror/theme/lesser-dark.css
new file mode 100755
index 0000000..5274545
--- /dev/null
+++ b/interface/codemirror/theme/lesser-dark.css
@@ -0,0 +1,45 @@
+/*
+http://lesscss.org/ dark theme
+Ported to CodeMirror by Peter Kroon
+*/
+.CodeMirror{
+  line-height: 15px;
+}
+.cm-s-lesser-dark {
+  font-family: 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Monaco', Courier, monospace !important;
+  font-size:12px;
+}
+
+.cm-s-lesser-dark { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; }
+.cm-s-lesser-dark div.CodeMirror-selected {background: #45443B !important;} /* 33322B*/
+.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white !important; }
+.cm-s-lesser-dark .CodeMirror-lines { margin-left:3px; margin-right:3px; }/*editable code holder*/
+
+div.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/
+
+.cm-s-lesser-dark .CodeMirror-gutter { background: #262626; border-right:1px solid #aaa; padding-right:3px; min-width:2.5em; }
+.cm-s-lesser-dark .CodeMirror-gutter-text { color: #777; }
+
+.cm-s-lesser-dark span.cm-keyword { color: #599eff; }
+.cm-s-lesser-dark span.cm-atom { color: #C2B470; }
+.cm-s-lesser-dark span.cm-number { color: #B35E4D; }
+.cm-s-lesser-dark span.cm-def {color: white;}
+.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; }
+.cm-s-lesser-dark span.cm-variable-2 { color: #669199; }
+.cm-s-lesser-dark span.cm-variable-3 { color: white; }
+.cm-s-lesser-dark span.cm-property {color: #92A75C;}
+.cm-s-lesser-dark span.cm-operator {color: #92A75C;}
+.cm-s-lesser-dark span.cm-comment { color: #666; }
+.cm-s-lesser-dark span.cm-string { color: #BCD279; }
+.cm-s-lesser-dark span.cm-string-2 {color: #f50;}
+.cm-s-lesser-dark span.cm-meta { color: #738C73; }
+.cm-s-lesser-dark span.cm-error { color: #9d1e15; }
+.cm-s-lesser-dark span.cm-qualifier {color: #555;}
+.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; }
+.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; }
+.cm-s-lesser-dark span.cm-tag { color: #669199; }
+.cm-s-lesser-dark span.cm-attribute {color: #00c;}
+.cm-s-lesser-dark span.cm-header {color: #a0a;}
+.cm-s-lesser-dark span.cm-quote {color: #090;}
+.cm-s-lesser-dark span.cm-hr {color: #999;}
+.cm-s-lesser-dark span.cm-link {color: #00c;}
diff --git a/interface/codemirror/theme/monokai.css b/interface/codemirror/theme/monokai.css
new file mode 100755
index 0000000..f01d066
--- /dev/null
+++ b/interface/codemirror/theme/monokai.css
@@ -0,0 +1,28 @@
+/* Based on Sublime Text's Monokai theme */
+
+.cm-s-monokai {background: #272822; color: #f8f8f2;}
+.cm-s-monokai div.CodeMirror-selected {background: #49483E !important;}
+.cm-s-monokai .CodeMirror-gutter {background: #272822; border-right: 0px;}
+.cm-s-monokai .CodeMirror-gutter-text {color: #d0d0d0;}
+.cm-s-monokai .CodeMirror-cursor {border-left: 1px solid #f8f8f0 !important;}
+
+.cm-s-monokai span.cm-comment {color: #75715e;}
+.cm-s-monokai span.cm-atom {color: #ae81ff;}
+.cm-s-monokai span.cm-number {color: #ae81ff;}
+
+.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute {color: #a6e22e;}
+.cm-s-monokai span.cm-keyword {color: #f92672;}
+.cm-s-monokai span.cm-string {color: #e6db74;}
+
+.cm-s-monokai span.cm-variable {color: #a6e22e;}
+.cm-s-monokai span.cm-variable-2 {color: #9effff;}
+.cm-s-monokai span.cm-def {color: #fd971f;}
+.cm-s-monokai span.cm-error {background: #f92672; color: #f8f8f0;}
+.cm-s-monokai span.cm-bracket {color: #f8f8f2;}
+.cm-s-monokai span.cm-tag {color: #f92672;}
+.cm-s-monokai span.cm-link {color: #ae81ff;}
+
+.cm-s-monokai .CodeMirror-matchingbracket {
+  text-decoration: underline;
+  color: white !important;
+}
diff --git a/interface/codemirror/theme/neat.css b/interface/codemirror/theme/neat.css
new file mode 100755
index 0000000..8a307f8
--- /dev/null
+++ b/interface/codemirror/theme/neat.css
@@ -0,0 +1,9 @@
+.cm-s-neat span.cm-comment { color: #a86; }
+.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; }
+.cm-s-neat span.cm-string { color: #a22; }
+.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; }
+.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; }
+.cm-s-neat span.cm-variable { color: black; }
+.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; }
+.cm-s-neat span.cm-meta {color: #555;}
+.cm-s-neat span.cm-link { color: #3a3; }
diff --git a/interface/codemirror/theme/night.css b/interface/codemirror/theme/night.css
new file mode 100755
index 0000000..3b296e4
--- /dev/null
+++ b/interface/codemirror/theme/night.css
@@ -0,0 +1,21 @@
+/* Loosely based on the Midnight Textmate theme */
+
+.cm-s-night { background: #0a001f; color: #f8f8f8; }
+.cm-s-night div.CodeMirror-selected { background: #a8f !important; }
+.cm-s-night .CodeMirror-gutter { background: #0a001f; border-right: 1px solid #aaa; }
+.cm-s-night .CodeMirror-gutter-text { color: #f8f8f8; }
+.cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; }
+
+.cm-s-night span.cm-comment { color: #6900a1; }
+.cm-s-night span.cm-atom { color: #845dc4; }
+.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; }
+.cm-s-night span.cm-keyword { color: #599eff; }
+.cm-s-night span.cm-string { color: #37f14a; }
+.cm-s-night span.cm-meta { color: #7678e2; }
+.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; }
+.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; }
+.cm-s-night span.cm-error { color: #9d1e15; }
+.cm-s-night span.cm-bracket { color: #8da6ce; }
+.cm-s-night span.cm-comment { color: #6900a1; }
+.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; }
+.cm-s-night span.cm-link { color: #845dc4; }
diff --git a/interface/codemirror/theme/rubyblue.css b/interface/codemirror/theme/rubyblue.css
new file mode 100755
index 0000000..502817a
--- /dev/null
+++ b/interface/codemirror/theme/rubyblue.css
@@ -0,0 +1,21 @@
+.cm-s-rubyblue { font:13px/1.4em Trebuchet, Verdana, sans-serif; }	/* - customized editor font - */
+
+.cm-s-rubyblue { background: #112435; color: white; }
+.cm-s-rubyblue div.CodeMirror-selected { background: #38566F !important; }
+.cm-s-rubyblue .CodeMirror-gutter { background: #1F4661; border-right: 7px solid #3E7087; min-width:2.5em; }
+.cm-s-rubyblue .CodeMirror-gutter-text { color: white; }
+.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white !important; }
+
+.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; }
+.cm-s-rubyblue span.cm-atom { color: #F4C20B; }
+.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; }
+.cm-s-rubyblue span.cm-keyword { color: #F0F; }
+.cm-s-rubyblue span.cm-string { color: #F08047; }
+.cm-s-rubyblue span.cm-meta { color: #F0F; }
+.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; }
+.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; }
+.cm-s-rubyblue span.cm-error { color: #AF2018; }
+.cm-s-rubyblue span.cm-bracket { color: #F0F; }
+.cm-s-rubyblue span.cm-link { color: #F4C20B; }
+.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; }
+.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; }
diff --git a/interface/codemirror/theme/xq-dark.css b/interface/codemirror/theme/xq-dark.css
new file mode 100755
index 0000000..493e3a6
--- /dev/null
+++ b/interface/codemirror/theme/xq-dark.css
@@ -0,0 +1,46 @@
+/*
+Copyright (C) 2011 by MarkLogic Corporation
+Author: Mike Brevoort <mike at brevoort.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+.cm-s-xq-dark { background: #0a001f; color: #f8f8f8; }
+.cm-s-xq-dark span.CodeMirror-selected { background: #a8f !important; }
+.cm-s-xq-dark .CodeMirror-gutter { background: #0a001f; border-right: 1px solid #aaa; }
+.cm-s-xq-dark .CodeMirror-gutter-text { color: #f8f8f8; }
+.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; }
+
+.cm-s-xq-dark span.cm-keyword {color: #FFBD40;}
+.cm-s-xq-dark span.cm-atom {color: #6C8CD5;}
+.cm-s-xq-dark span.cm-number {color: #164;}
+.cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;}
+.cm-s-xq-dark span.cm-variable {color: #FFF;}
+.cm-s-xq-dark span.cm-variable-2 {color: #EEE;}
+.cm-s-xq-dark span.cm-variable-3 {color: #DDD;}
+.cm-s-xq-dark span.cm-property {}
+.cm-s-xq-dark span.cm-operator {}
+.cm-s-xq-dark span.cm-comment {color: gray;}
+.cm-s-xq-dark span.cm-string {color: #9FEE00;}
+.cm-s-xq-dark span.cm-meta {color: yellow;}
+.cm-s-xq-dark span.cm-error {color: #f00;}
+.cm-s-xq-dark span.cm-qualifier {color: #FFF700;}
+.cm-s-xq-dark span.cm-builtin {color: #30a;}
+.cm-s-xq-dark span.cm-bracket {color: #cc7;}
+.cm-s-xq-dark span.cm-tag {color: #FFBD40;}
+.cm-s-xq-dark span.cm-attribute {color: #FFF700;}
diff --git a/interface/css/images/checked.gif b/interface/css/images/checked.gif
new file mode 100755
index 0000000..fad5893
Binary files /dev/null and b/interface/css/images/checked.gif differ
diff --git a/interface/css/images/grid3-hd-btn.gif b/interface/css/images/grid3-hd-btn.gif
new file mode 100755
index 0000000..e0b5fec
Binary files /dev/null and b/interface/css/images/grid3-hd-btn.gif differ
diff --git a/interface/css/images/unchecked.gif b/interface/css/images/unchecked.gif
new file mode 100755
index 0000000..43823e5
Binary files /dev/null and b/interface/css/images/unchecked.gif differ
diff --git a/interface/css/main.css b/interface/css/main.css
new file mode 100755
index 0000000..b93fa6b
--- /dev/null
+++ b/interface/css/main.css
@@ -0,0 +1,636 @@
+body {
+    background: #fff;
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif !important;
+    /*font-family: tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif;*/
+    text-align:left !important;
+}
+
+.x-grid-checkheader {
+    height: 14px;
+    background-image: url('images/unchecked.gif');
+    background-position: 50% -2px;
+    background-repeat: no-repeat;
+    background-color: transparent;
+}
+
+.x-grid-checkheader-checked {
+    background-image: url('images/checked.gif');
+}
+
+.x-grid-checkheader-editor .x-form-cb-wrap {
+    text-align: center;
+}
+
+.mainHeader {
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif, cursive;
+    color: white;
+    background-color: green;
+    background-image :url(../images/header.png); 
+    background-repeat: no-repeat;
+    background-position: top right;
+}
+.mainHeaderTitle {
+    font-weight: bold;
+    font-size: 24px;
+    color: white;
+    text-align: right;
+    padding-right: 10px;
+}
+.mainHeaderSubtitle {
+    font-size: 10px;
+}
+.mainHeaderTitleSmall {
+    font-weight: bold;
+    font-size: 10px;
+    color: white;
+    text-align: right;
+}
+.mainHeaderSubtitleSmall {
+    font-size: 8px;
+    color: white;
+}
+
+
+.submenu{
+    text-align: center;
+    color: darkolivegreen;
+    position: relative;
+    border-bottom: 4px transparent solid;
+
+}
+.submenuOver{
+    color: green;
+    text-align: center;
+    position: relative;
+    border-bottom: 5px grey solid;
+}
+.submenuSelect{
+    color: green;
+    text-align: center;
+    position: relative;
+    border-bottom: 5px green solid;
+}
+
+.submenuContent{
+    position: absolute;
+    bottom: 6;
+    text-align: center;
+    width: 100%;
+}
+.submenuIcon{
+    position: absolute;
+    top: 0;
+    text-align: center;
+    width: 100%;
+}
+
+.softLink {
+    color: blue;
+    text-decoration: underline;
+    cursor: pointer;
+    font-size: inherit;
+}
+
+.softLink:hover {
+    color: red; 
+    text-decoration: underline;
+    cursor: pointer;
+    font-size: inherit; 
+}
+
+.mainFooter {
+    font-weight: bold !important;
+    font-size: 10px !important;
+    color: white !important;
+    /*background-color: green !important;*/
+    text-align: center;
+
+
+    background: #008000 !important;
+    background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjN2Q3ZTdkIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3 [...]
+    background: -moz-linear-gradient(-45deg,  #008000 0%, #0e0e0e 100%) !important;
+    background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#008000), color-stop(100%,#0e0e0e)) !important;
+    background: -webkit-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: -o-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: -ms-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: linear-gradient(135deg,  #008000 0%,#0e0e0e 100%) !important;
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#008000', endColorstr='#0e0e0e',GradientType=1 ) !important;
+
+}
+
+.menuHead {
+    /*font-family: 'Patrick Hand', cursive;*/
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif, cursive;
+    font-weight: bold;
+    font-size: 18px;
+    color: green;
+}
+
+.menuLink {
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif, cursive;
+    font-size: 16px;
+    color: green;
+    text-decoration: underline;
+    cursor: pointer;
+}
+
+.service_menu {
+    background-image: url(../images/icon/libreoffice-extension.png) !important;
+    background-repeat: no-repeat !important;
+}
+
+.tab_db {
+    background-image:url(../images/icon/server.png) !important;
+}
+.btn_border {
+    background-image:url(../images/icon/btn_border.png) !important;
+}
+.btn_border_hover {
+    background-image:url(../images/icon/btn_border_hover.png) !important;
+}
+
+.centerTitle {
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif;
+    font-weight: bold;
+    font-size: 18px;
+    color: white !important;
+    text-align: center;
+    border: 5px black solid !important;
+    /*border-right: 0;
+    border-bottom: 0;
+    border-top: 5px black solid !important;
+    border-left: 0;*/
+    background-color: green !important;
+}
+
+.centerBody {
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif;
+    font-size: 16px;
+    color: green;
+    border-right: 0;
+    border-bottom: 0;
+    border-color: green;
+}
+
+.x-form-item {
+    font-family: inherit;
+    font-size: inherit;
+    color: inherit;
+    /*border-right: inherit;
+    border-bottom: inherit;*/
+    border-color: inherit;
+}
+
+.x-fieldset-header {
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif !important;
+    font-size: 11px !important;
+    color: green;
+}
+.x-fieldset {
+    border: 1px solid green !important;
+}
+
+/*ACCORDATION CSS*/
+.x-accordion-hd {
+    background: none repeat scroll 0 0 GREEN !important;
+    box-shadow: 0 0 0 0 #D9E7F8 inset;
+}
+.x-panel-header-text-default {
+    color: WHITE !important;
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif !important;
+    font-size: 14px !important;
+    font-weight: bold;
+}
+.x-panel-collapsed .x-window-header-default, .x-panel-collapsed .x-panel-header-default {
+    border-color: BLACK !important;
+}
+
+/*.x-panel-header-default {
+    background-color: GREEN !important;
+    background-image: -moz-linear-gradient(center top , #DAE7F6, #CDDEF3 45%, #ABC7EC 46%, #ABC7EC 50%, #B8CFEE 51%, #CBDDF3) !important;
+    border-color: black !important;
+    border-style: solid !important;
+    border-width: 1px !important;
+    box-shadow: 0 1px 0 0 black inset !important;
+    font-size: 11px !important;
+    line-height: 15px !important;
+}*/
+
+.x-panel-header-default {
+    font-size: 11px !important;
+    line-height: 15px !important;
+    
+    border-color: GREEN !important;
+    border-width: 0px !important;
+    border-style: solid !important;
+    /*background-image: none !important;
+    background-color: GREEN !important;*/
+
+    background: #008000 !important;
+    background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjN2Q3ZTdkIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3 [...]
+    background: -moz-linear-gradient(-45deg,  #008000 0%, #0e0e0e 100%) !important;
+    background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#008000), color-stop(100%,#0e0e0e)) !important;
+    background: -webkit-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: -o-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: -ms-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: linear-gradient(135deg,  #008000 0%,#0e0e0e 100%) !important;
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#008000', endColorstr='#0e0e0e',GradientType=1 ) !important;
+
+}
+
+/*LOADING MASK CSS*/
+.x-mask-msg {
+    background-color: GREEN !important;
+    border: 1px solid GREEN !important;
+}
+.x-mask-msg div {
+    background-color: white;
+    background-image: url("../images/icon/loading_white.gif");
+    background-position: 5px center;
+    background-repeat: no-repeat;
+    border: 1px solid white;
+    color: black;
+    cursor: wait;
+    font: 14px 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif !important;
+}
+
+/*COLORE GENERALE DELLO SFONDO*/
+.x-border-layout-ct {
+    background-color: green !important;
+}
+
+
+.x-toolbar-default {
+    border: 0px !important;
+    border-color: black !important;
+    background-image: none !important;
+    /*background-color: green !important;*/
+
+    background: #008000 !important;
+    background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjN2Q3ZTdkIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3 [...]
+    background: -moz-linear-gradient(-45deg,  #008000 0%, #0e0e0e 100%) !important;
+    background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#008000), color-stop(100%,#0e0e0e)) !important;
+    background: -webkit-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: -o-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: -ms-linear-gradient(-45deg,  #008000 0%,#0e0e0e 100%) !important;
+    background: linear-gradient(135deg,  #008000 0%,#0e0e0e 100%) !important;
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#008000', endColorstr='#0e0e0e',GradientType=1 ) !important;
+
+}
+
+.x-btn-default-toolbar-small-menu-active, .x-btn-default-toolbar-small-pressed {
+    border-color: green !important;
+    background-image: none !important;
+    background-color: green !important;
+    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #19ab19), color-stop(48%, #20b320), color-stop(52%, #119511), color-stop(100%, #008000));
+    background-image: -webkit-linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    background-image: -moz-linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    background-image: -o-linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    background-image: -ms-linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    background-image: linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+}
+/*
+.x-btn-inner {
+    color: white !important;
+}*/
+
+.x-grid-header-ct {
+    border: 1px solid green !important;
+}
+.x-panel .x-grid-body {
+    border-color: green !important;
+}
+.x-column-header {
+    font: 11px 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif !important;
+}
+
+
+.x-grid-row-selected .x-grid-cell, .x-grid-row-selected .x-grid-rowwrap-div {
+    border-color: green !important;
+    background-color: #c2e8b8 !important;
+}
+
+.x-panel-default {
+    border-color: green !important;
+}
+
+
+.x-window-default {
+    background-color: green !important;
+}
+.x-window-header-text-default {
+    color: white !important;
+    font-family: 'Electrolize', sans-serif, tahoma, arial, verdana, sans-serif !important;
+}
+.x-message-box .x-window-body {
+    background-color: white !important;
+}
+.x-window-header-default-top {
+    background-color: green !important;
+}
+
+.x-btn-default-small-focus {
+    background-color: green !important;
+    background-image: none !important;
+    background-color: white !important;
+    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, white), color-stop(48%, #F9F9F9), color-stop(52%, #E2E2E2), color-stop(100%, #E7E7E7)) !important;
+    background-image: -moz-linear-gradient(top, white,#F9F9F9 48%,#E2E2E2 52%,#E7E7E7) !important;
+    background-image: linear-gradient(top, white,#F9F9F9 48%,#E2E2E2 52%,#E7E7E7) !important;
+}
+.x-btn-default-small-over {
+    background-color: green !important;
+    background-image: none !important;
+    background-color: white !important;
+    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, white), color-stop(48%, #F9F9F9), color-stop(52%, #E2E2E2), color-stop(100%, #E7E7E7)) !important;
+    background-image: -moz-linear-gradient(top, white,#F9F9F9 48%,#E2E2E2 52%,#E7E7E7) !important;
+    background-image: linear-gradient(top, white,#F9F9F9 48%,#E2E2E2 52%,#E7E7E7) !important;
+}
+
+.x-panel-body-default {
+    background: whitesmoke;
+    border-color: green !important;
+    color: black;
+    border-width: 1px;
+    border-style: solid;
+}
+
+
+
+.x-tab-bar {
+    background-color: transparent !important;
+    background-image: none;
+    /*background-color: green;
+    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #19ab19), color-stop(48%, #20b320), color-stop(52%, #119511), color-stop(100%, #008000));
+    background-image: -webkit-linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    background-image: -moz-linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    background-image: -o-linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    background-image: -ms-linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    background-image: linear-gradient(top, #19ab19,#20b320 48%,#119511 52%,#008000);
+    font-size: 11px;*/
+}
+
+.x-tab-inner {
+    font-family: 'Electrolize', sans-serif, Tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif !important;
+    color: white !important;
+}
+.x-tab-bar-body-default-plain {
+    background-color: white !important;
+}
+.x-tab-default-top {
+    background-color: grey !important;
+    background-image: none !important;
+}
+.x-tab-bar-body {
+    border-color: transparent !important;
+}
+.x-tab-top-active {
+    background-color: green !important;
+}
+.x-tab {
+    border-color: black !important;
+}
+.x-tab-default-top {
+    -moz-box-shadow: green 0 0 0 0 inset, green 0 0 0 0 inset, green 0 0 0 0 inset !important;
+    -webkit-box-shadow: green 0 0 0 0 inset, green 0 0 0 0 inset, green 0 0 0 0 inset !important;
+    -o-box-shadow: green 0 0 0 0 inset, green 0 0 0 0 inset, green 0 0 0 0 inset !important;
+    box-shadow: green 0px 0px 0px 0px inset, green 0px 0px 0px 0px inset, green 0px 0px 0px 0px inset !important;
+    border-bottom: 0px solid green !important;
+}
+.x-tab-bar-strip-default, .x-tab-bar-strip-default-plain {
+    border-color: green !important;
+    background-color: green !important;
+}
+
+.x-btn-default-small .x-btn-inner {
+    color: white !important;
+}
+
+.x-btn-default-small {
+    background-color: green !important;
+    background-image: none !important;
+    border-radius: 5px 5px 5px 5px !important;
+}
+
+.x-btn-inner {
+    font-family: 'Electrolize', sans-serif, tahoma, "Lucida Sans Unicode", "Lucida Grande", Verdana, sans-serif !important;
+    font-size: 16px !important;
+}
+
+.x-btn-group-default-framed {
+    background-color: white !important;
+}
+
+.x-btn-default-toolbar-small {
+    border-color: #cbcbcb !important;
+    border-radius: 5px 5px 5px 5px !important;
+}
+
+.x-btn-default-toolbar-small .x-btn-inner {
+    color: white !important;
+}
+
+.x-btn-default-toolbar-small-over {
+    background-color: green !important;
+    background-image:  none  !important;
+    border-color: white !important;
+    border-radius: 5px 5px 5px 5px !important;
+}
+.x-btn-default-toolbar-small-focus {
+    background-color: green !important;
+    background-image:  none  !important;
+    border-color: white !important;
+    border-radius: 5px 5px 5px 5px !important;
+}
+.x-btn-default-toolbar-small-menu-active, .x-btn-default-toolbar-small-pressed {
+    background-color: grey !important;
+    background-image:  none  !important;
+    border-color: black !important;
+    border-radius: 5px 5px 5px 5px !important;
+}
+
+.x-btn-default-small-over {
+    background-color: grey !important;
+    background-image:  none  !important;
+    border-color: white !important;
+    border-radius: 5px 5px 5px 5px !important;
+}
+.x-btn-default-small-focus {
+    background-color: green !important;
+    background-image: none  !important;
+    border-color: white !important;
+    border-radius: 5px 5px 5px 5px !important;
+}
+.x-btn-default-small-menu-active, .x-btn-default-small-pressed {
+    background-color: black !important;
+    background-image: none  !important;
+    border-color: green !important;
+    border-radius: 5px 5px 5px 5px !important;
+}
+
+.x-menu-body {
+    background: white !important;
+}
+
+.x-menu-item-active .x-menu-item-link {
+    background-color: lightgrey !important;
+    background-image: none !important;     
+    border: 1px solid green !important;
+    /*background-image: -moz-linear-gradient(center top , #E7F0FC, #C7DDF9);
+    border: 1px solid #A9CBF5;
+    border-radius: 3px 3px 3px 3px;
+    cursor: pointer;
+    margin: 0;*/
+}
+
+
+#chartCnt {
+    position: absolute;
+    left: 0px;
+    right: 0px;
+    top: 0px;
+    bottom: 0px;
+}
+
+.x-fieldset {
+    border-radius: 5px 5px 5px 5px !important;
+}
+
+.CodeMirror {
+    font-size: 14px !important;
+}
+
+.codemirror-scroll {
+    overflow: auto !important;
+}
+
+.x-tip {
+    background-color: white !important;
+}
+
+.x-tip {
+    border-color: green !important;
+}
+
+
+.x-datepicker-header {
+    position: relative;
+    height: 26px;
+    background-image: none;
+    background-color: green !important;
+}
+
+.x-datepicker-footer, .x-monthpicker-buttons {
+    position: relative;
+    border-top: 1px solid green;
+    background-image: none;
+    background-color: #00A800;
+}
+
+.x-datepicker {
+    border: 1px solid black !important;
+}
+
+table.x-datepicker-inner th {
+    color: white !important;
+    border-bottom: 1px solid black !important;
+    background-image: none !important;
+    background-color: #00A800 !important;
+}
+table.x-datepicker-inner .x-datepicker-selected a {
+    background-color: #00A800 !important;
+    border: 1px solid black !important;
+    color: white !important;
+}
+
+.x-form-text, textarea.x-form-field {
+    border-color: #00A800 !important;
+}
+
+.x-boundlist-item-over{
+    background: green !important;
+    border-color: lightgrey !important;
+    color: white !important;
+}
+
+.x-boundlist {
+    border-color: green !important;
+}
+
+.x-boundlist-selected {
+    background: #00A800 !important;
+    border-color: green !important;
+}
+
+/*.dygraph-ylabel { 
+    font-size: 18px; 
+    text-shadow: gray -2px 2px 2px; 
+    height: 40px;
+}*/
+
+.dygraph-axis-label-x{
+    height: 30px;
+}
+
+.pchooserBtnVisible {
+    position: absolute;
+    left: 5px;
+    top: 2px;
+    width: 16px;
+    height: 16px;
+    background-image :url(../images/eye.png);
+    background-repeat: no-repeat;
+    background-position: center center;
+    cursor: pointer;
+} 
+.pchooserBtnNotVisible {
+    background-image :url(../images/forbidden.png) !important;
+    background-repeat: no-repeat;
+    background-position: center center;
+} 
+
+.pchooserBtnColor {
+    position: absolute;
+    right: 26px;
+    top: 3px;
+    width: 16px;
+    height: 16px;
+    cursor: pointer;
+    border: thin solid whitesmoke;
+} 
+.pchooserBtnRemove {
+    position: absolute;
+    right: 8px;
+    top: 3px;
+    width: 16px;
+    height: 16px;
+    font-size: 14;
+    font-weight: bolder;
+    cursor: pointer;
+} 
+
+.pchooser {
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    margin-bottom: 10px; 
+    border: thin solid green; 
+    width: 100%;
+    font-family: monospace;
+}
+
+/*.pchooser td {
+    padding: 2px 4px 2px 4px;    
+}*/
+
+.viewerChart {
+    background-image :url(../images/istsos-logo.png);
+    background-repeat: no-repeat;
+    background-position: center center;
+}
+
+
+.x-toolbar .x-toolbar-text {
+    color: white !important;
+}
+
+
diff --git a/interface/data/observations.json b/interface/data/observations.json
new file mode 100755
index 0000000..1f15ce5
--- /dev/null
+++ b/interface/data/observations.json
@@ -0,0 +1,98 @@
+{
+    "success": true,
+    "total": 23,
+    "data": [
+    {
+        "isodate": "2012-01-01T00:00:00.000000+0100",
+        "value": 2
+    },
+    {
+        "isodate": "2012-01-01T01:00:00.000000+0100",
+        "value": 1
+    },
+    {
+        "isodate": "2012-01-01T02:00:00.000000+0100",
+        "value": 3
+    },
+    {
+        "isodate": "2012-01-01T03:00:00.000000+0100",
+        "value": 4
+    },
+    {
+        "isodate": "2012-01-01T04:00:00.000000+0100",
+        "value": 5.2
+    },
+    {
+        "isodate": "2012-01-01T05:00:00.000000+0100",
+        "value": 3.5453
+    },
+    {
+        "isodate": "2012-01-01T06:00:00.000000+0100",
+        "value": 3.4
+    },
+    {
+        "isodate": "2012-01-01T07:00:00.000000+0100",
+        "value": 3.1243
+    },
+    {
+        "isodate": "2012-01-01T08:00:00.000000+0100",
+        "value": 6.4
+    },
+    {
+        "isodate": "2012-01-01T09:00:00.000000+0100",
+        "value": 3.4
+    },
+    {
+        "isodate": "2012-01-01T10:00:00.000000+0100",
+        "value": 5.4
+    },
+    {
+        "isodate": "2012-01-01T11:00:00.000000+0100",
+        "value": 2.6
+    },
+    {
+        "isodate": "2012-01-01T12:00:00.000000+0100",
+        "value": 5.2
+    },
+    {
+        "isodate": "2012-01-01T13:00:00.000000+0100",
+        "value": 0
+    },
+    {
+        "isodate": "2012-01-01T14:00:00.000000+0100",
+        "value": 0
+    },
+    {
+        "isodate": "2012-01-01T15:00:00.000000+0100",
+        "value": 0
+    },
+    {
+        "isodate": "2012-01-01T16:00:00.000000+0100",
+        "value": 0
+    },
+    {
+        "isodate": "2012-01-01T17:00:00.000000+0100",
+        "value": 5.2
+    },
+    {
+        "isodate": "2012-01-01T18:00:00.000000+0100",
+        "value": 3.5453
+    },
+    {
+        "isodate": "2012-01-01T19:00:00.000000+0100",
+        "value": 3.4
+    },
+    {
+        "isodate": "2012-01-01T20:00:00.000000+0100",
+        "value": 3.1243
+    },
+    {
+        "isodate": "2012-01-01T21:00:00.000000+0100",
+        "value": 6.4
+    },
+    {
+        "isodate": "2012-01-01T22:00:00.000000+0100",
+        "value": 1.4
+    }
+    ]
+}
\ No newline at end of file
diff --git a/interface/data/observedproperties.json b/interface/data/observedproperties.json
new file mode 100755
index 0000000..5496b31
--- /dev/null
+++ b/interface/data/observedproperties.json
@@ -0,0 +1,12 @@
+{
+    "success": true,
+    "total": 2,
+    "data": [
+        {
+            "name": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall"
+        },
+        {
+            "name": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature"
+        }
+    ]
+}
diff --git a/interface/data/offerings.json b/interface/data/offerings.json
new file mode 100755
index 0000000..bf6a545
--- /dev/null
+++ b/interface/data/offerings.json
@@ -0,0 +1,12 @@
+{
+    "success": true,
+    "total": 2,
+    "data": [
+        {
+            "name": "temporary"
+        },
+        {
+            "name": "rain"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/interface/data/procedures.json b/interface/data/procedures.json
new file mode 100755
index 0000000..44983b7
--- /dev/null
+++ b/interface/data/procedures.json
@@ -0,0 +1,12 @@
+{
+    "success": true,
+    "total": 2,
+    "data": [
+        {
+            "name": "T_TRE"
+        },
+        {
+            "name": "P_TRE"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/interface/designer.html b/interface/designer.html
new file mode 100755
index 0000000..a866ed9
--- /dev/null
+++ b/interface/designer.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+
+<!-- Auto Generated with Ext Designer -->
+<!-- Modifications to this file will be overwritten. -->
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>istsos.xds</title>
+    <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css"/>
+    <script type="text/javascript" src="ext/ext-all-debug.js"></script>
+    <script type="text/javascript" src="designer.js"></script>
+</head>
+<body></body>
+</html>
\ No newline at end of file
diff --git a/interface/designer.js b/interface/designer.js
new file mode 100755
index 0000000..0ac1835
--- /dev/null
+++ b/interface/designer.js
@@ -0,0 +1,191 @@
+/*
+ * File: designer.js
+ * Date: Tue Jan 28 2014 17:15:56 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.3.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.Loader.setConfig({
+    enabled: true
+});
+
+Ext.application({
+    name: 'istsos',
+
+    stores: [
+        'DataQualityStore',
+        'Offerings',
+        'Procedures',
+        'ObservedProperties',
+        'Observations',
+        'serverstatus',
+        'Fake',
+        'Constraint',
+        'cmbIdentification',
+        'cmbSml',
+        'gridOutputs',
+        'cmbSystemType',
+        'cmbName',
+        'cmbNameDescription',
+        'Services',
+        'gridDocumentation',
+        'cmbDocumentFormat',
+        'gridProceduresList',
+        'vplist',
+        'gridObservedProperties',
+        'gridUoms',
+        'gridOfferings',
+        'MyArrayStore',
+        'RatingCurve'
+    ],
+
+    launch: function() {
+        Ext.QuickTips.init();
+
+        var cmp1 = Ext.create('istsos.view.MainPanel', {
+            renderTo: Ext.getBody()
+        });
+        cmp1.show();
+        var cmp2 = Ext.create('istsos.view.BasePage', {
+            renderTo: Ext.getBody()
+        });
+        cmp2.show();
+        var cmp3 = Ext.create('istsos.view.contactinfo', {
+            renderTo: Ext.getBody()
+        });
+        cmp3.show();
+        var cmp4 = Ext.create('istsos.view.paths', {
+            renderTo: Ext.getBody()
+        });
+        cmp4.show();
+        var cmp5 = Ext.create('istsos.view.about', {
+            renderTo: Ext.getBody()
+        });
+        cmp5.show();
+        var cmp6 = Ext.create('istsos.view.contacts', {
+            renderTo: Ext.getBody()
+        });
+        cmp6.show();
+        var cmp7 = Ext.create('istsos.view.identification', {
+            renderTo: Ext.getBody()
+        });
+        cmp7.show();
+        var cmp8 = Ext.create('istsos.view.provider', {
+            renderTo: Ext.getBody()
+        });
+        cmp8.show();
+        var cmp9 = Ext.create('istsos.view.config', {
+            renderTo: Ext.getBody()
+        });
+        cmp9.show();
+        var cmp10 = Ext.create('istsos.view.geo', {
+            renderTo: Ext.getBody()
+        });
+        cmp10.show();
+        var cmp11 = Ext.create('istsos.view.getobservation', {
+            renderTo: Ext.getBody()
+        });
+        cmp11.show();
+        var cmp12 = Ext.create('istsos.view.database', {
+            renderTo: Ext.getBody()
+        });
+        cmp12.show();
+        var cmp13 = Ext.create('istsos.view.serviceurl', {
+            renderTo: Ext.getBody()
+        });
+        cmp13.show();
+        var cmp14 = Ext.create('istsos.view.procedure', {
+            renderTo: Ext.getBody()
+        });
+        cmp14.show();
+        var cmp15 = Ext.create('istsos.view.newservice', {
+            renderTo: Ext.getBody()
+        });
+        cmp15.show();
+        var cmp16 = Ext.create('istsos.view.FormDataQuality', {
+            renderTo: Ext.getBody()
+        });
+        cmp16.show();
+        var cmp17 = Ext.create('istsos.view.ObservationEditor', {
+            renderTo: Ext.getBody()
+        });
+        cmp17.show();
+        var cmp18 = Ext.create('istsos.view.ObservationEditorColumn', {
+            renderTo: Ext.getBody()
+        });
+        cmp18.show();
+        var cmp19 = Ext.create('istsos.view.serviceconfig', {
+            renderTo: Ext.getBody()
+        });
+        cmp19.show();
+        var cmp20 = Ext.create('istsos.view.status', {
+            renderTo: Ext.getBody()
+        });
+        cmp20.show();
+        var cmp21 = Ext.create('istsos.view.proceduresList', {
+            renderTo: Ext.getBody()
+        });
+        cmp21.show();
+        var cmp22 = Ext.create('istsos.view.obsPropEditor', {
+            renderTo: Ext.getBody()
+        });
+        cmp22.show();
+        var cmp23 = Ext.create('istsos.view.uomsEditor', {
+            renderTo: Ext.getBody()
+        });
+        cmp23.show();
+        var cmp24 = Ext.create('istsos.view.qualityindexEditor', {
+            renderTo: Ext.getBody()
+        });
+        cmp24.show();
+        var cmp25 = Ext.create('istsos.view.serviceEditor', {
+            renderTo: Ext.getBody()
+        });
+        cmp25.show();
+        var cmp26 = Ext.create('istsos.view.offeringsEditor', {
+            renderTo: Ext.getBody()
+        });
+        cmp26.show();
+        var cmp27 = Ext.create('istsos.view.MainMenu2', {
+            renderTo: Ext.getBody()
+        });
+        cmp27.show();
+        var cmp28 = Ext.create('istsos.view.ObservationEditorAdvancedOperations', {
+            renderTo: Ext.getBody()
+        });
+        cmp28.show();
+        var cmp29 = Ext.create('istsos.view.Calc', {
+            renderTo: Ext.getBody()
+        });
+        cmp29.show();
+        var cmp30 = Ext.create('istsos.view.CheckColumn', {
+            renderTo: Ext.getBody()
+        });
+        cmp30.show();
+        var cmp31 = Ext.create('istsos.view.ChartContainer', {
+            renderTo: Ext.getBody()
+        });
+        cmp31.show();
+        var cmp32 = Ext.create('istsos.view.TestCsv', {
+            renderTo: Ext.getBody()
+        });
+        cmp32.show();
+        var cmp33 = Ext.create('istsos.view.Viewer', {
+            renderTo: Ext.getBody()
+        });
+        cmp33.show();
+        var cmp34 = Ext.create('istsos.view.Editor1', {
+            renderTo: Ext.getBody()
+        });
+        cmp34.show();
+        var cmp35 = Ext.create('istsos.view.VirtualProcedureEditor', {
+            renderTo: Ext.getBody()
+        });
+        cmp35.show();
+    }
+});
diff --git a/interface/designer_includeOrder.txt b/interface/designer_includeOrder.txt
new file mode 100755
index 0000000..37b1fa2
--- /dev/null
+++ b/interface/designer_includeOrder.txt
@@ -0,0 +1,106 @@
+<script type="text/javascript" src="app/view/ui/MainPanel.js"></script>
+<script type="text/javascript" src="app/view/MainPanel.js"></script>
+<script type="text/javascript" src="app/view/ui/BasePage.js"></script>
+<script type="text/javascript" src="app/view/BasePage.js"></script>
+<script type="text/javascript" src="app/view/ui/contactinfo.js"></script>
+<script type="text/javascript" src="app/view/contactinfo.js"></script>
+<script type="text/javascript" src="app/view/ui/paths.js"></script>
+<script type="text/javascript" src="app/view/paths.js"></script>
+<script type="text/javascript" src="app/view/ui/about.js"></script>
+<script type="text/javascript" src="app/view/about.js"></script>
+<script type="text/javascript" src="app/view/ui/contacts.js"></script>
+<script type="text/javascript" src="app/view/contacts.js"></script>
+<script type="text/javascript" src="app/view/ui/identification.js"></script>
+<script type="text/javascript" src="app/view/identification.js"></script>
+<script type="text/javascript" src="app/view/ui/provider.js"></script>
+<script type="text/javascript" src="app/view/provider.js"></script>
+<script type="text/javascript" src="app/view/ui/config.js"></script>
+<script type="text/javascript" src="app/view/config.js"></script>
+<script type="text/javascript" src="app/view/ui/geo.js"></script>
+<script type="text/javascript" src="app/view/geo.js"></script>
+<script type="text/javascript" src="app/view/ui/getobservation.js"></script>
+<script type="text/javascript" src="app/view/getobservation.js"></script>
+<script type="text/javascript" src="app/view/ui/database.js"></script>
+<script type="text/javascript" src="app/view/database.js"></script>
+<script type="text/javascript" src="app/view/ui/serviceurl.js"></script>
+<script type="text/javascript" src="app/view/serviceurl.js"></script>
+<script type="text/javascript" src="app/view/ui/procedure.js"></script>
+<script type="text/javascript" src="app/view/procedure.js"></script>
+<script type="text/javascript" src="app/view/ui/newservice.js"></script>
+<script type="text/javascript" src="app/view/newservice.js"></script>
+<script type="text/javascript" src="app/view/ui/FormDataQuality.js"></script>
+<script type="text/javascript" src="app/view/FormDataQuality.js"></script>
+<script type="text/javascript" src="app/view/ui/ObservationEditor.js"></script>
+<script type="text/javascript" src="app/view/ObservationEditor.js"></script>
+<script type="text/javascript" src="app/view/ui/ObservationEditorColumn.js"></script>
+<script type="text/javascript" src="app/view/ObservationEditorColumn.js"></script>
+<script type="text/javascript" src="app/view/ui/serviceconfig.js"></script>
+<script type="text/javascript" src="app/view/serviceconfig.js"></script>
+<script type="text/javascript" src="app/view/ui/status.js"></script>
+<script type="text/javascript" src="app/view/status.js"></script>
+<script type="text/javascript" src="app/view/ui/proceduresList.js"></script>
+<script type="text/javascript" src="app/view/proceduresList.js"></script>
+<script type="text/javascript" src="app/view/ui/obsPropEditor.js"></script>
+<script type="text/javascript" src="app/view/obsPropEditor.js"></script>
+<script type="text/javascript" src="app/view/ui/uomsEditor.js"></script>
+<script type="text/javascript" src="app/view/uomsEditor.js"></script>
+<script type="text/javascript" src="app/view/ui/qualityindexEditor.js"></script>
+<script type="text/javascript" src="app/view/qualityindexEditor.js"></script>
+<script type="text/javascript" src="app/view/ui/serviceEditor.js"></script>
+<script type="text/javascript" src="app/view/serviceEditor.js"></script>
+<script type="text/javascript" src="app/view/ui/offeringsEditor.js"></script>
+<script type="text/javascript" src="app/view/offeringsEditor.js"></script>
+<script type="text/javascript" src="app/view/ui/MainMenu2.js"></script>
+<script type="text/javascript" src="app/view/MainMenu2.js"></script>
+<script type="text/javascript" src="app/view/ui/ObservationEditorAdvancedOperations.js"></script>
+<script type="text/javascript" src="app/view/ObservationEditorAdvancedOperations.js"></script>
+<script type="text/javascript" src="app/view/ui/Chart.js"></script>
+<script type="text/javascript" src="app/view/Chart.js"></script>
+<script type="text/javascript" src="app/view/ui/Calc.js"></script>
+<script type="text/javascript" src="app/view/Calc.js"></script>
+<script type="text/javascript" src="app/view/ui/CheckColumn.js"></script>
+<script type="text/javascript" src="app/view/CheckColumn.js"></script>
+<script type="text/javascript" src="app/view/ui/ChartContainer.js"></script>
+<script type="text/javascript" src="app/view/ChartContainer.js"></script>
+<script type="text/javascript" src="app/view/ui/TestCsv.js"></script>
+<script type="text/javascript" src="app/view/TestCsv.js"></script>
+<script type="text/javascript" src="app/view/ui/Viewer.js"></script>
+<script type="text/javascript" src="app/view/Viewer.js"></script>
+<script type="text/javascript" src="app/view/ui/Editor1.js"></script>
+<script type="text/javascript" src="app/view/Editor1.js"></script>
+<script type="text/javascript" src="app/view/ui/ProcedureChooser.js"></script>
+<script type="text/javascript" src="app/view/ProcedureChooser.js"></script>
+<script type="text/javascript" src="app/view/ui/ProcedurePlotter.js"></script>
+<script type="text/javascript" src="app/view/ProcedurePlotter.js"></script>
+<script type="text/javascript" src="app/view/ui/ProcedureChart.js"></script>
+<script type="text/javascript" src="app/view/ProcedureChart.js"></script>
+<script type="text/javascript" src="app/view/ui/ProcedureGrid.js"></script>
+<script type="text/javascript" src="app/view/ProcedureGrid.js"></script>
+<script type="text/javascript" src="app/view/ui/ProcedureGridEditor.js"></script>
+<script type="text/javascript" src="app/view/ProcedureGridEditor.js"></script>
+<script type="text/javascript" src="app/view/ui/VirtualProcedureEditor.js"></script>
+<script type="text/javascript" src="app/view/VirtualProcedureEditor.js"></script>
+<script type="text/javascript" src="app/store/DataQualityStore.js"></script>
+<script type="text/javascript" src="app/store/Offerings.js"></script>
+<script type="text/javascript" src="app/store/Procedures.js"></script>
+<script type="text/javascript" src="app/store/ObservedProperties.js"></script>
+<script type="text/javascript" src="app/store/Observations.js"></script>
+<script type="text/javascript" src="app/store/serverstatus.js"></script>
+<script type="text/javascript" src="app/store/Fake.js"></script>
+<script type="text/javascript" src="app/store/Constraint.js"></script>
+<script type="text/javascript" src="app/store/cmbIdentification.js"></script>
+<script type="text/javascript" src="app/store/cmbSml.js"></script>
+<script type="text/javascript" src="app/store/gridOutputs.js"></script>
+<script type="text/javascript" src="app/store/cmbSystemType.js"></script>
+<script type="text/javascript" src="app/store/cmbName.js"></script>
+<script type="text/javascript" src="app/store/cmbNameDescription.js"></script>
+<script type="text/javascript" src="app/store/Services.js"></script>
+<script type="text/javascript" src="app/store/gridDocumentation.js"></script>
+<script type="text/javascript" src="app/store/cmbDocumentFormat.js"></script>
+<script type="text/javascript" src="app/store/gridProceduresList.js"></script>
+<script type="text/javascript" src="app/store/vplist.js"></script>
+<script type="text/javascript" src="app/store/gridObservedProperties.js"></script>
+<script type="text/javascript" src="app/store/gridUoms.js"></script>
+<script type="text/javascript" src="app/store/gridOfferings.js"></script>
+<script type="text/javascript" src="app/store/MyArrayStore.js"></script>
+<script type="text/javascript" src="app/store/RatingCurve.js"></script>
diff --git a/interface/dev.html b/interface/dev.html
new file mode 100755
index 0000000..1dc3633
--- /dev/null
+++ b/interface/dev.html
@@ -0,0 +1,223 @@
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>istSOS webadmin developer page</title>
+        <link rel="stylesheet" type="text/css" href="ext-dev/resources/css/ext-all.css"/>
+        <link rel="stylesheet" type="text/css" href="css/main.css"/>
+
+        <link href='http://fonts.googleapis.com/css?family=Exo' rel='stylesheet' type='text/css'>
+        <!--
+        <link href='http://fonts.googleapis.com/css?family=Patrick+Hand' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Nova+Square' rel='stylesheet' type='text/css'>
+        -->
+        <script type="text/javascript" src="ext-dev/ext-all-debug.js"></script>
+
+        <script type="text/javascript" src="app/engine/wa.js"></script>
+        <script type="text/javascript" src="app/engine/pageConfig.js"></script>
+        <script type="text/javascript" src="app/engine/pageManager.js"></script>
+
+        <script type="text/javascript">
+            function ISO8601FromDate(isodate) {
+                function pad(n){return n<10 ? '0'+n : n}
+                var offset = isodate.getTimezoneOffset()/-60;
+                var tz = ((offset > 0) ? "+"+pad(offset) : pad(offset))
+                return isodate.getFullYear()+'-'
+                    + pad(isodate.getMonth()+1)+'-'
+                    + pad(isodate.getDate())+'T'
+                    + pad(isodate.getHours())+':'
+                    + pad(isodate.getMinutes())+':'
+                    + pad(isodate.getSeconds())+'.'
+                    + isodate.getMilliseconds() + tz;
+            }
+            String.prototype.capitalize = function(){
+                return this.toLowerCase().replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
+            };
+            Ext.override(Ext.layout.Layout, {
+                renderItem: function(item, target, position) {
+                    if (item && !item.rendered && item.isFieldLabelable && item.fieldLabel && item.allowBlank == false) {
+                        item.fieldLabel = '<span title="This is a mandatory parameter">' + item.fieldLabel + '<span style="color:red">*</span></span>';
+                    }
+                    this.callOverridden(arguments);
+                }
+            });
+            Ext.override(Ext.view.DropZone, {  
+                onNodeDrop: function (node, dragZone, e, data) {
+                    var me = this,
+                    dropHandled = false,
+                    dropHandlers = {
+                        wait : false,
+                        processDrop : function () {
+                            me.invalidateDrop();
+                            me.handleNodeDrop(data, me.overRecord, me.currentPosition);
+                            dropHandled = true;
+                            me.fireViewEvent('drop', node, data, me.overRecord, me.currentPosition);
+                        },
+                        cancelDrop : function () {
+                            me.invalidateDrop();
+                            dropHandled = true;
+                        }
+                    },
+                    performOperation = false;
+                    if (me.valid) {
+                        performOperation = me.fireViewEvent('beforedrop', node, data, me.overRecord, me.currentPosition, dropHandlers);
+                        if (dropHandlers.wait) {
+                            return;
+                        }
+                        if (performOperation !== false) {
+                            if (!dropHandled) {
+                                dropHandlers.processDrop();
+                            }
+                        }
+                    }
+                    return performOperation;
+                }
+            });
+        </script>
+
+        <!-- DEVELOPERS INCLUDE -->
+        <script type="text/javascript" src="app/view/ui/MainPanel.js"></script>
+        <script type="text/javascript" src="app/view/MainPanel.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/BasePage.js"></script>
+        <script type="text/javascript" src="app/view/BasePage.js"></script>
+        <script type="text/javascript" src="app/view/ui/CenterPage.js"></script>
+        <script type="text/javascript" src="app/view/ui/WizardPage.js"></script>
+
+
+        <script type="text/javascript" src="app/view/ui/BasePage.js"></script>
+        <script type="text/javascript" src="app/view/BasePage.js"></script>
+        <script type="text/javascript" src="app/view/ui/contactinfo.js"></script>
+        <script type="text/javascript" src="app/view/contactinfo.js"></script>
+        <script type="text/javascript" src="app/view/ui/paths.js"></script>
+        <script type="text/javascript" src="app/view/paths.js"></script>
+        <script type="text/javascript" src="app/view/ui/about.js"></script>
+        <script type="text/javascript" src="app/view/about.js"></script>
+        <script type="text/javascript" src="app/view/ui/contacts.js"></script>
+        <script type="text/javascript" src="app/view/contacts.js"></script>
+        <script type="text/javascript" src="app/view/ui/config.js"></script>
+        <script type="text/javascript" src="app/view/config.js"></script>
+        <script type="text/javascript" src="app/view/ui/database.js"></script>
+        <script type="text/javascript" src="app/view/database.js"></script>
+        <script type="text/javascript" src="app/view/ui/newservice.js"></script>
+        <script type="text/javascript" src="app/view/newservice.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/identification.js"></script>
+        <script type="text/javascript" src="app/view/identification.js"></script>
+        <script type="text/javascript" src="app/view/ui/provider.js"></script>
+        <script type="text/javascript" src="app/view/provider.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/FormDataQuality.js"></script>
+        <script type="text/javascript" src="app/view/FormDataQuality.js"></script>
+        <script type="text/javascript" src="app/store/DataQualityStore.js"></script>
+
+
+        <script type="text/javascript" src="app/store/DataQualityStore.js"></script>
+        <script type="text/javascript" src="app/store/Offerings.js"></script>
+        <script type="text/javascript" src="app/store/Procedures.js"></script>
+        <script type="text/javascript" src="app/store/ObservedProperties.js"></script>
+        <script type="text/javascript" src="app/store/Observations.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/ObservationEditorColumn.js"></script>
+        <script type="text/javascript" src="app/view/ObservationEditorColumn.js"></script>
+        <script type="text/javascript" src="app/view/ui/ObservationEditor.js"></script>
+        <script type="text/javascript" src="app/view/ObservationEditor.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/serviceconfig.js"></script>
+        <script type="text/javascript" src="app/view/serviceconfig.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/geo.js"></script>
+        <script type="text/javascript" src="app/view/geo.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/getobservation.js"></script>
+        <script type="text/javascript" src="app/view/getobservation.js"></script>
+
+        <script type="text/javascript" src="app/store/serverstatus.js"></script>
+
+
+        <script type="text/javascript" src="app/view/ui/status.js"></script>
+        <script type="text/javascript" src="app/view/status.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/serviceurl.js"></script>
+        <script type="text/javascript" src="app/view/serviceurl.js"></script>
+
+        <script type="text/javascript" src="app/store/cmbIdentification.js"></script>
+        <script type="text/javascript" src="app/store/cmbSystemType.js"></script>
+        <script type="text/javascript" src="app/store/cmbSml.js"></script>
+        <script type="text/javascript" src="app/store/cmbName.js"></script>
+        <script type="text/javascript" src="app/store/cmbDocumentFormat.js"></script>
+        <script type="text/javascript" src="app/store/gridDocumentation.js"></script>
+        <script type="text/javascript" src="app/store/gridOutputs.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/procedure.js"></script>
+        <script type="text/javascript" src="app/view/procedure.js"></script>
+
+        <script type="text/javascript" src="app/store/gridProceduresList.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/proceduresList.js"></script>
+        <script type="text/javascript" src="app/view/proceduresList.js"></script>
+
+        <script type="text/javascript" src="app/store/gridObservedProperties.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/obsPropEditor.js"></script>
+        <script type="text/javascript" src="app/view/obsPropEditor.js"></script>
+        <script type="text/javascript" src="app/view/uomsEditor.js"></script>
+
+        <script type="text/javascript" src="app/store/gridOfferings.js"></script>
+        <script type="text/javascript" src="app/view/ui/offeringsEditor.js"></script>
+        <script type="text/javascript" src="app/view/offeringsEditor.js"></script>
+
+        <script type="text/javascript" src="app/store/cmbNameDescription.js"></script>
+        <script type="text/javascript" src="app/view/ui/qualityindexEditor.js"></script>
+        <script type="text/javascript" src="app/view/qualityindexEditor.js"></script>
+
+
+        <script type="text/javascript">
+            
+            Ext.Loader.setConfig({
+                enabled: false
+            });
+            
+            Ext.application({
+                name: 'istsos',
+
+                launch: function() {
+                    Ext.QuickTips.init();
+                    
+                    Ext.Ajax.on("requestexception",function(conn, response, options, eOpts ){
+                        try{
+                            var json = Ext.decode(response.responseText);
+                            if(!json.success && !Ext.isEmpty(json.message)){
+                                Ext.Msg.alert(response.statusText, json.message);
+                            }
+                        }catch(e){
+                            console.error(response);
+                        }
+                    });
+                    Ext.Ajax.on("requestcomplete",function(conn, response, options, eOpts ){
+                        try{
+                            var json = Ext.decode(response.responseText);
+                            if(!json.success && !Ext.isEmpty(json.message)){
+                                Ext.Msg.alert("Server message", "\"" + json.message + "\"<br/><br/>" + 
+                                    "<small>Status response: " + response.statusText + "</small>");
+                                console.error(json.message);
+                            }else if (json.success && !Ext.isEmpty(json.message)){
+                                console.log(json.message);
+                            }
+                        }catch(e){
+                            console.error(response);
+                        }
+                    });
+                    
+                    
+                    
+                    var cmp1 = Ext.create('istsos.view.MainPanel', {
+                        renderTo: Ext.getBody()
+                    });
+                    cmp1.show();
+                }
+            });
+        
+        </script>
+    </head>
+    <body></body>
+</html>
diff --git a/interface/dygraphs/dygraph-combined.js b/interface/dygraphs/dygraph-combined.js
new file mode 100755
index 0000000..10655d9
--- /dev/null
+++ b/interface/dygraphs/dygraph-combined.js
@@ -0,0 +1,2 @@
+/*! @license Copyright 2011 Dan Vanderkam (danvdk at gmail.com) MIT-licensed (http://opensource.org/licenses/MIT) */
+"use strict";var DygraphLayout=function(a){this.dygraph_=a;this.datasets=[];this.setNames=[];this.annotations=[];this.yAxes_=null;this.xTicks_=null;this.yTicks_=null};DygraphLayout.prototype.attr_=function(a){return this.dygraph_.attr_(a)};DygraphLayout.prototype.addDataset=function(a,b){this.datasets.push(b);this.setNames.push(a)};DygraphLayout.prototype.getPlotArea=function(){return this.computePlotArea_()};DygraphLayout.prototype.computePlotArea_=function(){var a={x:0,y:0};if(this.att [...]
\ No newline at end of file
diff --git a/interface/ext/codemirror.js b/interface/ext/codemirror.js
new file mode 100755
index 0000000..c5aa94b
--- /dev/null
+++ b/interface/ext/codemirror.js
@@ -0,0 +1,989 @@
+/**
+* @private
+* @class Ext.ux.layout.component.field.CodeMirror
+* @extends Ext.layout.component.field.Field
+* @author Adrian Teodorescu (ateodorescu at gmail.com; http://www.mzsolutions.eu)
+* @docauthor Adrian Teodorescu (ateodorescu at gmail.com; http://www.mzsolutions.eu)
+* 
+* Layout class for {@link Ext.ux.form.field.CodeMirror} fields. Handles sizing the codemirror field.
+*/
+
+Ext.define('Ext.ux.layout.component.field.CodeMirror', {
+    extend: 'Ext.layout.component.field.Field',
+    alias: ['layout.codemirror'],
+
+    type: 'codemirror',
+
+    sizeBodyContents: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            bodyEl = owner.bodyEl,
+            //toolbar = owner.getToolbar(),
+            editor = owner.editorEl,
+            editorHeight;
+
+        if (Ext.isNumber(width)) {
+            width -= bodyEl.getFrameWidth('lr');
+        }
+        //toolbar.setWidth(width);
+        editor.setWidth(width);
+
+        
+        if (Ext.isNumber(height)) {
+            editorHeight = height /*- toolbar.getHeight()*/ - bodyEl.getFrameWidth('tb');
+            editor.setHeight(editorHeight);
+        }
+    },
+
+    /*
+        Functions for Extjs v4.1.0
+    */
+    toolbarSizePolicy: {
+        setsWidth: 0,
+        setsHeight: 0
+    },
+
+    beginLayout: function(ownerContext) {
+        this.callParent(arguments);
+
+        ownerContext.editorContext   = ownerContext.getEl('editorEl');
+        ownerContext.toolbarContext  = ownerContext.context.getCmp(this.owner.getToolbar());
+    },
+
+    getItemSizePolicy: function (item) {
+        
+        return this.toolbarSizePolicy;
+    },
+
+    getLayoutItems: function () {
+        var toolbar = this.owner.getToolbar();
+        
+        return toolbar ? [toolbar] : [];
+    },
+
+    getRenderTarget: function() {
+        return this.owner.bodyEl;
+    },
+
+    publishInnerHeight: function (ownerContext, height) {
+        var me = this,
+            innerHeight = height - me.measureLabelErrorHeight(ownerContext) -
+                          ownerContext.toolbarContext.getProp('height') -
+                          ownerContext.bodyCellContext.getPaddingInfo().height;
+
+        
+        if (Ext.isNumber(innerHeight)) {
+            ownerContext.editorContext.setHeight(innerHeight);
+        } else {
+            me.done = false;
+        }
+    }
+
+});
+
+/**
+* @class Ext.ux.form.field.CodeMirror
+* @extends Ext.form.field.Base
+* @author Adrian Teodorescu (ateodorescu at gmail.com; http://www.mzsolutions.eu)
+* @docauthor Adrian Teodorescu (ateodorescu at gmail.com; http://www.mzsolutions.eu)
+* @version 1.1
+* 
+* Provides a [CodeMirror][1] component wrapper for Sencha. The supported and tested CodeMirror versions are 2.2, 2.3 and 2.4.
+* The component works with Extjs 4.0.7 and 4.1.0.
+* 
+* [1]: http://codemirror.net/
+* 
+* 
+* The editor's toolbar buttons have tooltips defined in the {@link #buttonTips} property, but they are not
+* enabled by default unless the global {@link Ext.tip.QuickTipManager} singleton is {@link Ext.tip.QuickTipManager#init initialized}.
+*
+* If you include the modes script files by yourself then ignore the {@link #modes} property.
+* If you also include the extensions script files by yourself then ignore the {@link #extensions} property.
+* 
+* 
+#Example usage:#
+
+{@img Ext.ux.form.field.CodeMirror.png Ext.ux.form.field.CodeMirror component}
+
+    var form = Ext.create('Ext.form.Panel', {
+        title:          'Function info',
+        bodyPadding:    10,
+        width:          500,
+        renderTo: Ext.getBody(),        
+        items: [{
+            xtype:      'textfield',
+            name:       'name',
+            anchor:     '100%',
+            fieldLabel: 'Name',
+            allowBlank: false  // requires a non-empty value
+        }, {
+            xtype:      'codemirror',
+            name:       'function',
+            fieldLabel: 'Code',
+            anchor:     '100%'
+        }],
+        
+        buttons: [{
+            text: 'Save',
+            handler: function(){
+                if(form.getForm().isValid()){
+                    alert(form.getForm().getValues().function);
+                }
+            }
+        }]
+    }); 
+
+* @markdown
+* @docauthor Adrian Teodorescu (ateodorescu at gmail.com; http://www.mzsolutions.eu)
+*/
+Ext.define('Ext.ux.form.field.CodeMirror', {
+    extend: 'Ext.form.field.Base',
+    mixins: {
+        labelable: 'Ext.form.Labelable',
+        field: 'Ext.form.field.Field'
+    },
+    alias: 'widget.codemirror',
+    alternateClassName: 'Ext.form.CodeMirror',
+    requires: [
+        'Ext.tip.QuickTipManager',
+        'Ext.toolbar.Item',
+        'Ext.toolbar.Toolbar',
+        'Ext.util.Format',
+        'Ext.ux.layout.component.field.CodeMirror'
+    ],
+
+    fieldSubTpl: [
+        '<div class="{toolbarWrapCls}"></div>',
+        '<textarea id="{id}" name="{name}" tabIndex="-1" class="{textareaCls}" ',
+            'style="{size}" autocomplete="off"></textarea>',
+        '<div class="{editorCls}" name="{editorName}" style="{size}"></div>',
+        {
+            compiled: true,
+            disableFormats: true
+        }
+    ],
+
+    componentLayout: 'codemirror',
+
+    fieldBodyCls: Ext.baseCSSPrefix + 'html-editor-wrap',
+    
+    /**
+    * @cfg {String} mode The default mode to use when the editor is initialized. When not given, this will default to the first mode that was loaded. 
+    * It may be a string, which either simply names the mode or is a MIME type associated with the mode. Alternatively, 
+    * it may be an object containing configuration options for the mode, with a name property that names the mode 
+    * (for example {name: "javascript", json: true}). The demo pages for each mode contain information about what 
+    * configuration parameters the mode supports.
+    */
+    mode:               'text/plain',
+
+    /**
+    * @cfg {Boolean} showModes Enable mode selection in the toolbar
+    */
+    showModes:          true,
+
+    /**
+    * @cfg {Boolean} showAutoIndent Enable auto indent button for indenting the selected range 
+    */
+    showAutoIndent:     true,
+
+    /**
+    * @cfg {Boolean} showLineNumbers Enable line numbers button in the toolbar.
+    */
+    showLineNumbers:    true,
+
+    /**
+    * @cfg {Boolean} enableMatchBrackets Force matching-bracket-highlighting to happen 
+    */
+    enableMatchBrackets:    true,
+
+    /**
+    * @cfg {Boolean} enableElectricChars Configures whether the editor should re-indent the current line when a character is typed 
+    * that might change its proper indentation (only works if the mode supports indentation). 
+    */
+    enableElectricChars:    false,
+
+    /**
+    * @cfg {Boolean} enableIndentWithTabs Whether, when indenting, the first N*tabSize spaces should be replaced by N tabs.
+    */
+    enableIndentWithTabs:   true,
+
+    /**
+    * @cfg {Boolean} enableSmartIndent Whether to use the context-sensitive indentation that the mode provides (or just indent the same as the line before).
+    */
+    enableSmartIndent:      true,
+
+    /**
+    * @cfg {Boolean} enableLineWrapping Whether CodeMirror should scroll or wrap for long lines.
+    */
+    enableLineWrapping:     false,
+
+    /**
+    * @cfg {Boolean} enableLineNumbers Whether to show line numbers to the left of the editor.
+    */
+    enableLineNumbers:      true,
+
+    /**
+    * @cfg {Boolean} enableGutter Can be used to force a 'gutter' (empty space on the left of the editor) to be shown even 
+    * when no line numbers are active. This is useful for setting markers.
+    */
+    enableGutter:           false,
+
+    /**
+    * @cfg {Boolean} enableFixedGutter When enabled (off by default), this will make the gutter stay visible when the 
+    * document is scrolled horizontally.
+    */
+    enableFixedGutter:      false,
+
+    /**
+    * @cfg {Number} firstLineNumber At which number to start counting lines.
+    */
+    firstLineNumber:         1,
+
+    /**
+     * @cfg {Boolean} readOnly <tt>true</tt> to mark the field as readOnly.
+     */
+    readOnly : false,
+
+    /**
+    * @cfg {Number} pollInterval Indicates how quickly (miliseconds) CodeMirror should poll its input textarea for changes. 
+    * Most input is captured by events, but some things, like IME input on some browsers, doesn't generate events 
+    * that allow CodeMirror to properly detect it. Thus, it polls.
+    */
+    pollInterval:         100,
+
+    /**
+    * @cfg {Number} indentUnit How many spaces a block (whatever that means in the edited language) should be indented.
+    */
+    indentUnit:         4,
+
+    /**
+    * @cfg {Number} tabSize The width of a tab character.
+    */
+    tabSize:            4,
+
+    /**
+    * @cfg {String} theme The theme to style the editor with. You must make sure the CSS file defining the corresponding 
+    * .cm-s-[name] styles is loaded (see the theme directory in the distribution). The default is "default", for which 
+    * colors are included in codemirror.css. It is possible to use multiple theming classes at once—for example 
+    * "foo bar" will assign both the cm-s-foo and the cm-s-bar classes to the editor.
+    */
+    theme:              'default',
+    
+    /**
+    * @property {String} pathModes Path to the modes folder to dinamically load the required scripts. You could also
+    * include all your required modes in a big script file and this path will be ignored. 
+    * Do not fill in the trailing slash.
+    */
+    pathModes:          'mode',
+    
+    /**
+    * @property {String} pathExtensions Path to the extensions folder to dinamically load the required scripts. You could also
+    * include all your required extensions in a big script file and this path will be ignored. 
+    * Do not fill in the trailing slash. 
+    */
+    pathExtensions:     'lib/util',
+
+    /**
+    * @cfg {Array} listModes Define here what modes do you want to show in the selection list of the toolbar
+    */
+    listModes: [{
+        text: 'PHP',
+        mime: 'text/x-php'
+    },{
+        text: 'JSON',
+        mime: 'application/json'
+    },{
+        text: 'Javascript',
+        mime: 'text/javascript'
+    },{
+        text: 'HTML mixed',
+        mime: 'text/html'
+    },{
+        text: 'CSS',
+        mime: 'text/css'
+    },{
+        text: 'Plain text',
+        mime: 'text/plain'
+    }],
+        
+    /**
+    * @property {Array} modes Define here mode script dependencies; When choosing a specific mode the script files are automatically loaded
+    */
+    modes: [{
+        mime:           ['text/plain'],
+        dependencies:   []
+    },{
+        mime:           ['application/x-httpd-php', 'text/x-php'],
+        dependencies:   ['xml/xml.js', 'javascript/javascript.js', 'css/css.js', 'clike/clike.js', 'php/php.js']
+    },{
+        mime:           ['text/javascript', 'application/json'],
+        dependencies:   ['javascript/javascript.js']
+    },{
+        mime:           ['text/html'],
+        dependencies:   ['xml/xml.js', 'javascript/javascript.js', 'css/css.js', 'htmlmixed/htmlmixed.js']
+    },{
+        mime:           ['text/css'],
+        dependencies:   ['css/css.js']
+    }],
+    
+    /**
+    * @property {Array} extensions Define here extensions script dependencies; This is used by toolbar buttons to automatically 
+    * load the scripts before using an extension.
+    */
+    extensions:{
+        format: {
+            dependencies: ['formatting.js']
+        }
+    },
+    
+    scriptsLoaded: [],
+    lastMode: '',
+    
+    initComponent : function(){
+        var me = this;
+        
+        me.addEvents(
+            /**
+             * @event initialize
+             * Fires when the editor is fully initialized (including the iframe)
+             * @param {Ext.ux.form.field.CodeMirror} this
+             */
+            'initialize',
+            /**
+             * @event activate
+             * Fires when the editor is first receives the focus. Any insertion must wait
+             * until after this event.
+             * @param {Ext.ux.form.field.CodeMirror} this
+             */
+            'activate',
+            /**
+             * @event deactivate
+             * Fires when the editor looses the focus. 
+             * @param {Ext.ux.form.field.CodeMirror} this
+             */
+            'deactivate',
+             /**
+             * @event change
+             * Fires when the content of the editor is changed. 
+             * @param {Ext.ux.form.field.CodeMirror} this
+             * @param {String} newValue New value
+             * @param {String} oldValue Old value
+             * @param {Array} options 
+             */
+            'change',
+             /**
+             * @event modechanged
+             * Fires when the editor mode changes. 
+             * @param {Ext.ux.form.field.CodeMirror} this
+             * @param {String} newMode New mode
+             * @param {String} oldMode Old mode
+             */
+            'modechanged',
+            /**
+             * @event cursoractivity
+             * Fires when the cursor or selection moves, or any change is made to the editor content.
+             * @param {Ext.ux.form.field.CodeMirror} this
+             */
+            'cursoractivity',
+            /**
+             * @event gutterclick
+             * Fires whenever the editor gutter (the line-number area) is clicked. 
+             * @param {Ext.ux.form.field.CodeMirror} this
+             * @param {Number} lineNumber Zero-based number of the line that was clicked
+             * @param {Object} event The raw mousedown event
+             */
+            'gutterclick',
+            /**
+             * @event scroll
+             * Fires whenever the editor is scrolled.
+             * @param {Ext.ux.form.field.CodeMirror} this
+             */
+            'scroll',
+            /**
+             * @event highlightcomplete
+             * Fires whenever the editor's content has been fully highlighted.
+             * @param {Ext.ux.form.field.CodeMirror} this
+             */
+            'highlightcomplete',
+            /**
+             * @event update
+             * Fires whenever CodeMirror updates its DOM display.
+             * @param {Ext.ux.form.field.CodeMirror} this
+             */
+            'update',
+            /**
+             * @event keyevent
+             * Fires on eery keydown, keyup, and keypress event that CodeMirror captures.
+             * @param {Ext.ux.form.field.CodeMirror} this
+             * @param {Object} event This key event is pretty much the raw key event, except that a stop() method is always 
+             * added to it. You could feed it to, for example, jQuery.Event to further normalize it. This function can inspect 
+             * the key event, and handle it if it wants to. It may return true to tell CodeMirror to ignore the event. 
+             * Be wary that, on some browsers, stopping a keydown does not stop the keypress from firing, whereas on others 
+             * it does. If you respond to an event, you should probably inspect its type property and only do something when 
+             * it is keydown (or keypress for actions that need character data).
+             */
+            'keyevent'
+        );
+
+        me.initLabelable();
+        me.initField();
+
+        me.callParent(arguments);
+        
+    },
+
+    /**
+    * @private override
+    */
+    getSubTplData: function() {
+        var cssPrefix = Ext.baseCSSPrefix;
+        return {
+            toolbarWrapCls: cssPrefix + 'html-editor-tb',
+            textareaCls: cssPrefix + 'hidden',
+            editorCls: cssPrefix + 'codemirror',
+            editorName: Ext.id(),
+            size: 'height:30px;'
+        };
+    },
+
+    getBodyNaturalWidth: function() {
+        return 565;
+    },
+
+    /**
+    * @private override
+    */
+    onRender: function() {
+        var me = this,
+            renderSelectors = me.renderSelectors;
+        
+        Ext.applyIf(renderSelectors, {
+            toolbarWrap: 'div.' + Ext.baseCSSPrefix + 'html-editor-tb',
+            editorEl: 'div.' + Ext.baseCSSPrefix + 'codemirror'
+        });
+
+        me.callParent(arguments);
+
+        //me.createToolbar(me);
+        me.disableItems(true);
+        me.initEditor();
+        me.rendered = true;
+    },
+    
+    /**
+    * @private override
+    */
+    initEditor : function(){
+        var me = this;
+        
+        me.editor = CodeMirror(me.editorEl, {
+            matchBrackets:      me.enableMatchBrackets,
+            electricChars:      me.enableElectricChars,
+            indentUnit:         me.indentUnit,
+            smartIndent:        me.enableSmartIndent,
+            indentWithTabs:     me.enableIndentWithTabs,
+            pollInterval:       me.pollInterval,
+            lineNumbers:        me.enableLineNumbers,
+            lineWrapping:       me.enableLineWrapping,
+            firstLineNumber:    me.firstLineNumber,
+            tabSize:            me.tabSize,
+            gutter:             me.enableGutter,
+            fixedGutter:        me.enableFixedGutter,
+            theme:              me.theme,
+            onChange:           function(editor, tc){
+                me.checkChange();
+            },
+            onCursorActivity:   function(editor){
+                me.fireEvent('cursoractivity', me);
+            },
+            onGutterClick:      function(editor, line, event){
+                me.fireEvent('gutterclick', me, line, event);
+            },
+            onFocus:            function(editor){
+                me.fireEvent('activate', me);
+            },
+            onBlur:             function(editor){
+                me.fireEvent('deactivate', me);
+            },
+            onScroll:           function(editor){
+                me.fireEvent('scroll', me);
+            },
+            onHighlightComplete: function(editor){
+                me.fireEvent('highlightcomplete', me);
+            },
+            onUpdate:           function(editor){
+                me.fireEvent('update', me);
+            },
+            onKeyEvent:         function(editor, event){
+                me.fireEvent('keyevent', me, event);
+            },
+            extraKeys: {
+                "Tab": function(){
+                    editor.replaceSelection("   ","end");
+                }
+           }
+        });
+//        me.editor.setValue(me.rawValue);
+        me.setMode(me.mode);
+        me.setReadOnly(me.readOnly);
+        me.fireEvent('initialize', me);
+
+        // change the codemirror css
+        var css = Ext.util.CSS.getRule('.CodeMirror');
+        if(css){
+            css.style.height = '100%';
+        }
+        var css = Ext.util.CSS.getRule('.CodeMirror-Scroll');
+        if(css){
+            css.style.height = '100%';
+        }
+
+    },
+    
+    /**
+    * @private
+    */
+    createToolbar : function(editor){
+        var me = this, 
+            items = [],
+            tipsEnabled = Ext.tip.QuickTipManager && Ext.tip.QuickTipManager.isEnabled(),
+            baseCSSPrefix = Ext.baseCSSPrefix,
+            toolbar, undef;
+        
+        function btn(id, toggle, handler){
+            return {
+                itemId : id,
+                cls : baseCSSPrefix + 'btn-icon',
+                iconCls: baseCSSPrefix + 'edit-'+id,
+                enableToggle:toggle !== false,
+                scope: editor,
+                handler:handler||editor.relayBtnCmd,
+                clickEvent:'mousedown',
+                tooltip: tipsEnabled ? editor.buttonTips[id] || undef : undef,
+                overflowText: editor.buttonTips[id].title || undef,
+                tabIndex:-1
+            };
+        }
+
+        if(me.showModes){
+            modesSelectItem = Ext.widget('component', {
+                renderTpl: [
+                    '<select class="{cls}">',
+                        '<tpl for="modes">',
+                            '<option value="{mime}" <tpl if="this.isSelected(values.mime)"> selected</tpl>>{text}</option>',
+                        '</tpl>',
+                    '</select>',{
+                        mode: me.mode,
+                        isSelected: function(value){
+                            return this.mode == value;
+                        }
+                    }
+                ],
+                renderData: {
+                    cls: baseCSSPrefix + 'font-select',
+                    modes: me.listModes
+                },
+                renderSelectors: {
+                    selectEl: 'select'
+                },
+                onDisable: function() {
+                    var selectEl = this.selectEl;
+                    if (selectEl) {
+                        selectEl.dom.disabled = true;
+                    }
+                    Ext.Component.superclass.onDisable.apply(this, arguments);
+                },
+                onEnable: function() {
+                    var selectEl = this.selectEl;
+                    if (selectEl) {
+                        selectEl.dom.disabled = false;
+                    }
+                    Ext.Component.superclass.onEnable.apply(this, arguments);
+                }
+            });
+
+            items.push(
+                modesSelectItem,
+                '-'
+            );
+        }
+        // auto indenting button
+        if(me.showAutoIndent)
+            items.push(btn('justifycenter', false));
+            
+        // line numbers button
+        if(me.showLineNumbers)
+            items.push(btn('insertorderedlist'));
+        
+        toolbar = Ext.widget('toolbar', {
+            renderTo: me.toolbarWrap,
+            enableOverflow: true,
+            items: items,
+            componentCls: baseCSSPrefix + 'html-editor-tb'
+        });
+        
+        if(items.length == 0){
+            toolbar.hide();
+        }
+        
+        if(me.showModes){
+            me.modesSelect = modesSelectItem.selectEl;
+            me.mon(me.modesSelect, 'change', function(){
+                me.setMode(me.modesSelect.dom.value);
+            });
+        }
+
+        me.mon(toolbar.el, 'click', function(e){
+            e.preventDefault();
+        });
+
+        me.toolbar = toolbar;
+        me.updateToolbarButtons();
+    },
+    
+    /**
+    * @private
+    */
+    getToolbar : function(){
+        return this.toolbar;
+    },
+    
+    updateToolbarButtons: function(){
+        var me = this;
+        
+        btns = me.getToolbar().items.map;
+        if(me.showLineNumbers)
+            btns['insertorderedlist'].toggle(me.enableLineNumbers);
+        
+    },
+    
+    /**
+    * @private
+    */
+    relayBtnCmd: function(btn){
+        this.relayCmd(btn.getItemId());
+    },
+    
+    /**
+    * @private
+    */
+    relayCmd: function(cmd){
+        Ext.defer(function() {
+            var me = this;
+            me.editor.focus();
+            switch(cmd){
+                // auto formatting
+                case 'justifycenter':
+                    if(!CodeMirror.extensions.autoIndentRange){
+                        me.loadDependencies(me.extensions.format, me.pathExtensions, me.doIndentSelection, me);                        
+                    }else{
+                        me.doIndentSelection();
+                    }
+                break;
+                
+                // line numbers
+                case 'insertorderedlist':
+                    me.doChangeLineNumbers();
+                break;
+            }
+        }, 10, this);
+    },
+    
+    /**
+    * @private
+    * Reload all CodeMirror extensions for the current instance;
+    * 
+    */
+    reloadExtentions: function(){
+        var me = this;
+        
+        for (var ext in CodeMirror.extensions)
+          if (CodeMirror.extensions.propertyIsEnumerable(ext) &&
+              !me.editor.propertyIsEnumerable(ext))
+            me.editor[ext] = CodeMirror.extensions[ext];
+    },
+    
+    doChangeLineNumbers: function(){
+        var me = this;
+        
+        me.enableLineNumbers = !me.enableLineNumbers;
+        me.editor.setOption('lineNumbers', me.enableLineNumbers);
+    },
+    /**
+    * @private
+    */
+    doIndentSelection: function(){
+        var me = this;
+        
+        me.reloadExtentions();
+        
+        try{
+            var range = { from: me.editor.getCursor(true), to: me.editor.getCursor(false) };
+            me.editor.autoIndentRange(range.from, range.to);        
+        }catch(err){}
+    },
+
+    /**
+    * @private
+    */
+    getMime: function(mime){
+        var me = this, item, found = false;
+        
+        for(var i=0;i<me.modes.length;i++){
+            item = me.modes[i];
+            if(Ext.isArray(item.mime)){
+                if(Ext.Array.contains(item.mime, mime)){
+                    found = true;
+                    break;
+                }
+            }else{
+                if(item == mime){
+                    found = true;
+                    break;
+                }
+            }
+        }
+        if(found)
+            return item;
+        else
+            return null;
+    },
+    
+    /**
+    * @private
+    */
+    loadDependencies: function(item, path, handler, scope){
+        var me = this;
+        
+        me.scripts = [];
+        me.scriptIndex = -1;
+        
+        // load the dependencies
+        for(var i=0; i < item.dependencies.length; i++){
+            if(!Ext.Array.contains(me.scriptsLoaded, path + '/' + item.dependencies[i])){
+                var options = {
+                    url: path + '/' + item.dependencies[i],
+                    index: ++me.scriptIndex,
+                    onLoad: function(options){
+                        var ok = true;
+                        for(j=0; j < me.scripts.length; j++){
+                            if(me.scripts[j].called) {// this event could be raised before one script if fetched
+                                ok = ok && me.scripts[j].success;
+                                if(me.scripts[j].success && !Ext.Array.contains(me.scriptsLoaded, me.scripts[j].url)){
+                                    me.scriptsLoaded.push(me.scripts[j].url);
+                                }
+                            }else{
+                                ok = false;
+                            }
+                        }
+                        if(ok){
+                            handler.call(scope || me.editor);
+                        }
+                    }
+                };
+            
+                me.scripts[me.scriptIndex] = {
+                    url: options.url,
+                    success: true,
+                    called: false,
+                    options: options,
+                    onLoad: options.onLoad || Ext.emptyFn,
+                    onError: options.onError || Ext.emptyFn
+                };
+            }
+        }
+        for(var i=0; i < me.scripts.length; i++){
+            me.loadScript(me.scripts[i].options);
+        }
+    },
+    
+    /**
+    * @private
+    */
+    loadScript: function(options){
+        var me = this;
+        Ext.Ajax.request({
+            url: options.url,
+            scriptIndex: options.index,
+            success: function(response, options) {
+                var script = 'Ext.getCmp("' + this.id + '").scripts[' + options.scriptIndex + ']';
+                window.setTimeout('try { ' + response.responseText + ' } catch(e) { '+script+'.success = false; '+script+'.onError('+script+'.options, e); };  ' + script + '.called = true; if ('+script+'.success) '+script+'.onLoad('+script+'.options);', 0);
+            },
+            failure: function(response, options) {
+                var script = this.scripts[options.scriptIndex];
+                script.success = false;
+                script.called = true;
+                script.onError(script.options, response.status);
+            },
+            scope: me
+        });        
+    },
+    
+    /**
+    * @private
+    * Return mode depending on the mime; If the mime is not loaded then return null
+    * 
+    * @param mime
+    */
+    getMimeMode: function(mime){
+        var mode = null;
+        var mimes = CodeMirror.listMIMEs();
+        for(var i=0; i<mimes.length; i++){
+            if(mimes[i].mime == mime){
+                mode = mimes[i].mode;
+                if(typeof mode == "object")
+                    mode = mode.name;
+                break;
+            }
+        }
+        return mode;
+    },
+    
+    /**
+    * Change the CodeMirror mode to the specified mime.
+    * 
+    * @param {String} mime The MIME value according to the CodeMirror documentation
+    */
+    setMode: function(mime){
+        var me = this, 
+            found = false;
+        // search mime to find script dependencies
+        var item = me.getMime(mime);
+        
+        if(!item) {
+            // mime not found
+            return;
+        }
+        
+        var mode = me.getMimeMode(mime);
+
+        if(!mode){
+            me.loadDependencies(item, me.pathModes, function(){
+                var mode = me.getMimeMode(mime);
+                if(typeof mode == "string")
+                    me.editor.setOption('mode', mime);
+                else
+                    me.editor.setOption('mode', mode);
+            });
+        }else{
+            if(typeof mode == "string")
+                me.editor.setOption('mode', mime);
+            else
+                me.editor.setOption('mode', mode);
+        }
+        
+        if(me.modesSelect){
+            me.modesSelect.dom.value = mime;
+        }
+        try{
+            me.fireEvent('modechanged', me, mime, me.lastMode);
+        }catch(err){}
+        me.lastMode = mime;
+    },
+    
+    /**
+    * Set the editor as read only
+    * 
+    * @param {Boolean} readOnly
+    */
+    setReadOnly: function(readOnly) {
+        var me = this;
+        
+        if(me.editor){
+            me.editor.setOption('readOnly', readOnly);
+            me.disableItems(readOnly);
+        }
+    },
+    
+    onDisable: function() {
+        this.bodyEl.mask();
+        this.callParent(arguments);
+    },
+
+    onEnable: function() {
+        this.bodyEl.unmask();
+        this.callParent(arguments);
+    },
+    
+    disableItems: function(disabled) {
+        return;
+        /*
+        this.getToolbar().items.each(function(item){
+            item.setDisabled(disabled);
+        });*/
+    },
+
+    /**
+    * Sets a data value into the field and runs the change detection. 
+    * @param {Mixed} value The value to set
+    * @return {Ext.ux.form.field.CodeMirror} this
+    */
+    setValue: function(value){
+        var me = this;
+        me.mixins.field.setValue.call(me, value);
+        me.rawValue = value;
+        if(me.editor)
+            me.editor.setValue(value);
+        return me;
+    },
+    
+    /**
+    * Return submit value to the owner form.
+    * @return {Mixed} The field value
+    */
+    getSubmitValue: function(){
+        var me = this;
+        return me.getValue();
+    },
+    
+    /**
+    * Return the value of the CodeMirror editor
+    * @return {Mixed} The field value
+    */
+    getValue: function(){
+        var me = this;
+        
+        if(me.editor)
+            return me.editor.getValue();
+        else
+            return null;
+    },
+    
+    /**
+    * @private
+    */
+    onDestroy: function(){
+        var me = this;
+        if(me.rendered){
+            try {
+                Ext.EventManager.removeAll(me.editor);
+                for (prop in me.editor) {
+                    if (me.editor.hasOwnProperty(prop)) {
+                        delete me.editor[prop];
+                    }
+                }
+            }catch(e){}
+            Ext.destroyMembers('tb', 'toolbarWrap', 'editorEl');
+        }
+        me.callParent();
+    },
+    
+    /**
+    * Object collection of toolbar tooltips for the buttons in the editor. The key
+    * is the command id associated with that button and the value is a valid QuickTips object.
+    * These are taken from the HtmlEditor to avoid including additional css.
+    * @type Object
+    */
+    buttonTips : {
+        justifycenter : {
+            title: 'Auto indent',
+            text: 'Applies automatic mode-aware indentation to the specified range.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        insertorderedlist : {
+            title: 'Line numbers',
+            text: 'Show line numbers.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        }
+    }
+});
diff --git a/interface/ext/ext-all-debug.js b/interface/ext/ext-all-debug.js
new file mode 100755
index 0000000..8fc6dc0
--- /dev/null
+++ b/interface/ext/ext-all-debug.js
@@ -0,0 +1,93093 @@
+/*
+
+This file is part of Ext JS 4
+
+Copyright (c) 2011 Sencha Inc
+
+Contact:  http://www.sencha.com/contact
+
+GNU General Public License Usage
+This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file.  Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+
+If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
+
+*/
+
+
+(function() {
+    var global = this,
+        objectPrototype = Object.prototype,
+        toString = objectPrototype.toString,
+        enumerables = true,
+        enumerablesTest = { toString: 1 },
+        i;
+
+    if (typeof Ext === 'undefined') {
+        global.Ext = {};
+    }
+
+    Ext.global = global;
+
+    for (i in enumerablesTest) {
+        enumerables = null;
+    }
+
+    if (enumerables) {
+        enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable',
+                       'toLocaleString', 'toString', 'constructor'];
+    }
+
+    
+    Ext.enumerables = enumerables;
+
+    
+    Ext.apply = function(object, config, defaults) {
+        if (defaults) {
+            Ext.apply(object, defaults);
+        }
+
+        if (object && config && typeof config === 'object') {
+            var i, j, k;
+
+            for (i in config) {
+                object[i] = config[i];
+            }
+
+            if (enumerables) {
+                for (j = enumerables.length; j--;) {
+                    k = enumerables[j];
+                    if (config.hasOwnProperty(k)) {
+                        object[k] = config[k];
+                    }
+                }
+            }
+        }
+
+        return object;
+    };
+
+    Ext.buildSettings = Ext.apply({
+        baseCSSPrefix: 'x-',
+        scopeResetCSS: false
+    }, Ext.buildSettings || {});
+
+    Ext.apply(Ext, {
+        
+        emptyFn: function() {},
+
+        baseCSSPrefix: Ext.buildSettings.baseCSSPrefix,
+
+        
+        applyIf: function(object, config) {
+            var property;
+
+            if (object) {
+                for (property in config) {
+                    if (object[property] === undefined) {
+                        object[property] = config[property];
+                    }
+                }
+            }
+
+            return object;
+        },
+
+        
+        iterate: function(object, fn, scope) {
+            if (Ext.isEmpty(object)) {
+                return;
+            }
+
+            if (scope === undefined) {
+                scope = object;
+            }
+
+            if (Ext.isIterable(object)) {
+                Ext.Array.each.call(Ext.Array, object, fn, scope);
+            }
+            else {
+                Ext.Object.each.call(Ext.Object, object, fn, scope);
+            }
+        }
+    });
+
+    Ext.apply(Ext, {
+
+        
+        extend: function() {
+            
+            var objectConstructor = objectPrototype.constructor,
+                inlineOverrides = function(o) {
+                for (var m in o) {
+                    if (!o.hasOwnProperty(m)) {
+                        continue;
+                    }
+                    this[m] = o[m];
+                }
+            };
+
+            return function(subclass, superclass, overrides) {
+                
+                if (Ext.isObject(superclass)) {
+                    overrides = superclass;
+                    superclass = subclass;
+                    subclass = overrides.constructor !== objectConstructor ? overrides.constructor : function() {
+                        superclass.apply(this, arguments);
+                    };
+                }
+
+
+                
+                var F = function() {},
+                    subclassProto, superclassProto = superclass.prototype;
+
+                F.prototype = superclassProto;
+                subclassProto = subclass.prototype = new F();
+                subclassProto.constructor = subclass;
+                subclass.superclass = superclassProto;
+
+                if (superclassProto.constructor === objectConstructor) {
+                    superclassProto.constructor = superclass;
+                }
+
+                subclass.override = function(overrides) {
+                    Ext.override(subclass, overrides);
+                };
+
+                subclassProto.override = inlineOverrides;
+                subclassProto.proto = subclassProto;
+
+                subclass.override(overrides);
+                subclass.extend = function(o) {
+                    return Ext.extend(subclass, o);
+                };
+
+                return subclass;
+            };
+        }(),
+
+        
+        override: function(cls, overrides) {
+            if (cls.prototype.$className) {
+                return cls.override(overrides);
+            }
+            else {
+                Ext.apply(cls.prototype, overrides);
+            }
+        }
+    });
+
+    
+    Ext.apply(Ext, {
+
+        
+        valueFrom: function(value, defaultValue, allowBlank){
+            return Ext.isEmpty(value, allowBlank) ? defaultValue : value;
+        },
+
+        
+        typeOf: function(value) {
+            if (value === null) {
+                return 'null';
+            }
+
+            var type = typeof value;
+
+            if (type === 'undefined' || type === 'string' || type === 'number' || type === 'boolean') {
+                return type;
+            }
+
+            var typeToString = toString.call(value);
+
+            switch(typeToString) {
+                case '[object Array]':
+                    return 'array';
+                case '[object Date]':
+                    return 'date';
+                case '[object Boolean]':
+                    return 'boolean';
+                case '[object Number]':
+                    return 'number';
+                case '[object RegExp]':
+                    return 'regexp';
+            }
+
+            if (type === 'function') {
+                return 'function';
+            }
+
+            if (type === 'object') {
+                if (value.nodeType !== undefined) {
+                    if (value.nodeType === 3) {
+                        return (/\S/).test(value.nodeValue) ? 'textnode' : 'whitespace';
+                    }
+                    else {
+                        return 'element';
+                    }
+                }
+
+                return 'object';
+            }
+
+        },
+
+        
+        isEmpty: function(value, allowEmptyString) {
+            return (value === null) || (value === undefined) || (!allowEmptyString ? value === '' : false) || (Ext.isArray(value) && value.length === 0);
+        },
+
+        
+        isArray: ('isArray' in Array) ? Array.isArray : function(value) {
+            return toString.call(value) === '[object Array]';
+        },
+
+        
+        isDate: function(value) {
+            return toString.call(value) === '[object Date]';
+        },
+
+        
+        isObject: (toString.call(null) === '[object Object]') ?
+        function(value) {
+            
+            return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.ownerDocument === undefined;
+        } :
+        function(value) {
+            return toString.call(value) === '[object Object]';
+        },
+
+        
+        isPrimitive: function(value) {
+            var type = typeof value;
+
+            return type === 'string' || type === 'number' || type === 'boolean';
+        },
+
+        
+        isFunction:
+        
+        
+        (typeof document !== 'undefined' && typeof document.getElementsByTagName('body') === 'function') ? function(value) {
+            return toString.call(value) === '[object Function]';
+        } : function(value) {
+            return typeof value === 'function';
+        },
+
+        
+        isNumber: function(value) {
+            return typeof value === 'number' && isFinite(value);
+        },
+
+        
+        isNumeric: function(value) {
+            return !isNaN(parseFloat(value)) && isFinite(value);
+        },
+
+        
+        isString: function(value) {
+            return typeof value === 'string';
+        },
+
+        
+        isBoolean: function(value) {
+            return typeof value === 'boolean';
+        },
+
+        
+        isElement: function(value) {
+            return value ? value.nodeType === 1 : false;
+        },
+
+        
+        isTextNode: function(value) {
+            return value ? value.nodeName === "#text" : false;
+        },
+
+        
+        isDefined: function(value) {
+            return typeof value !== 'undefined';
+        },
+
+        
+        isIterable: function(value) {
+            return (value && typeof value !== 'string') ? value.length !== undefined : false;
+        }
+    });
+
+    Ext.apply(Ext, {
+
+        
+        clone: function(item) {
+            if (item === null || item === undefined) {
+                return item;
+            }
+
+            
+            
+            
+            if (item.nodeType && item.cloneNode) {
+                return item.cloneNode(true);
+            }
+
+            var type = toString.call(item);
+
+            
+            if (type === '[object Date]') {
+                return new Date(item.getTime());
+            }
+
+            var i, j, k, clone, key;
+
+            
+            if (type === '[object Array]') {
+                i = item.length;
+
+                clone = [];
+
+                while (i--) {
+                    clone[i] = Ext.clone(item[i]);
+                }
+            }
+            
+            else if (type === '[object Object]' && item.constructor === Object) {
+                clone = {};
+
+                for (key in item) {
+                    clone[key] = Ext.clone(item[key]);
+                }
+
+                if (enumerables) {
+                    for (j = enumerables.length; j--;) {
+                        k = enumerables[j];
+                        clone[k] = item[k];
+                    }
+                }
+            }
+
+            return clone || item;
+        },
+
+        
+        getUniqueGlobalNamespace: function() {
+            var uniqueGlobalNamespace = this.uniqueGlobalNamespace;
+
+            if (uniqueGlobalNamespace === undefined) {
+                var i = 0;
+
+                do {
+                    uniqueGlobalNamespace = 'ExtBox' + (++i);
+                } while (Ext.global[uniqueGlobalNamespace] !== undefined);
+
+                Ext.global[uniqueGlobalNamespace] = Ext;
+                this.uniqueGlobalNamespace = uniqueGlobalNamespace;
+            }
+
+            return uniqueGlobalNamespace;
+        },
+
+        
+        functionFactory: function() {
+            var args = Array.prototype.slice.call(arguments);
+
+            if (args.length > 0) {
+                args[args.length - 1] = 'var Ext=window.' + this.getUniqueGlobalNamespace() + ';' +
+                    args[args.length - 1];
+            }
+
+            return Function.prototype.constructor.apply(Function.prototype, args);
+        }
+    });
+
+    
+    Ext.type = Ext.typeOf;
+
+})();
+
+
+(function() {
+
+
+var version = '4.0.7', Version;
+    Ext.Version = Version = Ext.extend(Object, {
+
+        
+        constructor: function(version) {
+            var parts, releaseStartIndex;
+
+            if (version instanceof Version) {
+                return version;
+            }
+
+            this.version = this.shortVersion = String(version).toLowerCase().replace(/_/g, '.').replace(/[\-+]/g, '');
+
+            releaseStartIndex = this.version.search(/([^\d\.])/);
+
+            if (releaseStartIndex !== -1) {
+                this.release = this.version.substr(releaseStartIndex, version.length);
+                this.shortVersion = this.version.substr(0, releaseStartIndex);
+            }
+
+            this.shortVersion = this.shortVersion.replace(/[^\d]/g, '');
+
+            parts = this.version.split('.');
+
+            this.major = parseInt(parts.shift() || 0, 10);
+            this.minor = parseInt(parts.shift() || 0, 10);
+            this.patch = parseInt(parts.shift() || 0, 10);
+            this.build = parseInt(parts.shift() || 0, 10);
+
+            return this;
+        },
+
+        
+        toString: function() {
+            return this.version;
+        },
+
+        
+        valueOf: function() {
+            return this.version;
+        },
+
+        
+        getMajor: function() {
+            return this.major || 0;
+        },
+
+        
+        getMinor: function() {
+            return this.minor || 0;
+        },
+
+        
+        getPatch: function() {
+            return this.patch || 0;
+        },
+
+        
+        getBuild: function() {
+            return this.build || 0;
+        },
+
+        
+        getRelease: function() {
+            return this.release || '';
+        },
+
+        
+        isGreaterThan: function(target) {
+            return Version.compare(this.version, target) === 1;
+        },
+
+        
+        isLessThan: function(target) {
+            return Version.compare(this.version, target) === -1;
+        },
+
+        
+        equals: function(target) {
+            return Version.compare(this.version, target) === 0;
+        },
+
+        
+        match: function(target) {
+            target = String(target);
+            return this.version.substr(0, target.length) === target;
+        },
+
+        
+        toArray: function() {
+            return [this.getMajor(), this.getMinor(), this.getPatch(), this.getBuild(), this.getRelease()];
+        },
+
+        
+        getShortVersion: function() {
+            return this.shortVersion;
+        }
+    });
+
+    Ext.apply(Version, {
+        
+        releaseValueMap: {
+            'dev': -6,
+            'alpha': -5,
+            'a': -5,
+            'beta': -4,
+            'b': -4,
+            'rc': -3,
+            '#': -2,
+            'p': -1,
+            'pl': -1
+        },
+
+        
+        getComponentValue: function(value) {
+            return !value ? 0 : (isNaN(value) ? this.releaseValueMap[value] || value : parseInt(value, 10));
+        },
+
+        
+        compare: function(current, target) {
+            var currentValue, targetValue, i;
+
+            current = new Version(current).toArray();
+            target = new Version(target).toArray();
+
+            for (i = 0; i < Math.max(current.length, target.length); i++) {
+                currentValue = this.getComponentValue(current[i]);
+                targetValue = this.getComponentValue(target[i]);
+
+                if (currentValue < targetValue) {
+                    return -1;
+                } else if (currentValue > targetValue) {
+                    return 1;
+                }
+            }
+
+            return 0;
+        }
+    });
+
+    Ext.apply(Ext, {
+        
+        versions: {},
+
+        
+        lastRegisteredVersion: null,
+
+        
+        setVersion: function(packageName, version) {
+            Ext.versions[packageName] = new Version(version);
+            Ext.lastRegisteredVersion = Ext.versions[packageName];
+
+            return this;
+        },
+
+        
+        getVersion: function(packageName) {
+            if (packageName === undefined) {
+                return Ext.lastRegisteredVersion;
+            }
+
+            return Ext.versions[packageName];
+        },
+
+        
+        deprecate: function(packageName, since, closure, scope) {
+            if (Version.compare(Ext.getVersion(packageName), since) < 1) {
+                closure.call(scope);
+            }
+        }
+    }); 
+
+    Ext.setVersion('core', version);
+
+})();
+
+
+
+Ext.String = {
+    trimRegex: /^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,
+    escapeRe: /('|\\)/g,
+    formatRe: /\{(\d+)\}/g,
+    escapeRegexRe: /([-.*+?^${}()|[\]\/\\])/g,
+
+    /**
+     * Convert certain characters (&, <, >, and ") to their HTML character equivalents for literal display in web pages.
+     * @param {String} value The string to encode
+     * @return {String} The encoded text
+     * @method
+     */
+    htmlEncode: (function() {
+        var entities = {
+            '&': '&',
+            '>': '>',
+            '<': '<',
+            '"': '"'
+        }, keys = [], p, regex;
+        
+        for (p in entities) {
+            keys.push(p);
+        }
+        
+        regex = new RegExp('(' + keys.join('|') + ')', 'g');
+        
+        return function(value) {
+            return (!value) ? value : String(value).replace(regex, function(match, capture) {
+                return entities[capture];    
+            });
+        };
+    })(),
+
+    /**
+     * Convert certain characters (&, <, >, and ") from their HTML character equivalents.
+     * @param {String} value The string to decode
+     * @return {String} The decoded text
+     * @method
+     */
+    htmlDecode: (function() {
+        var entities = {
+            '&': '&',
+            '>': '>',
+            '<': '<',
+            '"': '"'
+        }, keys = [], p, regex;
+        
+        for (p in entities) {
+            keys.push(p);
+        }
+        
+        regex = new RegExp('(' + keys.join('|') + '|&#[0-9]{1,5};' + ')', 'g');
+        
+        return function(value) {
+            return (!value) ? value : String(value).replace(regex, function(match, capture) {
+                if (capture in entities) {
+                    return entities[capture];
+                } else {
+                    return String.fromCharCode(parseInt(capture.substr(2), 10));
+                }
+            });
+        };
+    })(),
+
+    
+    urlAppend : function(url, string) {
+        if (!Ext.isEmpty(string)) {
+            return url + (url.indexOf('?') === -1 ? '?' : '&') + string;
+        }
+
+        return url;
+    },
+
+    
+    trim: function(string) {
+        return string.replace(Ext.String.trimRegex, "");
+    },
+
+    
+    capitalize: function(string) {
+        return string.charAt(0).toUpperCase() + string.substr(1);
+    },
+
+    
+    ellipsis: function(value, len, word) {
+        if (value && value.length > len) {
+            if (word) {
+                var vs = value.substr(0, len - 2),
+                index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?'));
+                if (index !== -1 && index >= (len - 15)) {
+                    return vs.substr(0, index) + "...";
+                }
+            }
+            return value.substr(0, len - 3) + "...";
+        }
+        return value;
+    },
+
+    
+    escapeRegex: function(string) {
+        return string.replace(Ext.String.escapeRegexRe, "\\$1");
+    },
+
+    
+    escape: function(string) {
+        return string.replace(Ext.String.escapeRe, "\\$1");
+    },
+
+    
+    toggle: function(string, value, other) {
+        return string === value ? other : value;
+    },
+
+    
+    leftPad: function(string, size, character) {
+        var result = String(string);
+        character = character || " ";
+        while (result.length < size) {
+            result = character + result;
+        }
+        return result;
+    },
+
+    
+    format: function(format) {
+        var args = Ext.Array.toArray(arguments, 1);
+        return format.replace(Ext.String.formatRe, function(m, i) {
+            return args[i];
+        });
+    },
+
+    
+    repeat: function(pattern, count, sep) {
+        for (var buf = [], i = count; i--; ) {
+            buf.push(pattern);
+        }
+        return buf.join(sep || '');
+    }
+};
+
+
+
+(function() {
+
+var isToFixedBroken = (0.9).toFixed() !== '1';
+
+Ext.Number = {
+    
+    constrain: function(number, min, max) {
+        number = parseFloat(number);
+
+        if (!isNaN(min)) {
+            number = Math.max(number, min);
+        }
+        if (!isNaN(max)) {
+            number = Math.min(number, max);
+        }
+        return number;
+    },
+
+    
+    snap : function(value, increment, minValue, maxValue) {
+        var newValue = value,
+            m;
+
+        if (!(increment && value)) {
+            return value;
+        }
+        m = value % increment;
+        if (m !== 0) {
+            newValue -= m;
+            if (m * 2 >= increment) {
+                newValue += increment;
+            } else if (m * 2 < -increment) {
+                newValue -= increment;
+            }
+        }
+        return Ext.Number.constrain(newValue, minValue,  maxValue);
+    },
+
+    
+    toFixed: function(value, precision) {
+        if (isToFixedBroken) {
+            precision = precision || 0;
+            var pow = Math.pow(10, precision);
+            return (Math.round(value * pow) / pow).toFixed(precision);
+        }
+
+        return value.toFixed(precision);
+    },
+
+    
+    from: function(value, defaultValue) {
+        if (isFinite(value)) {
+            value = parseFloat(value);
+        }
+
+        return !isNaN(value) ? value : defaultValue;
+    }
+};
+
+})();
+
+
+Ext.num = function() {
+    return Ext.Number.from.apply(this, arguments);
+};
+
+(function() {
+
+    var arrayPrototype = Array.prototype,
+        slice = arrayPrototype.slice,
+        supportsSplice = function () {
+            var array = [],
+                lengthBefore,
+                j = 20;
+
+            if (!array.splice) {
+                return false;
+            }
+
+            
+            
+
+            while (j--) {
+                array.push("A");
+            }
+
+            array.splice(15, 0, "F", "F", "F", "F", "F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F");
+
+            lengthBefore = array.length; 
+            array.splice(13, 0, "XXX"); 
+
+            if (lengthBefore+1 != array.length) {
+                return false;
+            }
+            
+
+            return true;
+        }(),
+        supportsForEach = 'forEach' in arrayPrototype,
+        supportsMap = 'map' in arrayPrototype,
+        supportsIndexOf = 'indexOf' in arrayPrototype,
+        supportsEvery = 'every' in arrayPrototype,
+        supportsSome = 'some' in arrayPrototype,
+        supportsFilter = 'filter' in arrayPrototype,
+        supportsSort = function() {
+            var a = [1,2,3,4,5].sort(function(){ return 0; });
+            return a[0] === 1 && a[1] === 2 && a[2] === 3 && a[3] === 4 && a[4] === 5;
+        }(),
+        supportsSliceOnNodeList = true,
+        ExtArray;
+
+    try {
+        
+        if (typeof document !== 'undefined') {
+            slice.call(document.getElementsByTagName('body'));
+        }
+    } catch (e) {
+        supportsSliceOnNodeList = false;
+    }
+
+    function fixArrayIndex (array, index) {
+        return (index < 0) ? Math.max(0, array.length + index)
+                           : Math.min(array.length, index);
+    }
+
+    
+    function replaceSim (array, index, removeCount, insert) {
+        var add = insert ? insert.length : 0,
+            length = array.length,
+            pos = fixArrayIndex(array, index);
+
+        
+        if (pos === length) {
+            if (add) {
+                array.push.apply(array, insert);
+            }
+        } else {
+            var remove = Math.min(removeCount, length - pos),
+                tailOldPos = pos + remove,
+                tailNewPos = tailOldPos + add - remove,
+                tailCount = length - tailOldPos,
+                lengthAfterRemove = length - remove,
+                i;
+
+            if (tailNewPos < tailOldPos) { 
+                for (i = 0; i < tailCount; ++i) {
+                    array[tailNewPos+i] = array[tailOldPos+i];
+                }
+            } else if (tailNewPos > tailOldPos) { 
+                for (i = tailCount; i--; ) {
+                    array[tailNewPos+i] = array[tailOldPos+i];
+                }
+            } 
+
+            if (add && pos === lengthAfterRemove) {
+                array.length = lengthAfterRemove; 
+                array.push.apply(array, insert);
+            } else {
+                array.length = lengthAfterRemove + add; 
+                for (i = 0; i < add; ++i) {
+                    array[pos+i] = insert[i];
+                }
+            }
+        }
+
+        return array;
+    }
+
+    function replaceNative (array, index, removeCount, insert) {
+        if (insert && insert.length) {
+            if (index < array.length) {
+                array.splice.apply(array, [index, removeCount].concat(insert));
+            } else {
+                array.push.apply(array, insert);
+            }
+        } else {
+            array.splice(index, removeCount);
+        }
+        return array;
+    }
+
+    function eraseSim (array, index, removeCount) {
+        return replaceSim(array, index, removeCount);
+    }
+
+    function eraseNative (array, index, removeCount) {
+        array.splice(index, removeCount);
+        return array;
+    }
+
+    function spliceSim (array, index, removeCount) {
+        var pos = fixArrayIndex(array, index),
+            removed = array.slice(index, fixArrayIndex(array, pos+removeCount));
+
+        if (arguments.length < 4) {
+            replaceSim(array, pos, removeCount);
+        } else {
+            replaceSim(array, pos, removeCount, slice.call(arguments, 3));
+        }
+
+        return removed;
+    }
+
+    function spliceNative (array) {
+        return array.splice.apply(array, slice.call(arguments, 1));
+    }
+
+    var erase = supportsSplice ? eraseNative : eraseSim,
+        replace = supportsSplice ? replaceNative : replaceSim,
+        splice = supportsSplice ? spliceNative : spliceSim;
+
+    
+
+    ExtArray = Ext.Array = {
+        
+        each: function(array, fn, scope, reverse) {
+            array = ExtArray.from(array);
+
+            var i,
+                ln = array.length;
+
+            if (reverse !== true) {
+                for (i = 0; i < ln; i++) {
+                    if (fn.call(scope || array[i], array[i], i, array) === false) {
+                        return i;
+                    }
+                }
+            }
+            else {
+                for (i = ln - 1; i > -1; i--) {
+                    if (fn.call(scope || array[i], array[i], i, array) === false) {
+                        return i;
+                    }
+                }
+            }
+
+            return true;
+        },
+
+        
+        forEach: function(array, fn, scope) {
+            if (supportsForEach) {
+                return array.forEach(fn, scope);
+            }
+
+            var i = 0,
+                ln = array.length;
+
+            for (; i < ln; i++) {
+                fn.call(scope, array[i], i, array);
+            }
+        },
+
+        
+        indexOf: function(array, item, from) {
+            if (supportsIndexOf) {
+                return array.indexOf(item, from);
+            }
+
+            var i, length = array.length;
+
+            for (i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++) {
+                if (array[i] === item) {
+                    return i;
+                }
+            }
+
+            return -1;
+        },
+
+        
+        contains: function(array, item) {
+            if (supportsIndexOf) {
+                return array.indexOf(item) !== -1;
+            }
+
+            var i, ln;
+
+            for (i = 0, ln = array.length; i < ln; i++) {
+                if (array[i] === item) {
+                    return true;
+                }
+            }
+
+            return false;
+        },
+
+        
+        toArray: function(iterable, start, end){
+            if (!iterable || !iterable.length) {
+                return [];
+            }
+
+            if (typeof iterable === 'string') {
+                iterable = iterable.split('');
+            }
+
+            if (supportsSliceOnNodeList) {
+                return slice.call(iterable, start || 0, end || iterable.length);
+            }
+
+            var array = [],
+                i;
+
+            start = start || 0;
+            end = end ? ((end < 0) ? iterable.length + end : end) : iterable.length;
+
+            for (i = start; i < end; i++) {
+                array.push(iterable[i]);
+            }
+
+            return array;
+        },
+
+        
+        pluck: function(array, propertyName) {
+            var ret = [],
+                i, ln, item;
+
+            for (i = 0, ln = array.length; i < ln; i++) {
+                item = array[i];
+
+                ret.push(item[propertyName]);
+            }
+
+            return ret;
+        },
+
+        
+        map: function(array, fn, scope) {
+            if (supportsMap) {
+                return array.map(fn, scope);
+            }
+
+            var results = [],
+                i = 0,
+                len = array.length;
+
+            for (; i < len; i++) {
+                results[i] = fn.call(scope, array[i], i, array);
+            }
+
+            return results;
+        },
+
+        
+        every: function(array, fn, scope) {
+            if (supportsEvery) {
+                return array.every(fn, scope);
+            }
+
+            var i = 0,
+                ln = array.length;
+
+            for (; i < ln; ++i) {
+                if (!fn.call(scope, array[i], i, array)) {
+                    return false;
+                }
+            }
+
+            return true;
+        },
+
+        
+        some: function(array, fn, scope) {
+            if (supportsSome) {
+                return array.some(fn, scope);
+            }
+
+            var i = 0,
+                ln = array.length;
+
+            for (; i < ln; ++i) {
+                if (fn.call(scope, array[i], i, array)) {
+                    return true;
+                }
+            }
+
+            return false;
+        },
+
+        
+        clean: function(array) {
+            var results = [],
+                i = 0,
+                ln = array.length,
+                item;
+
+            for (; i < ln; i++) {
+                item = array[i];
+
+                if (!Ext.isEmpty(item)) {
+                    results.push(item);
+                }
+            }
+
+            return results;
+        },
+
+        
+        unique: function(array) {
+            var clone = [],
+                i = 0,
+                ln = array.length,
+                item;
+
+            for (; i < ln; i++) {
+                item = array[i];
+
+                if (ExtArray.indexOf(clone, item) === -1) {
+                    clone.push(item);
+                }
+            }
+
+            return clone;
+        },
+
+        
+        filter: function(array, fn, scope) {
+            if (supportsFilter) {
+                return array.filter(fn, scope);
+            }
+
+            var results = [],
+                i = 0,
+                ln = array.length;
+
+            for (; i < ln; i++) {
+                if (fn.call(scope, array[i], i, array)) {
+                    results.push(array[i]);
+                }
+            }
+
+            return results;
+        },
+
+        
+        from: function(value, newReference) {
+            if (value === undefined || value === null) {
+                return [];
+            }
+
+            if (Ext.isArray(value)) {
+                return (newReference) ? slice.call(value) : value;
+            }
+
+            if (value && value.length !== undefined && typeof value !== 'string') {
+                return Ext.toArray(value);
+            }
+
+            return [value];
+        },
+
+        
+        remove: function(array, item) {
+            var index = ExtArray.indexOf(array, item);
+
+            if (index !== -1) {
+                erase(array, index, 1);
+            }
+
+            return array;
+        },
+
+        
+        include: function(array, item) {
+            if (!ExtArray.contains(array, item)) {
+                array.push(item);
+            }
+        },
+
+        
+        clone: function(array) {
+            return slice.call(array);
+        },
+
+        
+        merge: function() {
+            var args = slice.call(arguments),
+                array = [],
+                i, ln;
+
+            for (i = 0, ln = args.length; i < ln; i++) {
+                array = array.concat(args[i]);
+            }
+
+            return ExtArray.unique(array);
+        },
+
+        
+        intersect: function() {
+            var intersect = [],
+                arrays = slice.call(arguments),
+                i, j, k, minArray, array, x, y, ln, arraysLn, arrayLn;
+
+            if (!arrays.length) {
+                return intersect;
+            }
+
+            
+            for (i = x = 0,ln = arrays.length; i < ln,array = arrays[i]; i++) {
+                if (!minArray || array.length < minArray.length) {
+                    minArray = array;
+                    x = i;
+                }
+            }
+
+            minArray = ExtArray.unique(minArray);
+            erase(arrays, x, 1);
+
+            
+            
+            
+            for (i = 0,ln = minArray.length; i < ln,x = minArray[i]; i++) {
+                var count = 0;
+
+                for (j = 0,arraysLn = arrays.length; j < arraysLn,array = arrays[j]; j++) {
+                    for (k = 0,arrayLn = array.length; k < arrayLn,y = array[k]; k++) {
+                        if (x === y) {
+                            count++;
+                            break;
+                        }
+                    }
+                }
+
+                if (count === arraysLn) {
+                    intersect.push(x);
+                }
+            }
+
+            return intersect;
+        },
+
+        
+        difference: function(arrayA, arrayB) {
+            var clone = slice.call(arrayA),
+                ln = clone.length,
+                i, j, lnB;
+
+            for (i = 0,lnB = arrayB.length; i < lnB; i++) {
+                for (j = 0; j < ln; j++) {
+                    if (clone[j] === arrayB[i]) {
+                        erase(clone, j, 1);
+                        j--;
+                        ln--;
+                    }
+                }
+            }
+
+            return clone;
+        },
+
+        
+        
+        slice: ([1,2].slice(1, undefined).length ?
+            function (array, begin, end) {
+                return slice.call(array, begin, end);
+            } :
+            
+            function (array, begin, end) {
+                
+                
+                if (typeof begin === 'undefined') {
+                    return slice.call(array);
+                }
+                if (typeof end === 'undefined') {
+                    return slice.call(array, begin);
+                }
+                return slice.call(array, begin, end);
+            }
+        ),
+
+        
+        sort: function(array, sortFn) {
+            if (supportsSort) {
+                if (sortFn) {
+                    return array.sort(sortFn);
+                } else {
+                    return array.sort();
+                }
+            }
+
+            var length = array.length,
+                i = 0,
+                comparison,
+                j, min, tmp;
+
+            for (; i < length; i++) {
+                min = i;
+                for (j = i + 1; j < length; j++) {
+                    if (sortFn) {
+                        comparison = sortFn(array[j], array[min]);
+                        if (comparison < 0) {
+                            min = j;
+                        }
+                    } else if (array[j] < array[min]) {
+                        min = j;
+                    }
+                }
+                if (min !== i) {
+                    tmp = array[i];
+                    array[i] = array[min];
+                    array[min] = tmp;
+                }
+            }
+
+            return array;
+        },
+
+        
+        flatten: function(array) {
+            var worker = [];
+
+            function rFlatten(a) {
+                var i, ln, v;
+
+                for (i = 0, ln = a.length; i < ln; i++) {
+                    v = a[i];
+
+                    if (Ext.isArray(v)) {
+                        rFlatten(v);
+                    } else {
+                        worker.push(v);
+                    }
+                }
+
+                return worker;
+            }
+
+            return rFlatten(array);
+        },
+
+        
+        min: function(array, comparisonFn) {
+            var min = array[0],
+                i, ln, item;
+
+            for (i = 0, ln = array.length; i < ln; i++) {
+                item = array[i];
+
+                if (comparisonFn) {
+                    if (comparisonFn(min, item) === 1) {
+                        min = item;
+                    }
+                }
+                else {
+                    if (item < min) {
+                        min = item;
+                    }
+                }
+            }
+
+            return min;
+        },
+
+        
+        max: function(array, comparisonFn) {
+            var max = array[0],
+                i, ln, item;
+
+            for (i = 0, ln = array.length; i < ln; i++) {
+                item = array[i];
+
+                if (comparisonFn) {
+                    if (comparisonFn(max, item) === -1) {
+                        max = item;
+                    }
+                }
+                else {
+                    if (item > max) {
+                        max = item;
+                    }
+                }
+            }
+
+            return max;
+        },
+
+        
+        mean: function(array) {
+            return array.length > 0 ? ExtArray.sum(array) / array.length : undefined;
+        },
+
+        
+        sum: function(array) {
+            var sum = 0,
+                i, ln, item;
+
+            for (i = 0,ln = array.length; i < ln; i++) {
+                item = array[i];
+
+                sum += item;
+            }
+
+            return sum;
+        },
+
+
+        
+        erase: erase,
+
+        
+        insert: function (array, index, items) {
+            return replace(array, index, 0, items);
+        },
+
+        
+        replace: replace,
+
+        
+        splice: splice
+    };
+
+    
+    Ext.each = ExtArray.each;
+
+    
+    ExtArray.union = ExtArray.merge;
+
+    
+    Ext.min = ExtArray.min;
+
+    
+    Ext.max = ExtArray.max;
+
+    
+    Ext.sum = ExtArray.sum;
+
+    
+    Ext.mean = ExtArray.mean;
+
+    
+    Ext.flatten = ExtArray.flatten;
+
+    
+    Ext.clean = ExtArray.clean;
+
+    
+    Ext.unique = ExtArray.unique;
+
+    
+    Ext.pluck = ExtArray.pluck;
+
+    
+    Ext.toArray = function() {
+        return ExtArray.toArray.apply(ExtArray, arguments);
+    };
+})();
+
+
+Ext.Function = {
+
+    
+    flexSetter: function(fn) {
+        return function(a, b) {
+            var k, i;
+
+            if (a === null) {
+                return this;
+            }
+
+            if (typeof a !== 'string') {
+                for (k in a) {
+                    if (a.hasOwnProperty(k)) {
+                        fn.call(this, k, a[k]);
+                    }
+                }
+
+                if (Ext.enumerables) {
+                    for (i = Ext.enumerables.length; i--;) {
+                        k = Ext.enumerables[i];
+                        if (a.hasOwnProperty(k)) {
+                            fn.call(this, k, a[k]);
+                        }
+                    }
+                }
+            } else {
+                fn.call(this, a, b);
+            }
+
+            return this;
+        };
+    },
+
+    
+    bind: function(fn, scope, args, appendArgs) {
+        if (arguments.length === 2) {
+            return function() {
+                return fn.apply(scope, arguments);
+            }
+        }
+
+        var method = fn,
+            slice = Array.prototype.slice;
+
+        return function() {
+            var callArgs = args || arguments;
+
+            if (appendArgs === true) {
+                callArgs = slice.call(arguments, 0);
+                callArgs = callArgs.concat(args);
+            }
+            else if (typeof appendArgs == 'number') {
+                callArgs = slice.call(arguments, 0); 
+                Ext.Array.insert(callArgs, appendArgs, args);
+            }
+
+            return method.apply(scope || window, callArgs);
+        };
+    },
+
+    
+    pass: function(fn, args, scope) {
+        if (args) {
+            args = Ext.Array.from(args);
+        }
+
+        return function() {
+            return fn.apply(scope, args.concat(Ext.Array.toArray(arguments)));
+        };
+    },
+
+    
+    alias: function(object, methodName) {
+        return function() {
+            return object[methodName].apply(object, arguments);
+        };
+    },
+
+    
+    createInterceptor: function(origFn, newFn, scope, returnValue) {
+        var method = origFn;
+        if (!Ext.isFunction(newFn)) {
+            return origFn;
+        }
+        else {
+            return function() {
+                var me = this,
+                    args = arguments;
+                newFn.target = me;
+                newFn.method = origFn;
+                return (newFn.apply(scope || me || window, args) !== false) ? origFn.apply(me || window, args) : returnValue || null;
+            };
+        }
+    },
+
+    
+    createDelayed: function(fn, delay, scope, args, appendArgs) {
+        if (scope || args) {
+            fn = Ext.Function.bind(fn, scope, args, appendArgs);
+        }
+        return function() {
+            var me = this;
+            setTimeout(function() {
+                fn.apply(me, arguments);
+            }, delay);
+        };
+    },
+
+    
+    defer: function(fn, millis, obj, args, appendArgs) {
+        fn = Ext.Function.bind(fn, obj, args, appendArgs);
+        if (millis > 0) {
+            return setTimeout(fn, millis);
+        }
+        fn();
+        return 0;
+    },
+
+    
+    createSequence: function(origFn, newFn, scope) {
+        if (!Ext.isFunction(newFn)) {
+            return origFn;
+        }
+        else {
+            return function() {
+                var retval = origFn.apply(this || window, arguments);
+                newFn.apply(scope || this || window, arguments);
+                return retval;
+            };
+        }
+    },
+
+    
+    createBuffered: function(fn, buffer, scope, args) {
+        return function(){
+            var timerId;
+            return function() {
+                var me = this;
+                if (timerId) {
+                    clearTimeout(timerId);
+                    timerId = null;
+                }
+                timerId = setTimeout(function(){
+                    fn.apply(scope || me, args || arguments);
+                }, buffer);
+            };
+        }();
+    },
+
+    
+    createThrottled: function(fn, interval, scope) {
+        var lastCallTime, elapsed, lastArgs, timer, execute = function() {
+            fn.apply(scope || this, lastArgs);
+            lastCallTime = new Date().getTime();
+        };
+
+        return function() {
+            elapsed = new Date().getTime() - lastCallTime;
+            lastArgs = arguments;
+
+            clearTimeout(timer);
+            if (!lastCallTime || (elapsed >= interval)) {
+                execute();
+            } else {
+                timer = setTimeout(execute, interval - elapsed);
+            }
+        };
+    },
+
+    
+    interceptBefore: function(object, methodName, fn) {
+        var method = object[methodName] || Ext.emptyFn;
+
+        return object[methodName] = function() {
+            var ret = fn.apply(this, arguments);
+            method.apply(this, arguments);
+
+            return ret;
+        };
+    },
+
+    
+    interceptAfter: function(object, methodName, fn) {
+        var method = object[methodName] || Ext.emptyFn;
+
+        return object[methodName] = function() {
+            method.apply(this, arguments);
+            return fn.apply(this, arguments);
+        };
+    }
+};
+
+
+Ext.defer = Ext.Function.alias(Ext.Function, 'defer');
+
+
+Ext.pass = Ext.Function.alias(Ext.Function, 'pass');
+
+
+Ext.bind = Ext.Function.alias(Ext.Function, 'bind');
+
+
+
+(function() {
+
+var ExtObject = Ext.Object = {
+
+    
+    toQueryObjects: function(name, value, recursive) {
+        var self = ExtObject.toQueryObjects,
+            objects = [],
+            i, ln;
+
+        if (Ext.isArray(value)) {
+            for (i = 0, ln = value.length; i < ln; i++) {
+                if (recursive) {
+                    objects = objects.concat(self(name + '[' + i + ']', value[i], true));
+                }
+                else {
+                    objects.push({
+                        name: name,
+                        value: value[i]
+                    });
+                }
+            }
+        }
+        else if (Ext.isObject(value)) {
+            for (i in value) {
+                if (value.hasOwnProperty(i)) {
+                    if (recursive) {
+                        objects = objects.concat(self(name + '[' + i + ']', value[i], true));
+                    }
+                    else {
+                        objects.push({
+                            name: name,
+                            value: value[i]
+                        });
+                    }
+                }
+            }
+        }
+        else {
+            objects.push({
+                name: name,
+                value: value
+            });
+        }
+
+        return objects;
+    },
+
+    
+    toQueryString: function(object, recursive) {
+        var paramObjects = [],
+            params = [],
+            i, j, ln, paramObject, value;
+
+        for (i in object) {
+            if (object.hasOwnProperty(i)) {
+                paramObjects = paramObjects.concat(ExtObject.toQueryObjects(i, object[i], recursive));
+            }
+        }
+
+        for (j = 0, ln = paramObjects.length; j < ln; j++) {
+            paramObject = paramObjects[j];
+            value = paramObject.value;
+
+            if (Ext.isEmpty(value)) {
+                value = '';
+            }
+            else if (Ext.isDate(value)) {
+                value = Ext.Date.toString(value);
+            }
+
+            params.push(encodeURIComponent(paramObject.name) + '=' + encodeURIComponent(String(value)));
+        }
+
+        return params.join('&');
+    },
+
+    
+    fromQueryString: function(queryString, recursive) {
+        var parts = queryString.replace(/^\?/, '').split('&'),
+            object = {},
+            temp, components, name, value, i, ln,
+            part, j, subLn, matchedKeys, matchedName,
+            keys, key, nextKey;
+
+        for (i = 0, ln = parts.length; i < ln; i++) {
+            part = parts[i];
+
+            if (part.length > 0) {
+                components = part.split('=');
+                name = decodeURIComponent(components[0]);
+                value = (components[1] !== undefined) ? decodeURIComponent(components[1]) : '';
+
+                if (!recursive) {
+                    if (object.hasOwnProperty(name)) {
+                        if (!Ext.isArray(object[name])) {
+                            object[name] = [object[name]];
+                        }
+
+                        object[name].push(value);
+                    }
+                    else {
+                        object[name] = value;
+                    }
+                }
+                else {
+                    matchedKeys = name.match(/(\[):?([^\]]*)\]/g);
+                    matchedName = name.match(/^([^\[]+)/);
+
+
+                    name = matchedName[0];
+                    keys = [];
+
+                    if (matchedKeys === null) {
+                        object[name] = value;
+                        continue;
+                    }
+
+                    for (j = 0, subLn = matchedKeys.length; j < subLn; j++) {
+                        key = matchedKeys[j];
+                        key = (key.length === 2) ? '' : key.substring(1, key.length - 1);
+                        keys.push(key);
+                    }
+
+                    keys.unshift(name);
+
+                    temp = object;
+
+                    for (j = 0, subLn = keys.length; j < subLn; j++) {
+                        key = keys[j];
+
+                        if (j === subLn - 1) {
+                            if (Ext.isArray(temp) && key === '') {
+                                temp.push(value);
+                            }
+                            else {
+                                temp[key] = value;
+                            }
+                        }
+                        else {
+                            if (temp[key] === undefined || typeof temp[key] === 'string') {
+                                nextKey = keys[j+1];
+
+                                temp[key] = (Ext.isNumeric(nextKey) || nextKey === '') ? [] : {};
+                            }
+
+                            temp = temp[key];
+                        }
+                    }
+                }
+            }
+        }
+
+        return object;
+    },
+
+    
+    each: function(object, fn, scope) {
+        for (var property in object) {
+            if (object.hasOwnProperty(property)) {
+                if (fn.call(scope || object, property, object[property], object) === false) {
+                    return;
+                }
+            }
+        }
+    },
+
+    
+    merge: function(source, key, value) {
+        if (typeof key === 'string') {
+            if (value && value.constructor === Object) {
+                if (source[key] && source[key].constructor === Object) {
+                    ExtObject.merge(source[key], value);
+                }
+                else {
+                    source[key] = Ext.clone(value);
+                }
+            }
+            else {
+                source[key] = value;
+            }
+
+            return source;
+        }
+
+        var i = 1,
+            ln = arguments.length,
+            object, property;
+
+        for (; i < ln; i++) {
+            object = arguments[i];
+
+            for (property in object) {
+                if (object.hasOwnProperty(property)) {
+                    ExtObject.merge(source, property, object[property]);
+                }
+            }
+        }
+
+        return source;
+    },
+
+    
+    getKey: function(object, value) {
+        for (var property in object) {
+            if (object.hasOwnProperty(property) && object[property] === value) {
+                return property;
+            }
+        }
+
+        return null;
+    },
+
+    
+    getValues: function(object) {
+        var values = [],
+            property;
+
+        for (property in object) {
+            if (object.hasOwnProperty(property)) {
+                values.push(object[property]);
+            }
+        }
+
+        return values;
+    },
+
+    
+    getKeys: ('keys' in Object.prototype) ? Object.keys : function(object) {
+        var keys = [],
+            property;
+
+        for (property in object) {
+            if (object.hasOwnProperty(property)) {
+                keys.push(property);
+            }
+        }
+
+        return keys;
+    },
+
+    
+    getSize: function(object) {
+        var size = 0,
+            property;
+
+        for (property in object) {
+            if (object.hasOwnProperty(property)) {
+                size++;
+            }
+        }
+
+        return size;
+    }
+};
+
+
+
+Ext.merge = Ext.Object.merge;
+
+
+Ext.urlEncode = function() {
+    var args = Ext.Array.from(arguments),
+        prefix = '';
+
+    
+    if ((typeof args[1] === 'string')) {
+        prefix = args[1] + '&';
+        args[1] = false;
+    }
+
+    return prefix + Ext.Object.toQueryString.apply(Ext.Object, args);
+};
+
+
+Ext.urlDecode = function() {
+    return Ext.Object.fromQueryString.apply(Ext.Object, arguments);
+};
+
+})();
+
+
+
+
+
+(function() {
+
+
+
+
+function xf(format) {
+    var args = Array.prototype.slice.call(arguments, 1);
+    return format.replace(/\{(\d+)\}/g, function(m, i) {
+        return args[i];
+    });
+}
+
+Ext.Date = {
+    
+    now: Date.now || function() {
+        return +new Date();
+    },
+
+    
+    toString: function(date) {
+        var pad = Ext.String.leftPad;
+
+        return date.getFullYear() + "-"
+            + pad(date.getMonth() + 1, 2, '0') + "-"
+            + pad(date.getDate(), 2, '0') + "T"
+            + pad(date.getHours(), 2, '0') + ":"
+            + pad(date.getMinutes(), 2, '0') + ":"
+            + pad(date.getSeconds(), 2, '0');
+    },
+
+    
+    getElapsed: function(dateA, dateB) {
+        return Math.abs(dateA - (dateB || new Date()));
+    },
+
+    
+    useStrict: false,
+
+    
+    formatCodeToRegex: function(character, currentGroup) {
+        
+        var p = utilDate.parseCodes[character];
+
+        if (p) {
+          p = typeof p == 'function'? p() : p;
+          utilDate.parseCodes[character] = p; 
+        }
+
+        return p ? Ext.applyIf({
+          c: p.c ? xf(p.c, currentGroup || "{0}") : p.c
+        }, p) : {
+            g: 0,
+            c: null,
+            s: Ext.String.escapeRegex(character) 
+        };
+    },
+
+    
+    parseFunctions: {
+        "MS": function(input, strict) {
+            
+            
+            var re = new RegExp('\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/');
+            var r = (input || '').match(re);
+            return r? new Date(((r[1] || '') + r[2]) * 1) : null;
+        }
+    },
+    parseRegexes: [],
+
+    
+    formatFunctions: {
+        "MS": function() {
+            
+            return '\\/Date(' + this.getTime() + ')\\/';
+        }
+    },
+
+    y2kYear : 50,
+
+    
+    MILLI : "ms",
+
+    
+    SECOND : "s",
+
+    
+    MINUTE : "mi",
+
+    
+    HOUR : "h",
+
+    
+    DAY : "d",
+
+    
+    MONTH : "mo",
+
+    
+    YEAR : "y",
+
+    
+    defaults: {},
+
+    
+    dayNames : [
+        "Sunday",
+        "Monday",
+        "Tuesday",
+        "Wednesday",
+        "Thursday",
+        "Friday",
+        "Saturday"
+    ],
+
+    
+    monthNames : [
+        "January",
+        "February",
+        "March",
+        "April",
+        "May",
+        "June",
+        "July",
+        "August",
+        "September",
+        "October",
+        "November",
+        "December"
+    ],
+
+    
+    monthNumbers : {
+        Jan:0,
+        Feb:1,
+        Mar:2,
+        Apr:3,
+        May:4,
+        Jun:5,
+        Jul:6,
+        Aug:7,
+        Sep:8,
+        Oct:9,
+        Nov:10,
+        Dec:11
+    },
+    
+    defaultFormat : "m/d/Y",
+    
+    getShortMonthName : function(month) {
+        return utilDate.monthNames[month].substring(0, 3);
+    },
+
+    
+    getShortDayName : function(day) {
+        return utilDate.dayNames[day].substring(0, 3);
+    },
+
+    
+    getMonthNumber : function(name) {
+        
+        return utilDate.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];
+    },
+
+    
+    formatContainsHourInfo : (function(){
+        var stripEscapeRe = /(\\.)/g,
+            hourInfoRe = /([gGhHisucUOPZ]|MS)/;
+        return function(format){
+            return hourInfoRe.test(format.replace(stripEscapeRe, ''));
+        };
+    })(),
+
+    
+    formatContainsDateInfo : (function(){
+        var stripEscapeRe = /(\\.)/g,
+            dateInfoRe = /([djzmnYycU]|MS)/;
+
+        return function(format){
+            return dateInfoRe.test(format.replace(stripEscapeRe, ''));
+        };
+    })(),
+
+    
+    formatCodes : {
+        d: "Ext.String.leftPad(this.getDate(), 2, '0')",
+        D: "Ext.Date.getShortDayName(this.getDay())", 
+        j: "this.getDate()",
+        l: "Ext.Date.dayNames[this.getDay()]",
+        N: "(this.getDay() ? this.getDay() : 7)",
+        S: "Ext.Date.getSuffix(this)",
+        w: "this.getDay()",
+        z: "Ext.Date.getDayOfYear(this)",
+        W: "Ext.String.leftPad(Ext.Date.getWeekOfYear(this), 2, '0')",
+        F: "Ext.Date.monthNames[this.getMonth()]",
+        m: "Ext.String.leftPad(this.getMonth() + 1, 2, '0')",
+        M: "Ext.Date.getShortMonthName(this.getMonth())", 
+        n: "(this.getMonth() + 1)",
+        t: "Ext.Date.getDaysInMonth(this)",
+        L: "(Ext.Date.isLeapYear(this) ? 1 : 0)",
+        o: "(this.getFullYear() + (Ext.Date.getWeekOfYear(this) == 1 && this.getMonth() > 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",
+        Y: "Ext.String.leftPad(this.getFullYear(), 4, '0')",
+        y: "('' + this.getFullYear()).substring(2, 4)",
+        a: "(this.getHours() < 12 ? 'am' : 'pm')",
+        A: "(this.getHours() < 12 ? 'AM' : 'PM')",
+        g: "((this.getHours() % 12) ? this.getHours() % 12 : 12)",
+        G: "this.getHours()",
+        h: "Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",
+        H: "Ext.String.leftPad(this.getHours(), 2, '0')",
+        i: "Ext.String.leftPad(this.getMinutes(), 2, '0')",
+        s: "Ext.String.leftPad(this.getSeconds(), 2, '0')",
+        u: "Ext.String.leftPad(this.getMilliseconds(), 3, '0')",
+        O: "Ext.Date.getGMTOffset(this)",
+        P: "Ext.Date.getGMTOffset(this, true)",
+        T: "Ext.Date.getTimezone(this)",
+        Z: "(this.getTimezoneOffset() * -60)",
+
+        c: function() { 
+            for (var c = "Y-m-dTH:i:sP", code = [], i = 0, l = c.length; i < l; ++i) {
+                var e = c.charAt(i);
+                code.push(e == "T" ? "'T'" : utilDate.getFormatCode(e)); 
+            }
+            return code.join(" + ");
+        },
+        
+
+        U: "Math.round(this.getTime() / 1000)"
+    },
+
+    
+    isValid : function(y, m, d, h, i, s, ms) {
+        
+        h = h || 0;
+        i = i || 0;
+        s = s || 0;
+        ms = ms || 0;
+
+        
+        var dt = utilDate.add(new Date(y < 100 ? 100 : y, m - 1, d, h, i, s, ms), utilDate.YEAR, y < 100 ? y - 100 : 0);
+
+        return y == dt.getFullYear() &&
+            m == dt.getMonth() + 1 &&
+            d == dt.getDate() &&
+            h == dt.getHours() &&
+            i == dt.getMinutes() &&
+            s == dt.getSeconds() &&
+            ms == dt.getMilliseconds();
+    },
+
+    
+    parse : function(input, format, strict) {
+        var p = utilDate.parseFunctions;
+        if (p[format] == null) {
+            utilDate.createParser(format);
+        }
+        return p[format](input, Ext.isDefined(strict) ? strict : utilDate.useStrict);
+    },
+
+    
+    parseDate: function(input, format, strict){
+        return utilDate.parse(input, format, strict);
+    },
+
+
+    
+    getFormatCode : function(character) {
+        var f = utilDate.formatCodes[character];
+
+        if (f) {
+          f = typeof f == 'function'? f() : f;
+          utilDate.formatCodes[character] = f; 
+        }
+
+        
+        return f || ("'" + Ext.String.escape(character) + "'");
+    },
+
+    
+    createFormat : function(format) {
+        var code = [],
+            special = false,
+            ch = '';
+
+        for (var i = 0; i < format.length; ++i) {
+            ch = format.charAt(i);
+            if (!special && ch == "\\") {
+                special = true;
+            } else if (special) {
+                special = false;
+                code.push("'" + Ext.String.escape(ch) + "'");
+            } else {
+                code.push(utilDate.getFormatCode(ch));
+            }
+        }
+        utilDate.formatFunctions[format] = Ext.functionFactory("return " + code.join('+'));
+    },
+
+    
+    createParser : (function() {
+        var code = [
+            "var dt, y, m, d, h, i, s, ms, o, z, zz, u, v,",
+                "def = Ext.Date.defaults,",
+                "results = String(input).match(Ext.Date.parseRegexes[{0}]);", 
+
+            "if(results){",
+                "{1}",
+
+                "if(u != null){", 
+                    "v = new Date(u * 1000);", 
+                "}else{",
+                    
+                    
+                    
+                    "dt = Ext.Date.clearTime(new Date);",
+
+                    
+                    "y = Ext.Number.from(y, Ext.Number.from(def.y, dt.getFullYear()));",
+                    "m = Ext.Number.from(m, Ext.Number.from(def.m - 1, dt.getMonth()));",
+                    "d = Ext.Number.from(d, Ext.Number.from(def.d, dt.getDate()));",
+
+                    
+                    "h  = Ext.Number.from(h, Ext.Number.from(def.h, dt.getHours()));",
+                    "i  = Ext.Number.from(i, Ext.Number.from(def.i, dt.getMinutes()));",
+                    "s  = Ext.Number.from(s, Ext.Number.from(def.s, dt.getSeconds()));",
+                    "ms = Ext.Number.from(ms, Ext.Number.from(def.ms, dt.getMilliseconds()));",
+
+                    "if(z >= 0 && y >= 0){",
+                        
+                        
+
+                        
+                        
+                        "v = Ext.Date.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);",
+
+                        
+                        "v = !strict? v : (strict === true && (z <= 364 || (Ext.Date.isLeapYear(v) && z <= 365))? Ext.Date.add(v, Ext.Date.DAY, z) : null);",
+                    "}else if(strict === true && !Ext.Date.isValid(y, m + 1, d, h, i, s, ms)){", 
+                        "v = null;", 
+                    "}else{",
+                        
+                        
+                        "v = Ext.Date.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);",
+                    "}",
+                "}",
+            "}",
+
+            "if(v){",
+                
+                "if(zz != null){",
+                    
+                    "v = Ext.Date.add(v, Ext.Date.SECOND, -v.getTimezoneOffset() * 60 - zz);",
+                "}else if(o){",
+                    
+                    "v = Ext.Date.add(v, Ext.Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));",
+                "}",
+            "}",
+
+            "return v;"
+        ].join('\n');
+
+        return function(format) {
+            var regexNum = utilDate.parseRegexes.length,
+                currentGroup = 1,
+                calc = [],
+                regex = [],
+                special = false,
+                ch = "";
+
+            for (var i = 0; i < format.length; ++i) {
+                ch = format.charAt(i);
+                if (!special && ch == "\\") {
+                    special = true;
+                } else if (special) {
+                    special = false;
+                    regex.push(Ext.String.escape(ch));
+                } else {
+                    var obj = utilDate.formatCodeToRegex(ch, currentGroup);
+                    currentGroup += obj.g;
+                    regex.push(obj.s);
+                    if (obj.g && obj.c) {
+                        calc.push(obj.c);
+                    }
+                }
+            }
+
+            utilDate.parseRegexes[regexNum] = new RegExp("^" + regex.join('') + "$", 'i');
+            utilDate.parseFunctions[format] = Ext.functionFactory("input", "strict", xf(code, regexNum, calc.join('')));
+        };
+    })(),
+
+    
+    parseCodes : {
+        
+        d: {
+            g:1,
+            c:"d = parseInt(results[{0}], 10);\n",
+            s:"(\\d{2})" 
+        },
+        j: {
+            g:1,
+            c:"d = parseInt(results[{0}], 10);\n",
+            s:"(\\d{1,2})" 
+        },
+        D: function() {
+            for (var a = [], i = 0; i < 7; a.push(utilDate.getShortDayName(i)), ++i); 
+            return {
+                g:0,
+                c:null,
+                s:"(?:" + a.join("|") +")"
+            };
+        },
+        l: function() {
+            return {
+                g:0,
+                c:null,
+                s:"(?:" + utilDate.dayNames.join("|") + ")"
+            };
+        },
+        N: {
+            g:0,
+            c:null,
+            s:"[1-7]" 
+        },
+        S: {
+            g:0,
+            c:null,
+            s:"(?:st|nd|rd|th)"
+        },
+        w: {
+            g:0,
+            c:null,
+            s:"[0-6]" 
+        },
+        z: {
+            g:1,
+            c:"z = parseInt(results[{0}], 10);\n",
+            s:"(\\d{1,3})" 
+        },
+        W: {
+            g:0,
+            c:null,
+            s:"(?:\\d{2})" 
+        },
+        F: function() {
+            return {
+                g:1,
+                c:"m = parseInt(Ext.Date.getMonthNumber(results[{0}]), 10);\n", 
+                s:"(" + utilDate.monthNames.join("|") + ")"
+            };
+        },
+        M: function() {
+            for (var a = [], i = 0; i < 12; a.push(utilDate.getShortMonthName(i)), ++i); 
+            return Ext.applyIf({
+                s:"(" + a.join("|") + ")"
+            }, utilDate.formatCodeToRegex("F"));
+        },
+        m: {
+            g:1,
+            c:"m = parseInt(results[{0}], 10) - 1;\n",
+            s:"(\\d{2})" 
+        },
+        n: {
+            g:1,
+            c:"m = parseInt(results[{0}], 10) - 1;\n",
+            s:"(\\d{1,2})" 
+        },
+        t: {
+            g:0,
+            c:null,
+            s:"(?:\\d{2})" 
+        },
+        L: {
+            g:0,
+            c:null,
+            s:"(?:1|0)"
+        },
+        o: function() {
+            return utilDate.formatCodeToRegex("Y");
+        },
+        Y: {
+            g:1,
+            c:"y = parseInt(results[{0}], 10);\n",
+            s:"(\\d{4})" 
+        },
+        y: {
+            g:1,
+            c:"var ty = parseInt(results[{0}], 10);\n"
+                + "y = ty > Ext.Date.y2kYear ? 1900 + ty : 2000 + ty;\n", 
+            s:"(\\d{1,2})"
+        },
+        
+        a: {
+            g:1,
+            c:"if (/(am)/i.test(results[{0}])) {\n"
+                + "if (!h || h == 12) { h = 0; }\n"
+                + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
+            s:"(am|pm|AM|PM)"
+        },
+        A: {
+            g:1,
+            c:"if (/(am)/i.test(results[{0}])) {\n"
+                + "if (!h || h == 12) { h = 0; }\n"
+                + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
+            s:"(AM|PM|am|pm)"
+        },
+        g: function() {
+            return utilDate.formatCodeToRegex("G");
+        },
+        G: {
+            g:1,
+            c:"h = parseInt(results[{0}], 10);\n",
+            s:"(\\d{1,2})" 
+        },
+        h: function() {
+            return utilDate.formatCodeToRegex("H");
+        },
+        H: {
+            g:1,
+            c:"h = parseInt(results[{0}], 10);\n",
+            s:"(\\d{2})" 
+        },
+        i: {
+            g:1,
+            c:"i = parseInt(results[{0}], 10);\n",
+            s:"(\\d{2})" 
+        },
+        s: {
+            g:1,
+            c:"s = parseInt(results[{0}], 10);\n",
+            s:"(\\d{2})" 
+        },
+        u: {
+            g:1,
+            c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",
+            s:"(\\d+)" 
+        },
+        O: {
+            g:1,
+            c:[
+                "o = results[{0}];",
+                "var sn = o.substring(0,1),", 
+                    "hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),", 
+                    "mn = o.substring(3,5) % 60;", 
+                "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n" 
+            ].join("\n"),
+            s: "([+\-]\\d{4})" 
+        },
+        P: {
+            g:1,
+            c:[
+                "o = results[{0}];",
+                "var sn = o.substring(0,1),", 
+                    "hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),", 
+                    "mn = o.substring(4,6) % 60;", 
+                "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n" 
+            ].join("\n"),
+            s: "([+\-]\\d{2}:\\d{2})" 
+        },
+        T: {
+            g:0,
+            c:null,
+            s:"[A-Z]{1,4}" 
+        },
+        Z: {
+            g:1,
+            c:"zz = results[{0}] * 1;\n" 
+                  + "zz = (-43200 <= zz && zz <= 50400)? zz : null;\n",
+            s:"([+\-]?\\d{1,5})" 
+        },
+        c: function() {
+            var calc = [],
+                arr = [
+                    utilDate.formatCodeToRegex("Y", 1), 
+                    utilDate.formatCodeToRegex("m", 2), 
+                    utilDate.formatCodeToRegex("d", 3), 
+                    utilDate.formatCodeToRegex("h", 4), 
+                    utilDate.formatCodeToRegex("i", 5), 
+                    utilDate.formatCodeToRegex("s", 6), 
+                    {c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"}, 
+                    {c:[ 
+                        "if(results[8]) {", 
+                            "if(results[8] == 'Z'){",
+                                "zz = 0;", 
+                            "}else if (results[8].indexOf(':') > -1){",
+                                utilDate.formatCodeToRegex("P", 8).c, 
+                            "}else{",
+                                utilDate.formatCodeToRegex("O", 8).c, 
+                            "}",
+                        "}"
+                    ].join('\n')}
+                ];
+
+            for (var i = 0, l = arr.length; i < l; ++i) {
+                calc.push(arr[i].c);
+            }
+
+            return {
+                g:1,
+                c:calc.join(""),
+                s:[
+                    arr[0].s, 
+                    "(?:", "-", arr[1].s, 
+                        "(?:", "-", arr[2].s, 
+                            "(?:",
+                                "(?:T| )?", 
+                                arr[3].s, ":", arr[4].s,  
+                                "(?::", arr[5].s, ")?", 
+                                "(?:(?:\\.|,)(\\d+))?", 
+                                "(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?", 
+                            ")?",
+                        ")?",
+                    ")?"
+                ].join("")
+            };
+        },
+        U: {
+            g:1,
+            c:"u = parseInt(results[{0}], 10);\n",
+            s:"(-?\\d+)" 
+        }
+    },
+
+    
+    
+    dateFormat: function(date, format) {
+        return utilDate.format(date, format);
+    },
+
+    
+    format: function(date, format) {
+        if (utilDate.formatFunctions[format] == null) {
+            utilDate.createFormat(format);
+        }
+        var result = utilDate.formatFunctions[format].call(date);
+        return result + '';
+    },
+
+    
+    getTimezone : function(date) {
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        return date.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
+    },
+
+    
+    getGMTOffset : function(date, colon) {
+        var offset = date.getTimezoneOffset();
+        return (offset > 0 ? "-" : "+")
+            + Ext.String.leftPad(Math.floor(Math.abs(offset) / 60), 2, "0")
+            + (colon ? ":" : "")
+            + Ext.String.leftPad(Math.abs(offset % 60), 2, "0");
+    },
+
+    
+    getDayOfYear: function(date) {
+        var num = 0,
+            d = Ext.Date.clone(date),
+            m = date.getMonth(),
+            i;
+
+        for (i = 0, d.setDate(1), d.setMonth(0); i < m; d.setMonth(++i)) {
+            num += utilDate.getDaysInMonth(d);
+        }
+        return num + date.getDate() - 1;
+    },
+
+    
+    getWeekOfYear : (function() {
+        
+        var ms1d = 864e5, 
+            ms7d = 7 * ms1d; 
+
+        return function(date) { 
+            var DC3 = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate() + 3) / ms1d, 
+                AWN = Math.floor(DC3 / 7), 
+                Wyr = new Date(AWN * ms7d).getUTCFullYear();
+
+            return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
+        };
+    })(),
+
+    
+    isLeapYear : function(date) {
+        var year = date.getFullYear();
+        return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
+    },
+
+    
+    getFirstDayOfMonth : function(date) {
+        var day = (date.getDay() - (date.getDate() - 1)) % 7;
+        return (day < 0) ? (day + 7) : day;
+    },
+
+    
+    getLastDayOfMonth : function(date) {
+        return utilDate.getLastDateOfMonth(date).getDay();
+    },
+
+
+    
+    getFirstDateOfMonth : function(date) {
+        return new Date(date.getFullYear(), date.getMonth(), 1);
+    },
+
+    
+    getLastDateOfMonth : function(date) {
+        return new Date(date.getFullYear(), date.getMonth(), utilDate.getDaysInMonth(date));
+    },
+
+    
+    getDaysInMonth: (function() {
+        var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+        return function(date) { 
+            var m = date.getMonth();
+
+            return m == 1 && utilDate.isLeapYear(date) ? 29 : daysInMonth[m];
+        };
+    })(),
+
+    
+    getSuffix : function(date) {
+        switch (date.getDate()) {
+            case 1:
+            case 21:
+            case 31:
+                return "st";
+            case 2:
+            case 22:
+                return "nd";
+            case 3:
+            case 23:
+                return "rd";
+            default:
+                return "th";
+        }
+    },
+
+    
+    clone : function(date) {
+        return new Date(date.getTime());
+    },
+
+    
+    isDST : function(date) {
+        
+        
+        return new Date(date.getFullYear(), 0, 1).getTimezoneOffset() != date.getTimezoneOffset();
+    },
+
+    
+    clearTime : function(date, clone) {
+        if (clone) {
+            return Ext.Date.clearTime(Ext.Date.clone(date));
+        }
+
+        
+        var d = date.getDate();
+
+        
+        date.setHours(0);
+        date.setMinutes(0);
+        date.setSeconds(0);
+        date.setMilliseconds(0);
+
+        if (date.getDate() != d) { 
+            
+            
+
+            
+            for (var hr = 1, c = utilDate.add(date, Ext.Date.HOUR, hr); c.getDate() != d; hr++, c = utilDate.add(date, Ext.Date.HOUR, hr));
+
+            date.setDate(d);
+            date.setHours(c.getHours());
+        }
+
+        return date;
+    },
+
+    
+    add : function(date, interval, value) {
+        var d = Ext.Date.clone(date),
+            Date = Ext.Date;
+        if (!interval || value === 0) return d;
+
+        switch(interval.toLowerCase()) {
+            case Ext.Date.MILLI:
+                d.setMilliseconds(d.getMilliseconds() + value);
+                break;
+            case Ext.Date.SECOND:
+                d.setSeconds(d.getSeconds() + value);
+                break;
+            case Ext.Date.MINUTE:
+                d.setMinutes(d.getMinutes() + value);
+                break;
+            case Ext.Date.HOUR:
+                d.setHours(d.getHours() + value);
+                break;
+            case Ext.Date.DAY:
+                d.setDate(d.getDate() + value);
+                break;
+            case Ext.Date.MONTH:
+                var day = date.getDate();
+                if (day > 28) {
+                    day = Math.min(day, Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(date), 'mo', value)).getDate());
+                }
+                d.setDate(day);
+                d.setMonth(date.getMonth() + value);
+                break;
+            case Ext.Date.YEAR:
+                d.setFullYear(date.getFullYear() + value);
+                break;
+        }
+        return d;
+    },
+
+    
+    between : function(date, start, end) {
+        var t = date.getTime();
+        return start.getTime() <= t && t <= end.getTime();
+    },
+
+    
+    compat: function() {
+        var nativeDate = window.Date,
+            p, u,
+            statics = ['useStrict', 'formatCodeToRegex', 'parseFunctions', 'parseRegexes', 'formatFunctions', 'y2kYear', 'MILLI', 'SECOND', 'MINUTE', 'HOUR', 'DAY', 'MONTH', 'YEAR', 'defaults', 'dayNames', 'monthNames', 'monthNumbers', 'getShortMonthName', 'getShortDayName', 'getMonthNumber', 'formatCodes', 'isValid', 'parseDate', 'getFormatCode', 'createFormat', 'createParser', 'parseCodes'],
+            proto = ['dateFormat', 'format', 'getTimezone', 'getGMTOffset', 'getDayOfYear', 'getWeekOfYear', 'isLeapYear', 'getFirstDayOfMonth', 'getLastDayOfMonth', 'getDaysInMonth', 'getSuffix', 'clone', 'isDST', 'clearTime', 'add', 'between'];
+
+        
+        Ext.Array.forEach(statics, function(s) {
+            nativeDate[s] = utilDate[s];
+        });
+
+        
+        Ext.Array.forEach(proto, function(s) {
+            nativeDate.prototype[s] = function() {
+                var args = Array.prototype.slice.call(arguments);
+                args.unshift(this);
+                return utilDate[s].apply(utilDate, args);
+            };
+        });
+    }
+};
+
+var utilDate = Ext.Date;
+
+})();
+
+
+(function(flexSetter) {
+
+var Base = Ext.Base = function() {};
+    Base.prototype = {
+        $className: 'Ext.Base',
+
+        $class: Base,
+
+        
+        self: Base,
+
+        
+        constructor: function() {
+            return this;
+        },
+
+        
+        
+        initConfig: function(config) {
+            if (!this.$configInited) {
+                this.config = Ext.Object.merge({}, this.config || {}, config || {});
+
+                this.applyConfig(this.config);
+
+                this.$configInited = true;
+            }
+
+            return this;
+        },
+
+        
+        setConfig: function(config) {
+            this.applyConfig(config || {});
+
+            return this;
+        },
+
+        
+        applyConfig: flexSetter(function(name, value) {
+            var setter = 'set' + Ext.String.capitalize(name);
+
+            if (typeof this[setter] === 'function') {
+                this[setter].call(this, value);
+            }
+
+            return this;
+        }),
+        
+
+        
+        callParent: function(args) {
+            var method = this.callParent.caller,
+                parentClass, methodName;
+
+            if (!method.$owner) {
+
+                method = method.caller;
+            }
+
+            parentClass = method.$owner.superclass;
+            methodName = method.$name;
+
+
+            return parentClass[methodName].apply(this, args || []);
+        },
+
+
+        
+        statics: function() {
+            var method = this.statics.caller,
+                self = this.self;
+
+            if (!method) {
+                return self;
+            }
+
+            return method.$owner;
+        },
+
+        
+        callOverridden: function(args) {
+            var method = this.callOverridden.caller;
+
+
+            return method.$previous.apply(this, args || []);
+        },
+
+        destroy: function() {}
+    };
+
+    
+    Ext.apply(Ext.Base, {
+        
+        create: function() {
+            return Ext.create.apply(Ext, [this].concat(Array.prototype.slice.call(arguments, 0)));
+        },
+
+        
+        own: function(name, value) {
+            if (typeof value == 'function') {
+                this.ownMethod(name, value);
+            }
+            else {
+                this.prototype[name] = value;
+            }
+        },
+
+        
+        ownMethod: function(name, fn) {
+            var originalFn;
+
+            if (typeof fn.$owner !== 'undefined' && fn !== Ext.emptyFn) {
+                originalFn = fn;
+
+                fn = function() {
+                    return originalFn.apply(this, arguments);
+                };
+            }
+
+            fn.$owner = this;
+            fn.$name = name;
+
+            this.prototype[name] = fn;
+        },
+
+        
+        addStatics: function(members) {
+            for (var name in members) {
+                if (members.hasOwnProperty(name)) {
+                    this[name] = members[name];
+                }
+            }
+
+            return this;
+        },
+
+        
+        addInheritableStatics: function(members) {
+            var inheritableStatics,
+                hasInheritableStatics,
+                prototype = this.prototype,
+                name, member;
+
+            inheritableStatics = prototype.$inheritableStatics;
+            hasInheritableStatics = prototype.$hasInheritableStatics;
+
+            if (!inheritableStatics) {
+                inheritableStatics = prototype.$inheritableStatics = [];
+                hasInheritableStatics = prototype.$hasInheritableStatics = {};
+            }
+
+
+            for (name in members) {
+                if (members.hasOwnProperty(name)) {
+                    member = members[name];
+                    this[name] = member;
+
+                    if (!hasInheritableStatics[name]) {
+                        hasInheritableStatics[name] = true;
+                        inheritableStatics.push(name);
+                    }
+                }
+            }
+
+            return this;
+        },
+
+        
+        implement: function(members) {
+            var prototype = this.prototype,
+                enumerables = Ext.enumerables,
+                name, i, member;
+            for (name in members) {
+                if (members.hasOwnProperty(name)) {
+                    member = members[name];
+
+                    if (typeof member === 'function') {
+                        member.$owner = this;
+                        member.$name = name;
+                    }
+
+                    prototype[name] = member;
+                }
+            }
+
+            if (enumerables) {
+                for (i = enumerables.length; i--;) {
+                    name = enumerables[i];
+
+                    if (members.hasOwnProperty(name)) {
+                        member = members[name];
+                        member.$owner = this;
+                        member.$name = name;
+                        prototype[name] = member;
+                    }
+                }
+            }
+        },
+
+        
+        borrow: function(fromClass, members) {
+            var fromPrototype = fromClass.prototype,
+                i, ln, member;
+
+            members = Ext.Array.from(members);
+
+            for (i = 0, ln = members.length; i < ln; i++) {
+                member = members[i];
+
+                this.own(member, fromPrototype[member]);
+            }
+
+            return this;
+        },
+
+        
+        override: function(members) {
+            var prototype = this.prototype,
+                enumerables = Ext.enumerables,
+                name, i, member, previous;
+
+            if (arguments.length === 2) {
+                name = members;
+                member = arguments[1];
+
+                if (typeof member == 'function') {
+                    if (typeof prototype[name] == 'function') {
+                        previous = prototype[name];
+                        member.$previous = previous;
+                    }
+
+                    this.ownMethod(name, member);
+                }
+                else {
+                    prototype[name] = member;
+                }
+
+                return this;
+            }
+
+            for (name in members) {
+                if (members.hasOwnProperty(name)) {
+                    member = members[name];
+
+                    if (typeof member === 'function') {
+                        if (typeof prototype[name] === 'function') {
+                            previous = prototype[name];
+                            member.$previous = previous;
+                        }
+
+                        this.ownMethod(name, member);
+                    }
+                    else {
+                        prototype[name] = member;
+                    }
+                }
+            }
+
+            if (enumerables) {
+                for (i = enumerables.length; i--;) {
+                    name = enumerables[i];
+
+                    if (members.hasOwnProperty(name)) {
+                        if (typeof prototype[name] !== 'undefined') {
+                            previous = prototype[name];
+                            members[name].$previous = previous;
+                        }
+
+                        this.ownMethod(name, members[name]);
+                    }
+                }
+            }
+
+            return this;
+        },
+
+        
+        
+        mixin: function(name, cls) {
+            var mixin = cls.prototype,
+                my = this.prototype,
+                key, fn;
+
+            for (key in mixin) {
+                if (mixin.hasOwnProperty(key)) {
+                    if (typeof my[key] === 'undefined' && key !== 'mixins' && key !== 'mixinId') {
+                        if (typeof mixin[key] === 'function') {
+                            fn = mixin[key];
+
+                            if (typeof fn.$owner === 'undefined') {
+                                this.ownMethod(key, fn);
+                            }
+                            else {
+                                my[key] = fn;
+                            }
+                        }
+                        else {
+                            my[key] = mixin[key];
+                        }
+                    }
+                    
+                    else if (key === 'config' && my.config && mixin.config) {
+                        Ext.Object.merge(my.config, mixin.config);
+                    }
+                    
+                }
+            }
+
+            if (typeof mixin.onClassMixedIn !== 'undefined') {
+                mixin.onClassMixedIn.call(cls, this);
+            }
+
+            if (!my.hasOwnProperty('mixins')) {
+                if ('mixins' in my) {
+                    my.mixins = Ext.Object.merge({}, my.mixins);
+                }
+                else {
+                    my.mixins = {};
+                }
+            }
+
+            my.mixins[name] = mixin;
+        },
+        
+
+        
+        getName: function() {
+            return Ext.getClassName(this);
+        },
+
+        
+        createAlias: flexSetter(function(alias, origin) {
+            this.prototype[alias] = function() {
+                return this[origin].apply(this, arguments);
+            }
+        })
+    });
+
+})(Ext.Function.flexSetter);
+
+
+(function() {
+
+    var Class,
+        Base = Ext.Base,
+        baseStaticProperties = [],
+        baseStaticProperty;
+
+    for (baseStaticProperty in Base) {
+        if (Base.hasOwnProperty(baseStaticProperty)) {
+            baseStaticProperties.push(baseStaticProperty);
+        }
+    }
+
+    
+    Ext.Class = Class = function(newClass, classData, onClassCreated) {
+        if (typeof newClass != 'function') {
+            onClassCreated = classData;
+            classData = newClass;
+            newClass = function() {
+                return this.constructor.apply(this, arguments);
+            };
+        }
+
+        if (!classData) {
+            classData = {};
+        }
+
+        var preprocessorStack = classData.preprocessors || Class.getDefaultPreprocessors(),
+            registeredPreprocessors = Class.getPreprocessors(),
+            index = 0,
+            preprocessors = [],
+            preprocessor, staticPropertyName, process, i, j, ln;
+
+        for (i = 0, ln = baseStaticProperties.length; i < ln; i++) {
+            staticPropertyName = baseStaticProperties[i];
+            newClass[staticPropertyName] = Base[staticPropertyName];
+        }
+
+        delete classData.preprocessors;
+
+        for (j = 0, ln = preprocessorStack.length; j < ln; j++) {
+            preprocessor = preprocessorStack[j];
+
+            if (typeof preprocessor == 'string') {
+                preprocessor = registeredPreprocessors[preprocessor];
+
+                if (!preprocessor.always) {
+                    if (classData.hasOwnProperty(preprocessor.name)) {
+                        preprocessors.push(preprocessor.fn);
+                    }
+                }
+                else {
+                    preprocessors.push(preprocessor.fn);
+                }
+            }
+            else {
+                preprocessors.push(preprocessor);
+            }
+        }
+
+        classData.onClassCreated = onClassCreated || Ext.emptyFn;
+
+        classData.onBeforeClassCreated = function(cls, data) {
+            onClassCreated = data.onClassCreated;
+
+            delete data.onBeforeClassCreated;
+            delete data.onClassCreated;
+
+            cls.implement(data);
+
+            onClassCreated.call(cls, cls);
+        };
+
+        process = function(cls, data) {
+            preprocessor = preprocessors[index++];
+
+            if (!preprocessor) {
+                data.onBeforeClassCreated.apply(this, arguments);
+                return;
+            }
+
+            if (preprocessor.call(this, cls, data, process) !== false) {
+                process.apply(this, arguments);
+            }
+        };
+
+        process.call(Class, newClass, classData);
+
+        return newClass;
+    };
+
+    Ext.apply(Class, {
+
+        
+        preprocessors: {},
+
+        
+        registerPreprocessor: function(name, fn, always) {
+            this.preprocessors[name] = {
+                name: name,
+                always: always ||  false,
+                fn: fn
+            };
+
+            return this;
+        },
+
+        
+        getPreprocessor: function(name) {
+            return this.preprocessors[name];
+        },
+
+        getPreprocessors: function() {
+            return this.preprocessors;
+        },
+
+        
+        getDefaultPreprocessors: function() {
+            return this.defaultPreprocessors || [];
+        },
+
+        
+        setDefaultPreprocessors: function(preprocessors) {
+            this.defaultPreprocessors = Ext.Array.from(preprocessors);
+
+            return this;
+        },
+
+        
+        setDefaultPreprocessorPosition: function(name, offset, relativeName) {
+            var defaultPreprocessors = this.defaultPreprocessors,
+                index;
+
+            if (typeof offset == 'string') {
+                if (offset === 'first') {
+                    defaultPreprocessors.unshift(name);
+
+                    return this;
+                }
+                else if (offset === 'last') {
+                    defaultPreprocessors.push(name);
+
+                    return this;
+                }
+
+                offset = (offset === 'after') ? 1 : -1;
+            }
+
+            index = Ext.Array.indexOf(defaultPreprocessors, relativeName);
+
+            if (index !== -1) {
+                Ext.Array.splice(defaultPreprocessors, Math.max(0, index + offset), 0, name);
+            }
+
+            return this;
+        }
+    });
+
+    
+    Class.registerPreprocessor('extend', function(cls, data) {
+        var extend = data.extend,
+            base = Ext.Base,
+            basePrototype = base.prototype,
+            prototype = function() {},
+            parent, i, k, ln, staticName, parentStatics,
+            parentPrototype, clsPrototype;
+
+        if (extend && extend !== Object) {
+            parent = extend;
+        }
+        else {
+            parent = base;
+        }
+
+        parentPrototype = parent.prototype;
+
+        prototype.prototype = parentPrototype;
+        clsPrototype = cls.prototype = new prototype();
+
+        if (!('$class' in parent)) {
+            for (i in basePrototype) {
+                if (!parentPrototype[i]) {
+                    parentPrototype[i] = basePrototype[i];
+                }
+            }
+        }
+
+        clsPrototype.self = cls;
+
+        cls.superclass = clsPrototype.superclass = parentPrototype;
+
+        delete data.extend;
+
+        
+        
+        parentStatics = parentPrototype.$inheritableStatics;
+
+        if (parentStatics) {
+            for (k = 0, ln = parentStatics.length; k < ln; k++) {
+                staticName = parentStatics[k];
+
+                if (!cls.hasOwnProperty(staticName)) {
+                    cls[staticName] = parent[staticName];
+                }
+            }
+        }
+        
+
+        
+        
+        if (parentPrototype.config) {
+            clsPrototype.config = Ext.Object.merge({}, parentPrototype.config);
+        }
+        else {
+            clsPrototype.config = {};
+        }
+        
+
+        
+        if (clsPrototype.$onExtended) {
+            clsPrototype.$onExtended.call(cls, cls, data);
+        }
+
+        if (data.onClassExtended) {
+            clsPrototype.$onExtended = data.onClassExtended;
+            delete data.onClassExtended;
+        }
+        
+
+    }, true);
+
+    
+    
+    Class.registerPreprocessor('statics', function(cls, data) {
+        cls.addStatics(data.statics);
+
+        delete data.statics;
+    });
+    
+
+    
+    
+    Class.registerPreprocessor('inheritableStatics', function(cls, data) {
+        cls.addInheritableStatics(data.inheritableStatics);
+
+        delete data.inheritableStatics;
+    });
+    
+
+    
+    
+    Class.registerPreprocessor('config', function(cls, data) {
+        var prototype = cls.prototype;
+
+        Ext.Object.each(data.config, function(name) {
+            var cName = name.charAt(0).toUpperCase() + name.substr(1),
+                pName = name,
+                apply = 'apply' + cName,
+                setter = 'set' + cName,
+                getter = 'get' + cName;
+
+            if (!(apply in prototype) && !data.hasOwnProperty(apply)) {
+                data[apply] = function(val) {
+                    return val;
+                };
+            }
+
+            if (!(setter in prototype) && !data.hasOwnProperty(setter)) {
+                data[setter] = function(val) {
+                    var ret = this[apply].call(this, val, this[pName]);
+
+                    if (typeof ret != 'undefined') {
+                        this[pName] = ret;
+                    }
+
+                    return this;
+                };
+            }
+
+            if (!(getter in prototype) && !data.hasOwnProperty(getter)) {
+                data[getter] = function() {
+                    return this[pName];
+                };
+            }
+        });
+
+        Ext.Object.merge(prototype.config, data.config);
+        delete data.config;
+    });
+    
+
+    
+    
+    Class.registerPreprocessor('mixins', function(cls, data) {
+        var mixins = data.mixins,
+            name, mixin, i, ln;
+
+        delete data.mixins;
+
+        Ext.Function.interceptBefore(data, 'onClassCreated', function(cls) {
+            if (mixins instanceof Array) {
+                for (i = 0,ln = mixins.length; i < ln; i++) {
+                    mixin = mixins[i];
+                    name = mixin.prototype.mixinId || mixin.$className;
+
+                    cls.mixin(name, mixin);
+                }
+            }
+            else {
+                for (name in mixins) {
+                    if (mixins.hasOwnProperty(name)) {
+                        cls.mixin(name, mixins[name]);
+                    }
+                }
+            }
+        });
+    });
+
+    
+
+    Class.setDefaultPreprocessors([
+        'extend'
+        
+        ,'statics'
+        
+        
+        ,'inheritableStatics'
+        
+        
+        ,'config'
+        
+        
+        ,'mixins'
+        
+    ]);
+
+    
+    
+    Ext.extend = function(subclass, superclass, members) {
+        if (arguments.length === 2 && Ext.isObject(superclass)) {
+            members = superclass;
+            superclass = subclass;
+            subclass = null;
+        }
+
+        var cls;
+
+        if (!superclass) {
+            Ext.Error.raise("Attempting to extend from a class which has not been loaded on the page.");
+        }
+
+        members.extend = superclass;
+        members.preprocessors = [
+            'extend'
+            
+            ,'statics'
+            
+            
+            ,'inheritableStatics'
+            
+            
+            ,'mixins'
+            
+            
+            ,'config'
+            
+        ];
+
+        if (subclass) {
+            cls = new Class(subclass, members);
+        }
+        else {
+            cls = new Class(members);
+        }
+
+        cls.prototype.override = function(o) {
+            for (var m in o) {
+                if (o.hasOwnProperty(m)) {
+                    this[m] = o[m];
+                }
+            }
+        };
+
+        return cls;
+    };
+    
+
+})();
+
+
+(function(Class, alias) {
+
+    var slice = Array.prototype.slice;
+
+    var Manager = Ext.ClassManager = {
+
+        
+        classes: {},
+
+        
+        existCache: {},
+
+        
+        namespaceRewrites: [{
+            from: 'Ext.',
+            to: Ext
+        }],
+
+        
+        maps: {
+            alternateToName: {},
+            aliasToName: {},
+            nameToAliases: {}
+        },
+
+        
+        enableNamespaceParseCache: true,
+
+        
+        namespaceParseCache: {},
+
+        
+        instantiators: [],
+
+
+        
+        isCreated: function(className) {
+            var i, ln, part, root, parts;
+
+
+            if (this.classes.hasOwnProperty(className) || this.existCache.hasOwnProperty(className)) {
+                return true;
+            }
+
+            root = Ext.global;
+            parts = this.parseNamespace(className);
+
+            for (i = 0, ln = parts.length; i < ln; i++) {
+                part = parts[i];
+
+                if (typeof part !== 'string') {
+                    root = part;
+                } else {
+                    if (!root || !root[part]) {
+                        return false;
+                    }
+
+                    root = root[part];
+                }
+            }
+
+            Ext.Loader.historyPush(className);
+
+            this.existCache[className] = true;
+
+            return true;
+        },
+
+        
+        parseNamespace: function(namespace) {
+
+            var cache = this.namespaceParseCache;
+
+            if (this.enableNamespaceParseCache) {
+                if (cache.hasOwnProperty(namespace)) {
+                    return cache[namespace];
+                }
+            }
+
+            var parts = [],
+                rewrites = this.namespaceRewrites,
+                rewrite, from, to, i, ln, root = Ext.global;
+
+            for (i = 0, ln = rewrites.length; i < ln; i++) {
+                rewrite = rewrites[i];
+                from = rewrite.from;
+                to = rewrite.to;
+
+                if (namespace === from || namespace.substring(0, from.length) === from) {
+                    namespace = namespace.substring(from.length);
+
+                    if (typeof to !== 'string') {
+                        root = to;
+                    } else {
+                        parts = parts.concat(to.split('.'));
+                    }
+
+                    break;
+                }
+            }
+
+            parts.push(root);
+
+            parts = parts.concat(namespace.split('.'));
+
+            if (this.enableNamespaceParseCache) {
+                cache[namespace] = parts;
+            }
+
+            return parts;
+        },
+
+        
+        setNamespace: function(name, value) {
+            var root = Ext.global,
+                parts = this.parseNamespace(name),
+                ln = parts.length - 1,
+                leaf = parts[ln],
+                i, part;
+
+            for (i = 0; i < ln; i++) {
+                part = parts[i];
+
+                if (typeof part !== 'string') {
+                    root = part;
+                } else {
+                    if (!root[part]) {
+                        root[part] = {};
+                    }
+
+                    root = root[part];
+                }
+            }
+
+            root[leaf] = value;
+
+            return root[leaf];
+        },
+
+        
+        createNamespaces: function() {
+            var root = Ext.global,
+                parts, part, i, j, ln, subLn;
+
+            for (i = 0, ln = arguments.length; i < ln; i++) {
+                parts = this.parseNamespace(arguments[i]);
+
+                for (j = 0, subLn = parts.length; j < subLn; j++) {
+                    part = parts[j];
+
+                    if (typeof part !== 'string') {
+                        root = part;
+                    } else {
+                        if (!root[part]) {
+                            root[part] = {};
+                        }
+
+                        root = root[part];
+                    }
+                }
+            }
+
+            return root;
+        },
+
+        
+        set: function(name, value) {
+            var targetName = this.getName(value);
+
+            this.classes[name] = this.setNamespace(name, value);
+
+            if (targetName && targetName !== name) {
+                this.maps.alternateToName[name] = targetName;
+            }
+
+            return this;
+        },
+
+        
+        get: function(name) {
+            if (this.classes.hasOwnProperty(name)) {
+                return this.classes[name];
+            }
+
+            var root = Ext.global,
+                parts = this.parseNamespace(name),
+                part, i, ln;
+
+            for (i = 0, ln = parts.length; i < ln; i++) {
+                part = parts[i];
+
+                if (typeof part !== 'string') {
+                    root = part;
+                } else {
+                    if (!root || !root[part]) {
+                        return null;
+                    }
+
+                    root = root[part];
+                }
+            }
+
+            return root;
+        },
+
+        
+        setAlias: function(cls, alias) {
+            var aliasToNameMap = this.maps.aliasToName,
+                nameToAliasesMap = this.maps.nameToAliases,
+                className;
+
+            if (typeof cls === 'string') {
+                className = cls;
+            } else {
+                className = this.getName(cls);
+            }
+
+            if (alias && aliasToNameMap[alias] !== className) {
+
+                aliasToNameMap[alias] = className;
+            }
+
+            if (!nameToAliasesMap[className]) {
+                nameToAliasesMap[className] = [];
+            }
+
+            if (alias) {
+                Ext.Array.include(nameToAliasesMap[className], alias);
+            }
+
+            return this;
+        },
+
+        
+        getByAlias: function(alias) {
+            return this.get(this.getNameByAlias(alias));
+        },
+
+        
+        getNameByAlias: function(alias) {
+            return this.maps.aliasToName[alias] || '';
+        },
+
+        
+        getNameByAlternate: function(alternate) {
+            return this.maps.alternateToName[alternate] || '';
+        },
+
+        
+        getAliasesByName: function(name) {
+            return this.maps.nameToAliases[name] || [];
+        },
+
+        
+        getName: function(object) {
+            return object && object.$className || '';
+        },
+
+        
+        getClass: function(object) {
+            return object && object.self || null;
+        },
+
+        
+        create: function(className, data, createdFn) {
+            var manager = this;
+
+
+            data.$className = className;
+
+            return new Class(data, function() {
+                var postprocessorStack = data.postprocessors || manager.defaultPostprocessors,
+                    registeredPostprocessors = manager.postprocessors,
+                    index = 0,
+                    postprocessors = [],
+                    postprocessor, process, i, ln;
+
+                delete data.postprocessors;
+
+                for (i = 0, ln = postprocessorStack.length; i < ln; i++) {
+                    postprocessor = postprocessorStack[i];
+
+                    if (typeof postprocessor === 'string') {
+                        postprocessor = registeredPostprocessors[postprocessor];
+
+                        if (!postprocessor.always) {
+                            if (data[postprocessor.name] !== undefined) {
+                                postprocessors.push(postprocessor.fn);
+                            }
+                        }
+                        else {
+                            postprocessors.push(postprocessor.fn);
+                        }
+                    }
+                    else {
+                        postprocessors.push(postprocessor);
+                    }
+                }
+
+                process = function(clsName, cls, clsData) {
+                    postprocessor = postprocessors[index++];
+
+                    if (!postprocessor) {
+                        manager.set(className, cls);
+
+                        Ext.Loader.historyPush(className);
+
+                        if (createdFn) {
+                            createdFn.call(cls, cls);
+                        }
+
+                        return;
+                    }
+
+                    if (postprocessor.call(this, clsName, cls, clsData, process) !== false) {
+                        process.apply(this, arguments);
+                    }
+                };
+
+                process.call(manager, className, this, data);
+            });
+        },
+
+        
+        instantiateByAlias: function() {
+            var alias = arguments[0],
+                args = slice.call(arguments),
+                className = this.getNameByAlias(alias);
+
+            if (!className) {
+                className = this.maps.aliasToName[alias];
+
+
+
+                Ext.syncRequire(className);
+            }
+
+            args[0] = className;
+
+            return this.instantiate.apply(this, args);
+        },
+
+        
+        instantiate: function() {
+            var name = arguments[0],
+                args = slice.call(arguments, 1),
+                alias = name,
+                possibleName, cls;
+
+            if (typeof name !== 'function') {
+
+                cls = this.get(name);
+            }
+            else {
+                cls = name;
+            }
+
+            
+            if (!cls) {
+                possibleName = this.getNameByAlias(name);
+
+                if (possibleName) {
+                    name = possibleName;
+
+                    cls = this.get(name);
+                }
+            }
+
+            
+            if (!cls) {
+                possibleName = this.getNameByAlternate(name);
+
+                if (possibleName) {
+                    name = possibleName;
+
+                    cls = this.get(name);
+                }
+            }
+
+            
+            if (!cls) {
+
+                Ext.syncRequire(name);
+
+                cls = this.get(name);
+            }
+
+
+
+            return this.getInstantiator(args.length)(cls, args);
+        },
+
+        
+        dynInstantiate: function(name, args) {
+            args = Ext.Array.from(args, true);
+            args.unshift(name);
+
+            return this.instantiate.apply(this, args);
+        },
+
+        
+        getInstantiator: function(length) {
+            if (!this.instantiators[length]) {
+                var i = length,
+                    args = [];
+
+                for (i = 0; i < length; i++) {
+                    args.push('a['+i+']');
+                }
+
+                this.instantiators[length] = new Function('c', 'a', 'return new c('+args.join(',')+')');
+            }
+
+            return this.instantiators[length];
+        },
+
+        
+        postprocessors: {},
+
+        
+        defaultPostprocessors: [],
+
+        
+        registerPostprocessor: function(name, fn, always) {
+            this.postprocessors[name] = {
+                name: name,
+                always: always ||  false,
+                fn: fn
+            };
+
+            return this;
+        },
+
+        
+        setDefaultPostprocessors: function(postprocessors) {
+            this.defaultPostprocessors = Ext.Array.from(postprocessors);
+
+            return this;
+        },
+
+        
+        setDefaultPostprocessorPosition: function(name, offset, relativeName) {
+            var defaultPostprocessors = this.defaultPostprocessors,
+                index;
+
+            if (typeof offset === 'string') {
+                if (offset === 'first') {
+                    defaultPostprocessors.unshift(name);
+
+                    return this;
+                }
+                else if (offset === 'last') {
+                    defaultPostprocessors.push(name);
+
+                    return this;
+                }
+
+                offset = (offset === 'after') ? 1 : -1;
+            }
+
+            index = Ext.Array.indexOf(defaultPostprocessors, relativeName);
+
+            if (index !== -1) {
+                Ext.Array.splice(defaultPostprocessors, Math.max(0, index + offset), 0, name);
+            }
+
+            return this;
+        },
+
+        
+        getNamesByExpression: function(expression) {
+            var nameToAliasesMap = this.maps.nameToAliases,
+                names = [],
+                name, alias, aliases, possibleName, regex, i, ln;
+
+
+            if (expression.indexOf('*') !== -1) {
+                expression = expression.replace(/\*/g, '(.*?)');
+                regex = new RegExp('^' + expression + '$');
+
+                for (name in nameToAliasesMap) {
+                    if (nameToAliasesMap.hasOwnProperty(name)) {
+                        aliases = nameToAliasesMap[name];
+
+                        if (name.search(regex) !== -1) {
+                            names.push(name);
+                        }
+                        else {
+                            for (i = 0, ln = aliases.length; i < ln; i++) {
+                                alias = aliases[i];
+
+                                if (alias.search(regex) !== -1) {
+                                    names.push(name);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+
+            } else {
+                possibleName = this.getNameByAlias(expression);
+
+                if (possibleName) {
+                    names.push(possibleName);
+                } else {
+                    possibleName = this.getNameByAlternate(expression);
+
+                    if (possibleName) {
+                        names.push(possibleName);
+                    } else {
+                        names.push(expression);
+                    }
+                }
+            }
+
+            return names;
+        }
+    };
+
+    var defaultPostprocessors = Manager.defaultPostprocessors;
+    
+
+    
+    Manager.registerPostprocessor('alias', function(name, cls, data) {
+        var aliases = data.alias,
+            i, ln;
+
+        delete data.alias;
+
+        for (i = 0, ln = aliases.length; i < ln; i++) {
+            alias = aliases[i];
+
+            this.setAlias(cls, alias);
+        }
+    });
+
+    
+    Manager.registerPostprocessor('singleton', function(name, cls, data, fn) {
+        fn.call(this, name, new cls(), data);
+        return false;
+    });
+
+    
+    Manager.registerPostprocessor('alternateClassName', function(name, cls, data) {
+        var alternates = data.alternateClassName,
+            i, ln, alternate;
+
+        if (!(alternates instanceof Array)) {
+            alternates = [alternates];
+        }
+
+        for (i = 0, ln = alternates.length; i < ln; i++) {
+            alternate = alternates[i];
+
+
+            this.set(alternate, cls);
+        }
+    });
+
+    Manager.setDefaultPostprocessors(['alias', 'singleton', 'alternateClassName']);
+
+    Ext.apply(Ext, {
+        
+        create: alias(Manager, 'instantiate'),
+
+        
+        factory: function(item, namespace) {
+            if (item instanceof Array) {
+                var i, ln;
+
+                for (i = 0, ln = item.length; i < ln; i++) {
+                    item[i] = Ext.factory(item[i], namespace);
+                }
+
+                return item;
+            }
+
+            var isString = (typeof item === 'string');
+
+            if (isString || (item instanceof Object && item.constructor === Object)) {
+                var name, config = {};
+
+                if (isString) {
+                    name = item;
+                }
+                else {
+                    name = item.className;
+                    config = item;
+                    delete config.className;
+                }
+
+                if (namespace !== undefined && name.indexOf(namespace) === -1) {
+                    name = namespace + '.' + Ext.String.capitalize(name);
+                }
+
+                return Ext.create(name, config);
+            }
+
+            if (typeof item === 'function') {
+                return Ext.create(item);
+            }
+
+            return item;
+        },
+
+        
+        widget: function(name) {
+            var args = slice.call(arguments);
+            args[0] = 'widget.' + name;
+
+            return Manager.instantiateByAlias.apply(Manager, args);
+        },
+
+        
+        createByAlias: alias(Manager, 'instantiateByAlias'),
+
+        
+        
+        
+        define: function (className, data, createdFn) {
+            if (!data.override) {
+                return Manager.create.apply(Manager, arguments);
+            }
+
+            var requires = data.requires,
+                uses = data.uses,
+                overrideName = className;
+
+            className = data.override;
+
+            
+            data = Ext.apply({}, data);
+            delete data.requires;
+            delete data.uses;
+            delete data.override;
+
+            
+            if (typeof requires == 'string') {
+                requires = [ className, requires ];
+            } else if (requires) {
+                requires = requires.slice(0);
+                requires.unshift(className);
+            } else {
+                requires = [ className ];
+            }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+            return Manager.create(overrideName, {
+                    requires: requires,
+                    uses: uses,
+                    isPartial: true,
+                    constructor: function () {
+                    }
+                }, function () {
+                    var cls = Manager.get(className);
+                    if (cls.override) { 
+                        cls.override(data);
+                    } else { 
+                        cls.self.override(data);
+                    }
+
+                    if (createdFn) {
+                        
+                        
+                        
+                        createdFn.call(cls);
+                    }
+                });
+        },
+
+        
+        getClassName: alias(Manager, 'getName'),
+
+        
+        getDisplayName: function(object) {
+            if (object.displayName) {
+                return object.displayName;
+            }
+
+            if (object.$name && object.$class) {
+                return Ext.getClassName(object.$class) + '#' + object.$name;
+            }
+
+            if (object.$className) {
+                return object.$className;
+            }
+
+            return 'Anonymous';
+        },
+
+        
+        getClass: alias(Manager, 'getClass'),
+
+        
+        namespace: alias(Manager, 'createNamespaces')
+    });
+
+    
+    Ext.createWidget = Ext.widget;
+
+    
+    Ext.ns = Ext.namespace;
+
+    Class.registerPreprocessor('className', function(cls, data) {
+        if (data.$className) {
+            cls.$className = data.$className;
+        }
+    }, true);
+
+    Class.setDefaultPreprocessorPosition('className', 'first');
+
+    Class.registerPreprocessor('xtype', function(cls, data) {
+        var xtypes = Ext.Array.from(data.xtype),
+            widgetPrefix = 'widget.',
+            aliases = Ext.Array.from(data.alias),
+            i, ln, xtype;
+
+        data.xtype = xtypes[0];
+        data.xtypes = xtypes;
+
+        aliases = data.alias = Ext.Array.from(data.alias);
+
+        for (i = 0,ln = xtypes.length; i < ln; i++) {
+            xtype = xtypes[i];
+
+
+            aliases.push(widgetPrefix + xtype);
+        }
+
+        data.alias = aliases;
+    });
+
+    Class.setDefaultPreprocessorPosition('xtype', 'last');
+
+    Class.registerPreprocessor('alias', function(cls, data) {
+        var aliases = Ext.Array.from(data.alias),
+            xtypes = Ext.Array.from(data.xtypes),
+            widgetPrefix = 'widget.',
+            widgetPrefixLength = widgetPrefix.length,
+            i, ln, alias, xtype;
+
+        for (i = 0, ln = aliases.length; i < ln; i++) {
+            alias = aliases[i];
+
+
+            if (alias.substring(0, widgetPrefixLength) === widgetPrefix) {
+                xtype = alias.substring(widgetPrefixLength);
+                Ext.Array.include(xtypes, xtype);
+
+                if (!cls.xtype) {
+                    cls.xtype = data.xtype = xtype;
+                }
+            }
+        }
+
+        data.alias = aliases;
+        data.xtypes = xtypes;
+    });
+
+    Class.setDefaultPreprocessorPosition('alias', 'last');
+
+})(Ext.Class, Ext.Function.alias);
+
+
+(function(Manager, Class, flexSetter, alias) {
+
+    var
+        dependencyProperties = ['extend', 'mixins', 'requires'],
+        Loader;
+
+    Loader = Ext.Loader = {
+        
+        documentHead: typeof document !== 'undefined' && (document.head || document.getElementsByTagName('head')[0]),
+
+        
+        isLoading: false,
+
+        
+        queue: [],
+
+        
+        isFileLoaded: {},
+
+        
+        readyListeners: [],
+
+        
+        optionalRequires: [],
+
+        
+        requiresMap: {},
+
+        
+        numPendingFiles: 0,
+
+        
+        numLoadedFiles: 0,
+
+        
+        hasFileLoadError: false,
+
+        
+        classNameToFilePathMap: {},
+
+        
+        history: [],
+
+        
+        config: {
+            
+            enabled: false,
+
+            
+            disableCaching: true,
+
+            
+            disableCachingParam: '_dc',
+
+            
+            paths: {
+                'Ext': '.'
+            }
+        },
+
+        
+        setConfig: function(name, value) {
+            if (Ext.isObject(name) && arguments.length === 1) {
+                Ext.Object.merge(this.config, name);
+            }
+            else {
+                this.config[name] = (Ext.isObject(value)) ? Ext.Object.merge(this.config[name], value) : value;
+            }
+
+            return this;
+        },
+
+        
+        getConfig: function(name) {
+            if (name) {
+                return this.config[name];
+            }
+
+            return this.config;
+        },
+
+        
+        setPath: flexSetter(function(name, path) {
+            this.config.paths[name] = path;
+
+            return this;
+        }),
+
+        
+        getPath: function(className) {
+            var path = '',
+                paths = this.config.paths,
+                prefix = this.getPrefix(className);
+
+            if (prefix.length > 0) {
+                if (prefix === className) {
+                    return paths[prefix];
+                }
+
+                path = paths[prefix];
+                className = className.substring(prefix.length + 1);
+            }
+
+            if (path.length > 0) {
+                path += '/';
+            }
+
+            return path.replace(/\/\.\//g, '/') + className.replace(/\./g, "/") + '.js';
+        },
+
+        
+        getPrefix: function(className) {
+            var paths = this.config.paths,
+                prefix, deepestPrefix = '';
+
+            if (paths.hasOwnProperty(className)) {
+                return className;
+            }
+
+            for (prefix in paths) {
+                if (paths.hasOwnProperty(prefix) && prefix + '.' === className.substring(0, prefix.length + 1)) {
+                    if (prefix.length > deepestPrefix.length) {
+                        deepestPrefix = prefix;
+                    }
+                }
+            }
+
+            return deepestPrefix;
+        },
+
+        
+        refreshQueue: function() {
+            var ln = this.queue.length,
+                i, item, j, requires;
+
+            if (ln === 0) {
+                this.triggerReady();
+                return;
+            }
+
+            for (i = 0; i < ln; i++) {
+                item = this.queue[i];
+
+                if (item) {
+                    requires = item.requires;
+
+                    
+                    
+                    if (requires.length > this.numLoadedFiles) {
+                        continue;
+                    }
+
+                    j = 0;
+
+                    do {
+                        if (Manager.isCreated(requires[j])) {
+                            
+                            Ext.Array.erase(requires, j, 1);
+                        }
+                        else {
+                            j++;
+                        }
+                    } while (j < requires.length);
+
+                    if (item.requires.length === 0) {
+                        Ext.Array.erase(this.queue, i, 1);
+                        item.callback.call(item.scope);
+                        this.refreshQueue();
+                        break;
+                    }
+                }
+            }
+
+            return this;
+        },
+
+        
+        injectScriptElement: function(url, onLoad, onError, scope) {
+            var script = document.createElement('script'),
+                me = this,
+                onLoadFn = function() {
+                    me.cleanupScriptElement(script);
+                    onLoad.call(scope);
+                },
+                onErrorFn = function() {
+                    me.cleanupScriptElement(script);
+                    onError.call(scope);
+                };
+
+            script.type = 'text/javascript';
+            script.src = url;
+            script.onload = onLoadFn;
+            script.onerror = onErrorFn;
+            script.onreadystatechange = function() {
+                if (this.readyState === 'loaded' || this.readyState === 'complete') {
+                    onLoadFn();
+                }
+            };
+
+            this.documentHead.appendChild(script);
+
+            return script;
+        },
+
+        
+        cleanupScriptElement: function(script) {
+            script.onload = null;
+            script.onreadystatechange = null;
+            script.onerror = null;
+
+            return this;
+        },
+
+        
+        loadScriptFile: function(url, onLoad, onError, scope, synchronous) {
+            var me = this,
+                noCacheUrl = url + (this.getConfig('disableCaching') ? ('?' + this.getConfig('disableCachingParam') + '=' + Ext.Date.now()) : ''),
+                fileName = url.split('/').pop(),
+                isCrossOriginRestricted = false,
+                xhr, status, onScriptError;
+
+            scope = scope || this;
+
+            this.isLoading = true;
+
+            if (!synchronous) {
+                onScriptError = function() {
+                    onError.call(scope, "Failed loading '" + url + "', please verify that the file exists", synchronous);
+                };
+
+                if (!Ext.isReady && Ext.onDocumentReady) {
+                    Ext.onDocumentReady(function() {
+                        me.injectScriptElement(noCacheUrl, onLoad, onScriptError, scope);
+                    });
+                }
+                else {
+                    this.injectScriptElement(noCacheUrl, onLoad, onScriptError, scope);
+                }
+            }
+            else {
+                if (typeof XMLHttpRequest !== 'undefined') {
+                    xhr = new XMLHttpRequest();
+                } else {
+                    xhr = new ActiveXObject('Microsoft.XMLHTTP');
+                }
+
+                try {
+                    xhr.open('GET', noCacheUrl, false);
+                    xhr.send(null);
+                } catch (e) {
+                    isCrossOriginRestricted = true;
+                }
+
+                status = (xhr.status === 1223) ? 204 : xhr.status;
+
+                if (!isCrossOriginRestricted) {
+                    isCrossOriginRestricted = (status === 0);
+                }
+
+                if (isCrossOriginRestricted
+                ) {
+                    onError.call(this, "Failed loading synchronously via XHR: '" + url + "'; It's likely that the file is either " +
+                                       "being loaded from a different domain or from the local file system whereby cross origin " +
+                                       "requests are not allowed due to security reasons. Use asynchronous loading with " +
+                                       "Ext.require instead.", synchronous);
+                }
+                else if (status >= 200 && status < 300
+                ) {
+                    
+                    new Function(xhr.responseText + "\n//@ sourceURL=" + fileName)();
+
+                    onLoad.call(scope);
+                }
+                else {
+                    onError.call(this, "Failed loading synchronously via XHR: '" + url + "'; please " +
+                                       "verify that the file exists. " +
+                                       "XHR status code: " + status, synchronous);
+                }
+
+                
+                xhr = null;
+            }
+        },
+
+        
+        exclude: function(excludes) {
+            var me = this;
+
+            return {
+                require: function(expressions, fn, scope) {
+                    return me.require(expressions, fn, scope, excludes);
+                },
+
+                syncRequire: function(expressions, fn, scope) {
+                    return me.syncRequire(expressions, fn, scope, excludes);
+                }
+            };
+        },
+
+        
+        syncRequire: function() {
+            this.syncModeEnabled = true;
+            this.require.apply(this, arguments);
+            this.refreshQueue();
+            this.syncModeEnabled = false;
+        },
+
+        
+        require: function(expressions, fn, scope, excludes) {
+            var filePath, expression, exclude, className, excluded = {},
+                excludedClassNames = [],
+                possibleClassNames = [],
+                possibleClassName, classNames = [],
+                i, j, ln, subLn;
+
+            expressions = Ext.Array.from(expressions);
+            excludes = Ext.Array.from(excludes);
+
+            fn = fn || Ext.emptyFn;
+
+            scope = scope || Ext.global;
+
+            for (i = 0, ln = excludes.length; i < ln; i++) {
+                exclude = excludes[i];
+
+                if (typeof exclude === 'string' && exclude.length > 0) {
+                    excludedClassNames = Manager.getNamesByExpression(exclude);
+
+                    for (j = 0, subLn = excludedClassNames.length; j < subLn; j++) {
+                        excluded[excludedClassNames[j]] = true;
+                    }
+                }
+            }
+
+            for (i = 0, ln = expressions.length; i < ln; i++) {
+                expression = expressions[i];
+
+                if (typeof expression === 'string' && expression.length > 0) {
+                    possibleClassNames = Manager.getNamesByExpression(expression);
+
+                    for (j = 0, subLn = possibleClassNames.length; j < subLn; j++) {
+                        possibleClassName = possibleClassNames[j];
+
+                        if (!excluded.hasOwnProperty(possibleClassName) && !Manager.isCreated(possibleClassName)) {
+                            Ext.Array.include(classNames, possibleClassName);
+                        }
+                    }
+                }
+            }
+
+            
+            
+            if (!this.config.enabled) {
+                if (classNames.length > 0) {
+                    Ext.Error.raise({
+                        sourceClass: "Ext.Loader",
+                        sourceMethod: "require",
+                        msg: "Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. " +
+                             "Missing required class" + ((classNames.length > 1) ? "es" : "") + ": " + classNames.join(', ')
+                    });
+                }
+            }
+
+            if (classNames.length === 0) {
+                fn.call(scope);
+                return this;
+            }
+
+            this.queue.push({
+                requires: classNames,
+                callback: fn,
+                scope: scope
+            });
+
+            classNames = classNames.slice();
+
+            for (i = 0, ln = classNames.length; i < ln; i++) {
+                className = classNames[i];
+
+                if (!this.isFileLoaded.hasOwnProperty(className)) {
+                    this.isFileLoaded[className] = false;
+
+                    filePath = this.getPath(className);
+
+                    this.classNameToFilePathMap[className] = filePath;
+
+                    this.numPendingFiles++;
+
+                    this.loadScriptFile(
+                        filePath,
+                        Ext.Function.pass(this.onFileLoaded, [className, filePath], this),
+                        Ext.Function.pass(this.onFileLoadError, [className, filePath]),
+                        this,
+                        this.syncModeEnabled
+                    );
+                }
+            }
+
+            return this;
+        },
+
+        
+        onFileLoaded: function(className, filePath) {
+            this.numLoadedFiles++;
+
+            this.isFileLoaded[className] = true;
+
+            this.numPendingFiles--;
+
+            if (this.numPendingFiles === 0) {
+                this.refreshQueue();
+            }
+
+
+        },
+
+        
+        onFileLoadError: function(className, filePath, errorMessage, isSynchronous) {
+            this.numPendingFiles--;
+            this.hasFileLoadError = true;
+
+        },
+
+        
+        addOptionalRequires: function(requires) {
+            var optionalRequires = this.optionalRequires,
+                i, ln, require;
+
+            requires = Ext.Array.from(requires);
+
+            for (i = 0, ln = requires.length; i < ln; i++) {
+                require = requires[i];
+
+                Ext.Array.include(optionalRequires, require);
+            }
+
+            return this;
+        },
+
+        
+        triggerReady: function(force) {
+            var readyListeners = this.readyListeners,
+                optionalRequires, listener;
+
+            if (this.isLoading || force) {
+                this.isLoading = false;
+
+                if (this.optionalRequires.length) {
+                    
+                    optionalRequires = Ext.Array.clone(this.optionalRequires);
+
+                    
+                    this.optionalRequires.length = 0;
+
+                    this.require(optionalRequires, Ext.Function.pass(this.triggerReady, [true], this), this);
+                    return this;
+                }
+
+                while (readyListeners.length) {
+                    listener = readyListeners.shift();
+                    listener.fn.call(listener.scope);
+
+                    if (this.isLoading) {
+                        return this;
+                    }
+                }
+            }
+
+            return this;
+        },
+
+        
+        onReady: function(fn, scope, withDomReady, options) {
+            var oldFn;
+
+            if (withDomReady !== false && Ext.onDocumentReady) {
+                oldFn = fn;
+
+                fn = function() {
+                    Ext.onDocumentReady(oldFn, scope, options);
+                };
+            }
+
+            if (!this.isLoading) {
+                fn.call(scope);
+            }
+            else {
+                this.readyListeners.push({
+                    fn: fn,
+                    scope: scope
+                });
+            }
+        },
+
+        
+        historyPush: function(className) {
+            if (className && this.isFileLoaded.hasOwnProperty(className)) {
+                Ext.Array.include(this.history, className);
+            }
+
+            return this;
+        }
+    };
+
+    
+    Ext.require = alias(Loader, 'require');
+
+    
+    Ext.syncRequire = alias(Loader, 'syncRequire');
+
+    
+    Ext.exclude = alias(Loader, 'exclude');
+
+    
+    Ext.onReady = function(fn, scope, options) {
+        Loader.onReady(fn, scope, true, options);
+    };
+
+    
+    Class.registerPreprocessor('loader', function(cls, data, continueFn) {
+        var me = this,
+            dependencies = [],
+            className = Manager.getName(cls),
+            i, j, ln, subLn, value, propertyName, propertyValue;
+
+        
+
+        for (i = 0, ln = dependencyProperties.length; i < ln; i++) {
+            propertyName = dependencyProperties[i];
+
+            if (data.hasOwnProperty(propertyName)) {
+                propertyValue = data[propertyName];
+
+                if (typeof propertyValue === 'string') {
+                    dependencies.push(propertyValue);
+                }
+                else if (propertyValue instanceof Array) {
+                    for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
+                        value = propertyValue[j];
+
+                        if (typeof value === 'string') {
+                            dependencies.push(value);
+                        }
+                    }
+                }
+                else if (typeof propertyValue != 'function') {
+                    for (j in propertyValue) {
+                        if (propertyValue.hasOwnProperty(j)) {
+                            value = propertyValue[j];
+
+                            if (typeof value === 'string') {
+                                dependencies.push(value);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if (dependencies.length === 0) {
+
+            return;
+        }
+
+
+        Loader.require(dependencies, function() {
+            for (i = 0, ln = dependencyProperties.length; i < ln; i++) {
+                propertyName = dependencyProperties[i];
+
+                if (data.hasOwnProperty(propertyName)) {
+                    propertyValue = data[propertyName];
+
+                    if (typeof propertyValue === 'string') {
+                        data[propertyName] = Manager.get(propertyValue);
+                    }
+                    else if (propertyValue instanceof Array) {
+                        for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
+                            value = propertyValue[j];
+
+                            if (typeof value === 'string') {
+                                data[propertyName][j] = Manager.get(value);
+                            }
+                        }
+                    }
+                    else if (typeof propertyValue != 'function') {
+                        for (var k in propertyValue) {
+                            if (propertyValue.hasOwnProperty(k)) {
+                                value = propertyValue[k];
+
+                                if (typeof value === 'string') {
+                                    data[propertyName][k] = Manager.get(value);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            continueFn.call(me, cls, data);
+        });
+
+        return false;
+    }, true);
+
+    Class.setDefaultPreprocessorPosition('loader', 'after', 'className');
+
+    
+    Manager.registerPostprocessor('uses', function(name, cls, data) {
+        var uses = Ext.Array.from(data.uses),
+            items = [],
+            i, ln, item;
+
+        for (i = 0, ln = uses.length; i < ln; i++) {
+            item = uses[i];
+
+            if (typeof item === 'string') {
+                items.push(item);
+            }
+        }
+
+        Loader.addOptionalRequires(items);
+    });
+
+    Manager.setDefaultPostprocessorPosition('uses', 'last');
+
+})(Ext.ClassManager, Ext.Class, Ext.Function.flexSetter, Ext.Function.alias);
+
+
+Ext.Error = Ext.extend(Error, {
+    statics: {
+        
+        ignore: false,
+
+        
+        
+
+        
+        raise: function(err){
+            err = err || {};
+            if (Ext.isString(err)) {
+                err = { msg: err };
+            }
+
+            var method = this.raise.caller;
+
+            if (method) {
+                if (method.$name) {
+                    err.sourceMethod = method.$name;
+                }
+                if (method.$owner) {
+                    err.sourceClass = method.$owner.$className;
+                }
+            }
+
+            if (Ext.Error.handle(err) !== true) {
+                var msg = Ext.Error.prototype.toString.call(err);
+
+                Ext.log({
+                    msg: msg,
+                    level: 'error',
+                    dump: err,
+                    stack: true
+                });
+
+                throw new Ext.Error(err);
+            }
+        },
+
+        
+        handle: function(){
+            return Ext.Error.ignore;
+        }
+    },
+
+    
+    name: 'Ext.Error',
+
+    
+    constructor: function(config){
+        if (Ext.isString(config)) {
+            config = { msg: config };
+        }
+
+        var me = this;
+
+        Ext.apply(me, config);
+
+        me.message = me.message || me.msg; 
+        
+    },
+
+    
+    toString: function(){
+        var me = this,
+            className = me.className ? me.className  : '',
+            methodName = me.methodName ? '.' + me.methodName + '(): ' : '',
+            msg = me.msg || '(No description provided)';
+
+        return className + methodName + msg;
+    }
+});
+
+
+
+
+
+
+
+Ext.JSON = new(function() {
+    var useHasOwn = !! {}.hasOwnProperty,
+    isNative = function() {
+        var useNative = null;
+
+        return function() {
+            if (useNative === null) {
+                useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
+            }
+
+            return useNative;
+        };
+    }(),
+    pad = function(n) {
+        return n < 10 ? "0" + n : n;
+    },
+    doDecode = function(json) {
+        return eval("(" + json + ')');
+    },
+    doEncode = function(o) {
+        if (!Ext.isDefined(o) || o === null) {
+            return "null";
+        } else if (Ext.isArray(o)) {
+            return encodeArray(o);
+        } else if (Ext.isDate(o)) {
+            return Ext.JSON.encodeDate(o);
+        } else if (Ext.isString(o)) {
+            return encodeString(o);
+        } else if (typeof o == "number") {
+            
+            return isFinite(o) ? String(o) : "null";
+        } else if (Ext.isBoolean(o)) {
+            return String(o);
+        } else if (Ext.isObject(o)) {
+            return encodeObject(o);
+        } else if (typeof o === "function") {
+            return "null";
+        }
+        return 'undefined';
+    },
+    m = {
+        "\b": '\\b',
+        "\t": '\\t',
+        "\n": '\\n',
+        "\f": '\\f',
+        "\r": '\\r',
+        '"': '\\"',
+        "\\": '\\\\',
+        '\x0b': '\\u000b' 
+    },
+    charToReplace = /[\\\"\x00-\x1f\x7f-\uffff]/g,
+    encodeString = function(s) {
+        return '"' + s.replace(charToReplace, function(a) {
+            var c = m[a];
+            return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+        }) + '"';
+    },
+    encodeArray = function(o) {
+        var a = ["[", ""],
+        
+        len = o.length,
+        i;
+        for (i = 0; i < len; i += 1) {
+            a.push(doEncode(o[i]), ',');
+        }
+        
+        a[a.length - 1] = ']';
+        return a.join("");
+    },
+    encodeObject = function(o) {
+        var a = ["{", ""],
+        
+        i;
+        for (i in o) {
+            if (!useHasOwn || o.hasOwnProperty(i)) {
+                a.push(doEncode(i), ":", doEncode(o[i]), ',');
+            }
+        }
+        
+        a[a.length - 1] = '}';
+        return a.join("");
+    };
+
+    
+    this.encodeDate = function(o) {
+        return '"' + o.getFullYear() + "-"
+        + pad(o.getMonth() + 1) + "-"
+        + pad(o.getDate()) + "T"
+        + pad(o.getHours()) + ":"
+        + pad(o.getMinutes()) + ":"
+        + pad(o.getSeconds()) + '"';
+    };
+
+    
+    this.encode = function() {
+        var ec;
+        return function(o) {
+            if (!ec) {
+                
+                ec = isNative() ? JSON.stringify : doEncode;
+            }
+            return ec(o);
+        };
+    }();
+
+
+    
+    this.decode = function() {
+        var dc;
+        return function(json, safe) {
+            if (!dc) {
+                
+                dc = isNative() ? JSON.parse : doDecode;
+            }
+            try {
+                return dc(json);
+            } catch (e) {
+                if (safe === true) {
+                    return null;
+                }
+                Ext.Error.raise({
+                    sourceClass: "Ext.JSON",
+                    sourceMethod: "decode",
+                    msg: "You're trying to decode an invalid JSON String: " + json
+                });
+            }
+        };
+    }();
+
+})();
+
+Ext.encode = Ext.JSON.encode;
+
+Ext.decode = Ext.JSON.decode;
+
+
+
+Ext.apply(Ext, {
+    userAgent: navigator.userAgent.toLowerCase(),
+    cache: {},
+    idSeed: 1000,
+    windowId: 'ext-window',
+    documentId: 'ext-document',
+
+    
+    isReady: false,
+
+    
+    enableGarbageCollector: true,
+
+    
+    enableListenerCollection: true,
+
+    
+    id: function(el, prefix) {
+        var me = this,
+            sandboxPrefix = '';
+        el = Ext.getDom(el, true) || {};
+        if (el === document) {
+            el.id = me.documentId;
+        }
+        else if (el === window) {
+            el.id = me.windowId;
+        }
+        if (!el.id) {
+            if (me.isSandboxed) {
+                if (!me.uniqueGlobalNamespace) {
+                    me.getUniqueGlobalNamespace();
+                }
+                sandboxPrefix = me.uniqueGlobalNamespace + '-';
+            }
+            el.id = sandboxPrefix + (prefix || "ext-gen") + (++Ext.idSeed);
+        }
+        return el.id;
+    },
+
+    
+    getBody: function() {
+        return Ext.get(document.body || false);
+    },
+
+    
+    getHead: function() {
+        var head;
+
+        return function() {
+            if (head == undefined) {
+                head = Ext.get(document.getElementsByTagName("head")[0]);
+            }
+
+            return head;
+        };
+    }(),
+
+    
+    getDoc: function() {
+        return Ext.get(document);
+    },
+
+    
+    getCmp: function(id) {
+        return Ext.ComponentManager.get(id);
+    },
+
+    
+    getOrientation: function() {
+        return window.innerHeight > window.innerWidth ? 'portrait' : 'landscape';
+    },
+
+    
+    destroy: function() {
+        var ln = arguments.length,
+        i, arg;
+
+        for (i = 0; i < ln; i++) {
+            arg = arguments[i];
+            if (arg) {
+                if (Ext.isArray(arg)) {
+                    this.destroy.apply(this, arg);
+                }
+                else if (Ext.isFunction(arg.destroy)) {
+                    arg.destroy();
+                }
+                else if (arg.dom) {
+                    arg.remove();
+                }
+            }
+        }
+    },
+
+    
+    callback: function(callback, scope, args, delay){
+        if(Ext.isFunction(callback)){
+            args = args || [];
+            scope = scope || window;
+            if (delay) {
+                Ext.defer(callback, delay, scope, args);
+            } else {
+                callback.apply(scope, args);
+            }
+        }
+    },
+
+    
+    htmlEncode : function(value) {
+        return Ext.String.htmlEncode(value);
+    },
+
+    
+    htmlDecode : function(value) {
+         return Ext.String.htmlDecode(value);
+    },
+
+    
+    urlAppend : function(url, s) {
+        if (!Ext.isEmpty(s)) {
+            return url + (url.indexOf('?') === -1 ? '?' : '&') + s;
+        }
+        return url;
+    }
+});
+
+
+Ext.ns = Ext.namespace;
+
+
+window.undefined = window.undefined;
+
+
+(function(){
+
+    var check = function(regex){
+            return regex.test(Ext.userAgent);
+        },
+        isStrict = document.compatMode == "CSS1Compat",
+        version = function (is, regex) {
+            var m;
+            return (is && (m = regex.exec(Ext.userAgent))) ? parseFloat(m[1]) : 0;
+        },
+        docMode = document.documentMode,
+        isOpera = check(/opera/),
+        isOpera10_5 = isOpera && check(/version\/10\.5/),
+        isChrome = check(/\bchrome\b/),
+        isWebKit = check(/webkit/),
+        isSafari = !isChrome && check(/safari/),
+        isSafari2 = isSafari && check(/applewebkit\/4/), 
+        isSafari3 = isSafari && check(/version\/3/),
+        isSafari4 = isSafari && check(/version\/4/),
+        isSafari5 = isSafari && check(/version\/5/),
+        isIE = !isOpera && check(/msie/),
+        isIE7 = isIE && (check(/msie 7/) || docMode == 7),
+        isIE8 = isIE && (check(/msie 8/) && docMode != 7 && docMode != 9 || docMode == 8),
+        isIE9 = isIE && (check(/msie 9/) && docMode != 7 && docMode != 8 || docMode == 9),
+        isIE6 = isIE && check(/msie 6/),
+        isGecko = !isWebKit && check(/gecko/),
+        isGecko3 = isGecko && check(/rv:1\.9/),
+        isGecko4 = isGecko && check(/rv:2\.0/),
+        isGecko5 = isGecko && check(/rv:5\./),
+        isFF3_0 = isGecko3 && check(/rv:1\.9\.0/),
+        isFF3_5 = isGecko3 && check(/rv:1\.9\.1/),
+        isFF3_6 = isGecko3 && check(/rv:1\.9\.2/),
+        isWindows = check(/windows|win32/),
+        isMac = check(/macintosh|mac os x/),
+        isLinux = check(/linux/),
+        scrollbarSize = null,
+        chromeVersion = version(true, /\bchrome\/(\d+\.\d+)/),
+        firefoxVersion = version(true, /\bfirefox\/(\d+\.\d+)/),
+        ieVersion = version(isIE, /msie (\d+\.\d+)/),
+        operaVersion = version(isOpera, /version\/(\d+\.\d+)/),
+        safariVersion = version(isSafari, /version\/(\d+\.\d+)/),
+        webKitVersion = version(isWebKit, /webkit\/(\d+\.\d+)/),
+        isSecure = /^https/i.test(window.location.protocol);
+
+    
+    try {
+        document.execCommand("BackgroundImageCache", false, true);
+    } catch(e) {}
+
+
+    Ext.setVersion('extjs', '4.0.7');
+    Ext.apply(Ext, {
+        
+        SSL_SECURE_URL : isSecure && isIE ? 'javascript:""' : 'about:blank',
+
+        
+
+        
+        scopeResetCSS : Ext.buildSettings.scopeResetCSS,
+
+        
+        enableNestedListenerRemoval : false,
+
+        
+        USE_NATIVE_JSON : false,
+
+        
+        getDom : function(el, strict) {
+            if (!el || !document) {
+                return null;
+            }
+            if (el.dom) {
+                return el.dom;
+            } else {
+                if (typeof el == 'string') {
+                    var e = document.getElementById(el);
+                    
+                    
+                    if (e && isIE && strict) {
+                        if (el == e.getAttribute('id')) {
+                            return e;
+                        } else {
+                            return null;
+                        }
+                    }
+                    return e;
+                } else {
+                    return el;
+                }
+            }
+        },
+
+        
+        removeNode : isIE6 || isIE7 ? function() {
+            var d;
+            return function(n){
+                if(n && n.tagName != 'BODY'){
+                    (Ext.enableNestedListenerRemoval) ? Ext.EventManager.purgeElement(n) : Ext.EventManager.removeAll(n);
+                    d = d || document.createElement('div');
+                    d.appendChild(n);
+                    d.innerHTML = '';
+                    delete Ext.cache[n.id];
+                }
+            };
+        }() : function(n) {
+            if (n && n.parentNode && n.tagName != 'BODY') {
+                (Ext.enableNestedListenerRemoval) ? Ext.EventManager.purgeElement(n) : Ext.EventManager.removeAll(n);
+                n.parentNode.removeChild(n);
+                delete Ext.cache[n.id];
+            }
+        },
+
+        isStrict: isStrict,
+
+        isIEQuirks: isIE && !isStrict,
+
+        
+        isOpera : isOpera,
+
+        
+        isOpera10_5 : isOpera10_5,
+
+        
+        isWebKit : isWebKit,
+
+        
+        isChrome : isChrome,
+
+        
+        isSafari : isSafari,
+
+        
+        isSafari3 : isSafari3,
+
+        
+        isSafari4 : isSafari4,
+
+        
+        isSafari5 : isSafari5,
+
+        
+        isSafari2 : isSafari2,
+
+        
+        isIE : isIE,
+
+        
+        isIE6 : isIE6,
+
+        
+        isIE7 : isIE7,
+
+        
+        isIE8 : isIE8,
+
+        
+        isIE9 : isIE9,
+
+        
+        isGecko : isGecko,
+
+        
+        isGecko3 : isGecko3,
+
+        
+        isGecko4 : isGecko4,
+
+        
+        isGecko5 : isGecko5,
+
+        
+        isFF3_0 : isFF3_0,
+
+        
+        isFF3_5 : isFF3_5,
+
+        
+        isFF3_6 : isFF3_6,
+
+        
+        isFF4 : 4 <= firefoxVersion && firefoxVersion < 5,
+
+        
+        isFF5 : 5 <= firefoxVersion && firefoxVersion < 6,
+
+        
+        isLinux : isLinux,
+
+        
+        isWindows : isWindows,
+
+        
+        isMac : isMac,
+
+        
+        chromeVersion: chromeVersion,
+
+        
+        firefoxVersion: firefoxVersion,
+
+        
+        ieVersion: ieVersion,
+
+        
+        operaVersion: operaVersion,
+
+        
+        safariVersion: safariVersion,
+
+        
+        webKitVersion: webKitVersion,
+
+        
+        isSecure: isSecure,
+
+        
+        BLANK_IMAGE_URL : (isIE6 || isIE7) ? '/' + '/www.sencha.com/s.gif' : 'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',
+
+        
+        value : function(v, defaultValue, allowBlank){
+            return Ext.isEmpty(v, allowBlank) ? defaultValue : v;
+        },
+
+        
+        escapeRe : function(s) {
+            return s.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1");
+        },
+
+        
+        addBehaviors : function(o){
+            if(!Ext.isReady){
+                Ext.onReady(function(){
+                    Ext.addBehaviors(o);
+                });
+            } else {
+                var cache = {}, 
+                    parts,
+                    b,
+                    s;
+                for (b in o) {
+                    if ((parts = b.split('@'))[1]) { 
+                        s = parts[0];
+                        if(!cache[s]){
+                            cache[s] = Ext.select(s);
+                        }
+                        cache[s].on(parts[1], o[b]);
+                    }
+                }
+                cache = null;
+            }
+        },
+
+        
+        getScrollbarSize: function (force) {
+            if(!Ext.isReady){
+                return 0;
+            }
+
+            if(force === true || scrollbarSize === null){
+                
+                
+                
+                var cssClass = Ext.isIE9 ? '' : Ext.baseCSSPrefix + 'hide-offsets',
+                    
+                    div = Ext.getBody().createChild('<div class="' + cssClass + '" style="width:100px;height:50px;overflow:hidden;"><div style="height:200px;"></div></div>'),
+                    child = div.child('div', true),
+                    w1 = child.offsetWidth;
+
+                div.setStyle('overflow', (Ext.isWebKit || Ext.isGecko) ? 'auto' : 'scroll');
+
+                var w2 = child.offsetWidth, width = w1 - w2;
+                div.remove();
+
+                
+                scrollbarSize = { width: width, height: width };
+            }
+
+            return scrollbarSize;
+        },
+
+        
+        getScrollBarWidth: function(force){
+            var size = Ext.getScrollbarSize(force);
+            return size.width + 2; 
+        },
+
+        
+        copyTo : function(dest, source, names, usePrototypeKeys){
+            if(typeof names == 'string'){
+                names = names.split(/[,;\s]/);
+            }
+            Ext.each(names, function(name){
+                if(usePrototypeKeys || source.hasOwnProperty(name)){
+                    dest[name] = source[name];
+                }
+            }, this);
+            return dest;
+        },
+
+        
+        destroyMembers : function(o){
+            for (var i = 1, a = arguments, len = a.length; i < len; i++) {
+                Ext.destroy(o[a[i]]);
+                delete o[a[i]];
+            }
+        },
+
+        
+        log :
+            Ext.emptyFn,
+
+        
+        partition : function(arr, truth){
+            var ret = [[],[]];
+            Ext.each(arr, function(v, i, a) {
+                ret[ (truth && truth(v, i, a)) || (!truth && v) ? 0 : 1].push(v);
+            });
+            return ret;
+        },
+
+        
+        invoke : function(arr, methodName){
+            var ret = [],
+                args = Array.prototype.slice.call(arguments, 2);
+            Ext.each(arr, function(v,i) {
+                if (v && typeof v[methodName] == 'function') {
+                    ret.push(v[methodName].apply(v, args));
+                } else {
+                    ret.push(undefined);
+                }
+            });
+            return ret;
+        },
+
+        
+        zip : function(){
+            var parts = Ext.partition(arguments, function( val ){ return typeof val != 'function'; }),
+                arrs = parts[0],
+                fn = parts[1][0],
+                len = Ext.max(Ext.pluck(arrs, "length")),
+                ret = [];
+
+            for (var i = 0; i < len; i++) {
+                ret[i] = [];
+                if(fn){
+                    ret[i] = fn.apply(fn, Ext.pluck(arrs, i));
+                }else{
+                    for (var j = 0, aLen = arrs.length; j < aLen; j++){
+                        ret[i].push( arrs[j][i] );
+                    }
+                }
+            }
+            return ret;
+        },
+
+        
+        toSentence: function(items, connector) {
+            var length = items.length;
+
+            if (length <= 1) {
+                return items[0];
+            } else {
+                var head = items.slice(0, length - 1),
+                    tail = items[length - 1];
+
+                return Ext.util.Format.format("{0} {1} {2}", head.join(", "), connector || 'and', tail);
+            }
+        },
+
+        
+        useShims: isIE6
+    });
+})();
+
+
+Ext.application = function(config) {
+    Ext.require('Ext.app.Application');
+
+    Ext.onReady(function() {
+        Ext.create('Ext.app.Application', config);
+    });
+};
+
+
+(function() {
+    Ext.ns('Ext.util');
+
+    Ext.util.Format = {};
+    var UtilFormat     = Ext.util.Format,
+        stripTagsRE    = /<\/?[^>]+>/gi,
+        stripScriptsRe = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
+        nl2brRe        = /\r?\n/g,
+
+        
+        formatCleanRe  = /[^\d\.]/g,
+
+        
+        
+        I18NFormatCleanRe;
+
+    Ext.apply(UtilFormat, {
+        
+        thousandSeparator: ',',
+
+        
+        decimalSeparator: '.',
+
+        
+        currencyPrecision: 2,
+
+        
+        currencySign: '$',
+
+        
+        currencyAtEnd: false,
+
+        
+        undef : function(value) {
+            return value !== undefined ? value : "";
+        },
+
+        
+        defaultValue : function(value, defaultValue) {
+            return value !== undefined && value !== '' ? value : defaultValue;
+        },
+
+        
+        substr : function(value, start, length) {
+            return String(value).substr(start, length);
+        },
+
+        
+        lowercase : function(value) {
+            return String(value).toLowerCase();
+        },
+
+        
+        uppercase : function(value) {
+            return String(value).toUpperCase();
+        },
+
+        
+        usMoney : function(v) {
+            return UtilFormat.currency(v, '$', 2);
+        },
+
+        
+        currency: function(v, currencySign, decimals, end) {
+            var negativeSign = '',
+                format = ",0",
+                i = 0;
+            v = v - 0;
+            if (v < 0) {
+                v = -v;
+                negativeSign = '-';
+            }
+            decimals = decimals || UtilFormat.currencyPrecision;
+            format += format + (decimals > 0 ? '.' : '');
+            for (; i < decimals; i++) {
+                format += '0';
+            }
+            v = UtilFormat.number(v, format);
+            if ((end || UtilFormat.currencyAtEnd) === true) {
+                return Ext.String.format("{0}{1}{2}", negativeSign, v, currencySign || UtilFormat.currencySign);
+            } else {
+                return Ext.String.format("{0}{1}{2}", negativeSign, currencySign || UtilFormat.currencySign, v);
+            }
+        },
+
+        
+        date: function(v, format) {
+            if (!v) {
+                return "";
+            }
+            if (!Ext.isDate(v)) {
+                v = new Date(Date.parse(v));
+            }
+            return Ext.Date.dateFormat(v, format || Ext.Date.defaultFormat);
+        },
+
+        
+        dateRenderer : function(format) {
+            return function(v) {
+                return UtilFormat.date(v, format);
+            };
+        },
+
+        
+        stripTags : function(v) {
+            return !v ? v : String(v).replace(stripTagsRE, "");
+        },
+
+        
+        stripScripts : function(v) {
+            return !v ? v : String(v).replace(stripScriptsRe, "");
+        },
+
+        
+        fileSize : function(size) {
+            if (size < 1024) {
+                return size + " bytes";
+            } else if (size < 1048576) {
+                return (Math.round(((size*10) / 1024))/10) + " KB";
+            } else {
+                return (Math.round(((size*10) / 1048576))/10) + " MB";
+            }
+        },
+
+        
+        math : function(){
+            var fns = {};
+
+            return function(v, a){
+                if (!fns[a]) {
+                    fns[a] = Ext.functionFactory('v', 'return v ' + a + ';');
+                }
+                return fns[a](v);
+            };
+        }(),
+
+        
+        round : function(value, precision) {
+            var result = Number(value);
+            if (typeof precision == 'number') {
+                precision = Math.pow(10, precision);
+                result = Math.round(value * precision) / precision;
+            }
+            return result;
+        },
+
+        
+        number: function(v, formatString) {
+            if (!formatString) {
+                return v;
+            }
+            v = Ext.Number.from(v, NaN);
+            if (isNaN(v)) {
+                return '';
+            }
+            var comma = UtilFormat.thousandSeparator,
+                dec   = UtilFormat.decimalSeparator,
+                i18n  = false,
+                neg   = v < 0,
+                hasComma,
+                psplit;
+
+            v = Math.abs(v);
+
+            
+            
+            
+            
+            if (formatString.substr(formatString.length - 2) == '/i') {
+                if (!I18NFormatCleanRe) {
+                    I18NFormatCleanRe = new RegExp('[^\\d\\' + UtilFormat.decimalSeparator + ']','g');
+                }
+                formatString = formatString.substr(0, formatString.length - 2);
+                i18n   = true;
+                hasComma = formatString.indexOf(comma) != -1;
+                psplit = formatString.replace(I18NFormatCleanRe, '').split(dec);
+            } else {
+                hasComma = formatString.indexOf(',') != -1;
+                psplit = formatString.replace(formatCleanRe, '').split('.');
+            }
+
+            if (1 < psplit.length) {
+                v = v.toFixed(psplit[1].length);
+            } else if(2 < psplit.length) {
+            } else {
+                v = v.toFixed(0);
+            }
+
+            var fnum = v.toString();
+
+            psplit = fnum.split('.');
+
+            if (hasComma) {
+                var cnum = psplit[0],
+                    parr = [],
+                    j    = cnum.length,
+                    m    = Math.floor(j / 3),
+                    n    = cnum.length % 3 || 3,
+                    i;
+
+                for (i = 0; i < j; i += n) {
+                    if (i !== 0) {
+                        n = 3;
+                    }
+
+                    parr[parr.length] = cnum.substr(i, n);
+                    m -= 1;
+                }
+                fnum = parr.join(comma);
+                if (psplit[1]) {
+                    fnum += dec + psplit[1];
+                }
+            } else {
+                if (psplit[1]) {
+                    fnum = psplit[0] + dec + psplit[1];
+                }
+            }
+
+            if (neg) {
+                
+                neg = fnum.replace(/[^1-9]/g, '') !== '';
+            }
+
+            return (neg ? '-' : '') + formatString.replace(/[\d,?\.?]+/, fnum);
+        },
+
+        
+        numberRenderer : function(format) {
+            return function(v) {
+                return UtilFormat.number(v, format);
+            };
+        },
+
+        
+        plural : function(v, s, p) {
+            return v +' ' + (v == 1 ? s : (p ? p : s+'s'));
+        },
+
+        
+        nl2br : function(v) {
+            return Ext.isEmpty(v) ? '' : v.replace(nl2brRe, '<br/>');
+        },
+
+        
+        capitalize: Ext.String.capitalize,
+
+        
+        ellipsis: Ext.String.ellipsis,
+
+        
+        format: Ext.String.format,
+
+        
+        htmlDecode: Ext.String.htmlDecode,
+
+        
+        htmlEncode: Ext.String.htmlEncode,
+
+        
+        leftPad: Ext.String.leftPad,
+
+        
+        trim : Ext.String.trim,
+
+        
+        parseBox : function(box) {
+            if (Ext.isNumber(box)) {
+                box = box.toString();
+            }
+            var parts  = box.split(' '),
+                ln = parts.length;
+
+            if (ln == 1) {
+                parts[1] = parts[2] = parts[3] = parts[0];
+            }
+            else if (ln == 2) {
+                parts[2] = parts[0];
+                parts[3] = parts[1];
+            }
+            else if (ln == 3) {
+                parts[3] = parts[1];
+            }
+
+            return {
+                top   :parseInt(parts[0], 10) || 0,
+                right :parseInt(parts[1], 10) || 0,
+                bottom:parseInt(parts[2], 10) || 0,
+                left  :parseInt(parts[3], 10) || 0
+            };
+        },
+
+        
+        escapeRegex : function(s) {
+            return s.replace(/([\-.*+?\^${}()|\[\]\/\\])/g, "\\$1");
+        }
+    });
+})();
+
+
+Ext.ns('Ext.util');
+
+Ext.util.TaskRunner = function(interval) {
+    interval = interval || 10;
+    var tasks = [],
+    removeQueue = [],
+    id = 0,
+    running = false,
+
+    
+    stopThread = function() {
+        running = false;
+        clearInterval(id);
+        id = 0;
+    },
+
+    
+    startThread = function() {
+        if (!running) {
+            running = true;
+            id = setInterval(runTasks, interval);
+        }
+    },
+
+    
+    removeTask = function(t) {
+        removeQueue.push(t);
+        if (t.onStop) {
+            t.onStop.apply(t.scope || t);
+        }
+    },
+
+    
+    runTasks = function() {
+        var rqLen = removeQueue.length,
+            now = new Date().getTime(),
+            i;
+
+        if (rqLen > 0) {
+            for (i = 0; i < rqLen; i++) {
+                Ext.Array.remove(tasks, removeQueue[i]);
+            }
+            removeQueue = [];
+            if (tasks.length < 1) {
+                stopThread();
+                return;
+            }
+        }
+        i = 0;
+        var t,
+            itime,
+            rt,
+            len = tasks.length;
+        for (; i < len; ++i) {
+            t = tasks[i];
+            itime = now - t.taskRunTime;
+            if (t.interval <= itime) {
+                rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
+                t.taskRunTime = now;
+                if (rt === false || t.taskRunCount === t.repeat) {
+                    removeTask(t);
+                    return;
+                }
+            }
+            if (t.duration && t.duration <= (now - t.taskStartTime)) {
+                removeTask(t);
+            }
+        }
+    };
+
+    
+    this.start = function(task) {
+        tasks.push(task);
+        task.taskStartTime = new Date().getTime();
+        task.taskRunTime = 0;
+        task.taskRunCount = 0;
+        startThread();
+        return task;
+    };
+
+    
+    this.stop = function(task) {
+        removeTask(task);
+        return task;
+    };
+
+    
+    this.stopAll = function() {
+        stopThread();
+        for (var i = 0, len = tasks.length; i < len; i++) {
+            if (tasks[i].onStop) {
+                tasks[i].onStop();
+            }
+        }
+        tasks = [];
+        removeQueue = [];
+    };
+};
+
+
+Ext.TaskManager = Ext.create('Ext.util.TaskRunner');
+
+Ext.is = {
+    init : function(navigator) {
+        var platforms = this.platforms,
+            ln = platforms.length,
+            i, platform;
+
+        navigator = navigator || window.navigator;
+
+        for (i = 0; i < ln; i++) {
+            platform = platforms[i];
+            this[platform.identity] = platform.regex.test(navigator[platform.property]);
+        }
+
+        
+        this.Desktop = this.Mac || this.Windows || (this.Linux && !this.Android);
+        
+        this.Tablet = this.iPad;
+        
+        this.Phone = !this.Desktop && !this.Tablet;
+        
+        this.iOS = this.iPhone || this.iPad || this.iPod;
+        
+        
+        this.Standalone = !!window.navigator.standalone;
+    },
+    
+    
+    platforms: [{
+        property: 'platform',
+        regex: /iPhone/i,
+        identity: 'iPhone'
+    },
+    
+    
+    {
+        property: 'platform',
+        regex: /iPod/i,
+        identity: 'iPod'
+    },
+    
+    
+    {
+        property: 'userAgent',
+        regex: /iPad/i,
+        identity: 'iPad'
+    },
+    
+    
+    {
+        property: 'userAgent',
+        regex: /Blackberry/i,
+        identity: 'Blackberry'
+    },
+    
+    
+    {
+        property: 'userAgent',
+        regex: /Android/i,
+        identity: 'Android'
+    },
+    
+    
+    {
+        property: 'platform',
+        regex: /Mac/i,
+        identity: 'Mac'
+    },
+    
+    
+    {
+        property: 'platform',
+        regex: /Win/i,
+        identity: 'Windows'
+    },
+    
+    
+    {
+        property: 'platform',
+        regex: /Linux/i,
+        identity: 'Linux'
+    }]
+};
+
+Ext.is.init();
+
+
+Ext.supports = {
+    init : function() {
+        var doc = document,
+            div = doc.createElement('div'),
+            tests = this.tests,
+            ln = tests.length,
+            i, test;
+
+        div.innerHTML = [
+            '<div style="height:30px;width:50px;">',
+                '<div style="height:20px;width:20px;"></div>',
+            '</div>',
+            '<div style="width: 200px; height: 200px; position: relative; padding: 5px;">',
+                '<div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"></div>',
+            '</div>',
+            '<div style="float:left; background-color:transparent;"></div>'
+        ].join('');
+
+        doc.body.appendChild(div);
+
+        for (i = 0; i < ln; i++) {
+            test = tests[i];
+            this[test.identity] = test.fn.call(this, doc, div);
+        }
+
+        doc.body.removeChild(div);
+    },
+
+    
+    CSS3BoxShadow: Ext.isDefined(document.documentElement.style.boxShadow),
+
+    
+    ClassList: !!document.documentElement.classList,
+
+    
+    OrientationChange: ((typeof window.orientation != 'undefined') && ('onorientationchange' in window)),
+    
+    
+    DeviceMotion: ('ondevicemotion' in window),
+    
+    
+    
+    
+    Touch: ('ontouchstart' in window) && (!Ext.is.Desktop),
+
+    tests: [
+        
+        {
+            identity: 'Transitions',
+            fn: function(doc, div) {
+                var prefix = [
+                        'webkit',
+                        'Moz',
+                        'o',
+                        'ms',
+                        'khtml'
+                    ],
+                    TE = 'TransitionEnd',
+                    transitionEndName = [
+                        prefix[0] + TE,
+                        'transitionend', 
+                        prefix[2] + TE,
+                        prefix[3] + TE,
+                        prefix[4] + TE
+                    ],
+                    ln = prefix.length,
+                    i = 0,
+                    out = false;
+                div = Ext.get(div);
+                for (; i < ln; i++) {
+                    if (div.getStyle(prefix[i] + "TransitionProperty")) {
+                        Ext.supports.CSS3Prefix = prefix[i];
+                        Ext.supports.CSS3TransitionEnd = transitionEndName[i];
+                        out = true;
+                        break;
+                    }
+                }
+                return out;
+            }
+        },
+        
+        
+        {
+            identity: 'RightMargin',
+            fn: function(doc, div) {
+                var view = doc.defaultView;
+                return !(view && view.getComputedStyle(div.firstChild.firstChild, null).marginRight != '0px');
+            }
+        },
+
+        
+        {
+            identity: 'DisplayChangeInputSelectionBug',
+            fn: function() {
+                var webKitVersion = Ext.webKitVersion;
+                
+                return 0 < webKitVersion && webKitVersion < 533;
+            }
+        },
+
+        
+        {
+            identity: 'DisplayChangeTextAreaSelectionBug',
+            fn: function() {
+                var webKitVersion = Ext.webKitVersion;
+
+                
+                return 0 < webKitVersion && webKitVersion < 534.24;
+            }
+        },
+
+        
+        {
+            identity: 'TransparentColor',
+            fn: function(doc, div, view) {
+                view = doc.defaultView;
+                return !(view && view.getComputedStyle(div.lastChild, null).backgroundColor != 'transparent');
+            }
+        },
+
+        
+        {
+            identity: 'ComputedStyle',
+            fn: function(doc, div, view) {
+                view = doc.defaultView;
+                return view && view.getComputedStyle;
+            }
+        },
+        
+        
+        {
+            identity: 'Svg',
+            fn: function(doc) {
+                return !!doc.createElementNS && !!doc.createElementNS( "http:/" + "/www.w3.org/2000/svg", "svg").createSVGRect;
+            }
+        },
+    
+        
+        {
+            identity: 'Canvas',
+            fn: function(doc) {
+                return !!doc.createElement('canvas').getContext;
+            }
+        },
+        
+        
+        {
+            identity: 'Vml',
+            fn: function(doc) {
+                var d = doc.createElement("div");
+                d.innerHTML = "<!--[if vml]><br><br><![endif]-->";
+                return (d.childNodes.length == 2);
+            }
+        },
+        
+        
+        {
+            identity: 'Float',
+            fn: function(doc, div) {
+                return !!div.lastChild.style.cssFloat;
+            }
+        },
+        
+        
+        {
+            identity: 'AudioTag',
+            fn: function(doc) {
+                return !!doc.createElement('audio').canPlayType;
+            }
+        },
+        
+        
+        {
+            identity: 'History',
+            fn: function() {
+                return !!(window.history && history.pushState);
+            }
+        },
+        
+        
+        {
+            identity: 'CSS3DTransform',
+            fn: function() {
+                return (typeof WebKitCSSMatrix != 'undefined' && new WebKitCSSMatrix().hasOwnProperty('m41'));
+            }
+        },
+
+		
+        {
+            identity: 'CSS3LinearGradient',
+            fn: function(doc, div) {
+                var property = 'background-image:',
+                    webkit   = '-webkit-gradient(linear, left top, right bottom, from(black), to(white))',
+                    w3c      = 'linear-gradient(left top, black, white)',
+                    moz      = '-moz-' + w3c,
+                    options  = [property + webkit, property + w3c, property + moz];
+                
+                div.style.cssText = options.join(';');
+                
+                return ("" + div.style.backgroundImage).indexOf('gradient') !== -1;
+            }
+        },
+        
+        
+        {
+            identity: 'CSS3BorderRadius',
+            fn: function(doc, div) {
+                var domPrefixes = ['borderRadius', 'BorderRadius', 'MozBorderRadius', 'WebkitBorderRadius', 'OBorderRadius', 'KhtmlBorderRadius'],
+                    pass = false,
+                    i;
+                for (i = 0; i < domPrefixes.length; i++) {
+                    if (document.body.style[domPrefixes[i]] !== undefined) {
+                        return true;
+                    }
+                }
+                return pass;
+            }
+        },
+        
+        
+        {
+            identity: 'GeoLocation',
+            fn: function() {
+                return (typeof navigator != 'undefined' && typeof navigator.geolocation != 'undefined') || (typeof google != 'undefined' && typeof google.gears != 'undefined');
+            }
+        },
+        
+        {
+            identity: 'MouseEnterLeave',
+            fn: function(doc, div){
+                return ('onmouseenter' in div && 'onmouseleave' in div);
+            }
+        },
+        
+        {
+            identity: 'MouseWheel',
+            fn: function(doc, div) {
+                return ('onmousewheel' in div);
+            }
+        },
+        
+        {
+            identity: 'Opacity',
+            fn: function(doc, div){
+                
+                if (Ext.isIE6 || Ext.isIE7 || Ext.isIE8) {
+                    return false;
+                }
+                div.firstChild.style.cssText = 'opacity:0.73';
+                return div.firstChild.style.opacity == '0.73';
+            }
+        },
+        
+        {
+            identity: 'Placeholder',
+            fn: function(doc) {
+                return 'placeholder' in doc.createElement('input');
+            }
+        },
+        
+        
+        {
+            identity: 'Direct2DBug',
+            fn: function() {
+                return Ext.isString(document.body.style.msTransformOrigin);
+            }
+        },
+        
+        {
+            identity: 'BoundingClientRect',
+            fn: function(doc, div) {
+                return Ext.isFunction(div.getBoundingClientRect);
+            }
+        },
+        {
+            identity: 'IncludePaddingInWidthCalculation',
+            fn: function(doc, div){
+                var el = Ext.get(div.childNodes[1].firstChild);
+                return el.getWidth() == 210;
+            }
+        },
+        {
+            identity: 'IncludePaddingInHeightCalculation',
+            fn: function(doc, div){
+                var el = Ext.get(div.childNodes[1].firstChild);
+                return el.getHeight() == 210;
+            }
+        },
+        
+        
+        {
+            identity: 'ArraySort',
+            fn: function() {
+                var a = [1,2,3,4,5].sort(function(){ return 0; });
+                return a[0] === 1 && a[1] === 2 && a[2] === 3 && a[3] === 4 && a[4] === 5;
+            }
+        },
+        
+        {
+            identity: 'Range',
+            fn: function() {
+                return !!document.createRange;
+            }
+        },
+        
+        {
+            identity: 'CreateContextualFragment',
+            fn: function() {
+                var range = Ext.supports.Range ? document.createRange() : false;
+                
+                return range && !!range.createContextualFragment;
+            }
+        },
+
+        
+        {
+            identity: 'WindowOnError',
+            fn: function () {
+                
+                return Ext.isIE || Ext.isGecko || Ext.webKitVersion >= 534.16; 
+            }
+        }
+    ]
+};
+
+
+
+
+
+Ext.ns('Ext.core');
+Ext.core.DomHelper = Ext.DomHelper = function(){
+    var tempTableEl = null,
+        emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,
+        tableRe = /^table|tbody|tr|td$/i,
+        confRe = /tag|children|cn|html$/i,
+        tableElRe = /td|tr|tbody/i,
+        endRe = /end/i,
+        pub,
+        
+        afterbegin = 'afterbegin',
+        afterend = 'afterend',
+        beforebegin = 'beforebegin',
+        beforeend = 'beforeend',
+        ts = '<table>',
+        te = '</table>',
+        tbs = ts+'<tbody>',
+        tbe = '</tbody>'+te,
+        trs = tbs + '<tr>',
+        tre = '</tr>'+tbe;
+
+    
+    function doInsert(el, o, returnElement, pos, sibling, append){
+        el = Ext.getDom(el);
+        var newNode;
+        if (pub.useDom) {
+            newNode = createDom(o, null);
+            if (append) {
+                el.appendChild(newNode);
+            } else {
+                (sibling == 'firstChild' ? el : el.parentNode).insertBefore(newNode, el[sibling] || el);
+            }
+        } else {
+            newNode = Ext.DomHelper.insertHtml(pos, el, Ext.DomHelper.createHtml(o));
+        }
+        return returnElement ? Ext.get(newNode, true) : newNode;
+    }
+
+    function createDom(o, parentNode){
+        var el,
+            doc = document,
+            useSet,
+            attr,
+            val,
+            cn;
+
+        if (Ext.isArray(o)) {                       
+            el = doc.createDocumentFragment(); 
+            for (var i = 0, l = o.length; i < l; i++) {
+                createDom(o[i], el);
+            }
+        } else if (typeof o == 'string') {         
+            el = doc.createTextNode(o);
+        } else {
+            el = doc.createElement( o.tag || 'div' );
+            useSet = !!el.setAttribute; 
+            for (attr in o) {
+                if(!confRe.test(attr)){
+                    val = o[attr];
+                    if(attr == 'cls'){
+                        el.className = val;
+                    }else{
+                        if(useSet){
+                            el.setAttribute(attr, val);
+                        }else{
+                            el[attr] = val;
+                        }
+                    }
+                }
+            }
+            Ext.DomHelper.applyStyles(el, o.style);
+
+            if ((cn = o.children || o.cn)) {
+                createDom(cn, el);
+            } else if (o.html) {
+                el.innerHTML = o.html;
+            }
+        }
+        if(parentNode){
+           parentNode.appendChild(el);
+        }
+        return el;
+    }
+
+    
+    function createHtml(o){
+        var b = '',
+            attr,
+            val,
+            key,
+            cn,
+            i;
+
+        if(typeof o == "string"){
+            b = o;
+        } else if (Ext.isArray(o)) {
+            for (i=0; i < o.length; i++) {
+                if(o[i]) {
+                    b += createHtml(o[i]);
+                }
+            }
+        } else {
+            b += '<' + (o.tag = o.tag || 'div');
+            for (attr in o) {
+                val = o[attr];
+                if(!confRe.test(attr)){
+                    if (typeof val == "object") {
+                        b += ' ' + attr + '="';
+                        for (key in val) {
+                            b += key + ':' + val[key] + ';';
+                        }
+                        b += '"';
+                    }else{
+                        b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"';
+                    }
+                }
+            }
+            
+            if (emptyTags.test(o.tag)) {
+                b += '/>';
+            } else {
+                b += '>';
+                if ((cn = o.children || o.cn)) {
+                    b += createHtml(cn);
+                } else if(o.html){
+                    b += o.html;
+                }
+                b += '</' + o.tag + '>';
+            }
+        }
+        return b;
+    }
+
+    function ieTable(depth, s, h, e){
+        tempTableEl.innerHTML = [s, h, e].join('');
+        var i = -1,
+            el = tempTableEl,
+            ns;
+        while(++i < depth){
+            el = el.firstChild;
+        }
+
+        ns = el.nextSibling;
+        if (ns){
+            var df = document.createDocumentFragment();
+            while(el){
+                ns = el.nextSibling;
+                df.appendChild(el);
+                el = ns;
+            }
+            el = df;
+        }
+        return el;
+    }
+
+    
+    function insertIntoTable(tag, where, el, html) {
+        var node,
+            before;
+
+        tempTableEl = tempTableEl || document.createElement('div');
+
+        if(tag == 'td' && (where == afterbegin || where == beforeend) ||
+           !tableElRe.test(tag) && (where == beforebegin || where == afterend)) {
+            return null;
+        }
+        before = where == beforebegin ? el :
+                 where == afterend ? el.nextSibling :
+                 where == afterbegin ? el.firstChild : null;
+
+        if (where == beforebegin || where == afterend) {
+            el = el.parentNode;
+        }
+
+        if (tag == 'td' || (tag == 'tr' && (where == beforeend || where == afterbegin))) {
+            node = ieTable(4, trs, html, tre);
+        } else if ((tag == 'tbody' && (where == beforeend || where == afterbegin)) ||
+                   (tag == 'tr' && (where == beforebegin || where == afterend))) {
+            node = ieTable(3, tbs, html, tbe);
+        } else {
+            node = ieTable(2, ts, html, te);
+        }
+        el.insertBefore(node, before);
+        return node;
+    }
+
+    
+    function createContextualFragment(html){
+        var div = document.createElement("div"),
+            fragment = document.createDocumentFragment(),
+            i = 0,
+            length, childNodes;
+
+        div.innerHTML = html;
+        childNodes = div.childNodes;
+        length = childNodes.length;
+
+        for (; i < length; i++) {
+            fragment.appendChild(childNodes[i].cloneNode(true));
+        }
+
+        return fragment;
+    }
+
+    pub = {
+        
+        markup : function(o){
+            return createHtml(o);
+        },
+
+        
+        applyStyles : function(el, styles){
+            if (styles) {
+                el = Ext.fly(el);
+                if (typeof styles == "function") {
+                    styles = styles.call();
+                }
+                if (typeof styles == "string") {
+                    styles = Ext.Element.parseStyles(styles);
+                }
+                if (typeof styles == "object") {
+                    el.setStyle(styles);
+                }
+            }
+        },
+
+        
+        insertHtml : function(where, el, html){
+            var hash = {},
+                hashVal,
+                range,
+                rangeEl,
+                setStart,
+                frag,
+                rs;
+
+            where = where.toLowerCase();
+            
+            hash[beforebegin] = ['BeforeBegin', 'previousSibling'];
+            hash[afterend] = ['AfterEnd', 'nextSibling'];
+
+            
+            if (el.insertAdjacentHTML) {
+                if(tableRe.test(el.tagName) && (rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html))){
+                    return rs;
+                }
+
+                
+                hash[afterbegin] = ['AfterBegin', 'firstChild'];
+                hash[beforeend] = ['BeforeEnd', 'lastChild'];
+                if ((hashVal = hash[where])) {
+                    el.insertAdjacentHTML(hashVal[0], html);
+                    return el[hashVal[1]];
+                }
+            
+            } else {
+                
+                if (Ext.isTextNode(el)) {
+                    where = where === 'afterbegin' ? 'beforebegin' : where;
+                    where = where === 'beforeend' ? 'afterend' : where;
+                }
+                range = Ext.supports.CreateContextualFragment ? el.ownerDocument.createRange() : undefined;
+                setStart = 'setStart' + (endRe.test(where) ? 'After' : 'Before');
+                if (hash[where]) {
+                    if (range) {
+                        range[setStart](el);
+                        frag = range.createContextualFragment(html);
+                    } else {
+                        frag = createContextualFragment(html);
+                    }
+                    el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling);
+                    return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling'];
+                } else {
+                    rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child';
+                    if (el.firstChild) {
+                        if (range) {
+                            range[setStart](el[rangeEl]);
+                            frag = range.createContextualFragment(html);
+                        } else {
+                            frag = createContextualFragment(html);
+                        }
+
+                        if(where == afterbegin){
+                            el.insertBefore(frag, el.firstChild);
+                        }else{
+                            el.appendChild(frag);
+                        }
+                    } else {
+                        el.innerHTML = html;
+                    }
+                    return el[rangeEl];
+                }
+            }
+        },
+
+        
+        insertBefore : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, beforebegin);
+        },
+
+        
+        insertAfter : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, afterend, 'nextSibling');
+        },
+
+        
+        insertFirst : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, afterbegin, 'firstChild');
+        },
+
+        
+        append : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, beforeend, '', true);
+        },
+
+        
+        overwrite : function(el, o, returnElement){
+            el = Ext.getDom(el);
+            el.innerHTML = createHtml(o);
+            return returnElement ? Ext.get(el.firstChild) : el.firstChild;
+        },
+
+        createHtml : createHtml,
+
+        
+        createDom: createDom,
+
+        
+        useDom : false,
+
+        
+        createTemplate : function(o){
+            var html = Ext.DomHelper.createHtml(o);
+            return Ext.create('Ext.Template', html);
+        }
+    };
+    return pub;
+}();
+
+
+
+Ext.ns('Ext.core');
+
+Ext.core.DomQuery = Ext.DomQuery = function(){
+    var cache = {},
+        simpleCache = {},
+        valueCache = {},
+        nonSpace = /\S/,
+        trimRe = /^\s+|\s+$/g,
+        tplRe = /\{(\d+)\}/g,
+        modeRe = /^(\s?[\/>+~]\s?|\s|$)/,
+        tagTokenRe = /^(#)?([\w-\*]+)/,
+        nthRe = /(\d*)n\+?(\d*)/,
+        nthRe2 = /\D/,
+        startIdRe = /^\s*\#/,
+        
+    
+    
+    isIE = window.ActiveXObject ? true : false,
+    key = 30803;
+
+    
+    
+    eval("var batch = 30803;");
+
+    
+    
+    function child(parent, index){
+        var i = 0,
+            n = parent.firstChild;
+        while(n){
+            if(n.nodeType == 1){
+               if(++i == index){
+                   return n;
+               }
+            }
+            n = n.nextSibling;
+        }
+        return null;
+    }
+
+    
+    function next(n){
+        while((n = n.nextSibling) && n.nodeType != 1);
+        return n;
+    }
+
+    
+    function prev(n){
+        while((n = n.previousSibling) && n.nodeType != 1);
+        return n;
+    }
+
+    
+    
+    function children(parent){
+        var n = parent.firstChild,
+        nodeIndex = -1,
+        nextNode;
+        while(n){
+            nextNode = n.nextSibling;
+            
+            if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
+            parent.removeChild(n);
+            }else{
+            
+            n.nodeIndex = ++nodeIndex;
+            }
+            n = nextNode;
+        }
+        return this;
+    }
+
+
+    
+    
+    function byClassName(nodeSet, cls){
+        if(!cls){
+            return nodeSet;
+        }
+        var result = [], ri = -1;
+        for(var i = 0, ci; ci = nodeSet[i]; i++){
+            if((' '+ci.className+' ').indexOf(cls) != -1){
+                result[++ri] = ci;
+            }
+        }
+        return result;
+    };
+
+    function attrValue(n, attr){
+        
+        if(!n.tagName && typeof n.length != "undefined"){
+            n = n[0];
+        }
+        if(!n){
+            return null;
+        }
+
+        if(attr == "for"){
+            return n.htmlFor;
+        }
+        if(attr == "class" || attr == "className"){
+            return n.className;
+        }
+        return n.getAttribute(attr) || n[attr];
+
+    };
+
+
+    
+    
+    
+    function getNodes(ns, mode, tagName){
+        var result = [], ri = -1, cs;
+        if(!ns){
+            return result;
+        }
+        tagName = tagName || "*";
+        
+        if(typeof ns.getElementsByTagName != "undefined"){
+            ns = [ns];
+        }
+
+        
+        
+        if(!mode){
+            for(var i = 0, ni; ni = ns[i]; i++){
+                cs = ni.getElementsByTagName(tagName);
+                for(var j = 0, ci; ci = cs[j]; j++){
+                    result[++ri] = ci;
+                }
+            }
+        
+        
+        } else if(mode == "/" || mode == ">"){
+            var utag = tagName.toUpperCase();
+            for(var i = 0, ni, cn; ni = ns[i]; i++){
+                cn = ni.childNodes;
+                for(var j = 0, cj; cj = cn[j]; j++){
+                    if(cj.nodeName == utag || cj.nodeName == tagName  || tagName == '*'){
+                        result[++ri] = cj;
+                    }
+                }
+            }
+        
+        
+        }else if(mode == "+"){
+            var utag = tagName.toUpperCase();
+            for(var i = 0, n; n = ns[i]; i++){
+                while((n = n.nextSibling) && n.nodeType != 1);
+                if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){
+                    result[++ri] = n;
+                }
+            }
+        
+        
+        }else if(mode == "~"){
+            var utag = tagName.toUpperCase();
+            for(var i = 0, n; n = ns[i]; i++){
+                while((n = n.nextSibling)){
+                    if (n.nodeName == utag || n.nodeName == tagName || tagName == '*'){
+                        result[++ri] = n;
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    function concat(a, b){
+        if(b.slice){
+            return a.concat(b);
+        }
+        for(var i = 0, l = b.length; i < l; i++){
+            a[a.length] = b[i];
+        }
+        return a;
+    }
+
+    function byTag(cs, tagName){
+        if(cs.tagName || cs == document){
+            cs = [cs];
+        }
+        if(!tagName){
+            return cs;
+        }
+        var result = [], ri = -1;
+        tagName = tagName.toLowerCase();
+        for(var i = 0, ci; ci = cs[i]; i++){
+            if(ci.nodeType == 1 && ci.tagName.toLowerCase() == tagName){
+                result[++ri] = ci;
+            }
+        }
+        return result;
+    }
+
+    function byId(cs, id){
+        if(cs.tagName || cs == document){
+            cs = [cs];
+        }
+        if(!id){
+            return cs;
+        }
+        var result = [], ri = -1;
+        for(var i = 0, ci; ci = cs[i]; i++){
+            if(ci && ci.id == id){
+                result[++ri] = ci;
+                return result;
+            }
+        }
+        return result;
+    }
+
+    
+    
+    function byAttribute(cs, attr, value, op, custom){
+        var result = [],
+            ri = -1,
+            useGetStyle = custom == "{",
+            fn = Ext.DomQuery.operators[op],
+            a,
+            xml,
+            hasXml;
+
+        for(var i = 0, ci; ci = cs[i]; i++){
+            
+            if(ci.nodeType != 1){
+                continue;
+            }
+            
+            if(!hasXml){
+                xml = Ext.DomQuery.isXml(ci);
+                hasXml = true;
+            }
+
+            
+            if(!xml){
+                if(useGetStyle){
+                    a = Ext.DomQuery.getStyle(ci, attr);
+                } else if (attr == "class" || attr == "className"){
+                    a = ci.className;
+                } else if (attr == "for"){
+                    a = ci.htmlFor;
+                } else if (attr == "href"){
+                    
+                    
+                    a = ci.getAttribute("href", 2);
+                } else{
+                    a = ci.getAttribute(attr);
+                }
+            }else{
+                a = ci.getAttribute(attr);
+            }
+            if((fn && fn(a, value)) || (!fn && a)){
+                result[++ri] = ci;
+            }
+        }
+        return result;
+    }
+
+    function byPseudo(cs, name, value){
+        return Ext.DomQuery.pseudos[name](cs, value);
+    }
+
+    function nodupIEXml(cs){
+        var d = ++key,
+            r;
+        cs[0].setAttribute("_nodup", d);
+        r = [cs[0]];
+        for(var i = 1, len = cs.length; i < len; i++){
+            var c = cs[i];
+            if(!c.getAttribute("_nodup") != d){
+                c.setAttribute("_nodup", d);
+                r[r.length] = c;
+            }
+        }
+        for(var i = 0, len = cs.length; i < len; i++){
+            cs[i].removeAttribute("_nodup");
+        }
+        return r;
+    }
+
+    function nodup(cs){
+        if(!cs){
+            return [];
+        }
+        var len = cs.length, c, i, r = cs, cj, ri = -1;
+        if(!len || typeof cs.nodeType != "undefined" || len == 1){
+            return cs;
+        }
+        if(isIE && typeof cs[0].selectSingleNode != "undefined"){
+            return nodupIEXml(cs);
+        }
+        var d = ++key;
+        cs[0]._nodup = d;
+        for(i = 1; c = cs[i]; i++){
+            if(c._nodup != d){
+                c._nodup = d;
+            }else{
+                r = [];
+                for(var j = 0; j < i; j++){
+                    r[++ri] = cs[j];
+                }
+                for(j = i+1; cj = cs[j]; j++){
+                    if(cj._nodup != d){
+                        cj._nodup = d;
+                        r[++ri] = cj;
+                    }
+                }
+                return r;
+            }
+        }
+        return r;
+    }
+
+    function quickDiffIEXml(c1, c2){
+        var d = ++key,
+            r = [];
+        for(var i = 0, len = c1.length; i < len; i++){
+            c1[i].setAttribute("_qdiff", d);
+        }
+        for(var i = 0, len = c2.length; i < len; i++){
+            if(c2[i].getAttribute("_qdiff") != d){
+                r[r.length] = c2[i];
+            }
+        }
+        for(var i = 0, len = c1.length; i < len; i++){
+           c1[i].removeAttribute("_qdiff");
+        }
+        return r;
+    }
+
+    function quickDiff(c1, c2){
+        var len1 = c1.length,
+            d = ++key,
+            r = [];
+        if(!len1){
+            return c2;
+        }
+        if(isIE && typeof c1[0].selectSingleNode != "undefined"){
+            return quickDiffIEXml(c1, c2);
+        }
+        for(var i = 0; i < len1; i++){
+            c1[i]._qdiff = d;
+        }
+        for(var i = 0, len = c2.length; i < len; i++){
+            if(c2[i]._qdiff != d){
+                r[r.length] = c2[i];
+            }
+        }
+        return r;
+    }
+
+    function quickId(ns, mode, root, id){
+        if(ns == root){
+           var d = root.ownerDocument || root;
+           return d.getElementById(id);
+        }
+        ns = getNodes(ns, mode, "*");
+        return byId(ns, id);
+    }
+
+    return {
+        getStyle : function(el, name){
+            return Ext.fly(el).getStyle(name);
+        },
+        
+        compile : function(path, type){
+            type = type || "select";
+
+            
+            var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"],
+                mode,
+                lastPath,
+                matchers = Ext.DomQuery.matchers,
+                matchersLn = matchers.length,
+                modeMatch,
+                
+                lmode = path.match(modeRe);
+
+            if(lmode && lmode[1]){
+                fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";';
+                path = path.replace(lmode[1], "");
+            }
+
+            
+            while(path.substr(0, 1)=="/"){
+                path = path.substr(1);
+            }
+
+            while(path && lastPath != path){
+                lastPath = path;
+                var tokenMatch = path.match(tagTokenRe);
+                if(type == "select"){
+                    if(tokenMatch){
+                        
+                        if(tokenMatch[1] == "#"){
+                            fn[fn.length] = 'n = quickId(n, mode, root, "'+tokenMatch[2]+'");';
+                        }else{
+                            fn[fn.length] = 'n = getNodes(n, mode, "'+tokenMatch[2]+'");';
+                        }
+                        path = path.replace(tokenMatch[0], "");
+                    }else if(path.substr(0, 1) != '@'){
+                        fn[fn.length] = 'n = getNodes(n, mode, "*");';
+                    }
+                
+                }else{
+                    if(tokenMatch){
+                        if(tokenMatch[1] == "#"){
+                            fn[fn.length] = 'n = byId(n, "'+tokenMatch[2]+'");';
+                        }else{
+                            fn[fn.length] = 'n = byTag(n, "'+tokenMatch[2]+'");';
+                        }
+                        path = path.replace(tokenMatch[0], "");
+                    }
+                }
+                while(!(modeMatch = path.match(modeRe))){
+                    var matched = false;
+                    for(var j = 0; j < matchersLn; j++){
+                        var t = matchers[j];
+                        var m = path.match(t.re);
+                        if(m){
+                            fn[fn.length] = t.select.replace(tplRe, function(x, i){
+                                return m[i];
+                            });
+                            path = path.replace(m[0], "");
+                            matched = true;
+                            break;
+                        }
+                    }
+                    
+                    if(!matched){
+                    }
+                }
+                if(modeMatch[1]){
+                    fn[fn.length] = 'mode="'+modeMatch[1].replace(trimRe, "")+'";';
+                    path = path.replace(modeMatch[1], "");
+                }
+            }
+            
+            fn[fn.length] = "return nodup(n);\n}";
+
+            
+            eval(fn.join(""));
+            return f;
+        },
+
+        
+        jsSelect: function(path, root, type){
+            
+            root = root || document;
+
+            if(typeof root == "string"){
+                root = document.getElementById(root);
+            }
+            var paths = path.split(","),
+                results = [];
+
+            
+            for(var i = 0, len = paths.length; i < len; i++){
+                var subPath = paths[i].replace(trimRe, "");
+                
+                if(!cache[subPath]){
+                    cache[subPath] = Ext.DomQuery.compile(subPath);
+                    if(!cache[subPath]){
+                    }
+                }
+                var result = cache[subPath](root);
+                if(result && result != document){
+                    results = results.concat(result);
+                }
+            }
+
+            
+            
+            if(paths.length > 1){
+                return nodup(results);
+            }
+            return results;
+        },
+
+        isXml: function(el) {
+            var docEl = (el ? el.ownerDocument || el : 0).documentElement;
+            return docEl ? docEl.nodeName !== "HTML" : false;
+        },
+
+        
+        select : document.querySelectorAll ? function(path, root, type) {
+            root = root || document;
+            
+            if (!Ext.DomQuery.isXml(root) && !(Ext.isSafari3 && !Ext.isStrict)) { 
+                try {
+                    
+                    var isDocumentRoot = root.nodeType === 9,
+                        _path = path,
+                        _root = root;
+
+                    if (!isDocumentRoot && path.indexOf(',') === -1 && !startIdRe.test(path)) {
+                        _path = '#' + Ext.id(root) + ' ' + path;
+                        _root = root.parentNode;
+                    }
+                    return Ext.Array.toArray(_root.querySelectorAll(_path));
+                }
+                catch (e) {
+                }
+            }
+            return Ext.DomQuery.jsSelect.call(this, path, root, type);
+        } : function(path, root, type) {
+            return Ext.DomQuery.jsSelect.call(this, path, root, type);
+        },
+
+        
+        selectNode : function(path, root){
+            return Ext.DomQuery.select(path, root)[0];
+        },
+
+        
+        selectValue : function(path, root, defaultValue){
+            path = path.replace(trimRe, "");
+            if(!valueCache[path]){
+                valueCache[path] = Ext.DomQuery.compile(path, "select");
+            }
+            var n = valueCache[path](root), v;
+            n = n[0] ? n[0] : n;
+
+            
+            
+            
+            
+            if (typeof n.normalize == 'function') n.normalize();
+
+            v = (n && n.firstChild ? n.firstChild.nodeValue : null);
+            return ((v === null||v === undefined||v==='') ? defaultValue : v);
+        },
+
+        
+        selectNumber : function(path, root, defaultValue){
+            var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
+            return parseFloat(v);
+        },
+
+        
+        is : function(el, ss){
+            if(typeof el == "string"){
+                el = document.getElementById(el);
+            }
+            var isArray = Ext.isArray(el),
+                result = Ext.DomQuery.filter(isArray ? el : [el], ss);
+            return isArray ? (result.length == el.length) : (result.length > 0);
+        },
+
+        
+        filter : function(els, ss, nonMatches){
+            ss = ss.replace(trimRe, "");
+            if(!simpleCache[ss]){
+                simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");
+            }
+            var result = simpleCache[ss](els);
+            return nonMatches ? quickDiff(result, els) : result;
+        },
+
+        
+        matchers : [{
+                re: /^\.([\w-]+)/,
+                select: 'n = byClassName(n, " {1} ");'
+            }, {
+                re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
+                select: 'n = byPseudo(n, "{1}", "{2}");'
+            },{
+                re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
+                select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'
+            }, {
+                re: /^#([\w-]+)/,
+                select: 'n = byId(n, "{1}");'
+            },{
+                re: /^@([\w-]+)/,
+                select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
+            }
+        ],
+
+        
+        operators : {
+            "=" : function(a, v){
+                return a == v;
+            },
+            "!=" : function(a, v){
+                return a != v;
+            },
+            "^=" : function(a, v){
+                return a && a.substr(0, v.length) == v;
+            },
+            "$=" : function(a, v){
+                return a && a.substr(a.length-v.length) == v;
+            },
+            "*=" : function(a, v){
+                return a && a.indexOf(v) !== -1;
+            },
+            "%=" : function(a, v){
+                return (a % v) == 0;
+            },
+            "|=" : function(a, v){
+                return a && (a == v || a.substr(0, v.length+1) == v+'-');
+            },
+            "~=" : function(a, v){
+                return a && (' '+a+' ').indexOf(' '+v+' ') != -1;
+            }
+        },
+
+        
+        pseudos : {
+            "first-child" : function(c){
+                var r = [], ri = -1, n;
+                for(var i = 0, ci; ci = n = c[i]; i++){
+                    while((n = n.previousSibling) && n.nodeType != 1);
+                    if(!n){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "last-child" : function(c){
+                var r = [], ri = -1, n;
+                for(var i = 0, ci; ci = n = c[i]; i++){
+                    while((n = n.nextSibling) && n.nodeType != 1);
+                    if(!n){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "nth-child" : function(c, a) {
+                var r = [], ri = -1,
+                    m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a),
+                    f = (m[1] || 1) - 0, l = m[2] - 0;
+                for(var i = 0, n; n = c[i]; i++){
+                    var pn = n.parentNode;
+                    if (batch != pn._batch) {
+                        var j = 0;
+                        for(var cn = pn.firstChild; cn; cn = cn.nextSibling){
+                            if(cn.nodeType == 1){
+                               cn.nodeIndex = ++j;
+                            }
+                        }
+                        pn._batch = batch;
+                    }
+                    if (f == 1) {
+                        if (l == 0 || n.nodeIndex == l){
+                            r[++ri] = n;
+                        }
+                    } else if ((n.nodeIndex + l) % f == 0){
+                        r[++ri] = n;
+                    }
+                }
+
+                return r;
+            },
+
+            "only-child" : function(c){
+                var r = [], ri = -1;;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(!prev(ci) && !next(ci)){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "empty" : function(c){
+                var r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var cns = ci.childNodes, j = 0, cn, empty = true;
+                    while(cn = cns[j]){
+                        ++j;
+                        if(cn.nodeType == 1 || cn.nodeType == 3){
+                            empty = false;
+                            break;
+                        }
+                    }
+                    if(empty){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "contains" : function(c, v){
+                var r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if((ci.textContent||ci.innerText||'').indexOf(v) != -1){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "nodeValue" : function(c, v){
+                var r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(ci.firstChild && ci.firstChild.nodeValue == v){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "checked" : function(c){
+                var r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(ci.checked == true){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "not" : function(c, ss){
+                return Ext.DomQuery.filter(c, ss, true);
+            },
+
+            "any" : function(c, selectors){
+                var ss = selectors.split('|'),
+                    r = [], ri = -1, s;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    for(var j = 0; s = ss[j]; j++){
+                        if(Ext.DomQuery.is(ci, s)){
+                            r[++ri] = ci;
+                            break;
+                        }
+                    }
+                }
+                return r;
+            },
+
+            "odd" : function(c){
+                return this["nth-child"](c, "odd");
+            },
+
+            "even" : function(c){
+                return this["nth-child"](c, "even");
+            },
+
+            "nth" : function(c, a){
+                return c[a-1] || [];
+            },
+
+            "first" : function(c){
+                return c[0] || [];
+            },
+
+            "last" : function(c){
+                return c[c.length-1] || [];
+            },
+
+            "has" : function(c, ss){
+                var s = Ext.DomQuery.select,
+                    r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(s(ss, ci).length > 0){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "next" : function(c, ss){
+                var is = Ext.DomQuery.is,
+                    r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var n = next(ci);
+                    if(n && is(n, ss)){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "prev" : function(c, ss){
+                var is = Ext.DomQuery.is,
+                    r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var n = prev(ci);
+                    if(n && is(n, ss)){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            }
+        }
+    };
+}();
+
+
+Ext.query = Ext.DomQuery.select;
+
+
+ (function() {
+    var DOC = document,
+        EC = Ext.cache;
+
+    Ext.Element = Ext.core.Element = function(element, forceNew) {
+        var dom = typeof element == "string" ? DOC.getElementById(element) : element,
+        id;
+
+        if (!dom) {
+            return null;
+        }
+
+        id = dom.id;
+
+        if (!forceNew && id && EC[id]) {
+            
+            return EC[id].el;
+        }
+
+        
+        this.dom = dom;
+
+        
+        this.id = id || Ext.id(dom);
+    };
+
+    var DH = Ext.DomHelper,
+    El = Ext.Element;
+
+
+    El.prototype = {
+        
+        set: function(o, useSet) {
+            var el = this.dom,
+                attr,
+                val;
+            useSet = (useSet !== false) && !!el.setAttribute;
+
+            for (attr in o) {
+                if (o.hasOwnProperty(attr)) {
+                    val = o[attr];
+                    if (attr == 'style') {
+                        DH.applyStyles(el, val);
+                    } else if (attr == 'cls') {
+                        el.className = val;
+                    } else if (useSet) {
+                        el.setAttribute(attr, val);
+                    } else {
+                        el[attr] = val;
+                    }
+                }
+            }
+            return this;
+        },
+
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+
+        
+        
+        
+        
+
+
+        
+        
+        
+        
+        
+        
+        
+
+        
+        
+        
+        
+        
+        
+        
+
+        
+        
+        
+        
+
+        
+        
+        
+        
+        
+        
+        
+        
+
+        
+        defaultUnit: "px",
+
+        
+        is: function(simpleSelector) {
+            return Ext.DomQuery.is(this.dom, simpleSelector);
+        },
+
+        
+        focus: function(defer,
+                        
+                        dom) {
+            var me = this;
+            dom = dom || me.dom;
+            try {
+                if (Number(defer)) {
+                    Ext.defer(me.focus, defer, null, [null, dom]);
+                } else {
+                    dom.focus();
+                }
+            } catch(e) {}
+            return me;
+        },
+
+        
+        blur: function() {
+            try {
+                this.dom.blur();
+            } catch(e) {}
+            return this;
+        },
+
+        
+        getValue: function(asNumber) {
+            var val = this.dom.value;
+            return asNumber ? parseInt(val, 10) : val;
+        },
+
+        
+        addListener: function(eventName, fn, scope, options) {
+            Ext.EventManager.on(this.dom, eventName, fn, scope || this, options);
+            return this;
+        },
+
+        
+        removeListener: function(eventName, fn, scope) {
+            Ext.EventManager.un(this.dom, eventName, fn, scope || this);
+            return this;
+        },
+
+        
+        removeAllListeners: function() {
+            Ext.EventManager.removeAll(this.dom);
+            return this;
+        },
+
+        
+        purgeAllListeners: function() {
+            Ext.EventManager.purgeElement(this);
+            return this;
+        },
+
+        
+        addUnits: function(size, units) {
+
+            
+            if (Ext.isNumber(size)) {
+                return size + (units || this.defaultUnit || 'px');
+            }
+
+            
+            if (size === "" || size == "auto" || size == null) {
+                return size || '';
+            }
+
+            
+            if (!unitPattern.test(size)) {
+                return size || '';
+            }
+            return size;
+        },
+
+        
+        isBorderBox: function() {
+            return Ext.isBorderBox || noBoxAdjust[(this.dom.tagName || "").toLowerCase()];
+        },
+
+        
+        remove: function() {
+            var me = this,
+            dom = me.dom;
+
+            if (dom) {
+                delete me.dom;
+                Ext.removeNode(dom);
+            }
+        },
+
+        
+        hover: function(overFn, outFn, scope, options) {
+            var me = this;
+            me.on('mouseenter', overFn, scope || me.dom, options);
+            me.on('mouseleave', outFn, scope || me.dom, options);
+            return me;
+        },
+
+        
+        contains: function(el) {
+            return ! el ? false: Ext.Element.isAncestor(this.dom, el.dom ? el.dom: el);
+        },
+
+        
+        getAttributeNS: function(ns, name) {
+            return this.getAttribute(name, ns);
+        },
+
+        
+        getAttribute: (Ext.isIE && !(Ext.isIE9 && document.documentMode === 9)) ?
+        function(name, ns) {
+            var d = this.dom,
+            type;
+            if(ns) {
+                type = typeof d[ns + ":" + name];
+                if (type != 'undefined' && type != 'unknown') {
+                    return d[ns + ":" + name] || null;
+                }
+                return null;
+            }
+            if (name === "for") {
+                name = "htmlFor";
+            }
+            return d[name] || null;
+        }: function(name, ns) {
+            var d = this.dom;
+            if (ns) {
+               return d.getAttributeNS(ns, name) || d.getAttribute(ns + ":" + name);
+            }
+            return  d.getAttribute(name) || d[name] || null;
+        },
+
+        
+        update: function(html) {
+            if (this.dom) {
+                this.dom.innerHTML = html;
+            }
+            return this;
+        }
+    };
+
+    var ep = El.prototype;
+
+    El.addMethods = function(o) {
+        Ext.apply(ep, o);
+    };
+
+    
+    ep.on = ep.addListener;
+
+    
+    ep.un = ep.removeListener;
+
+    
+    ep.clearListeners = ep.removeAllListeners;
+
+    
+    ep.destroy = ep.remove;
+
+    
+    ep.autoBoxAdjust = true;
+
+    
+    var unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
+    docEl;
+
+    
+    El.get = function(el) {
+        var ex,
+        elm,
+        id;
+        if (!el) {
+            return null;
+        }
+        if (typeof el == "string") {
+            
+            if (! (elm = DOC.getElementById(el))) {
+                return null;
+            }
+            if (EC[el] && EC[el].el) {
+                ex = EC[el].el;
+                ex.dom = elm;
+            } else {
+                ex = El.addToCache(new El(elm));
+            }
+            return ex;
+        } else if (el.tagName) {
+            
+            if (! (id = el.id)) {
+                id = Ext.id(el);
+            }
+            if (EC[id] && EC[id].el) {
+                ex = EC[id].el;
+                ex.dom = el;
+            } else {
+                ex = El.addToCache(new El(el));
+            }
+            return ex;
+        } else if (el instanceof El) {
+            if (el != docEl) {
+                
+                
+                
+                if (Ext.isIE && (el.id == undefined || el.id == '')) {
+                    el.dom = el.dom;
+                } else {
+                    el.dom = DOC.getElementById(el.id) || el.dom;
+                }
+            }
+            return el;
+        } else if (el.isComposite) {
+            return el;
+        } else if (Ext.isArray(el)) {
+            return El.select(el);
+        } else if (el == DOC) {
+            
+            if (!docEl) {
+                var f = function() {};
+                f.prototype = El.prototype;
+                docEl = new f();
+                docEl.dom = DOC;
+            }
+            return docEl;
+        }
+        return null;
+    };
+
+    
+    ep.getById = (!Ext.isIE6 && !Ext.isIE7 && !Ext.isIE8) ? El.get :
+        function (id) {
+            var dom = this.dom,
+                cached, el, ret;
+
+            if (dom) {
+                el = dom.all[id];
+                if (el) {
+                    
+                    
+                    cached = EC[id];
+                    if (cached && cached.el) {
+                        ret = cached.el;
+                        ret.dom = el;
+                    } else {
+                        ret = El.addToCache(new El(el));
+                    }
+                    return ret;
+                }
+            }
+
+            return El.get(id);
+        };
+
+    El.addToCache = function(el, id) {
+        if (el) {
+            id = id || el.id;
+            EC[id] = {
+                el: el,
+                data: {},
+                events: {}
+            };
+        }
+        return el;
+    };
+
+    
+    El.data = function(el, key, value) {
+        el = El.get(el);
+        if (!el) {
+            return null;
+        }
+        var c = EC[el.id].data;
+        if (arguments.length == 2) {
+            return c[key];
+        } else {
+            return (c[key] = value);
+        }
+    };
+
+    
+    
+    
+    function garbageCollect() {
+        if (!Ext.enableGarbageCollector) {
+            clearInterval(El.collectorThreadId);
+        } else {
+            var eid,
+            el,
+            d,
+            o;
+
+            for (eid in EC) {
+                if (!EC.hasOwnProperty(eid)) {
+                    continue;
+                }
+                o = EC[eid];
+                if (o.skipGarbageCollection) {
+                    continue;
+                }
+                el = o.el;
+                d = el.dom;
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                if (!d || !d.parentNode || (!d.offsetParent && !DOC.getElementById(eid))) {
+                    if (d && Ext.enableListenerCollection) {
+                        Ext.EventManager.removeAll(d);
+                    }
+                    delete EC[eid];
+                }
+            }
+            
+            if (Ext.isIE) {
+                var t = {};
+                for (eid in EC) {
+                    if (!EC.hasOwnProperty(eid)) {
+                        continue;
+                    }
+                    t[eid] = EC[eid];
+                }
+                EC = Ext.cache = t;
+            }
+        }
+    }
+    El.collectorThreadId = setInterval(garbageCollect, 30000);
+
+    var flyFn = function() {};
+    flyFn.prototype = El.prototype;
+
+    
+    El.Flyweight = function(dom) {
+        this.dom = dom;
+    };
+
+    El.Flyweight.prototype = new flyFn();
+    El.Flyweight.prototype.isFlyweight = true;
+    El._flyweights = {};
+
+    
+    El.fly = function(el, named) {
+        var ret = null;
+        named = named || '_global';
+        el = Ext.getDom(el);
+        if (el) {
+            (El._flyweights[named] = El._flyweights[named] || new El.Flyweight()).dom = el;
+            ret = El._flyweights[named];
+        }
+        return ret;
+    };
+
+    
+    Ext.get = El.get;
+
+    
+    Ext.fly = El.fly;
+
+    
+    var noBoxAdjust = Ext.isStrict ? {
+        select: 1
+    }: {
+        input: 1,
+        select: 1,
+        textarea: 1
+    };
+    if (Ext.isIE || Ext.isGecko) {
+        noBoxAdjust['button'] = 1;
+    }
+})();
+
+
+Ext.Element.addMethods({
+    
+    findParent : function(simpleSelector, maxDepth, returnEl) {
+        var p = this.dom,
+            b = document.body,
+            depth = 0,
+            stopEl;
+
+        maxDepth = maxDepth || 50;
+        if (isNaN(maxDepth)) {
+            stopEl = Ext.getDom(maxDepth);
+            maxDepth = Number.MAX_VALUE;
+        }
+        while (p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl) {
+            if (Ext.DomQuery.is(p, simpleSelector)) {
+                return returnEl ? Ext.get(p) : p;
+            }
+            depth++;
+            p = p.parentNode;
+        }
+        return null;
+    },
+
+    
+    findParentNode : function(simpleSelector, maxDepth, returnEl) {
+        var p = Ext.fly(this.dom.parentNode, '_internal');
+        return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;
+    },
+
+    
+    up : function(simpleSelector, maxDepth) {
+        return this.findParentNode(simpleSelector, maxDepth, true);
+    },
+
+    
+    select : function(selector) {
+        return Ext.Element.select(selector, false,  this.dom);
+    },
+
+    
+    query : function(selector) {
+        return Ext.DomQuery.select(selector, this.dom);
+    },
+
+    
+    down : function(selector, returnDom) {
+        var n = Ext.DomQuery.selectNode(selector, this.dom);
+        return returnDom ? n : Ext.get(n);
+    },
+
+    
+    child : function(selector, returnDom) {
+        var node,
+            me = this,
+            id;
+        id = Ext.get(me).id;
+        
+        id = id.replace(/[\.:]/g, "\\$0");
+        node = Ext.DomQuery.selectNode('#' + id + " > " + selector, me.dom);
+        return returnDom ? node : Ext.get(node);
+    },
+
+     
+    parent : function(selector, returnDom) {
+        return this.matchNode('parentNode', 'parentNode', selector, returnDom);
+    },
+
+     
+    next : function(selector, returnDom) {
+        return this.matchNode('nextSibling', 'nextSibling', selector, returnDom);
+    },
+
+    
+    prev : function(selector, returnDom) {
+        return this.matchNode('previousSibling', 'previousSibling', selector, returnDom);
+    },
+
+
+    
+    first : function(selector, returnDom) {
+        return this.matchNode('nextSibling', 'firstChild', selector, returnDom);
+    },
+
+    
+    last : function(selector, returnDom) {
+        return this.matchNode('previousSibling', 'lastChild', selector, returnDom);
+    },
+
+    matchNode : function(dir, start, selector, returnDom) {
+        if (!this.dom) {
+            return null;
+        }
+
+        var n = this.dom[start];
+        while (n) {
+            if (n.nodeType == 1 && (!selector || Ext.DomQuery.is(n, selector))) {
+                return !returnDom ? Ext.get(n) : n;
+            }
+            n = n[dir];
+        }
+        return null;
+    }
+});
+
+
+Ext.Element.addMethods({
+    
+    appendChild : function(el) {
+        return Ext.get(el).appendTo(this);
+    },
+
+    
+    appendTo : function(el) {
+        Ext.getDom(el).appendChild(this.dom);
+        return this;
+    },
+
+    
+    insertBefore : function(el) {
+        el = Ext.getDom(el);
+        el.parentNode.insertBefore(this.dom, el);
+        return this;
+    },
+
+    
+    insertAfter : function(el) {
+        el = Ext.getDom(el);
+        el.parentNode.insertBefore(this.dom, el.nextSibling);
+        return this;
+    },
+
+    
+    insertFirst : function(el, returnDom) {
+        el = el || {};
+        if (el.nodeType || el.dom || typeof el == 'string') { 
+            el = Ext.getDom(el);
+            this.dom.insertBefore(el, this.dom.firstChild);
+            return !returnDom ? Ext.get(el) : el;
+        }
+        else { 
+            return this.createChild(el, this.dom.firstChild, returnDom);
+        }
+    },
+
+    
+    insertSibling: function(el, where, returnDom){
+        var me = this, rt,
+        isAfter = (where || 'before').toLowerCase() == 'after',
+        insertEl;
+
+        if(Ext.isArray(el)){
+            insertEl = me;
+            Ext.each(el, function(e) {
+                rt = Ext.fly(insertEl, '_internal').insertSibling(e, where, returnDom);
+                if(isAfter){
+                    insertEl = rt;
+                }
+            });
+            return rt;
+        }
+
+        el = el || {};
+
+        if(el.nodeType || el.dom){
+            rt = me.dom.parentNode.insertBefore(Ext.getDom(el), isAfter ? me.dom.nextSibling : me.dom);
+            if (!returnDom) {
+                rt = Ext.get(rt);
+            }
+        }else{
+            if (isAfter && !me.dom.nextSibling) {
+                rt = Ext.DomHelper.append(me.dom.parentNode, el, !returnDom);
+            } else {
+                rt = Ext.DomHelper[isAfter ? 'insertAfter' : 'insertBefore'](me.dom, el, !returnDom);
+            }
+        }
+        return rt;
+    },
+
+    
+    replace : function(el) {
+        el = Ext.get(el);
+        this.insertBefore(el);
+        el.remove();
+        return this;
+    },
+    
+    
+    replaceWith: function(el){
+        var me = this;
+            
+        if(el.nodeType || el.dom || typeof el == 'string'){
+            el = Ext.get(el);
+            me.dom.parentNode.insertBefore(el, me.dom);
+        }else{
+            el = Ext.DomHelper.insertBefore(me.dom, el);
+        }
+        
+        delete Ext.cache[me.id];
+        Ext.removeNode(me.dom);      
+        me.id = Ext.id(me.dom = el);
+        Ext.Element.addToCache(me.isFlyweight ? new Ext.Element(me.dom) : me);     
+        return me;
+    },
+    
+    
+    createChild : function(config, insertBefore, returnDom) {
+        config = config || {tag:'div'};
+        if (insertBefore) {
+            return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true);
+        }
+        else {
+            return Ext.DomHelper[!this.dom.firstChild ? 'insertFirst' : 'append'](this.dom, config,  returnDom !== true);
+        }
+    },
+
+    
+    wrap : function(config, returnDom) {
+        var newEl = Ext.DomHelper.insertBefore(this.dom, config || {tag: "div"}, !returnDom),
+            d = newEl.dom || newEl;
+
+        d.appendChild(this.dom);
+        return newEl;
+    },
+
+    
+    insertHtml : function(where, html, returnEl) {
+        var el = Ext.DomHelper.insertHtml(where, this.dom, html);
+        return returnEl ? Ext.get(el) : el;
+    }
+});
+
+
+(function(){
+    
+    var ELEMENT = Ext.Element,
+        supports = Ext.supports,
+        view = document.defaultView,
+        opacityRe = /alpha\(opacity=(.*)\)/i,
+        trimRe = /^\s+|\s+$/g,
+        spacesRe = /\s+/,
+        wordsRe = /\w/g,
+        adjustDirect2DTableRe = /table-row|table-.*-group/,
+        INTERNAL = '_internal',
+        PADDING = 'padding',
+        MARGIN = 'margin',
+        BORDER = 'border',
+        LEFT = '-left',
+        RIGHT = '-right',
+        TOP = '-top',
+        BOTTOM = '-bottom',
+        WIDTH = '-width',
+        MATH = Math,
+        HIDDEN = 'hidden',
+        ISCLIPPED = 'isClipped',
+        OVERFLOW = 'overflow',
+        OVERFLOWX = 'overflow-x',
+        OVERFLOWY = 'overflow-y',
+        ORIGINALCLIP = 'originalClip',
+        
+        borders = {l: BORDER + LEFT + WIDTH, r: BORDER + RIGHT + WIDTH, t: BORDER + TOP + WIDTH, b: BORDER + BOTTOM + WIDTH},
+        paddings = {l: PADDING + LEFT, r: PADDING + RIGHT, t: PADDING + TOP, b: PADDING + BOTTOM},
+        margins = {l: MARGIN + LEFT, r: MARGIN + RIGHT, t: MARGIN + TOP, b: MARGIN + BOTTOM},
+        data = ELEMENT.data;
+
+    ELEMENT.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
+
+    
+    
+    ELEMENT.inheritedProps = {
+        fontSize: 1,
+        fontStyle: 1,
+        opacity: 1
+    };
+
+    Ext.override(ELEMENT, {
+
+        
+        
+        adjustWidth : function(width) {
+            var me = this,
+                isNum = (typeof width == 'number');
+
+            if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
+               width -= (me.getBorderWidth("lr") + me.getPadding("lr"));
+            }
+            return (isNum && width < 0) ? 0 : width;
+        },
+
+        
+        adjustHeight : function(height) {
+            var me = this,
+                isNum = (typeof height == "number");
+
+            if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
+               height -= (me.getBorderWidth("tb") + me.getPadding("tb"));
+            }
+            return (isNum && height < 0) ? 0 : height;
+        },
+
+
+        
+        addCls : function(className){
+            var me = this,
+                cls = [],
+                space = ((me.dom.className.replace(trimRe, '') == '') ? "" : " "),
+                i, len, v;
+            if (className === undefined) {
+                return me;
+            }
+            
+            if (Object.prototype.toString.call(className) !== '[object Array]') {
+                if (typeof className === 'string') {
+                    className = className.replace(trimRe, '').split(spacesRe);
+                    if (className.length === 1) {
+                        className = className[0];
+                        if (!me.hasCls(className)) {
+                            me.dom.className += space + className;
+                        }
+                    } else {
+                        this.addCls(className);
+                    }
+                }
+            } else {
+                for (i = 0, len = className.length; i < len; i++) {
+                    v = className[i];
+                    if (typeof v == 'string' && (' ' + me.dom.className + ' ').indexOf(' ' + v + ' ') == -1) {
+                        cls.push(v);
+                    }
+                }
+                if (cls.length) {
+                    me.dom.className += space + cls.join(" ");
+                }
+            }
+            return me;
+        },
+
+        
+        removeCls : function(className){
+            var me = this,
+                i, idx, len, cls, elClasses;
+            if (className === undefined) {
+                return me;
+            }
+            if (Object.prototype.toString.call(className) !== '[object Array]') {
+                className = className.replace(trimRe, '').split(spacesRe);
+            }
+            if (me.dom && me.dom.className) {
+                elClasses = me.dom.className.replace(trimRe, '').split(spacesRe);
+                for (i = 0, len = className.length; i < len; i++) {
+                    cls = className[i];
+                    if (typeof cls == 'string') {
+                        cls = cls.replace(trimRe, '');
+                        idx = Ext.Array.indexOf(elClasses, cls);
+                        if (idx != -1) {
+                            Ext.Array.erase(elClasses, idx, 1);
+                        }
+                    }
+                }
+                me.dom.className = elClasses.join(" ");
+            }
+            return me;
+        },
+
+        
+        radioCls : function(className){
+            var cn = this.dom.parentNode.childNodes,
+                v, i, len;
+            className = Ext.isArray(className) ? className : [className];
+            for (i = 0, len = cn.length; i < len; i++) {
+                v = cn[i];
+                if (v && v.nodeType == 1) {
+                    Ext.fly(v, '_internal').removeCls(className);
+                }
+            }
+            return this.addCls(className);
+        },
+
+        
+        toggleCls : Ext.supports.ClassList ?
+            function(className) {
+                this.dom.classList.toggle(Ext.String.trim(className));
+                return this;
+            } :
+            function(className) {
+                return this.hasCls(className) ? this.removeCls(className) : this.addCls(className);
+            },
+
+        
+        hasCls : Ext.supports.ClassList ?
+            function(className) {
+                if (!className) {
+                    return false;
+                }
+                className = className.split(spacesRe);
+                var ln = className.length,
+                    i = 0;
+                for (; i < ln; i++) {
+                    if (className[i] && this.dom.classList.contains(className[i])) {
+                        return true;
+                    }
+                }
+                return false;
+            } :
+            function(className){
+                return className && (' ' + this.dom.className + ' ').indexOf(' ' + className + ' ') != -1;
+            },
+
+        
+        replaceCls : function(oldClassName, newClassName){
+            return this.removeCls(oldClassName).addCls(newClassName);
+        },
+
+        isStyle : function(style, val) {
+            return this.getStyle(style) == val;
+        },
+
+        
+        getStyle : function() {
+            return view && view.getComputedStyle ?
+                function(prop){
+                    var el = this.dom,
+                        v, cs, out, display, cleaner;
+
+                    if(el == document){
+                        return null;
+                    }
+                    prop = ELEMENT.normalize(prop);
+                    out = (v = el.style[prop]) ? v :
+                           (cs = view.getComputedStyle(el, "")) ? cs[prop] : null;
+
+                    
+                    
+                    if(prop == 'marginRight' && out != '0px' && !supports.RightMargin){
+                        cleaner = ELEMENT.getRightMarginFixCleaner(el);
+                        display = this.getStyle('display');
+                        el.style.display = 'inline-block';
+                        out = view.getComputedStyle(el, '').marginRight;
+                        el.style.display = display;
+                        cleaner();
+                    }
+
+                    if(prop == 'backgroundColor' && out == 'rgba(0, 0, 0, 0)' && !supports.TransparentColor){
+                        out = 'transparent';
+                    }
+                    return out;
+                } :
+                function (prop) {
+                    var el = this.dom,
+                        m, cs;
+
+                    if (el == document) {
+                        return null;
+                    }
+                    prop = ELEMENT.normalize(prop);
+
+                    do {
+                        if (prop == 'opacity') {
+                            if (el.style.filter.match) {
+                                m = el.style.filter.match(opacityRe);
+                                if(m){
+                                    var fv = parseFloat(m[1]);
+                                    if(!isNaN(fv)){
+                                        return fv ? fv / 100 : 0;
+                                    }
+                                }
+                            }
+                            return 1;
+                        }
+
+                        
+                        
+                        if (!Ext.isIE6) {
+                            return el.style[prop] || ((cs = el.currentStyle) ? cs[prop] : null);
+                        }
+
+                        try {
+                            return el.style[prop] || ((cs = el.currentStyle) ? cs[prop] : null);
+                        } catch (e) {
+                            
+                            
+                        }
+
+                        if (!ELEMENT.inheritedProps[prop]) {
+                            break;
+                        }
+
+                        el = el.parentNode;
+                        
+                        
+                        
+                    } while (el);
+
+                    return null;
+                }
+        }(),
+
+        
+        getColor : function(attr, defaultValue, prefix){
+            var v = this.getStyle(attr),
+                color = prefix || prefix === '' ? prefix : '#',
+                h;
+
+            if(!v || (/transparent|inherit/.test(v))) {
+                return defaultValue;
+            }
+            if(/^r/.test(v)){
+                Ext.each(v.slice(4, v.length -1).split(','), function(s){
+                    h = parseInt(s, 10);
+                    color += (h < 16 ? '0' : '') + h.toString(16);
+                });
+            }else{
+                v = v.replace('#', '');
+                color += v.length == 3 ? v.replace(/^(\w)(\w)(\w)$/, '$1$1$2$2$3$3') : v;
+            }
+            return(color.length > 5 ? color.toLowerCase() : defaultValue);
+        },
+
+        
+        setStyle : function(prop, value){
+            var me = this,
+                tmp, style;
+
+            if (!me.dom) {
+                return me;
+            }
+            if (typeof prop === 'string') {
+                tmp = {};
+                tmp[prop] = value;
+                prop = tmp;
+            }
+            for (style in prop) {
+                if (prop.hasOwnProperty(style)) {
+                    value = Ext.value(prop[style], '');
+                    if (style == 'opacity') {
+                        me.setOpacity(value);
+                    }
+                    else {
+                        me.dom.style[ELEMENT.normalize(style)] = value;
+                    }
+                }
+            }
+            return me;
+        },
+
+        
+        setOpacity: function(opacity, animate) {
+            var me = this,
+                dom = me.dom,
+                val,
+                style;
+
+            if (!me.dom) {
+                return me;
+            }
+
+            style = me.dom.style;
+
+            if (!animate || !me.anim) {
+                if (!Ext.supports.Opacity) {
+                    opacity = opacity < 1 ? 'alpha(opacity=' + opacity * 100 + ')': '';
+                    val = style.filter.replace(opacityRe, '').replace(trimRe, '');
+
+                    style.zoom = 1;
+                    style.filter = val + (val.length > 0 ? ' ': '') + opacity;
+                }
+                else {
+                    style.opacity = opacity;
+                }
+            }
+            else {
+                if (!Ext.isObject(animate)) {
+                    animate = {
+                        duration: 350,
+                        easing: 'ease-in'
+                    };
+                }
+                me.animate(Ext.applyIf({
+                    to: {
+                        opacity: opacity
+                    }
+                },
+                animate));
+            }
+            return me;
+        },
+
+
+        
+        clearOpacity : function(){
+            var style = this.dom.style;
+            if(!Ext.supports.Opacity){
+                if(!Ext.isEmpty(style.filter)){
+                    style.filter = style.filter.replace(opacityRe, '').replace(trimRe, '');
+                }
+            }else{
+                style.opacity = style['-moz-opacity'] = style['-khtml-opacity'] = '';
+            }
+            return this;
+        },
+
+        
+        adjustDirect2DDimension: function(dimension) {
+            var me = this,
+                dom = me.dom,
+                display = me.getStyle('display'),
+                inlineDisplay = dom.style['display'],
+                inlinePosition = dom.style['position'],
+                originIndex = dimension === 'width' ? 0 : 1,
+                floating;
+
+            if (display === 'inline') {
+                dom.style['display'] = 'inline-block';
+            }
+
+            dom.style['position'] = display.match(adjustDirect2DTableRe) ? 'absolute' : 'static';
+
+            
+            
+            floating = (parseFloat(me.getStyle(dimension)) || parseFloat(dom.currentStyle.msTransformOrigin.split(' ')[originIndex]) * 2) % 1;
+
+            dom.style['position'] = inlinePosition;
+
+            if (display === 'inline') {
+                dom.style['display'] = inlineDisplay;
+            }
+
+            return floating;
+        },
+
+        
+        getHeight: function(contentHeight, preciseHeight) {
+            var me = this,
+                dom = me.dom,
+                hidden = Ext.isIE && me.isStyle('display', 'none'),
+                height, overflow, style, floating;
+
+            
+            
+            if (Ext.isIEQuirks) {
+                style = dom.style;
+                overflow = style.overflow;
+                me.setStyle({ overflow: 'hidden'});
+            }
+
+            height = dom.offsetHeight;
+
+            height = MATH.max(height, hidden ? 0 : dom.clientHeight) || 0;
+
+            
+            if (!hidden && Ext.supports.Direct2DBug) {
+                floating = me.adjustDirect2DDimension('height');
+                if (preciseHeight) {
+                    height += floating;
+                }
+                else if (floating > 0 && floating < 0.5) {
+                    height++;
+                }
+            }
+
+            if (contentHeight) {
+                height -= (me.getBorderWidth("tb") + me.getPadding("tb"));
+            }
+
+            if (Ext.isIEQuirks) {
+                me.setStyle({ overflow: overflow});
+            }
+
+            if (height < 0) {
+                height = 0;
+            }
+            return height;
+        },
+
+        
+        getWidth: function(contentWidth, preciseWidth) {
+            var me = this,
+                dom = me.dom,
+                hidden = Ext.isIE && me.isStyle('display', 'none'),
+                rect, width, overflow, style, floating, parentPosition;
+
+            
+            
+            if (Ext.isIEQuirks) {
+                style = dom.style;
+                overflow = style.overflow;
+                me.setStyle({overflow: 'hidden'});
+            }
+
+            
+            if (Ext.isOpera10_5) {
+                if (dom.parentNode.currentStyle.position === 'relative') {
+                    parentPosition = dom.parentNode.style.position;
+                    dom.parentNode.style.position = 'static';
+                    width = dom.offsetWidth;
+                    dom.parentNode.style.position = parentPosition;
+                }
+                width = Math.max(width || 0, dom.offsetWidth);
+
+            
+            
+            
+            
+            
+            } else if (Ext.supports.BoundingClientRect) {
+                rect = dom.getBoundingClientRect();
+                width = rect.right - rect.left;
+                width = preciseWidth ? width : Math.ceil(width);
+            } else {
+                width = dom.offsetWidth;
+            }
+
+            width = MATH.max(width, hidden ? 0 : dom.clientWidth) || 0;
+
+            
+            if (!hidden && Ext.supports.Direct2DBug) {
+                floating = me.adjustDirect2DDimension('width');
+                if (preciseWidth) {
+                    width += floating;
+                }
+                else if (floating > 0 && floating < 0.5) {
+                    width++;
+                }
+            }
+
+            if (contentWidth) {
+                width -= (me.getBorderWidth("lr") + me.getPadding("lr"));
+            }
+
+            if (Ext.isIEQuirks) {
+                me.setStyle({ overflow: overflow});
+            }
+
+            if (width < 0) {
+                width = 0;
+            }
+            return width;
+        },
+
+        
+        setWidth : function(width, animate){
+            var me = this;
+            width = me.adjustWidth(width);
+            if (!animate || !me.anim) {
+                me.dom.style.width = me.addUnits(width);
+            }
+            else {
+                if (!Ext.isObject(animate)) {
+                    animate = {};
+                }
+                me.animate(Ext.applyIf({
+                    to: {
+                        width: width
+                    }
+                }, animate));
+            }
+            return me;
+        },
+
+        
+         setHeight : function(height, animate){
+            var me = this;
+            height = me.adjustHeight(height);
+            if (!animate || !me.anim) {
+                me.dom.style.height = me.addUnits(height);
+            }
+            else {
+                if (!Ext.isObject(animate)) {
+                    animate = {};
+                }
+                me.animate(Ext.applyIf({
+                    to: {
+                        height: height
+                    }
+                }, animate));
+            }
+            return me;
+        },
+
+        
+        getBorderWidth : function(side){
+            return this.addStyles(side, borders);
+        },
+
+        
+        getPadding : function(side){
+            return this.addStyles(side, paddings);
+        },
+
+        
+        clip : function(){
+            var me = this,
+                dom = me.dom;
+
+            if(!data(dom, ISCLIPPED)){
+                data(dom, ISCLIPPED, true);
+                data(dom, ORIGINALCLIP, {
+                    o: me.getStyle(OVERFLOW),
+                    x: me.getStyle(OVERFLOWX),
+                    y: me.getStyle(OVERFLOWY)
+                });
+                me.setStyle(OVERFLOW, HIDDEN);
+                me.setStyle(OVERFLOWX, HIDDEN);
+                me.setStyle(OVERFLOWY, HIDDEN);
+            }
+            return me;
+        },
+
+        
+        unclip : function(){
+            var me = this,
+                dom = me.dom,
+                clip;
+
+            if(data(dom, ISCLIPPED)){
+                data(dom, ISCLIPPED, false);
+                clip = data(dom, ORIGINALCLIP);
+                if(clip.o){
+                    me.setStyle(OVERFLOW, clip.o);
+                }
+                if(clip.x){
+                    me.setStyle(OVERFLOWX, clip.x);
+                }
+                if(clip.y){
+                    me.setStyle(OVERFLOWY, clip.y);
+                }
+            }
+            return me;
+        },
+
+        
+        addStyles : function(sides, styles){
+            var totalSize = 0,
+                sidesArr = sides.match(wordsRe),
+                i = 0,
+                len = sidesArr.length,
+                side, size;
+            for (; i < len; i++) {
+                side = sidesArr[i];
+                size = side && parseInt(this.getStyle(styles[side]), 10);
+                if (size) {
+                    totalSize += MATH.abs(size);
+                }
+            }
+            return totalSize;
+        },
+
+        margins : margins,
+
+        
+        applyStyles : function(style){
+            Ext.DomHelper.applyStyles(this.dom, style);
+            return this;
+        },
+
+        
+        getStyles : function(){
+            var styles = {},
+                len = arguments.length,
+                i = 0, style;
+
+            for(; i < len; ++i) {
+                style = arguments[i];
+                styles[style] = this.getStyle(style);
+            }
+            return styles;
+        },
+
+       
+        boxWrap : function(cls){
+            cls = cls || Ext.baseCSSPrefix + 'box';
+            var el = Ext.get(this.insertHtml("beforeBegin", "<div class='" + cls + "'>" + Ext.String.format(ELEMENT.boxMarkup, cls) + "</div>"));
+            Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom);
+            return el;
+        },
+
+        
+        setSize : function(width, height, animate){
+            var me = this;
+            if (Ext.isObject(width)) { 
+                animate = height;
+                height = width.height;
+                width = width.width;
+            }
+            width = me.adjustWidth(width);
+            height = me.adjustHeight(height);
+            if(!animate || !me.anim){
+                
+                
+                if (!Ext.isIEQuirks && (Ext.isIE6 || Ext.isIE7)) {
+                    me.dom.offsetTop;
+                }
+                me.dom.style.width = me.addUnits(width);
+                me.dom.style.height = me.addUnits(height);
+            }
+            else {
+                if (animate === true) {
+                    animate = {};
+                }
+                me.animate(Ext.applyIf({
+                    to: {
+                        width: width,
+                        height: height
+                    }
+                }, animate));
+            }
+            return me;
+        },
+
+        
+        getComputedHeight : function(){
+            var me = this,
+                h = Math.max(me.dom.offsetHeight, me.dom.clientHeight);
+            if(!h){
+                h = parseFloat(me.getStyle('height')) || 0;
+                if(!me.isBorderBox()){
+                    h += me.getFrameWidth('tb');
+                }
+            }
+            return h;
+        },
+
+        
+        getComputedWidth : function(){
+            var me = this,
+                w = Math.max(me.dom.offsetWidth, me.dom.clientWidth);
+
+            if(!w){
+                w = parseFloat(me.getStyle('width')) || 0;
+                if(!me.isBorderBox()){
+                    w += me.getFrameWidth('lr');
+                }
+            }
+            return w;
+        },
+
+        
+        getFrameWidth : function(sides, onlyContentBox){
+            return onlyContentBox && this.isBorderBox() ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
+        },
+
+        
+        addClsOnOver : function(className){
+            var dom = this.dom;
+            this.hover(
+                function(){
+                    Ext.fly(dom, INTERNAL).addCls(className);
+                },
+                function(){
+                    Ext.fly(dom, INTERNAL).removeCls(className);
+                }
+            );
+            return this;
+        },
+
+        
+        addClsOnFocus : function(className){
+            var me = this,
+                dom = me.dom;
+            me.on("focus", function(){
+                Ext.fly(dom, INTERNAL).addCls(className);
+            });
+            me.on("blur", function(){
+                Ext.fly(dom, INTERNAL).removeCls(className);
+            });
+            return me;
+        },
+
+        
+        addClsOnClick : function(className){
+            var dom = this.dom;
+            this.on("mousedown", function(){
+                Ext.fly(dom, INTERNAL).addCls(className);
+                var d = Ext.getDoc(),
+                    fn = function(){
+                        Ext.fly(dom, INTERNAL).removeCls(className);
+                        d.removeListener("mouseup", fn);
+                    };
+                d.on("mouseup", fn);
+            });
+            return this;
+        },
+
+        
+
+        getViewSize : function(){
+            var me = this,
+                dom = me.dom,
+                isDoc = (dom == Ext.getDoc().dom || dom == Ext.getBody().dom),
+                style, overflow, ret;
+
+            
+            if (isDoc) {
+                ret = {
+                    width : ELEMENT.getViewWidth(),
+                    height : ELEMENT.getViewHeight()
+                };
+
+            
+            }
+            else {
+                
+                
+                if (Ext.isIE6 || Ext.isIEQuirks) {
+                    style = dom.style;
+                    overflow = style.overflow;
+                    me.setStyle({ overflow: 'hidden'});
+                }
+                ret = {
+                    width : dom.clientWidth,
+                    height : dom.clientHeight
+                };
+                if (Ext.isIE6 || Ext.isIEQuirks) {
+                    me.setStyle({ overflow: overflow });
+                }
+            }
+            return ret;
+        },
+
+        
+
+        getStyleSize : function(){
+            var me = this,
+                doc = document,
+                d = this.dom,
+                isDoc = (d == doc || d == doc.body),
+                s = d.style,
+                w, h;
+
+            
+            if (isDoc) {
+                return {
+                    width : ELEMENT.getViewWidth(),
+                    height : ELEMENT.getViewHeight()
+                };
+            }
+            
+            if(s.width && s.width != 'auto'){
+                w = parseFloat(s.width);
+                if(me.isBorderBox()){
+                   w -= me.getFrameWidth('lr');
+                }
+            }
+            
+            if(s.height && s.height != 'auto'){
+                h = parseFloat(s.height);
+                if(me.isBorderBox()){
+                   h -= me.getFrameWidth('tb');
+                }
+            }
+            
+            return {width: w || me.getWidth(true), height: h || me.getHeight(true)};
+        },
+
+        
+        getSize : function(contentSize){
+            return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
+        },
+
+        
+        repaint : function(){
+            var dom = this.dom;
+            this.addCls(Ext.baseCSSPrefix + 'repaint');
+            setTimeout(function(){
+                Ext.fly(dom).removeCls(Ext.baseCSSPrefix + 'repaint');
+            }, 1);
+            return this;
+        },
+
+        
+        selectable : function() {
+            var me = this;
+            me.dom.unselectable = "off";
+            
+            me.on('selectstart', function (e) {
+                e.stopPropagation();
+                return true;
+            });
+            me.applyStyles("-moz-user-select: text; -khtml-user-select: text;");
+            me.removeCls(Ext.baseCSSPrefix + 'unselectable');
+            return me;
+        },
+
+        
+        unselectable : function(){
+            var me = this;
+            me.dom.unselectable = "on";
+
+            me.swallowEvent("selectstart", true);
+            me.applyStyles("-moz-user-select:-moz-none;-khtml-user-select:none;");
+            me.addCls(Ext.baseCSSPrefix + 'unselectable');
+
+            return me;
+        },
+
+        
+        getMargin : function(side){
+            var me = this,
+                hash = {t:"top", l:"left", r:"right", b: "bottom"},
+                o = {},
+                key;
+
+            if (!side) {
+                for (key in me.margins){
+                    o[hash[key]] = parseFloat(me.getStyle(me.margins[key])) || 0;
+                }
+                return o;
+            } else {
+                return me.addStyles.call(me, side, me.margins);
+            }
+        }
+    });
+})();
+
+
+Ext.Element.VISIBILITY = 1;
+
+Ext.Element.DISPLAY = 2;
+
+
+Ext.Element.OFFSETS = 3;
+
+
+Ext.Element.ASCLASS = 4;
+
+
+Ext.Element.visibilityCls = Ext.baseCSSPrefix + 'hide-nosize';
+
+Ext.Element.addMethods(function(){
+    var El = Ext.Element,
+        OPACITY = "opacity",
+        VISIBILITY = "visibility",
+        DISPLAY = "display",
+        HIDDEN = "hidden",
+        OFFSETS = "offsets",
+        ASCLASS = "asclass",
+        NONE = "none",
+        NOSIZE = 'nosize',
+        ORIGINALDISPLAY = 'originalDisplay',
+        VISMODE = 'visibilityMode',
+        ISVISIBLE = 'isVisible',
+        data = El.data,
+        getDisplay = function(dom){
+            var d = data(dom, ORIGINALDISPLAY);
+            if(d === undefined){
+                data(dom, ORIGINALDISPLAY, d = '');
+            }
+            return d;
+        },
+        getVisMode = function(dom){
+            var m = data(dom, VISMODE);
+            if(m === undefined){
+                data(dom, VISMODE, m = 1);
+            }
+            return m;
+        };
+
+    return {
+        
+        originalDisplay : "",
+        visibilityMode : 1,
+
+        
+        setVisibilityMode : function(visMode){
+            data(this.dom, VISMODE, visMode);
+            return this;
+        },
+
+        
+        isVisible : function() {
+            var me = this,
+                dom = me.dom,
+                visible = data(dom, ISVISIBLE);
+
+            if(typeof visible == 'boolean'){ 
+                return visible;
+            }
+            
+            visible = !me.isStyle(VISIBILITY, HIDDEN) &&
+                      !me.isStyle(DISPLAY, NONE) &&
+                      !((getVisMode(dom) == El.ASCLASS) && me.hasCls(me.visibilityCls || El.visibilityCls));
+
+            data(dom, ISVISIBLE, visible);
+            return visible;
+        },
+
+        
+        setVisible : function(visible, animate){
+            var me = this, isDisplay, isVisibility, isOffsets, isNosize,
+                dom = me.dom,
+                visMode = getVisMode(dom);
+
+
+            
+            if (typeof animate == 'string'){
+                switch (animate) {
+                    case DISPLAY:
+                        visMode = El.DISPLAY;
+                        break;
+                    case VISIBILITY:
+                        visMode = El.VISIBILITY;
+                        break;
+                    case OFFSETS:
+                        visMode = El.OFFSETS;
+                        break;
+                    case NOSIZE:
+                    case ASCLASS:
+                        visMode = El.ASCLASS;
+                        break;
+                }
+                me.setVisibilityMode(visMode);
+                animate = false;
+            }
+
+            if (!animate || !me.anim) {
+                if(visMode == El.ASCLASS ){
+
+                    me[visible?'removeCls':'addCls'](me.visibilityCls || El.visibilityCls);
+
+                } else if (visMode == El.DISPLAY){
+
+                    return me.setDisplayed(visible);
+
+                } else if (visMode == El.OFFSETS){
+
+                    if (!visible){
+                        
+                        if (!me.hideModeStyles) {
+                            me.hideModeStyles = {
+                                position: me.getStyle('position'),
+                                top: me.getStyle('top'),
+                                left: me.getStyle('left')
+                            };
+                        }
+                        me.applyStyles({position: 'absolute', top: '-10000px', left: '-10000px'});
+                    }
+
+                    
+                    
+                    else if (me.hideModeStyles) {
+                        me.applyStyles(me.hideModeStyles || {position: '', top: '', left: ''});
+                        delete me.hideModeStyles;
+                    }
+
+                }else{
+                    me.fixDisplay();
+                    
+                    dom.style.visibility = visible ? '' : HIDDEN;
+                }
+            }else{
+                
+                if(visible){
+                    me.setOpacity(0.01);
+                    me.setVisible(true);
+                }
+                if (!Ext.isObject(animate)) {
+                    animate = {
+                        duration: 350,
+                        easing: 'ease-in'
+                    };
+                }
+                me.animate(Ext.applyIf({
+                    callback: function() {
+                        visible || me.setVisible(false).setOpacity(1);
+                    },
+                    to: {
+                        opacity: (visible) ? 1 : 0
+                    }
+                }, animate));
+            }
+            data(dom, ISVISIBLE, visible);  
+            return me;
+        },
+
+
+        
+        hasMetrics  : function(){
+            var dom = this.dom;
+            return this.isVisible() || (getVisMode(dom) == El.OFFSETS) || (getVisMode(dom) == El.VISIBILITY);
+        },
+
+        
+        toggle : function(animate){
+            var me = this;
+            me.setVisible(!me.isVisible(), me.anim(animate));
+            return me;
+        },
+
+        
+        setDisplayed : function(value) {
+            if(typeof value == "boolean"){
+               value = value ? getDisplay(this.dom) : NONE;
+            }
+            this.setStyle(DISPLAY, value);
+            return this;
+        },
+
+        
+        fixDisplay : function(){
+            var me = this;
+            if (me.isStyle(DISPLAY, NONE)) {
+                me.setStyle(VISIBILITY, HIDDEN);
+                me.setStyle(DISPLAY, getDisplay(this.dom)); 
+                if (me.isStyle(DISPLAY, NONE)) { 
+                    me.setStyle(DISPLAY, "block");
+                }
+            }
+        },
+
+        
+        hide : function(animate){
+            
+            if (typeof animate == 'string'){
+                this.setVisible(false, animate);
+                return this;
+            }
+            this.setVisible(false, this.anim(animate));
+            return this;
+        },
+
+        
+        show : function(animate){
+            
+            if (typeof animate == 'string'){
+                this.setVisible(true, animate);
+                return this;
+            }
+            this.setVisible(true, this.anim(animate));
+            return this;
+        }
+    };
+}());
+
+Ext.applyIf(Ext.Element.prototype, {
+    
+    animate: function(config) {
+        var me = this;
+        if (!me.id) {
+            me = Ext.get(me.dom);
+        }
+        if (Ext.fx.Manager.hasFxBlock(me.id)) {
+            return me;
+        }
+        Ext.fx.Manager.queueFx(Ext.create('Ext.fx.Anim', me.anim(config)));
+        return this;
+    },
+
+    
+    anim: function(config) {
+        if (!Ext.isObject(config)) {
+            return (config) ? {} : false;
+        }
+
+        var me = this,
+            duration = config.duration || Ext.fx.Anim.prototype.duration,
+            easing = config.easing || 'ease',
+            animConfig;
+
+        if (config.stopAnimation) {
+            me.stopAnimation();
+        }
+
+        Ext.applyIf(config, Ext.fx.Manager.getFxDefaults(me.id));
+
+        
+        Ext.fx.Manager.setFxDefaults(me.id, {
+            delay: 0
+        });
+
+        animConfig = {
+            target: me,
+            remove: config.remove,
+            alternate: config.alternate || false,
+            duration: duration,
+            easing: easing,
+            callback: config.callback,
+            listeners: config.listeners,
+            iterations: config.iterations || 1,
+            scope: config.scope,
+            block: config.block,
+            concurrent: config.concurrent,
+            delay: config.delay || 0,
+            paused: true,
+            keyframes: config.keyframes,
+            from: config.from || {},
+            to: Ext.apply({}, config)
+        };
+        Ext.apply(animConfig.to, config.to);
+
+        
+        delete animConfig.to.to;
+        delete animConfig.to.from;
+        delete animConfig.to.remove;
+        delete animConfig.to.alternate;
+        delete animConfig.to.keyframes;
+        delete animConfig.to.iterations;
+        delete animConfig.to.listeners;
+        delete animConfig.to.target;
+        delete animConfig.to.paused;
+        delete animConfig.to.callback;
+        delete animConfig.to.scope;
+        delete animConfig.to.duration;
+        delete animConfig.to.easing;
+        delete animConfig.to.concurrent;
+        delete animConfig.to.block;
+        delete animConfig.to.stopAnimation;
+        delete animConfig.to.delay;
+        return animConfig;
+    },
+
+    
+    slideIn: function(anchor, obj, slideOut) {
+        var me = this,
+            elStyle = me.dom.style,
+            beforeAnim, wrapAnim;
+
+        anchor = anchor || "t";
+        obj = obj || {};
+
+        beforeAnim = function() {
+            var animScope = this,
+                listeners = obj.listeners,
+                box, position, restoreSize, wrap, anim;
+
+            if (!slideOut) {
+                me.fixDisplay();
+            }
+
+            box = me.getBox();
+            if ((anchor == 't' || anchor == 'b') && box.height === 0) {
+                box.height = me.dom.scrollHeight;
+            }
+            else if ((anchor == 'l' || anchor == 'r') && box.width === 0) {
+                box.width = me.dom.scrollWidth;
+            }
+
+            position = me.getPositioning();
+            me.setSize(box.width, box.height);
+
+            wrap = me.wrap({
+                style: {
+                    visibility: slideOut ? 'visible' : 'hidden'
+                }
+            });
+            wrap.setPositioning(position);
+            if (wrap.isStyle('position', 'static')) {
+                wrap.position('relative');
+            }
+            me.clearPositioning('auto');
+            wrap.clip();
+
+            
+            
+            
+            me.setStyle({
+                visibility: '',
+                position: 'absolute'
+            });
+            if (slideOut) {
+                wrap.setSize(box.width, box.height);
+            }
+
+            switch (anchor) {
+                case 't':
+                    anim = {
+                        from: {
+                            width: box.width + 'px',
+                            height: '0px'
+                        },
+                        to: {
+                            width: box.width + 'px',
+                            height: box.height + 'px'
+                        }
+                    };
+                    elStyle.bottom = '0px';
+                    break;
+                case 'l':
+                    anim = {
+                        from: {
+                            width: '0px',
+                            height: box.height + 'px'
+                        },
+                        to: {
+                            width: box.width + 'px',
+                            height: box.height + 'px'
+                        }
+                    };
+                    elStyle.right = '0px';
+                    break;
+                case 'r':
+                    anim = {
+                        from: {
+                            x: box.x + box.width,
+                            width: '0px',
+                            height: box.height + 'px'
+                        },
+                        to: {
+                            x: box.x,
+                            width: box.width + 'px',
+                            height: box.height + 'px'
+                        }
+                    };
+                    break;
+                case 'b':
+                    anim = {
+                        from: {
+                            y: box.y + box.height,
+                            width: box.width + 'px',
+                            height: '0px'
+                        },
+                        to: {
+                            y: box.y,
+                            width: box.width + 'px',
+                            height: box.height + 'px'
+                        }
+                    };
+                    break;
+                case 'tl':
+                    anim = {
+                        from: {
+                            x: box.x,
+                            y: box.y,
+                            width: '0px',
+                            height: '0px'
+                        },
+                        to: {
+                            width: box.width + 'px',
+                            height: box.height + 'px'
+                        }
+                    };
+                    elStyle.bottom = '0px';
+                    elStyle.right = '0px';
+                    break;
+                case 'bl':
+                    anim = {
+                        from: {
+                            x: box.x + box.width,
+                            width: '0px',
+                            height: '0px'
+                        },
+                        to: {
+                            x: box.x,
+                            width: box.width + 'px',
+                            height: box.height + 'px'
+                        }
+                    };
+                    elStyle.right = '0px';
+                    break;
+                case 'br':
+                    anim = {
+                        from: {
+                            x: box.x + box.width,
+                            y: box.y + box.height,
+                            width: '0px',
+                            height: '0px'
+                        },
+                        to: {
+                            x: box.x,
+                            y: box.y,
+                            width: box.width + 'px',
+                            height: box.height + 'px'
+                        }
+                    };
+                    break;
+                case 'tr':
+                    anim = {
+                        from: {
+                            y: box.y + box.height,
+                            width: '0px',
+                            height: '0px'
+                        },
+                        to: {
+                            y: box.y,
+                            width: box.width + 'px',
+                            height: box.height + 'px'
+                        }
+                    };
+                    elStyle.bottom = '0px';
+                    break;
+            }
+
+            wrap.show();
+            wrapAnim = Ext.apply({}, obj);
+            delete wrapAnim.listeners;
+            wrapAnim = Ext.create('Ext.fx.Anim', Ext.applyIf(wrapAnim, {
+                target: wrap,
+                duration: 500,
+                easing: 'ease-out',
+                from: slideOut ? anim.to : anim.from,
+                to: slideOut ? anim.from : anim.to
+            }));
+
+            
+            wrapAnim.on('afteranimate', function() {
+                if (slideOut) {
+                    me.setPositioning(position);
+                    if (obj.useDisplay) {
+                        me.setDisplayed(false);
+                    } else {
+                        me.hide();
+                    }
+                }
+                else {
+                    me.clearPositioning();
+                    me.setPositioning(position);
+                }
+                if (wrap.dom) {
+                    wrap.dom.parentNode.insertBefore(me.dom, wrap.dom);
+                    wrap.remove();
+                }
+                me.setSize(box.width, box.height);
+                animScope.end();
+            });
+            
+            if (listeners) {
+                wrapAnim.on(listeners);
+            }
+        };
+
+        me.animate({
+            duration: obj.duration ? obj.duration * 2 : 1000,
+            listeners: {
+                beforeanimate: {
+                    fn: beforeAnim
+                },
+                afteranimate: {
+                    fn: function() {
+                        if (wrapAnim && wrapAnim.running) {
+                            wrapAnim.end();
+                        }
+                    }
+                }
+            }
+        });
+        return me;
+    },
+
+
+    
+    slideOut: function(anchor, o) {
+        return this.slideIn(anchor, o, true);
+    },
+
+    
+    puff: function(obj) {
+        var me = this,
+            beforeAnim;
+        obj = Ext.applyIf(obj || {}, {
+            easing: 'ease-out',
+            duration: 500,
+            useDisplay: false
+        });
+
+        beforeAnim = function() {
+            me.clearOpacity();
+            me.show();
+
+            var box = me.getBox(),
+                fontSize = me.getStyle('fontSize'),
+                position = me.getPositioning();
+            this.to = {
+                width: box.width * 2,
+                height: box.height * 2,
+                x: box.x - (box.width / 2),
+                y: box.y - (box.height /2),
+                opacity: 0,
+                fontSize: '200%'
+            };
+            this.on('afteranimate',function() {
+                if (me.dom) {
+                    if (obj.useDisplay) {
+                        me.setDisplayed(false);
+                    } else {
+                        me.hide();
+                    }
+                    me.clearOpacity();
+                    me.setPositioning(position);
+                    me.setStyle({fontSize: fontSize});
+                }
+            });
+        };
+
+        me.animate({
+            duration: obj.duration,
+            easing: obj.easing,
+            listeners: {
+                beforeanimate: {
+                    fn: beforeAnim
+                }
+            }
+        });
+        return me;
+    },
+
+    
+    switchOff: function(obj) {
+        var me = this,
+            beforeAnim;
+
+        obj = Ext.applyIf(obj || {}, {
+            easing: 'ease-in',
+            duration: 500,
+            remove: false,
+            useDisplay: false
+        });
+
+        beforeAnim = function() {
+            var animScope = this,
+                size = me.getSize(),
+                xy = me.getXY(),
+                keyframe, position;
+            me.clearOpacity();
+            me.clip();
+            position = me.getPositioning();
+
+            keyframe = Ext.create('Ext.fx.Animator', {
+                target: me,
+                duration: obj.duration,
+                easing: obj.easing,
+                keyframes: {
+                    33: {
+                        opacity: 0.3
+                    },
+                    66: {
+                        height: 1,
+                        y: xy[1] + size.height / 2
+                    },
+                    100: {
+                        width: 1,
+                        x: xy[0] + size.width / 2
+                    }
+                }
+            });
+            keyframe.on('afteranimate', function() {
+                if (obj.useDisplay) {
+                    me.setDisplayed(false);
+                } else {
+                    me.hide();
+                }
+                me.clearOpacity();
+                me.setPositioning(position);
+                me.setSize(size);
+                animScope.end();
+            });
+        };
+        me.animate({
+            duration: (obj.duration * 2),
+            listeners: {
+                beforeanimate: {
+                    fn: beforeAnim
+                }
+            }
+        });
+        return me;
+    },
+
+    
+    frame : function(color, count, obj){
+        var me = this,
+            beforeAnim;
+
+        color = color || '#C3DAF9';
+        count = count || 1;
+        obj = obj || {};
+
+        beforeAnim = function() {
+            me.show();
+            var animScope = this,
+                box = me.getBox(),
+                proxy = Ext.getBody().createChild({
+                    style: {
+                        position : 'absolute',
+                        'pointer-events': 'none',
+                        'z-index': 35000,
+                        border : '0px solid ' + color
+                    }
+                }),
+                proxyAnim;
+            proxyAnim = Ext.create('Ext.fx.Anim', {
+                target: proxy,
+                duration: obj.duration || 1000,
+                iterations: count,
+                from: {
+                    top: box.y,
+                    left: box.x,
+                    borderWidth: 0,
+                    opacity: 1,
+                    height: box.height,
+                    width: box.width
+                },
+                to: {
+                    top: box.y - 20,
+                    left: box.x - 20,
+                    borderWidth: 10,
+                    opacity: 0,
+                    height: box.height + 40,
+                    width: box.width + 40
+                }
+            });
+            proxyAnim.on('afteranimate', function() {
+                proxy.remove();
+                animScope.end();
+            });
+        };
+
+        me.animate({
+            duration: (obj.duration * 2) || 2000,
+            listeners: {
+                beforeanimate: {
+                    fn: beforeAnim
+                }
+            }
+        });
+        return me;
+    },
+
+    
+    ghost: function(anchor, obj) {
+        var me = this,
+            beforeAnim;
+
+        anchor = anchor || "b";
+        beforeAnim = function() {
+            var width = me.getWidth(),
+                height = me.getHeight(),
+                xy = me.getXY(),
+                position = me.getPositioning(),
+                to = {
+                    opacity: 0
+                };
+            switch (anchor) {
+                case 't':
+                    to.y = xy[1] - height;
+                    break;
+                case 'l':
+                    to.x = xy[0] - width;
+                    break;
+                case 'r':
+                    to.x = xy[0] + width;
+                    break;
+                case 'b':
+                    to.y = xy[1] + height;
+                    break;
+                case 'tl':
+                    to.x = xy[0] - width;
+                    to.y = xy[1] - height;
+                    break;
+                case 'bl':
+                    to.x = xy[0] - width;
+                    to.y = xy[1] + height;
+                    break;
+                case 'br':
+                    to.x = xy[0] + width;
+                    to.y = xy[1] + height;
+                    break;
+                case 'tr':
+                    to.x = xy[0] + width;
+                    to.y = xy[1] - height;
+                    break;
+            }
+            this.to = to;
+            this.on('afteranimate', function () {
+                if (me.dom) {
+                    me.hide();
+                    me.clearOpacity();
+                    me.setPositioning(position);
+                }
+            });
+        };
+
+        me.animate(Ext.applyIf(obj || {}, {
+            duration: 500,
+            easing: 'ease-out',
+            listeners: {
+                beforeanimate: {
+                    fn: beforeAnim
+                }
+            }
+        }));
+        return me;
+    },
+
+    
+    highlight: function(color, o) {
+        var me = this,
+            dom = me.dom,
+            from = {},
+            restore, to, attr, lns, event, fn;
+
+        o = o || {};
+        lns = o.listeners || {};
+        attr = o.attr || 'backgroundColor';
+        from[attr] = color || 'ffff9c';
+
+        if (!o.to) {
+            to = {};
+            to[attr] = o.endColor || me.getColor(attr, 'ffffff', '');
+        }
+        else {
+            to = o.to;
+        }
+
+        
+        o.listeners = Ext.apply(Ext.apply({}, lns), {
+            beforeanimate: function() {
+                restore = dom.style[attr];
+                me.clearOpacity();
+                me.show();
+
+                event = lns.beforeanimate;
+                if (event) {
+                    fn = event.fn || event;
+                    return fn.apply(event.scope || lns.scope || window, arguments);
+                }
+            },
+            afteranimate: function() {
+                if (dom) {
+                    dom.style[attr] = restore;
+                }
+
+                event = lns.afteranimate;
+                if (event) {
+                    fn = event.fn || event;
+                    fn.apply(event.scope || lns.scope || window, arguments);
+                }
+            }
+        });
+
+        me.animate(Ext.apply({}, o, {
+            duration: 1000,
+            easing: 'ease-in',
+            from: from,
+            to: to
+        }));
+        return me;
+    },
+
+   
+    pause: function(ms) {
+        var me = this;
+        Ext.fx.Manager.setFxDefaults(me.id, {
+            delay: ms
+        });
+        return me;
+    },
+
+    
+    fadeIn: function(o) {
+        this.animate(Ext.apply({}, o, {
+            opacity: 1
+        }));
+        return this;
+    },
+
+    
+    fadeOut: function(o) {
+        this.animate(Ext.apply({}, o, {
+            opacity: 0
+        }));
+        return this;
+    },
+
+    
+    scale: function(w, h, o) {
+        this.animate(Ext.apply({}, o, {
+            width: w,
+            height: h
+        }));
+        return this;
+    },
+
+    
+    shift: function(config) {
+        this.animate(config);
+        return this;
+    }
+});
+
+
+Ext.applyIf(Ext.Element, {
+    unitRe: /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
+    camelRe: /(-[a-z])/gi,
+    opacityRe: /alpha\(opacity=(.*)\)/i,
+    cssRe: /([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,
+    propertyCache: {},
+    defaultUnit : "px",
+    borders: {l: 'border-left-width', r: 'border-right-width', t: 'border-top-width', b: 'border-bottom-width'},
+    paddings: {l: 'padding-left', r: 'padding-right', t: 'padding-top', b: 'padding-bottom'},
+    margins: {l: 'margin-left', r: 'margin-right', t: 'margin-top', b: 'margin-bottom'},
+
+    
+    addUnits : Ext.Element.prototype.addUnits,
+
+    
+    parseBox : function(box) {
+        if (Ext.isObject(box)) {
+            return {
+                top: box.top || 0,
+                right: box.right || 0,
+                bottom: box.bottom || 0,
+                left: box.left || 0
+            };
+        } else {
+            if (typeof box != 'string') {
+                box = box.toString();
+            }
+            var parts  = box.split(' '),
+                ln = parts.length;
+    
+            if (ln == 1) {
+                parts[1] = parts[2] = parts[3] = parts[0];
+            }
+            else if (ln == 2) {
+                parts[2] = parts[0];
+                parts[3] = parts[1];
+            }
+            else if (ln == 3) {
+                parts[3] = parts[1];
+            }
+    
+            return {
+                top   :parseFloat(parts[0]) || 0,
+                right :parseFloat(parts[1]) || 0,
+                bottom:parseFloat(parts[2]) || 0,
+                left  :parseFloat(parts[3]) || 0
+            };
+        }
+        
+    },
+    
+    
+    unitizeBox : function(box, units) {
+        var A = this.addUnits,
+            B = this.parseBox(box);
+            
+        return A(B.top, units) + ' ' +
+               A(B.right, units) + ' ' +
+               A(B.bottom, units) + ' ' +
+               A(B.left, units);
+        
+    },
+
+    
+    camelReplaceFn : function(m, a) {
+        return a.charAt(1).toUpperCase();
+    },
+
+    
+    normalize : function(prop) {
+        if (prop == 'float') {
+            prop = Ext.supports.Float ? 'cssFloat' : 'styleFloat';
+        }
+        return this.propertyCache[prop] || (this.propertyCache[prop] = prop.replace(this.camelRe, this.camelReplaceFn));
+    },
+
+    
+    getDocumentHeight: function() {
+        return Math.max(!Ext.isStrict ? document.body.scrollHeight : document.documentElement.scrollHeight, this.getViewportHeight());
+    },
+
+    
+    getDocumentWidth: function() {
+        return Math.max(!Ext.isStrict ? document.body.scrollWidth : document.documentElement.scrollWidth, this.getViewportWidth());
+    },
+
+    
+    getViewportHeight: function(){
+        return window.innerHeight;
+    },
+
+    
+    getViewportWidth : function() {
+        return window.innerWidth;
+    },
+
+    
+    getViewSize : function() {
+        return {
+            width: window.innerWidth,
+            height: window.innerHeight
+        };
+    },
+
+    
+    getOrientation : function() {
+        if (Ext.supports.OrientationChange) {
+            return (window.orientation == 0) ? 'portrait' : 'landscape';
+        }
+        
+        return (window.innerHeight > window.innerWidth) ? 'portrait' : 'landscape';
+    },
+
+    
+    fromPoint: function(x, y) {
+        return Ext.get(document.elementFromPoint(x, y));
+    },
+    
+    
+    parseStyles: function(styles){
+        var out = {},
+            cssRe = this.cssRe,
+            matches;
+            
+        if (styles) {
+            
+            
+            
+            
+            cssRe.lastIndex = 0;
+            while ((matches = cssRe.exec(styles))) {
+                out[matches[1]] = matches[2];
+            }
+        }
+        return out;
+    }
+});
+
+
+Ext.CompositeElementLite = function(els, root){
+    
+    this.elements = [];
+    this.add(els, root);
+    this.el = new Ext.Element.Flyweight();
+};
+
+Ext.CompositeElementLite.prototype = {
+    isComposite: true,
+
+    
+    getElement : function(el){
+        
+        var e = this.el;
+        e.dom = el;
+        e.id = el.id;
+        return e;
+    },
+
+    
+    transformElement : function(el){
+        return Ext.getDom(el);
+    },
+
+    
+    getCount : function(){
+        return this.elements.length;
+    },
+    
+    add : function(els, root){
+        var me = this,
+            elements = me.elements;
+        if(!els){
+            return this;
+        }
+        if(typeof els == "string"){
+            els = Ext.Element.selectorFunction(els, root);
+        }else if(els.isComposite){
+            els = els.elements;
+        }else if(!Ext.isIterable(els)){
+            els = [els];
+        }
+
+        for(var i = 0, len = els.length; i < len; ++i){
+            elements.push(me.transformElement(els[i]));
+        }
+        return me;
+    },
+
+    invoke : function(fn, args){
+        var me = this,
+            els = me.elements,
+            len = els.length,
+            e,
+            i;
+
+        for(i = 0; i < len; i++) {
+            e = els[i];
+            if(e){
+                Ext.Element.prototype[fn].apply(me.getElement(e), args);
+            }
+        }
+        return me;
+    },
+    
+    item : function(index){
+        var me = this,
+            el = me.elements[index],
+            out = null;
+
+        if(el){
+            out = me.getElement(el);
+        }
+        return out;
+    },
+
+    
+    addListener : function(eventName, handler, scope, opt){
+        var els = this.elements,
+            len = els.length,
+            i, e;
+
+        for(i = 0; i<len; i++) {
+            e = els[i];
+            if(e) {
+                Ext.EventManager.on(e, eventName, handler, scope || e, opt);
+            }
+        }
+        return this;
+    },
+    
+    each : function(fn, scope){
+        var me = this,
+            els = me.elements,
+            len = els.length,
+            i, e;
+
+        for(i = 0; i<len; i++) {
+            e = els[i];
+            if(e){
+                e = this.getElement(e);
+                if(fn.call(scope || e, e, me, i) === false){
+                    break;
+                }
+            }
+        }
+        return me;
+    },
+
+    
+    fill : function(els){
+        var me = this;
+        me.elements = [];
+        me.add(els);
+        return me;
+    },
+
+    
+    filter : function(selector){
+        var els = [],
+            me = this,
+            fn = Ext.isFunction(selector) ? selector
+                : function(el){
+                    return el.is(selector);
+                };
+
+        me.each(function(el, self, i) {
+            if (fn(el, i) !== false) {
+                els[els.length] = me.transformElement(el);
+            }
+        });
+
+        me.elements = els;
+        return me;
+    },
+
+    
+    indexOf : function(el){
+        return Ext.Array.indexOf(this.elements, this.transformElement(el));
+    },
+
+    
+    replaceElement : function(el, replacement, domReplace){
+        var index = !isNaN(el) ? el : this.indexOf(el),
+            d;
+        if(index > -1){
+            replacement = Ext.getDom(replacement);
+            if(domReplace){
+                d = this.elements[index];
+                d.parentNode.insertBefore(replacement, d);
+                Ext.removeNode(d);
+            }
+            Ext.Array.splice(this.elements, index, 1, replacement);
+        }
+        return this;
+    },
+
+    
+    clear : function(){
+        this.elements = [];
+    }
+};
+
+Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
+
+
+Ext.CompositeElementLite.importElementMethods = function() {
+    var fnName,
+        ElProto = Ext.Element.prototype,
+        CelProto = Ext.CompositeElementLite.prototype;
+
+    for (fnName in ElProto) {
+        if (typeof ElProto[fnName] == 'function'){
+            (function(fnName) {
+                CelProto[fnName] = CelProto[fnName] || function() {
+                    return this.invoke(fnName, arguments);
+                };
+            }).call(CelProto, fnName);
+
+        }
+    }
+};
+
+Ext.CompositeElementLite.importElementMethods();
+
+if(Ext.DomQuery){
+    Ext.Element.selectorFunction = Ext.DomQuery.select;
+}
+
+
+Ext.Element.select = function(selector, root){
+    var els;
+    if(typeof selector == "string"){
+        els = Ext.Element.selectorFunction(selector, root);
+    }else if(selector.length !== undefined){
+        els = selector;
+    }else{
+    }
+    return new Ext.CompositeElementLite(els);
+};
+
+Ext.select = Ext.Element.select;
+
+
+Ext.util.DelayedTask = function(fn, scope, args) {
+    var me = this,
+        id,
+        call = function() {
+            clearInterval(id);
+            id = null;
+            fn.apply(scope, args || []);
+        };
+
+    
+    this.delay = function(delay, newFn, newScope, newArgs) {
+        me.cancel();
+        fn = newFn || fn;
+        scope = newScope || scope;
+        args = newArgs || args;
+        id = setInterval(call, delay);
+    };
+
+    
+    this.cancel = function(){
+        if (id) {
+            clearInterval(id);
+            id = null;
+        }
+    };
+};
+Ext.require('Ext.util.DelayedTask', function() {
+
+    Ext.util.Event = Ext.extend(Object, (function() {
+        function createBuffered(handler, listener, o, scope) {
+            listener.task = new Ext.util.DelayedTask();
+            return function() {
+                listener.task.delay(o.buffer, handler, scope, Ext.Array.toArray(arguments));
+            };
+        }
+
+        function createDelayed(handler, listener, o, scope) {
+            return function() {
+                var task = new Ext.util.DelayedTask();
+                if (!listener.tasks) {
+                    listener.tasks = [];
+                }
+                listener.tasks.push(task);
+                task.delay(o.delay || 10, handler, scope, Ext.Array.toArray(arguments));
+            };
+        }
+
+        function createSingle(handler, listener, o, scope) {
+            return function() {
+                listener.ev.removeListener(listener.fn, scope);
+                return handler.apply(scope, arguments);
+            };
+        }
+
+        return {
+            isEvent: true,
+
+            constructor: function(observable, name) {
+                this.name = name;
+                this.observable = observable;
+                this.listeners = [];
+            },
+
+            addListener: function(fn, scope, options) {
+                var me = this,
+                    listener;
+                    scope = scope || me.observable;
+
+
+                if (!me.isListening(fn, scope)) {
+                    listener = me.createListener(fn, scope, options);
+                    if (me.firing) {
+                        
+                        me.listeners = me.listeners.slice(0);
+                    }
+                    me.listeners.push(listener);
+                }
+            },
+
+            createListener: function(fn, scope, o) {
+                o = o || {};
+                scope = scope || this.observable;
+
+                var listener = {
+                        fn: fn,
+                        scope: scope,
+                        o: o,
+                        ev: this
+                    },
+                    handler = fn;
+
+                
+                
+                if (o.single) {
+                    handler = createSingle(handler, listener, o, scope);
+                }
+                if (o.delay) {
+                    handler = createDelayed(handler, listener, o, scope);
+                }
+                if (o.buffer) {
+                    handler = createBuffered(handler, listener, o, scope);
+                }
+
+                listener.fireFn = handler;
+                return listener;
+            },
+
+            findListener: function(fn, scope) {
+                var listeners = this.listeners,
+                i = listeners.length,
+                listener,
+                s;
+
+                while (i--) {
+                    listener = listeners[i];
+                    if (listener) {
+                        s = listener.scope;
+                        if (listener.fn == fn && (s == scope || s == this.observable)) {
+                            return i;
+                        }
+                    }
+                }
+
+                return - 1;
+            },
+
+            isListening: function(fn, scope) {
+                return this.findListener(fn, scope) !== -1;
+            },
+
+            removeListener: function(fn, scope) {
+                var me = this,
+                    index,
+                    listener,
+                    k;
+                index = me.findListener(fn, scope);
+                if (index != -1) {
+                    listener = me.listeners[index];
+
+                    if (me.firing) {
+                        me.listeners = me.listeners.slice(0);
+                    }
+
+                    
+                    if (listener.task) {
+                        listener.task.cancel();
+                        delete listener.task;
+                    }
+
+                    
+                    k = listener.tasks && listener.tasks.length;
+                    if (k) {
+                        while (k--) {
+                            listener.tasks[k].cancel();
+                        }
+                        delete listener.tasks;
+                    }
+
+                    
+                    Ext.Array.erase(me.listeners, index, 1);
+                    return true;
+                }
+
+                return false;
+            },
+
+            
+            clearListeners: function() {
+                var listeners = this.listeners,
+                    i = listeners.length;
+
+                while (i--) {
+                    this.removeListener(listeners[i].fn, listeners[i].scope);
+                }
+            },
+
+            fire: function() {
+                var me = this,
+                    listeners = me.listeners,
+                    count = listeners.length,
+                    i,
+                    args,
+                    listener;
+
+                if (count > 0) {
+                    me.firing = true;
+                    for (i = 0; i < count; i++) {
+                        listener = listeners[i];
+                        args = arguments.length ? Array.prototype.slice.call(arguments, 0) : [];
+                        if (listener.o) {
+                            args.push(listener.o);
+                        }
+                        if (listener && listener.fireFn.apply(listener.scope || me.observable, args) === false) {
+                            return (me.firing = false);
+                        }
+                    }
+                }
+                me.firing = false;
+                return true;
+            }
+        };
+    })());
+});
+
+
+Ext.EventManager = {
+
+    
+
+    
+    hasBoundOnReady: false,
+
+    
+    hasFiredReady: false,
+
+    
+    readyTimeout: null,
+
+    
+    hasOnReadyStateChange: false,
+
+    
+    readyEvent: new Ext.util.Event(),
+
+    
+    checkReadyState: function(){
+        var me = Ext.EventManager;
+
+        if(window.attachEvent){
+            
+            
+            if (window != top) {
+                return false;
+            }
+            try{
+                document.documentElement.doScroll('left');
+            }catch(e){
+                return false;
+            }
+            me.fireDocReady();
+            return true;
+        }
+        if (document.readyState == 'complete') {
+            me.fireDocReady();
+            return true;
+        }
+        me.readyTimeout = setTimeout(arguments.callee, 2);
+        return false;
+    },
+
+    
+    bindReadyEvent: function(){
+        var me = Ext.EventManager;
+        if (me.hasBoundOnReady) {
+            return;
+        }
+
+        if (document.addEventListener) {
+            document.addEventListener('DOMContentLoaded', me.fireDocReady, false);
+            
+            window.addEventListener('load', me.fireDocReady, false);
+        } else {
+            
+            if (!me.checkReadyState()) {
+                document.attachEvent('onreadystatechange', me.checkReadyState);
+                me.hasOnReadyStateChange = true;
+            }
+            
+            window.attachEvent('onload', me.fireDocReady, false);
+        }
+        me.hasBoundOnReady = true;
+    },
+
+    
+    fireDocReady: function(){
+        var me = Ext.EventManager;
+
+        
+        if (!me.hasFiredReady) {
+            me.hasFiredReady = true;
+
+            if (document.addEventListener) {
+                document.removeEventListener('DOMContentLoaded', me.fireDocReady, false);
+                window.removeEventListener('load', me.fireDocReady, false);
+            } else {
+                if (me.readyTimeout !== null) {
+                    clearTimeout(me.readyTimeout);
+                }
+                if (me.hasOnReadyStateChange) {
+                    document.detachEvent('onreadystatechange', me.checkReadyState);
+                }
+                window.detachEvent('onload', me.fireDocReady);
+            }
+            Ext.supports.init();
+        }
+        if (!Ext.isReady) {
+            Ext.isReady = true;
+            me.onWindowUnload();
+            me.readyEvent.fire();
+        }
+    },
+
+    
+    onDocumentReady: function(fn, scope, options){
+        options = options || {};
+        var me = Ext.EventManager,
+            readyEvent = me.readyEvent;
+
+        
+        options.single = true;
+
+        
+        if (Ext.isReady) {
+            readyEvent.addListener(fn, scope, options);
+            readyEvent.fire();
+        } else {
+            options.delay = options.delay || 1;
+            readyEvent.addListener(fn, scope, options);
+            me.bindReadyEvent();
+        }
+    },
+
+
+    
+
+    
+    stoppedMouseDownEvent: new Ext.util.Event(),
+
+    
+    propRe: /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate|freezeEvent)$/,
+
+    
+    getId : function(element) {
+        var skipGarbageCollection = false,
+            id;
+
+        element = Ext.getDom(element);
+
+        if (element === document || element === window) {
+            id = element === document ? Ext.documentId : Ext.windowId;
+        }
+        else {
+            id = Ext.id(element);
+        }
+        
+        if (element && (element.getElementById || element.navigator)) {
+            skipGarbageCollection = true;
+        }
+
+        if (!Ext.cache[id]){
+            Ext.Element.addToCache(new Ext.Element(element), id);
+            if (skipGarbageCollection) {
+                Ext.cache[id].skipGarbageCollection = true;
+            }
+        }
+        return id;
+    },
+
+    
+    prepareListenerConfig: function(element, config, isRemove){
+        var me = this,
+            propRe = me.propRe,
+            key, value, args;
+
+        
+        for (key in config) {
+            if (config.hasOwnProperty(key)) {
+                
+                if (!propRe.test(key)) {
+                    value = config[key];
+                    
+                    
+                    if (Ext.isFunction(value)) {
+                        
+                        args = [element, key, value, config.scope, config];
+                    } else {
+                        
+                        args = [element, key, value.fn, value.scope, value];
+                    }
+
+                    if (isRemove === true) {
+                        me.removeListener.apply(this, args);
+                    } else {
+                        me.addListener.apply(me, args);
+                    }
+                }
+            }
+        }
+    },
+
+    
+    normalizeEvent: function(eventName, fn){
+        if (/mouseenter|mouseleave/.test(eventName) && !Ext.supports.MouseEnterLeave) {
+            if (fn) {
+                fn = Ext.Function.createInterceptor(fn, this.contains, this);
+            }
+            eventName = eventName == 'mouseenter' ? 'mouseover' : 'mouseout';
+        } else if (eventName == 'mousewheel' && !Ext.supports.MouseWheel && !Ext.isOpera){
+            eventName = 'DOMMouseScroll';
+        }
+        return {
+            eventName: eventName,
+            fn: fn
+        };
+    },
+
+    
+    contains: function(event){
+        var parent = event.browserEvent.currentTarget,
+            child = this.getRelatedTarget(event);
+
+        if (parent && parent.firstChild) {
+            while (child) {
+                if (child === parent) {
+                    return false;
+                }
+                child = child.parentNode;
+                if (child && (child.nodeType != 1)) {
+                    child = null;
+                }
+            }
+        }
+        return true;
+    },
+
+    
+    addListener: function(element, eventName, fn, scope, options){
+        
+        if (typeof eventName !== 'string') {
+            this.prepareListenerConfig(element, eventName);
+            return;
+        }
+
+        var dom = Ext.getDom(element),
+            bind,
+            wrap;
+
+
+        
+        options = options || {};
+
+        bind = this.normalizeEvent(eventName, fn);
+        wrap = this.createListenerWrap(dom, eventName, bind.fn, scope, options);
+
+
+        if (dom.attachEvent) {
+            dom.attachEvent('on' + bind.eventName, wrap);
+        } else {
+            dom.addEventListener(bind.eventName, wrap, options.capture || false);
+        }
+
+        if (dom == document && eventName == 'mousedown') {
+            this.stoppedMouseDownEvent.addListener(wrap);
+        }
+
+        
+        this.getEventListenerCache(dom, eventName).push({
+            fn: fn,
+            wrap: wrap,
+            scope: scope
+        });
+    },
+
+    
+    removeListener : function(element, eventName, fn, scope) {
+        
+        if (typeof eventName !== 'string') {
+            this.prepareListenerConfig(element, eventName, true);
+            return;
+        }
+
+        var dom = Ext.getDom(element),
+            cache = this.getEventListenerCache(dom, eventName),
+            bindName = this.normalizeEvent(eventName).eventName,
+            i = cache.length, j,
+            listener, wrap, tasks;
+
+
+        while (i--) {
+            listener = cache[i];
+
+            if (listener && (!fn || listener.fn == fn) && (!scope || listener.scope === scope)) {
+                wrap = listener.wrap;
+
+                
+                if (wrap.task) {
+                    clearTimeout(wrap.task);
+                    delete wrap.task;
+                }
+
+                
+                j = wrap.tasks && wrap.tasks.length;
+                if (j) {
+                    while (j--) {
+                        clearTimeout(wrap.tasks[j]);
+                    }
+                    delete wrap.tasks;
+                }
+
+                if (dom.detachEvent) {
+                    dom.detachEvent('on' + bindName, wrap);
+                } else {
+                    dom.removeEventListener(bindName, wrap, false);
+                }
+
+                if (wrap && dom == document && eventName == 'mousedown') {
+                    this.stoppedMouseDownEvent.removeListener(wrap);
+                }
+
+                
+                Ext.Array.erase(cache, i, 1);
+            }
+        }
+    },
+
+    
+    removeAll : function(element){
+        var dom = Ext.getDom(element),
+            cache, ev;
+        if (!dom) {
+            return;
+        }
+        cache = this.getElementEventCache(dom);
+
+        for (ev in cache) {
+            if (cache.hasOwnProperty(ev)) {
+                this.removeListener(dom, ev);
+            }
+        }
+        Ext.cache[dom.id].events = {};
+    },
+
+    
+    purgeElement : function(element, eventName) {
+        var dom = Ext.getDom(element),
+            i = 0, len;
+
+        if(eventName) {
+            this.removeListener(dom, eventName);
+        }
+        else {
+            this.removeAll(dom);
+        }
+
+        if(dom && dom.childNodes) {
+            for(len = element.childNodes.length; i < len; i++) {
+                this.purgeElement(element.childNodes[i], eventName);
+            }
+        }
+    },
+
+    
+    createListenerWrap : function(dom, ename, fn, scope, options) {
+        options = options || {};
+
+        var f, gen;
+
+        return function wrap(e, args) {
+            
+            if (!gen) {
+                f = ['if(!Ext) {return;}'];
+
+                if(options.buffer || options.delay || options.freezeEvent) {
+                    f.push('e = new Ext.EventObjectImpl(e, ' + (options.freezeEvent ? 'true' : 'false' ) + ');');
+                } else {
+                    f.push('e = Ext.EventObject.setEvent(e);');
+                }
+
+                if (options.delegate) {
+                    f.push('var t = e.getTarget("' + options.delegate + '", this);');
+                    f.push('if(!t) {return;}');
+                } else {
+                    f.push('var t = e.target;');
+                }
+
+                if (options.target) {
+                    f.push('if(e.target !== options.target) {return;}');
+                }
+
+                if(options.stopEvent) {
+                    f.push('e.stopEvent();');
+                } else {
+                    if(options.preventDefault) {
+                        f.push('e.preventDefault();');
+                    }
+                    if(options.stopPropagation) {
+                        f.push('e.stopPropagation();');
+                    }
+                }
+
+                if(options.normalized === false) {
+                    f.push('e = e.browserEvent;');
+                }
+
+                if(options.buffer) {
+                    f.push('(wrap.task && clearTimeout(wrap.task));');
+                    f.push('wrap.task = setTimeout(function(){');
+                }
+
+                if(options.delay) {
+                    f.push('wrap.tasks = wrap.tasks || [];');
+                    f.push('wrap.tasks.push(setTimeout(function(){');
+                }
+
+                
+                f.push('fn.call(scope || dom, e, t, options);');
+
+                if(options.single) {
+                    f.push('Ext.EventManager.removeListener(dom, ename, fn, scope);');
+                }
+
+                if(options.delay) {
+                    f.push('}, ' + options.delay + '));');
+                }
+
+                if(options.buffer) {
+                    f.push('}, ' + options.buffer + ');');
+                }
+
+                gen = Ext.functionFactory('e', 'options', 'fn', 'scope', 'ename', 'dom', 'wrap', 'args', f.join('\n'));
+            }
+
+            gen.call(dom, e, options, fn, scope, ename, dom, wrap, args);
+        };
+    },
+
+    
+    getEventListenerCache : function(element, eventName) {
+        if (!element) {
+            return [];
+        }
+
+        var eventCache = this.getElementEventCache(element);
+        return eventCache[eventName] || (eventCache[eventName] = []);
+    },
+
+    
+    getElementEventCache : function(element) {
+        if (!element) {
+            return {};
+        }
+        var elementCache = Ext.cache[this.getId(element)];
+        return elementCache.events || (elementCache.events = {});
+    },
+
+    
+    mouseLeaveRe: /(mouseout|mouseleave)/,
+    mouseEnterRe: /(mouseover|mouseenter)/,
+
+    
+    stopEvent: function(event) {
+        this.stopPropagation(event);
+        this.preventDefault(event);
+    },
+
+    
+    stopPropagation: function(event) {
+        event = event.browserEvent || event;
+        if (event.stopPropagation) {
+            event.stopPropagation();
+        } else {
+            event.cancelBubble = true;
+        }
+    },
+
+    
+    preventDefault: function(event) {
+        event = event.browserEvent || event;
+        if (event.preventDefault) {
+            event.preventDefault();
+        } else {
+            event.returnValue = false;
+            
+            try {
+              
+              if (event.ctrlKey || event.keyCode > 111 && event.keyCode < 124) {
+                  event.keyCode = -1;
+              }
+            } catch (e) {
+                
+            }
+        }
+    },
+
+    
+    getRelatedTarget: function(event) {
+        event = event.browserEvent || event;
+        var target = event.relatedTarget;
+        if (!target) {
+            if (this.mouseLeaveRe.test(event.type)) {
+                target = event.toElement;
+            } else if (this.mouseEnterRe.test(event.type)) {
+                target = event.fromElement;
+            }
+        }
+        return this.resolveTextNode(target);
+    },
+
+    
+    getPageX: function(event) {
+        return this.getXY(event)[0];
+    },
+
+    
+    getPageY: function(event) {
+        return this.getXY(event)[1];
+    },
+
+    
+    getPageXY: function(event) {
+        event = event.browserEvent || event;
+        var x = event.pageX,
+            y = event.pageY,
+            doc = document.documentElement,
+            body = document.body;
+
+        
+        if (!x && x !== 0) {
+            x = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+            y = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+        }
+        return [x, y];
+    },
+
+    
+    getTarget: function(event) {
+        event = event.browserEvent || event;
+        return this.resolveTextNode(event.target || event.srcElement);
+    },
+
+    
+    
+    resolveTextNode: Ext.isGecko ?
+        function(node) {
+            if (!node) {
+                return;
+            }
+            
+            var s = HTMLElement.prototype.toString.call(node);
+            if (s == '[xpconnect wrapped native prototype]' || s == '[object XULElement]') {
+                return;
+            }
+                return node.nodeType == 3 ? node.parentNode: node;
+            }: function(node) {
+                return node && node.nodeType == 3 ? node.parentNode: node;
+            },
+
+    
+
+    
+    curWidth: 0,
+    curHeight: 0,
+
+    
+    onWindowResize: function(fn, scope, options){
+        var resize = this.resizeEvent;
+        if(!resize){
+            this.resizeEvent = resize = new Ext.util.Event();
+            this.on(window, 'resize', this.fireResize, this, {buffer: 100});
+        }
+        resize.addListener(fn, scope, options);
+    },
+
+    
+    fireResize: function(){
+        var me = this,
+            w = Ext.Element.getViewWidth(),
+            h = Ext.Element.getViewHeight();
+
+         
+         if(me.curHeight != h || me.curWidth != w){
+             me.curHeight = h;
+             me.curWidth = w;
+             me.resizeEvent.fire(w, h);
+         }
+    },
+
+    
+    removeResizeListener: function(fn, scope){
+        if (this.resizeEvent) {
+            this.resizeEvent.removeListener(fn, scope);
+        }
+    },
+
+    onWindowUnload: function() {
+        var unload = this.unloadEvent;
+        if (!unload) {
+            this.unloadEvent = unload = new Ext.util.Event();
+            this.addListener(window, 'unload', this.fireUnload, this);
+        }
+    },
+
+    
+    fireUnload: function() {
+        
+        try {
+            this.removeUnloadListener();
+            
+            if (Ext.isGecko3) {
+                var gridviews = Ext.ComponentQuery.query('gridview'),
+                    i = 0,
+                    ln = gridviews.length;
+                for (; i < ln; i++) {
+                    gridviews[i].scrollToTop();
+                }
+            }
+            
+            var el,
+                cache = Ext.cache;
+            for (el in cache) {
+                if (cache.hasOwnProperty(el)) {
+                    Ext.EventManager.removeAll(el);
+                }
+            }
+        } catch(e) {
+        }
+    },
+
+    
+    removeUnloadListener: function(){
+        if (this.unloadEvent) {
+            this.removeListener(window, 'unload', this.fireUnload);
+        }
+    },
+
+    
+    useKeyDown: Ext.isWebKit ?
+                   parseInt(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1], 10) >= 525 :
+                   !((Ext.isGecko && !Ext.isWindows) || Ext.isOpera),
+
+    
+    getKeyEvent: function(){
+        return this.useKeyDown ? 'keydown' : 'keypress';
+    }
+};
+
+
+Ext.onReady = function(fn, scope, options) {
+    Ext.Loader.onReady(fn, scope, true, options);
+};
+
+
+Ext.onDocumentReady = Ext.EventManager.onDocumentReady;
+
+
+Ext.EventManager.on = Ext.EventManager.addListener;
+
+
+Ext.EventManager.un = Ext.EventManager.removeListener;
+
+(function(){
+    var initExtCss = function() {
+        
+        var bd = document.body || document.getElementsByTagName('body')[0],
+            baseCSSPrefix = Ext.baseCSSPrefix,
+            cls = [baseCSSPrefix + 'body'],
+            htmlCls = [],
+            html;
+
+        if (!bd) {
+            return false;
+        }
+
+        html = bd.parentNode;
+
+        function add (c) {
+            cls.push(baseCSSPrefix + c);
+        }
+
+        
+        if (Ext.isIE) {
+            add('ie');
+
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            if (Ext.isIE6) {
+                add('ie6');
+            } else { 
+                add('ie7p');
+
+                if (Ext.isIE7) {
+                    add('ie7');
+                } else {
+                    add('ie8p');
+
+                    if (Ext.isIE8) {
+                        add('ie8');
+                    } else {
+                        add('ie9p');
+
+                        if (Ext.isIE9) {
+                            add('ie9');
+                        }
+                    }
+                }
+            }
+
+            if (Ext.isIE6 || Ext.isIE7) {
+                add('ie7m');
+            }
+            if (Ext.isIE6 || Ext.isIE7 || Ext.isIE8) {
+                add('ie8m');
+            }
+            if (Ext.isIE7 || Ext.isIE8) {
+                add('ie78');
+            }
+        }
+        if (Ext.isGecko) {
+            add('gecko');
+            if (Ext.isGecko3) {
+                add('gecko3');
+            }
+            if (Ext.isGecko4) {
+                add('gecko4');
+            }
+            if (Ext.isGecko5) {
+                add('gecko5');
+            }
+        }
+        if (Ext.isOpera) {
+            add('opera');
+        }
+        if (Ext.isWebKit) {
+            add('webkit');
+        }
+        if (Ext.isSafari) {
+            add('safari');
+            if (Ext.isSafari2) {
+                add('safari2');
+            }
+            if (Ext.isSafari3) {
+                add('safari3');
+            }
+            if (Ext.isSafari4) {
+                add('safari4');
+            }
+            if (Ext.isSafari5) {
+                add('safari5');
+            }
+        }
+        if (Ext.isChrome) {
+            add('chrome');
+        }
+        if (Ext.isMac) {
+            add('mac');
+        }
+        if (Ext.isLinux) {
+            add('linux');
+        }
+        if (!Ext.supports.CSS3BorderRadius) {
+            add('nbr');
+        }
+        if (!Ext.supports.CSS3LinearGradient) {
+            add('nlg');
+        }
+        if (!Ext.scopeResetCSS) {
+            add('reset');
+        }
+
+        
+        if (html) {
+            if (Ext.isStrict && (Ext.isIE6 || Ext.isIE7)) {
+                Ext.isBorderBox = false;
+            }
+            else {
+                Ext.isBorderBox = true;
+            }
+
+            htmlCls.push(baseCSSPrefix + (Ext.isBorderBox ? 'border-box' : 'strict'));
+            if (!Ext.isStrict) {
+                htmlCls.push(baseCSSPrefix + 'quirks');
+            }
+            Ext.fly(html, '_internal').addCls(htmlCls);
+        }
+
+        Ext.fly(bd, '_internal').addCls(cls);
+        return true;
+    };
+
+    Ext.onReady(initExtCss);
+})();
+
+
+Ext.define('Ext.EventObjectImpl', {
+    uses: ['Ext.util.Point'],
+
+    
+    BACKSPACE: 8,
+    
+    TAB: 9,
+    
+    NUM_CENTER: 12,
+    
+    ENTER: 13,
+    
+    RETURN: 13,
+    
+    SHIFT: 16,
+    
+    CTRL: 17,
+    
+    ALT: 18,
+    
+    PAUSE: 19,
+    
+    CAPS_LOCK: 20,
+    
+    ESC: 27,
+    
+    SPACE: 32,
+    
+    PAGE_UP: 33,
+    
+    PAGE_DOWN: 34,
+    
+    END: 35,
+    
+    HOME: 36,
+    
+    LEFT: 37,
+    
+    UP: 38,
+    
+    RIGHT: 39,
+    
+    DOWN: 40,
+    
+    PRINT_SCREEN: 44,
+    
+    INSERT: 45,
+    
+    DELETE: 46,
+    
+    ZERO: 48,
+    
+    ONE: 49,
+    
+    TWO: 50,
+    
+    THREE: 51,
+    
+    FOUR: 52,
+    
+    FIVE: 53,
+    
+    SIX: 54,
+    
+    SEVEN: 55,
+    
+    EIGHT: 56,
+    
+    NINE: 57,
+    
+    A: 65,
+    
+    B: 66,
+    
+    C: 67,
+    
+    D: 68,
+    
+    E: 69,
+    
+    F: 70,
+    
+    G: 71,
+    
+    H: 72,
+    
+    I: 73,
+    
+    J: 74,
+    
+    K: 75,
+    
+    L: 76,
+    
+    M: 77,
+    
+    N: 78,
+    
+    O: 79,
+    
+    P: 80,
+    
+    Q: 81,
+    
+    R: 82,
+    
+    S: 83,
+    
+    T: 84,
+    
+    U: 85,
+    
+    V: 86,
+    
+    W: 87,
+    
+    X: 88,
+    
+    Y: 89,
+    
+    Z: 90,
+    
+    CONTEXT_MENU: 93,
+    
+    NUM_ZERO: 96,
+    
+    NUM_ONE: 97,
+    
+    NUM_TWO: 98,
+    
+    NUM_THREE: 99,
+    
+    NUM_FOUR: 100,
+    
+    NUM_FIVE: 101,
+    
+    NUM_SIX: 102,
+    
+    NUM_SEVEN: 103,
+    
+    NUM_EIGHT: 104,
+    
+    NUM_NINE: 105,
+    
+    NUM_MULTIPLY: 106,
+    
+    NUM_PLUS: 107,
+    
+    NUM_MINUS: 109,
+    
+    NUM_PERIOD: 110,
+    
+    NUM_DIVISION: 111,
+    
+    F1: 112,
+    
+    F2: 113,
+    
+    F3: 114,
+    
+    F4: 115,
+    
+    F5: 116,
+    
+    F6: 117,
+    
+    F7: 118,
+    
+    F8: 119,
+    
+    F9: 120,
+    
+    F10: 121,
+    
+    F11: 122,
+    
+    F12: 123,
+    
+    WHEEL_SCALE: (function () {
+        var scale;
+
+        if (Ext.isGecko) {
+            
+            scale = 3;
+        } else if (Ext.isMac) {
+            
+            
+            
+
+            if (Ext.isSafari && Ext.webKitVersion >= 532.0) {
+                
+                
+                
+                
+                
+                
+                scale = 120;
+            } else {
+                
+                
+                scale = 12;
+            }
+
+            
+            
+            
+            
+            scale *= 3;
+        } else {
+            
+            scale = 120;
+        }
+
+        return scale;
+    })(),
+
+    
+    clickRe: /(dbl)?click/,
+    
+    safariKeys: {
+        3: 13, 
+        63234: 37, 
+        63235: 39, 
+        63232: 38, 
+        63233: 40, 
+        63276: 33, 
+        63277: 34, 
+        63272: 46, 
+        63273: 36, 
+        63275: 35 
+    },
+    
+    btnMap: Ext.isIE ? {
+        1: 0,
+        4: 1,
+        2: 2
+    } : {
+        0: 0,
+        1: 1,
+        2: 2
+    },
+
+    constructor: function(event, freezeEvent){
+        if (event) {
+            this.setEvent(event.browserEvent || event, freezeEvent);
+        }
+    },
+
+    setEvent: function(event, freezeEvent){
+        var me = this, button, options;
+
+        if (event == me || (event && event.browserEvent)) { 
+            return event;
+        }
+        me.browserEvent = event;
+        if (event) {
+            
+            button = event.button ? me.btnMap[event.button] : (event.which ? event.which - 1 : -1);
+            if (me.clickRe.test(event.type) && button == -1) {
+                button = 0;
+            }
+            options = {
+                type: event.type,
+                button: button,
+                shiftKey: event.shiftKey,
+                
+                ctrlKey: event.ctrlKey || event.metaKey || false,
+                altKey: event.altKey,
+                
+                keyCode: event.keyCode,
+                charCode: event.charCode,
+                
+                target: Ext.EventManager.getTarget(event),
+                relatedTarget: Ext.EventManager.getRelatedTarget(event),
+                currentTarget: event.currentTarget,
+                xy: (freezeEvent ? me.getXY() : null)
+            };
+        } else {
+            options = {
+                button: -1,
+                shiftKey: false,
+                ctrlKey: false,
+                altKey: false,
+                keyCode: 0,
+                charCode: 0,
+                target: null,
+                xy: [0, 0]
+            };
+        }
+        Ext.apply(me, options);
+        return me;
+    },
+
+    
+    stopEvent: function(){
+        this.stopPropagation();
+        this.preventDefault();
+    },
+
+    
+    preventDefault: function(){
+        if (this.browserEvent) {
+            Ext.EventManager.preventDefault(this.browserEvent);
+        }
+    },
+
+    
+    stopPropagation: function(){
+        var browserEvent = this.browserEvent;
+
+        if (browserEvent) {
+            if (browserEvent.type == 'mousedown') {
+                Ext.EventManager.stoppedMouseDownEvent.fire(this);
+            }
+            Ext.EventManager.stopPropagation(browserEvent);
+        }
+    },
+
+    
+    getCharCode: function(){
+        return this.charCode || this.keyCode;
+    },
+
+    
+    getKey: function(){
+        return this.normalizeKey(this.keyCode || this.charCode);
+    },
+
+    
+    normalizeKey: function(key){
+        
+        return Ext.isWebKit ? (this.safariKeys[key] || key) : key;
+    },
+
+    
+    getPageX: function(){
+        return this.getX();
+    },
+
+    
+    getPageY: function(){
+        return this.getY();
+    },
+
+    
+    getX: function() {
+        return this.getXY()[0];
+    },
+
+    
+    getY: function() {
+        return this.getXY()[1];
+    },
+
+    
+    getXY: function() {
+        if (!this.xy) {
+            
+            this.xy = Ext.EventManager.getPageXY(this.browserEvent);
+        }
+        return this.xy;
+    },
+
+    
+    getTarget : function(selector, maxDepth, returnEl){
+        if (selector) {
+            return Ext.fly(this.target).findParent(selector, maxDepth, returnEl);
+        }
+        return returnEl ? Ext.get(this.target) : this.target;
+    },
+
+    
+    getRelatedTarget : function(selector, maxDepth, returnEl){
+        if (selector) {
+            return Ext.fly(this.relatedTarget).findParent(selector, maxDepth, returnEl);
+        }
+        return returnEl ? Ext.get(this.relatedTarget) : this.relatedTarget;
+    },
+
+    
+    correctWheelDelta : function (delta) {
+        var scale = this.WHEEL_SCALE,
+            ret = Math.round(delta / scale);
+
+        if (!ret && delta) {
+            ret = (delta < 0) ? -1 : 1; 
+        }
+
+        return ret;
+    },
+
+    
+    getWheelDeltas : function () {
+        var me = this,
+            event = me.browserEvent,
+            dx = 0, dy = 0; 
+
+        if (Ext.isDefined(event.wheelDeltaX)) { 
+            dx = event.wheelDeltaX;
+            dy = event.wheelDeltaY;
+        } else if (event.wheelDelta) { 
+            dy = event.wheelDelta;
+        } else if (event.detail) { 
+            dy = -event.detail; 
+
+            
+            
+            if (dy > 100) {
+                dy = 3;
+            } else if (dy < -100) {
+                dy = -3;
+            }
+
+            
+            
+            if (Ext.isDefined(event.axis) && event.axis === event.HORIZONTAL_AXIS) {
+                dx = dy;
+                dy = 0;
+            }
+        }
+
+        return {
+            x: me.correctWheelDelta(dx),
+            y: me.correctWheelDelta(dy)
+        };
+    },
+
+    
+    getWheelDelta : function(){
+        var deltas = this.getWheelDeltas();
+
+        return deltas.y;
+    },
+
+    
+    within : function(el, related, allowEl){
+        if(el){
+            var t = related ? this.getRelatedTarget() : this.getTarget(),
+                result;
+
+            if (t) {
+                result = Ext.fly(el).contains(t);
+                if (!result && allowEl) {
+                    result = t == Ext.getDom(el);
+                }
+                return result;
+            }
+        }
+        return false;
+    },
+
+    
+    isNavKeyPress : function(){
+        var me = this,
+            k = this.normalizeKey(me.keyCode);
+
+       return (k >= 33 && k <= 40) ||  
+       k == me.RETURN ||
+       k == me.TAB ||
+       k == me.ESC;
+    },
+
+    
+    isSpecialKey : function(){
+        var k = this.normalizeKey(this.keyCode);
+        return (this.type == 'keypress' && this.ctrlKey) ||
+        this.isNavKeyPress() ||
+        (k == this.BACKSPACE) || 
+        (k >= 16 && k <= 20) || 
+        (k >= 44 && k <= 46);   
+    },
+
+    
+    getPoint : function(){
+        var xy = this.getXY();
+        return Ext.create('Ext.util.Point', xy[0], xy[1]);
+    },
+
+   
+    hasModifier : function(){
+        return this.ctrlKey || this.altKey || this.shiftKey || this.metaKey;
+    },
+
+    
+    injectEvent: function () {
+        var API,
+            dispatchers = {}; 
+
+        
+
+        
+        
+
+        if (!Ext.isIE && document.createEvent) { 
+            API = {
+                createHtmlEvent: function (doc, type, bubbles, cancelable) {
+                    var event = doc.createEvent('HTMLEvents');
+
+                    event.initEvent(type, bubbles, cancelable);
+                    return event;
+                },
+
+                createMouseEvent: function (doc, type, bubbles, cancelable, detail,
+                                            clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
+                                            button, relatedTarget) {
+                    var event = doc.createEvent('MouseEvents'),
+                        view = doc.defaultView || window;
+
+                    if (event.initMouseEvent) {
+                        event.initMouseEvent(type, bubbles, cancelable, view, detail,
+                                    clientX, clientY, clientX, clientY, ctrlKey, altKey,
+                                    shiftKey, metaKey, button, relatedTarget);
+                    } else { 
+                        event = doc.createEvent('UIEvents');
+                        event.initEvent(type, bubbles, cancelable);
+                        event.view = view;
+                        event.detail = detail;
+                        event.screenX = clientX;
+                        event.screenY = clientY;
+                        event.clientX = clientX;
+                        event.clientY = clientY;
+                        event.ctrlKey = ctrlKey;
+                        event.altKey = altKey;
+                        event.metaKey = metaKey;
+                        event.shiftKey = shiftKey;
+                        event.button = button;
+                        event.relatedTarget = relatedTarget;
+                    }
+
+                    return event;
+                },
+
+                createUIEvent: function (doc, type, bubbles, cancelable, detail) {
+                    var event = doc.createEvent('UIEvents'),
+                        view = doc.defaultView || window;
+
+                    event.initUIEvent(type, bubbles, cancelable, view, detail);
+                    return event;
+                },
+
+                fireEvent: function (target, type, event) {
+                    target.dispatchEvent(event);
+                },
+
+                fixTarget: function (target) {
+                    
+                    if (target == window && !target.dispatchEvent) {
+                        return document;
+                    }
+
+                    return target;
+                }
+            };
+        } else if (document.createEventObject) { 
+            var crazyIEButtons = { 0: 1, 1: 4, 2: 2 };
+
+            API = {
+                createHtmlEvent: function (doc, type, bubbles, cancelable) {
+                    var event = doc.createEventObject();
+                    event.bubbles = bubbles;
+                    event.cancelable = cancelable;
+                    return event;
+                },
+
+                createMouseEvent: function (doc, type, bubbles, cancelable, detail,
+                                            clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
+                                            button, relatedTarget) {
+                    var event = doc.createEventObject();
+                    event.bubbles = bubbles;
+                    event.cancelable = cancelable;
+                    event.detail = detail;
+                    event.screenX = clientX;
+                    event.screenY = clientY;
+                    event.clientX = clientX;
+                    event.clientY = clientY;
+                    event.ctrlKey = ctrlKey;
+                    event.altKey = altKey;
+                    event.shiftKey = shiftKey;
+                    event.metaKey = metaKey;
+                    event.button = crazyIEButtons[button] || button;
+                    event.relatedTarget = relatedTarget; 
+                    return event;
+                },
+
+                createUIEvent: function (doc, type, bubbles, cancelable, detail) {
+                    var event = doc.createEventObject();
+                    event.bubbles = bubbles;
+                    event.cancelable = cancelable;
+                    return event;
+                },
+
+                fireEvent: function (target, type, event) {
+                    target.fireEvent('on' + type, event);
+                },
+
+                fixTarget: function (target) {
+                    if (target == document) {
+                        
+                        
+                        return document.documentElement;
+                    }
+
+                    return target;
+                }
+            };
+        }
+
+        
+        
+
+        Ext.Object.each({
+                load:   [false, false],
+                unload: [false, false],
+                select: [true, false],
+                change: [true, false],
+                submit: [true, true],
+                reset:  [true, false],
+                resize: [true, false],
+                scroll: [true, false]
+            },
+            function (name, value) {
+                var bubbles = value[0], cancelable = value[1];
+                dispatchers[name] = function (targetEl, srcEvent) {
+                    var e = API.createHtmlEvent(name, bubbles, cancelable);
+                    API.fireEvent(targetEl, name, e);
+                };
+            });
+
+        
+        
+
+        function createMouseEventDispatcher (type, detail) {
+            var cancelable = (type != 'mousemove');
+            return function (targetEl, srcEvent) {
+                var xy = srcEvent.getXY(),
+                    e = API.createMouseEvent(targetEl.ownerDocument, type, true, cancelable,
+                                detail, xy[0], xy[1], srcEvent.ctrlKey, srcEvent.altKey,
+                                srcEvent.shiftKey, srcEvent.metaKey, srcEvent.button,
+                                srcEvent.relatedTarget);
+                API.fireEvent(targetEl, type, e);
+            };
+        }
+
+        Ext.each(['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mousemove', 'mouseout'],
+            function (eventName) {
+                dispatchers[eventName] = createMouseEventDispatcher(eventName, 1);
+            });
+
+        
+        
+
+        Ext.Object.each({
+                focusin:  [true, false],
+                focusout: [true, false],
+                activate: [true, true],
+                focus:    [false, false],
+                blur:     [false, false]
+            },
+            function (name, value) {
+                var bubbles = value[0], cancelable = value[1];
+                dispatchers[name] = function (targetEl, srcEvent) {
+                    var e = API.createUIEvent(targetEl.ownerDocument, name, bubbles, cancelable, 1);
+                    API.fireEvent(targetEl, name, e);
+                };
+            });
+
+        
+        if (!API) {
+            
+
+            dispatchers = {}; 
+
+            API = {
+                fixTarget: function (t) {
+                    return t;
+                }
+            };
+        }
+
+        function cannotInject (target, srcEvent) {
+        }
+
+        return function (target) {
+            var me = this,
+                dispatcher = dispatchers[me.type] || cannotInject,
+                t = target ? (target.dom || target) : me.getTarget();
+
+            t = API.fixTarget(t);
+            dispatcher(t, me);
+        };
+    }() 
+
+}, function() {
+
+Ext.EventObject = new Ext.EventObjectImpl();
+
+});
+
+
+
+(function(){
+    var doc = document,
+        activeElement = null,
+        isCSS1 = doc.compatMode == "CSS1Compat",
+        ELEMENT = Ext.Element,
+        fly = function(el){
+            if (!_fly) {
+                _fly = new Ext.Element.Flyweight();
+            }
+            _fly.dom = el;
+            return _fly;
+        }, _fly;
+
+    
+    
+    
+    if (!('activeElement' in doc) && doc.addEventListener) {
+        doc.addEventListener('focus',
+            function (ev) {
+                if (ev && ev.target) {
+                    activeElement = (ev.target == doc) ? null : ev.target;
+                }
+            }, true);
+    }
+
+    
+    function makeSelectionRestoreFn (activeEl, start, end) {
+        return function () {
+            activeEl.selectionStart = start;
+            activeEl.selectionEnd = end;
+        };
+    }
+
+    Ext.apply(ELEMENT, {
+        isAncestor : function(p, c) {
+            var ret = false;
+
+            p = Ext.getDom(p);
+            c = Ext.getDom(c);
+            if (p && c) {
+                if (p.contains) {
+                    return p.contains(c);
+                } else if (p.compareDocumentPosition) {
+                    return !!(p.compareDocumentPosition(c) & 16);
+                } else {
+                    while ((c = c.parentNode)) {
+                        ret = c == p || ret;
+                    }
+                }
+            }
+            return ret;
+        },
+
+        
+        getActiveElement: function () {
+            return doc.activeElement || activeElement;
+        },
+
+        
+        getRightMarginFixCleaner: function (target) {
+            var supports = Ext.supports,
+                hasInputBug = supports.DisplayChangeInputSelectionBug,
+                hasTextAreaBug = supports.DisplayChangeTextAreaSelectionBug;
+
+            if (hasInputBug || hasTextAreaBug) {
+                var activeEl = doc.activeElement || activeElement, 
+                    tag = activeEl && activeEl.tagName,
+                    start,
+                    end;
+
+                if ((hasTextAreaBug && tag == 'TEXTAREA') ||
+                    (hasInputBug && tag == 'INPUT' && activeEl.type == 'text')) {
+                    if (ELEMENT.isAncestor(target, activeEl)) {
+                        start = activeEl.selectionStart;
+                        end = activeEl.selectionEnd;
+
+                        if (Ext.isNumber(start) && Ext.isNumber(end)) { 
+                            
+                            
+                            
+                            
+                            return makeSelectionRestoreFn(activeEl, start, end);
+                        }
+                    }
+                }
+            }
+
+            return Ext.emptyFn; 
+        },
+
+        getViewWidth : function(full) {
+            return full ? ELEMENT.getDocumentWidth() : ELEMENT.getViewportWidth();
+        },
+
+        getViewHeight : function(full) {
+            return full ? ELEMENT.getDocumentHeight() : ELEMENT.getViewportHeight();
+        },
+
+        getDocumentHeight: function() {
+            return Math.max(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, ELEMENT.getViewportHeight());
+        },
+
+        getDocumentWidth: function() {
+            return Math.max(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, ELEMENT.getViewportWidth());
+        },
+
+        getViewportHeight: function(){
+            return Ext.isIE ?
+                   (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) :
+                   self.innerHeight;
+        },
+
+        getViewportWidth : function() {
+            return (!Ext.isStrict && !Ext.isOpera) ? doc.body.clientWidth :
+                   Ext.isIE ? doc.documentElement.clientWidth : self.innerWidth;
+        },
+
+        getY : function(el) {
+            return ELEMENT.getXY(el)[1];
+        },
+
+        getX : function(el) {
+            return ELEMENT.getXY(el)[0];
+        },
+
+        getOffsetParent: function (el) {
+            el = Ext.getDom(el);
+            try {
+                
+                return el.offsetParent;
+            } catch (e) {
+                var body = document.body; 
+                return (el == body) ? null : body;
+            }
+        },
+
+        getXY : function(el) {
+            var p,
+                pe,
+                b,
+                bt,
+                bl,
+                dbd,
+                x = 0,
+                y = 0,
+                scroll,
+                hasAbsolute,
+                bd = (doc.body || doc.documentElement),
+                ret;
+
+            el = Ext.getDom(el);
+
+            if(el != bd){
+                hasAbsolute = fly(el).isStyle("position", "absolute");
+
+                if (el.getBoundingClientRect) {
+                    try {
+                        b = el.getBoundingClientRect();
+                        scroll = fly(document).getScroll();
+                        ret = [ Math.round(b.left + scroll.left), Math.round(b.top + scroll.top) ];
+                    } catch (e) {
+                        
+                    }
+                }
+
+                if (!ret) {
+                    for (p = el; p; p = ELEMENT.getOffsetParent(p)) {
+                        pe = fly(p);
+                        x += p.offsetLeft;
+                        y += p.offsetTop;
+
+                        hasAbsolute = hasAbsolute || pe.isStyle("position", "absolute");
+
+                        if (Ext.isGecko) {
+                            y += bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0;
+                            x += bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0;
+
+                            if (p != el && !pe.isStyle('overflow','visible')) {
+                                x += bl;
+                                y += bt;
+                            }
+                        }
+                    }
+
+                    if (Ext.isSafari && hasAbsolute) {
+                        x -= bd.offsetLeft;
+                        y -= bd.offsetTop;
+                    }
+
+                    if (Ext.isGecko && !hasAbsolute) {
+                        dbd = fly(bd);
+                        x += parseInt(dbd.getStyle("borderLeftWidth"), 10) || 0;
+                        y += parseInt(dbd.getStyle("borderTopWidth"), 10) || 0;
+                    }
+
+                    p = el.parentNode;
+                    while (p && p != bd) {
+                        if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) {
+                            x -= p.scrollLeft;
+                            y -= p.scrollTop;
+                        }
+                        p = p.parentNode;
+                    }
+                    ret = [x,y];
+                }
+            }
+            return ret || [0,0];
+        },
+
+        setXY : function(el, xy) {
+            (el = Ext.fly(el, '_setXY')).position();
+
+            var pts = el.translatePoints(xy),
+                style = el.dom.style,
+                pos;
+
+            for (pos in pts) {
+                if (!isNaN(pts[pos])) {
+                    style[pos] = pts[pos] + "px";
+                }
+            }
+        },
+
+        setX : function(el, x) {
+            ELEMENT.setXY(el, [x, false]);
+        },
+
+        setY : function(el, y) {
+            ELEMENT.setXY(el, [false, y]);
+        },
+
+        
+        serializeForm: function(form) {
+            var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements,
+                hasSubmit = false,
+                encoder = encodeURIComponent,
+                name,
+                data = '',
+                type,
+                hasValue;
+
+            Ext.each(fElements, function(element){
+                name = element.name;
+                type = element.type;
+
+                if (!element.disabled && name) {
+                    if (/select-(one|multiple)/i.test(type)) {
+                        Ext.each(element.options, function(opt){
+                            if (opt.selected) {
+                                hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified;
+                                data += Ext.String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text));
+                            }
+                        });
+                    } else if (!(/file|undefined|reset|button/i.test(type))) {
+                        if (!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) {
+                            data += encoder(name) + '=' + encoder(element.value) + '&';
+                            hasSubmit = /submit/i.test(type);
+                        }
+                    }
+                }
+            });
+            return data.substr(0, data.length - 1);
+        }
+    });
+})();
+
+
+
+Ext.Element.addMethods((function(){
+    var focusRe = /button|input|textarea|select|object/;
+    return {
+        
+        monitorMouseLeave: function(delay, handler, scope) {
+            var me = this,
+                timer,
+                listeners = {
+                    mouseleave: function(e) {
+                        timer = setTimeout(Ext.Function.bind(handler, scope||me, [e]), delay);
+                    },
+                    mouseenter: function() {
+                        clearTimeout(timer);
+                    },
+                    freezeEvent: true
+                };
+
+            me.on(listeners);
+            return listeners;
+        },
+
+        
+        swallowEvent : function(eventName, preventDefault) {
+            var me = this;
+            function fn(e) {
+                e.stopPropagation();
+                if (preventDefault) {
+                    e.preventDefault();
+                }
+            }
+
+            if (Ext.isArray(eventName)) {
+                Ext.each(eventName, function(e) {
+                     me.on(e, fn);
+                });
+                return me;
+            }
+            me.on(eventName, fn);
+            return me;
+        },
+
+        
+        relayEvent : function(eventName, observable) {
+            this.on(eventName, function(e) {
+                observable.fireEvent(eventName, e);
+            });
+        },
+
+        
+        clean : function(forceReclean) {
+            var me  = this,
+                dom = me.dom,
+                n   = dom.firstChild,
+                nx,
+                ni  = -1;
+    
+            if (Ext.Element.data(dom, 'isCleaned') && forceReclean !== true) {
+                return me;
+            }
+
+            while (n) {
+                nx = n.nextSibling;
+                if (n.nodeType == 3) {
+                    
+                    if (!(/\S/.test(n.nodeValue))) {
+                        dom.removeChild(n);
+                    
+                    } else if (nx && nx.nodeType == 3) {
+                        n.appendData(Ext.String.trim(nx.data));
+                        dom.removeChild(nx);
+                        nx = n.nextSibling;
+                        n.nodeIndex = ++ni;
+                    }
+                } else {
+                    
+                    Ext.fly(n).clean();
+                    n.nodeIndex = ++ni;
+                }
+                n = nx;
+            }
+
+            Ext.Element.data(dom, 'isCleaned', true);
+            return me;
+        },
+
+        
+        load : function(options) {
+            this.getLoader().load(options);
+            return this;
+        },
+
+        
+        getLoader : function() {
+            var dom = this.dom,
+                data = Ext.Element.data,
+                loader = data(dom, 'loader');
+    
+            if (!loader) {
+                loader = Ext.create('Ext.ElementLoader', {
+                    target: this
+                });
+                data(dom, 'loader', loader);
+            }
+            return loader;
+        },
+
+        
+        update : function(html, loadScripts, callback) {
+            var me = this,
+                id,
+                dom,
+                interval;
+
+            if (!me.dom) {
+                return me;
+            }
+            html = html || '';
+            dom = me.dom;
+
+            if (loadScripts !== true) {
+                dom.innerHTML = html;
+                Ext.callback(callback, me);
+                return me;
+            }
+
+            id  = Ext.id();
+            html += '<span id="' + id + '"></span>';
+
+            interval = setInterval(function(){
+                if (!document.getElementById(id)) {
+                    return false;
+                }
+                clearInterval(interval);
+                var DOC    = document,
+                    hd     = DOC.getElementsByTagName("head")[0],
+                    re     = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,
+                    srcRe  = /\ssrc=([\'\"])(.*?)\1/i,
+                    typeRe = /\stype=([\'\"])(.*?)\1/i,
+                    match,
+                    attrs,
+                    srcMatch,
+                    typeMatch,
+                    el,
+                    s;
+
+                while ((match = re.exec(html))) {
+                    attrs = match[1];
+                    srcMatch = attrs ? attrs.match(srcRe) : false;
+                    if (srcMatch && srcMatch[2]) {
+                       s = DOC.createElement("script");
+                       s.src = srcMatch[2];
+                       typeMatch = attrs.match(typeRe);
+                       if (typeMatch && typeMatch[2]) {
+                           s.type = typeMatch[2];
+                       }
+                       hd.appendChild(s);
+                    } else if (match[2] && match[2].length > 0) {
+                        if (window.execScript) {
+                           window.execScript(match[2]);
+                        } else {
+                           window.eval(match[2]);
+                        }
+                    }
+                }
+
+                el = DOC.getElementById(id);
+                if (el) {
+                    Ext.removeNode(el);
+                }
+                Ext.callback(callback, me);
+            }, 20);
+            dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, '');
+            return me;
+        },
+
+        
+        removeAllListeners : function() {
+            this.removeAnchor();
+            Ext.EventManager.removeAll(this.dom);
+            return this;
+        },
+    
+        
+        getScopeParent: function(){
+            var parent = this.dom.parentNode;
+            return Ext.scopeResetCSS ? parent.parentNode : parent;
+        },
+
+        
+        createProxy : function(config, renderTo, matchBox) {
+            config = (typeof config == 'object') ? config : {tag : "div", cls: config};
+
+            var me = this,
+                proxy = renderTo ? Ext.DomHelper.append(renderTo, config, true) :
+                                   Ext.DomHelper.insertBefore(me.dom, config, true);
+
+            proxy.setVisibilityMode(Ext.Element.DISPLAY);
+            proxy.hide();
+            if (matchBox && me.setBox && me.getBox) { 
+               proxy.setBox(me.getBox());
+            }
+            return proxy;
+        },
+    
+        
+        focusable: function(){
+            var dom = this.dom,
+                nodeName = dom.nodeName.toLowerCase(),
+                canFocus = false,
+                hasTabIndex = !isNaN(dom.tabIndex);
+            
+            if (!dom.disabled) {
+                if (focusRe.test(nodeName)) {
+                    canFocus = true;
+                } else {
+                    canFocus = nodeName == 'a' ? dom.href || hasTabIndex : hasTabIndex;
+                }
+            }
+            return canFocus && this.isVisible(true);
+        }    
+    };
+})());
+Ext.Element.prototype.clearListeners = Ext.Element.prototype.removeAllListeners;
+
+
+Ext.Element.addMethods({
+    
+    getAnchorXY : function(anchor, local, s){
+        
+        
+        anchor = (anchor || "tl").toLowerCase();
+        s = s || {};
+
+        var me = this,
+            vp = me.dom == document.body || me.dom == document,
+            w = s.width || vp ? Ext.Element.getViewWidth() : me.getWidth(),
+            h = s.height || vp ? Ext.Element.getViewHeight() : me.getHeight(),
+            xy,
+            r = Math.round,
+            o = me.getXY(),
+            scroll = me.getScroll(),
+            extraX = vp ? scroll.left : !local ? o[0] : 0,
+            extraY = vp ? scroll.top : !local ? o[1] : 0,
+            hash = {
+                c  : [r(w * 0.5), r(h * 0.5)],
+                t  : [r(w * 0.5), 0],
+                l  : [0, r(h * 0.5)],
+                r  : [w, r(h * 0.5)],
+                b  : [r(w * 0.5), h],
+                tl : [0, 0],
+                bl : [0, h],
+                br : [w, h],
+                tr : [w, 0]
+            };
+
+        xy = hash[anchor];
+        return [xy[0] + extraX, xy[1] + extraY];
+    },
+
+    
+    anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){
+        var me = this,
+            dom = me.dom,
+            scroll = !Ext.isEmpty(monitorScroll),
+            action = function(){
+                Ext.fly(dom).alignTo(el, alignment, offsets, animate);
+                Ext.callback(callback, Ext.fly(dom));
+            },
+            anchor = this.getAnchor();
+
+        
+        this.removeAnchor();
+        Ext.apply(anchor, {
+            fn: action,
+            scroll: scroll
+        });
+
+        Ext.EventManager.onWindowResize(action, null);
+
+        if(scroll){
+            Ext.EventManager.on(window, 'scroll', action, null,
+                {buffer: !isNaN(monitorScroll) ? monitorScroll : 50});
+        }
+        action.call(me); 
+        return me;
+    },
+
+    
+    removeAnchor : function(){
+        var me = this,
+            anchor = this.getAnchor();
+
+        if(anchor && anchor.fn){
+            Ext.EventManager.removeResizeListener(anchor.fn);
+            if(anchor.scroll){
+                Ext.EventManager.un(window, 'scroll', anchor.fn);
+            }
+            delete anchor.fn;
+        }
+        return me;
+    },
+
+    
+    getAnchor : function(){
+        var data = Ext.Element.data,
+            dom = this.dom;
+            if (!dom) {
+                return;
+            }
+            var anchor = data(dom, '_anchor');
+
+        if(!anchor){
+            anchor = data(dom, '_anchor', {});
+        }
+        return anchor;
+    },
+
+    getAlignVector: function(el, spec, offset) {
+        var me = this,
+            side = {t:"top", l:"left", r:"right", b: "bottom"},
+            thisRegion = me.getRegion(),
+            elRegion;
+
+        el = Ext.get(el);
+        if(!el || !el.dom){
+        }
+
+        elRegion = el.getRegion();
+    },
+
+    
+    getAlignToXY : function(el, p, o){
+        el = Ext.get(el);
+
+        if(!el || !el.dom){
+        }
+
+        o = o || [0,0];
+        p = (!p || p == "?" ? "tl-bl?" : (!(/-/).test(p) && p !== "" ? "tl-" + p : p || "tl-bl")).toLowerCase();
+
+        var me = this,
+            d = me.dom,
+            a1,
+            a2,
+            x,
+            y,
+            
+            w,
+            h,
+            r,
+            dw = Ext.Element.getViewWidth() -10, 
+            dh = Ext.Element.getViewHeight()-10, 
+            p1y,
+            p1x,
+            p2y,
+            p2x,
+            swapY,
+            swapX,
+            doc = document,
+            docElement = doc.documentElement,
+            docBody = doc.body,
+            scrollX = (docElement.scrollLeft || docBody.scrollLeft || 0)+5,
+            scrollY = (docElement.scrollTop || docBody.scrollTop || 0)+5,
+            c = false, 
+            p1 = "",
+            p2 = "",
+            m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);
+
+        if(!m){
+        }
+
+        p1 = m[1];
+        p2 = m[2];
+        c = !!m[3];
+
+        
+        
+        a1 = me.getAnchorXY(p1, true);
+        a2 = el.getAnchorXY(p2, false);
+
+        x = a2[0] - a1[0] + o[0];
+        y = a2[1] - a1[1] + o[1];
+
+        if(c){
+           w = me.getWidth();
+           h = me.getHeight();
+           r = el.getRegion();
+           
+           
+           
+           p1y = p1.charAt(0);
+           p1x = p1.charAt(p1.length-1);
+           p2y = p2.charAt(0);
+           p2x = p2.charAt(p2.length-1);
+           swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));
+           swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));
+
+
+           if (x + w > dw + scrollX) {
+                x = swapX ? r.left-w : dw+scrollX-w;
+           }
+           if (x < scrollX) {
+               x = swapX ? r.right : scrollX;
+           }
+           if (y + h > dh + scrollY) {
+                y = swapY ? r.top-h : dh+scrollY-h;
+            }
+           if (y < scrollY){
+               y = swapY ? r.bottom : scrollY;
+           }
+        }
+        return [x,y];
+    },
+
+    
+    alignTo : function(element, position, offsets, animate){
+        var me = this;
+        return me.setXY(me.getAlignToXY(element, position, offsets),
+                        me.anim && !!animate ? me.anim(animate) : false);
+    },
+
+    
+    adjustForConstraints : function(xy, parent) {
+        var vector = this.getConstrainVector(parent, xy);
+        if (vector) {
+            xy[0] += vector[0];
+            xy[1] += vector[1];
+        }
+        return xy;
+    },
+
+    
+    getConstrainVector: function(constrainTo, proposedPosition) {
+        if (!(constrainTo instanceof Ext.util.Region)) {
+            constrainTo = Ext.get(constrainTo).getViewRegion();
+        }
+        var thisRegion = this.getRegion(),
+            vector = [0, 0],
+            shadowSize = this.shadow && this.shadow.offset,
+            overflowed = false;
+
+        
+        if (proposedPosition) {
+            thisRegion.translateBy(proposedPosition[0] - thisRegion.x, proposedPosition[1] - thisRegion.y);
+        }
+
+        
+        
+        if (shadowSize) {
+            constrainTo.adjust(0, -shadowSize, -shadowSize, shadowSize);
+        }
+
+        
+        if (thisRegion.right > constrainTo.right) {
+            overflowed = true;
+            vector[0] = (constrainTo.right - thisRegion.right);    
+        }
+        if (thisRegion.left + vector[0] < constrainTo.left) {
+            overflowed = true;
+            vector[0] = (constrainTo.left - thisRegion.left);      
+        }
+
+        
+        if (thisRegion.bottom > constrainTo.bottom) {
+            overflowed = true;
+            vector[1] = (constrainTo.bottom - thisRegion.bottom);  
+        }
+        if (thisRegion.top + vector[1] < constrainTo.top) {
+            overflowed = true;
+            vector[1] = (constrainTo.top - thisRegion.top);        
+        }
+        return overflowed ? vector : false;
+    },
+
+    
+    getCenterXY : function(){
+        return this.getAlignToXY(document, 'c-c');
+    },
+
+    
+    center : function(centerIn){
+        return this.alignTo(centerIn || document, 'c-c');
+    }
+});
+
+
+(function(){
+
+var ELEMENT = Ext.Element,
+    LEFT = "left",
+    RIGHT = "right",
+    TOP = "top",
+    BOTTOM = "bottom",
+    POSITION = "position",
+    STATIC = "static",
+    RELATIVE = "relative",
+    AUTO = "auto",
+    ZINDEX = "z-index";
+
+Ext.override(Ext.Element, {
+    
+    getX : function(){
+        return ELEMENT.getX(this.dom);
+    },
+
+    
+    getY : function(){
+        return ELEMENT.getY(this.dom);
+    },
+
+    
+    getXY : function(){
+        return ELEMENT.getXY(this.dom);
+    },
+
+    
+    getOffsetsTo : function(el){
+        var o = this.getXY(),
+            e = Ext.fly(el, '_internal').getXY();
+        return [o[0]-e[0],o[1]-e[1]];
+    },
+
+    
+    setX : function(x, animate){
+        return this.setXY([x, this.getY()], animate);
+    },
+
+    
+    setY : function(y, animate){
+        return this.setXY([this.getX(), y], animate);
+    },
+
+    
+    setLeft : function(left){
+        this.setStyle(LEFT, this.addUnits(left));
+        return this;
+    },
+
+    
+    setTop : function(top){
+        this.setStyle(TOP, this.addUnits(top));
+        return this;
+    },
+
+    
+    setRight : function(right){
+        this.setStyle(RIGHT, this.addUnits(right));
+        return this;
+    },
+
+    
+    setBottom : function(bottom){
+        this.setStyle(BOTTOM, this.addUnits(bottom));
+        return this;
+    },
+
+    
+    setXY: function(pos, animate) {
+        var me = this;
+        if (!animate || !me.anim) {
+            ELEMENT.setXY(me.dom, pos);
+        }
+        else {
+            if (!Ext.isObject(animate)) {
+                animate = {};
+            }
+            me.animate(Ext.applyIf({ to: { x: pos[0], y: pos[1] } }, animate));
+        }
+        return me;
+    },
+
+    
+    setLocation : function(x, y, animate){
+        return this.setXY([x, y], animate);
+    },
+
+    
+    moveTo : function(x, y, animate){
+        return this.setXY([x, y], animate);
+    },
+
+    
+    getLeft : function(local){
+        return !local ? this.getX() : parseInt(this.getStyle(LEFT), 10) || 0;
+    },
+
+    
+    getRight : function(local){
+        var me = this;
+        return !local ? me.getX() + me.getWidth() : (me.getLeft(true) + me.getWidth()) || 0;
+    },
+
+    
+    getTop : function(local) {
+        return !local ? this.getY() : parseInt(this.getStyle(TOP), 10) || 0;
+    },
+
+    
+    getBottom : function(local){
+        var me = this;
+        return !local ? me.getY() + me.getHeight() : (me.getTop(true) + me.getHeight()) || 0;
+    },
+
+    
+    position : function(pos, zIndex, x, y) {
+        var me = this;
+
+        if (!pos && me.isStyle(POSITION, STATIC)){
+            me.setStyle(POSITION, RELATIVE);
+        } else if(pos) {
+            me.setStyle(POSITION, pos);
+        }
+        if (zIndex){
+            me.setStyle(ZINDEX, zIndex);
+        }
+        if (x || y) {
+            me.setXY([x || false, y || false]);
+        }
+    },
+
+    
+    clearPositioning : function(value){
+        value = value || '';
+        this.setStyle({
+            left : value,
+            right : value,
+            top : value,
+            bottom : value,
+            "z-index" : "",
+            position : STATIC
+        });
+        return this;
+    },
+
+    
+    getPositioning : function(){
+        var l = this.getStyle(LEFT);
+        var t = this.getStyle(TOP);
+        return {
+            "position" : this.getStyle(POSITION),
+            "left" : l,
+            "right" : l ? "" : this.getStyle(RIGHT),
+            "top" : t,
+            "bottom" : t ? "" : this.getStyle(BOTTOM),
+            "z-index" : this.getStyle(ZINDEX)
+        };
+    },
+
+    
+    setPositioning : function(pc){
+        var me = this,
+            style = me.dom.style;
+
+        me.setStyle(pc);
+
+        if(pc.right == AUTO){
+            style.right = "";
+        }
+        if(pc.bottom == AUTO){
+            style.bottom = "";
+        }
+
+        return me;
+    },
+
+    
+    translatePoints: function(x, y) {
+        if (Ext.isArray(x)) {
+             y = x[1];
+             x = x[0];
+        }
+        var me = this,
+            relative = me.isStyle(POSITION, RELATIVE),
+            o = me.getXY(),
+            left = parseInt(me.getStyle(LEFT), 10),
+            top = parseInt(me.getStyle(TOP), 10);
+
+        if (!Ext.isNumber(left)) {
+            left = relative ? 0 : me.dom.offsetLeft;
+        }
+        if (!Ext.isNumber(top)) {
+            top = relative ? 0 : me.dom.offsetTop;
+        }
+        left = (Ext.isNumber(x)) ? x - o[0] + left : undefined;
+        top = (Ext.isNumber(y)) ? y - o[1] + top : undefined;
+        return {
+            left: left,
+            top: top
+        };
+    },
+
+    
+    setBox: function(box, adjust, animate) {
+        var me = this,
+            w = box.width,
+            h = box.height;
+        if ((adjust && !me.autoBoxAdjust) && !me.isBorderBox()) {
+            w -= (me.getBorderWidth("lr") + me.getPadding("lr"));
+            h -= (me.getBorderWidth("tb") + me.getPadding("tb"));
+        }
+        me.setBounds(box.x, box.y, w, h, animate);
+        return me;
+    },
+
+    
+    getBox: function(contentBox, local) {
+        var me = this,
+            xy,
+            left,
+            top,
+            getBorderWidth = me.getBorderWidth,
+            getPadding = me.getPadding,
+            l, r, t, b, w, h, bx;
+        if (!local) {
+            xy = me.getXY();
+        } else {
+            left = parseInt(me.getStyle("left"), 10) || 0;
+            top = parseInt(me.getStyle("top"), 10) || 0;
+            xy = [left, top];
+        }
+        w = me.getWidth();
+        h = me.getHeight();
+        if (!contentBox) {
+            bx = {
+                x: xy[0],
+                y: xy[1],
+                0: xy[0],
+                1: xy[1],
+                width: w,
+                height: h
+            };
+        } else {
+            l = getBorderWidth.call(me, "l") + getPadding.call(me, "l");
+            r = getBorderWidth.call(me, "r") + getPadding.call(me, "r");
+            t = getBorderWidth.call(me, "t") + getPadding.call(me, "t");
+            b = getBorderWidth.call(me, "b") + getPadding.call(me, "b");
+            bx = {
+                x: xy[0] + l,
+                y: xy[1] + t,
+                0: xy[0] + l,
+                1: xy[1] + t,
+                width: w - (l + r),
+                height: h - (t + b)
+            };
+        }
+        bx.right = bx.x + bx.width;
+        bx.bottom = bx.y + bx.height;
+        return bx;
+    },
+
+    
+    move: function(direction, distance, animate) {
+        var me = this,
+            xy = me.getXY(),
+            x = xy[0],
+            y = xy[1],
+            left = [x - distance, y],
+            right = [x + distance, y],
+            top = [x, y - distance],
+            bottom = [x, y + distance],
+            hash = {
+                l: left,
+                left: left,
+                r: right,
+                right: right,
+                t: top,
+                top: top,
+                up: top,
+                b: bottom,
+                bottom: bottom,
+                down: bottom
+            };
+
+        direction = direction.toLowerCase();
+        me.moveTo(hash[direction][0], hash[direction][1], animate);
+    },
+
+    
+    setLeftTop: function(left, top) {
+        var me = this,
+            style = me.dom.style;
+        style.left = me.addUnits(left);
+        style.top = me.addUnits(top);
+        return me;
+    },
+
+    
+    getRegion: function() {
+        return this.getPageBox(true);
+    },
+
+    
+    getViewRegion: function() {
+        var me = this,
+            isBody = me.dom === document.body,
+            scroll, pos, top, left, width, height;
+
+        
+        if (isBody) {
+            scroll = me.getScroll();
+            left = scroll.left;
+            top = scroll.top;
+            width = Ext.Element.getViewportWidth();
+            height = Ext.Element.getViewportHeight();
+        }
+        else {
+            pos = me.getXY();
+            left = pos[0] + me.getBorderWidth('l') + me.getPadding('l');
+            top = pos[1] + me.getBorderWidth('t') + me.getPadding('t');
+            width = me.getWidth(true);
+            height = me.getHeight(true);
+        }
+
+        return Ext.create('Ext.util.Region', top, left + width, top + height, left);
+    },
+
+    
+    getPageBox : function(getRegion) {
+        var me = this,
+            el = me.dom,
+            isDoc = el === document.body,
+            w = isDoc ? Ext.Element.getViewWidth()  : el.offsetWidth,
+            h = isDoc ? Ext.Element.getViewHeight() : el.offsetHeight,
+            xy = me.getXY(),
+            t = xy[1],
+            r = xy[0] + w,
+            b = xy[1] + h,
+            l = xy[0];
+
+        if (getRegion) {
+            return Ext.create('Ext.util.Region', t, r, b, l);
+        }
+        else {
+            return {
+                left: l,
+                top: t,
+                width: w,
+                height: h,
+                right: r,
+                bottom: b
+            };
+        }
+    },
+
+    
+    setBounds: function(x, y, width, height, animate) {
+        var me = this;
+        if (!animate || !me.anim) {
+            me.setSize(width, height);
+            me.setLocation(x, y);
+        } else {
+            if (!Ext.isObject(animate)) {
+                animate = {};
+            }
+            me.animate(Ext.applyIf({
+                to: {
+                    x: x,
+                    y: y,
+                    width: me.adjustWidth(width),
+                    height: me.adjustHeight(height)
+                }
+            }, animate));
+        }
+        return me;
+    },
+
+    
+    setRegion: function(region, animate) {
+        return this.setBounds(region.left, region.top, region.right - region.left, region.bottom - region.top, animate);
+    }
+});
+})();
+
+
+Ext.override(Ext.Element, {
+    
+    isScrollable : function(){
+        var dom = this.dom;
+        return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;
+    },
+
+    
+    getScroll : function() {
+        var d = this.dom, 
+            doc = document,
+            body = doc.body,
+            docElement = doc.documentElement,
+            l,
+            t,
+            ret;
+
+        if (d == doc || d == body) {
+            if (Ext.isIE && Ext.isStrict) {
+                l = docElement.scrollLeft; 
+                t = docElement.scrollTop;
+            } else {
+                l = window.pageXOffset;
+                t = window.pageYOffset;
+            }
+            ret = {
+                left: l || (body ? body.scrollLeft : 0), 
+                top : t || (body ? body.scrollTop : 0)
+            };
+        } else {
+            ret = {
+                left: d.scrollLeft, 
+                top : d.scrollTop
+            };
+        }
+        
+        return ret;
+    },
+    
+    
+    scrollTo : function(side, value, animate) {
+        
+        var top = /top/i.test(side),
+            me = this,
+            dom = me.dom,
+            obj = {},
+            prop;
+        if (!animate || !me.anim) {
+            
+            prop = 'scroll' + (top ? 'Top' : 'Left');
+            dom[prop] = value;
+        }
+        else {
+            if (!Ext.isObject(animate)) {
+                animate = {};
+            }
+            obj['scroll' + (top ? 'Top' : 'Left')] = value;
+            me.animate(Ext.applyIf({
+                to: obj
+            }, animate));
+        }
+        return me;
+    },
+
+    
+    scrollIntoView : function(container, hscroll) {
+        container = Ext.getDom(container) || Ext.getBody().dom;
+        var el = this.dom,
+            offsets = this.getOffsetsTo(container),
+            
+            left = offsets[0] + container.scrollLeft,
+            top = offsets[1] + container.scrollTop,
+            bottom = top + el.offsetHeight,
+            right = left + el.offsetWidth,
+            
+            ctClientHeight = container.clientHeight,
+            ctScrollTop = parseInt(container.scrollTop, 10),
+            ctScrollLeft = parseInt(container.scrollLeft, 10),
+            ctBottom = ctScrollTop + ctClientHeight,
+            ctRight = ctScrollLeft + container.clientWidth;
+
+        if (el.offsetHeight > ctClientHeight || top < ctScrollTop) {
+            container.scrollTop = top;
+        } else if (bottom > ctBottom) {
+            container.scrollTop = bottom - ctClientHeight;
+        }
+        
+        container.scrollTop = container.scrollTop;
+
+        if (hscroll !== false) {
+            if (el.offsetWidth > container.clientWidth || left < ctScrollLeft) {
+                container.scrollLeft = left;
+            }
+            else if (right > ctRight) {
+                container.scrollLeft = right - container.clientWidth;
+            }
+            container.scrollLeft = container.scrollLeft;
+        }
+        return this;
+    },
+
+    
+    scrollChildIntoView : function(child, hscroll) {
+        Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);
+    },
+
+    
+     scroll : function(direction, distance, animate) {
+        if (!this.isScrollable()) {
+            return false;
+        }
+        var el = this.dom,
+            l = el.scrollLeft, t = el.scrollTop,
+            w = el.scrollWidth, h = el.scrollHeight,
+            cw = el.clientWidth, ch = el.clientHeight,
+            scrolled = false, v,
+            hash = {
+                l: Math.min(l + distance, w-cw),
+                r: v = Math.max(l - distance, 0),
+                t: Math.max(t - distance, 0),
+                b: Math.min(t + distance, h-ch)
+            };
+            hash.d = hash.b;
+            hash.u = hash.t;
+
+        direction = direction.substr(0, 1);
+        if ((v = hash[direction]) > -1) {
+            scrolled = true;
+            this.scrollTo(direction == 'l' || direction == 'r' ? 'left' : 'top', v, this.anim(animate));
+        }
+        return scrolled;
+    }
+});
+
+Ext.Element.addMethods(
+    function() {
+        var VISIBILITY      = "visibility",
+            DISPLAY         = "display",
+            HIDDEN          = "hidden",
+            NONE            = "none",
+            XMASKED         = Ext.baseCSSPrefix + "masked",
+            XMASKEDRELATIVE = Ext.baseCSSPrefix + "masked-relative",
+            data            = Ext.Element.data;
+
+        return {
+            
+            isVisible : function(deep) {
+                var vis = !this.isStyle(VISIBILITY, HIDDEN) && !this.isStyle(DISPLAY, NONE),
+                    p   = this.dom.parentNode;
+
+                if (deep !== true || !vis) {
+                    return vis;
+                }
+
+                while (p && !(/^body/i.test(p.tagName))) {
+                    if (!Ext.fly(p, '_isVisible').isVisible()) {
+                        return false;
+                    }
+                    p = p.parentNode;
+                }
+                return true;
+            },
+
+            
+            isDisplayed : function() {
+                return !this.isStyle(DISPLAY, NONE);
+            },
+
+            
+            enableDisplayMode : function(display) {
+                this.setVisibilityMode(Ext.Element.DISPLAY);
+
+                if (!Ext.isEmpty(display)) {
+                    data(this.dom, 'originalDisplay', display);
+                }
+
+                return this;
+            },
+
+            
+            mask : function(msg, msgCls) {
+                var me  = this,
+                    dom = me.dom,
+                    setExpression = dom.style.setExpression,
+                    dh  = Ext.DomHelper,
+                    EXTELMASKMSG = Ext.baseCSSPrefix + "mask-msg",
+                    el,
+                    mask;
+
+                if (!(/^body/i.test(dom.tagName) && me.getStyle('position') == 'static')) {
+                    me.addCls(XMASKEDRELATIVE);
+                }
+                el = data(dom, 'maskMsg');
+                if (el) {
+                    el.remove();
+                }
+                el = data(dom, 'mask');
+                if (el) {
+                    el.remove();
+                }
+
+                mask = dh.append(dom, {cls : Ext.baseCSSPrefix + "mask"}, true);
+                data(dom, 'mask', mask);
+
+                me.addCls(XMASKED);
+                mask.setDisplayed(true);
+
+                if (typeof msg == 'string') {
+                    var mm = dh.append(dom, {cls : EXTELMASKMSG, cn:{tag:'div'}}, true);
+                    data(dom, 'maskMsg', mm);
+                    mm.dom.className = msgCls ? EXTELMASKMSG + " " + msgCls : EXTELMASKMSG;
+                    mm.dom.firstChild.innerHTML = msg;
+                    mm.setDisplayed(true);
+                    mm.center(me);
+                }
+                
+                
+                
+                
+                
+                if (!Ext.supports.IncludePaddingInWidthCalculation && setExpression) {
+                    mask.dom.style.setExpression('width', 'this.parentNode.offsetWidth + "px"');
+                }
+
+                
+                
+                if (!Ext.supports.IncludePaddingInHeightCalculation && setExpression) {
+                    mask.dom.style.setExpression('height', 'this.parentNode.offsetHeight + "px"');
+                }
+                
+                else if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && me.getStyle('height') == 'auto') {
+                    mask.setSize(undefined, me.getHeight());
+                }
+                return mask;
+            },
+
+            
+            unmask : function() {
+                var me      = this,
+                    dom     = me.dom,
+                    mask    = data(dom, 'mask'),
+                    maskMsg = data(dom, 'maskMsg');
+
+                if (mask) {
+                    
+                    if (mask.dom.style.clearExpression) {
+                        mask.dom.style.clearExpression('width');
+                        mask.dom.style.clearExpression('height');
+                    }
+                    if (maskMsg) {
+                        maskMsg.remove();
+                        data(dom, 'maskMsg', undefined);
+                    }
+
+                    mask.remove();
+                    data(dom, 'mask', undefined);
+                    me.removeCls([XMASKED, XMASKEDRELATIVE]);
+                }
+            },
+            
+            isMasked : function() {
+                var me = this,
+                    mask = data(me.dom, 'mask'),
+                    maskMsg = data(me.dom, 'maskMsg');
+
+                if (mask && mask.isVisible()) {
+                    if (maskMsg) {
+                        maskMsg.center(me);
+                    }
+                    return true;
+                }
+                return false;
+            },
+
+            
+            createShim : function() {
+                var el = document.createElement('iframe'),
+                    shim;
+
+                el.frameBorder = '0';
+                el.className = Ext.baseCSSPrefix + 'shim';
+                el.src = Ext.SSL_SECURE_URL;
+                shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
+                shim.autoBoxAdjust = false;
+                return shim;
+            }
+        };
+    }()
+);
+
+Ext.Element.addMethods({
+    
+    addKeyListener : function(key, fn, scope){
+        var config;
+        if(typeof key != 'object' || Ext.isArray(key)){
+            config = {
+                key: key,
+                fn: fn,
+                scope: scope
+            };
+        }else{
+            config = {
+                key : key.key,
+                shift : key.shift,
+                ctrl : key.ctrl,
+                alt : key.alt,
+                fn: fn,
+                scope: scope
+            };
+        }
+        return Ext.create('Ext.util.KeyMap', this, config);
+    },
+
+    
+    addKeyMap : function(config){
+        return Ext.create('Ext.util.KeyMap', this, config);
+    }
+});
+
+
+
+Ext.CompositeElementLite.importElementMethods();
+
+
+Ext.apply(Ext.CompositeElementLite.prototype, {
+    addElements : function(els, root){
+        if(!els){
+            return this;
+        }
+        if(typeof els == "string"){
+            els = Ext.Element.selectorFunction(els, root);
+        }
+        var yels = this.elements;
+        Ext.each(els, function(e) {
+            yels.push(Ext.get(e));
+        });
+        return this;
+    },
+
+    
+    first : function(){
+        return this.item(0);
+    },
+
+    
+    last : function(){
+        return this.item(this.getCount()-1);
+    },
+
+    
+    contains : function(el){
+        return this.indexOf(el) != -1;
+    },
+
+    
+    removeElement : function(keys, removeDom){
+        var me = this,
+            els = this.elements,
+            el;
+        Ext.each(keys, function(val){
+            if ((el = (els[val] || els[val = me.indexOf(val)]))) {
+                if(removeDom){
+                    if(el.dom){
+                        el.remove();
+                    }else{
+                        Ext.removeNode(el);
+                    }
+                }
+                Ext.Array.erase(els, val, 1);
+            }
+        });
+        return this;
+    }
+});
+
+
+Ext.CompositeElement = Ext.extend(Ext.CompositeElementLite, {
+
+    constructor : function(els, root){
+        this.elements = [];
+        this.add(els, root);
+    },
+
+    
+    getElement : function(el){
+        
+        return el;
+    },
+
+    
+    transformElement : function(el){
+        return Ext.get(el);
+    }
+});
+
+
+Ext.Element.select = function(selector, unique, root){
+    var els;
+    if(typeof selector == "string"){
+        els = Ext.Element.selectorFunction(selector, root);
+    }else if(selector.length !== undefined){
+        els = selector;
+    }else{
+    }
+    return (unique === true) ? new Ext.CompositeElement(els) : new Ext.CompositeElementLite(els);
+};
+
+
+Ext.select = Ext.Element.select;
+
+
+
+
+Ext.define('Ext.util.Observable', {
+
+    
+
+    requires: ['Ext.util.Event'],
+
+    statics: {
+        
+        releaseCapture: function(o) {
+            o.fireEvent = this.prototype.fireEvent;
+        },
+
+        
+        capture: function(o, fn, scope) {
+            o.fireEvent = Ext.Function.createInterceptor(o.fireEvent, fn, scope);
+        },
+
+        
+        observe: function(cls, listeners) {
+            if (cls) {
+                if (!cls.isObservable) {
+                    Ext.applyIf(cls, new this());
+                    this.capture(cls.prototype, cls.fireEvent, cls);
+                }
+                if (Ext.isObject(listeners)) {
+                    cls.on(listeners);
+                }
+                return cls;
+            }
+        }
+    },
+
+    
+
+    
+    
+    isObservable: true,
+
+    constructor: function(config) {
+        var me = this;
+
+        Ext.apply(me, config);
+        if (me.listeners) {
+            me.on(me.listeners);
+            delete me.listeners;
+        }
+        me.events = me.events || {};
+
+        if (me.bubbleEvents) {
+            me.enableBubble(me.bubbleEvents);
+        }
+    },
+
+    
+    eventOptionsRe : /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate|element|vertical|horizontal|freezeEvent)$/,
+
+    
+    addManagedListener : function(item, ename, fn, scope, options) {
+        var me = this,
+            managedListeners = me.managedListeners = me.managedListeners || [],
+            config;
+
+        if (typeof ename !== 'string') {
+            options = ename;
+            for (ename in options) {
+                if (options.hasOwnProperty(ename)) {
+                    config = options[ename];
+                    if (!me.eventOptionsRe.test(ename)) {
+                        me.addManagedListener(item, ename, config.fn || config, config.scope || options.scope, config.fn ? config : options);
+                    }
+                }
+            }
+        }
+        else {
+            managedListeners.push({
+                item: item,
+                ename: ename,
+                fn: fn,
+                scope: scope,
+                options: options
+            });
+
+            item.on(ename, fn, scope, options);
+        }
+    },
+
+    
+    removeManagedListener : function(item, ename, fn, scope) {
+        var me = this,
+            options,
+            config,
+            managedListeners,
+            length,
+            i;
+
+        if (typeof ename !== 'string') {
+            options = ename;
+            for (ename in options) {
+                if (options.hasOwnProperty(ename)) {
+                    config = options[ename];
+                    if (!me.eventOptionsRe.test(ename)) {
+                        me.removeManagedListener(item, ename, config.fn || config, config.scope || options.scope);
+                    }
+                }
+            }
+        }
+
+        managedListeners = me.managedListeners ? me.managedListeners.slice() : [];
+
+        for (i = 0, length = managedListeners.length; i < length; i++) {
+            me.removeManagedListenerItem(false, managedListeners[i], item, ename, fn, scope);
+        }
+    },
+
+    
+    fireEvent: function(eventName) {
+        var name = eventName.toLowerCase(),
+            events = this.events,
+            event = events && events[name],
+            bubbles = event && event.bubble;
+
+        return this.continueFireEvent(name, Ext.Array.slice(arguments, 1), bubbles);
+    },
+
+    
+    continueFireEvent: function(eventName, args, bubbles) {
+        var target = this,
+            queue, event,
+            ret = true;
+
+        do {
+            if (target.eventsSuspended === true) {
+                if ((queue = target.eventQueue)) {
+                    queue.push([eventName, args, bubbles]);
+                }
+                return ret;
+            } else {
+                event = target.events[eventName];
+                
+                
+                if (event && event != true) {
+                    if ((ret = event.fire.apply(event, args)) === false) {
+                        break;
+                    }
+                }
+            }
+        } while (bubbles && (target = target.getBubbleParent()));
+        return ret;
+    },
+
+    
+    getBubbleParent: function(){
+        var me = this, parent = me.getBubbleTarget && me.getBubbleTarget();
+        if (parent && parent.isObservable) {
+            return parent;
+        }
+        return null;
+    },
+
+    
+    addListener: function(ename, fn, scope, options) {
+        var me = this,
+            config,
+            event;
+
+        if (typeof ename !== 'string') {
+            options = ename;
+            for (ename in options) {
+                if (options.hasOwnProperty(ename)) {
+                    config = options[ename];
+                    if (!me.eventOptionsRe.test(ename)) {
+                        me.addListener(ename, config.fn || config, config.scope || options.scope, config.fn ? config : options);
+                    }
+                }
+            }
+        }
+        else {
+            ename = ename.toLowerCase();
+            me.events[ename] = me.events[ename] || true;
+            event = me.events[ename] || true;
+            if (Ext.isBoolean(event)) {
+                me.events[ename] = event = new Ext.util.Event(me, ename);
+            }
+            event.addListener(fn, scope, Ext.isObject(options) ? options : {});
+        }
+    },
+
+    
+    removeListener: function(ename, fn, scope) {
+        var me = this,
+            config,
+            event,
+            options;
+
+        if (typeof ename !== 'string') {
+            options = ename;
+            for (ename in options) {
+                if (options.hasOwnProperty(ename)) {
+                    config = options[ename];
+                    if (!me.eventOptionsRe.test(ename)) {
+                        me.removeListener(ename, config.fn || config, config.scope || options.scope);
+                    }
+                }
+            }
+        } else {
+            ename = ename.toLowerCase();
+            event = me.events[ename];
+            if (event && event.isEvent) {
+                event.removeListener(fn, scope);
+            }
+        }
+    },
+
+    
+    clearListeners: function() {
+        var events = this.events,
+            event,
+            key;
+
+        for (key in events) {
+            if (events.hasOwnProperty(key)) {
+                event = events[key];
+                if (event.isEvent) {
+                    event.clearListeners();
+                }
+            }
+        }
+
+        this.clearManagedListeners();
+    },
+
+
+    
+    clearManagedListeners : function() {
+        var managedListeners = this.managedListeners || [],
+            i = 0,
+            len = managedListeners.length;
+
+        for (; i < len; i++) {
+            this.removeManagedListenerItem(true, managedListeners[i]);
+        }
+
+        this.managedListeners = [];
+    },
+
+    
+    removeManagedListenerItem: function(isClear, managedListener, item, ename, fn, scope){
+        if (isClear || (managedListener.item === item && managedListener.ename === ename && (!fn || managedListener.fn === fn) && (!scope || managedListener.scope === scope))) {
+            managedListener.item.un(managedListener.ename, managedListener.fn, managedListener.scope);
+            if (!isClear) {
+                Ext.Array.remove(this.managedListeners, managedListener);
+            }
+        }
+    },
+
+
+    
+    addEvents: function(o) {
+        var me = this,
+            args,
+            len,
+            i;
+
+            me.events = me.events || {};
+        if (Ext.isString(o)) {
+            args = arguments;
+            i = args.length;
+
+            while (i--) {
+                me.events[args[i]] = me.events[args[i]] || true;
+            }
+        } else {
+            Ext.applyIf(me.events, o);
+        }
+    },
+
+    
+    hasListener: function(ename) {
+        var event = this.events[ename.toLowerCase()];
+        return event && event.isEvent === true && event.listeners.length > 0;
+    },
+
+    
+    suspendEvents: function(queueSuspended) {
+        this.eventsSuspended = true;
+        if (queueSuspended && !this.eventQueue) {
+            this.eventQueue = [];
+        }
+    },
+
+    
+    resumeEvents: function() {
+        var me = this,
+            queued = me.eventQueue;
+
+        me.eventsSuspended = false;
+        delete me.eventQueue;
+
+        if (queued) {
+            Ext.each(queued, function(e) {
+                me.continueFireEvent.apply(me, e);
+            });
+        }
+    },
+
+    
+    relayEvents : function(origin, events, prefix) {
+        prefix = prefix || '';
+        var me = this,
+            len = events.length,
+            i = 0,
+            oldName,
+            newName;
+
+        for (; i < len; i++) {
+            oldName = events[i].substr(prefix.length);
+            newName = prefix + oldName;
+            me.events[newName] = me.events[newName] || true;
+            origin.on(oldName, me.createRelayer(newName));
+        }
+    },
+
+    
+    createRelayer: function(newName){
+        var me = this;
+        return function(){
+            return me.fireEvent.apply(me, [newName].concat(Array.prototype.slice.call(arguments, 0, -1)));
+        };
+    },
+
+    
+    enableBubble: function(events) {
+        var me = this;
+        if (!Ext.isEmpty(events)) {
+            events = Ext.isArray(events) ? events: Ext.Array.toArray(arguments);
+            Ext.each(events,
+            function(ename) {
+                ename = ename.toLowerCase();
+                var ce = me.events[ename] || true;
+                if (Ext.isBoolean(ce)) {
+                    ce = new Ext.util.Event(me, ename);
+                    me.events[ename] = ce;
+                }
+                ce.bubble = true;
+            });
+        }
+    }
+}, function() {
+
+    this.createAlias({
+        
+        on: 'addListener',
+        
+        un: 'removeListener',
+        
+        mon: 'addManagedListener',
+        
+        mun: 'removeManagedListener'
+    });
+
+    
+    this.observeClass = this.observe;
+
+    Ext.apply(Ext.util.Observable.prototype, function(){
+        
+        
+        
+        function getMethodEvent(method){
+            var e = (this.methodEvents = this.methodEvents || {})[method],
+                returnValue,
+                v,
+                cancel,
+                obj = this;
+
+            if (!e) {
+                this.methodEvents[method] = e = {};
+                e.originalFn = this[method];
+                e.methodName = method;
+                e.before = [];
+                e.after = [];
+
+                var makeCall = function(fn, scope, args){
+                    if((v = fn.apply(scope || obj, args)) !== undefined){
+                        if (typeof v == 'object') {
+                            if(v.returnValue !== undefined){
+                                returnValue = v.returnValue;
+                            }else{
+                                returnValue = v;
+                            }
+                            cancel = !!v.cancel;
+                        }
+                        else
+                            if (v === false) {
+                                cancel = true;
+                            }
+                            else {
+                                returnValue = v;
+                            }
+                    }
+                };
+
+                this[method] = function(){
+                    var args = Array.prototype.slice.call(arguments, 0),
+                        b, i, len;
+                    returnValue = v = undefined;
+                    cancel = false;
+
+                    for(i = 0, len = e.before.length; i < len; i++){
+                        b = e.before[i];
+                        makeCall(b.fn, b.scope, args);
+                        if (cancel) {
+                            return returnValue;
+                        }
+                    }
+
+                    if((v = e.originalFn.apply(obj, args)) !== undefined){
+                        returnValue = v;
+                    }
+
+                    for(i = 0, len = e.after.length; i < len; i++){
+                        b = e.after[i];
+                        makeCall(b.fn, b.scope, args);
+                        if (cancel) {
+                            return returnValue;
+                        }
+                    }
+                    return returnValue;
+                };
+            }
+            return e;
+        }
+
+        return {
+            
+            
+            
+            beforeMethod : function(method, fn, scope){
+                getMethodEvent.call(this, method).before.push({
+                    fn: fn,
+                    scope: scope
+                });
+            },
+
+            
+            afterMethod : function(method, fn, scope){
+                getMethodEvent.call(this, method).after.push({
+                    fn: fn,
+                    scope: scope
+                });
+            },
+
+            removeMethodListener: function(method, fn, scope){
+                var e = this.getMethodEvent(method),
+                    i, len;
+                for(i = 0, len = e.before.length; i < len; i++){
+                    if(e.before[i].fn == fn && e.before[i].scope == scope){
+                        Ext.Array.erase(e.before, i, 1);
+                        return;
+                    }
+                }
+                for(i = 0, len = e.after.length; i < len; i++){
+                    if(e.after[i].fn == fn && e.after[i].scope == scope){
+                        Ext.Array.erase(e.after, i, 1);
+                        return;
+                    }
+                }
+            },
+
+            toggleEventLogging: function(toggle) {
+                Ext.util.Observable[toggle ? 'capture' : 'releaseCapture'](this, function(en) {
+                    if (Ext.isDefined(Ext.global.console)) {
+                        Ext.global.console.log(en, arguments);
+                    }
+                });
+            }
+        };
+    }());
+});
+
+
+Ext.define('Ext.util.Animate', {
+
+    uses: ['Ext.fx.Manager', 'Ext.fx.Anim'],
+
+    
+    animate: function(animObj) {
+        var me = this;
+        if (Ext.fx.Manager.hasFxBlock(me.id)) {
+            return me;
+        }
+        Ext.fx.Manager.queueFx(Ext.create('Ext.fx.Anim', me.anim(animObj)));
+        return this;
+    },
+
+    
+    anim: function(config) {
+        if (!Ext.isObject(config)) {
+            return (config) ? {} : false;
+        }
+
+        var me = this;
+
+        if (config.stopAnimation) {
+            me.stopAnimation();
+        }
+
+        Ext.applyIf(config, Ext.fx.Manager.getFxDefaults(me.id));
+
+        return Ext.apply({
+            target: me,
+            paused: true
+        }, config);
+    },
+
+    
+    stopFx: Ext.Function.alias(Ext.util.Animate, 'stopAnimation'),
+
+    
+    stopAnimation: function() {
+        Ext.fx.Manager.stopAnimation(this.id);
+        return this;
+    },
+
+    
+    syncFx: function() {
+        Ext.fx.Manager.setFxDefaults(this.id, {
+            concurrent: true
+        });
+        return this;
+    },
+
+    
+    sequenceFx: function() {
+        Ext.fx.Manager.setFxDefaults(this.id, {
+            concurrent: false
+        });
+        return this;
+    },
+
+    
+    hasActiveFx: Ext.Function.alias(Ext.util.Animate, 'getActiveAnimation'),
+
+    
+    getActiveAnimation: function() {
+        return Ext.fx.Manager.getActiveAnimation(this.id);
+    }
+}, function(){
+    
+    Ext.applyIf(Ext.Element.prototype, this.prototype);
+    
+    Ext.CompositeElementLite.importElementMethods();
+});
+
+Ext.define('Ext.state.Provider', {
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+    
+    
+    prefix: 'ext-',
+    
+    constructor : function(config){
+        config = config || {};
+        var me = this;
+        Ext.apply(me, config);
+        
+        me.addEvents("statechange");
+        me.state = {};
+        me.mixins.observable.constructor.call(me);
+    },
+    
+    
+    get : function(name, defaultValue){
+        return typeof this.state[name] == "undefined" ?
+            defaultValue : this.state[name];
+    },
+
+    
+    clear : function(name){
+        var me = this;
+        delete me.state[name];
+        me.fireEvent("statechange", me, name, null);
+    },
+
+    
+    set : function(name, value){
+        var me = this;
+        me.state[name] = value;
+        me.fireEvent("statechange", me, name, value);
+    },
+
+    
+    decodeValue : function(value){
+
+        
+        
+        
+        
+        
+        
+        
+
+        var me = this,
+            re = /^(a|n|d|b|s|o|e)\:(.*)$/,
+            matches = re.exec(unescape(value)),
+            all,
+            type,
+            value,
+            keyValue;
+            
+        if(!matches || !matches[1]){
+            return; 
+        }
+        
+        type = matches[1];
+        value = matches[2];
+        switch (type) {
+            case 'e':
+                return null;
+            case 'n':
+                return parseFloat(value);
+            case 'd':
+                return new Date(Date.parse(value));
+            case 'b':
+                return (value == '1');
+            case 'a':
+                all = [];
+                if(value != ''){
+                    Ext.each(value.split('^'), function(val){
+                        all.push(me.decodeValue(val));
+                    }, me);
+                }
+                return all;
+           case 'o':
+                all = {};
+                if(value != ''){
+                    Ext.each(value.split('^'), function(val){
+                        keyValue = val.split('=');
+                        all[keyValue[0]] = me.decodeValue(keyValue[1]);
+                    }, me);
+                }
+                return all;
+           default:
+                return value;
+        }
+    },
+
+    
+    encodeValue : function(value){
+        var flat = '',
+            i = 0,
+            enc,
+            len,
+            key;
+            
+        if (value == null) {
+            return 'e:1';    
+        } else if(typeof value == 'number') {
+            enc = 'n:' + value;
+        } else if(typeof value == 'boolean') {
+            enc = 'b:' + (value ? '1' : '0');
+        } else if(Ext.isDate(value)) {
+            enc = 'd:' + value.toGMTString();
+        } else if(Ext.isArray(value)) {
+            for (len = value.length; i < len; i++) {
+                flat += this.encodeValue(value[i]);
+                if (i != len - 1) {
+                    flat += '^';
+                }
+            }
+            enc = 'a:' + flat;
+        } else if (typeof value == 'object') {
+            for (key in value) {
+                if (typeof value[key] != 'function' && value[key] !== undefined) {
+                    flat += key + '=' + this.encodeValue(value[key]) + '^';
+                }
+            }
+            enc = 'o:' + flat.substring(0, flat.length-1);
+        } else {
+            enc = 's:' + value;
+        }
+        return escape(enc);
+    }
+});
+
+Ext.define('Ext.ComponentQuery', {
+    singleton: true,
+    uses: ['Ext.ComponentManager']
+}, function() {
+
+    var cq = this,
+
+        
+        
+        filterFnPattern = [
+            'var r = [],',
+                'i = 0,',
+                'it = items,',
+                'l = it.length,',
+                'c;',
+            'for (; i < l; i++) {',
+                'c = it[i];',
+                'if (c.{0}) {',
+                   'r.push(c);',
+                '}',
+            '}',
+            'return r;'
+        ].join(''),
+
+        filterItems = function(items, operation) {
+            
+            
+            
+            return operation.method.apply(this, [ items ].concat(operation.args));
+        },
+
+        getItems = function(items, mode) {
+            var result = [],
+                i = 0,
+                length = items.length,
+                candidate,
+                deep = mode !== '>';
+                
+            for (; i < length; i++) {
+                candidate = items[i];
+                if (candidate.getRefItems) {
+                    result = result.concat(candidate.getRefItems(deep));
+                }
+            }
+            return result;
+        },
+
+        getAncestors = function(items) {
+            var result = [],
+                i = 0,
+                length = items.length,
+                candidate;
+            for (; i < length; i++) {
+                candidate = items[i];
+                while (!!(candidate = (candidate.ownerCt || candidate.floatParent))) {
+                    result.push(candidate);
+                }
+            }
+            return result;
+        },
+
+        
+        filterByXType = function(items, xtype, shallow) {
+            if (xtype === '*') {
+                return items.slice();
+            }
+            else {
+                var result = [],
+                    i = 0,
+                    length = items.length,
+                    candidate;
+                for (; i < length; i++) {
+                    candidate = items[i];
+                    if (candidate.isXType(xtype, shallow)) {
+                        result.push(candidate);
+                    }
+                }
+                return result;
+            }
+        },
+
+        
+        filterByClassName = function(items, className) {
+            var EA = Ext.Array,
+                result = [],
+                i = 0,
+                length = items.length,
+                candidate;
+            for (; i < length; i++) {
+                candidate = items[i];
+                if (candidate.el ? candidate.el.hasCls(className) : EA.contains(candidate.initCls(), className)) {
+                    result.push(candidate);
+                }
+            }
+            return result;
+        },
+
+        
+        filterByAttribute = function(items, property, operator, value) {
+            var result = [],
+                i = 0,
+                length = items.length,
+                candidate;
+            for (; i < length; i++) {
+                candidate = items[i];
+                if (!value ? !!candidate[property] : (String(candidate[property]) === value)) {
+                    result.push(candidate);
+                }
+            }
+            return result;
+        },
+
+        
+        filterById = function(items, id) {
+            var result = [],
+                i = 0,
+                length = items.length,
+                candidate;
+            for (; i < length; i++) {
+                candidate = items[i];
+                if (candidate.getItemId() === id) {
+                    result.push(candidate);
+                }
+            }
+            return result;
+        },
+
+        
+        filterByPseudo = function(items, name, value) {
+            return cq.pseudos[name](items, value);
+        },
+
+        
+        
+        modeRe = /^(\s?([>\^])\s?|\s|$)/,
+
+        
+        tokenRe = /^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,
+
+        matchers = [{
+            
+            re: /^\.([\w\-]+)(?:\((true|false)\))?/,
+            method: filterByXType
+        },{
+            
+            re: /^(?:[\[](?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]])/,
+            method: filterByAttribute
+        }, {
+            
+            re: /^#([\w\-]+)/,
+            method: filterById
+        }, {
+            
+            re: /^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,
+            method: filterByPseudo
+        }, {
+            
+            re: /^(?:\{([^\}]+)\})/,
+            method: filterFnPattern
+        }];
+
+    
+    
+    cq.Query = Ext.extend(Object, {
+        constructor: function(cfg) {
+            cfg = cfg || {};
+            Ext.apply(this, cfg);
+        },
+
+        
+        
+        
+        
+        
+        
+        
+        
+        execute : function(root) {
+            var operations = this.operations,
+                i = 0,
+                length = operations.length,
+                operation,
+                workingItems;
+
+            
+            if (!root) {
+                workingItems = Ext.ComponentManager.all.getArray();
+            }
+            
+            else if (Ext.isArray(root)) {
+                workingItems = root;
+            }
+
+            
+            
+            for (; i < length; i++) {
+                operation = operations[i];
+
+                
+                
+                
+                
+                
+                
+                if (operation.mode === '^') {
+                    workingItems = getAncestors(workingItems || [root]);
+                }
+                else if (operation.mode) {
+                    workingItems = getItems(workingItems || [root], operation.mode);
+                }
+                else {
+                    workingItems = filterItems(workingItems || getItems([root]), operation);
+                }
+
+                
+                
+                if (i === length -1) {
+                    return workingItems;
+                }
+            }
+            return [];
+        },
+
+        is: function(component) {
+            var operations = this.operations,
+                components = Ext.isArray(component) ? component : [component],
+                originalLength = components.length,
+                lastOperation = operations[operations.length-1],
+                ln, i;
+
+            components = filterItems(components, lastOperation);
+            if (components.length === originalLength) {
+                if (operations.length > 1) {
+                    for (i = 0, ln = components.length; i < ln; i++) {
+                        if (Ext.Array.indexOf(this.execute(), components[i]) === -1) {
+                            return false;
+                        }
+                    }
+                }
+                return true;
+            }
+            return false;
+        }
+    });
+
+    Ext.apply(this, {
+
+        
+        cache: {},
+
+        
+        pseudos: {
+            not: function(components, selector){
+                var CQ = Ext.ComponentQuery,
+                    i = 0,
+                    length = components.length,
+                    results = [],
+                    index = -1,
+                    component;
+                
+                for(; i < length; ++i) {
+                    component = components[i];
+                    if (!CQ.is(component, selector)) {
+                        results[++index] = component;
+                    }
+                }
+                return results;
+            },
+            last: function(components) {
+                return components[components.length - 1];
+            }
+        },
+
+        
+        query: function(selector, root) {
+            var selectors = selector.split(','),
+                length = selectors.length,
+                i = 0,
+                results = [],
+                noDupResults = [], 
+                dupMatcher = {}, 
+                query, resultsLn, cmp;
+
+            for (; i < length; i++) {
+                selector = Ext.String.trim(selectors[i]);
+                query = this.cache[selector];
+                if (!query) {
+                    this.cache[selector] = query = this.parse(selector);
+                }
+                results = results.concat(query.execute(root));
+            }
+
+            
+            
+            if (length > 1) {
+                resultsLn = results.length;
+                for (i = 0; i < resultsLn; i++) {
+                    cmp = results[i];
+                    if (!dupMatcher[cmp.id]) {
+                        noDupResults.push(cmp);
+                        dupMatcher[cmp.id] = true;
+                    }
+                }
+                results = noDupResults;
+            }
+            return results;
+        },
+
+        
+        is: function(component, selector) {
+            if (!selector) {
+                return true;
+            }
+            var query = this.cache[selector];
+            if (!query) {
+                this.cache[selector] = query = this.parse(selector);
+            }
+            return query.is(component);
+        },
+
+        parse: function(selector) {
+            var operations = [],
+                length = matchers.length,
+                lastSelector,
+                tokenMatch,
+                matchedChar,
+                modeMatch,
+                selectorMatch,
+                i, matcher, method;
+
+            
+            
+            
+            while (selector && lastSelector !== selector) {
+                lastSelector = selector;
+
+                
+                tokenMatch = selector.match(tokenRe);
+
+                if (tokenMatch) {
+                    matchedChar = tokenMatch[1];
+
+                    
+                    if (matchedChar === '#') {
+                        operations.push({
+                            method: filterById,
+                            args: [Ext.String.trim(tokenMatch[2])]
+                        });
+                    }
+                    
+                    
+                    else if (matchedChar === '.') {
+                        operations.push({
+                            method: filterByClassName,
+                            args: [Ext.String.trim(tokenMatch[2])]
+                        });
+                    }
+                    
+                    
+                    else {
+                        operations.push({
+                            method: filterByXType,
+                            args: [Ext.String.trim(tokenMatch[2]), Boolean(tokenMatch[3])]
+                        });
+                    }
+
+                    
+                    selector = selector.replace(tokenMatch[0], '');
+                }
+
+                
+                
+                
+                while (!(modeMatch = selector.match(modeRe))) {
+                    
+                    
+                    for (i = 0; selector && i < length; i++) {
+                        matcher = matchers[i];
+                        selectorMatch = selector.match(matcher.re);
+                        method = matcher.method;
+
+                        
+                        
+                        
+                        if (selectorMatch) {
+                            operations.push({
+                                method: Ext.isString(matcher.method)
+                                    
+                                    
+                                    
+                                    ? Ext.functionFactory('items', Ext.String.format.apply(Ext.String, [method].concat(selectorMatch.slice(1))))
+                                    : matcher.method,
+                                args: selectorMatch.slice(1)
+                            });
+                            selector = selector.replace(selectorMatch[0], '');
+                            break; 
+                        }
+                    }
+                }
+
+                
+                
+                
+                
+                if (modeMatch[1]) { 
+                    operations.push({
+                        mode: modeMatch[2]||modeMatch[1]
+                    });
+                    selector = selector.replace(modeMatch[0], '');
+                }
+            }
+
+            
+            
+            return new cq.Query({
+                operations: operations
+            });
+        }
+    });
+});
+
+Ext.define('Ext.util.HashMap', {
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    
+
+    
+    constructor: function(config) {
+        config = config || {};
+        
+        var me = this,
+            keyFn = config.keyFn;
+
+        me.addEvents(
+            
+            'add',
+            
+            'clear',
+            
+            'remove',
+            
+            'replace'
+        );
+
+        me.mixins.observable.constructor.call(me, config);
+        me.clear(true);
+        
+        if (keyFn) {
+            me.getKey = keyFn;
+        }
+    },
+
+    
+    getCount: function() {
+        return this.length;
+    },
+
+    
+    getData: function(key, value) {
+        
+        if (value === undefined) {
+            value = key;
+            key = this.getKey(value);
+        }
+
+        return [key, value];
+    },
+
+    
+    getKey: function(o) {
+        return o.id;
+    },
+
+    
+    add: function(key, value) {
+        var me = this,
+            data;
+
+        if (arguments.length === 1) {
+            value = key;
+            key = me.getKey(value);
+        }
+
+        if (me.containsKey(key)) {
+            return me.replace(key, value);
+        }
+
+        data = me.getData(key, value);
+        key = data[0];
+        value = data[1];
+        me.map[key] = value;
+        ++me.length;
+        me.fireEvent('add', me, key, value);
+        return value;
+    },
+
+    
+    replace: function(key, value) {
+        var me = this,
+            map = me.map,
+            old;
+
+        if (!me.containsKey(key)) {
+            me.add(key, value);
+        }
+        old = map[key];
+        map[key] = value;
+        me.fireEvent('replace', me, key, value, old);
+        return value;
+    },
+
+    
+    remove: function(o) {
+        var key = this.findKey(o);
+        if (key !== undefined) {
+            return this.removeAtKey(key);
+        }
+        return false;
+    },
+
+    
+    removeAtKey: function(key) {
+        var me = this,
+            value;
+
+        if (me.containsKey(key)) {
+            value = me.map[key];
+            delete me.map[key];
+            --me.length;
+            me.fireEvent('remove', me, key, value);
+            return true;
+        }
+        return false;
+    },
+
+    
+    get: function(key) {
+        return this.map[key];
+    },
+
+    
+    clear: function( initial) {
+        var me = this;
+        me.map = {};
+        me.length = 0;
+        if (initial !== true) {
+            me.fireEvent('clear', me);
+        }
+        return me;
+    },
+
+    
+    containsKey: function(key) {
+        return this.map[key] !== undefined;
+    },
+
+    
+    contains: function(value) {
+        return this.containsKey(this.findKey(value));
+    },
+
+    
+    getKeys: function() {
+        return this.getArray(true);
+    },
+
+    
+    getValues: function() {
+        return this.getArray(false);
+    },
+
+    
+    getArray: function(isKey) {
+        var arr = [],
+            key,
+            map = this.map;
+        for (key in map) {
+            if (map.hasOwnProperty(key)) {
+                arr.push(isKey ? key: map[key]);
+            }
+        }
+        return arr;
+    },
+
+    
+    each: function(fn, scope) {
+        
+        var items = Ext.apply({}, this.map),
+            key,
+            length = this.length;
+
+        scope = scope || this;
+        for (key in items) {
+            if (items.hasOwnProperty(key)) {
+                if (fn.call(scope, key, items[key], length) === false) {
+                    break;
+                }
+            }
+        }
+        return this;
+    },
+
+    
+    clone: function() {
+        var hash = new this.self(),
+            map = this.map,
+            key;
+
+        hash.suspendEvents();
+        for (key in map) {
+            if (map.hasOwnProperty(key)) {
+                hash.add(key, map[key]);
+            }
+        }
+        hash.resumeEvents();
+        return hash;
+    },
+
+    
+    findKey: function(value) {
+        var key,
+            map = this.map;
+
+        for (key in map) {
+            if (map.hasOwnProperty(key) && map[key] === value) {
+                return key;
+            }
+        }
+        return undefined;
+    }
+});
+
+
+Ext.define('Ext.state.Manager', {
+    singleton: true,
+    requires: ['Ext.state.Provider'],
+    constructor: function() {
+        this.provider = Ext.create('Ext.state.Provider');
+    },
+    
+    
+    
+    setProvider : function(stateProvider){
+        this.provider = stateProvider;
+    },
+
+    
+    get : function(key, defaultValue){
+        return this.provider.get(key, defaultValue);
+    },
+
+    
+     set : function(key, value){
+        this.provider.set(key, value);
+    },
+
+    
+    clear : function(key){
+        this.provider.clear(key);
+    },
+
+    
+    getProvider : function(){
+        return this.provider;
+    }
+});
+
+Ext.define('Ext.state.Stateful', {
+
+    
+
+   mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    requires: ['Ext.state.Manager'],
+
+    
+
+    
+    stateful: true,
+
+    
+
+    
+
+    
+    saveDelay: 100,
+
+    autoGenIdRe: /^((\w+-)|(ext-comp-))\d{4,}$/i,
+
+    constructor: function(config) {
+        var me = this;
+
+        config = config || {};
+        if (Ext.isDefined(config.stateful)) {
+            me.stateful = config.stateful;
+        }
+        if (Ext.isDefined(config.saveDelay)) {
+            me.saveDelay = config.saveDelay;
+        }
+        me.stateId = me.stateId || config.stateId;
+
+        if (!me.stateEvents) {
+            me.stateEvents = [];
+        }
+        if (config.stateEvents) {
+            me.stateEvents.concat(config.stateEvents);
+        }
+        this.addEvents(
+            
+            'beforestaterestore',
+
+            
+            'staterestore',
+
+            
+            'beforestatesave',
+
+            
+            'statesave'
+        );
+        me.mixins.observable.constructor.call(me);
+        if (me.stateful !== false) {
+            me.initStateEvents();
+            me.initState();
+        }
+    },
+
+    
+    initStateEvents: function() {
+        this.addStateEvents(this.stateEvents);
+    },
+
+    
+    addStateEvents: function(events){
+        if (!Ext.isArray(events)) {
+            events = [events];
+        }
+
+        var me = this,
+            i = 0,
+            len = events.length;
+
+        for (; i < len; ++i) {
+            me.on(events[i], me.onStateChange, me);
+        }
+    },
+
+    
+    onStateChange: function(){
+        var me = this,
+            delay = me.saveDelay;
+
+        if (delay > 0) {
+            if (!me.stateTask) {
+                me.stateTask = Ext.create('Ext.util.DelayedTask', me.saveState, me);
+            }
+            me.stateTask.delay(me.saveDelay);
+        } else {
+            me.saveState();
+        }
+    },
+
+    
+    saveState: function() {
+        var me = this,
+            id,
+            state;
+
+        if (me.stateful !== false) {
+            id = me.getStateId();
+            if (id) {
+                state = me.getState();
+                if (me.fireEvent('beforestatesave', me, state) !== false) {
+                    Ext.state.Manager.set(id, state);
+                    me.fireEvent('statesave', me, state);
+                }
+            }
+        }
+    },
+
+    
+    getState: function(){
+        return null;
+    },
+
+    
+    applyState: function(state) {
+        if (state) {
+            Ext.apply(this, state);
+        }
+    },
+
+    
+    getStateId: function() {
+        var me = this,
+            id = me.stateId;
+
+        if (!id) {
+            id = me.autoGenIdRe.test(String(me.id)) ? null : me.id;
+        }
+        return id;
+    },
+
+    
+    initState: function(){
+        var me = this,
+            id = me.getStateId(),
+            state;
+
+        if (me.stateful !== false) {
+            if (id) {
+                state = Ext.state.Manager.get(id);
+                if (state) {
+                    state = Ext.apply({}, state);
+                    if (me.fireEvent('beforestaterestore', me, state) !== false) {
+                        me.applyState(state);
+                        me.fireEvent('staterestore', me, state);
+                    }
+                }
+            }
+        }
+    },
+
+    
+    savePropToState: function (propName, state, stateName) {
+        var me = this,
+            value = me[propName],
+            config = me.initialConfig;
+
+        if (me.hasOwnProperty(propName)) {
+            if (!config || config[propName] !== value) {
+                if (state) {
+                    state[stateName || propName] = value;
+                }
+                return true;
+            }
+        }
+        return false;
+    },
+
+    savePropsToState: function (propNames, state) {
+        var me = this;
+        Ext.each(propNames, function (propName) {
+            me.savePropToState(propName, state);
+        });
+        return state;
+    },
+
+    
+    destroy: function(){
+        var task = this.stateTask;
+        if (task) {
+            task.cancel();
+        }
+        this.clearListeners();
+
+    }
+
+});
+
+
+Ext.define('Ext.AbstractManager', {
+
+    
+
+    requires: ['Ext.util.HashMap'],
+
+    
+
+    typeName: 'type',
+
+    constructor: function(config) {
+        Ext.apply(this, config || {});
+
+        
+        this.all = Ext.create('Ext.util.HashMap');
+
+        this.types = {};
+    },
+
+    
+    get : function(id) {
+        return this.all.get(id);
+    },
+
+    
+    register: function(item) {
+        this.all.add(item);
+    },
+
+    
+    unregister: function(item) {
+        this.all.remove(item);
+    },
+
+    
+    registerType : function(type, cls) {
+        this.types[type] = cls;
+        cls[this.typeName] = type;
+    },
+
+    
+    isRegistered : function(type){
+        return this.types[type] !== undefined;
+    },
+
+    
+    create: function(config, defaultType) {
+        var type        = config[this.typeName] || config.type || defaultType,
+            Constructor = this.types[type];
+
+
+        return new Constructor(config);
+    },
+
+    
+    onAvailable : function(id, fn, scope){
+        var all = this.all,
+            item;
+        
+        if (all.containsKey(id)) {
+            item = all.get(id);
+            fn.call(scope || item, item);
+        } else {
+            all.on('add', function(map, key, item){
+                if (key == id) {
+                    fn.call(scope || item, item);
+                    all.un('add', fn, scope);
+                }
+            });
+        }
+    },
+    
+    
+    each: function(fn, scope){
+        this.all.each(fn, scope || this);    
+    },
+    
+    
+    getCount: function(){
+        return this.all.getCount();
+    }
+});
+
+
+Ext.define('Ext.ComponentManager', {
+    extend: 'Ext.AbstractManager',
+    alternateClassName: 'Ext.ComponentMgr',
+    
+    singleton: true,
+    
+    typeName: 'xtype',
+    
+    
+    create: function(component, defaultType){
+        if (component instanceof Ext.AbstractComponent) {
+            return component;
+        }
+        else if (Ext.isString(component)) {
+            return Ext.createByAlias('widget.' + component);
+        }
+        else {
+            var type = component.xtype || defaultType,
+                config = component;
+            
+            return Ext.createByAlias('widget.' + type, config);
+        }
+    },
+
+    registerType: function(type, cls) {
+        this.types[type] = cls;
+        cls[this.typeName] = type;
+        cls.prototype[this.typeName] = type;
+    }
+});
+
+Ext.define('Ext.AbstractComponent', {
+
+    
+    requires: [
+        'Ext.ComponentQuery',
+        'Ext.ComponentManager'
+    ],
+
+    mixins: {
+        observable: 'Ext.util.Observable',
+        animate: 'Ext.util.Animate',
+        state: 'Ext.state.Stateful'
+    },
+
+    
+    
+    uses: [
+        'Ext.PluginManager',
+        'Ext.ComponentManager',
+        'Ext.Element',
+        'Ext.DomHelper',
+        'Ext.XTemplate',
+        'Ext.ComponentQuery',
+        'Ext.ComponentLoader',
+        'Ext.EventManager',
+        'Ext.layout.Layout',
+        'Ext.layout.component.Auto',
+        'Ext.LoadMask',
+        'Ext.ZIndexManager'
+    ],
+
+    statics: {
+        AUTO_ID: 1000
+    },
+
+    
+
+    isComponent: true,
+
+    getAutoId: function() {
+        return ++Ext.AbstractComponent.AUTO_ID;
+    },
+
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    renderTpl: null,
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    tplWriteMode: 'overwrite',
+
+    
+    baseCls: Ext.baseCSSPrefix + 'component',
+
+    
+
+    
+
+    
+
+    
+    disabledCls: Ext.baseCSSPrefix + 'item-disabled',
+
+    
+    ui: 'default',
+
+    
+    uiCls: [],
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    hidden: false,
+
+    
+    disabled: false,
+
+    
+
+    
+    draggable: false,
+
+    
+    floating: false,
+
+    
+    hideMode: 'display',
+
+    
+
+    
+
+    
+    styleHtmlContent: false,
+
+    
+    styleHtmlCls: Ext.baseCSSPrefix + 'html',
+
+    
+    
+    
+    
+
+    
+
+    
+    autoShow: false,
+
+    
+    autoRender: false,
+
+    needsLayout: false,
+
+    
+    allowDomMove: true,
+
+    
+
+    
+    rendered: false,
+
+    
+    componentLayoutCounter: 0,
+
+    weight: 0,
+
+    trimRe: /^\s+|\s+$/g,
+    spacesRe: /\s+/,
+
+
+    
+    maskOnDisable: true,
+
+    
+    constructor : function(config) {
+        var me = this,
+            i, len;
+
+        config = config || {};
+        me.initialConfig = config;
+        Ext.apply(me, config);
+
+        me.addEvents(
+            
+            'beforeactivate',
+            
+            'activate',
+            
+            'beforedeactivate',
+            
+            'deactivate',
+            
+            'added',
+            
+            'disable',
+            
+            'enable',
+            
+            'beforeshow',
+            
+            'show',
+            
+            'beforehide',
+            
+            'hide',
+            
+            'removed',
+            
+            'beforerender',
+            
+            'render',
+            
+            'afterrender',
+            
+            'beforedestroy',
+            
+            'destroy',
+            
+            'resize',
+            
+            'move'
+        );
+
+        me.getId();
+
+        me.mons = [];
+        me.additionalCls = [];
+        me.renderData = me.renderData || {};
+        me.renderSelectors = me.renderSelectors || {};
+
+        if (me.plugins) {
+            me.plugins = [].concat(me.plugins);
+            me.constructPlugins();
+        }
+
+        me.initComponent();
+
+        
+        Ext.ComponentManager.register(me);
+
+        
+        me.mixins.observable.constructor.call(me);
+        me.mixins.state.constructor.call(me, config);
+
+        
+        this.addStateEvents('resize');
+
+        
+        if (me.plugins) {
+            me.plugins = [].concat(me.plugins);
+            for (i = 0, len = me.plugins.length; i < len; i++) {
+                me.plugins[i] = me.initPlugin(me.plugins[i]);
+            }
+        }
+
+        me.loader = me.getLoader();
+
+        if (me.renderTo) {
+            me.render(me.renderTo);
+            
+            
+            
+        }
+
+        if (me.autoShow) {
+            me.show();
+        }
+
+    },
+
+    initComponent: function () {
+        
+        
+        this.constructPlugins();
+    },
+
+    
+    getState: function() {
+        var me = this,
+            layout = me.ownerCt ? (me.shadowOwnerCt || me.ownerCt).getLayout() : null,
+            state = {
+                collapsed: me.collapsed
+            },
+            width = me.width,
+            height = me.height,
+            cm = me.collapseMemento,
+            anchors;
+
+        
+        
+        if (me.collapsed && cm) {
+            if (Ext.isDefined(cm.data.width)) {
+                width = cm.width;
+            }
+            if (Ext.isDefined(cm.data.height)) {
+                height = cm.height;
+            }
+        }
+
+        
+        if (layout && me.flex) {
+            state.flex = me.flex;
+            if (layout.perpendicularPrefix) {
+                state[layout.perpendicularPrefix] = me['get' + layout.perpendicularPrefixCap]();
+            } else {
+            }
+        }
+        
+        else if (layout && me.anchor) {
+            state.anchor = me.anchor;
+            anchors = me.anchor.split(' ').concat(null);
+            if (!anchors[0]) {
+                if (me.width) {
+                    state.width = width;
+                }
+            }
+            if (!anchors[1]) {
+                if (me.height) {
+                    state.height = height;
+                }
+            }
+        }
+        
+        else {
+            if (me.width) {
+                state.width = width;
+            }
+            if (me.height) {
+                state.height = height;
+            }
+        }
+
+        
+        if (state.width == me.initialConfig.width) {
+            delete state.width;
+        }
+        if (state.height == me.initialConfig.height) {
+            delete state.height;
+        }
+
+        
+        if (layout && layout.align && (layout.align.indexOf('stretch') !== -1)) {
+            delete state[layout.perpendicularPrefix];
+        }
+        return state;
+    },
+
+    show: Ext.emptyFn,
+
+    animate: function(animObj) {
+        var me = this,
+            to;
+
+        animObj = animObj || {};
+        to = animObj.to || {};
+
+        if (Ext.fx.Manager.hasFxBlock(me.id)) {
+            return me;
+        }
+        
+        if (!animObj.dynamic && (to.height || to.width)) {
+            var curWidth = me.getWidth(),
+                w = curWidth,
+                curHeight = me.getHeight(),
+                h = curHeight,
+                needsResize = false;
+
+            if (to.height && to.height > curHeight) {
+                h = to.height;
+                needsResize = true;
+            }
+            if (to.width && to.width > curWidth) {
+                w = to.width;
+                needsResize = true;
+            }
+
+            
+            
+            
+            if (needsResize) {
+                var clearWidth = !Ext.isNumber(me.width),
+                    clearHeight = !Ext.isNumber(me.height);
+
+                me.componentLayout.childrenChanged = true;
+                me.setSize(w, h, me.ownerCt);
+                me.el.setSize(curWidth, curHeight);
+                if (clearWidth) {
+                    delete me.width;
+                }
+                if (clearHeight) {
+                    delete me.height;
+                }
+            }
+        }
+        return me.mixins.animate.animate.apply(me, arguments);
+    },
+
+    
+    findLayoutController: function() {
+        return this.findParentBy(function(c) {
+            
+            
+            return !c.ownerCt || (c.layout.layoutBusy && !c.ownerCt.layout.layoutBusy);
+        });
+    },
+
+    onShow : function() {
+        
+        var needsLayout = this.needsLayout;
+        if (Ext.isObject(needsLayout)) {
+            this.doComponentLayout(needsLayout.width, needsLayout.height, needsLayout.isSetSize, needsLayout.ownerCt);
+        }
+    },
+
+    constructPlugin: function(plugin) {
+        if (plugin.ptype && typeof plugin.init != 'function') {
+            plugin.cmp = this;
+            plugin = Ext.PluginManager.create(plugin);
+        }
+        else if (typeof plugin == 'string') {
+            plugin = Ext.PluginManager.create({
+                ptype: plugin,
+                cmp: this
+            });
+        }
+        return plugin;
+    },
+
+    
+    constructPlugins: function() {
+        var me = this,
+            plugins = me.plugins,
+            i, len;
+
+        if (plugins) {
+            for (i = 0, len = plugins.length; i < len; i++) {
+                
+                plugins[i] = me.constructPlugin(plugins[i]);
+            }
+        }
+    },
+
+    
+    initPlugin : function(plugin) {
+        plugin.init(this);
+
+        return plugin;
+    },
+
+    
+    doAutoRender: function() {
+        var me = this;
+        if (me.floating) {
+            me.render(document.body);
+        } else {
+            me.render(Ext.isBoolean(me.autoRender) ? Ext.getBody() : me.autoRender);
+        }
+    },
+
+    
+    render : function(container, position) {
+        var me = this;
+
+        if (!me.rendered && me.fireEvent('beforerender', me) !== false) {
+
+            
+            
+            me.rendering = true;
+
+            
+            
+            if (me.el) {
+                me.el = Ext.get(me.el);
+            }
+
+            
+            if (me.floating) {
+                me.onFloatRender();
+            }
+
+            container = me.initContainer(container);
+
+            me.onRender(container, position);
+
+            
+            
+            me.el.setVisibilityMode(Ext.Element[me.hideMode.toUpperCase()]);
+
+            if (me.overCls) {
+                me.el.hover(me.addOverCls, me.removeOverCls, me);
+            }
+
+            me.fireEvent('render', me);
+
+            me.initContent();
+
+            me.afterRender(container);
+            me.fireEvent('afterrender', me);
+
+            me.initEvents();
+
+            if (me.hidden) {
+                
+                
+                
+                me.el.hide();
+            }
+
+            if (me.disabled) {
+                
+                me.disable(true);
+            }
+
+            
+            delete me.rendering;
+        }
+        return me;
+    },
+
+    
+    onRender : function(container, position) {
+        var me = this,
+            el = me.el,
+            styles = me.initStyles(),
+            renderTpl, renderData, i;
+
+        position = me.getInsertPosition(position);
+
+        if (!el) {
+            if (position) {
+                el = Ext.DomHelper.insertBefore(position, me.getElConfig(), true);
+            }
+            else {
+                el = Ext.DomHelper.append(container, me.getElConfig(), true);
+            }
+        }
+        else if (me.allowDomMove !== false) {
+            if (position) {
+                container.dom.insertBefore(el.dom, position);
+            } else {
+                container.dom.appendChild(el.dom);
+            }
+        }
+
+        if (Ext.scopeResetCSS && !me.ownerCt) {
+            
+            if (el.dom == Ext.getBody().dom) {
+                el.parent().addCls(Ext.baseCSSPrefix + 'reset');
+            }
+            else {
+                
+                me.resetEl = el.wrap({
+                    cls: Ext.baseCSSPrefix + 'reset'
+                });
+            }
+        }
+
+        me.setUI(me.ui);
+
+        el.addCls(me.initCls());
+        el.setStyle(styles);
+
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+
+        me.el = el;
+
+        me.initFrame();
+
+        renderTpl = me.initRenderTpl();
+        if (renderTpl) {
+            renderData = me.initRenderData();
+            renderTpl.append(me.getTargetEl(), renderData);
+        }
+
+        me.applyRenderSelectors();
+
+        me.rendered = true;
+    },
+
+    
+    afterRender : function() {
+        var me = this,
+            pos,
+            xy;
+
+        me.getComponentLayout();
+
+        
+        
+        
+        if (me.collapsed || (!me.ownerCt || (me.height || me.width))) {
+            me.setSize(me.width, me.height);
+        } else {
+            
+            
+            
+            
+            me.renderChildren();
+        }
+
+        
+        
+        if (me.floating && (me.x === undefined || me.y === undefined)) {
+            if (me.floatParent) {
+                xy = me.el.getAlignToXY(me.floatParent.getTargetEl(), 'c-c');
+                pos = me.floatParent.getTargetEl().translatePoints(xy[0], xy[1]);
+            } else {
+                xy = me.el.getAlignToXY(me.container, 'c-c');
+                pos = me.container.translatePoints(xy[0], xy[1]);
+            }
+            me.x = me.x === undefined ? pos.left: me.x;
+            me.y = me.y === undefined ? pos.top: me.y;
+        }
+
+        if (Ext.isDefined(me.x) || Ext.isDefined(me.y)) {
+            me.setPosition(me.x, me.y);
+        }
+
+        if (me.styleHtmlContent) {
+            me.getTargetEl().addCls(me.styleHtmlCls);
+        }
+    },
+
+    
+    registerFloatingItem: function(cmp) {
+        var me = this;
+        if (!me.floatingItems) {
+            me.floatingItems = Ext.create('Ext.ZIndexManager', me);
+        }
+        me.floatingItems.register(cmp);
+    },
+
+    renderChildren: function () {
+        var me = this,
+            layout = me.getComponentLayout();
+
+        me.suspendLayout = true;
+        layout.renderChildren();
+        delete me.suspendLayout;
+    },
+
+    frameCls: Ext.baseCSSPrefix + 'frame',
+
+    frameIdRegex: /[-]frame\d+[TMB][LCR]$/,
+
+    frameElementCls: {
+        tl: [],
+        tc: [],
+        tr: [],
+        ml: [],
+        mc: [],
+        mr: [],
+        bl: [],
+        bc: [],
+        br: []
+    },
+
+    frameTpl: [
+        '<tpl if="top">',
+            '<tpl if="left"><div id="{fgid}TL" class="{frameCls}-tl {baseCls}-tl {baseCls}-{ui}-tl<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tl</tpl></tpl>" style="background-position: {tl}; padding-left: {frameWidth}px" role="presentation"></tpl>',
+                '<tpl if="right"><div id="{fgid}TR" class="{frameCls}-tr {baseCls}-tr {baseCls}-{ui}-tr<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tr</tpl></tpl>" style="background-position: {tr}; padding-right: {frameWidth}px" role="presentation"></tpl>',
+                    '<div id="{fgid}TC" class="{frameCls}-tc {baseCls}-tc {baseCls}-{ui}-tc<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tc</tpl></tpl>" style="background-position: {tc}; height: {frameWidth}px" role="presentation"></div>',
+                '<tpl if="right"></div></tpl>',
+            '<tpl if="left"></div></tpl>',
+        '</tpl>',
+        '<tpl if="left"><div id="{fgid}ML" class="{frameCls}-ml {baseCls}-ml {baseCls}-{ui}-ml<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-ml</tpl></tpl>" style="background-position: {ml}; padding-left: {frameWidth}px" role="presentation"></tpl>',
+            '<tpl if="right"><div id="{fgid}MR" class="{frameCls}-mr {baseCls}-mr {baseCls}-{ui}-mr<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mr</tpl></tpl>" style="background-position: {mr}; padding-right: {frameWidth}px" role="presentation"></tpl>',
+                '<div id="{fgid}MC" class="{frameCls}-mc {baseCls}-mc {baseCls}-{ui}-mc<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mc</tpl></tpl>" role="presentation"></div>',
+            '<tpl if="right"></div></tpl>',
+        '<tpl if="left"></div></tpl>',
+        '<tpl if="bottom">',
+            '<tpl if="left"><div id="{fgid}BL" class="{frameCls}-bl {baseCls}-bl {baseCls}-{ui}-bl<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bl</tpl></tpl>" style="background-position: {bl}; padding-left: {frameWidth}px" role="presentation"></tpl>',
+                '<tpl if="right"><div id="{fgid}BR" class="{frameCls}-br {baseCls}-br {baseCls}-{ui}-br<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-br</tpl></tpl>" style="background-position: {br}; padding-right: {frameWidth}px" role="presentation"></tpl>',
+                    '<div id="{fgid}BC" class="{frameCls}-bc {baseCls}-bc {baseCls}-{ui}-bc<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bc</tpl></tpl>" style="background-position: {bc}; height: {frameWidth}px" role="presentation"></div>',
+                '<tpl if="right"></div></tpl>',
+            '<tpl if="left"></div></tpl>',
+        '</tpl>'
+    ],
+
+    frameTableTpl: [
+        '<table><tbody>',
+            '<tpl if="top">',
+                '<tr>',
+                    '<tpl if="left"><td id="{fgid}TL" class="{frameCls}-tl {baseCls}-tl {baseCls}-{ui}-tl<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tl</tpl></tpl>" style="background-position: {tl}; padding-left:{frameWidth}px" role="presentation"></td></tpl>',
+                    '<td id="{fgid}TC" class="{frameCls}-tc {baseCls}-tc {baseCls}-{ui}-tc<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tc</tpl></tpl>" style="background-position: {tc}; height: {frameWidth}px" role="presentation"></td>',
+                    '<tpl if="right"><td id="{fgid}TR" class="{frameCls}-tr {baseCls}-tr {baseCls}-{ui}-tr<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tr</tpl></tpl>" style="background-position: {tr}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
+                '</tr>',
+            '</tpl>',
+            '<tr>',
+                '<tpl if="left"><td id="{fgid}ML" class="{frameCls}-ml {baseCls}-ml {baseCls}-{ui}-ml<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-ml</tpl></tpl>" style="background-position: {ml}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
+                '<td id="{fgid}MC" class="{frameCls}-mc {baseCls}-mc {baseCls}-{ui}-mc<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mc</tpl></tpl>" style="background-position: 0 0;" role="presentation"></td>',
+                '<tpl if="right"><td id="{fgid}MR" class="{frameCls}-mr {baseCls}-mr {baseCls}-{ui}-mr<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mr</tpl></tpl>" style="background-position: {mr}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
+            '</tr>',
+            '<tpl if="bottom">',
+                '<tr>',
+                    '<tpl if="left"><td id="{fgid}BL" class="{frameCls}-bl {baseCls}-bl {baseCls}-{ui}-bl<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bl</tpl></tpl>" style="background-position: {bl}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
+                    '<td id="{fgid}BC" class="{frameCls}-bc {baseCls}-bc {baseCls}-{ui}-bc<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bc</tpl></tpl>" style="background-position: {bc}; height: {frameWidth}px" role="presentation"></td>',
+                    '<tpl if="right"><td id="{fgid}BR" class="{frameCls}-br {baseCls}-br {baseCls}-{ui}-br<tpl if="uiCls"><tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-br</tpl></tpl>" style="background-position: {br}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
+                '</tr>',
+            '</tpl>',
+        '</tbody></table>'
+    ],
+
+    
+    initFrame : function() {
+        if (Ext.supports.CSS3BorderRadius) {
+            return false;
+        }
+
+        var me = this,
+            frameInfo = me.getFrameInfo(),
+            frameWidth = frameInfo.width,
+            frameTpl = me.getFrameTpl(frameInfo.table),
+            frameGenId;
+
+        if (me.frame) {
+            
+            
+            me.frameGenId = frameGenId = (me.frameGenId || 0) + 1;
+            frameGenId = me.id + '-frame' + frameGenId;
+
+            
+            frameTpl.insertFirst(me.el, Ext.apply({}, {
+                fgid:       frameGenId,
+                ui:         me.ui,
+                uiCls:      me.uiCls,
+                frameCls:   me.frameCls,
+                baseCls:    me.baseCls,
+                frameWidth: frameWidth,
+                top:        !!frameInfo.top,
+                left:       !!frameInfo.left,
+                right:      !!frameInfo.right,
+                bottom:     !!frameInfo.bottom
+            }, me.getFramePositions(frameInfo)));
+
+            
+            me.frameBody = me.el.down('.' + me.frameCls + '-mc');
+
+            
+            me.removeChildEls(function (c) {
+                return c.id && me.frameIdRegex.test(c.id);
+            });
+
+            
+            Ext.each(['TL','TC','TR','ML','MC','MR','BL','BC','BR'], function (suffix) {
+                me.childEls.push({ name: 'frame' + suffix, id: frameGenId + suffix });
+            });
+        }
+    },
+
+    updateFrame: function() {
+        if (Ext.supports.CSS3BorderRadius) {
+            return false;
+        }
+
+        var me = this,
+            wasTable = this.frameSize && this.frameSize.table,
+            oldFrameTL = this.frameTL,
+            oldFrameBL = this.frameBL,
+            oldFrameML = this.frameML,
+            oldFrameMC = this.frameMC,
+            newMCClassName;
+
+        this.initFrame();
+
+        if (oldFrameMC) {
+            if (me.frame) {
+                
+                delete me.frameTL;
+                delete me.frameTC;
+                delete me.frameTR;
+                delete me.frameML;
+                delete me.frameMC;
+                delete me.frameMR;
+                delete me.frameBL;
+                delete me.frameBC;
+                delete me.frameBR;
+                this.applyRenderSelectors();
+
+                
+                newMCClassName = this.frameMC.dom.className;
+
+                
+                oldFrameMC.insertAfter(this.frameMC);
+                this.frameMC.remove();
+
+                
+                this.frameBody = this.frameMC = oldFrameMC;
+
+                
+                oldFrameMC.dom.className = newMCClassName;
+
+                
+                if (wasTable) {
+                    me.el.query('> table')[1].remove();
+                }
+                else {
+                    if (oldFrameTL) {
+                        oldFrameTL.remove();
+                    }
+                    if (oldFrameBL) {
+                        oldFrameBL.remove();
+                    }
+                    oldFrameML.remove();
+                }
+            }
+            else {
+                
+
+            }
+        }
+        else if (me.frame) {
+            this.applyRenderSelectors();
+        }
+    },
+
+    getFrameInfo: function() {
+        if (Ext.supports.CSS3BorderRadius) {
+            return false;
+        }
+
+        var me = this,
+            left = me.el.getStyle('background-position-x'),
+            top = me.el.getStyle('background-position-y'),
+            info, frameInfo = false, max;
+
+        
+        
+        if (!left && !top) {
+            info = me.el.getStyle('background-position').split(' ');
+            left = info[0];
+            top = info[1];
+        }
+
+        
+        
+        
+        if (parseInt(left, 10) >= 1000000 && parseInt(top, 10) >= 1000000) {
+            max = Math.max;
+
+            frameInfo = {
+                
+                table: left.substr(0, 3) == '110',
+
+                
+                vertical: top.substr(0, 3) == '110',
+
+                
+                top:    max(left.substr(3, 2), left.substr(5, 2)),
+                right:  max(left.substr(5, 2), top.substr(3, 2)),
+                bottom: max(top.substr(3, 2), top.substr(5, 2)),
+                left:   max(top.substr(5, 2), left.substr(3, 2))
+            };
+
+            frameInfo.width = max(frameInfo.top, frameInfo.right, frameInfo.bottom, frameInfo.left);
+
+            
+            me.el.setStyle('background-image', 'none');
+        }
+
+        
+        
+        if (me.frame === true && !frameInfo) {
+        }
+
+        me.frame = me.frame || !!frameInfo;
+        me.frameSize = frameInfo || false;
+
+        return frameInfo;
+    },
+
+    getFramePositions: function(frameInfo) {
+        var me = this,
+            frameWidth = frameInfo.width,
+            dock = me.dock,
+            positions, tc, bc, ml, mr;
+
+        if (frameInfo.vertical) {
+            tc = '0 -' + (frameWidth * 0) + 'px';
+            bc = '0 -' + (frameWidth * 1) + 'px';
+
+            if (dock && dock == "right") {
+                tc = 'right -' + (frameWidth * 0) + 'px';
+                bc = 'right -' + (frameWidth * 1) + 'px';
+            }
+
+            positions = {
+                tl: '0 -' + (frameWidth * 0) + 'px',
+                tr: '0 -' + (frameWidth * 1) + 'px',
+                bl: '0 -' + (frameWidth * 2) + 'px',
+                br: '0 -' + (frameWidth * 3) + 'px',
+
+                ml: '-' + (frameWidth * 1) + 'px 0',
+                mr: 'right 0',
+
+                tc: tc,
+                bc: bc
+            };
+        } else {
+            ml = '-' + (frameWidth * 0) + 'px 0';
+            mr = 'right 0';
+
+            if (dock && dock == "bottom") {
+                ml = 'left bottom';
+                mr = 'right bottom';
+            }
+
+            positions = {
+                tl: '0 -' + (frameWidth * 2) + 'px',
+                tr: 'right -' + (frameWidth * 3) + 'px',
+                bl: '0 -' + (frameWidth * 4) + 'px',
+                br: 'right -' + (frameWidth * 5) + 'px',
+
+                ml: ml,
+                mr: mr,
+
+                tc: '0 -' + (frameWidth * 0) + 'px',
+                bc: '0 -' + (frameWidth * 1) + 'px'
+            };
+        }
+
+        return positions;
+    },
+
+    
+    getFrameTpl : function(table) {
+        return table ? this.getTpl('frameTableTpl') : this.getTpl('frameTpl');
+    },
+
+    
+    initCls: function() {
+        var me = this,
+            cls = [];
+
+        cls.push(me.baseCls);
+
+        if (Ext.isDefined(me.cmpCls)) {
+            if (Ext.isDefined(Ext.global.console)) {
+                Ext.global.console.warn('Ext.Component: cmpCls has been deprecated. Please use componentCls.');
+            }
+            me.componentCls = me.cmpCls;
+            delete me.cmpCls;
+        }
+
+        if (me.componentCls) {
+            cls.push(me.componentCls);
+        } else {
+            me.componentCls = me.baseCls;
+        }
+        if (me.cls) {
+            cls.push(me.cls);
+            delete me.cls;
+        }
+
+        return cls.concat(me.additionalCls);
+    },
+
+    
+    setUI: function(ui) {
+        var me = this,
+            oldUICls = Ext.Array.clone(me.uiCls),
+            newUICls = [],
+            classes = [],
+            cls,
+            i;
+
+        
+        for (i = 0; i < oldUICls.length; i++) {
+            cls = oldUICls[i];
+
+            classes = classes.concat(me.removeClsWithUI(cls, true));
+            newUICls.push(cls);
+        }
+
+        if (classes.length) {
+            me.removeCls(classes);
+        }
+
+        
+        me.removeUIFromElement();
+
+        
+        me.ui = ui;
+
+        
+        me.addUIToElement();
+
+        
+        classes = [];
+        for (i = 0; i < newUICls.length; i++) {
+            cls = newUICls[i];
+            classes = classes.concat(me.addClsWithUI(cls, true));
+        }
+
+        if (classes.length) {
+            me.addCls(classes);
+        }
+    },
+
+    
+    addClsWithUI: function(cls, skip) {
+        var me = this,
+            classes = [],
+            i;
+
+        if (!Ext.isArray(cls)) {
+            cls = [cls];
+        }
+
+        for (i = 0; i < cls.length; i++) {
+            if (cls[i] && !me.hasUICls(cls[i])) {
+                me.uiCls = Ext.Array.clone(me.uiCls);
+                me.uiCls.push(cls[i]);
+
+                classes = classes.concat(me.addUIClsToElement(cls[i]));
+            }
+        }
+
+        if (skip !== true) {
+            me.addCls(classes);
+        }
+
+        return classes;
+    },
+
+    
+    removeClsWithUI: function(cls, skip) {
+        var me = this,
+            classes = [],
+            i;
+
+        if (!Ext.isArray(cls)) {
+            cls = [cls];
+        }
+
+        for (i = 0; i < cls.length; i++) {
+            if (cls[i] && me.hasUICls(cls[i])) {
+                me.uiCls = Ext.Array.remove(me.uiCls, cls[i]);
+
+                classes = classes.concat(me.removeUIClsFromElement(cls[i]));
+            }
+        }
+
+        if (skip !== true) {
+            me.removeCls(classes);
+        }
+
+        return classes;
+    },
+
+    
+    hasUICls: function(cls) {
+        var me = this,
+            uiCls = me.uiCls || [];
+
+        return Ext.Array.contains(uiCls, cls);
+    },
+
+    
+    addUIClsToElement: function(cls, force) {
+        var me = this,
+            result = [],
+            frameElementCls = me.frameElementCls;
+
+        result.push(Ext.baseCSSPrefix + cls);
+        result.push(me.baseCls + '-' + cls);
+        result.push(me.baseCls + '-' + me.ui + '-' + cls);
+
+        if (!force && me.frame && !Ext.supports.CSS3BorderRadius) {
+            
+            var els = ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'],
+                classes, i, j, el;
+
+            
+            for (i = 0; i < els.length; i++) {
+                el = me['frame' + els[i].toUpperCase()];
+                classes = [me.baseCls + '-' + me.ui + '-' + els[i], me.baseCls + '-' + me.ui + '-' + cls + '-' + els[i]];
+                if (el && el.dom) {
+                    el.addCls(classes);
+                } else {
+                    for (j = 0; j < classes.length; j++) {
+                        if (Ext.Array.indexOf(frameElementCls[els[i]], classes[j]) == -1) {
+                            frameElementCls[els[i]].push(classes[j]);
+                        }
+                    }
+                }
+            }
+        }
+
+        me.frameElementCls = frameElementCls;
+
+        return result;
+    },
+
+    
+    removeUIClsFromElement: function(cls, force) {
+        var me = this,
+            result = [],
+            frameElementCls = me.frameElementCls;
+
+        result.push(Ext.baseCSSPrefix + cls);
+        result.push(me.baseCls + '-' + cls);
+        result.push(me.baseCls + '-' + me.ui + '-' + cls);
+
+        if (!force && me.frame && !Ext.supports.CSS3BorderRadius) {
+            
+            var els = ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'],
+                i, el;
+            cls = me.baseCls + '-' + me.ui + '-' + cls + '-' + els[i];
+            
+            for (i = 0; i < els.length; i++) {
+                el = me['frame' + els[i].toUpperCase()];
+                if (el && el.dom) {
+                    el.removeCls(cls);
+                } else {
+                    Ext.Array.remove(frameElementCls[els[i]], cls);
+                }
+            }
+        }
+
+        me.frameElementCls = frameElementCls;
+
+        return result;
+    },
+
+    
+    addUIToElement: function(force) {
+        var me = this,
+            frameElementCls = me.frameElementCls;
+
+        me.addCls(me.baseCls + '-' + me.ui);
+
+        if (me.frame && !Ext.supports.CSS3BorderRadius) {
+            
+            var els = ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'],
+                i, el, cls;
+
+            
+            for (i = 0; i < els.length; i++) {
+                el = me['frame' + els[i].toUpperCase()];
+                cls = me.baseCls + '-' + me.ui + '-' + els[i];
+                if (el) {
+                    el.addCls(cls);
+                } else {
+                    if (!Ext.Array.contains(frameElementCls[els[i]], cls)) {
+                        frameElementCls[els[i]].push(cls);
+                    }
+                }
+            }
+        }
+    },
+
+    
+    removeUIFromElement: function() {
+        var me = this,
+            frameElementCls = me.frameElementCls;
+
+        me.removeCls(me.baseCls + '-' + me.ui);
+
+        if (me.frame && !Ext.supports.CSS3BorderRadius) {
+            
+            var els = ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'],
+                i, j, el, cls;
+
+            
+            for (i = 0; i < els.length; i++) {
+                el = me['frame' + els[i].toUpperCase()];
+                cls = me.baseCls + '-' + me.ui + '-' + els[i];
+
+                if (el) {
+                    el.removeCls(cls);
+                } else {
+                    Ext.Array.remove(frameElementCls[els[i]], cls);
+                }
+            }
+        }
+    },
+
+    getElConfig : function() {
+        if (Ext.isString(this.autoEl)) {
+            this.autoEl = {
+                tag: this.autoEl
+            };
+        }
+
+        var result = this.autoEl || {tag: 'div'};
+        result.id = this.id;
+        return result;
+    },
+
+    
+    getInsertPosition: function(position) {
+        
+        if (position !== undefined) {
+            if (Ext.isNumber(position)) {
+                position = this.container.dom.childNodes[position];
+            }
+            else {
+                position = Ext.getDom(position);
+            }
+        }
+
+        return position;
+    },
+
+    
+    initContainer: function(container) {
+        var me = this;
+
+        
+        
+        
+        if (!container && me.el) {
+            container = me.el.dom.parentNode;
+            me.allowDomMove = false;
+        }
+
+        me.container = Ext.get(container);
+
+        if (me.ctCls) {
+            me.container.addCls(me.ctCls);
+        }
+
+        return me.container;
+    },
+
+    
+    initRenderData: function() {
+        var me = this;
+
+        return Ext.applyIf(me.renderData, {
+            id: me.id,
+            ui: me.ui,
+            uiCls: me.uiCls,
+            baseCls: me.baseCls,
+            componentCls: me.componentCls,
+            frame: me.frame
+        });
+    },
+
+    
+    getTpl: function(name) {
+        var me = this,
+            prototype = me.self.prototype,
+            ownerPrototype,
+            tpl;
+
+        if (me.hasOwnProperty(name)) {
+            tpl = me[name];
+            if (tpl && !(tpl instanceof Ext.XTemplate)) {
+                me[name] = Ext.ClassManager.dynInstantiate('Ext.XTemplate', tpl);
+            }
+
+            return me[name];
+        }
+
+        if (!(prototype[name] instanceof Ext.XTemplate)) {
+            ownerPrototype = prototype;
+
+            do {
+                if (ownerPrototype.hasOwnProperty(name)) {
+                    tpl = ownerPrototype[name];
+                    if (tpl && !(tpl instanceof Ext.XTemplate)) {
+                        ownerPrototype[name] = Ext.ClassManager.dynInstantiate('Ext.XTemplate', tpl);
+                        break;
+                    }
+                }
+
+                ownerPrototype = ownerPrototype.superclass;
+            } while (ownerPrototype);
+        }
+
+        return prototype[name];
+    },
+
+    
+    initRenderTpl: function() {
+        return this.getTpl('renderTpl');
+    },
+
+    
+    initStyles: function() {
+        var style = {},
+            me = this,
+            Element = Ext.Element;
+
+        if (Ext.isString(me.style)) {
+            style = Element.parseStyles(me.style);
+        } else {
+            style = Ext.apply({}, me.style);
+        }
+
+        
+        
+        if (me.padding !== undefined) {
+            style.padding = Element.unitizeBox((me.padding === true) ? 5 : me.padding);
+        }
+
+        if (me.margin !== undefined) {
+            style.margin = Element.unitizeBox((me.margin === true) ? 5 : me.margin);
+        }
+
+        delete me.style;
+        return style;
+    },
+
+    
+    initContent: function() {
+        var me = this,
+            target = me.getTargetEl(),
+            contentEl,
+            pre;
+
+        if (me.html) {
+            target.update(Ext.DomHelper.markup(me.html));
+            delete me.html;
+        }
+
+        if (me.contentEl) {
+            contentEl = Ext.get(me.contentEl);
+            pre = Ext.baseCSSPrefix;
+            contentEl.removeCls([pre + 'hidden', pre + 'hide-display', pre + 'hide-offsets', pre + 'hide-nosize']);
+            target.appendChild(contentEl.dom);
+        }
+
+        if (me.tpl) {
+            
+            if (!me.tpl.isTemplate) {
+                me.tpl = Ext.create('Ext.XTemplate', me.tpl);
+            }
+
+            if (me.data) {
+                me.tpl[me.tplWriteMode](target, me.data);
+                delete me.data;
+            }
+        }
+    },
+
+    
+    initEvents : function() {
+        var me = this,
+            afterRenderEvents = me.afterRenderEvents,
+            el,
+            property,
+            fn = function(listeners){
+                me.mon(el, listeners);
+            };
+        if (afterRenderEvents) {
+            for (property in afterRenderEvents) {
+                if (afterRenderEvents.hasOwnProperty(property)) {
+                    el = me[property];
+                    if (el && el.on) {
+                        Ext.each(afterRenderEvents[property], fn);
+                    }
+                }
+            }
+        }
+    },
+
+    
+    addChildEls: function () {
+        var me = this,
+            childEls = me.childEls || (me.childEls = []);
+
+        childEls.push.apply(childEls, arguments);
+    },
+
+    
+    removeChildEls: function (testFn) {
+        var me = this,
+            old = me.childEls,
+            keepers = (me.childEls = []),
+            n, i, cel;
+
+        for (i = 0, n = old.length; i < n; ++i) {
+            cel = old[i];
+            if (!testFn(cel)) {
+                keepers.push(cel);
+            }
+        }
+    },
+
+    
+    applyRenderSelectors: function() {
+        var me = this,
+            childEls = me.childEls,
+            selectors = me.renderSelectors,
+            el = me.el,
+            dom = el.dom,
+            baseId, childName, childId, i, selector;
+
+        if (childEls) {
+            baseId = me.id + '-';
+            for (i = childEls.length; i--; ) {
+                childName = childId = childEls[i];
+                if (typeof(childName) != 'string') {
+                    childId = childName.id || (baseId + childName.itemId);
+                    childName = childName.name;
+                } else {
+                    childId = baseId + childId;
+                }
+
+                
+                
+                me[childName] = el.getById(childId);
+            }
+        }
+
+        
+        
+        
+        if (selectors) {
+            for (selector in selectors) {
+                if (selectors.hasOwnProperty(selector) && selectors[selector]) {
+                    me[selector] = Ext.get(Ext.DomQuery.selectNode(selectors[selector], dom));
+                }
+            }
+        }
+    },
+
+    
+    is: function(selector) {
+        return Ext.ComponentQuery.is(this, selector);
+    },
+
+    
+    up: function(selector) {
+        var result = this.ownerCt;
+        if (selector) {
+            for (; result; result = result.ownerCt) {
+                if (Ext.ComponentQuery.is(result, selector)) {
+                    return result;
+                }
+            }
+        }
+        return result;
+    },
+
+    
+    nextSibling: function(selector) {
+        var o = this.ownerCt, it, last, idx, c;
+        if (o) {
+            it = o.items;
+            idx = it.indexOf(this) + 1;
+            if (idx) {
+                if (selector) {
+                    for (last = it.getCount(); idx < last; idx++) {
+                        if ((c = it.getAt(idx)).is(selector)) {
+                            return c;
+                        }
+                    }
+                } else {
+                    if (idx < it.getCount()) {
+                        return it.getAt(idx);
+                    }
+                }
+            }
+        }
+        return null;
+    },
+
+    
+    previousSibling: function(selector) {
+        var o = this.ownerCt, it, idx, c;
+        if (o) {
+            it = o.items;
+            idx = it.indexOf(this);
+            if (idx != -1) {
+                if (selector) {
+                    for (--idx; idx >= 0; idx--) {
+                        if ((c = it.getAt(idx)).is(selector)) {
+                            return c;
+                        }
+                    }
+                } else {
+                    if (idx) {
+                        return it.getAt(--idx);
+                    }
+                }
+            }
+        }
+        return null;
+    },
+
+    
+    previousNode: function(selector, includeSelf) {
+        var node = this,
+            result,
+            it, len, i;
+
+        
+        if (includeSelf && node.is(selector)) {
+            return node;
+        }
+
+        result = this.prev(selector);
+        if (result) {
+            return result;
+        }
+
+        if (node.ownerCt) {
+            for (it = node.ownerCt.items.items, i = Ext.Array.indexOf(it, node) - 1; i > -1; i--) {
+                if (it[i].query) {
+                    result = it[i].query(selector);
+                    result = result[result.length - 1];
+                    if (result) {
+                        return result;
+                    }
+                }
+            }
+            return node.ownerCt.previousNode(selector, true);
+        }
+    },
+
+    
+    nextNode: function(selector, includeSelf) {
+        var node = this,
+            result,
+            it, len, i;
+
+        
+        if (includeSelf && node.is(selector)) {
+            return node;
+        }
+
+        result = this.next(selector);
+        if (result) {
+            return result;
+        }
+
+        if (node.ownerCt) {
+            for (it = node.ownerCt.items, i = it.indexOf(node) + 1, it = it.items, len = it.length; i < len; i++) {
+                if (it[i].down) {
+                    result = it[i].down(selector);
+                    if (result) {
+                        return result;
+                    }
+                }
+            }
+            return node.ownerCt.nextNode(selector);
+        }
+    },
+
+    
+    getId : function() {
+        return this.id || (this.id = 'ext-comp-' + (this.getAutoId()));
+    },
+
+    getItemId : function() {
+        return this.itemId || this.id;
+    },
+
+    
+    getEl : function() {
+        return this.el;
+    },
+
+    
+    getTargetEl: function() {
+        return this.frameBody || this.el;
+    },
+
+    
+    isXType: function(xtype, shallow) {
+        
+        if (Ext.isFunction(xtype)) {
+            xtype = xtype.xtype;
+            
+        } else if (Ext.isObject(xtype)) {
+            xtype = xtype.statics().xtype;
+            
+        }
+
+        return !shallow ? ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1: this.self.xtype == xtype;
+    },
+
+    
+    getXTypes: function() {
+        var self = this.self,
+            xtypes, parentPrototype, parentXtypes;
+
+        if (!self.xtypes) {
+            xtypes = [];
+            parentPrototype = this;
+
+            while (parentPrototype) {
+                parentXtypes = parentPrototype.xtypes;
+
+                if (parentXtypes !== undefined) {
+                    xtypes.unshift.apply(xtypes, parentXtypes);
+                }
+
+                parentPrototype = parentPrototype.superclass;
+            }
+
+            self.xtypeChain = xtypes;
+            self.xtypes = xtypes.join('/');
+        }
+
+        return self.xtypes;
+    },
+
+    
+    update : function(htmlOrData, loadScripts, cb) {
+        var me = this;
+
+        if (me.tpl && !Ext.isString(htmlOrData)) {
+            me.data = htmlOrData;
+            if (me.rendered) {
+                me.tpl[me.tplWriteMode](me.getTargetEl(), htmlOrData || {});
+            }
+        } else {
+            me.html = Ext.isObject(htmlOrData) ? Ext.DomHelper.markup(htmlOrData) : htmlOrData;
+            if (me.rendered) {
+                me.getTargetEl().update(me.html, loadScripts, cb);
+            }
+        }
+
+        if (me.rendered) {
+            me.doComponentLayout();
+        }
+    },
+
+    
+    setVisible : function(visible) {
+        return this[visible ? 'show': 'hide']();
+    },
+
+    
+    isVisible: function(deep) {
+        var me = this,
+            child = me,
+            visible = !me.hidden,
+            ancestor = me.ownerCt;
+
+        
+        me.hiddenAncestor = false;
+        if (me.destroyed) {
+            return false;
+        }
+
+        if (deep && visible && me.rendered && ancestor) {
+            while (ancestor) {
+                
+                
+                
+                
+                if (ancestor.hidden || (ancestor.collapsed &&
+                        !(ancestor.getDockedItems && Ext.Array.contains(ancestor.getDockedItems(), child)))) {
+                    
+                    me.hiddenAncestor = ancestor;
+                    visible = false;
+                    break;
+                }
+                child = ancestor;
+                ancestor = ancestor.ownerCt;
+            }
+        }
+        return visible;
+    },
+
+    
+    enable: function(silent) {
+        var me = this;
+
+        if (me.rendered) {
+            me.el.removeCls(me.disabledCls);
+            me.el.dom.disabled = false;
+            me.onEnable();
+        }
+
+        me.disabled = false;
+
+        if (silent !== true) {
+            me.fireEvent('enable', me);
+        }
+
+        return me;
+    },
+
+    
+    disable: function(silent) {
+        var me = this;
+
+        if (me.rendered) {
+            me.el.addCls(me.disabledCls);
+            me.el.dom.disabled = true;
+            me.onDisable();
+        }
+
+        me.disabled = true;
+
+        if (silent !== true) {
+            me.fireEvent('disable', me);
+        }
+
+        return me;
+    },
+
+    
+    onEnable: function() {
+        if (this.maskOnDisable) {
+            this.el.unmask();
+        }
+    },
+
+    
+    onDisable : function() {
+        if (this.maskOnDisable) {
+            this.el.mask();
+        }
+    },
+
+    
+    isDisabled : function() {
+        return this.disabled;
+    },
+
+    
+    setDisabled : function(disabled) {
+        return this[disabled ? 'disable': 'enable']();
+    },
+
+    
+    isHidden : function() {
+        return this.hidden;
+    },
+
+    
+    addCls : function(className) {
+        var me = this;
+        if (!className) {
+            return me;
+        }
+        if (!Ext.isArray(className)){
+            className = className.replace(me.trimRe, '').split(me.spacesRe);
+        }
+        if (me.rendered) {
+            me.el.addCls(className);
+        }
+        else {
+            me.additionalCls = Ext.Array.unique(me.additionalCls.concat(className));
+        }
+        return me;
+    },
+
+    
+    addClass : function() {
+        return this.addCls.apply(this, arguments);
+    },
+
+    
+    removeCls : function(className) {
+        var me = this;
+
+        if (!className) {
+            return me;
+        }
+        if (!Ext.isArray(className)){
+            className = className.replace(me.trimRe, '').split(me.spacesRe);
+        }
+        if (me.rendered) {
+            me.el.removeCls(className);
+        }
+        else if (me.additionalCls.length) {
+            Ext.each(className, function(cls) {
+                Ext.Array.remove(me.additionalCls, cls);
+            });
+        }
+        return me;
+    },
+
+
+    addOverCls: function() {
+        var me = this;
+        if (!me.disabled) {
+            me.el.addCls(me.overCls);
+        }
+    },
+
+    removeOverCls: function() {
+        this.el.removeCls(this.overCls);
+    },
+
+    addListener : function(element, listeners, scope, options) {
+        var me = this,
+            fn,
+            option;
+
+        if (Ext.isString(element) && (Ext.isObject(listeners) || options && options.element)) {
+            if (options.element) {
+                fn = listeners;
+
+                listeners = {};
+                listeners[element] = fn;
+                element = options.element;
+                if (scope) {
+                    listeners.scope = scope;
+                }
+
+                for (option in options) {
+                    if (options.hasOwnProperty(option)) {
+                        if (me.eventOptionsRe.test(option)) {
+                            listeners[option] = options[option];
+                        }
+                    }
+                }
+            }
+
+            
+            
+            if (me[element] && me[element].on) {
+                me.mon(me[element], listeners);
+            } else {
+                me.afterRenderEvents = me.afterRenderEvents || {};
+                if (!me.afterRenderEvents[element]) {
+                    me.afterRenderEvents[element] = [];
+                }
+                me.afterRenderEvents[element].push(listeners);
+            }
+        }
+
+        return me.mixins.observable.addListener.apply(me, arguments);
+    },
+
+    
+    removeManagedListenerItem: function(isClear, managedListener, item, ename, fn, scope){
+        var me = this,
+            element = managedListener.options ? managedListener.options.element : null;
+
+        if (element) {
+            element = me[element];
+            if (element && element.un) {
+                if (isClear || (managedListener.item === item && managedListener.ename === ename && (!fn || managedListener.fn === fn) && (!scope || managedListener.scope === scope))) {
+                    element.un(managedListener.ename, managedListener.fn, managedListener.scope);
+                    if (!isClear) {
+                        Ext.Array.remove(me.managedListeners, managedListener);
+                    }
+                }
+            }
+        } else {
+            return me.mixins.observable.removeManagedListenerItem.apply(me, arguments);
+        }
+    },
+
+    
+    getBubbleTarget : function() {
+        return this.ownerCt;
+    },
+
+    
+    isFloating : function() {
+        return this.floating;
+    },
+
+    
+    isDraggable : function() {
+        return !!this.draggable;
+    },
+
+    
+    isDroppable : function() {
+        return !!this.droppable;
+    },
+
+    
+    onAdded : function(container, pos) {
+        this.ownerCt = container;
+        this.fireEvent('added', this, container, pos);
+    },
+
+    
+    onRemoved : function() {
+        var me = this;
+
+        me.fireEvent('removed', me, me.ownerCt);
+        delete me.ownerCt;
+    },
+
+    
+    beforeDestroy : Ext.emptyFn,
+    
+    
+    onResize : Ext.emptyFn,
+
+    
+    setSize : function(width, height) {
+        var me = this,
+            layoutCollection;
+
+        
+        if (Ext.isObject(width)) {
+            height = width.height;
+            width  = width.width;
+        }
+
+        
+        if (Ext.isNumber(width)) {
+            width = Ext.Number.constrain(width, me.minWidth, me.maxWidth);
+        }
+        if (Ext.isNumber(height)) {
+            height = Ext.Number.constrain(height, me.minHeight, me.maxHeight);
+        }
+
+        if (!me.rendered || !me.isVisible()) {
+            
+            if (me.hiddenAncestor) {
+                layoutCollection = me.hiddenAncestor.layoutOnShow;
+                layoutCollection.remove(me);
+                layoutCollection.add(me);
+            }
+            me.needsLayout = {
+                width: width,
+                height: height,
+                isSetSize: true
+            };
+            if (!me.rendered) {
+                me.width  = (width !== undefined) ? width : me.width;
+                me.height = (height !== undefined) ? height : me.height;
+            }
+            return me;
+        }
+        me.doComponentLayout(width, height, true);
+
+        return me;
+    },
+
+    isFixedWidth: function() {
+        var me = this,
+            layoutManagedWidth = me.layoutManagedWidth;
+
+        if (Ext.isDefined(me.width) || layoutManagedWidth == 1) {
+            return true;
+        }
+        if (layoutManagedWidth == 2) {
+            return false;
+        }
+        return (me.ownerCt && me.ownerCt.isFixedWidth());
+    },
+
+    isFixedHeight: function() {
+        var me = this,
+            layoutManagedHeight = me.layoutManagedHeight;
+
+        if (Ext.isDefined(me.height) || layoutManagedHeight == 1) {
+            return true;
+        }
+        if (layoutManagedHeight == 2) {
+            return false;
+        }
+        return (me.ownerCt && me.ownerCt.isFixedHeight());
+    },
+
+    setCalculatedSize : function(width, height, callingContainer) {
+        var me = this,
+            layoutCollection;
+
+        
+        if (Ext.isObject(width)) {
+            callingContainer = width.ownerCt;
+            height = width.height;
+            width  = width.width;
+        }
+
+        
+        if (Ext.isNumber(width)) {
+            width = Ext.Number.constrain(width, me.minWidth, me.maxWidth);
+        }
+        if (Ext.isNumber(height)) {
+            height = Ext.Number.constrain(height, me.minHeight, me.maxHeight);
+        }
+
+        if (!me.rendered || !me.isVisible()) {
+            
+            if (me.hiddenAncestor) {
+                layoutCollection = me.hiddenAncestor.layoutOnShow;
+                layoutCollection.remove(me);
+                layoutCollection.add(me);
+            }
+            me.needsLayout = {
+                width: width,
+                height: height,
+                isSetSize: false,
+                ownerCt: callingContainer
+            };
+            return me;
+        }
+        me.doComponentLayout(width, height, false, callingContainer);
+
+        return me;
+    },
+
+    
+    doComponentLayout : function(width, height, isSetSize, callingContainer) {
+        var me = this,
+            componentLayout = me.getComponentLayout(),
+            lastComponentSize = componentLayout.lastComponentSize || {
+                width: undefined,
+                height: undefined
+            };
+
+        
+        
+        
+        if (me.rendered && componentLayout) {
+            
+            if (!Ext.isDefined(width)) {
+                if (me.isFixedWidth()) {
+                    width = Ext.isDefined(me.width) ? me.width : lastComponentSize.width;
+                }
+            }
+            
+            if (!Ext.isDefined(height)) {
+                if (me.isFixedHeight()) {
+                    height = Ext.isDefined(me.height) ? me.height : lastComponentSize.height;
+                }
+            }
+
+            if (isSetSize) {
+                me.width = width;
+                me.height = height;
+            }
+
+            componentLayout.layout(width, height, isSetSize, callingContainer);
+        }
+
+        return me;
+    },
+
+    
+    forceComponentLayout: function () {
+        this.doComponentLayout();
+    },
+
+    
+    setComponentLayout : function(layout) {
+        var currentLayout = this.componentLayout;
+        if (currentLayout && currentLayout.isLayout && currentLayout != layout) {
+            currentLayout.setOwner(null);
+        }
+        this.componentLayout = layout;
+        layout.setOwner(this);
+    },
+
+    getComponentLayout : function() {
+        var me = this;
+
+        if (!me.componentLayout || !me.componentLayout.isLayout) {
+            me.setComponentLayout(Ext.layout.Layout.create(me.componentLayout, 'autocomponent'));
+        }
+        return me.componentLayout;
+    },
+
+    
+    afterComponentLayout: function(width, height, isSetSize, callingContainer) {
+        var me = this,
+            layout = me.componentLayout,
+            oldSize = me.preLayoutSize;
+
+        ++me.componentLayoutCounter;
+        if (!oldSize || ((width !== oldSize.width) || (height !== oldSize.height))) {
+            me.fireEvent('resize', me, width, height);
+        }
+    },
+
+    
+    beforeComponentLayout: function(width, height, isSetSize, callingContainer) {
+        this.preLayoutSize = this.componentLayout.lastComponentSize;
+        return true;
+    },
+
+    
+    setPosition : function(x, y) {
+        var me = this;
+
+        if (Ext.isObject(x)) {
+            y = x.y;
+            x = x.x;
+        }
+
+        if (!me.rendered) {
+            return me;
+        }
+
+        if (x !== undefined || y !== undefined) {
+            me.el.setBox(x, y);
+            me.onPosition(x, y);
+            me.fireEvent('move', me, x, y);
+        }
+        return me;
+    },
+
+    
+    onPosition: Ext.emptyFn,
+
+    
+    setWidth : function(width) {
+        return this.setSize(width);
+    },
+
+    
+    setHeight : function(height) {
+        return this.setSize(undefined, height);
+    },
+
+    
+    getSize : function() {
+        return this.el.getSize();
+    },
+
+    
+    getWidth : function() {
+        return this.el.getWidth();
+    },
+
+    
+    getHeight : function() {
+        return this.el.getHeight();
+    },
+
+    
+    getLoader: function(){
+        var me = this,
+            autoLoad = me.autoLoad ? (Ext.isObject(me.autoLoad) ? me.autoLoad : {url: me.autoLoad}) : null,
+            loader = me.loader || autoLoad;
+
+        if (loader) {
+            if (!loader.isLoader) {
+                me.loader = Ext.create('Ext.ComponentLoader', Ext.apply({
+                    target: me,
+                    autoLoad: autoLoad
+                }, loader));
+            } else {
+                loader.setTarget(me);
+            }
+            return me.loader;
+
+        }
+        return null;
+    },
+
+    
+    setLoading : function(load, targetEl) {
+        var me = this,
+            config;
+
+        if (me.rendered) {
+            if (load !== false && !me.collapsed) {
+                if (Ext.isObject(load)) {
+                    config = load;
+                }
+                else if (Ext.isString(load)) {
+                    config = {msg: load};
+                }
+                else {
+                    config = {};
+                }
+                me.loadMask = me.loadMask || Ext.create('Ext.LoadMask', targetEl ? me.getTargetEl() : me.el, config);
+                me.loadMask.show();
+            } else if (me.loadMask) {
+                Ext.destroy(me.loadMask);
+                me.loadMask = null;
+            }
+        }
+
+        return me.loadMask;
+    },
+
+    
+    setDocked : function(dock, layoutParent) {
+        var me = this;
+
+        me.dock = dock;
+        if (layoutParent && me.ownerCt && me.rendered) {
+            me.ownerCt.doComponentLayout();
+        }
+        return me;
+    },
+
+    onDestroy : function() {
+        var me = this;
+
+        if (me.monitorResize && Ext.EventManager.resizeEvent) {
+            Ext.EventManager.resizeEvent.removeListener(me.setSize, me);
+        }
+        
+        Ext.destroy(
+            me.componentLayout,
+            me.loadMask,
+            me.floatingItems
+        );
+    },
+
+    
+    cleanElementRefs: function(){
+        var me = this,
+            i = 0,
+            childEls = me.childEls,
+            selectors = me.renderSelectors,
+            selector,
+            name,
+            len;
+
+        if (me.rendered) {
+            if (childEls) {
+                for (len = childEls.length; i < len; ++i) {
+                    name = childEls[i];
+                    if (typeof(name) != 'string') {
+                        name = name.name;
+                    }
+                    delete me[name];
+                }
+            }
+
+            if (selectors) {
+                for (selector in selectors) {
+                    if (selectors.hasOwnProperty(selector)) {
+                        delete me[selector];
+                    }
+                }
+            }
+        }
+        delete me.rendered;
+        delete me.el;
+        delete me.frameBody;
+    },
+
+    
+    destroy : function() {
+        var me = this;
+
+        if (!me.isDestroyed) {
+            if (me.fireEvent('beforedestroy', me) !== false) {
+                me.destroying = true;
+                me.beforeDestroy();
+
+                if (me.floating) {
+                    delete me.floatParent;
+                    
+                    
+                    if (me.zIndexManager) {
+                        me.zIndexManager.unregister(me);
+                    }
+                } else if (me.ownerCt && me.ownerCt.remove) {
+                    me.ownerCt.remove(me, false);
+                }
+
+                me.onDestroy();
+
+                
+                Ext.destroy(me.plugins);
+
+                if (me.rendered) {
+                    me.el.remove();
+                }
+
+                me.fireEvent('destroy', me);
+                Ext.ComponentManager.unregister(me);
+
+                me.mixins.state.destroy.call(me);
+
+                me.clearListeners();
+                
+                me.cleanElementRefs();
+                me.destroying = false;
+                me.isDestroyed = true;
+            }
+        }
+    },
+
+    
+    getPlugin: function(pluginId) {
+        var i = 0,
+            plugins = this.plugins,
+            ln = plugins.length;
+        for (; i < ln; i++) {
+            if (plugins[i].pluginId === pluginId) {
+                return plugins[i];
+            }
+        }
+    },
+
+    
+    isDescendantOf: function(container) {
+        return !!this.findParentBy(function(p){
+            return p === container;
+        });
+    }
+}, function() {
+    this.createAlias({
+        on: 'addListener',
+        prev: 'previousSibling',
+        next: 'nextSibling'
+    });
+});
+
+
+Ext.define('Ext.AbstractPlugin', {
+    disabled: false,
+
+    constructor: function(config) {
+        Ext.apply(this, config);
+    },
+
+    getCmp: function() {
+        return this.cmp;
+    },
+
+    
+    init: Ext.emptyFn,
+
+    
+    destroy: Ext.emptyFn,
+
+    
+    enable: function() {
+        this.disabled = false;
+    },
+
+    
+    disable: function() {
+        this.disabled = true;
+    }
+});
+
+Ext.define('Ext.data.Connection', {
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    statics: {
+        requestId: 0
+    },
+
+    url: null,
+    async: true,
+    method: null,
+    username: '',
+    password: '',
+
+    
+    disableCaching: true,
+
+    
+    withCredentials: false,
+
+    
+    cors: false,
+
+    
+    disableCachingParam: '_dc',
+
+    
+    timeout : 30000,
+
+    
+
+    useDefaultHeader : true,
+    defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8',
+    useDefaultXhrHeader : true,
+    defaultXhrHeader : 'XMLHttpRequest',
+
+    constructor : function(config) {
+        config = config || {};
+        Ext.apply(this, config);
+
+        this.addEvents(
+            
+            'beforerequest',
+            
+            'requestcomplete',
+            
+            'requestexception'
+        );
+        this.requests = {};
+        this.mixins.observable.constructor.call(this);
+    },
+
+    
+    request : function(options) {
+        options = options || {};
+        var me = this,
+            scope = options.scope || window,
+            username = options.username || me.username,
+            password = options.password || me.password || '',
+            async,
+            requestOptions,
+            request,
+            headers,
+            xhr;
+
+        if (me.fireEvent('beforerequest', me, options) !== false) {
+
+            requestOptions = me.setOptions(options, scope);
+
+            if (this.isFormUpload(options) === true) {
+                this.upload(options.form, requestOptions.url, requestOptions.data, options);
+                return null;
+            }
+
+            
+            if (options.autoAbort === true || me.autoAbort) {
+                me.abort();
+            }
+
+            
+
+            if ((options.cors === true || me.cors === true) && Ext.isIe && Ext.ieVersion >= 8) {
+                xhr = new XDomainRequest();
+            } else {
+                xhr = this.getXhrInstance();
+            }
+
+            async = options.async !== false ? (options.async || me.async) : false;
+
+            
+            if (username) {
+                xhr.open(requestOptions.method, requestOptions.url, async, username, password);
+            } else {
+                xhr.open(requestOptions.method, requestOptions.url, async);
+            }
+
+            if (options.withCredentials === true || me.withCredentials === true) {
+                xhr.withCredentials = true;
+            }
+
+            headers = me.setupHeaders(xhr, options, requestOptions.data, requestOptions.params);
+
+            
+            request = {
+                id: ++Ext.data.Connection.requestId,
+                xhr: xhr,
+                headers: headers,
+                options: options,
+                async: async,
+                timeout: setTimeout(function() {
+                    request.timedout = true;
+                    me.abort(request);
+                }, options.timeout || me.timeout)
+            };
+            me.requests[request.id] = request;
+            me.latestId = request.id;
+            
+            if (async) {
+                xhr.onreadystatechange = Ext.Function.bind(me.onStateChange, me, [request]);
+            }
+
+            
+            xhr.send(requestOptions.data);
+            if (!async) {
+                return this.onComplete(request);
+            }
+            return request;
+        } else {
+            Ext.callback(options.callback, options.scope, [options, undefined, undefined]);
+            return null;
+        }
+    },
+
+    
+    upload: function(form, url, params, options) {
+        form = Ext.getDom(form);
+        options = options || {};
+
+        var id = Ext.id(),
+                frame = document.createElement('iframe'),
+                hiddens = [],
+                encoding = 'multipart/form-data',
+                buf = {
+                    target: form.target,
+                    method: form.method,
+                    encoding: form.encoding,
+                    enctype: form.enctype,
+                    action: form.action
+                }, hiddenItem;
+
+        
+        Ext.fly(frame).set({
+            id: id,
+            name: id,
+            cls: Ext.baseCSSPrefix + 'hide-display',
+            src: Ext.SSL_SECURE_URL
+        });
+
+        document.body.appendChild(frame);
+
+        
+        if (document.frames) {
+           document.frames[id].name = id;
+        }
+
+        Ext.fly(form).set({
+            target: id,
+            method: 'POST',
+            enctype: encoding,
+            encoding: encoding,
+            action: url || buf.action
+        });
+
+        
+        if (params) {
+            Ext.iterate(Ext.Object.fromQueryString(params), function(name, value){
+                hiddenItem = document.createElement('input');
+                Ext.fly(hiddenItem).set({
+                    type: 'hidden',
+                    value: value,
+                    name: name
+                });
+                form.appendChild(hiddenItem);
+                hiddens.push(hiddenItem);
+            });
+        }
+
+        Ext.fly(frame).on('load', Ext.Function.bind(this.onUploadComplete, this, [frame, options]), null, {single: true});
+        form.submit();
+
+        Ext.fly(form).set(buf);
+        Ext.each(hiddens, function(h) {
+            Ext.removeNode(h);
+        });
+    },
+
+    
+    onUploadComplete: function(frame, options) {
+        var me = this,
+            
+            response = {
+                responseText: '',
+                responseXML: null
+            }, doc, firstChild;
+
+        try {
+            doc = frame.contentWindow.document || frame.contentDocument || window.frames[frame.id].document;
+            if (doc) {
+                if (doc.body) {
+                    if (/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)) { 
+                        response.responseText = firstChild.value;
+                    } else {
+                        response.responseText = doc.body.innerHTML;
+                    }
+                }
+                
+                response.responseXML = doc.XMLDocument || doc;
+            }
+        } catch (e) {
+        }
+
+        me.fireEvent('requestcomplete', me, response, options);
+
+        Ext.callback(options.success, options.scope, [response, options]);
+        Ext.callback(options.callback, options.scope, [options, true, response]);
+
+        setTimeout(function(){
+            Ext.removeNode(frame);
+        }, 100);
+    },
+
+    
+    isFormUpload: function(options){
+        var form = this.getForm(options);
+        if (form) {
+            return (options.isUpload || (/multipart\/form-data/i).test(form.getAttribute('enctype')));
+        }
+        return false;
+    },
+
+    
+    getForm: function(options){
+        return Ext.getDom(options.form) || null;
+    },
+
+    
+    setOptions: function(options, scope){
+        var me =  this,
+            params = options.params || {},
+            extraParams = me.extraParams,
+            urlParams = options.urlParams,
+            url = options.url || me.url,
+            jsonData = options.jsonData,
+            method,
+            disableCache,
+            data;
+
+
+        
+        if (Ext.isFunction(params)) {
+            params = params.call(scope, options);
+        }
+
+        
+        if (Ext.isFunction(url)) {
+            url = url.call(scope, options);
+        }
+
+        url = this.setupUrl(options, url);
+
+
+        
+        data = options.rawData || options.xmlData || jsonData || null;
+        if (jsonData && !Ext.isPrimitive(jsonData)) {
+            data = Ext.encode(data);
+        }
+
+        
+        if (Ext.isObject(params)) {
+            params = Ext.Object.toQueryString(params);
+        }
+
+        if (Ext.isObject(extraParams)) {
+            extraParams = Ext.Object.toQueryString(extraParams);
+        }
+
+        params = params + ((extraParams) ? ((params) ? '&' : '') + extraParams : '');
+
+        urlParams = Ext.isObject(urlParams) ? Ext.Object.toQueryString(urlParams) : urlParams;
+
+        params = this.setupParams(options, params);
+
+        
+        method = (options.method || me.method || ((params || data) ? 'POST' : 'GET')).toUpperCase();
+        this.setupMethod(options, method);
+
+
+        disableCache = options.disableCaching !== false ? (options.disableCaching || me.disableCaching) : false;
+        
+        if (method === 'GET' && disableCache) {
+            url = Ext.urlAppend(url, (options.disableCachingParam || me.disableCachingParam) + '=' + (new Date().getTime()));
+        }
+
+        
+        if ((method == 'GET' || data) && params) {
+            url = Ext.urlAppend(url, params);
+            params = null;
+        }
+
+        
+        if (urlParams) {
+            url = Ext.urlAppend(url, urlParams);
+        }
+
+        return {
+            url: url,
+            method: method,
+            data: data || params || null
+        };
+    },
+
+    
+    setupUrl: function(options, url){
+        var form = this.getForm(options);
+        if (form) {
+            url = url || form.action;
+        }
+        return url;
+    },
+
+
+    
+    setupParams: function(options, params) {
+        var form = this.getForm(options),
+            serializedForm;
+        if (form && !this.isFormUpload(options)) {
+            serializedForm = Ext.Element.serializeForm(form);
+            params = params ? (params + '&' + serializedForm) : serializedForm;
+        }
+        return params;
+    },
+
+    
+    setupMethod: function(options, method){
+        if (this.isFormUpload(options)) {
+            return 'POST';
+        }
+        return method;
+    },
+
+    
+    setupHeaders: function(xhr, options, data, params){
+        var me = this,
+            headers = Ext.apply({}, options.headers || {}, me.defaultHeaders || {}),
+            contentType = me.defaultPostHeader,
+            jsonData = options.jsonData,
+            xmlData = options.xmlData,
+            key,
+            header;
+
+        if (!headers['Content-Type'] && (data || params)) {
+            if (data) {
+                if (options.rawData) {
+                    contentType = 'text/plain';
+                } else {
+                    if (xmlData && Ext.isDefined(xmlData)) {
+                        contentType = 'text/xml';
+                    } else if (jsonData && Ext.isDefined(jsonData)) {
+                        contentType = 'application/json';
+                    }
+                }
+            }
+            headers['Content-Type'] = contentType;
+        }
+
+        if (me.useDefaultXhrHeader && !headers['X-Requested-With']) {
+            headers['X-Requested-With'] = me.defaultXhrHeader;
+        }
+        
+        try{
+            for (key in headers) {
+                if (headers.hasOwnProperty(key)) {
+                    header = headers[key];
+                    xhr.setRequestHeader(key, header);
+                }
+
+            }
+        } catch(e) {
+            me.fireEvent('exception', key, header);
+        }
+        return headers;
+    },
+
+    
+    getXhrInstance: (function(){
+        var options = [function(){
+            return new XMLHttpRequest();
+        }, function(){
+            return new ActiveXObject('MSXML2.XMLHTTP.3.0');
+        }, function(){
+            return new ActiveXObject('MSXML2.XMLHTTP');
+        }, function(){
+            return new ActiveXObject('Microsoft.XMLHTTP');
+        }], i = 0,
+            len = options.length,
+            xhr;
+
+        for(; i < len; ++i) {
+            try{
+                xhr = options[i];
+                xhr();
+                break;
+            }catch(e){}
+        }
+        return xhr;
+    })(),
+
+    
+    isLoading : function(request) {
+        if (!request) {
+            request = this.getLatest();
+        }
+        if (!(request && request.xhr)) {
+            return false;
+        }
+        
+        var state = request.xhr.readyState;
+        return !(state === 0 || state == 4);
+    },
+
+    
+    abort : function(request) {
+        var me = this;
+        
+        if (!request) {
+            request = me.getLatest();
+        }
+
+        if (request && me.isLoading(request)) {
+            
+            request.xhr.onreadystatechange = null;
+            request.xhr.abort();
+            me.clearTimeout(request);
+            if (!request.timedout) {
+                request.aborted = true;
+            }
+            me.onComplete(request);
+            me.cleanup(request);
+        }
+    },
+    
+    
+    abortAll: function(){
+        var requests = this.requests,
+            id;
+        
+        for (id in requests) {
+            if (requests.hasOwnProperty(id)) {
+                this.abort(requests[id]);
+            }
+        }
+    },
+    
+    
+    getLatest: function(){
+        var id = this.latestId,
+            request;
+            
+        if (id) {
+            request = this.requests[id];
+        }
+        return request || null;
+    },
+
+    
+    onStateChange : function(request) {
+        if (request.xhr.readyState == 4) {
+            this.clearTimeout(request);
+            this.onComplete(request);
+            this.cleanup(request);
+        }
+    },
+
+    
+    clearTimeout: function(request){
+        clearTimeout(request.timeout);
+        delete request.timeout;
+    },
+
+    
+    cleanup: function(request){
+        request.xhr = null;
+        delete request.xhr;
+    },
+
+    
+    onComplete : function(request) {
+        var me = this,
+            options = request.options,
+            result,
+            success,
+            response;
+
+        try {
+            result = me.parseStatus(request.xhr.status);
+        } catch (e) {
+            
+            result = {
+                success : false,
+                isException : false
+            };
+        }
+        success = result.success;
+
+        if (success) {
+            response = me.createResponse(request);
+            me.fireEvent('requestcomplete', me, response, options);
+            Ext.callback(options.success, options.scope, [response, options]);
+        } else {
+            if (result.isException || request.aborted || request.timedout) {
+                response = me.createException(request);
+            } else {
+                response = me.createResponse(request);
+            }
+            me.fireEvent('requestexception', me, response, options);
+            Ext.callback(options.failure, options.scope, [response, options]);
+        }
+        Ext.callback(options.callback, options.scope, [options, success, response]);
+        delete me.requests[request.id];
+        return response;
+    },
+
+    
+    parseStatus: function(status) {
+        
+        status = status == 1223 ? 204 : status;
+
+        var success = (status >= 200 && status < 300) || status == 304,
+            isException = false;
+
+        if (!success) {
+            switch (status) {
+                case 12002:
+                case 12029:
+                case 12030:
+                case 12031:
+                case 12152:
+                case 13030:
+                    isException = true;
+                    break;
+            }
+        }
+        return {
+            success: success,
+            isException: isException
+        };
+    },
+
+    
+    createResponse : function(request) {
+        var xhr = request.xhr,
+            headers = {},
+            lines = xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n'),
+            count = lines.length,
+            line, index, key, value, response;
+
+        while (count--) {
+            line = lines[count];
+            index = line.indexOf(':');
+            if(index >= 0) {
+                key = line.substr(0, index).toLowerCase();
+                if (line.charAt(index + 1) == ' ') {
+                    ++index;
+                }
+                headers[key] = line.substr(index + 1);
+            }
+        }
+
+        request.xhr = null;
+        delete request.xhr;
+
+        response = {
+            request: request,
+            requestId : request.id,
+            status : xhr.status,
+            statusText : xhr.statusText,
+            getResponseHeader : function(header){ return headers[header.toLowerCase()]; },
+            getAllResponseHeaders : function(){ return headers; },
+            responseText : xhr.responseText,
+            responseXML : xhr.responseXML
+        };
+
+        
+        
+        xhr = null;
+        return response;
+    },
+
+    
+    createException : function(request) {
+        return {
+            request : request,
+            requestId : request.id,
+            status : request.aborted ? -1 : 0,
+            statusText : request.aborted ? 'transaction aborted' : 'communication failure',
+            aborted: request.aborted,
+            timedout: request.timedout
+        };
+    }
+});
+
+
+Ext.define('Ext.Ajax', {
+    extend: 'Ext.data.Connection',
+    singleton: true,
+
+    
+    
+    
+    
+    
+    
+
+    
+
+    
+    
+    
+    
+    
+    
+
+    
+    autoAbort : false
+});
+
+Ext.define('Ext.ElementLoader', {
+
+    
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    uses: [
+        'Ext.data.Connection',
+        'Ext.Ajax'
+    ],
+
+    statics: {
+        Renderer: {
+            Html: function(loader, response, active){
+                loader.getTarget().update(response.responseText, active.scripts === true);
+                return true;
+            }
+        }
+    },
+
+    
+
+    
+    url: null,
+
+    
+    params: null,
+
+    
+    baseParams: null,
+
+    
+    autoLoad: false,
+
+    
+    target: null,
+
+    
+    loadMask: false,
+
+    
+    ajaxOptions: null,
+
+    
+    scripts: false,
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    isLoader: true,
+
+    constructor: function(config) {
+        var me = this,
+            autoLoad;
+
+        config = config || {};
+        Ext.apply(me, config);
+        me.setTarget(me.target);
+        me.addEvents(
+            
+            'beforeload',
+
+            
+            'exception',
+
+            
+            'load'
+        );
+
+        
+        me.mixins.observable.constructor.call(me);
+
+        if (me.autoLoad) {
+            autoLoad = me.autoLoad;
+            if (autoLoad === true) {
+                autoLoad = {};
+            }
+            me.load(autoLoad);
+        }
+    },
+
+    
+    setTarget: function(target){
+        var me = this;
+        target = Ext.get(target);
+        if (me.target && me.target != target) {
+            me.abort();
+        }
+        me.target = target;
+    },
+
+    
+    getTarget: function(){
+        return this.target || null;
+    },
+
+    
+    abort: function(){
+        var active = this.active;
+        if (active !== undefined) {
+            Ext.Ajax.abort(active.request);
+            if (active.mask) {
+                this.removeMask();
+            }
+            delete this.active;
+        }
+    },
+
+    
+    removeMask: function(){
+        this.target.unmask();
+    },
+
+    
+    addMask: function(mask){
+        this.target.mask(mask === true ? null : mask);
+    },
+
+    
+    load: function(options) {
+
+        options = Ext.apply({}, options);
+
+        var me = this,
+            target = me.target,
+            mask = Ext.isDefined(options.loadMask) ? options.loadMask : me.loadMask,
+            params = Ext.apply({}, options.params),
+            ajaxOptions = Ext.apply({}, options.ajaxOptions),
+            callback = options.callback || me.callback,
+            scope = options.scope || me.scope || me,
+            request;
+
+        Ext.applyIf(ajaxOptions, me.ajaxOptions);
+        Ext.applyIf(options, ajaxOptions);
+
+        Ext.applyIf(params, me.params);
+        Ext.apply(params, me.baseParams);
+
+        Ext.applyIf(options, {
+            url: me.url
+        });
+
+
+        Ext.apply(options, {
+            scope: me,
+            params: params,
+            callback: me.onComplete
+        });
+
+        if (me.fireEvent('beforeload', me, options) === false) {
+            return;
+        }
+
+        if (mask) {
+            me.addMask(mask);
+        }
+
+        request = Ext.Ajax.request(options);
+        me.active = {
+            request: request,
+            options: options,
+            mask: mask,
+            scope: scope,
+            callback: callback,
+            success: options.success || me.success,
+            failure: options.failure || me.failure,
+            renderer: options.renderer || me.renderer,
+            scripts: Ext.isDefined(options.scripts) ? options.scripts : me.scripts
+        };
+        me.setOptions(me.active, options);
+    },
+
+    
+    setOptions: Ext.emptyFn,
+
+    
+    onComplete: function(options, success, response) {
+        var me = this,
+            active = me.active,
+            scope = active.scope,
+            renderer = me.getRenderer(active.renderer);
+
+
+        if (success) {
+            success = renderer.call(me, me, response, active);
+        }
+
+        if (success) {
+            Ext.callback(active.success, scope, [me, response, options]);
+            me.fireEvent('load', me, response, options);
+        } else {
+            Ext.callback(active.failure, scope, [me, response, options]);
+            me.fireEvent('exception', me, response, options);
+        }
+        Ext.callback(active.callback, scope, [me, success, response, options]);
+
+        if (active.mask) {
+            me.removeMask();
+        }
+
+        delete me.active;
+    },
+
+    
+    getRenderer: function(renderer){
+        if (Ext.isFunction(renderer)) {
+            return renderer;
+        }
+        return this.statics().Renderer.Html;
+    },
+
+    
+    startAutoRefresh: function(interval, options){
+        var me = this;
+        me.stopAutoRefresh();
+        me.autoRefresh = setInterval(function(){
+            me.load(options);
+        }, interval);
+    },
+
+    
+    stopAutoRefresh: function(){
+        clearInterval(this.autoRefresh);
+        delete this.autoRefresh;
+    },
+
+    
+    isAutoRefreshing: function(){
+        return Ext.isDefined(this.autoRefresh);
+    },
+
+    
+    destroy: function(){
+        var me = this;
+        me.stopAutoRefresh();
+        delete me.target;
+        me.abort();
+        me.clearListeners();
+    }
+});
+
+
+Ext.define('Ext.ComponentLoader', {
+
+    
+
+    extend: 'Ext.ElementLoader',
+
+    statics: {
+        Renderer: {
+            Data: function(loader, response, active){
+                var success = true;
+                try {
+                    loader.getTarget().update(Ext.decode(response.responseText));
+                } catch (e) {
+                    success = false;
+                }
+                return success;
+            },
+
+            Component: function(loader, response, active){
+                var success = true,
+                    target = loader.getTarget(),
+                    items = [];
+
+
+                try {
+                    items = Ext.decode(response.responseText);
+                } catch (e) {
+                    success = false;
+                }
+
+                if (success) {
+                    if (active.removeAll) {
+                        target.removeAll();
+                    }
+                    target.add(items);
+                }
+                return success;
+            }
+        }
+    },
+
+    
+
+    
+    target: null,
+
+    
+    loadMask: false,
+
+    
+
+    
+    renderer: 'html',
+
+    
+    setTarget: function(target){
+        var me = this;
+
+        if (Ext.isString(target)) {
+            target = Ext.getCmp(target);
+        }
+
+        if (me.target && me.target != target) {
+            me.abort();
+        }
+        me.target = target;
+    },
+
+    
+    removeMask: function(){
+        this.target.setLoading(false);
+    },
+
+    
+    addMask: function(mask){
+        this.target.setLoading(mask);
+    },
+
+    
+
+    setOptions: function(active, options){
+        active.removeAll = Ext.isDefined(options.removeAll) ? options.removeAll : this.removeAll;
+    },
+
+    
+    getRenderer: function(renderer){
+        if (Ext.isFunction(renderer)) {
+            return renderer;
+        }
+
+        var renderers = this.statics().Renderer;
+        switch (renderer) {
+            case 'component':
+                return renderers.Component;
+            case 'data':
+                return renderers.Data;
+            default:
+                return Ext.ElementLoader.Renderer.Html;
+        }
+    }
+});
+
+
+Ext.define('Ext.data.Association', {
+    
+
+    
+
+    
+    primaryKey: 'id',
+
+    
+    
+    
+
+    defaultReaderType: 'json',
+
+    statics: {
+        create: function(association){
+            if (!association.isAssociation) {
+                if (Ext.isString(association)) {
+                    association = {
+                        type: association
+                    };
+                }
+
+                switch (association.type) {
+                    case 'belongsTo':
+                        return Ext.create('Ext.data.BelongsToAssociation', association);
+                    case 'hasMany':
+                        return Ext.create('Ext.data.HasManyAssociation', association);
+                    
+
+
+                    default:
+                }
+            }
+            return association;
+        }
+    },
+
+    
+    constructor: function(config) {
+        Ext.apply(this, config);
+
+        var types           = Ext.ModelManager.types,
+            ownerName       = config.ownerModel,
+            associatedName  = config.associatedModel,
+            ownerModel      = types[ownerName],
+            associatedModel = types[associatedName],
+            ownerProto;
+
+
+        this.ownerModel = ownerModel;
+        this.associatedModel = associatedModel;
+
+        
+
+        
+
+        Ext.applyIf(this, {
+            ownerName : ownerName,
+            associatedName: associatedName
+        });
+    },
+
+    
+    getReader: function(){
+        var me = this,
+            reader = me.reader,
+            model = me.associatedModel;
+
+        if (reader) {
+            if (Ext.isString(reader)) {
+                reader = {
+                    type: reader
+                };
+            }
+            if (reader.isReader) {
+                reader.setModel(model);
+            } else {
+                Ext.applyIf(reader, {
+                    model: model,
+                    type : me.defaultReaderType
+                });
+            }
+            me.reader = Ext.createByAlias('reader.' + reader.type, reader);
+        }
+        return me.reader || null;
+    }
+});
+
+
+Ext.define('Ext.ModelManager', {
+    extend: 'Ext.AbstractManager',
+    alternateClassName: 'Ext.ModelMgr',
+    requires: ['Ext.data.Association'],
+
+    singleton: true,
+
+    typeName: 'mtype',
+
+    
+    associationStack: [],
+
+    
+    registerType: function(name, config) {
+        var proto = config.prototype,
+            model;
+        if (proto && proto.isModel) {
+            
+            model = config;
+        } else {
+            
+            if (!config.extend) {
+                config.extend = 'Ext.data.Model';
+            }
+            model = Ext.define(name, config);
+        }
+        this.types[name] = model;
+        return model;
+    },
+
+    
+    onModelDefined: function(model) {
+        var stack  = this.associationStack,
+            length = stack.length,
+            create = [],
+            association, i, created;
+
+        for (i = 0; i < length; i++) {
+            association = stack[i];
+
+            if (association.associatedModel == model.modelName) {
+                create.push(association);
+            }
+        }
+
+        for (i = 0, length = create.length; i < length; i++) {
+            created = create[i];
+            this.types[created.ownerModel].prototype.associations.add(Ext.data.Association.create(created));
+            Ext.Array.remove(stack, created);
+        }
+    },
+
+    
+    registerDeferredAssociation: function(association){
+        this.associationStack.push(association);
+    },
+
+    
+    getModel: function(id) {
+        var model = id;
+        if (typeof model == 'string') {
+            model = this.types[model];
+        }
+        return model;
+    },
+
+    
+    create: function(config, name, id) {
+        var con = typeof name == 'function' ? name : this.types[name || config.name];
+
+        return new con(config, id);
+    }
+}, function() {
+
+    
+    Ext.regModel = function() {
+        return this.ModelManager.registerType.apply(this.ModelManager, arguments);
+    };
+});
+
+
+Ext.define('Ext.PluginManager', {
+    extend: 'Ext.AbstractManager',
+    alternateClassName: 'Ext.PluginMgr',
+    singleton: true,
+    typeName: 'ptype',
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+    create : function(config, defaultType){
+        if (config.init) {
+            return config;
+        } else {
+            return Ext.createByAlias('plugin.' + (config.ptype || defaultType), config);
+        }
+
+        
+        
+        
+        
+        
+        
+        
+    },
+
+    
+    findByType: function(type, defaultsOnly) {
+        var matches = [],
+            types   = this.types;
+
+        for (var name in types) {
+            if (!types.hasOwnProperty(name)) {
+                continue;
+            }
+            var item = types[name];
+
+            if (item.type == type && (!defaultsOnly || (defaultsOnly === true && item.isDefault))) {
+                matches.push(item);
+            }
+        }
+
+        return matches;
+    }
+}, function() {
+    
+    Ext.preg = function() {
+        return Ext.PluginManager.registerType.apply(Ext.PluginManager, arguments);
+    };
+});
+
+
+Ext.define('Ext.Template', {
+
+    
+
+    requires: ['Ext.DomHelper', 'Ext.util.Format'],
+
+    inheritableStatics: {
+        
+        from: function(el, config) {
+            el = Ext.getDom(el);
+            return new this(el.value || el.innerHTML, config || '');
+        }
+    },
+
+    
+
+    
+    constructor: function(html) {
+        var me = this,
+            args = arguments,
+            buffer = [],
+            i = 0,
+            length = args.length,
+            value;
+
+        me.initialConfig = {};
+
+        if (length > 1) {
+            for (; i < length; i++) {
+                value = args[i];
+                if (typeof value == 'object') {
+                    Ext.apply(me.initialConfig, value);
+                    Ext.apply(me, value);
+                } else {
+                    buffer.push(value);
+                }
+            }
+            html = buffer.join('');
+        } else {
+            if (Ext.isArray(html)) {
+                buffer.push(html.join(''));
+            } else {
+                buffer.push(html);
+            }
+        }
+
+        
+        me.html = buffer.join('');
+
+        if (me.compiled) {
+            me.compile();
+        }
+    },
+
+    isTemplate: true,
+
+    
+
+    
+    disableFormats: false,
+
+    re: /\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
+
+    
+    applyTemplate: function(values) {
+        var me = this,
+            useFormat = me.disableFormats !== true,
+            fm = Ext.util.Format,
+            tpl = me;
+
+        if (me.compiled) {
+            return me.compiled(values);
+        }
+        function fn(m, name, format, args) {
+            if (format && useFormat) {
+                if (args) {
+                    args = [values[name]].concat(Ext.functionFactory('return ['+ args +'];')());
+                } else {
+                    args = [values[name]];
+                }
+                if (format.substr(0, 5) == "this.") {
+                    return tpl[format.substr(5)].apply(tpl, args);
+                }
+                else {
+                    return fm[format].apply(fm, args);
+                }
+            }
+            else {
+                return values[name] !== undefined ? values[name] : "";
+            }
+        }
+        return me.html.replace(me.re, fn);
+    },
+
+    
+    set: function(html, compile) {
+        var me = this;
+        me.html = html;
+        me.compiled = null;
+        return compile ? me.compile() : me;
+    },
+
+    compileARe: /\\/g,
+    compileBRe: /(\r\n|\n)/g,
+    compileCRe: /'/g,
+
+    /**
+     * Compiles the template into an internal function, eliminating the RegEx overhead.
+     * @return {Ext.Template} this
+     */
+    compile: function() {
+        var me = this,
+            fm = Ext.util.Format,
+            useFormat = me.disableFormats !== true,
+            body, bodyReturn;
+
+        function fn(m, name, format, args) {
+            if (format && useFormat) {
+                args = args ? ',' + args: "";
+                if (format.substr(0, 5) != "this.") {
+                    format = "fm." + format + '(';
+                }
+                else {
+                    format = 'this.' + format.substr(5) + '(';
+                }
+            }
+            else {
+                args = '';
+                format = "(values['" + name + "'] == undefined ? '' : ";
+            }
+            return "'," + format + "values['" + name + "']" + args + ") ,'";
+        }
+
+        bodyReturn = me.html.replace(me.compileARe, '\\\\').replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn);
+        body = "this.compiled = function(values){ return ['" + bodyReturn + "'].join('');};";
+        eval(body);
+        return me;
+    },
+
+    /**
+     * Applies the supplied values to the template and inserts the new node(s) as the first child of el.
+     *
+     * @param {String/HTMLElement/Ext.Element} el The context element
+     * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element.
+     * @return {HTMLElement/Ext.Element} The new node or Element
+     */
+    insertFirst: function(el, values, returnElement) {
+        return this.doInsert('afterBegin', el, values, returnElement);
+    },
+
+    /**
+     * Applies the supplied values to the template and inserts the new node(s) before el.
+     *
+     * @param {String/HTMLElement/Ext.Element} el The context element
+     * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element.
+     * @return {HTMLElement/Ext.Element} The new node or Element
+     */
+    insertBefore: function(el, values, returnElement) {
+        return this.doInsert('beforeBegin', el, values, returnElement);
+    },
+
+    /**
+     * Applies the supplied values to the template and inserts the new node(s) after el.
+     *
+     * @param {String/HTMLElement/Ext.Element} el The context element
+     * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element.
+     * @return {HTMLElement/Ext.Element} The new node or Element
+     */
+    insertAfter: function(el, values, returnElement) {
+        return this.doInsert('afterEnd', el, values, returnElement);
+    },
+
+    /**
+     * Applies the supplied `values` to the template and appends the new node(s) to the specified `el`.
+     *
+     * For example usage see {@link Ext.Template Ext.Template class docs}.
+     *
+     * @param {String/HTMLElement/Ext.Element} el The context element
+     * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
+     * @param {Boolean} returnElement (optional) true to return an Ext.Element.
+     * @return {HTMLElement/Ext.Element} The new node or Element
+     */
+    append: function(el, values, returnElement) {
+        return this.doInsert('beforeEnd', el, values, returnElement);
+    },
+
+    doInsert: function(where, el, values, returnEl) {
+        el = Ext.getDom(el);
+        var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
+        return returnEl ? Ext.get(newNode, true) : newNode;
+    },
+
+    /**
+     * Applies the supplied values to the template and overwrites the content of el with the new node(s).
+     *
+     * @param {String/HTMLElement/Ext.Element} el The context element
+     * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element.
+     * @return {HTMLElement/Ext.Element} The new node or Element
+     */
+    overwrite: function(el, values, returnElement) {
+        el = Ext.getDom(el);
+        el.innerHTML = this.applyTemplate(values);
+        return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
+    }
+}, function() {
+
+    /**
+     * @method apply
+     * @member Ext.Template
+     * Alias for {@link #applyTemplate}.
+     * @alias Ext.Template#applyTemplate
+     */
+    this.createAlias('apply', 'applyTemplate');
+});
+
+/**
+ * A template class that supports advanced functionality like:
+ *
+ * - Autofilling arrays using templates and sub-templates
+ * - Conditional processing with basic comparison operators
+ * - Basic math function support
+ * - Execute arbitrary inline code with special built-in template variables
+ * - Custom member functions
+ * - Many special tags and built-in operators that aren't defined as part of the API, but are supported in the templates that can be created
+ *
+ * XTemplate provides the templating mechanism built into:
+ *
+ * - {@link Ext.view.View}
+ *
+ * The {@link Ext.Template} describes the acceptable parameters to pass to the constructor. The following examples
+ * demonstrate all of the supported features.
+ *
+ * # Sample Data
+ *
+ * This is the data object used for reference in each code example:
+ *
+ *     var data = {
+ *         name: 'Tommy Maintz',
+ *         title: 'Lead Developer',
+ *         company: 'Sencha Inc.',
+ *         email: 'tommy at sencha.com',
+ *         address: '5 Cups Drive',
+ *         city: 'Palo Alto',
+ *         state: 'CA',
+ *         zip: '44102',
+ *         drinks: ['Coffee', 'Soda', 'Water'],
+ *         kids: [
+ *             {
+ *                 name: 'Joshua',
+ *                 age:3
+ *             },
+ *             {
+ *                 name: 'Matthew',
+ *                 age:2
+ *             },
+ *             {
+ *                 name: 'Solomon',
+ *                 age:0
+ *             }
+ *         ]
+ *     };
+ *
+ * # Auto filling of arrays
+ *
+ * The **tpl** tag and the **for** operator are used to process the provided data object:
+ *
+ * - If the value specified in for is an array, it will auto-fill, repeating the template block inside the tpl
+ *   tag for each item in the array.
+ * - If for="." is specified, the data object provided is examined.
+ * - While processing an array, the special variable {#} will provide the current array index + 1 (starts at 1, not 0).
+ *
+ * Examples:
+ *
+ *     <tpl for=".">...</tpl>       // loop through array at root node
+ *     <tpl for="foo">...</tpl>     // loop through array at foo node
+ *     <tpl for="foo.bar">...</tpl> // loop through array at foo.bar node
+ *
+ * Using the sample data above:
+ *
+ *     var tpl = new Ext.XTemplate(
+ *         '<p>Kids: ',
+ *         '<tpl for=".">',       // process the data.kids node
+ *             '<p>{#}. {name}</p>',  // use current array index to autonumber
+ *         '</tpl></p>'
+ *     );
+ *     tpl.overwrite(panel.body, data.kids); // pass the kids property of the data object
+ *
+ * An example illustrating how the **for** property can be leveraged to access specified members of the provided data
+ * object to populate the template:
+ *
+ *     var tpl = new Ext.XTemplate(
+ *         '<p>Name: {name}</p>',
+ *         '<p>Title: {title}</p>',
+ *         '<p>Company: {company}</p>',
+ *         '<p>Kids: ',
+ *         '<tpl for="kids">',     // interrogate the kids property within the data
+ *             '<p>{name}</p>',
+ *         '</tpl></p>'
+ *     );
+ *     tpl.overwrite(panel.body, data);  // pass the root node of the data object
+ *
+ * Flat arrays that contain values (and not objects) can be auto-rendered using the special **`{.}`** variable inside a
+ * loop. This variable will represent the value of the array at the current index:
+ *
+ *     var tpl = new Ext.XTemplate(
+ *         '<p>{name}\'s favorite beverages:</p>',
+ *         '<tpl for="drinks">',
+ *             '<div> - {.}</div>',
+ *         '</tpl>'
+ *     );
+ *     tpl.overwrite(panel.body, data);
+ *
+ * When processing a sub-template, for example while looping through a child array, you can access the parent object's
+ * members via the **parent** object:
+ *
+ *     var tpl = new Ext.XTemplate(
+ *         '<p>Name: {name}</p>',
+ *         '<p>Kids: ',
+ *         '<tpl for="kids">',
+ *             '<tpl if="age > 1">',
+ *                 '<p>{name}</p>',
+ *                 '<p>Dad: {parent.name}</p>',
+ *             '</tpl>',
+ *         '</tpl></p>'
+ *     );
+ *     tpl.overwrite(panel.body, data);
+ *
+ * # Conditional processing with basic comparison operators
+ *
+ * The **tpl** tag and the **if** operator are used to provide conditional checks for deciding whether or not to render
+ * specific parts of the template. Notes:
+ *
+ * - Double quotes must be encoded if used within the conditional
+ * - There is no else operator -- if needed, two opposite if statements should be used.
+ *
+ * Examples:
+ *
+ *     <tpl if="age > 1 && age < 10">Child</tpl>
+ *     <tpl if="age >= 10 && age < 18">Teenager</tpl>
+ *     <tpl if="this.isGirl(name)">...</tpl>
+ *     <tpl if="id==\'download\'">...</tpl>
+ *     <tpl if="needsIcon"><img src="{icon}" class="{iconCls}"/></tpl>
+ *     // no good:
+ *     <tpl if="name == "Tommy"">Hello</tpl>
+ *     // encode " if it is part of the condition, e.g.
+ *     <tpl if="name == "Tommy"">Hello</tpl>
+ *
+ * Using the sample data above:
+ *
+ *     var tpl = new Ext.XTemplate(
+ *         '<p>Name: {name}</p>',
+ *         '<p>Kids: ',
+ *         '<tpl for="kids">',
+ *             '<tpl if="age > 1">',
+ *                 '<p>{name}</p>',
+ *             '</tpl>',
+ *         '</tpl></p>'
+ *     );
+ *     tpl.overwrite(panel.body, data);
+ *
+ * # Basic math support
+ *
+ * The following basic math operators may be applied directly on numeric data values:
+ *
+ *     + - * /
+ *
+ * For example:
+ *
+ *     var tpl = new Ext.XTemplate(
+ *         '<p>Name: {name}</p>',
+ *         '<p>Kids: ',
+ *         '<tpl for="kids">',
+ *             '<tpl if="age > 1">',  // <-- Note that the > is encoded
+ *                 '<p>{#}: {name}</p>',  // <-- Auto-number each item
+ *                 '<p>In 5 Years: {age+5}</p>',  // <-- Basic math
+ *                 '<p>Dad: {parent.name}</p>',
+ *             '</tpl>',
+ *         '</tpl></p>'
+ *     );
+ *     tpl.overwrite(panel.body, data);
+ *
+ * # Execute arbitrary inline code with special built-in template variables
+ *
+ * Anything between `{[ ... ]}` is considered code to be executed in the scope of the template. There are some special
+ * variables available in that code:
+ *
+ * - **values**: The values in the current scope. If you are using scope changing sub-templates,
+ *   you can change what values is.
+ * - **parent**: The scope (values) of the ancestor template.
+ * - **xindex**: If you are in a looping template, the index of the loop you are in (1-based).
+ * - **xcount**: If you are in a looping template, the total length of the array you are looping.
+ *
+ * This example demonstrates basic row striping using an inline code block and the xindex variable:
+ *
+ *     var tpl = new Ext.XTemplate(
+ *         '<p>Name: {name}</p>',
+ *         '<p>Company: {[values.company.toUpperCase() + ", " + values.title]}</p>',
+ *         '<p>Kids: ',
+ *         '<tpl for="kids">',
+ *             '<div class="{[xindex % 2 === 0 ? "even" : "odd"]}">',
+ *             '{name}',
+ *             '</div>',
+ *         '</tpl></p>'
+ *      );
+ *     tpl.overwrite(panel.body, data);
+ *
+ * # Template member functions
+ *
+ * One or more member functions can be specified in a configuration object passed into the XTemplate constructor for
+ * more complex processing:
+ *
+ *     var tpl = new Ext.XTemplate(
+ *         '<p>Name: {name}</p>',
+ *         '<p>Kids: ',
+ *         '<tpl for="kids">',
+ *             '<tpl if="this.isGirl(name)">',
+ *                 '<p>Girl: {name} - {age}</p>',
+ *             '</tpl>',
+ *              // use opposite if statement to simulate 'else' processing:
+ *             '<tpl if="this.isGirl(name) == false">',
+ *                 '<p>Boy: {name} - {age}</p>',
+ *             '</tpl>',
+ *             '<tpl if="this.isBaby(age)">',
+ *                 '<p>{name} is a baby!</p>',
+ *             '</tpl>',
+ *         '</tpl></p>',
+ *         {
+ *             // XTemplate configuration:
+ *             disableFormats: true,
+ *             // member functions:
+ *             isGirl: function(name){
+ *                return name == 'Sara Grace';
+ *             },
+ *             isBaby: function(age){
+ *                return age < 1;
+ *             }
+ *         }
+ *     );
+ *     tpl.overwrite(panel.body, data);
+ */
+Ext.define('Ext.XTemplate', {
+
+    /* Begin Definitions */
+
+    extend: 'Ext.Template',
+
+    /* End Definitions */
+
+    argsRe: /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/,
+    nameRe: /^<tpl\b[^>]*?for="(.*?)"/,
+    ifRe: /^<tpl\b[^>]*?if="(.*?)"/,
+    execRe: /^<tpl\b[^>]*?exec="(.*?)"/,
+    constructor: function() {
+        this.callParent(arguments);
+
+        var me = this,
+            html = me.html,
+            argsRe = me.argsRe,
+            nameRe = me.nameRe,
+            ifRe = me.ifRe,
+            execRe = me.execRe,
+            id = 0,
+            tpls = [],
+            VALUES = 'values',
+            PARENT = 'parent',
+            XINDEX = 'xindex',
+            XCOUNT = 'xcount',
+            RETURN = 'return ',
+            WITHVALUES = 'with(values){ ',
+            m, matchName, matchIf, matchExec, exp, fn, exec, name, i;
+
+        html = ['<tpl>', html, '</tpl>'].join('');
+
+        while ((m = html.match(argsRe))) {
+            exp = null;
+            fn = null;
+            exec = null;
+            matchName = m[0].match(nameRe);
+            matchIf = m[0].match(ifRe);
+            matchExec = m[0].match(execRe);
+
+            exp = matchIf ? matchIf[1] : null;
+            if (exp) {
+                fn = Ext.functionFactory(VALUES, PARENT, XINDEX, XCOUNT, WITHVALUES + 'try{' + RETURN + Ext.String.htmlDecode(exp) + ';}catch(e){return;}}');
+            }
+
+            exp = matchExec ? matchExec[1] : null;
+            if (exp) {
+                exec = Ext.functionFactory(VALUES, PARENT, XINDEX, XCOUNT, WITHVALUES + Ext.String.htmlDecode(exp) + ';}');
+            }
+
+            name = matchName ? matchName[1] : null;
+            if (name) {
+                if (name === '.') {
+                    name = VALUES;
+                } else if (name === '..') {
+                    name = PARENT;
+                }
+                name = Ext.functionFactory(VALUES, PARENT, 'try{' + WITHVALUES + RETURN + name + ';}}catch(e){return;}');
+            }
+
+            tpls.push({
+                id: id,
+                target: name,
+                exec: exec,
+                test: fn,
+                body: m[1] || ''
+            });
+
+            html = html.replace(m[0], '{xtpl' + id + '}');
+            id = id + 1;
+        }
+
+        for (i = tpls.length - 1; i >= 0; --i) {
+            me.compileTpl(tpls[i]);
+        }
+        me.master = tpls[tpls.length - 1];
+        me.tpls = tpls;
+    },
+
+    // @private
+    applySubTemplate: function(id, values, parent, xindex, xcount) {
+        var me = this, t = me.tpls[id];
+        return t.compiled.call(me, values, parent, xindex, xcount);
+    },
+
+    /**
+     * @cfg {RegExp} codeRe
+     * The regular expression used to match code variables. Default: matches {[expression]}.
+     */
+    codeRe: /\{\[((?:\\\]|.|\n)*?)\]\}/g,
+
+    /**
+     * @cfg {Boolean} compiled
+     * Only applies to {@link Ext.Template}, XTemplates are compiled automatically.
+     */
+
+    re: /\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\/]\s?[\d\.\+\-\*\/\(\)]+)?\}/g,
+
+    // @private
+    compileTpl: function(tpl) {
+        var fm = Ext.util.Format,
+            me = this,
+            useFormat = me.disableFormats !== true,
+            body, bodyReturn, evaluatedFn;
+
+        function fn(m, name, format, args, math) {
+            var v;
+            // name is what is inside the {}
+            // Name begins with xtpl, use a Sub Template
+            if (name.substr(0, 4) == 'xtpl') {
+                return "',this.applySubTemplate(" + name.substr(4) + ", values, parent, xindex, xcount),'";
+            }
+            // name = "." - Just use the values object.
+            if (name == '.') {
+                // filter to not include arrays/objects/nulls
+                v = 'Ext.Array.indexOf(["string", "number", "boolean"], typeof values) > -1 || Ext.isDate(values) ? values : ""';
+            }
+
+            // name = "#" - Use the xindex
+            else if (name == '#') {
+                v = 'xindex';
+            }
+            else if (name.substr(0, 7) == "parent.") {
+                v = name;
+            }
+            // name has a . in it - Use object literal notation, starting from values
+            else if (name.indexOf('.') != -1) {
+                v = "values." + name;
+            }
+
+            // name is a property of values
+            else {
+                v = "values['" + name + "']";
+            }
+            if (math) {
+                v = '(' + v + math + ')';
+            }
+            if (format && useFormat) {
+                args = args ? ',' + args : "";
+                if (format.substr(0, 5) != "this.") {
+                    format = "fm." + format + '(';
+                }
+                else {
+                    format = 'this.' + format.substr(5) + '(';
+                }
+            }
+            else {
+                args = '';
+                format = "(" + v + " === undefined ? '' : ";
+            }
+            return "'," + format + v + args + "),'";
+        }
+
+        function codeFn(m, code) {
+            // Single quotes get escaped when the template is compiled, however we want to undo this when running code.
+            return "',(" + code.replace(me.compileARe, "'") + "),'";
+        }
+
+        bodyReturn = tpl.body.replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn).replace(me.codeRe, codeFn);
+        body = "evaluatedFn = function(values, parent, xindex, xcount){return ['" + bodyReturn + "'].join('');};";
+        eval(body);
+
+        tpl.compiled = function(values, parent, xindex, xcount) {
+            var vs,
+                length,
+                buffer,
+                i;
+
+            if (tpl.test && !tpl.test.call(me, values, parent, xindex, xcount)) {
+                return '';
+            }
+
+            vs = tpl.target ? tpl.target.call(me, values, parent) : values;
+            if (!vs) {
+               return '';
+            }
+
+            parent = tpl.target ? values : parent;
+            if (tpl.target && Ext.isArray(vs)) {
+                buffer = [];
+                length = vs.length;
+                if (tpl.exec) {
+                    for (i = 0; i < length; i++) {
+                        buffer[buffer.length] = evaluatedFn.call(me, vs[i], parent, i + 1, length);
+                        tpl.exec.call(me, vs[i], parent, i + 1, length);
+                    }
+                } else {
+                    for (i = 0; i < length; i++) {
+                        buffer[buffer.length] = evaluatedFn.call(me, vs[i], parent, i + 1, length);
+                    }
+                }
+                return buffer.join('');
+            }
+
+            if (tpl.exec) {
+                tpl.exec.call(me, vs, parent, xindex, xcount);
+            }
+            return evaluatedFn.call(me, vs, parent, xindex, xcount);
+        };
+
+        return this;
+    },
+
+    // inherit docs from Ext.Template
+    applyTemplate: function(values) {
+        return this.master.compiled.call(this, values, {}, 1, 1);
+    },
+
+    /**
+     * Does nothing. XTemplates are compiled automatically, so this function simply returns this.
+     * @return {Ext.XTemplate} this
+     */
+    compile: function() {
+        return this;
+    }
+}, function() {
+    // re-create the alias, inheriting it from Ext.Template doesn't work as intended.
+    this.createAlias('apply', 'applyTemplate');
+});
+
+
+Ext.define('Ext.app.Controller', {
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    
+    
+    
+
+    
+
+    
+
+    onClassExtended: function(cls, data) {
+        var className = Ext.getClassName(cls),
+            match = className.match(/^(.*)\.controller\./);
+
+        if (match !== null) {
+            var namespace = Ext.Loader.getPrefix(className) || match[1],
+                onBeforeClassCreated = data.onBeforeClassCreated,
+                requires = [],
+                modules = ['model', 'view', 'store'],
+                prefix;
+
+            data.onBeforeClassCreated = function(cls, data) {
+                var i, ln, module,
+                    items, j, subLn, item;
+
+                for (i = 0,ln = modules.length; i < ln; i++) {
+                    module = modules[i];
+
+                    items = Ext.Array.from(data[module + 's']);
+
+                    for (j = 0,subLn = items.length; j < subLn; j++) {
+                        item = items[j];
+
+                        prefix = Ext.Loader.getPrefix(item);
+
+                        if (prefix === '' || prefix === item) {
+                            requires.push(namespace + '.' + module + '.' + item);
+                        }
+                        else {
+                            requires.push(item);
+                        }
+                    }
+                }
+
+                Ext.require(requires, Ext.Function.pass(onBeforeClassCreated, arguments, this));
+            };
+        }
+    },
+
+    
+    constructor: function(config) {
+        this.mixins.observable.constructor.call(this, config);
+
+        Ext.apply(this, config || {});
+
+        this.createGetters('model', this.models);
+        this.createGetters('store', this.stores);
+        this.createGetters('view', this.views);
+
+        if (this.refs) {
+            this.ref(this.refs);
+        }
+    },
+
+    
+    init: function(application) {},
+
+    
+    onLaunch: function(application) {},
+
+    createGetters: function(type, refs) {
+        type = Ext.String.capitalize(type);
+        Ext.Array.each(refs, function(ref) {
+            var fn = 'get',
+                parts = ref.split('.');
+
+            
+            Ext.Array.each(parts, function(part) {
+                fn += Ext.String.capitalize(part);
+            });
+            fn += type;
+
+            if (!this[fn]) {
+                this[fn] = Ext.Function.pass(this['get' + type], [ref], this);
+            }
+            
+            this[fn](ref);
+        },
+        this);
+    },
+
+    ref: function(refs) {
+        var me = this;
+        refs = Ext.Array.from(refs);
+        Ext.Array.each(refs, function(info) {
+            var ref = info.ref,
+                fn = 'get' + Ext.String.capitalize(ref);
+            if (!me[fn]) {
+                me[fn] = Ext.Function.pass(me.getRef, [ref, info], me);
+            }
+        });
+    },
+
+    getRef: function(ref, info, config) {
+        this.refCache = this.refCache || {};
+        info = info || {};
+        config = config || {};
+
+        Ext.apply(info, config);
+
+        if (info.forceCreate) {
+            return Ext.ComponentManager.create(info, 'component');
+        }
+
+        var me = this,
+            selector = info.selector,
+            cached = me.refCache[ref];
+
+        if (!cached) {
+            me.refCache[ref] = cached = Ext.ComponentQuery.query(info.selector)[0];
+            if (!cached && info.autoCreate) {
+                me.refCache[ref] = cached = Ext.ComponentManager.create(info, 'component');
+            }
+            if (cached) {
+                cached.on('beforedestroy', function() {
+                    me.refCache[ref] = null;
+                });
+            }
+        }
+
+        return cached;
+    },
+
+    
+    control: function(selectors, listeners) {
+        this.application.control(selectors, listeners, this);
+    },
+
+    
+    getController: function(name) {
+        return this.application.getController(name);
+    },
+
+    
+    getStore: function(name) {
+        return this.application.getStore(name);
+    },
+
+    
+    getModel: function(model) {
+        return this.application.getModel(model);
+    },
+
+    
+    getView: function(view) {
+        return this.application.getView(view);
+    }
+});
+
+
+Ext.define('Ext.data.IdGenerator', {
+
+    isGenerator: true,
+
+    
+    constructor: function(config) {
+        var me = this;
+
+        Ext.apply(me, config);
+
+        if (me.id) {
+            Ext.data.IdGenerator.all[me.id] = me;
+        }
+    },
+
+    
+
+    getRecId: function (rec) {
+        return rec.modelName + '-' + rec.internalId;
+    },
+
+    
+
+    statics: {
+        
+        all: {},
+
+        
+        get: function (config) {
+            var generator,
+                id,
+                type;
+
+            if (typeof config == 'string') {
+                id = type = config;
+                config = null;
+            } else if (config.isGenerator) {
+                return config;
+            } else {
+                id = config.id || config.type;
+                type = config.type;
+            }
+
+            generator = this.all[id];
+            if (!generator) {
+                generator = Ext.create('idgen.' + type, config);
+            }
+
+            return generator;
+        }
+    }
+});
+
+
+Ext.define('Ext.data.SortTypes', {
+    
+    singleton: true,
+    
+    
+    none : function(s) {
+        return s;
+    },
+
+    
+    stripTagsRE : /<\/?[^>]+>/gi,
+
+    
+    asText : function(s) {
+        return String(s).replace(this.stripTagsRE, "");
+    },
+
+    
+    asUCText : function(s) {
+        return String(s).toUpperCase().replace(this.stripTagsRE, "");
+    },
+
+    
+    asUCString : function(s) {
+        return String(s).toUpperCase();
+    },
+
+    
+    asDate : function(s) {
+        if(!s){
+            return 0;
+        }
+        if(Ext.isDate(s)){
+            return s.getTime();
+        }
+        return Date.parse(String(s));
+    },
+
+    
+    asFloat : function(s) {
+        var val = parseFloat(String(s).replace(/,/g, ""));
+        return isNaN(val) ? 0 : val;
+    },
+
+    
+    asInt : function(s) {
+        var val = parseInt(String(s).replace(/,/g, ""), 10);
+        return isNaN(val) ? 0 : val;
+    }
+});
+
+Ext.define('Ext.util.Filter', {
+
+    
+
+    
+    
+    
+    
+    
+    
+    anyMatch: false,
+    
+    
+    exactMatch: false,
+    
+    
+    caseSensitive: false,
+    
+    
+
+    
+    constructor: function(config) {
+        var me = this;
+        Ext.apply(me, config);
+        
+        
+        
+        me.filter = me.filter || me.filterFn;
+        
+        if (me.filter === undefined) {
+            if (me.property === undefined || me.value === undefined) {
+                
+                
+                
+                
+            } else {
+                me.filter = me.createFilterFn();
+            }
+            
+            me.filterFn = me.filter;
+        }
+    },
+    
+    
+    createFilterFn: function() {
+        var me       = this,
+            matcher  = me.createValueMatcher(),
+            property = me.property;
+        
+        return function(item) {
+            var value = me.getRoot.call(me, item)[property];
+            return matcher === null ? value === null : matcher.test(value);
+        };
+    },
+    
+    
+    getRoot: function(item) {
+        var root = this.root;
+        return root === undefined ? item : item[root];
+    },
+    
+    
+    createValueMatcher : function() {
+        var me            = this,
+            value         = me.value,
+            anyMatch      = me.anyMatch,
+            exactMatch    = me.exactMatch,
+            caseSensitive = me.caseSensitive,
+            escapeRe      = Ext.String.escapeRegex;
+            
+        if (value === null) {
+            return value;
+        }
+        
+        if (!value.exec) { 
+            value = String(value);
+
+            if (anyMatch === true) {
+                value = escapeRe(value);
+            } else {
+                value = '^' + escapeRe(value);
+                if (exactMatch === true) {
+                    value += '$';
+                }
+            }
+            value = new RegExp(value, caseSensitive ? '' : 'i');
+         }
+         
+         return value;
+    }
+});
+
+Ext.define('Ext.util.Sorter', {
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    direction: "ASC",
+    
+    constructor: function(config) {
+        var me = this;
+        
+        Ext.apply(me, config);
+        
+        
+        me.updateSortFunction();
+    },
+    
+    
+    createSortFunction: function(sorterFn) {
+        var me        = this,
+            property  = me.property,
+            direction = me.direction || "ASC",
+            modifier  = direction.toUpperCase() == "DESC" ? -1 : 1;
+        
+        
+        
+        return function(o1, o2) {
+            return modifier * sorterFn.call(me, o1, o2);
+        };
+    },
+    
+    
+    defaultSorterFn: function(o1, o2) {
+        var me = this,
+            transform = me.transform,
+            v1 = me.getRoot(o1)[me.property],
+            v2 = me.getRoot(o2)[me.property];
+            
+        if (transform) {
+            v1 = transform(v1);
+            v2 = transform(v2);
+        }
+
+        return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
+    },
+    
+    
+    getRoot: function(item) {
+        return this.root === undefined ? item : item[this.root];
+    },
+    
+    
+    setDirection: function(direction) {
+        var me = this;
+        me.direction = direction;
+        me.updateSortFunction();
+    },
+    
+    
+    toggle: function() {
+        var me = this;
+        me.direction = Ext.String.toggle(me.direction, "ASC", "DESC");
+        me.updateSortFunction();
+    },
+    
+    
+    updateSortFunction: function(fn) {
+        var me = this;
+        fn = fn || me.sorterFn || me.defaultSorterFn;
+        me.sort = me.createSortFunction(fn);
+    }
+});
+
+Ext.define('Ext.data.Operation', {
+    
+    synchronous: true,
+
+    
+    action: undefined,
+
+    
+    filters: undefined,
+
+    
+    sorters: undefined,
+
+    
+    group: undefined,
+
+    
+    start: undefined,
+
+    
+    limit: undefined,
+
+    
+    batch: undefined,
+
+    
+    callback: undefined,
+
+    
+    scope: undefined,
+
+    
+    started: false,
+
+    
+    running: false,
+
+    
+    complete: false,
+
+    
+    success: undefined,
+
+    
+    exception: false,
+
+    
+    error: undefined,
+
+    
+    actionCommitRecordsRe: /^(?:create|update)$/i,
+
+    
+    actionSkipSyncRe: /^destroy$/i,
+
+    
+    constructor: function(config) {
+        Ext.apply(this, config || {});
+    },
+
+    
+    commitRecords: function (serverRecords) {
+        var me = this,
+            mc, index, clientRecords, serverRec, clientRec;
+
+        if (!me.actionSkipSyncRe.test(me.action)) {
+            clientRecords = me.records;
+
+            if (clientRecords && clientRecords.length) {
+                mc = Ext.create('Ext.util.MixedCollection', true, function(r) {return r.getId();});
+                mc.addAll(clientRecords);
+
+                for (index = serverRecords ? serverRecords.length : 0; index--; ) {
+                    serverRec = serverRecords[index];
+                    clientRec = mc.get(serverRec.getId());
+
+                    if (clientRec) {
+                        clientRec.beginEdit();
+                        clientRec.set(serverRec.data);
+                        clientRec.endEdit(true);
+                    }
+                }
+
+                if (me.actionCommitRecordsRe.test(me.action)) {
+                    for (index = clientRecords.length; index--; ) {
+                        clientRecords[index].commit();
+                    }
+                }
+            }
+        }
+    },
+
+    
+    setStarted: function() {
+        this.started = true;
+        this.running = true;
+    },
+
+    
+    setCompleted: function() {
+        this.complete = true;
+        this.running  = false;
+    },
+
+    
+    setSuccessful: function() {
+        this.success = true;
+    },
+
+    
+    setException: function(error) {
+        this.exception = true;
+        this.success = false;
+        this.running = false;
+        this.error = error;
+    },
+
+    
+    hasException: function() {
+        return this.exception === true;
+    },
+
+    
+    getError: function() {
+        return this.error;
+    },
+
+    
+    getRecords: function() {
+        var resultSet = this.getResultSet();
+
+        return (resultSet === undefined ? this.records : resultSet.records);
+    },
+
+    
+    getResultSet: function() {
+        return this.resultSet;
+    },
+
+    
+    isStarted: function() {
+        return this.started === true;
+    },
+
+    
+    isRunning: function() {
+        return this.running === true;
+    },
+
+    
+    isComplete: function() {
+        return this.complete === true;
+    },
+
+    
+    wasSuccessful: function() {
+        return this.isComplete() && this.success === true;
+    },
+
+    
+    setBatch: function(batch) {
+        this.batch = batch;
+    },
+
+    
+    allowWrite: function() {
+        return this.action != 'read';
+    }
+});
+
+Ext.define('Ext.data.validations', {
+    singleton: true,
+    
+    
+    presenceMessage: 'must be present',
+    
+    
+    lengthMessage: 'is the wrong length',
+    
+    
+    formatMessage: 'is the wrong format',
+    
+    
+    inclusionMessage: 'is not included in the list of acceptable values',
+    
+    
+    exclusionMessage: 'is not an acceptable value',
+    
+    
+    emailMessage: 'is not a valid email address',
+    
+    
+    emailRe: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
+    
+    
+    presence: function(config, value) {
+        if (value === undefined) {
+            value = config;
+        }
+        
+        
+        return !!value || value === 0;
+    },
+    
+    
+    length: function(config, value) {
+        if (value === undefined || value === null) {
+            return false;
+        }
+        
+        var length = value.length,
+            min    = config.min,
+            max    = config.max;
+        
+        if ((min && length < min) || (max && length > max)) {
+            return false;
+        } else {
+            return true;
+        }
+    },
+    
+    
+    email: function(config, email) {
+        return Ext.data.validations.emailRe.test(email);
+    },
+    
+    
+    format: function(config, value) {
+        return !!(config.matcher && config.matcher.test(value));
+    },
+    
+    
+    inclusion: function(config, value) {
+        return config.list && Ext.Array.indexOf(config.list,value) != -1;
+    },
+    
+    
+    exclusion: function(config, value) {
+        return config.list && Ext.Array.indexOf(config.list,value) == -1;
+    }
+});
+
+Ext.define('Ext.data.ResultSet', {
+    
+    loaded: true,
+
+    
+    count: 0,
+
+    
+    total: 0,
+
+    
+    success: false,
+
+    
+
+    
+    constructor: function(config) {
+        Ext.apply(this, config);
+
+        
+        this.totalRecords = this.total;
+
+        if (config.count === undefined) {
+            this.count = this.records.length;
+        }
+    }
+});
+
+Ext.define('Ext.data.writer.Writer', {
+    alias: 'writer.base',
+    alternateClassName: ['Ext.data.DataWriter', 'Ext.data.Writer'],
+    
+    
+    writeAllFields: true,
+    
+    
+    nameProperty: 'name',
+
+    
+    constructor: function(config) {
+        Ext.apply(this, config);
+    },
+
+    
+    write: function(request) {
+        var operation = request.operation,
+            records   = operation.records || [],
+            len       = records.length,
+            i         = 0,
+            data      = [];
+
+        for (; i < len; i++) {
+            data.push(this.getRecordData(records[i]));
+        }
+        return this.writeRecords(request, data);
+    },
+
+    
+    getRecordData: function(record) {
+        var isPhantom = record.phantom === true,
+            writeAll = this.writeAllFields || isPhantom,
+            nameProperty = this.nameProperty,
+            fields = record.fields,
+            data = {},
+            changes,
+            name,
+            field,
+            key;
+        
+        if (writeAll) {
+            fields.each(function(field){
+                if (field.persist) {
+                    name = field[nameProperty] || field.name;
+                    data[name] = record.get(field.name);
+                }
+            });
+        } else {
+            
+            changes = record.getChanges();
+            for (key in changes) {
+                if (changes.hasOwnProperty(key)) {
+                    field = fields.get(key);
+                    name = field[nameProperty] || field.name;
+                    data[name] = changes[key];
+                }
+            }
+            if (!isPhantom) {
+                
+                data[record.idProperty] = record.getId();
+            }
+        }
+        return data;
+    }
+});
+
+
+Ext.define('Ext.util.Floating', {
+
+    uses: ['Ext.Layer', 'Ext.window.Window'],
+
+    
+    focusOnToFront: true,
+
+    
+    shadow: 'sides',
+
+    constructor: function(config) {
+        var me = this;
+        
+        me.floating = true;
+        me.el = Ext.create('Ext.Layer', Ext.apply({}, config, {
+            hideMode: me.hideMode,
+            hidden: me.hidden,
+            shadow: Ext.isDefined(me.shadow) ? me.shadow : 'sides',
+            shadowOffset: me.shadowOffset,
+            constrain: false,
+            shim: me.shim === false ? false : undefined
+        }), me.el);
+    },
+
+    onFloatRender: function() {
+        var me = this;
+        me.zIndexParent = me.getZIndexParent();
+        me.setFloatParent(me.ownerCt);
+        delete me.ownerCt;
+
+        if (me.zIndexParent) {
+            me.zIndexParent.registerFloatingItem(me);
+        } else {
+            Ext.WindowManager.register(me);
+        }
+    },
+
+    setFloatParent: function(floatParent) {
+        var me = this;
+
+        
+        if (me.floatParent) {
+            me.mun(me.floatParent, {
+                hide: me.onFloatParentHide,
+                show: me.onFloatParentShow,
+                scope: me
+            });
+        }
+
+        me.floatParent = floatParent;
+
+        
+        if (floatParent) {
+            me.mon(me.floatParent, {
+                hide: me.onFloatParentHide,
+                show: me.onFloatParentShow,
+                scope: me
+            });
+        }
+
+        
+        
+        if ((me.constrain || me.constrainHeader) && !me.constrainTo) {
+            me.constrainTo = floatParent ? floatParent.getTargetEl() : me.container;
+        }
+    },
+
+    onFloatParentHide: function() {
+        var me = this;
+        
+        if (me.hideOnParentHide !== false) {
+            me.showOnParentShow = me.isVisible();
+            me.hide();
+        }
+    },
+
+    onFloatParentShow: function() {
+        if (this.showOnParentShow) {
+            delete this.showOnParentShow;
+            this.show();
+        }
+    },
+
+    
+    getZIndexParent: function() {
+        var p = this.ownerCt,
+            c;
+
+        if (p) {
+            while (p) {
+                c = p;
+                p = p.ownerCt;
+            }
+            if (c.floating) {
+                return c;
+            }
+        }
+    },
+
+    
+    
+    
+    
+    
+    setZIndex: function(index) {
+        var me = this;
+        me.el.setZIndex(index);
+
+        
+        index += 10;
+
+        
+        
+        if (me.floatingItems) {
+            index = Math.floor(me.floatingItems.setBase(index) / 100) * 100 + 10000;
+        }
+        return index;
+    },
+
+    
+    doConstrain: function(constrainTo) {
+        var me = this,
+            vector = me.getConstrainVector(constrainTo || me.el.getScopeParent()),
+            xy;
+
+        if (vector) {
+            xy = me.getPosition();
+            xy[0] += vector[0];
+            xy[1] += vector[1];
+            me.setPosition(xy);
+        }
+    },
+
+
+    
+    getConstrainVector: function(constrainTo){
+        var me = this,
+            el;
+
+        if (me.constrain || me.constrainHeader) {
+            el = me.constrainHeader ? me.header.el : me.el;
+            constrainTo = constrainTo || (me.floatParent && me.floatParent.getTargetEl()) || me.container;
+            return el.getConstrainVector(constrainTo);
+        }
+    },
+
+    
+    alignTo: function(element, position, offsets) {
+        if (element.isComponent) {
+            element = element.getEl();
+        }
+        var xy = this.el.getAlignToXY(element, position, offsets);
+        this.setPagePosition(xy);
+        return this;
+    },
+
+    
+    toFront: function(preventFocus) {
+        var me = this;
+
+        
+        
+        if (me.zIndexParent) {
+            me.zIndexParent.toFront(true);
+        }
+        if (me.zIndexManager.bringToFront(me)) {
+            if (!Ext.isDefined(preventFocus)) {
+                preventFocus = !me.focusOnToFront;
+            }
+            if (!preventFocus) {
+                
+                
+                
+                me.focus(false, true);
+            }
+        }
+        return me;
+    },
+
+    
+    setActive: function(active, newActive) {
+        var me = this;
+        
+        if (active) {
+            if (me.el.shadow && !me.maximized) {
+                me.el.enableShadow(true);
+            }
+            me.fireEvent('activate', me);
+        } else {
+            
+            
+            if ((me instanceof Ext.window.Window) && (newActive instanceof Ext.window.Window)) {
+                me.el.disableShadow();
+            }
+            me.fireEvent('deactivate', me);
+        }
+    },
+
+    
+    toBack: function() {
+        this.zIndexManager.sendToBack(this);
+        return this;
+    },
+
+    
+    center: function() {
+        var me = this,
+            xy = me.el.getAlignToXY(me.container, 'c-c');
+        me.setPagePosition(xy);
+        return me;
+    },
+
+    
+    syncShadow : function(){
+        if (this.floating) {
+            this.el.sync(true);
+        }
+    },
+
+    
+    fitContainer: function() {
+        var parent = this.floatParent,
+            container = parent ? parent.getTargetEl() : this.container,
+            size = container.getViewSize(false);
+
+        this.setSize(size);
+    }
+});
+
+Ext.define('Ext.layout.Layout', {
+
+    
+
+    
+
+    isLayout: true,
+    initialized: false,
+
+    statics: {
+        create: function(layout, defaultType) {
+            var type;
+            if (layout instanceof Ext.layout.Layout) {
+                return Ext.createByAlias('layout.' + layout);
+            } else {
+                if (!layout || typeof layout === 'string') {
+                    type = layout || defaultType;
+                    layout = {};                    
+                }
+                else {
+                    type = layout.type || defaultType;
+                }
+                return Ext.createByAlias('layout.' + type, layout || {});
+            }
+        }
+    },
+
+    constructor : function(config) {
+        this.id = Ext.id(null, this.type + '-');
+        Ext.apply(this, config);
+    },
+
+    
+    layout : function() {
+        var me = this;
+        me.layoutBusy = true;
+        me.initLayout();
+
+        if (me.beforeLayout.apply(me, arguments) !== false) {
+            me.layoutCancelled = false;
+            me.onLayout.apply(me, arguments);
+            me.childrenChanged = false;
+            me.owner.needsLayout = false;
+            me.layoutBusy = false;
+            me.afterLayout.apply(me, arguments);
+        }
+        else {
+            me.layoutCancelled = true;
+        }
+        me.layoutBusy = false;
+        me.doOwnerCtLayouts();
+    },
+
+    beforeLayout : function() {
+        this.renderChildren();
+        return true;
+    },
+
+    renderChildren: function () {
+        this.renderItems(this.getLayoutItems(), this.getRenderTarget());
+    },
+
+    
+    renderItems : function(items, target) {
+        var me = this,
+            ln = items.length,
+            i = 0,
+            item;
+
+        for (; i < ln; i++) {
+            item = items[i];
+            if (item && !item.rendered) {
+                me.renderItem(item, target, i);
+            } else if (!me.isValidParent(item, target, i)) {
+                me.moveItem(item, target, i);
+            } else {
+                
+                me.configureItem(item);
+            }
+        }
+    },
+
+    
+    isValidParent : function(item, target, position) {
+        var dom = item.el ? item.el.dom : Ext.getDom(item);
+        if (dom && target && target.dom) {
+            if (Ext.isNumber(position) && dom !== target.dom.childNodes[position]) {
+                return false;
+            }
+            return (dom.parentNode == (target.dom || target));
+        }
+        return false;
+    },
+
+    
+    renderItem : function(item, target, position) {
+        var me = this;
+        if (!item.rendered) {
+            if (me.itemCls) {
+                item.addCls(me.itemCls);
+            }
+            if (me.owner.itemCls) {
+                item.addCls(me.owner.itemCls);
+            }
+            item.render(target, position);
+            me.configureItem(item);
+            me.childrenChanged = true;
+        }
+    },
+
+    
+    moveItem : function(item, target, position) {
+        
+        target = target.dom || target;
+        if (typeof position == 'number') {
+            position = target.childNodes[position];
+        }
+        target.insertBefore(item.el.dom, position || null);
+        item.container = Ext.get(target);
+        this.configureItem(item);
+        this.childrenChanged = true;
+    },
+
+    
+    initLayout : function() {
+        var me = this,
+            targetCls = me.targetCls;
+            
+        if (!me.initialized && !Ext.isEmpty(targetCls)) {
+            me.getTarget().addCls(targetCls);
+        }
+        me.initialized = true;
+    },
+
+    
+    setOwner : function(owner) {
+        this.owner = owner;
+    },
+
+    
+    getLayoutItems : function() {
+        return [];
+    },
+
+    
+    configureItem: Ext.emptyFn,
+    
+    
+    onLayout : Ext.emptyFn,
+    afterLayout : Ext.emptyFn,
+    onRemove : Ext.emptyFn,
+    onDestroy : Ext.emptyFn,
+    doOwnerCtLayouts : Ext.emptyFn,
+
+    
+    afterRemove : function(item) {
+        var el = item.el,
+            owner = this.owner,
+            itemCls = this.itemCls,
+            ownerCls = owner.itemCls;
+            
+        
+        if (item.rendered && !item.isDestroyed) {
+            if (itemCls) {
+                el.removeCls(itemCls);
+            }
+            if (ownerCls) {
+                el.removeCls(ownerCls);
+            }
+        }
+
+        
+        
+        
+        delete item.layoutManagedWidth;
+        delete item.layoutManagedHeight;
+    },
+
+    
+    destroy : function() {
+        var targetCls = this.targetCls,
+            target;
+        
+        if (!Ext.isEmpty(targetCls)) {
+            target = this.getTarget();
+            if (target) {
+                target.removeCls(targetCls);
+            }
+        }
+        this.onDestroy();
+    }
+});
+
+Ext.define('Ext.ZIndexManager', {
+
+    alternateClassName: 'Ext.WindowGroup',
+
+    statics: {
+        zBase : 9000
+    },
+
+    constructor: function(container) {
+        var me = this;
+
+        me.list = {};
+        me.zIndexStack = [];
+        me.front = null;
+
+        if (container) {
+
+            
+            if (container.isContainer) {
+                container.on('resize', me._onContainerResize, me);
+                me.zseed = Ext.Number.from(container.getEl().getStyle('zIndex'), me.getNextZSeed());
+                
+                me.targetEl = container.getTargetEl();
+                me.container = container;
+            }
+            
+            else {
+                Ext.EventManager.onWindowResize(me._onContainerResize, me);
+                me.zseed = me.getNextZSeed();
+                me.targetEl = Ext.get(container);
+            }
+        }
+        
+        
+        else {
+            Ext.EventManager.onWindowResize(me._onContainerResize, me);
+            me.zseed = me.getNextZSeed();
+            Ext.onDocumentReady(function() {
+                me.targetEl = Ext.getBody();
+            });
+        }
+    },
+
+    getNextZSeed: function() {
+        return (Ext.ZIndexManager.zBase += 10000);
+    },
+
+    setBase: function(baseZIndex) {
+        this.zseed = baseZIndex;
+        return this.assignZIndices();
+    },
+
+    
+    assignZIndices: function() {
+        var a = this.zIndexStack,
+            len = a.length,
+            i = 0,
+            zIndex = this.zseed,
+            comp;
+
+        for (; i < len; i++) {
+            comp = a[i];
+            if (comp && !comp.hidden) {
+
+                
+                
+                
+                
+                
+                
+                
+                zIndex = comp.setZIndex(zIndex);
+            }
+        }
+        this._activateLast();
+        return zIndex;
+    },
+
+    
+    _setActiveChild: function(comp) {
+        if (comp !== this.front) {
+
+            if (this.front) {
+                this.front.setActive(false, comp);
+            }
+            this.front = comp;
+            if (comp) {
+                comp.setActive(true);
+                if (comp.modal) {
+                    this._showModalMask(comp);
+                }
+            }
+        }
+    },
+
+    
+    _activateLast: function(justHidden) {
+        var comp,
+            lastActivated = false,
+            i;
+
+        
+        
+        
+        for (i = this.zIndexStack.length-1; i >= 0; --i) {
+            comp = this.zIndexStack[i];
+            if (!comp.hidden) {
+                if (!lastActivated) {
+                    this._setActiveChild(comp);
+                    lastActivated = true;
+                }
+
+                
+                if (comp.modal) {
+                    this._showModalMask(comp);
+                    return;
+                }
+            }
+        }
+
+        
+        
+        this._hideModalMask();
+        if (!lastActivated) {
+            this._setActiveChild(null);
+        }
+    },
+
+    _showModalMask: function(comp) {
+        var zIndex = comp.el.getStyle('zIndex') - 4,
+            maskTarget = comp.floatParent ? comp.floatParent.getTargetEl() : Ext.get(comp.getEl().dom.parentNode),
+            parentBox;
+        
+        if (!maskTarget) {
+            return;
+        }
+        
+        parentBox = maskTarget.getBox();
+
+        if (!this.mask) {
+            this.mask = Ext.getBody().createChild({
+                cls: Ext.baseCSSPrefix + 'mask'
+            });
+            this.mask.setVisibilityMode(Ext.Element.DISPLAY);
+            this.mask.on('click', this._onMaskClick, this);
+        }
+        if (maskTarget.dom === document.body) {
+            parentBox.height = Ext.Element.getViewHeight();
+        }
+        maskTarget.addCls(Ext.baseCSSPrefix + 'body-masked');
+        this.mask.setBox(parentBox);
+        this.mask.setStyle('zIndex', zIndex);
+        this.mask.show();
+    },
+
+    _hideModalMask: function() {
+        if (this.mask && this.mask.dom.parentNode) {
+            Ext.get(this.mask.dom.parentNode).removeCls(Ext.baseCSSPrefix + 'body-masked');
+            this.mask.hide();
+        }
+    },
+
+    _onMaskClick: function() {
+        if (this.front) {
+            this.front.focus();
+        }
+    },
+
+    _onContainerResize: function() {
+        if (this.mask && this.mask.isVisible()) {
+            this.mask.setSize(Ext.get(this.mask.dom.parentNode).getViewSize(true));
+        }
+    },
+
+    
+    register : function(comp) {
+        if (comp.zIndexManager) {
+            comp.zIndexManager.unregister(comp);
+        }
+        comp.zIndexManager = this;
+
+        this.list[comp.id] = comp;
+        this.zIndexStack.push(comp);
+        comp.on('hide', this._activateLast, this);
+    },
+
+    
+    unregister : function(comp) {
+        delete comp.zIndexManager;
+        if (this.list && this.list[comp.id]) {
+            delete this.list[comp.id];
+            comp.un('hide', this._activateLast);
+            Ext.Array.remove(this.zIndexStack, comp);
+
+            
+            this._activateLast(comp);
+        }
+    },
+
+    
+    get : function(id) {
+        return typeof id == "object" ? id : this.list[id];
+    },
+
+   
+    bringToFront : function(comp) {
+        comp = this.get(comp);
+        if (comp !== this.front) {
+            Ext.Array.remove(this.zIndexStack, comp);
+            this.zIndexStack.push(comp);
+            this.assignZIndices();
+            return true;
+        }
+        if (comp.modal) {
+            this._showModalMask(comp);
+        }
+        return false;
+    },
+
+    
+    sendToBack : function(comp) {
+        comp = this.get(comp);
+        Ext.Array.remove(this.zIndexStack, comp);
+        this.zIndexStack.unshift(comp);
+        this.assignZIndices();
+        return comp;
+    },
+
+    
+    hideAll : function() {
+        for (var id in this.list) {
+            if (this.list[id].isComponent && this.list[id].isVisible()) {
+                this.list[id].hide();
+            }
+        }
+    },
+
+    
+    hide: function() {
+        var i = 0,
+            ln = this.zIndexStack.length,
+            comp;
+
+        this.tempHidden = [];
+        for (; i < ln; i++) {
+            comp = this.zIndexStack[i];
+            if (comp.isVisible()) {
+                this.tempHidden.push(comp);
+                comp.hide();
+            }
+        }
+    },
+
+    
+    show: function() {
+        var i = 0,
+            ln = this.tempHidden.length,
+            comp,
+            x,
+            y;
+
+        for (; i < ln; i++) {
+            comp = this.tempHidden[i];
+            x = comp.x;
+            y = comp.y;
+            comp.show();
+            comp.setPosition(x, y);
+        }
+        delete this.tempHidden;
+    },
+
+    
+    getActive : function() {
+        return this.front;
+    },
+
+    
+    getBy : function(fn, scope) {
+        var r = [],
+            i = 0,
+            len = this.zIndexStack.length,
+            comp;
+
+        for (; i < len; i++) {
+            comp = this.zIndexStack[i];
+            if (fn.call(scope||comp, comp) !== false) {
+                r.push(comp);
+            }
+        }
+        return r;
+    },
+
+    
+    each : function(fn, scope) {
+        var comp;
+        for (var id in this.list) {
+            comp = this.list[id];
+            if (comp.isComponent && fn.call(scope || comp, comp) === false) {
+                return;
+            }
+        }
+    },
+
+    
+    eachBottomUp: function (fn, scope) {
+        var comp,
+            stack = this.zIndexStack,
+            i, n;
+
+        for (i = 0, n = stack.length ; i < n; i++) {
+            comp = stack[i];
+            if (comp.isComponent && fn.call(scope || comp, comp) === false) {
+                return;
+            }
+        }
+    },
+
+    
+    eachTopDown: function (fn, scope) {
+        var comp,
+            stack = this.zIndexStack,
+            i;
+
+        for (i = stack.length ; i-- > 0; ) {
+            comp = stack[i];
+            if (comp.isComponent && fn.call(scope || comp, comp) === false) {
+                return;
+            }
+        }
+    },
+
+    destroy: function() {
+        this.each(function(c) {
+            c.destroy();
+        });
+        delete this.zIndexStack;
+        delete this.list;
+        delete this.container;
+        delete this.targetEl;
+    }
+}, function() {
+    
+    Ext.WindowManager = Ext.WindowMgr = new this();
+});
+
+
+Ext.define('Ext.layout.container.boxOverflow.None', {
+    
+    alternateClassName: 'Ext.layout.boxOverflow.None',
+    
+    constructor: function(layout, config) {
+        this.layout = layout;
+        Ext.apply(this, config || {});
+    },
+
+    handleOverflow: Ext.emptyFn,
+
+    clearOverflow: Ext.emptyFn,
+    
+    onRemove: Ext.emptyFn,
+
+    
+    getItem: function(item) {
+        return this.layout.owner.getComponent(item);
+    },
+    
+    onRemove: Ext.emptyFn
+});
+
+Ext.define('Ext.util.KeyMap', {
+    alternateClassName: 'Ext.KeyMap',
+
+    
+    constructor: function(el, binding, eventName){
+        var me = this;
+
+        Ext.apply(me, {
+            el: Ext.get(el),
+            eventName: eventName || me.eventName,
+            bindings: []
+        });
+        if (binding) {
+            me.addBinding(binding);
+        }
+        me.enable();
+    },
+
+    eventName: 'keydown',
+
+    
+    addBinding : function(binding){
+        if (Ext.isArray(binding)) {
+            Ext.each(binding, this.addBinding, this);
+            return;
+        }
+
+        var keyCode = binding.key,
+            processed = false,
+            key,
+            keys,
+            keyString,
+            i,
+            len;
+
+        if (Ext.isString(keyCode)) {
+            keys = [];
+            keyString = keyCode.toUpperCase();
+
+            for (i = 0, len = keyString.length; i < len; ++i){
+                keys.push(keyString.charCodeAt(i));
+            }
+            keyCode = keys;
+            processed = true;
+        }
+
+        if (!Ext.isArray(keyCode)) {
+            keyCode = [keyCode];
+        }
+
+        if (!processed) {
+            for (i = 0, len = keyCode.length; i < len; ++i) {
+                key = keyCode[i];
+                if (Ext.isString(key)) {
+                    keyCode[i] = key.toUpperCase().charCodeAt(0);
+                }
+            }
+        }
+
+        this.bindings.push(Ext.apply({
+            keyCode: keyCode
+        }, binding));
+    },
+
+    
+    handleKeyDown: function(event) {
+        if (this.enabled) { 
+            var bindings = this.bindings,
+                i = 0,
+                len = bindings.length;
+
+            event = this.processEvent(event);
+            for(; i < len; ++i){
+                this.processBinding(bindings[i], event);
+            }
+        }
+    },
+
+    
+    processEvent: function(event){
+        return event;
+    },
+
+    
+    processBinding: function(binding, event){
+        if (this.checkModifiers(binding, event)) {
+            var key = event.getKey(),
+                handler = binding.fn || binding.handler,
+                scope = binding.scope || this,
+                keyCode = binding.keyCode,
+                defaultEventAction = binding.defaultEventAction,
+                i,
+                len,
+                keydownEvent = new Ext.EventObjectImpl(event);
+
+
+            for (i = 0, len = keyCode.length; i < len; ++i) {
+                if (key === keyCode[i]) {
+                    if (handler.call(scope, key, event) !== true && defaultEventAction) {
+                        keydownEvent[defaultEventAction]();
+                    }
+                    break;
+                }
+            }
+        }
+    },
+
+    
+    checkModifiers: function(binding, e){
+        var keys = ['shift', 'ctrl', 'alt'],
+            i = 0,
+            len = keys.length,
+            val, key;
+
+        for (; i < len; ++i){
+            key = keys[i];
+            val = binding[key];
+            if (!(val === undefined || (val === e[key + 'Key']))) {
+                return false;
+            }
+        }
+        return true;
+    },
+
+    
+    on: function(key, fn, scope) {
+        var keyCode, shift, ctrl, alt;
+        if (Ext.isObject(key) && !Ext.isArray(key)) {
+            keyCode = key.key;
+            shift = key.shift;
+            ctrl = key.ctrl;
+            alt = key.alt;
+        } else {
+            keyCode = key;
+        }
+        this.addBinding({
+            key: keyCode,
+            shift: shift,
+            ctrl: ctrl,
+            alt: alt,
+            fn: fn,
+            scope: scope
+        });
+    },
+
+    
+    isEnabled : function(){
+        return this.enabled;
+    },
+
+    
+    enable: function(){
+        var me = this;
+        
+        if (!me.enabled) {
+            me.el.on(me.eventName, me.handleKeyDown, me);
+            me.enabled = true;
+        }
+    },
+
+    
+    disable: function(){
+        var me = this;
+        
+        if (me.enabled) {
+            me.el.removeListener(me.eventName, me.handleKeyDown, me);
+            me.enabled = false;
+        }
+    },
+
+    
+    setDisabled : function(disabled){
+        if (disabled) {
+            this.disable();
+        } else {
+            this.enable();
+        }
+    },
+
+    
+    destroy: function(removeEl){
+        var me = this;
+
+        me.bindings = [];
+        me.disable();
+        if (removeEl === true) {
+            me.el.remove();
+        }
+        delete me.el;
+    }
+});
+
+Ext.define('Ext.util.ClickRepeater', {
+    extend: 'Ext.util.Observable',
+
+    
+    constructor : function(el, config){
+        this.el = Ext.get(el);
+        this.el.unselectable();
+
+        Ext.apply(this, config);
+
+        this.addEvents(
+        
+        "mousedown",
+        
+        "click",
+        
+        "mouseup"
+        );
+
+        if(!this.disabled){
+            this.disabled = true;
+            this.enable();
+        }
+
+        
+        if(this.handler){
+            this.on("click", this.handler,  this.scope || this);
+        }
+
+        this.callParent();
+    },
+
+    
+
+    
+
+    
+
+    
+    interval : 20,
+
+    
+    delay: 250,
+
+    
+    preventDefault : true,
+    
+    stopDefault : false,
+
+    timer : 0,
+
+    
+    enable: function(){
+        if(this.disabled){
+            this.el.on('mousedown', this.handleMouseDown, this);
+            if (Ext.isIE){
+                this.el.on('dblclick', this.handleDblClick, this);
+            }
+            if(this.preventDefault || this.stopDefault){
+                this.el.on('click', this.eventOptions, this);
+            }
+        }
+        this.disabled = false;
+    },
+
+    
+    disable: function( force){
+        if(force || !this.disabled){
+            clearTimeout(this.timer);
+            if(this.pressedCls){
+                this.el.removeCls(this.pressedCls);
+            }
+            Ext.getDoc().un('mouseup', this.handleMouseUp, this);
+            this.el.removeAllListeners();
+        }
+        this.disabled = true;
+    },
+
+    
+    setDisabled: function(disabled){
+        this[disabled ? 'disable' : 'enable']();
+    },
+
+    eventOptions: function(e){
+        if(this.preventDefault){
+            e.preventDefault();
+        }
+        if(this.stopDefault){
+            e.stopEvent();
+        }
+    },
+
+    
+    destroy : function() {
+        this.disable(true);
+        Ext.destroy(this.el);
+        this.clearListeners();
+    },
+
+    handleDblClick : function(e){
+        clearTimeout(this.timer);
+        this.el.blur();
+
+        this.fireEvent("mousedown", this, e);
+        this.fireEvent("click", this, e);
+    },
+
+    
+    handleMouseDown : function(e){
+        clearTimeout(this.timer);
+        this.el.blur();
+        if(this.pressedCls){
+            this.el.addCls(this.pressedCls);
+        }
+        this.mousedownTime = new Date();
+
+        Ext.getDoc().on("mouseup", this.handleMouseUp, this);
+        this.el.on("mouseout", this.handleMouseOut, this);
+
+        this.fireEvent("mousedown", this, e);
+        this.fireEvent("click", this, e);
+
+        
+        if (this.accelerate) {
+            this.delay = 400;
+        }
+
+        
+        
+        e = new Ext.EventObjectImpl(e);
+
+        this.timer =  Ext.defer(this.click, this.delay || this.interval, this, [e]);
+    },
+
+    
+    click : function(e){
+        this.fireEvent("click", this, e);
+        this.timer =  Ext.defer(this.click, this.accelerate ?
+            this.easeOutExpo(Ext.Date.getElapsed(this.mousedownTime),
+                400,
+                -390,
+                12000) :
+            this.interval, this, [e]);
+    },
+
+    easeOutExpo : function (t, b, c, d) {
+        return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+    },
+
+    
+    handleMouseOut : function(){
+        clearTimeout(this.timer);
+        if(this.pressedCls){
+            this.el.removeCls(this.pressedCls);
+        }
+        this.el.on("mouseover", this.handleMouseReturn, this);
+    },
+
+    
+    handleMouseReturn : function(){
+        this.el.un("mouseover", this.handleMouseReturn, this);
+        if(this.pressedCls){
+            this.el.addCls(this.pressedCls);
+        }
+        this.click();
+    },
+
+    
+    handleMouseUp : function(e){
+        clearTimeout(this.timer);
+        this.el.un("mouseover", this.handleMouseReturn, this);
+        this.el.un("mouseout", this.handleMouseOut, this);
+        Ext.getDoc().un("mouseup", this.handleMouseUp, this);
+        if(this.pressedCls){
+            this.el.removeCls(this.pressedCls);
+        }
+        this.fireEvent("mouseup", this, e);
+    }
+});
+
+
+Ext.define('Ext.layout.component.Component', {
+
+    
+
+    extend: 'Ext.layout.Layout',
+
+    
+
+    type: 'component',
+
+    monitorChildren: true,
+
+    initLayout : function() {
+        var me = this,
+            owner = me.owner,
+            ownerEl = owner.el;
+
+        if (!me.initialized) {
+            if (owner.frameSize) {
+                me.frameSize = owner.frameSize;
+            }
+            else {
+                owner.frameSize = me.frameSize = {
+                    top: 0,
+                    left: 0,
+                    bottom: 0,
+                    right: 0
+                };
+            }
+        }
+        me.callParent(arguments);
+    },
+
+    beforeLayout : function(width, height, isSetSize, callingContainer) {
+        this.callParent(arguments);
+
+        var me = this,
+            owner = me.owner,
+            ownerCt = owner.ownerCt,
+            layout = owner.layout,
+            isVisible = owner.isVisible(true),
+            ownerElChild = owner.el.child,
+            layoutCollection;
+
+        
+        me.previousComponentSize = me.lastComponentSize;
+
+        
+        if (!isSetSize
+            && ((!Ext.isNumber(width) && owner.isFixedWidth()) ||
+                (!Ext.isNumber(height) && owner.isFixedHeight()))
+            
+            && callingContainer && callingContainer !== ownerCt) {
+            
+            me.doContainerLayout();
+            return false;
+        }
+
+        
+        
+        if (!isVisible && (owner.hiddenAncestor || owner.floating)) {
+            if (owner.hiddenAncestor) {
+                layoutCollection = owner.hiddenAncestor.layoutOnShow;
+                layoutCollection.remove(owner);
+                layoutCollection.add(owner);
+            }
+            owner.needsLayout = {
+                width: width,
+                height: height,
+                isSetSize: false
+            };
+        }
+
+        if (isVisible && this.needsLayout(width, height)) {
+            return owner.beforeComponentLayout(width, height, isSetSize, callingContainer);
+        }
+        else {
+            return false;
+        }
+    },
+
+    
+    needsLayout : function(width, height) {
+        var me = this,
+            widthBeingChanged,
+            heightBeingChanged;
+            me.lastComponentSize = me.lastComponentSize || {
+                width: -Infinity,
+                height: -Infinity
+            };
+
+        
+        widthBeingChanged  = !Ext.isDefined(width)  || me.lastComponentSize.width  !== width;
+
+        
+        heightBeingChanged = !Ext.isDefined(height) || me.lastComponentSize.height !== height;
+
+
+        
+        return !me.isSizing && (me.childrenChanged || widthBeingChanged || heightBeingChanged);
+    },
+
+    
+    setElementSize: function(el, width, height) {
+        if (width !== undefined && height !== undefined) {
+            el.setSize(width, height);
+        }
+        else if (height !== undefined) {
+            el.setHeight(height);
+        }
+        else if (width !== undefined) {
+            el.setWidth(width);
+        }
+    },
+
+    
+     getTarget : function() {
+         return this.owner.el;
+     },
+
+    
+    getRenderTarget : function() {
+        return this.owner.el;
+    },
+
+    
+    setTargetSize : function(width, height) {
+        var me = this;
+        me.setElementSize(me.owner.el, width, height);
+
+        if (me.owner.frameBody) {
+            var targetInfo = me.getTargetInfo(),
+                padding = targetInfo.padding,
+                border = targetInfo.border,
+                frameSize = me.frameSize;
+
+            me.setElementSize(me.owner.frameBody,
+                Ext.isNumber(width) ? (width - frameSize.left - frameSize.right - padding.left - padding.right - border.left - border.right) : width,
+                Ext.isNumber(height) ? (height - frameSize.top - frameSize.bottom - padding.top - padding.bottom - border.top - border.bottom) : height
+            );
+        }
+
+        me.autoSized = {
+            width: !Ext.isNumber(width),
+            height: !Ext.isNumber(height)
+        };
+
+        me.lastComponentSize = {
+            width: width,
+            height: height
+        };
+    },
+
+    getTargetInfo : function() {
+        if (!this.targetInfo) {
+            var target = this.getTarget(),
+                body = this.owner.getTargetEl();
+
+            this.targetInfo = {
+                padding: {
+                    top: target.getPadding('t'),
+                    right: target.getPadding('r'),
+                    bottom: target.getPadding('b'),
+                    left: target.getPadding('l')
+                },
+                border: {
+                    top: target.getBorderWidth('t'),
+                    right: target.getBorderWidth('r'),
+                    bottom: target.getBorderWidth('b'),
+                    left: target.getBorderWidth('l')
+                },
+                bodyMargin: {
+                    top: body.getMargin('t'),
+                    right: body.getMargin('r'),
+                    bottom: body.getMargin('b'),
+                    left: body.getMargin('l')
+                }
+            };
+        }
+        return this.targetInfo;
+    },
+
+    
+    doOwnerCtLayouts: function() {
+        var owner = this.owner,
+            ownerCt = owner.ownerCt,
+            ownerCtComponentLayout, ownerCtContainerLayout,
+            curSize = this.lastComponentSize,
+            prevSize = this.previousComponentSize,
+            widthChange  = (prevSize && curSize && Ext.isNumber(curSize.width )) ? curSize.width  !== prevSize.width  : true,
+            heightChange = (prevSize && curSize && Ext.isNumber(curSize.height)) ? curSize.height !== prevSize.height : true;
+
+        
+        if (!ownerCt || (!widthChange && !heightChange)) {
+            return;
+        }
+
+        ownerCtComponentLayout = ownerCt.componentLayout;
+        ownerCtContainerLayout = ownerCt.layout;
+
+        if (!owner.floating && ownerCtComponentLayout && ownerCtComponentLayout.monitorChildren && !ownerCtComponentLayout.layoutBusy) {
+            if (!ownerCt.suspendLayout && ownerCtContainerLayout && !ownerCtContainerLayout.layoutBusy) {
+
+                
+                if (((widthChange && !ownerCt.isFixedWidth()) || (heightChange && !ownerCt.isFixedHeight()))) {
+                    
+                    this.isSizing = true;
+                    ownerCt.doComponentLayout();
+                    this.isSizing = false;
+                }
+                
+                else if (ownerCtContainerLayout.bindToOwnerCtContainer === true) {
+                    ownerCtContainerLayout.layout();
+                }
+            }
+        }
+    },
+
+    doContainerLayout: function() {
+        var me = this,
+            owner = me.owner,
+            ownerCt = owner.ownerCt,
+            layout = owner.layout,
+            ownerCtComponentLayout;
+
+        
+        
+        if (!owner.suspendLayout && layout && layout.isLayout && !layout.layoutBusy && !layout.isAutoDock) {
+            layout.layout();
+        }
+
+        
+        if (ownerCt && ownerCt.componentLayout) {
+            ownerCtComponentLayout = ownerCt.componentLayout;
+            if (!owner.floating && ownerCtComponentLayout.monitorChildren && !ownerCtComponentLayout.layoutBusy) {
+                ownerCtComponentLayout.childrenChanged = true;
+            }
+        }
+    },
+
+    afterLayout : function(width, height, isSetSize, layoutOwner) {
+        this.doContainerLayout();
+        this.owner.afterComponentLayout(width, height, isSetSize, layoutOwner);
+    }
+});
+
+
+Ext.define('Ext.util.TextMetrics', {
+    statics: {
+        shared: null,
+        
+        measure: function(el, text, fixedWidth){
+            var me = this,
+                shared = me.shared;
+            
+            if(!shared){
+                shared = me.shared = new me(el, fixedWidth);
+            }
+            shared.bind(el);
+            shared.setFixedWidth(fixedWidth || 'auto');
+            return shared.getSize(text);
+        },
+        
+        
+         destroy: function(){
+             var me = this;
+             Ext.destroy(me.shared);
+             me.shared = null;
+         }
+    },
+    
+    
+    constructor: function(bindTo, fixedWidth){
+        var measure = this.measure = Ext.getBody().createChild({
+            cls: 'x-textmetrics'
+        });
+        this.el = Ext.get(bindTo);
+        
+        measure.position('absolute');
+        measure.setLeftTop(-1000, -1000);
+        measure.hide();
+
+        if (fixedWidth) {
+           measure.setWidth(fixedWidth);
+        }
+    },
+    
+    
+    getSize: function(text){
+        var measure = this.measure,
+            size;
+        
+        measure.update(text);
+        size = measure.getSize();
+        measure.update('');
+        return size;
+    },
+    
+    
+    bind: function(el){
+        var me = this;
+        
+        me.el = Ext.get(el);
+        me.measure.setStyle(
+            me.el.getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')
+        );
+    },
+    
+    
+     setFixedWidth : function(width){
+         this.measure.setWidth(width);
+     },
+     
+     
+     getWidth : function(text){
+         this.measure.dom.style.width = 'auto';
+         return this.getSize(text).width;
+     },
+     
+     
+     getHeight : function(text){
+         return this.getSize(text).height;
+     },
+     
+     
+     destroy: function(){
+         var me = this;
+         me.measure.remove();
+         delete me.el;
+         delete me.measure;
+     }
+}, function(){
+    Ext.Element.addMethods({
+        
+        getTextWidth : function(text, min, max){
+            return Ext.Number.constrain(Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width, min || 0, max || 1000000);
+        }
+    });
+});
+
+
+Ext.define('Ext.layout.container.boxOverflow.Scroller', {
+
+    
+
+    extend: 'Ext.layout.container.boxOverflow.None',
+    requires: ['Ext.util.ClickRepeater', 'Ext.Element'],
+    alternateClassName: 'Ext.layout.boxOverflow.Scroller',
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+    
+    
+
+    
+    animateScroll: false,
+
+    
+    scrollIncrement: 20,
+
+    
+    wheelIncrement: 10,
+
+    
+    scrollRepeatInterval: 60,
+
+    
+    scrollDuration: 400,
+
+    
+
+    
+
+    
+    scrollerCls: Ext.baseCSSPrefix + 'box-scroller',
+
+    
+
+    
+    
+    constructor: function(layout, config) {
+        this.layout = layout;
+        Ext.apply(this, config || {});
+        
+        this.addEvents(
+            
+            'scroll'
+        );
+    },
+    
+    initCSSClasses: function() {
+        var me = this,
+        layout = me.layout;
+
+        if (!me.CSSinitialized) {
+            me.beforeCtCls = me.beforeCtCls || Ext.baseCSSPrefix + 'box-scroller-' + layout.parallelBefore;
+            me.afterCtCls  = me.afterCtCls  || Ext.baseCSSPrefix + 'box-scroller-' + layout.parallelAfter;
+            me.beforeScrollerCls = me.beforeScrollerCls || Ext.baseCSSPrefix + layout.owner.getXType() + '-scroll-' + layout.parallelBefore;
+            me.afterScrollerCls  = me.afterScrollerCls  || Ext.baseCSSPrefix + layout.owner.getXType() + '-scroll-' + layout.parallelAfter;
+            me.CSSinitializes = true;
+        }
+    },
+
+    handleOverflow: function(calculations, targetSize) {
+        var me = this,
+            layout = me.layout,
+            methodName = 'get' + layout.parallelPrefixCap,
+            newSize = {};
+
+        me.initCSSClasses();
+        me.callParent(arguments);
+        this.createInnerElements();
+        this.showScrollers();
+        newSize[layout.perpendicularPrefix] = targetSize[layout.perpendicularPrefix];
+        newSize[layout.parallelPrefix] = targetSize[layout.parallelPrefix] - (me.beforeCt[methodName]() + me.afterCt[methodName]());
+        return { targetSize: newSize };
+    },
+
+    
+    createInnerElements: function() {
+        var me = this,
+            target = me.layout.getRenderTarget();
+
+        
+        
+        if (!me.beforeCt) {
+            target.addCls(Ext.baseCSSPrefix + me.layout.direction + '-box-overflow-body');
+            me.beforeCt = target.insertSibling({cls: Ext.layout.container.Box.prototype.innerCls + ' ' + me.beforeCtCls}, 'before');
+            me.afterCt  = target.insertSibling({cls: Ext.layout.container.Box.prototype.innerCls + ' ' + me.afterCtCls},  'after');
+            me.createWheelListener();
+        }
+    },
+
+    
+    createWheelListener: function() {
+        this.layout.innerCt.on({
+            scope     : this,
+            mousewheel: function(e) {
+                e.stopEvent();
+
+                this.scrollBy(e.getWheelDelta() * this.wheelIncrement * -1, false);
+            }
+        });
+    },
+
+    
+    clearOverflow: function() {
+        this.hideScrollers();
+    },
+
+    
+    showScrollers: function() {
+        this.createScrollers();
+        this.beforeScroller.show();
+        this.afterScroller.show();
+        this.updateScrollButtons();
+        
+        this.layout.owner.addClsWithUI('scroller');
+    },
+
+    
+    hideScrollers: function() {
+        if (this.beforeScroller != undefined) {
+            this.beforeScroller.hide();
+            this.afterScroller.hide();
+            
+            this.layout.owner.removeClsWithUI('scroller');
+        }
+    },
+
+    
+    createScrollers: function() {
+        if (!this.beforeScroller && !this.afterScroller) {
+            var before = this.beforeCt.createChild({
+                cls: Ext.String.format("{0} {1} ", this.scrollerCls, this.beforeScrollerCls)
+            });
+
+            var after = this.afterCt.createChild({
+                cls: Ext.String.format("{0} {1}", this.scrollerCls, this.afterScrollerCls)
+            });
+
+            before.addClsOnOver(this.beforeScrollerCls + '-hover');
+            after.addClsOnOver(this.afterScrollerCls + '-hover');
+
+            before.setVisibilityMode(Ext.Element.DISPLAY);
+            after.setVisibilityMode(Ext.Element.DISPLAY);
+
+            this.beforeRepeater = Ext.create('Ext.util.ClickRepeater', before, {
+                interval: this.scrollRepeatInterval,
+                handler : this.scrollLeft,
+                scope   : this
+            });
+
+            this.afterRepeater = Ext.create('Ext.util.ClickRepeater', after, {
+                interval: this.scrollRepeatInterval,
+                handler : this.scrollRight,
+                scope   : this
+            });
+
+            
+            this.beforeScroller = before;
+
+            
+            this.afterScroller = after;
+        }
+    },
+
+    
+    destroy: function() {
+        Ext.destroy(this.beforeRepeater, this.afterRepeater, this.beforeScroller, this.afterScroller, this.beforeCt, this.afterCt);
+    },
+
+    
+    scrollBy: function(delta, animate) {
+        this.scrollTo(this.getScrollPosition() + delta, animate);
+    },
+
+    
+    getScrollAnim: function() {
+        return {
+            duration: this.scrollDuration, 
+            callback: this.updateScrollButtons, 
+            scope   : this
+        };
+    },
+
+    
+    updateScrollButtons: function() {
+        if (this.beforeScroller == undefined || this.afterScroller == undefined) {
+            return;
+        }
+
+        var beforeMeth = this.atExtremeBefore()  ? 'addCls' : 'removeCls',
+            afterMeth  = this.atExtremeAfter() ? 'addCls' : 'removeCls',
+            beforeCls  = this.beforeScrollerCls + '-disabled',
+            afterCls   = this.afterScrollerCls  + '-disabled';
+        
+        this.beforeScroller[beforeMeth](beforeCls);
+        this.afterScroller[afterMeth](afterCls);
+        this.scrolling = false;
+    },
+
+    
+    atExtremeBefore: function() {
+        return this.getScrollPosition() === 0;
+    },
+
+    
+    scrollLeft: function() {
+        this.scrollBy(-this.scrollIncrement, false);
+    },
+
+    
+    scrollRight: function() {
+        this.scrollBy(this.scrollIncrement, false);
+    },
+
+    
+    getScrollPosition: function(){
+        var layout = this.layout;
+        return parseInt(layout.innerCt.dom['scroll' + layout.parallelBeforeCap], 10) || 0;
+    },
+
+    
+    getMaxScrollPosition: function() {
+        var layout = this.layout;
+        return layout.innerCt.dom['scroll' + layout.parallelPrefixCap] - this.layout.innerCt['get' + layout.parallelPrefixCap]();
+    },
+
+    
+    atExtremeAfter: function() {
+        return this.getScrollPosition() >= this.getMaxScrollPosition();
+    },
+
+    
+    scrollTo: function(position, animate) {
+        var me = this,
+            layout = me.layout,
+            oldPosition = me.getScrollPosition(),
+            newPosition = Ext.Number.constrain(position, 0, me.getMaxScrollPosition());
+
+        if (newPosition != oldPosition && !me.scrolling) {
+            if (animate == undefined) {
+                animate = me.animateScroll;
+            }
+
+            layout.innerCt.scrollTo(layout.parallelBefore, newPosition, animate ? me.getScrollAnim() : false);
+            if (animate) {
+                me.scrolling = true;
+            } else {
+                me.scrolling = false;
+                me.updateScrollButtons();
+            }
+            
+            me.fireEvent('scroll', me, newPosition, animate ? me.getScrollAnim() : false);
+        }
+    },
+
+    
+    scrollToItem: function(item, animate) {
+        var me = this,
+            layout = me.layout,
+            visibility,
+            box,
+            newPos;
+
+        item = me.getItem(item);
+        if (item != undefined) {
+            visibility = this.getItemVisibility(item);
+            if (!visibility.fullyVisible) {
+                box  = item.getBox(true, true);
+                newPos = box[layout.parallelPosition];
+                if (visibility.hiddenEnd) {
+                    newPos -= (this.layout.innerCt['get' + layout.parallelPrefixCap]() - box[layout.parallelPrefix]);
+                }
+                this.scrollTo(newPos, animate);
+            }
+        }
+    },
+
+    
+    getItemVisibility: function(item) {
+        var me          = this,
+            box         = me.getItem(item).getBox(true, true),
+            layout      = me.layout,
+            itemStart   = box[layout.parallelPosition],
+            itemEnd     = itemStart + box[layout.parallelPrefix],
+            scrollStart = me.getScrollPosition(),
+            scrollEnd   = scrollStart + layout.innerCt['get' + layout.parallelPrefixCap]();
+
+        return {
+            hiddenStart : itemStart < scrollStart,
+            hiddenEnd   : itemEnd > scrollEnd,
+            fullyVisible: itemStart > scrollStart && itemEnd < scrollEnd
+        };
+    }
+});
+
+Ext.define('Ext.util.Offset', {
+
+    
+
+    statics: {
+        fromObject: function(obj) {
+            return new this(obj.x, obj.y);
+        }
+    },
+
+    
+
+    constructor: function(x, y) {
+        this.x = (x != null && !isNaN(x)) ? x : 0;
+        this.y = (y != null && !isNaN(y)) ? y : 0;
+
+        return this;
+    },
+
+    copy: function() {
+        return new Ext.util.Offset(this.x, this.y);
+    },
+
+    copyFrom: function(p) {
+        this.x = p.x;
+        this.y = p.y;
+    },
+
+    toString: function() {
+        return "Offset[" + this.x + "," + this.y + "]";
+    },
+
+    equals: function(offset) {
+
+        return (this.x == offset.x && this.y == offset.y);
+    },
+
+    round: function(to) {
+        if (!isNaN(to)) {
+            var factor = Math.pow(10, to);
+            this.x = Math.round(this.x * factor) / factor;
+            this.y = Math.round(this.y * factor) / factor;
+        } else {
+            this.x = Math.round(this.x);
+            this.y = Math.round(this.y);
+        }
+    },
+
+    isZero: function() {
+        return this.x == 0 && this.y == 0;
+    }
+});
+
+
+Ext.define('Ext.util.KeyNav', {
+    
+    alternateClassName: 'Ext.KeyNav',
+    
+    requires: ['Ext.util.KeyMap'],
+    
+    statics: {
+        keyOptions: {
+            left: 37,
+            right: 39,
+            up: 38,
+            down: 40,
+            space: 32,
+            pageUp: 33,
+            pageDown: 34,
+            del: 46,
+            backspace: 8,
+            home: 36,
+            end: 35,
+            enter: 13,
+            esc: 27,
+            tab: 9
+        }
+    },
+
+    
+    constructor: function(el, config){
+        this.setConfig(el, config || {});
+    },
+    
+    
+    setConfig: function(el, config) {
+        if (this.map) {
+            this.map.destroy();
+        }
+        
+        var map = Ext.create('Ext.util.KeyMap', el, null, this.getKeyEvent('forceKeyDown' in config ? config.forceKeyDown : this.forceKeyDown)),
+            keys = Ext.util.KeyNav.keyOptions,
+            scope = config.scope || this,
+            key;
+        
+        this.map = map;
+        for (key in keys) {
+            if (keys.hasOwnProperty(key)) {
+                if (config[key]) {
+                    map.addBinding({
+                        scope: scope,
+                        key: keys[key],
+                        handler: Ext.Function.bind(this.handleEvent, scope, [config[key]], true),
+                        defaultEventAction: config.defaultEventAction || this.defaultEventAction
+                    });
+                }
+            }
+        }
+        
+        map.disable();
+        if (!config.disabled) {
+            map.enable();
+        }
+    },
+    
+    
+    handleEvent: function(map, event, handler){
+        return handler.call(this, event);
+    },
+    
+    
+    disabled: false,
+    
+    
+    defaultEventAction: "stopEvent",
+    
+    
+    forceKeyDown: false,
+    
+    
+    destroy: function(removeEl){
+        this.map.destroy(removeEl);
+        delete this.map;
+    },
+
+    
+    enable: function() {
+        this.map.enable();
+        this.disabled = false;
+    },
+
+    
+    disable: function() {
+        this.map.disable();
+        this.disabled = true;
+    },
+    
+    
+    setDisabled : function(disabled){
+        this.map.setDisabled(disabled);
+        this.disabled = disabled;
+    },
+    
+    
+    getKeyEvent: function(forceKeyDown){
+        return (forceKeyDown || Ext.EventManager.useKeyDown) ? 'keydown' : 'keypress';
+    }
+});
+
+
+
+Ext.define('Ext.fx.Queue', {
+
+    requires: ['Ext.util.HashMap'],
+
+    constructor: function() {
+        this.targets = Ext.create('Ext.util.HashMap');
+        this.fxQueue = {};
+    },
+
+    
+    getFxDefaults: function(targetId) {
+        var target = this.targets.get(targetId);
+        if (target) {
+            return target.fxDefaults;
+        }
+        return {};
+    },
+
+    
+    setFxDefaults: function(targetId, obj) {
+        var target = this.targets.get(targetId);
+        if (target) {
+            target.fxDefaults = Ext.apply(target.fxDefaults || {}, obj);
+        }
+    },
+
+    
+    stopAnimation: function(targetId) {
+        var me = this,
+            queue = me.getFxQueue(targetId),
+            ln = queue.length;
+        while (ln) {
+            queue[ln - 1].end();
+            ln--;
+        }
+    },
+
+    
+    getActiveAnimation: function(targetId) {
+        var queue = this.getFxQueue(targetId);
+        return (queue && !!queue.length) ? queue[0] : false;
+    },
+
+    
+    hasFxBlock: function(targetId) {
+        var queue = this.getFxQueue(targetId);
+        return queue && queue[0] && queue[0].block;
+    },
+
+    
+    getFxQueue: function(targetId) {
+        if (!targetId) {
+            return false;
+        }
+        var me = this,
+            queue = me.fxQueue[targetId],
+            target = me.targets.get(targetId);
+
+        if (!target) {
+            return false;
+        }
+
+        if (!queue) {
+            me.fxQueue[targetId] = [];
+            
+            if (target.type != 'element') {
+                target.target.on('destroy', function() {
+                    me.fxQueue[targetId] = [];
+                });
+            }
+        }
+        return me.fxQueue[targetId];
+    },
+
+    
+    queueFx: function(anim) {
+        var me = this,
+            target = anim.target,
+            queue, ln;
+
+        if (!target) {
+            return;
+        }
+
+        queue = me.getFxQueue(target.getId());
+        ln = queue.length;
+
+        if (ln) {
+            if (anim.concurrent) {
+                anim.paused = false;
+            }
+            else {
+                queue[ln - 1].on('afteranimate', function() {
+                    anim.paused = false;
+                });
+            }
+        }
+        else {
+            anim.paused = false;
+        }
+        anim.on('afteranimate', function() {
+            Ext.Array.remove(queue, anim);
+            if (anim.remove) {
+                if (target.type == 'element') {
+                    var el = Ext.get(target.id);
+                    if (el) {
+                        el.remove();
+                    }
+                }
+            }
+        }, this);
+        queue.push(anim);
+    }
+});
+
+Ext.define('Ext.fx.target.Target', {
+
+    isAnimTarget: true,
+
+    
+    constructor: function(target) {
+        this.target = target;
+        this.id = this.getId();
+    },
+    
+    getId: function() {
+        return this.target.id;
+    }
+});
+
+
+
+Ext.define('Ext.fx.target.Sprite', {
+
+    
+
+    extend: 'Ext.fx.target.Target',
+
+    
+
+    type: 'draw',
+
+    getFromPrim: function(sprite, attr) {
+        var o;
+        if (attr == 'translate') {
+            o = {
+                x: sprite.attr.translation.x || 0,
+                y: sprite.attr.translation.y || 0
+            };
+        }
+        else if (attr == 'rotate') {
+            o = {
+                degrees: sprite.attr.rotation.degrees || 0,
+                x: sprite.attr.rotation.x,
+                y: sprite.attr.rotation.y
+            };
+        }
+        else {
+            o = sprite.attr[attr];
+        }
+        return o;
+    },
+
+    getAttr: function(attr, val) {
+        return [[this.target, val != undefined ? val : this.getFromPrim(this.target, attr)]];
+    },
+
+    setAttr: function(targetData) {
+        var ln = targetData.length,
+            spriteArr = [],
+            attrs, attr, attrArr, attPtr, spritePtr, idx, value, i, j, x, y, ln2;
+        for (i = 0; i < ln; i++) {
+            attrs = targetData[i].attrs;
+            for (attr in attrs) {
+                attrArr = attrs[attr];
+                ln2 = attrArr.length;
+                for (j = 0; j < ln2; j++) {
+                    spritePtr = attrArr[j][0];
+                    attPtr = attrArr[j][1];
+                    if (attr === 'translate') {
+                        value = {
+                            x: attPtr.x,
+                            y: attPtr.y
+                        };
+                    }
+                    else if (attr === 'rotate') {
+                        x = attPtr.x;
+                        if (isNaN(x)) {
+                            x = null;
+                        }
+                        y = attPtr.y;
+                        if (isNaN(y)) {
+                            y = null;
+                        }
+                        value = {
+                            degrees: attPtr.degrees,
+                            x: x,
+                            y: y
+                        };
+                    }
+                    else if (attr === 'width' || attr === 'height' || attr === 'x' || attr === 'y') {
+                        value = parseFloat(attPtr);
+                    }
+                    else {
+                        value = attPtr;
+                    }
+                    idx = Ext.Array.indexOf(spriteArr, spritePtr);
+                    if (idx == -1) {
+                        spriteArr.push([spritePtr, {}]);
+                        idx = spriteArr.length - 1;
+                    }
+                    spriteArr[idx][1][attr] = value;
+                }
+            }
+        }
+        ln = spriteArr.length;
+        for (i = 0; i < ln; i++) {
+            spritePtr = spriteArr[i];
+            spritePtr[0].setAttributes(spritePtr[1]);
+        }
+        this.target.redraw();
+    }
+});
+
+
+
+Ext.define('Ext.fx.target.CompositeSprite', {
+
+    
+
+    extend: 'Ext.fx.target.Sprite',
+
+    
+
+    getAttr: function(attr, val) {
+        var out = [],
+            target = this.target;
+        target.each(function(sprite) {
+            out.push([sprite, val != undefined ? val : this.getFromPrim(sprite, attr)]);
+        }, this);
+        return out;
+    }
+});
+
+
+Ext.define('Ext.fx.target.Component', {
+
+    
+   
+    extend: 'Ext.fx.target.Target',
+    
+    
+
+    type: 'component',
+
+    
+    getPropMethod: {
+        top: function() {
+            return this.getPosition(true)[1];
+        },
+        left: function() {
+            return this.getPosition(true)[0];
+        },
+        x: function() {
+            return this.getPosition()[0];
+        },
+        y: function() {
+            return this.getPosition()[1];
+        },
+        height: function() {
+            return this.getHeight();
+        },
+        width: function() {
+            return this.getWidth();
+        },
+        opacity: function() {
+            return this.el.getStyle('opacity');
+        }
+    },
+
+    compMethod: {
+        top: 'setPosition',
+        left: 'setPosition',
+        x: 'setPagePosition',
+        y: 'setPagePosition',
+        height: 'setSize',
+        width: 'setSize',
+        opacity: 'setOpacity'
+    },
+
+    
+    getAttr: function(attr, val) {
+        return [[this.target, val !== undefined ? val : this.getPropMethod[attr].call(this.target)]];
+    },
+
+    setAttr: function(targetData, isFirstFrame, isLastFrame) {
+        var me = this,
+            target = me.target,
+            ln = targetData.length,
+            attrs, attr, o, i, j, meth, targets, left, top, w, h;
+        for (i = 0; i < ln; i++) {
+            attrs = targetData[i].attrs;
+            for (attr in attrs) {
+                targets = attrs[attr].length;
+                meth = {
+                    setPosition: {},
+                    setPagePosition: {},
+                    setSize: {},
+                    setOpacity: {}
+                };
+                for (j = 0; j < targets; j++) {
+                    o = attrs[attr][j];
+                    
+                    
+                    
+                    
+                    meth[me.compMethod[attr]].target = o[0];
+                    meth[me.compMethod[attr]][attr] = o[1];
+                }
+                if (meth.setPosition.target) {
+                    o = meth.setPosition;
+                    left = (o.left === undefined) ? undefined : parseInt(o.left, 10);
+                    top = (o.top === undefined) ? undefined : parseInt(o.top, 10);
+                    o.target.setPosition(left, top);
+                }
+                if (meth.setPagePosition.target) {
+                    o = meth.setPagePosition;
+                    o.target.setPagePosition(o.x, o.y);
+                }
+                if (meth.setSize.target && meth.setSize.target.el) {
+                    o = meth.setSize;
+                    
+                    w = (o.width === undefined) ? o.target.getWidth() : parseInt(o.width, 10);
+                    h = (o.height === undefined) ? o.target.getHeight() : parseInt(o.height, 10);
+
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    if (isLastFrame || me.dynamic) {
+                        o.target.componentLayout.childrenChanged = true;
+
+                        
+                        if (me.layoutAnimation) {
+                            o.target.setCalculatedSize(w, h);
+                        } else {
+                            o.target.setSize(w, h);
+                        }
+                    }
+                    else {
+                        o.target.el.setSize(w, h);
+                    }
+                }
+                if (meth.setOpacity.target) {
+                    o = meth.setOpacity;
+                    o.target.el.setStyle('opacity', o.opacity);
+                }
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.fx.CubicBezier', {
+
+    
+
+    singleton: true,
+
+    
+
+    cubicBezierAtTime: function(t, p1x, p1y, p2x, p2y, duration) {
+        var cx = 3 * p1x,
+            bx = 3 * (p2x - p1x) - cx,
+            ax = 1 - cx - bx,
+            cy = 3 * p1y,
+            by = 3 * (p2y - p1y) - cy,
+            ay = 1 - cy - by;
+        function sampleCurveX(t) {
+            return ((ax * t + bx) * t + cx) * t;
+        }
+        function solve(x, epsilon) {
+            var t = solveCurveX(x, epsilon);
+            return ((ay * t + by) * t + cy) * t;
+        }
+        function solveCurveX(x, epsilon) {
+            var t0, t1, t2, x2, d2, i;
+            for (t2 = x, i = 0; i < 8; i++) {
+                x2 = sampleCurveX(t2) - x;
+                if (Math.abs(x2) < epsilon) {
+                    return t2;
+                }
+                d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;
+                if (Math.abs(d2) < 1e-6) {
+                    break;
+                }
+                t2 = t2 - x2 / d2;
+            }
+            t0 = 0;
+            t1 = 1;
+            t2 = x;
+            if (t2 < t0) {
+                return t0;
+            }
+            if (t2 > t1) {
+                return t1;
+            }
+            while (t0 < t1) {
+                x2 = sampleCurveX(t2);
+                if (Math.abs(x2 - x) < epsilon) {
+                    return t2;
+                }
+                if (x > x2) {
+                    t0 = t2;
+                } else {
+                    t1 = t2;
+                }
+                t2 = (t1 - t0) / 2 + t0;
+            }
+            return t2;
+        }
+        return solve(t, 1 / (200 * duration));
+    },
+
+    cubicBezier: function(x1, y1, x2, y2) {
+        var fn = function(pos) {
+            return Ext.fx.CubicBezier.cubicBezierAtTime(pos, x1, y1, x2, y2, 1);
+        };
+        fn.toCSS3 = function() {
+            return 'cubic-bezier(' + [x1, y1, x2, y2].join(',') + ')';
+        };
+        fn.reverse = function() {
+            return Ext.fx.CubicBezier.cubicBezier(1 - x2, 1 - y2, 1 - x1, 1 - y1);
+        };
+        return fn;
+    }
+});
+
+Ext.define('Ext.draw.Color', {
+
+    
+
+    
+
+    colorToHexRe: /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/,
+    rgbRe: /\s*rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)\s*/,
+    hexRe: /\s*#([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)\s*/,
+
+    
+    lightnessFactor: 0.2,
+
+    
+    constructor : function(red, green, blue) {
+        var me = this,
+            clamp = Ext.Number.constrain;
+        me.r = clamp(red, 0, 255);
+        me.g = clamp(green, 0, 255);
+        me.b = clamp(blue, 0, 255);
+    },
+
+    
+    getRed: function() {
+        return this.r;
+    },
+
+    
+    getGreen: function() {
+        return this.g;
+    },
+
+    
+    getBlue: function() {
+        return this.b;
+    },
+
+    
+    getRGB: function() {
+        var me = this;
+        return [me.r, me.g, me.b];
+    },
+
+    
+    getHSL: function() {
+        var me = this,
+            r = me.r / 255,
+            g = me.g / 255,
+            b = me.b / 255,
+            max = Math.max(r, g, b),
+            min = Math.min(r, g, b),
+            delta = max - min,
+            h,
+            s = 0,
+            l = 0.5 * (max + min);
+
+        
+        if (min != max) {
+            s = (l < 0.5) ? delta / (max + min) : delta / (2 - max - min);
+            if (r == max) {
+                h = 60 * (g - b) / delta;
+            } else if (g == max) {
+                h = 120 + 60 * (b - r) / delta;
+            } else {
+                h = 240 + 60 * (r - g) / delta;
+            }
+            if (h < 0) {
+                h += 360;
+            }
+            if (h >= 360) {
+                h -= 360;
+            }
+        }
+        return [h, s, l];
+    },
+
+    
+    getLighter: function(factor) {
+        var hsl = this.getHSL();
+        factor = factor || this.lightnessFactor;
+        hsl[2] = Ext.Number.constrain(hsl[2] + factor, 0, 1);
+        return this.fromHSL(hsl[0], hsl[1], hsl[2]);
+    },
+
+    
+    getDarker: function(factor) {
+        factor = factor || this.lightnessFactor;
+        return this.getLighter(-factor);
+    },
+
+    
+    toString: function() {
+        var me = this,
+            round = Math.round,
+            r = round(me.r).toString(16),
+            g = round(me.g).toString(16),
+            b = round(me.b).toString(16);
+        r = (r.length == 1) ? '0' + r : r;
+        g = (g.length == 1) ? '0' + g : g;
+        b = (b.length == 1) ? '0' + b : b;
+        return ['#', r, g, b].join('');
+    },
+
+    
+    toHex: function(color) {
+        if (Ext.isArray(color)) {
+            color = color[0];
+        }
+        if (!Ext.isString(color)) {
+            return '';
+        }
+        if (color.substr(0, 1) === '#') {
+            return color;
+        }
+        var digits = this.colorToHexRe.exec(color);
+
+        if (Ext.isArray(digits)) {
+            var red = parseInt(digits[2], 10),
+                green = parseInt(digits[3], 10),
+                blue = parseInt(digits[4], 10),
+                rgb = blue | (green << 8) | (red << 16);
+            return digits[1] + '#' + ("000000" + rgb.toString(16)).slice(-6);
+        }
+        else {
+            return '';
+        }
+    },
+
+    
+    fromString: function(str) {
+        var values, r, g, b,
+            parse = parseInt;
+
+        if ((str.length == 4 || str.length == 7) && str.substr(0, 1) === '#') {
+            values = str.match(this.hexRe);
+            if (values) {
+                r = parse(values[1], 16) >> 0;
+                g = parse(values[2], 16) >> 0;
+                b = parse(values[3], 16) >> 0;
+                if (str.length == 4) {
+                    r += (r * 16);
+                    g += (g * 16);
+                    b += (b * 16);
+                }
+            }
+        }
+        else {
+            values = str.match(this.rgbRe);
+            if (values) {
+                r = values[1];
+                g = values[2];
+                b = values[3];
+            }
+        }
+
+        return (typeof r == 'undefined') ? undefined : Ext.create('Ext.draw.Color', r, g, b);
+    },
+
+    
+    getGrayscale: function() {
+        
+        return this.r * 0.3 + this.g * 0.59 + this.b * 0.11;
+    },
+
+    
+    fromHSL: function(h, s, l) {
+        var C, X, m, i, rgb = [],
+            abs = Math.abs,
+            floor = Math.floor;
+
+        if (s == 0 || h == null) {
+            
+            rgb = [l, l, l];
+        }
+        else {
+            
+            
+            
+            
+            h /= 60;
+            C = s * (1 - abs(2 * l - 1));
+            X = C * (1 - abs(h - 2 * floor(h / 2) - 1));
+            m = l - C / 2;
+            switch (floor(h)) {
+                case 0:
+                    rgb = [C, X, 0];
+                    break;
+                case 1:
+                    rgb = [X, C, 0];
+                    break;
+                case 2:
+                    rgb = [0, C, X];
+                    break;
+                case 3:
+                    rgb = [0, X, C];
+                    break;
+                case 4:
+                    rgb = [X, 0, C];
+                    break;
+                case 5:
+                    rgb = [C, 0, X];
+                    break;
+            }
+            rgb = [rgb[0] + m, rgb[1] + m, rgb[2] + m];
+        }
+        return Ext.create('Ext.draw.Color', rgb[0] * 255, rgb[1] * 255, rgb[2] * 255);
+    }
+}, function() {
+    var prototype = this.prototype;
+
+    
+    this.addStatics({
+        fromHSL: function() {
+            return prototype.fromHSL.apply(prototype, arguments);
+        },
+        fromString: function() {
+            return prototype.fromString.apply(prototype, arguments);
+        },
+        toHex: function() {
+            return prototype.toHex.apply(prototype, arguments);
+        }
+    });
+});
+
+
+Ext.define('Ext.dd.StatusProxy', {
+    animRepair: false,
+
+    
+    constructor: function(config){
+        Ext.apply(this, config);
+        this.id = this.id || Ext.id();
+        this.proxy = Ext.createWidget('component', {
+            floating: true,
+            stateful: false,
+            id: this.id,
+            html: '<div class="' + Ext.baseCSSPrefix + 'dd-drop-icon"></div>' +
+                  '<div class="' + Ext.baseCSSPrefix + 'dd-drag-ghost"></div>',
+            cls: Ext.baseCSSPrefix + 'dd-drag-proxy ' + this.dropNotAllowed,
+            shadow: !config || config.shadow !== false,
+            renderTo: document.body
+        });
+
+        this.el = this.proxy.el;
+        this.el.show();
+        this.el.setVisibilityMode(Ext.Element.VISIBILITY);
+        this.el.hide();
+
+        this.ghost = Ext.get(this.el.dom.childNodes[1]);
+        this.dropStatus = this.dropNotAllowed;
+    },
+    
+    dropAllowed : Ext.baseCSSPrefix + 'dd-drop-ok',
+    
+    dropNotAllowed : Ext.baseCSSPrefix + 'dd-drop-nodrop',
+
+    
+    setStatus : function(cssClass){
+        cssClass = cssClass || this.dropNotAllowed;
+        if(this.dropStatus != cssClass){
+            this.el.replaceCls(this.dropStatus, cssClass);
+            this.dropStatus = cssClass;
+        }
+    },
+
+    
+    reset : function(clearGhost){
+        this.el.dom.className = Ext.baseCSSPrefix + 'dd-drag-proxy ' + this.dropNotAllowed;
+        this.dropStatus = this.dropNotAllowed;
+        if(clearGhost){
+            this.ghost.update("");
+        }
+    },
+
+    
+    update : function(html){
+        if(typeof html == "string"){
+            this.ghost.update(html);
+        }else{
+            this.ghost.update("");
+            html.style.margin = "0";
+            this.ghost.dom.appendChild(html);
+        }
+        var el = this.ghost.dom.firstChild;
+        if(el){
+            Ext.fly(el).setStyle('float', 'none');
+        }
+    },
+
+    
+    getEl : function(){
+        return this.el;
+    },
+
+    
+    getGhost : function(){
+        return this.ghost;
+    },
+
+    
+    hide : function(clear) {
+        this.proxy.hide();
+        if (clear) {
+            this.reset(true);
+        }
+    },
+
+    
+    stop : function(){
+        if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){
+            this.anim.stop();
+        }
+    },
+
+    
+    show : function() {
+        this.proxy.show();
+        this.proxy.toFront();
+    },
+
+    
+    sync : function(){
+        this.proxy.el.sync();
+    },
+
+    
+    repair : function(xy, callback, scope){
+        this.callback = callback;
+        this.scope = scope;
+        if (xy && this.animRepair !== false) {
+            this.el.addCls(Ext.baseCSSPrefix + 'dd-drag-repair');
+            this.el.hideUnders(true);
+            this.anim = this.el.animate({
+                duration: this.repairDuration || 500,
+                easing: 'ease-out',
+                to: {
+                    x: xy[0],
+                    y: xy[1]
+                },
+                stopAnimation: true,
+                callback: this.afterRepair,
+                scope: this
+            });
+        } else {
+            this.afterRepair();
+        }
+    },
+
+    
+    afterRepair : function(){
+        this.hide(true);
+        if(typeof this.callback == "function"){
+            this.callback.call(this.scope || this);
+        }
+        this.callback = null;
+        this.scope = null;
+    },
+
+    destroy: function(){
+        Ext.destroy(this.ghost, this.proxy, this.el);
+    }
+});
+
+Ext.define('Ext.panel.Proxy', {
+
+    alternateClassName: 'Ext.dd.PanelProxy',
+
+    
+    constructor: function(panel, config){
+        
+        this.panel = panel;
+        this.id = this.panel.id +'-ddproxy';
+        Ext.apply(this, config);
+    },
+
+    
+    insertProxy: true,
+
+    
+    setStatus: Ext.emptyFn,
+    reset: Ext.emptyFn,
+    update: Ext.emptyFn,
+    stop: Ext.emptyFn,
+    sync: Ext.emptyFn,
+
+    
+    getEl: function(){
+        return this.ghost.el;
+    },
+
+    
+    getGhost: function(){
+        return this.ghost;
+    },
+
+    
+    getProxy: function(){
+        return this.proxy;
+    },
+
+    
+    hide : function(){
+        if (this.ghost) {
+            if (this.proxy) {
+                this.proxy.remove();
+                delete this.proxy;
+            }
+
+            
+            this.panel.unghost(null, false);
+            delete this.ghost;
+        }
+    },
+
+    
+    show: function(){
+        if (!this.ghost) {
+            var panelSize = this.panel.getSize();
+            this.panel.el.setVisibilityMode(Ext.Element.DISPLAY);
+            this.ghost = this.panel.ghost();
+            if (this.insertProxy) {
+                
+                
+                this.proxy = this.panel.el.insertSibling({cls: Ext.baseCSSPrefix + 'panel-dd-spacer'});
+                this.proxy.setSize(panelSize);
+            }
+        }
+    },
+
+    
+    repair: function(xy, callback, scope) {
+        this.hide();
+        if (typeof callback == "function") {
+            callback.call(scope || this);
+        }
+    },
+
+    
+    moveProxy : function(parentNode, before){
+        if (this.proxy) {
+            parentNode.insertBefore(this.proxy.dom, before);
+        }
+    }
+});
+
+
+Ext.define('Ext.layout.component.AbstractDock', {
+
+    
+
+    extend: 'Ext.layout.component.Component',
+
+    
+
+    type: 'dock',
+
+    
+    autoSizing: true,
+
+    beforeLayout: function() {
+        var returnValue = this.callParent(arguments);
+        if (returnValue !== false && (!this.initializedBorders || this.childrenChanged) && (!this.owner.border || this.owner.manageBodyBorders)) {
+            this.handleItemBorders();
+            this.initializedBorders = true;
+        }
+        return returnValue;
+    },
+    
+    handleItemBorders: function() {
+        var owner = this.owner,
+            body = owner.body,
+            docked = this.getLayoutItems(),
+            borders = {
+                top: [],
+                right: [],
+                bottom: [],
+                left: []
+            },
+            oldBorders = this.borders,
+            opposites = {
+                top: 'bottom',
+                right: 'left',
+                bottom: 'top',
+                left: 'right'
+            },
+            i, ln, item, dock, side;
+
+        for (i = 0, ln = docked.length; i < ln; i++) {
+            item = docked[i];
+            dock = item.dock;
+            
+            if (item.ignoreBorderManagement) {
+                continue;
+            }
+            
+            if (!borders[dock].satisfied) {
+                borders[dock].push(item);
+                borders[dock].satisfied = true;
+            }
+            
+            if (!borders.top.satisfied && opposites[dock] !== 'top') {
+                borders.top.push(item);
+            }
+            if (!borders.right.satisfied && opposites[dock] !== 'right') {
+                borders.right.push(item);
+            }            
+            if (!borders.bottom.satisfied && opposites[dock] !== 'bottom') {
+                borders.bottom.push(item);
+            }            
+            if (!borders.left.satisfied && opposites[dock] !== 'left') {
+                borders.left.push(item);
+            }
+        }
+
+        if (oldBorders) {
+            for (side in oldBorders) {
+                if (oldBorders.hasOwnProperty(side)) {
+                    ln = oldBorders[side].length;
+                    if (!owner.manageBodyBorders) {
+                        for (i = 0; i < ln; i++) {
+                            oldBorders[side][i].removeCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
+                        }
+                        if (!oldBorders[side].satisfied && !owner.bodyBorder) {
+                            body.removeCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);                   
+                        }                    
+                    }
+                    else if (oldBorders[side].satisfied) {
+                        body.setStyle('border-' + side + '-width', '');
+                    }
+                }
+            }
+        }
+                
+        for (side in borders) {
+            if (borders.hasOwnProperty(side)) {
+                ln = borders[side].length;
+                if (!owner.manageBodyBorders) {
+                    for (i = 0; i < ln; i++) {
+                        borders[side][i].addCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
+                    }
+                    if ((!borders[side].satisfied && !owner.bodyBorder) || owner.bodyBorder === false) {
+                        body.addCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);                   
+                    }                    
+                }
+                else if (borders[side].satisfied) {
+                    body.setStyle('border-' + side + '-width', '1px');
+                }
+            }
+        }
+        
+        this.borders = borders;
+    },
+    
+    
+    onLayout: function(width, height) {
+        if (this.onLayout_running) {
+            return;
+        }
+        this.onLayout_running = true;
+        var me = this,
+            owner = me.owner,
+            body = owner.body,
+            layout = owner.layout,
+            target = me.getTarget(),
+            autoWidth = false,
+            autoHeight = false,
+            padding, border, frameSize;
+
+        
+        var info = me.info = {
+            boxes: [],
+            size: {
+                width: width,
+                height: height
+            },
+            bodyBox: {}
+        };
+        
+        delete layout.isAutoDock;
+
+        Ext.applyIf(info, me.getTargetInfo());
+
+        
+        if (owner && owner.ownerCt && owner.ownerCt.layout && owner.ownerCt.layout.isLayout) {
+            if (!Ext.isNumber(owner.height) || !Ext.isNumber(owner.width)) {
+                owner.ownerCt.layout.bindToOwnerCtComponent = true;
+            }
+            else {
+                owner.ownerCt.layout.bindToOwnerCtComponent = false;
+            }
+        }
+
+        
+        if (height == null || width == null) {
+            padding = info.padding;
+            border = info.border;
+            frameSize = me.frameSize;
+
+            
+            if ((height == null) && (width == null)) {
+                autoHeight = true;
+                autoWidth = true;
+                me.setTargetSize(null);
+                me.setBodyBox({width: null, height: null});
+            }
+            
+            else if (height == null) {
+                autoHeight = true;
+                
+                me.setTargetSize(width);
+                me.setBodyBox({width: width - padding.left - border.left - padding.right - border.right - frameSize.left - frameSize.right, height: null});
+            
+            }
+            else {
+                autoWidth = true;
+                
+                me.setTargetSize(null, height);
+                me.setBodyBox({width: null, height: height - padding.top - padding.bottom - border.top - border.bottom - frameSize.top - frameSize.bottom});
+            }
+
+            
+            if (layout && layout.isLayout) {
+                
+                layout.bindToOwnerCtComponent = true;
+                
+                layout.isAutoDock = layout.autoSize !== true;
+                layout.layout();
+
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                info.autoSizedCtLayout = layout.autoSize === true;
+                info.autoHeight = autoHeight;
+                info.autoWidth = autoWidth;
+            }
+
+            
+            
+            
+            
+            
+            me.dockItems();
+            me.setTargetSize(info.size.width, info.size.height);
+        }
+        else {
+            me.setTargetSize(width, height);
+            me.dockItems();
+        }
+        me.callParent(arguments);
+        this.onLayout_running = false;
+    },
+
+    
+    dockItems : function() {
+        this.calculateDockBoxes();
+
+        
+        
+        
+        var info = this.info,
+            autoWidth = info.autoWidth,
+            autoHeight = info.autoHeight,
+            boxes = info.boxes,
+            ln = boxes.length,
+            dock, i, item;
+
+        
+        
+        for (i = 0; i < ln; i++) {
+            dock = boxes[i];
+            item = dock.item;
+            item.setPosition(dock.x, dock.y);
+            if ((autoWidth || autoHeight) && item.layout && item.layout.isLayout) {
+                
+                item.layout.bindToOwnerCtComponent = true;
+            }
+        }
+
+        
+        
+        if (!info.autoSizedCtLayout) {
+            if (autoWidth) {
+                info.bodyBox.width = null;
+            }
+            if (autoHeight) {
+                info.bodyBox.height = null;
+            }
+        }
+
+        
+        
+        this.setBodyBox(info.bodyBox);
+    },
+
+    
+    calculateDockBoxes : function() {
+        if (this.calculateDockBoxes_running) {
+            
+            return;
+        }
+        this.calculateDockBoxes_running = true;
+        
+        
+        
+        var me = this,
+            target = me.getTarget(),
+            items = me.getLayoutItems(),
+            owner = me.owner,
+            bodyEl = owner.body,
+            info = me.info,
+            autoWidth = info.autoWidth,
+            autoHeight = info.autoHeight,
+            size = info.size,
+            ln = items.length,
+            padding = info.padding,
+            border = info.border,
+            frameSize = me.frameSize,
+            item, i, box, rect;
+
+        
+        
+        if (autoHeight) {
+            size.height = bodyEl.getHeight() + padding.top + border.top + padding.bottom + border.bottom + frameSize.top + frameSize.bottom;
+        }
+        else {
+            size.height = target.getHeight();
+        }
+        if (autoWidth) {
+            size.width = bodyEl.getWidth() + padding.left + border.left + padding.right + border.right + frameSize.left + frameSize.right;
+        }
+        else {
+            size.width = target.getWidth();
+        }
+
+        info.bodyBox = {
+            x: padding.left + frameSize.left,
+            y: padding.top + frameSize.top,
+            width: size.width - padding.left - border.left - padding.right - border.right - frameSize.left - frameSize.right,
+            height: size.height - border.top - padding.top - border.bottom - padding.bottom - frameSize.top - frameSize.bottom
+        };
+
+        
+        for (i = 0; i < ln; i++) {
+            item = items[i];
+            
+            
+            
+            box = me.initBox(item);
+
+            if (autoHeight === true) {
+                box = me.adjustAutoBox(box, i);
+            }
+            else {
+                box = me.adjustSizedBox(box, i);
+            }
+
+            
+            
+            
+            info.boxes.push(box);
+        }
+        this.calculateDockBoxes_running = false;
+    },
+
+    
+    adjustSizedBox : function(box, index) {
+        var bodyBox = this.info.bodyBox,
+            frameSize = this.frameSize,
+            info = this.info,
+            padding = info.padding,
+            pos = box.type,
+            border = info.border;
+
+        switch (pos) {
+            case 'top':
+                box.y = bodyBox.y;
+                break;
+
+            case 'left':
+                box.x = bodyBox.x;
+                break;
+
+            case 'bottom':
+                box.y = (bodyBox.y + bodyBox.height) - box.height;
+                break;
+
+            case 'right':
+                box.x = (bodyBox.x + bodyBox.width) - box.width;
+                break;
+        }
+
+        if (box.ignoreFrame) {
+            if (pos == 'bottom') {
+                box.y += (frameSize.bottom + padding.bottom + border.bottom);
+            }
+            else {
+                box.y -= (frameSize.top + padding.top + border.top);
+            }
+            if (pos == 'right') {
+                box.x += (frameSize.right + padding.right + border.right);
+            }
+            else {
+                box.x -= (frameSize.left + padding.left + border.left);
+            }
+        }
+
+        
+        if (!box.overlay) {
+            switch (pos) {
+                case 'top':
+                    bodyBox.y += box.height;
+                    bodyBox.height -= box.height;
+                    break;
+
+                case 'left':
+                    bodyBox.x += box.width;
+                    bodyBox.width -= box.width;
+                    break;
+
+                case 'bottom':
+                    bodyBox.height -= box.height;
+                    break;
+
+                case 'right':
+                    bodyBox.width -= box.width;
+                    break;
+            }
+        }
+        return box;
+    },
+
+    
+    adjustAutoBox : function (box, index) {
+        var info = this.info,
+            owner = this.owner,
+            bodyBox = info.bodyBox,
+            size = info.size,
+            boxes = info.boxes,
+            boxesLn = boxes.length,
+            pos = box.type,
+            frameSize = this.frameSize,
+            padding = info.padding,
+            border = info.border,
+            autoSizedCtLayout = info.autoSizedCtLayout,
+            ln = (boxesLn < index) ? boxesLn : index,
+            i, adjustBox;
+
+        if (pos == 'top' || pos == 'bottom') {
+            
+            for (i = 0; i < ln; i++) {
+                adjustBox = boxes[i];
+                if (adjustBox.stretched && adjustBox.type == 'left' || adjustBox.type == 'right') {
+                    adjustBox.height += box.height;
+                }
+                else if (adjustBox.type == 'bottom') {
+                    adjustBox.y += box.height;
+                }
+            }
+        }
+
+        switch (pos) {
+            case 'top':
+                box.y = bodyBox.y;
+                if (!box.overlay) {
+                    bodyBox.y += box.height;
+                    if (info.autoHeight) {
+                        size.height += box.height;
+                    } else {
+                        bodyBox.height -= box.height;
+                    }
+                }
+                break;
+
+            case 'bottom':
+                if (!box.overlay) {
+                    if (info.autoHeight) {
+                        size.height += box.height;
+                    } else {
+                        bodyBox.height -= box.height;
+                    }
+                }
+                box.y = (bodyBox.y + bodyBox.height);
+                break;
+
+            case 'left':
+                box.x = bodyBox.x;
+                if (!box.overlay) {
+                    bodyBox.x += box.width;
+                    if (info.autoWidth) {
+                        size.width += box.width;
+                    } else {
+                        bodyBox.width -= box.width;
+                    }
+                }
+                break;
+
+            case 'right':
+                if (!box.overlay) {
+                    if (info.autoWidth) {
+                        size.width += box.width;
+                    } else {
+                        bodyBox.width -= box.width;
+                    }
+                }
+                box.x = (bodyBox.x + bodyBox.width);
+                break;
+        }
+
+        if (box.ignoreFrame) {
+            if (pos == 'bottom') {
+                box.y += (frameSize.bottom + padding.bottom + border.bottom);
+            }
+            else {
+                box.y -= (frameSize.top + padding.top + border.top);
+            }
+            if (pos == 'right') {
+                box.x += (frameSize.right + padding.right + border.right);
+            }
+            else {
+                box.x -= (frameSize.left + padding.left + border.left);
+            }
+        }
+        return box;
+    },
+
+    
+    initBox : function(item) {
+        var me = this,
+            bodyBox = me.info.bodyBox,
+            horizontal = (item.dock == 'top' || item.dock == 'bottom'),
+            owner = me.owner,
+            frameSize = me.frameSize,
+            info = me.info,
+            padding = info.padding,
+            border = info.border,
+            box = {
+                item: item,
+                overlay: item.overlay,
+                type: item.dock,
+                offsets: Ext.Element.parseBox(item.offsets || {}),
+                ignoreFrame: item.ignoreParentFrame
+            };
+        
+        if (item.stretch !== false) {
+            box.stretched = true;
+            if (horizontal) {
+                box.x = bodyBox.x + box.offsets.left;
+                box.width = bodyBox.width - (box.offsets.left + box.offsets.right);
+                if (box.ignoreFrame) {
+                    box.width += (frameSize.left + frameSize.right + border.left + border.right + padding.left + padding.right);
+                }
+                item.setCalculatedSize(box.width - item.el.getMargin('lr'), undefined, owner);
+            }
+            else {
+                box.y = bodyBox.y + box.offsets.top;
+                box.height = bodyBox.height - (box.offsets.bottom + box.offsets.top);
+                if (box.ignoreFrame) {
+                    box.height += (frameSize.top + frameSize.bottom + border.top + border.bottom + padding.top + padding.bottom);
+                }
+                item.setCalculatedSize(undefined, box.height - item.el.getMargin('tb'), owner);
+
+                
+                
+                if (!Ext.supports.ComputedStyle) {
+                    item.el.repaint();
+                }
+            }
+        }
+        else {
+            item.doComponentLayout();
+            box.width = item.getWidth() - (box.offsets.left + box.offsets.right);
+            box.height = item.getHeight() - (box.offsets.bottom + box.offsets.top);
+            box.y += box.offsets.top;
+            if (horizontal) {
+                box.x = (item.align == 'right') ? bodyBox.width - box.width : bodyBox.x;
+                box.x += box.offsets.left;
+            }
+        }
+
+        
+        
+        if (box.width === undefined) {
+            box.width = item.getWidth() + item.el.getMargin('lr');
+        }
+        if (box.height === undefined) {
+            box.height = item.getHeight() + item.el.getMargin('tb');
+        }
+
+        return box;
+    },
+
+    
+    getLayoutItems : function() {
+        var it = this.owner.getDockedItems(),
+            ln = it.length,
+            i = 0,
+            result = [];
+        for (; i < ln; i++) {
+            if (it[i].isVisible(true)) {
+                result.push(it[i]);
+            }
+        }
+        return result;
+    },
+
+    
+    renderItems: function(items, target) {
+        var cns = target.dom.childNodes,
+            cnsLn = cns.length,
+            ln = items.length,
+            domLn = 0,
+            i, j, cn, item;
+
+        
+        for (i = 0; i < cnsLn; i++) {
+            cn = Ext.get(cns[i]);
+            for (j = 0; j < ln; j++) {
+                item = items[j];
+                if (item.rendered && (cn.id == item.el.id || cn.contains(item.el.id))) {
+                    break;
+                }
+            }
+
+            if (j === ln) {
+                domLn++;
+            }
+        }
+
+        
+        for (i = 0, j = 0; i < ln; i++, j++) {
+            item = items[i];
+
+            
+            
+            
+            
+            
+            
+            
+            
+            if (i === j && (item.dock === 'right' || item.dock === 'bottom')) {
+                j += domLn;
+            }
+
+            
+            if (item && !item.rendered) {
+                this.renderItem(item, target, j);
+            }
+            else if (!this.isValidParent(item, target, j)) {
+                this.moveItem(item, target, j);
+            }
+        }
+    },
+
+    
+    setBodyBox : function(box) {
+        var me = this,
+            owner = me.owner,
+            body = owner.body,
+            info = me.info,
+            bodyMargin = info.bodyMargin,
+            padding = info.padding,
+            border = info.border,
+            frameSize = me.frameSize;
+        
+        
+        if (owner.collapsed) {
+            return;
+        }
+        
+        if (Ext.isNumber(box.width)) {
+            box.width -= bodyMargin.left + bodyMargin.right;
+        }
+        
+        if (Ext.isNumber(box.height)) {
+            box.height -= bodyMargin.top + bodyMargin.bottom;
+        }
+        
+        me.setElementSize(body, box.width, box.height);
+        if (Ext.isNumber(box.x)) {
+            body.setLeft(box.x - padding.left - frameSize.left);
+        }
+        if (Ext.isNumber(box.y)) {
+            body.setTop(box.y - padding.top - frameSize.top);
+        }
+    },
+
+    
+    configureItem : function(item, pos) {
+        this.callParent(arguments);
+        if (item.dock == 'top' || item.dock == 'bottom') {
+            item.layoutManagedWidth = 1;
+            item.layoutManagedHeight = 2;
+        } else {
+            item.layoutManagedWidth = 2;
+            item.layoutManagedHeight = 1;
+        }
+        
+        item.addCls(Ext.baseCSSPrefix + 'docked');
+        item.addClsWithUI('docked-' + item.dock);
+    },
+
+    afterRemove : function(item) {
+        this.callParent(arguments);
+        if (this.itemCls) {
+            item.el.removeCls(this.itemCls + '-' + item.dock);
+        }
+        var dom = item.el.dom;
+
+        if (!item.destroying && dom) {
+            dom.parentNode.removeChild(dom);
+        }
+        this.childrenChanged = true;
+    }
+});
+
+Ext.define('Ext.util.Memento', function () {
+
+    function captureOne (src, target, prop) {
+        src[prop] = target[prop];
+    }
+
+    function removeOne (src, target, prop) {
+        delete src[prop];
+    }
+
+    function restoreOne (src, target, prop) {
+        var value = src[prop];
+        if (value || src.hasOwnProperty(prop)) {
+            restoreValue(target, prop, value);
+        }
+    }
+
+    function restoreValue (target, prop, value) {
+        if (Ext.isDefined(value)) {
+            target[prop] = value;
+        } else {
+            delete target[prop];
+        }
+    }
+
+    function doMany (doOne, src, target, props) {
+        if (src) {
+            if (Ext.isArray(props)) {
+                Ext.each(props, function (prop) {
+                    doOne(src, target, prop);
+                });
+            } else {
+                doOne(src, target, props);
+            }
+        }
+    }
+
+    return {
+        
+        data: null,
+
+        
+        target: null,
+
+        
+        constructor: function (target, props) {
+            if (target) {
+                this.target = target;
+                if (props) {
+                    this.capture(props);
+                }
+            }
+        },
+
+        
+        capture: function (props, target) {
+            doMany(captureOne, this.data || (this.data = {}), target || this.target, props);
+        },
+
+        
+        remove: function (props) {
+            doMany(removeOne, this.data, null, props);
+        },
+
+        
+        restore: function (props, clear, target) {
+            doMany(restoreOne, this.data, target || this.target, props);
+            if (clear !== false) {
+                this.remove(props);
+            }
+        },
+
+        
+        restoreAll: function (clear, target) {
+            var me = this,
+                t = target || this.target;
+
+            Ext.Object.each(me.data, function (prop, value) {
+                restoreValue(t, prop, value);
+            });
+
+            if (clear !== false) {
+                delete me.data;
+            }
+        }
+    };
+}());
+
+
+Ext.define('Ext.app.EventBus', {
+    requires: [
+        'Ext.util.Event'
+    ],
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    constructor: function() {
+        this.mixins.observable.constructor.call(this);
+
+        this.bus = {};
+
+        var me = this;
+        Ext.override(Ext.Component, {
+            fireEvent: function(ev) {
+                if (Ext.util.Observable.prototype.fireEvent.apply(this, arguments) !== false) {
+                    return me.dispatch.call(me, ev, this, arguments);
+                }
+                return false;
+            }
+        });
+    },
+
+    dispatch: function(ev, target, args) {
+        var bus = this.bus,
+            selectors = bus[ev],
+            selector, controllers, id, events, event, i, ln;
+
+        if (selectors) {
+            
+            for (selector in selectors) {
+                
+                if (target.is(selector)) {
+                    
+                    controllers = selectors[selector];
+                    for (id in controllers) {
+                        
+                        events = controllers[id];
+                        for (i = 0, ln = events.length; i < ln; i++) {
+                            event = events[i];
+                            
+                            if (event.fire.apply(event, Array.prototype.slice.call(args, 1)) === false) {
+                                return false;
+                            };
+                        }
+                    }
+                }
+            }
+        }
+    },
+
+    control: function(selectors, listeners, controller) {
+        var bus = this.bus,
+            selector, fn;
+
+        if (Ext.isString(selectors)) {
+            selector = selectors;
+            selectors = {};
+            selectors[selector] = listeners;
+            this.control(selectors, null, controller);
+            return;
+        }
+
+        Ext.Object.each(selectors, function(selector, listeners) {
+            Ext.Object.each(listeners, function(ev, listener) {
+                var options = {},
+                    scope = controller,
+                    event = Ext.create('Ext.util.Event', controller, ev);
+
+                
+                if (Ext.isObject(listener)) {
+                    options = listener;
+                    listener = options.fn;
+                    scope = options.scope || controller;
+                    delete options.fn;
+                    delete options.scope;
+                }
+
+                event.addListener(listener, scope, options);
+
+                
+                bus[ev] = bus[ev] || {};
+                bus[ev][selector] = bus[ev][selector] || {};
+                bus[ev][selector][controller.id] = bus[ev][selector][controller.id] || [];
+
+                
+                bus[ev][selector][controller.id].push(event);
+            });
+        });
+    }
+});
+
+Ext.define('Ext.data.Types', {
+    singleton: true,
+    requires: ['Ext.data.SortTypes']
+}, function() {
+    var st = Ext.data.SortTypes;
+
+    Ext.apply(Ext.data.Types, {
+        
+        stripRe: /[\$,%]/g,
+
+        
+        AUTO: {
+            convert: function(v) {
+                return v;
+            },
+            sortType: st.none,
+            type: 'auto'
+        },
+
+        
+        STRING: {
+            convert: function(v) {
+                var defaultValue = this.useNull ? null : '';
+                return (v === undefined || v === null) ? defaultValue : String(v);
+            },
+            sortType: st.asUCString,
+            type: 'string'
+        },
+
+        
+        INT: {
+            convert: function(v) {
+                return v !== undefined && v !== null && v !== '' ?
+                    parseInt(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0);
+            },
+            sortType: st.none,
+            type: 'int'
+        },
+
+        
+        FLOAT: {
+            convert: function(v) {
+                return v !== undefined && v !== null && v !== '' ?
+                    parseFloat(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0);
+            },
+            sortType: st.none,
+            type: 'float'
+        },
+
+        
+        BOOL: {
+            convert: function(v) {
+                if (this.useNull && (v === undefined || v === null || v === '')) {
+                    return null;
+                }
+                return v === true || v === 'true' || v == 1;
+            },
+            sortType: st.none,
+            type: 'bool'
+        },
+
+        
+        DATE: {
+            convert: function(v) {
+                var df = this.dateFormat,
+                    parsed;
+
+                if (!v) {
+                    return null;
+                }
+                if (Ext.isDate(v)) {
+                    return v;
+                }
+                if (df) {
+                    if (df == 'timestamp') {
+                        return new Date(v*1000);
+                    }
+                    if (df == 'time') {
+                        return new Date(parseInt(v, 10));
+                    }
+                    return Ext.Date.parse(v, df);
+                }
+
+                parsed = Date.parse(v);
+                return parsed ? new Date(parsed) : null;
+            },
+            sortType: st.asDate,
+            type: 'date'
+        }
+    });
+
+    Ext.apply(Ext.data.Types, {
+        
+        BOOLEAN: this.BOOL,
+
+        
+        INTEGER: this.INT,
+
+        
+        NUMBER: this.FLOAT
+    });
+});
+
+
+Ext.define('Ext.data.Field', {
+    requires: ['Ext.data.Types', 'Ext.data.SortTypes'],
+    alias: 'data.field',
+    
+    constructor : function(config) {
+        if (Ext.isString(config)) {
+            config = {name: config};
+        }
+        Ext.apply(this, config);
+        
+        var types = Ext.data.Types,
+            st = this.sortType,
+            t;
+
+        if (this.type) {
+            if (Ext.isString(this.type)) {
+                this.type = types[this.type.toUpperCase()] || types.AUTO;
+            }
+        } else {
+            this.type = types.AUTO;
+        }
+
+        
+        if (Ext.isString(st)) {
+            this.sortType = Ext.data.SortTypes[st];
+        } else if(Ext.isEmpty(st)) {
+            this.sortType = this.type.sortType;
+        }
+
+        if (!this.convert) {
+            this.convert = this.type.convert;
+        }
+    },
+    
+    
+    
+    
+    
+    
+
+    
+    dateFormat: null,
+    
+    
+    useNull: false,
+    
+    
+    defaultValue: "",
+
+    
+    mapping: null,
+
+    
+    sortType : null,
+
+    
+    sortDir : "ASC",
+
+    
+    allowBlank : true,
+
+    
+    persist: true
+});
+
+
+Ext.define('Ext.util.AbstractMixedCollection', {
+    requires: ['Ext.util.Filter'],
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    constructor: function(allowFunctions, keyFn) {
+        var me = this;
+
+        me.items = [];
+        me.map = {};
+        me.keys = [];
+        me.length = 0;
+
+        me.addEvents(
+            
+            'clear',
+
+            
+            'add',
+
+            
+            'replace',
+
+            
+            'remove'
+        );
+
+        me.allowFunctions = allowFunctions === true;
+
+        if (keyFn) {
+            me.getKey = keyFn;
+        }
+
+        me.mixins.observable.constructor.call(me);
+    },
+
+    
+    allowFunctions : false,
+
+    
+    add : function(key, obj){
+        var me = this,
+            myObj = obj,
+            myKey = key,
+            old;
+
+        if (arguments.length == 1) {
+            myObj = myKey;
+            myKey = me.getKey(myObj);
+        }
+        if (typeof myKey != 'undefined' && myKey !== null) {
+            old = me.map[myKey];
+            if (typeof old != 'undefined') {
+                return me.replace(myKey, myObj);
+            }
+            me.map[myKey] = myObj;
+        }
+        me.length++;
+        me.items.push(myObj);
+        me.keys.push(myKey);
+        me.fireEvent('add', me.length - 1, myObj, myKey);
+        return myObj;
+    },
+
+    
+    getKey : function(o){
+         return o.id;
+    },
+
+    
+    replace : function(key, o){
+        var me = this,
+            old,
+            index;
+
+        if (arguments.length == 1) {
+            o = arguments[0];
+            key = me.getKey(o);
+        }
+        old = me.map[key];
+        if (typeof key == 'undefined' || key === null || typeof old == 'undefined') {
+             return me.add(key, o);
+        }
+        index = me.indexOfKey(key);
+        me.items[index] = o;
+        me.map[key] = o;
+        me.fireEvent('replace', key, old, o);
+        return o;
+    },
+
+    
+    addAll : function(objs){
+        var me = this,
+            i = 0,
+            args,
+            len,
+            key;
+
+        if (arguments.length > 1 || Ext.isArray(objs)) {
+            args = arguments.length > 1 ? arguments : objs;
+            for (len = args.length; i < len; i++) {
+                me.add(args[i]);
+            }
+        } else {
+            for (key in objs) {
+                if (objs.hasOwnProperty(key)) {
+                    if (me.allowFunctions || typeof objs[key] != 'function') {
+                        me.add(key, objs[key]);
+                    }
+                }
+            }
+        }
+    },
+
+    
+    each : function(fn, scope){
+        var items = [].concat(this.items), 
+            i = 0,
+            len = items.length,
+            item;
+
+        for (; i < len; i++) {
+            item = items[i];
+            if (fn.call(scope || item, item, i, len) === false) {
+                break;
+            }
+        }
+    },
+
+    
+    eachKey : function(fn, scope){
+        var keys = this.keys,
+            items = this.items,
+            i = 0,
+            len = keys.length;
+
+        for (; i < len; i++) {
+            fn.call(scope || window, keys[i], items[i], i, len);
+        }
+    },
+
+    
+    findBy : function(fn, scope) {
+        var keys = this.keys,
+            items = this.items,
+            i = 0,
+            len = items.length;
+
+        for (; i < len; i++) {
+            if (fn.call(scope || window, items[i], keys[i])) {
+                return items[i];
+            }
+        }
+        return null;
+    },
+
+    find : function() {
+        if (Ext.isDefined(Ext.global.console)) {
+            Ext.global.console.warn('Ext.util.MixedCollection: find has been deprecated. Use findBy instead.');
+        }
+        return this.findBy.apply(this, arguments);
+    },
+
+    
+    insert : function(index, key, obj){
+        var me = this,
+            myKey = key,
+            myObj = obj;
+
+        if (arguments.length == 2) {
+            myObj = myKey;
+            myKey = me.getKey(myObj);
+        }
+        if (me.containsKey(myKey)) {
+            me.suspendEvents();
+            me.removeAtKey(myKey);
+            me.resumeEvents();
+        }
+        if (index >= me.length) {
+            return me.add(myKey, myObj);
+        }
+        me.length++;
+        Ext.Array.splice(me.items, index, 0, myObj);
+        if (typeof myKey != 'undefined' && myKey !== null) {
+            me.map[myKey] = myObj;
+        }
+        Ext.Array.splice(me.keys, index, 0, myKey);
+        me.fireEvent('add', index, myObj, myKey);
+        return myObj;
+    },
+
+    
+    remove : function(o){
+        return this.removeAt(this.indexOf(o));
+    },
+
+    
+    removeAll : function(items){
+        Ext.each(items || [], function(item) {
+            this.remove(item);
+        }, this);
+
+        return this;
+    },
+
+    
+    removeAt : function(index){
+        var me = this,
+            o,
+            key;
+
+        if (index < me.length && index >= 0) {
+            me.length--;
+            o = me.items[index];
+            Ext.Array.erase(me.items, index, 1);
+            key = me.keys[index];
+            if (typeof key != 'undefined') {
+                delete me.map[key];
+            }
+            Ext.Array.erase(me.keys, index, 1);
+            me.fireEvent('remove', o, key);
+            return o;
+        }
+        return false;
+    },
+
+    
+    removeAtKey : function(key){
+        return this.removeAt(this.indexOfKey(key));
+    },
+
+    
+    getCount : function(){
+        return this.length;
+    },
+
+    
+    indexOf : function(o){
+        return Ext.Array.indexOf(this.items, o);
+    },
+
+    
+    indexOfKey : function(key){
+        return Ext.Array.indexOf(this.keys, key);
+    },
+
+    
+    get : function(key) {
+        var me = this,
+            mk = me.map[key],
+            item = mk !== undefined ? mk : (typeof key == 'number') ? me.items[key] : undefined;
+        return typeof item != 'function' || me.allowFunctions ? item : null; 
+    },
+
+    
+    getAt : function(index) {
+        return this.items[index];
+    },
+
+    
+    getByKey : function(key) {
+        return this.map[key];
+    },
+
+    
+    contains : function(o){
+        return Ext.Array.contains(this.items, o);
+    },
+
+    
+    containsKey : function(key){
+        return typeof this.map[key] != 'undefined';
+    },
+
+    
+    clear : function(){
+        var me = this;
+
+        me.length = 0;
+        me.items = [];
+        me.keys = [];
+        me.map = {};
+        me.fireEvent('clear');
+    },
+
+    
+    first : function() {
+        return this.items[0];
+    },
+
+    
+    last : function() {
+        return this.items[this.length - 1];
+    },
+
+    
+    sum: function(property, root, start, end) {
+        var values = this.extractValues(property, root),
+            length = values.length,
+            sum    = 0,
+            i;
+
+        start = start || 0;
+        end   = (end || end === 0) ? end : length - 1;
+
+        for (i = start; i <= end; i++) {
+            sum += values[i];
+        }
+
+        return sum;
+    },
+
+    
+    collect: function(property, root, allowNull) {
+        var values = this.extractValues(property, root),
+            length = values.length,
+            hits   = {},
+            unique = [],
+            value, strValue, i;
+
+        for (i = 0; i < length; i++) {
+            value = values[i];
+            strValue = String(value);
+
+            if ((allowNull || !Ext.isEmpty(value)) && !hits[strValue]) {
+                hits[strValue] = true;
+                unique.push(value);
+            }
+        }
+
+        return unique;
+    },
+
+    
+    extractValues: function(property, root) {
+        var values = this.items;
+
+        if (root) {
+            values = Ext.Array.pluck(values, root);
+        }
+
+        return Ext.Array.pluck(values, property);
+    },
+
+    
+    getRange : function(start, end){
+        var me = this,
+            items = me.items,
+            range = [],
+            i;
+
+        if (items.length < 1) {
+            return range;
+        }
+
+        start = start || 0;
+        end = Math.min(typeof end == 'undefined' ? me.length - 1 : end, me.length - 1);
+        if (start <= end) {
+            for (i = start; i <= end; i++) {
+                range[range.length] = items[i];
+            }
+        } else {
+            for (i = start; i >= end; i--) {
+                range[range.length] = items[i];
+            }
+        }
+        return range;
+    },
+
+    
+    filter : function(property, value, anyMatch, caseSensitive) {
+        var filters = [],
+            filterFn;
+
+        
+        if (Ext.isString(property)) {
+            filters.push(Ext.create('Ext.util.Filter', {
+                property     : property,
+                value        : value,
+                anyMatch     : anyMatch,
+                caseSensitive: caseSensitive
+            }));
+        } else if (Ext.isArray(property) || property instanceof Ext.util.Filter) {
+            filters = filters.concat(property);
+        }
+
+        
+        
+        filterFn = function(record) {
+            var isMatch = true,
+                length = filters.length,
+                i;
+
+            for (i = 0; i < length; i++) {
+                var filter = filters[i],
+                    fn     = filter.filterFn,
+                    scope  = filter.scope;
+
+                isMatch = isMatch && fn.call(scope, record);
+            }
+
+            return isMatch;
+        };
+
+        return this.filterBy(filterFn);
+    },
+
+    
+    filterBy : function(fn, scope) {
+        var me = this,
+            newMC  = new this.self(),
+            keys   = me.keys,
+            items  = me.items,
+            length = items.length,
+            i;
+
+        newMC.getKey = me.getKey;
+
+        for (i = 0; i < length; i++) {
+            if (fn.call(scope || me, items[i], keys[i])) {
+                newMC.add(keys[i], items[i]);
+            }
+        }
+
+        return newMC;
+    },
+
+    
+    findIndex : function(property, value, start, anyMatch, caseSensitive){
+        if(Ext.isEmpty(value, false)){
+            return -1;
+        }
+        value = this.createValueMatcher(value, anyMatch, caseSensitive);
+        return this.findIndexBy(function(o){
+            return o && value.test(o[property]);
+        }, null, start);
+    },
+
+    
+    findIndexBy : function(fn, scope, start){
+        var me = this,
+            keys = me.keys,
+            items = me.items,
+            i = start || 0,
+            len = items.length;
+
+        for (; i < len; i++) {
+            if (fn.call(scope || me, items[i], keys[i])) {
+                return i;
+            }
+        }
+        return -1;
+    },
+
+    
+    createValueMatcher : function(value, anyMatch, caseSensitive, exactMatch) {
+        if (!value.exec) { 
+            var er = Ext.String.escapeRegex;
+            value = String(value);
+
+            if (anyMatch === true) {
+                value = er(value);
+            } else {
+                value = '^' + er(value);
+                if (exactMatch === true) {
+                    value += '$';
+                }
+            }
+            value = new RegExp(value, caseSensitive ? '' : 'i');
+        }
+        return value;
+    },
+
+    
+    clone : function() {
+        var me = this,
+            copy = new this.self(),
+            keys = me.keys,
+            items = me.items,
+            i = 0,
+            len = items.length;
+
+        for(; i < len; i++){
+            copy.add(keys[i], items[i]);
+        }
+        copy.getKey = me.getKey;
+        return copy;
+    }
+});
+
+
+Ext.define("Ext.util.Sortable", {
+    
+    isSortable: true,
+
+    
+    defaultSortDirection: "ASC",
+
+    requires: [
+        'Ext.util.Sorter'
+    ],
+
+    
+
+    
+    initSortable: function() {
+        var me = this,
+            sorters = me.sorters;
+
+        
+        me.sorters = Ext.create('Ext.util.AbstractMixedCollection', false, function(item) {
+            return item.id || item.property;
+        });
+
+        if (sorters) {
+            me.sorters.addAll(me.decodeSorters(sorters));
+        }
+    },
+
+    
+    sort: function(sorters, direction, where, doSort) {
+        var me = this,
+            sorter, sorterFn,
+            newSorters;
+
+        if (Ext.isArray(sorters)) {
+            doSort = where;
+            where = direction;
+            newSorters = sorters;
+        }
+        else if (Ext.isObject(sorters)) {
+            doSort = where;
+            where = direction;
+            newSorters = [sorters];
+        }
+        else if (Ext.isString(sorters)) {
+            sorter = me.sorters.get(sorters);
+
+            if (!sorter) {
+                sorter = {
+                    property : sorters,
+                    direction: direction
+                };
+                newSorters = [sorter];
+            }
+            else if (direction === undefined) {
+                sorter.toggle();
+            }
+            else {
+                sorter.setDirection(direction);
+            }
+        }
+
+        if (newSorters && newSorters.length) {
+            newSorters = me.decodeSorters(newSorters);
+            if (Ext.isString(where)) {
+                if (where === 'prepend') {
+                    sorters = me.sorters.clone().items;
+
+                    me.sorters.clear();
+                    me.sorters.addAll(newSorters);
+                    me.sorters.addAll(sorters);
+                }
+                else {
+                    me.sorters.addAll(newSorters);
+                }
+            }
+            else {
+                me.sorters.clear();
+                me.sorters.addAll(newSorters);
+            }
+        }
+
+        if (doSort !== false) {
+            me.onBeforeSort(newSorters);
+            
+            sorters = me.sorters.items;
+            if (sorters.length) {
+                
+                sorterFn = function(r1, r2) {
+                    var result = sorters[0].sort(r1, r2),
+                        length = sorters.length,
+                        i;
+
+                        
+                        for (i = 1; i < length; i++) {
+                            result = result || sorters[i].sort.call(this, r1, r2);
+                        }
+
+                    return result;
+                };
+
+                me.doSort(sorterFn);
+            }
+        }
+
+        return sorters;
+    },
+
+    onBeforeSort: Ext.emptyFn,
+
+    
+    decodeSorters: function(sorters) {
+        if (!Ext.isArray(sorters)) {
+            if (sorters === undefined) {
+                sorters = [];
+            } else {
+                sorters = [sorters];
+            }
+        }
+
+        var length = sorters.length,
+            Sorter = Ext.util.Sorter,
+            fields = this.model ? this.model.prototype.fields : null,
+            field,
+            config, i;
+
+        for (i = 0; i < length; i++) {
+            config = sorters[i];
+
+            if (!(config instanceof Sorter)) {
+                if (Ext.isString(config)) {
+                    config = {
+                        property: config
+                    };
+                }
+
+                Ext.applyIf(config, {
+                    root     : this.sortRoot,
+                    direction: "ASC"
+                });
+
+                
+                if (config.fn) {
+                    config.sorterFn = config.fn;
+                }
+
+                
+                if (typeof config == 'function') {
+                    config = {
+                        sorterFn: config
+                    };
+                }
+
+                
+                if (fields && !config.transform) {
+                    field = fields.get(config.property);
+                    config.transform = field ? field.sortType : undefined;
+                }
+                sorters[i] = Ext.create('Ext.util.Sorter', config);
+            }
+        }
+
+        return sorters;
+    },
+
+    getSorters: function() {
+        return this.sorters.items;
+    }
+});
+
+Ext.define('Ext.util.MixedCollection', {
+    extend: 'Ext.util.AbstractMixedCollection',
+    mixins: {
+        sortable: 'Ext.util.Sortable'
+    },
+
+    
+    constructor: function() {
+        var me = this;
+        me.callParent(arguments);
+        me.addEvents('sort');
+        me.mixins.sortable.initSortable.call(me);
+    },
+
+    doSort: function(sorterFn) {
+        this.sortBy(sorterFn);
+    },
+
+    
+    _sort : function(property, dir, fn){
+        var me = this,
+            i, len,
+            dsc   = String(dir).toUpperCase() == 'DESC' ? -1 : 1,
+
+            
+            c     = [],
+            keys  = me.keys,
+            items = me.items;
+
+        
+        fn = fn || function(a, b) {
+            return a - b;
+        };
+
+        
+        for(i = 0, len = items.length; i < len; i++){
+            c[c.length] = {
+                key  : keys[i],
+                value: items[i],
+                index: i
+            };
+        }
+
+        
+        Ext.Array.sort(c, function(a, b){
+            var v = fn(a[property], b[property]) * dsc;
+            if(v === 0){
+                v = (a.index < b.index ? -1 : 1);
+            }
+            return v;
+        });
+
+        
+        for(i = 0, len = c.length; i < len; i++){
+            items[i] = c[i].value;
+            keys[i]  = c[i].key;
+        }
+
+        me.fireEvent('sort', me);
+    },
+
+    
+    sortBy: function(sorterFn) {
+        var me     = this,
+            items  = me.items,
+            keys   = me.keys,
+            length = items.length,
+            temp   = [],
+            i;
+
+        
+        for (i = 0; i < length; i++) {
+            temp[i] = {
+                key  : keys[i],
+                value: items[i],
+                index: i
+            };
+        }
+
+        Ext.Array.sort(temp, function(a, b) {
+            var v = sorterFn(a.value, b.value);
+            if (v === 0) {
+                v = (a.index < b.index ? -1 : 1);
+            }
+
+            return v;
+        });
+
+        
+        for (i = 0; i < length; i++) {
+            items[i] = temp[i].value;
+            keys[i]  = temp[i].key;
+        }
+        
+        me.fireEvent('sort', me, items, keys);
+    },
+
+    
+    reorder: function(mapping) {
+        var me = this,
+            items = me.items,
+            index = 0,
+            length = items.length,
+            order = [],
+            remaining = [],
+            oldIndex;
+
+        me.suspendEvents();
+
+        
+        for (oldIndex in mapping) {
+            order[mapping[oldIndex]] = items[oldIndex];
+        }
+
+        for (index = 0; index < length; index++) {
+            if (mapping[index] == undefined) {
+                remaining.push(items[index]);
+            }
+        }
+
+        for (index = 0; index < length; index++) {
+            if (order[index] == undefined) {
+                order[index] = remaining.shift();
+            }
+        }
+
+        me.clear();
+        me.addAll(order);
+
+        me.resumeEvents();
+        me.fireEvent('sort', me);
+    },
+
+    
+    sortByKey : function(dir, fn){
+        this._sort('key', dir, fn || function(a, b){
+            var v1 = String(a).toUpperCase(), v2 = String(b).toUpperCase();
+            return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
+        });
+    }
+});
+
+
+Ext.define('Ext.data.Errors', {
+    extend: 'Ext.util.MixedCollection',
+
+    
+    isValid: function() {
+        return this.length === 0;
+    },
+
+    
+    getByField: function(fieldName) {
+        var errors = [],
+            error, field, i;
+
+        for (i = 0; i < this.length; i++) {
+            error = this.items[i];
+
+            if (error.field == fieldName) {
+                errors.push(error);
+            }
+        }
+
+        return errors;
+    }
+});
+
+
+Ext.define('Ext.data.reader.Reader', {
+    requires: ['Ext.data.ResultSet'],
+    alternateClassName: ['Ext.data.Reader', 'Ext.data.DataReader'],
+    
+    
+
+    
+    totalProperty: 'total',
+
+    
+    successProperty: 'success',
+
+    
+    root: '',
+    
+    
+    
+    
+    implicitIncludes: true,
+    
+    isReader: true,
+    
+    
+    constructor: function(config) {
+        var me = this;
+        
+        Ext.apply(me, config || {});
+        me.fieldCount = 0;
+        me.model = Ext.ModelManager.getModel(config.model);
+        if (me.model) {
+            me.buildExtractors();
+        }
+    },
+
+    
+    setModel: function(model, setOnProxy) {
+        var me = this;
+        
+        me.model = Ext.ModelManager.getModel(model);
+        me.buildExtractors(true);
+        
+        if (setOnProxy && me.proxy) {
+            me.proxy.setModel(me.model, true);
+        }
+    },
+
+    
+    read: function(response) {
+        var data = response;
+        
+        if (response && response.responseText) {
+            data = this.getResponseData(response);
+        }
+        
+        if (data) {
+            return this.readRecords(data);
+        } else {
+            return this.nullResultSet;
+        }
+    },
+
+    
+    readRecords: function(data) {
+        var me  = this;
+        
+        
+        if (me.fieldCount !== me.getFields().length) {
+            me.buildExtractors(true);
+        }
+        
+        
+        me.rawData = data;
+
+        data = me.getData(data);
+
+        
+        
+        var root    = Ext.isArray(data) ? data : me.getRoot(data),
+            success = true,
+            recordCount = 0,
+            total, value, records, message;
+            
+        if (root) {
+            total = root.length;
+        }
+
+        if (me.totalProperty) {
+            value = parseInt(me.getTotal(data), 10);
+            if (!isNaN(value)) {
+                total = value;
+            }
+        }
+
+        if (me.successProperty) {
+            value = me.getSuccess(data);
+            if (value === false || value === 'false') {
+                success = false;
+            }
+        }
+        
+        if (me.messageProperty) {
+            message = me.getMessage(data);
+        }
+        
+        if (root) {
+            records = me.extractData(root);
+            recordCount = records.length;
+        } else {
+            recordCount = 0;
+            records = [];
+        }
+
+        return Ext.create('Ext.data.ResultSet', {
+            total  : total || recordCount,
+            count  : recordCount,
+            records: records,
+            success: success,
+            message: message
+        });
+    },
+
+    
+    extractData : function(root) {
+        var me = this,
+            values  = [],
+            records = [],
+            Model   = me.model,
+            i       = 0,
+            length  = root.length,
+            idProp  = me.getIdProperty(),
+            node, id, record;
+            
+        if (!root.length && Ext.isObject(root)) {
+            root = [root];
+            length = 1;
+        }
+
+        for (; i < length; i++) {
+            node   = root[i];
+            values = me.extractValues(node);
+            id     = me.getId(node);
+
+            
+            record = new Model(values, id, node);
+            records.push(record);
+                
+            if (me.implicitIncludes) {
+                me.readAssociated(record, node);
+            }
+        }
+
+        return records;
+    },
+    
+    
+    readAssociated: function(record, data) {
+        var associations = record.associations.items,
+            i            = 0,
+            length       = associations.length,
+            association, associationData, proxy, reader;
+        
+        for (; i < length; i++) {
+            association     = associations[i];
+            associationData = this.getAssociatedDataRoot(data, association.associationKey || association.name);
+            
+            if (associationData) {
+                reader = association.getReader();
+                if (!reader) {
+                    proxy = association.associatedModel.proxy;
+                    
+                    if (proxy) {
+                        reader = proxy.getReader();
+                    } else {
+                        reader = new this.constructor({
+                            model: association.associatedName
+                        });
+                    }
+                }
+                association.read(record, reader, associationData);
+            }  
+        }
+    },
+    
+    
+    getAssociatedDataRoot: function(data, associationName) {
+        return data[associationName];
+    },
+    
+    getFields: function() {
+        return this.model.prototype.fields.items;
+    },
+
+    
+    extractValues: function(data) {
+        var fields = this.getFields(),
+            i      = 0,
+            length = fields.length,
+            output = {},
+            field, value;
+
+        for (; i < length; i++) {
+            field = fields[i];
+            value = this.extractorFunctions[i](data);
+
+            output[field.name] = value;
+        }
+
+        return output;
+    },
+
+    
+    getData: function(data) {
+        return data;
+    },
+
+    
+    getRoot: function(data) {
+        return data;
+    },
+
+    
+    getResponseData: function(response) {
+    },
+
+    
+    onMetaChange : function(meta) {
+        var fields = meta.fields,
+            newModel;
+        
+        Ext.apply(this, meta);
+        
+        if (fields) {
+            newModel = Ext.define("Ext.data.reader.Json-Model" + Ext.id(), {
+                extend: 'Ext.data.Model',
+                fields: fields
+            });
+            this.setModel(newModel, true);
+        } else {
+            this.buildExtractors(true);
+        }
+    },
+    
+    
+    getIdProperty: function(){
+        var prop = this.idProperty;
+        if (Ext.isEmpty(prop)) {
+            prop = this.model.prototype.idProperty;
+        }
+        return prop;
+    },
+
+    
+    buildExtractors: function(force) {
+        var me          = this,
+            idProp      = me.getIdProperty(),
+            totalProp   = me.totalProperty,
+            successProp = me.successProperty,
+            messageProp = me.messageProperty,
+            accessor;
+            
+        if (force === true) {
+            delete me.extractorFunctions;
+        }
+        
+        if (me.extractorFunctions) {
+            return;
+        }   
+
+        
+        if (totalProp) {
+            me.getTotal = me.createAccessor(totalProp);
+        }
+
+        if (successProp) {
+            me.getSuccess = me.createAccessor(successProp);
+        }
+
+        if (messageProp) {
+            me.getMessage = me.createAccessor(messageProp);
+        }
+
+        if (idProp) {
+            accessor = me.createAccessor(idProp);
+
+            me.getId = function(record) {
+                var id = accessor.call(me, record);
+                return (id === undefined || id === '') ? null : id;
+            };
+        } else {
+            me.getId = function() {
+                return null;
+            };
+        }
+        me.buildFieldExtractors();
+    },
+
+    
+    buildFieldExtractors: function() {
+        
+        var me = this,
+            fields = me.getFields(),
+            ln = fields.length,
+            i  = 0,
+            extractorFunctions = [],
+            field, map;
+
+        for (; i < ln; i++) {
+            field = fields[i];
+            map   = (field.mapping !== undefined && field.mapping !== null) ? field.mapping : field.name;
+
+            extractorFunctions.push(me.createAccessor(map));
+        }
+        me.fieldCount = ln;
+
+        me.extractorFunctions = extractorFunctions;
+    }
+}, function() {
+    Ext.apply(this, {
+        
+        nullResultSet: Ext.create('Ext.data.ResultSet', {
+            total  : 0,
+            count  : 0,
+            records: [],
+            success: true
+        })
+    });
+});
+
+Ext.define('Ext.data.reader.Json', {
+    extend: 'Ext.data.reader.Reader',
+    alternateClassName: 'Ext.data.JsonReader',
+    alias : 'reader.json',
+
+    root: '',
+
+    
+
+    
+    useSimpleAccessors: false,
+
+    
+    readRecords: function(data) {
+        
+        if (data.metaData) {
+            this.onMetaChange(data.metaData);
+        }
+
+        
+        this.jsonData = data;
+        return this.callParent([data]);
+    },
+
+    
+    getResponseData: function(response) {
+        var data;
+        try {
+            data = Ext.decode(response.responseText);
+        }
+        catch (ex) {
+            Ext.Error.raise({
+                response: response,
+                json: response.responseText,
+                parseError: ex,
+                msg: 'Unable to parse the JSON returned by the server: ' + ex.toString()
+            });
+        }
+
+        return data;
+    },
+
+    
+    buildExtractors : function() {
+        var me = this;
+
+        me.callParent(arguments);
+
+        if (me.root) {
+            me.getRoot = me.createAccessor(me.root);
+        } else {
+            me.getRoot = function(root) {
+                return root;
+            };
+        }
+    },
+
+    
+    extractData: function(root) {
+        var recordName = this.record,
+            data = [],
+            length, i;
+
+        if (recordName) {
+            length = root.length;
+            
+            if (!length && Ext.isObject(root)) {
+                length = 1;
+                root = [root];
+            }
+
+            for (i = 0; i < length; i++) {
+                data[i] = root[i][recordName];
+            }
+        } else {
+            data = root;
+        }
+        return this.callParent([data]);
+    },
+
+    
+    createAccessor: function() {
+        var re = /[\[\.]/;
+
+        return function(expr) {
+            if (Ext.isEmpty(expr)) {
+                return Ext.emptyFn;
+            }
+            if (Ext.isFunction(expr)) {
+                return expr;
+            }
+            if (this.useSimpleAccessors !== true) {
+                var i = String(expr).search(re);
+                if (i >= 0) {
+                    return Ext.functionFactory('obj', 'return obj' + (i > 0 ? '.' : '') + expr);
+                }
+            }
+            return function(obj) {
+                return obj[expr];
+            };
+        };
+    }()
+});
+
+Ext.define('Ext.data.writer.Json', {
+    extend: 'Ext.data.writer.Writer',
+    alternateClassName: 'Ext.data.JsonWriter',
+    alias: 'writer.json',
+    
+    
+    root: undefined,
+    
+    
+    encode: false,
+    
+    
+    allowSingle: true,
+    
+    
+    writeRecords: function(request, data) {
+        var root = this.root;
+        
+        if (this.allowSingle && data.length == 1) {
+            
+            data = data[0];
+        }
+        
+        if (this.encode) {
+            if (root) {
+                
+                request.params[root] = Ext.encode(data);
+            } else {
+            }
+        } else {
+            
+            request.jsonData = request.jsonData || {};
+            if (root) {
+                request.jsonData[root] = data;
+            } else {
+                request.jsonData = data;
+            }
+        }
+        return request;
+    }
+});
+
+
+Ext.define('Ext.data.proxy.Proxy', {
+    alias: 'proxy.proxy',
+    alternateClassName: ['Ext.data.DataProxy', 'Ext.data.Proxy'],
+    requires: [
+        'Ext.data.reader.Json',
+        'Ext.data.writer.Json'
+    ],
+    uses: [
+        'Ext.data.Batch', 
+        'Ext.data.Operation', 
+        'Ext.data.Model'
+    ],
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+    
+    
+    batchOrder: 'create,update,destroy',
+    
+    
+    batchActions: true,
+    
+    
+    defaultReaderType: 'json',
+    
+    
+    defaultWriterType: 'json',
+    
+    
+    
+    
+    
+    
+    
+    isProxy: true,
+    
+    
+    constructor: function(config) {
+        config = config || {};
+        
+        if (config.model === undefined) {
+            delete config.model;
+        }
+
+        this.mixins.observable.constructor.call(this, config);
+        
+        if (this.model !== undefined && !(this.model instanceof Ext.data.Model)) {
+            this.setModel(this.model);
+        }
+    },
+    
+    
+    setModel: function(model, setOnStore) {
+        this.model = Ext.ModelManager.getModel(model);
+        
+        var reader = this.reader,
+            writer = this.writer;
+        
+        this.setReader(reader);
+        this.setWriter(writer);
+        
+        if (setOnStore && this.store) {
+            this.store.setModel(this.model);
+        }
+    },
+    
+    
+    getModel: function() {
+        return this.model;
+    },
+    
+    
+    setReader: function(reader) {
+        var me = this;
+        
+        if (reader === undefined || typeof reader == 'string') {
+            reader = {
+                type: reader
+            };
+        }
+
+        if (reader.isReader) {
+            reader.setModel(me.model);
+        } else {
+            Ext.applyIf(reader, {
+                proxy: me,
+                model: me.model,
+                type : me.defaultReaderType
+            });
+
+            reader = Ext.createByAlias('reader.' + reader.type, reader);
+        }
+        
+        me.reader = reader;
+        return me.reader;
+    },
+    
+    
+    getReader: function() {
+        return this.reader;
+    },
+    
+    
+    setWriter: function(writer) {
+        if (writer === undefined || typeof writer == 'string') {
+            writer = {
+                type: writer
+            };
+        }
+
+        if (!(writer instanceof Ext.data.writer.Writer)) {
+            Ext.applyIf(writer, {
+                model: this.model,
+                type : this.defaultWriterType
+            });
+
+            writer = Ext.createByAlias('writer.' + writer.type, writer);
+        }
+        
+        this.writer = writer;
+        
+        return this.writer;
+    },
+    
+    
+    getWriter: function() {
+        return this.writer;
+    },
+    
+    
+    create: Ext.emptyFn,
+    
+    
+    read: Ext.emptyFn,
+    
+    
+    update: Ext.emptyFn,
+    
+    
+    destroy: Ext.emptyFn,
+    
+    
+    batch: function(operations, listeners) {
+        var me = this,
+            batch = Ext.create('Ext.data.Batch', {
+                proxy: me,
+                listeners: listeners || {}
+            }),
+            useBatch = me.batchActions, 
+            records;
+        
+        Ext.each(me.batchOrder.split(','), function(action) {
+            records = operations[action];
+            if (records) {
+                if (useBatch) {
+                    batch.add(Ext.create('Ext.data.Operation', {
+                        action: action,
+                        records: records
+                    }));
+                } else {
+                    Ext.each(records, function(record){
+                        batch.add(Ext.create('Ext.data.Operation', {
+                            action : action, 
+                            records: [record]
+                        }));
+                    });
+                }
+            }
+        }, me);
+        
+        batch.start();
+        return batch;
+    }
+}, function() {
+    
+    
+    
+    Ext.data.DataProxy = this;
+    
+    
+    
+});
+
+
+Ext.define('Ext.data.proxy.Server', {
+    extend: 'Ext.data.proxy.Proxy',
+    alias : 'proxy.server',
+    alternateClassName: 'Ext.data.ServerProxy',
+    uses  : ['Ext.data.Request'],
+
+    
+
+    
+    pageParam: 'page',
+
+    
+    startParam: 'start',
+
+    
+    limitParam: 'limit',
+
+    
+    groupParam: 'group',
+
+    
+    sortParam: 'sort',
+
+    
+    filterParam: 'filter',
+
+    
+    directionParam: 'dir',
+
+    
+    simpleSortMode: false,
+
+    
+    noCache : true,
+
+    
+    cacheString: "_dc",
+
+    
+    timeout : 30000,
+
+    
+
+    constructor: function(config) {
+        var me = this;
+
+        config = config || {};
+        this.addEvents(
+            
+            'exception'
+        );
+        me.callParent([config]);
+
+        
+        me.extraParams = config.extraParams || {};
+
+        me.api = config.api || {};
+
+        
+        me.nocache = me.noCache;
+    },
+
+    
+    create: function() {
+        return this.doRequest.apply(this, arguments);
+    },
+
+    read: function() {
+        return this.doRequest.apply(this, arguments);
+    },
+
+    update: function() {
+        return this.doRequest.apply(this, arguments);
+    },
+
+    destroy: function() {
+        return this.doRequest.apply(this, arguments);
+    },
+
+    
+    buildRequest: function(operation) {
+        var params = Ext.applyIf(operation.params || {}, this.extraParams || {}),
+            request;
+
+        
+        params = Ext.applyIf(params, this.getParams(operation));
+
+        if (operation.id && !params.id) {
+            params.id = operation.id;
+        }
+
+        request = Ext.create('Ext.data.Request', {
+            params   : params,
+            action   : operation.action,
+            records  : operation.records,
+            operation: operation,
+            url      : operation.url
+        });
+
+        request.url = this.buildUrl(request);
+
+        
+        operation.request = request;
+
+        return request;
+    },
+
+    
+    processResponse: function(success, operation, request, response, callback, scope){
+        var me = this,
+            reader,
+            result;
+
+        if (success === true) {
+            reader = me.getReader();
+            result = reader.read(me.extractResponseData(response));
+
+            if (result.success !== false) {
+                
+                Ext.apply(operation, {
+                    response: response,
+                    resultSet: result
+                });
+
+                operation.commitRecords(result.records);
+                operation.setCompleted();
+                operation.setSuccessful();
+            } else {
+                operation.setException(result.message);
+                me.fireEvent('exception', this, response, operation);
+            }
+        } else {
+            me.setException(operation, response);
+            me.fireEvent('exception', this, response, operation);
+        }
+
+        
+        if (typeof callback == 'function') {
+            callback.call(scope || me, operation);
+        }
+
+        me.afterRequest(request, success);
+    },
+
+    
+    setException: function(operation, response){
+        operation.setException({
+            status: response.status,
+            statusText: response.statusText
+        });
+    },
+
+    
+    extractResponseData: function(response){
+        return response;
+    },
+
+    
+    applyEncoding: function(value){
+        return Ext.encode(value);
+    },
+
+    
+    encodeSorters: function(sorters) {
+        var min = [],
+            length = sorters.length,
+            i = 0;
+
+        for (; i < length; i++) {
+            min[i] = {
+                property : sorters[i].property,
+                direction: sorters[i].direction
+            };
+        }
+        return this.applyEncoding(min);
+
+    },
+
+    
+    encodeFilters: function(filters) {
+        var min = [],
+            length = filters.length,
+            i = 0;
+
+        for (; i < length; i++) {
+            min[i] = {
+                property: filters[i].property,
+                value   : filters[i].value
+            };
+        }
+        return this.applyEncoding(min);
+    },
+
+    
+    getParams: function(operation) {
+        var me             = this,
+            params         = {},
+            isDef          = Ext.isDefined,
+            groupers       = operation.groupers,
+            sorters        = operation.sorters,
+            filters        = operation.filters,
+            page           = operation.page,
+            start          = operation.start,
+            limit          = operation.limit,
+
+            simpleSortMode = me.simpleSortMode,
+
+            pageParam      = me.pageParam,
+            startParam     = me.startParam,
+            limitParam     = me.limitParam,
+            groupParam     = me.groupParam,
+            sortParam      = me.sortParam,
+            filterParam    = me.filterParam,
+            directionParam = me.directionParam;
+
+        if (pageParam && isDef(page)) {
+            params[pageParam] = page;
+        }
+
+        if (startParam && isDef(start)) {
+            params[startParam] = start;
+        }
+
+        if (limitParam && isDef(limit)) {
+            params[limitParam] = limit;
+        }
+
+        if (groupParam && groupers && groupers.length > 0) {
+            
+            params[groupParam] = me.encodeSorters(groupers);
+        }
+
+        if (sortParam && sorters && sorters.length > 0) {
+            if (simpleSortMode) {
+                params[sortParam] = sorters[0].property;
+                params[directionParam] = sorters[0].direction;
+            } else {
+                params[sortParam] = me.encodeSorters(sorters);
+            }
+
+        }
+
+        if (filterParam && filters && filters.length > 0) {
+            params[filterParam] = me.encodeFilters(filters);
+        }
+
+        return params;
+    },
+
+    
+    buildUrl: function(request) {
+        var me = this,
+            url = me.getUrl(request);
+
+
+        if (me.noCache) {
+            url = Ext.urlAppend(url, Ext.String.format("{0}={1}", me.cacheString, Ext.Date.now()));
+        }
+
+        return url;
+    },
+
+    
+    getUrl: function(request){
+        return request.url || this.api[request.action] || this.url;
+    },
+
+    
+    doRequest: function(operation, callback, scope) {
+    },
+
+    
+    afterRequest: Ext.emptyFn,
+
+    onDestroy: function() {
+        Ext.destroy(this.reader, this.writer);
+    }
+});
+
+
+Ext.define('Ext.data.proxy.Ajax', {
+    requires: ['Ext.util.MixedCollection', 'Ext.Ajax'],
+    extend: 'Ext.data.proxy.Server',
+    alias: 'proxy.ajax',
+    alternateClassName: ['Ext.data.HttpProxy', 'Ext.data.AjaxProxy'],
+    
+    
+    actionMethods: {
+        create : 'POST',
+        read   : 'GET',
+        update : 'POST',
+        destroy: 'POST'
+    },
+    
+    
+    
+    
+    doRequest: function(operation, callback, scope) {
+        var writer  = this.getWriter(),
+            request = this.buildRequest(operation, callback, scope);
+            
+        if (operation.allowWrite()) {
+            request = writer.write(request);
+        }
+        
+        Ext.apply(request, {
+            headers       : this.headers,
+            timeout       : this.timeout,
+            scope         : this,
+            callback      : this.createRequestCallback(request, operation, callback, scope),
+            method        : this.getMethod(request),
+            disableCaching: false 
+        });
+        
+        Ext.Ajax.request(request);
+        
+        return request;
+    },
+    
+    
+    getMethod: function(request) {
+        return this.actionMethods[request.action];
+    },
+    
+    
+    createRequestCallback: function(request, operation, callback, scope) {
+        var me = this;
+        
+        return function(options, success, response) {
+            me.processResponse(success, operation, request, response, callback, scope);
+        };
+    }
+}, function() {
+    
+    Ext.data.HttpProxy = this;
+});
+
+
+Ext.define('Ext.data.Model', {
+    alternateClassName: 'Ext.data.Record',
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    requires: [
+        'Ext.ModelManager',
+        'Ext.data.IdGenerator',
+        'Ext.data.Field',
+        'Ext.data.Errors',
+        'Ext.data.Operation',
+        'Ext.data.validations',
+        'Ext.data.proxy.Ajax',
+        'Ext.util.MixedCollection'
+    ],
+
+    onClassExtended: function(cls, data) {
+        var onBeforeClassCreated = data.onBeforeClassCreated;
+
+        data.onBeforeClassCreated = function(cls, data) {
+            var me = this,
+                name = Ext.getClassName(cls),
+                prototype = cls.prototype,
+                superCls = cls.prototype.superclass,
+
+                validations = data.validations || [],
+                fields = data.fields || [],
+                associations = data.associations || [],
+                belongsTo = data.belongsTo,
+                hasMany = data.hasMany,
+                idgen = data.idgen,
+
+                fieldsMixedCollection = new Ext.util.MixedCollection(false, function(field) {
+                    return field.name;
+                }),
+
+                associationsMixedCollection = new Ext.util.MixedCollection(false, function(association) {
+                    return association.name;
+                }),
+
+                superValidations = superCls.validations,
+                superFields = superCls.fields,
+                superAssociations = superCls.associations,
+
+                association, i, ln,
+                dependencies = [];
+
+            
+            cls.modelName = name;
+            prototype.modelName = name;
+
+            
+            if (superValidations) {
+                validations = superValidations.concat(validations);
+            }
+
+            data.validations = validations;
+
+            
+            if (superFields) {
+                fields = superFields.items.concat(fields);
+            }
+
+            for (i = 0, ln = fields.length; i < ln; ++i) {
+                fieldsMixedCollection.add(new Ext.data.Field(fields[i]));
+            }
+
+            data.fields = fieldsMixedCollection;
+
+            if (idgen) {
+                data.idgen = Ext.data.IdGenerator.get(idgen);
+            }
+
+            
+            
+            if (belongsTo) {
+                belongsTo = Ext.Array.from(belongsTo);
+
+                for (i = 0, ln = belongsTo.length; i < ln; ++i) {
+                    association = belongsTo[i];
+
+                    if (!Ext.isObject(association)) {
+                        association = {model: association};
+                    }
+
+                    association.type = 'belongsTo';
+                    associations.push(association);
+                }
+
+                delete data.belongsTo;
+            }
+
+            if (hasMany) {
+                hasMany = Ext.Array.from(hasMany);
+                for (i = 0, ln = hasMany.length; i < ln; ++i) {
+                    association = hasMany[i];
+
+                    if (!Ext.isObject(association)) {
+                        association = {model: association};
+                    }
+
+                    association.type = 'hasMany';
+                    associations.push(association);
+                }
+
+                delete data.hasMany;
+            }
+
+            if (superAssociations) {
+                associations = superAssociations.items.concat(associations);
+            }
+
+            for (i = 0, ln = associations.length; i < ln; ++i) {
+                dependencies.push('association.' + associations[i].type.toLowerCase());
+            }
+
+            if (data.proxy) {
+                if (typeof data.proxy === 'string') {
+                    dependencies.push('proxy.' + data.proxy);
+                }
+                else if (typeof data.proxy.type === 'string') {
+                    dependencies.push('proxy.' + data.proxy.type);
+                }
+            }
+
+            Ext.require(dependencies, function() {
+                Ext.ModelManager.registerType(name, cls);
+
+                for (i = 0, ln = associations.length; i < ln; ++i) {
+                    association = associations[i];
+
+                    Ext.apply(association, {
+                        ownerModel: name,
+                        associatedModel: association.model
+                    });
+
+                    if (Ext.ModelManager.getModel(association.model) === undefined) {
+                        Ext.ModelManager.registerDeferredAssociation(association);
+                    } else {
+                        associationsMixedCollection.add(Ext.data.Association.create(association));
+                    }
+                }
+
+                data.associations = associationsMixedCollection;
+
+                onBeforeClassCreated.call(me, cls, data);
+
+                cls.setProxy(cls.prototype.proxy || cls.prototype.defaultProxyType);
+
+                
+                Ext.ModelManager.onModelDefined(cls);
+            });
+        };
+    },
+
+    inheritableStatics: {
+        
+        setProxy: function(proxy) {
+            
+            if (!proxy.isProxy) {
+                if (typeof proxy == "string") {
+                    proxy = {
+                        type: proxy
+                    };
+                }
+                proxy = Ext.createByAlias("proxy." + proxy.type, proxy);
+            }
+            proxy.setModel(this);
+            this.proxy = this.prototype.proxy = proxy;
+
+            return proxy;
+        },
+
+        
+        getProxy: function() {
+            return this.proxy;
+        },
+
+        
+        load: function(id, config) {
+            config = Ext.apply({}, config);
+            config = Ext.applyIf(config, {
+                action: 'read',
+                id    : id
+            });
+
+            var operation  = Ext.create('Ext.data.Operation', config),
+                scope      = config.scope || this,
+                record     = null,
+                callback;
+
+            callback = function(operation) {
+                if (operation.wasSuccessful()) {
+                    record = operation.getRecords()[0];
+                    Ext.callback(config.success, scope, [record, operation]);
+                } else {
+                    Ext.callback(config.failure, scope, [record, operation]);
+                }
+                Ext.callback(config.callback, scope, [record, operation]);
+            };
+
+            this.proxy.read(operation, callback, this);
+        }
+    },
+
+    statics: {
+        PREFIX : 'ext-record',
+        AUTO_ID: 1,
+        EDIT   : 'edit',
+        REJECT : 'reject',
+        COMMIT : 'commit',
+
+        
+        id: function(rec) {
+            var id = [this.PREFIX, '-', this.AUTO_ID++].join('');
+            rec.phantom = true;
+            rec.internalId = id;
+            return id;
+        }
+    },
+
+    
+    idgen: {
+        isGenerator: true,
+        type: 'default',
+
+        generate: function () {
+            return null;
+        },
+        getRecId: function (rec) {
+            return rec.modelName + '-' + rec.internalId;
+        }
+    },
+
+    
+    editing : false,
+
+    
+    dirty : false,
+
+    
+    persistenceProperty: 'data',
+
+    evented: false,
+    isModel: true,
+
+    
+    phantom : false,
+
+    
+    idProperty: 'id',
+
+    
+    defaultProxyType: 'ajax',
+
+    
+    
+    
+
+    
+
+    
+    
+    
+    
+    
+
+    
+
+    
+    constructor: function(data, id, raw) {
+        data = data || {};
+
+        var me = this,
+            fields,
+            length,
+            field,
+            name,
+            i,
+            newId,
+            isArray = Ext.isArray(data),
+            newData = isArray ? {} : null; 
+
+        
+        me.internalId = (id || id === 0) ? id : Ext.data.Model.id(me);
+
+        
+        me.raw = raw;
+
+        Ext.applyIf(me, {
+            data: {}
+        });
+
+        
+        me.modified = {};
+
+        
+        if (me.persistanceProperty) {
+            me.persistenceProperty = me.persistanceProperty;
+        }
+        me[me.persistenceProperty] = {};
+
+        me.mixins.observable.constructor.call(me);
+
+        
+        fields = me.fields.items;
+        length = fields.length;
+
+        for (i = 0; i < length; i++) {
+            field = fields[i];
+            name  = field.name;
+
+            if (isArray){
+                
+                
+                newData[name] = data[i];
+            }
+            else if (data[name] === undefined) {
+                data[name] = field.defaultValue;
+            }
+        }
+
+        me.set(newData || data);
+
+        if (me.getId()) {
+            me.phantom = false;
+        } else if (me.phantom) {
+            newId = me.idgen.generate();
+            if (newId !== null) {
+                me.setId(newId);
+            }
+        }
+
+        
+        me.dirty = false;
+        me.modified = {};
+
+        if (typeof me.init == 'function') {
+            me.init();
+        }
+
+        me.id = me.idgen.getRecId(me);
+    },
+
+    
+    get: function(field) {
+        return this[this.persistenceProperty][field];
+    },
+
+    
+    set: function(fieldName, value) {
+        var me = this,
+            fields = me.fields,
+            modified = me.modified,
+            convertFields = [],
+            field, key, i, currentValue, notEditing, count, length;
+
+        
+        if (arguments.length == 1 && Ext.isObject(fieldName)) {
+            notEditing = !me.editing;
+            count = 0;
+            for (key in fieldName) {
+                if (fieldName.hasOwnProperty(key)) {
+
+                    
+                    
+                    field = fields.get(key);
+                    if (field && field.convert !== field.type.convert) {
+                        convertFields.push(key);
+                        continue;
+                    }
+
+                    if (!count && notEditing) {
+                        me.beginEdit();
+                    }
+                    ++count;
+                    me.set(key, fieldName[key]);
+                }
+            }
+
+            length = convertFields.length;
+            if (length) {
+                if (!count && notEditing) {
+                    me.beginEdit();
+                }
+                count += length;
+                for (i = 0; i < length; i++) {
+                    field = convertFields[i];
+                    me.set(field, fieldName[field]);
+                }
+            }
+
+            if (notEditing && count) {
+                me.endEdit();
+            }
+        } else {
+            if (fields) {
+                field = fields.get(fieldName);
+
+                if (field && field.convert) {
+                    value = field.convert(value, me);
+                }
+            }
+            currentValue = me.get(fieldName);
+            me[me.persistenceProperty][fieldName] = value;
+
+            if (field && field.persist && !me.isEqual(currentValue, value)) {
+                if (me.isModified(fieldName)) {
+                    if (me.isEqual(modified[fieldName], value)) {
+                        
+                        
+                        delete modified[fieldName];
+                        
+                        
+                        me.dirty = false;
+                        for (key in modified) {
+                            if (modified.hasOwnProperty(key)){
+                                me.dirty = true;
+                                break;
+                            }
+                        }
+                    }
+                } else {
+                    me.dirty = true;
+                    modified[fieldName] = currentValue;
+                }
+            }
+
+            if (!me.editing) {
+                me.afterEdit();
+            }
+        }
+    },
+
+    
+    isEqual: function(a, b){
+        if (Ext.isDate(a) && Ext.isDate(b)) {
+            return a.getTime() === b.getTime();
+        }
+        return a === b;
+    },
+
+    
+    beginEdit : function(){
+        var me = this;
+        if (!me.editing) {
+            me.editing = true;
+            me.dirtySave = me.dirty;
+            me.dataSave = Ext.apply({}, me[me.persistenceProperty]);
+            me.modifiedSave = Ext.apply({}, me.modified);
+        }
+    },
+
+    
+    cancelEdit : function(){
+        var me = this;
+        if (me.editing) {
+            me.editing = false;
+            
+            me.modified = me.modifiedSave;
+            me[me.persistenceProperty] = me.dataSave;
+            me.dirty = me.dirtySave;
+            delete me.modifiedSave;
+            delete me.dataSave;
+            delete me.dirtySave;
+        }
+    },
+
+    
+    endEdit : function(silent){
+        var me = this,
+            didChange;
+            
+        if (me.editing) {
+            me.editing = false;
+            didChange = me.dirty || me.changedWhileEditing();
+            delete me.modifiedSave;
+            delete me.dataSave;
+            delete me.dirtySave;
+            if (silent !== true && didChange) {
+                me.afterEdit();
+            }
+        }
+    },
+    
+    
+    changedWhileEditing: function(){
+        var me = this,
+            saved = me.dataSave,
+            data = me[me.persistenceProperty],
+            key;
+            
+        for (key in data) {
+            if (data.hasOwnProperty(key)) {
+                if (!me.isEqual(data[key], saved[key])) {
+                    return true;
+                }
+            }
+        }
+        return false; 
+    },
+
+    
+    getChanges : function(){
+        var modified = this.modified,
+            changes  = {},
+            field;
+
+        for (field in modified) {
+            if (modified.hasOwnProperty(field)){
+                changes[field] = this.get(field);
+            }
+        }
+
+        return changes;
+    },
+
+    
+    isModified : function(fieldName) {
+        return this.modified.hasOwnProperty(fieldName);
+    },
+
+    
+    setDirty : function() {
+        var me = this,
+            name;
+
+        me.dirty = true;
+
+        me.fields.each(function(field) {
+            if (field.persist) {
+                name = field.name;
+                me.modified[name] = me.get(name);
+            }
+        }, me);
+    },
+
+
+    
+    reject : function(silent) {
+        var me = this,
+            modified = me.modified,
+            field;
+
+        for (field in modified) {
+            if (modified.hasOwnProperty(field)) {
+                if (typeof modified[field] != "function") {
+                    me[me.persistenceProperty][field] = modified[field];
+                }
+            }
+        }
+
+        me.dirty = false;
+        me.editing = false;
+        me.modified = {};
+
+        if (silent !== true) {
+            me.afterReject();
+        }
+    },
+
+    
+    commit : function(silent) {
+        var me = this;
+
+        me.phantom = me.dirty = me.editing = false;
+        me.modified = {};
+
+        if (silent !== true) {
+            me.afterCommit();
+        }
+    },
+
+    
+    copy : function(newId) {
+        var me = this;
+
+        return new me.self(Ext.apply({}, me[me.persistenceProperty]), newId || me.internalId);
+    },
+
+    
+    setProxy: function(proxy) {
+        
+        if (!proxy.isProxy) {
+            if (typeof proxy === "string") {
+                proxy = {
+                    type: proxy
+                };
+            }
+            proxy = Ext.createByAlias("proxy." + proxy.type, proxy);
+        }
+        proxy.setModel(this.self);
+        this.proxy = proxy;
+
+        return proxy;
+    },
+
+    
+    getProxy: function() {
+        return this.proxy;
+    },
+
+    
+    validate: function() {
+        var errors      = Ext.create('Ext.data.Errors'),
+            validations = this.validations,
+            validators  = Ext.data.validations,
+            length, validation, field, valid, type, i;
+
+        if (validations) {
+            length = validations.length;
+
+            for (i = 0; i < length; i++) {
+                validation = validations[i];
+                field = validation.field || validation.name;
+                type  = validation.type;
+                valid = validators[type](validation, this.get(field));
+
+                if (!valid) {
+                    errors.add({
+                        field  : field,
+                        message: validation.message || validators[type + 'Message']
+                    });
+                }
+            }
+        }
+
+        return errors;
+    },
+
+    
+    isValid: function(){
+        return this.validate().isValid();
+    },
+
+    
+    save: function(options) {
+        options = Ext.apply({}, options);
+
+        var me     = this,
+            action = me.phantom ? 'create' : 'update',
+            record = null,
+            scope  = options.scope || me,
+            operation,
+            callback;
+
+        Ext.apply(options, {
+            records: [me],
+            action : action
+        });
+
+        operation = Ext.create('Ext.data.Operation', options);
+
+        callback = function(operation) {
+            if (operation.wasSuccessful()) {
+                record = operation.getRecords()[0];
+                
+                
+                me.set(record.data);
+                record.dirty = false;
+
+                Ext.callback(options.success, scope, [record, operation]);
+            } else {
+                Ext.callback(options.failure, scope, [record, operation]);
+            }
+
+            Ext.callback(options.callback, scope, [record, operation]);
+        };
+
+        me.getProxy()[action](operation, callback, me);
+
+        return me;
+    },
+
+    
+    destroy: function(options){
+        options = Ext.apply({}, options);
+
+        var me     = this,
+            record = null,
+            scope  = options.scope || me,
+            operation,
+            callback;
+
+        Ext.apply(options, {
+            records: [me],
+            action : 'destroy'
+        });
+
+        operation = Ext.create('Ext.data.Operation', options);
+        callback = function(operation) {
+            if (operation.wasSuccessful()) {
+                Ext.callback(options.success, scope, [record, operation]);
+            } else {
+                Ext.callback(options.failure, scope, [record, operation]);
+            }
+            Ext.callback(options.callback, scope, [record, operation]);
+        };
+
+        me.getProxy().destroy(operation, callback, me);
+        return me;
+    },
+
+    
+    getId: function() {
+        return this.get(this.idProperty);
+    },
+
+    
+    setId: function(id) {
+        this.set(this.idProperty, id);
+    },
+
+    
+    join : function(store) {
+        
+        this.store = store;
+    },
+
+    
+    unjoin: function(store) {
+        delete this.store;
+    },
+
+    
+    afterEdit : function() {
+        this.callStore('afterEdit');
+    },
+
+    
+    afterReject : function() {
+        this.callStore("afterReject");
+    },
+
+    
+    afterCommit: function() {
+        this.callStore('afterCommit');
+    },
+
+    
+    callStore: function(fn) {
+        var store = this.store;
+
+        if (store !== undefined && typeof store[fn] == "function") {
+            store[fn](this);
+        }
+    },
+
+    
+    getAssociatedData: function(){
+        return this.prepareAssociatedData(this, [], null);
+    },
+
+    
+    prepareAssociatedData: function(record, ids, associationType) {
+        
+        var associations     = record.associations.items,
+            associationCount = associations.length,
+            associationData  = {},
+            associatedStore, associatedName, associatedRecords, associatedRecord,
+            associatedRecordCount, association, id, i, j, type, allow;
+
+        for (i = 0; i < associationCount; i++) {
+            association = associations[i];
+            type = association.type;
+            allow = true;
+            if (associationType) {
+                allow = type == associationType;
+            }
+            if (allow && type == 'hasMany') {
+
+                
+                associatedStore = record[association.storeName];
+
+                
+                associationData[association.name] = [];
+
+                
+                if (associatedStore && associatedStore.data.length > 0) {
+                    associatedRecords = associatedStore.data.items;
+                    associatedRecordCount = associatedRecords.length;
+
+                    
+                    for (j = 0; j < associatedRecordCount; j++) {
+                        associatedRecord = associatedRecords[j];
+                        
+                        id = associatedRecord.id;
+
+                        
+                        
+                        if (Ext.Array.indexOf(ids, id) == -1) {
+                            ids.push(id);
+
+                            associationData[association.name][j] = associatedRecord.data;
+                            Ext.apply(associationData[association.name][j], this.prepareAssociatedData(associatedRecord, ids, type));
+                        }
+                    }
+                }
+            } else if (allow && type == 'belongsTo') {
+                associatedRecord = record[association.instanceName];
+                if (associatedRecord !== undefined) {
+                    id = associatedRecord.id;
+                    if (Ext.Array.indexOf(ids, id) == -1) {
+                        ids.push(id);
+                        associationData[association.name] = associatedRecord.data;
+                        Ext.apply(associationData[association.name], this.prepareAssociatedData(associatedRecord, ids, type));
+                    }
+                }
+            }
+        }
+
+        return associationData;
+    }
+});
+
+
+Ext.define('Ext.data.StoreManager', {
+    extend: 'Ext.util.MixedCollection',
+    alternateClassName: ['Ext.StoreMgr', 'Ext.data.StoreMgr', 'Ext.StoreManager'],
+    singleton: true,
+    uses: ['Ext.data.ArrayStore'],
+    
+    
+
+    
+    register : function() {
+        for (var i = 0, s; (s = arguments[i]); i++) {
+            this.add(s);
+        }
+    },
+
+    
+    unregister : function() {
+        for (var i = 0, s; (s = arguments[i]); i++) {
+            this.remove(this.lookup(s));
+        }
+    },
+
+    
+    lookup : function(store) {
+        
+        if (Ext.isArray(store)) {
+            var fields = ['field1'], 
+                expand = !Ext.isArray(store[0]),
+                data = store,
+                i,
+                len;
+                
+            if(expand){
+                data = [];
+                for (i = 0, len = store.length; i < len; ++i) {
+                    data.push([store[i]]);
+                }
+            } else {
+                for(i = 2, len = store[0].length; i <= len; ++i){
+                    fields.push('field' + i);
+                }
+            }
+            return Ext.create('Ext.data.ArrayStore', {
+                data  : data,
+                fields: fields,
+                autoDestroy: true,
+                autoCreated: true,
+                expanded: expand
+            });
+        }
+        
+        if (Ext.isString(store)) {
+            
+            return this.get(store);
+        } else {
+            
+            return Ext.data.AbstractStore.create(store);
+        }
+    },
+
+    
+    getKey : function(o) {
+         return o.storeId;
+    }
+}, function() {    
+    
+    Ext.regStore = function(name, config) {
+        var store;
+
+        if (Ext.isObject(name)) {
+            config = name;
+        } else {
+            config.storeId = name;
+        }
+
+        if (config instanceof Ext.data.Store) {
+            store = config;
+        } else {
+            store = Ext.create('Ext.data.Store', config);
+        }
+
+        return Ext.data.StoreManager.register(store);
+    };
+
+    
+    Ext.getStore = function(name) {
+        return Ext.data.StoreManager.lookup(name);
+    };
+});
+
+
+Ext.define('Ext.Component', {
+
+    
+
+    alias: ['widget.component', 'widget.box'],
+
+    extend: 'Ext.AbstractComponent',
+
+    requires: [
+        'Ext.util.DelayedTask'
+    ],
+
+    uses: [
+        'Ext.Layer',
+        'Ext.resizer.Resizer',
+        'Ext.util.ComponentDragger'
+    ],
+
+    mixins: {
+        floating: 'Ext.util.Floating'
+    },
+
+    statics: {
+        
+        DIRECTION_TOP: 'top',
+        DIRECTION_RIGHT: 'right',
+        DIRECTION_BOTTOM: 'bottom',
+        DIRECTION_LEFT: 'left',
+
+        VERTICAL_DIRECTION_Re: /^(?:top|bottom)$/,
+
+        
+        
+        INVALID_ID_CHARS_Re: /[\.,\s]/g
+    },
+
+    
+
+    
+
+    
+    resizeHandles: 'all',
+
+    
+
+    
+    floating: false,
+
+    
+    toFrontOnShow: true,
+
+    
+
+    
+
+    
+
+    
+
+    hideMode: 'display',
+    
+    hideParent: false,
+
+    ariaRole: 'presentation',
+
+    bubbleEvents: [],
+
+    actionMode: 'el',
+    monPropRe: /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
+
+    
+    
+    
+    
+    
+    
+
+    
+    constructor: function(config) {
+        var me = this;
+
+        config = config || {};
+        if (config.initialConfig) {
+
+            
+            if (config.isAction) {
+                me.baseAction = config;
+            }
+            config = config.initialConfig;
+            
+        }
+        else if (config.tagName || config.dom || Ext.isString(config)) {
+            
+            config = {
+                applyTo: config,
+                id: config.id || config
+            };
+        }
+
+        me.callParent([config]);
+
+        
+        
+        if (me.baseAction){
+            me.baseAction.addComponent(me);
+        }
+    },
+
+    
+    initComponent: function() {
+        var me = this;
+
+        me.callParent();
+
+        if (me.listeners) {
+            me.on(me.listeners);
+            delete me.listeners;
+        }
+        me.enableBubble(me.bubbleEvents);
+        me.mons = [];
+    },
+
+    
+    afterRender: function() {
+        var me = this,
+            resizable = me.resizable;
+
+        if (me.floating) {
+            me.makeFloating(me.floating);
+        } else {
+            me.el.setVisibilityMode(Ext.Element[me.hideMode.toUpperCase()]);
+        }
+
+        if (Ext.isDefined(me.autoScroll)) {
+            me.setAutoScroll(me.autoScroll);
+        }
+        me.callParent();
+
+        if (!(me.x && me.y) && (me.pageX || me.pageY)) {
+            me.setPagePosition(me.pageX, me.pageY);
+        }
+
+        if (resizable) {
+            me.initResizable(resizable);
+        }
+
+        if (me.draggable) {
+            me.initDraggable();
+        }
+
+        me.initAria();
+    },
+
+    initAria: function() {
+        var actionEl = this.getActionEl(),
+            role = this.ariaRole;
+        if (role) {
+            actionEl.dom.setAttribute('role', role);
+        }
+    },
+
+    
+    setAutoScroll : function(scroll){
+        var me = this,
+            targetEl;
+        scroll = !!scroll;
+        if (me.rendered) {
+            targetEl = me.getTargetEl();
+            targetEl.setStyle('overflow', scroll ? 'auto' : '');
+            if (scroll && (Ext.isIE6 || Ext.isIE7)) {
+                
+                
+                targetEl.position();
+            }
+        }
+        me.autoScroll = scroll;
+        return me;
+    },
+
+    
+    makeFloating : function(cfg){
+        this.mixins.floating.constructor.call(this, cfg);
+    },
+
+    initResizable: function(resizable) {
+        var me = this;
+
+        resizable = Ext.apply({
+            target: me,
+            dynamic: false,
+            constrainTo: me.constrainTo || (me.floatParent ? me.floatParent.getTargetEl() : me.el.getScopeParent()),
+            handles: me.resizeHandles
+        }, resizable);
+        resizable.target = me;
+        me.resizer = Ext.create('Ext.resizer.Resizer', resizable);
+    },
+
+    getDragEl: function() {
+        return this.el;
+    },
+
+    initDraggable: function() {
+        var me = this,
+            ddConfig = Ext.applyIf({
+                el: me.getDragEl(),
+                constrainTo: me.constrain ? (me.constrainTo || (me.floatParent ? me.floatParent.getTargetEl() : me.el.getScopeParent())) : undefined
+            }, me.draggable);
+
+        
+        if (me.constrain || me.constrainDelegate) {
+            ddConfig.constrain = me.constrain;
+            ddConfig.constrainDelegate = me.constrainDelegate;
+        }
+
+        me.dd = Ext.create('Ext.util.ComponentDragger', me, ddConfig);
+    },
+
+    
+    setPosition: function(x, y, animate) {
+        var me = this,
+            el = me.el,
+            to = {},
+            adj, adjX, adjY, xIsNumber, yIsNumber;
+
+        if (Ext.isArray(x)) {
+            animate = y;
+            y = x[1];
+            x = x[0];
+        }
+        me.x = x;
+        me.y = y;
+
+        if (!me.rendered) {
+            return me;
+        }
+
+        adj = me.adjustPosition(x, y);
+        adjX = adj.x;
+        adjY = adj.y;
+        xIsNumber = Ext.isNumber(adjX);
+        yIsNumber = Ext.isNumber(adjY);
+
+        if (xIsNumber || yIsNumber) {
+            if (animate) {
+                if (xIsNumber) {
+                    to.left = adjX;
+                }
+                if (yIsNumber) {
+                    to.top = adjY;
+                }
+
+                me.stopAnimation();
+                me.animate(Ext.apply({
+                    duration: 1000,
+                    listeners: {
+                        afteranimate: Ext.Function.bind(me.afterSetPosition, me, [adjX, adjY])
+                    },
+                    to: to
+                }, animate));
+            }
+            else {
+                if (!xIsNumber) {
+                    el.setTop(adjY);
+                }
+                else if (!yIsNumber) {
+                    el.setLeft(adjX);
+                }
+                else {
+                    el.setLeftTop(adjX, adjY);
+                }
+                me.afterSetPosition(adjX, adjY);
+            }
+        }
+        return me;
+    },
+
+    
+    afterSetPosition: function(ax, ay) {
+        this.onPosition(ax, ay);
+        this.fireEvent('move', this, ax, ay);
+    },
+
+    
+    showAt: function(x, y, animate) {
+        var me = this;
+
+        if (me.floating) {
+            me.setPosition(x, y, animate);
+        } else {
+            me.setPagePosition(x, y, animate);
+        }
+        me.show();
+    },
+
+    
+    setPagePosition: function(x, y, animate) {
+        var me = this,
+            p;
+
+        if (Ext.isArray(x)) {
+            y = x[1];
+            x = x[0];
+        }
+        me.pageX = x;
+        me.pageY = y;
+        if (me.floating && me.floatParent) {
+            
+            p = me.floatParent.getTargetEl().getViewRegion();
+            if (Ext.isNumber(x) && Ext.isNumber(p.left)) {
+                x -= p.left;
+            }
+            if (Ext.isNumber(y) && Ext.isNumber(p.top)) {
+                y -= p.top;
+            }
+            me.setPosition(x, y, animate);
+        }
+        else {
+            p = me.el.translatePoints(x, y);
+            me.setPosition(p.left, p.top, animate);
+        }
+        return me;
+    },
+
+    
+    getBox : function(local){
+        var pos = this.getPosition(local),
+            size = this.getSize();
+
+        size.x = pos[0];
+        size.y = pos[1];
+        return size;
+    },
+
+    
+    updateBox : function(box){
+        this.setSize(box.width, box.height);
+        this.setPagePosition(box.x, box.y);
+        return this;
+    },
+
+    
+    getOuterSize: function() {
+        var el = this.el;
+        return {
+            width: el.getWidth() + el.getMargin('lr'),
+            height: el.getHeight() + el.getMargin('tb')
+        };
+    },
+
+    
+    adjustPosition: function(x, y) {
+
+        
+        if (this.floating && this.floatParent) {
+            var o = this.floatParent.getTargetEl().getViewRegion();
+            x += o.left;
+            y += o.top;
+        }
+
+        return {
+            x: x,
+            y: y
+        };
+    },
+
+    
+    getPosition: function(local) {
+        var me = this,
+            el = me.el,
+            xy,
+            o;
+
+        
+        if ((local === true) || (me.floating && !me.floatParent)) {
+            return [el.getLeft(true), el.getTop(true)];
+        }
+        xy = me.xy || el.getXY();
+
+        
+        if (me.floating) {
+            o = me.floatParent.getTargetEl().getViewRegion();
+            xy[0] -= o.left;
+            xy[1] -= o.top;
+        }
+        return xy;
+    },
+
+    getId: function() {
+        var me = this,
+            xtype;
+
+        if (!me.id) {
+            xtype = me.getXType();
+            xtype = xtype ? xtype.replace(Ext.Component.INVALID_ID_CHARS_Re, '-') : 'ext-comp';
+            me.id = xtype + '-' + me.getAutoId();
+        }
+        return me.id;
+    },
+
+    onEnable: function() {
+        var actionEl = this.getActionEl();
+        actionEl.dom.removeAttribute('aria-disabled');
+        actionEl.dom.disabled = false;
+        this.callParent();
+    },
+
+    onDisable: function() {
+        var actionEl = this.getActionEl();
+        actionEl.dom.setAttribute('aria-disabled', true);
+        actionEl.dom.disabled = true;
+        this.callParent();
+    },
+
+    
+    show: function(animateTarget, cb, scope) {
+        var me = this;
+
+        if (me.rendered && me.isVisible()) {
+            if (me.toFrontOnShow && me.floating) {
+                me.toFront();
+            }
+        } else if (me.fireEvent('beforeshow', me) !== false) {
+            me.hidden = false;
+
+            
+            if (!me.rendered && (me.autoRender || me.floating)) {
+                me.doAutoRender();
+            }
+            if (me.rendered) {
+                me.beforeShow();
+                me.onShow.apply(me, arguments);
+
+                
+                
+                if (me.ownerCt && !me.floating && !(me.ownerCt.suspendLayout || me.ownerCt.layout.layoutBusy)) {
+                    me.ownerCt.doLayout();
+                }
+                me.afterShow.apply(me, arguments);
+            }
+        }
+        return me;
+    },
+
+    beforeShow: Ext.emptyFn,
+
+    
+    onShow: function() {
+        var me = this;
+
+        me.el.show();
+        me.callParent(arguments);
+        if (me.floating && me.constrain) {
+            me.doConstrain();
+        }
+    },
+
+    afterShow: function(animateTarget, cb, scope) {
+        var me = this,
+            fromBox,
+            toBox,
+            ghostPanel;
+
+        
+        animateTarget = animateTarget || me.animateTarget;
+
+        
+        if (!me.ghost) {
+            animateTarget = null;
+        }
+        
+        if (animateTarget) {
+            animateTarget = animateTarget.el ? animateTarget.el : Ext.get(animateTarget);
+            toBox = me.el.getBox();
+            fromBox = animateTarget.getBox();
+            me.el.addCls(Ext.baseCSSPrefix + 'hide-offsets');
+            ghostPanel = me.ghost();
+            ghostPanel.el.stopAnimation();
+
+            
+            ghostPanel.el.setX(-10000);
+
+            ghostPanel.el.animate({
+                from: fromBox,
+                to: toBox,
+                listeners: {
+                    afteranimate: function() {
+                        delete ghostPanel.componentLayout.lastComponentSize;
+                        me.unghost();
+                        me.el.removeCls(Ext.baseCSSPrefix + 'hide-offsets');
+                        me.onShowComplete(cb, scope);
+                    }
+                }
+            });
+        }
+        else {
+            me.onShowComplete(cb, scope);
+        }
+    },
+
+    onShowComplete: function(cb, scope) {
+        var me = this;
+        if (me.floating) {
+            me.toFront();
+        }
+        Ext.callback(cb, scope || me);
+        me.fireEvent('show', me);
+    },
+
+    
+    hide: function() {
+        var me = this;
+
+        
+        
+        me.showOnParentShow = false;
+
+        if (!(me.rendered && !me.isVisible()) && me.fireEvent('beforehide', me) !== false) {
+            me.hidden = true;
+            if (me.rendered) {
+                me.onHide.apply(me, arguments);
+
+                
+                
+                if (me.ownerCt && !me.floating && !(me.ownerCt.suspendLayout || me.ownerCt.layout.layoutBusy)) {
+                    me.ownerCt.doLayout();
+                }
+            }
+        }
+        return me;
+    },
+
+    
+    onHide: function(animateTarget, cb, scope) {
+        var me = this,
+            ghostPanel,
+            toBox;
+
+        
+        animateTarget = animateTarget || me.animateTarget;
+
+        
+        if (!me.ghost) {
+            animateTarget = null;
+        }
+        
+        if (animateTarget) {
+            animateTarget = animateTarget.el ? animateTarget.el : Ext.get(animateTarget);
+            ghostPanel = me.ghost();
+            ghostPanel.el.stopAnimation();
+            toBox = animateTarget.getBox();
+            toBox.width += 'px';
+            toBox.height += 'px';
+            ghostPanel.el.animate({
+                to: toBox,
+                listeners: {
+                    afteranimate: function() {
+                        delete ghostPanel.componentLayout.lastComponentSize;
+                        ghostPanel.el.hide();
+                        me.afterHide(cb, scope);
+                    }
+                }
+            });
+        }
+        me.el.hide();
+        if (!animateTarget) {
+            me.afterHide(cb, scope);
+        }
+    },
+
+    afterHide: function(cb, scope) {
+        Ext.callback(cb, scope || this);
+        this.fireEvent('hide', this);
+    },
+
+    
+    onDestroy: function() {
+        var me = this;
+
+        
+        if (me.rendered) {
+            Ext.destroy(
+                me.proxy,
+                me.proxyWrap,
+                me.resizer
+            );
+            
+            if (me.actionMode == 'container' || me.removeMode == 'container') {
+                me.container.remove();
+            }
+        }
+        delete me.focusTask;
+        me.callParent();
+    },
+
+    deleteMembers: function() {
+        var args = arguments,
+            len = args.length,
+            i = 0;
+        for (; i < len; ++i) {
+            delete this[args[i]];
+        }
+    },
+
+    
+    focus: function(selectText, delay) {
+        var me = this,
+                focusEl;
+
+        if (delay) {
+            if (!me.focusTask) {
+                me.focusTask = Ext.create('Ext.util.DelayedTask', me.focus);
+            }
+            me.focusTask.delay(Ext.isNumber(delay) ? delay : 10, null, me, [selectText, false]);
+            return me;
+        }
+
+        if (me.rendered && !me.isDestroyed) {
+            
+            focusEl = me.getFocusEl();
+            focusEl.focus();
+            if (focusEl.dom && selectText === true) {
+                focusEl.dom.select();
+            }
+
+            
+            
+            if (me.floating) {
+                me.toFront(true);
+            }
+        }
+        return me;
+    },
+
+    
+    getFocusEl: function() {
+        return this.el;
+    },
+
+    
+    blur: function() {
+        if (this.rendered) {
+            this.getFocusEl().blur();
+        }
+        return this;
+    },
+
+    getEl: function() {
+        return this.el;
+    },
+
+    
+    getResizeEl: function() {
+        return this.el;
+    },
+
+    
+    getPositionEl: function() {
+        return this.el;
+    },
+
+    
+    getActionEl: function() {
+        return this.el;
+    },
+
+    
+    getVisibilityEl: function() {
+        return this.el;
+    },
+
+    
+    onResize: Ext.emptyFn,
+
+    
+    getBubbleTarget: function() {
+        return this.ownerCt;
+    },
+
+    
+    getContentTarget: function() {
+        return this.el;
+    },
+
+    
+    cloneConfig: function(overrides) {
+        overrides = overrides || {};
+        var id = overrides.id || Ext.id(),
+            cfg = Ext.applyIf(overrides, this.initialConfig),
+            self;
+
+        cfg.id = id;
+
+        self = Ext.getClass(this);
+
+        
+        return new self(cfg);
+    },
+
+    
+    getXType: function() {
+        return this.self.xtype;
+    },
+
+    
+    findParentBy: function(fn) {
+        var p;
+
+        
+        for (p = this.ownerCt; p && !fn(p, this); p = p.ownerCt);
+        return p || null;
+    },
+
+    
+    findParentByType: function(xtype) {
+        return Ext.isFunction(xtype) ?
+            this.findParentBy(function(p) {
+                return p.constructor === xtype;
+            })
+        :
+            this.up(xtype);
+    },
+
+    
+    bubble: function(fn, scope, args) {
+        var p = this;
+        while (p) {
+            if (fn.apply(scope || p, args || [p]) === false) {
+                break;
+            }
+            p = p.ownerCt;
+        }
+        return this;
+    },
+
+    getProxy: function() {
+        var me = this,
+            target;
+
+        if (!me.proxy) {
+            target = Ext.getBody();
+            if (Ext.scopeResetCSS) {
+                me.proxyWrap = target = Ext.getBody().createChild({
+                    cls: Ext.baseCSSPrefix + 'reset'
+                });
+            }
+            me.proxy = me.el.createProxy(Ext.baseCSSPrefix + 'proxy-el', target, true);
+        }
+        return me.proxy;
+    }
+
+});
+
+
+Ext.define('Ext.layout.container.AbstractContainer', {
+
+    
+
+    extend: 'Ext.layout.Layout',
+
+    
+
+    type: 'container',
+
+    
+    bindToOwnerCtComponent: false,
+
+    
+    bindToOwnerCtContainer: false,
+
+    
+
+    
+    setItemSize: function(item, width, height) {
+        if (Ext.isObject(width)) {
+            height = width.height;
+            width = width.width;
+        }
+        item.setCalculatedSize(width, height, this.owner);
+    },
+
+    
+    getLayoutItems: function() {
+        return this.owner && this.owner.items && this.owner.items.items || [];
+    },
+
+    
+    beforeLayout: function() {
+        return !this.owner.collapsed && this.callParent(arguments);
+    },
+
+    afterLayout: function() {
+        this.owner.afterLayout(this);
+    },
+    
+     getTarget: function() {
+         return this.owner.getTargetEl();
+     },
+    
+     getRenderTarget: function() {
+         return this.owner.getTargetEl();
+     }
+});
+
+
+Ext.define('Ext.layout.container.Container', {
+
+    
+
+    extend: 'Ext.layout.container.AbstractContainer',
+    alternateClassName: 'Ext.layout.ContainerLayout',
+
+    
+
+    layoutItem: function(item, box) {
+        if (box) {
+            item.doComponentLayout(box.width, box.height);
+        } else {
+            item.doComponentLayout();
+        }
+    },
+
+    getLayoutTargetSize : function() {
+        var target = this.getTarget(),
+            ret;
+
+        if (target) {
+            ret = target.getViewSize();
+
+            
+            
+            
+            if (Ext.isIE && ret.width == 0){
+                ret = target.getStyleSize();
+            }
+
+            ret.width -= target.getPadding('lr');
+            ret.height -= target.getPadding('tb');
+        }
+        return ret;
+    },
+
+    beforeLayout: function() {
+        if (this.owner.beforeLayout(arguments) !== false) {
+            return this.callParent(arguments);
+        }
+        else {
+            return false;
+        }
+    },
+
+    
+    getRenderedItems: function() {
+        var me = this,
+            target = me.getTarget(),
+            items = me.getLayoutItems(),
+            ln = items.length,
+            renderedItems = [],
+            i, item;
+
+        for (i = 0; i < ln; i++) {
+            item = items[i];
+            if (item.rendered && me.isValidParent(item, target, i)) {
+                renderedItems.push(item);
+            }
+        }
+
+        return renderedItems;
+    },
+
+    
+    getVisibleItems: function() {
+        var target   = this.getTarget(),
+            items = this.getLayoutItems(),
+            ln = items.length,
+            visibleItems = [],
+            i, item;
+
+        for (i = 0; i < ln; i++) {
+            item = items[i];
+            if (item.rendered && this.isValidParent(item, target, i) && item.hidden !== true) {
+                visibleItems.push(item);
+            }
+        }
+
+        return visibleItems;
+    }
+});
+
+Ext.define('Ext.layout.container.Auto', {
+
+    
+
+    alias: ['layout.auto', 'layout.autocontainer'],
+
+    extend: 'Ext.layout.container.Container',
+
+    
+
+    type: 'autocontainer',
+
+    bindToOwnerCtComponent: true,
+
+    
+    onLayout : function(owner, target) {
+        var me = this,
+            items = me.getLayoutItems(),
+            ln = items.length,
+            i;
+
+        
+        if (ln) {
+            
+            
+            
+            if (!me.clearEl) {
+                me.clearEl = me.getRenderTarget().createChild({
+                    cls: Ext.baseCSSPrefix + 'clear',
+                    role: 'presentation'
+                });
+            }
+
+            
+            for (i = 0; i < ln; i++) {
+                me.setItemSize(items[i]);
+            }
+        }
+    },
+
+    configureItem: function(item) {
+        this.callParent(arguments);
+
+        
+        item.layoutManagedHeight = 2;
+        item.layoutManagedWidth = 2;
+    }
+});
+
+Ext.define('Ext.container.AbstractContainer', {
+
+    
+
+    extend: 'Ext.Component',
+
+    requires: [
+        'Ext.util.MixedCollection',
+        'Ext.layout.container.Auto',
+        'Ext.ZIndexManager'
+    ],
+
+    
+    
+
+    
+    
+    
+
+    
+    suspendLayout : false,
+
+    
+    autoDestroy : true,
+
+     
+    defaultType: 'panel',
+
+    isContainer : true,
+
+    
+    layoutCounter : 0,
+
+    baseCls: Ext.baseCSSPrefix + 'container',
+
+    
+    bubbleEvents: ['add', 'remove'],
+
+    
+    initComponent : function(){
+        var me = this;
+        me.addEvents(
+            
+            'afterlayout',
+            
+            'beforeadd',
+            
+            'beforeremove',
+            
+            'add',
+            
+            'remove'
+        );
+
+        
+        me.layoutOnShow = Ext.create('Ext.util.MixedCollection');
+        me.callParent();
+        me.initItems();
+    },
+
+    
+    initItems : function() {
+        var me = this,
+            items = me.items;
+
+        
+        me.items = Ext.create('Ext.util.MixedCollection', false, me.getComponentId);
+
+        if (items) {
+            if (!Ext.isArray(items)) {
+                items = [items];
+            }
+
+            me.add(items);
+        }
+    },
+
+    
+    afterRender : function() {
+        this.getLayout();
+        this.callParent();
+    },
+
+    renderChildren: function () {
+        var me = this,
+            layout = me.getLayout();
+
+        me.callParent();
+        
+
+        if (layout) {
+            me.suspendLayout = true;
+            layout.renderChildren();
+            delete me.suspendLayout;
+        }
+    },
+
+    
+    setLayout : function(layout) {
+        var currentLayout = this.layout;
+
+        if (currentLayout && currentLayout.isLayout && currentLayout != layout) {
+            currentLayout.setOwner(null);
+        }
+
+        this.layout = layout;
+        layout.setOwner(this);
+    },
+
+    
+    getLayout : function() {
+        var me = this;
+        if (!me.layout || !me.layout.isLayout) {
+            me.setLayout(Ext.layout.Layout.create(me.layout, 'autocontainer'));
+        }
+
+        return me.layout;
+    },
+
+    
+    doLayout : function() {
+        var me = this,
+            layout = me.getLayout();
+
+        if (me.rendered && layout && !me.suspendLayout) {
+            
+            if (!me.isFixedWidth() || !me.isFixedHeight()) {
+                
+                if (me.componentLayout.layoutBusy !== true) {
+                    me.doComponentLayout();
+                    if (me.componentLayout.layoutCancelled === true) {
+                        layout.layout();
+                    }
+                }
+            }
+            
+            else {
+                
+                if (layout.layoutBusy !== true) {
+                    layout.layout();
+                }
+            }
+        }
+
+        return me;
+    },
+
+    
+    afterLayout : function(layout) {
+        ++this.layoutCounter;
+        this.fireEvent('afterlayout', this, layout);
+    },
+
+    
+    prepareItems : function(items, applyDefaults) {
+        if (!Ext.isArray(items)) {
+            items = [items];
+        }
+
+        
+        var i = 0,
+            len = items.length,
+            item;
+
+        for (; i < len; i++) {
+            item = items[i];
+            if (applyDefaults) {
+                item = this.applyDefaults(item);
+            }
+            items[i] = this.lookupComponent(item);
+        }
+        return items;
+    },
+
+    
+    applyDefaults : function(config) {
+        var defaults = this.defaults;
+
+        if (defaults) {
+            if (Ext.isFunction(defaults)) {
+                defaults = defaults.call(this, config);
+            }
+
+            if (Ext.isString(config)) {
+                config = Ext.ComponentManager.get(config);
+            }
+            Ext.applyIf(config, defaults);
+        }
+
+        return config;
+    },
+
+    
+    lookupComponent : function(comp) {
+        return Ext.isString(comp) ? Ext.ComponentManager.get(comp) : this.createComponent(comp);
+    },
+
+    
+    createComponent : function(config, defaultType) {
+        
+        
+        
+        
+        
+        
+
+        return Ext.ComponentManager.create(config, defaultType || this.defaultType);
+    },
+
+    
+    getComponentId : function(comp) {
+        return comp.getItemId();
+    },
+
+    
+    add : function() {
+        var me = this,
+            args = Array.prototype.slice.call(arguments),
+            hasMultipleArgs,
+            items,
+            results = [],
+            i,
+            ln,
+            item,
+            index = -1,
+            cmp;
+
+        if (typeof args[0] == 'number') {
+            index = args.shift();
+        }
+
+        hasMultipleArgs = args.length > 1;
+        if (hasMultipleArgs || Ext.isArray(args[0])) {
+
+            items = hasMultipleArgs ? args : args[0];
+            
+            me.suspendLayout = true;
+            for (i = 0, ln = items.length; i < ln; i++) {
+                item = items[i];
+
+
+                if (index != -1) {
+                    item = me.add(index + i, item);
+                } else {
+                    item = me.add(item);
+                }
+                results.push(item);
+            }
+            
+            me.suspendLayout = false;
+            me.doLayout();
+            return results;
+        }
+
+        cmp = me.prepareItems(args[0], true)[0];
+
+        
+        
+        
+        if (cmp.floating) {
+            cmp.onAdded(me, index);
+        } else {
+            index = (index !== -1) ? index : me.items.length;
+            if (me.fireEvent('beforeadd', me, cmp, index) !== false && me.onBeforeAdd(cmp) !== false) {
+                me.items.insert(index, cmp);
+                cmp.onAdded(me, index);
+                me.onAdd(cmp, index);
+                me.fireEvent('add', me, cmp, index);
+            }
+            me.doLayout();
+        }
+        return cmp;
+    },
+
+    onAdd : Ext.emptyFn,
+    onRemove : Ext.emptyFn,
+
+    
+    insert : function(index, comp) {
+        return this.add(index, comp);
+    },
+
+    
+    move : function(fromIdx, toIdx) {
+        var items = this.items,
+            item;
+        item = items.removeAt(fromIdx);
+        if (item === false) {
+            return false;
+        }
+        items.insert(toIdx, item);
+        this.doLayout();
+        return item;
+    },
+
+    
+    onBeforeAdd : function(item) {
+        var me = this;
+
+        if (item.ownerCt) {
+            item.ownerCt.remove(item, false);
+        }
+
+        if (me.border === false || me.border === 0) {
+            item.border = (item.border === true);
+        }
+    },
+
+    
+    remove : function(comp, autoDestroy) {
+        var me = this,
+            c = me.getComponent(comp);
+
+        if (c && me.fireEvent('beforeremove', me, c) !== false) {
+            me.doRemove(c, autoDestroy);
+            me.fireEvent('remove', me, c);
+        }
+
+        return c;
+    },
+
+    
+    doRemove : function(component, autoDestroy) {
+        var me = this,
+            layout = me.layout,
+            hasLayout = layout && me.rendered;
+
+        me.items.remove(component);
+        component.onRemoved();
+
+        if (hasLayout) {
+            layout.onRemove(component);
+        }
+
+        me.onRemove(component, autoDestroy);
+
+        if (autoDestroy === true || (autoDestroy !== false && me.autoDestroy)) {
+            component.destroy();
+        }
+
+        if (hasLayout && !autoDestroy) {
+            layout.afterRemove(component);
+        }
+
+        if (!me.destroying) {
+            me.doLayout();
+        }
+    },
+
+    
+    removeAll : function(autoDestroy) {
+        var me = this,
+            removeItems = me.items.items.slice(),
+            items = [],
+            i = 0,
+            len = removeItems.length,
+            item;
+
+        
+        me.suspendLayout = true;
+        for (; i < len; i++) {
+            item = removeItems[i];
+            me.remove(item, autoDestroy);
+
+            if (item.ownerCt !== me) {
+                items.push(item);
+            }
+        }
+
+        
+        me.suspendLayout = false;
+        if (len) {
+            me.doLayout();
+        }
+        return items;
+    },
+
+    
+    
+    
+    
+    
+    
+    
+    
+    getRefItems : function(deep) {
+        var me = this,
+            items = me.items.items,
+            len = items.length,
+            i = 0,
+            item,
+            result = [];
+
+        for (; i < len; i++) {
+            item = items[i];
+            result.push(item);
+            if (deep && item.getRefItems) {
+                result.push.apply(result, item.getRefItems(true));
+            }
+        }
+
+        
+        
+        if (me.floatingItems && me.floatingItems.accessList) {
+            result.push.apply(result, me.floatingItems.accessList);
+        }
+
+        return result;
+    },
+
+    
+    cascade : function(fn, scope, origArgs){
+        var me = this,
+            cs = me.items ? me.items.items : [],
+            len = cs.length,
+            i = 0,
+            c,
+            args = origArgs ? origArgs.concat(me) : [me],
+            componentIndex = args.length - 1;
+
+        if (fn.apply(scope || me, args) !== false) {
+            for(; i < len; i++){
+                c = cs[i];
+                if (c.cascade) {
+                    c.cascade(fn, scope, origArgs);
+                } else {
+                    args[componentIndex] = c;
+                    fn.apply(scope || cs, args);
+                }
+            }
+        }
+        return this;
+    },
+
+    
+    getComponent : function(comp) {
+        if (Ext.isObject(comp)) {
+            comp = comp.getItemId();
+        }
+
+        return this.items.get(comp);
+    },
+
+    
+    query : function(selector) {
+        selector = selector || '*';
+        return Ext.ComponentQuery.query(selector, this);
+    },
+
+    
+    child : function(selector) {
+        selector = selector || '';
+        return this.query('> ' + selector)[0] || null;
+    },
+
+    
+    down : function(selector) {
+        return this.query(selector)[0] || null;
+    },
+
+    
+    show : function() {
+        this.callParent(arguments);
+        this.performDeferredLayouts();
+        return this;
+    },
+
+    
+    
+    performDeferredLayouts: function() {
+        var layoutCollection = this.layoutOnShow,
+            ln = layoutCollection.getCount(),
+            i = 0,
+            needsLayout,
+            item;
+
+        for (; i < ln; i++) {
+            item = layoutCollection.get(i);
+            needsLayout = item.needsLayout;
+
+            if (Ext.isObject(needsLayout)) {
+                item.doComponentLayout(needsLayout.width, needsLayout.height, needsLayout.isSetSize, needsLayout.ownerCt);
+            }
+        }
+        layoutCollection.clear();
+    },
+
+    //@private
+
+    
+    onEnable: function() {
+        Ext.Array.each(this.query('[isFormField]'), function(item) {
+            if (item.resetDisable) {
+                item.enable();
+                delete item.resetDisable;
+            }
+        });
+        this.callParent();
+    },
+
+    
+    
+    onDisable: function() {
+        Ext.Array.each(this.query('[isFormField]'), function(item) {
+            if (item.resetDisable !== false && !item.disabled) {
+                item.disable();
+                item.resetDisable = true;
+            }
+        });
+        this.callParent();
+    },
+
+    
+    beforeLayout: function() {
+        return true;
+    },
+
+    
+    beforeDestroy : function() {
+        var me = this,
+            items = me.items,
+            c;
+
+        if (items) {
+            while ((c = items.first())) {
+                me.doRemove(c, true);
+            }
+        }
+
+        Ext.destroy(
+            me.layout
+        );
+        me.callParent();
+    }
+});
+
+
+Ext.define('Ext.container.Container', {
+    extend: 'Ext.container.AbstractContainer',
+    alias: 'widget.container',
+    alternateClassName: 'Ext.Container',
+
+    
+    getChildByElement: function(el) {
+        var item,
+            itemEl,
+            i = 0,
+            it = this.items.items,
+            ln = it.length;
+
+        el = Ext.getDom(el);
+        for (; i < ln; i++) {
+            item = it[i];
+            itemEl = item.getEl();
+            if ((itemEl.dom === el) || itemEl.contains(el)) {
+                return item;
+            }
+        }
+        return null;
+    }
+});
+
+
+Ext.define('Ext.toolbar.Fill', {
+    extend: 'Ext.Component',
+    alias: 'widget.tbfill',
+    alternateClassName: 'Ext.Toolbar.Fill',
+    isFill : true,
+    flex: 1
+});
+
+Ext.define('Ext.toolbar.Item', {
+    extend: 'Ext.Component',
+    alias: 'widget.tbitem',
+    alternateClassName: 'Ext.Toolbar.Item',
+    enable:Ext.emptyFn,
+    disable:Ext.emptyFn,
+    focus:Ext.emptyFn
+    
+});
+
+Ext.define('Ext.toolbar.Separator', {
+    extend: 'Ext.toolbar.Item',
+    alias: 'widget.tbseparator',
+    alternateClassName: 'Ext.Toolbar.Separator',
+    baseCls: Ext.baseCSSPrefix + 'toolbar-separator',
+    focusable: false
+});
+
+Ext.define('Ext.menu.Manager', {
+    singleton: true,
+    requires: [
+        'Ext.util.MixedCollection',
+        'Ext.util.KeyMap'
+    ],
+    alternateClassName: 'Ext.menu.MenuMgr',
+
+    uses: ['Ext.menu.Menu'],
+
+    menus: {},
+    groups: {},
+    attached: false,
+    lastShow: new Date(),
+
+    init: function() {
+        var me = this;
+        
+        me.active = Ext.create('Ext.util.MixedCollection');
+        Ext.getDoc().addKeyListener(27, function() {
+            if (me.active.length > 0) {
+                me.hideAll();
+            }
+        }, me);
+    },
+
+    
+    hideAll: function() {
+        var active = this.active,
+            c;
+        if (active && active.length > 0) {
+            c = active.clone();
+            c.each(function(m) {
+                m.hide();
+            });
+            return true;
+        }
+        return false;
+    },
+
+    onHide: function(m) {
+        var me = this,
+            active = me.active;
+        active.remove(m);
+        if (active.length < 1) {
+            Ext.getDoc().un('mousedown', me.onMouseDown, me);
+            me.attached = false;
+        }
+    },
+
+    onShow: function(m) {
+        var me = this,
+            active   = me.active,
+            last     = active.last(),
+            attached = me.attached,
+            menuEl   = m.getEl(),
+            zIndex;
+
+        me.lastShow = new Date();
+        active.add(m);
+        if (!attached) {
+            Ext.getDoc().on('mousedown', me.onMouseDown, me);
+            me.attached = true;
+        }
+        m.toFront();
+    },
+
+    onBeforeHide: function(m) {
+        if (m.activeChild) {
+            m.activeChild.hide();
+        }
+        if (m.autoHideTimer) {
+            clearTimeout(m.autoHideTimer);
+            delete m.autoHideTimer;
+        }
+    },
+
+    onBeforeShow: function(m) {
+        var active = this.active,
+            parentMenu = m.parentMenu;
+            
+        active.remove(m);
+        if (!parentMenu && !m.allowOtherMenus) {
+            this.hideAll();
+        }
+        else if (parentMenu && parentMenu.activeChild && m != parentMenu.activeChild) {
+            parentMenu.activeChild.hide();
+        }
+    },
+
+    
+    onMouseDown: function(e) {
+        var me = this,
+            active = me.active,
+            lastShow = me.lastShow,
+            target = e.target;
+
+        if (Ext.Date.getElapsed(lastShow) > 50 && active.length > 0 && !e.getTarget('.' + Ext.baseCSSPrefix + 'menu')) {
+            me.hideAll();
+            
+            
+            if (Ext.isIE && Ext.fly(target).focusable()) {
+                target.focus();
+            }
+        }
+    },
+
+    
+    register: function(menu) {
+        var me = this;
+
+        if (!me.active) {
+            me.init();
+        }
+
+        if (menu.floating) {
+            me.menus[menu.id] = menu;
+            menu.on({
+                beforehide: me.onBeforeHide,
+                hide: me.onHide,
+                beforeshow: me.onBeforeShow,
+                show: me.onShow,
+                scope: me
+            });
+        }
+    },
+
+    
+    get: function(menu) {
+        var menus = this.menus;
+        
+        if (typeof menu == 'string') { 
+            if (!menus) {  
+                return null;
+            }
+            return menus[menu];
+        } else if (menu.isMenu) {  
+            return menu;
+        } else if (Ext.isArray(menu)) { 
+            return Ext.create('Ext.menu.Menu', {items:menu});
+        } else { 
+            return Ext.ComponentManager.create(menu, 'menu');
+        }
+    },
+
+    
+    unregister: function(menu) {
+        var me = this,
+            menus = me.menus,
+            active = me.active;
+
+        delete menus[menu.id];
+        active.remove(menu);
+        menu.un({
+            beforehide: me.onBeforeHide,
+            hide: me.onHide,
+            beforeshow: me.onBeforeShow,
+            show: me.onShow,
+            scope: me
+        });
+    },
+
+    
+    registerCheckable: function(menuItem) {
+        var groups  = this.groups,
+            groupId = menuItem.group;
+
+        if (groupId) {
+            if (!groups[groupId]) {
+                groups[groupId] = [];
+            }
+
+            groups[groupId].push(menuItem);
+        }
+    },
+
+    
+    unregisterCheckable: function(menuItem) {
+        var groups  = this.groups,
+            groupId = menuItem.group;
+
+        if (groupId) {
+            Ext.Array.remove(groups[groupId], menuItem);
+        }
+    },
+
+    onCheckChange: function(menuItem, state) {
+        var groups  = this.groups,
+            groupId = menuItem.group,
+            i       = 0,
+            group, ln, curr;
+
+        if (groupId && state) {
+            group = groups[groupId];
+            ln = group.length;
+            for (; i < ln; i++) {
+                curr = group[i];
+                if (curr != menuItem) {
+                    curr.setChecked(false);
+                }
+            }
+        }
+    }
+});
+
+Ext.define('Ext.layout.component.Button', {
+
+    
+
+    alias: ['layout.button'],
+
+    extend: 'Ext.layout.component.Component',
+
+    
+
+    type: 'button',
+
+    cellClsRE: /-btn-(tl|br)\b/,
+    htmlRE: /<.*>/,
+
+    beforeLayout: function() {
+        return this.callParent(arguments) || this.lastText !== this.owner.text;
+    },
+
+    
+    onLayout: function(width, height) {
+        var me = this,
+            isNum = Ext.isNumber,
+            owner = me.owner,
+            ownerEl = owner.el,
+            btnEl = owner.btnEl,
+            btnInnerEl = owner.btnInnerEl,
+            btnIconEl = owner.btnIconEl,
+            sizeIconEl = (owner.icon || owner.iconCls) && (owner.iconAlign == "top" || owner.iconAlign == "bottom"),
+            minWidth = owner.minWidth,
+            maxWidth = owner.maxWidth,
+            ownerWidth, btnFrameWidth, metrics;
+
+        me.getTargetInfo();
+        me.callParent(arguments);
+
+        btnInnerEl.unclip();
+        me.setTargetSize(width, height);
+
+        if (!isNum(width)) {
+            
+            
+            
+            if (owner.text && (Ext.isIE6 || Ext.isIE7) && Ext.isStrict && btnEl && btnEl.getWidth() > 20) {
+                btnFrameWidth = me.btnFrameWidth;
+                metrics = Ext.util.TextMetrics.measure(btnInnerEl, owner.text);
+                ownerEl.setWidth(metrics.width + btnFrameWidth + me.adjWidth);
+                btnEl.setWidth(metrics.width + btnFrameWidth);
+                btnInnerEl.setWidth(metrics.width + btnFrameWidth);
+
+                if (sizeIconEl) {
+                    btnIconEl.setWidth(metrics.width + btnFrameWidth);
+                }
+            } else {
+                
+                ownerEl.setWidth(null);
+                btnEl.setWidth(null);
+                btnInnerEl.setWidth(null);
+                btnIconEl.setWidth(null);
+            }
+
+            
+            if (minWidth || maxWidth) {
+                ownerWidth = ownerEl.getWidth();
+                if (minWidth && (ownerWidth < minWidth)) {
+                    me.setTargetSize(minWidth, height);
+                }
+                else if (maxWidth && (ownerWidth > maxWidth)) {
+                    btnInnerEl.clip();
+                    me.setTargetSize(maxWidth, height);
+                }
+            }
+        }
+
+        this.lastText = owner.text;
+    },
+
+    setTargetSize: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            isNum = Ext.isNumber,
+            btnInnerEl = owner.btnInnerEl,
+            btnWidth = (isNum(width) ? width - me.adjWidth : width),
+            btnHeight = (isNum(height) ? height - me.adjHeight : height),
+            btnFrameHeight = me.btnFrameHeight,
+            text = owner.getText(),
+            textHeight;
+
+        me.callParent(arguments);
+        me.setElementSize(owner.btnEl, btnWidth, btnHeight);
+        me.setElementSize(btnInnerEl, btnWidth, btnHeight);
+        if (btnHeight >= 0) {
+            btnInnerEl.setStyle('line-height', btnHeight - btnFrameHeight + 'px');
+        }
+
+        
+        
+        
+        
+        
+        if (text && this.htmlRE.test(text)) {
+            btnInnerEl.setStyle('line-height', 'normal');
+            textHeight = Ext.util.TextMetrics.measure(btnInnerEl, text).height;
+            btnInnerEl.setStyle('padding-top', me.btnFrameTop + Math.max(btnInnerEl.getHeight() - btnFrameHeight - textHeight, 0) / 2 + 'px');
+            me.setElementSize(btnInnerEl, btnWidth, btnHeight);
+        }
+    },
+
+    getTargetInfo: function() {
+        var me = this,
+            owner = me.owner,
+            ownerEl = owner.el,
+            frameSize = me.frameSize,
+            frameBody = owner.frameBody,
+            btnWrap = owner.btnWrap,
+            innerEl = owner.btnInnerEl;
+
+        if (!('adjWidth' in me)) {
+            Ext.apply(me, {
+                
+                adjWidth: frameSize.left + frameSize.right + ownerEl.getBorderWidth('lr') + ownerEl.getPadding('lr') +
+                          btnWrap.getPadding('lr') + (frameBody ? frameBody.getFrameWidth('lr') : 0),
+                adjHeight: frameSize.top + frameSize.bottom + ownerEl.getBorderWidth('tb') + ownerEl.getPadding('tb') +
+                           btnWrap.getPadding('tb') + (frameBody ? frameBody.getFrameWidth('tb') : 0),
+                btnFrameWidth: innerEl.getFrameWidth('lr'),
+                btnFrameHeight: innerEl.getFrameWidth('tb'),
+                btnFrameTop: innerEl.getFrameWidth('t')
+            });
+        }
+
+        return me.callParent();
+    }
+});
+
+Ext.define('Ext.button.Button', {
+
+    
+    alias: 'widget.button',
+    extend: 'Ext.Component',
+
+    requires: [
+        'Ext.menu.Manager',
+        'Ext.util.ClickRepeater',
+        'Ext.layout.component.Button',
+        'Ext.util.TextMetrics',
+        'Ext.util.KeyMap'
+    ],
+
+    alternateClassName: 'Ext.Button',
+    
+
+    isButton: true,
+    componentLayout: 'button',
+
+    
+    hidden: false,
+
+    
+    disabled: false,
+
+    
+    pressed: false,
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    enableToggle: false,
+
+    
+
+    
+
+    
+    menuAlign: 'tl-bl?',
+
+    
+    textAlign: 'center',
+
+    
+
+    
+
+    
+    type: 'button',
+
+    
+    clickEvent: 'click',
+
+    
+    preventDefault: true,
+
+    
+    handleMouseEvents: true,
+
+    
+    tooltipType: 'qtip',
+
+    
+    baseCls: Ext.baseCSSPrefix + 'btn',
+
+    
+    pressedCls: 'pressed',
+
+    
+    overCls: 'over',
+
+    
+    focusCls: 'focus',
+
+    
+    menuActiveCls: 'menu-active',
+
+    
+
+    
+
+    
+
+    ariaRole: 'button',
+
+    
+    renderTpl:
+        '<em id="{id}-btnWrap" class="{splitCls}">' +
+            '<tpl if="href">' +
+                '<a id="{id}-btnEl" href="{href}" target="{target}"<tpl if="tabIndex"> tabIndex="{tabIndex}"</tpl> role="link">' +
+                    '<span id="{id}-btnInnerEl" class="{baseCls}-inner">' +
+                        '{text}' +
+                    '</span>' +
+                        '<span id="{id}-btnIconEl" class="{baseCls}-icon"></span>' +
+                '</a>' +
+            '</tpl>' +
+            '<tpl if="!href">' +
+                '<button id="{id}-btnEl" type="{type}" hidefocus="true"' +
+                    
+                    
+                    '<tpl if="tabIndex"> tabIndex="{tabIndex}"</tpl> role="button" autocomplete="off">' +
+                    '<span id="{id}-btnInnerEl" class="{baseCls}-inner" style="{innerSpanStyle}">' +
+                        '{text}' +
+                    '</span>' +
+                    '<span id="{id}-btnIconEl" class="{baseCls}-icon {iconCls}"> </span>' +
+                '</button>' +
+            '</tpl>' +
+        '</em>' ,
+
+    
+    scale: 'small',
+
+    
+    allowedScales: ['small', 'medium', 'large'],
+
+    
+
+    
+    iconAlign: 'left',
+
+    
+    arrowAlign: 'right',
+
+    
+    arrowCls: 'arrow',
+
+    
+
+    
+
+    
+
+    
+
+    maskOnDisable: false,
+
+    
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+
+        me.addEvents(
+            
+            'click',
+
+            
+            'toggle',
+
+            
+            'mouseover',
+
+            
+            'mouseout',
+
+            
+            'menushow',
+
+            
+            'menuhide',
+
+            
+            'menutriggerover',
+
+            
+            'menutriggerout'
+        );
+
+        if (me.menu) {
+            
+            me.split = true;
+
+            
+            me.menu = Ext.menu.Manager.get(me.menu);
+            me.menu.ownerCt = me;
+        }
+
+        
+        if (me.url) {
+            me.href = me.url;
+        }
+
+        
+        if (me.href && !me.hasOwnProperty('preventDefault')) {
+            me.preventDefault = false;
+        }
+
+        if (Ext.isString(me.toggleGroup)) {
+            me.enableToggle = true;
+        }
+
+    },
+
+    
+    initAria: function() {
+        this.callParent();
+        var actionEl = this.getActionEl();
+        if (this.menu) {
+            actionEl.dom.setAttribute('aria-haspopup', true);
+        }
+    },
+
+    
+    getActionEl: function() {
+        return this.btnEl;
+    },
+
+    
+    getFocusEl: function() {
+        return this.btnEl;
+    },
+
+    
+    setButtonCls: function() {
+        var me = this,
+            cls = [],
+            btnIconEl = me.btnIconEl,
+            hide = 'x-hide-display';
+
+        if (me.useSetClass) {
+            if (!Ext.isEmpty(me.oldCls)) {
+                me.removeClsWithUI(me.oldCls);
+                me.removeClsWithUI(me.pressedCls);
+            }
+
+            
+            if (me.iconCls || me.icon) {
+                if (me.text) {
+                    cls.push('icon-text-' + me.iconAlign);
+                } else {
+                    cls.push('icon');
+                }
+                if (btnIconEl) {
+                    btnIconEl.removeCls(hide);
+                }
+            } else {
+                if (me.text) {
+                    cls.push('noicon');
+                }
+                if (btnIconEl) {
+                    btnIconEl.addCls(hide);
+                }
+            }
+
+            me.oldCls = cls;
+            me.addClsWithUI(cls);
+            me.addClsWithUI(me.pressed ? me.pressedCls : null);
+        }
+    },
+
+    
+    onRender: function(ct, position) {
+        
+        var me = this,
+            repeater, btn;
+
+        
+        Ext.applyIf(me.renderData, me.getTemplateArgs());
+
+        me.addChildEls('btnEl', 'btnWrap', 'btnInnerEl', 'btnIconEl');
+
+        if (me.scale) {
+            me.ui = me.ui + '-' + me.scale;
+        }
+
+        
+        me.callParent(arguments);
+
+        
+        if (me.split && me.arrowTooltip) {
+            me.arrowEl.dom.setAttribute(me.getTipAttr(), me.arrowTooltip);
+        }
+
+        
+        me.mon(me.btnEl, {
+            scope: me,
+            focus: me.onFocus,
+            blur : me.onBlur
+        });
+
+        
+        btn = me.el;
+
+        if (me.icon) {
+            me.setIcon(me.icon);
+        }
+
+        if (me.iconCls) {
+            me.setIconCls(me.iconCls);
+        }
+
+        if (me.tooltip) {
+            me.setTooltip(me.tooltip, true);
+        }
+
+        if (me.textAlign) {
+            me.setTextAlign(me.textAlign);
+        }
+
+        
+        if (me.handleMouseEvents) {
+            me.mon(btn, {
+                scope: me,
+                mouseover: me.onMouseOver,
+                mouseout: me.onMouseOut,
+                mousedown: me.onMouseDown
+            });
+
+            if (me.split) {
+                me.mon(btn, {
+                    mousemove: me.onMouseMove,
+                    scope: me
+                });
+            }
+        }
+
+        
+        if (me.menu) {
+            me.mon(me.menu, {
+                scope: me,
+                show: me.onMenuShow,
+                hide: me.onMenuHide
+            });
+
+            me.keyMap = Ext.create('Ext.util.KeyMap', me.el, {
+                key: Ext.EventObject.DOWN,
+                handler: me.onDownKey,
+                scope: me
+            });
+        }
+
+        
+        if (me.repeat) {
+            repeater = Ext.create('Ext.util.ClickRepeater', btn, Ext.isObject(me.repeat) ? me.repeat: {});
+            me.mon(repeater, 'click', me.onRepeatClick, me);
+        } else {
+            me.mon(btn, me.clickEvent, me.onClick, me);
+        }
+
+        
+        Ext.ButtonToggleManager.register(me);
+    },
+
+    
+    getTemplateArgs: function() {
+        var me = this,
+            persistentPadding = me.getPersistentBtnPadding(),
+            innerSpanStyle = '';
+
+        
+        if (Math.max.apply(Math, persistentPadding) > 0) {
+            innerSpanStyle = 'margin:' + Ext.Array.map(persistentPadding, function(pad) {
+                return -pad + 'px';
+            }).join(' ');
+        }
+
+        return {
+            href     : me.getHref(),
+            target   : me.target || '_blank',
+            type     : me.type,
+            splitCls : me.getSplitCls(),
+            cls      : me.cls,
+            iconCls  : me.iconCls || '',
+            text     : me.text || ' ',
+            tabIndex : me.tabIndex,
+            innerSpanStyle: innerSpanStyle
+        };
+    },
+
+    
+    getHref: function() {
+        var me = this,
+            params = Ext.apply({}, me.baseParams);
+
+        
+        params = Ext.apply(params, me.params);
+        return me.href ? Ext.urlAppend(me.href, Ext.Object.toQueryString(params)) : false;
+    },
+
+    
+    setParams: function(params) {
+        this.params = params;
+        this.btnEl.dom.href = this.getHref();
+    },
+
+    getSplitCls: function() {
+        var me = this;
+        return me.split ? (me.baseCls + '-' + me.arrowCls) + ' ' + (me.baseCls + '-' + me.arrowCls + '-' + me.arrowAlign) : '';
+    },
+
+    
+    afterRender: function() {
+        var me = this;
+        me.useSetClass = true;
+        me.setButtonCls();
+        me.doc = Ext.getDoc();
+        this.callParent(arguments);
+    },
+
+    
+    setIconCls: function(cls) {
+        var me = this,
+            btnIconEl = me.btnIconEl,
+            oldCls = me.iconCls;
+            
+        me.iconCls = cls;
+        if (btnIconEl) {
+            
+            btnIconEl.removeCls(oldCls);
+            btnIconEl.addCls(cls || '');
+            me.setButtonCls();
+        }
+        return me;
+    },
+
+    
+    setTooltip: function(tooltip, initial) {
+        var me = this;
+
+        if (me.rendered) {
+            if (!initial) {
+                me.clearTip();
+            }
+            if (Ext.isObject(tooltip)) {
+                Ext.tip.QuickTipManager.register(Ext.apply({
+                    target: me.btnEl.id
+                },
+                tooltip));
+                me.tooltip = tooltip;
+            } else {
+                me.btnEl.dom.setAttribute(me.getTipAttr(), tooltip);
+            }
+        } else {
+            me.tooltip = tooltip;
+        }
+        return me;
+    },
+
+    
+    setTextAlign: function(align) {
+        var me = this,
+            btnEl = me.btnEl;
+
+        if (btnEl) {
+            btnEl.removeCls(me.baseCls + '-' + me.textAlign);
+            btnEl.addCls(me.baseCls + '-' + align);
+        }
+        me.textAlign = align;
+        return me;
+    },
+
+    getTipAttr: function(){
+        return this.tooltipType == 'qtip' ? 'data-qtip' : 'title';
+    },
+
+    
+    getRefItems: function(deep){
+        var menu = this.menu,
+            items;
+        
+        if (menu) {
+            items = menu.getRefItems(deep);
+            items.unshift(menu);
+        }
+        return items || [];
+    },
+
+    
+    clearTip: function() {
+        if (Ext.isObject(this.tooltip)) {
+            Ext.tip.QuickTipManager.unregister(this.btnEl);
+        }
+    },
+
+    
+    beforeDestroy: function() {
+        var me = this;
+        if (me.rendered) {
+            me.clearTip();
+        }
+        if (me.menu && me.destroyMenu !== false) {
+            Ext.destroy(me.menu);
+        }
+        Ext.destroy(me.btnInnerEl, me.repeater);
+        me.callParent();
+    },
+
+    
+    onDestroy: function() {
+        var me = this;
+        if (me.rendered) {
+            me.doc.un('mouseover', me.monitorMouseOver, me);
+            me.doc.un('mouseup', me.onMouseUp, me);
+            delete me.doc;
+            Ext.ButtonToggleManager.unregister(me);
+
+            Ext.destroy(me.keyMap);
+            delete me.keyMap;
+        }
+        me.callParent();
+    },
+
+    
+    setHandler: function(handler, scope) {
+        this.handler = handler;
+        this.scope = scope;
+        return this;
+    },
+
+    
+    setText: function(text) {
+        var me = this;
+        me.text = text;
+        if (me.el) {
+            me.btnInnerEl.update(text || ' ');
+            me.setButtonCls();
+        }
+        me.doComponentLayout();
+        return me;
+    },
+
+    
+    setIcon: function(icon) {
+        var me = this,
+            iconEl = me.btnIconEl;
+            
+        me.icon = icon;
+        if (iconEl) {
+            iconEl.setStyle('background-image', icon ? 'url(' + icon + ')': '');
+            me.setButtonCls();
+        }
+        return me;
+    },
+
+    
+    getText: function() {
+        return this.text;
+    },
+
+    
+    toggle: function(state, suppressEvent) {
+        var me = this;
+        state = state === undefined ? !me.pressed : !!state;
+        if (state !== me.pressed) {
+            if (me.rendered) {
+                me[state ? 'addClsWithUI': 'removeClsWithUI'](me.pressedCls);
+            }
+            me.btnEl.dom.setAttribute('aria-pressed', state);
+            me.pressed = state;
+            if (!suppressEvent) {
+                me.fireEvent('toggle', me, state);
+                Ext.callback(me.toggleHandler, me.scope || me, [me, state]);
+            }
+        }
+        return me;
+    },
+    
+    maybeShowMenu: function(){
+        var me = this;
+        if (me.menu && !me.hasVisibleMenu() && !me.ignoreNextClick) {
+            me.showMenu();
+        }
+    },
+
+    
+    showMenu: function() {
+        var me = this;
+        if (me.rendered && me.menu) {
+            if (me.tooltip && me.getTipAttr() != 'title') {
+                Ext.tip.QuickTipManager.getQuickTip().cancelShow(me.btnEl);
+            }
+            if (me.menu.isVisible()) {
+                me.menu.hide();
+            }
+
+            me.menu.showBy(me.el, me.menuAlign);
+        }
+        return me;
+    },
+
+    
+    hideMenu: function() {
+        if (this.hasVisibleMenu()) {
+            this.menu.hide();
+        }
+        return this;
+    },
+
+    
+    hasVisibleMenu: function() {
+        var menu = this.menu;
+        return menu && menu.rendered && menu.isVisible();
+    },
+
+    
+    onRepeatClick: function(repeat, e) {
+        this.onClick(e);
+    },
+
+    
+    onClick: function(e) {
+        var me = this;
+        if (me.preventDefault || (me.disabled && me.getHref()) && e) {
+            e.preventDefault();
+        }
+        if (e.button !== 0) {
+            return;
+        }
+        if (!me.disabled) {
+            me.doToggle();
+            me.maybeShowMenu();
+            me.fireHandler(e);
+        }
+    },
+    
+    fireHandler: function(e){
+        var me = this,
+            handler = me.handler;
+            
+        me.fireEvent('click', me, e);
+        if (handler) {
+            handler.call(me.scope || me, me, e);
+        }
+        me.onBlur();
+    },
+    
+    doToggle: function(){
+        var me = this;
+        if (me.enableToggle && (me.allowDepress !== false || !me.pressed)) {
+            me.toggle();
+        }
+    },
+
+    
+    onMouseOver: function(e) {
+        var me = this;
+        if (!me.disabled && !e.within(me.el, true, true)) {
+            me.onMouseEnter(e);
+        }
+    },
+
+    
+    onMouseOut: function(e) {
+        var me = this;
+        if (!e.within(me.el, true, true)) {
+            if (me.overMenuTrigger) {
+                me.onMenuTriggerOut(e);
+            }
+            me.onMouseLeave(e);
+        }
+    },
+
+    
+    onMouseMove: function(e) {
+        var me = this,
+            el = me.el,
+            over = me.overMenuTrigger,
+            overlap, btnSize;
+
+        if (me.split) {
+            if (me.arrowAlign === 'right') {
+                overlap = e.getX() - el.getX();
+                btnSize = el.getWidth();
+            } else {
+                overlap = e.getY() - el.getY();
+                btnSize = el.getHeight();
+            }
+
+            if (overlap > (btnSize - me.getTriggerSize())) {
+                if (!over) {
+                    me.onMenuTriggerOver(e);
+                }
+            } else {
+                if (over) {
+                    me.onMenuTriggerOut(e);
+                }
+            }
+        }
+    },
+
+    
+    getTriggerSize: function() {
+        var me = this,
+            size = me.triggerSize,
+            side, sideFirstLetter, undef;
+
+        if (size === undef) {
+            side = me.arrowAlign;
+            sideFirstLetter = side.charAt(0);
+            size = me.triggerSize = me.el.getFrameWidth(sideFirstLetter) + me.btnWrap.getFrameWidth(sideFirstLetter) + (me.frameSize && me.frameSize[side] || 0);
+        }
+        return size;
+    },
+
+    
+    onMouseEnter: function(e) {
+        var me = this;
+        me.addClsWithUI(me.overCls);
+        me.fireEvent('mouseover', me, e);
+    },
+
+    
+    onMouseLeave: function(e) {
+        var me = this;
+        me.removeClsWithUI(me.overCls);
+        me.fireEvent('mouseout', me, e);
+    },
+
+    
+    onMenuTriggerOver: function(e) {
+        var me = this;
+        me.overMenuTrigger = true;
+        me.fireEvent('menutriggerover', me, me.menu, e);
+    },
+
+    
+    onMenuTriggerOut: function(e) {
+        var me = this;
+        delete me.overMenuTrigger;
+        me.fireEvent('menutriggerout', me, me.menu, e);
+    },
+
+    
+    enable : function(silent) {
+        var me = this;
+
+        me.callParent(arguments);
+
+        me.removeClsWithUI('disabled');
+
+        return me;
+    },
+
+    
+    disable : function(silent) {
+        var me = this;
+
+        me.callParent(arguments);
+
+        me.addClsWithUI('disabled');
+        me.removeClsWithUI(me.overCls);
+
+        return me;
+    },
+
+    
+    setScale: function(scale) {
+        var me = this,
+            ui = me.ui.replace('-' + me.scale, '');
+
+        
+        if (!Ext.Array.contains(me.allowedScales, scale)) {
+            throw('#setScale: scale must be an allowed scale (' + me.allowedScales.join(', ') + ')');
+        }
+
+        me.scale = scale;
+        me.setUI(ui);
+    },
+
+    
+    setUI: function(ui) {
+        var me = this;
+
+        
+        if (me.scale && !ui.match(me.scale)) {
+            ui = ui + '-' + me.scale;
+        }
+
+        me.callParent([ui]);
+
+        
+        
+    },
+
+    
+    onFocus: function(e) {
+        var me = this;
+        if (!me.disabled) {
+            me.addClsWithUI(me.focusCls);
+        }
+    },
+
+    
+    onBlur: function(e) {
+        var me = this;
+        me.removeClsWithUI(me.focusCls);
+    },
+
+    
+    onMouseDown: function(e) {
+        var me = this;
+        if (!me.disabled && e.button === 0) {
+            me.addClsWithUI(me.pressedCls);
+            me.doc.on('mouseup', me.onMouseUp, me);
+        }
+    },
+    
+    onMouseUp: function(e) {
+        var me = this;
+        if (e.button === 0) {
+            if (!me.pressed) {
+                me.removeClsWithUI(me.pressedCls);
+            }
+            me.doc.un('mouseup', me.onMouseUp, me);
+        }
+    },
+    
+    onMenuShow: function(e) {
+        var me = this;
+        me.ignoreNextClick = 0;
+        me.addClsWithUI(me.menuActiveCls);
+        me.fireEvent('menushow', me, me.menu);
+    },
+
+    
+    onMenuHide: function(e) {
+        var me = this;
+        me.removeClsWithUI(me.menuActiveCls);
+        me.ignoreNextClick = Ext.defer(me.restoreClick, 250, me);
+        me.fireEvent('menuhide', me, me.menu);
+    },
+
+    
+    restoreClick: function() {
+        this.ignoreNextClick = 0;
+    },
+
+    
+    onDownKey: function() {
+        var me = this;
+
+        if (!me.disabled) {
+            if (me.menu) {
+                me.showMenu();
+            }
+        }
+    },
+
+    
+    getPersistentBtnPadding: function() {
+        var cls = Ext.button.Button,
+            padding = cls.persistentPadding,
+            btn, leftTop, btnEl, btnInnerEl;
+
+        if (!padding) {
+            padding = cls.persistentPadding = [0, 0, 0, 0]; 
+
+            if (!Ext.isIE) { 
+                
+                btn = Ext.create('Ext.button.Button', {
+                    renderTo: Ext.getBody(),
+                    text: 'test',
+                    style: 'position:absolute;top:-999px;'
+                });
+                btnEl = btn.btnEl;
+                btnInnerEl = btn.btnInnerEl;
+                btnEl.setSize(null, null); 
+
+                leftTop = btnInnerEl.getOffsetsTo(btnEl);
+                padding[0] = leftTop[1];
+                padding[1] = btnEl.getWidth() - btnInnerEl.getWidth() - leftTop[0];
+                padding[2] = btnEl.getHeight() - btnInnerEl.getHeight() - leftTop[1];
+                padding[3] = leftTop[0];
+
+                btn.destroy();
+            }
+        }
+
+        return padding;
+    }
+
+}, function() {
+    var groups = {};
+
+    function toggleGroup(btn, state) {
+        var g, i, l;
+        if (state) {
+            g = groups[btn.toggleGroup];
+            for (i = 0, l = g.length; i < l; i++) {
+                if (g[i] !== btn) {
+                    g[i].toggle(false);
+                }
+            }
+        }
+    }
+
+    
+    Ext.ButtonToggleManager = {
+        register: function(btn) {
+            if (!btn.toggleGroup) {
+                return;
+            }
+            var group = groups[btn.toggleGroup];
+            if (!group) {
+                group = groups[btn.toggleGroup] = [];
+            }
+            group.push(btn);
+            btn.on('toggle', toggleGroup);
+        },
+
+        unregister: function(btn) {
+            if (!btn.toggleGroup) {
+                return;
+            }
+            var group = groups[btn.toggleGroup];
+            if (group) {
+                Ext.Array.remove(group, btn);
+                btn.un('toggle', toggleGroup);
+            }
+        },
+
+        
+        getPressed: function(group) {
+            var g = groups[group],
+                i = 0,
+                len;
+            if (g) {
+                for (len = g.length; i < len; i++) {
+                    if (g[i].pressed === true) {
+                        return g[i];
+                    }
+                }
+            }
+            return null;
+        }
+    };
+});
+
+
+Ext.define('Ext.layout.container.boxOverflow.Menu', {
+
+    
+
+    extend: 'Ext.layout.container.boxOverflow.None',
+    requires: ['Ext.toolbar.Separator', 'Ext.button.Button'],
+    alternateClassName: 'Ext.layout.boxOverflow.Menu',
+    
+    
+
+    
+
+    
+    noItemsMenuText : '<div class="' + Ext.baseCSSPrefix + 'toolbar-no-items">(None)</div>',
+
+    constructor: function(layout) {
+        var me = this;
+
+        me.callParent(arguments);
+
+        
+        layout.beforeLayout = Ext.Function.createInterceptor(layout.beforeLayout, this.clearOverflow, this);
+
+        me.afterCtCls = me.afterCtCls || Ext.baseCSSPrefix + 'box-menu-' + layout.parallelAfter;
+        
+        me.menuItems = [];
+    },
+    
+    onRemove: function(comp){
+        Ext.Array.remove(this.menuItems, comp);
+    },
+
+    handleOverflow: function(calculations, targetSize) {
+        var me = this,
+            layout = me.layout,
+            methodName = 'get' + layout.parallelPrefixCap,
+            newSize = {},
+            posArgs = [null, null];
+
+        me.callParent(arguments);
+        this.createMenu(calculations, targetSize);
+        newSize[layout.perpendicularPrefix] = targetSize[layout.perpendicularPrefix];
+        newSize[layout.parallelPrefix] = targetSize[layout.parallelPrefix] - me.afterCt[methodName]();
+
+        
+        
+        posArgs[layout.perpendicularSizeIndex] = (calculations.meta.maxSize - me.menuTrigger['get' + layout.perpendicularPrefixCap]()) / 2;
+        me.menuTrigger.setPosition.apply(me.menuTrigger, posArgs);
+
+        return { targetSize: newSize };
+    },
+
+    
+    clearOverflow: function(calculations, targetSize) {
+        var me = this,
+            newWidth = targetSize ? targetSize.width + (me.afterCt ? me.afterCt.getWidth() : 0) : 0,
+            items = me.menuItems,
+            i = 0,
+            length = items.length,
+            item;
+
+        me.hideTrigger();
+        for (; i < length; i++) {
+            items[i].show();
+        }
+        items.length = 0;
+
+        return targetSize ? {
+            targetSize: {
+                height: targetSize.height,
+                width : newWidth
+            }
+        } : null;
+    },
+
+    
+    showTrigger: function() {
+        this.menuTrigger.show();
+    },
+
+    
+    hideTrigger: function() {
+        if (this.menuTrigger !== undefined) {
+            this.menuTrigger.hide();
+        }
+    },
+
+    
+    beforeMenuShow: function(menu) {
+        var me = this,
+            items = me.menuItems,
+            i = 0,
+            len   = items.length,
+            item,
+            prev;
+
+        var needsSep = function(group, prev){
+            return group.isXType('buttongroup') && !(prev instanceof Ext.toolbar.Separator);
+        };
+
+        me.clearMenu();
+        menu.removeAll();
+
+        for (; i < len; i++) {
+            item = items[i];
+
+            
+            if (!i && (item instanceof Ext.toolbar.Separator)) {
+                continue;
+            }
+            if (prev && (needsSep(item, prev) || needsSep(prev, item))) {
+                menu.add('-');
+            }
+
+            me.addComponentToMenu(menu, item);
+            prev = item;
+        }
+
+        
+        if (menu.items.length < 1) {
+            menu.add(me.noItemsMenuText);
+        }
+    },
+    
+    
+    createMenuConfig : function(component, hideOnClick) {
+        var config = Ext.apply({}, component.initialConfig),
+            group  = component.toggleGroup;
+
+        Ext.copyTo(config, component, [
+            'iconCls', 'icon', 'itemId', 'disabled', 'handler', 'scope', 'menu'
+        ]);
+
+        Ext.apply(config, {
+            text       : component.overflowText || component.text,
+            hideOnClick: hideOnClick,
+            destroyMenu: false
+        });
+
+        if (group || component.enableToggle) {
+            Ext.apply(config, {
+                group  : group,
+                checked: component.pressed,
+                listeners: {
+                    checkchange: function(item, checked){
+                        component.toggle(checked);
+                    }
+                }
+            });
+        }
+
+        delete config.ownerCt;
+        delete config.xtype;
+        delete config.id;
+        return config;
+    },
+
+    
+    addComponentToMenu : function(menu, component) {
+        var me = this;
+        if (component instanceof Ext.toolbar.Separator) {
+            menu.add('-');
+        } else if (component.isComponent) {
+            if (component.isXType('splitbutton')) {
+                menu.add(me.createMenuConfig(component, true));
+
+            } else if (component.isXType('button')) {
+                menu.add(me.createMenuConfig(component, !component.menu));
+
+            } else if (component.isXType('buttongroup')) {
+                component.items.each(function(item){
+                     me.addComponentToMenu(menu, item);
+                });
+            } else {
+                menu.add(Ext.create(Ext.getClassName(component), me.createMenuConfig(component)));
+            }
+        }
+    },
+
+    
+    clearMenu : function() {
+        var menu = this.moreMenu;
+        if (menu && menu.items) {
+            menu.items.each(function(item) {
+                if (item.menu) {
+                    delete item.menu;
+                }
+            });
+        }
+    },
+
+    
+    createMenu: function(calculations, targetSize) {
+        var me = this,
+            layout = me.layout,
+            startProp = layout.parallelBefore,
+            sizeProp = layout.parallelPrefix,
+            available = targetSize[sizeProp],
+            boxes = calculations.boxes,
+            i = 0,
+            len = boxes.length,
+            box;
+
+        if (!me.menuTrigger) {
+            me.createInnerElements();
+
+            
+            me.menu = Ext.create('Ext.menu.Menu', {
+                listeners: {
+                    scope: me,
+                    beforeshow: me.beforeMenuShow
+                }
+            });
+
+            
+            me.menuTrigger = Ext.create('Ext.button.Button', {
+                ownerCt : me.layout.owner, 
+                iconCls : me.layout.owner.menuTriggerCls,
+                ui      : layout.owner instanceof Ext.toolbar.Toolbar ? 'default-toolbar' : 'default',
+                menu    : me.menu,
+                getSplitCls: function() { return '';},
+                renderTo: me.afterCt
+            });
+        }
+        me.showTrigger();
+        available -= me.afterCt.getWidth();
+
+        
+        
+        me.menuItems.length = 0;
+        for (; i < len; i++) {
+            box = boxes[i];
+            if (box[startProp] + box[sizeProp] > available) {
+                me.menuItems.push(box.component);
+                box.component.hide();
+            }
+        }
+    },
+
+    
+    createInnerElements: function() {
+        var me = this,
+            target = me.layout.getRenderTarget();
+
+        if (!this.afterCt) {
+            target.addCls(Ext.baseCSSPrefix + me.layout.direction + '-box-overflow-body');
+            this.afterCt  = target.insertSibling({cls: Ext.layout.container.Box.prototype.innerCls + ' ' + this.afterCtCls}, 'before');
+        }
+    },
+
+    
+    destroy: function() {
+        Ext.destroy(this.menu, this.menuTrigger);
+    }
+});
+
+Ext.define('Ext.util.Region', {
+
+    
+
+    requires: ['Ext.util.Offset'],
+
+    statics: {
+        
+        getRegion: function(el) {
+            return Ext.fly(el).getPageBox(true);
+        },
+
+        
+        from: function(o) {
+            return new this(o.top, o.right, o.bottom, o.left);
+        }
+    },
+
+    
+
+    
+    constructor : function(t, r, b, l) {
+        var me = this;
+        me.y = me.top = me[1] = t;
+        me.right = r;
+        me.bottom = b;
+        me.x = me.left = me[0] = l;
+    },
+
+    
+    contains : function(region) {
+        var me = this;
+        return (region.x >= me.x &&
+                region.right <= me.right &&
+                region.y >= me.y &&
+                region.bottom <= me.bottom);
+
+    },
+
+    
+    intersect : function(region) {
+        var me = this,
+            t = Math.max(me.y, region.y),
+            r = Math.min(me.right, region.right),
+            b = Math.min(me.bottom, region.bottom),
+            l = Math.max(me.x, region.x);
+
+        if (b > t && r > l) {
+            return new this.self(t, r, b, l);
+        }
+        else {
+            return false;
+        }
+    },
+
+    
+    union : function(region) {
+        var me = this,
+            t = Math.min(me.y, region.y),
+            r = Math.max(me.right, region.right),
+            b = Math.max(me.bottom, region.bottom),
+            l = Math.min(me.x, region.x);
+
+        return new this.self(t, r, b, l);
+    },
+
+    
+    constrainTo : function(r) {
+        var me = this,
+            constrain = Ext.Number.constrain;
+        me.top = me.y = constrain(me.top, r.y, r.bottom);
+        me.bottom = constrain(me.bottom, r.y, r.bottom);
+        me.left = me.x = constrain(me.left, r.x, r.right);
+        me.right = constrain(me.right, r.x, r.right);
+        return me;
+    },
+
+    
+    adjust : function(t, r, b, l) {
+        var me = this;
+        me.top = me.y += t;
+        me.left = me.x += l;
+        me.right += r;
+        me.bottom += b;
+        return me;
+    },
+
+    
+    getOutOfBoundOffset: function(axis, p) {
+        if (!Ext.isObject(axis)) {
+            if (axis == 'x') {
+                return this.getOutOfBoundOffsetX(p);
+            } else {
+                return this.getOutOfBoundOffsetY(p);
+            }
+        } else {
+            p = axis;
+            var d = Ext.create('Ext.util.Offset');
+            d.x = this.getOutOfBoundOffsetX(p.x);
+            d.y = this.getOutOfBoundOffsetY(p.y);
+            return d;
+        }
+
+    },
+
+    
+    getOutOfBoundOffsetX: function(p) {
+        if (p <= this.x) {
+            return this.x - p;
+        } else if (p >= this.right) {
+            return this.right - p;
+        }
+
+        return 0;
+    },
+
+    
+    getOutOfBoundOffsetY: function(p) {
+        if (p <= this.y) {
+            return this.y - p;
+        } else if (p >= this.bottom) {
+            return this.bottom - p;
+        }
+
+        return 0;
+    },
+
+    
+    isOutOfBound: function(axis, p) {
+        if (!Ext.isObject(axis)) {
+            if (axis == 'x') {
+                return this.isOutOfBoundX(p);
+            } else {
+                return this.isOutOfBoundY(p);
+            }
+        } else {
+            p = axis;
+            return (this.isOutOfBoundX(p.x) || this.isOutOfBoundY(p.y));
+        }
+    },
+
+    
+    isOutOfBoundX: function(p) {
+        return (p < this.x || p > this.right);
+    },
+
+    
+    isOutOfBoundY: function(p) {
+        return (p < this.y || p > this.bottom);
+    },
+
+    
+    restrict: function(axis, p, factor) {
+        if (Ext.isObject(axis)) {
+            var newP;
+
+            factor = p;
+            p = axis;
+
+            if (p.copy) {
+                newP = p.copy();
+            }
+            else {
+                newP = {
+                    x: p.x,
+                    y: p.y
+                };
+            }
+
+            newP.x = this.restrictX(p.x, factor);
+            newP.y = this.restrictY(p.y, factor);
+            return newP;
+        } else {
+            if (axis == 'x') {
+                return this.restrictX(p, factor);
+            } else {
+                return this.restrictY(p, factor);
+            }
+        }
+    },
+
+    
+    restrictX : function(p, factor) {
+        if (!factor) {
+            factor = 1;
+        }
+
+        if (p <= this.x) {
+            p -= (p - this.x) * factor;
+        }
+        else if (p >= this.right) {
+            p -= (p - this.right) * factor;
+        }
+        return p;
+    },
+
+    
+    restrictY : function(p, factor) {
+        if (!factor) {
+            factor = 1;
+        }
+
+        if (p <= this.y) {
+            p -= (p - this.y) * factor;
+        }
+        else if (p >= this.bottom) {
+            p -= (p - this.bottom) * factor;
+        }
+        return p;
+    },
+
+    
+    getSize: function() {
+        return {
+            width: this.right - this.x,
+            height: this.bottom - this.y
+        };
+    },
+
+    
+    copy: function() {
+        return new this.self(this.y, this.right, this.bottom, this.x);
+    },
+
+    
+    copyFrom: function(p) {
+        var me = this;
+        me.top = me.y = me[1] = p.y;
+        me.right = p.right;
+        me.bottom = p.bottom;
+        me.left = me.x = me[0] = p.x;
+
+        return this;
+    },
+
+    
+    toString: function() {
+        return "Region[" + this.top + "," + this.right + "," + this.bottom + "," + this.left + "]";
+    },
+
+    
+    translateBy: function(x, y) {
+        if (arguments.length == 1) {
+            y = x.y;
+            x = x.x;
+        }
+        var me = this;
+        me.top = me.y += y;
+        me.right += x;
+        me.bottom += y;
+        me.left = me.x += x;
+
+        return me;
+    },
+
+    
+    round: function() {
+        var me = this;
+        me.top = me.y = Math.round(me.y);
+        me.right = Math.round(me.right);
+        me.bottom = Math.round(me.bottom);
+        me.left = me.x = Math.round(me.x);
+
+        return me;
+    },
+
+    
+    equals: function(region) {
+        return (this.top == region.top && this.right == region.right && this.bottom == region.bottom && this.left == region.left);
+    }
+});
+
+
+
+
+
+Ext.define('Ext.dd.DragDropManager', {
+    singleton: true,
+
+    requires: ['Ext.util.Region'],
+
+    uses: ['Ext.tip.QuickTipManager'],
+
+    
+    alternateClassName: ['Ext.dd.DragDropMgr', 'Ext.dd.DDM'],
+
+    
+    ids: {},
+
+    
+    handleIds: {},
+
+    
+    dragCurrent: null,
+
+    
+    dragOvers: {},
+
+    
+    deltaX: 0,
+
+    
+    deltaY: 0,
+
+    
+    preventDefault: true,
+
+    
+    stopPropagation: true,
+
+    
+    initialized: false,
+
+    
+    locked: false,
+
+    
+    init: function() {
+        this.initialized = true;
+    },
+
+    
+    POINT: 0,
+
+    
+    INTERSECT: 1,
+
+    
+    mode: 0,
+
+    
+    _execOnAll: function(sMethod, args) {
+        for (var i in this.ids) {
+            for (var j in this.ids[i]) {
+                var oDD = this.ids[i][j];
+                if (! this.isTypeOfDD(oDD)) {
+                    continue;
+                }
+                oDD[sMethod].apply(oDD, args);
+            }
+        }
+    },
+
+    
+    _onLoad: function() {
+
+        this.init();
+
+        var Event = Ext.EventManager;
+        Event.on(document, "mouseup",   this.handleMouseUp, this, true);
+        Event.on(document, "mousemove", this.handleMouseMove, this, true);
+        Event.on(window,   "unload",    this._onUnload, this, true);
+        Event.on(window,   "resize",    this._onResize, this, true);
+        
+
+    },
+
+    
+    _onResize: function(e) {
+        this._execOnAll("resetConstraints", []);
+    },
+
+    
+    lock: function() { this.locked = true; },
+
+    
+    unlock: function() { this.locked = false; },
+
+    
+    isLocked: function() { return this.locked; },
+
+    
+    locationCache: {},
+
+    
+    useCache: true,
+
+    
+    clickPixelThresh: 3,
+
+    
+    clickTimeThresh: 350,
+
+    
+    dragThreshMet: false,
+
+    
+    clickTimeout: null,
+
+    
+    startX: 0,
+
+    
+    startY: 0,
+
+    
+    regDragDrop: function(oDD, sGroup) {
+        if (!this.initialized) { this.init(); }
+
+        if (!this.ids[sGroup]) {
+            this.ids[sGroup] = {};
+        }
+        this.ids[sGroup][oDD.id] = oDD;
+    },
+
+    
+    removeDDFromGroup: function(oDD, sGroup) {
+        if (!this.ids[sGroup]) {
+            this.ids[sGroup] = {};
+        }
+
+        var obj = this.ids[sGroup];
+        if (obj && obj[oDD.id]) {
+            delete obj[oDD.id];
+        }
+    },
+
+    
+    _remove: function(oDD) {
+        for (var g in oDD.groups) {
+            if (g && this.ids[g] && this.ids[g][oDD.id]) {
+                delete this.ids[g][oDD.id];
+            }
+        }
+        delete this.handleIds[oDD.id];
+    },
+
+    
+    regHandle: function(sDDId, sHandleId) {
+        if (!this.handleIds[sDDId]) {
+            this.handleIds[sDDId] = {};
+        }
+        this.handleIds[sDDId][sHandleId] = sHandleId;
+    },
+
+    
+    isDragDrop: function(id) {
+        return ( this.getDDById(id) ) ? true : false;
+    },
+
+    
+    getRelated: function(p_oDD, bTargetsOnly) {
+        var oDDs = [];
+        for (var i in p_oDD.groups) {
+            for (var j in this.ids[i]) {
+                var dd = this.ids[i][j];
+                if (! this.isTypeOfDD(dd)) {
+                    continue;
+                }
+                if (!bTargetsOnly || dd.isTarget) {
+                    oDDs[oDDs.length] = dd;
+                }
+            }
+        }
+
+        return oDDs;
+    },
+
+    
+    isLegalTarget: function (oDD, oTargetDD) {
+        var targets = this.getRelated(oDD, true);
+        for (var i=0, len=targets.length;i<len;++i) {
+            if (targets[i].id == oTargetDD.id) {
+                return true;
+            }
+        }
+
+        return false;
+    },
+
+    
+    isTypeOfDD: function (oDD) {
+        return (oDD && oDD.__ygDragDrop);
+    },
+
+    
+    isHandle: function(sDDId, sHandleId) {
+        return ( this.handleIds[sDDId] &&
+                        this.handleIds[sDDId][sHandleId] );
+    },
+
+    
+    getDDById: function(id) {
+        for (var i in this.ids) {
+            if (this.ids[i][id]) {
+                return this.ids[i][id];
+            }
+        }
+        return null;
+    },
+
+    
+    handleMouseDown: function(e, oDD) {
+        if(Ext.tip.QuickTipManager){
+            Ext.tip.QuickTipManager.ddDisable();
+        }
+        if(this.dragCurrent){
+            
+            
+            this.handleMouseUp(e);
+        }
+
+        this.currentTarget = e.getTarget();
+        this.dragCurrent = oDD;
+
+        var el = oDD.getEl();
+
+        
+        this.startX = e.getPageX();
+        this.startY = e.getPageY();
+
+        this.deltaX = this.startX - el.offsetLeft;
+        this.deltaY = this.startY - el.offsetTop;
+
+        this.dragThreshMet = false;
+
+        this.clickTimeout = setTimeout(
+                function() {
+                    var DDM = Ext.dd.DragDropManager;
+                    DDM.startDrag(DDM.startX, DDM.startY);
+                },
+                this.clickTimeThresh );
+    },
+
+    
+    startDrag: function(x, y) {
+        clearTimeout(this.clickTimeout);
+        if (this.dragCurrent) {
+            this.dragCurrent.b4StartDrag(x, y);
+            this.dragCurrent.startDrag(x, y);
+        }
+        this.dragThreshMet = true;
+    },
+
+    
+    handleMouseUp: function(e) {
+
+        if(Ext.tip && Ext.tip.QuickTipManager){
+            Ext.tip.QuickTipManager.ddEnable();
+        }
+        if (! this.dragCurrent) {
+            return;
+        }
+
+        clearTimeout(this.clickTimeout);
+
+        if (this.dragThreshMet) {
+            this.fireEvents(e, true);
+        } else {
+        }
+
+        this.stopDrag(e);
+
+        this.stopEvent(e);
+    },
+
+    
+    stopEvent: function(e){
+        if(this.stopPropagation) {
+            e.stopPropagation();
+        }
+
+        if (this.preventDefault) {
+            e.preventDefault();
+        }
+    },
+
+    
+    stopDrag: function(e) {
+        
+        if (this.dragCurrent) {
+            if (this.dragThreshMet) {
+                this.dragCurrent.b4EndDrag(e);
+                this.dragCurrent.endDrag(e);
+            }
+
+            this.dragCurrent.onMouseUp(e);
+        }
+
+        this.dragCurrent = null;
+        this.dragOvers = {};
+    },
+
+    
+    handleMouseMove: function(e) {
+        if (! this.dragCurrent) {
+            return true;
+        }
+        
+
+        
+        if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {
+            this.stopEvent(e);
+            return this.handleMouseUp(e);
+        }
+
+        if (!this.dragThreshMet) {
+            var diffX = Math.abs(this.startX - e.getPageX());
+            var diffY = Math.abs(this.startY - e.getPageY());
+            if (diffX > this.clickPixelThresh ||
+                        diffY > this.clickPixelThresh) {
+                this.startDrag(this.startX, this.startY);
+            }
+        }
+
+        if (this.dragThreshMet) {
+            this.dragCurrent.b4Drag(e);
+            this.dragCurrent.onDrag(e);
+            if(!this.dragCurrent.moveOnly){
+                this.fireEvents(e, false);
+            }
+        }
+
+        this.stopEvent(e);
+
+        return true;
+    },
+
+    
+    fireEvents: function(e, isDrop) {
+        var dc = this.dragCurrent;
+
+        
+        
+        if (!dc || dc.isLocked()) {
+            return;
+        }
+
+        var pt = e.getPoint();
+
+        
+        var oldOvers = [];
+
+        var outEvts   = [];
+        var overEvts  = [];
+        var dropEvts  = [];
+        var enterEvts = [];
+
+        
+        
+        for (var i in this.dragOvers) {
+
+            var ddo = this.dragOvers[i];
+
+            if (! this.isTypeOfDD(ddo)) {
+                continue;
+            }
+
+            if (! this.isOverTarget(pt, ddo, this.mode)) {
+                outEvts.push( ddo );
+            }
+
+            oldOvers[i] = true;
+            delete this.dragOvers[i];
+        }
+
+        for (var sGroup in dc.groups) {
+
+            if ("string" != typeof sGroup) {
+                continue;
+            }
+
+            for (i in this.ids[sGroup]) {
+                var oDD = this.ids[sGroup][i];
+                if (! this.isTypeOfDD(oDD)) {
+                    continue;
+                }
+
+                if (oDD.isTarget && !oDD.isLocked() && ((oDD != dc) || (dc.ignoreSelf === false))) {
+                    if (this.isOverTarget(pt, oDD, this.mode)) {
+                        
+                        if (isDrop) {
+                            dropEvts.push( oDD );
+                        
+                        } else {
+
+                            
+                            if (!oldOvers[oDD.id]) {
+                                enterEvts.push( oDD );
+                            
+                            } else {
+                                overEvts.push( oDD );
+                            }
+
+                            this.dragOvers[oDD.id] = oDD;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (this.mode) {
+            if (outEvts.length) {
+                dc.b4DragOut(e, outEvts);
+                dc.onDragOut(e, outEvts);
+            }
+
+            if (enterEvts.length) {
+                dc.onDragEnter(e, enterEvts);
+            }
+
+            if (overEvts.length) {
+                dc.b4DragOver(e, overEvts);
+                dc.onDragOver(e, overEvts);
+            }
+
+            if (dropEvts.length) {
+                dc.b4DragDrop(e, dropEvts);
+                dc.onDragDrop(e, dropEvts);
+            }
+
+        } else {
+            
+            var len = 0;
+            for (i=0, len=outEvts.length; i<len; ++i) {
+                dc.b4DragOut(e, outEvts[i].id);
+                dc.onDragOut(e, outEvts[i].id);
+            }
+
+            
+            for (i=0,len=enterEvts.length; i<len; ++i) {
+                
+                dc.onDragEnter(e, enterEvts[i].id);
+            }
+
+            
+            for (i=0,len=overEvts.length; i<len; ++i) {
+                dc.b4DragOver(e, overEvts[i].id);
+                dc.onDragOver(e, overEvts[i].id);
+            }
+
+            
+            for (i=0, len=dropEvts.length; i<len; ++i) {
+                dc.b4DragDrop(e, dropEvts[i].id);
+                dc.onDragDrop(e, dropEvts[i].id);
+            }
+
+        }
+
+        
+        if (isDrop && !dropEvts.length) {
+            dc.onInvalidDrop(e);
+        }
+
+    },
+
+    
+    getBestMatch: function(dds) {
+        var winner = null;
+        
+        
+           
+        
+        
+
+        var len = dds.length;
+
+        if (len == 1) {
+            winner = dds[0];
+        } else {
+            
+            for (var i=0; i<len; ++i) {
+                var dd = dds[i];
+                
+                
+                
+                if (dd.cursorIsOver) {
+                    winner = dd;
+                    break;
+                
+                } else {
+                    if (!winner ||
+                        winner.overlap.getArea() < dd.overlap.getArea()) {
+                        winner = dd;
+                    }
+                }
+            }
+        }
+
+        return winner;
+    },
+
+    
+    refreshCache: function(groups) {
+        for (var sGroup in groups) {
+            if ("string" != typeof sGroup) {
+                continue;
+            }
+            for (var i in this.ids[sGroup]) {
+                var oDD = this.ids[sGroup][i];
+
+                if (this.isTypeOfDD(oDD)) {
+                
+                    var loc = this.getLocation(oDD);
+                    if (loc) {
+                        this.locationCache[oDD.id] = loc;
+                    } else {
+                        delete this.locationCache[oDD.id];
+                        
+                        
+                        
+                    }
+                }
+            }
+        }
+    },
+
+    
+    verifyEl: function(el) {
+        if (el) {
+            var parent;
+            if(Ext.isIE){
+                try{
+                    parent = el.offsetParent;
+                }catch(e){}
+            }else{
+                parent = el.offsetParent;
+            }
+            if (parent) {
+                return true;
+            }
+        }
+
+        return false;
+    },
+
+    
+    getLocation: function(oDD) {
+        if (! this.isTypeOfDD(oDD)) {
+            return null;
+        }
+
+        
+        
+        if (oDD.getRegion) {
+            return oDD.getRegion();
+        }
+
+        var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;
+
+        try {
+            pos= Ext.Element.getXY(el);
+        } catch (e) { }
+
+        if (!pos) {
+            return null;
+        }
+
+        x1 = pos[0];
+        x2 = x1 + el.offsetWidth;
+        y1 = pos[1];
+        y2 = y1 + el.offsetHeight;
+
+        t = y1 - oDD.padding[0];
+        r = x2 + oDD.padding[1];
+        b = y2 + oDD.padding[2];
+        l = x1 - oDD.padding[3];
+
+        return Ext.create('Ext.util.Region', t, r, b, l);
+    },
+
+    
+    isOverTarget: function(pt, oTarget, intersect) {
+        
+        var loc = this.locationCache[oTarget.id];
+        if (!loc || !this.useCache) {
+            loc = this.getLocation(oTarget);
+            this.locationCache[oTarget.id] = loc;
+
+        }
+
+        if (!loc) {
+            return false;
+        }
+
+        oTarget.cursorIsOver = loc.contains( pt );
+
+        
+        
+        
+        
+        
+        var dc = this.dragCurrent;
+        if (!dc || !dc.getTargetCoord ||
+                (!intersect && !dc.constrainX && !dc.constrainY)) {
+            return oTarget.cursorIsOver;
+        }
+
+        oTarget.overlap = null;
+
+        
+        
+        
+        
+        var pos = dc.getTargetCoord(pt.x, pt.y);
+
+        var el = dc.getDragEl();
+        var curRegion = Ext.create('Ext.util.Region', pos.y,
+                                               pos.x + el.offsetWidth,
+                                               pos.y + el.offsetHeight,
+                                               pos.x );
+
+        var overlap = curRegion.intersect(loc);
+
+        if (overlap) {
+            oTarget.overlap = overlap;
+            return (intersect) ? true : oTarget.cursorIsOver;
+        } else {
+            return false;
+        }
+    },
+
+    
+    _onUnload: function(e, me) {
+        Ext.dd.DragDropManager.unregAll();
+    },
+
+    
+    unregAll: function() {
+
+        if (this.dragCurrent) {
+            this.stopDrag();
+            this.dragCurrent = null;
+        }
+
+        this._execOnAll("unreg", []);
+
+        for (var i in this.elementCache) {
+            delete this.elementCache[i];
+        }
+
+        this.elementCache = {};
+        this.ids = {};
+    },
+
+    
+    elementCache: {},
+
+    
+    getElWrapper: function(id) {
+        var oWrapper = this.elementCache[id];
+        if (!oWrapper || !oWrapper.el) {
+            oWrapper = this.elementCache[id] =
+                new this.ElementWrapper(Ext.getDom(id));
+        }
+        return oWrapper;
+    },
+
+    
+    getElement: function(id) {
+        return Ext.getDom(id);
+    },
+
+    
+    getCss: function(id) {
+        var el = Ext.getDom(id);
+        return (el) ? el.style : null;
+    },
+
+    
+    ElementWrapper: function(el) {
+        
+        this.el = el || null;
+        
+        this.id = this.el && el.id;
+        
+        this.css = this.el && el.style;
+    },
+
+    
+    
+
+    
+    getPosX: function(el) {
+        return Ext.Element.getX(el);
+    },
+
+    
+    getPosY: function(el) {
+        return Ext.Element.getY(el);
+    },
+
+    
+    swapNode: function(n1, n2) {
+        if (n1.swapNode) {
+            n1.swapNode(n2);
+        } else {
+            var p = n2.parentNode;
+            var s = n2.nextSibling;
+
+            if (s == n1) {
+                p.insertBefore(n1, n2);
+            } else if (n2 == n1.nextSibling) {
+                p.insertBefore(n2, n1);
+            } else {
+                n1.parentNode.replaceChild(n2, n1);
+                p.insertBefore(n1, s);
+            }
+        }
+    },
+
+    
+    getScroll: function () {
+        var doc   = window.document,
+            docEl = doc.documentElement,
+            body  = doc.body,
+            top   = 0,
+            left  = 0;
+
+        if (Ext.isGecko4) {
+            top  = window.scrollYOffset;
+            left = window.scrollXOffset;
+        } else {
+            if (docEl && (docEl.scrollTop || docEl.scrollLeft)) {
+                top  = docEl.scrollTop;
+                left = docEl.scrollLeft;
+            } else if (body) {
+                top  = body.scrollTop;
+                left = body.scrollLeft;
+            }
+        }
+        return {
+            top: top,
+            left: left
+        };
+    },
+
+    
+    getStyle: function(el, styleProp) {
+        return Ext.fly(el).getStyle(styleProp);
+    },
+
+    
+    getScrollTop: function () {
+        return this.getScroll().top;
+    },
+
+    
+    getScrollLeft: function () {
+        return this.getScroll().left;
+    },
+
+    
+    moveToEl: function (moveEl, targetEl) {
+        var aCoord = Ext.Element.getXY(targetEl);
+        Ext.Element.setXY(moveEl, aCoord);
+    },
+
+    
+    numericSort: function(a, b) {
+        return (a - b);
+    },
+
+    
+    _timeoutCount: 0,
+
+    
+    _addListeners: function() {
+        if ( document ) {
+            this._onLoad();
+        } else {
+            if (this._timeoutCount > 2000) {
+            } else {
+                setTimeout(this._addListeners, 10);
+                if (document && document.body) {
+                    this._timeoutCount += 1;
+                }
+            }
+        }
+    },
+
+    
+    handleWasClicked: function(node, id) {
+        if (this.isHandle(id, node.id)) {
+            return true;
+        } else {
+            
+            var p = node.parentNode;
+
+            while (p) {
+                if (this.isHandle(id, p.id)) {
+                    return true;
+                } else {
+                    p = p.parentNode;
+                }
+            }
+        }
+
+        return false;
+    }
+}, function() {
+    this._addListeners();
+});
+
+
+
+Ext.define('Ext.layout.container.Box', {
+
+    
+
+    alias: ['layout.box'],
+    extend: 'Ext.layout.container.Container',
+    alternateClassName: 'Ext.layout.BoxLayout',
+
+    requires: [
+        'Ext.layout.container.boxOverflow.None',
+        'Ext.layout.container.boxOverflow.Menu',
+        'Ext.layout.container.boxOverflow.Scroller',
+        'Ext.util.Format',
+        'Ext.dd.DragDropManager'
+    ],
+
+    
+
+    
+
+    
+    defaultMargins: {
+        top: 0,
+        right: 0,
+        bottom: 0,
+        left: 0
+    },
+
+    
+    padding: '0',
+    
+    pack: 'start',
+
+    
+    
+
+    type: 'box',
+    scrollOffset: 0,
+    itemCls: Ext.baseCSSPrefix + 'box-item',
+    targetCls: Ext.baseCSSPrefix + 'box-layout-ct',
+    innerCls: Ext.baseCSSPrefix + 'box-inner',
+
+    bindToOwnerCtContainer: true,
+
+    
+    
+    availableSpaceOffset: 0,
+
+    
+    reserveOffset: true,
+
+    
+    shrinkToFit: true,
+
+    
+    clearInnerCtOnLayout: false,
+
+    flexSortFn: function (a, b) {
+        var maxParallelPrefix = 'max' + this.parallelPrefixCap,
+            infiniteValue = Infinity;
+        a = a.component[maxParallelPrefix] || infiniteValue;
+        b = b.component[maxParallelPrefix] || infiniteValue;
+        
+        if (!isFinite(a) && !isFinite(b)) {
+            return false;
+        }
+        return a - b;
+    },
+
+    
+    minSizeSortFn: function(a, b) {
+        return b.available - a.available;
+    },
+
+    constructor: function(config) {
+        var me = this;
+
+        me.callParent(arguments);
+
+        
+        me.flexSortFn = Ext.Function.bind(me.flexSortFn, me);
+
+        me.initOverflowHandler();
+    },
+
+    
+    getChildBox: function(child) {
+        child = child.el || this.owner.getComponent(child).el;
+        var size = child.getBox(false, true);
+        return {
+            left: size.left,
+            top: size.top,
+            width: size.width,
+            height: size.height
+        };
+    },
+
+    
+    calculateChildBox: function(child) {
+        var me = this,
+            boxes = me.calculateChildBoxes(me.getVisibleItems(), me.getLayoutTargetSize()).boxes,
+            ln = boxes.length,
+            i = 0;
+
+        child = me.owner.getComponent(child);
+        for (; i < ln; i++) {
+            if (boxes[i].component === child) {
+                return boxes[i];
+            }
+        }
+    },
+
+    
+    calculateChildBoxes: function(visibleItems, targetSize) {
+        var me = this,
+            math = Math,
+            mmax = math.max,
+            infiniteValue = Infinity,
+            undefinedValue,
+
+            parallelPrefix = me.parallelPrefix,
+            parallelPrefixCap = me.parallelPrefixCap,
+            perpendicularPrefix = me.perpendicularPrefix,
+            perpendicularPrefixCap = me.perpendicularPrefixCap,
+            parallelMinString = 'min' + parallelPrefixCap,
+            perpendicularMinString = 'min' + perpendicularPrefixCap,
+            perpendicularMaxString = 'max' + perpendicularPrefixCap,
+
+            parallelSize = targetSize[parallelPrefix] - me.scrollOffset,
+            perpendicularSize = targetSize[perpendicularPrefix],
+            padding = me.padding,
+            parallelOffset = padding[me.parallelBefore],
+            paddingParallel = parallelOffset + padding[me.parallelAfter],
+            perpendicularOffset = padding[me.perpendicularLeftTop],
+            paddingPerpendicular =  perpendicularOffset + padding[me.perpendicularRightBottom],
+            availPerpendicularSize = mmax(0, perpendicularSize - paddingPerpendicular),
+
+            innerCtBorderWidth = me.innerCt.getBorderWidth(me.perpendicularLT + me.perpendicularRB),
+
+            isStart = me.pack == 'start',
+            isCenter = me.pack == 'center',
+            isEnd = me.pack == 'end',
+
+            constrain = Ext.Number.constrain,
+            visibleCount = visibleItems.length,
+            nonFlexSize = 0,
+            totalFlex = 0,
+            desiredSize = 0,
+            minimumSize = 0,
+            maxSize = 0,
+            boxes = [],
+            minSizes = [],
+            calculatedWidth,
+
+            i, child, childParallel, childPerpendicular, childMargins, childSize, minParallel, tmpObj, shortfall,
+            tooNarrow, availableSpace, minSize, item, length, itemIndex, box, oldSize, newSize, reduction, diff,
+            flexedBoxes, remainingSpace, remainingFlex, flexedSize, parallelMargins, calcs, offset,
+            perpendicularMargins, stretchSize;
+
+        
+        for (i = 0; i < visibleCount; i++) {
+            child = visibleItems[i];
+            childPerpendicular = child[perpendicularPrefix];
+            if (!child.flex || !(me.align == 'stretch' || me.align == 'stretchmax')) {
+                if (child.componentLayout.initialized !== true) {
+                    me.layoutItem(child);
+                }
+            }
+
+            childMargins = child.margins;
+            parallelMargins = childMargins[me.parallelBefore] + childMargins[me.parallelAfter];
+
+            
+            tmpObj = {
+                component: child,
+                margins: childMargins
+            };
+
+            
+            if (child.flex) {
+                totalFlex += child.flex;
+                childParallel = undefinedValue;
+            }
+            
+            else {
+                if (!(child[parallelPrefix] && childPerpendicular)) {
+                    childSize = child.getSize();
+                }
+                childParallel = child[parallelPrefix] || childSize[parallelPrefix];
+                childPerpendicular = childPerpendicular || childSize[perpendicularPrefix];
+            }
+
+            nonFlexSize += parallelMargins + (childParallel || 0);
+            desiredSize += parallelMargins + (child.flex ? child[parallelMinString] || 0 : childParallel);
+            minimumSize += parallelMargins + (child[parallelMinString] || childParallel || 0);
+
+            
+            if (typeof childPerpendicular != 'number') {
+                
+                
+                childPerpendicular = child['get' + perpendicularPrefixCap]();
+            }
+
+            
+            
+            maxSize = mmax(maxSize, mmax(childPerpendicular, child[perpendicularMinString]||0) + childMargins[me.perpendicularLeftTop] + childMargins[me.perpendicularRightBottom]);
+
+            tmpObj[parallelPrefix] = childParallel || undefinedValue;
+            tmpObj.dirtySize = child.componentLayout.lastComponentSize ? (tmpObj[parallelPrefix] !== child.componentLayout.lastComponentSize[parallelPrefix]) : false;
+            tmpObj[perpendicularPrefix] = childPerpendicular || undefinedValue;
+            boxes.push(tmpObj);
+        }
+
+        
+        if (!me.autoSize) {
+            shortfall = desiredSize - parallelSize;
+            tooNarrow = minimumSize > parallelSize;
+        }
+
+        
+        availableSpace = mmax(0, parallelSize - nonFlexSize - paddingParallel - (me.reserveOffset ? me.availableSpaceOffset : 0));
+
+        if (tooNarrow) {
+            for (i = 0; i < visibleCount; i++) {
+                box = boxes[i];
+                minSize = visibleItems[i][parallelMinString] || visibleItems[i][parallelPrefix] || box[parallelPrefix];
+                box.dirtySize = box.dirtySize || box[parallelPrefix] != minSize;
+                box[parallelPrefix] = minSize;
+            }
+        }
+        else {
+            
+            
+            if (shortfall > 0) {
+                
+                for (i = 0; i < visibleCount; i++) {
+                    item = visibleItems[i];
+                    minSize = item[parallelMinString] || 0;
+
+                    
+                    
+                    if (item.flex) {
+                        box = boxes[i];
+                        box.dirtySize = box.dirtySize || box[parallelPrefix] != minSize;
+                        box[parallelPrefix] = minSize;
+                    } else if (me.shrinkToFit) {
+                        minSizes.push({
+                            minSize: minSize,
+                            available: boxes[i][parallelPrefix] - minSize,
+                            index: i
+                        });
+                    }
+                }
+
+                
+                Ext.Array.sort(minSizes, me.minSizeSortFn);
+
+                
+                for (i = 0, length = minSizes.length; i < length; i++) {
+                    itemIndex = minSizes[i].index;
+
+                    if (itemIndex == undefinedValue) {
+                        continue;
+                    }
+                    item = visibleItems[itemIndex];
+                    minSize = minSizes[i].minSize;
+
+                    box = boxes[itemIndex];
+                    oldSize = box[parallelPrefix];
+                    newSize = mmax(minSize, oldSize - math.ceil(shortfall / (length - i)));
+                    reduction = oldSize - newSize;
+
+                    box.dirtySize = box.dirtySize || box[parallelPrefix] != newSize;
+                    box[parallelPrefix] = newSize;
+                    shortfall -= reduction;
+                }
+                tooNarrow = (shortfall > 0);
+            }
+            else {
+                remainingSpace = availableSpace;
+                remainingFlex = totalFlex;
+                flexedBoxes = [];
+
+                
+                for (i = 0; i < visibleCount; i++) {
+                    child = visibleItems[i];
+                    if (isStart && child.flex) {
+                        flexedBoxes.push(boxes[Ext.Array.indexOf(visibleItems, child)]);
+                    }
+                }
+                
+                
+                
+                Ext.Array.sort(flexedBoxes, me.flexSortFn);
+
+                
+                for (i = 0; i < flexedBoxes.length; i++) {
+                    calcs = flexedBoxes[i];
+                    child = calcs.component;
+                    childMargins = calcs.margins;
+
+                    flexedSize = math.ceil((child.flex / remainingFlex) * remainingSpace);
+
+                    
+                    flexedSize = Math.max(child['min' + parallelPrefixCap] || 0, math.min(child['max' + parallelPrefixCap] || infiniteValue, flexedSize));
+
+                    
+                    remainingSpace -= flexedSize;
+                    remainingFlex -= child.flex;
+
+                    calcs.dirtySize = calcs.dirtySize || calcs[parallelPrefix] != flexedSize;
+                    calcs[parallelPrefix] = flexedSize;
+                }
+            }
+        }
+
+        if (isCenter) {
+            parallelOffset += availableSpace / 2;
+        }
+        else if (isEnd) {
+            parallelOffset += availableSpace;
+        }
+
+        
+        
+        
+        
+        if (me.owner.dock && (Ext.isIE6 || Ext.isIE7 || Ext.isIEQuirks) && !me.owner.width && me.direction == 'vertical') {
+
+            calculatedWidth = maxSize + me.owner.el.getPadding('lr') + me.owner.el.getBorderWidth('lr');
+            if (me.owner.frameSize) {
+                calculatedWidth += me.owner.frameSize.left + me.owner.frameSize.right;
+            }
+            
+            availPerpendicularSize = Math.min(availPerpendicularSize, targetSize.width = maxSize + padding.left + padding.right);
+        }
+
+        
+        for (i = 0; i < visibleCount; i++) {
+            child = visibleItems[i];
+            calcs = boxes[i];
+
+            childMargins = calcs.margins;
+
+            perpendicularMargins = childMargins[me.perpendicularLeftTop] + childMargins[me.perpendicularRightBottom];
+
+            
+            parallelOffset += childMargins[me.parallelBefore];
+
+            calcs[me.parallelBefore] = parallelOffset;
+            calcs[me.perpendicularLeftTop] = perpendicularOffset + childMargins[me.perpendicularLeftTop];
+
+            if (me.align == 'stretch') {
+                stretchSize = constrain(availPerpendicularSize - perpendicularMargins, child[perpendicularMinString] || 0, child[perpendicularMaxString] || infiniteValue);
+                calcs.dirtySize = calcs.dirtySize || calcs[perpendicularPrefix] != stretchSize;
+                calcs[perpendicularPrefix] = stretchSize;
+            }
+            else if (me.align == 'stretchmax') {
+                stretchSize = constrain(maxSize - perpendicularMargins, child[perpendicularMinString] || 0, child[perpendicularMaxString] || infiniteValue);
+                calcs.dirtySize = calcs.dirtySize || calcs[perpendicularPrefix] != stretchSize;
+                calcs[perpendicularPrefix] = stretchSize;
+            }
+            else if (me.align == me.alignCenteringString) {
+                
+                
+                
+                diff = mmax(availPerpendicularSize, maxSize) - innerCtBorderWidth - calcs[perpendicularPrefix];
+                if (diff > 0) {
+                    calcs[me.perpendicularLeftTop] = perpendicularOffset + Math.round(diff / 2);
+                }
+            }
+
+            
+            parallelOffset += (calcs[parallelPrefix] || 0) + childMargins[me.parallelAfter];
+        }
+
+        return {
+            boxes: boxes,
+            meta : {
+                calculatedWidth: calculatedWidth,
+                maxSize: maxSize,
+                nonFlexSize: nonFlexSize,
+                desiredSize: desiredSize,
+                minimumSize: minimumSize,
+                shortfall: shortfall,
+                tooNarrow: tooNarrow
+            }
+        };
+    },
+
+    onRemove: function(comp){
+        this.callParent(arguments);
+        if (this.overflowHandler) {
+            this.overflowHandler.onRemove(comp);
+        }
+    },
+
+    
+    initOverflowHandler: function() {
+        var handler = this.overflowHandler;
+
+        if (typeof handler == 'string') {
+            handler = {
+                type: handler
+            };
+        }
+
+        var handlerType = 'None';
+        if (handler && handler.type !== undefined) {
+            handlerType = handler.type;
+        }
+
+        var constructor = Ext.layout.container.boxOverflow[handlerType];
+        if (constructor[this.type]) {
+            constructor = constructor[this.type];
+        }
+
+        this.overflowHandler = Ext.create('Ext.layout.container.boxOverflow.' + handlerType, this, handler);
+    },
+
+    
+    onLayout: function() {
+        this.callParent();
+        
+        if (this.clearInnerCtOnLayout === true && this.adjustmentPass !== true) {
+            this.innerCt.setSize(null, null);
+        }
+
+        var me = this,
+            targetSize = me.getLayoutTargetSize(),
+            items = me.getVisibleItems(),
+            calcs = me.calculateChildBoxes(items, targetSize),
+            boxes = calcs.boxes,
+            meta = calcs.meta,
+            handler, method, results;
+
+        if (me.autoSize && calcs.meta.desiredSize) {
+            targetSize[me.parallelPrefix] = calcs.meta.desiredSize;
+        }
+
+        
+        if (meta.shortfall > 0) {
+            handler = me.overflowHandler;
+            method = meta.tooNarrow ? 'handleOverflow': 'clearOverflow';
+
+            results = handler[method](calcs, targetSize);
+
+            if (results) {
+                if (results.targetSize) {
+                    targetSize = results.targetSize;
+                }
+
+                if (results.recalculate) {
+                    items = me.getVisibleItems();
+                    calcs = me.calculateChildBoxes(items, targetSize);
+                    boxes = calcs.boxes;
+                }
+            }
+        } else {
+            me.overflowHandler.clearOverflow();
+        }
+
+        
+        me.layoutTargetLastSize = targetSize;
+
+        
+        me.childBoxCache = calcs;
+
+        me.updateInnerCtSize(targetSize, calcs);
+        me.updateChildBoxes(boxes);
+        me.handleTargetOverflow(targetSize);
+    },
+    
+    animCallback: Ext.emptyFn,
+
+    
+    updateChildBoxes: function(boxes) {
+        var me = this,
+            i = 0,
+            length = boxes.length,
+            animQueue = [],
+            dd = Ext.dd.DDM.getDDById(me.innerCt.id), 
+            oldBox, newBox, changed, comp, boxAnim, animCallback;
+
+        for (; i < length; i++) {
+            newBox = boxes[i];
+            comp = newBox.component;
+
+            
+            
+            if (dd && (dd.getDragEl() === comp.el.dom)) {
+                continue;
+            }
+
+            changed = false;
+
+            oldBox = me.getChildBox(comp);
+
+            
+            
+            
+            if (me.animate) {
+                
+                animCallback = me.animate.callback || me.animate;
+                boxAnim = {
+                    layoutAnimation: true,  
+                    target: comp,
+                    from: {},
+                    to: {},
+                    listeners: {}
+                };
+                
+                
+                
+                
+                if (!isNaN(newBox.width) && (newBox.width != oldBox.width)) {
+                    changed = true;
+                    
+                    boxAnim.to.width = newBox.width;
+                }
+                if (!isNaN(newBox.height) && (newBox.height != oldBox.height)) {
+                    changed = true;
+                    
+                    boxAnim.to.height = newBox.height;
+                }
+                if (!isNaN(newBox.left) && (newBox.left != oldBox.left)) {
+                    changed = true;
+                    
+                    boxAnim.to.left = newBox.left;
+                }
+                if (!isNaN(newBox.top) && (newBox.top != oldBox.top)) {
+                    changed = true;
+                    
+                    boxAnim.to.top = newBox.top;
+                }
+                if (changed) {
+                    animQueue.push(boxAnim);
+                }
+            } else {
+                if (newBox.dirtySize) {
+                    if (newBox.width !== oldBox.width || newBox.height !== oldBox.height) {
+                        me.setItemSize(comp, newBox.width, newBox.height);
+                    }
+                }
+                
+                if (isNaN(newBox.left) || isNaN(newBox.top)) {
+                    continue;
+                }
+                comp.setPosition(newBox.left, newBox.top);
+            }
+        }
+
+        
+        length = animQueue.length;
+        if (length) {
+
+            
+            
+            var afterAnimate = function(anim) {
+                
+                length -= 1;
+                if (!length) {
+                    me.animCallback(anim);
+                    me.layoutBusy = false;
+                    if (Ext.isFunction(animCallback)) {
+                        animCallback();
+                    }
+                }
+            };
+
+            var beforeAnimate = function() {
+                me.layoutBusy = true;
+            };
+
+            
+            for (i = 0, length = animQueue.length; i < length; i++) {
+                boxAnim = animQueue[i];
+
+                
+                boxAnim.listeners.afteranimate = afterAnimate;
+
+                
+                if (!i) {
+                    boxAnim.listeners.beforeanimate = beforeAnimate;
+                }
+                if (me.animate.duration) {
+                    boxAnim.duration = me.animate.duration;
+                }
+                comp = boxAnim.target;
+                delete boxAnim.target;
+                
+                comp.stopAnimation();
+                comp.animate(boxAnim);
+            }
+        }
+    },
+
+    
+    updateInnerCtSize: function(tSize, calcs) {
+        var me = this,
+            mmax = Math.max,
+            align = me.align,
+            padding = me.padding,
+            width = tSize.width,
+            height = tSize.height,
+            meta = calcs.meta,
+            innerCtWidth,
+            innerCtHeight;
+
+        if (me.direction == 'horizontal') {
+            innerCtWidth = width;
+            innerCtHeight = meta.maxSize + padding.top + padding.bottom + me.innerCt.getBorderWidth('tb');
+
+            if (align == 'stretch') {
+                innerCtHeight = height;
+            }
+            else if (align == 'middle') {
+                innerCtHeight = mmax(height, innerCtHeight);
+            }
+        } else {
+            innerCtHeight = height;
+            innerCtWidth = meta.maxSize + padding.left + padding.right + me.innerCt.getBorderWidth('lr');
+
+            if (align == 'stretch') {
+                innerCtWidth = width;
+            }
+            else if (align == 'center') {
+                innerCtWidth = mmax(width, innerCtWidth);
+            }
+        }
+        me.getRenderTarget().setSize(innerCtWidth || undefined, innerCtHeight || undefined);
+
+        
+        
+        if (meta.calculatedWidth && me.owner.el.getWidth() > meta.calculatedWidth) {
+            me.owner.el.setWidth(meta.calculatedWidth);
+        }
+
+        if (me.innerCt.dom.scrollTop) {
+            me.innerCt.dom.scrollTop = 0;
+        }
+    },
+
+    
+    handleTargetOverflow: function(previousTargetSize) {
+        var target = this.getTarget(),
+            overflow = target.getStyle('overflow'),
+            newTargetSize;
+
+        if (overflow && overflow != 'hidden' && !this.adjustmentPass) {
+            newTargetSize = this.getLayoutTargetSize();
+            if (newTargetSize.width != previousTargetSize.width || newTargetSize.height != previousTargetSize.height) {
+                this.adjustmentPass = true;
+                this.onLayout();
+                return true;
+            }
+        }
+
+        delete this.adjustmentPass;
+    },
+
+    
+    isValidParent : function(item, target, position) {
+        
+        
+        var itemEl = item.el ? item.el.dom : Ext.getDom(item);
+        return (itemEl && this.innerCt && itemEl.parentNode === this.innerCt.dom) || false;
+    },
+
+    
+    
+    getRenderTarget: function() {
+        if (!this.innerCt) {
+            
+            this.innerCt = this.getTarget().createChild({
+                cls: this.innerCls,
+                role: 'presentation'
+            });
+            this.padding = Ext.util.Format.parseBox(this.padding);
+        }
+        return this.innerCt;
+    },
+
+    
+    renderItem: function(item, target) {
+        this.callParent(arguments);
+        var me = this,
+            itemEl = item.getEl(),
+            style = itemEl.dom.style,
+            margins = item.margins || item.margin;
+
+        
+        if (margins) {
+            if (Ext.isString(margins) || Ext.isNumber(margins)) {
+                margins = Ext.util.Format.parseBox(margins);
+            } else {
+                Ext.applyIf(margins, {top: 0, right: 0, bottom: 0, left: 0});
+            }
+        } else {
+            margins = Ext.apply({}, me.defaultMargins);
+        }
+
+        
+        margins.top    += itemEl.getMargin('t');
+        margins.right  += itemEl.getMargin('r');
+        margins.bottom += itemEl.getMargin('b');
+        margins.left   += itemEl.getMargin('l');
+        margins.height  = margins.top  + margins.bottom;
+        margins.width   = margins.left + margins.right;
+        style.marginTop = style.marginRight = style.marginBottom = style.marginLeft = '0';
+
+        
+        item.margins = margins;
+    },
+
+    
+    destroy: function() {
+        Ext.destroy(this.innerCt, this.overflowHandler);
+        this.callParent(arguments);
+    }
+});
+
+Ext.define('Ext.layout.container.HBox', {
+
+    
+
+    alias: ['layout.hbox'],
+    extend: 'Ext.layout.container.Box',
+    alternateClassName: 'Ext.layout.HBoxLayout',
+
+    
+
+    
+    align: 'top', 
+
+    //@private
+
+    alignCenteringString: 'middle',
+
+    type : 'hbox',
+
+    direction: 'horizontal',
+
+    
+    parallelSizeIndex: 0,
+    perpendicularSizeIndex: 1,
+
+    parallelPrefix: 'width',
+    parallelPrefixCap: 'Width',
+    parallelLT: 'l',
+    parallelRB: 'r',
+    parallelBefore: 'left',
+    parallelBeforeCap: 'Left',
+    parallelAfter: 'right',
+    parallelPosition: 'x',
+
+    perpendicularPrefix: 'height',
+    perpendicularPrefixCap: 'Height',
+    perpendicularLT: 't',
+    perpendicularRB: 'b',
+    perpendicularLeftTop: 'top',
+    perpendicularRightBottom: 'bottom',
+    perpendicularPosition: 'y',
+    configureItem: function(item) {
+        if (item.flex) {
+            item.layoutManagedWidth = 1;
+        } else {
+            item.layoutManagedWidth = 2;
+        }
+
+        if (this.align === 'stretch' || this.align === 'stretchmax') {
+            item.layoutManagedHeight = 1;
+        } else {
+            item.layoutManagedHeight = 2;
+        }
+        this.callParent(arguments);
+    }
+});
+
+Ext.define('Ext.layout.container.VBox', {
+
+    
+
+    alias: ['layout.vbox'],
+    extend: 'Ext.layout.container.Box',
+    alternateClassName: 'Ext.layout.VBoxLayout',
+
+    
+
+    
+    align : 'left', 
+
+    //@private
+
+    alignCenteringString: 'center',
+
+    type: 'vbox',
+
+    direction: 'vertical',
+
+    
+    parallelSizeIndex: 1,
+    perpendicularSizeIndex: 0,
+
+    parallelPrefix: 'height',
+    parallelPrefixCap: 'Height',
+    parallelLT: 't',
+    parallelRB: 'b',
+    parallelBefore: 'top',
+    parallelBeforeCap: 'Top',
+    parallelAfter: 'bottom',
+    parallelPosition: 'y',
+
+    perpendicularPrefix: 'width',
+    perpendicularPrefixCap: 'Width',
+    perpendicularLT: 'l',
+    perpendicularRB: 'r',
+    perpendicularLeftTop: 'left',
+    perpendicularRightBottom: 'right',
+    perpendicularPosition: 'x',
+    configureItem: function(item) {
+        if (item.flex) {
+            item.layoutManagedHeight = 1;
+        } else {
+            item.layoutManagedHeight = 2;
+        }
+
+        if (this.align === 'stretch' || this.align === 'stretchmax') {
+            item.layoutManagedWidth = 1;
+        } else {
+            item.layoutManagedWidth = 2;
+        }
+        this.callParent(arguments);
+    }
+});
+
+Ext.define('Ext.FocusManager', {
+    singleton: true,
+    alternateClassName: 'Ext.FocusMgr',
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    requires: [
+        'Ext.ComponentManager',
+        'Ext.ComponentQuery',
+        'Ext.util.HashMap',
+        'Ext.util.KeyNav'
+    ],
+
+    
+    enabled: false,
+
+    
+
+    focusElementCls: Ext.baseCSSPrefix + 'focus-element',
+
+    focusFrameCls: Ext.baseCSSPrefix + 'focus-frame',
+
+    
+    whitelist: [
+        'textfield'
+    ],
+
+    tabIndexWhitelist: [
+        'a',
+        'button',
+        'embed',
+        'frame',
+        'iframe',
+        'img',
+        'input',
+        'object',
+        'select',
+        'textarea'
+    ],
+
+    constructor: function() {
+        var me = this,
+            CQ = Ext.ComponentQuery;
+
+        me.addEvents(
+            
+            'beforecomponentfocus',
+
+            
+            'componentfocus',
+
+            
+            'disable',
+
+            
+            'enable'
+        );
+
+        
+        
+        me.keyNav = Ext.create('Ext.util.KeyNav', Ext.getDoc(), {
+            disabled: true,
+            scope: me,
+
+            backspace: me.focusLast,
+            enter: me.navigateIn,
+            esc: me.navigateOut,
+            tab: me.navigateSiblings
+
+            
+            
+            
+            
+            
+            
+        });
+
+        me.focusData = {};
+        me.subscribers = Ext.create('Ext.util.HashMap');
+        me.focusChain = {};
+
+        
+        Ext.apply(CQ.pseudos, {
+            focusable: function(cmps) {
+                var len = cmps.length,
+                    results = [],
+                    i = 0,
+                    c,
+
+                    isFocusable = function(x) {
+                        return x && x.focusable !== false && CQ.is(x, '[rendered]:not([destroying]):not([isDestroyed]):not([disabled]){isVisible(true)}{el && c.el.dom && c.el.isVisible()}');
+                    };
+
+                for (; i < len; i++) {
+                    c = cmps[i];
+                    if (isFocusable(c)) {
+                        results.push(c);
+                    }
+                }
+
+                return results;
+            },
+
+            nextFocus: function(cmps, idx, step) {
+                step = step || 1;
+                idx = parseInt(idx, 10);
+
+                var len = cmps.length,
+                    i = idx + step,
+                    c;
+
+                for (; i != idx; i += step) {
+                    if (i >= len) {
+                        i = 0;
+                    } else if (i < 0) {
+                        i = len - 1;
+                    }
+
+                    c = cmps[i];
+                    if (CQ.is(c, ':focusable')) {
+                        return [c];
+                    } else if (c.placeholder && CQ.is(c.placeholder, ':focusable')) {
+                        return [c.placeholder];
+                    }
+                }
+
+                return [];
+            },
+
+            prevFocus: function(cmps, idx) {
+                return this.nextFocus(cmps, idx, -1);
+            },
+
+            root: function(cmps) {
+                var len = cmps.length,
+                    results = [],
+                    i = 0,
+                    c;
+
+                for (; i < len; i++) {
+                    c = cmps[i];
+                    if (!c.ownerCt) {
+                        results.push(c);
+                    }
+                }
+
+                return results;
+            }
+        });
+    },
+
+    
+    addXTypeToWhitelist: function(xtype) {
+        var me = this;
+
+        if (Ext.isArray(xtype)) {
+            Ext.Array.forEach(xtype, me.addXTypeToWhitelist, me);
+            return;
+        }
+
+        if (!Ext.Array.contains(me.whitelist, xtype)) {
+            me.whitelist.push(xtype);
+        }
+    },
+
+    clearComponent: function(cmp) {
+        clearTimeout(this.cmpFocusDelay);
+        if (!cmp.isDestroyed) {
+            cmp.blur();
+        }
+    },
+
+    
+    disable: function() {
+        var me = this;
+
+        if (!me.enabled) {
+            return;
+        }
+
+        delete me.options;
+        me.enabled = false;
+
+        Ext.ComponentManager.all.un('add', me.onComponentCreated, me);
+
+        me.removeDOM();
+
+        
+        me.keyNav.disable();
+
+        
+        me.setFocusAll(false);
+
+        me.fireEvent('disable', me);
+    },
+
+    
+    enable: function(options) {
+        var me = this;
+
+        if (options === true) {
+            options = { focusFrame: true };
+        }
+        me.options = options = options || {};
+
+        if (me.enabled) {
+            return;
+        }
+
+        
+        Ext.ComponentManager.all.on('add', me.onComponentCreated, me);
+
+        me.initDOM(options);
+
+        
+        me.keyNav.enable();
+
+        
+        me.setFocusAll(true, options);
+
+        
+        me.focusEl.focus();
+        delete me.focusedCmp;
+
+        me.enabled = true;
+        me.fireEvent('enable', me);
+    },
+
+    focusLast: function(e) {
+        var me = this;
+
+        if (me.isWhitelisted(me.focusedCmp)) {
+            return true;
+        }
+
+        
+        if (me.previousFocusedCmp) {
+            me.previousFocusedCmp.focus();
+        }
+    },
+
+    getRootComponents: function() {
+        var me = this,
+            CQ = Ext.ComponentQuery,
+            inline = CQ.query(':focusable:root:not([floating])'),
+            floating = CQ.query(':focusable:root[floating]');
+
+        
+        
+        floating.sort(function(a, b) {
+            return a.el.getZIndex() > b.el.getZIndex();
+        });
+
+        return floating.concat(inline);
+    },
+
+    initDOM: function(options) {
+        var me = this,
+            sp = '&#160',
+            cls = me.focusFrameCls;
+
+        if (!Ext.isReady) {
+            Ext.onReady(me.initDOM, me);
+            return;
+        }
+
+        
+        if (!me.focusEl) {
+            me.focusEl = Ext.getBody().createChild({
+                tabIndex: '-1',
+                cls: me.focusElementCls,
+                html: sp
+            });
+        }
+
+        
+        if (!me.focusFrame && options.focusFrame) {
+            me.focusFrame = Ext.getBody().createChild({
+                cls: cls,
+                children: [
+                    { cls: cls + '-top' },
+                    { cls: cls + '-bottom' },
+                    { cls: cls + '-left' },
+                    { cls: cls + '-right' }
+                ],
+                style: 'top: -100px; left: -100px;'
+            });
+            me.focusFrame.setVisibilityMode(Ext.Element.DISPLAY);
+            me.focusFrameWidth = 2;
+            me.focusFrame.hide().setLeftTop(0, 0);
+        }
+    },
+
+    isWhitelisted: function(cmp) {
+        return cmp && Ext.Array.some(this.whitelist, function(x) {
+            return cmp.isXType(x);
+        });
+    },
+
+    navigateIn: function(e) {
+        var me = this,
+            focusedCmp = me.focusedCmp,
+            rootCmps,
+            firstChild;
+
+        if (!focusedCmp) {
+            
+            rootCmps = me.getRootComponents();
+            if (rootCmps.length) {
+                rootCmps[0].focus();
+            }
+        } else {
+            
+            
+            firstChild = Ext.ComponentQuery.query('>:focusable', focusedCmp)[0];
+            if (firstChild) {
+                firstChild.focus();
+            } else {
+                
+                if (Ext.isFunction(focusedCmp.onClick)) {
+                    e.button = 0;
+                    focusedCmp.onClick(e);
+                    focusedCmp.focus();
+                }
+            }
+        }
+    },
+
+    navigateOut: function(e) {
+        var me = this,
+            parent;
+
+        if (!me.focusedCmp || !(parent = me.focusedCmp.up(':focusable'))) {
+            me.focusEl.focus();
+        } else {
+            parent.focus();
+        }
+
+        
+        
+        
+        return true;
+    },
+
+    navigateSiblings: function(e, source, parent) {
+        var me = this,
+            src = source || me,
+            key = e.getKey(),
+            EO = Ext.EventObject,
+            goBack = e.shiftKey || key == EO.LEFT || key == EO.UP,
+            checkWhitelist = key == EO.LEFT || key == EO.RIGHT || key == EO.UP || key == EO.DOWN,
+            nextSelector = goBack ? 'prev' : 'next',
+            idx, next, focusedCmp;
+
+        focusedCmp = (src.focusedCmp && src.focusedCmp.comp) || src.focusedCmp;
+        if (!focusedCmp && !parent) {
+            return;
+        }
+
+        if (checkWhitelist && me.isWhitelisted(focusedCmp)) {
+            return true;
+        }
+
+        parent = parent || focusedCmp.up();
+        if (parent) {
+            idx = focusedCmp ? Ext.Array.indexOf(parent.getRefItems(), focusedCmp) : -1;
+            next = Ext.ComponentQuery.query('>:' + nextSelector + 'Focus(' + idx + ')', parent)[0];
+            if (next && focusedCmp !== next) {
+                next.focus();
+                return next;
+            }
+        }
+    },
+
+    onComponentBlur: function(cmp, e) {
+        var me = this;
+
+        if (me.focusedCmp === cmp) {
+            me.previousFocusedCmp = cmp;
+            delete me.focusedCmp;
+        }
+
+        if (me.focusFrame) {
+            me.focusFrame.hide();
+        }
+    },
+
+    onComponentCreated: function(hash, id, cmp) {
+        this.setFocus(cmp, true, this.options);
+    },
+
+    onComponentDestroy: function(cmp) {
+        this.setFocus(cmp, false);
+    },
+
+    onComponentFocus: function(cmp, e) {
+        var me = this,
+            chain = me.focusChain;
+
+        if (!Ext.ComponentQuery.is(cmp, ':focusable')) {
+            me.clearComponent(cmp);
+
+            
+            
+            
+            
+            if (chain[cmp.id]) {
+                return;
+            }
+
+            
+            var parent = cmp.up();
+            if (parent) {
+                
+                
+                
+                chain[cmp.id] = true;
+                parent.focus();
+            }
+
+            return;
+        }
+
+        
+        me.focusChain = {};
+
+        
+        
+        clearTimeout(me.cmpFocusDelay);
+        if (arguments.length !== 2) {
+            me.cmpFocusDelay = Ext.defer(me.onComponentFocus, 90, me, [cmp, e]);
+            return;
+        }
+
+        if (me.fireEvent('beforecomponentfocus', me, cmp, me.previousFocusedCmp) === false) {
+            me.clearComponent(cmp);
+            return;
+        }
+
+        me.focusedCmp = cmp;
+
+        
+        if (me.shouldShowFocusFrame(cmp)) {
+            var cls = '.' + me.focusFrameCls + '-',
+                ff = me.focusFrame,
+                fw = me.focusFrameWidth,
+                box = cmp.el.getPageBox(),
+
+            
+            
+            
+                bt = box.top,
+                bl = box.left,
+                bw = box.width,
+                bh = box.height,
+                ft = ff.child(cls + 'top'),
+                fb = ff.child(cls + 'bottom'),
+                fl = ff.child(cls + 'left'),
+                fr = ff.child(cls + 'right');
+
+            ft.setWidth(bw).setLeftTop(bl, bt);
+            fb.setWidth(bw).setLeftTop(bl, bt + bh - fw);
+            fl.setHeight(bh - fw - fw).setLeftTop(bl, bt + fw);
+            fr.setHeight(bh - fw - fw).setLeftTop(bl + bw - fw, bt + fw);
+
+            ff.show();
+        }
+
+        me.fireEvent('componentfocus', me, cmp, me.previousFocusedCmp);
+    },
+
+    onComponentHide: function(cmp) {
+        var me = this,
+            CQ = Ext.ComponentQuery,
+            cmpHadFocus = false,
+            focusedCmp,
+            parent;
+
+        if (me.focusedCmp) {
+            focusedCmp = CQ.query('[id=' + me.focusedCmp.id + ']', cmp)[0];
+            cmpHadFocus = me.focusedCmp.id === cmp.id || focusedCmp;
+
+            if (focusedCmp) {
+                me.clearComponent(focusedCmp);
+            }
+        }
+
+        me.clearComponent(cmp);
+
+        if (cmpHadFocus) {
+            parent = CQ.query('^:focusable', cmp)[0];
+            if (parent) {
+                parent.focus();
+            }
+        }
+    },
+
+    removeDOM: function() {
+        var me = this;
+
+        
+        
+        if (me.enabled || me.subscribers.length) {
+            return;
+        }
+
+        Ext.destroy(
+            me.focusEl,
+            me.focusFrame
+        );
+        delete me.focusEl;
+        delete me.focusFrame;
+        delete me.focusFrameWidth;
+    },
+
+    
+    removeXTypeFromWhitelist: function(xtype) {
+        var me = this;
+
+        if (Ext.isArray(xtype)) {
+            Ext.Array.forEach(xtype, me.removeXTypeFromWhitelist, me);
+            return;
+        }
+
+        Ext.Array.remove(me.whitelist, xtype);
+    },
+
+    setFocus: function(cmp, focusable, options) {
+        var me = this,
+            el, dom, data,
+
+            needsTabIndex = function(n) {
+                return !Ext.Array.contains(me.tabIndexWhitelist, n.tagName.toLowerCase())
+                    && n.tabIndex <= 0;
+            };
+
+        options = options || {};
+
+        
+        if (!cmp.rendered) {
+            cmp.on('afterrender', Ext.pass(me.setFocus, arguments, me), me, { single: true });
+            return;
+        }
+
+        el = cmp.getFocusEl();
+        dom = el.dom;
+
+        
+        if ((focusable && !me.focusData[cmp.id]) || (!focusable && me.focusData[cmp.id])) {
+            if (focusable) {
+                data = {
+                    focusFrame: options.focusFrame
+                };
+
+                
+                
+                
+                
+                if (needsTabIndex(dom)) {
+                    data.tabIndex = dom.tabIndex;
+                    dom.tabIndex = -1;
+                }
+
+                el.on({
+                    focus: data.focusFn = Ext.bind(me.onComponentFocus, me, [cmp], 0),
+                    blur: data.blurFn = Ext.bind(me.onComponentBlur, me, [cmp], 0),
+                    scope: me
+                });
+                cmp.on({
+                    hide: me.onComponentHide,
+                    close: me.onComponentHide,
+                    beforedestroy: me.onComponentDestroy,
+                    scope: me
+                });
+
+                me.focusData[cmp.id] = data;
+            } else {
+                data = me.focusData[cmp.id];
+                if ('tabIndex' in data) {
+                    dom.tabIndex = data.tabIndex;
+                }
+                el.un('focus', data.focusFn, me);
+                el.un('blur', data.blurFn, me);
+                cmp.un('hide', me.onComponentHide, me);
+                cmp.un('close', me.onComponentHide, me);
+                cmp.un('beforedestroy', me.onComponentDestroy, me);
+
+                delete me.focusData[cmp.id];
+            }
+        }
+    },
+
+    setFocusAll: function(focusable, options) {
+        var me = this,
+            cmps = Ext.ComponentManager.all.getArray(),
+            len = cmps.length,
+            cmp,
+            i = 0;
+
+        for (; i < len; i++) {
+            me.setFocus(cmps[i], focusable, options);
+        }
+    },
+
+    setupSubscriberKeys: function(container, keys) {
+        var me = this,
+            el = container.getFocusEl(),
+            scope = keys.scope,
+            handlers = {
+                backspace: me.focusLast,
+                enter: me.navigateIn,
+                esc: me.navigateOut,
+                scope: me
+            },
+
+            navSiblings = function(e) {
+                if (me.focusedCmp === container) {
+                    
+                    
+                    
+                    return me.navigateSiblings(e, me, container);
+                } else {
+                    return me.navigateSiblings(e);
+                }
+            };
+
+        Ext.iterate(keys, function(key, cb) {
+            handlers[key] = function(e) {
+                var ret = navSiblings(e);
+
+                if (Ext.isFunction(cb) && cb.call(scope || container, e, ret) === true) {
+                    return true;
+                }
+
+                return ret;
+            };
+        }, me);
+
+        return Ext.create('Ext.util.KeyNav', el, handlers);
+    },
+
+    shouldShowFocusFrame: function(cmp) {
+        var me = this,
+            opts = me.options || {};
+
+        if (!me.focusFrame || !cmp) {
+            return false;
+        }
+
+        
+        if (opts.focusFrame) {
+            return true;
+        }
+
+        if (me.focusData[cmp.id].focusFrame) {
+            return true;
+        }
+
+        return false;
+    },
+
+    
+    subscribe: function(container, options) {
+        var me = this,
+            EA = Ext.Array,
+            data = {},
+            subs = me.subscribers,
+
+            
+            
+            
+            safeSetFocus = function(cmp) {
+                if (cmp.isContainer && !subs.containsKey(cmp.id)) {
+                    EA.forEach(cmp.query('>'), safeSetFocus);
+                    me.setFocus(cmp, true, options);
+                    cmp.on('add', data.onAdd, me);
+                } else if (!cmp.isContainer) {
+                    me.setFocus(cmp, true, options);
+                }
+            };
+
+        
+        if (!container || !container.isContainer) {
+            return;
+        }
+
+        if (!container.rendered) {
+            container.on('afterrender', Ext.pass(me.subscribe, arguments, me), me, { single: true });
+            return;
+        }
+
+        
+        me.initDOM(options);
+
+        
+        data.keyNav = me.setupSubscriberKeys(container, options.keys);
+
+        
+        
+        
+        
+        data.onAdd = function(ct, cmp, idx) {
+            safeSetFocus(cmp);
+        };
+        container.on('beforedestroy', me.unsubscribe, me);
+
+        
+        safeSetFocus(container);
+
+        
+        subs.add(container.id, data);
+    },
+
+    
+    unsubscribe: function(container) {
+        var me = this,
+            EA = Ext.Array,
+            subs = me.subscribers,
+            data,
+
+            
+            
+            
+            safeSetFocus = function(cmp) {
+                if (cmp.isContainer && !subs.containsKey(cmp.id)) {
+                    EA.forEach(cmp.query('>'), safeSetFocus);
+                    me.setFocus(cmp, false);
+                    cmp.un('add', data.onAdd, me);
+                } else if (!cmp.isContainer) {
+                    me.setFocus(cmp, false);
+                }
+            };
+
+        if (!container || !subs.containsKey(container.id)) {
+            return;
+        }
+
+        data = subs.get(container.id);
+        data.keyNav.destroy();
+        container.un('beforedestroy', me.unsubscribe, me);
+        subs.removeAtKey(container.id);
+        safeSetFocus(container);
+        me.removeDOM();
+    }
+});
+
+Ext.define('Ext.toolbar.Toolbar', {
+    extend: 'Ext.container.Container',
+    requires: [
+        'Ext.toolbar.Fill',
+        'Ext.layout.container.HBox',
+        'Ext.layout.container.VBox',
+        'Ext.FocusManager'
+    ],
+    uses: [
+        'Ext.toolbar.Separator'
+    ],
+    alias: 'widget.toolbar',
+    alternateClassName: 'Ext.Toolbar',
+
+    isToolbar: true,
+    baseCls  : Ext.baseCSSPrefix + 'toolbar',
+    ariaRole : 'toolbar',
+
+    defaultType: 'button',
+
+    
+    vertical: false,
+
+    
+
+    
+    enableOverflow: false,
+
+    
+    menuTriggerCls: Ext.baseCSSPrefix + 'toolbar-more-icon',
+    
+    
+    trackMenus: true,
+
+    itemCls: Ext.baseCSSPrefix + 'toolbar-item',
+
+    initComponent: function() {
+        var me = this,
+            keys;
+
+        
+        if (!me.layout && me.enableOverflow) {
+            me.layout = { overflowHandler: 'Menu' };
+        }
+
+        if (me.dock === 'right' || me.dock === 'left') {
+            me.vertical = true;
+        }
+
+        me.layout = Ext.applyIf(Ext.isString(me.layout) ? {
+            type: me.layout
+        } : me.layout || {}, {
+            type: me.vertical ? 'vbox' : 'hbox',
+            align: me.vertical ? 'stretchmax' : 'middle',
+            clearInnerCtOnLayout: true
+        });
+
+        if (me.vertical) {
+            me.addClsWithUI('vertical');
+        }
+
+        
+        if (me.ui === 'footer') {
+            me.ignoreBorderManagement = true;
+        }
+
+        me.callParent();
+
+        
+        me.addEvents('overflowchange');
+
+        
+        keys = me.vertical ? ['up', 'down'] : ['left', 'right'];
+        Ext.FocusManager.subscribe(me, {
+            keys: keys
+        });
+    },
+
+    getRefItems: function(deep) {
+        var me = this,
+            items = me.callParent(arguments),
+            layout = me.layout,
+            handler;
+
+        if (deep && me.enableOverflow) {
+            handler = layout.overflowHandler;
+            if (handler && handler.menu) {
+                items = items.concat(handler.menu.getRefItems(deep));
+            }
+        }
+        return items;
+    },
+
+    
+
+    
+    lookupComponent: function(c) {
+        if (Ext.isString(c)) {
+            var shortcut = Ext.toolbar.Toolbar.shortcuts[c];
+            if (shortcut) {
+                c = {
+                    xtype: shortcut
+                };
+            } else {
+                c = {
+                    xtype: 'tbtext',
+                    text: c
+                };
+            }
+            this.applyDefaults(c);
+        }
+        return this.callParent(arguments);
+    },
+
+    
+    applyDefaults: function(c) {
+        if (!Ext.isString(c)) {
+            c = this.callParent(arguments);
+            var d = this.internalDefaults;
+            if (c.events) {
+                Ext.applyIf(c.initialConfig, d);
+                Ext.apply(c, d);
+            } else {
+                Ext.applyIf(c, d);
+            }
+        }
+        return c;
+    },
+
+    
+    trackMenu: function(item, remove) {
+        if (this.trackMenus && item.menu) {
+            var method = remove ? 'mun' : 'mon',
+                me = this;
+
+            me[method](item, 'mouseover', me.onButtonOver, me);
+            me[method](item, 'menushow', me.onButtonMenuShow, me);
+            me[method](item, 'menuhide', me.onButtonMenuHide, me);
+        }
+    },
+
+    
+    constructButton: function(item) {
+        return item.events ? item : this.createComponent(item, item.split ? 'splitbutton' : this.defaultType);
+    },
+
+    
+    onBeforeAdd: function(component) {
+        if (component.is('field') || (component.is('button') && this.ui != 'footer')) {
+            component.ui = component.ui + '-toolbar';
+        }
+
+        
+        if (component instanceof Ext.toolbar.Separator) {
+            component.setUI((this.vertical) ? 'vertical' : 'horizontal');
+        }
+
+        this.callParent(arguments);
+    },
+
+    
+    onAdd: function(component) {
+        this.callParent(arguments);
+
+        this.trackMenu(component);
+        if (this.disabled) {
+            component.disable();
+        }
+    },
+
+    
+    onRemove: function(c) {
+        this.callParent(arguments);
+        this.trackMenu(c, true);
+    },
+
+    
+    onButtonOver: function(btn){
+        if (this.activeMenuBtn && this.activeMenuBtn != btn) {
+            this.activeMenuBtn.hideMenu();
+            btn.showMenu();
+            this.activeMenuBtn = btn;
+        }
+    },
+
+    
+    onButtonMenuShow: function(btn) {
+        this.activeMenuBtn = btn;
+    },
+
+    
+    onButtonMenuHide: function(btn) {
+        delete this.activeMenuBtn;
+    }
+}, function() {
+    this.shortcuts = {
+        '-' : 'tbseparator',
+        ' ' : 'tbspacer',
+        '->': 'tbfill'
+    };
+});
+
+Ext.define('Ext.panel.AbstractPanel', {
+
+    
+
+    extend: 'Ext.container.Container',
+
+    requires: ['Ext.util.MixedCollection', 'Ext.Element', 'Ext.toolbar.Toolbar'],
+
+    
+
+    
+    baseCls : Ext.baseCSSPrefix + 'panel',
+
+    
+
+    
+
+    
+
+    
+
+    isPanel: true,
+
+    componentLayout: 'dock',
+
+    
+    defaultDockWeights: { top: 1, left: 3, right: 5, bottom: 7 },
+
+    renderTpl: [
+        '<div id="{id}-body" class="{baseCls}-body<tpl if="bodyCls"> {bodyCls}</tpl>',
+            ' {baseCls}-body-{ui}<tpl if="uiCls">',
+                '<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl>',
+            '</tpl>"<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>>',
+        '</div>'
+    ],
+
+    
+    
+
+    border: true,
+
+    initComponent : function() {
+        var me = this;
+
+        me.addEvents(
+            
+            'bodyresize'
+            
+            
+            
+            
+        );
+
+        me.addChildEls('body');
+
+        
+        
+
+        if (me.frame && me.border && me.bodyBorder === undefined) {
+            me.bodyBorder = false;
+        }
+        if (me.frame && me.border && (me.bodyBorder === false || me.bodyBorder === 0)) {
+            me.manageBodyBorders = true;
+        }
+
+        me.callParent();
+    },
+
+    
+    initItems : function() {
+        var me = this,
+            items = me.dockedItems;
+
+        me.callParent();
+        me.dockedItems = Ext.create('Ext.util.MixedCollection', false, me.getComponentId);
+        if (items) {
+            me.addDocked(items);
+        }
+    },
+
+    
+    getDockedComponent: function(comp) {
+        if (Ext.isObject(comp)) {
+            comp = comp.getItemId();
+        }
+        return this.dockedItems.get(comp);
+    },
+
+    
+    getComponent: function(comp) {
+        var component = this.callParent(arguments);
+        if (component === undefined && !Ext.isNumber(comp)) {
+            
+            component = this.getDockedComponent(comp);
+        }
+        return component;
+    },
+
+    
+    initBodyStyles: function() {
+        var me = this,
+            bodyStyle = me.bodyStyle,
+            styles = [],
+            Element = Ext.Element,
+            prop;
+
+        if (Ext.isFunction(bodyStyle)) {
+            bodyStyle = bodyStyle();
+        }
+        if (Ext.isString(bodyStyle)) {
+            styles = bodyStyle.split(';');
+        } else {
+            for (prop in bodyStyle) {
+                if (bodyStyle.hasOwnProperty(prop)) {
+                    styles.push(prop + ':' + bodyStyle[prop]);
+                }
+            }
+        }
+
+        if (me.bodyPadding !== undefined) {
+            styles.push('padding: ' + Element.unitizeBox((me.bodyPadding === true) ? 5 : me.bodyPadding));
+        }
+        if (me.frame && me.bodyBorder) {
+            if (!Ext.isNumber(me.bodyBorder)) {
+                me.bodyBorder = 1;
+            }
+            styles.push('border-width: ' + Element.unitizeBox(me.bodyBorder));
+        }
+        delete me.bodyStyle;
+        return styles.length ? styles.join(';') : undefined;
+    },
+
+    
+    initBodyCls: function() {
+        var me = this,
+            cls = '',
+            bodyCls = me.bodyCls;
+
+        if (bodyCls) {
+            Ext.each(bodyCls, function(v) {
+                cls += " " + v;
+            });
+            delete me.bodyCls;
+        }
+        return cls.length > 0 ? cls : undefined;
+    },
+
+    
+    initRenderData: function() {
+        return Ext.applyIf(this.callParent(), {
+            bodyStyle: this.initBodyStyles(),
+            bodyCls: this.initBodyCls()
+        });
+    },
+
+    
+    addDocked : function(items, pos) {
+        var me = this,
+            i = 0,
+            item, length;
+
+        items = me.prepareItems(items);
+        length = items.length;
+
+        for (; i < length; i++) {
+            item = items[i];
+            item.dock = item.dock || 'top';
+
+            
+            if (me.border === false) {
+                
+            }
+
+            if (pos !== undefined) {
+                me.dockedItems.insert(pos + i, item);
+            }
+            else {
+                me.dockedItems.add(item);
+            }
+            item.onAdded(me, i);
+            me.onDockedAdd(item);
+        }
+
+        
+        me.componentLayout.childrenChanged = true;
+        if (me.rendered && !me.suspendLayout) {
+            me.doComponentLayout();
+        }
+        return items;
+    },
+
+    
+    onDockedAdd : Ext.emptyFn,
+    onDockedRemove : Ext.emptyFn,
+
+    
+    insertDocked : function(pos, items) {
+        this.addDocked(items, pos);
+    },
+
+    
+    removeDocked : function(item, autoDestroy) {
+        var me = this,
+            layout,
+            hasLayout;
+
+        if (!me.dockedItems.contains(item)) {
+            return item;
+        }
+
+        layout = me.componentLayout;
+        hasLayout = layout && me.rendered;
+
+        if (hasLayout) {
+            layout.onRemove(item);
+        }
+
+        me.dockedItems.remove(item);
+        item.onRemoved();
+        me.onDockedRemove(item);
+
+        if (autoDestroy === true || (autoDestroy !== false && me.autoDestroy)) {
+            item.destroy();
+        } else if (hasLayout) {
+            
+            layout.afterRemove(item);    
+        }
+
+
+        
+        me.componentLayout.childrenChanged = true;
+        if (!me.destroying && !me.suspendLayout) {
+            me.doComponentLayout();
+        }
+
+        return item;
+    },
+
+    
+    getDockedItems : function(cqSelector) {
+        var me = this,
+            defaultWeight = me.defaultDockWeights,
+            dockedItems;
+
+        if (me.dockedItems && me.dockedItems.items.length) {
+            
+            if (cqSelector) {
+                dockedItems = Ext.ComponentQuery.query(cqSelector, me.dockedItems.items);
+            } else {
+                dockedItems = me.dockedItems.items.slice();
+            }
+
+            Ext.Array.sort(dockedItems, function(a, b) {
+                
+                var aw = a.weight || defaultWeight[a.dock],
+                    bw = b.weight || defaultWeight[b.dock];
+                if (Ext.isNumber(aw) && Ext.isNumber(bw)) {
+                    return aw - bw;
+                }
+                return 0;
+            });
+
+            return dockedItems;
+        }
+        return [];
+    },
+
+    
+    addUIClsToElement: function(cls, force) {
+        var me = this,
+            result = me.callParent(arguments),
+            classes = [Ext.baseCSSPrefix + cls, me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls],
+            array, i;
+
+        if (!force && me.rendered) {
+            if (me.bodyCls) {
+                me.body.addCls(me.bodyCls);
+            } else {
+                me.body.addCls(classes);
+            }
+        } else {
+            if (me.bodyCls) {
+                array = me.bodyCls.split(' ');
+
+                for (i = 0; i < classes.length; i++) {
+                    if (!Ext.Array.contains(array, classes[i])) {
+                        array.push(classes[i]);
+                    }
+                }
+
+                me.bodyCls = array.join(' ');
+            } else {
+                me.bodyCls = classes.join(' ');
+            }
+        }
+
+        return result;
+    },
+
+    
+    removeUIClsFromElement: function(cls, force) {
+        var me = this,
+            result = me.callParent(arguments),
+            classes = [Ext.baseCSSPrefix + cls, me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls],
+            array, i;
+
+        if (!force && me.rendered) {
+            if (me.bodyCls) {
+                me.body.removeCls(me.bodyCls);
+            } else {
+                me.body.removeCls(classes);
+            }
+        } else {
+            if (me.bodyCls) {
+                array = me.bodyCls.split(' ');
+
+                for (i = 0; i < classes.length; i++) {
+                    Ext.Array.remove(array, classes[i]);
+                }
+
+                me.bodyCls = array.join(' ');
+            }
+        }
+
+        return result;
+    },
+
+    
+    addUIToElement: function(force) {
+        var me = this,
+            cls = me.baseCls + '-body-' + me.ui,
+            array;
+
+        me.callParent(arguments);
+
+        if (!force && me.rendered) {
+            if (me.bodyCls) {
+                me.body.addCls(me.bodyCls);
+            } else {
+                me.body.addCls(cls);
+            }
+        } else {
+            if (me.bodyCls) {
+                array = me.bodyCls.split(' ');
+
+                if (!Ext.Array.contains(array, cls)) {
+                    array.push(cls);
+                }
+
+                me.bodyCls = array.join(' ');
+            } else {
+                me.bodyCls = cls;
+            }
+        }
+    },
+
+    
+    removeUIFromElement: function() {
+        var me = this,
+            cls = me.baseCls + '-body-' + me.ui,
+            array;
+
+        me.callParent(arguments);
+
+        if (me.rendered) {
+            if (me.bodyCls) {
+                me.body.removeCls(me.bodyCls);
+            } else {
+                me.body.removeCls(cls);
+            }
+        } else {
+            if (me.bodyCls) {
+                array = me.bodyCls.split(' ');
+                Ext.Array.remove(array, cls);
+                me.bodyCls = array.join(' ');
+            } else {
+                me.bodyCls = cls;
+            }
+        }
+    },
+
+    
+    getTargetEl : function() {
+        return this.body;
+    },
+
+    getRefItems: function(deep) {
+        var items = this.callParent(arguments),
+            
+            dockedItems = this.getDockedItems(deep ? '*,* *' : undefined),
+            ln = dockedItems.length,
+            i = 0,
+            item;
+
+        
+        for (; i < ln; i++) {
+            item = dockedItems[i];
+            if (item.dock === 'right' || item.dock === 'bottom') {
+                break;
+            }
+        }
+
+        
+        
+        
+        return Ext.Array.splice(dockedItems, 0, i).concat(items).concat(dockedItems);
+    },
+
+    beforeDestroy: function(){
+        var docked = this.dockedItems,
+            c;
+
+        if (docked) {
+            while ((c = docked.first())) {
+                this.removeDocked(c, true);
+            }
+        }
+        this.callParent();
+    },
+
+    setBorder: function(border) {
+        var me = this;
+        me.border = (border !== undefined) ? border : true;
+        if (me.rendered) {
+            me.doComponentLayout();
+        }
+    }
+});
+
+Ext.define('Ext.panel.Header', {
+    extend: 'Ext.container.Container',
+    uses: ['Ext.panel.Tool', 'Ext.draw.Component', 'Ext.util.CSS'],
+    alias: 'widget.header',
+
+    isHeader       : true,
+    defaultType    : 'tool',
+    indicateDrag   : false,
+    weight         : -1,
+
+    renderTpl: [
+        '<div id="{id}-body" class="{baseCls}-body<tpl if="bodyCls"> {bodyCls}</tpl>',
+        '<tpl if="uiCls">',
+            '<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl>',
+        '</tpl>"',
+        '<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>></div>'],
+
+    
+
+    
+
+    initComponent: function() {
+        var me = this,
+            ruleStyle,
+            rule,
+            style,
+            titleTextEl,
+            ui;
+
+        me.indicateDragCls = me.baseCls + '-draggable';
+        me.title = me.title || ' ';
+        me.tools = me.tools || [];
+        me.items = me.items || [];
+        me.orientation = me.orientation || 'horizontal';
+        me.dock = (me.dock) ? me.dock : (me.orientation == 'horizontal') ? 'top' : 'left';
+
+        
+        
+        me.addClsWithUI(me.orientation);
+        me.addClsWithUI(me.dock);
+
+        me.addChildEls('body');
+
+        
+        if (!Ext.isEmpty(me.iconCls)) {
+            me.initIconCmp();
+            me.items.push(me.iconCmp);
+        }
+
+        
+        if (me.orientation == 'vertical') {
+            
+            if (Ext.isIE6 || Ext.isIE7) {
+                me.width = this.width || 24;
+            } else if (Ext.isIEQuirks) {
+                me.width = this.width || 25;
+            }
+
+            me.layout = {
+                type : 'vbox',
+                align: 'center',
+                clearInnerCtOnLayout: true,
+                bindToOwnerCtContainer: false
+            };
+            me.textConfig = {
+                cls: me.baseCls + '-text',
+                type: 'text',
+                text: me.title,
+                rotate: {
+                    degrees: 90
+                }
+            };
+            ui = me.ui;
+            if (Ext.isArray(ui)) {
+                ui = ui[0];
+            }
+            ruleStyle = '.' + me.baseCls + '-text-' + ui;
+            if (Ext.scopeResetCSS) {
+                ruleStyle = '.' + Ext.baseCSSPrefix + 'reset ' + ruleStyle;
+            }
+            rule = Ext.util.CSS.getRule(ruleStyle);
+            if (rule) {
+                style = rule.style;
+            }
+            if (style) {
+                Ext.apply(me.textConfig, {
+                    'font-family': style.fontFamily,
+                    'font-weight': style.fontWeight,
+                    'font-size': style.fontSize,
+                    fill: style.color
+                });
+            }
+            me.titleCmp = Ext.create('Ext.draw.Component', {
+                ariaRole  : 'heading',
+                focusable: false,
+                viewBox: false,
+                flex : 1,
+                autoSize: true,
+                margins: '5 0 0 0',
+                items: [ me.textConfig ],
+                
+                
+                renderSelectors: {
+                    textEl: '.' + me.baseCls + '-text'
+                }
+            });
+        } else {
+            me.layout = {
+                type : 'hbox',
+                align: 'middle',
+                clearInnerCtOnLayout: true,
+                bindToOwnerCtContainer: false
+            };
+            me.titleCmp = Ext.create('Ext.Component', {
+                xtype     : 'component',
+                ariaRole  : 'heading',
+                focusable: false,
+                flex : 1,
+                cls: me.baseCls + '-text-container',
+                renderTpl : [
+                    '<span id="{id}-textEl" class="{cls}-text {cls}-text-{ui}">{title}</span>'
+                ],
+                renderData: {
+                    title: me.title,
+                    cls  : me.baseCls,
+                    ui   : me.ui
+                },
+                childEls: ['textEl']
+            });
+        }
+        me.items.push(me.titleCmp);
+
+        
+        me.items = me.items.concat(me.tools);
+        this.callParent();
+    },
+
+    initIconCmp: function() {
+        this.iconCmp = Ext.create('Ext.Component', {
+            focusable: false,
+            renderTpl : [
+                '<img id="{id}-iconEl" alt="" src="{blank}" class="{cls}-icon {iconCls}"/>'
+            ],
+            renderData: {
+                blank  : Ext.BLANK_IMAGE_URL,
+                cls    : this.baseCls,
+                iconCls: this.iconCls,
+                orientation: this.orientation
+            },
+            childEls: ['iconEl'],
+            iconCls: this.iconCls
+        });
+    },
+
+    afterRender: function() {
+        var me = this;
+
+        me.el.unselectable();
+        if (me.indicateDrag) {
+            me.el.addCls(me.indicateDragCls);
+        }
+        me.mon(me.el, {
+            click: me.onClick,
+            scope: me
+        });
+        me.callParent();
+    },
+
+    afterLayout: function() {
+        var me = this;
+        me.callParent(arguments);
+
+        
+        if (Ext.isIE7) {
+            me.el.repaint();
+        }
+    },
+
+    
+    addUIClsToElement: function(cls, force) {
+        var me = this,
+            result = me.callParent(arguments),
+            classes = [me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls],
+            array, i;
+
+        if (!force && me.rendered) {
+            if (me.bodyCls) {
+                me.body.addCls(me.bodyCls);
+            } else {
+                me.body.addCls(classes);
+            }
+        } else {
+            if (me.bodyCls) {
+                array = me.bodyCls.split(' ');
+
+                for (i = 0; i < classes.length; i++) {
+                    if (!Ext.Array.contains(array, classes[i])) {
+                        array.push(classes[i]);
+                    }
+                }
+
+                me.bodyCls = array.join(' ');
+            } else {
+                me.bodyCls = classes.join(' ');
+            }
+        }
+
+        return result;
+    },
+
+    
+    removeUIClsFromElement: function(cls, force) {
+        var me = this,
+            result = me.callParent(arguments),
+            classes = [me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls],
+            array, i;
+
+        if (!force && me.rendered) {
+            if (me.bodyCls) {
+                me.body.removeCls(me.bodyCls);
+            } else {
+                me.body.removeCls(classes);
+            }
+        } else {
+            if (me.bodyCls) {
+                array = me.bodyCls.split(' ');
+
+                for (i = 0; i < classes.length; i++) {
+                    Ext.Array.remove(array, classes[i]);
+                }
+
+                me.bodyCls = array.join(' ');
+            }
+        }
+
+       return result;
+    },
+
+    
+    addUIToElement: function(force) {
+        var me = this,
+            array, cls;
+
+        me.callParent(arguments);
+
+        cls = me.baseCls + '-body-' + me.ui;
+        if (!force && me.rendered) {
+            if (me.bodyCls) {
+                me.body.addCls(me.bodyCls);
+            } else {
+                me.body.addCls(cls);
+            }
+        } else {
+            if (me.bodyCls) {
+                array = me.bodyCls.split(' ');
+
+                if (!Ext.Array.contains(array, cls)) {
+                    array.push(cls);
+                }
+
+                me.bodyCls = array.join(' ');
+            } else {
+                me.bodyCls = cls;
+            }
+        }
+
+        if (!force && me.titleCmp && me.titleCmp.rendered && me.titleCmp.textEl) {
+            me.titleCmp.textEl.addCls(me.baseCls + '-text-' + me.ui);
+        }
+    },
+
+    
+    removeUIFromElement: function() {
+        var me = this,
+            array, cls;
+
+        me.callParent(arguments);
+
+        cls = me.baseCls + '-body-' + me.ui;
+        if (me.rendered) {
+            if (me.bodyCls) {
+                me.body.removeCls(me.bodyCls);
+            } else {
+                me.body.removeCls(cls);
+            }
+        } else {
+            if (me.bodyCls) {
+                array = me.bodyCls.split(' ');
+                Ext.Array.remove(array, cls);
+                me.bodyCls = array.join(' ');
+            } else {
+                me.bodyCls = cls;
+            }
+        }
+
+        if (me.titleCmp && me.titleCmp.rendered && me.titleCmp.textEl) {
+            me.titleCmp.textEl.removeCls(me.baseCls + '-text-' + me.ui);
+        }
+    },
+
+    onClick: function(e) {
+        if (!e.getTarget(Ext.baseCSSPrefix + 'tool')) {
+            this.fireEvent('click', e);
+        }
+    },
+
+    getTargetEl: function() {
+        return this.body || this.frameBody || this.el;
+    },
+
+    
+    setTitle: function(title) {
+        var me = this;
+        if (me.rendered) {
+            if (me.titleCmp.rendered) {
+                if (me.titleCmp.surface) {
+                    me.title = title || '';
+                    var sprite = me.titleCmp.surface.items.items[0],
+                        surface = me.titleCmp.surface;
+
+                    surface.remove(sprite);
+                    me.textConfig.type = 'text';
+                    me.textConfig.text = title;
+                    sprite = surface.add(me.textConfig);
+                    sprite.setAttributes({
+                        rotate: {
+                            degrees: 90
+                        }
+                    }, true);
+                    me.titleCmp.autoSizeSurface();
+                } else {
+                    me.title = title || ' ';
+                    me.titleCmp.textEl.update(me.title);
+                }
+            } else {
+                me.titleCmp.on({
+                    render: function() {
+                        me.setTitle(title);
+                    },
+                    single: true
+                });
+            }
+        } else {
+            me.on({
+                render: function() {
+                    me.layout.layout();
+                    me.setTitle(title);
+                },
+                single: true
+            });
+        }
+    },
+
+    
+    setIconCls: function(cls) {
+        var me = this,
+            isEmpty = !cls || !cls.length,
+            iconCmp = me.iconCmp,
+            el;
+        
+        me.iconCls = cls;
+        if (!me.iconCmp && !isEmpty) {
+            me.initIconCmp();
+            me.insert(0, me.iconCmp);
+        } else if (iconCmp) {
+            if (isEmpty) {
+                me.iconCmp.destroy();
+            } else {
+                el = iconCmp.iconEl;
+                el.removeCls(iconCmp.iconCls);
+                el.addCls(cls);
+                iconCmp.iconCls = cls;
+            }
+        }
+    },
+
+    
+    addTool: function(tool) {
+        this.tools.push(this.add(tool));
+    },
+
+    
+    onAdd: function(component, index) {
+        this.callParent([arguments]);
+        if (component instanceof Ext.panel.Tool) {
+            component.bindTo(this.ownerCt);
+            this.tools[component.type] = component;
+        }
+    }
+});
+
+
+Ext.define('Ext.fx.target.Element', {
+
+    
+    
+    extend: 'Ext.fx.target.Target',
+    
+    
+
+    type: 'element',
+
+    getElVal: function(el, attr, val) {
+        if (val == undefined) {
+            if (attr === 'x') {
+                val = el.getX();
+            }
+            else if (attr === 'y') {
+                val = el.getY();
+            }
+            else if (attr === 'scrollTop') {
+                val = el.getScroll().top;
+            }
+            else if (attr === 'scrollLeft') {
+                val = el.getScroll().left;
+            }
+            else if (attr === 'height') {
+                val = el.getHeight();
+            }
+            else if (attr === 'width') {
+                val = el.getWidth();
+            }
+            else {
+                val = el.getStyle(attr);
+            }
+        }
+        return val;
+    },
+
+    getAttr: function(attr, val) {
+        var el = this.target;
+        return [[ el, this.getElVal(el, attr, val)]];
+    },
+
+    setAttr: function(targetData) {
+        var target = this.target,
+            ln = targetData.length,
+            attrs, attr, o, i, j, ln2, element, value;
+        for (i = 0; i < ln; i++) {
+            attrs = targetData[i].attrs;
+            for (attr in attrs) {
+                if (attrs.hasOwnProperty(attr)) {
+                    ln2 = attrs[attr].length;
+                    for (j = 0; j < ln2; j++) {
+                        o = attrs[attr][j];
+                        element = o[0];
+                        value = o[1];
+                        if (attr === 'x') {
+                            element.setX(value);
+                        }
+                        else if (attr === 'y') {
+                            element.setY(value);
+                        }
+                        else if (attr === 'scrollTop') {
+                            element.scrollTo('top', value);
+                        }
+                        else if (attr === 'scrollLeft') {
+                            element.scrollTo('left',value);
+                        }
+                        else {
+                            element.setStyle(attr, value);
+                        }
+                    }
+                }
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.fx.target.CompositeElement', {
+
+    
+
+    extend: 'Ext.fx.target.Element',
+
+    
+
+    isComposite: true,
+    
+    constructor: function(target) {
+        target.id = target.id || Ext.id(null, 'ext-composite-');
+        this.callParent([target]);
+    },
+
+    getAttr: function(attr, val) {
+        var out = [],
+            target = this.target;
+        target.each(function(el) {
+            out.push([el, this.getElVal(el, attr, val)]);
+        }, this);
+        return out;
+    }
+});
+
+
+
+Ext.define('Ext.fx.Manager', {
+
+    
+
+    singleton: true,
+
+    requires: ['Ext.util.MixedCollection',
+               'Ext.fx.target.Element',
+               'Ext.fx.target.CompositeElement',
+               'Ext.fx.target.Sprite',
+               'Ext.fx.target.CompositeSprite',
+               'Ext.fx.target.Component'],
+
+    mixins: {
+        queue: 'Ext.fx.Queue'
+    },
+
+    
+
+    constructor: function() {
+        this.items = Ext.create('Ext.util.MixedCollection');
+        this.mixins.queue.constructor.call(this);
+
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+    },
+
+    
+    interval: 16,
+
+    
+    forceJS: true,
+
+    
+    createTarget: function(target) {
+        var me = this,
+            useCSS3 = !me.forceJS && Ext.supports.Transitions,
+            targetObj;
+
+        me.useCSS3 = useCSS3;
+
+        
+        if (Ext.isString(target)) {
+            target = Ext.get(target);
+        }
+        
+        if (target && target.tagName) {
+            target = Ext.get(target);
+            targetObj = Ext.create('Ext.fx.target.' + 'Element' + (useCSS3 ? 'CSS' : ''), target);
+            me.targets.add(targetObj);
+            return targetObj;
+        }
+        if (Ext.isObject(target)) {
+            
+            if (target.dom) {
+                targetObj = Ext.create('Ext.fx.target.' + 'Element' + (useCSS3 ? 'CSS' : ''), target);
+            }
+            
+            else if (target.isComposite) {
+                targetObj = Ext.create('Ext.fx.target.' + 'CompositeElement' + (useCSS3 ? 'CSS' : ''), target);
+            }
+            
+            else if (target.isSprite) {
+                targetObj = Ext.create('Ext.fx.target.Sprite', target);
+            }
+            
+            else if (target.isCompositeSprite) {
+                targetObj = Ext.create('Ext.fx.target.CompositeSprite', target);
+            }
+            
+            else if (target.isComponent) {
+                targetObj = Ext.create('Ext.fx.target.Component', target);
+            }
+            else if (target.isAnimTarget) {
+                return target;
+            }
+            else {
+                return null;
+            }
+            me.targets.add(targetObj);
+            return targetObj;
+        }
+        else {
+            return null;
+        }
+    },
+
+    
+    addAnim: function(anim) {
+        var items = this.items,
+            task = this.task;
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+
+        items.add(anim);
+
+        
+        if (!task && items.length) {
+            task = this.task = {
+                run: this.runner,
+                interval: this.interval,
+                scope: this
+            };
+            Ext.TaskManager.start(task);
+        }
+
+        
+        
+        
+        
+    },
+
+    
+    removeAnim: function(anim) {
+        
+        var items = this.items,
+            task = this.task;
+        items.remove(anim);
+        
+        if (task && !items.length) {
+            Ext.TaskManager.stop(task);
+            delete this.task;
+        }
+    },
+
+    
+    startingFilter: function(o) {
+        return o.paused === false && o.running === false && o.iterations > 0;
+    },
+
+    
+    runningFilter: function(o) {
+        return o.paused === false && o.running === true && o.isAnimator !== true;
+    },
+
+    
+    runner: function() {
+        var me = this,
+            items = me.items;
+
+        me.targetData = {};
+        me.targetArr = {};
+
+        
+        me.timestamp = new Date();
+
+        
+        items.filterBy(me.startingFilter).each(me.startAnim, me);
+
+        
+        items.filterBy(me.runningFilter).each(me.runAnim, me);
+
+        
+        me.applyPendingAttrs();
+    },
+
+    
+    startAnim: function(anim) {
+        anim.start(this.timestamp);
+    },
+
+    
+    runAnim: function(anim) {
+        if (!anim) {
+            return;
+        }
+        var me = this,
+            targetId = anim.target.getId(),
+            useCSS3 = me.useCSS3 && anim.target.type == 'element',
+            elapsedTime = me.timestamp - anim.startTime,
+            target, o;
+
+        this.collectTargetData(anim, elapsedTime, useCSS3);
+
+        
+        
+        if (useCSS3) {
+            
+            anim.target.setAttr(me.targetData[targetId], true);
+
+            
+            me.targetData[targetId] = [];
+            me.collectTargetData(anim, anim.duration, useCSS3);
+
+            
+            anim.paused = true;
+
+            target = anim.target.target;
+            
+            if (anim.target.isComposite) {
+                target = anim.target.target.last();
+            }
+
+            
+            o = {};
+            o[Ext.supports.CSS3TransitionEnd] = anim.lastFrame;
+            o.scope = anim;
+            o.single = true;
+            target.on(o);
+        }
+        
+        else if (elapsedTime >= anim.duration) {
+            me.applyPendingAttrs(true);
+            delete me.targetData[targetId];
+            delete me.targetArr[targetId];
+            anim.lastFrame();
+        }
+    },
+
+    
+    collectTargetData: function(anim, elapsedTime, useCSS3) {
+        var targetId = anim.target.getId(),
+            targetData = this.targetData[targetId],
+            data;
+        
+        if (!targetData) {
+            targetData = this.targetData[targetId] = [];
+            this.targetArr[targetId] = anim.target;
+        }
+
+        data = {
+            duration: anim.duration,
+            easing: (useCSS3 && anim.reverse) ? anim.easingFn.reverse().toCSS3() : anim.easing,
+            attrs: {}
+        };
+        Ext.apply(data.attrs, anim.runAnim(elapsedTime));
+        targetData.push(data);
+    },
+
+    
+    applyPendingAttrs: function(isLastFrame) {
+        var targetData = this.targetData,
+            targetArr = this.targetArr,
+            targetId;
+        for (targetId in targetData) {
+            if (targetData.hasOwnProperty(targetId)) {
+                targetArr[targetId].setAttr(targetData[targetId], false, isLastFrame);
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.fx.Animator', {
+
+    
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    requires: ['Ext.fx.Manager'],
+
+    
+
+    isAnimator: true,
+
+    
+    duration: 250,
+
+    
+    delay: 0,
+
+    
+    delayStart: 0,
+
+    
+    dynamic: false,
+
+    
+    easing: 'ease',
+
+    
+    running: false,
+
+    
+    paused: false,
+
+    
+    damper: 1,
+
+    
+    iterations: 1,
+
+    
+    currentIteration: 0,
+
+    
+    keyframeStep: 0,
+
+    
+    animKeyFramesRE: /^(from|to|\d+%?)$/,
+
+    
+
+     
+    constructor: function(config) {
+        var me = this;
+        config = Ext.apply(me, config || {});
+        me.config = config;
+        me.id = Ext.id(null, 'ext-animator-');
+        me.addEvents(
+            
+            'beforeanimate',
+            
+            'keyframe',
+            
+            'afteranimate'
+        );
+        me.mixins.observable.constructor.call(me, config);
+        me.timeline = [];
+        me.createTimeline(me.keyframes);
+        if (me.target) {
+            me.applyAnimator(me.target);
+            Ext.fx.Manager.addAnim(me);
+        }
+    },
+
+    
+    sorter: function (a, b) {
+        return a.pct - b.pct;
+    },
+
+    
+    createTimeline: function(keyframes) {
+        var me = this,
+            attrs = [],
+            to = me.to || {},
+            duration = me.duration,
+            prevMs, ms, i, ln, pct, anim, nextAnim, attr;
+
+        for (pct in keyframes) {
+            if (keyframes.hasOwnProperty(pct) && me.animKeyFramesRE.test(pct)) {
+                attr = {attrs: Ext.apply(keyframes[pct], to)};
+                
+                if (pct == "from") {
+                    pct = 0;
+                }
+                else if (pct == "to") {
+                    pct = 100;
+                }
+                
+                attr.pct = parseInt(pct, 10);
+                attrs.push(attr);
+            }
+        }
+        
+        Ext.Array.sort(attrs, me.sorter);
+        
+        
+        
+        
+
+        ln = attrs.length;
+        for (i = 0; i < ln; i++) {
+            prevMs = (attrs[i - 1]) ? duration * (attrs[i - 1].pct / 100) : 0;
+            ms = duration * (attrs[i].pct / 100);
+            me.timeline.push({
+                duration: ms - prevMs,
+                attrs: attrs[i].attrs
+            });
+        }
+    },
+
+    
+    applyAnimator: function(target) {
+        var me = this,
+            anims = [],
+            timeline = me.timeline,
+            reverse = me.reverse,
+            ln = timeline.length,
+            anim, easing, damper, initial, attrs, lastAttrs, i;
+
+        if (me.fireEvent('beforeanimate', me) !== false) {
+            for (i = 0; i < ln; i++) {
+                anim = timeline[i];
+                attrs = anim.attrs;
+                easing = attrs.easing || me.easing;
+                damper = attrs.damper || me.damper;
+                delete attrs.easing;
+                delete attrs.damper;
+                anim = Ext.create('Ext.fx.Anim', {
+                    target: target,
+                    easing: easing,
+                    damper: damper,
+                    duration: anim.duration,
+                    paused: true,
+                    to: attrs
+                });
+                anims.push(anim);
+            }
+            me.animations = anims;
+            me.target = anim.target;
+            for (i = 0; i < ln - 1; i++) {
+                anim = anims[i];
+                anim.nextAnim = anims[i + 1];
+                anim.on('afteranimate', function() {
+                    this.nextAnim.paused = false;
+                });
+                anim.on('afteranimate', function() {
+                    this.fireEvent('keyframe', this, ++this.keyframeStep);
+                }, me);
+            }
+            anims[ln - 1].on('afteranimate', function() {
+                this.lastFrame();
+            }, me);
+        }
+    },
+
+    
+    start: function(startTime) {
+        var me = this,
+            delay = me.delay,
+            delayStart = me.delayStart,
+            delayDelta;
+        if (delay) {
+            if (!delayStart) {
+                me.delayStart = startTime;
+                return;
+            }
+            else {
+                delayDelta = startTime - delayStart;
+                if (delayDelta < delay) {
+                    return;
+                }
+                else {
+                    
+                    startTime = new Date(delayStart.getTime() + delay);
+                }
+            }
+        }
+        if (me.fireEvent('beforeanimate', me) !== false) {
+            me.startTime = startTime;
+            me.running = true;
+            me.animations[me.keyframeStep].paused = false;
+        }
+    },
+
+    
+    lastFrame: function() {
+        var me = this,
+            iter = me.iterations,
+            iterCount = me.currentIteration;
+
+        iterCount++;
+        if (iterCount < iter) {
+            me.startTime = new Date();
+            me.currentIteration = iterCount;
+            me.keyframeStep = 0;
+            me.applyAnimator(me.target);
+            me.animations[me.keyframeStep].paused = false;
+        }
+        else {
+            me.currentIteration = 0;
+            me.end();
+        }
+    },
+
+    
+    end: function() {
+        var me = this;
+        me.fireEvent('afteranimate', me, me.startTime, new Date() - me.startTime);
+    }
+});
+
+Ext.ns('Ext.fx');
+
+Ext.require('Ext.fx.CubicBezier', function() {
+    var math = Math,
+        pi = math.PI,
+        pow = math.pow,
+        sin = math.sin,
+        sqrt = math.sqrt,
+        abs = math.abs,
+        backInSeed = 1.70158;
+    Ext.fx.Easing = {
+        
+        
+        
+        
+        
+        
+        
+        
+    };
+
+    Ext.apply(Ext.fx.Easing, {
+        linear: function(n) {
+            return n;
+        },
+        ease: function(n) {
+            var q = 0.07813 - n / 2,
+                alpha = -0.25,
+                Q = sqrt(0.0066 + q * q),
+                x = Q - q,
+                X = pow(abs(x), 1/3) * (x < 0 ? -1 : 1),
+                y = -Q - q,
+                Y = pow(abs(y), 1/3) * (y < 0 ? -1 : 1),
+                t = X + Y + 0.25;
+            return pow(1 - t, 2) * 3 * t * 0.1 + (1 - t) * 3 * t * t + t * t * t;
+        },
+        easeIn: function (n) {
+            return pow(n, 1.7);
+        },
+        easeOut: function (n) {
+            return pow(n, 0.48);
+        },
+        easeInOut: function(n) {
+            var q = 0.48 - n / 1.04,
+                Q = sqrt(0.1734 + q * q),
+                x = Q - q,
+                X = pow(abs(x), 1/3) * (x < 0 ? -1 : 1),
+                y = -Q - q,
+                Y = pow(abs(y), 1/3) * (y < 0 ? -1 : 1),
+                t = X + Y + 0.5;
+            return (1 - t) * 3 * t * t + t * t * t;
+        },
+        backIn: function (n) {
+            return n * n * ((backInSeed + 1) * n - backInSeed);
+        },
+        backOut: function (n) {
+            n = n - 1;
+            return n * n * ((backInSeed + 1) * n + backInSeed) + 1;
+        },
+        elasticIn: function (n) {
+            if (n === 0 || n === 1) {
+                return n;
+            }
+            var p = 0.3,
+                s = p / 4;
+            return pow(2, -10 * n) * sin((n - s) * (2 * pi) / p) + 1;
+        },
+        elasticOut: function (n) {
+            return 1 - Ext.fx.Easing.elasticIn(1 - n);
+        },
+        bounceIn: function (n) {
+            return 1 - Ext.fx.Easing.bounceOut(1 - n);
+        },
+        bounceOut: function (n) {
+            var s = 7.5625,
+                p = 2.75,
+                l;
+            if (n < (1 / p)) {
+                l = s * n * n;
+            } else {
+                if (n < (2 / p)) {
+                    n -= (1.5 / p);
+                    l = s * n * n + 0.75;
+                } else {
+                    if (n < (2.5 / p)) {
+                        n -= (2.25 / p);
+                        l = s * n * n + 0.9375;
+                    } else {
+                        n -= (2.625 / p);
+                        l = s * n * n + 0.984375;
+                    }
+                }
+            }
+            return l;
+        }
+    });
+    Ext.apply(Ext.fx.Easing, {
+        'back-in': Ext.fx.Easing.backIn,
+        'back-out': Ext.fx.Easing.backOut,
+        'ease-in': Ext.fx.Easing.easeIn,
+        'ease-out': Ext.fx.Easing.easeOut,
+        'elastic-in': Ext.fx.Easing.elasticIn,
+        'elastic-out': Ext.fx.Easing.elasticIn,
+        'bounce-in': Ext.fx.Easing.bounceIn,
+        'bounce-out': Ext.fx.Easing.bounceOut,
+        'ease-in-out': Ext.fx.Easing.easeInOut
+    });
+});
+
+Ext.define('Ext.draw.Draw', {
+    
+
+    singleton: true,
+
+    requires: ['Ext.draw.Color'],
+
+    
+
+    pathToStringRE: /,?([achlmqrstvxz]),?/gi,
+    pathCommandRE: /([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
+    pathValuesRE: /(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,
+    stopsRE: /^(\d+%?)$/,
+    radian: Math.PI / 180,
+
+    availableAnimAttrs: {
+        along: "along",
+        blur: null,
+        "clip-rect": "csv",
+        cx: null,
+        cy: null,
+        fill: "color",
+        "fill-opacity": null,
+        "font-size": null,
+        height: null,
+        opacity: null,
+        path: "path",
+        r: null,
+        rotation: "csv",
+        rx: null,
+        ry: null,
+        scale: "csv",
+        stroke: "color",
+        "stroke-opacity": null,
+        "stroke-width": null,
+        translation: "csv",
+        width: null,
+        x: null,
+        y: null
+    },
+
+    is: function(o, type) {
+        type = String(type).toLowerCase();
+        return (type == "object" && o === Object(o)) ||
+            (type == "undefined" && typeof o == type) ||
+            (type == "null" && o === null) ||
+            (type == "array" && Array.isArray && Array.isArray(o)) ||
+            (Object.prototype.toString.call(o).toLowerCase().slice(8, -1)) == type;
+    },
+
+    ellipsePath: function(sprite) {
+        var attr = sprite.attr;
+        return Ext.String.format("M{0},{1}A{2},{3},0,1,1,{0},{4}A{2},{3},0,1,1,{0},{1}z", attr.x, attr.y - attr.ry, attr.rx, attr.ry, attr.y + attr.ry);
+    },
+
+    rectPath: function(sprite) {
+        var attr = sprite.attr;
+        if (attr.radius) {
+            return Ext.String.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z", attr.x + attr.radius, attr.y, attr.width - attr.radius * 2, attr.radius, -attr.radius, attr.height - attr.radius * 2, attr.radius * 2 - attr.width, attr.radius * 2 - attr.height);
+        }
+        else {
+            return Ext.String.format("M{0},{1}l{2},0,0,{3},{4},0z", attr.x, attr.y, attr.width, attr.height, -attr.width);
+        }
+    },
+
+    
+    path2string: function () {
+        return this.join(",").replace(Ext.draw.Draw.pathToStringRE, "$1");
+    },
+
+    
+    pathToString: function(arrayPath) {
+        return arrayPath.join(",").replace(Ext.draw.Draw.pathToStringRE, "$1");
+    },
+
+    parsePathString: function (pathString) {
+        if (!pathString) {
+            return null;
+        }
+        var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0},
+            data = [],
+            me = this;
+        if (me.is(pathString, "array") && me.is(pathString[0], "array")) { 
+            data = me.pathClone(pathString);
+        }
+        if (!data.length) {
+            String(pathString).replace(me.pathCommandRE, function (a, b, c) {
+                var params = [],
+                    name = b.toLowerCase();
+                c.replace(me.pathValuesRE, function (a, b) {
+                    b && params.push(+b);
+                });
+                if (name == "m" && params.length > 2) {
+                    data.push([b].concat(Ext.Array.splice(params, 0, 2)));
+                    name = "l";
+                    b = (b == "m") ? "l" : "L";
+                }
+                while (params.length >= paramCounts[name]) {
+                    data.push([b].concat(Ext.Array.splice(params, 0, paramCounts[name])));
+                    if (!paramCounts[name]) {
+                        break;
+                    }
+                }
+            });
+        }
+        data.toString = me.path2string;
+        return data;
+    },
+
+    mapPath: function (path, matrix) {
+        if (!matrix) {
+            return path;
+        }
+        var x, y, i, ii, j, jj, pathi;
+        path = this.path2curve(path);
+        for (i = 0, ii = path.length; i < ii; i++) {
+            pathi = path[i];
+            for (j = 1, jj = pathi.length; j < jj-1; j += 2) {
+                x = matrix.x(pathi[j], pathi[j + 1]);
+                y = matrix.y(pathi[j], pathi[j + 1]);
+                pathi[j] = x;
+                pathi[j + 1] = y;
+            }
+        }
+        return path;
+    },
+
+    pathClone: function(pathArray) {
+        var res = [],
+            j, jj, i, ii;
+        if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) { 
+            pathArray = this.parsePathString(pathArray);
+        }
+        for (i = 0, ii = pathArray.length; i < ii; i++) {
+            res[i] = [];
+            for (j = 0, jj = pathArray[i].length; j < jj; j++) {
+                res[i][j] = pathArray[i][j];
+            }
+        }
+        res.toString = this.path2string;
+        return res;
+    },
+
+    pathToAbsolute: function (pathArray) {
+        if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) { 
+            pathArray = this.parsePathString(pathArray);
+        }
+        var res = [],
+            x = 0,
+            y = 0,
+            mx = 0,
+            my = 0,
+            i = 0,
+            ln = pathArray.length,
+            r, pathSegment, j, ln2;
+        
+        if (ln && pathArray[0][0] == "M") {
+            x = +pathArray[0][1];
+            y = +pathArray[0][2];
+            mx = x;
+            my = y;
+            i++;
+            res[0] = ["M", x, y];
+        }
+        for (; i < ln; i++) {
+            r = res[i] = [];
+            pathSegment = pathArray[i];
+            if (pathSegment[0] != pathSegment[0].toUpperCase()) {
+                r[0] = pathSegment[0].toUpperCase();
+                switch (r[0]) {
+                    
+                    case "A":
+                        r[1] = pathSegment[1];
+                        r[2] = pathSegment[2];
+                        r[3] = pathSegment[3];
+                        r[4] = pathSegment[4];
+                        r[5] = pathSegment[5];
+                        r[6] = +(pathSegment[6] + x);
+                        r[7] = +(pathSegment[7] + y);
+                        break;
+                    
+                    case "V":
+                        r[1] = +pathSegment[1] + y;
+                        break;
+                    
+                    case "H":
+                        r[1] = +pathSegment[1] + x;
+                        break;
+                    case "M":
+                    
+                        mx = +pathSegment[1] + x;
+                        my = +pathSegment[2] + y;
+                    default:
+                        j = 1;
+                        ln2 = pathSegment.length;
+                        for (; j < ln2; j++) {
+                            r[j] = +pathSegment[j] + ((j % 2) ? x : y);
+                        }
+                }
+            }
+            else {
+                j = 0;
+                ln2 = pathSegment.length;
+                for (; j < ln2; j++) {
+                    res[i][j] = pathSegment[j];
+                }
+            }
+            switch (r[0]) {
+                
+                case "Z":
+                    x = mx;
+                    y = my;
+                    break;
+                
+                case "H":
+                    x = r[1];
+                    break;
+                
+                case "V":
+                    y = r[1];
+                    break;
+                
+                case "M":
+                    pathSegment = res[i];
+                    ln2 = pathSegment.length;
+                    mx = pathSegment[ln2 - 2];
+                    my = pathSegment[ln2 - 1];
+                default:
+                    pathSegment = res[i];
+                    ln2 = pathSegment.length;
+                    x = pathSegment[ln2 - 2];
+                    y = pathSegment[ln2 - 1];
+            }
+        }
+        res.toString = this.path2string;
+        return res;
+    },
+
+    
+    pathToRelative: function (pathArray) {
+        if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) {
+            pathArray = this.parsePathString(pathArray);
+        }
+        var res = [],
+            x = 0,
+            y = 0,
+            mx = 0,
+            my = 0,
+            start = 0;
+        if (pathArray[0][0] == "M") {
+            x = pathArray[0][1];
+            y = pathArray[0][2];
+            mx = x;
+            my = y;
+            start++;
+            res.push(["M", x, y]);
+        }
+        for (var i = start, ii = pathArray.length; i < ii; i++) {
+            var r = res[i] = [],
+                pa = pathArray[i];
+            if (pa[0] != pa[0].toLowerCase()) {
+                r[0] = pa[0].toLowerCase();
+                switch (r[0]) {
+                    case "a":
+                        r[1] = pa[1];
+                        r[2] = pa[2];
+                        r[3] = pa[3];
+                        r[4] = pa[4];
+                        r[5] = pa[5];
+                        r[6] = +(pa[6] - x).toFixed(3);
+                        r[7] = +(pa[7] - y).toFixed(3);
+                        break;
+                    case "v":
+                        r[1] = +(pa[1] - y).toFixed(3);
+                        break;
+                    case "m":
+                        mx = pa[1];
+                        my = pa[2];
+                    default:
+                        for (var j = 1, jj = pa.length; j < jj; j++) {
+                            r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);
+                        }
+                }
+            } else {
+                r = res[i] = [];
+                if (pa[0] == "m") {
+                    mx = pa[1] + x;
+                    my = pa[2] + y;
+                }
+                for (var k = 0, kk = pa.length; k < kk; k++) {
+                    res[i][k] = pa[k];
+                }
+            }
+            var len = res[i].length;
+            switch (res[i][0]) {
+                case "z":
+                    x = mx;
+                    y = my;
+                    break;
+                case "h":
+                    x += +res[i][len - 1];
+                    break;
+                case "v":
+                    y += +res[i][len - 1];
+                    break;
+                default:
+                    x += +res[i][len - 2];
+                    y += +res[i][len - 1];
+            }
+        }
+        res.toString = this.path2string;
+        return res;
+    },
+
+    
+    path2curve: function (path) {
+        var me = this,
+            points = me.pathToAbsolute(path),
+            ln = points.length,
+            attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
+            i, seg, segLn, point;
+            
+        for (i = 0; i < ln; i++) {
+            points[i] = me.command2curve(points[i], attrs);
+            if (points[i].length > 7) {
+                    points[i].shift();
+                    point = points[i];
+                    while (point.length) {
+                        Ext.Array.splice(points, i++, 0, ["C"].concat(Ext.Array.splice(point, 0, 6)));
+                    }
+                    Ext.Array.erase(points, i, 1);
+                    ln = points.length;
+                }
+            seg = points[i];
+            segLn = seg.length;
+            attrs.x = seg[segLn - 2];
+            attrs.y = seg[segLn - 1];
+            attrs.bx = parseFloat(seg[segLn - 4]) || attrs.x;
+            attrs.by = parseFloat(seg[segLn - 3]) || attrs.y;
+        }
+        return points;
+    },
+    
+    interpolatePaths: function (path, path2) {
+        var me = this,
+            p = me.pathToAbsolute(path),
+            p2 = me.pathToAbsolute(path2),
+            attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
+            attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
+            fixArc = function (pp, i) {
+                if (pp[i].length > 7) {
+                    pp[i].shift();
+                    var pi = pp[i];
+                    while (pi.length) {
+                        Ext.Array.splice(pp, i++, 0, ["C"].concat(Ext.Array.splice(pi, 0, 6)));
+                    }
+                    Ext.Array.erase(pp, i, 1);
+                    ii = Math.max(p.length, p2.length || 0);
+                }
+            },
+            fixM = function (path1, path2, a1, a2, i) {
+                if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") {
+                    Ext.Array.splice(path2, i, 0, ["M", a2.x, a2.y]);
+                    a1.bx = 0;
+                    a1.by = 0;
+                    a1.x = path1[i][1];
+                    a1.y = path1[i][2];
+                    ii = Math.max(p.length, p2.length || 0);
+                }
+            };
+        for (var i = 0, ii = Math.max(p.length, p2.length || 0); i < ii; i++) {
+            p[i] = me.command2curve(p[i], attrs);
+            fixArc(p, i);
+            (p2[i] = me.command2curve(p2[i], attrs2));
+            fixArc(p2, i);
+            fixM(p, p2, attrs, attrs2, i);
+            fixM(p2, p, attrs2, attrs, i);
+            var seg = p[i],
+                seg2 = p2[i],
+                seglen = seg.length,
+                seg2len = seg2.length;
+            attrs.x = seg[seglen - 2];
+            attrs.y = seg[seglen - 1];
+            attrs.bx = parseFloat(seg[seglen - 4]) || attrs.x;
+            attrs.by = parseFloat(seg[seglen - 3]) || attrs.y;
+            attrs2.bx = (parseFloat(seg2[seg2len - 4]) || attrs2.x);
+            attrs2.by = (parseFloat(seg2[seg2len - 3]) || attrs2.y);
+            attrs2.x = seg2[seg2len - 2];
+            attrs2.y = seg2[seg2len - 1];
+        }
+        return [p, p2];
+    },
+    
+    
+    command2curve: function (pathCommand, d) {
+        var me = this;
+        if (!pathCommand) {
+            return ["C", d.x, d.y, d.x, d.y, d.x, d.y];
+        }
+        if (pathCommand[0] != "T" && pathCommand[0] != "Q") {
+            d.qx = d.qy = null;
+        }
+        switch (pathCommand[0]) {
+            case "M":
+                d.X = pathCommand[1];
+                d.Y = pathCommand[2];
+                break;
+            case "A":
+                pathCommand = ["C"].concat(me.arc2curve.apply(me, [d.x, d.y].concat(pathCommand.slice(1))));
+                break;
+            case "S":
+                pathCommand = ["C", d.x + (d.x - (d.bx || d.x)), d.y + (d.y - (d.by || d.y))].concat(pathCommand.slice(1));
+                break;
+            case "T":
+                d.qx = d.x + (d.x - (d.qx || d.x));
+                d.qy = d.y + (d.y - (d.qy || d.y));
+                pathCommand = ["C"].concat(me.quadratic2curve(d.x, d.y, d.qx, d.qy, pathCommand[1], pathCommand[2]));
+                break;
+            case "Q":
+                d.qx = pathCommand[1];
+                d.qy = pathCommand[2];
+                pathCommand = ["C"].concat(me.quadratic2curve(d.x, d.y, pathCommand[1], pathCommand[2], pathCommand[3], pathCommand[4]));
+                break;
+            case "L":
+                pathCommand = ["C"].concat(d.x, d.y, pathCommand[1], pathCommand[2], pathCommand[1], pathCommand[2]);
+                break;
+            case "H":
+                pathCommand = ["C"].concat(d.x, d.y, pathCommand[1], d.y, pathCommand[1], d.y);
+                break;
+            case "V":
+                pathCommand = ["C"].concat(d.x, d.y, d.x, pathCommand[1], d.x, pathCommand[1]);
+                break;
+            case "Z":
+                pathCommand = ["C"].concat(d.x, d.y, d.X, d.Y, d.X, d.Y);
+                break;
+        }
+        return pathCommand;
+    },
+
+    quadratic2curve: function (x1, y1, ax, ay, x2, y2) {
+        var _13 = 1 / 3,
+            _23 = 2 / 3;
+        return [
+                _13 * x1 + _23 * ax,
+                _13 * y1 + _23 * ay,
+                _13 * x2 + _23 * ax,
+                _13 * y2 + _23 * ay,
+                x2,
+                y2
+            ];
+    },
+    
+    rotate: function (x, y, rad) {
+        var cos = Math.cos(rad),
+            sin = Math.sin(rad),
+            X = x * cos - y * sin,
+            Y = x * sin + y * cos;
+        return {x: X, y: Y};
+    },
+
+    arc2curve: function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
+        
+        
+        var me = this,
+            PI = Math.PI,
+            radian = me.radian,
+            _120 = PI * 120 / 180,
+            rad = radian * (+angle || 0),
+            res = [],
+            math = Math,
+            mcos = math.cos,
+            msin = math.sin,
+            msqrt = math.sqrt,
+            mabs = math.abs,
+            masin = math.asin,
+            xy, cos, sin, x, y, h, rx2, ry2, k, cx, cy, f1, f2, df, c1, s1, c2, s2,
+            t, hx, hy, m1, m2, m3, m4, newres, i, ln, f2old, x2old, y2old;
+        if (!recursive) {
+            xy = me.rotate(x1, y1, -rad);
+            x1 = xy.x;
+            y1 = xy.y;
+            xy = me.rotate(x2, y2, -rad);
+            x2 = xy.x;
+            y2 = xy.y;
+            cos = mcos(radian * angle);
+            sin = msin(radian * angle);
+            x = (x1 - x2) / 2;
+            y = (y1 - y2) / 2;
+            h = (x * x) / (rx * rx) + (y * y) / (ry * ry);
+            if (h > 1) {
+                h = msqrt(h);
+                rx = h * rx;
+                ry = h * ry;
+            }
+            rx2 = rx * rx;
+            ry2 = ry * ry;
+            k = (large_arc_flag == sweep_flag ? -1 : 1) *
+                    msqrt(mabs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x)));
+            cx = k * rx * y / ry + (x1 + x2) / 2;
+            cy = k * -ry * x / rx + (y1 + y2) / 2;
+            f1 = masin(((y1 - cy) / ry).toFixed(7));
+            f2 = masin(((y2 - cy) / ry).toFixed(7));
+
+            f1 = x1 < cx ? PI - f1 : f1;
+            f2 = x2 < cx ? PI - f2 : f2;
+            if (f1 < 0) {
+                f1 = PI * 2 + f1;
+            }
+            if (f2 < 0) {
+                f2 = PI * 2 + f2;
+            }
+            if (sweep_flag && f1 > f2) {
+                f1 = f1 - PI * 2;
+            }
+            if (!sweep_flag && f2 > f1) {
+                f2 = f2 - PI * 2;
+            }
+        }
+        else {
+            f1 = recursive[0];
+            f2 = recursive[1];
+            cx = recursive[2];
+            cy = recursive[3];
+        }
+        df = f2 - f1;
+        if (mabs(df) > _120) {
+            f2old = f2;
+            x2old = x2;
+            y2old = y2;
+            f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);
+            x2 = cx + rx * mcos(f2);
+            y2 = cy + ry * msin(f2);
+            res = me.arc2curve(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);
+        }
+        df = f2 - f1;
+        c1 = mcos(f1);
+        s1 = msin(f1);
+        c2 = mcos(f2);
+        s2 = msin(f2);
+        t = math.tan(df / 4);
+        hx = 4 / 3 * rx * t;
+        hy = 4 / 3 * ry * t;
+        m1 = [x1, y1];
+        m2 = [x1 + hx * s1, y1 - hy * c1];
+        m3 = [x2 + hx * s2, y2 - hy * c2];
+        m4 = [x2, y2];
+        m2[0] = 2 * m1[0] - m2[0];
+        m2[1] = 2 * m1[1] - m2[1];
+        if (recursive) {
+            return [m2, m3, m4].concat(res);
+        }
+        else {
+            res = [m2, m3, m4].concat(res).join().split(",");
+            newres = [];
+            ln = res.length;
+            for (i = 0;  i < ln; i++) {
+                newres[i] = i % 2 ? me.rotate(res[i - 1], res[i], rad).y : me.rotate(res[i], res[i + 1], rad).x;
+            }
+            return newres;
+        }
+    },
+
+    
+    rotateAndTranslatePath: function (sprite) {
+        var alpha = sprite.rotation.degrees,
+            cx = sprite.rotation.x,
+            cy = sprite.rotation.y,
+            dx = sprite.translation.x,
+            dy = sprite.translation.y,
+            path,
+            i,
+            p,
+            xy,
+            j,
+            res = [];
+        if (!alpha && !dx && !dy) {
+            return this.pathToAbsolute(sprite.attr.path);
+        }
+        dx = dx || 0;
+        dy = dy || 0;
+        path = this.pathToAbsolute(sprite.attr.path);
+        for (i = path.length; i--;) {
+            p = res[i] = path[i].slice();
+            if (p[0] == "A") {
+                xy = this.rotatePoint(p[6], p[7], alpha, cx, cy);
+                p[6] = xy.x + dx;
+                p[7] = xy.y + dy;
+            } else {
+                j = 1;
+                while (p[j + 1] != null) {
+                    xy = this.rotatePoint(p[j], p[j + 1], alpha, cx, cy);
+                    p[j] = xy.x + dx;
+                    p[j + 1] = xy.y + dy;
+                    j += 2;
+                }
+            }
+        }
+        return res;
+    },
+
+    
+    rotatePoint: function (x, y, alpha, cx, cy) {
+        if (!alpha) {
+            return {
+                x: x,
+                y: y
+            };
+        }
+        cx = cx || 0;
+        cy = cy || 0;
+        x = x - cx;
+        y = y - cy;
+        alpha = alpha * this.radian;
+        var cos = Math.cos(alpha),
+            sin = Math.sin(alpha);
+        return {
+            x: x * cos - y * sin + cx,
+            y: x * sin + y * cos + cy
+        };
+    },
+
+    pathDimensions: function (path) {
+        if (!path || !(path + "")) {
+            return {x: 0, y: 0, width: 0, height: 0};
+        }
+        path = this.path2curve(path);
+        var x = 0, 
+            y = 0,
+            X = [],
+            Y = [],
+            i = 0,
+            ln = path.length,
+            p, xmin, ymin, dim;
+        for (; i < ln; i++) {
+            p = path[i];
+            if (p[0] == "M") {
+                x = p[1];
+                y = p[2];
+                X.push(x);
+                Y.push(y);
+            }
+            else {
+                dim = this.curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
+                X = X.concat(dim.min.x, dim.max.x);
+                Y = Y.concat(dim.min.y, dim.max.y);
+                x = p[5];
+                y = p[6];
+            }
+        }
+        xmin = Math.min.apply(0, X);
+        ymin = Math.min.apply(0, Y);
+        return {
+            x: xmin,
+            y: ymin,
+            path: path,
+            width: Math.max.apply(0, X) - xmin,
+            height: Math.max.apply(0, Y) - ymin
+        };
+    },
+
+    intersectInside: function(path, cp1, cp2) {
+        return (cp2[0] - cp1[0]) * (path[1] - cp1[1]) > (cp2[1] - cp1[1]) * (path[0] - cp1[0]);
+    },
+
+    intersectIntersection: function(s, e, cp1, cp2) {
+        var p = [],
+            dcx = cp1[0] - cp2[0],
+            dcy = cp1[1] - cp2[1],
+            dpx = s[0] - e[0],
+            dpy = s[1] - e[1],
+            n1 = cp1[0] * cp2[1] - cp1[1] * cp2[0],
+            n2 = s[0] * e[1] - s[1] * e[0],
+            n3 = 1 / (dcx * dpy - dcy * dpx);
+
+        p[0] = (n1 * dpx - n2 * dcx) * n3;
+        p[1] = (n1 * dpy - n2 * dcy) * n3;
+        return p;
+    },
+
+    intersect: function(subjectPolygon, clipPolygon) {
+        var me = this,
+            i = 0,
+            ln = clipPolygon.length,
+            cp1 = clipPolygon[ln - 1],
+            outputList = subjectPolygon,
+            cp2, s, e, point, ln2, inputList, j;
+        for (; i < ln; ++i) {
+            cp2 = clipPolygon[i];
+            inputList = outputList;
+            outputList = [];
+            s = inputList[inputList.length - 1];
+            j = 0;
+            ln2 = inputList.length;
+            for (; j < ln2; j++) {
+                e = inputList[j];
+                if (me.intersectInside(e, cp1, cp2)) {
+                    if (!me.intersectInside(s, cp1, cp2)) {
+                        outputList.push(me.intersectIntersection(s, e, cp1, cp2));
+                    }
+                    outputList.push(e);
+                }
+                else if (me.intersectInside(s, cp1, cp2)) {
+                    outputList.push(me.intersectIntersection(s, e, cp1, cp2));
+                }
+                s = e;
+            }
+            cp1 = cp2;
+        }
+        return outputList;
+    },
+
+    curveDim: function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
+        var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),
+            b = 2 * (c1x - p1x) - 2 * (c2x - c1x),
+            c = p1x - c1x,
+            t1 = (-b + Math.sqrt(b * b - 4 * a * c)) / 2 / a,
+            t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / 2 / a,
+            y = [p1y, p2y],
+            x = [p1x, p2x],
+            dot;
+        if (Math.abs(t1) > 1e12) {
+            t1 = 0.5;
+        }
+        if (Math.abs(t2) > 1e12) {
+            t2 = 0.5;
+        }
+        if (t1 > 0 && t1 < 1) {
+            dot = this.findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
+            x.push(dot.x);
+            y.push(dot.y);
+        }
+        if (t2 > 0 && t2 < 1) {
+            dot = this.findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
+            x.push(dot.x);
+            y.push(dot.y);
+        }
+        a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);
+        b = 2 * (c1y - p1y) - 2 * (c2y - c1y);
+        c = p1y - c1y;
+        t1 = (-b + Math.sqrt(b * b - 4 * a * c)) / 2 / a;
+        t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / 2 / a;
+        if (Math.abs(t1) > 1e12) {
+            t1 = 0.5;
+        }
+        if (Math.abs(t2) > 1e12) {
+            t2 = 0.5;
+        }
+        if (t1 > 0 && t1 < 1) {
+            dot = this.findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
+            x.push(dot.x);
+            y.push(dot.y);
+        }
+        if (t2 > 0 && t2 < 1) {
+            dot = this.findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
+            x.push(dot.x);
+            y.push(dot.y);
+        }
+        return {
+            min: {x: Math.min.apply(0, x), y: Math.min.apply(0, y)},
+            max: {x: Math.max.apply(0, x), y: Math.max.apply(0, y)}
+        };
+    },
+
+    
+    getAnchors: function (prevX, prevY, curX, curY, nextX, nextY, value) {
+        value = value || 4;
+        var M = Math,
+            PI = M.PI,
+            halfPI = PI / 2,
+            abs = M.abs,
+            sin = M.sin,
+            cos = M.cos,
+            atan = M.atan,
+            control1Length, control2Length, control1Angle, control2Angle,
+            control1X, control1Y, control2X, control2Y, alpha;
+
+        
+        
+        control1Length = (curX - prevX) / value;
+        control2Length = (nextX - curX) / value;
+
+        
+        
+        
+        
+        if ((curY >= prevY && curY >= nextY) || (curY <= prevY && curY <= nextY)) {
+            control1Angle = control2Angle = halfPI;
+        } else {
+            control1Angle = atan((curX - prevX) / abs(curY - prevY));
+            if (prevY < curY) {
+                control1Angle = PI - control1Angle;
+            }
+            control2Angle = atan((nextX - curX) / abs(curY - nextY));
+            if (nextY < curY) {
+                control2Angle = PI - control2Angle;
+            }
+        }
+
+        
+        alpha = halfPI - ((control1Angle + control2Angle) % (PI * 2)) / 2;
+        if (alpha > halfPI) {
+            alpha -= PI;
+        }
+        control1Angle += alpha;
+        control2Angle += alpha;
+
+        
+        control1X = curX - control1Length * sin(control1Angle);
+        control1Y = curY + control1Length * cos(control1Angle);
+        control2X = curX + control2Length * sin(control2Angle);
+        control2Y = curY + control2Length * cos(control2Angle);
+
+        
+        
+        
+        
+        if ((curY > prevY && control1Y < prevY) || (curY < prevY && control1Y > prevY)) {
+            control1X += abs(prevY - control1Y) * (control1X - curX) / (control1Y - curY);
+            control1Y = prevY;
+        }
+        if ((curY > nextY && control2Y < nextY) || (curY < nextY && control2Y > nextY)) {
+            control2X -= abs(nextY - control2Y) * (control2X - curX) / (control2Y - curY);
+            control2Y = nextY;
+        }
+        
+        return {
+            x1: control1X,
+            y1: control1Y,
+            x2: control2X,
+            y2: control2Y
+        };
+    },
+
+    
+    smooth: function (originalPath, value) {
+        var path = this.path2curve(originalPath),
+            newp = [path[0]],
+            x = path[0][1],
+            y = path[0][2],
+            j,
+            points,
+            i = 1,
+            ii = path.length,
+            beg = 1,
+            mx = x,
+            my = y,
+            cx = 0,
+            cy = 0;
+        for (; i < ii; i++) {
+            var pathi = path[i],
+                pathil = pathi.length,
+                pathim = path[i - 1],
+                pathiml = pathim.length,
+                pathip = path[i + 1],
+                pathipl = pathip && pathip.length;
+            if (pathi[0] == "M") {
+                mx = pathi[1];
+                my = pathi[2];
+                j = i + 1;
+                while (path[j][0] != "C") {
+                    j++;
+                }
+                cx = path[j][5];
+                cy = path[j][6];
+                newp.push(["M", mx, my]);
+                beg = newp.length;
+                x = mx;
+                y = my;
+                continue;
+            }
+            if (pathi[pathil - 2] == mx && pathi[pathil - 1] == my && (!pathip || pathip[0] == "M")) {
+                var begl = newp[beg].length;
+                points = this.getAnchors(pathim[pathiml - 2], pathim[pathiml - 1], mx, my, newp[beg][begl - 2], newp[beg][begl - 1], value);
+                newp[beg][1] = points.x2;
+                newp[beg][2] = points.y2;
+            }
+            else if (!pathip || pathip[0] == "M") {
+                points = {
+                    x1: pathi[pathil - 2],
+                    y1: pathi[pathil - 1]
+                };
+            } else {
+                points = this.getAnchors(pathim[pathiml - 2], pathim[pathiml - 1], pathi[pathil - 2], pathi[pathil - 1], pathip[pathipl - 2], pathip[pathipl - 1], value);
+            }
+            newp.push(["C", x, y, points.x1, points.y1, pathi[pathil - 2], pathi[pathil - 1]]);
+            x = points.x2;
+            y = points.y2;
+        }
+        return newp;
+    },
+
+    findDotAtSegment: function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
+        var t1 = 1 - t;
+        return {
+            x: Math.pow(t1, 3) * p1x + Math.pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + Math.pow(t, 3) * p2x,
+            y: Math.pow(t1, 3) * p1y + Math.pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + Math.pow(t, 3) * p2y
+        };
+    },
+
+    
+    snapEnds: function (from, to, stepsMax) {
+        if (Ext.isDate(from)) {
+            return this.snapEndsByDate(from, to, stepsMax);
+        }
+        var step = (to - from) / stepsMax,
+            level = Math.floor(Math.log(step) / Math.LN10) + 1,
+            m = Math.pow(10, level),
+            cur,
+            modulo = Math.round((step % m) * Math.pow(10, 2 - level)),
+            interval = [[0, 15], [20, 4], [30, 2], [40, 4], [50, 9], [60, 4], [70, 2], [80, 4], [100, 15]],
+            stepCount = 0,
+            value,
+            weight,
+            i,
+            topValue,
+            topWeight = 1e9,
+            ln = interval.length;
+        cur = from = Math.floor(from / m) * m;
+        for (i = 0; i < ln; i++) {
+            value = interval[i][0];
+            weight = (value - modulo) < 0 ? 1e6 : (value - modulo) / interval[i][1];
+            if (weight < topWeight) {
+                topValue = value;
+                topWeight = weight;
+            }
+        }
+        step = Math.floor(step * Math.pow(10, -level)) * Math.pow(10, level) + topValue * Math.pow(10, level - 2);
+        while (cur < to) {
+            cur += step;
+            stepCount++;
+        }
+        to = +cur.toFixed(10);
+        return {
+            from: from,
+            to: to,
+            power: level,
+            step: step,
+            steps: stepCount
+        };
+    },
+
+    
+    snapEndsByDate: function (from, to, stepsMax, lockEnds) {
+        var selectedStep = false, scales = [
+                [Ext.Date.MILLI, [1, 2, 3, 5, 10, 20, 30, 50, 100, 200, 300, 500]],
+                [Ext.Date.SECOND, [1, 2, 3, 5, 10, 15, 30]],
+                [Ext.Date.MINUTE, [1, 2, 3, 5, 10, 20, 30]],
+                [Ext.Date.HOUR, [1, 2, 3, 4, 6, 12]],
+                [Ext.Date.DAY, [1, 2, 3, 7, 14]],
+                [Ext.Date.MONTH, [1, 2, 3, 4, 6]]
+            ], j, yearDiff;
+
+        
+        Ext.each(scales, function(scale, i) {
+            for (j = 0; j < scale[1].length; j++) {
+                if (to < Ext.Date.add(from, scale[0], scale[1][j] * stepsMax)) {
+                    selectedStep = [scale[0], scale[1][j]];
+                    return false;
+                }
+            }
+        });
+        if (!selectedStep) {
+            yearDiff = this.snapEnds(from.getFullYear(), to.getFullYear() + 1, stepsMax, lockEnds);
+            selectedStep = [Date.YEAR, Math.round(yearDiff.step)];
+        }
+        return this.snapEndsByDateAndStep(from, to, selectedStep, lockEnds);
+    },
+
+
+    
+    snapEndsByDateAndStep: function(from, to, step, lockEnds) {
+        var fromStat = [from.getFullYear(), from.getMonth(), from.getDate(),
+                from.getHours(), from.getMinutes(), from.getSeconds(), from.getMilliseconds()],
+            steps = 0, testFrom, testTo;
+        if (lockEnds) {
+            testFrom = from;
+        } else {
+            switch (step[0]) {
+                case Ext.Date.MILLI:
+                    testFrom = new Date(fromStat[0], fromStat[1], fromStat[2], fromStat[3],
+                            fromStat[4], fromStat[5], Math.floor(fromStat[6] / step[1]) * step[1]);
+                    break;
+                case Ext.Date.SECOND:
+                    testFrom = new Date(fromStat[0], fromStat[1], fromStat[2], fromStat[3],
+                            fromStat[4], Math.floor(fromStat[5] / step[1]) * step[1], 0);
+                    break;
+                case Ext.Date.MINUTE:
+                    testFrom = new Date(fromStat[0], fromStat[1], fromStat[2], fromStat[3],
+                            Math.floor(fromStat[4] / step[1]) * step[1], 0, 0);
+                    break;
+                case Ext.Date.HOUR:
+                    testFrom = new Date(fromStat[0], fromStat[1], fromStat[2],
+                            Math.floor(fromStat[3] / step[1]) * step[1], 0, 0, 0);
+                    break;
+                case Ext.Date.DAY:
+                    testFrom = new Date(fromStat[0], fromStat[1],
+                            Math.floor(fromStat[2] - 1 / step[1]) * step[1] + 1, 0, 0, 0, 0);
+                    break;
+                case Ext.Date.MONTH:
+                    testFrom = new Date(fromStat[0], Math.floor(fromStat[1] / step[1]) * step[1], 1, 0, 0, 0, 0);
+                    break;
+                default: 
+                    testFrom = new Date(Math.floor(fromStat[0] / step[1]) * step[1], 0, 1, 0, 0, 0, 0);
+                    break;
+            }
+        }
+
+        testTo = testFrom;
+        
+        while (testTo < to) {
+            testTo = Ext.Date.add(testTo, step[0], step[1]);
+            steps++;
+        }
+
+        if (lockEnds) {
+            testTo = to;
+        }
+        return {
+            from : +testFrom,
+            to : +testTo,
+            step : (testTo - testFrom) / steps,
+            steps : steps
+        };
+    },
+
+    sorter: function (a, b) {
+        return a.offset - b.offset;
+    },
+
+    rad: function(degrees) {
+        return degrees % 360 * Math.PI / 180;
+    },
+
+    degrees: function(radian) {
+        return radian * 180 / Math.PI % 360;
+    },
+
+    withinBox: function(x, y, bbox) {
+        bbox = bbox || {};
+        return (x >= bbox.x && x <= (bbox.x + bbox.width) && y >= bbox.y && y <= (bbox.y + bbox.height));
+    },
+
+    parseGradient: function(gradient) {
+        var me = this,
+            type = gradient.type || 'linear',
+            angle = gradient.angle || 0,
+            radian = me.radian,
+            stops = gradient.stops,
+            stopsArr = [],
+            stop,
+            vector,
+            max,
+            stopObj;
+
+        if (type == 'linear') {
+            vector = [0, 0, Math.cos(angle * radian), Math.sin(angle * radian)];
+            max = 1 / (Math.max(Math.abs(vector[2]), Math.abs(vector[3])) || 1);
+            vector[2] *= max;
+            vector[3] *= max;
+            if (vector[2] < 0) {
+                vector[0] = -vector[2];
+                vector[2] = 0;
+            }
+            if (vector[3] < 0) {
+                vector[1] = -vector[3];
+                vector[3] = 0;
+            }
+        }
+
+        for (stop in stops) {
+            if (stops.hasOwnProperty(stop) && me.stopsRE.test(stop)) {
+                stopObj = {
+                    offset: parseInt(stop, 10),
+                    color: Ext.draw.Color.toHex(stops[stop].color) || '#ffffff',
+                    opacity: stops[stop].opacity || 1
+                };
+                stopsArr.push(stopObj);
+            }
+        }
+        
+        Ext.Array.sort(stopsArr, me.sorter);
+        if (type == 'linear') {
+            return {
+                id: gradient.id,
+                type: type,
+                vector: vector,
+                stops: stopsArr
+            };
+        }
+        else {
+            return {
+                id: gradient.id,
+                type: type,
+                centerX: gradient.centerX,
+                centerY: gradient.centerY,
+                focalX: gradient.focalX,
+                focalY: gradient.focalY,
+                radius: gradient.radius,
+                vector: vector,
+                stops: stopsArr
+            };
+        }
+    }
+});
+
+
+
+Ext.define('Ext.fx.PropertyHandler', {
+
+    
+
+    requires: ['Ext.draw.Draw'],
+
+    statics: {
+        defaultHandler: {
+            pixelDefaultsRE: /width|height|top$|bottom$|left$|right$/i,
+            unitRE: /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/,
+            scrollRE: /^scroll/i,
+
+            computeDelta: function(from, end, damper, initial, attr) {
+                damper = (typeof damper == 'number') ? damper : 1;
+                var unitRE = this.unitRE,
+                    match = unitRE.exec(from),
+                    start, units;
+                if (match) {
+                    from = match[1];
+                    units = match[2];
+                    if (!this.scrollRE.test(attr) && !units && this.pixelDefaultsRE.test(attr)) {
+                        units = 'px';
+                    }
+                }
+                from = +from || 0;
+
+                match = unitRE.exec(end);
+                if (match) {
+                    end = match[1];
+                    units = match[2] || units;
+                }
+                end = +end || 0;
+                start = (initial != null) ? initial : from;
+                return {
+                    from: from,
+                    delta: (end - start) * damper,
+                    units: units
+                };
+            },
+
+            get: function(from, end, damper, initialFrom, attr) {
+                var ln = from.length,
+                    out = [],
+                    i, initial, res, j, len;
+                for (i = 0; i < ln; i++) {
+                    if (initialFrom) {
+                        initial = initialFrom[i][1].from;
+                    }
+                    if (Ext.isArray(from[i][1]) && Ext.isArray(end)) {
+                        res = [];
+                        j = 0;
+                        len = from[i][1].length;
+                        for (; j < len; j++) {
+                            res.push(this.computeDelta(from[i][1][j], end[j], damper, initial, attr));
+                        }
+                        out.push([from[i][0], res]);
+                    }
+                    else {
+                        out.push([from[i][0], this.computeDelta(from[i][1], end, damper, initial, attr)]);
+                    }
+                }
+                return out;
+            },
+
+            set: function(values, easing) {
+                var ln = values.length,
+                    out = [],
+                    i, val, res, len, j;
+                for (i = 0; i < ln; i++) {
+                    val  = values[i][1];
+                    if (Ext.isArray(val)) {
+                        res = [];
+                        j = 0;
+                        len = val.length;
+                        for (; j < len; j++) {
+                            res.push(val[j].from + (val[j].delta * easing) + (val[j].units || 0));
+                        }
+                        out.push([values[i][0], res]);
+                    } else {
+                        out.push([values[i][0], val.from + (val.delta * easing) + (val.units || 0)]);
+                    }
+                }
+                return out;
+            }
+        },
+        color: {
+            rgbRE: /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
+            hexRE: /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
+            hex3RE: /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,
+
+            parseColor : function(color, damper) {
+                damper = (typeof damper == 'number') ? damper : 1;
+                var base,
+                    out = false,
+                    match;
+
+                Ext.each([this.hexRE, this.rgbRE, this.hex3RE], function(re, idx) {
+                    base = (idx % 2 == 0) ? 16 : 10;
+                    match = re.exec(color);
+                    if (match && match.length == 4) {
+                        if (idx == 2) {
+                            match[1] += match[1];
+                            match[2] += match[2];
+                            match[3] += match[3];
+                        }
+                        out = {
+                            red: parseInt(match[1], base),
+                            green: parseInt(match[2], base),
+                            blue: parseInt(match[3], base)
+                        };
+                        return false;
+                    }
+                });
+                return out || color;
+            },
+
+            computeDelta: function(from, end, damper, initial) {
+                from = this.parseColor(from);
+                end = this.parseColor(end, damper);
+                var start = initial ? initial : from,
+                    tfrom = typeof start,
+                    tend = typeof end;
+                
+                if (tfrom == 'string' ||  tfrom == 'undefined' 
+                  || tend == 'string' || tend == 'undefined') {
+                    return end || start;
+                }
+                return {
+                    from:  from,
+                    delta: {
+                        red: Math.round((end.red - start.red) * damper),
+                        green: Math.round((end.green - start.green) * damper),
+                        blue: Math.round((end.blue - start.blue) * damper)
+                    }
+                };
+            },
+
+            get: function(start, end, damper, initialFrom) {
+                var ln = start.length,
+                    out = [],
+                    i, initial;
+                for (i = 0; i < ln; i++) {
+                    if (initialFrom) {
+                        initial = initialFrom[i][1].from;
+                    }
+                    out.push([start[i][0], this.computeDelta(start[i][1], end, damper, initial)]);
+                }
+                return out;
+            },
+
+            set: function(values, easing) {
+                var ln = values.length,
+                    out = [],
+                    i, val, parsedString, from, delta;
+                for (i = 0; i < ln; i++) {
+                    val = values[i][1];
+                    if (val) {
+                        from = val.from;
+                        delta = val.delta;
+                        
+                        val = (typeof val == 'object' && 'red' in val)? 
+                                'rgb(' + val.red + ', ' + val.green + ', ' + val.blue + ')' : val;
+                        val = (typeof val == 'object' && val.length)? val[0] : val;
+                        if (typeof val == 'undefined') {
+                            return [];
+                        }
+                        parsedString = typeof val == 'string'? val :
+                            'rgb(' + [
+                                  (from.red + Math.round(delta.red * easing)) % 256,
+                                  (from.green + Math.round(delta.green * easing)) % 256,
+                                  (from.blue + Math.round(delta.blue * easing)) % 256
+                              ].join(',') + ')';
+                        out.push([
+                            values[i][0],
+                            parsedString
+                        ]);
+                    }
+                }
+                return out;
+            }
+        },
+        object: {
+            interpolate: function(prop, damper) {
+                damper = (typeof damper == 'number') ? damper : 1;
+                var out = {},
+                    p;
+                for(p in prop) {
+                    out[p] = parseInt(prop[p], 10) * damper;
+                }
+                return out;
+            },
+
+            computeDelta: function(from, end, damper, initial) {
+                from = this.interpolate(from);
+                end = this.interpolate(end, damper);
+                var start = initial ? initial : from,
+                    delta = {},
+                    p;
+
+                for(p in end) {
+                    delta[p] = end[p] - start[p];
+                }
+                return {
+                    from:  from,
+                    delta: delta
+                };
+            },
+
+            get: function(start, end, damper, initialFrom) {
+                var ln = start.length,
+                    out = [],
+                    i, initial;
+                for (i = 0; i < ln; i++) {
+                    if (initialFrom) {
+                        initial = initialFrom[i][1].from;
+                    }
+                    out.push([start[i][0], this.computeDelta(start[i][1], end, damper, initial)]);
+                }
+                return out;
+            },
+
+            set: function(values, easing) {
+                var ln = values.length,
+                    out = [],
+                    outObject = {},
+                    i, from, delta, val, p;
+                for (i = 0; i < ln; i++) {
+                    val  = values[i][1];
+                    from = val.from;
+                    delta = val.delta;
+                    for (p in from) {
+                        outObject[p] = Math.round(from[p] + delta[p] * easing);
+                    }
+                    out.push([
+                        values[i][0],
+                        outObject
+                    ]);
+                }
+                return out;
+            }
+        },
+
+        path: {
+            computeDelta: function(from, end, damper, initial) {
+                damper = (typeof damper == 'number') ? damper : 1;
+                var start;
+                from = +from || 0;
+                end = +end || 0;
+                start = (initial != null) ? initial : from;
+                return {
+                    from: from,
+                    delta: (end - start) * damper
+                };
+            },
+
+            forcePath: function(path) {
+                if (!Ext.isArray(path) && !Ext.isArray(path[0])) {
+                    path = Ext.draw.Draw.parsePathString(path);
+                }
+                return path;
+            },
+
+            get: function(start, end, damper, initialFrom) {
+                var endPath = this.forcePath(end),
+                    out = [],
+                    startLn = start.length,
+                    startPathLn, pointsLn, i, deltaPath, initial, j, k, path, startPath;
+                for (i = 0; i < startLn; i++) {
+                    startPath = this.forcePath(start[i][1]);
+
+                    deltaPath = Ext.draw.Draw.interpolatePaths(startPath, endPath);
+                    startPath = deltaPath[0];
+                    endPath = deltaPath[1];
+
+                    startPathLn = startPath.length;
+                    path = [];
+                    for (j = 0; j < startPathLn; j++) {
+                        deltaPath = [startPath[j][0]];
+                        pointsLn = startPath[j].length;
+                        for (k = 1; k < pointsLn; k++) {
+                            initial = initialFrom && initialFrom[0][1][j][k].from;
+                            deltaPath.push(this.computeDelta(startPath[j][k], endPath[j][k], damper, initial));
+                        }
+                        path.push(deltaPath);
+                    }
+                    out.push([start[i][0], path]);
+                }
+                return out;
+            },
+
+            set: function(values, easing) {
+                var ln = values.length,
+                    out = [],
+                    i, j, k, newPath, calcPath, deltaPath, deltaPathLn, pointsLn;
+                for (i = 0; i < ln; i++) {
+                    deltaPath = values[i][1];
+                    newPath = [];
+                    deltaPathLn = deltaPath.length;
+                    for (j = 0; j < deltaPathLn; j++) {
+                        calcPath = [deltaPath[j][0]];
+                        pointsLn = deltaPath[j].length;
+                        for (k = 1; k < pointsLn; k++) {
+                            calcPath.push(deltaPath[j][k].from + deltaPath[j][k].delta * easing);
+                        }
+                        newPath.push(calcPath.join(','));
+                    }
+                    out.push([values[i][0], newPath.join(',')]);
+                }
+                return out;
+            }
+        }
+        
+    }
+}, function() {
+    Ext.each([
+        'outlineColor',
+        'backgroundColor',
+        'borderColor',
+        'borderTopColor',
+        'borderRightColor', 
+        'borderBottomColor', 
+        'borderLeftColor',
+        'fill',
+        'stroke'
+    ], function(prop) {
+        this[prop] = this.color;
+    }, this);
+});
+
+Ext.define('Ext.fx.Anim', {
+
+    
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    requires: ['Ext.fx.Manager', 'Ext.fx.Animator', 'Ext.fx.Easing', 'Ext.fx.CubicBezier', 'Ext.fx.PropertyHandler'],
+
+    
+
+    isAnimation: true,
+
+    
+
+    
+
+    
+    duration: 250,
+
+    
+    delay: 0,
+
+    
+    delayStart: 0,
+
+    
+    dynamic: false,
+
+    
+    easing: 'ease',
+
+     
+
+    
+    damper: 1,
+
+    
+    bezierRE: /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
+
+    
+    reverse: false,
+
+    
+    running: false,
+
+    
+    paused: false,
+
+    
+    iterations: 1,
+
+    
+    alternate: false,
+
+    
+    currentIteration: 0,
+
+    
+    startTime: 0,
+
+    
+
+    
+
+    
+
+    
+
+    
+    constructor: function(config) {
+        var me = this,
+            curve;
+            
+        config = config || {};
+        
+        if (config.keyframes) {
+            return Ext.create('Ext.fx.Animator', config);
+        }
+        config = Ext.apply(me, config);
+        if (me.from === undefined) {
+            me.from = {};
+        }
+        me.propHandlers = {};
+        me.config = config;
+        me.target = Ext.fx.Manager.createTarget(me.target);
+        me.easingFn = Ext.fx.Easing[me.easing];
+        me.target.dynamic = me.dynamic;
+
+        
+        if (!me.easingFn) {
+            me.easingFn = String(me.easing).match(me.bezierRE);
+            if (me.easingFn && me.easingFn.length == 5) {
+                curve = me.easingFn;
+                me.easingFn = Ext.fx.CubicBezier.cubicBezier(+curve[1], +curve[2], +curve[3], +curve[4]);
+            }
+        }
+        me.id = Ext.id(null, 'ext-anim-');
+        Ext.fx.Manager.addAnim(me);
+        me.addEvents(
+            
+            'beforeanimate',
+             
+            'afteranimate',
+             
+            'lastframe'
+        );
+        me.mixins.observable.constructor.call(me, config);
+        if (config.callback) {
+            me.on('afteranimate', config.callback, config.scope);
+        }
+        return me;
+    },
+
+    
+    setAttr: function(attr, value) {
+        return Ext.fx.Manager.items.get(this.id).setAttr(this.target, attr, value);
+    },
+
+    
+    initAttrs: function() {
+        var me = this,
+            from = me.from,
+            to = me.to,
+            initialFrom = me.initialFrom || {},
+            out = {},
+            start, end, propHandler, attr;
+
+        for (attr in to) {
+            if (to.hasOwnProperty(attr)) {
+                start = me.target.getAttr(attr, from[attr]);
+                end = to[attr];
+                
+                if (!Ext.fx.PropertyHandler[attr]) {
+                    if (Ext.isObject(end)) {
+                        propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler.object;
+                    } else {
+                        propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler.defaultHandler;
+                    }
+                }
+                
+                else {
+                    propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler[attr];
+                }
+                out[attr] = propHandler.get(start, end, me.damper, initialFrom[attr], attr);
+            }
+        }
+        me.currentAttrs = out;
+    },
+
+    
+    start: function(startTime) {
+        var me = this,
+            delay = me.delay,
+            delayStart = me.delayStart,
+            delayDelta;
+        if (delay) {
+            if (!delayStart) {
+                me.delayStart = startTime;
+                return;
+            }
+            else {
+                delayDelta = startTime - delayStart;
+                if (delayDelta < delay) {
+                    return;
+                }
+                else {
+                    
+                    startTime = new Date(delayStart.getTime() + delay);
+                }
+            }
+        }
+        if (me.fireEvent('beforeanimate', me) !== false) {
+            me.startTime = startTime;
+            if (!me.paused && !me.currentAttrs) {
+                me.initAttrs();
+            }
+            me.running = true;
+        }
+    },
+
+    
+    runAnim: function(elapsedTime) {
+        var me = this,
+            attrs = me.currentAttrs,
+            duration = me.duration,
+            easingFn = me.easingFn,
+            propHandlers = me.propHandlers,
+            ret = {},
+            easing, values, attr, lastFrame;
+
+        if (elapsedTime >= duration) {
+            elapsedTime = duration;
+            lastFrame = true;
+        }
+        if (me.reverse) {
+            elapsedTime = duration - elapsedTime;
+        }
+
+        for (attr in attrs) {
+            if (attrs.hasOwnProperty(attr)) {
+                values = attrs[attr];
+                easing = lastFrame ? 1 : easingFn(elapsedTime / duration);
+                ret[attr] = propHandlers[attr].set(values, easing);
+            }
+        }
+        return ret;
+    },
+
+    
+    lastFrame: function() {
+        var me = this,
+            iter = me.iterations,
+            iterCount = me.currentIteration;
+
+        iterCount++;
+        if (iterCount < iter) {
+            if (me.alternate) {
+                me.reverse = !me.reverse;
+            }
+            me.startTime = new Date();
+            me.currentIteration = iterCount;
+            
+            me.paused = false;
+        }
+        else {
+            me.currentIteration = 0;
+            me.end();
+            me.fireEvent('lastframe', me, me.startTime);
+        }
+    },
+
+    
+    end: function() {
+        var me = this;
+        me.startTime = 0;
+        me.paused = false;
+        me.running = false;
+        Ext.fx.Manager.removeAnim(me);
+        me.fireEvent('afteranimate', me, me.startTime);
+    }
+});
+
+Ext.enableFx = true;
+
+
+
+
+
+Ext.define('Ext.dd.DragDrop', {
+    requires: ['Ext.dd.DragDropManager'],
+
+    
+    constructor: function(id, sGroup, config) {
+        if(id) {
+            this.init(id, sGroup, config);
+        }
+    },
+
+    
+
+    
+    id: null,
+
+    
+    config: null,
+
+    
+    dragElId: null,
+
+    
+    handleElId: null,
+
+    
+    invalidHandleTypes: null,
+
+    
+    invalidHandleIds: null,
+
+    
+    invalidHandleClasses: null,
+
+    
+    startPageX: 0,
+
+    
+    startPageY: 0,
+
+    
+    groups: null,
+
+    
+    locked: false,
+
+    
+    lock: function() {
+        this.locked = true;
+    },
+
+    
+    moveOnly: false,
+
+    
+    unlock: function() {
+        this.locked = false;
+    },
+
+    
+    isTarget: true,
+
+    
+    padding: null,
+
+    
+    _domRef: null,
+
+    
+    __ygDragDrop: true,
+
+    
+    constrainX: false,
+
+    
+    constrainY: false,
+
+    
+    minX: 0,
+
+    
+    maxX: 0,
+
+    
+    minY: 0,
+
+    
+    maxY: 0,
+
+    
+    maintainOffset: false,
+
+    
+    xTicks: null,
+
+    
+    yTicks: null,
+
+    
+    primaryButtonOnly: true,
+
+    
+    available: false,
+
+    
+    hasOuterHandles: false,
+
+    
+    b4StartDrag: function(x, y) { },
+
+    
+    startDrag: function(x, y) {  },
+
+    
+    b4Drag: function(e) { },
+
+    
+    onDrag: function(e) {  },
+
+    
+    onDragEnter: function(e, id) {  },
+
+    
+    b4DragOver: function(e) { },
+
+    
+    onDragOver: function(e, id) {  },
+
+    
+    b4DragOut: function(e) { },
+
+    
+    onDragOut: function(e, id) {  },
+
+    
+    b4DragDrop: function(e) { },
+
+    
+    onDragDrop: function(e, id) {  },
+
+    
+    onInvalidDrop: function(e) {  },
+
+    
+    b4EndDrag: function(e) { },
+
+    
+    endDrag: function(e) {  },
+
+    
+    b4MouseDown: function(e) {  },
+
+    
+    onMouseDown: function(e) {  },
+
+    
+    onMouseUp: function(e) {  },
+
+    
+    onAvailable: function () {
+    },
+
+    
+    defaultPadding: {
+        left: 0,
+        right: 0,
+        top: 0,
+        bottom: 0
+    },
+
+    
+    constrainTo : function(constrainTo, pad, inContent){
+        if(Ext.isNumber(pad)){
+            pad = {left: pad, right:pad, top:pad, bottom:pad};
+        }
+        pad = pad || this.defaultPadding;
+        var b = Ext.get(this.getEl()).getBox(),
+            ce = Ext.get(constrainTo),
+            s = ce.getScroll(),
+            c,
+            cd = ce.dom;
+        if(cd == document.body){
+            c = { x: s.left, y: s.top, width: Ext.Element.getViewWidth(), height: Ext.Element.getViewHeight()};
+        }else{
+            var xy = ce.getXY();
+            c = {x : xy[0], y: xy[1], width: cd.clientWidth, height: cd.clientHeight};
+        }
+
+
+        var topSpace = b.y - c.y,
+            leftSpace = b.x - c.x;
+
+        this.resetConstraints();
+        this.setXConstraint(leftSpace - (pad.left||0), 
+                c.width - leftSpace - b.width - (pad.right||0), 
+				this.xTickSize
+        );
+        this.setYConstraint(topSpace - (pad.top||0), 
+                c.height - topSpace - b.height - (pad.bottom||0), 
+				this.yTickSize
+        );
+    },
+
+    
+    getEl: function() {
+        if (!this._domRef) {
+            this._domRef = Ext.getDom(this.id);
+        }
+
+        return this._domRef;
+    },
+
+    
+    getDragEl: function() {
+        return Ext.getDom(this.dragElId);
+    },
+
+    
+    init: function(id, sGroup, config) {
+        this.initTarget(id, sGroup, config);
+        Ext.EventManager.on(this.id, "mousedown", this.handleMouseDown, this);
+        
+    },
+
+    
+    initTarget: function(id, sGroup, config) {
+        
+        this.config = config || {};
+
+        
+        this.DDMInstance = Ext.dd.DragDropManager;
+        
+        this.groups = {};
+
+        
+        
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+
+        
+        this.id = id;
+
+        
+        this.addToGroup((sGroup) ? sGroup : "default");
+
+        
+        
+        this.handleElId = id;
+
+        
+        this.setDragElId(id);
+
+        
+        this.invalidHandleTypes = { A: "A" };
+        this.invalidHandleIds = {};
+        this.invalidHandleClasses = [];
+
+        this.applyConfig();
+
+        this.handleOnAvailable();
+    },
+
+    
+    applyConfig: function() {
+
+        
+        
+        this.padding           = this.config.padding || [0, 0, 0, 0];
+        this.isTarget          = (this.config.isTarget !== false);
+        this.maintainOffset    = (this.config.maintainOffset);
+        this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
+
+    },
+
+    
+    handleOnAvailable: function() {
+        this.available = true;
+        this.resetConstraints();
+        this.onAvailable();
+    },
+
+    
+    setPadding: function(iTop, iRight, iBot, iLeft) {
+        
+        if (!iRight && 0 !== iRight) {
+            this.padding = [iTop, iTop, iTop, iTop];
+        } else if (!iBot && 0 !== iBot) {
+            this.padding = [iTop, iRight, iTop, iRight];
+        } else {
+            this.padding = [iTop, iRight, iBot, iLeft];
+        }
+    },
+
+    
+    setInitPosition: function(diffX, diffY) {
+        var el = this.getEl();
+
+        if (!this.DDMInstance.verifyEl(el)) {
+            return;
+        }
+
+        var dx = diffX || 0;
+        var dy = diffY || 0;
+
+        var p = Ext.Element.getXY( el );
+
+        this.initPageX = p[0] - dx;
+        this.initPageY = p[1] - dy;
+
+        this.lastPageX = p[0];
+        this.lastPageY = p[1];
+
+        this.setStartPosition(p);
+    },
+
+    
+    setStartPosition: function(pos) {
+        var p = pos || Ext.Element.getXY( this.getEl() );
+        this.deltaSetXY = null;
+
+        this.startPageX = p[0];
+        this.startPageY = p[1];
+    },
+
+    
+    addToGroup: function(sGroup) {
+        this.groups[sGroup] = true;
+        this.DDMInstance.regDragDrop(this, sGroup);
+    },
+
+    
+    removeFromGroup: function(sGroup) {
+        if (this.groups[sGroup]) {
+            delete this.groups[sGroup];
+        }
+
+        this.DDMInstance.removeDDFromGroup(this, sGroup);
+    },
+
+    
+    setDragElId: function(id) {
+        this.dragElId = id;
+    },
+
+    
+    setHandleElId: function(id) {
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+        this.handleElId = id;
+        this.DDMInstance.regHandle(this.id, id);
+    },
+
+    
+    setOuterHandleElId: function(id) {
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+        Ext.EventManager.on(id, "mousedown", this.handleMouseDown, this);
+        this.setHandleElId(id);
+
+        this.hasOuterHandles = true;
+    },
+
+    
+    unreg: function() {
+        Ext.EventManager.un(this.id, "mousedown", this.handleMouseDown, this);
+        this._domRef = null;
+        this.DDMInstance._remove(this);
+    },
+
+    destroy : function(){
+        this.unreg();
+    },
+
+    
+    isLocked: function() {
+        return (this.DDMInstance.isLocked() || this.locked);
+    },
+
+    
+    handleMouseDown: function(e, oDD){
+        if (this.primaryButtonOnly && e.button != 0) {
+            return;
+        }
+
+        if (this.isLocked()) {
+            return;
+        }
+
+        this.DDMInstance.refreshCache(this.groups);
+
+        var pt = e.getPoint();
+        if (!this.hasOuterHandles && !this.DDMInstance.isOverTarget(pt, this) )  {
+        } else {
+            if (this.clickValidator(e)) {
+                
+                this.setStartPosition();
+                this.b4MouseDown(e);
+                this.onMouseDown(e);
+
+                this.DDMInstance.handleMouseDown(e, this);
+
+                this.DDMInstance.stopEvent(e);
+            } else {
+
+
+            }
+        }
+    },
+
+    clickValidator: function(e) {
+        var target = e.getTarget();
+        return ( this.isValidHandleChild(target) &&
+                    (this.id == this.handleElId ||
+                        this.DDMInstance.handleWasClicked(target, this.id)) );
+    },
+
+    
+    addInvalidHandleType: function(tagName) {
+        var type = tagName.toUpperCase();
+        this.invalidHandleTypes[type] = type;
+    },
+
+    
+    addInvalidHandleId: function(id) {
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+        this.invalidHandleIds[id] = id;
+    },
+
+    
+    addInvalidHandleClass: function(cssClass) {
+        this.invalidHandleClasses.push(cssClass);
+    },
+
+    
+    removeInvalidHandleType: function(tagName) {
+        var type = tagName.toUpperCase();
+        
+        delete this.invalidHandleTypes[type];
+    },
+
+    
+    removeInvalidHandleId: function(id) {
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+        delete this.invalidHandleIds[id];
+    },
+
+    
+    removeInvalidHandleClass: function(cssClass) {
+        for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
+            if (this.invalidHandleClasses[i] == cssClass) {
+                delete this.invalidHandleClasses[i];
+            }
+        }
+    },
+
+    
+    isValidHandleChild: function(node) {
+
+        var valid = true;
+        
+        var nodeName;
+        try {
+            nodeName = node.nodeName.toUpperCase();
+        } catch(e) {
+            nodeName = node.nodeName;
+        }
+        valid = valid && !this.invalidHandleTypes[nodeName];
+        valid = valid && !this.invalidHandleIds[node.id];
+
+        for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
+            valid = !Ext.fly(node).hasCls(this.invalidHandleClasses[i]);
+        }
+
+
+        return valid;
+
+    },
+
+    
+    setXTicks: function(iStartX, iTickSize) {
+        this.xTicks = [];
+        this.xTickSize = iTickSize;
+
+        var tickMap = {};
+
+        for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {
+            if (!tickMap[i]) {
+                this.xTicks[this.xTicks.length] = i;
+                tickMap[i] = true;
+            }
+        }
+
+        for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
+            if (!tickMap[i]) {
+                this.xTicks[this.xTicks.length] = i;
+                tickMap[i] = true;
+            }
+        }
+
+        Ext.Array.sort(this.xTicks, this.DDMInstance.numericSort);
+    },
+
+    
+    setYTicks: function(iStartY, iTickSize) {
+        this.yTicks = [];
+        this.yTickSize = iTickSize;
+
+        var tickMap = {};
+
+        for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
+            if (!tickMap[i]) {
+                this.yTicks[this.yTicks.length] = i;
+                tickMap[i] = true;
+            }
+        }
+
+        for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
+            if (!tickMap[i]) {
+                this.yTicks[this.yTicks.length] = i;
+                tickMap[i] = true;
+            }
+        }
+
+        Ext.Array.sort(this.yTicks, this.DDMInstance.numericSort);
+    },
+
+    
+    setXConstraint: function(iLeft, iRight, iTickSize) {
+        this.leftConstraint = iLeft;
+        this.rightConstraint = iRight;
+
+        this.minX = this.initPageX - iLeft;
+        this.maxX = this.initPageX + iRight;
+        if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
+
+        this.constrainX = true;
+    },
+
+    
+    clearConstraints: function() {
+        this.constrainX = false;
+        this.constrainY = false;
+        this.clearTicks();
+    },
+
+    
+    clearTicks: function() {
+        this.xTicks = null;
+        this.yTicks = null;
+        this.xTickSize = 0;
+        this.yTickSize = 0;
+    },
+
+    
+    setYConstraint: function(iUp, iDown, iTickSize) {
+        this.topConstraint = iUp;
+        this.bottomConstraint = iDown;
+
+        this.minY = this.initPageY - iUp;
+        this.maxY = this.initPageY + iDown;
+        if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
+
+        this.constrainY = true;
+
+    },
+
+    
+    resetConstraints: function() {
+        
+        if (this.initPageX || this.initPageX === 0) {
+            
+            var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
+            var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
+
+            this.setInitPosition(dx, dy);
+
+        
+        } else {
+            this.setInitPosition();
+        }
+
+        if (this.constrainX) {
+            this.setXConstraint( this.leftConstraint,
+                                 this.rightConstraint,
+                                 this.xTickSize        );
+        }
+
+        if (this.constrainY) {
+            this.setYConstraint( this.topConstraint,
+                                 this.bottomConstraint,
+                                 this.yTickSize         );
+        }
+    },
+
+    
+    getTick: function(val, tickArray) {
+        if (!tickArray) {
+            
+            
+            return val;
+        } else if (tickArray[0] >= val) {
+            
+            
+            return tickArray[0];
+        } else {
+            for (var i=0, len=tickArray.length; i<len; ++i) {
+                var next = i + 1;
+                if (tickArray[next] && tickArray[next] >= val) {
+                    var diff1 = val - tickArray[i];
+                    var diff2 = tickArray[next] - val;
+                    return (diff2 > diff1) ? tickArray[i] : tickArray[next];
+                }
+            }
+
+            
+            
+            return tickArray[tickArray.length - 1];
+        }
+    },
+
+    
+    toString: function() {
+        return ("DragDrop " + this.id);
+    }
+
+});
+
+
+
+
+
+Ext.define('Ext.dd.DD', {
+    extend: 'Ext.dd.DragDrop',
+    requires: ['Ext.dd.DragDropManager'],
+
+    
+    constructor: function(id, sGroup, config) {
+        if (id) {
+            this.init(id, sGroup, config);
+        }
+    },
+
+    
+    scroll: true,
+
+    
+    autoOffset: function(iPageX, iPageY) {
+        var x = iPageX - this.startPageX;
+        var y = iPageY - this.startPageY;
+        this.setDelta(x, y);
+    },
+
+    
+    setDelta: function(iDeltaX, iDeltaY) {
+        this.deltaX = iDeltaX;
+        this.deltaY = iDeltaY;
+    },
+
+    
+    setDragElPos: function(iPageX, iPageY) {
+        
+        
+
+        var el = this.getDragEl();
+        this.alignElWithMouse(el, iPageX, iPageY);
+    },
+
+    
+    alignElWithMouse: function(el, iPageX, iPageY) {
+        var oCoord = this.getTargetCoord(iPageX, iPageY),
+            fly = el.dom ? el : Ext.fly(el, '_dd'),
+            elSize = fly.getSize(),
+            EL = Ext.Element,
+            vpSize;
+
+        if (!this.deltaSetXY) {
+            vpSize = this.cachedViewportSize = { width: EL.getDocumentWidth(), height: EL.getDocumentHeight() };
+            var aCoord = [
+                Math.max(0, Math.min(oCoord.x, vpSize.width - elSize.width)),
+                Math.max(0, Math.min(oCoord.y, vpSize.height - elSize.height))
+            ];
+            fly.setXY(aCoord);
+            var newLeft = fly.getLeft(true);
+            var newTop  = fly.getTop(true);
+            this.deltaSetXY = [newLeft - oCoord.x, newTop - oCoord.y];
+        } else {
+            vpSize = this.cachedViewportSize;
+            fly.setLeftTop(
+                Math.max(0, Math.min(oCoord.x + this.deltaSetXY[0], vpSize.width - elSize.width)),
+                Math.max(0, Math.min(oCoord.y + this.deltaSetXY[1], vpSize.height - elSize.height))
+            );
+        }
+
+        this.cachePosition(oCoord.x, oCoord.y);
+        this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
+        return oCoord;
+    },
+
+    
+    cachePosition: function(iPageX, iPageY) {
+        if (iPageX) {
+            this.lastPageX = iPageX;
+            this.lastPageY = iPageY;
+        } else {
+            var aCoord = Ext.Element.getXY(this.getEl());
+            this.lastPageX = aCoord[0];
+            this.lastPageY = aCoord[1];
+        }
+    },
+
+    
+    autoScroll: function(x, y, h, w) {
+
+        if (this.scroll) {
+            
+            var clientH = Ext.Element.getViewHeight();
+
+            
+            var clientW = Ext.Element.getViewWidth();
+
+            
+            var st = this.DDMInstance.getScrollTop();
+
+            
+            var sl = this.DDMInstance.getScrollLeft();
+
+            
+            var bot = h + y;
+
+            
+            var right = w + x;
+
+            
+            
+            
+            var toBot = (clientH + st - y - this.deltaY);
+
+            
+            var toRight = (clientW + sl - x - this.deltaX);
+
+
+            
+            
+            var thresh = 40;
+
+            
+            
+            
+            var scrAmt = (document.all) ? 80 : 30;
+
+            
+            
+            if ( bot > clientH && toBot < thresh ) {
+                window.scrollTo(sl, st + scrAmt);
+            }
+
+            
+            
+            if ( y < st && st > 0 && y - st < thresh ) {
+                window.scrollTo(sl, st - scrAmt);
+            }
+
+            
+            
+            if ( right > clientW && toRight < thresh ) {
+                window.scrollTo(sl + scrAmt, st);
+            }
+
+            
+            
+            if ( x < sl && sl > 0 && x - sl < thresh ) {
+                window.scrollTo(sl - scrAmt, st);
+            }
+        }
+    },
+
+    
+    getTargetCoord: function(iPageX, iPageY) {
+        var x = iPageX - this.deltaX;
+        var y = iPageY - this.deltaY;
+
+        if (this.constrainX) {
+            if (x < this.minX) {
+                x = this.minX;
+            }
+            if (x > this.maxX) {
+                x = this.maxX;
+            }
+        }
+
+        if (this.constrainY) {
+            if (y < this.minY) {
+                y = this.minY;
+            }
+            if (y > this.maxY) {
+                y = this.maxY;
+            }
+        }
+
+        x = this.getTick(x, this.xTicks);
+        y = this.getTick(y, this.yTicks);
+
+
+        return {x: x, y: y};
+    },
+
+    
+    applyConfig: function() {
+        this.callParent();
+        this.scroll = (this.config.scroll !== false);
+    },
+
+    
+    b4MouseDown: function(e) {
+        
+        this.autoOffset(e.getPageX(), e.getPageY());
+    },
+
+    
+    b4Drag: function(e) {
+        this.setDragElPos(e.getPageX(), e.getPageY());
+    },
+
+    toString: function() {
+        return ("DD " + this.id);
+    }
+
+    
+    
+    
+    
+
+});
+
+
+
+
+Ext.define('Ext.dd.DDProxy', {
+    extend: 'Ext.dd.DD',
+
+    statics: {
+        
+        dragElId: "ygddfdiv"
+    },
+
+    
+    constructor: function(id, sGroup, config) {
+        if (id) {
+            this.init(id, sGroup, config);
+            this.initFrame();
+        }
+    },
+
+    
+    resizeFrame: true,
+
+    
+    centerFrame: false,
+
+    
+    createFrame: function() {
+        var self = this;
+        var body = document.body;
+
+        if (!body || !body.firstChild) {
+            setTimeout( function() { self.createFrame(); }, 50 );
+            return;
+        }
+
+        var div = this.getDragEl();
+
+        if (!div) {
+            div    = document.createElement("div");
+            div.id = this.dragElId;
+            var s  = div.style;
+
+            s.position   = "absolute";
+            s.visibility = "hidden";
+            s.cursor     = "move";
+            s.border     = "2px solid #aaa";
+            s.zIndex     = 999;
+
+            
+            
+            
+            body.insertBefore(div, body.firstChild);
+        }
+    },
+
+    
+    initFrame: function() {
+        this.createFrame();
+    },
+
+    applyConfig: function() {
+        this.callParent();
+
+        this.resizeFrame = (this.config.resizeFrame !== false);
+        this.centerFrame = (this.config.centerFrame);
+        this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);
+    },
+
+    
+    showFrame: function(iPageX, iPageY) {
+        var el = this.getEl();
+        var dragEl = this.getDragEl();
+        var s = dragEl.style;
+
+        this._resizeProxy();
+
+        if (this.centerFrame) {
+            this.setDelta( Math.round(parseInt(s.width,  10)/2),
+                           Math.round(parseInt(s.height, 10)/2) );
+        }
+
+        this.setDragElPos(iPageX, iPageY);
+
+        Ext.fly(dragEl).show();
+    },
+
+    
+    _resizeProxy: function() {
+        if (this.resizeFrame) {
+            var el = this.getEl();
+            Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);
+        }
+    },
+
+    
+    b4MouseDown: function(e) {
+        var x = e.getPageX();
+        var y = e.getPageY();
+        this.autoOffset(x, y);
+        this.setDragElPos(x, y);
+    },
+
+    
+    b4StartDrag: function(x, y) {
+        
+        this.showFrame(x, y);
+    },
+
+    
+    b4EndDrag: function(e) {
+        Ext.fly(this.getDragEl()).hide();
+    },
+
+    
+    
+    
+    endDrag: function(e) {
+
+        var lel = this.getEl();
+        var del = this.getDragEl();
+
+        
+        del.style.visibility = "";
+
+        this.beforeMove();
+        
+        
+        lel.style.visibility = "hidden";
+        Ext.dd.DDM.moveToEl(lel, del);
+        del.style.visibility = "hidden";
+        lel.style.visibility = "";
+
+        this.afterDrag();
+    },
+
+    beforeMove : function(){
+
+    },
+
+    afterDrag : function(){
+
+    },
+
+    toString: function() {
+        return ("DDProxy " + this.id);
+    }
+
+});
+
+
+Ext.define('Ext.dd.DragSource', {
+    extend: 'Ext.dd.DDProxy',
+    requires: [
+        'Ext.dd.StatusProxy',
+        'Ext.dd.DragDropManager'
+    ],
+
+    
+
+    
+    dropAllowed : Ext.baseCSSPrefix + 'dd-drop-ok',
+    
+    dropNotAllowed : Ext.baseCSSPrefix + 'dd-drop-nodrop',
+
+    
+    animRepair: true,
+
+    
+    repairHighlightColor: 'c3daf9',
+
+    
+    constructor: function(el, config) {
+        this.el = Ext.get(el);
+        if(!this.dragData){
+            this.dragData = {};
+        }
+
+        Ext.apply(this, config);
+
+        if(!this.proxy){
+            this.proxy = Ext.create('Ext.dd.StatusProxy', {
+                animRepair: this.animRepair
+            });
+        }
+        this.callParent([this.el.dom, this.ddGroup || this.group,
+              {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true}]);
+
+        this.dragging = false;
+    },
+
+    
+    getDragData : function(e){
+        return this.dragData;
+    },
+
+    
+    onDragEnter : function(e, id){
+        var target = Ext.dd.DragDropManager.getDDById(id);
+        this.cachedTarget = target;
+        if (this.beforeDragEnter(target, e, id) !== false) {
+            if (target.isNotifyTarget) {
+                var status = target.notifyEnter(this, e, this.dragData);
+                this.proxy.setStatus(status);
+            } else {
+                this.proxy.setStatus(this.dropAllowed);
+            }
+
+            if (this.afterDragEnter) {
+                
+                this.afterDragEnter(target, e, id);
+            }
+        }
+    },
+
+    
+    beforeDragEnter: function(target, e, id) {
+        return true;
+    },
+
+    
+    alignElWithMouse: function() {
+        this.callParent(arguments);
+        this.proxy.sync();
+    },
+
+    
+    onDragOver: function(e, id) {
+        var target = this.cachedTarget || Ext.dd.DragDropManager.getDDById(id);
+        if (this.beforeDragOver(target, e, id) !== false) {
+            if(target.isNotifyTarget){
+                var status = target.notifyOver(this, e, this.dragData);
+                this.proxy.setStatus(status);
+            }
+
+            if (this.afterDragOver) {
+                
+                this.afterDragOver(target, e, id);
+            }
+        }
+    },
+
+    
+    beforeDragOver: function(target, e, id) {
+        return true;
+    },
+
+    
+    onDragOut: function(e, id) {
+        var target = this.cachedTarget || Ext.dd.DragDropManager.getDDById(id);
+        if (this.beforeDragOut(target, e, id) !== false) {
+            if (target.isNotifyTarget) {
+                target.notifyOut(this, e, this.dragData);
+            }
+            this.proxy.reset();
+            if (this.afterDragOut) {
+                
+                this.afterDragOut(target, e, id);
+            }
+        }
+        this.cachedTarget = null;
+    },
+
+    
+    beforeDragOut: function(target, e, id){
+        return true;
+    },
+
+    
+    onDragDrop: function(e, id){
+        var target = this.cachedTarget || Ext.dd.DragDropManager.getDDById(id);
+        if (this.beforeDragDrop(target, e, id) !== false) {
+            if (target.isNotifyTarget) {
+                if (target.notifyDrop(this, e, this.dragData) !== false) { 
+                    this.onValidDrop(target, e, id);
+                } else {
+                    this.onInvalidDrop(target, e, id);
+                }
+            } else {
+                this.onValidDrop(target, e, id);
+            }
+
+            if (this.afterDragDrop) {
+                
+                this.afterDragDrop(target, e, id);
+            }
+        }
+        delete this.cachedTarget;
+    },
+
+    
+    beforeDragDrop: function(target, e, id){
+        return true;
+    },
+
+    
+    onValidDrop: function(target, e, id){
+        this.hideProxy();
+        if(this.afterValidDrop){
+            
+            this.afterValidDrop(target, e, id);
+        }
+    },
+
+    
+    getRepairXY: function(e, data){
+        return this.el.getXY();
+    },
+
+    
+    onInvalidDrop: function(target, e, id) {
+        this.beforeInvalidDrop(target, e, id);
+        if (this.cachedTarget) {
+            if(this.cachedTarget.isNotifyTarget){
+                this.cachedTarget.notifyOut(this, e, this.dragData);
+            }
+            this.cacheTarget = null;
+        }
+        this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);
+
+        if (this.afterInvalidDrop) {
+            
+            this.afterInvalidDrop(e, id);
+        }
+    },
+
+    
+    afterRepair: function() {
+        var me = this;
+        if (Ext.enableFx) {
+            me.el.highlight(me.repairHighlightColor);
+        }
+        me.dragging = false;
+    },
+
+    
+    beforeInvalidDrop: function(target, e, id) {
+        return true;
+    },
+
+    
+    handleMouseDown: function(e) {
+        if (this.dragging) {
+            return;
+        }
+        var data = this.getDragData(e);
+        if (data && this.onBeforeDrag(data, e) !== false) {
+            this.dragData = data;
+            this.proxy.stop();
+            this.callParent(arguments);
+        }
+    },
+
+    
+    onBeforeDrag: function(data, e){
+        return true;
+    },
+
+    
+    onStartDrag: Ext.emptyFn,
+
+    
+    startDrag: function(x, y) {
+        this.proxy.reset();
+        this.dragging = true;
+        this.proxy.update("");
+        this.onInitDrag(x, y);
+        this.proxy.show();
+    },
+
+    
+    onInitDrag: function(x, y) {
+        var clone = this.el.dom.cloneNode(true);
+        clone.id = Ext.id(); 
+        this.proxy.update(clone);
+        this.onStartDrag(x, y);
+        return true;
+    },
+
+    
+    getProxy: function() {
+        return this.proxy;
+    },
+
+    
+    hideProxy: function() {
+        this.proxy.hide();
+        this.proxy.reset(true);
+        this.dragging = false;
+    },
+
+    
+    triggerCacheRefresh: function() {
+        Ext.dd.DDM.refreshCache(this.groups);
+    },
+
+    
+    b4EndDrag: function(e) {
+    },
+
+    
+    endDrag : function(e){
+        this.onEndDrag(this.dragData, e);
+    },
+
+    
+    onEndDrag : function(data, e){
+    },
+
+    
+    autoOffset : function(x, y) {
+        this.setDelta(-12, -20);
+    },
+
+    destroy: function(){
+        this.callParent();
+        Ext.destroy(this.proxy);
+    }
+});
+
+
+Ext.define('Ext.panel.DD', {
+    extend: 'Ext.dd.DragSource',
+    requires: ['Ext.panel.Proxy'],
+
+    constructor : function(panel, cfg){
+        this.panel = panel;
+        this.dragData = {panel: panel};
+        this.proxy = Ext.create('Ext.panel.Proxy', panel, cfg);
+
+        this.callParent([panel.el, cfg]);
+
+        Ext.defer(function() {
+            var header = panel.header,
+                el = panel.body;
+
+            if(header){
+                this.setHandleElId(header.id);
+                el = header.el;
+            }
+            el.setStyle('cursor', 'move');
+            this.scroll = false;
+        }, 200, this);
+    },
+
+    showFrame: Ext.emptyFn,
+    startDrag: Ext.emptyFn,
+    b4StartDrag: function(x, y) {
+        this.proxy.show();
+    },
+    b4MouseDown: function(e) {
+        var x = e.getPageX(),
+            y = e.getPageY();
+        this.autoOffset(x, y);
+    },
+    onInitDrag : function(x, y){
+        this.onStartDrag(x, y);
+        return true;
+    },
+    createFrame : Ext.emptyFn,
+    getDragEl : function(e){
+        return this.proxy.ghost.el.dom;
+    },
+    endDrag : function(e){
+        this.proxy.hide();
+        this.panel.saveState();
+    },
+
+    autoOffset : function(x, y) {
+        x -= this.startPageX;
+        y -= this.startPageY;
+        this.setDelta(x, y);
+    }
+});
+
+
+Ext.define('Ext.layout.component.Dock', {
+
+    
+
+    alias: ['layout.dock'],
+
+    extend: 'Ext.layout.component.AbstractDock'
+
+    
+
+});
+
+Ext.define('Ext.panel.Panel', {
+    extend: 'Ext.panel.AbstractPanel',
+    requires: [
+        'Ext.panel.Header',
+        'Ext.fx.Anim',
+        'Ext.util.KeyMap',
+        'Ext.panel.DD',
+        'Ext.XTemplate',
+        'Ext.layout.component.Dock',
+        'Ext.util.Memento'
+    ],
+    alias: 'widget.panel',
+    alternateClassName: 'Ext.Panel',
+
+    
+    collapsedCls: 'collapsed',
+
+    
+    animCollapse: Ext.enableFx,
+
+    
+    minButtonWidth: 75,
+
+    
+    collapsed: false,
+
+    
+    collapseFirst: true,
+
+    
+    hideCollapseTool: false,
+
+    
+    titleCollapse: false,
+
+    
+
+    
+
+    
+    floatable: true,
+
+    
+
+    
+    collapsible: false,
+
+    
+
+    
+    closable: false,
+
+    
+    closeAction: 'destroy',
+
+    
+
+    
+    preventHeader: false,
+
+     
+    headerPosition: 'top',
+
+     
+    frame: false,
+
+    
+    frameHeader: true,
+
+    
+
+    
+
+    
+
+    initComponent: function() {
+        var me = this,
+            cls;
+
+        me.addEvents(
+
+            
+            'beforeclose',
+
+            
+            "beforeexpand",
+
+            
+            "beforecollapse",
+
+            
+            "expand",
+
+            
+            "collapse",
+
+            
+            'titlechange',
+
+            
+            'iconchange'
+        );
+
+        
+        this.addStateEvents('expand', 'collapse');
+
+        if (me.unstyled) {
+            me.setUI('plain');
+        }
+
+        if (me.frame) {
+            me.setUI(me.ui + '-framed');
+        }
+
+        
+        me.bridgeToolbars();
+
+        me.callParent();
+        me.collapseDirection = me.collapseDirection || me.headerPosition || Ext.Component.DIRECTION_TOP;
+    },
+
+    setBorder: function(border) {
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+
+        this.callParent(arguments);
+    },
+
+    beforeDestroy: function() {
+        Ext.destroy(
+            this.ghostPanel,
+            this.dd
+        );
+        this.callParent();
+    },
+
+    initAria: function() {
+        this.callParent();
+        this.initHeaderAria();
+    },
+
+    initHeaderAria: function() {
+        var me = this,
+            el = me.el,
+            header = me.header;
+        if (el && header) {
+            el.dom.setAttribute('aria-labelledby', header.titleCmp.id);
+        }
+    },
+
+    getHeader: function() {
+        return this.header;
+    },
+
+    
+    setTitle: function(newTitle) {
+        var me = this,
+        oldTitle = this.title;
+
+        me.title = newTitle;
+        if (me.header) {
+            me.header.setTitle(newTitle);
+        } else {
+            me.updateHeader();
+        }
+
+        if (me.reExpander) {
+            me.reExpander.setTitle(newTitle);
+        }
+        me.fireEvent('titlechange', me, newTitle, oldTitle);
+    },
+
+    
+    setIconCls: function(newIconCls) {
+        var me = this,
+            oldIconCls = me.iconCls;
+
+        me.iconCls = newIconCls;
+        var header = me.header;
+        if (header) {
+            header.setIconCls(newIconCls);
+        }
+        me.fireEvent('iconchange', me, newIconCls, oldIconCls);
+    },
+
+    bridgeToolbars: function() {
+        var me = this,
+            docked = [],
+            fbar,
+            fbarDefaults,
+            minButtonWidth = me.minButtonWidth;
+
+        function initToolbar (toolbar, pos, useButtonAlign) {
+            if (Ext.isArray(toolbar)) {
+                toolbar = {
+                    xtype: 'toolbar',
+                    items: toolbar
+                };
+            }
+            else if (!toolbar.xtype) {
+                toolbar.xtype = 'toolbar';
+            }
+            toolbar.dock = pos;
+            if (pos == 'left' || pos == 'right') {
+                toolbar.vertical = true;
+            }
+
+            
+            if (useButtonAlign) {
+                toolbar.layout = Ext.applyIf(toolbar.layout || {}, {
+                    
+                    pack: { left:'start', center:'center' }[me.buttonAlign] || 'end'
+                });
+            }
+            return toolbar;
+        }
+
+        
+
+        
+
+        
+        if (me.tbar) {
+            docked.push(initToolbar(me.tbar, 'top'));
+            me.tbar = null;
+        }
+
+        
+        if (me.bbar) {
+            docked.push(initToolbar(me.bbar, 'bottom'));
+            me.bbar = null;
+        }
+
+        
+        if (me.buttons) {
+            me.fbar = me.buttons;
+            me.buttons = null;
+        }
+
+        
+        if (me.fbar) {
+            fbar = initToolbar(me.fbar, 'bottom', true); 
+            fbar.ui = 'footer';
+
+            
+            if (minButtonWidth) {
+                fbarDefaults = fbar.defaults;
+                fbar.defaults = function(config) {
+                    var defaults = fbarDefaults || {};
+                    if ((!config.xtype || config.xtype === 'button' || (config.isComponent && config.isXType('button'))) &&
+                            !('minWidth' in defaults)) {
+                        defaults = Ext.apply({minWidth: minButtonWidth}, defaults);
+                    }
+                    return defaults;
+                };
+            }
+
+            docked.push(fbar);
+            me.fbar = null;
+        }
+
+        
+        if (me.lbar) {
+            docked.push(initToolbar(me.lbar, 'left'));
+            me.lbar = null;
+        }
+
+        
+        if (me.rbar) {
+            docked.push(initToolbar(me.rbar, 'right'));
+            me.rbar = null;
+        }
+
+        if (me.dockedItems) {
+            if (!Ext.isArray(me.dockedItems)) {
+                me.dockedItems = [me.dockedItems];
+            }
+            me.dockedItems = me.dockedItems.concat(docked);
+        } else {
+            me.dockedItems = docked;
+        }
+    },
+
+    
+    initTools: function() {
+        var me = this;
+
+        me.tools = me.tools ? Ext.Array.clone(me.tools) : [];
+
+        
+        
+        if (me.collapsible && !(me.hideCollapseTool || me.header === false)) {
+            me.collapseDirection = me.collapseDirection || me.headerPosition || 'top';
+            me.collapseTool = me.expandTool = me.createComponent({
+                xtype: 'tool',
+                type: 'collapse-' + me.collapseDirection,
+                expandType: me.getOppositeDirection(me.collapseDirection),
+                handler: me.toggleCollapse,
+                scope: me
+            });
+
+            
+            if (me.collapseFirst) {
+                me.tools.unshift(me.collapseTool);
+            }
+        }
+
+        
+        me.addTools();
+
+        
+        if (me.closable) {
+            me.addClsWithUI('closable');
+            me.addTool({
+                type: 'close',
+                handler: Ext.Function.bind(me.close, this, [])
+            });
+        }
+
+        
+        if (me.collapseTool && !me.collapseFirst) {
+            me.tools.push(me.collapseTool);
+        }
+    },
+
+    
+    addTools: Ext.emptyFn,
+
+    
+    close: function() {
+        if (this.fireEvent('beforeclose', this) !== false) {
+            this.doClose();
+        }
+    },
+
+    
+    doClose: function() {
+        this.fireEvent('close', this);
+        this[this.closeAction]();
+    },
+
+    onRender: function(ct, position) {
+        var me = this,
+            topContainer;
+
+        
+        
+        me.initTools();
+
+        
+        me.updateHeader();
+
+        
+        me.callParent(arguments);
+    },
+
+    afterRender: function() {
+        var me = this;
+
+        me.callParent(arguments);
+
+        
+        
+        
+        if (me.collapsed) {
+            me.collapsed = false;
+            me.collapse(null, false, true);
+        }
+    },
+
+    
+    updateHeader: function(force) {
+        var me = this,
+            header = me.header,
+            title = me.title,
+            tools = me.tools;
+
+        if (!me.preventHeader && (force || title || (tools && tools.length))) {
+            if (!header) {
+                header = me.header = Ext.create('Ext.panel.Header', {
+                    title       : title,
+                    orientation : (me.headerPosition == 'left' || me.headerPosition == 'right') ? 'vertical' : 'horizontal',
+                    dock        : me.headerPosition || 'top',
+                    textCls     : me.headerTextCls,
+                    iconCls     : me.iconCls,
+                    baseCls     : me.baseCls + '-header',
+                    tools       : tools,
+                    ui          : me.ui,
+                    indicateDrag: me.draggable,
+                    border      : me.border,
+                    frame       : me.frame && me.frameHeader,
+                    ignoreParentFrame : me.frame || me.overlapHeader,
+                    ignoreBorderManagement: me.frame || me.ignoreHeaderBorderManagement,
+                    listeners   : me.collapsible && me.titleCollapse ? {
+                        click: me.toggleCollapse,
+                        scope: me
+                    } : null
+                });
+                me.addDocked(header, 0);
+
+                
+                
+                me.tools = header.tools;
+            }
+            header.show();
+            me.initHeaderAria();
+        } else if (header) {
+            header.hide();
+        }
+    },
+
+    
+    setUI: function(ui) {
+        var me = this;
+
+        me.callParent(arguments);
+
+        if (me.header) {
+            me.header.setUI(ui);
+        }
+    },
+
+    
+    getContentTarget: function() {
+        return this.body;
+    },
+
+    getTargetEl: function() {
+        return this.body || this.frameBody || this.el;
+    },
+
+    
+
+    
+    isVisible: function(deep){
+        var me = this;
+        if (me.collapsed && me.placeholder) {
+            return me.placeholder.isVisible(deep);
+        }
+        return me.callParent(arguments);
+    },
+
+    
+    onHide: function(){
+        var me = this;
+        if (me.collapsed && me.placeholder) {
+            me.placeholder.hide();
+        } else {
+            me.callParent(arguments);
+        }
+    },
+
+    
+    onShow: function(){
+        var me = this;
+        if (me.collapsed && me.placeholder) {
+            
+            me.hidden = true;
+            me.placeholder.show();
+        } else {
+            me.callParent(arguments);
+        }
+    },
+
+    addTool: function(tool) {
+        var me = this,
+            header = me.header;
+
+        if (Ext.isArray(tool)) {
+            Ext.each(tool, me.addTool, me);
+            return;
+        }
+        me.tools.push(tool);
+        if (header) {
+            header.addTool(tool);
+        }
+        me.updateHeader();
+    },
+
+    getOppositeDirection: function(d) {
+        var c = Ext.Component;
+        switch (d) {
+            case c.DIRECTION_TOP:
+                return c.DIRECTION_BOTTOM;
+            case c.DIRECTION_RIGHT:
+                return c.DIRECTION_LEFT;
+            case c.DIRECTION_BOTTOM:
+                return c.DIRECTION_TOP;
+            case c.DIRECTION_LEFT:
+                return c.DIRECTION_RIGHT;
+        }
+    },
+
+    
+    collapse: function(direction, animate,  internal) {
+        var me = this,
+            c = Ext.Component,
+            height = me.getHeight(),
+            width = me.getWidth(),
+            frameInfo,
+            newSize = 0,
+            dockedItems = me.dockedItems.items,
+            dockedItemCount = dockedItems.length,
+            i = 0,
+            comp,
+            pos,
+            anim = {
+                from: {
+                    height: height,
+                    width: width
+                },
+                to: {
+                    height: height,
+                    width: width
+                },
+                listeners: {
+                    afteranimate: me.afterCollapse,
+                    scope: me
+                },
+                duration: Ext.Number.from(animate, Ext.fx.Anim.prototype.duration)
+            },
+            reExpander,
+            reExpanderOrientation,
+            reExpanderDock,
+            getDimension,
+            collapseDimension;
+
+        if (!direction) {
+            direction = me.collapseDirection;
+        }
+
+        
+        if (internal) {
+            animate = false;
+        } else if (me.collapsed || me.fireEvent('beforecollapse', me, direction, animate) === false) {
+            return false;
+        }
+
+        reExpanderDock = direction;
+        me.expandDirection = me.getOppositeDirection(direction);
+
+        
+        me.hiddenDocked = [];
+
+        switch (direction) {
+            case c.DIRECTION_TOP:
+            case c.DIRECTION_BOTTOM:
+                reExpanderOrientation = 'horizontal';
+                collapseDimension = 'height';
+                getDimension = 'getHeight';
+
+                
+                
+                for (; i < dockedItemCount; i++) {
+                    comp = dockedItems[i];
+                    if (comp.isVisible()) {
+                        if (comp.isXType('header', true) && (!comp.dock || comp.dock == 'top' || comp.dock == 'bottom')) {
+                            reExpander = comp;
+                        } else {
+                            me.hiddenDocked.push(comp);
+                        }
+                    } else if (comp === me.reExpander) {
+                        reExpander = comp;
+                    }
+                }
+
+                if (direction == Ext.Component.DIRECTION_BOTTOM) {
+                    pos = me.getPosition()[1] - Ext.fly(me.el.dom.offsetParent).getRegion().top;
+                    anim.from.top = pos;
+                }
+                break;
+
+            case c.DIRECTION_LEFT:
+            case c.DIRECTION_RIGHT:
+                reExpanderOrientation = 'vertical';
+                collapseDimension = 'width';
+                getDimension = 'getWidth';
+
+                
+                
+                for (; i < dockedItemCount; i++) {
+                    comp = dockedItems[i];
+                    if (comp.isVisible()) {
+                        if (comp.isHeader && (comp.dock == 'left' || comp.dock == 'right')) {
+                            reExpander = comp;
+                        } else {
+                            me.hiddenDocked.push(comp);
+                        }
+                    } else if (comp === me.reExpander) {
+                        reExpander = comp;
+                    }
+                }
+
+                if (direction == Ext.Component.DIRECTION_RIGHT) {
+                    pos = me.getPosition()[0] - Ext.fly(me.el.dom.offsetParent).getRegion().left;
+                    anim.from.left = pos;
+                }
+                break;
+
+            default:
+                throw('Panel collapse must be passed a valid Component collapse direction');
+        }
+
+        
+        if (animate && me.collapseTool) {
+            me.collapseTool.disable();
+        }
+
+        
+        me.addClsWithUI(me.collapsedCls);
+        
+        
+        
+
+        
+        if (reExpander && reExpander.rendered) {
+
+            
+            reExpander.addClsWithUI(me.collapsedCls);
+            reExpander.addClsWithUI(me.collapsedCls + '-' + reExpander.dock);
+            if (me.border && (!me.frame || (me.frame && Ext.supports.CSS3BorderRadius))) {
+                reExpander.addClsWithUI(me.collapsedCls + '-border-' + reExpander.dock);
+            }
+
+            frameInfo = reExpander.getFrameInfo();
+
+            
+            newSize = reExpander[getDimension]() + (frameInfo ? frameInfo[direction] : 0);
+
+            
+            reExpander.removeClsWithUI(me.collapsedCls);
+            reExpander.removeClsWithUI(me.collapsedCls + '-' + reExpander.dock);
+            if (me.border && (!me.frame || (me.frame && Ext.supports.CSS3BorderRadius))) {
+                reExpander.removeClsWithUI(me.collapsedCls + '-border-' + reExpander.dock);
+            }
+        }
+        
+        else {
+            reExpander = {
+                hideMode: 'offsets',
+                temporary: true,
+                title: me.title,
+                orientation: reExpanderOrientation,
+                dock: reExpanderDock,
+                textCls: me.headerTextCls,
+                iconCls: me.iconCls,
+                baseCls: me.baseCls + '-header',
+                ui: me.ui,
+                frame: me.frame && me.frameHeader,
+                ignoreParentFrame: me.frame || me.overlapHeader,
+                indicateDrag: me.draggable,
+                cls: me.baseCls + '-collapsed-placeholder ' + ' ' + Ext.baseCSSPrefix + 'docked ' + me.baseCls + '-' + me.ui + '-collapsed',
+                renderTo: me.el
+            };
+            if (!me.hideCollapseTool) {
+                reExpander[(reExpander.orientation == 'horizontal') ? 'tools' : 'items'] = [{
+                    xtype: 'tool',
+                    type: 'expand-' + me.expandDirection,
+                    handler: me.toggleCollapse,
+                    scope: me
+                }];
+            }
+
+            
+            
+            reExpander = me.reExpander = Ext.create('Ext.panel.Header', reExpander);
+            newSize = reExpander[getDimension]() + ((reExpander.frame) ? reExpander.frameSize[direction] : 0);
+            reExpander.hide();
+
+            
+            me.insertDocked(0, reExpander);
+        }
+
+        me.reExpander = reExpander;
+        me.reExpander.addClsWithUI(me.collapsedCls);
+        me.reExpander.addClsWithUI(me.collapsedCls + '-' + reExpander.dock);
+        if (me.border && (!me.frame || (me.frame && Ext.supports.CSS3BorderRadius))) {
+            me.reExpander.addClsWithUI(me.collapsedCls + '-border-' + me.reExpander.dock);
+        }
+
+        
+        if (direction == Ext.Component.DIRECTION_RIGHT) {
+            anim.to.left = pos + (width - newSize);
+        } else if (direction == Ext.Component.DIRECTION_BOTTOM) {
+            anim.to.top = pos + (height - newSize);
+        }
+
+        
+        anim.to[collapseDimension] = newSize;
+
+        
+        
+        
+        
+        
+        if (!me.collapseMemento) {
+            me.collapseMemento = new Ext.util.Memento(me);
+        }
+        me.collapseMemento.capture(['width', 'height', 'minWidth', 'minHeight', 'layoutManagedHeight', 'layoutManagedWidth']);
+
+        
+        me.savedFlex = me.flex;
+        me.minWidth = 0;
+        me.minHeight = 0;
+        delete me.flex;
+        me.suspendLayout = true;
+
+        if (animate) {
+            me.animate(anim);
+        } else {
+            me.setSize(anim.to.width, anim.to.height);
+            if (Ext.isDefined(anim.to.left) || Ext.isDefined(anim.to.top)) {
+                me.setPosition(anim.to.left, anim.to.top);
+            }
+            me.afterCollapse(false, internal);
+        }
+        return me;
+    },
+
+    afterCollapse: function(animated, internal) {
+        var me = this,
+            i = 0,
+            l = me.hiddenDocked.length;
+
+        me.collapseMemento.restore(['minWidth', 'minHeight']);
+
+        
+        
+        
+        if (Ext.Component.VERTICAL_DIRECTION_Re.test(me.expandDirection)) {
+            me.layoutManagedHeight = 2;
+            me.collapseMemento.restore('width', false);
+        } else {
+            me.layoutManagedWidth = 2;
+            me.collapseMemento.restore('height', false);
+        }
+
+        
+        
+        me.saveScrollTop = me.body.dom.scrollTop;
+        me.body.setStyle('display', 'none');
+
+        for (; i < l; i++) {
+            me.hiddenDocked[i].hide();
+        }
+        if (me.reExpander) {
+            me.reExpander.updateFrame();
+            me.reExpander.show();
+        }
+        me.collapsed = true;
+        me.suspendLayout = false;
+
+        if (!internal) {
+            if (me.ownerCt) {
+                
+                
+                if (animated) {
+                    me.ownerCt.layout.layout();
+                }
+            } else if (me.reExpander.temporary) {
+                me.doComponentLayout();
+            }
+        }
+
+        if (me.resizer) {
+            me.resizer.disable();
+        }
+
+        
+        if (me.collapseTool) {
+            me.collapseTool.setType('expand-' + me.expandDirection);
+        }
+        if (!internal) {
+            me.fireEvent('collapse', me);
+        }
+
+        
+        if (animated && me.collapseTool) {
+            me.collapseTool.enable();
+        }
+    },
+
+    
+    expand: function(animate) {
+        var me = this;
+        if (!me.collapsed || me.fireEvent('beforeexpand', me, animate) === false) {
+            return false;
+        }
+
+        var i = 0,
+            l = me.hiddenDocked.length,
+            direction = me.expandDirection,
+            height = me.getHeight(),
+            width = me.getWidth(),
+            pos, anim;
+
+        
+        if (animate && me.collapseTool) {
+            me.collapseTool.disable();
+        }
+
+        
+        
+        for (; i < l; i++) {
+            me.hiddenDocked[i].hidden = false;
+            me.hiddenDocked[i].el.show();
+        }
+        if (me.reExpander) {
+            if (me.reExpander.temporary) {
+                me.reExpander.hide();
+            } else {
+                me.reExpander.removeClsWithUI(me.collapsedCls);
+                me.reExpander.removeClsWithUI(me.collapsedCls + '-' + me.reExpander.dock);
+                if (me.border && (!me.frame || (me.frame && Ext.supports.CSS3BorderRadius))) {
+                    me.reExpander.removeClsWithUI(me.collapsedCls + '-border-' + me.reExpander.dock);
+                }
+                me.reExpander.updateFrame();
+            }
+        }
+
+        
+        if (me.collapseTool) {
+            me.collapseTool.setType('collapse-' + me.collapseDirection);
+        }
+
+        
+        me.body.setStyle('display', '');
+        me.body.dom.scrollTop = me.saveScrollTop;
+
+        
+        me.collapsed = false;
+
+        
+        me.removeClsWithUI(me.collapsedCls);
+        
+        
+        
+
+        anim = {
+            to: {
+            },
+            from: {
+                height: height,
+                width: width
+            },
+            listeners: {
+                afteranimate: me.afterExpand,
+                scope: me
+            }
+        };
+
+        if ((direction == Ext.Component.DIRECTION_TOP) || (direction == Ext.Component.DIRECTION_BOTTOM)) {
+
+            
+            
+            me.collapseMemento.restore('height', false);
+
+            
+            if (me.height === undefined) {
+                me.setCalculatedSize(me.width, null);
+                anim.to.height = me.getHeight();
+
+                
+                me.setCalculatedSize(me.width, anim.from.height);
+            }
+            
+            
+            else if (me.savedFlex) {
+                me.flex = me.savedFlex;
+                anim.to.height = me.ownerCt.layout.calculateChildBox(me).height;
+                delete me.flex;
+            }
+            
+            else {
+                anim.to.height = me.height;
+            }
+
+            
+            if (direction == Ext.Component.DIRECTION_TOP) {
+                pos = me.getPosition()[1] - Ext.fly(me.el.dom.offsetParent).getRegion().top;
+                anim.from.top = pos;
+                anim.to.top = pos - (anim.to.height - height);
+            }
+        } else if ((direction == Ext.Component.DIRECTION_LEFT) || (direction == Ext.Component.DIRECTION_RIGHT)) {
+
+            
+            
+            me.collapseMemento.restore('width', false);
+
+            
+            if (me.width === undefined) {
+                me.setCalculatedSize(null, me.height);
+                anim.to.width = me.getWidth();
+
+                
+                me.setCalculatedSize(anim.from.width, me.height);
+            }
+            
+            
+            else if (me.savedFlex) {
+                me.flex = me.savedFlex;
+                anim.to.width = me.ownerCt.layout.calculateChildBox(me).width;
+                delete me.flex;
+            }
+            
+            else {
+                anim.to.width = me.width;
+            }
+
+            
+            if (direction == Ext.Component.DIRECTION_LEFT) {
+                pos = me.getPosition()[0] - Ext.fly(me.el.dom.offsetParent).getRegion().left;
+                anim.from.left = pos;
+                anim.to.left = pos - (anim.to.width - width);
+            }
+        }
+
+        if (animate) {
+            me.animate(anim);
+        } else {
+            me.setCalculatedSize(anim.to.width, anim.to.height);
+            if (anim.to.x) {
+                me.setLeft(anim.to.x);
+            }
+            if (anim.to.y) {
+                me.setTop(anim.to.y);
+            }
+            me.afterExpand(false);
+        }
+
+        return me;
+    },
+
+    afterExpand: function(animated) {
+        var me = this;
+
+        
+        if (me.savedFlex) {
+            me.flex = me.savedFlex;
+            delete me.savedFlex;
+            delete me.width;
+            delete me.height;
+        }
+
+        
+        if (me.collapseMemento) {
+            me.collapseMemento.restoreAll();
+        }
+
+        if (animated && me.ownerCt) {
+            
+            
+            Ext.defer(me.ownerCt.doLayout, Ext.isIE6 ? 1 : 0, me);
+        }
+
+        if (me.resizer) {
+            me.resizer.enable();
+        }
+
+        me.fireEvent('expand', me);
+
+        
+        if (animated && me.collapseTool) {
+            me.collapseTool.enable();
+        }
+    },
+
+    
+    toggleCollapse: function() {
+        if (this.collapsed) {
+            this.expand(this.animCollapse);
+        } else {
+            this.collapse(this.collapseDirection, this.animCollapse);
+        }
+        return this;
+    },
+
+    
+    getKeyMap : function(){
+        if(!this.keyMap){
+            this.keyMap = Ext.create('Ext.util.KeyMap', this.el, this.keys);
+        }
+        return this.keyMap;
+    },
+
+    
+    initDraggable : function(){
+        
+        this.dd = Ext.create('Ext.panel.DD', this, Ext.isBoolean(this.draggable) ? null : this.draggable);
+    },
+
+    
+    ghostTools : function() {
+        var tools = [],
+            headerTools = this.header.query('tool[hidden=false]');
+
+        if (headerTools.length) {
+            Ext.each(headerTools, function(tool) {
+                
+                
+                
+                
+                tools.push({
+                    type: tool.type
+                });
+            });
+        } else {
+            tools = [{
+                type: 'placeholder'
+            }];
+        }
+        return tools;
+    },
+
+    
+    ghost: function(cls) {
+        var me = this,
+            ghostPanel = me.ghostPanel,
+            box = me.getBox(),
+            header;
+
+        if (!ghostPanel) {
+            ghostPanel = Ext.create('Ext.panel.Panel', {
+                renderTo: me.floating ? me.el.dom.parentNode : document.body,
+                floating: {
+                    shadow: false
+                },
+                frame: Ext.supports.CSS3BorderRadius ? me.frame : false,
+                overlapHeader: me.overlapHeader,
+                headerPosition: me.headerPosition,
+                baseCls: me.baseCls,
+                cls: me.baseCls + '-ghost ' + (cls ||'')
+            });
+            me.ghostPanel = ghostPanel;
+        }
+        ghostPanel.floatParent = me.floatParent;
+        if (me.floating) {
+            ghostPanel.setZIndex(Ext.Number.from(me.el.getStyle('zIndex'), 0));
+        } else {
+            ghostPanel.toFront();
+        }
+        header = ghostPanel.header;
+        
+        if (header) {
+            header.suspendLayout = true;
+            Ext.Array.forEach(header.query('tool'), function(tool){
+                header.remove(tool);
+            });
+            header.suspendLayout = false;
+        }
+        ghostPanel.addTool(me.ghostTools());
+        ghostPanel.setTitle(me.title);
+        ghostPanel.setIconCls(me.iconCls);
+
+        ghostPanel.el.show();
+        ghostPanel.setPosition(box.x, box.y);
+        ghostPanel.setSize(box.width, box.height);
+        me.el.hide();
+        if (me.floatingItems) {
+            me.floatingItems.hide();
+        }
+        return ghostPanel;
+    },
+
+    
+    unghost: function(show, matchPosition) {
+        var me = this;
+        if (!me.ghostPanel) {
+            return;
+        }
+        if (show !== false) {
+            me.el.show();
+            if (matchPosition !== false) {
+                me.setPosition(me.ghostPanel.getPosition());
+            }
+            if (me.floatingItems) {
+                me.floatingItems.show();
+            }
+            Ext.defer(me.focus, 10, me);
+        }
+        me.ghostPanel.el.hide();
+    },
+
+    initResizable: function(resizable) {
+        if (this.collapsed) {
+            resizable.disabled = true;
+        }
+        this.callParent([resizable]);
+    }
+}, function(){
+    this.prototype.animCollapse = Ext.enableFx;
+});
+
+
+
+Ext.define('Ext.layout.component.Tip', {
+
+    
+
+    alias: ['layout.tip'],
+
+    extend: 'Ext.layout.component.Dock',
+
+    
+
+    type: 'tip',
+    
+    onLayout: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            el = owner.el,
+            minWidth,
+            maxWidth,
+            naturalWidth,
+            constrainedWidth,
+            xy = el.getXY();
+
+        
+        el.setXY([-9999,-9999]);
+
+        
+        this.callParent(arguments);
+
+        
+        if (!Ext.isNumber(width)) {
+            minWidth = owner.minWidth;
+            maxWidth = owner.maxWidth;
+            
+            if (Ext.isStrict && (Ext.isIE6 || Ext.isIE7)) {
+                constrainedWidth = me.doAutoWidth();
+            } else {
+                naturalWidth = el.getWidth();
+            }
+            if (naturalWidth < minWidth) {
+                constrainedWidth = minWidth;
+            }
+            else if (naturalWidth > maxWidth) {
+                constrainedWidth = maxWidth;
+            }
+            if (constrainedWidth) {
+                this.callParent([constrainedWidth, height]);
+            }
+        }
+
+        
+        el.setXY(xy);
+    },
+    
+    doAutoWidth: function(){
+        var me = this,
+            owner = me.owner,
+            body = owner.body,
+            width = body.getTextWidth();
+            
+        if (owner.header) {
+            width = Math.max(width, owner.header.getWidth());
+        }
+        if (!Ext.isDefined(me.frameWidth)) {
+            me.frameWidth = owner.el.getWidth() - body.getWidth();
+        }
+        width += me.frameWidth + body.getPadding('lr');
+        return width;
+    }
+});
+
+
+Ext.define('Ext.tip.Tip', {
+    extend: 'Ext.panel.Panel',
+    requires: [ 'Ext.layout.component.Tip' ],
+    alternateClassName: 'Ext.Tip',
+    
+    
+    
+    minWidth : 40,
+    
+    maxWidth : 300,
+    
+    shadow : "sides",
+
+    
+    defaultAlign : "tl-bl?",
+    
+    constrainPosition : true,
+
+    
+    frame: false,
+
+    
+    autoRender: true,
+    hidden: true,
+    baseCls: Ext.baseCSSPrefix + 'tip',
+    floating: {
+        shadow: true,
+        shim: true,
+        constrain: true
+    },
+    focusOnToFront: false,
+    componentLayout: 'tip',
+
+    
+    closeAction: 'hide',
+
+    ariaRole: 'tooltip',
+
+    initComponent: function() {
+        var me = this;
+
+        me.floating = Ext.apply({}, {shadow: me.shadow}, me.self.prototype.floating);
+        me.callParent(arguments);
+
+        
+        me.constrain = me.constrain || me.constrainPosition;
+    },
+
+    
+    showAt : function(xy){
+        var me = this;
+        this.callParent(arguments);
+        
+        if (me.isVisible()) {
+            me.setPagePosition(xy[0], xy[1]);
+            if (me.constrainPosition || me.constrain) {
+                me.doConstrain();
+            }
+            me.toFront(true);
+        }
+    },
+
+    
+    showBy : function(el, pos) {
+        this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign));
+    },
+
+    
+    initDraggable : function(){
+        var me = this;
+        me.draggable = {
+            el: me.getDragEl(),
+            delegate: me.header.el,
+            constrain: me,
+            constrainTo: me.el.getScopeParent()
+        };
+        
+        Ext.Component.prototype.initDraggable.call(me);
+    },
+
+    
+    ghost: undefined,
+    unghost: undefined
+});
+
+
+Ext.define('Ext.tip.ToolTip', {
+    extend: 'Ext.tip.Tip',
+    alias: 'widget.tooltip',
+    alternateClassName: 'Ext.ToolTip',
+    
+    
+    
+    
+    showDelay: 500,
+    
+    hideDelay: 200,
+    
+    dismissDelay: 5000,
+    
+    
+    trackMouse: false,
+    
+    
+    anchorToTarget: true,
+    
+    anchorOffset: 0,
+    
+
+    
+    targetCounter: 0,
+    quickShowInterval: 250,
+
+    
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+        me.lastActive = new Date();
+        me.setTarget(me.target);
+        me.origAnchor = me.anchor;
+    },
+
+    
+    onRender: function(ct, position) {
+        var me = this;
+        me.callParent(arguments);
+        me.anchorCls = Ext.baseCSSPrefix + 'tip-anchor-' + me.getAnchorPosition();
+        me.anchorEl = me.el.createChild({
+            cls: Ext.baseCSSPrefix + 'tip-anchor ' + me.anchorCls
+        });
+    },
+
+    
+    afterRender: function() {
+        var me = this,
+            zIndex;
+
+        me.callParent(arguments);
+        zIndex = parseInt(me.el.getZIndex(), 10) || 0;
+        me.anchorEl.setStyle('z-index', zIndex + 1).setVisibilityMode(Ext.Element.DISPLAY);
+    },
+
+    
+    setTarget: function(target) {
+        var me = this,
+            t = Ext.get(target),
+            tg;
+
+        if (me.target) {
+            tg = Ext.get(me.target);
+            me.mun(tg, 'mouseover', me.onTargetOver, me);
+            me.mun(tg, 'mouseout', me.onTargetOut, me);
+            me.mun(tg, 'mousemove', me.onMouseMove, me);
+        }
+
+        me.target = t;
+        if (t) {
+
+            me.mon(t, {
+                
+                
+                freezeEvent: true,
+
+                mouseover: me.onTargetOver,
+                mouseout: me.onTargetOut,
+                mousemove: me.onMouseMove,
+                scope: me
+            });
+        }
+        if (me.anchor) {
+            me.anchorTarget = me.target;
+        }
+    },
+
+    
+    onMouseMove: function(e) {
+        var me = this,
+            t = me.delegate ? e.getTarget(me.delegate) : me.triggerElement = true,
+            xy;
+        if (t) {
+            me.targetXY = e.getXY();
+            if (t === me.triggerElement) {
+                if (!me.hidden && me.trackMouse) {
+                    xy = me.getTargetXY();
+                    if (me.constrainPosition) {
+                        xy = me.el.adjustForConstraints(xy, me.el.getScopeParent());
+                    }
+                    me.setPagePosition(xy);
+                }
+            } else {
+                me.hide();
+                me.lastActive = new Date(0);
+                me.onTargetOver(e);
+            }
+        } else if ((!me.closable && me.isVisible()) && me.autoHide !== false) {
+            me.hide();
+        }
+    },
+
+    
+    getTargetXY: function() {
+        var me = this,
+            mouseOffset;
+        if (me.delegate) {
+            me.anchorTarget = me.triggerElement;
+        }
+        if (me.anchor) {
+            me.targetCounter++;
+                var offsets = me.getOffsets(),
+                    xy = (me.anchorToTarget && !me.trackMouse) ? me.el.getAlignToXY(me.anchorTarget, me.getAnchorAlign()) : me.targetXY,
+                    dw = Ext.Element.getViewWidth() - 5,
+                    dh = Ext.Element.getViewHeight() - 5,
+                    de = document.documentElement,
+                    bd = document.body,
+                    scrollX = (de.scrollLeft || bd.scrollLeft || 0) + 5,
+                    scrollY = (de.scrollTop || bd.scrollTop || 0) + 5,
+                    axy = [xy[0] + offsets[0], xy[1] + offsets[1]],
+                    sz = me.getSize(),
+                    constrainPosition = me.constrainPosition;
+
+            me.anchorEl.removeCls(me.anchorCls);
+
+            if (me.targetCounter < 2 && constrainPosition) {
+                if (axy[0] < scrollX) {
+                    if (me.anchorToTarget) {
+                        me.defaultAlign = 'l-r';
+                        if (me.mouseOffset) {
+                            me.mouseOffset[0] *= -1;
+                        }
+                    }
+                    me.anchor = 'left';
+                    return me.getTargetXY();
+                }
+                if (axy[0] + sz.width > dw) {
+                    if (me.anchorToTarget) {
+                        me.defaultAlign = 'r-l';
+                        if (me.mouseOffset) {
+                            me.mouseOffset[0] *= -1;
+                        }
+                    }
+                    me.anchor = 'right';
+                    return me.getTargetXY();
+                }
+                if (axy[1] < scrollY) {
+                    if (me.anchorToTarget) {
+                        me.defaultAlign = 't-b';
+                        if (me.mouseOffset) {
+                            me.mouseOffset[1] *= -1;
+                        }
+                    }
+                    me.anchor = 'top';
+                    return me.getTargetXY();
+                }
+                if (axy[1] + sz.height > dh) {
+                    if (me.anchorToTarget) {
+                        me.defaultAlign = 'b-t';
+                        if (me.mouseOffset) {
+                            me.mouseOffset[1] *= -1;
+                        }
+                    }
+                    me.anchor = 'bottom';
+                    return me.getTargetXY();
+                }
+            }
+
+            me.anchorCls = Ext.baseCSSPrefix + 'tip-anchor-' + me.getAnchorPosition();
+            me.anchorEl.addCls(me.anchorCls);
+            me.targetCounter = 0;
+            return axy;
+        } else {
+            mouseOffset = me.getMouseOffset();
+            return (me.targetXY) ? [me.targetXY[0] + mouseOffset[0], me.targetXY[1] + mouseOffset[1]] : mouseOffset;
+        }
+    },
+
+    getMouseOffset: function() {
+        var me = this,
+        offset = me.anchor ? [0, 0] : [15, 18];
+        if (me.mouseOffset) {
+            offset[0] += me.mouseOffset[0];
+            offset[1] += me.mouseOffset[1];
+        }
+        return offset;
+    },
+
+    
+    getAnchorPosition: function() {
+        var me = this,
+            m;
+        if (me.anchor) {
+            me.tipAnchor = me.anchor.charAt(0);
+        } else {
+            m = me.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/);
+            me.tipAnchor = m[1].charAt(0);
+        }
+
+        switch (me.tipAnchor) {
+        case 't':
+            return 'top';
+        case 'b':
+            return 'bottom';
+        case 'r':
+            return 'right';
+        }
+        return 'left';
+    },
+
+    
+    getAnchorAlign: function() {
+        switch (this.anchor) {
+        case 'top':
+            return 'tl-bl';
+        case 'left':
+            return 'tl-tr';
+        case 'right':
+            return 'tr-tl';
+        default:
+            return 'bl-tl';
+        }
+    },
+
+    
+    getOffsets: function() {
+        var me = this,
+            mouseOffset,
+            offsets,
+            ap = me.getAnchorPosition().charAt(0);
+        if (me.anchorToTarget && !me.trackMouse) {
+            switch (ap) {
+            case 't':
+                offsets = [0, 9];
+                break;
+            case 'b':
+                offsets = [0, -13];
+                break;
+            case 'r':
+                offsets = [ - 13, 0];
+                break;
+            default:
+                offsets = [9, 0];
+                break;
+            }
+        } else {
+            switch (ap) {
+            case 't':
+                offsets = [ - 15 - me.anchorOffset, 30];
+                break;
+            case 'b':
+                offsets = [ - 19 - me.anchorOffset, -13 - me.el.dom.offsetHeight];
+                break;
+            case 'r':
+                offsets = [ - 15 - me.el.dom.offsetWidth, -13 - me.anchorOffset];
+                break;
+            default:
+                offsets = [25, -13 - me.anchorOffset];
+                break;
+            }
+        }
+        mouseOffset = me.getMouseOffset();
+        offsets[0] += mouseOffset[0];
+        offsets[1] += mouseOffset[1];
+
+        return offsets;
+    },
+
+    
+    onTargetOver: function(e) {
+        var me = this,
+            t;
+
+        if (me.disabled || e.within(me.target.dom, true)) {
+            return;
+        }
+        t = e.getTarget(me.delegate);
+        if (t) {
+            me.triggerElement = t;
+            me.clearTimer('hide');
+            me.targetXY = e.getXY();
+            me.delayShow();
+        }
+    },
+
+    
+    delayShow: function() {
+        var me = this;
+        if (me.hidden && !me.showTimer) {
+            if (Ext.Date.getElapsed(me.lastActive) < me.quickShowInterval) {
+                me.show();
+            } else {
+                me.showTimer = Ext.defer(me.show, me.showDelay, me);
+            }
+        }
+        else if (!me.hidden && me.autoHide !== false) {
+            me.show();
+        }
+    },
+
+    
+    onTargetOut: function(e) {
+        var me = this;
+        if (me.disabled || e.within(me.target.dom, true)) {
+            return;
+        }
+        me.clearTimer('show');
+        if (me.autoHide !== false) {
+            me.delayHide();
+        }
+    },
+
+    
+    delayHide: function() {
+        var me = this;
+        if (!me.hidden && !me.hideTimer) {
+            me.hideTimer = Ext.defer(me.hide, me.hideDelay, me);
+        }
+    },
+
+    
+    hide: function() {
+        var me = this;
+        me.clearTimer('dismiss');
+        me.lastActive = new Date();
+        if (me.anchorEl) {
+            me.anchorEl.hide();
+        }
+        me.callParent(arguments);
+        delete me.triggerElement;
+    },
+
+    
+    show: function() {
+        var me = this;
+
+        
+        
+        this.callParent();
+        if (this.hidden === false) {
+            me.setPagePosition(-10000, -10000);
+
+            if (me.anchor) {
+                me.anchor = me.origAnchor;
+            }
+            me.showAt(me.getTargetXY());
+
+            if (me.anchor) {
+                me.syncAnchor();
+                me.anchorEl.show();
+            } else {
+                me.anchorEl.hide();
+            }
+        }
+    },
+
+    
+    showAt: function(xy) {
+        var me = this;
+        me.lastActive = new Date();
+        me.clearTimers();
+
+        
+        if (!me.isVisible()) {
+            this.callParent(arguments);
+        }
+
+        
+        if (me.isVisible()) {
+            me.setPagePosition(xy[0], xy[1]);
+            if (me.constrainPosition || me.constrain) {
+                me.doConstrain();
+            }
+            me.toFront(true);
+        }
+
+        if (me.dismissDelay && me.autoHide !== false) {
+            me.dismissTimer = Ext.defer(me.hide, me.dismissDelay, me);
+        }
+        if (me.anchor) {
+            me.syncAnchor();
+            if (!me.anchorEl.isVisible()) {
+                me.anchorEl.show();
+            }
+        } else {
+            me.anchorEl.hide();
+        }
+    },
+
+    
+    syncAnchor: function() {
+        var me = this,
+            anchorPos,
+            targetPos,
+            offset;
+        switch (me.tipAnchor.charAt(0)) {
+        case 't':
+            anchorPos = 'b';
+            targetPos = 'tl';
+            offset = [20 + me.anchorOffset, 1];
+            break;
+        case 'r':
+            anchorPos = 'l';
+            targetPos = 'tr';
+            offset = [ - 1, 12 + me.anchorOffset];
+            break;
+        case 'b':
+            anchorPos = 't';
+            targetPos = 'bl';
+            offset = [20 + me.anchorOffset, -1];
+            break;
+        default:
+            anchorPos = 'r';
+            targetPos = 'tl';
+            offset = [1, 12 + me.anchorOffset];
+            break;
+        }
+        me.anchorEl.alignTo(me.el, anchorPos + '-' + targetPos, offset);
+    },
+
+    
+    setPagePosition: function(x, y) {
+        var me = this;
+        me.callParent(arguments);
+        if (me.anchor) {
+            me.syncAnchor();
+        }
+    },
+
+    
+    clearTimer: function(name) {
+        name = name + 'Timer';
+        clearTimeout(this[name]);
+        delete this[name];
+    },
+
+    
+    clearTimers: function() {
+        var me = this;
+        me.clearTimer('show');
+        me.clearTimer('dismiss');
+        me.clearTimer('hide');
+    },
+
+    
+    onShow: function() {
+        var me = this;
+        me.callParent();
+        me.mon(Ext.getDoc(), 'mousedown', me.onDocMouseDown, me);
+    },
+
+    
+    onHide: function() {
+        var me = this;
+        me.callParent();
+        me.mun(Ext.getDoc(), 'mousedown', me.onDocMouseDown, me);
+    },
+
+    
+    onDocMouseDown: function(e) {
+        var me = this;
+        if (me.autoHide !== true && !me.closable && !e.within(me.el.dom)) {
+            me.disable();
+            Ext.defer(me.doEnable, 100, me);
+        }
+    },
+
+    
+    doEnable: function() {
+        if (!this.isDestroyed) {
+            this.enable();
+        }
+    },
+
+    
+    onDisable: function() {
+        this.callParent();
+        this.clearTimers();
+        this.hide();
+    },
+
+    beforeDestroy: function() {
+        var me = this;
+        me.clearTimers();
+        Ext.destroy(me.anchorEl);
+        delete me.anchorEl;
+        delete me.target;
+        delete me.anchorTarget;
+        delete me.triggerElement;
+        me.callParent();
+    },
+
+    
+    onDestroy: function() {
+        Ext.getDoc().un('mousedown', this.onDocMouseDown, this);
+        this.callParent();
+    }
+});
+
+
+Ext.define('Ext.tip.QuickTip', {
+    extend: 'Ext.tip.ToolTip',
+    alternateClassName: 'Ext.QuickTip',
+    
+    
+    interceptTitles : false,
+
+    
+    title: ' ',
+
+    
+    tagConfig : {
+        namespace : "data-",
+        attribute : "qtip",
+        width : "qwidth",
+        target : "target",
+        title : "qtitle",
+        hide : "hide",
+        cls : "qclass",
+        align : "qalign",
+        anchor : "anchor"
+    },
+
+    
+    initComponent : function(){
+        var me = this;
+
+        me.target = me.target || Ext.getDoc();
+        me.targets = me.targets || {};
+        me.callParent();
+    },
+
+    
+    register : function(config){
+        var configs = Ext.isArray(config) ? config : arguments,
+            i = 0,
+            len = configs.length,
+            target, j, targetLen;
+
+        for (; i < len; i++) {
+            config = configs[i];
+            target = config.target;
+            if (target) {
+                if (Ext.isArray(target)) {
+                    for (j = 0, targetLen = target.length; j < targetLen; j++) {
+                        this.targets[Ext.id(target[j])] = config;
+                    }
+                } else{
+                    this.targets[Ext.id(target)] = config;
+                }
+            }
+        }
+    },
+
+    
+    unregister : function(el){
+        delete this.targets[Ext.id(el)];
+    },
+
+    
+    cancelShow: function(el){
+        var me = this,
+            activeTarget = me.activeTarget;
+
+        el = Ext.get(el).dom;
+        if (me.isVisible()) {
+            if (activeTarget && activeTarget.el == el) {
+                me.hide();
+            }
+        } else if (activeTarget && activeTarget.el == el) {
+            me.clearTimer('show');
+        }
+    },
+
+    
+    getTipCfg: function(e) {
+        var t = e.getTarget(),
+            titleText = t.title,
+            cfg;
+
+        if (this.interceptTitles && titleText && Ext.isString(titleText)) {
+            t.qtip = titleText;
+            t.removeAttribute("title");
+            e.preventDefault();
+            return {
+                text: titleText
+            };
+        }
+        else {
+            cfg = this.tagConfig;
+            t = e.getTarget('[' + cfg.namespace + cfg.attribute + ']');
+            if (t) {
+                return {
+                    target: t,
+                    text: t.getAttribute(cfg.namespace + cfg.attribute)
+                };
+            }
+        }
+    },
+
+    
+    onTargetOver : function(e){
+        var me = this,
+            target = e.getTarget(),
+            elTarget,
+            cfg,
+            ns,
+            tipConfig,
+            autoHide;
+
+        if (me.disabled) {
+            return;
+        }
+
+        
+        
+        
+        me.targetXY = e.getXY();
+
+        if(!target || target.nodeType !== 1 || target == document || target == document.body){
+            return;
+        }
+
+        if (me.activeTarget && ((target == me.activeTarget.el) || Ext.fly(me.activeTarget.el).contains(target))) {
+            me.clearTimer('hide');
+            me.show();
+            return;
+        }
+
+        if (target) {
+            Ext.Object.each(me.targets, function(key, value) {
+                var targetEl = Ext.fly(value.target);
+                if (targetEl && (targetEl.dom === target || targetEl.contains(target))) {
+                    elTarget = targetEl.dom;
+                    return false;
+                }
+            });
+            if (elTarget) {
+                me.activeTarget = me.targets[elTarget.id];
+                me.activeTarget.el = target;
+                me.anchor = me.activeTarget.anchor;
+                if (me.anchor) {
+                    me.anchorTarget = target;
+                }
+                me.delayShow();
+                return;
+            }
+        }
+
+        elTarget = Ext.get(target);
+        cfg = me.tagConfig;
+        ns = cfg.namespace;
+        tipConfig = me.getTipCfg(e);
+
+        if (tipConfig) {
+
+            
+            
+            if (tipConfig.target) {
+                target = tipConfig.target;
+                elTarget = Ext.get(target);
+            }
+            autoHide = elTarget.getAttribute(ns + cfg.hide);
+
+            me.activeTarget = {
+                el: target,
+                text: tipConfig.text,
+                width: +elTarget.getAttribute(ns + cfg.width) || null,
+                autoHide: autoHide != "user" && autoHide !== 'false',
+                title: elTarget.getAttribute(ns + cfg.title),
+                cls: elTarget.getAttribute(ns + cfg.cls),
+                align: elTarget.getAttribute(ns + cfg.align)
+
+            };
+            me.anchor = elTarget.getAttribute(ns + cfg.anchor);
+            if (me.anchor) {
+                me.anchorTarget = target;
+            }
+            me.delayShow();
+        }
+    },
+
+    
+    onTargetOut : function(e){
+        var me = this;
+
+        
+        if (me.activeTarget && e.within(me.activeTarget.el) && !me.getTipCfg(e)) {
+            return;
+        }
+
+        me.clearTimer('show');
+        if (me.autoHide !== false) {
+            me.delayHide();
+        }
+    },
+
+    
+    showAt : function(xy){
+        var me = this,
+            target = me.activeTarget;
+
+        if (target) {
+            if (!me.rendered) {
+                me.render(Ext.getBody());
+                me.activeTarget = target;
+            }
+            if (target.title) {
+                me.setTitle(target.title || '');
+                me.header.show();
+            } else {
+                me.header.hide();
+            }
+            me.body.update(target.text);
+            me.autoHide = target.autoHide;
+            me.dismissDelay = target.dismissDelay || me.dismissDelay;
+            if (me.lastCls) {
+                me.el.removeCls(me.lastCls);
+                delete me.lastCls;
+            }
+            if (target.cls) {
+                me.el.addCls(target.cls);
+                me.lastCls = target.cls;
+            }
+
+            me.setWidth(target.width);
+
+            if (me.anchor) {
+                me.constrainPosition = false;
+            } else if (target.align) { 
+                xy = me.el.getAlignToXY(target.el, target.align);
+                me.constrainPosition = false;
+            }else{
+                me.constrainPosition = true;
+            }
+        }
+        me.callParent([xy]);
+    },
+
+    
+    hide: function(){
+        delete this.activeTarget;
+        this.callParent();
+    }
+});
+
+
+Ext.define('Ext.tip.QuickTipManager', function() {
+    var tip,
+        disabled = false;
+
+    return {
+        requires: ['Ext.tip.QuickTip'],
+        singleton: true,
+        alternateClassName: 'Ext.QuickTips',
+
+        
+        init : function (autoRender, config) {
+            if (!tip) {
+                if (!Ext.isReady) {
+                    Ext.onReady(function(){
+                        Ext.tip.QuickTipManager.init(autoRender);
+                    });
+                    return;
+                }
+
+                var tipConfig = Ext.apply({ disabled: disabled }, config),
+                    className = tipConfig.className,
+                    xtype = tipConfig.xtype;
+
+                if (className) {
+                    delete tipConfig.className;
+                } else if (xtype) {
+                    className = 'widget.' + xtype;
+                    delete tipConfig.xtype;
+                }
+
+                if (autoRender !== false) {
+                    tipConfig.renderTo = document.body;
+
+                }
+
+                tip = Ext.create(className || 'Ext.tip.QuickTip', tipConfig);
+            }
+        },
+
+        
+        destroy: function() {
+            if (tip) {
+                var undef;
+                tip.destroy();
+                tip = undef;
+            }
+        },
+
+        
+        ddDisable : function(){
+            
+            if(tip && !disabled){
+                tip.disable();
+            }
+        },
+
+        
+        ddEnable : function(){
+            
+            if(tip && !disabled){
+                tip.enable();
+            }
+        },
+
+        
+        enable : function(){
+            if(tip){
+                tip.enable();
+            }
+            disabled = false;
+        },
+
+        
+        disable : function(){
+            if(tip){
+                tip.disable();
+            }
+            disabled = true;
+        },
+
+        
+        isEnabled : function(){
+            return tip !== undefined && !tip.disabled;
+        },
+
+        
+        getQuickTip : function(){
+            return tip;
+        },
+
+        
+        register : function(){
+            tip.register.apply(tip, arguments);
+        },
+
+        
+        unregister : function(){
+            tip.unregister.apply(tip, arguments);
+        },
+
+        
+        tips : function(){
+            tip.register.apply(tip, arguments);
+        }
+    };
+}());
+
+Ext.define('Ext.app.Application', {
+    extend: 'Ext.app.Controller',
+
+    requires: [
+        'Ext.ModelManager',
+        'Ext.data.Model',
+        'Ext.data.StoreManager',
+        'Ext.tip.QuickTipManager',
+        'Ext.ComponentManager',
+        'Ext.app.EventBus'
+    ],
+
+    
+
+    
+    scope: undefined,
+
+    
+    enableQuickTips: true,
+
+    
+
+    
+    appFolder: 'app',
+
+    
+    autoCreateViewport: false,
+
+    
+    constructor: function(config) {
+        config = config || {};
+        Ext.apply(this, config);
+
+        var requires = config.requires || [];
+
+        Ext.Loader.setPath(this.name, this.appFolder);
+
+        if (this.paths) {
+            Ext.Object.each(this.paths, function(key, value) {
+                Ext.Loader.setPath(key, value);
+            });
+        }
+
+        this.callParent(arguments);
+
+        this.eventbus = Ext.create('Ext.app.EventBus');
+
+        var controllers = Ext.Array.from(this.controllers),
+            ln = controllers && controllers.length,
+            i, controller;
+
+        this.controllers = Ext.create('Ext.util.MixedCollection');
+
+        if (this.autoCreateViewport) {
+            requires.push(this.getModuleClassName('Viewport', 'view'));
+        }
+
+        for (i = 0; i < ln; i++) {
+            requires.push(this.getModuleClassName(controllers[i], 'controller'));
+        }
+
+        Ext.require(requires);
+
+        Ext.onReady(function() {
+            for (i = 0; i < ln; i++) {
+                controller = this.getController(controllers[i]);
+                controller.init(this);
+            }
+
+            this.onBeforeLaunch.call(this);
+        }, this);
+    },
+
+    control: function(selectors, listeners, controller) {
+        this.eventbus.control(selectors, listeners, controller);
+    },
+
+    
+    launch: Ext.emptyFn,
+
+    
+    onBeforeLaunch: function() {
+        if (this.enableQuickTips) {
+            Ext.tip.QuickTipManager.init();
+        }
+
+        if (this.autoCreateViewport) {
+            this.getView('Viewport').create();
+        }
+
+        this.launch.call(this.scope || this);
+        this.launched = true;
+        this.fireEvent('launch', this);
+
+        this.controllers.each(function(controller) {
+            controller.onLaunch(this);
+        }, this);
+    },
+
+    getModuleClassName: function(name, type) {
+        var namespace = Ext.Loader.getPrefix(name);
+
+        if (namespace.length > 0 && namespace !== name) {
+            return name;
+        }
+
+        return this.name + '.' + type + '.' + name;
+    },
+
+    getController: function(name) {
+        var controller = this.controllers.get(name);
+
+        if (!controller) {
+            controller = Ext.create(this.getModuleClassName(name, 'controller'), {
+                application: this,
+                id: name
+            });
+
+            this.controllers.add(controller);
+        }
+
+        return controller;
+    },
+
+    getStore: function(name) {
+        var store = Ext.StoreManager.get(name);
+
+        if (!store) {
+            store = Ext.create(this.getModuleClassName(name, 'store'), {
+                storeId: name
+            });
+        }
+
+        return store;
+    },
+
+    getModel: function(model) {
+        model = this.getModuleClassName(model, 'model');
+
+        return Ext.ModelManager.getModel(model);
+    },
+
+    getView: function(view) {
+        view = this.getModuleClassName(view, 'view');
+
+        return Ext.ClassManager.get(view);
+    }
+});
+
+
+Ext.define('Ext.chart.Callout', {
+
+    
+
+    
+
+    constructor: function(config) {
+        if (config.callouts) {
+            config.callouts.styles = Ext.applyIf(config.callouts.styles || {}, {
+                color: "#000",
+                font: "11px Helvetica, sans-serif"
+            });
+            this.callouts = Ext.apply(this.callouts || {}, config.callouts);
+            this.calloutsArray = [];
+        }
+    },
+
+    renderCallouts: function() {
+        if (!this.callouts) {
+            return;
+        }
+
+        var me = this,
+            items = me.items,
+            animate = me.chart.animate,
+            config = me.callouts,
+            styles = config.styles,
+            group = me.calloutsArray,
+            store = me.chart.store,
+            len = store.getCount(),
+            ratio = items.length / len,
+            previouslyPlacedCallouts = [],
+            i,
+            count,
+            j,
+            p;
+            
+        for (i = 0, count = 0; i < len; i++) {
+            for (j = 0; j < ratio; j++) {
+                var item = items[count],
+                    label = group[count],
+                    storeItem = store.getAt(i),
+                    display;
+                
+                display = config.filter(storeItem);
+                
+                if (!display && !label) {
+                    count++;
+                    continue;               
+                }
+                
+                if (!label) {
+                    group[count] = label = me.onCreateCallout(storeItem, item, i, display, j, count);
+                }
+                for (p in label) {
+                    if (label[p] && label[p].setAttributes) {
+                        label[p].setAttributes(styles, true);
+                    }
+                }
+                if (!display) {
+                    for (p in label) {
+                        if (label[p]) {
+                            if (label[p].setAttributes) {
+                                label[p].setAttributes({
+                                    hidden: true
+                                }, true);
+                            } else if(label[p].setVisible) {
+                                label[p].setVisible(false);
+                            }
+                        }
+                    }
+                }
+                config.renderer(label, storeItem);
+                me.onPlaceCallout(label, storeItem, item, i, display, animate,
+                                  j, count, previouslyPlacedCallouts);
+                previouslyPlacedCallouts.push(label);
+                count++;
+            }
+        }
+        this.hideCallouts(count);
+    },
+
+    onCreateCallout: function(storeItem, item, i, display) {
+        var me = this,
+            group = me.calloutsGroup,
+            config = me.callouts,
+            styles = config.styles,
+            width = styles.width,
+            height = styles.height,
+            chart = me.chart,
+            surface = chart.surface,
+            calloutObj = {
+                
+                
+                lines: false
+            };
+
+        calloutObj.lines = surface.add(Ext.apply({},
+        {
+            type: 'path',
+            path: 'M0,0',
+            stroke: me.getLegendColor() || '#555'
+        },
+        styles));
+
+        if (config.items) {
+            calloutObj.panel = Ext.create('widget.panel', {
+                style: "position: absolute;",    
+                width: width,
+                height: height,
+                items: config.items,
+                renderTo: chart.el
+            });
+        }
+
+        return calloutObj;
+    },
+
+    hideCallouts: function(index) {
+        var calloutsArray = this.calloutsArray,
+            len = calloutsArray.length,
+            co,
+            p;
+        while (len-->index) {
+            co = calloutsArray[len];
+            for (p in co) {
+                if (co[p]) {
+                    co[p].hide(true);
+                }
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.draw.CompositeSprite', {
+
+    
+
+    extend: 'Ext.util.MixedCollection',
+    mixins: {
+        animate: 'Ext.util.Animate'
+    },
+
+    
+    isCompositeSprite: true,
+    constructor: function(config) {
+        var me = this;
+        
+        config = config || {};
+        Ext.apply(me, config);
+
+        me.addEvents(
+            'mousedown',
+            'mouseup',
+            'mouseover',
+            'mouseout',
+            'click'
+        );
+        me.id = Ext.id(null, 'ext-sprite-group-');
+        me.callParent();
+    },
+
+    
+    onClick: function(e) {
+        this.fireEvent('click', e);
+    },
+
+    
+    onMouseUp: function(e) {
+        this.fireEvent('mouseup', e);
+    },
+
+    
+    onMouseDown: function(e) {
+        this.fireEvent('mousedown', e);
+    },
+
+    
+    onMouseOver: function(e) {
+        this.fireEvent('mouseover', e);
+    },
+
+    
+    onMouseOut: function(e) {
+        this.fireEvent('mouseout', e);
+    },
+
+    attachEvents: function(o) {
+        var me = this;
+        
+        o.on({
+            scope: me,
+            mousedown: me.onMouseDown,
+            mouseup: me.onMouseUp,
+            mouseover: me.onMouseOver,
+            mouseout: me.onMouseOut,
+            click: me.onClick
+        });
+    },
+
+    
+    add: function(key, o) {
+        var result = this.callParent(arguments);
+        this.attachEvents(result);
+        return result;
+    },
+
+    insert: function(index, key, o) {
+        return this.callParent(arguments);
+    },
+
+    
+    remove: function(o) {
+        var me = this;
+        
+        o.un({
+            scope: me,
+            mousedown: me.onMouseDown,
+            mouseup: me.onMouseUp,
+            mouseover: me.onMouseOver,
+            mouseout: me.onMouseOut,
+            click: me.onClick
+        });
+        return me.callParent(arguments);
+    },
+    
+    
+    getBBox: function() {
+        var i = 0,
+            sprite,
+            bb,
+            items = this.items,
+            len = this.length,
+            infinity = Infinity,
+            minX = infinity,
+            maxHeight = -infinity,
+            minY = infinity,
+            maxWidth = -infinity,
+            maxWidthBBox, maxHeightBBox;
+        
+        for (; i < len; i++) {
+            sprite = items[i];
+            if (sprite.el) {
+                bb = sprite.getBBox();
+                minX = Math.min(minX, bb.x);
+                minY = Math.min(minY, bb.y);
+                maxHeight = Math.max(maxHeight, bb.height + bb.y);
+                maxWidth = Math.max(maxWidth, bb.width + bb.x);
+            }
+        }
+        
+        return {
+            x: minX,
+            y: minY,
+            height: maxHeight - minY,
+            width: maxWidth - minX
+        };
+    },
+
+    
+    setAttributes: function(attrs, redraw) {
+        var i = 0,
+            items = this.items,
+            len = this.length;
+            
+        for (; i < len; i++) {
+            items[i].setAttributes(attrs, redraw);
+        }
+        return this;
+    },
+
+    
+    hide: function(redraw) {
+        var i = 0,
+            items = this.items,
+            len = this.length;
+            
+        for (; i < len; i++) {
+            items[i].hide(redraw);
+        }
+        return this;
+    },
+
+    
+    show: function(redraw) {
+        var i = 0,
+            items = this.items,
+            len = this.length;
+            
+        for (; i < len; i++) {
+            items[i].show(redraw);
+        }
+        return this;
+    },
+
+    redraw: function() {
+        var me = this,
+            i = 0,
+            items = me.items,
+            surface = me.getSurface(),
+            len = me.length;
+        
+        if (surface) {
+            for (; i < len; i++) {
+                surface.renderItem(items[i]);
+            }
+        }
+        return me;
+    },
+
+    setStyle: function(obj) {
+        var i = 0,
+            items = this.items,
+            len = this.length,
+            item, el;
+            
+        for (; i < len; i++) {
+            item = items[i];
+            el = item.el;
+            if (el) {
+                el.setStyle(obj);
+            }
+        }
+    },
+
+    addCls: function(obj) {
+        var i = 0,
+            items = this.items,
+            surface = this.getSurface(),
+            len = this.length;
+        
+        if (surface) {
+            for (; i < len; i++) {
+                surface.addCls(items[i], obj);
+            }
+        }
+    },
+
+    removeCls: function(obj) {
+        var i = 0,
+            items = this.items,
+            surface = this.getSurface(),
+            len = this.length;
+        
+        if (surface) {
+            for (; i < len; i++) {
+                surface.removeCls(items[i], obj);
+            }
+        }
+    },
+    
+    
+    getSurface: function(){
+        var first = this.first();
+        if (first) {
+            return first.surface;
+        }
+        return null;
+    },
+    
+    
+    destroy: function(){
+        var me = this,
+            surface = me.getSurface(),
+            item;
+            
+        if (surface) {
+            while (me.getCount() > 0) {
+                item = me.first();
+                me.remove(item);
+                surface.remove(item);
+            }
+        }
+        me.clearListeners();
+    }
+});
+
+
+
+Ext.define('Ext.layout.component.Auto', {
+
+    
+
+    alias: 'layout.autocomponent',
+
+    extend: 'Ext.layout.component.Component',
+
+    
+
+    type: 'autocomponent',
+
+    onLayout : function(width, height) {
+        this.setTargetSize(width, height);
+    }
+});
+
+Ext.define('Ext.chart.theme.Theme', {
+
+    
+
+    requires: ['Ext.draw.Color'],
+
+    
+
+    theme: 'Base',
+    themeAttrs: false,
+    
+    initTheme: function(theme) {
+        var me = this,
+            themes = Ext.chart.theme,
+            key, gradients;
+        if (theme) {
+            theme = theme.split(':');
+            for (key in themes) {
+                if (key == theme[0]) {
+                    gradients = theme[1] == 'gradients';
+                    me.themeAttrs = new themes[key]({
+                        useGradients: gradients
+                    });
+                    if (gradients) {
+                        me.gradients = me.themeAttrs.gradients;
+                    }
+                    if (me.themeAttrs.background) {
+                        me.background = me.themeAttrs.background;
+                    }
+                    return;
+                }
+            }
+        }
+    }
+}, 
+
+function() {
+   
+
+(function() {
+    Ext.chart.theme = function(config, base) {
+        config = config || {};
+        var i = 0, l, colors, color,
+            seriesThemes, markerThemes,
+            seriesTheme, markerTheme, 
+            key, gradients = [],
+            midColor, midL;
+        
+        if (config.baseColor) {
+            midColor = Ext.draw.Color.fromString(config.baseColor);
+            midL = midColor.getHSL()[2];
+            if (midL < 0.15) {
+                midColor = midColor.getLighter(0.3);
+            } else if (midL < 0.3) {
+                midColor = midColor.getLighter(0.15);
+            } else if (midL > 0.85) {
+                midColor = midColor.getDarker(0.3);
+            } else if (midL > 0.7) {
+                midColor = midColor.getDarker(0.15);
+            }
+            config.colors = [ midColor.getDarker(0.3).toString(),
+                              midColor.getDarker(0.15).toString(),
+                              midColor.toString(),
+                              midColor.getLighter(0.15).toString(),
+                              midColor.getLighter(0.3).toString()];
+
+            delete config.baseColor;
+        }
+        if (config.colors) {
+            colors = config.colors.slice();
+            markerThemes = base.markerThemes;
+            seriesThemes = base.seriesThemes;
+            l = colors.length;
+            base.colors = colors;
+            for (; i < l; i++) {
+                color = colors[i];
+                markerTheme = markerThemes[i] || {};
+                seriesTheme = seriesThemes[i] || {};
+                markerTheme.fill = seriesTheme.fill = markerTheme.stroke = seriesTheme.stroke = color;
+                markerThemes[i] = markerTheme;
+                seriesThemes[i] = seriesTheme;
+            }
+            base.markerThemes = markerThemes.slice(0, l);
+            base.seriesThemes = seriesThemes.slice(0, l);
+        
+        }
+        for (key in base) {
+            if (key in config) {
+                if (Ext.isObject(config[key]) && Ext.isObject(base[key])) {
+                    Ext.apply(base[key], config[key]);
+                } else {
+                    base[key] = config[key];
+                }
+            }
+        }
+        if (config.useGradients) {
+            colors = base.colors || (function () {
+                var ans = [];
+                for (i = 0, seriesThemes = base.seriesThemes, l = seriesThemes.length; i < l; i++) {
+                    ans.push(seriesThemes[i].fill || seriesThemes[i].stroke);
+                }
+                return ans;
+            })();
+            for (i = 0, l = colors.length; i < l; i++) {
+                midColor = Ext.draw.Color.fromString(colors[i]);
+                if (midColor) {
+                    color = midColor.getDarker(0.1).toString();
+                    midColor = midColor.toString();
+                    key = 'theme-' + midColor.substr(1) + '-' + color.substr(1);
+                    gradients.push({
+                        id: key,
+                        angle: 45,
+                        stops: {
+                            0: {
+                                color: midColor.toString()
+                            },
+                            100: {
+                                color: color.toString()
+                            }
+                        }
+                    });
+                    colors[i] = 'url(#' + key + ')'; 
+                }
+            }
+            base.gradients = gradients;
+            base.colors = colors;
+        }
+        
+        Ext.apply(this, base);
+    };
+})();
+});
+
+
+Ext.define('Ext.chart.Mask', {
+    require: ['Ext.chart.MaskLayer'],
+    
+    constructor: function(config) {
+        var me = this;
+
+        me.addEvents('select');
+
+        if (config) {
+            Ext.apply(me, config);
+        }
+        if (me.mask) {
+            me.on('afterrender', function() {
+                
+                var comp = Ext.create('Ext.chart.MaskLayer', {
+                    renderTo: me.el
+                });
+                comp.el.on({
+                    'mousemove': function(e) {
+                        me.onMouseMove(e);
+                    },
+                    'mouseup': function(e) {
+                        me.resized(e);
+                    }
+                });
+                
+                var resizeHandler = Ext.create('Ext.resizer.Resizer', {
+                    el: comp.el,
+                    handles: 'all',
+                    pinned: true
+                });
+                resizeHandler.on({
+                    'resize': function(e) {
+                        me.resized(e);    
+                    }    
+                });
+                comp.initDraggable();
+                me.maskType = me.mask;
+                me.mask = comp;
+                me.maskSprite = me.surface.add({
+                    type: 'path',
+                    path: ['M', 0, 0],
+                    zIndex: 1001,
+                    opacity: 0.7,
+                    hidden: true,
+                    stroke: '#444'
+                });
+            }, me, { single: true });
+        }
+    },
+    
+    resized: function(e) {
+        var me = this,
+            bbox = me.bbox || me.chartBBox,
+            x = bbox.x,
+            y = bbox.y,
+            width = bbox.width,
+            height = bbox.height,
+            box = me.mask.getBox(true),
+            max = Math.max,
+            min = Math.min,
+            staticX = box.x - x,
+            staticY = box.y - y;
+        
+        staticX = max(staticX, x);
+        staticY = max(staticY, y);
+        staticX = min(staticX, width);
+        staticY = min(staticY, height);
+        box.x = staticX;
+        box.y = staticY;
+        me.fireEvent('select', me, box);
+    },
+
+    onMouseUp: function(e) {
+        var me = this,
+            bbox = me.bbox || me.chartBBox,
+            sel = me.maskSelection;
+        me.maskMouseDown = false;
+        me.mouseDown = false;
+        if (me.mouseMoved) {
+            me.onMouseMove(e);
+            me.mouseMoved = false;
+            me.fireEvent('select', me, {
+                x: sel.x - bbox.x,
+                y: sel.y - bbox.y,
+                width: sel.width,
+                height: sel.height
+            });
+        }
+    },
+
+    onMouseDown: function(e) {
+        var me = this;
+        me.mouseDown = true;
+        me.mouseMoved = false;
+        me.maskMouseDown = {
+            x: e.getPageX() - me.el.getX(),
+            y: e.getPageY() - me.el.getY()
+        };
+    },
+
+    onMouseMove: function(e) {
+        var me = this,
+            mask = me.maskType,
+            bbox = me.bbox || me.chartBBox,
+            x = bbox.x,
+            y = bbox.y,
+            math = Math,
+            floor = math.floor,
+            abs = math.abs,
+            min = math.min,
+            max = math.max,
+            height = floor(y + bbox.height),
+            width = floor(x + bbox.width),
+            posX = e.getPageX(),
+            posY = e.getPageY(),
+            staticX = posX - me.el.getX(),
+            staticY = posY - me.el.getY(),
+            maskMouseDown = me.maskMouseDown,
+            path;
+        
+        me.mouseMoved = me.mouseDown;
+        staticX = max(staticX, x);
+        staticY = max(staticY, y);
+        staticX = min(staticX, width);
+        staticY = min(staticY, height);
+        if (maskMouseDown && me.mouseDown) {
+            if (mask == 'horizontal') {
+                staticY = y;
+                maskMouseDown.y = height;
+                posY = me.el.getY() + bbox.height + me.insetPadding;
+            }
+            else if (mask == 'vertical') {
+                staticX = x;
+                maskMouseDown.x = width;
+            }
+            width = maskMouseDown.x - staticX;
+            height = maskMouseDown.y - staticY;
+            path = ['M', staticX, staticY, 'l', width, 0, 0, height, -width, 0, 'z'];
+            me.maskSelection = {
+                x: width > 0 ? staticX : staticX + width,
+                y: height > 0 ? staticY : staticY + height,
+                width: abs(width),
+                height: abs(height)
+            };
+            me.mask.updateBox(me.maskSelection);
+            me.mask.show();
+            me.maskSprite.setAttributes({
+                hidden: true    
+            }, true);
+        }
+        else {
+            if (mask == 'horizontal') {
+                path = ['M', staticX, y, 'L', staticX, height];
+            }
+            else if (mask == 'vertical') {
+                path = ['M', x, staticY, 'L', width, staticY];
+            }
+            else {
+                path = ['M', staticX, y, 'L', staticX, height, 'M', x, staticY, 'L', width, staticY];
+            }
+            me.maskSprite.setAttributes({
+                path: path,
+                fill: me.maskMouseDown ? me.maskSprite.stroke : false,
+                'stroke-width': mask === true ? 1 : 3,
+                hidden: false
+            }, true);
+        }
+    },
+
+    onMouseLeave: function(e) {
+        var me = this;
+        me.mouseMoved = false;
+        me.mouseDown = false;
+        me.maskMouseDown = false;
+        me.mask.hide();
+        me.maskSprite.hide(true);
+    }
+});
+    
+
+Ext.define('Ext.chart.Navigation', {
+
+    constructor: function() {
+        this.originalStore = this.store;
+    },
+
+    
+    setZoom: function(zoomConfig) {
+        var me = this,
+            axes = me.axes,
+            bbox = me.chartBBox,
+            xScale = 1 / bbox.width,
+            yScale = 1 / bbox.height,
+            zoomer = {
+                x : zoomConfig.x * xScale,
+                y : zoomConfig.y * yScale,
+                width : zoomConfig.width * xScale,
+                height : zoomConfig.height * yScale
+            };
+        axes.each(function(axis) {
+            var ends = axis.calcEnds();
+            if (axis.position == 'bottom' || axis.position == 'top') {
+                var from = (ends.to - ends.from) * zoomer.x + ends.from,
+                    to = (ends.to - ends.from) * zoomer.width + from;
+                axis.minimum = from;
+                axis.maximum = to;
+            } else {
+                var to = (ends.to - ends.from) * (1 - zoomer.y) + ends.from,
+                    from = to - (ends.to - ends.from) * zoomer.height;
+                axis.minimum = from;
+                axis.maximum = to;
+            }
+        });
+        me.redraw(false);
+    },
+
+    
+    restoreZoom: function() {
+        this.store = this.substore = this.originalStore;
+        this.redraw(true);
+    }
+
+});
+
+
+Ext.define('Ext.chart.Shape', {
+
+    
+
+    singleton: true,
+
+    
+
+    circle: function (surface, opts) {
+        return surface.add(Ext.apply({
+            type: 'circle',
+            x: opts.x,
+            y: opts.y,
+            stroke: null,
+            radius: opts.radius
+        }, opts));
+    },
+    line: function (surface, opts) {
+        return surface.add(Ext.apply({
+            type: 'rect',
+            x: opts.x - opts.radius,
+            y: opts.y - opts.radius,
+            height: 2 * opts.radius,
+            width: 2 * opts.radius / 5
+        }, opts));
+    },
+    square: function (surface, opts) {
+        return surface.add(Ext.applyIf({
+            type: 'rect',
+            x: opts.x - opts.radius,
+            y: opts.y - opts.radius,
+            height: 2 * opts.radius,
+            width: 2 * opts.radius,
+            radius: null
+        }, opts));
+    },
+    triangle: function (surface, opts) {
+        opts.radius *= 1.75;
+        return surface.add(Ext.apply({
+            type: 'path',
+            stroke: null,
+            path: "M".concat(opts.x, ",", opts.y, "m0-", opts.radius * 0.58, "l", opts.radius * 0.5, ",", opts.radius * 0.87, "-", opts.radius, ",0z")
+        }, opts));
+    },
+    diamond: function (surface, opts) {
+        var r = opts.radius;
+        r *= 1.5;
+        return surface.add(Ext.apply({
+            type: 'path',
+            stroke: null,
+            path: ["M", opts.x, opts.y - r, "l", r, r, -r, r, -r, -r, r, -r, "z"]
+        }, opts));
+    },
+    cross: function (surface, opts) {
+        var r = opts.radius;
+        r = r / 1.7;
+        return surface.add(Ext.apply({
+            type: 'path',
+            stroke: null,
+            path: "M".concat(opts.x - r, ",", opts.y, "l", [-r, -r, r, -r, r, r, r, -r, r, r, -r, r, r, r, -r, r, -r, -r, -r, r, -r, -r, "z"])
+        }, opts));
+    },
+    plus: function (surface, opts) {
+        var r = opts.radius / 1.3;
+        return surface.add(Ext.apply({
+            type: 'path',
+            stroke: null,
+            path: "M".concat(opts.x - r / 2, ",", opts.y - r / 2, "l", [0, -r, r, 0, 0, r, r, 0, 0, r, -r, 0, 0, r, -r, 0, 0, -r, -r, 0, 0, -r, "z"])
+        }, opts));
+    },
+    arrow: function (surface, opts) {
+        var r = opts.radius;
+        return surface.add(Ext.apply({
+            type: 'path',
+            path: "M".concat(opts.x - r * 0.7, ",", opts.y - r * 0.4, "l", [r * 0.6, 0, 0, -r * 0.4, r, r * 0.8, -r, r * 0.8, 0, -r * 0.4, -r * 0.6, 0], "z")
+        }, opts));
+    },
+    drop: function (surface, x, y, text, size, angle) {
+        size = size || 30;
+        angle = angle || 0;
+        surface.add({
+            type: 'path',
+            path: ['M', x, y, 'l', size, 0, 'A', size * 0.4, size * 0.4, 0, 1, 0, x + size * 0.7, y - size * 0.7, 'z'],
+            fill: '#000',
+            stroke: 'none',
+            rotate: {
+                degrees: 22.5 - angle,
+                x: x,
+                y: y
+            }
+        });
+        angle = (angle + 90) * Math.PI / 180;
+        surface.add({
+            type: 'text',
+            x: x + size * Math.sin(angle) - 10, 
+            y: y + size * Math.cos(angle) + 5,
+            text:  text,
+            'font-size': size * 12 / 40,
+            stroke: 'none',
+            fill: '#fff'
+        });
+    }
+});
+
+Ext.define('Ext.draw.Surface', {
+
+    
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    requires: ['Ext.draw.CompositeSprite'],
+    uses: ['Ext.draw.engine.Svg', 'Ext.draw.engine.Vml'],
+
+    separatorRe: /[, ]+/,
+
+    statics: {
+        
+        create: function(config, enginePriority) {
+            enginePriority = enginePriority || ['Svg', 'Vml'];
+
+            var i = 0,
+                len = enginePriority.length,
+                surfaceClass;
+
+            for (; i < len; i++) {
+                if (Ext.supports[enginePriority[i]]) {
+                    return Ext.create('Ext.draw.engine.' + enginePriority[i], config);
+                }
+            }
+            return false;
+        }
+    },
+
+    
+
+    
+    availableAttrs: {
+        blur: 0,
+        "clip-rect": "0 0 1e9 1e9",
+        cursor: "default",
+        cx: 0,
+        cy: 0,
+        'dominant-baseline': 'auto',
+        fill: "none",
+        "fill-opacity": 1,
+        font: '10px "Arial"',
+        "font-family": '"Arial"',
+        "font-size": "10",
+        "font-style": "normal",
+        "font-weight": 400,
+        gradient: "",
+        height: 0,
+        hidden: false,
+        href: "http://sencha.com/",
+        opacity: 1,
+        path: "M0,0",
+        radius: 0,
+        rx: 0,
+        ry: 0,
+        scale: "1 1",
+        src: "",
+        stroke: "#000",
+        "stroke-dasharray": "",
+        "stroke-linecap": "butt",
+        "stroke-linejoin": "butt",
+        "stroke-miterlimit": 0,
+        "stroke-opacity": 1,
+        "stroke-width": 1,
+        target: "_blank",
+        text: "",
+        "text-anchor": "middle",
+        title: "Ext Draw",
+        width: 0,
+        x: 0,
+        y: 0,
+        zIndex: 0
+    },
+
+    
+    
+
+    container: undefined,
+    height: 352,
+    width: 512,
+    x: 0,
+    y: 0,
+
+    
+    orderSpritesByZIndex: true,
+
+
+    
+    constructor: function(config) {
+        var me = this;
+        config = config || {};
+        Ext.apply(me, config);
+
+        me.domRef = Ext.getDoc().dom;
+
+        me.customAttributes = {};
+
+        me.addEvents(
+            'mousedown',
+            'mouseup',
+            'mouseover',
+            'mouseout',
+            'mousemove',
+            'mouseenter',
+            'mouseleave',
+            'click'
+        );
+
+        me.mixins.observable.constructor.call(me);
+
+        me.getId();
+        me.initGradients();
+        me.initItems();
+        if (me.renderTo) {
+            me.render(me.renderTo);
+            delete me.renderTo;
+        }
+        me.initBackground(config.background);
+    },
+
+    
+    
+    initSurface: Ext.emptyFn,
+
+    
+    
+    renderItem: Ext.emptyFn,
+
+    
+    renderItems: Ext.emptyFn,
+
+    
+    setViewBox: function (x, y, width, height) {
+        if (isFinite(x) && isFinite(y) && isFinite(width) && isFinite(height)) {
+            this.viewBox = {x: x, y: y, width: width, height: height};
+            this.applyViewBox();
+        }
+    },
+
+    
+    addCls: Ext.emptyFn,
+
+    
+    removeCls: Ext.emptyFn,
+
+    
+    setStyle: Ext.emptyFn,
+
+    
+    initGradients: function() {
+        var gradients = this.gradients;
+        if (gradients) {
+            Ext.each(gradients, this.addGradient, this);
+        }
+    },
+
+    
+    initItems: function() {
+        var items = this.items;
+        this.items = Ext.create('Ext.draw.CompositeSprite');
+        this.groups = Ext.create('Ext.draw.CompositeSprite');
+        if (items) {
+            this.add(items);
+        }
+    },
+
+    
+    initBackground: function(config) {
+        var me = this,
+            width = me.width,
+            height = me.height,
+            gradientId, gradient, backgroundSprite;
+        if (config) {
+            if (config.gradient) {
+                gradient = config.gradient;
+                gradientId = gradient.id;
+                me.addGradient(gradient);
+                me.background = me.add({
+                    type: 'rect',
+                    x: 0,
+                    y: 0,
+                    width: width,
+                    height: height,
+                    fill: 'url(#' + gradientId + ')'
+                });
+            } else if (config.fill) {
+                me.background = me.add({
+                    type: 'rect',
+                    x: 0,
+                    y: 0,
+                    width: width,
+                    height: height,
+                    fill: config.fill
+                });
+            } else if (config.image) {
+                me.background = me.add({
+                    type: 'image',
+                    x: 0,
+                    y: 0,
+                    width: width,
+                    height: height,
+                    src: config.image
+                });
+            }
+        }
+    },
+
+    
+    setSize: function(w, h) {
+        if (this.background) {
+            this.background.setAttributes({
+                width: w,
+                height: h,
+                hidden: false
+            }, true);
+        }
+        this.applyViewBox();
+    },
+
+    
+    scrubAttrs: function(sprite) {
+        var i,
+            attrs = {},
+            exclude = {},
+            sattr = sprite.attr;
+        for (i in sattr) {
+            
+            if (this.translateAttrs.hasOwnProperty(i)) {
+                
+                attrs[this.translateAttrs[i]] = sattr[i];
+                exclude[this.translateAttrs[i]] = true;
+            }
+            else if (this.availableAttrs.hasOwnProperty(i) && !exclude[i]) {
+                
+                attrs[i] = sattr[i];
+            }
+        }
+        return attrs;
+    },
+
+    
+    onClick: function(e) {
+        this.processEvent('click', e);
+    },
+
+    
+    onMouseUp: function(e) {
+        this.processEvent('mouseup', e);
+    },
+
+    
+    onMouseDown: function(e) {
+        this.processEvent('mousedown', e);
+    },
+
+    
+    onMouseOver: function(e) {
+        this.processEvent('mouseover', e);
+    },
+
+    
+    onMouseOut: function(e) {
+        this.processEvent('mouseout', e);
+    },
+
+    
+    onMouseMove: function(e) {
+        this.fireEvent('mousemove', e);
+    },
+
+    
+    onMouseEnter: Ext.emptyFn,
+
+    
+    onMouseLeave: Ext.emptyFn,
+
+    
+    addGradient: Ext.emptyFn,
+
+    
+    add: function() {
+        var args = Array.prototype.slice.call(arguments),
+            sprite,
+            index;
+
+        var hasMultipleArgs = args.length > 1;
+        if (hasMultipleArgs || Ext.isArray(args[0])) {
+            var items = hasMultipleArgs ? args : args[0],
+                results = [],
+                i, ln, item;
+
+            for (i = 0, ln = items.length; i < ln; i++) {
+                item = items[i];
+                item = this.add(item);
+                results.push(item);
+            }
+
+            return results;
+        }
+        sprite = this.prepareItems(args[0], true)[0];
+        this.insertByZIndex(sprite);
+        this.onAdd(sprite);
+        return sprite;
+    },
+
+    
+    insertByZIndex: function(sprite) {
+        var me = this,
+            sprites = me.items.items,
+            len = sprites.length,
+            ceil = Math.ceil,
+            zIndex = sprite.attr.zIndex,
+            idx = len,
+            high = idx - 1,
+            low = 0,
+            otherZIndex;
+
+        if (me.orderSpritesByZIndex && len && zIndex < sprites[high].attr.zIndex) {
+            
+            while (low <= high) {
+                idx = ceil((low + high) / 2);
+                otherZIndex = sprites[idx].attr.zIndex;
+                if (otherZIndex > zIndex) {
+                    high = idx - 1;
+                }
+                else if (otherZIndex < zIndex) {
+                    low = idx + 1;
+                }
+                else {
+                    break;
+                }
+            }
+            
+            while (idx < len && sprites[idx].attr.zIndex <= zIndex) {
+                idx++;
+            }
+        }
+
+        me.items.insert(idx, sprite);
+        return idx;
+    },
+
+    onAdd: function(sprite) {
+        var group = sprite.group,
+            draggable = sprite.draggable,
+            groups, ln, i;
+        if (group) {
+            groups = [].concat(group);
+            ln = groups.length;
+            for (i = 0; i < ln; i++) {
+                group = groups[i];
+                this.getGroup(group).add(sprite);
+            }
+            delete sprite.group;
+        }
+        if (draggable) {
+            sprite.initDraggable();
+        }
+    },
+
+    
+    remove: function(sprite, destroySprite) {
+        if (sprite) {
+            this.items.remove(sprite);
+            this.groups.each(function(item) {
+                item.remove(sprite);
+            });
+            sprite.onRemove();
+            if (destroySprite === true) {
+                sprite.destroy();
+            }
+        }
+    },
+
+    
+    removeAll: function(destroySprites) {
+        var items = this.items.items,
+            ln = items.length,
+            i;
+        for (i = ln - 1; i > -1; i--) {
+            this.remove(items[i], destroySprites);
+        }
+    },
+
+    onRemove: Ext.emptyFn,
+
+    onDestroy: Ext.emptyFn,
+
+    
+    applyViewBox: function() {
+        var me = this,
+            viewBox = me.viewBox,
+            width = me.width,
+            height = me.height,
+            viewBoxX, viewBoxY, viewBoxWidth, viewBoxHeight,
+            relativeHeight, relativeWidth, size;
+
+        if (viewBox && (width || height)) {
+            viewBoxX = viewBox.x;
+            viewBoxY = viewBox.y;
+            viewBoxWidth = viewBox.width;
+            viewBoxHeight = viewBox.height;
+            relativeHeight = height / viewBoxHeight;
+            relativeWidth = width / viewBoxWidth;
+
+            if (viewBoxWidth * relativeHeight < width) {
+                viewBoxX -= (width - viewBoxWidth * relativeHeight) / 2 / relativeHeight;
+            }
+            if (viewBoxHeight * relativeWidth < height) {
+                viewBoxY -= (height - viewBoxHeight * relativeWidth) / 2 / relativeWidth;
+            }
+
+            size = 1 / Math.min(viewBoxWidth, relativeHeight);
+
+            me.viewBoxShift = {
+                dx: -viewBoxX,
+                dy: -viewBoxY,
+                scale: size
+            };
+        }
+    },
+
+    transformToViewBox: function (x, y) {
+        if (this.viewBoxShift) {
+            var me = this, shift = me.viewBoxShift;
+            return [x * shift.scale - shift.dx, y * shift.scale - shift.dy];
+        } else {
+            return [x, y];
+        }
+    },
+
+    
+    applyTransformations: function(sprite) {
+            sprite.bbox.transform = 0;
+            this.transform(sprite);
+
+        var me = this,
+            dirty = false,
+            attr = sprite.attr;
+
+        if (attr.translation.x != null || attr.translation.y != null) {
+            me.translate(sprite);
+            dirty = true;
+        }
+        if (attr.scaling.x != null || attr.scaling.y != null) {
+            me.scale(sprite);
+            dirty = true;
+        }
+        if (attr.rotation.degrees != null) {
+            me.rotate(sprite);
+            dirty = true;
+        }
+        if (dirty) {
+            sprite.bbox.transform = 0;
+            this.transform(sprite);
+            sprite.transformations = [];
+        }
+    },
+
+    
+    rotate: function (sprite) {
+        var bbox,
+            deg = sprite.attr.rotation.degrees,
+            centerX = sprite.attr.rotation.x,
+            centerY = sprite.attr.rotation.y;
+        if (!Ext.isNumber(centerX) || !Ext.isNumber(centerY)) {
+            bbox = this.getBBox(sprite);
+            centerX = !Ext.isNumber(centerX) ? bbox.x + bbox.width / 2 : centerX;
+            centerY = !Ext.isNumber(centerY) ? bbox.y + bbox.height / 2 : centerY;
+        }
+        sprite.transformations.push({
+            type: "rotate",
+            degrees: deg,
+            x: centerX,
+            y: centerY
+        });
+    },
+
+    
+    translate: function(sprite) {
+        var x = sprite.attr.translation.x || 0,
+            y = sprite.attr.translation.y || 0;
+        sprite.transformations.push({
+            type: "translate",
+            x: x,
+            y: y
+        });
+    },
+
+    
+    scale: function(sprite) {
+        var bbox,
+            x = sprite.attr.scaling.x || 1,
+            y = sprite.attr.scaling.y || 1,
+            centerX = sprite.attr.scaling.centerX,
+            centerY = sprite.attr.scaling.centerY;
+
+        if (!Ext.isNumber(centerX) || !Ext.isNumber(centerY)) {
+            bbox = this.getBBox(sprite);
+            centerX = !Ext.isNumber(centerX) ? bbox.x + bbox.width / 2 : centerX;
+            centerY = !Ext.isNumber(centerY) ? bbox.y + bbox.height / 2 : centerY;
+        }
+        sprite.transformations.push({
+            type: "scale",
+            x: x,
+            y: y,
+            centerX: centerX,
+            centerY: centerY
+        });
+    },
+
+    
+    rectPath: function (x, y, w, h, r) {
+        if (r) {
+            return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]];
+        }
+        return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]];
+    },
+
+    
+    ellipsePath: function (x, y, rx, ry) {
+        if (ry == null) {
+            ry = rx;
+        }
+        return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]];
+    },
+
+    
+    getPathpath: function (el) {
+        return el.attr.path;
+    },
+
+    
+    getPathcircle: function (el) {
+        var a = el.attr;
+        return this.ellipsePath(a.x, a.y, a.radius, a.radius);
+    },
+
+    
+    getPathellipse: function (el) {
+        var a = el.attr;
+        return this.ellipsePath(a.x, a.y,
+                                a.radiusX || (a.width / 2) || 0,
+                                a.radiusY || (a.height / 2) || 0);
+    },
+
+    
+    getPathrect: function (el) {
+        var a = el.attr;
+        return this.rectPath(a.x, a.y, a.width, a.height, a.r);
+    },
+
+    
+    getPathimage: function (el) {
+        var a = el.attr;
+        return this.rectPath(a.x || 0, a.y || 0, a.width, a.height);
+    },
+
+    
+    getPathtext: function (el) {
+        var bbox = this.getBBoxText(el);
+        return this.rectPath(bbox.x, bbox.y, bbox.width, bbox.height);
+    },
+
+    createGroup: function(id) {
+        var group = this.groups.get(id);
+        if (!group) {
+            group = Ext.create('Ext.draw.CompositeSprite', {
+                surface: this
+            });
+            group.id = id || Ext.id(null, 'ext-surface-group-');
+            this.groups.add(group);
+        }
+        return group;
+    },
+
+    
+    getGroup: function(id) {
+        if (typeof id == "string") {
+            var group = this.groups.get(id);
+            if (!group) {
+                group = this.createGroup(id);
+            }
+        } else {
+            group = id;
+        }
+        return group;
+    },
+
+    
+    prepareItems: function(items, applyDefaults) {
+        items = [].concat(items);
+        
+        var item, i, ln;
+        for (i = 0, ln = items.length; i < ln; i++) {
+            item = items[i];
+            if (!(item instanceof Ext.draw.Sprite)) {
+                
+                item.surface = this;
+                items[i] = this.createItem(item);
+            } else {
+                item.surface = this;
+            }
+        }
+        return items;
+    },
+
+    
+    setText: Ext.emptyFn,
+
+    //@private Creates an item and appends it to the surface. Called
+
+    
+    createItem: Ext.emptyFn,
+
+    
+    getId: function() {
+        return this.id || (this.id = Ext.id(null, 'ext-surface-'));
+    },
+
+    
+    destroy: function() {
+        delete this.domRef;
+        this.removeAll();
+    }
+});
+
+
+Ext.define('Ext.layout.component.Draw', {
+
+    
+
+    alias: 'layout.draw',
+
+    extend: 'Ext.layout.component.Auto',
+
+    
+
+    type: 'draw',
+
+    onLayout : function(width, height) {
+        this.owner.surface.setSize(width, height);
+        this.callParent(arguments);
+    }
+});
+
+Ext.define('Ext.draw.Component', {
+
+    
+
+    alias: 'widget.draw',
+
+    extend: 'Ext.Component',
+
+    requires: [
+        'Ext.draw.Surface',
+        'Ext.layout.component.Draw'
+    ],
+
+    
+
+    
+    enginePriority: ['Svg', 'Vml'],
+
+    baseCls: Ext.baseCSSPrefix + 'surface',
+
+    componentLayout: 'draw',
+
+    
+    viewBox: true,
+
+    
+    autoSize: false,
+
+    
+    initComponent: function() {
+        this.callParent(arguments);
+
+        this.addEvents(
+            'mousedown',
+            'mouseup',
+            'mousemove',
+            'mouseenter',
+            'mouseleave',
+            'click'
+        );
+    },
+
+    
+    onRender: function() {
+        var me = this,
+            viewBox = me.viewBox,
+            autoSize = me.autoSize,
+            bbox, items, width, height, x, y;
+        me.callParent(arguments);
+
+        if (me.createSurface() !== false) {
+            items = me.surface.items;
+
+            if (viewBox || autoSize) {
+                bbox = items.getBBox();
+                width = bbox.width;
+                height = bbox.height;
+                x = bbox.x;
+                y = bbox.y;
+                if (me.viewBox) {
+                    me.surface.setViewBox(x, y, width, height);
+                }
+                else {
+                    
+                    me.autoSizeSurface();
+                }
+            }
+        }
+    },
+
+    //@private
+
+    autoSizeSurface: function() {
+        var me = this,
+            items = me.surface.items,
+            bbox = items.getBBox(),
+            width = bbox.width,
+            height = bbox.height;
+        items.setAttributes({
+            translate: {
+                x: -bbox.x,
+                
+                y: -bbox.y + (+Ext.isOpera)
+            }
+        }, true);
+        if (me.rendered) {
+            me.setSize(width, height);
+            me.surface.setSize(width, height);
+        }
+        else {
+            me.surface.setSize(width, height);
+        }
+        me.el.setSize(width, height);
+    },
+
+    
+    createSurface: function() {
+        var surface = Ext.draw.Surface.create(Ext.apply({}, {
+                width: this.width,
+                height: this.height,
+                renderTo: this.el
+            }, this.initialConfig));
+        if (!surface) {
+            
+            return false;
+        }
+        this.surface = surface;
+
+
+        function refire(eventName) {
+            return function(e) {
+                this.fireEvent(eventName, e);
+            };
+        }
+
+        surface.on({
+            scope: this,
+            mouseup: refire('mouseup'),
+            mousedown: refire('mousedown'),
+            mousemove: refire('mousemove'),
+            mouseenter: refire('mouseenter'),
+            mouseleave: refire('mouseleave'),
+            click: refire('click')
+        });
+    },
+
+
+    
+    onDestroy: function() {
+        var surface = this.surface;
+        if (surface) {
+            surface.destroy();
+        }
+        this.callParent(arguments);
+    }
+
+});
+
+
+Ext.define('Ext.chart.LegendItem', {
+
+    
+
+    extend: 'Ext.draw.CompositeSprite',
+
+    requires: ['Ext.chart.Shape'],
+
+    
+
+    
+    x: 0,
+    y: 0,
+    zIndex: 500,
+
+    constructor: function(config) {
+        this.callParent(arguments);
+        this.createLegend(config);
+    },
+
+    
+    createLegend: function(config) {
+        var me = this,
+            index = config.yFieldIndex,
+            series = me.series,
+            seriesType = series.type,
+            idx = me.yFieldIndex,
+            legend = me.legend,
+            surface = me.surface,
+            refX = legend.x + me.x,
+            refY = legend.y + me.y,
+            bbox, z = me.zIndex,
+            markerConfig, label, mask,
+            radius, toggle = false,
+            seriesStyle = Ext.apply(series.seriesStyle, series.style);
+
+        function getSeriesProp(name) {
+            var val = series[name];
+            return (Ext.isArray(val) ? val[idx] : val);
+        }
+        
+        label = me.add('label', surface.add({
+            type: 'text',
+            x: 20,
+            y: 0,
+            zIndex: z || 0,
+            font: legend.labelFont,
+            text: getSeriesProp('title') || getSeriesProp('yField')
+        }));
+
+        
+        if (seriesType === 'line' || seriesType === 'scatter') {
+            if(seriesType === 'line') {
+                me.add('line', surface.add({
+                    type: 'path',
+                    path: 'M0.5,0.5L16.5,0.5',
+                    zIndex: z,
+                    "stroke-width": series.lineWidth,
+                    "stroke-linejoin": "round",
+                    "stroke-dasharray": series.dash,
+                    stroke: seriesStyle.stroke || '#000',
+                    style: {
+                        cursor: 'pointer'
+                    }
+                }));
+            }
+            if (series.showMarkers || seriesType === 'scatter') {
+                markerConfig = Ext.apply(series.markerStyle, series.markerConfig || {});
+                me.add('marker', Ext.chart.Shape[markerConfig.type](surface, {
+                    fill: markerConfig.fill,
+                    x: 8.5,
+                    y: 0.5,
+                    zIndex: z,
+                    radius: markerConfig.radius || markerConfig.size,
+                    style: {
+                        cursor: 'pointer'
+                    }
+                }));
+            }
+        }
+        
+        else {
+            me.add('box', surface.add({
+                type: 'rect',
+                zIndex: z,
+                x: 0,
+                y: 0,
+                width: 12,
+                height: 12,
+                fill: series.getLegendColor(index),
+                style: {
+                    cursor: 'pointer'
+                }
+            }));
+        }
+        
+        me.setAttributes({
+            hidden: false
+        }, true);
+        
+        bbox = me.getBBox();
+        
+        mask = me.add('mask', surface.add({
+            type: 'rect',
+            x: bbox.x,
+            y: bbox.y,
+            width: bbox.width || 20,
+            height: bbox.height || 20,
+            zIndex: (z || 0) + 1000,
+            fill: '#f00',
+            opacity: 0,
+            style: {
+                'cursor': 'pointer'
+            }
+        }));
+
+        
+        me.on('mouseover', function() {
+            label.setStyle({
+                'font-weight': 'bold'
+            });
+            mask.setStyle({
+                'cursor': 'pointer'
+            });
+            series._index = index;
+            series.highlightItem();
+        }, me);
+
+        me.on('mouseout', function() {
+            label.setStyle({
+                'font-weight': 'normal'
+            });
+            series._index = index;
+            series.unHighlightItem();
+        }, me);
+        
+        if (!series.visibleInLegend(index)) {
+            toggle = true;
+            label.setAttributes({
+               opacity: 0.5
+            }, true);
+        }
+
+        me.on('mousedown', function() {
+            if (!toggle) {
+                series.hideAll();
+                label.setAttributes({
+                    opacity: 0.5
+                }, true);
+            } else {
+                series.showAll();
+                label.setAttributes({
+                    opacity: 1
+                }, true);
+            }
+            toggle = !toggle;
+        }, me);
+        me.updatePosition({x:0, y:0}); 
+    },
+
+    
+    updatePosition: function(relativeTo) {
+        var me = this,
+            items = me.items,
+            ln = items.length,
+            i = 0,
+            item;
+        if (!relativeTo) {
+            relativeTo = me.legend;
+        }
+        for (; i < ln; i++) {
+            item = items[i];
+            switch (item.type) {
+                case 'text':
+                    item.setAttributes({
+                        x: 20 + relativeTo.x + me.x,
+                        y: relativeTo.y + me.y
+                    }, true);
+                    break;
+                case 'rect':
+                    item.setAttributes({
+                        translate: {
+                            x: relativeTo.x + me.x,
+                            y: relativeTo.y + me.y - 6
+                        }
+                    }, true);
+                    break;
+                default:
+                    item.setAttributes({
+                        translate: {
+                            x: relativeTo.x + me.x,
+                            y: relativeTo.y + me.y
+                        }
+                    }, true);
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.chart.Legend', {
+
+    
+
+    requires: ['Ext.chart.LegendItem'],
+
+    
+
+    
+    visible: true,
+
+    
+    position: 'bottom',
+
+    
+    x: 0,
+
+    
+    y: 0,
+
+    
+    labelFont: '12px Helvetica, sans-serif',
+
+    
+    boxStroke: '#000',
+
+    
+    boxStrokeWidth: 1,
+
+    
+    boxFill: '#FFF',
+
+    
+    itemSpacing: 10,
+
+    
+    padding: 5,
+
+    
+    width: 0,
+    
+    height: 0,
+
+    
+    boxZIndex: 100,
+
+    
+    constructor: function(config) {
+        var me = this;
+        if (config) {
+            Ext.apply(me, config);
+        }
+        me.items = [];
+        
+        me.isVertical = ("left|right|float".indexOf(me.position) !== -1);
+
+        
+        me.origX = me.x;
+        me.origY = me.y;
+    },
+
+    
+    create: function() {
+        var me = this;
+        me.createBox();
+        me.createItems();
+        if (!me.created && me.isDisplayed()) {
+            me.created = true;
+
+            
+            me.chart.series.each(function(series) {
+                series.on('titlechange', function() {
+                    me.create();
+                    me.updatePosition();
+                });
+            });
+        }
+    },
+
+    
+    isDisplayed: function() {
+        return this.visible && this.chart.series.findIndex('showInLegend', true) !== -1;
+    },
+
+    
+    createItems: function() {
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            items = me.items,
+            padding = me.padding,
+            itemSpacing = me.itemSpacing,
+            spacingOffset = 2,
+            maxWidth = 0,
+            maxHeight = 0,
+            totalWidth = 0,
+            totalHeight = 0,
+            vertical = me.isVertical,
+            math = Math,
+            mfloor = math.floor,
+            mmax = math.max,
+            index = 0,
+            i = 0,
+            len = items ? items.length : 0,
+            x, y, spacing, item, bbox, height, width;
+
+        
+        if (len) {
+            for (; i < len; i++) {
+                items[i].destroy();
+            }
+        }
+        
+        items.length = [];
+        
+        
+        chart.series.each(function(series, i) {
+            if (series.showInLegend) {
+                Ext.each([].concat(series.yField), function(field, j) {
+                    item = Ext.create('Ext.chart.LegendItem', {
+                        legend: this,
+                        series: series,
+                        surface: chart.surface,
+                        yFieldIndex: j
+                    });
+                    bbox = item.getBBox();
+
+                    
+                    width = bbox.width;
+                    height = bbox.height;
+
+                    if (i + j === 0) {
+                        spacing = vertical ? padding + height / 2 : padding;
+                    }
+                    else {
+                        spacing = itemSpacing / (vertical ? 2 : 1);
+                    }
+                    
+                    item.x = mfloor(vertical ? padding : totalWidth + spacing);
+                    item.y = mfloor(vertical ? totalHeight + spacing : padding + height / 2);
+
+                    
+                    totalWidth += width + spacing;
+                    totalHeight += height + spacing;
+                    maxWidth = mmax(maxWidth, width);
+                    maxHeight = mmax(maxHeight, height);
+
+                    items.push(item);
+                }, this);
+            }
+        }, me);
+
+        
+        me.width = mfloor((vertical ? maxWidth : totalWidth) + padding * 2);
+        if (vertical && items.length === 1) {
+            spacingOffset = 1;
+        }
+        me.height = mfloor((vertical ? totalHeight - spacingOffset * spacing : maxHeight) + (padding * 2));
+        me.itemHeight = maxHeight;
+    },
+
+    
+    getBBox: function() {
+        var me = this;
+        return {
+            x: Math.round(me.x) - me.boxStrokeWidth / 2,
+            y: Math.round(me.y) - me.boxStrokeWidth / 2,
+            width: me.width,
+            height: me.height
+        };
+    },
+
+    
+    createBox: function() {
+        var me = this,
+            box;
+
+        if (me.boxSprite) {
+            me.boxSprite.destroy();
+        }
+        
+        box = me.boxSprite = me.chart.surface.add(Ext.apply({
+            type: 'rect',
+            stroke: me.boxStroke,
+            "stroke-width": me.boxStrokeWidth,
+            fill: me.boxFill,
+            zIndex: me.boxZIndex
+        }, me.getBBox()));
+
+        box.redraw();
+    },
+
+    
+    updatePosition: function() {
+        var me = this,
+            x, y,
+            legendWidth = me.width,
+            legendHeight = me.height,
+            padding = me.padding,
+            chart = me.chart,
+            chartBBox = chart.chartBBox,
+            insets = chart.insetPadding,
+            chartWidth = chartBBox.width - (insets * 2),
+            chartHeight = chartBBox.height - (insets * 2),
+            chartX = chartBBox.x + insets,
+            chartY = chartBBox.y + insets,
+            surface = chart.surface,
+            mfloor = Math.floor;
+
+        if (me.isDisplayed()) {
+            
+            switch(me.position) {
+                case "left":
+                    x = insets;
+                    y = mfloor(chartY + chartHeight / 2 - legendHeight / 2);
+                    break;
+                case "right":
+                    x = mfloor(surface.width - legendWidth) - insets;
+                    y = mfloor(chartY + chartHeight / 2 - legendHeight / 2);
+                    break;
+                case "top":
+                    x = mfloor(chartX + chartWidth / 2 - legendWidth / 2);
+                    y = insets;
+                    break;
+                case "bottom":
+                    x = mfloor(chartX + chartWidth / 2 - legendWidth / 2);
+                    y = mfloor(surface.height - legendHeight) - insets;
+                    break;
+                default:
+                    x = mfloor(me.origX) + insets;
+                    y = mfloor(me.origY) + insets;
+            }
+            me.x = x;
+            me.y = y;
+
+            
+            Ext.each(me.items, function(item) {
+                item.updatePosition();
+            });
+            
+            me.boxSprite.setAttributes(me.getBBox(), true);
+        }
+    }
+});
+
+
+Ext.define('Ext.chart.Chart', {
+
+    
+
+    alias: 'widget.chart',
+
+    extend: 'Ext.draw.Component',
+    
+    mixins: {
+        themeManager: 'Ext.chart.theme.Theme',
+        mask: 'Ext.chart.Mask',
+        navigation: 'Ext.chart.Navigation'
+    },
+
+    requires: [
+        'Ext.util.MixedCollection',
+        'Ext.data.StoreManager',
+        'Ext.chart.Legend',
+        'Ext.util.DelayedTask'
+    ],
+
+    
+
+    
+    viewBox: false,
+
+    
+
+    
+    animate: false,
+
+    
+    legend: false,
+
+    
+    insetPadding: 10,
+
+    
+    enginePriority: ['Svg', 'Vml'],
+
+    
+    background: false,
+
+    
+
+    
+
+    
+
+    
+
+    constructor: function(config) {
+        var me = this,
+            defaultAnim;
+            
+        config = Ext.apply({}, config);
+        me.initTheme(config.theme || me.theme);
+        if (me.gradients) {
+            Ext.apply(config, { gradients: me.gradients });
+        }
+        if (me.background) {
+            Ext.apply(config, { background: me.background });
+        }
+        if (config.animate) {
+            defaultAnim = {
+                easing: 'ease',
+                duration: 500
+            };
+            if (Ext.isObject(config.animate)) {
+                config.animate = Ext.applyIf(config.animate, defaultAnim);
+            }
+            else {
+                config.animate = defaultAnim;
+            }
+        }
+        me.mixins.mask.constructor.call(me, config);
+        me.mixins.navigation.constructor.call(me, config);
+        me.callParent([config]);
+    },
+    
+    getChartStore: function(){
+        return this.substore || this.store;    
+    },
+
+    initComponent: function() {
+        var me = this,
+            axes,
+            series;
+        me.callParent();
+        me.addEvents(
+            'itemmousedown',
+            'itemmouseup',
+            'itemmouseover',
+            'itemmouseout',
+            'itemclick',
+            'itemdoubleclick',
+            'itemdragstart',
+            'itemdrag',
+            'itemdragend',
+            
+            'beforerefresh',
+            
+            'refresh'
+        );
+        Ext.applyIf(me, {
+            zoom: {
+                width: 1,
+                height: 1,
+                x: 0,
+                y: 0
+            }
+        });
+        me.maxGutter = [0, 0];
+        me.store = Ext.data.StoreManager.lookup(me.store);
+        axes = me.axes;
+        me.axes = Ext.create('Ext.util.MixedCollection', false, function(a) { return a.position; });
+        if (axes) {
+            me.axes.addAll(axes);
+        }
+        series = me.series;
+        me.series = Ext.create('Ext.util.MixedCollection', false, function(a) { return a.seriesId || (a.seriesId = Ext.id(null, 'ext-chart-series-')); });
+        if (series) {
+            me.series.addAll(series);
+        }
+        if (me.legend !== false) {
+            me.legend = Ext.create('Ext.chart.Legend', Ext.applyIf({chart:me}, me.legend));
+        }
+
+        me.on({
+            mousemove: me.onMouseMove,
+            mouseleave: me.onMouseLeave,
+            mousedown: me.onMouseDown,
+            mouseup: me.onMouseUp,
+            scope: me
+        });
+    },
+
+    
+    afterComponentLayout: function(width, height) {
+        var me = this;
+        if (Ext.isNumber(width) && Ext.isNumber(height)) {
+            me.curWidth = width;
+            me.curHeight = height;
+            me.redraw(true);
+        }
+        this.callParent(arguments);
+    },
+
+    
+    redraw: function(resize) {
+        var me = this,
+            chartBBox = me.chartBBox = {
+                x: 0,
+                y: 0,
+                height: me.curHeight,
+                width: me.curWidth
+            },
+            legend = me.legend;
+        me.surface.setSize(chartBBox.width, chartBBox.height);
+        
+        me.series.each(me.initializeSeries, me);
+        me.axes.each(me.initializeAxis, me);
+        
+        
+        me.axes.each(function(axis) {
+            axis.processView();
+        });
+        me.axes.each(function(axis) {
+            axis.drawAxis(true);
+        });
+
+        
+        if (legend !== false) {
+            legend.create();
+        }
+
+        
+        me.alignAxes();
+
+        
+        if (me.legend !== false) {
+            legend.updatePosition();
+        }
+
+        
+        me.getMaxGutter();
+
+        
+        me.resizing = !!resize;
+
+        me.axes.each(me.drawAxis, me);
+        me.series.each(me.drawCharts, me);
+        me.resizing = false;
+    },
+
+    
+    afterRender: function() {
+        var ref,
+            me = this;
+        this.callParent();
+
+        if (me.categoryNames) {
+            me.setCategoryNames(me.categoryNames);
+        }
+
+        if (me.tipRenderer) {
+            ref = me.getFunctionRef(me.tipRenderer);
+            me.setTipRenderer(ref.fn, ref.scope);
+        }
+        me.bindStore(me.store, true);
+        me.refresh();
+    },
+
+    
+    getEventXY: function(e) {
+        var me = this,
+            box = this.surface.getRegion(),
+            pageXY = e.getXY(),
+            x = pageXY[0] - box.left,
+            y = pageXY[1] - box.top;
+        return [x, y];
+    },
+
+    
+    onClick: function(e) {
+        var me = this,
+            position = me.getEventXY(e),
+            item;
+
+        
+        
+        me.series.each(function(series) {
+            if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
+                if (series.getItemForPoint) {
+                    item = series.getItemForPoint(position[0], position[1]);
+                    if (item) {
+                        series.fireEvent('itemclick', item);
+                    }
+                }
+            }
+        }, me);
+    },
+
+    
+    onMouseDown: function(e) {
+        var me = this,
+            position = me.getEventXY(e),
+            item;
+
+        if (me.mask) {
+            me.mixins.mask.onMouseDown.call(me, e);
+        }
+        
+        
+        me.series.each(function(series) {
+            if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
+                if (series.getItemForPoint) {
+                    item = series.getItemForPoint(position[0], position[1]);
+                    if (item) {
+                        series.fireEvent('itemmousedown', item);
+                    }
+                }
+            }
+        }, me);
+    },
+
+    
+    onMouseUp: function(e) {
+        var me = this,
+            position = me.getEventXY(e),
+            item;
+
+        if (me.mask) {
+            me.mixins.mask.onMouseUp.call(me, e);
+        }
+        
+        
+        me.series.each(function(series) {
+            if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
+                if (series.getItemForPoint) {
+                    item = series.getItemForPoint(position[0], position[1]);
+                    if (item) {
+                        series.fireEvent('itemmouseup', item);
+                    }
+                }
+            }
+        }, me);
+    },
+
+    
+    onMouseMove: function(e) {
+        var me = this,
+            position = me.getEventXY(e),
+            item, last, storeItem, storeField;
+
+        if (me.mask) {
+            me.mixins.mask.onMouseMove.call(me, e);
+        }
+        
+        
+        me.series.each(function(series) {
+            if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
+                if (series.getItemForPoint) {
+                    item = series.getItemForPoint(position[0], position[1]);
+                    last = series._lastItemForPoint;
+                    storeItem = series._lastStoreItem;
+                    storeField = series._lastStoreField;
+
+
+                    if (item !== last || item && (item.storeItem != storeItem || item.storeField != storeField)) {
+                        if (last) {
+                            series.fireEvent('itemmouseout', last);
+                            delete series._lastItemForPoint;
+                            delete series._lastStoreField;
+                            delete series._lastStoreItem;
+                        }
+                        if (item) {
+                            series.fireEvent('itemmouseover', item);
+                            series._lastItemForPoint = item;
+                            series._lastStoreItem = item.storeItem;
+                            series._lastStoreField = item.storeField;
+                        }
+                    }
+                }
+            } else {
+                last = series._lastItemForPoint;
+                if (last) {
+                    series.fireEvent('itemmouseout', last);
+                    delete series._lastItemForPoint;
+                    delete series._lastStoreField;
+                    delete series._lastStoreItem;
+                }
+            }
+        }, me);
+    },
+
+    
+    onMouseLeave: function(e) {
+        var me = this;
+        if (me.mask) {
+            me.mixins.mask.onMouseLeave.call(me, e);
+        }
+        me.series.each(function(series) {
+            delete series._lastItemForPoint;
+        });
+    },
+
+    
+    delayRefresh: function() {
+        var me = this;
+        if (!me.refreshTask) {
+            me.refreshTask = Ext.create('Ext.util.DelayedTask', me.refresh, me);
+        }
+        me.refreshTask.delay(me.refreshBuffer);
+    },
+
+    
+    refresh: function() {
+        var me = this;
+        if (me.rendered && me.curWidth !== undefined && me.curHeight !== undefined) {
+            if (me.fireEvent('beforerefresh', me) !== false) {
+                me.redraw();
+                me.fireEvent('refresh', me);
+            }
+        }
+    },
+
+    
+    bindStore: function(store, initial) {
+        var me = this;
+        if (!initial && me.store) {
+            if (store !== me.store && me.store.autoDestroy) {
+                me.store.destroyStore();
+            }
+            else {
+                me.store.un('datachanged', me.refresh, me);
+                me.store.un('add', me.delayRefresh, me);
+                me.store.un('remove', me.delayRefresh, me);
+                me.store.un('update', me.delayRefresh, me);
+                me.store.un('clear', me.refresh, me);
+            }
+        }
+        if (store) {
+            store = Ext.data.StoreManager.lookup(store);
+            store.on({
+                scope: me,
+                datachanged: me.refresh,
+                add: me.delayRefresh,
+                remove: me.delayRefresh,
+                update: me.delayRefresh,
+                clear: me.refresh
+            });
+        }
+        me.store = store;
+        if (store && !initial) {
+            me.refresh();
+        }
+    },
+
+    
+    initializeAxis: function(axis) {
+        var me = this,
+            chartBBox = me.chartBBox,
+            w = chartBBox.width,
+            h = chartBBox.height,
+            x = chartBBox.x,
+            y = chartBBox.y,
+            themeAttrs = me.themeAttrs,
+            config = {
+                chart: me
+            };
+        if (themeAttrs) {
+            config.axisStyle = Ext.apply({}, themeAttrs.axis);
+            config.axisLabelLeftStyle = Ext.apply({}, themeAttrs.axisLabelLeft);
+            config.axisLabelRightStyle = Ext.apply({}, themeAttrs.axisLabelRight);
+            config.axisLabelTopStyle = Ext.apply({}, themeAttrs.axisLabelTop);
+            config.axisLabelBottomStyle = Ext.apply({}, themeAttrs.axisLabelBottom);
+            config.axisTitleLeftStyle = Ext.apply({}, themeAttrs.axisTitleLeft);
+            config.axisTitleRightStyle = Ext.apply({}, themeAttrs.axisTitleRight);
+            config.axisTitleTopStyle = Ext.apply({}, themeAttrs.axisTitleTop);
+            config.axisTitleBottomStyle = Ext.apply({}, themeAttrs.axisTitleBottom);
+        }
+        switch (axis.position) {
+            case 'top':
+                Ext.apply(config, {
+                    length: w,
+                    width: h,
+                    x: x,
+                    y: y
+                });
+            break;
+            case 'bottom':
+                Ext.apply(config, {
+                    length: w,
+                    width: h,
+                    x: x,
+                    y: h
+                });
+            break;
+            case 'left':
+                Ext.apply(config, {
+                    length: h,
+                    width: w,
+                    x: x,
+                    y: h
+                });
+            break;
+            case 'right':
+                Ext.apply(config, {
+                    length: h,
+                    width: w,
+                    x: w,
+                    y: h
+                });
+            break;
+        }
+        if (!axis.chart) {
+            Ext.apply(config, axis);
+            axis = me.axes.replace(Ext.createByAlias('axis.' + axis.type.toLowerCase(), config));
+        }
+        else {
+            Ext.apply(axis, config);
+        }
+    },
+
+
+    
+    alignAxes: function() {
+        var me = this,
+            axes = me.axes,
+            legend = me.legend,
+            edges = ['top', 'right', 'bottom', 'left'],
+            chartBBox,
+            insetPadding = me.insetPadding,
+            insets = {
+                top: insetPadding,
+                right: insetPadding,
+                bottom: insetPadding,
+                left: insetPadding
+            };
+
+        function getAxis(edge) {
+            var i = axes.findIndex('position', edge);
+            return (i < 0) ? null : axes.getAt(i);
+        }
+
+        
+        Ext.each(edges, function(edge) {
+            var isVertical = (edge === 'left' || edge === 'right'),
+                axis = getAxis(edge),
+                bbox;
+
+            
+            if (legend !== false) {
+                if (legend.position === edge) {
+                    bbox = legend.getBBox();
+                    insets[edge] += (isVertical ? bbox.width : bbox.height) + insets[edge];
+                }
+            }
+
+            
+            
+            if (axis && axis.bbox) {
+                bbox = axis.bbox;
+                insets[edge] += (isVertical ? bbox.width : bbox.height);
+            }
+        });
+        
+        chartBBox = {
+            x: insets.left,
+            y: insets.top,
+            width: me.curWidth - insets.left - insets.right,
+            height: me.curHeight - insets.top - insets.bottom
+        };
+        me.chartBBox = chartBBox;
+
+        
+        
+        axes.each(function(axis) {
+            var pos = axis.position,
+                isVertical = (pos === 'left' || pos === 'right');
+
+            axis.x = (pos === 'right' ? chartBBox.x + chartBBox.width : chartBBox.x);
+            axis.y = (pos === 'top' ? chartBBox.y : chartBBox.y + chartBBox.height);
+            axis.width = (isVertical ? chartBBox.width : chartBBox.height);
+            axis.length = (isVertical ? chartBBox.height : chartBBox.width);
+        });
+    },
+
+    
+    initializeSeries: function(series, idx) {
+        var me = this,
+            themeAttrs = me.themeAttrs,
+            seriesObj, markerObj, seriesThemes, st,
+            markerThemes, colorArrayStyle = [],
+            i = 0, l,
+            config = {
+                chart: me,
+                seriesId: series.seriesId
+            };
+        if (themeAttrs) {
+            seriesThemes = themeAttrs.seriesThemes;
+            markerThemes = themeAttrs.markerThemes;
+            seriesObj = Ext.apply({}, themeAttrs.series);
+            markerObj = Ext.apply({}, themeAttrs.marker);
+            config.seriesStyle = Ext.apply(seriesObj, seriesThemes[idx % seriesThemes.length]);
+            config.seriesLabelStyle = Ext.apply({}, themeAttrs.seriesLabel);
+            config.markerStyle = Ext.apply(markerObj, markerThemes[idx % markerThemes.length]);
+            if (themeAttrs.colors) {
+                config.colorArrayStyle = themeAttrs.colors;
+            } else {
+                colorArrayStyle = [];
+                for (l = seriesThemes.length; i < l; i++) {
+                    st = seriesThemes[i];
+                    if (st.fill || st.stroke) {
+                        colorArrayStyle.push(st.fill || st.stroke);
+                    }
+                }
+                if (colorArrayStyle.length) {
+                    config.colorArrayStyle = colorArrayStyle;
+                }
+            }
+            config.seriesIdx = idx;
+        }
+        if (series instanceof Ext.chart.series.Series) {
+            Ext.apply(series, config);
+        } else {
+            Ext.applyIf(config, series);
+            series = me.series.replace(Ext.createByAlias('series.' + series.type.toLowerCase(), config));
+        }
+        if (series.initialize) {
+            series.initialize();
+        }
+    },
+
+    
+    getMaxGutter: function() {
+        var me = this,
+            maxGutter = [0, 0];
+        me.series.each(function(s) {
+            var gutter = s.getGutters && s.getGutters() || [0, 0];
+            maxGutter[0] = Math.max(maxGutter[0], gutter[0]);
+            maxGutter[1] = Math.max(maxGutter[1], gutter[1]);
+        });
+        me.maxGutter = maxGutter;
+    },
+
+    
+    drawAxis: function(axis) {
+        axis.drawAxis();
+    },
+
+    
+    drawCharts: function(series) {
+        series.triggerafterrender = false;
+        series.drawSeries();
+        if (!this.animate) {
+            series.fireEvent('afterrender');
+        }
+    },
+
+    
+    destroy: function() {
+        Ext.destroy(this.surface);
+        this.bindStore(null);
+        this.callParent(arguments);
+    }
+});
+
+
+Ext.define('Ext.chart.Highlight', {
+
+    
+
+    requires: ['Ext.fx.Anim'],
+
+    
+
+    
+    highlight: false,
+
+    highlightCfg : null,
+
+    constructor: function(config) {
+        if (config.highlight) {
+            if (config.highlight !== true) { 
+                this.highlightCfg = Ext.apply({}, config.highlight);
+            }
+            else {
+                this.highlightCfg = {
+                    fill: '#fdd',
+                    radius: 20,
+                    lineWidth: 5,
+                    stroke: '#f55'
+                };
+            }
+        }
+    },
+
+    
+    highlightItem: function(item) {
+        if (!item) {
+            return;
+        }
+        
+        var me = this,
+            sprite = item.sprite,
+            opts = me.highlightCfg,
+            surface = me.chart.surface,
+            animate = me.chart.animate,
+            p, from, to, pi;
+
+        if (!me.highlight || !sprite || sprite._highlighted) {
+            return;
+        }
+        if (sprite._anim) {
+            sprite._anim.paused = true;
+        }
+        sprite._highlighted = true;
+        if (!sprite._defaults) {
+            sprite._defaults = Ext.apply({}, sprite.attr);
+            from = {};
+            to = {};
+            for (p in opts) {
+                if (! (p in sprite._defaults)) {
+                    sprite._defaults[p] = surface.availableAttrs[p];
+                }
+                from[p] = sprite._defaults[p];
+                to[p] = opts[p];
+                if (Ext.isObject(opts[p])) {
+                    from[p] = {};
+                    to[p] = {};
+                    Ext.apply(sprite._defaults[p], sprite.attr[p]);
+                    Ext.apply(from[p], sprite._defaults[p]);
+                    for (pi in sprite._defaults[p]) {
+                        if (! (pi in opts[p])) {
+                            to[p][pi] = from[p][pi];
+                        } else {
+                            to[p][pi] = opts[p][pi];
+                        }
+                    }
+                    for (pi in opts[p]) {
+                        if (! (pi in to[p])) {
+                            to[p][pi] = opts[p][pi];
+                        }
+                    }
+                }
+            }
+            sprite._from = from;
+            sprite._to = to;
+            sprite._endStyle = to;
+        }
+        if (animate) {
+            sprite._anim = Ext.create('Ext.fx.Anim', {
+                target: sprite,
+                from: sprite._from,
+                to: sprite._to,
+                duration: 150
+            });
+        } else {
+            sprite.setAttributes(sprite._to, true);
+        }
+    },
+
+    
+    unHighlightItem: function() {
+        if (!this.highlight || !this.items) {
+            return;
+        }
+
+        var me = this,
+            items = me.items,
+            len = items.length,
+            opts = me.highlightCfg,
+            animate = me.chart.animate,
+            i = 0,
+            obj, p, sprite;
+
+        for (; i < len; i++) {
+            if (!items[i]) {
+                continue;
+            }
+            sprite = items[i].sprite;
+            if (sprite && sprite._highlighted) {
+                if (sprite._anim) {
+                    sprite._anim.paused = true;
+                }
+                obj = {};
+                for (p in opts) {
+                    if (Ext.isObject(sprite._defaults[p])) {
+                        obj[p] = {};
+                        Ext.apply(obj[p], sprite._defaults[p]);
+                    }
+                    else {
+                        obj[p] = sprite._defaults[p];
+                    }
+                }
+                if (animate) {
+                    
+                    sprite._endStyle = obj;
+                    sprite._anim = Ext.create('Ext.fx.Anim', {
+                        target: sprite,
+                        to: obj,
+                        duration: 150
+                    });
+                }
+                else {
+                    sprite.setAttributes(obj, true);
+                }
+                delete sprite._highlighted;
+                
+            }
+        }
+    },
+
+    cleanHighlights: function() {
+        if (!this.highlight) {
+            return;
+        }
+
+        var group = this.group,
+            markerGroup = this.markerGroup,
+            i = 0,
+            l;
+        for (l = group.getCount(); i < l; i++) {
+            delete group.getAt(i)._defaults;
+        }
+        if (markerGroup) {
+            for (l = markerGroup.getCount(); i < l; i++) {
+                delete markerGroup.getAt(i)._defaults;
+            }
+        }
+    }
+});
+
+Ext.define('Ext.chart.Label', {
+
+    
+
+    requires: ['Ext.draw.Color'],
+
+    
+
+    
+
+    //@private a regex to parse url type colors.
+
+    colorStringRe: /url\s*\(\s*#([^\/)]+)\s*\)/,
+
+    //@private the mixin constructor. Used internally by Series.
+
+    constructor: function(config) {
+        var me = this;
+        me.label = Ext.applyIf(me.label || {},
+        {
+            display: "none",
+            color: "#000",
+            field: "name",
+            minMargin: 50,
+            font: "11px Helvetica, sans-serif",
+            orientation: "horizontal",
+            renderer: function(v) {
+                return v;
+            }
+        });
+
+        if (me.label.display !== 'none') {
+            me.labelsGroup = me.chart.surface.getGroup(me.seriesId + '-labels');
+        }
+    },
+
+    //@private a method to render all labels in the labelGroup
+
+    renderLabels: function() {
+        var me = this,
+            chart = me.chart,
+            gradients = chart.gradients,
+            items = me.items,
+            animate = chart.animate,
+            config = me.label,
+            display = config.display,
+            color = config.color,
+            field = [].concat(config.field),
+            group = me.labelsGroup,
+            groupLength = (group || 0) && group.length,
+            store = me.chart.store,
+            len = store.getCount(),
+            itemLength = (items || 0) && items.length,
+            ratio = itemLength / len,
+            gradientsCount = (gradients || 0) && gradients.length,
+            Color = Ext.draw.Color,
+            hides = [],
+            gradient, i, count, groupIndex, index, j, k, colorStopTotal, colorStopIndex, colorStop, item, label,
+            storeItem, sprite, spriteColor, spriteBrightness, labelColor, colorString;
+
+        if (display == 'none') {
+            return;
+        }
+        
+        if(itemLength == 0){
+            while(groupLength--)
+                hides.push(groupLength);
+        }else{
+            for (i = 0, count = 0, groupIndex = 0; i < len; i++) {
+                index = 0;
+                for (j = 0; j < ratio; j++) {
+                    item = items[count];
+                    label = group.getAt(groupIndex);
+                    storeItem = store.getAt(i);
+                    
+                    while(this.__excludes && this.__excludes[index] && ratio > 1) {
+                        if(field[j]){
+                            hides.push(groupIndex);
+                        }
+                        index++;
+
+                    }
+
+                    if (!item && label) {
+                        label.hide(true);
+                        groupIndex++;
+                    }
+
+                    if (item && field[j]) {
+                        if (!label) {
+                            label = me.onCreateLabel(storeItem, item, i, display, j, index);
+                        }
+                        me.onPlaceLabel(label, storeItem, item, i, display, animate, j, index);
+                        groupIndex++;
+
+                        
+                        if (config.contrast && item.sprite) {
+                            sprite = item.sprite;
+                            
+                            if (sprite._endStyle) {
+                                colorString = sprite._endStyle.fill;
+                            }
+                            else if (sprite._to) {
+                                colorString = sprite._to.fill;
+                            }
+                            else {
+                                colorString = sprite.attr.fill;
+                            }
+                            colorString = colorString || sprite.attr.fill;
+
+                            spriteColor = Color.fromString(colorString);
+                            
+                            if (colorString && !spriteColor) {
+                                colorString = colorString.match(me.colorStringRe)[1];
+                                for (k = 0; k < gradientsCount; k++) {
+                                    gradient = gradients[k];
+                                    if (gradient.id == colorString) {
+                                        
+                                        colorStop = 0; colorStopTotal = 0;
+                                        for (colorStopIndex in gradient.stops) {
+                                            colorStop++;
+                                            colorStopTotal += Color.fromString(gradient.stops[colorStopIndex].color).getGrayscale();
+                                        }
+                                        spriteBrightness = (colorStopTotal / colorStop) / 255;
+                                        break;
+                                    }
+                                }
+                            }
+                            else {
+                                spriteBrightness = spriteColor.getGrayscale() / 255;
+                            }
+                            if (label.isOutside) {
+                                spriteBrightness = 1;
+                            }
+                            labelColor = Color.fromString(label.attr.color || label.attr.fill).getHSL();
+                            labelColor[2] = spriteBrightness > 0.5 ? 0.2 : 0.8;
+                            label.setAttributes({
+                                fill: String(Color.fromHSL.apply({}, labelColor))
+                            }, true);
+                        }
+
+                    }
+                    count++;
+                    index++;
+                }
+            }
+        }
+        me.hideLabels(hides);
+    },
+    hideLabels: function(hides){
+        var labelsGroup = this.labelsGroup,
+            hlen = hides.length;
+        while(hlen--)
+            labelsGroup.getAt(hides[hlen]).hide(true);
+    }
+});
+Ext.define('Ext.chart.MaskLayer', {
+    extend: 'Ext.Component',
+    
+    constructor: function(config) {
+        config = Ext.apply(config || {}, {
+            style: 'position:absolute;background-color:#888;cursor:move;opacity:0.6;border:1px solid #222;'
+        });
+        this.callParent([config]);    
+    },
+    
+    initComponent: function() {
+        var me = this;
+        me.callParent(arguments);
+        me.addEvents(
+            'mousedown',
+            'mouseup',
+            'mousemove',
+            'mouseenter',
+            'mouseleave'
+        );
+    },
+
+    initDraggable: function() {
+        this.callParent(arguments);
+        this.dd.onStart = function (e) {
+            var me = this,
+                comp = me.comp;
+    
+            
+            this.startPosition = comp.getPosition(true);
+    
+            
+            
+            if (comp.ghost && !comp.liveDrag) {
+                 me.proxy = comp.ghost();
+                 me.dragTarget = me.proxy.header.el;
+            }
+    
+            
+            if (me.constrain || me.constrainDelegate) {
+                me.constrainTo = me.calculateConstrainRegion();
+            }
+        };
+    }
+});
+
+Ext.define('Ext.chart.TipSurface', {
+
+    
+
+    extend: 'Ext.draw.Component',
+
+    
+
+    spriteArray: false,
+    renderFirst: true,
+
+    constructor: function(config) {
+        this.callParent([config]);
+        if (config.sprites) {
+            this.spriteArray = [].concat(config.sprites);
+            delete config.sprites;
+        }
+    },
+
+    onRender: function() {
+        var me = this,
+            i = 0,
+            l = 0,
+            sp,
+            sprites;
+            this.callParent(arguments);
+        sprites = me.spriteArray;
+        if (me.renderFirst && sprites) {
+            me.renderFirst = false;
+            for (l = sprites.length; i < l; i++) {
+                sp = me.surface.add(sprites[i]);
+                sp.setAttributes({
+                    hidden: false
+                },
+                true);
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.chart.Tip', {
+
+    
+
+    requires: ['Ext.tip.ToolTip', 'Ext.chart.TipSurface'],
+
+    
+
+    constructor: function(config) {
+        var me = this,
+            surface,
+            sprites,
+            tipSurface;
+        if (config.tips) {
+            me.tipTimeout = null;
+            me.tipConfig = Ext.apply({}, config.tips, {
+                renderer: Ext.emptyFn,
+                constrainPosition: false
+            });
+            me.tooltip = Ext.create('Ext.tip.ToolTip', me.tipConfig);
+            me.chart.surface.on('mousemove', me.tooltip.onMouseMove, me.tooltip);
+            me.chart.surface.on('mouseleave', function() {
+                me.hideTip();
+            });
+            if (me.tipConfig.surface) {
+                
+                surface = me.tipConfig.surface;
+                sprites = surface.sprites;
+                tipSurface = Ext.create('Ext.chart.TipSurface', {
+                    id: 'tipSurfaceComponent',
+                    sprites: sprites
+                });
+                if (surface.width && surface.height) {
+                    tipSurface.setSize(surface.width, surface.height);
+                }
+                me.tooltip.add(tipSurface);
+                me.spriteTip = tipSurface;
+            }
+        }
+    },
+
+    showTip: function(item) {
+        var me = this;
+        if (!me.tooltip) {
+            return;
+        }
+        clearTimeout(me.tipTimeout);
+        var tooltip = me.tooltip,
+            spriteTip = me.spriteTip,
+            tipConfig = me.tipConfig,
+            trackMouse = tooltip.trackMouse,
+            sprite, surface, surfaceExt, pos, x, y;
+        if (!trackMouse) {
+            tooltip.trackMouse = true;
+            sprite = item.sprite;
+            surface = sprite.surface;
+            surfaceExt = Ext.get(surface.getId());
+            if (surfaceExt) {
+                pos = surfaceExt.getXY();
+                x = pos[0] + (sprite.attr.x || 0) + (sprite.attr.translation && sprite.attr.translation.x || 0);
+                y = pos[1] + (sprite.attr.y || 0) + (sprite.attr.translation && sprite.attr.translation.y || 0);
+                tooltip.targetXY = [x, y];
+            }
+        }
+        if (spriteTip) {
+            tipConfig.renderer.call(tooltip, item.storeItem, item, spriteTip.surface);
+        } else {
+            tipConfig.renderer.call(tooltip, item.storeItem, item);
+        }
+        tooltip.show();
+        tooltip.trackMouse = trackMouse;
+    },
+
+    hideTip: function(item) {
+        var tooltip = this.tooltip;
+        if (!tooltip) {
+            return;
+        }
+        clearTimeout(this.tipTimeout);
+        this.tipTimeout = setTimeout(function() {
+            tooltip.hide();
+        }, 0);
+    }
+});
+
+Ext.define('Ext.chart.axis.Abstract', {
+
+    
+
+    requires: ['Ext.chart.Chart'],
+
+    
+
+    
+    constructor: function(config) {
+        config = config || {};
+
+        var me = this,
+            pos = config.position || 'left';
+
+        pos = pos.charAt(0).toUpperCase() + pos.substring(1);
+        
+        config.label = Ext.apply(config['axisLabel' + pos + 'Style'] || {}, config.label || {});
+        config.axisTitleStyle = Ext.apply(config['axisTitle' + pos + 'Style'] || {}, config.labelTitle || {});
+        Ext.apply(me, config);
+        me.fields = [].concat(me.fields);
+        this.callParent();
+        me.labels = [];
+        me.getId();
+        me.labelGroup = me.chart.surface.getGroup(me.axisId + "-labels");
+    },
+
+    alignment: null,
+    grid: false,
+    steps: 10,
+    x: 0,
+    y: 0,
+    minValue: 0,
+    maxValue: 0,
+
+    getId: function() {
+        return this.axisId || (this.axisId = Ext.id(null, 'ext-axis-'));
+    },
+
+    
+    processView: Ext.emptyFn,
+
+    drawAxis: Ext.emptyFn,
+    addDisplayAndLabels: Ext.emptyFn
+});
+
+
+Ext.define('Ext.chart.axis.Axis', {
+
+    
+
+    extend: 'Ext.chart.axis.Abstract',
+
+    alternateClassName: 'Ext.chart.Axis',
+
+    requires: ['Ext.draw.Draw'],
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    //@private force min/max values from store
+
+    forceMinMax: false,
+
+    
+    dashSize: 3,
+
+    
+    position: 'bottom',
+
+    
+    skipFirst: false,
+
+    
+    length: 0,
+
+    
+    width: 0,
+
+    majorTickSteps: false,
+
+    
+    applyData: Ext.emptyFn,
+
+    getRange: function () {
+        var me = this,
+            store = me.chart.getChartStore(),
+            fields = me.fields,
+            ln = fields.length,
+            math = Math,
+            mmax = math.max,
+            mmin = math.min,
+            aggregate = false,
+            min = isNaN(me.minimum) ? Infinity : me.minimum,
+            max = isNaN(me.maximum) ? -Infinity : me.maximum,
+            total = 0, i, l, value, values, rec,
+            excludes = [],
+            series = me.chart.series.items;
+
+        
+        
+        
+        
+        
+        
+        
+        
+        for (i = 0, l = series.length; !aggregate && i < l; i++) {
+            aggregate = aggregate || series[i].stacked;
+            excludes = series[i].__excludes || excludes;
+        }
+        store.each(function(record) {
+            if (aggregate) {
+                if (!isFinite(min)) {
+                    min = 0;
+                }
+                for (values = [0, 0], i = 0; i < ln; i++) {
+                    if (excludes[i]) {
+                        continue;
+                    }
+                    rec = record.get(fields[i]);
+                    values[+(rec > 0)] += math.abs(rec);
+                }
+                max = mmax(max, -values[0], +values[1]);
+                min = mmin(min, -values[0], +values[1]);
+            }
+            else {
+                for (i = 0; i < ln; i++) {
+                    if (excludes[i]) {
+                        continue;
+                    }
+                    value = record.get(fields[i]);
+                    max = mmax(max, +value);
+                    min = mmin(min, +value);
+                }
+            }
+        });
+        if (!isFinite(max)) {
+            max = me.prevMax || 0;
+        }
+        if (!isFinite(min)) {
+            min = me.prevMin || 0;
+        }
+        
+        if (min != max && (max != Math.floor(max))) {
+            max = Math.floor(max) + 1;
+        }
+
+        if (!isNaN(me.minimum)) {
+            min = me.minimum;
+        }
+        
+        if (!isNaN(me.maximum)) {
+            max = me.maximum;
+        }
+
+        return {min: min, max: max};
+    },
+
+    
+    calcEnds: function() {
+        var me = this,
+            fields = me.fields,
+            range = me.getRange(),
+            min = range.min,
+            max = range.max,
+            outfrom, outto, out;
+
+        out = Ext.draw.Draw.snapEnds(min, max, me.majorTickSteps !== false ?  (me.majorTickSteps +1) : me.steps);
+        outfrom = out.from;
+        outto = out.to;
+        if (me.forceMinMax) {
+            if (!isNaN(max)) {
+                out.to = max;
+            }
+            if (!isNaN(min)) {
+                out.from = min;
+            }
+        }
+        if (!isNaN(me.maximum)) {
+            
+            
+            out.to = me.maximum;
+        }
+        if (!isNaN(me.minimum)) {
+            
+            
+            out.from = me.minimum;
+        }
+
+        
+        out.step = (out.to - out.from) / (outto - outfrom) * out.step;
+
+        if (me.adjustMaximumByMajorUnit) {
+            out.to += out.step;
+        }
+        if (me.adjustMinimumByMajorUnit) {
+            out.from -= out.step;
+        }
+        me.prevMin = min == max? 0 : min;
+        me.prevMax = max;
+        return out;
+    },
+
+    
+    drawAxis: function (init) {
+        var me = this,
+            i, j,
+            x = me.x,
+            y = me.y,
+            gutterX = me.chart.maxGutter[0],
+            gutterY = me.chart.maxGutter[1],
+            dashSize = me.dashSize,
+            subDashesX = me.minorTickSteps || 0,
+            subDashesY = me.minorTickSteps || 0,
+            length = me.length,
+            position = me.position,
+            inflections = [],
+            calcLabels = false,
+            stepCalcs = me.applyData(),
+            step = stepCalcs.step,
+            steps = stepCalcs.steps,
+            from = stepCalcs.from,
+            to = stepCalcs.to,
+            trueLength,
+            currentX,
+            currentY,
+            path,
+            prev,
+            dashesX,
+            dashesY,
+            delta;
+
+        
+        
+        
+        if (me.hidden || isNaN(step) || (from == to)) {
+            return;
+        }
+
+        me.from = stepCalcs.from;
+        me.to = stepCalcs.to;
+        if (position == 'left' || position == 'right') {
+            currentX = Math.floor(x) + 0.5;
+            path = ["M", currentX, y, "l", 0, -length];
+            trueLength = length - (gutterY * 2);
+        }
+        else {
+            currentY = Math.floor(y) + 0.5;
+            path = ["M", x, currentY, "l", length, 0];
+            trueLength = length - (gutterX * 2);
+        }
+
+        delta = trueLength / (steps || 1);
+        dashesX = Math.max(subDashesX +1, 0);
+        dashesY = Math.max(subDashesY +1, 0);
+        if (me.type == 'Numeric' || me.type == 'Time') {
+            calcLabels = true;
+            me.labels = [stepCalcs.from];
+        }
+        if (position == 'right' || position == 'left') {
+            currentY = y - gutterY;
+            currentX = x - ((position == 'left') * dashSize * 2);
+            while (currentY >= y - gutterY - trueLength) {
+                path.push("M", currentX, Math.floor(currentY) + 0.5, "l", dashSize * 2 + 1, 0);
+                if (currentY != y - gutterY) {
+                    for (i = 1; i < dashesY; i++) {
+                        path.push("M", currentX + dashSize, Math.floor(currentY + delta * i / dashesY) + 0.5, "l", dashSize + 1, 0);
+                    }
+                }
+                inflections.push([ Math.floor(x), Math.floor(currentY) ]);
+                currentY -= delta;
+                if (calcLabels) {
+                    me.labels.push(me.labels[me.labels.length -1] + step);
+                }
+                if (delta === 0) {
+                    break;
+                }
+            }
+            if (Math.round(currentY + delta - (y - gutterY - trueLength))) {
+                path.push("M", currentX, Math.floor(y - length + gutterY) + 0.5, "l", dashSize * 2 + 1, 0);
+                for (i = 1; i < dashesY; i++) {
+                    path.push("M", currentX + dashSize, Math.floor(y - length + gutterY + delta * i / dashesY) + 0.5, "l", dashSize + 1, 0);
+                }
+                inflections.push([ Math.floor(x), Math.floor(currentY) ]);
+                if (calcLabels) {
+                    me.labels.push(me.labels[me.labels.length -1] + step);
+                }
+            }
+        } else {
+            currentX = x + gutterX;
+            currentY = y - ((position == 'top') * dashSize * 2);
+            while (currentX <= x + gutterX + trueLength) {
+                path.push("M", Math.floor(currentX) + 0.5, currentY, "l", 0, dashSize * 2 + 1);
+                if (currentX != x + gutterX) {
+                    for (i = 1; i < dashesX; i++) {
+                        path.push("M", Math.floor(currentX - delta * i / dashesX) + 0.5, currentY, "l", 0, dashSize + 1);
+                    }
+                }
+                inflections.push([ Math.floor(currentX), Math.floor(y) ]);
+                currentX += delta;
+                if (calcLabels) {
+                    me.labels.push(me.labels[me.labels.length -1] + step);
+                }
+                if (delta === 0) {
+                    break;
+                }
+            }
+            if (Math.round(currentX - delta - (x + gutterX + trueLength))) {
+                path.push("M", Math.floor(x + length - gutterX) + 0.5, currentY, "l", 0, dashSize * 2 + 1);
+                for (i = 1; i < dashesX; i++) {
+                    path.push("M", Math.floor(x + length - gutterX - delta * i / dashesX) + 0.5, currentY, "l", 0, dashSize + 1);
+                }
+                inflections.push([ Math.floor(currentX), Math.floor(y) ]);
+                if (calcLabels) {
+                    me.labels.push(me.labels[me.labels.length -1] + step);
+                }
+            }
+        }
+        if (!me.axis) {
+            me.axis = me.chart.surface.add(Ext.apply({
+                type: 'path',
+                path: path
+            }, me.axisStyle));
+        }
+        me.axis.setAttributes({
+            path: path
+        }, true);
+        me.inflections = inflections;
+        if (!init && me.grid) {
+            me.drawGrid();
+        }
+        me.axisBBox = me.axis.getBBox();
+        me.drawLabel();
+    },
+
+    
+    drawGrid: function() {
+        var me = this,
+            surface = me.chart.surface,
+            grid = me.grid,
+            odd = grid.odd,
+            even = grid.even,
+            inflections = me.inflections,
+            ln = inflections.length - ((odd || even)? 0 : 1),
+            position = me.position,
+            gutter = me.chart.maxGutter,
+            width = me.width - 2,
+            vert = false,
+            point, prevPoint,
+            i = 1,
+            path = [], styles, lineWidth, dlineWidth,
+            oddPath = [], evenPath = [];
+
+        if ((gutter[1] !== 0 && (position == 'left' || position == 'right')) ||
+            (gutter[0] !== 0 && (position == 'top' || position == 'bottom'))) {
+            i = 0;
+            ln++;
+        }
+        for (; i < ln; i++) {
+            point = inflections[i];
+            prevPoint = inflections[i - 1];
+            if (odd || even) {
+                path = (i % 2)? oddPath : evenPath;
+                styles = ((i % 2)? odd : even) || {};
+                lineWidth = (styles.lineWidth || styles['stroke-width'] || 0) / 2;
+                dlineWidth = 2 * lineWidth;
+                if (position == 'left') {
+                    path.push("M", prevPoint[0] + 1 + lineWidth, prevPoint[1] + 0.5 - lineWidth,
+                              "L", prevPoint[0] + 1 + width - lineWidth, prevPoint[1] + 0.5 - lineWidth,
+                              "L", point[0] + 1 + width - lineWidth, point[1] + 0.5 + lineWidth,
+                              "L", point[0] + 1 + lineWidth, point[1] + 0.5 + lineWidth, "Z");
+                }
+                else if (position == 'right') {
+                    path.push("M", prevPoint[0] - lineWidth, prevPoint[1] + 0.5 - lineWidth,
+                              "L", prevPoint[0] - width + lineWidth, prevPoint[1] + 0.5 - lineWidth,
+                              "L", point[0] - width + lineWidth, point[1] + 0.5 + lineWidth,
+                              "L", point[0] - lineWidth, point[1] + 0.5 + lineWidth, "Z");
+                }
+                else if (position == 'top') {
+                    path.push("M", prevPoint[0] + 0.5 + lineWidth, prevPoint[1] + 1 + lineWidth,
+                              "L", prevPoint[0] + 0.5 + lineWidth, prevPoint[1] + 1 + width - lineWidth,
+                              "L", point[0] + 0.5 - lineWidth, point[1] + 1 + width - lineWidth,
+                              "L", point[0] + 0.5 - lineWidth, point[1] + 1 + lineWidth, "Z");
+                }
+                else {
+                    path.push("M", prevPoint[0] + 0.5 + lineWidth, prevPoint[1] - lineWidth,
+                            "L", prevPoint[0] + 0.5 + lineWidth, prevPoint[1] - width + lineWidth,
+                            "L", point[0] + 0.5 - lineWidth, point[1] - width + lineWidth,
+                            "L", point[0] + 0.5 - lineWidth, point[1] - lineWidth, "Z");
+                }
+            } else {
+                if (position == 'left') {
+                    path = path.concat(["M", point[0] + 0.5, point[1] + 0.5, "l", width, 0]);
+                }
+                else if (position == 'right') {
+                    path = path.concat(["M", point[0] - 0.5, point[1] + 0.5, "l", -width, 0]);
+                }
+                else if (position == 'top') {
+                    path = path.concat(["M", point[0] + 0.5, point[1] + 0.5, "l", 0, width]);
+                }
+                else {
+                    path = path.concat(["M", point[0] + 0.5, point[1] - 0.5, "l", 0, -width]);
+                }
+            }
+        }
+        if (odd || even) {
+            if (oddPath.length) {
+                if (!me.gridOdd && oddPath.length) {
+                    me.gridOdd = surface.add({
+                        type: 'path',
+                        path: oddPath
+                    });
+                }
+                me.gridOdd.setAttributes(Ext.apply({
+                    path: oddPath,
+                    hidden: false
+                }, odd || {}), true);
+            }
+            if (evenPath.length) {
+                if (!me.gridEven) {
+                    me.gridEven = surface.add({
+                        type: 'path',
+                        path: evenPath
+                    });
+                }
+                me.gridEven.setAttributes(Ext.apply({
+                    path: evenPath,
+                    hidden: false
+                }, even || {}), true);
+            }
+        }
+        else {
+            if (path.length) {
+                if (!me.gridLines) {
+                    me.gridLines = me.chart.surface.add({
+                        type: 'path',
+                        path: path,
+                        "stroke-width": me.lineWidth || 1,
+                        stroke: me.gridColor || '#ccc'
+                    });
+                }
+                me.gridLines.setAttributes({
+                    hidden: false,
+                    path: path
+                }, true);
+            }
+            else if (me.gridLines) {
+                me.gridLines.hide(true);
+            }
+        }
+    },
+
+    //@private
+
+    getOrCreateLabel: function(i, text) {
+        var me = this,
+            labelGroup = me.labelGroup,
+            textLabel = labelGroup.getAt(i),
+            surface = me.chart.surface;
+        if (textLabel) {
+            if (text != textLabel.attr.text) {
+                textLabel.setAttributes(Ext.apply({
+                    text: text
+                }, me.label), true);
+                textLabel._bbox = textLabel.getBBox();
+            }
+        }
+        else {
+            textLabel = surface.add(Ext.apply({
+                group: labelGroup,
+                type: 'text',
+                x: 0,
+                y: 0,
+                text: text
+            }, me.label));
+            surface.renderItem(textLabel);
+            textLabel._bbox = textLabel.getBBox();
+        }
+        
+        if (me.label.rotation) {
+            textLabel.setAttributes({
+                rotation: {
+                    degrees: 0
+                }
+            }, true);
+            textLabel._ubbox = textLabel.getBBox();
+            textLabel.setAttributes(me.label, true);
+        } else {
+            textLabel._ubbox = textLabel._bbox;
+        }
+        return textLabel;
+    },
+
+    rect2pointArray: function(sprite) {
+        var surface = this.chart.surface,
+            rect = surface.getBBox(sprite, true),
+            p1 = [rect.x, rect.y],
+            p1p = p1.slice(),
+            p2 = [rect.x + rect.width, rect.y],
+            p2p = p2.slice(),
+            p3 = [rect.x + rect.width, rect.y + rect.height],
+            p3p = p3.slice(),
+            p4 = [rect.x, rect.y + rect.height],
+            p4p = p4.slice(),
+            matrix = sprite.matrix;
+        
+        p1[0] = matrix.x.apply(matrix, p1p);
+        p1[1] = matrix.y.apply(matrix, p1p);
+
+        p2[0] = matrix.x.apply(matrix, p2p);
+        p2[1] = matrix.y.apply(matrix, p2p);
+
+        p3[0] = matrix.x.apply(matrix, p3p);
+        p3[1] = matrix.y.apply(matrix, p3p);
+
+        p4[0] = matrix.x.apply(matrix, p4p);
+        p4[1] = matrix.y.apply(matrix, p4p);
+        return [p1, p2, p3, p4];
+    },
+
+    intersect: function(l1, l2) {
+        var r1 = this.rect2pointArray(l1),
+            r2 = this.rect2pointArray(l2);
+        return !!Ext.draw.Draw.intersect(r1, r2).length;
+    },
+
+    drawHorizontalLabels: function() {
+       var  me = this,
+            labelConf = me.label,
+            floor = Math.floor,
+            max = Math.max,
+            axes = me.chart.axes,
+            position = me.position,
+            inflections = me.inflections,
+            ln = inflections.length,
+            labels = me.labels,
+            labelGroup = me.labelGroup,
+            maxHeight = 0,
+            ratio,
+            gutterY = me.chart.maxGutter[1],
+            ubbox, bbox, point, prevX, prevLabel,
+            projectedWidth = 0,
+            textLabel, attr, textRight, text,
+            label, last, x, y, i, firstLabel;
+
+        last = ln - 1;
+        
+        point = inflections[0];
+        firstLabel = me.getOrCreateLabel(0, me.label.renderer(labels[0]));
+        ratio = Math.floor(Math.abs(Math.sin(labelConf.rotate && (labelConf.rotate.degrees * Math.PI / 180) || 0)));
+
+        for (i = 0; i < ln; i++) {
+            point = inflections[i];
+            text = me.label.renderer(labels[i]);
+            textLabel = me.getOrCreateLabel(i, text);
+            bbox = textLabel._bbox;
+            maxHeight = max(maxHeight, bbox.height + me.dashSize + me.label.padding);
+            x = floor(point[0] - (ratio? bbox.height : bbox.width) / 2);
+            if (me.chart.maxGutter[0] == 0) {
+                if (i == 0 && axes.findIndex('position', 'left') == -1) {
+                    x = point[0];
+                }
+                else if (i == last && axes.findIndex('position', 'right') == -1) {
+                    x = point[0] - bbox.width;
+                }
+            }
+            if (position == 'top') {
+                y = point[1] - (me.dashSize * 2) - me.label.padding - (bbox.height / 2);
+            }
+            else {
+                y = point[1] + (me.dashSize * 2) + me.label.padding + (bbox.height / 2);
+            }
+
+            textLabel.setAttributes({
+                hidden: false,
+                x: x,
+                y: y
+            }, true);
+
+            
+            if (i != 0 && (me.intersect(textLabel, prevLabel)
+                || me.intersect(textLabel, firstLabel))) {
+                textLabel.hide(true);
+                continue;
+            }
+
+            prevLabel = textLabel;
+        }
+
+        return maxHeight;
+    },
+
+    drawVerticalLabels: function() {
+        var me = this,
+            inflections = me.inflections,
+            position = me.position,
+            ln = inflections.length,
+            labels = me.labels,
+            maxWidth = 0,
+            max = Math.max,
+            floor = Math.floor,
+            ceil = Math.ceil,
+            axes = me.chart.axes,
+            gutterY = me.chart.maxGutter[1],
+            ubbox, bbox, point, prevLabel,
+            projectedWidth = 0,
+            textLabel, attr, textRight, text,
+            label, last, x, y, i;
+
+        last = ln;
+        for (i = 0; i < last; i++) {
+            point = inflections[i];
+            text = me.label.renderer(labels[i]);
+            textLabel = me.getOrCreateLabel(i, text);
+            bbox = textLabel._bbox;
+
+            maxWidth = max(maxWidth, bbox.width + me.dashSize + me.label.padding);
+            y = point[1];
+            if (gutterY < bbox.height / 2) {
+                if (i == last - 1 && axes.findIndex('position', 'top') == -1) {
+                    y = me.y - me.length + ceil(bbox.height / 2);
+                }
+                else if (i == 0 && axes.findIndex('position', 'bottom') == -1) {
+                    y = me.y - floor(bbox.height / 2);
+                }
+            }
+            if (position == 'left') {
+                x = point[0] - bbox.width - me.dashSize - me.label.padding - 2;
+            }
+            else {
+                x = point[0] + me.dashSize + me.label.padding + 2;
+            }
+            textLabel.setAttributes(Ext.apply({
+                hidden: false,
+                x: x,
+                y: y
+            }, me.label), true);
+            
+            if (i != 0 && me.intersect(textLabel, prevLabel)) {
+                textLabel.hide(true);
+                continue;
+            }
+            prevLabel = textLabel;
+        }
+
+        return maxWidth;
+    },
+
+    
+    drawLabel: function() {
+        var me = this,
+            position = me.position,
+            labelGroup = me.labelGroup,
+            inflections = me.inflections,
+            maxWidth = 0,
+            maxHeight = 0,
+            ln, i;
+
+        if (position == 'left' || position == 'right') {
+            maxWidth = me.drawVerticalLabels();
+        } else {
+            maxHeight = me.drawHorizontalLabels();
+        }
+
+        
+        ln = labelGroup.getCount();
+        i = inflections.length;
+        for (; i < ln; i++) {
+            labelGroup.getAt(i).hide(true);
+        }
+
+        me.bbox = {};
+        Ext.apply(me.bbox, me.axisBBox);
+        me.bbox.height = maxHeight;
+        me.bbox.width = maxWidth;
+        if (Ext.isString(me.title)) {
+            me.drawTitle(maxWidth, maxHeight);
+        }
+    },
+
+    
+    elipsis: function(sprite, text, desiredWidth, minWidth, center) {
+        var bbox,
+            x;
+
+        if (desiredWidth < minWidth) {
+            sprite.hide(true);
+            return false;
+        }
+        while (text.length > 4) {
+            text = text.substr(0, text.length - 4) + "...";
+            sprite.setAttributes({
+                text: text
+            }, true);
+            bbox = sprite.getBBox();
+            if (bbox.width < desiredWidth) {
+                if (typeof center == 'number') {
+                    sprite.setAttributes({
+                        x: Math.floor(center - (bbox.width / 2))
+                    }, true);
+                }
+                break;
+            }
+        }
+        return true;
+    },
+
+    
+    setTitle: function(title) {
+        this.title = title;
+        this.drawLabel();
+    },
+
+    
+    drawTitle: function(maxWidth, maxHeight) {
+        var me = this,
+            position = me.position,
+            surface = me.chart.surface,
+            displaySprite = me.displaySprite,
+            title = me.title,
+            rotate = (position == 'left' || position == 'right'),
+            x = me.x,
+            y = me.y,
+            base, bbox, pad;
+
+        if (displaySprite) {
+            displaySprite.setAttributes({text: title}, true);
+        } else {
+            base = {
+                type: 'text',
+                x: 0,
+                y: 0,
+                text: title
+            };
+            displaySprite = me.displaySprite = surface.add(Ext.apply(base, me.axisTitleStyle, me.labelTitle));
+            surface.renderItem(displaySprite);
+        }
+        bbox = displaySprite.getBBox();
+        pad = me.dashSize + me.label.padding;
+
+        if (rotate) {
+            y -= ((me.length / 2) - (bbox.height / 2));
+            if (position == 'left') {
+                x -= (maxWidth + pad + (bbox.width / 2));
+            }
+            else {
+                x += (maxWidth + pad + bbox.width - (bbox.width / 2));
+            }
+            me.bbox.width += bbox.width + 10;
+        }
+        else {
+            x += (me.length / 2) - (bbox.width * 0.5);
+            if (position == 'top') {
+                y -= (maxHeight + pad + (bbox.height * 0.3));
+            }
+            else {
+                y += (maxHeight + pad + (bbox.height * 0.8));
+            }
+            me.bbox.height += bbox.height + 10;
+        }
+        displaySprite.setAttributes({
+            translate: {
+                x: x,
+                y: y
+            }
+        }, true);
+    }
+});
+
+
+Ext.define('Ext.chart.axis.Category', {
+
+    
+
+    extend: 'Ext.chart.axis.Axis',
+
+    alternateClassName: 'Ext.chart.CategoryAxis',
+
+    alias: 'axis.category',
+
+    
+
+    
+    categoryNames: null,
+
+    
+    calculateCategoryCount: false,
+
+    
+    setLabels: function() {
+        var store = this.chart.store,
+            fields = this.fields,
+            ln = fields.length,
+            i;
+
+        this.labels = [];
+        store.each(function(record) {
+            for (i = 0; i < ln; i++) {
+                this.labels.push(record.get(fields[i]));
+            }
+        }, this);
+    },
+
+    
+    applyData: function() {
+        this.callParent();
+        this.setLabels();
+        var count = this.chart.store.getCount();
+        return {
+            from: 0,
+            to: count,
+            power: 1,
+            step: 1,
+            steps: count - 1
+        };
+    }
+});
+
+
+Ext.define('Ext.chart.axis.Gauge', {
+
+    
+
+    extend: 'Ext.chart.axis.Abstract',
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    position: 'gauge',
+
+    alias: 'axis.gauge',
+
+    drawAxis: function(init) {
+        var chart = this.chart,
+            surface = chart.surface,
+            bbox = chart.chartBBox,
+            centerX = bbox.x + (bbox.width / 2),
+            centerY = bbox.y + bbox.height,
+            margin = this.margin || 10,
+            rho = Math.min(bbox.width, 2 * bbox.height) /2 + margin,
+            sprites = [], sprite,
+            steps = this.steps,
+            i, pi = Math.PI,
+            cos = Math.cos,
+            sin = Math.sin;
+
+        if (this.sprites && !chart.resizing) {
+            this.drawLabel();
+            return;
+        }
+
+        if (this.margin >= 0) {
+            if (!this.sprites) {
+                
+                for (i = 0; i <= steps; i++) {
+                    sprite = surface.add({
+                        type: 'path',
+                        path: ['M', centerX + (rho - margin) * cos(i / steps * pi - pi),
+                                    centerY + (rho - margin) * sin(i / steps * pi - pi),
+                                    'L', centerX + rho * cos(i / steps * pi - pi),
+                                    centerY + rho * sin(i / steps * pi - pi), 'Z'],
+                        stroke: '#ccc'
+                    });
+                    sprite.setAttributes({
+                        hidden: false
+                    }, true);
+                    sprites.push(sprite);
+                }
+            } else {
+                sprites = this.sprites;
+                
+                for (i = 0; i <= steps; i++) {
+                    sprites[i].setAttributes({
+                        path: ['M', centerX + (rho - margin) * cos(i / steps * pi - pi),
+                                    centerY + (rho - margin) * sin(i / steps * pi - pi),
+                               'L', centerX + rho * cos(i / steps * pi - pi),
+                                    centerY + rho * sin(i / steps * pi - pi), 'Z'],
+                        stroke: '#ccc'
+                    }, true);
+                }
+            }
+        }
+        this.sprites = sprites;
+        this.drawLabel();
+        if (this.title) {
+            this.drawTitle();
+        }
+    },
+
+    drawTitle: function() {
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            bbox = chart.chartBBox,
+            labelSprite = me.titleSprite,
+            labelBBox;
+
+        if (!labelSprite) {
+            me.titleSprite = labelSprite = surface.add({
+                type: 'text',
+                zIndex: 2
+            });
+        }
+        labelSprite.setAttributes(Ext.apply({
+            text: me.title
+        }, me.label || {}), true);
+        labelBBox = labelSprite.getBBox();
+        labelSprite.setAttributes({
+            x: bbox.x + (bbox.width / 2) - (labelBBox.width / 2),
+            y: bbox.y + bbox.height - (labelBBox.height / 2) - 4
+        }, true);
+    },
+
+    
+    setTitle: function(title) {
+        this.title = title;
+        this.drawTitle();
+    },
+
+    drawLabel: function() {
+        var chart = this.chart,
+            surface = chart.surface,
+            bbox = chart.chartBBox,
+            centerX = bbox.x + (bbox.width / 2),
+            centerY = bbox.y + bbox.height,
+            margin = this.margin || 10,
+            rho = Math.min(bbox.width, 2 * bbox.height) /2 + 2 * margin,
+            round = Math.round,
+            labelArray = [], label,
+            maxValue = this.maximum || 0,
+            steps = this.steps, i = 0,
+            adjY,
+            pi = Math.PI,
+            cos = Math.cos,
+            sin = Math.sin,
+            labelConf = this.label,
+            renderer = labelConf.renderer || function(v) { return v; };
+
+        if (!this.labelArray) {
+            
+            for (i = 0; i <= steps; i++) {
+                
+                adjY = (i === 0 || i === steps) ? 7 : 0;
+                label = surface.add({
+                    type: 'text',
+                    text: renderer(round(i / steps * maxValue)),
+                    x: centerX + rho * cos(i / steps * pi - pi),
+                    y: centerY + rho * sin(i / steps * pi - pi) - adjY,
+                    'text-anchor': 'middle',
+                    'stroke-width': 0.2,
+                    zIndex: 10,
+                    stroke: '#333'
+                });
+                label.setAttributes({
+                    hidden: false
+                }, true);
+                labelArray.push(label);
+            }
+        }
+        else {
+            labelArray = this.labelArray;
+            
+            for (i = 0; i <= steps; i++) {
+                
+                adjY = (i === 0 || i === steps) ? 7 : 0;
+                labelArray[i].setAttributes({
+                    text: renderer(round(i / steps * maxValue)),
+                    x: centerX + rho * cos(i / steps * pi - pi),
+                    y: centerY + rho * sin(i / steps * pi - pi) - adjY
+                }, true);
+            }
+        }
+        this.labelArray = labelArray;
+    }
+});
+
+Ext.define('Ext.chart.axis.Numeric', {
+
+    
+
+    extend: 'Ext.chart.axis.Axis',
+
+    alternateClassName: 'Ext.chart.NumericAxis',
+
+    
+
+    type: 'numeric',
+
+    alias: 'axis.numeric',
+
+    constructor: function(config) {
+        var me = this,
+            hasLabel = !!(config.label && config.label.renderer),
+            label;
+
+        me.callParent([config]);
+        label = me.label;
+        if (me.roundToDecimal === false) {
+            return;
+        }
+        if (!hasLabel) {
+            label.renderer = function(v) {
+                return me.roundToDecimal(v, me.decimals);
+            };
+        }
+    },
+
+    roundToDecimal: function(v, dec) {
+        var val = Math.pow(10, dec || 0);
+        return Math.floor(v * val) / val;
+    },
+
+    
+    minimum: NaN,
+
+    
+    maximum: NaN,
+
+    
+    decimals: 2,
+
+    
+    scale: "linear",
+
+    
+    position: 'left',
+
+    
+    adjustMaximumByMajorUnit: false,
+
+    
+    adjustMinimumByMajorUnit: false,
+
+    
+    applyData: function() {
+        this.callParent();
+        return this.calcEnds();
+    }
+});
+
+
+Ext.define('Ext.chart.axis.Radial', {
+
+    
+
+    extend: 'Ext.chart.axis.Abstract',
+
+    
+
+    position: 'radial',
+
+    alias: 'axis.radial',
+
+    drawAxis: function(init) {
+        var chart = this.chart,
+            surface = chart.surface,
+            bbox = chart.chartBBox,
+            store = chart.store,
+            l = store.getCount(),
+            centerX = bbox.x + (bbox.width / 2),
+            centerY = bbox.y + (bbox.height / 2),
+            rho = Math.min(bbox.width, bbox.height) /2,
+            sprites = [], sprite,
+            steps = this.steps,
+            i, j, pi2 = Math.PI * 2,
+            cos = Math.cos, sin = Math.sin;
+
+        if (this.sprites && !chart.resizing) {
+            this.drawLabel();
+            return;
+        }
+
+        if (!this.sprites) {
+            
+            for (i = 1; i <= steps; i++) {
+                sprite = surface.add({
+                    type: 'circle',
+                    x: centerX,
+                    y: centerY,
+                    radius: Math.max(rho * i / steps, 0),
+                    stroke: '#ccc'
+                });
+                sprite.setAttributes({
+                    hidden: false
+                }, true);
+                sprites.push(sprite);
+            }
+            
+            store.each(function(rec, i) {
+                sprite = surface.add({
+                    type: 'path',
+                    path: ['M', centerX, centerY, 'L', centerX + rho * cos(i / l * pi2), centerY + rho * sin(i / l * pi2), 'Z'],
+                    stroke: '#ccc'
+                });
+                sprite.setAttributes({
+                    hidden: false
+                }, true);
+                sprites.push(sprite);
+            });
+        } else {
+            sprites = this.sprites;
+            
+            for (i = 0; i < steps; i++) {
+                sprites[i].setAttributes({
+                    x: centerX,
+                    y: centerY,
+                    radius: Math.max(rho * (i + 1) / steps, 0),
+                    stroke: '#ccc'
+                }, true);
+            }
+            
+            store.each(function(rec, j) {
+                sprites[i + j].setAttributes({
+                    path: ['M', centerX, centerY, 'L', centerX + rho * cos(j / l * pi2), centerY + rho * sin(j / l * pi2), 'Z'],
+                    stroke: '#ccc'
+                }, true);
+            });
+        }
+        this.sprites = sprites;
+
+        this.drawLabel();
+    },
+
+    drawLabel: function() {
+        var chart = this.chart,
+            surface = chart.surface,
+            bbox = chart.chartBBox,
+            store = chart.store,
+            centerX = bbox.x + (bbox.width / 2),
+            centerY = bbox.y + (bbox.height / 2),
+            rho = Math.min(bbox.width, bbox.height) /2,
+            max = Math.max, round = Math.round,
+            labelArray = [], label,
+            fields = [], nfields,
+            categories = [], xField,
+            aggregate = !this.maximum,
+            maxValue = this.maximum || 0,
+            steps = this.steps, i = 0, j, dx, dy,
+            pi2 = Math.PI * 2,
+            cos = Math.cos, sin = Math.sin,
+            display = this.label.display,
+            draw = display !== 'none',
+            margin = 10;
+
+        if (!draw) {
+            return;
+        }
+
+        
+        chart.series.each(function(series) {
+            fields.push(series.yField);
+            xField = series.xField;
+        });
+        
+        
+        store.each(function(record, i) {
+            if (aggregate) {
+                for (i = 0, nfields = fields.length; i < nfields; i++) {
+                    maxValue = max(+record.get(fields[i]), maxValue);
+                }
+            }
+            categories.push(record.get(xField));
+        });
+        if (!this.labelArray) {
+            if (display != 'categories') {
+                
+                for (i = 1; i <= steps; i++) {
+                    label = surface.add({
+                        type: 'text',
+                        text: round(i / steps * maxValue),
+                        x: centerX,
+                        y: centerY - rho * i / steps,
+                        'text-anchor': 'middle',
+                        'stroke-width': 0.1,
+                        stroke: '#333'
+                    });
+                    label.setAttributes({
+                        hidden: false
+                    }, true);
+                    labelArray.push(label);
+                }
+            }
+            if (display != 'scale') {
+                
+                for (j = 0, steps = categories.length; j < steps; j++) {
+                    dx = cos(j / steps * pi2) * (rho + margin);
+                    dy = sin(j / steps * pi2) * (rho + margin);
+                    label = surface.add({
+                        type: 'text',
+                        text: categories[j],
+                        x: centerX + dx,
+                        y: centerY + dy,
+                        'text-anchor': dx * dx <= 0.001? 'middle' : (dx < 0? 'end' : 'start')
+                    });
+                    label.setAttributes({
+                        hidden: false
+                    }, true);
+                    labelArray.push(label);
+                }
+            }
+        }
+        else {
+            labelArray = this.labelArray;
+            if (display != 'categories') {
+                
+                for (i = 0; i < steps; i++) {
+                    labelArray[i].setAttributes({
+                        text: round((i + 1) / steps * maxValue),
+                        x: centerX,
+                        y: centerY - rho * (i + 1) / steps,
+                        'text-anchor': 'middle',
+                        'stroke-width': 0.1,
+                        stroke: '#333'
+                    }, true);
+                }
+            }
+            if (display != 'scale') {
+                
+                for (j = 0, steps = categories.length; j < steps; j++) {
+                    dx = cos(j / steps * pi2) * (rho + margin);
+                    dy = sin(j / steps * pi2) * (rho + margin);
+                    if (labelArray[i + j]) {
+                        labelArray[i + j].setAttributes({
+                            type: 'text',
+                            text: categories[j],
+                            x: centerX + dx,
+                            y: centerY + dy,
+                            'text-anchor': dx * dx <= 0.001? 'middle' : (dx < 0? 'end' : 'start')
+                        }, true);
+                    }
+                }
+            }
+        }
+        this.labelArray = labelArray;
+    }
+});
+
+Ext.define('Ext.data.AbstractStore', {
+    requires: ['Ext.util.MixedCollection', 'Ext.data.Operation', 'Ext.util.Filter'],
+    
+    mixins: {
+        observable: 'Ext.util.Observable',
+        sortable: 'Ext.util.Sortable'
+    },
+    
+    statics: {
+        create: function(store){
+            if (!store.isStore) {
+                if (!store.type) {
+                    store.type = 'store';
+                }
+                store = Ext.createByAlias('store.' + store.type, store);
+            }
+            return store;
+        }    
+    },
+    
+    remoteSort  : false,
+    remoteFilter: false,
+
+    
+
+    
+    autoLoad: false,
+
+    
+    autoSync: false,
+
+    
+    batchUpdateMode: 'operation',
+
+    
+    filterOnLoad: true,
+
+    
+    sortOnLoad: true,
+
+    
+    implicitModel: false,
+
+    
+    defaultProxyType: 'memory',
+
+    
+    isDestroyed: false,
+
+    isStore: true,
+
+    
+    
+    
+
+    
+
+    sortRoot: 'data',
+    
+    
+    constructor: function(config) {
+        var me = this,
+            filters;
+        
+        me.addEvents(
+            
+            'add',
+
+            
+            'remove',
+            
+            
+            'update',
+
+            
+            'datachanged',
+
+            
+            'beforeload',
+
+            
+            'load',
+            
+            
+            'write',
+
+            
+            'beforesync',
+            
+            'clear'
+        );
+        
+        Ext.apply(me, config);
+        
+
+        
+        me.removed = [];
+
+        me.mixins.observable.constructor.apply(me, arguments);
+        me.model = Ext.ModelManager.getModel(me.model);
+
+        
+        Ext.applyIf(me, {
+            modelDefaults: {}
+        });
+
+        
+        if (!me.model && me.fields) {
+            me.model = Ext.define('Ext.data.Store.ImplicitModel-' + (me.storeId || Ext.id()), {
+                extend: 'Ext.data.Model',
+                fields: me.fields,
+                proxy: me.proxy || me.defaultProxyType
+            });
+
+            delete me.fields;
+
+            me.implicitModel = true;
+        }
+        
+
+        
+        me.setProxy(me.proxy || me.model.getProxy());
+
+        if (me.id && !me.storeId) {
+            me.storeId = me.id;
+            delete me.id;
+        }
+
+        if (me.storeId) {
+            Ext.data.StoreManager.register(me);
+        }
+        
+        me.mixins.sortable.initSortable.call(me);        
+        
+        
+        filters = me.decodeFilters(me.filters);
+        me.filters = Ext.create('Ext.util.MixedCollection');
+        me.filters.addAll(filters);
+    },
+
+    
+    setProxy: function(proxy) {
+        var me = this;
+        
+        if (proxy instanceof Ext.data.proxy.Proxy) {
+            proxy.setModel(me.model);
+        } else {
+            if (Ext.isString(proxy)) {
+                proxy = {
+                    type: proxy    
+                };
+            }
+            Ext.applyIf(proxy, {
+                model: me.model
+            });
+            
+            proxy = Ext.createByAlias('proxy.' + proxy.type, proxy);
+        }
+        
+        me.proxy = proxy;
+        
+        return me.proxy;
+    },
+
+    
+    getProxy: function() {
+        return this.proxy;
+    },
+
+    
+    create: function(data, options) {
+        var me = this,
+            instance = Ext.ModelManager.create(Ext.applyIf(data, me.modelDefaults), me.model.modelName),
+            operation;
+        
+        options = options || {};
+
+        Ext.applyIf(options, {
+            action : 'create',
+            records: [instance]
+        });
+
+        operation = Ext.create('Ext.data.Operation', options);
+
+        me.proxy.create(operation, me.onProxyWrite, me);
+        
+        return instance;
+    },
+
+    read: function() {
+        return this.load.apply(this, arguments);
+    },
+
+    onProxyRead: Ext.emptyFn,
+
+    update: function(options) {
+        var me = this,
+            operation;
+        options = options || {};
+
+        Ext.applyIf(options, {
+            action : 'update',
+            records: me.getUpdatedRecords()
+        });
+
+        operation = Ext.create('Ext.data.Operation', options);
+
+        return me.proxy.update(operation, me.onProxyWrite, me);
+    },
+
+    
+    onProxyWrite: function(operation) {
+        var me = this,
+            success = operation.wasSuccessful(),
+            records = operation.getRecords();
+
+        switch (operation.action) {
+            case 'create':
+                me.onCreateRecords(records, operation, success);
+                break;
+            case 'update':
+                me.onUpdateRecords(records, operation, success);
+                break;
+            case 'destroy':
+                me.onDestroyRecords(records, operation, success);
+                break;
+        }
+
+        if (success) {
+            me.fireEvent('write', me, operation);
+            me.fireEvent('datachanged', me);
+        }
+        
+        Ext.callback(operation.callback, operation.scope || me, [records, operation, success]);
+    },
+
+
+    
+    destroy: function(options) {
+        var me = this,
+            operation;
+            
+        options = options || {};
+
+        Ext.applyIf(options, {
+            action : 'destroy',
+            records: me.getRemovedRecords()
+        });
+
+        operation = Ext.create('Ext.data.Operation', options);
+
+        return me.proxy.destroy(operation, me.onProxyWrite, me);
+    },
+
+    
+    onBatchOperationComplete: function(batch, operation) {
+        return this.onProxyWrite(operation);
+    },
+
+    
+    onBatchComplete: function(batch, operation) {
+        var me = this,
+            operations = batch.operations,
+            length = operations.length,
+            i;
+
+        me.suspendEvents();
+
+        for (i = 0; i < length; i++) {
+            me.onProxyWrite(operations[i]);
+        }
+
+        me.resumeEvents();
+
+        me.fireEvent('datachanged', me);
+    },
+
+    onBatchException: function(batch, operation) {
+        
+        
+        
+        
+        
+    },
+
+    
+    filterNew: function(item) {
+        
+        return item.phantom === true && item.isValid();
+    },
+
+    
+    getNewRecords: function() {
+        return [];
+    },
+
+    
+    getUpdatedRecords: function() {
+        return [];
+    },
+
+    
+    filterUpdated: function(item) {
+        
+        return item.dirty === true && item.phantom !== true && item.isValid();
+    },
+
+    
+    getRemovedRecords: function() {
+        return this.removed;
+    },
+
+    filter: function(filters, value) {
+
+    },
+
+    
+    decodeFilters: function(filters) {
+        if (!Ext.isArray(filters)) {
+            if (filters === undefined) {
+                filters = [];
+            } else {
+                filters = [filters];
+            }
+        }
+
+        var length = filters.length,
+            Filter = Ext.util.Filter,
+            config, i;
+
+        for (i = 0; i < length; i++) {
+            config = filters[i];
+
+            if (!(config instanceof Filter)) {
+                Ext.apply(config, {
+                    root: 'data'
+                });
+
+                
+                if (config.fn) {
+                    config.filterFn = config.fn;
+                }
+
+                
+                if (typeof config == 'function') {
+                    config = {
+                        filterFn: config
+                    };
+                }
+
+                filters[i] = new Filter(config);
+            }
+        }
+
+        return filters;
+    },
+
+    clearFilter: function(supressEvent) {
+
+    },
+
+    isFiltered: function() {
+
+    },
+
+    filterBy: function(fn, scope) {
+
+    },
+    
+    
+    sync: function() {
+        var me        = this,
+            options   = {},
+            toCreate  = me.getNewRecords(),
+            toUpdate  = me.getUpdatedRecords(),
+            toDestroy = me.getRemovedRecords(),
+            needsSync = false;
+
+        if (toCreate.length > 0) {
+            options.create = toCreate;
+            needsSync = true;
+        }
+
+        if (toUpdate.length > 0) {
+            options.update = toUpdate;
+            needsSync = true;
+        }
+
+        if (toDestroy.length > 0) {
+            options.destroy = toDestroy;
+            needsSync = true;
+        }
+
+        if (needsSync && me.fireEvent('beforesync', options) !== false) {
+            me.proxy.batch(options, me.getBatchListeners());
+        }
+    },
+
+
+    
+    getBatchListeners: function() {
+        var me = this,
+            listeners = {
+                scope: me,
+                exception: me.onBatchException
+            };
+
+        if (me.batchUpdateMode == 'operation') {
+            listeners.operationcomplete = me.onBatchOperationComplete;
+        } else {
+            listeners.complete = me.onBatchComplete;
+        }
+
+        return listeners;
+    },
+
+    
+    save: function() {
+        return this.sync.apply(this, arguments);
+    },
+
+    
+    load: function(options) {
+        var me = this,
+            operation;
+
+        options = options || {};
+
+        Ext.applyIf(options, {
+            action : 'read',
+            filters: me.filters.items,
+            sorters: me.getSorters()
+        });
+        
+        operation = Ext.create('Ext.data.Operation', options);
+
+        if (me.fireEvent('beforeload', me, operation) !== false) {
+            me.loading = true;
+            me.proxy.read(operation, me.onProxyLoad, me);
+        }
+        
+        return me;
+    },
+
+    
+    afterEdit : function(record) {
+        var me = this;
+        
+        if (me.autoSync) {
+            me.sync();
+        }
+        
+        me.fireEvent('update', me, record, Ext.data.Model.EDIT);
+    },
+
+    
+    afterReject : function(record) {
+        this.fireEvent('update', this, record, Ext.data.Model.REJECT);
+    },
+
+    
+    afterCommit : function(record) {
+        this.fireEvent('update', this, record, Ext.data.Model.COMMIT);
+    },
+
+    clearData: Ext.emptyFn,
+
+    destroyStore: function() {
+        var me = this;
+        
+        if (!me.isDestroyed) {
+            if (me.storeId) {
+                Ext.data.StoreManager.unregister(me);
+            }
+            me.clearData();
+            me.data = null;
+            me.tree = null;
+            
+            me.reader = me.writer = null;
+            me.clearListeners();
+            me.isDestroyed = true;
+
+            if (me.implicitModel) {
+                Ext.destroy(me.model);
+            }
+        }
+    },
+    
+    doSort: function(sorterFn) {
+        var me = this;
+        if (me.remoteSort) {
+            
+            me.load();
+        } else {
+            me.data.sortBy(sorterFn);
+            me.fireEvent('datachanged', me);
+        }
+    },
+
+    getCount: Ext.emptyFn,
+
+    getById: Ext.emptyFn,
+    
+    
+    removeAll: Ext.emptyFn,
+    
+    
+
+    
+    isLoading: function() {
+        return !!this.loading;
+     }
+});
+
+
+ 
+Ext.define('Ext.util.Grouper', {
+
+    
+
+    extend: 'Ext.util.Sorter',
+
+    
+
+    
+    getGroupString: function(instance) {
+        return instance.get(this.property);
+    }
+});
+
+Ext.define('Ext.data.Store', {
+    extend: 'Ext.data.AbstractStore',
+
+    alias: 'store.store',
+
+    requires: ['Ext.data.StoreManager', 'Ext.ModelManager', 'Ext.data.Model', 'Ext.util.Grouper'],
+    uses: ['Ext.data.proxy.Memory'],
+
+    
+    remoteSort: false,
+
+    
+    remoteFilter: false,
+
+    
+    remoteGroup : false,
+
+    
+
+    
+
+    
+    groupField: undefined,
+
+    
+    groupDir: "ASC",
+
+    
+    pageSize: 25,
+
+    
+    currentPage: 1,
+
+    
+    clearOnPageLoad: true,
+
+    
+    loading: false,
+
+    
+    sortOnFilter: true,
+
+    
+    buffered: false,
+
+    
+    purgePageCount: 5,
+
+    isStore: true,
+
+    onClassExtended: function(cls, data) {
+        var model = data.model;
+
+        if (typeof model == 'string') {
+            var onBeforeClassCreated = data.onBeforeClassCreated;
+
+            data.onBeforeClassCreated = function(cls, data) {
+                var me = this;
+
+                Ext.require(model, function() {
+                    onBeforeClassCreated.call(me, cls, data);
+                });
+            };
+        }
+    },
+
+    
+    constructor: function(config) {
+        
+        config = Ext.Object.merge({}, config);
+
+        var me = this,
+            groupers = config.groupers || me.groupers,
+            groupField = config.groupField || me.groupField,
+            proxy,
+            data;
+
+        if (config.buffered || me.buffered) {
+            me.prefetchData = Ext.create('Ext.util.MixedCollection', false, function(record) {
+                return record.index;
+            });
+            me.pendingRequests = [];
+            me.pagesRequested = [];
+
+            me.sortOnLoad = false;
+            me.filterOnLoad = false;
+        }
+
+        me.addEvents(
+            
+            'beforeprefetch',
+            
+            'groupchange',
+            
+            'prefetch'
+        );
+        data = config.data || me.data;
+
+        
+        me.data = Ext.create('Ext.util.MixedCollection', false, function(record) {
+            return record.internalId;
+        });
+
+        if (data) {
+            me.inlineData = data;
+            delete config.data;
+        }
+
+        if (!groupers && groupField) {
+            groupers = [{
+                property : groupField,
+                direction: config.groupDir || me.groupDir
+            }];
+        }
+        delete config.groupers;
+
+        
+        me.groupers = Ext.create('Ext.util.MixedCollection');
+        me.groupers.addAll(me.decodeGroupers(groupers));
+
+        this.callParent([config]);
+        
+
+        if (me.groupers.items.length) {
+            me.sort(me.groupers.items, 'prepend', false);
+        }
+
+        proxy = me.proxy;
+        data = me.inlineData;
+
+        if (data) {
+            if (proxy instanceof Ext.data.proxy.Memory) {
+                proxy.data = data;
+                me.read();
+            } else {
+                me.add.apply(me, data);
+            }
+
+            me.sort();
+            delete me.inlineData;
+        } else if (me.autoLoad) {
+            Ext.defer(me.load, 10, me, [typeof me.autoLoad === 'object' ? me.autoLoad: undefined]);
+            
+            
+        }
+    },
+
+    onBeforeSort: function() {
+        var groupers = this.groupers;
+        if (groupers.getCount() > 0) {
+            this.sort(groupers.items, 'prepend', false);
+        }
+    },
+
+    
+    decodeGroupers: function(groupers) {
+        if (!Ext.isArray(groupers)) {
+            if (groupers === undefined) {
+                groupers = [];
+            } else {
+                groupers = [groupers];
+            }
+        }
+
+        var length  = groupers.length,
+            Grouper = Ext.util.Grouper,
+            config, i;
+
+        for (i = 0; i < length; i++) {
+            config = groupers[i];
+
+            if (!(config instanceof Grouper)) {
+                if (Ext.isString(config)) {
+                    config = {
+                        property: config
+                    };
+                }
+
+                Ext.applyIf(config, {
+                    root     : 'data',
+                    direction: "ASC"
+                });
+
+                
+                if (config.fn) {
+                    config.sorterFn = config.fn;
+                }
+
+                
+                if (typeof config == 'function') {
+                    config = {
+                        sorterFn: config
+                    };
+                }
+
+                groupers[i] = new Grouper(config);
+            }
+        }
+
+        return groupers;
+    },
+
+    
+    group: function(groupers, direction) {
+        var me = this,
+            hasNew = false,
+            grouper,
+            newGroupers;
+
+        if (Ext.isArray(groupers)) {
+            newGroupers = groupers;
+        } else if (Ext.isObject(groupers)) {
+            newGroupers = [groupers];
+        } else if (Ext.isString(groupers)) {
+            grouper = me.groupers.get(groupers);
+
+            if (!grouper) {
+                grouper = {
+                    property : groupers,
+                    direction: direction
+                };
+                newGroupers = [grouper];
+            } else if (direction === undefined) {
+                grouper.toggle();
+            } else {
+                grouper.setDirection(direction);
+            }
+        }
+
+        if (newGroupers && newGroupers.length) {
+            hasNew = true;
+            newGroupers = me.decodeGroupers(newGroupers);
+            me.groupers.clear();
+            me.groupers.addAll(newGroupers);
+        }
+
+        if (me.remoteGroup) {
+            me.load({
+                scope: me,
+                callback: me.fireGroupChange
+            });
+        } else {
+            
+            me.sort(null, null, null, hasNew);
+            me.fireGroupChange();
+        }
+    },
+
+    
+    clearGrouping: function(){
+        var me = this;
+        
+        me.groupers.each(function(grouper){
+            me.sorters.remove(grouper);
+        });
+        me.groupers.clear();
+        if (me.remoteGroup) {
+            me.load({
+                scope: me,
+                callback: me.fireGroupChange
+            });
+        } else {
+            me.sort();
+            me.fireEvent('groupchange', me, me.groupers);
+        }
+    },
+
+    
+    isGrouped: function() {
+        return this.groupers.getCount() > 0;
+    },
+
+    
+    fireGroupChange: function(){
+        this.fireEvent('groupchange', this, this.groupers);
+    },
+
+    
+    getGroups: function(requestGroupString) {
+        var records = this.data.items,
+            length = records.length,
+            groups = [],
+            pointers = {},
+            record,
+            groupStr,
+            group,
+            i;
+
+        for (i = 0; i < length; i++) {
+            record = records[i];
+            groupStr = this.getGroupString(record);
+            group = pointers[groupStr];
+
+            if (group === undefined) {
+                group = {
+                    name: groupStr,
+                    children: []
+                };
+
+                groups.push(group);
+                pointers[groupStr] = group;
+            }
+
+            group.children.push(record);
+        }
+
+        return requestGroupString ? pointers[requestGroupString] : groups;
+    },
+
+    
+    getGroupsForGrouper: function(records, grouper) {
+        var length = records.length,
+            groups = [],
+            oldValue,
+            newValue,
+            record,
+            group,
+            i;
+
+        for (i = 0; i < length; i++) {
+            record = records[i];
+            newValue = grouper.getGroupString(record);
+
+            if (newValue !== oldValue) {
+                group = {
+                    name: newValue,
+                    grouper: grouper,
+                    records: []
+                };
+                groups.push(group);
+            }
+
+            group.records.push(record);
+
+            oldValue = newValue;
+        }
+
+        return groups;
+    },
+
+    
+    getGroupsForGrouperIndex: function(records, grouperIndex) {
+        var me = this,
+            groupers = me.groupers,
+            grouper = groupers.getAt(grouperIndex),
+            groups = me.getGroupsForGrouper(records, grouper),
+            length = groups.length,
+            i;
+
+        if (grouperIndex + 1 < groupers.length) {
+            for (i = 0; i < length; i++) {
+                groups[i].children = me.getGroupsForGrouperIndex(groups[i].records, grouperIndex + 1);
+            }
+        }
+
+        for (i = 0; i < length; i++) {
+            groups[i].depth = grouperIndex;
+        }
+
+        return groups;
+    },
+
+    
+    getGroupData: function(sort) {
+        var me = this;
+        if (sort !== false) {
+            me.sort();
+        }
+
+        return me.getGroupsForGrouperIndex(me.data.items, 0);
+    },
+
+    
+    getGroupString: function(instance) {
+        var group = this.groupers.first();
+        if (group) {
+            return instance.get(group.property);
+        }
+        return '';
+    },
+    
+    insert: function(index, records) {
+        var me = this,
+            sync = false,
+            i,
+            record,
+            len;
+
+        records = [].concat(records);
+        for (i = 0, len = records.length; i < len; i++) {
+            record = me.createModel(records[i]);
+            record.set(me.modelDefaults);
+            
+            records[i] = record;
+
+            me.data.insert(index + i, record);
+            record.join(me);
+
+            sync = sync || record.phantom === true;
+        }
+
+        if (me.snapshot) {
+            me.snapshot.addAll(records);
+        }
+
+        me.fireEvent('add', me, records, index);
+        me.fireEvent('datachanged', me);
+        if (me.autoSync && sync) {
+            me.sync();
+        }
+    },
+
+    
+    add: function(records) {
+        
+        if (!Ext.isArray(records)) {
+            records = Array.prototype.slice.apply(arguments);
+        }
+
+        var me = this,
+            i = 0,
+            length = records.length,
+            record;
+
+        for (; i < length; i++) {
+            record = me.createModel(records[i]);
+            
+            records[i] = record;
+        }
+
+        me.insert(me.data.length, records);
+
+        return records;
+    },
+
+    
+    createModel: function(record) {
+        if (!record.isModel) {
+            record = Ext.ModelManager.create(record, this.model);
+        }
+
+        return record;
+    },
+
+    
+    each: function(fn, scope) {
+        this.data.each(fn, scope);
+    },
+
+    
+    remove: function(records,  isMove) {
+        if (!Ext.isArray(records)) {
+            records = [records];
+        }
+
+        
+        isMove = isMove === true;
+        var me = this,
+            sync = false,
+            i = 0,
+            length = records.length,
+            isPhantom,
+            index,
+            record;
+
+        for (; i < length; i++) {
+            record = records[i];
+            index = me.data.indexOf(record);
+
+            if (me.snapshot) {
+                me.snapshot.remove(record);
+            }
+
+            if (index > -1) {
+                isPhantom = record.phantom === true;
+                if (!isMove && !isPhantom) {
+                    
+                    me.removed.push(record);
+                }
+
+                record.unjoin(me);
+                me.data.remove(record);
+                sync = sync || !isPhantom;
+
+                me.fireEvent('remove', me, record, index);
+            }
+        }
+
+        me.fireEvent('datachanged', me);
+        if (!isMove && me.autoSync && sync) {
+            me.sync();
+        }
+    },
+
+    
+    removeAt: function(index) {
+        var record = this.getAt(index);
+
+        if (record) {
+            this.remove(record);
+        }
+    },
+
+    
+    load: function(options) {
+        var me = this;
+
+        options = options || {};
+
+        if (Ext.isFunction(options)) {
+            options = {
+                callback: options
+            };
+        }
+
+        Ext.applyIf(options, {
+            groupers: me.groupers.items,
+            page: me.currentPage,
+            start: (me.currentPage - 1) * me.pageSize,
+            limit: me.pageSize,
+            addRecords: false
+        });
+
+        return me.callParent([options]);
+    },
+
+    
+    onProxyLoad: function(operation) {
+        var me = this,
+            resultSet = operation.getResultSet(),
+            records = operation.getRecords(),
+            successful = operation.wasSuccessful();
+
+        if (resultSet) {
+            me.totalCount = resultSet.total;
+        }
+
+        if (successful) {
+            me.loadRecords(records, operation);
+        }
+
+        me.loading = false;
+        me.fireEvent('load', me, records, successful);
+
+        
+        
+        me.fireEvent('read', me, records, operation.wasSuccessful());
+
+        
+        Ext.callback(operation.callback, operation.scope || me, [records, operation, successful]);
+    },
+
+    
+    onCreateRecords: function(records, operation, success) {
+        if (success) {
+            var i = 0,
+                data = this.data,
+                snapshot = this.snapshot,
+                length = records.length,
+                originalRecords = operation.records,
+                record,
+                original,
+                index;
+
+            
+            for (; i < length; ++i) {
+                record = records[i];
+                original = originalRecords[i];
+                if (original) {
+                    index = data.indexOf(original);
+                    if (index > -1) {
+                        data.removeAt(index);
+                        data.insert(index, record);
+                    }
+                    if (snapshot) {
+                        index = snapshot.indexOf(original);
+                        if (index > -1) {
+                            snapshot.removeAt(index);
+                            snapshot.insert(index, record);
+                        }
+                    }
+                    record.phantom = false;
+                    record.join(this);
+                }
+            }
+        }
+    },
+
+    
+    onUpdateRecords: function(records, operation, success){
+        if (success) {
+            var i = 0,
+                length = records.length,
+                data = this.data,
+                snapshot = this.snapshot,
+                record;
+
+            for (; i < length; ++i) {
+                record = records[i];
+                data.replace(record);
+                if (snapshot) {
+                    snapshot.replace(record);
+                }
+                record.join(this);
+            }
+        }
+    },
+
+    
+    onDestroyRecords: function(records, operation, success){
+        if (success) {
+            var me = this,
+                i = 0,
+                length = records.length,
+                data = me.data,
+                snapshot = me.snapshot,
+                record;
+
+            for (; i < length; ++i) {
+                record = records[i];
+                record.unjoin(me);
+                data.remove(record);
+                if (snapshot) {
+                    snapshot.remove(record);
+                }
+            }
+            me.removed = [];
+        }
+    },
+
+    
+    getNewRecords: function() {
+        return this.data.filterBy(this.filterNew).items;
+    },
+
+    
+    getUpdatedRecords: function() {
+        return this.data.filterBy(this.filterUpdated).items;
+    },
+
+    
+    filter: function(filters, value) {
+        if (Ext.isString(filters)) {
+            filters = {
+                property: filters,
+                value: value
+            };
+        }
+
+        var me = this,
+            decoded = me.decodeFilters(filters),
+            i = 0,
+            doLocalSort = me.sortOnFilter && !me.remoteSort,
+            length = decoded.length;
+
+        for (; i < length; i++) {
+            me.filters.replace(decoded[i]);
+        }
+
+        if (me.remoteFilter) {
+            
+            me.load();
+        } else {
+            
+            if (me.filters.getCount()) {
+                me.snapshot = me.snapshot || me.data.clone();
+                me.data = me.data.filter(me.filters.items);
+
+                if (doLocalSort) {
+                    me.sort();
+                }
+                
+                if (!doLocalSort || me.sorters.length < 1) {
+                    me.fireEvent('datachanged', me);
+                }
+            }
+        }
+    },
+
+    
+    clearFilter: function(suppressEvent) {
+        var me = this;
+
+        me.filters.clear();
+
+        if (me.remoteFilter) {
+            me.load();
+        } else if (me.isFiltered()) {
+            me.data = me.snapshot.clone();
+            delete me.snapshot;
+
+            if (suppressEvent !== true) {
+                me.fireEvent('datachanged', me);
+            }
+        }
+    },
+
+    
+    isFiltered: function() {
+        var snapshot = this.snapshot;
+        return !! snapshot && snapshot !== this.data;
+    },
+
+    
+    filterBy: function(fn, scope) {
+        var me = this;
+
+        me.snapshot = me.snapshot || me.data.clone();
+        me.data = me.queryBy(fn, scope || me);
+        me.fireEvent('datachanged', me);
+    },
+
+    
+    queryBy: function(fn, scope) {
+        var me = this,
+        data = me.snapshot || me.data;
+        return data.filterBy(fn, scope || me);
+    },
+
+    
+    loadData: function(data, append) {
+        var model = this.model,
+            length = data.length,
+            newData = [],
+            i,
+            record;
+
+        
+        for (i = 0; i < length; i++) {
+            record = data[i];
+
+            if (!(record instanceof Ext.data.Model)) {
+                record = Ext.ModelManager.create(record, model);
+            }
+            newData.push(record);
+        }
+
+        this.loadRecords(newData, {addRecords: append});
+    },
+
+
+    
+    loadRawData : function(data, append) {
+         var me      = this,
+             result  = me.proxy.reader.read(data),
+             records = result.records;
+
+         if (result.success) {
+             me.loadRecords(records, { addRecords: append });
+             me.fireEvent('load', me, records, true);
+         }
+     },
+
+
+    
+    loadRecords: function(records, options) {
+        var me     = this,
+            i      = 0,
+            length = records.length;
+
+        options = options || {};
+
+
+        if (!options.addRecords) {
+            delete me.snapshot;
+            me.clearData();
+        }
+
+        me.data.addAll(records);
+
+        
+        for (; i < length; i++) {
+            if (options.start !== undefined) {
+                records[i].index = options.start + i;
+
+            }
+            records[i].join(me);
+        }
+
+        
+        me.suspendEvents();
+
+        if (me.filterOnLoad && !me.remoteFilter) {
+            me.filter();
+        }
+
+        if (me.sortOnLoad && !me.remoteSort) {
+            me.sort();
+        }
+
+        me.resumeEvents();
+        me.fireEvent('datachanged', me, records);
+    },
+
+    
+    
+    loadPage: function(page, options) {
+        var me = this;
+        options = Ext.apply({}, options);
+
+        me.currentPage = page;
+
+        me.read(Ext.applyIf(options, {
+            page: page,
+            start: (page - 1) * me.pageSize,
+            limit: me.pageSize,
+            addRecords: !me.clearOnPageLoad
+        }));
+    },
+
+    
+    nextPage: function(options) {
+        this.loadPage(this.currentPage + 1, options);
+    },
+
+    
+    previousPage: function(options) {
+        this.loadPage(this.currentPage - 1, options);
+    },
+
+    
+    clearData: function() {
+        var me = this;
+        me.data.each(function(record) {
+            record.unjoin(me);
+        });
+
+        me.data.clear();
+    },
+
+    
+    
+    prefetch: function(options) {
+        var me = this,
+            operation,
+            requestId = me.getRequestId();
+
+        options = options || {};
+
+        Ext.applyIf(options, {
+            action : 'read',
+            filters: me.filters.items,
+            sorters: me.sorters.items,
+            requestId: requestId
+        });
+        me.pendingRequests.push(requestId);
+
+        operation = Ext.create('Ext.data.Operation', options);
+
+        
+        
+        
+        
+        if (me.fireEvent('beforeprefetch', me, operation) !== false) {
+            me.loading = true;
+            me.proxy.read(operation, me.onProxyPrefetch, me);
+        }
+
+        return me;
+    },
+
+    
+    prefetchPage: function(page, options) {
+        var me = this,
+            pageSize = me.pageSize,
+            start = (page - 1) * me.pageSize,
+            end = start + pageSize;
+
+        
+        if (Ext.Array.indexOf(me.pagesRequested, page) === -1 && !me.rangeSatisfied(start, end)) {
+            options = options || {};
+            me.pagesRequested.push(page);
+            Ext.applyIf(options, {
+                page : page,
+                start: start,
+                limit: pageSize,
+                callback: me.onWaitForGuarantee,
+                scope: me
+            });
+
+            me.prefetch(options);
+        }
+
+    },
+
+    
+    getRequestId: function() {
+        this.requestSeed = this.requestSeed || 1;
+        return this.requestSeed++;
+    },
+
+    
+    onProxyPrefetch: function(operation) {
+        var me         = this,
+            resultSet  = operation.getResultSet(),
+            records    = operation.getRecords(),
+
+            successful = operation.wasSuccessful();
+
+        if (resultSet) {
+            me.totalCount = resultSet.total;
+            me.fireEvent('totalcountchange', me.totalCount);
+        }
+
+        if (successful) {
+            me.cacheRecords(records, operation);
+        }
+        Ext.Array.remove(me.pendingRequests, operation.requestId);
+        if (operation.page) {
+            Ext.Array.remove(me.pagesRequested, operation.page);
+        }
+
+        me.loading = false;
+        me.fireEvent('prefetch', me, records, successful, operation);
+
+        
+        if (operation.blocking) {
+            me.fireEvent('load', me, records, successful);
+        }
+
+        
+        Ext.callback(operation.callback, operation.scope || me, [records, operation, successful]);
+    },
+
+    
+    cacheRecords: function(records, operation) {
+        var me     = this,
+            i      = 0,
+            length = records.length,
+            start  = operation ? operation.start : 0;
+
+        if (!Ext.isDefined(me.totalCount)) {
+            me.totalCount = records.length;
+            me.fireEvent('totalcountchange', me.totalCount);
+        }
+
+        for (; i < length; i++) {
+            
+            records[i].index = start + i;
+        }
+
+        me.prefetchData.addAll(records);
+        if (me.purgePageCount) {
+            me.purgeRecords();
+        }
+
+    },
+
+
+    
+    purgeRecords: function() {
+        var me = this,
+            prefetchCount = me.prefetchData.getCount(),
+            purgeCount = me.purgePageCount * me.pageSize,
+            numRecordsToPurge = prefetchCount - purgeCount - 1,
+            i = 0;
+
+        for (; i <= numRecordsToPurge; i++) {
+            me.prefetchData.removeAt(0);
+        }
+    },
+
+    
+    rangeSatisfied: function(start, end) {
+        var me = this,
+            i = start,
+            satisfied = true;
+
+        for (; i < end; i++) {
+            if (!me.prefetchData.getByKey(i)) {
+                satisfied = false;
+                break;
+            }
+        }
+        return satisfied;
+    },
+
+    
+    getPageFromRecordIndex: function(index) {
+        return Math.floor(index / this.pageSize) + 1;
+    },
+
+    
+    onGuaranteedRange: function() {
+        var me = this,
+            totalCount = me.getTotalCount(),
+            start = me.requestStart,
+            end = ((totalCount - 1) < me.requestEnd) ? totalCount - 1 : me.requestEnd,
+            range = [],
+            record,
+            i = start;
+
+        end = Math.max(0, end);
+
+
+        if (start !== me.guaranteedStart && end !== me.guaranteedEnd) {
+            me.guaranteedStart = start;
+            me.guaranteedEnd = end;
+
+            for (; i <= end; i++) {
+                record = me.prefetchData.getByKey(i);
+                if (record) {
+                    range.push(record);
+                }
+            }
+            me.fireEvent('guaranteedrange', range, start, end);
+            if (me.cb) {
+                me.cb.call(me.scope || me, range);
+            }
+        }
+
+        me.unmask();
+    },
+
+    
+    mask: function() {
+        this.masked = true;
+        this.fireEvent('beforeload');
+    },
+
+    
+    unmask: function() {
+        if (this.masked) {
+            this.fireEvent('load');
+        }
+    },
+
+    
+    hasPendingRequests: function() {
+        return this.pendingRequests.length;
+    },
+
+
+    
+    onWaitForGuarantee: function() {
+        if (!this.hasPendingRequests()) {
+            this.onGuaranteedRange();
+        }
+    },
+
+    
+    guaranteeRange: function(start, end, cb, scope) {
+
+        end = (end > this.totalCount) ? this.totalCount - 1 : end;
+
+        var me = this,
+            i = start,
+            prefetchData = me.prefetchData,
+            range = [],
+            startLoaded = !!prefetchData.getByKey(start),
+            endLoaded = !!prefetchData.getByKey(end),
+            startPage = me.getPageFromRecordIndex(start),
+            endPage = me.getPageFromRecordIndex(end);
+
+        me.cb = cb;
+        me.scope = scope;
+
+        me.requestStart = start;
+        me.requestEnd = end;
+        
+        if (!startLoaded || !endLoaded) {
+            
+            if (startPage === endPage) {
+                me.mask();
+                me.prefetchPage(startPage, {
+                    
+                    callback: me.onWaitForGuarantee,
+                    scope: me
+                });
+            
+            } else {
+                me.mask();
+                me.prefetchPage(startPage, {
+                    
+                    callback: me.onWaitForGuarantee,
+                    scope: me
+                });
+                me.prefetchPage(endPage, {
+                    
+                    callback: me.onWaitForGuarantee,
+                    scope: me
+                });
+            }
+        
+        } else {
+            me.onGuaranteedRange();
+        }
+    },
+
+    
+    
+    sort: function() {
+        var me = this,
+            prefetchData = me.prefetchData,
+            sorters,
+            start,
+            end,
+            range;
+
+        if (me.buffered) {
+            if (me.remoteSort) {
+                prefetchData.clear();
+                me.callParent(arguments);
+            } else {
+                sorters = me.getSorters();
+                start = me.guaranteedStart;
+                end = me.guaranteedEnd;
+
+                if (sorters.length) {
+                    prefetchData.sort(sorters);
+                    range = prefetchData.getRange();
+                    prefetchData.clear();
+                    me.cacheRecords(range);
+                    delete me.guaranteedStart;
+                    delete me.guaranteedEnd;
+                    me.guaranteeRange(start, end);
+                }
+                me.callParent(arguments);
+            }
+        } else {
+            me.callParent(arguments);
+        }
+    },
+
+    
+    
+    
+    doSort: function(sorterFn) {
+        var me = this;
+        if (me.remoteSort) {
+            
+            me.load();
+        } else {
+            me.data.sortBy(sorterFn);
+            if (!me.buffered) {
+                var range = me.getRange(),
+                    ln = range.length,
+                    i  = 0;
+                for (; i < ln; i++) {
+                    range[i].index = i;
+                }
+            }
+            me.fireEvent('datachanged', me);
+        }
+    },
+
+    
+    find: function(property, value, start, anyMatch, caseSensitive, exactMatch) {
+        var fn = this.createFilterFn(property, value, anyMatch, caseSensitive, exactMatch);
+        return fn ? this.data.findIndexBy(fn, null, start) : -1;
+    },
+
+    
+    findRecord: function() {
+        var me = this,
+            index = me.find.apply(me, arguments);
+        return index !== -1 ? me.getAt(index) : null;
+    },
+
+    
+    createFilterFn: function(property, value, anyMatch, caseSensitive, exactMatch) {
+        if (Ext.isEmpty(value)) {
+            return false;
+        }
+        value = this.data.createValueMatcher(value, anyMatch, caseSensitive, exactMatch);
+        return function(r) {
+            return value.test(r.data[property]);
+        };
+    },
+
+    
+    findExact: function(property, value, start) {
+        return this.data.findIndexBy(function(rec) {
+            return rec.get(property) == value;
+        },
+        this, start);
+    },
+
+    
+    findBy: function(fn, scope, start) {
+        return this.data.findIndexBy(fn, scope, start);
+    },
+
+    
+    collect: function(dataIndex, allowNull, bypassFilter) {
+        var me = this,
+            data = (bypassFilter === true && me.snapshot) ? me.snapshot: me.data;
+
+        return data.collect(dataIndex, 'data', allowNull);
+    },
+
+    
+    getCount: function() {
+        return this.data.length || 0;
+    },
+
+    
+    getTotalCount: function() {
+        return this.totalCount;
+    },
+
+    
+    getAt: function(index) {
+        return this.data.getAt(index);
+    },
+
+    
+    getRange: function(start, end) {
+        return this.data.getRange(start, end);
+    },
+
+    
+    getById: function(id) {
+        return (this.snapshot || this.data).findBy(function(record) {
+            return record.getId() === id;
+        });
+    },
+
+    
+    indexOf: function(record) {
+        return this.data.indexOf(record);
+    },
+
+
+    
+    indexOfTotal: function(record) {
+        var index = record.index;
+        if (index || index === 0) {
+            return index;
+        }
+        return this.indexOf(record);
+    },
+
+    
+    indexOfId: function(id) {
+        return this.indexOf(this.getById(id));
+    },
+
+    
+    removeAll: function(silent) {
+        var me = this;
+
+        me.clearData();
+        if (me.snapshot) {
+            me.snapshot.clear();
+        }
+        if (silent !== true) {
+            me.fireEvent('clear', me);
+        }
+    },
+
+    
+
+    
+    first: function(grouped) {
+        var me = this;
+
+        if (grouped && me.isGrouped()) {
+            return me.aggregate(function(records) {
+                return records.length ? records[0] : undefined;
+            }, me, true);
+        } else {
+            return me.data.first();
+        }
+    },
+
+    
+    last: function(grouped) {
+        var me = this;
+
+        if (grouped && me.isGrouped()) {
+            return me.aggregate(function(records) {
+                var len = records.length;
+                return len ? records[len - 1] : undefined;
+            }, me, true);
+        } else {
+            return me.data.last();
+        }
+    },
+
+    
+    sum: function(field, grouped) {
+        var me = this;
+
+        if (grouped && me.isGrouped()) {
+            return me.aggregate(me.getSum, me, true, [field]);
+        } else {
+            return me.getSum(me.data.items, field);
+        }
+    },
+
+    
+    getSum: function(records, field) {
+        var total = 0,
+            i = 0,
+            len = records.length;
+
+        for (; i < len; ++i) {
+            total += records[i].get(field);
+        }
+
+        return total;
+    },
+
+    
+    count: function(grouped) {
+        var me = this;
+
+        if (grouped && me.isGrouped()) {
+            return me.aggregate(function(records) {
+                return records.length;
+            }, me, true);
+        } else {
+            return me.getCount();
+        }
+    },
+
+    
+    min: function(field, grouped) {
+        var me = this;
+
+        if (grouped && me.isGrouped()) {
+            return me.aggregate(me.getMin, me, true, [field]);
+        } else {
+            return me.getMin(me.data.items, field);
+        }
+    },
+
+    
+    getMin: function(records, field){
+        var i = 1,
+            len = records.length,
+            value, min;
+
+        if (len > 0) {
+            min = records[0].get(field);
+        }
+
+        for (; i < len; ++i) {
+            value = records[i].get(field);
+            if (value < min) {
+                min = value;
+            }
+        }
+        return min;
+    },
+
+    
+    max: function(field, grouped) {
+        var me = this;
+
+        if (grouped && me.isGrouped()) {
+            return me.aggregate(me.getMax, me, true, [field]);
+        } else {
+            return me.getMax(me.data.items, field);
+        }
+    },
+
+    
+    getMax: function(records, field) {
+        var i = 1,
+            len = records.length,
+            value,
+            max;
+
+        if (len > 0) {
+            max = records[0].get(field);
+        }
+
+        for (; i < len; ++i) {
+            value = records[i].get(field);
+            if (value > max) {
+                max = value;
+            }
+        }
+        return max;
+    },
+
+    
+    average: function(field, grouped) {
+        var me = this;
+        if (grouped && me.isGrouped()) {
+            return me.aggregate(me.getAverage, me, true, [field]);
+        } else {
+            return me.getAverage(me.data.items, field);
+        }
+    },
+
+    
+    getAverage: function(records, field) {
+        var i = 0,
+            len = records.length,
+            sum = 0;
+
+        if (records.length > 0) {
+            for (; i < len; ++i) {
+                sum += records[i].get(field);
+            }
+            return sum / len;
+        }
+        return 0;
+    },
+
+    
+    aggregate: function(fn, scope, grouped, args) {
+        args = args || [];
+        if (grouped && this.isGrouped()) {
+            var groups = this.getGroups(),
+                i = 0,
+                len = groups.length,
+                out = {},
+                group;
+
+            for (; i < len; ++i) {
+                group = groups[i];
+                out[group.name] = fn.apply(scope || this, [group.children].concat(args));
+            }
+            return out;
+        } else {
+            return fn.apply(scope || this, [this.data.items].concat(args));
+        }
+    }
+}, function() {
+    
+    
+    
+    Ext.regStore('ext-empty-store', {fields: [], proxy: 'proxy'});
+});
+
+
+Ext.define('Ext.data.JsonStore',  {
+    extend: 'Ext.data.Store',
+    alias: 'store.json',
+
+    
+    constructor: function(config) {
+        config = config || {};
+
+        Ext.applyIf(config, {
+            proxy: {
+                type  : 'ajax',
+                reader: 'json',
+                writer: 'json'
+            }
+        });
+
+        this.callParent([config]);
+    }
+});
+
+
+Ext.define('Ext.chart.axis.Time', {
+
+    
+
+    extend: 'Ext.chart.axis.Numeric',
+
+    alternateClassName: 'Ext.chart.TimeAxis',
+
+    alias: 'axis.time',
+
+    requires: ['Ext.data.Store', 'Ext.data.JsonStore'],
+
+    
+
+    
+    dateFormat: false,
+
+    
+    fromDate: false,
+
+    
+    toDate: false,
+
+    
+    step: [Ext.Date.DAY, 1],
+    
+    
+    constrain: false,
+
+    
+    roundToDecimal: false,
+    
+    constructor: function (config) {
+        var me = this, label, f, df;
+        me.callParent([config]);
+        label = me.label || {};
+        df = this.dateFormat;
+        if (df) {
+            if (label.renderer) {
+                f = label.renderer;
+                label.renderer = function(v) {
+                    v = f(v);
+                    return Ext.Date.format(new Date(f(v)), df);
+                };
+            } else {
+                label.renderer = function(v) {
+                    return Ext.Date.format(new Date(v >> 0), df);
+                };
+            }
+        }
+    },
+
+    doConstrain: function () {
+        var me = this,
+            store = me.chart.store,
+            data = [],
+            series = me.chart.series.items,
+            math = Math,
+            mmax = math.max,
+            mmin = math.min,
+            fields = me.fields,
+            ln = fields.length,
+            range = me.getRange(),
+            min = range.min, max = range.max, i, l, excludes = [],
+            value, values, rec, data = [];
+        for (i = 0, l = series.length; i < l; i++) {
+            excludes[i] = series[i].__excludes;
+        }
+        store.each(function(record) {
+            for (i = 0; i < ln; i++) {
+                if (excludes[i]) {
+                    continue;
+                }
+                value = record.get(fields[i]);
+                if (+value < +min) return;
+                if (+value > +max) return;
+            }
+            data.push(record);
+        })
+        me.chart.substore = Ext.create('Ext.data.JsonStore', { model: store.model, data: data });
+    },
+
+    
+    processView: function () {
+        var me = this;
+        if (me.fromDate) {
+            me.minimum = +me.fromDate;
+        }
+        if (me.toDate) {
+            me.maximum = +me.toDate;
+        }
+        if (me.constrain) {
+            me.doConstrain();
+        }
+     },
+
+    
+    calcEnds: function() {
+        var me = this, range, step = me.step;
+        if (step) {
+            range = me.getRange();
+            range = Ext.draw.Draw.snapEndsByDateAndStep(new Date(range.min), new Date(range.max), Ext.isNumber(step) ? [Date.MILLI, step]: step);
+            if (me.minimum) {
+                range.from = me.minimum;
+            }
+            if (me.maximum) {
+                range.to = me.maximum;
+            }
+            range.step = (range.to - range.from) / range.steps;
+            return range;
+        } else {
+            return me.callParent(arguments);
+        }
+    }
+ });
+
+
+
+Ext.define('Ext.chart.series.Series', {
+
+    
+
+    mixins: {
+        observable: 'Ext.util.Observable',
+        labels: 'Ext.chart.Label',
+        highlights: 'Ext.chart.Highlight',
+        tips: 'Ext.chart.Tip',
+        callouts: 'Ext.chart.Callout'
+    },
+
+    
+
+    
+
+    
+
+    
+    type: null,
+
+    
+    title: null,
+
+    
+    showInLegend: true,
+
+    
+    renderer: function(sprite, record, attributes, index, store) {
+        return attributes;
+    },
+
+    
+    shadowAttributes: null,
+
+    //@private triggerdrawlistener flag
+
+    triggerAfterDraw: false,
+
+    
+
+    constructor: function(config) {
+        var me = this;
+        if (config) {
+            Ext.apply(me, config);
+        }
+
+        me.shadowGroups = [];
+
+        me.mixins.labels.constructor.call(me, config);
+        me.mixins.highlights.constructor.call(me, config);
+        me.mixins.tips.constructor.call(me, config);
+        me.mixins.callouts.constructor.call(me, config);
+
+        me.addEvents({
+            scope: me,
+            itemmouseover: true,
+            itemmouseout: true,
+            itemmousedown: true,
+            itemmouseup: true,
+            mouseleave: true,
+            afterdraw: true,
+
+            
+            titlechange: true
+        });
+
+        me.mixins.observable.constructor.call(me, config);
+
+        me.on({
+            scope: me,
+            itemmouseover: me.onItemMouseOver,
+            itemmouseout: me.onItemMouseOut,
+            mouseleave: me.onMouseLeave
+        });
+    },
+    
+    
+    eachRecord: function(fn, scope) {
+        var chart = this.chart;
+        (chart.substore || chart.store).each(fn, scope);
+    },
+
+    
+    getRecordCount: function() {
+        var chart = this.chart,
+            store = chart.substore || chart.store;
+        return store ? store.getCount() : 0;
+    },
+
+    
+    isExcluded: function(index) {
+        var excludes = this.__excludes;
+        return !!(excludes && excludes[index]);
+    },
+
+    
+    setBBox: function(noGutter) {
+        var me = this,
+            chart = me.chart,
+            chartBBox = chart.chartBBox,
+            gutterX = noGutter ? 0 : chart.maxGutter[0],
+            gutterY = noGutter ? 0 : chart.maxGutter[1],
+            clipBox, bbox;
+
+        clipBox = {
+            x: chartBBox.x,
+            y: chartBBox.y,
+            width: chartBBox.width,
+            height: chartBBox.height
+        };
+        me.clipBox = clipBox;
+
+        bbox = {
+            x: (clipBox.x + gutterX) - (chart.zoom.x * chart.zoom.width),
+            y: (clipBox.y + gutterY) - (chart.zoom.y * chart.zoom.height),
+            width: (clipBox.width - (gutterX * 2)) * chart.zoom.width,
+            height: (clipBox.height - (gutterY * 2)) * chart.zoom.height
+        };
+        me.bbox = bbox;
+    },
+
+    
+    onAnimate: function(sprite, attr) {
+        var me = this;
+        sprite.stopAnimation();
+        if (me.triggerAfterDraw) {
+            return sprite.animate(Ext.applyIf(attr, me.chart.animate));
+        } else {
+            me.triggerAfterDraw = true;
+            return sprite.animate(Ext.apply(Ext.applyIf(attr, me.chart.animate), {
+                listeners: {
+                    'afteranimate': function() {
+                        me.triggerAfterDraw = false;
+                        me.fireEvent('afterrender');
+                    }
+                }
+            }));
+        }
+    },
+
+    
+    getGutters: function() {
+        return [0, 0];
+    },
+
+    
+    onItemMouseOver: function(item) {
+        var me = this;
+        if (item.series === me) {
+            if (me.highlight) {
+                me.highlightItem(item);
+            }
+            if (me.tooltip) {
+                me.showTip(item);
+            }
+        }
+    },
+
+    
+    onItemMouseOut: function(item) {
+        var me = this;
+        if (item.series === me) {
+            me.unHighlightItem();
+            if (me.tooltip) {
+                me.hideTip(item);
+            }
+        }
+    },
+
+    
+    onMouseLeave: function() {
+        var me = this;
+        me.unHighlightItem();
+        if (me.tooltip) {
+            me.hideTip();
+        }
+    },
+
+    
+    getItemForPoint: function(x, y) {
+        
+        if (!this.items || !this.items.length || this.seriesIsHidden) {
+            return null;
+        }
+        var me = this,
+            items = me.items,
+            bbox = me.bbox,
+            item, i, ln;
+        
+        if (!Ext.draw.Draw.withinBox(x, y, bbox)) {
+            return null;
+        }
+        for (i = 0, ln = items.length; i < ln; i++) {
+            if (items[i] && this.isItemInPoint(x, y, items[i], i)) {
+                return items[i];
+            }
+        }
+
+        return null;
+    },
+
+    isItemInPoint: function(x, y, item, i) {
+        return false;
+    },
+
+    
+    hideAll: function() {
+        var me = this,
+            items = me.items,
+            item, len, i, j, l, sprite, shadows;
+
+        me.seriesIsHidden = true;
+        me._prevShowMarkers = me.showMarkers;
+
+        me.showMarkers = false;
+        
+        me.hideLabels(0);
+        
+        for (i = 0, len = items.length; i < len; i++) {
+            item = items[i];
+            sprite = item.sprite;
+            if (sprite) {
+                sprite.setAttributes({
+                    hidden: true
+                }, true);
+            }
+
+            if (sprite && sprite.shadows) {
+                shadows = sprite.shadows;
+                for (j = 0, l = shadows.length; j < l; ++j) {
+                    shadows[j].setAttributes({
+                        hidden: true
+                    }, true);
+                }
+            }
+        }
+    },
+
+    
+    showAll: function() {
+        var me = this,
+            prevAnimate = me.chart.animate;
+        me.chart.animate = false;
+        me.seriesIsHidden = false;
+        me.showMarkers = me._prevShowMarkers;
+        me.drawSeries();
+        me.chart.animate = prevAnimate;
+    },
+
+    
+    getLegendColor: function(index) {
+        var me = this, fill, stroke;
+        if (me.seriesStyle) {
+            fill = me.seriesStyle.fill;
+            stroke = me.seriesStyle.stroke;
+            if (fill && fill != 'none') {
+                return fill;
+            }
+            return stroke;
+        }
+        return '#000';
+    },
+
+    
+    visibleInLegend: function(index){
+        var excludes = this.__excludes;
+        if (excludes) {
+            return !excludes[index];
+        }
+        return !this.seriesIsHidden;
+    },
+
+    
+    setTitle: function(index, title) {
+        var me = this,
+            oldTitle = me.title;
+
+        if (Ext.isString(index)) {
+            title = index;
+            index = 0;
+        }
+
+        if (Ext.isArray(oldTitle)) {
+            oldTitle[index] = title;
+        } else {
+            me.title = title;
+        }
+
+        me.fireEvent('titlechange', title, index);
+    }
+});
+
+
+Ext.define('Ext.chart.series.Cartesian', {
+
+    
+
+    extend: 'Ext.chart.series.Series',
+
+    alternateClassName: ['Ext.chart.CartesianSeries', 'Ext.chart.CartesianChart'],
+
+    
+
+    
+    xField: null,
+
+    
+    yField: null,
+
+    
+    axis: 'left',
+
+    getLegendLabels: function() {
+        var me = this,
+            labels = [],
+            combinations = me.combinations;
+
+        Ext.each([].concat(me.yField), function(yField, i) {
+            var title = me.title;
+            
+            labels.push((Ext.isArray(title) ? title[i] : title) || yField);
+        });
+
+        
+        if (combinations) {
+            Ext.each(combinations, function(combo) {
+                var label0 = labels[combo[0]],
+                    label1 = labels[combo[1]];
+                labels[combo[1]] = label0 + ' & ' + label1;
+                labels.splice(combo[0], 1);
+            });
+        }
+
+        return labels;
+    },
+
+    
+    eachYValue: function(record, fn, scope) {
+        Ext.each(this.getYValueAccessors(), function(accessor, i) {
+            fn.call(scope, accessor(record), i);
+        });
+    },
+
+    
+    getYValueCount: function() {
+        return this.getYValueAccessors().length;
+    },
+
+    combine: function(index1, index2) {
+        var me = this,
+            accessors = me.getYValueAccessors(),
+            accessor1 = accessors[index1],
+            accessor2 = accessors[index2];
+
+        
+        accessors[index2] = function(record) {
+            return accessor1(record) + accessor2(record);
+        };
+        accessors.splice(index1, 1);
+
+        me.callParent([index1, index2]);
+    },
+
+    clearCombinations: function() {
+        
+        delete this.yValueAccessors;
+        this.callParent();
+    },
+
+    
+    getYValueAccessors: function() {
+        var me = this,
+            accessors = me.yValueAccessors;
+        if (!accessors) {
+            accessors = me.yValueAccessors = [];
+            Ext.each([].concat(me.yField), function(yField) {
+                accessors.push(function(record) {
+                    return record.get(yField);
+                });
+            });
+        }
+        return accessors;
+    },
+
+    
+    getMinMaxXValues: function() {
+        var me = this,
+            min, max,
+            xField = me.xField;
+
+        if (me.getRecordCount() > 0) {
+            min = Infinity;
+            max = -min;
+            me.eachRecord(function(record) {
+                var xValue = record.get(xField);
+                if (xValue > max) {
+                    max = xValue;
+                }
+                if (xValue < min) {
+                    min = xValue;
+                }
+            });
+        } else {
+            min = max = 0;
+        }
+        return [min, max];
+    },
+
+    
+    getMinMaxYValues: function() {
+        var me = this,
+            stacked = me.stacked,
+            min, max,
+            positiveTotal, negativeTotal;
+
+        function eachYValueStacked(yValue, i) {
+            if (!me.isExcluded(i)) {
+                if (yValue < 0) {
+                    negativeTotal += yValue;
+                } else {
+                    positiveTotal += yValue;
+                }
+            }
+        }
+
+        function eachYValue(yValue, i) {
+            if (!me.isExcluded(i)) {
+                if (yValue > max) {
+                    max = yValue;
+                }
+                if (yValue < min) {
+                    min = yValue;
+                }
+            }
+        }
+
+        if (me.getRecordCount() > 0) {
+            min = Infinity;
+            max = -min;
+            me.eachRecord(function(record) {
+                if (stacked) {
+                    positiveTotal = 0;
+                    negativeTotal = 0;
+                    me.eachYValue(record, eachYValueStacked);
+                    if (positiveTotal > max) {
+                        max = positiveTotal;
+                    }
+                    if (negativeTotal < min) {
+                        min = negativeTotal;
+                    }
+                } else {
+                    me.eachYValue(record, eachYValue);
+                }
+            });
+        } else {
+            min = max = 0;
+        }
+        return [min, max];
+    },
+
+    getAxesForXAndYFields: function() {
+        var me = this,
+            axes = me.chart.axes,
+            axis = [].concat(me.axis),
+            xAxis, yAxis;
+
+        if (Ext.Array.indexOf(axis, 'top') > -1) {
+            xAxis = 'top';
+        } else if (Ext.Array.indexOf(axis, 'bottom') > -1) {
+            xAxis = 'bottom';
+        } else {
+            if (axes.get('top')) {
+                xAxis = 'top';
+            } else if (axes.get('bottom')) {
+                xAxis = 'bottom';
+            }
+        }
+
+        if (Ext.Array.indexOf(axis, 'left') > -1) {
+            yAxis = 'left';
+        } else if (Ext.Array.indexOf(axis, 'right') > -1) {
+            yAxis = 'right';
+        } else {
+            if (axes.get('left')) {
+                yAxis = 'left';
+            } else if (axes.get('right')) {
+                yAxis = 'right';
+            }
+        }
+
+        return {
+            xAxis: xAxis,
+            yAxis: yAxis
+        };
+    }
+
+
+});
+
+
+Ext.define('Ext.chart.series.Area', {
+
+    
+
+    extend: 'Ext.chart.series.Cartesian',
+
+    alias: 'series.area',
+
+    requires: ['Ext.chart.axis.Axis', 'Ext.draw.Color', 'Ext.fx.Anim'],
+
+    
+
+    type: 'area',
+
+    
+    stacked: true,
+
+    
+    style: {},
+
+    constructor: function(config) {
+        this.callParent(arguments);
+        var me = this,
+            surface = me.chart.surface,
+            i, l;
+        Ext.apply(me, config, {
+            __excludes: [],
+            highlightCfg: {
+                lineWidth: 3,
+                stroke: '#55c',
+                opacity: 0.8,
+                color: '#f00'
+            }
+        });
+        if (me.highlight) {
+            me.highlightSprite = surface.add({
+                type: 'path',
+                path: ['M', 0, 0],
+                zIndex: 1000,
+                opacity: 0.3,
+                lineWidth: 5,
+                hidden: true,
+                stroke: '#444'
+            });
+        }
+        me.group = surface.getGroup(me.seriesId);
+    },
+
+    
+    shrink: function(xValues, yValues, size) {
+        var len = xValues.length,
+            ratio = Math.floor(len / size),
+            i, j,
+            xSum = 0,
+            yCompLen = this.areas.length,
+            ySum = [],
+            xRes = [],
+            yRes = [];
+        
+        for (j = 0; j < yCompLen; ++j) {
+            ySum[j] = 0;
+        }
+        for (i = 0; i < len; ++i) {
+            xSum += xValues[i];
+            for (j = 0; j < yCompLen; ++j) {
+                ySum[j] += yValues[i][j];
+            }
+            if (i % ratio == 0) {
+                
+                xRes.push(xSum/ratio);
+                for (j = 0; j < yCompLen; ++j) {
+                    ySum[j] /= ratio;
+                }
+                yRes.push(ySum);
+                
+                xSum = 0;
+                for (j = 0, ySum = []; j < yCompLen; ++j) {
+                    ySum[j] = 0;
+                }
+            }
+        }
+        return {
+            x: xRes,
+            y: yRes
+        };
+    },
+
+    
+    getBounds: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            areas = [].concat(me.yField),
+            areasLen = areas.length,
+            xValues = [],
+            yValues = [],
+            infinity = Infinity,
+            minX = infinity,
+            minY = infinity,
+            maxX = -infinity,
+            maxY = -infinity,
+            math = Math,
+            mmin = math.min,
+            mmax = math.max,
+            bbox, xScale, yScale, xValue, yValue, areaIndex, acumY, ln, sumValues, clipBox, areaElem;
+
+        me.setBBox();
+        bbox = me.bbox;
+
+        
+        if (me.axis) {
+            axis = chart.axes.get(me.axis);
+            if (axis) {
+                out = axis.calcEnds();
+                minY = out.from || axis.prevMin;
+                maxY = mmax(out.to || axis.prevMax, 0);
+            }
+        }
+
+        if (me.yField && !Ext.isNumber(minY)) {
+            axis = Ext.create('Ext.chart.axis.Axis', {
+                chart: chart,
+                fields: [].concat(me.yField)
+            });
+            out = axis.calcEnds();
+            minY = out.from || axis.prevMin;
+            maxY = mmax(out.to || axis.prevMax, 0);
+        }
+
+        if (!Ext.isNumber(minY)) {
+            minY = 0;
+        }
+        if (!Ext.isNumber(maxY)) {
+            maxY = 0;
+        }
+
+        store.each(function(record, i) {
+            xValue = record.get(me.xField);
+            yValue = [];
+            if (typeof xValue != 'number') {
+                xValue = i;
+            }
+            xValues.push(xValue);
+            acumY = 0;
+            for (areaIndex = 0; areaIndex < areasLen; areaIndex++) {
+                areaElem = record.get(areas[areaIndex]);
+                if (typeof areaElem == 'number') {
+                    minY = mmin(minY, areaElem);
+                    yValue.push(areaElem);
+                    acumY += areaElem;
+                }
+            }
+            minX = mmin(minX, xValue);
+            maxX = mmax(maxX, xValue);
+            maxY = mmax(maxY, acumY);
+            yValues.push(yValue);
+        }, me);
+
+        xScale = bbox.width / ((maxX - minX) || 1);
+        yScale = bbox.height / ((maxY - minY) || 1);
+
+        ln = xValues.length;
+        if ((ln > bbox.width) && me.areas) {
+            sumValues = me.shrink(xValues, yValues, bbox.width);
+            xValues = sumValues.x;
+            yValues = sumValues.y;
+        }
+
+        return {
+            bbox: bbox,
+            minX: minX,
+            minY: minY,
+            xValues: xValues,
+            yValues: yValues,
+            xScale: xScale,
+            yScale: yScale,
+            areasLen: areasLen
+        };
+    },
+
+    
+    getPaths: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            first = true,
+            bounds = me.getBounds(),
+            bbox = bounds.bbox,
+            items = me.items = [],
+            componentPaths = [],
+            componentPath,
+            paths = [],
+            i, ln, x, y, xValue, yValue, acumY, areaIndex, prevAreaIndex, areaElem, path;
+
+        ln = bounds.xValues.length;
+        
+        for (i = 0; i < ln; i++) {
+            xValue = bounds.xValues[i];
+            yValue = bounds.yValues[i];
+            x = bbox.x + (xValue - bounds.minX) * bounds.xScale;
+            acumY = 0;
+            for (areaIndex = 0; areaIndex < bounds.areasLen; areaIndex++) {
+                
+                if (me.__excludes[areaIndex]) {
+                    continue;
+                }
+                if (!componentPaths[areaIndex]) {
+                    componentPaths[areaIndex] = [];
+                }
+                areaElem = yValue[areaIndex];
+                acumY += areaElem;
+                y = bbox.y + bbox.height - (acumY - bounds.minY) * bounds.yScale;
+                if (!paths[areaIndex]) {
+                    paths[areaIndex] = ['M', x, y];
+                    componentPaths[areaIndex].push(['L', x, y]);
+                } else {
+                    paths[areaIndex].push('L', x, y);
+                    componentPaths[areaIndex].push(['L', x, y]);
+                }
+                if (!items[areaIndex]) {
+                    items[areaIndex] = {
+                        pointsUp: [],
+                        pointsDown: [],
+                        series: me
+                    };
+                }
+                items[areaIndex].pointsUp.push([x, y]);
+            }
+        }
+
+        
+        for (areaIndex = 0; areaIndex < bounds.areasLen; areaIndex++) {
+            
+            if (me.__excludes[areaIndex]) {
+                continue;
+            }
+            path = paths[areaIndex];
+            
+            if (areaIndex == 0 || first) {
+                first = false;
+                path.push('L', x, bbox.y + bbox.height,
+                          'L', bbox.x, bbox.y + bbox.height,
+                          'Z');
+            }
+            
+            else {
+                componentPath = componentPaths[prevAreaIndex];
+                componentPath.reverse();
+                path.push('L', x, componentPath[0][2]);
+                for (i = 0; i < ln; i++) {
+                    path.push(componentPath[i][0],
+                              componentPath[i][1],
+                              componentPath[i][2]);
+                    items[areaIndex].pointsDown[ln -i -1] = [componentPath[i][1], componentPath[i][2]];
+                }
+                path.push('L', bbox.x, path[2], 'Z');
+            }
+            prevAreaIndex = areaIndex;
+        }
+        return {
+            paths: paths,
+            areasLen: bounds.areasLen
+        };
+    },
+
+    
+    drawSeries: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            surface = chart.surface,
+            animate = chart.animate,
+            group = me.group,
+            endLineStyle = Ext.apply(me.seriesStyle, me.style),
+            colorArrayStyle = me.colorArrayStyle,
+            colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
+            areaIndex, areaElem, paths, path, rendererAttributes;
+
+        me.unHighlightItem();
+        me.cleanHighlights();
+
+        if (!store || !store.getCount()) {
+            return;
+        }
+
+        paths = me.getPaths();
+
+        if (!me.areas) {
+            me.areas = [];
+        }
+
+        for (areaIndex = 0; areaIndex < paths.areasLen; areaIndex++) {
+            
+            if (me.__excludes[areaIndex]) {
+                continue;
+            }
+            if (!me.areas[areaIndex]) {
+                me.items[areaIndex].sprite = me.areas[areaIndex] = surface.add(Ext.apply({}, {
+                    type: 'path',
+                    group: group,
+                    
+                    path: paths.paths[areaIndex],
+                    stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength],
+                    fill: colorArrayStyle[areaIndex % colorArrayLength]
+                }, endLineStyle || {}));
+            }
+            areaElem = me.areas[areaIndex];
+            path = paths.paths[areaIndex];
+            if (animate) {
+                
+                rendererAttributes = me.renderer(areaElem, false, {
+                    path: path,
+                    
+                    fill: colorArrayStyle[areaIndex % colorArrayLength],
+                    stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength]
+                }, areaIndex, store);
+                
+                me.animation = me.onAnimate(areaElem, {
+                    to: rendererAttributes
+                });
+            } else {
+                rendererAttributes = me.renderer(areaElem, false, {
+                    path: path,
+                    
+                    hidden: false,
+                    fill: colorArrayStyle[areaIndex % colorArrayLength],
+                    stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength]
+                }, areaIndex, store);
+                me.areas[areaIndex].setAttributes(rendererAttributes, true);
+            }
+        }
+        me.renderLabels();
+        me.renderCallouts();
+    },
+
+    
+    onAnimate: function(sprite, attr) {
+        sprite.show();
+        return this.callParent(arguments);
+    },
+
+    
+    onCreateLabel: function(storeItem, item, i, display) {
+        var me = this,
+            group = me.labelsGroup,
+            config = me.label,
+            bbox = me.bbox,
+            endLabelStyle = Ext.apply(config, me.seriesLabelStyle);
+
+        return me.chart.surface.add(Ext.apply({
+            'type': 'text',
+            'text-anchor': 'middle',
+            'group': group,
+            'x': item.point[0],
+            'y': bbox.y + bbox.height / 2
+        }, endLabelStyle || {}));
+    },
+
+    
+    onPlaceLabel: function(label, storeItem, item, i, display, animate, index) {
+        var me = this,
+            chart = me.chart,
+            resizing = chart.resizing,
+            config = me.label,
+            format = config.renderer,
+            field = config.field,
+            bbox = me.bbox,
+            x = item.point[0],
+            y = item.point[1],
+            bb, width, height;
+
+        label.setAttributes({
+            text: format(storeItem.get(field[index])),
+            hidden: true
+        }, true);
+
+        bb = label.getBBox();
+        width = bb.width / 2;
+        height = bb.height / 2;
+
+        x = x - width < bbox.x? bbox.x + width : x;
+        x = (x + width > bbox.x + bbox.width) ? (x - (x + width - bbox.x - bbox.width)) : x;
+        y = y - height < bbox.y? bbox.y + height : y;
+        y = (y + height > bbox.y + bbox.height) ? (y - (y + height - bbox.y - bbox.height)) : y;
+
+        if (me.chart.animate && !me.chart.resizing) {
+            label.show(true);
+            me.onAnimate(label, {
+                to: {
+                    x: x,
+                    y: y
+                }
+            });
+        } else {
+            label.setAttributes({
+                x: x,
+                y: y
+            }, true);
+            if (resizing) {
+                me.animation.on('afteranimate', function() {
+                    label.show(true);
+                });
+            } else {
+                label.show(true);
+            }
+        }
+    },
+
+    
+    onPlaceCallout : function(callout, storeItem, item, i, display, animate, index) {
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            resizing = chart.resizing,
+            config = me.callouts,
+            items = me.items,
+            prev = (i == 0) ? false : items[i -1].point,
+            next = (i == items.length -1) ? false : items[i +1].point,
+            cur = item.point,
+            dir, norm, normal, a, aprev, anext,
+            bbox = callout.label.getBBox(),
+            offsetFromViz = 30,
+            offsetToSide = 10,
+            offsetBox = 3,
+            boxx, boxy, boxw, boxh,
+            p, clipRect = me.clipRect,
+            x, y;
+
+        
+        if (!prev) {
+            prev = cur;
+        }
+        if (!next) {
+            next = cur;
+        }
+        a = (next[1] - prev[1]) / (next[0] - prev[0]);
+        aprev = (cur[1] - prev[1]) / (cur[0] - prev[0]);
+        anext = (next[1] - cur[1]) / (next[0] - cur[0]);
+
+        norm = Math.sqrt(1 + a * a);
+        dir = [1 / norm, a / norm];
+        normal = [-dir[1], dir[0]];
+
+        
+        if (aprev > 0 && anext < 0 && normal[1] < 0 || aprev < 0 && anext > 0 && normal[1] > 0) {
+            normal[0] *= -1;
+            normal[1] *= -1;
+        } else if (Math.abs(aprev) < Math.abs(anext) && normal[0] < 0 || Math.abs(aprev) > Math.abs(anext) && normal[0] > 0) {
+            normal[0] *= -1;
+            normal[1] *= -1;
+        }
+
+        
+        x = cur[0] + normal[0] * offsetFromViz;
+        y = cur[1] + normal[1] * offsetFromViz;
+
+        
+        boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
+        boxy = y - bbox.height /2 - offsetBox;
+        boxw = bbox.width + 2 * offsetBox;
+        boxh = bbox.height + 2 * offsetBox;
+
+        
+        
+        if (boxx < clipRect[0] || (boxx + boxw) > (clipRect[0] + clipRect[2])) {
+            normal[0] *= -1;
+        }
+        if (boxy < clipRect[1] || (boxy + boxh) > (clipRect[1] + clipRect[3])) {
+            normal[1] *= -1;
+        }
+
+        
+        x = cur[0] + normal[0] * offsetFromViz;
+        y = cur[1] + normal[1] * offsetFromViz;
+
+        
+        boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
+        boxy = y - bbox.height /2 - offsetBox;
+        boxw = bbox.width + 2 * offsetBox;
+        boxh = bbox.height + 2 * offsetBox;
+
+        
+        callout.lines.setAttributes({
+            path: ["M", cur[0], cur[1], "L", x, y, "Z"]
+        }, true);
+        
+        callout.box.setAttributes({
+            x: boxx,
+            y: boxy,
+            width: boxw,
+            height: boxh
+        }, true);
+        
+        callout.label.setAttributes({
+            x: x + (normal[0] > 0? offsetBox : -(bbox.width + offsetBox)),
+            y: y
+        }, true);
+        for (p in callout) {
+            callout[p].show(true);
+        }
+    },
+
+    isItemInPoint: function(x, y, item, i) {
+        var me = this,
+            pointsUp = item.pointsUp,
+            pointsDown = item.pointsDown,
+            abs = Math.abs,
+            dist = Infinity, p, pln, point;
+
+        for (p = 0, pln = pointsUp.length; p < pln; p++) {
+            point = [pointsUp[p][0], pointsUp[p][1]];
+            if (dist > abs(x - point[0])) {
+                dist = abs(x - point[0]);
+            } else {
+                point = pointsUp[p -1];
+                if (y >= point[1] && (!pointsDown.length || y <= (pointsDown[p -1][1]))) {
+                    item.storeIndex = p -1;
+                    item.storeField = me.yField[i];
+                    item.storeItem = me.chart.store.getAt(p -1);
+                    item._points = pointsDown.length? [point, pointsDown[p -1]] : [point];
+                    return true;
+                } else {
+                    break;
+                }
+            }
+        }
+        return false;
+    },
+
+    
+    highlightSeries: function() {
+        var area, to, fillColor;
+        if (this._index !== undefined) {
+            area = this.areas[this._index];
+            if (area.__highlightAnim) {
+                area.__highlightAnim.paused = true;
+            }
+            area.__highlighted = true;
+            area.__prevOpacity = area.__prevOpacity || area.attr.opacity || 1;
+            area.__prevFill = area.__prevFill || area.attr.fill;
+            area.__prevLineWidth = area.__prevLineWidth || area.attr.lineWidth;
+            fillColor = Ext.draw.Color.fromString(area.__prevFill);
+            to = {
+                lineWidth: (area.__prevLineWidth || 0) + 2
+            };
+            if (fillColor) {
+                to.fill = fillColor.getLighter(0.2).toString();
+            }
+            else {
+                to.opacity = Math.max(area.__prevOpacity - 0.3, 0);
+            }
+            if (this.chart.animate) {
+                area.__highlightAnim = Ext.create('Ext.fx.Anim', Ext.apply({
+                    target: area,
+                    to: to
+                }, this.chart.animate));
+            }
+            else {
+                area.setAttributes(to, true);
+            }
+        }
+    },
+
+    
+    unHighlightSeries: function() {
+        var area;
+        if (this._index !== undefined) {
+            area = this.areas[this._index];
+            if (area.__highlightAnim) {
+                area.__highlightAnim.paused = true;
+            }
+            if (area.__highlighted) {
+                area.__highlighted = false;
+                area.__highlightAnim = Ext.create('Ext.fx.Anim', {
+                    target: area,
+                    to: {
+                        fill: area.__prevFill,
+                        opacity: area.__prevOpacity,
+                        lineWidth: area.__prevLineWidth
+                    }
+                });
+            }
+        }
+    },
+
+    
+    highlightItem: function(item) {
+        var me = this,
+            points, path;
+        if (!item) {
+            this.highlightSeries();
+            return;
+        }
+        points = item._points;
+        path = points.length == 2? ['M', points[0][0], points[0][1], 'L', points[1][0], points[1][1]]
+                : ['M', points[0][0], points[0][1], 'L', points[0][0], me.bbox.y + me.bbox.height];
+        me.highlightSprite.setAttributes({
+            path: path,
+            hidden: false
+        }, true);
+    },
+
+    
+    unHighlightItem: function(item) {
+        if (!item) {
+            this.unHighlightSeries();
+        }
+
+        if (this.highlightSprite) {
+            this.highlightSprite.hide(true);
+        }
+    },
+
+    
+    hideAll: function() {
+        if (!isNaN(this._index)) {
+            this.__excludes[this._index] = true;
+            this.areas[this._index].hide(true);
+            this.drawSeries();
+        }
+    },
+
+    
+    showAll: function() {
+        if (!isNaN(this._index)) {
+            this.__excludes[this._index] = false;
+            this.areas[this._index].show(true);
+            this.drawSeries();
+        }
+    },
+
+    
+    getLegendColor: function(index) {
+        var me = this;
+        return me.colorArrayStyle[index % me.colorArrayStyle.length];
+    }
+});
+
+Ext.define('Ext.chart.series.Area', {
+
+    
+
+    extend: 'Ext.chart.series.Cartesian',
+
+    alias: 'series.area',
+
+    requires: ['Ext.chart.axis.Axis', 'Ext.draw.Color', 'Ext.fx.Anim'],
+
+    
+
+    type: 'area',
+
+    
+    stacked: true,
+
+    
+    style: {},
+
+    constructor: function(config) {
+        this.callParent(arguments);
+        var me = this,
+            surface = me.chart.surface,
+            i, l;
+        Ext.apply(me, config, {
+            __excludes: [],
+            highlightCfg: {
+                lineWidth: 3,
+                stroke: '#55c',
+                opacity: 0.8,
+                color: '#f00'
+            }
+        });
+        if (me.highlight) {
+            me.highlightSprite = surface.add({
+                type: 'path',
+                path: ['M', 0, 0],
+                zIndex: 1000,
+                opacity: 0.3,
+                lineWidth: 5,
+                hidden: true,
+                stroke: '#444'
+            });
+        }
+        me.group = surface.getGroup(me.seriesId);
+    },
+
+    
+    shrink: function(xValues, yValues, size) {
+        var len = xValues.length,
+            ratio = Math.floor(len / size),
+            i, j,
+            xSum = 0,
+            yCompLen = this.areas.length,
+            ySum = [],
+            xRes = [],
+            yRes = [];
+        
+        for (j = 0; j < yCompLen; ++j) {
+            ySum[j] = 0;
+        }
+        for (i = 0; i < len; ++i) {
+            xSum += xValues[i];
+            for (j = 0; j < yCompLen; ++j) {
+                ySum[j] += yValues[i][j];
+            }
+            if (i % ratio == 0) {
+                
+                xRes.push(xSum/ratio);
+                for (j = 0; j < yCompLen; ++j) {
+                    ySum[j] /= ratio;
+                }
+                yRes.push(ySum);
+                
+                xSum = 0;
+                for (j = 0, ySum = []; j < yCompLen; ++j) {
+                    ySum[j] = 0;
+                }
+            }
+        }
+        return {
+            x: xRes,
+            y: yRes
+        };
+    },
+
+    
+    getBounds: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            areas = [].concat(me.yField),
+            areasLen = areas.length,
+            xValues = [],
+            yValues = [],
+            infinity = Infinity,
+            minX = infinity,
+            minY = infinity,
+            maxX = -infinity,
+            maxY = -infinity,
+            math = Math,
+            mmin = math.min,
+            mmax = math.max,
+            bbox, xScale, yScale, xValue, yValue, areaIndex, acumY, ln, sumValues, clipBox, areaElem;
+
+        me.setBBox();
+        bbox = me.bbox;
+
+        
+        if (me.axis) {
+            axis = chart.axes.get(me.axis);
+            if (axis) {
+                out = axis.calcEnds();
+                minY = out.from || axis.prevMin;
+                maxY = mmax(out.to || axis.prevMax, 0);
+            }
+        }
+
+        if (me.yField && !Ext.isNumber(minY)) {
+            axis = Ext.create('Ext.chart.axis.Axis', {
+                chart: chart,
+                fields: [].concat(me.yField)
+            });
+            out = axis.calcEnds();
+            minY = out.from || axis.prevMin;
+            maxY = mmax(out.to || axis.prevMax, 0);
+        }
+
+        if (!Ext.isNumber(minY)) {
+            minY = 0;
+        }
+        if (!Ext.isNumber(maxY)) {
+            maxY = 0;
+        }
+
+        store.each(function(record, i) {
+            xValue = record.get(me.xField);
+            yValue = [];
+            if (typeof xValue != 'number') {
+                xValue = i;
+            }
+            xValues.push(xValue);
+            acumY = 0;
+            for (areaIndex = 0; areaIndex < areasLen; areaIndex++) {
+                areaElem = record.get(areas[areaIndex]);
+                if (typeof areaElem == 'number') {
+                    minY = mmin(minY, areaElem);
+                    yValue.push(areaElem);
+                    acumY += areaElem;
+                }
+            }
+            minX = mmin(minX, xValue);
+            maxX = mmax(maxX, xValue);
+            maxY = mmax(maxY, acumY);
+            yValues.push(yValue);
+        }, me);
+
+        xScale = bbox.width / ((maxX - minX) || 1);
+        yScale = bbox.height / ((maxY - minY) || 1);
+
+        ln = xValues.length;
+        if ((ln > bbox.width) && me.areas) {
+            sumValues = me.shrink(xValues, yValues, bbox.width);
+            xValues = sumValues.x;
+            yValues = sumValues.y;
+        }
+
+        return {
+            bbox: bbox,
+            minX: minX,
+            minY: minY,
+            xValues: xValues,
+            yValues: yValues,
+            xScale: xScale,
+            yScale: yScale,
+            areasLen: areasLen
+        };
+    },
+
+    
+    getPaths: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            first = true,
+            bounds = me.getBounds(),
+            bbox = bounds.bbox,
+            items = me.items = [],
+            componentPaths = [],
+            componentPath,
+            paths = [],
+            i, ln, x, y, xValue, yValue, acumY, areaIndex, prevAreaIndex, areaElem, path;
+
+        ln = bounds.xValues.length;
+        
+        for (i = 0; i < ln; i++) {
+            xValue = bounds.xValues[i];
+            yValue = bounds.yValues[i];
+            x = bbox.x + (xValue - bounds.minX) * bounds.xScale;
+            acumY = 0;
+            for (areaIndex = 0; areaIndex < bounds.areasLen; areaIndex++) {
+                
+                if (me.__excludes[areaIndex]) {
+                    continue;
+                }
+                if (!componentPaths[areaIndex]) {
+                    componentPaths[areaIndex] = [];
+                }
+                areaElem = yValue[areaIndex];
+                acumY += areaElem;
+                y = bbox.y + bbox.height - (acumY - bounds.minY) * bounds.yScale;
+                if (!paths[areaIndex]) {
+                    paths[areaIndex] = ['M', x, y];
+                    componentPaths[areaIndex].push(['L', x, y]);
+                } else {
+                    paths[areaIndex].push('L', x, y);
+                    componentPaths[areaIndex].push(['L', x, y]);
+                }
+                if (!items[areaIndex]) {
+                    items[areaIndex] = {
+                        pointsUp: [],
+                        pointsDown: [],
+                        series: me
+                    };
+                }
+                items[areaIndex].pointsUp.push([x, y]);
+            }
+        }
+
+        
+        for (areaIndex = 0; areaIndex < bounds.areasLen; areaIndex++) {
+            
+            if (me.__excludes[areaIndex]) {
+                continue;
+            }
+            path = paths[areaIndex];
+            
+            if (areaIndex == 0 || first) {
+                first = false;
+                path.push('L', x, bbox.y + bbox.height,
+                          'L', bbox.x, bbox.y + bbox.height,
+                          'Z');
+            }
+            
+            else {
+                componentPath = componentPaths[prevAreaIndex];
+                componentPath.reverse();
+                path.push('L', x, componentPath[0][2]);
+                for (i = 0; i < ln; i++) {
+                    path.push(componentPath[i][0],
+                              componentPath[i][1],
+                              componentPath[i][2]);
+                    items[areaIndex].pointsDown[ln -i -1] = [componentPath[i][1], componentPath[i][2]];
+                }
+                path.push('L', bbox.x, path[2], 'Z');
+            }
+            prevAreaIndex = areaIndex;
+        }
+        return {
+            paths: paths,
+            areasLen: bounds.areasLen
+        };
+    },
+
+    
+    drawSeries: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            surface = chart.surface,
+            animate = chart.animate,
+            group = me.group,
+            endLineStyle = Ext.apply(me.seriesStyle, me.style),
+            colorArrayStyle = me.colorArrayStyle,
+            colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
+            areaIndex, areaElem, paths, path, rendererAttributes;
+
+        me.unHighlightItem();
+        me.cleanHighlights();
+
+        if (!store || !store.getCount()) {
+            return;
+        }
+
+        paths = me.getPaths();
+
+        if (!me.areas) {
+            me.areas = [];
+        }
+
+        for (areaIndex = 0; areaIndex < paths.areasLen; areaIndex++) {
+            
+            if (me.__excludes[areaIndex]) {
+                continue;
+            }
+            if (!me.areas[areaIndex]) {
+                me.items[areaIndex].sprite = me.areas[areaIndex] = surface.add(Ext.apply({}, {
+                    type: 'path',
+                    group: group,
+                    
+                    path: paths.paths[areaIndex],
+                    stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength],
+                    fill: colorArrayStyle[areaIndex % colorArrayLength]
+                }, endLineStyle || {}));
+            }
+            areaElem = me.areas[areaIndex];
+            path = paths.paths[areaIndex];
+            if (animate) {
+                
+                rendererAttributes = me.renderer(areaElem, false, {
+                    path: path,
+                    
+                    fill: colorArrayStyle[areaIndex % colorArrayLength],
+                    stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength]
+                }, areaIndex, store);
+                
+                me.animation = me.onAnimate(areaElem, {
+                    to: rendererAttributes
+                });
+            } else {
+                rendererAttributes = me.renderer(areaElem, false, {
+                    path: path,
+                    
+                    hidden: false,
+                    fill: colorArrayStyle[areaIndex % colorArrayLength],
+                    stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength]
+                }, areaIndex, store);
+                me.areas[areaIndex].setAttributes(rendererAttributes, true);
+            }
+        }
+        me.renderLabels();
+        me.renderCallouts();
+    },
+
+    
+    onAnimate: function(sprite, attr) {
+        sprite.show();
+        return this.callParent(arguments);
+    },
+
+    
+    onCreateLabel: function(storeItem, item, i, display) {
+        var me = this,
+            group = me.labelsGroup,
+            config = me.label,
+            bbox = me.bbox,
+            endLabelStyle = Ext.apply(config, me.seriesLabelStyle);
+
+        return me.chart.surface.add(Ext.apply({
+            'type': 'text',
+            'text-anchor': 'middle',
+            'group': group,
+            'x': item.point[0],
+            'y': bbox.y + bbox.height / 2
+        }, endLabelStyle || {}));
+    },
+
+    
+    onPlaceLabel: function(label, storeItem, item, i, display, animate, index) {
+        var me = this,
+            chart = me.chart,
+            resizing = chart.resizing,
+            config = me.label,
+            format = config.renderer,
+            field = config.field,
+            bbox = me.bbox,
+            x = item.point[0],
+            y = item.point[1],
+            bb, width, height;
+
+        label.setAttributes({
+            text: format(storeItem.get(field[index])),
+            hidden: true
+        }, true);
+
+        bb = label.getBBox();
+        width = bb.width / 2;
+        height = bb.height / 2;
+
+        x = x - width < bbox.x? bbox.x + width : x;
+        x = (x + width > bbox.x + bbox.width) ? (x - (x + width - bbox.x - bbox.width)) : x;
+        y = y - height < bbox.y? bbox.y + height : y;
+        y = (y + height > bbox.y + bbox.height) ? (y - (y + height - bbox.y - bbox.height)) : y;
+
+        if (me.chart.animate && !me.chart.resizing) {
+            label.show(true);
+            me.onAnimate(label, {
+                to: {
+                    x: x,
+                    y: y
+                }
+            });
+        } else {
+            label.setAttributes({
+                x: x,
+                y: y
+            }, true);
+            if (resizing) {
+                me.animation.on('afteranimate', function() {
+                    label.show(true);
+                });
+            } else {
+                label.show(true);
+            }
+        }
+    },
+
+    
+    onPlaceCallout : function(callout, storeItem, item, i, display, animate, index) {
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            resizing = chart.resizing,
+            config = me.callouts,
+            items = me.items,
+            prev = (i == 0) ? false : items[i -1].point,
+            next = (i == items.length -1) ? false : items[i +1].point,
+            cur = item.point,
+            dir, norm, normal, a, aprev, anext,
+            bbox = callout.label.getBBox(),
+            offsetFromViz = 30,
+            offsetToSide = 10,
+            offsetBox = 3,
+            boxx, boxy, boxw, boxh,
+            p, clipRect = me.clipRect,
+            x, y;
+
+        
+        if (!prev) {
+            prev = cur;
+        }
+        if (!next) {
+            next = cur;
+        }
+        a = (next[1] - prev[1]) / (next[0] - prev[0]);
+        aprev = (cur[1] - prev[1]) / (cur[0] - prev[0]);
+        anext = (next[1] - cur[1]) / (next[0] - cur[0]);
+
+        norm = Math.sqrt(1 + a * a);
+        dir = [1 / norm, a / norm];
+        normal = [-dir[1], dir[0]];
+
+        
+        if (aprev > 0 && anext < 0 && normal[1] < 0 || aprev < 0 && anext > 0 && normal[1] > 0) {
+            normal[0] *= -1;
+            normal[1] *= -1;
+        } else if (Math.abs(aprev) < Math.abs(anext) && normal[0] < 0 || Math.abs(aprev) > Math.abs(anext) && normal[0] > 0) {
+            normal[0] *= -1;
+            normal[1] *= -1;
+        }
+
+        
+        x = cur[0] + normal[0] * offsetFromViz;
+        y = cur[1] + normal[1] * offsetFromViz;
+
+        
+        boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
+        boxy = y - bbox.height /2 - offsetBox;
+        boxw = bbox.width + 2 * offsetBox;
+        boxh = bbox.height + 2 * offsetBox;
+
+        
+        
+        if (boxx < clipRect[0] || (boxx + boxw) > (clipRect[0] + clipRect[2])) {
+            normal[0] *= -1;
+        }
+        if (boxy < clipRect[1] || (boxy + boxh) > (clipRect[1] + clipRect[3])) {
+            normal[1] *= -1;
+        }
+
+        
+        x = cur[0] + normal[0] * offsetFromViz;
+        y = cur[1] + normal[1] * offsetFromViz;
+
+        
+        boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
+        boxy = y - bbox.height /2 - offsetBox;
+        boxw = bbox.width + 2 * offsetBox;
+        boxh = bbox.height + 2 * offsetBox;
+
+        
+        callout.lines.setAttributes({
+            path: ["M", cur[0], cur[1], "L", x, y, "Z"]
+        }, true);
+        
+        callout.box.setAttributes({
+            x: boxx,
+            y: boxy,
+            width: boxw,
+            height: boxh
+        }, true);
+        
+        callout.label.setAttributes({
+            x: x + (normal[0] > 0? offsetBox : -(bbox.width + offsetBox)),
+            y: y
+        }, true);
+        for (p in callout) {
+            callout[p].show(true);
+        }
+    },
+
+    isItemInPoint: function(x, y, item, i) {
+        var me = this,
+            pointsUp = item.pointsUp,
+            pointsDown = item.pointsDown,
+            abs = Math.abs,
+            dist = Infinity, p, pln, point;
+
+        for (p = 0, pln = pointsUp.length; p < pln; p++) {
+            point = [pointsUp[p][0], pointsUp[p][1]];
+            if (dist > abs(x - point[0])) {
+                dist = abs(x - point[0]);
+            } else {
+                point = pointsUp[p -1];
+                if (y >= point[1] && (!pointsDown.length || y <= (pointsDown[p -1][1]))) {
+                    item.storeIndex = p -1;
+                    item.storeField = me.yField[i];
+                    item.storeItem = me.chart.store.getAt(p -1);
+                    item._points = pointsDown.length? [point, pointsDown[p -1]] : [point];
+                    return true;
+                } else {
+                    break;
+                }
+            }
+        }
+        return false;
+    },
+
+    
+    highlightSeries: function() {
+        var area, to, fillColor;
+        if (this._index !== undefined) {
+            area = this.areas[this._index];
+            if (area.__highlightAnim) {
+                area.__highlightAnim.paused = true;
+            }
+            area.__highlighted = true;
+            area.__prevOpacity = area.__prevOpacity || area.attr.opacity || 1;
+            area.__prevFill = area.__prevFill || area.attr.fill;
+            area.__prevLineWidth = area.__prevLineWidth || area.attr.lineWidth;
+            fillColor = Ext.draw.Color.fromString(area.__prevFill);
+            to = {
+                lineWidth: (area.__prevLineWidth || 0) + 2
+            };
+            if (fillColor) {
+                to.fill = fillColor.getLighter(0.2).toString();
+            }
+            else {
+                to.opacity = Math.max(area.__prevOpacity - 0.3, 0);
+            }
+            if (this.chart.animate) {
+                area.__highlightAnim = Ext.create('Ext.fx.Anim', Ext.apply({
+                    target: area,
+                    to: to
+                }, this.chart.animate));
+            }
+            else {
+                area.setAttributes(to, true);
+            }
+        }
+    },
+
+    
+    unHighlightSeries: function() {
+        var area;
+        if (this._index !== undefined) {
+            area = this.areas[this._index];
+            if (area.__highlightAnim) {
+                area.__highlightAnim.paused = true;
+            }
+            if (area.__highlighted) {
+                area.__highlighted = false;
+                area.__highlightAnim = Ext.create('Ext.fx.Anim', {
+                    target: area,
+                    to: {
+                        fill: area.__prevFill,
+                        opacity: area.__prevOpacity,
+                        lineWidth: area.__prevLineWidth
+                    }
+                });
+            }
+        }
+    },
+
+    
+    highlightItem: function(item) {
+        var me = this,
+            points, path;
+        if (!item) {
+            this.highlightSeries();
+            return;
+        }
+        points = item._points;
+        path = points.length == 2? ['M', points[0][0], points[0][1], 'L', points[1][0], points[1][1]]
+                : ['M', points[0][0], points[0][1], 'L', points[0][0], me.bbox.y + me.bbox.height];
+        me.highlightSprite.setAttributes({
+            path: path,
+            hidden: false
+        }, true);
+    },
+
+    
+    unHighlightItem: function(item) {
+        if (!item) {
+            this.unHighlightSeries();
+        }
+
+        if (this.highlightSprite) {
+            this.highlightSprite.hide(true);
+        }
+    },
+
+    
+    hideAll: function() {
+        if (!isNaN(this._index)) {
+            this.__excludes[this._index] = true;
+            this.areas[this._index].hide(true);
+            this.drawSeries();
+        }
+    },
+
+    
+    showAll: function() {
+        if (!isNaN(this._index)) {
+            this.__excludes[this._index] = false;
+            this.areas[this._index].show(true);
+            this.drawSeries();
+        }
+    },
+
+    
+    getLegendColor: function(index) {
+        var me = this;
+        return me.colorArrayStyle[index % me.colorArrayStyle.length];
+    }
+});
+
+
+Ext.define('Ext.chart.series.Bar', {
+
+    
+
+    extend: 'Ext.chart.series.Cartesian',
+
+    alternateClassName: ['Ext.chart.BarSeries', 'Ext.chart.BarChart', 'Ext.chart.StackedBarChart'],
+
+    requires: ['Ext.chart.axis.Axis', 'Ext.fx.Anim'],
+
+    
+
+    type: 'bar',
+
+    alias: 'series.bar',
+    
+    column: false,
+
+    
+    style: {},
+
+    
+    gutter: 38.2,
+
+    
+    groupGutter: 38.2,
+
+    
+    xPadding: 0,
+
+    
+    yPadding: 10,
+
+    constructor: function(config) {
+        this.callParent(arguments);
+        var me = this,
+            surface = me.chart.surface,
+            shadow = me.chart.shadow,
+            i, l;
+        Ext.apply(me, config, {
+            highlightCfg: {
+                lineWidth: 3,
+                stroke: '#55c',
+                opacity: 0.8,
+                color: '#f00'
+            },
+
+            shadowAttributes: [{
+                "stroke-width": 6,
+                "stroke-opacity": 0.05,
+                stroke: 'rgb(200, 200, 200)',
+                translate: {
+                    x: 1.2,
+                    y: 1.2
+                }
+            }, {
+                "stroke-width": 4,
+                "stroke-opacity": 0.1,
+                stroke: 'rgb(150, 150, 150)',
+                translate: {
+                    x: 0.9,
+                    y: 0.9
+                }
+            }, {
+                "stroke-width": 2,
+                "stroke-opacity": 0.15,
+                stroke: 'rgb(100, 100, 100)',
+                translate: {
+                    x: 0.6,
+                    y: 0.6
+                }
+            }]
+        });
+        me.group = surface.getGroup(me.seriesId + '-bars');
+        if (shadow) {
+            for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
+                me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
+            }
+        }
+    },
+
+    
+    getBarGirth: function() {
+        var me = this,
+            store = me.chart.getChartStore(),
+            column = me.column,
+            ln = store.getCount(),
+            gutter = me.gutter / 100;
+
+        return (me.chart.chartBBox[column ? 'width' : 'height'] - me[column ? 'xPadding' : 'yPadding'] * 2) / (ln * (gutter + 1) - gutter);
+    },
+
+    
+    getGutters: function() {
+        var me = this,
+            column = me.column,
+            gutter = Math.ceil(me[column ? 'xPadding' : 'yPadding'] + me.getBarGirth() / 2);
+        return me.column ? [gutter, 0] : [0, gutter];
+    },
+
+    
+    getBounds: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            bars = [].concat(me.yField),
+            barsLen = bars.length,
+            groupBarsLen = barsLen,
+            groupGutter = me.groupGutter / 100,
+            column = me.column,
+            xPadding = me.xPadding,
+            yPadding = me.yPadding,
+            stacked = me.stacked,
+            barWidth = me.getBarGirth(),
+            math = Math,
+            mmax = math.max,
+            mabs = math.abs,
+            groupBarWidth, bbox, minY, maxY, axis, out,
+            scale, zero, total, rec, j, plus, minus;
+
+        me.setBBox(true);
+        bbox = me.bbox;
+
+        
+        if (me.__excludes) {
+            for (j = 0, total = me.__excludes.length; j < total; j++) {
+                if (me.__excludes[j]) {
+                    groupBarsLen--;
+                }
+            }
+        }
+
+        if (me.axis) {
+            axis = chart.axes.get(me.axis);
+            if (axis) {
+                out = axis.calcEnds();
+                minY = out.from;
+                maxY = out.to;
+            }
+        }
+
+        if (me.yField && !Ext.isNumber(minY)) {
+            axis = Ext.create('Ext.chart.axis.Axis', {
+                chart: chart,
+                fields: [].concat(me.yField)
+            });
+            out = axis.calcEnds();
+            minY = out.from;
+            maxY = out.to;
+        }
+
+        if (!Ext.isNumber(minY)) {
+            minY = 0;
+        }
+        if (!Ext.isNumber(maxY)) {
+            maxY = 0;
+        }
+        scale = (column ? bbox.height - yPadding * 2 : bbox.width - xPadding * 2) / (maxY - minY);
+        groupBarWidth = barWidth / ((stacked ? 1 : groupBarsLen) * (groupGutter + 1) - groupGutter);
+        zero = (column) ? bbox.y + bbox.height - yPadding : bbox.x + xPadding;
+
+        if (stacked) {
+            total = [[], []];
+            store.each(function(record, i) {
+                total[0][i] = total[0][i] || 0;
+                total[1][i] = total[1][i] || 0;
+                for (j = 0; j < barsLen; j++) {
+                    if (me.__excludes && me.__excludes[j]) {
+                        continue;
+                    }
+                    rec = record.get(bars[j]);
+                    total[+(rec > 0)][i] += mabs(rec);
+                }
+            });
+            total[+(maxY > 0)].push(mabs(maxY));
+            total[+(minY > 0)].push(mabs(minY));
+            minus = mmax.apply(math, total[0]);
+            plus = mmax.apply(math, total[1]);
+            scale = (column ? bbox.height - yPadding * 2 : bbox.width - xPadding * 2) / (plus + minus);
+            zero = zero + minus * scale * (column ? -1 : 1);
+        }
+        else if (minY / maxY < 0) {
+            zero = zero - minY * scale * (column ? -1 : 1);
+        }
+        return {
+            bars: bars,
+            bbox: bbox,
+            barsLen: barsLen,
+            groupBarsLen: groupBarsLen,
+            barWidth: barWidth,
+            groupBarWidth: groupBarWidth,
+            scale: scale,
+            zero: zero,
+            xPadding: xPadding,
+            yPadding: yPadding,
+            signed: minY / maxY < 0,
+            minY: minY,
+            maxY: maxY
+        };
+    },
+
+    
+    getPaths: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            bounds = me.bounds = me.getBounds(),
+            items = me.items = [],
+            gutter = me.gutter / 100,
+            groupGutter = me.groupGutter / 100,
+            animate = chart.animate,
+            column = me.column,
+            group = me.group,
+            enableShadows = chart.shadow,
+            shadowGroups = me.shadowGroups,
+            shadowAttributes = me.shadowAttributes,
+            shadowGroupsLn = shadowGroups.length,
+            bbox = bounds.bbox,
+            xPadding = me.xPadding,
+            yPadding = me.yPadding,
+            stacked = me.stacked,
+            barsLen = bounds.barsLen,
+            colors = me.colorArrayStyle,
+            colorLength = colors && colors.length || 0,
+            math = Math,
+            mmax = math.max,
+            mmin = math.min,
+            mabs = math.abs,
+            j, yValue, height, totalDim, totalNegDim, bottom, top, hasShadow, barAttr, attrs, counter,
+            shadowIndex, shadow, sprite, offset, floorY;
+
+        store.each(function(record, i, total) {
+            bottom = bounds.zero;
+            top = bounds.zero;
+            totalDim = 0;
+            totalNegDim = 0;
+            hasShadow = false;
+            for (j = 0, counter = 0; j < barsLen; j++) {
+                
+                if (me.__excludes && me.__excludes[j]) {
+                    continue;
+                }
+                yValue = record.get(bounds.bars[j]);
+                height = Math.round((yValue - mmax(bounds.minY, 0)) * bounds.scale);
+                barAttr = {
+                    fill: colors[(barsLen > 1 ? j : 0) % colorLength]
+                };
+                if (column) {
+                    Ext.apply(barAttr, {
+                        height: height,
+                        width: mmax(bounds.groupBarWidth, 0),
+                        x: (bbox.x + xPadding + i * bounds.barWidth * (1 + gutter) + counter * bounds.groupBarWidth * (1 + groupGutter) * !stacked),
+                        y: bottom - height
+                    });
+                }
+                else {
+                    
+                    offset = (total - 1) - i;
+                    Ext.apply(barAttr, {
+                        height: mmax(bounds.groupBarWidth, 0),
+                        width: height + (bottom == bounds.zero),
+                        x: bottom + (bottom != bounds.zero),
+                        y: (bbox.y + yPadding + offset * bounds.barWidth * (1 + gutter) + counter * bounds.groupBarWidth * (1 + groupGutter) * !stacked + 1)
+                    });
+                }
+                if (height < 0) {
+                    if (column) {
+                        barAttr.y = top;
+                        barAttr.height = mabs(height);
+                    } else {
+                        barAttr.x = top + height;
+                        barAttr.width = mabs(height);
+                    }
+                }
+                if (stacked) {
+                    if (height < 0) {
+                        top += height * (column ? -1 : 1);
+                    } else {
+                        bottom += height * (column ? -1 : 1);
+                    }
+                    totalDim += mabs(height);
+                    if (height < 0) {
+                        totalNegDim += mabs(height);
+                    }
+                }
+                barAttr.x = Math.floor(barAttr.x) + 1;
+                floorY = Math.floor(barAttr.y);
+                if (!Ext.isIE9 && barAttr.y > floorY) {
+                    floorY--;
+                }
+                barAttr.y = floorY;
+                barAttr.width = Math.floor(barAttr.width);
+                barAttr.height = Math.floor(barAttr.height);
+                items.push({
+                    series: me,
+                    storeItem: record,
+                    value: [record.get(me.xField), yValue],
+                    attr: barAttr,
+                    point: column ? [barAttr.x + barAttr.width / 2, yValue >= 0 ? barAttr.y : barAttr.y + barAttr.height] :
+                                    [yValue >= 0 ? barAttr.x + barAttr.width : barAttr.x, barAttr.y + barAttr.height / 2]
+                });
+                
+                if (animate && chart.resizing) {
+                    attrs = column ? {
+                        x: barAttr.x,
+                        y: bounds.zero,
+                        width: barAttr.width,
+                        height: 0
+                    } : {
+                        x: bounds.zero,
+                        y: barAttr.y,
+                        width: 0,
+                        height: barAttr.height
+                    };
+                    if (enableShadows && (stacked && !hasShadow || !stacked)) {
+                        hasShadow = true;
+                        
+                        for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
+                            shadow = shadowGroups[shadowIndex].getAt(stacked ? i : (i * barsLen + j));
+                            if (shadow) {
+                                shadow.setAttributes(attrs, true);
+                            }
+                        }
+                    }
+                    
+                    sprite = group.getAt(i * barsLen + j);
+                    if (sprite) {
+                        sprite.setAttributes(attrs, true);
+                    }
+                }
+                counter++;
+            }
+            if (stacked && items.length) {
+                items[i * counter].totalDim = totalDim;
+                items[i * counter].totalNegDim = totalNegDim;
+            }
+        }, me);
+    },
+
+    
+    renderShadows: function(i, barAttr, baseAttrs, bounds) {
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            animate = chart.animate,
+            stacked = me.stacked,
+            shadowGroups = me.shadowGroups,
+            shadowAttributes = me.shadowAttributes,
+            shadowGroupsLn = shadowGroups.length,
+            store = chart.getChartStore(),
+            column = me.column,
+            items = me.items,
+            shadows = [],
+            zero = bounds.zero,
+            shadowIndex, shadowBarAttr, shadow, totalDim, totalNegDim, j, rendererAttributes;
+
+        if ((stacked && (i % bounds.groupBarsLen === 0)) || !stacked) {
+            j = i / bounds.groupBarsLen;
+            
+            for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
+                shadowBarAttr = Ext.apply({}, shadowAttributes[shadowIndex]);
+                shadow = shadowGroups[shadowIndex].getAt(stacked ? j : i);
+                Ext.copyTo(shadowBarAttr, barAttr, 'x,y,width,height');
+                if (!shadow) {
+                    shadow = surface.add(Ext.apply({
+                        type: 'rect',
+                        group: shadowGroups[shadowIndex]
+                    }, Ext.apply({}, baseAttrs, shadowBarAttr)));
+                }
+                if (stacked) {
+                    totalDim = items[i].totalDim;
+                    totalNegDim = items[i].totalNegDim;
+                    if (column) {
+                        shadowBarAttr.y = zero - totalNegDim;
+                        shadowBarAttr.height = totalDim;
+                    }
+                    else {
+                        shadowBarAttr.x = zero - totalNegDim;
+                        shadowBarAttr.width = totalDim;
+                    }
+                }
+                if (animate) {
+                    if (!stacked) {
+                        rendererAttributes = me.renderer(shadow, store.getAt(j), shadowBarAttr, i, store);
+                        me.onAnimate(shadow, { to: rendererAttributes });
+                    }
+                    else {
+                        rendererAttributes = me.renderer(shadow, store.getAt(j), Ext.apply(shadowBarAttr, { hidden: true }), i, store);
+                        shadow.setAttributes(rendererAttributes, true);
+                    }
+                }
+                else {
+                    rendererAttributes = me.renderer(shadow, store.getAt(j), Ext.apply(shadowBarAttr, { hidden: false }), i, store);
+                    shadow.setAttributes(rendererAttributes, true);
+                }
+                shadows.push(shadow);
+            }
+        }
+        return shadows;
+    },
+
+    
+    drawSeries: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            surface = chart.surface,
+            animate = chart.animate,
+            stacked = me.stacked,
+            column = me.column,
+            enableShadows = chart.shadow,
+            shadowGroups = me.shadowGroups,
+            shadowGroupsLn = shadowGroups.length,
+            group = me.group,
+            seriesStyle = me.seriesStyle,
+            items, ln, i, j, baseAttrs, sprite, rendererAttributes, shadowIndex, shadowGroup,
+            bounds, endSeriesStyle, barAttr, attrs, anim;
+
+        if (!store || !store.getCount()) {
+            return;
+        }
+
+        
+        delete seriesStyle.fill;
+        endSeriesStyle = Ext.apply(seriesStyle, this.style);
+        me.unHighlightItem();
+        me.cleanHighlights();
+
+        me.getPaths();
+        bounds = me.bounds;
+        items = me.items;
+
+        baseAttrs = column ? {
+            y: bounds.zero,
+            height: 0
+        } : {
+            x: bounds.zero,
+            width: 0
+        };
+        ln = items.length;
+        
+        for (i = 0; i < ln; i++) {
+            sprite = group.getAt(i);
+            barAttr = items[i].attr;
+
+            if (enableShadows) {
+                items[i].shadows = me.renderShadows(i, barAttr, baseAttrs, bounds);
+            }
+
+            
+            if (!sprite) {
+                attrs = Ext.apply({}, baseAttrs, barAttr);
+                attrs = Ext.apply(attrs, endSeriesStyle || {});
+                sprite = surface.add(Ext.apply({}, {
+                    type: 'rect',
+                    group: group
+                }, attrs));
+            }
+            if (animate) {
+                rendererAttributes = me.renderer(sprite, store.getAt(i), barAttr, i, store);
+                sprite._to = rendererAttributes;
+                anim = me.onAnimate(sprite, { to: Ext.apply(rendererAttributes, endSeriesStyle) });
+                if (enableShadows && stacked && (i % bounds.barsLen === 0)) {
+                    j = i / bounds.barsLen;
+                    for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
+                        anim.on('afteranimate', function() {
+                            this.show(true);
+                        }, shadowGroups[shadowIndex].getAt(j));
+                    }
+                }
+            }
+            else {
+                rendererAttributes = me.renderer(sprite, store.getAt(i), Ext.apply(barAttr, { hidden: false }), i, store);
+                sprite.setAttributes(Ext.apply(rendererAttributes, endSeriesStyle), true);
+            }
+            items[i].sprite = sprite;
+        }
+
+        
+        ln = group.getCount();
+        for (j = i; j < ln; j++) {
+            group.getAt(j).hide(true);
+        }
+        
+        if (enableShadows) {
+            for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
+                shadowGroup = shadowGroups[shadowIndex];
+                ln = shadowGroup.getCount();
+                for (j = i; j < ln; j++) {
+                    shadowGroup.getAt(j).hide(true);
+                }
+            }
+        }
+        me.renderLabels();
+    },
+
+    
+    onCreateLabel: function(storeItem, item, i, display) {
+        var me = this,
+            surface = me.chart.surface,
+            group = me.labelsGroup,
+            config = me.label,
+            endLabelStyle = Ext.apply({}, config, me.seriesLabelStyle || {}),
+            sprite;
+        return surface.add(Ext.apply({
+            type: 'text',
+            group: group
+        }, endLabelStyle || {}));
+    },
+
+    
+    onPlaceLabel: function(label, storeItem, item, i, display, animate, j, index) {
+        
+        
+        var me = this,
+            opt = me.bounds,
+            groupBarWidth = opt.groupBarWidth,
+            column = me.column,
+            chart = me.chart,
+            chartBBox = chart.chartBBox,
+            resizing = chart.resizing,
+            xValue = item.value[0],
+            yValue = item.value[1],
+            attr = item.attr,
+            config = me.label,
+            rotate = config.orientation == 'vertical',
+            field = [].concat(config.field),
+            format = config.renderer,
+            text = format(storeItem.get(field[index])),
+            size = me.getLabelSize(text),
+            width = size.width,
+            height = size.height,
+            zero = opt.zero,
+            outside = 'outside',
+            insideStart = 'insideStart',
+            insideEnd = 'insideEnd',
+            offsetX = 10,
+            offsetY = 6,
+            signed = opt.signed,
+            x, y, finalAttr;
+
+        label.setAttributes({
+            text: text
+        });
+
+        label.isOutside = false;
+        if (column) {
+            if (display == outside) {
+                if (height + offsetY + attr.height > (yValue >= 0 ? zero - chartBBox.y : chartBBox.y + chartBBox.height - zero)) {
+                    display = insideEnd;
+                }
+            } else {
+                if (height + offsetY > attr.height) {
+                    display = outside;
+                    label.isOutside = true;
+                }
+            }
+            x = attr.x + groupBarWidth / 2;
+            y = display == insideStart ?
+                    (zero + ((height / 2 + 3) * (yValue >= 0 ? -1 : 1))) :
+                    (yValue >= 0 ? (attr.y + ((height / 2 + 3) * (display == outside ? -1 : 1))) :
+                                   (attr.y + attr.height + ((height / 2 + 3) * (display === outside ? 1 : -1))));
+        }
+        else {
+            if (display == outside) {
+                if (width + offsetX + attr.width > (yValue >= 0 ? chartBBox.x + chartBBox.width - zero : zero - chartBBox.x)) {
+                    display = insideEnd;
+                }
+            }
+            else {
+                if (width + offsetX > attr.width) {
+                    display = outside;
+                    label.isOutside = true;
+                }
+            }
+            x = display == insideStart ?
+                (zero + ((width / 2 + 5) * (yValue >= 0 ? 1 : -1))) :
+                (yValue >= 0 ? (attr.x + attr.width + ((width / 2 + 5) * (display === outside ? 1 : -1))) :
+                (attr.x + ((width / 2 + 5) * (display === outside ? -1 : 1))));
+            y = attr.y + groupBarWidth / 2;
+        }
+        
+        finalAttr = {
+            x: x,
+            y: y
+        };
+        
+        if (rotate) {
+            finalAttr.rotate = {
+                x: x,
+                y: y,
+                degrees: 270
+            };
+        }
+        
+        if (animate && resizing) {
+            if (column) {
+                x = attr.x + attr.width / 2;
+                y = zero;
+            } else {
+                x = zero;
+                y = attr.y + attr.height / 2;
+            }
+            label.setAttributes({
+                x: x,
+                y: y
+            }, true);
+            if (rotate) {
+                label.setAttributes({
+                    rotate: {
+                        x: x,
+                        y: y,
+                        degrees: 270
+                    }
+                }, true);
+            }
+        }
+        
+        if (animate) {
+            me.onAnimate(label, { to: finalAttr });
+        }
+        else {
+            label.setAttributes(Ext.apply(finalAttr, {
+                hidden: false
+            }), true);
+        }
+    },
+
+    
+    getLabelSize: function(value) {
+        var tester = this.testerLabel,
+            config = this.label,
+            endLabelStyle = Ext.apply({}, config, this.seriesLabelStyle || {}),
+            rotated = config.orientation === 'vertical',
+            bbox, w, h,
+            undef;
+        if (!tester) {
+            tester = this.testerLabel = this.chart.surface.add(Ext.apply({
+                type: 'text',
+                opacity: 0
+            }, endLabelStyle));
+        }
+        tester.setAttributes({
+            text: value
+        }, true);
+
+        
+        bbox = tester.getBBox();
+        w = bbox.width;
+        h = bbox.height;
+        return {
+            width: rotated ? h : w,
+            height: rotated ? w : h
+        };
+    },
+
+    
+    onAnimate: function(sprite, attr) {
+        sprite.show();
+        return this.callParent(arguments);
+    },
+
+    isItemInPoint: function(x, y, item) {
+        var bbox = item.sprite.getBBox();
+        return bbox.x <= x && bbox.y <= y
+            && (bbox.x + bbox.width) >= x
+            && (bbox.y + bbox.height) >= y;
+    },
+
+    
+    hideAll: function() {
+        var axes = this.chart.axes;
+        if (!isNaN(this._index)) {
+            if (!this.__excludes) {
+                this.__excludes = [];
+            }
+            this.__excludes[this._index] = true;
+            this.drawSeries();
+            axes.each(function(axis) {
+                axis.drawAxis();
+            });
+        }
+    },
+
+    
+    showAll: function() {
+        var axes = this.chart.axes;
+        if (!isNaN(this._index)) {
+            if (!this.__excludes) {
+                this.__excludes = [];
+            }
+            this.__excludes[this._index] = false;
+            this.drawSeries();
+            axes.each(function(axis) {
+                axis.drawAxis();
+            });
+        }
+    },
+
+    
+    getLegendColor: function(index) {
+        var me = this,
+            colorLength = me.colorArrayStyle.length;
+
+        if (me.style && me.style.fill) {
+            return me.style.fill;
+        } else {
+            return me.colorArrayStyle[index % colorLength];
+        }
+    },
+
+    highlightItem: function(item) {
+        this.callParent(arguments);
+        this.renderLabels();
+    },
+
+    unHighlightItem: function() {
+        this.callParent(arguments);
+        this.renderLabels();
+    },
+
+    cleanHighlights: function() {
+        this.callParent(arguments);
+        this.renderLabels();
+    }
+});
+
+Ext.define('Ext.chart.series.Column', {
+
+    
+
+    alternateClassName: ['Ext.chart.ColumnSeries', 'Ext.chart.ColumnChart', 'Ext.chart.StackedColumnChart'],
+
+    extend: 'Ext.chart.series.Bar',
+
+    
+
+    type: 'column',
+    alias: 'series.column',
+
+    column: true,
+
+    
+    xPadding: 10,
+
+    
+    yPadding: 0
+});
+
+Ext.define('Ext.chart.series.Gauge', {
+
+    
+
+    extend: 'Ext.chart.series.Series',
+
+    
+
+    type: "gauge",
+    alias: 'series.gauge',
+
+    rad: Math.PI / 180,
+
+    
+    highlightDuration: 150,
+
+    
+    angleField: false,
+
+    
+    needle: false,
+    
+    
+    donut: false,
+
+    
+    showInLegend: false,
+
+    
+    style: {},
+    
+    constructor: function(config) {
+        this.callParent(arguments);
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            store = chart.store,
+            shadow = chart.shadow, i, l, cfg;
+        Ext.apply(me, config, {
+            shadowAttributes: [{
+                "stroke-width": 6,
+                "stroke-opacity": 1,
+                stroke: 'rgb(200, 200, 200)',
+                translate: {
+                    x: 1.2,
+                    y: 2
+                }
+            },
+            {
+                "stroke-width": 4,
+                "stroke-opacity": 1,
+                stroke: 'rgb(150, 150, 150)',
+                translate: {
+                    x: 0.9,
+                    y: 1.5
+                }
+            },
+            {
+                "stroke-width": 2,
+                "stroke-opacity": 1,
+                stroke: 'rgb(100, 100, 100)',
+                translate: {
+                    x: 0.6,
+                    y: 1
+                }
+            }]
+        });
+        me.group = surface.getGroup(me.seriesId);
+        if (shadow) {
+            for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
+                me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
+            }
+        }
+        surface.customAttributes.segment = function(opt) {
+            return me.getSegment(opt);
+        };
+    },
+    
+    //@private updates some onbefore render parameters.
+
+    initialize: function() {
+        var me = this,
+            store = me.chart.getChartStore();
+        
+        me.yField = [];
+        if (me.label.field) {
+            store.each(function(rec) {
+                me.yField.push(rec.get(me.label.field));
+            });
+        }
+    },
+
+    
+    getSegment: function(opt) {
+        var me = this,
+            rad = me.rad,
+            cos = Math.cos,
+            sin = Math.sin,
+            abs = Math.abs,
+            x = me.centerX,
+            y = me.centerY,
+            x1 = 0, x2 = 0, x3 = 0, x4 = 0,
+            y1 = 0, y2 = 0, y3 = 0, y4 = 0,
+            delta = 1e-2,
+            r = opt.endRho - opt.startRho,
+            startAngle = opt.startAngle,
+            endAngle = opt.endAngle,
+            midAngle = (startAngle + endAngle) / 2 * rad,
+            margin = opt.margin || 0,
+            flag = abs(endAngle - startAngle) > 180,
+            a1 = Math.min(startAngle, endAngle) * rad,
+            a2 = Math.max(startAngle, endAngle) * rad,
+            singleSlice = false;
+
+        x += margin * cos(midAngle);
+        y += margin * sin(midAngle);
+
+        x1 = x + opt.startRho * cos(a1);
+        y1 = y + opt.startRho * sin(a1);
+
+        x2 = x + opt.endRho * cos(a1);
+        y2 = y + opt.endRho * sin(a1);
+
+        x3 = x + opt.startRho * cos(a2);
+        y3 = y + opt.startRho * sin(a2);
+
+        x4 = x + opt.endRho * cos(a2);
+        y4 = y + opt.endRho * sin(a2);
+
+        if (abs(x1 - x3) <= delta && abs(y1 - y3) <= delta) {
+            singleSlice = true;
+        }
+        
+        if (singleSlice) {
+            return {
+                path: [
+                ["M", x1, y1],
+                ["L", x2, y2],
+                ["A", opt.endRho, opt.endRho, 0, +flag, 1, x4, y4],
+                ["Z"]]
+            };
+        } else {
+            return {
+                path: [
+                ["M", x1, y1],
+                ["L", x2, y2],
+                ["A", opt.endRho, opt.endRho, 0, +flag, 1, x4, y4],
+                ["L", x3, y3],
+                ["A", opt.startRho, opt.startRho, 0, +flag, 0, x1, y1],
+                ["Z"]]
+            };
+        }
+    },
+
+    
+    calcMiddle: function(item) {
+        var me = this,
+            rad = me.rad,
+            slice = item.slice,
+            x = me.centerX,
+            y = me.centerY,
+            startAngle = slice.startAngle,
+            endAngle = slice.endAngle,
+            radius = Math.max(('rho' in slice) ? slice.rho: me.radius, me.label.minMargin),
+            donut = +me.donut,
+            a1 = Math.min(startAngle, endAngle) * rad,
+            a2 = Math.max(startAngle, endAngle) * rad,
+            midAngle = -(a1 + (a2 - a1) / 2),
+            xm = x + (item.endRho + item.startRho) / 2 * Math.cos(midAngle),
+            ym = y - (item.endRho + item.startRho) / 2 * Math.sin(midAngle);
+
+        item.middle = {
+            x: xm,
+            y: ym
+        };
+    },
+
+    
+    drawSeries: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            group = me.group,
+            animate = me.chart.animate,
+            axis = me.chart.axes.get(0),
+            minimum = axis && axis.minimum || me.minimum || 0,
+            maximum = axis && axis.maximum || me.maximum || 0,
+            field = me.angleField || me.field || me.xField,
+            surface = chart.surface,
+            chartBBox = chart.chartBBox,
+            rad = me.rad,
+            donut = +me.donut,
+            values = {},
+            items = [],
+            seriesStyle = me.seriesStyle,
+            seriesLabelStyle = me.seriesLabelStyle,
+            colorArrayStyle = me.colorArrayStyle,
+            colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
+            gutterX = chart.maxGutter[0],
+            gutterY = chart.maxGutter[1],
+            cos = Math.cos,
+            sin = Math.sin,
+            rendererAttributes, centerX, centerY, slice, slices, sprite, value,
+            item, ln, record, i, j, startAngle, endAngle, middleAngle, sliceLength, path,
+            p, spriteOptions, bbox, splitAngle, sliceA, sliceB;
+        
+        Ext.apply(seriesStyle, me.style || {});
+
+        me.setBBox();
+        bbox = me.bbox;
+
+        
+        if (me.colorSet) {
+            colorArrayStyle = me.colorSet;
+            colorArrayLength = colorArrayStyle.length;
+        }
+        
+        
+        if (!store || !store.getCount()) {
+            return;
+        }
+        
+        centerX = me.centerX = chartBBox.x + (chartBBox.width / 2);
+        centerY = me.centerY = chartBBox.y + chartBBox.height;
+        me.radius = Math.min(centerX - chartBBox.x, centerY - chartBBox.y);
+        me.slices = slices = [];
+        me.items = items = [];
+        
+        if (!me.value) {
+            record = store.getAt(0);
+            me.value = record.get(field);
+        }
+        
+        value = me.value;
+        if (me.needle) {
+            sliceA = {
+                series: me,
+                value: value,
+                startAngle: -180,
+                endAngle: 0,
+                rho: me.radius
+            };
+            splitAngle = -180 * (1 - (value - minimum) / (maximum - minimum));
+            slices.push(sliceA);
+        } else {
+            splitAngle = -180 * (1 - (value - minimum) / (maximum - minimum));
+            sliceA = {
+                series: me,
+                value: value,
+                startAngle: -180,
+                endAngle: splitAngle,
+                rho: me.radius
+            };
+            sliceB = {
+                series: me,
+                value: me.maximum - value,
+                startAngle: splitAngle,
+                endAngle: 0,
+                rho: me.radius
+            };
+            slices.push(sliceA, sliceB);
+        }
+        
+        
+        for (i = 0, ln = slices.length; i < ln; i++) {
+            slice = slices[i];
+            sprite = group.getAt(i);
+            
+            rendererAttributes = Ext.apply({
+                segment: {
+                    startAngle: slice.startAngle,
+                    endAngle: slice.endAngle,
+                    margin: 0,
+                    rho: slice.rho,
+                    startRho: slice.rho * +donut / 100,
+                    endRho: slice.rho
+                } 
+            }, Ext.apply(seriesStyle, colorArrayStyle && { fill: colorArrayStyle[i % colorArrayLength] } || {}));
+
+            item = Ext.apply({},
+            rendererAttributes.segment, {
+                slice: slice,
+                series: me,
+                storeItem: record,
+                index: i
+            });
+            items[i] = item;
+            
+            if (!sprite) {
+                spriteOptions = Ext.apply({
+                    type: "path",
+                    group: group
+                }, Ext.apply(seriesStyle, colorArrayStyle && { fill: colorArrayStyle[i % colorArrayLength] } || {}));
+                sprite = surface.add(Ext.apply(spriteOptions, rendererAttributes));
+            }
+            slice.sprite = slice.sprite || [];
+            item.sprite = sprite;
+            slice.sprite.push(sprite);
+            if (animate) {
+                rendererAttributes = me.renderer(sprite, record, rendererAttributes, i, store);
+                sprite._to = rendererAttributes;
+                me.onAnimate(sprite, {
+                    to: rendererAttributes
+                });
+            } else {
+                rendererAttributes = me.renderer(sprite, record, Ext.apply(rendererAttributes, {
+                    hidden: false
+                }), i, store);
+                sprite.setAttributes(rendererAttributes, true);
+            }
+        }
+        
+        if (me.needle) {
+            splitAngle = splitAngle * Math.PI / 180;
+            
+            if (!me.needleSprite) {
+                me.needleSprite = me.chart.surface.add({
+                    type: 'path',
+                    path: ['M', centerX + (me.radius * +donut / 100) * cos(splitAngle),
+                                centerY + -Math.abs((me.radius * +donut / 100) * sin(splitAngle)),
+                           'L', centerX + me.radius * cos(splitAngle),
+                                centerY + -Math.abs(me.radius * sin(splitAngle))],
+                    'stroke-width': 4,
+                    'stroke': '#222'
+                });
+            } else {
+                if (animate) {
+                    me.onAnimate(me.needleSprite, {
+                        to: {
+                        path: ['M', centerX + (me.radius * +donut / 100) * cos(splitAngle),
+                                    centerY + -Math.abs((me.radius * +donut / 100) * sin(splitAngle)),
+                               'L', centerX + me.radius * cos(splitAngle),
+                                    centerY + -Math.abs(me.radius * sin(splitAngle))]
+                        }
+                    });
+                } else {
+                    me.needleSprite.setAttributes({
+                        type: 'path',
+                        path: ['M', centerX + (me.radius * +donut / 100) * cos(splitAngle),
+                                    centerY + -Math.abs((me.radius * +donut / 100) * sin(splitAngle)),
+                               'L', centerX + me.radius * cos(splitAngle),
+                                    centerY + -Math.abs(me.radius * sin(splitAngle))]
+                    });
+                }
+            }
+            me.needleSprite.setAttributes({
+                hidden: false    
+            }, true);
+        }
+        
+        delete me.value;
+    },
+    
+    
+    setValue: function (value) {
+        this.value = value;
+        this.drawSeries();
+    },
+
+    
+    onCreateLabel: function(storeItem, item, i, display) {},
+
+    
+    onPlaceLabel: function(label, storeItem, item, i, display, animate, index) {},
+
+    
+    onPlaceCallout: function() {},
+
+    
+    onAnimate: function(sprite, attr) {
+        sprite.show();
+        return this.callParent(arguments);
+    },
+
+    isItemInPoint: function(x, y, item, i) {
+        return false;
+    },
+    
+    
+    showAll: function() {
+        if (!isNaN(this._index)) {
+            this.__excludes[this._index] = false;
+            this.drawSeries();
+        }
+    },
+    
+    
+    getLegendColor: function(index) {
+        var me = this;
+        return me.colorArrayStyle[index % me.colorArrayStyle.length];
+    }
+});
+
+
+
+Ext.define('Ext.chart.series.Line', {
+
+    
+
+    extend: 'Ext.chart.series.Cartesian',
+
+    alternateClassName: ['Ext.chart.LineSeries', 'Ext.chart.LineChart'],
+
+    requires: ['Ext.chart.axis.Axis', 'Ext.chart.Shape', 'Ext.draw.Draw', 'Ext.fx.Anim'],
+
+    
+
+    type: 'line',
+
+    alias: 'series.line',
+
+    
+
+    
+    selectionTolerance: 20,
+
+    
+    showMarkers: true,
+
+    
+    markerConfig: {},
+
+    
+    style: {},
+
+    
+    smooth: false,
+
+    
+    defaultSmoothness: 3,
+
+    
+    fill: false,
+
+    constructor: function(config) {
+        this.callParent(arguments);
+        var me = this,
+            surface = me.chart.surface,
+            shadow = me.chart.shadow,
+            i, l;
+        Ext.apply(me, config, {
+            highlightCfg: {
+                'stroke-width': 3
+            },
+            shadowAttributes: [{
+                "stroke-width": 6,
+                "stroke-opacity": 0.05,
+                stroke: 'rgb(0, 0, 0)',
+                translate: {
+                    x: 1,
+                    y: 1
+                }
+            }, {
+                "stroke-width": 4,
+                "stroke-opacity": 0.1,
+                stroke: 'rgb(0, 0, 0)',
+                translate: {
+                    x: 1,
+                    y: 1
+                }
+            }, {
+                "stroke-width": 2,
+                "stroke-opacity": 0.15,
+                stroke: 'rgb(0, 0, 0)',
+                translate: {
+                    x: 1,
+                    y: 1
+                }
+            }]
+        });
+        me.group = surface.getGroup(me.seriesId);
+        if (me.showMarkers) {
+            me.markerGroup = surface.getGroup(me.seriesId + '-markers');
+        }
+        if (shadow) {
+            for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
+                me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
+            }
+        }
+    },
+
+    
+    shrink: function(xValues, yValues, size) {
+        
+        var len = xValues.length,
+            ratio = Math.floor(len / size),
+            i = 1,
+            xSum = 0,
+            ySum = 0,
+            xRes = [xValues[0]],
+            yRes = [yValues[0]];
+
+        for (; i < len; ++i) {
+            xSum += xValues[i] || 0;
+            ySum += yValues[i] || 0;
+            if (i % ratio == 0) {
+                xRes.push(xSum/ratio);
+                yRes.push(ySum/ratio);
+                xSum = 0;
+                ySum = 0;
+            }
+        }
+        return {
+            x: xRes,
+            y: yRes
+        };
+    },
+
+    
+    drawSeries: function() {
+        var me = this,
+            chart = me.chart,
+            chartAxes = chart.axes,
+            store = chart.getChartStore(),
+            storeCount = store.getCount(),
+            surface = me.chart.surface,
+            bbox = {},
+            group = me.group,
+            showMarkers = me.showMarkers,
+            markerGroup = me.markerGroup,
+            enableShadows = chart.shadow,
+            shadowGroups = me.shadowGroups,
+            shadowAttributes = me.shadowAttributes,
+            smooth = me.smooth,
+            lnsh = shadowGroups.length,
+            dummyPath = ["M"],
+            path = ["M"],
+            renderPath = ["M"],
+            smoothPath = ["M"],
+            markerIndex = chart.markerIndex,
+            axes = [].concat(me.axis),
+            shadowBarAttr,
+            xValues = [],
+            xValueMap = {},
+            yValues = [],
+            yValueMap = {},
+            onbreak = false,
+            storeIndices = [],
+            markerStyle = me.markerStyle,
+            seriesStyle = me.style,
+            colorArrayStyle = me.colorArrayStyle,
+            colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
+            isNumber = Ext.isNumber,
+            seriesIdx = me.seriesIdx, 
+            boundAxes = me.getAxesForXAndYFields(),
+            boundXAxis = boundAxes.xAxis,
+            boundYAxis = boundAxes.yAxis,
+            shadows, shadow, shindex, fromPath, fill, fillPath, rendererAttributes,
+            x, y, prevX, prevY, firstX, firstY, markerCount, i, j, ln, axis, ends, marker, markerAux, item, xValue,
+            yValue, coords, xScale, yScale, minX, maxX, minY, maxY, line, animation, endMarkerStyle,
+            endLineStyle, type, count, items;
+
+        if (me.fireEvent('beforedraw', me) === false) {
+            return;
+        }
+
+        
+        if (!storeCount || me.seriesIsHidden) {
+            items = this.items;
+            if (items) {
+                for (i = 0, ln = items.length; i < ln; ++i) {
+                    if (items[i].sprite) {
+                        items[i].sprite.hide(true);
+                    }
+                }
+            }
+            return;
+        }
+
+        
+        endMarkerStyle = Ext.apply(markerStyle || {}, me.markerConfig);
+        type = endMarkerStyle.type;
+        delete endMarkerStyle.type;
+        endLineStyle = seriesStyle;
+        
+        
+        if (!endLineStyle['stroke-width']) {
+            endLineStyle['stroke-width'] = 0.5;
+        }
+        
+        
+        if (markerIndex && markerGroup && markerGroup.getCount()) {
+            for (i = 0; i < markerIndex; i++) {
+                marker = markerGroup.getAt(i);
+                markerGroup.remove(marker);
+                markerGroup.add(marker);
+                markerAux = markerGroup.getAt(markerGroup.getCount() - 2);
+                marker.setAttributes({
+                    x: 0,
+                    y: 0,
+                    translate: {
+                        x: markerAux.attr.translation.x,
+                        y: markerAux.attr.translation.y
+                    }
+                }, true);
+            }
+        }
+
+        me.unHighlightItem();
+        me.cleanHighlights();
+
+        me.setBBox();
+        bbox = me.bbox;
+        me.clipRect = [bbox.x, bbox.y, bbox.width, bbox.height];
+        for (i = 0, ln = axes.length; i < ln; i++) {
+            axis = chartAxes.get(axes[i]);
+            if (axis) {
+                ends = axis.calcEnds();
+                if (axis.position == 'top' || axis.position == 'bottom') {
+                    minX = ends.from;
+                    maxX = ends.to;
+                }
+                else {
+                    minY = ends.from;
+                    maxY = ends.to;
+                }
+            }
+        }
+        
+        
+        
+        if (me.xField && !isNumber(minX) &&
+            (boundXAxis == 'bottom' || boundXAxis == 'top') && 
+            !chartAxes.get(boundXAxis)) {
+            axis = Ext.create('Ext.chart.axis.Axis', {
+                chart: chart,
+                fields: [].concat(me.xField)
+            }).calcEnds();
+            minX = axis.from;
+            maxX = axis.to;
+        }
+        if (me.yField && !isNumber(minY) &&
+            (boundYAxis == 'right' || boundYAxis == 'left') &&
+            !chartAxes.get(boundYAxis)) {
+            axis = Ext.create('Ext.chart.axis.Axis', {
+                chart: chart,
+                fields: [].concat(me.yField)
+            }).calcEnds();
+            minY = axis.from;
+            maxY = axis.to;
+        }
+        if (isNaN(minX)) {
+            minX = 0;
+            xScale = bbox.width / ((storeCount - 1) || 1);
+        }
+        else {
+            xScale = bbox.width / ((maxX - minX) || (storeCount -1) || 1);
+        }
+
+        if (isNaN(minY)) {
+            minY = 0;
+            yScale = bbox.height / ((storeCount - 1) || 1);
+        }
+        else {
+            yScale = bbox.height / ((maxY - minY) || (storeCount - 1) || 1);
+        }
+
+        
+        me.eachRecord(function(record, i) {
+            xValue = record.get(me.xField);
+
+            
+            if (typeof xValue == 'string' || typeof xValue == 'object' && !Ext.isDate(xValue)
+                
+                || boundXAxis && chartAxes.get(boundXAxis) && chartAxes.get(boundXAxis).type == 'Category') {
+                    if (xValue in xValueMap) {
+                        xValue = xValueMap[xValue];
+                    } else {
+                        xValue = xValueMap[xValue] = i;
+                    }
+            }
+
+            
+            yValue = record.get(me.yField);
+            
+            if (typeof yValue == 'undefined' || (typeof yValue == 'string' && !yValue)) {
+                return;
+            }
+            
+            if (typeof yValue == 'string' || typeof yValue == 'object' && !Ext.isDate(yValue)
+                
+                || boundYAxis && chartAxes.get(boundYAxis) && chartAxes.get(boundYAxis).type == 'Category') {
+                yValue = i;
+            }
+            storeIndices.push(i);
+            xValues.push(xValue);
+            yValues.push(yValue);
+        });
+
+        ln = xValues.length;
+        if (ln > bbox.width) {
+            coords = me.shrink(xValues, yValues, bbox.width);
+            xValues = coords.x;
+            yValues = coords.y;
+        }
+
+        me.items = [];
+
+        count = 0;
+        ln = xValues.length;
+        for (i = 0; i < ln; i++) {
+            xValue = xValues[i];
+            yValue = yValues[i];
+            if (yValue === false) {
+                if (path.length == 1) {
+                    path = [];
+                }
+                onbreak = true;
+                me.items.push(false);
+                continue;
+            } else {
+                x = (bbox.x + (xValue - minX) * xScale).toFixed(2);
+                y = ((bbox.y + bbox.height) - (yValue - minY) * yScale).toFixed(2);
+                if (onbreak) {
+                    onbreak = false;
+                    path.push('M');
+                }
+                path = path.concat([x, y]);
+            }
+            if ((typeof firstY == 'undefined') && (typeof y != 'undefined')) {
+                firstY = y;
+                firstX = x;
+            }
+            
+            if (!me.line || chart.resizing) {
+                dummyPath = dummyPath.concat([x, bbox.y + bbox.height / 2]);
+            }
+
+            
+            if (chart.animate && chart.resizing && me.line) {
+                me.line.setAttributes({
+                    path: dummyPath
+                }, true);
+                if (me.fillPath) {
+                    me.fillPath.setAttributes({
+                        path: dummyPath,
+                        opacity: 0.2
+                    }, true);
+                }
+                if (me.line.shadows) {
+                    shadows = me.line.shadows;
+                    for (j = 0, lnsh = shadows.length; j < lnsh; j++) {
+                        shadow = shadows[j];
+                        shadow.setAttributes({
+                            path: dummyPath
+                        }, true);
+                    }
+                }
+            }
+            if (showMarkers) {
+                marker = markerGroup.getAt(count++);
+                if (!marker) {
+                    marker = Ext.chart.Shape[type](surface, Ext.apply({
+                        group: [group, markerGroup],
+                        x: 0, y: 0,
+                        translate: {
+                            x: +(prevX || x),
+                            y: prevY || (bbox.y + bbox.height / 2)
+                        },
+                        value: '"' + xValue + ', ' + yValue + '"',
+                        zIndex: 4000
+                    }, endMarkerStyle));
+                    marker._to = {
+                        translate: {
+                            x: +x,
+                            y: +y
+                        }
+                    };
+                } else {
+                    marker.setAttributes({
+                        value: '"' + xValue + ', ' + yValue + '"',
+                        x: 0, y: 0,
+                        hidden: false
+                    }, true);
+                    marker._to = {
+                        translate: {
+                            x: +x, 
+                            y: +y
+                        }
+                    };
+                }
+            }
+            me.items.push({
+                series: me,
+                value: [xValue, yValue],
+                point: [x, y],
+                sprite: marker,
+                storeItem: store.getAt(storeIndices[i])
+            });
+            prevX = x;
+            prevY = y;
+        }
+
+        if (path.length <= 1) {
+            
+            return;
+        }
+
+        if (me.smooth) {
+            smoothPath = Ext.draw.Draw.smooth(path, isNumber(smooth) ? smooth : me.defaultSmoothness);
+        }
+
+        renderPath = smooth ? smoothPath : path;
+
+        
+        if (chart.markerIndex && me.previousPath) {
+            fromPath = me.previousPath;
+            if (!smooth) {
+                Ext.Array.erase(fromPath, 1, 2);
+            }
+        } else {
+            fromPath = path;
+        }
+
+        
+        if (!me.line) {
+            me.line = surface.add(Ext.apply({
+                type: 'path',
+                group: group,
+                path: dummyPath,
+                stroke: endLineStyle.stroke || endLineStyle.fill
+            }, endLineStyle || {}));
+
+            if (enableShadows) {
+                me.line.setAttributes(Ext.apply({}, me.shadowOptions), true);
+            }
+
+            
+            me.line.setAttributes({
+                fill: 'none',
+                zIndex: 3000
+            });
+            if (!endLineStyle.stroke && colorArrayLength) {
+                me.line.setAttributes({
+                    stroke: colorArrayStyle[seriesIdx % colorArrayLength]
+                }, true);
+            }
+            if (enableShadows) {
+                
+                shadows = me.line.shadows = [];
+                for (shindex = 0; shindex < lnsh; shindex++) {
+                    shadowBarAttr = shadowAttributes[shindex];
+                    shadowBarAttr = Ext.apply({}, shadowBarAttr, { path: dummyPath });
+                    shadow = surface.add(Ext.apply({}, {
+                        type: 'path',
+                        group: shadowGroups[shindex]
+                    }, shadowBarAttr));
+                    shadows.push(shadow);
+                }
+            }
+        }
+        if (me.fill) {
+            fillPath = renderPath.concat([
+                ["L", x, bbox.y + bbox.height],
+                ["L", firstX, bbox.y + bbox.height],
+                ["L", firstX, firstY]
+            ]);
+            if (!me.fillPath) {
+                me.fillPath = surface.add({
+                    group: group,
+                    type: 'path',
+                    opacity: endLineStyle.opacity || 0.3,
+                    fill: endLineStyle.fill || colorArrayStyle[seriesIdx % colorArrayLength],
+                    path: dummyPath
+                });
+            }
+        }
+        markerCount = showMarkers && markerGroup.getCount();
+        if (chart.animate) {
+            fill = me.fill;
+            line = me.line;
+            
+            rendererAttributes = me.renderer(line, false, { path: renderPath }, i, store);
+            Ext.apply(rendererAttributes, endLineStyle || {}, {
+                stroke: endLineStyle.stroke || endLineStyle.fill
+            });
+            
+            delete rendererAttributes.fill;
+            line.show(true);
+            if (chart.markerIndex && me.previousPath) {
+                me.animation = animation = me.onAnimate(line, {
+                    to: rendererAttributes,
+                    from: {
+                        path: fromPath
+                    }
+                });
+            } else {
+                me.animation = animation = me.onAnimate(line, {
+                    to: rendererAttributes
+                });
+            }
+            
+            if (enableShadows) {
+                shadows = line.shadows;
+                for(j = 0; j < lnsh; j++) {
+                    shadows[j].show(true);
+                    if (chart.markerIndex && me.previousPath) {
+                        me.onAnimate(shadows[j], {
+                            to: { path: renderPath },
+                            from: { path: fromPath }
+                        });
+                    } else {
+                        me.onAnimate(shadows[j], {
+                            to: { path: renderPath }
+                        });
+                    }
+                }
+            }
+            
+            if (fill) {
+                me.fillPath.show(true);
+                me.onAnimate(me.fillPath, {
+                    to: Ext.apply({}, {
+                        path: fillPath,
+                        fill: endLineStyle.fill || colorArrayStyle[seriesIdx % colorArrayLength],
+                        'stroke-width': 0
+                    }, endLineStyle || {})
+                });
+            }
+            
+            if (showMarkers) {
+                count = 0;
+                for(i = 0; i < ln; i++) {
+                    if (me.items[i]) {
+                        item = markerGroup.getAt(count++);
+                        if (item) {
+                            rendererAttributes = me.renderer(item, store.getAt(i), item._to, i, store);
+                            me.onAnimate(item, {
+                                to: Ext.apply(rendererAttributes, endMarkerStyle || {})
+                            });
+                            item.show(true);
+                        }
+                    }
+                }
+                for(; count < markerCount; count++) {
+                    item = markerGroup.getAt(count);
+                    item.hide(true);
+                }
+
+
+
+
+            }
+        } else {
+            rendererAttributes = me.renderer(me.line, false, { path: renderPath, hidden: false }, i, store);
+            Ext.apply(rendererAttributes, endLineStyle || {}, {
+                stroke: endLineStyle.stroke || endLineStyle.fill
+            });
+            
+            delete rendererAttributes.fill;
+            me.line.setAttributes(rendererAttributes, true);
+            
+            if (enableShadows) {
+                shadows = me.line.shadows;
+                for(j = 0; j < lnsh; j++) {
+                    shadows[j].setAttributes({
+                        path: renderPath,
+                        hidden: false
+                    }, true);
+                }
+            }
+            if (me.fill) {
+                me.fillPath.setAttributes({
+                    path: fillPath,
+                    hidden: false
+                }, true);
+            }
+            if (showMarkers) {
+                count = 0;
+                for(i = 0; i < ln; i++) {
+                    if (me.items[i]) {
+                        item = markerGroup.getAt(count++);
+                        if (item) {
+                            rendererAttributes = me.renderer(item, store.getAt(i), item._to, i, store);
+                            item.setAttributes(Ext.apply(endMarkerStyle || {}, rendererAttributes || {}), true);
+                            item.show(true);
+                        }
+                    }
+                }
+                for(; count < markerCount; count++) {
+                    item = markerGroup.getAt(count);
+                    item.hide(true);
+                }
+            }
+        }
+
+        if (chart.markerIndex) {
+            if (me.smooth) {
+                Ext.Array.erase(path, 1, 2);
+            } else {
+                Ext.Array.splice(path, 1, 0, path[1], path[2]);
+            }
+            me.previousPath = path;
+        }
+        me.renderLabels();
+        me.renderCallouts();
+
+        me.fireEvent('draw', me);
+    },
+
+    
+    onCreateLabel: function(storeItem, item, i, display) {
+        var me = this,
+            group = me.labelsGroup,
+            config = me.label,
+            bbox = me.bbox,
+            endLabelStyle = Ext.apply(config, me.seriesLabelStyle);
+
+        return me.chart.surface.add(Ext.apply({
+            'type': 'text',
+            'text-anchor': 'middle',
+            'group': group,
+            'x': item.point[0],
+            'y': bbox.y + bbox.height / 2
+        }, endLabelStyle || {}));
+    },
+
+    
+    onPlaceLabel: function(label, storeItem, item, i, display, animate) {
+        var me = this,
+            chart = me.chart,
+            resizing = chart.resizing,
+            config = me.label,
+            format = config.renderer,
+            field = config.field,
+            bbox = me.bbox,
+            x = item.point[0],
+            y = item.point[1],
+            radius = item.sprite.attr.radius,
+            bb, width, height;
+
+        label.setAttributes({
+            text: format(storeItem.get(field)),
+            hidden: true
+        }, true);
+
+        if (display == 'rotate') {
+            label.setAttributes({
+                'text-anchor': 'start',
+                'rotation': {
+                    x: x,
+                    y: y,
+                    degrees: -45
+                }
+            }, true);
+            
+            bb = label.getBBox();
+            width = bb.width;
+            height = bb.height;
+            x = x < bbox.x? bbox.x : x;
+            x = (x + width > bbox.x + bbox.width)? (x - (x + width - bbox.x - bbox.width)) : x;
+            y = (y - height < bbox.y)? bbox.y + height : y;
+
+        } else if (display == 'under' || display == 'over') {
+            
+            bb = item.sprite.getBBox();
+            bb.width = bb.width || (radius * 2);
+            bb.height = bb.height || (radius * 2);
+            y = y + (display == 'over'? -bb.height : bb.height);
+            
+            bb = label.getBBox();
+            width = bb.width/2;
+            height = bb.height/2;
+            x = x - width < bbox.x? bbox.x + width : x;
+            x = (x + width > bbox.x + bbox.width) ? (x - (x + width - bbox.x - bbox.width)) : x;
+            y = y - height < bbox.y? bbox.y + height : y;
+            y = (y + height > bbox.y + bbox.height) ? (y - (y + height - bbox.y - bbox.height)) : y;
+        }
+
+        if (me.chart.animate && !me.chart.resizing) {
+            label.show(true);
+            me.onAnimate(label, {
+                to: {
+                    x: x,
+                    y: y
+                }
+            });
+        } else {
+            label.setAttributes({
+                x: x,
+                y: y
+            }, true);
+            if (resizing && me.animation) {
+                me.animation.on('afteranimate', function() {
+                    label.show(true);
+                });
+            } else {
+                label.show(true);
+            }
+        }
+    },
+
+    //@private Overriding highlights.js highlightItem method.
+
+    highlightItem: function() {
+        var me = this;
+        me.callParent(arguments);
+        if (me.line && !me.highlighted) {
+            if (!('__strokeWidth' in me.line)) {
+                me.line.__strokeWidth = me.line.attr['stroke-width'] || 0;
+            }
+            if (me.line.__anim) {
+                me.line.__anim.paused = true;
+            }
+            me.line.__anim = Ext.create('Ext.fx.Anim', {
+                target: me.line,
+                to: {
+                    'stroke-width': me.line.__strokeWidth + 3
+                }
+            });
+            me.highlighted = true;
+        }
+    },
+
+    //@private Overriding highlights.js unHighlightItem method.
+
+    unHighlightItem: function() {
+        var me = this;
+        me.callParent(arguments);
+        if (me.line && me.highlighted) {
+            me.line.__anim = Ext.create('Ext.fx.Anim', {
+                target: me.line,
+                to: {
+                    'stroke-width': me.line.__strokeWidth
+                }
+            });
+            me.highlighted = false;
+        }
+    },
+
+    //@private called when a callout needs to be placed.
+
+    onPlaceCallout : function(callout, storeItem, item, i, display, animate, index) {
+        if (!display) {
+            return;
+        }
+
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            resizing = chart.resizing,
+            config = me.callouts,
+            items = me.items,
+            prev = i == 0? false : items[i -1].point,
+            next = (i == items.length -1)? false : items[i +1].point,
+            cur = [+item.point[0], +item.point[1]],
+            dir, norm, normal, a, aprev, anext,
+            offsetFromViz = config.offsetFromViz || 30,
+            offsetToSide = config.offsetToSide || 10,
+            offsetBox = config.offsetBox || 3,
+            boxx, boxy, boxw, boxh,
+            p, clipRect = me.clipRect,
+            bbox = {
+                width: config.styles.width || 10,
+                height: config.styles.height || 10
+            },
+            x, y;
+
+        
+        if (!prev) {
+            prev = cur;
+        }
+        if (!next) {
+            next = cur;
+        }
+        a = (next[1] - prev[1]) / (next[0] - prev[0]);
+        aprev = (cur[1] - prev[1]) / (cur[0] - prev[0]);
+        anext = (next[1] - cur[1]) / (next[0] - cur[0]);
+
+        norm = Math.sqrt(1 + a * a);
+        dir = [1 / norm, a / norm];
+        normal = [-dir[1], dir[0]];
+
+        
+        if (aprev > 0 && anext < 0 && normal[1] < 0
+            || aprev < 0 && anext > 0 && normal[1] > 0) {
+            normal[0] *= -1;
+            normal[1] *= -1;
+        } else if (Math.abs(aprev) < Math.abs(anext) && normal[0] < 0
+                   || Math.abs(aprev) > Math.abs(anext) && normal[0] > 0) {
+            normal[0] *= -1;
+            normal[1] *= -1;
+        }
+        
+        x = cur[0] + normal[0] * offsetFromViz;
+        y = cur[1] + normal[1] * offsetFromViz;
+
+        
+        boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
+        boxy = y - bbox.height /2 - offsetBox;
+        boxw = bbox.width + 2 * offsetBox;
+        boxh = bbox.height + 2 * offsetBox;
+
+        
+        
+        if (boxx < clipRect[0] || (boxx + boxw) > (clipRect[0] + clipRect[2])) {
+            normal[0] *= -1;
+        }
+        if (boxy < clipRect[1] || (boxy + boxh) > (clipRect[1] + clipRect[3])) {
+            normal[1] *= -1;
+        }
+
+        
+        x = cur[0] + normal[0] * offsetFromViz;
+        y = cur[1] + normal[1] * offsetFromViz;
+
+        
+        boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
+        boxy = y - bbox.height /2 - offsetBox;
+        boxw = bbox.width + 2 * offsetBox;
+        boxh = bbox.height + 2 * offsetBox;
+
+        if (chart.animate) {
+            
+            me.onAnimate(callout.lines, {
+                to: {
+                    path: ["M", cur[0], cur[1], "L", x, y, "Z"]
+                }
+            });
+            
+            if (callout.panel) {
+                callout.panel.setPosition(boxx, boxy, true);
+            }
+        }
+        else {
+            
+            callout.lines.setAttributes({
+                path: ["M", cur[0], cur[1], "L", x, y, "Z"]
+            }, true);
+            
+            if (callout.panel) {
+                callout.panel.setPosition(boxx, boxy);
+            }
+        }
+        for (p in callout) {
+            callout[p].show(true);
+        }
+    },
+
+    isItemInPoint: function(x, y, item, i) {
+        var me = this,
+            items = me.items,
+            tolerance = me.selectionTolerance,
+            result = null,
+            prevItem,
+            nextItem,
+            prevPoint,
+            nextPoint,
+            ln,
+            x1,
+            y1,
+            x2,
+            y2,
+            xIntersect,
+            yIntersect,
+            dist1, dist2, dist, midx, midy,
+            sqrt = Math.sqrt, abs = Math.abs;
+
+        nextItem = items[i];
+        prevItem = i && items[i - 1];
+
+        if (i >= ln) {
+            prevItem = items[ln - 1];
+        }
+        prevPoint = prevItem && prevItem.point;
+        nextPoint = nextItem && nextItem.point;
+        x1 = prevItem ? prevPoint[0] : nextPoint[0] - tolerance;
+        y1 = prevItem ? prevPoint[1] : nextPoint[1];
+        x2 = nextItem ? nextPoint[0] : prevPoint[0] + tolerance;
+        y2 = nextItem ? nextPoint[1] : prevPoint[1];
+        dist1 = sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
+        dist2 = sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
+        dist = Math.min(dist1, dist2);
+
+        if (dist <= tolerance) {
+            return dist == dist1? prevItem : nextItem;
+        }
+        return false;
+    },
+
+    
+    toggleAll: function(show) {
+        var me = this,
+            i, ln, shadow, shadows;
+        if (!show) {
+            Ext.chart.series.Cartesian.prototype.hideAll.call(me);
+        }
+        else {
+            Ext.chart.series.Cartesian.prototype.showAll.call(me);
+        }
+        if (me.line) {
+            me.line.setAttributes({
+                hidden: !show
+            }, true);
+            
+            if (me.line.shadows) {
+                for (i = 0, shadows = me.line.shadows, ln = shadows.length; i < ln; i++) {
+                    shadow = shadows[i];
+                    shadow.setAttributes({
+                        hidden: !show
+                    }, true);
+                }
+            }
+        }
+        if (me.fillPath) {
+            me.fillPath.setAttributes({
+                hidden: !show
+            }, true);
+        }
+    },
+
+    
+    hideAll: function() {
+        this.toggleAll(false);
+    },
+
+    
+    showAll: function() {
+        this.toggleAll(true);
+    }
+});
+
+
+Ext.define('Ext.chart.series.Pie', {
+
+    
+
+    alternateClassName: ['Ext.chart.PieSeries', 'Ext.chart.PieChart'],
+
+    extend: 'Ext.chart.series.Series',
+
+    
+
+    type: "pie",
+
+    alias: 'series.pie',
+
+    rad: Math.PI / 180,
+
+    
+    highlightDuration: 150,
+
+    
+    angleField: false,
+
+    
+    lengthField: false,
+
+    
+    donut: false,
+
+    
+    showInLegend: false,
+
+    
+
+    
+    style: {},
+
+    constructor: function(config) {
+        this.callParent(arguments);
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            store = chart.store,
+            shadow = chart.shadow, i, l, cfg;
+        Ext.applyIf(me, {
+            highlightCfg: {
+                segment: {
+                    margin: 20
+                }
+            }
+        });
+        Ext.apply(me, config, {
+            shadowAttributes: [{
+                "stroke-width": 6,
+                "stroke-opacity": 1,
+                stroke: 'rgb(200, 200, 200)',
+                translate: {
+                    x: 1.2,
+                    y: 2
+                }
+            },
+            {
+                "stroke-width": 4,
+                "stroke-opacity": 1,
+                stroke: 'rgb(150, 150, 150)',
+                translate: {
+                    x: 0.9,
+                    y: 1.5
+                }
+            },
+            {
+                "stroke-width": 2,
+                "stroke-opacity": 1,
+                stroke: 'rgb(100, 100, 100)',
+                translate: {
+                    x: 0.6,
+                    y: 1
+                }
+            }]
+        });
+        me.group = surface.getGroup(me.seriesId);
+        if (shadow) {
+            for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
+                me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
+            }
+        }
+        surface.customAttributes.segment = function(opt) {
+            return me.getSegment(opt);
+        };
+        me.__excludes = me.__excludes || [];
+    },
+
+    //@private updates some onbefore render parameters.
+
+    initialize: function() {
+        var me = this,
+            store = me.chart.getChartStore();
+        
+        me.yField = [];
+        if (me.label.field) {
+            store.each(function(rec) {
+                me.yField.push(rec.get(me.label.field));
+            });
+        }
+    },
+
+    
+    getSegment: function(opt) {
+        var me = this,
+            rad = me.rad,
+            cos = Math.cos,
+            sin = Math.sin,
+            x = me.centerX,
+            y = me.centerY,
+            x1 = 0, x2 = 0, x3 = 0, x4 = 0,
+            y1 = 0, y2 = 0, y3 = 0, y4 = 0,
+            x5 = 0, y5 = 0, x6 = 0, y6 = 0,
+            delta = 1e-2,
+            startAngle = opt.startAngle,
+            endAngle = opt.endAngle,
+            midAngle = (startAngle + endAngle) / 2 * rad,
+            margin = opt.margin || 0,
+            a1 = Math.min(startAngle, endAngle) * rad,
+            a2 = Math.max(startAngle, endAngle) * rad,
+            c1 = cos(a1), s1 = sin(a1),
+            c2 = cos(a2), s2 = sin(a2),
+            cm = cos(midAngle), sm = sin(midAngle),
+            flag = 0, hsqr2 = 0.7071067811865476; 
+
+        if (a2 - a1 < delta) {
+            return {path: ""};
+        }
+
+        if (margin !== 0) {
+            x += margin * cm;
+            y += margin * sm;
+        }
+
+        x2 = x + opt.endRho * c1;
+        y2 = y + opt.endRho * s1;
+
+        x4 = x + opt.endRho * c2;
+        y4 = y + opt.endRho * s2;
+
+        if (Math.abs(x2 - x4) + Math.abs(y2 - y4) < delta) {
+            cm = hsqr2;
+            sm = -hsqr2;
+            flag = 1;
+        }
+
+        x6 = x + opt.endRho * cm;
+        y6 = y + opt.endRho * sm;
+
+        
+        
+
+        if (opt.startRho !== 0) {
+            x1 = x + opt.startRho * c1;
+            y1 = y + opt.startRho * s1;
+    
+            x3 = x + opt.startRho * c2;
+            y3 = y + opt.startRho * s2;
+    
+            x5 = x + opt.startRho * cm;
+            y5 = y + opt.startRho * sm;
+
+            return {
+                path: [
+                    ["M", x2, y2],
+                    ["A", opt.endRho, opt.endRho, 0, 0, 1, x6, y6], ["L", x6, y6],
+                    ["A", opt.endRho, opt.endRho, 0, flag, 1, x4, y4], ["L", x4, y4],
+                    ["L", x3, y3],
+                    ["A", opt.startRho, opt.startRho, 0, flag, 0, x5, y5], ["L", x5, y5],
+                    ["A", opt.startRho, opt.startRho, 0, 0, 0, x1, y1], ["L", x1, y1],
+                    ["Z"]
+                ]
+            };
+        } else {
+            return {
+                path: [
+                    ["M", x, y],
+                    ["L", x2, y2],
+                    ["A", opt.endRho, opt.endRho, 0, 0, 1, x6, y6], ["L", x6, y6],
+                    ["A", opt.endRho, opt.endRho, 0, flag, 1, x4, y4], ["L", x4, y4],
+                    ["L", x, y],
+                    ["Z"]
+                ]
+            };
+        }
+    },
+
+    
+    calcMiddle: function(item) {
+        var me = this,
+            rad = me.rad,
+            slice = item.slice,
+            x = me.centerX,
+            y = me.centerY,
+            startAngle = slice.startAngle,
+            endAngle = slice.endAngle,
+            donut = +me.donut,
+            midAngle = -(startAngle + endAngle) * rad / 2,
+            r = (item.endRho + item.startRho) / 2,
+            xm = x + r * Math.cos(midAngle),
+            ym = y - r * Math.sin(midAngle);
+
+        item.middle = {
+            x: xm,
+            y: ym
+        };
+    },
+
+    
+    drawSeries: function() {
+        var me = this,
+            store = me.chart.getChartStore(),
+            group = me.group,
+            animate = me.chart.animate,
+            field = me.angleField || me.field || me.xField,
+            lenField = [].concat(me.lengthField),
+            totalLenField = 0,
+            colors = me.colorSet,
+            chart = me.chart,
+            surface = chart.surface,
+            chartBBox = chart.chartBBox,
+            enableShadows = chart.shadow,
+            shadowGroups = me.shadowGroups,
+            shadowAttributes = me.shadowAttributes,
+            lnsh = shadowGroups.length,
+            rad = me.rad,
+            layers = lenField.length,
+            rhoAcum = 0,
+            donut = +me.donut,
+            layerTotals = [],
+            values = {},
+            fieldLength,
+            items = [],
+            passed = false,
+            totalField = 0,
+            maxLenField = 0,
+            cut = 9,
+            defcut = true,
+            angle = 0,
+            seriesStyle = me.seriesStyle,
+            seriesLabelStyle = me.seriesLabelStyle,
+            colorArrayStyle = me.colorArrayStyle,
+            colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
+            gutterX = chart.maxGutter[0],
+            gutterY = chart.maxGutter[1],
+            abs = Math.abs,
+            rendererAttributes,
+            shadowGroup,
+            shadowAttr,
+            shadows,
+            shadow,
+            shindex,
+            centerX,
+            centerY,
+            deltaRho,
+            first = 0,
+            slice,
+            slices,
+            sprite,
+            value,
+            item,
+            lenValue,
+            ln,
+            record,
+            i,
+            j,
+            startAngle,
+            endAngle,
+            middleAngle,
+            sliceLength,
+            path,
+            p,
+            spriteOptions, bbox;
+
+        Ext.apply(seriesStyle, me.style || {});
+
+        me.setBBox();
+        bbox = me.bbox;
+
+        
+        if (me.colorSet) {
+            colorArrayStyle = me.colorSet;
+            colorArrayLength = colorArrayStyle.length;
+        }
+
+        
+        if (!store || !store.getCount()) {
+            return;
+        }
+
+        me.unHighlightItem();
+        me.cleanHighlights();
+
+        centerX = me.centerX = chartBBox.x + (chartBBox.width / 2);
+        centerY = me.centerY = chartBBox.y + (chartBBox.height / 2);
+        me.radius = Math.min(centerX - chartBBox.x, centerY - chartBBox.y);
+        me.slices = slices = [];
+        me.items = items = [];
+
+        store.each(function(record, i) {
+            if (this.__excludes && this.__excludes[i]) {
+                
+                return;
+            }
+            totalField += +record.get(field);
+            if (lenField[0]) {
+                for (j = 0, totalLenField = 0; j < layers; j++) {
+                    totalLenField += +record.get(lenField[j]);
+                }
+                layerTotals[i] = totalLenField;
+                maxLenField = Math.max(maxLenField, totalLenField);
+            }
+        }, this);
+
+        totalField = totalField || 1;
+        store.each(function(record, i) {
+            if (this.__excludes && this.__excludes[i]) {
+                value = 0;
+            } else {
+                value = record.get(field);
+                if (first == 0) {
+                    first = 1;
+                }
+            }
+
+            
+            if (first == 1) {
+                first = 2;
+                me.firstAngle = angle = 360 * value / totalField / 2;
+                for (j = 0; j < i; j++) {
+                    slices[j].startAngle = slices[j].endAngle = me.firstAngle;
+                }
+            }
+            
+            endAngle = angle - 360 * value / totalField;
+            slice = {
+                series: me,
+                value: value,
+                startAngle: angle,
+                endAngle: endAngle,
+                storeItem: record
+            };
+            if (lenField[0]) {
+                lenValue = layerTotals[i];
+                slice.rho = me.radius * (lenValue / maxLenField);
+            } else {
+                slice.rho = me.radius;
+            }
+            slices[i] = slice;
+            angle = endAngle;
+        }, me);
+        
+        if (enableShadows) {
+            for (i = 0, ln = slices.length; i < ln; i++) {
+                slice = slices[i];
+                slice.shadowAttrs = [];
+                for (j = 0, rhoAcum = 0, shadows = []; j < layers; j++) {
+                    sprite = group.getAt(i * layers + j);
+                    deltaRho = lenField[j] ? store.getAt(i).get(lenField[j]) / layerTotals[i] * slice.rho: slice.rho;
+                    
+                    rendererAttributes = {
+                        segment: {
+                            startAngle: slice.startAngle,
+                            endAngle: slice.endAngle,
+                            margin: 0,
+                            rho: slice.rho,
+                            startRho: rhoAcum + (deltaRho * donut / 100),
+                            endRho: rhoAcum + deltaRho
+                        },
+                        hidden: !slice.value && (slice.startAngle % 360) == (slice.endAngle % 360)
+                    };
+                    
+                    for (shindex = 0, shadows = []; shindex < lnsh; shindex++) {
+                        shadowAttr = shadowAttributes[shindex];
+                        shadow = shadowGroups[shindex].getAt(i);
+                        if (!shadow) {
+                            shadow = chart.surface.add(Ext.apply({}, {
+                                type: 'path',
+                                group: shadowGroups[shindex],
+                                strokeLinejoin: "round"
+                            }, rendererAttributes, shadowAttr));
+                        }
+                        if (animate) {
+                            shadowAttr = me.renderer(shadow, store.getAt(i), Ext.apply({}, rendererAttributes, shadowAttr), i, store);
+                            me.onAnimate(shadow, {
+                                to: shadowAttr
+                            });
+                        } else {
+                            shadowAttr = me.renderer(shadow, store.getAt(i), shadowAttr, i, store);
+                            shadow.setAttributes(shadowAttr, true);
+                        }
+                        shadows.push(shadow);
+                    }
+                    slice.shadowAttrs[j] = shadows;
+                }
+            }
+        }
+        
+        for (i = 0, ln = slices.length; i < ln; i++) {
+            slice = slices[i];
+            for (j = 0, rhoAcum = 0; j < layers; j++) {
+                sprite = group.getAt(i * layers + j);
+                deltaRho = lenField[j] ? store.getAt(i).get(lenField[j]) / layerTotals[i] * slice.rho: slice.rho;
+                
+                rendererAttributes = Ext.apply({
+                    segment: {
+                        startAngle: slice.startAngle,
+                        endAngle: slice.endAngle,
+                        margin: 0,
+                        rho: slice.rho,
+                        startRho: rhoAcum + (deltaRho * donut / 100),
+                        endRho: rhoAcum + deltaRho
+                    },
+                    hidden: (!slice.value && (slice.startAngle % 360) == (slice.endAngle % 360))
+                }, Ext.apply(seriesStyle, colorArrayStyle && { fill: colorArrayStyle[(layers > 1? j : i) % colorArrayLength] } || {}));
+                item = Ext.apply({},
+                rendererAttributes.segment, {
+                    slice: slice,
+                    series: me,
+                    storeItem: slice.storeItem,
+                    index: i
+                });
+                me.calcMiddle(item);
+                if (enableShadows) {
+                    item.shadows = slice.shadowAttrs[j];
+                }
+                items[i] = item;
+                
+                if (!sprite) {
+                    spriteOptions = Ext.apply({
+                        type: "path",
+                        group: group,
+                        middle: item.middle
+                    }, Ext.apply(seriesStyle, colorArrayStyle && { fill: colorArrayStyle[(layers > 1? j : i) % colorArrayLength] } || {}));
+                    sprite = surface.add(Ext.apply(spriteOptions, rendererAttributes));
+                }
+                slice.sprite = slice.sprite || [];
+                item.sprite = sprite;
+                slice.sprite.push(sprite);
+                slice.point = [item.middle.x, item.middle.y];
+                if (animate) {
+                    rendererAttributes = me.renderer(sprite, store.getAt(i), rendererAttributes, i, store);
+                    sprite._to = rendererAttributes;
+                    sprite._animating = true;
+                    me.onAnimate(sprite, {
+                        to: rendererAttributes,
+                        listeners: {
+                            afteranimate: {
+                                fn: function() {
+                                    this._animating = false;
+                                },
+                                scope: sprite
+                            }
+                        }
+                    });
+                } else {
+                    rendererAttributes = me.renderer(sprite, store.getAt(i), Ext.apply(rendererAttributes, {
+                        hidden: false
+                    }), i, store);
+                    sprite.setAttributes(rendererAttributes, true);
+                }
+                rhoAcum += deltaRho;
+            }
+        }
+
+        
+        ln = group.getCount();
+        for (i = 0; i < ln; i++) {
+            if (!slices[(i / layers) >> 0] && group.getAt(i)) {
+                group.getAt(i).hide(true);
+            }
+        }
+        if (enableShadows) {
+            lnsh = shadowGroups.length;
+            for (shindex = 0; shindex < ln; shindex++) {
+                if (!slices[(shindex / layers) >> 0]) {
+                    for (j = 0; j < lnsh; j++) {
+                        if (shadowGroups[j].getAt(shindex)) {
+                            shadowGroups[j].getAt(shindex).hide(true);
+                        }
+                    }
+                }
+            }
+        }
+        me.renderLabels();
+        me.renderCallouts();
+    },
+
+    
+    onCreateLabel: function(storeItem, item, i, display) {
+        var me = this,
+            group = me.labelsGroup,
+            config = me.label,
+            centerX = me.centerX,
+            centerY = me.centerY,
+            middle = item.middle,
+            endLabelStyle = Ext.apply(me.seriesLabelStyle || {}, config || {});
+
+        return me.chart.surface.add(Ext.apply({
+            'type': 'text',
+            'text-anchor': 'middle',
+            'group': group,
+            'x': middle.x,
+            'y': middle.y
+        }, endLabelStyle));
+    },
+
+    
+    onPlaceLabel: function(label, storeItem, item, i, display, animate, index) {
+        var me = this,
+            chart = me.chart,
+            resizing = chart.resizing,
+            config = me.label,
+            format = config.renderer,
+            field = [].concat(config.field),
+            centerX = me.centerX,
+            centerY = me.centerY,
+            middle = item.middle,
+            opt = {
+                x: middle.x,
+                y: middle.y
+            },
+            x = middle.x - centerX,
+            y = middle.y - centerY,
+            from = {},
+            rho = 1,
+            theta = Math.atan2(y, x || 1),
+            dg = theta * 180 / Math.PI,
+            prevDg;
+        if (this.__excludes && this.__excludes[i]) {
+            opt.hidden = true;
+        }
+        function fixAngle(a) {
+            if (a < 0) {
+                a += 360;
+            }
+            return a % 360;
+        }
+
+        label.setAttributes({
+            text: format(storeItem.get(field[index]))
+        }, true);
+
+        switch (display) {
+        case 'outside':
+            rho = Math.sqrt(x * x + y * y) * 2;
+            
+            opt.x = rho * Math.cos(theta) + centerX;
+            opt.y = rho * Math.sin(theta) + centerY;
+            break;
+
+        case 'rotate':
+            dg = fixAngle(dg);
+            dg = (dg > 90 && dg < 270) ? dg + 180: dg;
+
+            prevDg = label.attr.rotation.degrees;
+            if (prevDg != null && Math.abs(prevDg - dg) > 180) {
+                if (dg > prevDg) {
+                    dg -= 360;
+                } else {
+                    dg += 360;
+                }
+                dg = dg % 360;
+            } else {
+                dg = fixAngle(dg);
+            }
+            
+            opt.rotate = {
+                degrees: dg,
+                x: opt.x,
+                y: opt.y
+            };
+            break;
+
+        default:
+            break;
+        }
+        
+        opt.translate = {
+            x: 0, y: 0
+        };
+        if (animate && !resizing && (display != 'rotate' || prevDg != null)) {
+            me.onAnimate(label, {
+                to: opt
+            });
+        } else {
+            label.setAttributes(opt, true);
+        }
+        label._from = from;
+    },
+
+    
+    onPlaceCallout: function(callout, storeItem, item, i, display, animate, index) {
+        var me = this,
+            chart = me.chart,
+            resizing = chart.resizing,
+            config = me.callouts,
+            centerX = me.centerX,
+            centerY = me.centerY,
+            middle = item.middle,
+            opt = {
+                x: middle.x,
+                y: middle.y
+            },
+            x = middle.x - centerX,
+            y = middle.y - centerY,
+            rho = 1,
+            rhoCenter,
+            theta = Math.atan2(y, x || 1),
+            bbox = callout.label.getBBox(),
+            offsetFromViz = 20,
+            offsetToSide = 10,
+            offsetBox = 10,
+            p;
+
+        
+        rho = item.endRho + offsetFromViz;
+        rhoCenter = (item.endRho + item.startRho) / 2 + (item.endRho - item.startRho) / 3;
+        
+        opt.x = rho * Math.cos(theta) + centerX;
+        opt.y = rho * Math.sin(theta) + centerY;
+
+        x = rhoCenter * Math.cos(theta);
+        y = rhoCenter * Math.sin(theta);
+
+        if (chart.animate) {
+            
+            me.onAnimate(callout.lines, {
+                to: {
+                    path: ["M", x + centerX, y + centerY, "L", opt.x, opt.y, "Z", "M", opt.x, opt.y, "l", x > 0 ? offsetToSide: -offsetToSide, 0, "z"]
+                }
+            });
+            
+            me.onAnimate(callout.box, {
+                to: {
+                    x: opt.x + (x > 0 ? offsetToSide: -(offsetToSide + bbox.width + 2 * offsetBox)),
+                    y: opt.y + (y > 0 ? ( - bbox.height - offsetBox / 2) : ( - bbox.height - offsetBox / 2)),
+                    width: bbox.width + 2 * offsetBox,
+                    height: bbox.height + 2 * offsetBox
+                }
+            });
+            
+            me.onAnimate(callout.label, {
+                to: {
+                    x: opt.x + (x > 0 ? (offsetToSide + offsetBox) : -(offsetToSide + bbox.width + offsetBox)),
+                    y: opt.y + (y > 0 ? -bbox.height / 4: -bbox.height / 4)
+                }
+            });
+        } else {
+            
+            callout.lines.setAttributes({
+                path: ["M", x + centerX, y + centerY, "L", opt.x, opt.y, "Z", "M", opt.x, opt.y, "l", x > 0 ? offsetToSide: -offsetToSide, 0, "z"]
+            },
+            true);
+            
+            callout.box.setAttributes({
+                x: opt.x + (x > 0 ? offsetToSide: -(offsetToSide + bbox.width + 2 * offsetBox)),
+                y: opt.y + (y > 0 ? ( - bbox.height - offsetBox / 2) : ( - bbox.height - offsetBox / 2)),
+                width: bbox.width + 2 * offsetBox,
+                height: bbox.height + 2 * offsetBox
+            },
+            true);
+            
+            callout.label.setAttributes({
+                x: opt.x + (x > 0 ? (offsetToSide + offsetBox) : -(offsetToSide + bbox.width + offsetBox)),
+                y: opt.y + (y > 0 ? -bbox.height / 4: -bbox.height / 4)
+            },
+            true);
+        }
+        for (p in callout) {
+            callout[p].show(true);
+        }
+    },
+
+    
+    onAnimate: function(sprite, attr) {
+        sprite.show();
+        return this.callParent(arguments);
+    },
+
+    isItemInPoint: function(x, y, item, i) {
+        var me = this,
+            cx = me.centerX,
+            cy = me.centerY,
+            abs = Math.abs,
+            dx = abs(x - cx),
+            dy = abs(y - cy),
+            startAngle = item.startAngle,
+            endAngle = item.endAngle,
+            rho = Math.sqrt(dx * dx + dy * dy),
+            angle = Math.atan2(y - cy, x - cx) / me.rad;
+
+        
+        if (angle > me.firstAngle) {
+            angle -= 360;
+        }
+        return (angle <= startAngle && angle > endAngle
+                && rho >= item.startRho && rho <= item.endRho);
+    },
+
+    
+    hideAll: function() {
+        var i, l, shadow, shadows, sh, lsh, sprite;
+        if (!isNaN(this._index)) {
+            this.__excludes = this.__excludes || [];
+            this.__excludes[this._index] = true;
+            sprite = this.slices[this._index].sprite;
+            for (sh = 0, lsh = sprite.length; sh < lsh; sh++) {
+                sprite[sh].setAttributes({
+                    hidden: true
+                }, true);
+            }
+            if (this.slices[this._index].shadowAttrs) {
+                for (i = 0, shadows = this.slices[this._index].shadowAttrs, l = shadows.length; i < l; i++) {
+                    shadow = shadows[i];
+                    for (sh = 0, lsh = shadow.length; sh < lsh; sh++) {
+                        shadow[sh].setAttributes({
+                            hidden: true
+                        }, true);
+                    }
+                }
+            }
+            this.drawSeries();
+        }
+    },
+
+    
+    showAll: function() {
+        if (!isNaN(this._index)) {
+            this.__excludes[this._index] = false;
+            this.drawSeries();
+        }
+    },
+
+    
+    highlightItem: function(item) {
+        var me = this,
+            rad = me.rad;
+        item = item || this.items[this._index];
+
+        
+        
+        
+        
+        this.unHighlightItem();
+
+        if (!item || item.sprite && item.sprite._animating) {
+            return;
+        }
+        me.callParent([item]);
+        if (!me.highlight) {
+            return;
+        }
+        if ('segment' in me.highlightCfg) {
+            var highlightSegment = me.highlightCfg.segment,
+                animate = me.chart.animate,
+                attrs, i, shadows, shadow, ln, to, itemHighlightSegment, prop;
+            
+            if (me.labelsGroup) {
+                var group = me.labelsGroup,
+                    display = me.label.display,
+                    label = group.getAt(item.index),
+                    middle = (item.startAngle + item.endAngle) / 2 * rad,
+                    r = highlightSegment.margin || 0,
+                    x = r * Math.cos(middle),
+                    y = r * Math.sin(middle);
+
+                
+                
+                
+                
+                
+                if (Math.abs(x) < 1e-10) {
+                    x = 0;
+                }
+                if (Math.abs(y) < 1e-10) {
+                    y = 0;
+                }
+
+                if (animate) {
+                    label.stopAnimation();
+                    label.animate({
+                        to: {
+                            translate: {
+                                x: x,
+                                y: y
+                            }
+                        },
+                        duration: me.highlightDuration
+                    });
+                }
+                else {
+                    label.setAttributes({
+                        translate: {
+                            x: x,
+                            y: y
+                        }
+                    }, true);
+                }
+            }
+            
+            if (me.chart.shadow && item.shadows) {
+                i = 0;
+                shadows = item.shadows;
+                ln = shadows.length;
+                for (; i < ln; i++) {
+                    shadow = shadows[i];
+                    to = {};
+                    itemHighlightSegment = item.sprite._from.segment;
+                    for (prop in itemHighlightSegment) {
+                        if (! (prop in highlightSegment)) {
+                            to[prop] = itemHighlightSegment[prop];
+                        }
+                    }
+                    attrs = {
+                        segment: Ext.applyIf(to, me.highlightCfg.segment)
+                    };
+                    if (animate) {
+                        shadow.stopAnimation();
+                        shadow.animate({
+                            to: attrs,
+                            duration: me.highlightDuration
+                        });
+                    }
+                    else {
+                        shadow.setAttributes(attrs, true);
+                    }
+                }
+            }
+        }
+    },
+
+    
+    unHighlightItem: function() {
+        var me = this;
+        if (!me.highlight) {
+            return;
+        }
+
+        if (('segment' in me.highlightCfg) && me.items) {
+            var items = me.items,
+                animate = me.chart.animate,
+                shadowsEnabled = !!me.chart.shadow,
+                group = me.labelsGroup,
+                len = items.length,
+                i = 0,
+                j = 0,
+                display = me.label.display,
+                shadowLen, p, to, ihs, hs, sprite, shadows, shadow, item, label, attrs;
+
+            for (; i < len; i++) {
+                item = items[i];
+                if (!item) {
+                    continue;
+                }
+                sprite = item.sprite;
+                if (sprite && sprite._highlighted) {
+                    
+                    if (group) {
+                        label = group.getAt(item.index);
+                        attrs = Ext.apply({
+                            translate: {
+                                x: 0,
+                                y: 0
+                            }
+                        },
+                        display == 'rotate' ? {
+                            rotate: {
+                                x: label.attr.x,
+                                y: label.attr.y,
+                                degrees: label.attr.rotation.degrees
+                            }
+                        }: {});
+                        if (animate) {
+                            label.stopAnimation();
+                            label.animate({
+                                to: attrs,
+                                duration: me.highlightDuration
+                            });
+                        }
+                        else {
+                            label.setAttributes(attrs, true);
+                        }
+                    }
+                    if (shadowsEnabled) {
+                        shadows = item.shadows;
+                        shadowLen = shadows.length;
+                        for (; j < shadowLen; j++) {
+                            to = {};
+                            ihs = item.sprite._to.segment;
+                            hs = item.sprite._from.segment;
+                            Ext.apply(to, hs);
+                            for (p in ihs) {
+                                if (! (p in hs)) {
+                                    to[p] = ihs[p];
+                                }
+                            }
+                            shadow = shadows[j];
+                            if (animate) {
+                                shadow.stopAnimation();
+                                shadow.animate({
+                                    to: {
+                                        segment: to
+                                    },
+                                    duration: me.highlightDuration
+                                });
+                            }
+                            else {
+                                shadow.setAttributes({ segment: to }, true);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        me.callParent(arguments);
+    },
+
+    
+    getLegendColor: function(index) {
+        var me = this;
+        return (me.colorSet && me.colorSet[index % me.colorSet.length]) || me.colorArrayStyle[index % me.colorArrayStyle.length];
+    }
+});
+
+
+
+Ext.define('Ext.chart.series.Radar', {
+
+    
+
+    extend: 'Ext.chart.series.Series',
+
+    requires: ['Ext.chart.Shape', 'Ext.fx.Anim'],
+
+    
+
+    type: "radar",
+    alias: 'series.radar',
+
+
+    rad: Math.PI / 180,
+
+    showInLegend: false,
+
+    
+    style: {},
+
+    constructor: function(config) {
+        this.callParent(arguments);
+        var me = this,
+            surface = me.chart.surface, i, l;
+        me.group = surface.getGroup(me.seriesId);
+        if (me.showMarkers) {
+            me.markerGroup = surface.getGroup(me.seriesId + '-markers');
+        }
+    },
+
+    
+    drawSeries: function() {
+        var me = this,
+            store = me.chart.getChartStore(),
+            group = me.group,
+            sprite,
+            chart = me.chart,
+            animate = chart.animate,
+            field = me.field || me.yField,
+            surface = chart.surface,
+            chartBBox = chart.chartBBox,
+            rendererAttributes,
+            centerX, centerY,
+            items,
+            radius,
+            maxValue = 0,
+            fields = [],
+            max = Math.max,
+            cos = Math.cos,
+            sin = Math.sin,
+            pi2 = Math.PI * 2,
+            l = store.getCount(),
+            startPath, path, x, y, rho,
+            i, nfields,
+            seriesStyle = me.seriesStyle,
+            seriesLabelStyle = me.seriesLabelStyle,
+            first = chart.resizing || !me.radar,
+            axis = chart.axes && chart.axes.get(0),
+            aggregate = !(axis && axis.maximum);
+
+        me.setBBox();
+
+        maxValue = aggregate? 0 : (axis.maximum || 0);
+
+        Ext.apply(seriesStyle, me.style || {});
+
+        
+        if (!store || !store.getCount()) {
+            return;
+        }
+
+        me.unHighlightItem();
+        me.cleanHighlights();
+
+        centerX = me.centerX = chartBBox.x + (chartBBox.width / 2);
+        centerY = me.centerY = chartBBox.y + (chartBBox.height / 2);
+        me.radius = radius = Math.min(chartBBox.width, chartBBox.height) /2;
+        me.items = items = [];
+
+        if (aggregate) {
+            
+            chart.series.each(function(series) {
+                fields.push(series.yField);
+            });
+            
+            store.each(function(record, i) {
+                for (i = 0, nfields = fields.length; i < nfields; i++) {
+                    maxValue = max(+record.get(fields[i]), maxValue);
+                }
+            });
+        }
+        
+        maxValue = maxValue || 1;
+        
+        startPath = []; path = [];
+        store.each(function(record, i) {
+            rho = radius * record.get(field) / maxValue;
+            x = rho * cos(i / l * pi2);
+            y = rho * sin(i / l * pi2);
+            if (i == 0) {
+                path.push('M', x + centerX, y + centerY);
+                startPath.push('M', 0.01 * x + centerX, 0.01 * y + centerY);
+            } else {
+                path.push('L', x + centerX, y + centerY);
+                startPath.push('L', 0.01 * x + centerX, 0.01 * y + centerY);
+            }
+            items.push({
+                sprite: false, 
+                point: [centerX + x, centerY + y],
+                series: me
+            });
+        });
+        path.push('Z');
+        
+        if (!me.radar) {
+            me.radar = surface.add(Ext.apply({
+                type: 'path',
+                group: group,
+                path: startPath
+            }, seriesStyle || {}));
+        }
+        
+        if (chart.resizing) {
+            me.radar.setAttributes({
+                path: startPath
+            }, true);
+        }
+        
+        if (chart.animate) {
+            me.onAnimate(me.radar, {
+                to: Ext.apply({
+                    path: path
+                }, seriesStyle || {})
+            });
+        } else {
+            me.radar.setAttributes(Ext.apply({
+                path: path
+            }, seriesStyle || {}), true);
+        }
+        
+        if (me.showMarkers) {
+            me.drawMarkers();
+        }
+        me.renderLabels();
+        me.renderCallouts();
+    },
+
+    
+    drawMarkers: function() {
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            markerStyle = Ext.apply({}, me.markerStyle || {}),
+            endMarkerStyle = Ext.apply(markerStyle, me.markerConfig),
+            items = me.items,
+            type = endMarkerStyle.type,
+            markerGroup = me.markerGroup,
+            centerX = me.centerX,
+            centerY = me.centerY,
+            item, i, l, marker;
+
+        delete endMarkerStyle.type;
+
+        for (i = 0, l = items.length; i < l; i++) {
+            item = items[i];
+            marker = markerGroup.getAt(i);
+            if (!marker) {
+                marker = Ext.chart.Shape[type](surface, Ext.apply({
+                    group: markerGroup,
+                    x: 0,
+                    y: 0,
+                    translate: {
+                        x: centerX,
+                        y: centerY
+                    }
+                }, endMarkerStyle));
+            }
+            else {
+                marker.show();
+            }
+            if (chart.resizing) {
+                marker.setAttributes({
+                    x: 0,
+                    y: 0,
+                    translate: {
+                        x: centerX,
+                        y: centerY
+                    }
+                }, true);
+            }
+            marker._to = {
+                translate: {
+                    x: item.point[0],
+                    y: item.point[1]
+                }
+            };
+            
+            if (chart.animate) {
+                me.onAnimate(marker, {
+                    to: marker._to
+                });
+            }
+            else {
+                marker.setAttributes(Ext.apply(marker._to, endMarkerStyle || {}), true);
+            }
+        }
+    },
+
+    isItemInPoint: function(x, y, item) {
+        var point,
+            tolerance = 10,
+            abs = Math.abs;
+        point = item.point;
+        return (abs(point[0] - x) <= tolerance &&
+                abs(point[1] - y) <= tolerance);
+    },
+
+    
+    onCreateLabel: function(storeItem, item, i, display) {
+        var me = this,
+            group = me.labelsGroup,
+            config = me.label,
+            centerX = me.centerX,
+            centerY = me.centerY,
+            point = item.point,
+            endLabelStyle = Ext.apply(me.seriesLabelStyle || {}, config);
+
+        return me.chart.surface.add(Ext.apply({
+            'type': 'text',
+            'text-anchor': 'middle',
+            'group': group,
+            'x': centerX,
+            'y': centerY
+        }, config || {}));
+    },
+
+    
+    onPlaceLabel: function(label, storeItem, item, i, display, animate) {
+        var me = this,
+            chart = me.chart,
+            resizing = chart.resizing,
+            config = me.label,
+            format = config.renderer,
+            field = config.field,
+            centerX = me.centerX,
+            centerY = me.centerY,
+            opt = {
+                x: item.point[0],
+                y: item.point[1]
+            },
+            x = opt.x - centerX,
+            y = opt.y - centerY;
+
+        label.setAttributes({
+            text: format(storeItem.get(field)),
+            hidden: true
+        },
+        true);
+
+        if (resizing) {
+            label.setAttributes({
+                x: centerX,
+                y: centerY
+            }, true);
+        }
+
+        if (animate) {
+            label.show(true);
+            me.onAnimate(label, {
+                to: opt
+            });
+        } else {
+            label.setAttributes(opt, true);
+            label.show(true);
+        }
+    },
+
+    
+    toggleAll: function(show) {
+        var me = this,
+            i, ln, shadow, shadows;
+        if (!show) {
+            Ext.chart.series.Radar.superclass.hideAll.call(me);
+        }
+        else {
+            Ext.chart.series.Radar.superclass.showAll.call(me);
+        }
+        if (me.radar) {
+            me.radar.setAttributes({
+                hidden: !show
+            }, true);
+            
+            if (me.radar.shadows) {
+                for (i = 0, shadows = me.radar.shadows, ln = shadows.length; i < ln; i++) {
+                    shadow = shadows[i];
+                    shadow.setAttributes({
+                        hidden: !show
+                    }, true);
+                }
+            }
+        }
+    },
+
+    
+    hideAll: function() {
+        this.toggleAll(false);
+        this.hideMarkers(0);
+    },
+
+    
+    showAll: function() {
+        this.toggleAll(true);
+    },
+
+    
+    hideMarkers: function(index) {
+        var me = this,
+            count = me.markerGroup && me.markerGroup.getCount() || 0,
+            i = index || 0;
+        for (; i < count; i++) {
+            me.markerGroup.getAt(i).hide(true);
+        }
+    }
+});
+
+
+
+Ext.define('Ext.chart.series.Scatter', {
+
+    
+
+    extend: 'Ext.chart.series.Cartesian',
+
+    requires: ['Ext.chart.axis.Axis', 'Ext.chart.Shape', 'Ext.fx.Anim'],
+
+    
+
+    type: 'scatter',
+    alias: 'series.scatter',
+
+    
+
+    
+    
+    
+
+    constructor: function(config) {
+        this.callParent(arguments);
+        var me = this,
+            shadow = me.chart.shadow,
+            surface = me.chart.surface, i, l;
+        Ext.apply(me, config, {
+            style: {},
+            markerConfig: {},
+            shadowAttributes: [{
+                "stroke-width": 6,
+                "stroke-opacity": 0.05,
+                stroke: 'rgb(0, 0, 0)'
+            }, {
+                "stroke-width": 4,
+                "stroke-opacity": 0.1,
+                stroke: 'rgb(0, 0, 0)'
+            }, {
+                "stroke-width": 2,
+                "stroke-opacity": 0.15,
+                stroke: 'rgb(0, 0, 0)'
+            }]
+        });
+        me.group = surface.getGroup(me.seriesId);
+        if (shadow) {
+            for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
+                me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
+            }
+        }
+    },
+
+    
+    getBounds: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            axes = [].concat(me.axis),
+            bbox, xScale, yScale, ln, minX, minY, maxX, maxY, i, axis, ends;
+
+        me.setBBox();
+        bbox = me.bbox;
+
+        for (i = 0, ln = axes.length; i < ln; i++) {
+            axis = chart.axes.get(axes[i]);
+            if (axis) {
+                ends = axis.calcEnds();
+                if (axis.position == 'top' || axis.position == 'bottom') {
+                    minX = ends.from;
+                    maxX = ends.to;
+                }
+                else {
+                    minY = ends.from;
+                    maxY = ends.to;
+                }
+            }
+        }
+        
+        if (me.xField && !Ext.isNumber(minX)) {
+            axis = Ext.create('Ext.chart.axis.Axis', {
+                chart: chart,
+                fields: [].concat(me.xField)
+            }).calcEnds();
+            minX = axis.from;
+            maxX = axis.to;
+        }
+        if (me.yField && !Ext.isNumber(minY)) {
+            axis = Ext.create('Ext.chart.axis.Axis', {
+                chart: chart,
+                fields: [].concat(me.yField)
+            }).calcEnds();
+            minY = axis.from;
+            maxY = axis.to;
+        }
+
+        if (isNaN(minX)) {
+            minX = 0;
+            maxX = store.getCount() - 1;
+            xScale = bbox.width / (store.getCount() - 1);
+        }
+        else {
+            xScale = bbox.width / (maxX - minX);
+        }
+
+        if (isNaN(minY)) {
+            minY = 0;
+            maxY = store.getCount() - 1;
+            yScale = bbox.height / (store.getCount() - 1);
+        }
+        else {
+            yScale = bbox.height / (maxY - minY);
+        }
+
+        return {
+            bbox: bbox,
+            minX: minX,
+            minY: minY,
+            xScale: xScale,
+            yScale: yScale
+        };
+    },
+
+    
+    getPaths: function() {
+        var me = this,
+            chart = me.chart,
+            enableShadows = chart.shadow,
+            store = chart.getChartStore(),
+            group = me.group,
+            bounds = me.bounds = me.getBounds(),
+            bbox = me.bbox,
+            xScale = bounds.xScale,
+            yScale = bounds.yScale,
+            minX = bounds.minX,
+            minY = bounds.minY,
+            boxX = bbox.x,
+            boxY = bbox.y,
+            boxHeight = bbox.height,
+            items = me.items = [],
+            attrs = [],
+            x, y, xValue, yValue, sprite;
+
+        store.each(function(record, i) {
+            xValue = record.get(me.xField);
+            yValue = record.get(me.yField);
+            
+            if (typeof yValue == 'undefined' || (typeof yValue == 'string' && !yValue)) {
+                return;
+            }
+            
+            if (typeof xValue == 'string' || typeof xValue == 'object' && !Ext.isDate(xValue)) {
+                xValue = i;
+            }
+            if (typeof yValue == 'string' || typeof yValue == 'object' && !Ext.isDate(yValue)) {
+                yValue = i;
+            }
+            x = boxX + (xValue - minX) * xScale;
+            y = boxY + boxHeight - (yValue - minY) * yScale;
+            attrs.push({
+                x: x,
+                y: y
+            });
+
+            me.items.push({
+                series: me,
+                value: [xValue, yValue],
+                point: [x, y],
+                storeItem: record
+            });
+
+            
+            if (chart.animate && chart.resizing) {
+                sprite = group.getAt(i);
+                if (sprite) {
+                    me.resetPoint(sprite);
+                    if (enableShadows) {
+                        me.resetShadow(sprite);
+                    }
+                }
+            }
+        });
+        return attrs;
+    },
+
+    
+    resetPoint: function(sprite) {
+        var bbox = this.bbox;
+        sprite.setAttributes({
+            translate: {
+                x: (bbox.x + bbox.width) / 2,
+                y: (bbox.y + bbox.height) / 2
+            }
+        }, true);
+    },
+
+    
+    resetShadow: function(sprite) {
+        var me = this,
+            shadows = sprite.shadows,
+            shadowAttributes = me.shadowAttributes,
+            ln = me.shadowGroups.length,
+            bbox = me.bbox,
+            i, attr;
+        for (i = 0; i < ln; i++) {
+            attr = Ext.apply({}, shadowAttributes[i]);
+            if (attr.translate) {
+                attr.translate.x += (bbox.x + bbox.width) / 2;
+                attr.translate.y += (bbox.y + bbox.height) / 2;
+            }
+            else {
+                attr.translate = {
+                    x: (bbox.x + bbox.width) / 2,
+                    y: (bbox.y + bbox.height) / 2
+                };
+            }
+            shadows[i].setAttributes(attr, true);
+        }
+    },
+
+    
+    createPoint: function(attr, type) {
+        var me = this,
+            chart = me.chart,
+            group = me.group,
+            bbox = me.bbox;
+
+        return Ext.chart.Shape[type](chart.surface, Ext.apply({}, {
+            x: 0,
+            y: 0,
+            group: group,
+            translate: {
+                x: (bbox.x + bbox.width) / 2,
+                y: (bbox.y + bbox.height) / 2
+            }
+        }, attr));
+    },
+
+    
+    createShadow: function(sprite, endMarkerStyle, type) {
+        var me = this,
+            chart = me.chart,
+            shadowGroups = me.shadowGroups,
+            shadowAttributes = me.shadowAttributes,
+            lnsh = shadowGroups.length,
+            bbox = me.bbox,
+            i, shadow, shadows, attr;
+
+        sprite.shadows = shadows = [];
+
+        for (i = 0; i < lnsh; i++) {
+            attr = Ext.apply({}, shadowAttributes[i]);
+            if (attr.translate) {
+                attr.translate.x += (bbox.x + bbox.width) / 2;
+                attr.translate.y += (bbox.y + bbox.height) / 2;
+            }
+            else {
+                Ext.apply(attr, {
+                    translate: {
+                        x: (bbox.x + bbox.width) / 2,
+                        y: (bbox.y + bbox.height) / 2
+                    }
+                });
+            }
+            Ext.apply(attr, endMarkerStyle);
+            shadow = Ext.chart.Shape[type](chart.surface, Ext.apply({}, {
+                x: 0,
+                y: 0,
+                group: shadowGroups[i]
+            }, attr));
+            shadows.push(shadow);
+        }
+    },
+
+    
+    drawSeries: function() {
+        var me = this,
+            chart = me.chart,
+            store = chart.getChartStore(),
+            group = me.group,
+            enableShadows = chart.shadow,
+            shadowGroups = me.shadowGroups,
+            shadowAttributes = me.shadowAttributes,
+            lnsh = shadowGroups.length,
+            sprite, attrs, attr, ln, i, endMarkerStyle, shindex, type, shadows,
+            rendererAttributes, shadowAttribute;
+
+        endMarkerStyle = Ext.apply(me.markerStyle, me.markerConfig);
+        type = endMarkerStyle.type;
+        delete endMarkerStyle.type;
+
+        
+        if (!store || !store.getCount()) {
+            return;
+        }
+
+        me.unHighlightItem();
+        me.cleanHighlights();
+
+        attrs = me.getPaths();
+        ln = attrs.length;
+        for (i = 0; i < ln; i++) {
+            attr = attrs[i];
+            sprite = group.getAt(i);
+            Ext.apply(attr, endMarkerStyle);
+
+            
+            if (!sprite) {
+                sprite = me.createPoint(attr, type);
+                if (enableShadows) {
+                    me.createShadow(sprite, endMarkerStyle, type);
+                }
+            }
+
+            shadows = sprite.shadows;
+            if (chart.animate) {
+                rendererAttributes = me.renderer(sprite, store.getAt(i), { translate: attr }, i, store);
+                sprite._to = rendererAttributes;
+                me.onAnimate(sprite, {
+                    to: rendererAttributes
+                });
+                
+                for (shindex = 0; shindex < lnsh; shindex++) {
+                    shadowAttribute = Ext.apply({}, shadowAttributes[shindex]);
+                    rendererAttributes = me.renderer(shadows[shindex], store.getAt(i), Ext.apply({}, { 
+                        hidden: false,
+                        translate: {
+                            x: attr.x + (shadowAttribute.translate? shadowAttribute.translate.x : 0),
+                            y: attr.y + (shadowAttribute.translate? shadowAttribute.translate.y : 0)
+                        }
+                    }, shadowAttribute), i, store);
+                    me.onAnimate(shadows[shindex], { to: rendererAttributes });
+                }
+            }
+            else {
+                rendererAttributes = me.renderer(sprite, store.getAt(i), { translate: attr }, i, store);
+                sprite._to = rendererAttributes;
+                sprite.setAttributes(rendererAttributes, true);
+                
+                for (shindex = 0; shindex < lnsh; shindex++) {
+                    shadowAttribute = Ext.apply({}, shadowAttributes[shindex]);
+                    rendererAttributes = me.renderer(shadows[shindex], store.getAt(i), Ext.apply({}, { 
+                        hidden: false,
+                        translate: {
+                            x: attr.x + (shadowAttribute.translate? shadowAttribute.translate.x : 0),
+                            y: attr.y + (shadowAttribute.translate? shadowAttribute.translate.y : 0)
+                        } 
+                    }, shadowAttribute), i, store);
+                    shadows[shindex].setAttributes(rendererAttributes, true);
+                }
+            }
+            me.items[i].sprite = sprite;
+        }
+
+        
+        ln = group.getCount();
+        for (i = attrs.length; i < ln; i++) {
+            group.getAt(i).hide(true);
+        }
+        me.renderLabels();
+        me.renderCallouts();
+    },
+
+    
+    onCreateLabel: function(storeItem, item, i, display) {
+        var me = this,
+            group = me.labelsGroup,
+            config = me.label,
+            endLabelStyle = Ext.apply({}, config, me.seriesLabelStyle),
+            bbox = me.bbox;
+
+        return me.chart.surface.add(Ext.apply({
+            type: 'text',
+            group: group,
+            x: item.point[0],
+            y: bbox.y + bbox.height / 2
+        }, endLabelStyle));
+    },
+
+    
+    onPlaceLabel: function(label, storeItem, item, i, display, animate) {
+        var me = this,
+            chart = me.chart,
+            resizing = chart.resizing,
+            config = me.label,
+            format = config.renderer,
+            field = config.field,
+            bbox = me.bbox,
+            x = item.point[0],
+            y = item.point[1],
+            radius = item.sprite.attr.radius,
+            bb, width, height, anim;
+
+        label.setAttributes({
+            text: format(storeItem.get(field)),
+            hidden: true
+        }, true);
+
+        if (display == 'rotate') {
+            label.setAttributes({
+                'text-anchor': 'start',
+                'rotation': {
+                    x: x,
+                    y: y,
+                    degrees: -45
+                }
+            }, true);
+            
+            bb = label.getBBox();
+            width = bb.width;
+            height = bb.height;
+            x = x < bbox.x? bbox.x : x;
+            x = (x + width > bbox.x + bbox.width)? (x - (x + width - bbox.x - bbox.width)) : x;
+            y = (y - height < bbox.y)? bbox.y + height : y;
+
+        } else if (display == 'under' || display == 'over') {
+            
+            bb = item.sprite.getBBox();
+            bb.width = bb.width || (radius * 2);
+            bb.height = bb.height || (radius * 2);
+            y = y + (display == 'over'? -bb.height : bb.height);
+            
+            bb = label.getBBox();
+            width = bb.width/2;
+            height = bb.height/2;
+            x = x - width < bbox.x ? bbox.x + width : x;
+            x = (x + width > bbox.x + bbox.width) ? (x - (x + width - bbox.x - bbox.width)) : x;
+            y = y - height < bbox.y? bbox.y + height : y;
+            y = (y + height > bbox.y + bbox.height) ? (y - (y + height - bbox.y - bbox.height)) : y;
+        }
+
+        if (!chart.animate) {
+            label.setAttributes({
+                x: x,
+                y: y
+            }, true);
+            label.show(true);
+        }
+        else {
+            if (resizing) {
+                anim = item.sprite.getActiveAnimation();
+                if (anim) {
+                    anim.on('afteranimate', function() {
+                        label.setAttributes({
+                            x: x,
+                            y: y
+                        }, true);
+                        label.show(true);
+                    });
+                }
+                else {
+                    label.show(true);
+                }
+            }
+            else {
+                me.onAnimate(label, {
+                    to: {
+                        x: x,
+                        y: y
+                    }
+                });
+            }
+        }
+    },
+
+    
+    onPlaceCallout: function(callout, storeItem, item, i, display, animate, index) {
+        var me = this,
+            chart = me.chart,
+            surface = chart.surface,
+            resizing = chart.resizing,
+            config = me.callouts,
+            items = me.items,
+            cur = item.point,
+            normal,
+            bbox = callout.label.getBBox(),
+            offsetFromViz = 30,
+            offsetToSide = 10,
+            offsetBox = 3,
+            boxx, boxy, boxw, boxh,
+            p, clipRect = me.bbox,
+            x, y;
+
+        
+        normal = [Math.cos(Math.PI /4), -Math.sin(Math.PI /4)];
+        x = cur[0] + normal[0] * offsetFromViz;
+        y = cur[1] + normal[1] * offsetFromViz;
+
+        
+        boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
+        boxy = y - bbox.height /2 - offsetBox;
+        boxw = bbox.width + 2 * offsetBox;
+        boxh = bbox.height + 2 * offsetBox;
+
+        
+        
+        if (boxx < clipRect[0] || (boxx + boxw) > (clipRect[0] + clipRect[2])) {
+            normal[0] *= -1;
+        }
+        if (boxy < clipRect[1] || (boxy + boxh) > (clipRect[1] + clipRect[3])) {
+            normal[1] *= -1;
+        }
+
+        
+        x = cur[0] + normal[0] * offsetFromViz;
+        y = cur[1] + normal[1] * offsetFromViz;
+
+        
+        boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
+        boxy = y - bbox.height /2 - offsetBox;
+        boxw = bbox.width + 2 * offsetBox;
+        boxh = bbox.height + 2 * offsetBox;
+
+        if (chart.animate) {
+            
+            me.onAnimate(callout.lines, {
+                to: {
+                    path: ["M", cur[0], cur[1], "L", x, y, "Z"]
+                }
+            }, true);
+            
+            me.onAnimate(callout.box, {
+                to: {
+                    x: boxx,
+                    y: boxy,
+                    width: boxw,
+                    height: boxh
+                }
+            }, true);
+            
+            me.onAnimate(callout.label, {
+                to: {
+                    x: x + (normal[0] > 0? offsetBox : -(bbox.width + offsetBox)),
+                    y: y
+                }
+            }, true);
+        } else {
+            
+            callout.lines.setAttributes({
+                path: ["M", cur[0], cur[1], "L", x, y, "Z"]
+            }, true);
+            
+            callout.box.setAttributes({
+                x: boxx,
+                y: boxy,
+                width: boxw,
+                height: boxh
+            }, true);
+            
+            callout.label.setAttributes({
+                x: x + (normal[0] > 0? offsetBox : -(bbox.width + offsetBox)),
+                y: y
+            }, true);
+        }
+        for (p in callout) {
+            callout[p].show(true);
+        }
+    },
+
+    
+    onAnimate: function(sprite, attr) {
+        sprite.show();
+        return this.callParent(arguments);
+    },
+
+    isItemInPoint: function(x, y, item) {
+        var point,
+            tolerance = 10,
+            abs = Math.abs;
+
+        function dist(point) {
+            var dx = abs(point[0] - x),
+                dy = abs(point[1] - y);
+            return Math.sqrt(dx * dx + dy * dy);
+        }
+        point = item.point;
+        return (point[0] - tolerance <= x && point[0] + tolerance >= x &&
+            point[1] - tolerance <= y && point[1] + tolerance >= y);
+    }
+});
+
+
+
+Ext.define('Ext.chart.theme.Base', {
+
+    
+
+    requires: ['Ext.chart.theme.Theme'],
+
+    
+
+    constructor: function(config) {
+        Ext.chart.theme.call(this, config, {
+            background: false,
+            axis: {
+                stroke: '#444',
+                'stroke-width': 1
+            },
+            axisLabelTop: {
+                fill: '#444',
+                font: '12px Arial, Helvetica, sans-serif',
+                spacing: 2,
+                padding: 5,
+                renderer: function(v) { return v; }
+            },
+            axisLabelRight: {
+                fill: '#444',
+                font: '12px Arial, Helvetica, sans-serif',
+                spacing: 2,
+                padding: 5,
+                renderer: function(v) { return v; }
+            },
+            axisLabelBottom: {
+                fill: '#444',
+                font: '12px Arial, Helvetica, sans-serif',
+                spacing: 2,
+                padding: 5,
+                renderer: function(v) { return v; }
+            },
+            axisLabelLeft: {
+                fill: '#444',
+                font: '12px Arial, Helvetica, sans-serif',
+                spacing: 2,
+                padding: 5,
+                renderer: function(v) { return v; }
+            },
+            axisTitleTop: {
+                font: 'bold 18px Arial',
+                fill: '#444'
+            },
+            axisTitleRight: {
+                font: 'bold 18px Arial',
+                fill: '#444',
+                rotate: {
+                    x:0, y:0,
+                    degrees: 270
+                }
+            },
+            axisTitleBottom: {
+                font: 'bold 18px Arial',
+                fill: '#444'
+            },
+            axisTitleLeft: {
+                font: 'bold 18px Arial',
+                fill: '#444',
+                rotate: {
+                    x:0, y:0,
+                    degrees: 270
+                }
+            },
+            series: {
+                'stroke-width': 0
+            },
+            seriesLabel: {
+                font: '12px Arial',
+                fill: '#333'
+            },
+            marker: {
+                stroke: '#555',
+                fill: '#000',
+                radius: 3,
+                size: 3
+            },
+            colors: [ "#94ae0a", "#115fa6","#a61120", "#ff8809", "#ffd13e", "#a61187", "#24ad9a", "#7c7474", "#a66111"],
+            seriesThemes: [{
+                fill: "#115fa6"
+            }, {
+                fill: "#94ae0a"
+            }, {
+                fill: "#a61120"
+            }, {
+                fill: "#ff8809"
+            }, {
+                fill: "#ffd13e"
+            }, {
+                fill: "#a61187"
+            }, {
+                fill: "#24ad9a"
+            }, {
+                fill: "#7c7474"
+            }, {
+                fill: "#a66111"
+            }],
+            markerThemes: [{
+                fill: "#115fa6",
+                type: 'circle' 
+            }, {
+                fill: "#94ae0a",
+                type: 'cross'
+            }, {
+                fill: "#a61120",
+                type: 'plus'
+            }]
+        });
+    }
+}, function() {
+    var palette = ['#b1da5a', '#4ce0e7', '#e84b67', '#da5abd', '#4d7fe6', '#fec935'],
+        names = ['Green', 'Sky', 'Red', 'Purple', 'Blue', 'Yellow'],
+        i = 0, j = 0, l = palette.length, themes = Ext.chart.theme,
+        categories = [['#f0a50a', '#c20024', '#2044ba', '#810065', '#7eae29'],
+                      ['#6d9824', '#87146e', '#2a9196', '#d39006', '#1e40ac'],
+                      ['#fbbc29', '#ce2e4e', '#7e0062', '#158b90', '#57880e'],
+                      ['#ef5773', '#fcbd2a', '#4f770d', '#1d3eaa', '#9b001f'],
+                      ['#7eae29', '#fdbe2a', '#910019', '#27b4bc', '#d74dbc'],
+                      ['#44dce1', '#0b2592', '#996e05', '#7fb325', '#b821a1']],
+        cats = categories.length;
+    
+    
+    for (; i < l; i++) {
+        themes[names[i]] = (function(color) {
+            return Ext.extend(themes.Base, {
+                constructor: function(config) {
+                    themes.Base.prototype.constructor.call(this, Ext.apply({
+                        baseColor: color
+                    }, config));
+                }
+            });
+        })(palette[i]);
+    }
+    
+    
+    for (i = 0; i < cats; i++) {
+        themes['Category' + (i + 1)] = (function(category) {
+            return Ext.extend(themes.Base, {
+                constructor: function(config) {
+                    themes.Base.prototype.constructor.call(this, Ext.apply({
+                        colors: category
+                    }, config));
+                }
+            });
+        })(categories[i]);
+    }
+});
+
+
+Ext.define('Ext.data.ArrayStore', {
+    extend: 'Ext.data.Store',
+    alias: 'store.array',
+    uses: ['Ext.data.reader.Array'],
+
+    constructor: function(config) {
+        config = config || {};
+
+        Ext.applyIf(config, {
+            proxy: {
+                type: 'memory',
+                reader: 'array'
+            }
+        });
+
+        this.callParent([config]);
+    },
+
+    loadData: function(data, append) {
+        if (this.expandData === true) {
+            var r = [],
+                i = 0,
+                ln = data.length;
+
+            for (; i < ln; i++) {
+                r[r.length] = [data[i]];
+            }
+
+            data = r;
+        }
+
+        this.callParent([data, append]);
+    }
+}, function() {
+    
+    Ext.data.SimpleStore = Ext.data.ArrayStore;
+    
+});
+
+
+Ext.define('Ext.data.Batch', {
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    
+    autoStart: false,
+
+    
+    current: -1,
+
+    
+    total: 0,
+
+    
+    isRunning: false,
+
+    
+    isComplete: false,
+
+    
+    hasException: false,
+
+    
+    pauseOnException: true,
+
+    
+    constructor: function(config) {
+        var me = this;
+
+        me.addEvents(
+          
+          'complete',
+
+          
+          'exception',
+
+          
+          'operationcomplete'
+        );
+
+        me.mixins.observable.constructor.call(me, config);
+
+        
+        me.operations = [];
+    },
+
+    
+    add: function(operation) {
+        this.total++;
+
+        operation.setBatch(this);
+
+        this.operations.push(operation);
+    },
+
+    
+    start: function() {
+        this.hasException = false;
+        this.isRunning = true;
+
+        this.runNextOperation();
+    },
+
+    
+    runNextOperation: function() {
+        this.runOperation(this.current + 1);
+    },
+
+    
+    pause: function() {
+        this.isRunning = false;
+    },
+
+    
+    runOperation: function(index) {
+        var me = this,
+            operations = me.operations,
+            operation  = operations[index],
+            onProxyReturn;
+
+        if (operation === undefined) {
+            me.isRunning  = false;
+            me.isComplete = true;
+            me.fireEvent('complete', me, operations[operations.length - 1]);
+        } else {
+            me.current = index;
+
+            onProxyReturn = function(operation) {
+                var hasException = operation.hasException();
+
+                if (hasException) {
+                    me.hasException = true;
+                    me.fireEvent('exception', me, operation);
+                } else {
+                    me.fireEvent('operationcomplete', me, operation);
+                }
+
+                if (hasException && me.pauseOnException) {
+                    me.pause();
+                } else {
+                    operation.setCompleted();
+                    me.runNextOperation();
+                }
+            };
+
+            operation.setStarted();
+
+            me.proxy[operation.action](operation, onProxyReturn, me);
+        }
+    }
+});
+
+Ext.define('Ext.data.BelongsToAssociation', {
+    extend: 'Ext.data.Association',
+
+    alias: 'association.belongsto',
+
+    
+
+    
+
+    
+
+    
+    constructor: function(config) {
+        this.callParent(arguments);
+
+        var me             = this,
+            ownerProto     = me.ownerModel.prototype,
+            associatedName = me.associatedName,
+            getterName     = me.getterName || 'get' + associatedName,
+            setterName     = me.setterName || 'set' + associatedName;
+
+        Ext.applyIf(me, {
+            name        : associatedName,
+            foreignKey  : associatedName.toLowerCase() + "_id",
+            instanceName: associatedName + 'BelongsToInstance',
+            associationKey: associatedName.toLowerCase()
+        });
+
+        ownerProto[getterName] = me.createGetter();
+        ownerProto[setterName] = me.createSetter();
+    },
+
+    
+    createSetter: function() {
+        var me              = this,
+            ownerModel      = me.ownerModel,
+            associatedModel = me.associatedModel,
+            foreignKey      = me.foreignKey,
+            primaryKey      = me.primaryKey;
+
+        
+        return function(value, options, scope) {
+            this.set(foreignKey, value);
+
+            if (typeof options == 'function') {
+                options = {
+                    callback: options,
+                    scope: scope || this
+                };
+            }
+
+            if (Ext.isObject(options)) {
+                return this.save(options);
+            }
+        };
+    },
+
+    
+    createGetter: function() {
+        var me              = this,
+            ownerModel      = me.ownerModel,
+            associatedName  = me.associatedName,
+            associatedModel = me.associatedModel,
+            foreignKey      = me.foreignKey,
+            primaryKey      = me.primaryKey,
+            instanceName    = me.instanceName;
+
+        
+        return function(options, scope) {
+            options = options || {};
+
+            var model = this,
+                foreignKeyId = model.get(foreignKey),
+                instance,
+                args;
+
+            if (model[instanceName] === undefined) {
+                instance = Ext.ModelManager.create({}, associatedName);
+                instance.set(primaryKey, foreignKeyId);
+
+                if (typeof options == 'function') {
+                    options = {
+                        callback: options,
+                        scope: scope || model
+                    };
+                }
+
+                associatedModel.load(foreignKeyId, options);
+                model[instanceName] = associatedModel;
+                return associatedModel;
+            } else {
+                instance = model[instanceName];
+                args = [instance];
+                scope = scope || model;
+
+                
+                
+                
+                Ext.callback(options, scope, args);
+                Ext.callback(options.success, scope, args);
+                Ext.callback(options.failure, scope, args);
+                Ext.callback(options.callback, scope, args);
+
+                return instance;
+            }
+        };
+    },
+
+    
+    read: function(record, reader, associationData){
+        record[this.instanceName] = reader.read([associationData]).records[0];
+    }
+});
+
+
+Ext.define('Ext.data.BufferStore', {
+    extend: 'Ext.data.Store',
+    alias: 'store.buffer',
+    sortOnLoad: false,
+    filterOnLoad: false,
+    
+    constructor: function() {
+        Ext.Error.raise('The BufferStore class has been deprecated. Instead, specify the buffered config option on Ext.data.Store');
+    }
+});
+
+Ext.define('Ext.direct.Manager', {
+
+    
+    singleton: true,
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    requires: ['Ext.util.MixedCollection'],
+
+    statics: {
+        exceptions: {
+            TRANSPORT: 'xhr',
+            PARSE: 'parse',
+            LOGIN: 'login',
+            SERVER: 'exception'
+        }
+    },
+
+    
+
+    constructor: function(){
+        var me = this;
+
+        me.addEvents(
+            
+            'event',
+            
+            'exception'
+        );
+        me.transactions = Ext.create('Ext.util.MixedCollection');
+        me.providers = Ext.create('Ext.util.MixedCollection');
+
+        me.mixins.observable.constructor.call(me);
+    },
+
+    
+    addProvider : function(provider){
+        var me = this,
+            args = arguments,
+            i = 0,
+            len;
+
+        if (args.length > 1) {
+            for (len = args.length; i < len; ++i) {
+                me.addProvider(args[i]);
+            }
+            return;
+        }
+
+        
+        if (!provider.isProvider) {
+            provider = Ext.create('direct.' + provider.type + 'provider', provider);
+        }
+        me.providers.add(provider);
+        provider.on('data', me.onProviderData, me);
+
+
+        if (!provider.isConnected()) {
+            provider.connect();
+        }
+
+        return provider;
+    },
+
+    
+    getProvider : function(id){
+        return id.isProvider ? id : this.providers.get(id);
+    },
+
+    
+    removeProvider : function(provider){
+        var me = this,
+            providers = me.providers;
+
+        provider = provider.isProvider ? provider : providers.get(provider);
+
+        if (provider) {
+            provider.un('data', me.onProviderData, me);
+            providers.remove(provider);
+            return provider;
+        }
+        return null;
+    },
+
+    
+    addTransaction: function(transaction){
+        this.transactions.add(transaction);
+        return transaction;
+    },
+
+    
+    removeTransaction: function(transaction){
+        transaction = this.getTransaction(transaction);
+        this.transactions.remove(transaction);
+        return transaction;
+    },
+
+    
+    getTransaction: function(transaction){
+        return transaction.isTransaction ? transaction : this.transactions.get(transaction);
+    },
+
+    onProviderData : function(provider, event){
+        var me = this,
+            i = 0,
+            len;
+
+        if (Ext.isArray(event)) {
+            for (len = event.length; i < len; ++i) {
+                me.onProviderData(provider, event[i]);
+            }
+            return;
+        }
+        if (event.name && event.name != 'event' && event.name != 'exception') {
+            me.fireEvent(event.name, event);
+        } else if (event.status === false) {
+            me.fireEvent('exception', event);
+        }
+        me.fireEvent('event', event, provider);
+    }
+}, function(){
+    
+    Ext.Direct = Ext.direct.Manager;
+});
+
+
+Ext.define('Ext.data.proxy.Direct', {
+    
+
+    extend: 'Ext.data.proxy.Server',
+    alternateClassName: 'Ext.data.DirectProxy',
+
+    alias: 'proxy.direct',
+
+    requires: ['Ext.direct.Manager'],
+
+    
+
+    
+    paramOrder: undefined,
+
+    
+    paramsAsHash: true,
+
+    
+    directFn : undefined,
+
+    
+
+    
+
+    
+    paramOrderRe: /[\s,|]/,
+
+    constructor: function(config){
+        var me = this;
+
+        Ext.apply(me, config);
+        if (Ext.isString(me.paramOrder)) {
+            me.paramOrder = me.paramOrder.split(me.paramOrderRe);
+        }
+        me.callParent(arguments);
+    },
+
+    doRequest: function(operation, callback, scope) {
+        var me = this,
+            writer = me.getWriter(),
+            request = me.buildRequest(operation, callback, scope),
+            fn = me.api[request.action]  || me.directFn,
+            args = [],
+            params = request.params,
+            paramOrder = me.paramOrder,
+            method,
+            i = 0,
+            len;
+
+
+        if (operation.allowWrite()) {
+            request = writer.write(request);
+        }
+
+        if (operation.action == 'read') {
+            
+            method = fn.directCfg.method;
+
+            if (method.ordered) {
+                if (method.len > 0) {
+                    if (paramOrder) {
+                        for (len = paramOrder.length; i < len; ++i) {
+                            args.push(params[paramOrder[i]]);
+                        }
+                    } else if (me.paramsAsHash) {
+                        args.push(params);
+                    }
+                }
+            } else {
+                args.push(params);
+            }
+        } else {
+            args.push(request.jsonData);
+        }
+
+        Ext.apply(request, {
+            args: args,
+            directFn: fn
+        });
+        args.push(me.createRequestCallback(request, operation, callback, scope), me);
+        fn.apply(window, args);
+    },
+
+    
+    applyEncoding: function(value){
+        return value;
+    },
+
+    createRequestCallback: function(request, operation, callback, scope){
+        var me = this;
+
+        return function(data, event){
+            me.processResponse(event.status, operation, request, event, callback, scope);
+        };
+    },
+
+    
+    extractResponseData: function(response){
+        return Ext.isDefined(response.result) ? response.result : response.data;
+    },
+
+    
+    setException: function(operation, response) {
+        operation.setException(response.message);
+    },
+
+    
+    buildUrl: function(){
+        return '';
+    }
+});
+
+
+Ext.define('Ext.data.DirectStore', {
+    
+    
+    extend: 'Ext.data.Store',
+    
+    alias: 'store.direct',
+    
+    requires: ['Ext.data.proxy.Direct'],
+   
+    
+
+    constructor : function(config){
+        config = Ext.apply({}, config);
+        if (!config.proxy) {
+            var proxy = {
+                type: 'direct',
+                reader: {
+                    type: 'json'
+                }
+            };
+            Ext.copyTo(proxy, config, 'paramOrder,paramsAsHash,directFn,api,simpleSortMode');
+            Ext.copyTo(proxy.reader, config, 'totalProperty,root,idProperty');
+            config.proxy = proxy;
+        }
+        this.callParent([config]);
+    }    
+});
+
+
+Ext.define('Ext.util.Inflector', {
+
+    
+
+    singleton: true,
+
+    
+
+    
+    plurals: [
+        [(/(quiz)$/i),                "$1zes"  ],
+        [(/^(ox)$/i),                 "$1en"   ],
+        [(/([m|l])ouse$/i),           "$1ice"  ],
+        [(/(matr|vert|ind)ix|ex$/i),  "$1ices" ],
+        [(/(x|ch|ss|sh)$/i),          "$1es"   ],
+        [(/([^aeiouy]|qu)y$/i),       "$1ies"  ],
+        [(/(hive)$/i),                "$1s"    ],
+        [(/(?:([^f])fe|([lr])f)$/i),  "$1$2ves"],
+        [(/sis$/i),                   "ses"    ],
+        [(/([ti])um$/i),              "$1a"    ],
+        [(/(buffal|tomat|potat)o$/i), "$1oes"  ],
+        [(/(bu)s$/i),                 "$1ses"  ],
+        [(/(alias|status|sex)$/i),    "$1es"   ],
+        [(/(octop|vir)us$/i),         "$1i"    ],
+        [(/(ax|test)is$/i),           "$1es"   ],
+        [(/^person$/),                "people" ],
+        [(/^man$/),                   "men"    ],
+        [(/^(child)$/),               "$1ren"  ],
+        [(/s$/i),                     "s"      ],
+        [(/$/),                       "s"      ]
+    ],
+
+    
+    singulars: [
+      [(/(quiz)zes$/i),                                                    "$1"     ],
+      [(/(matr)ices$/i),                                                   "$1ix"   ],
+      [(/(vert|ind)ices$/i),                                               "$1ex"   ],
+      [(/^(ox)en/i),                                                       "$1"     ],
+      [(/(alias|status)es$/i),                                             "$1"     ],
+      [(/(octop|vir)i$/i),                                                 "$1us"   ],
+      [(/(cris|ax|test)es$/i),                                             "$1is"   ],
+      [(/(shoe)s$/i),                                                      "$1"     ],
+      [(/(o)es$/i),                                                        "$1"     ],
+      [(/(bus)es$/i),                                                      "$1"     ],
+      [(/([m|l])ice$/i),                                                   "$1ouse" ],
+      [(/(x|ch|ss|sh)es$/i),                                               "$1"     ],
+      [(/(m)ovies$/i),                                                     "$1ovie" ],
+      [(/(s)eries$/i),                                                     "$1eries"],
+      [(/([^aeiouy]|qu)ies$/i),                                            "$1y"    ],
+      [(/([lr])ves$/i),                                                    "$1f"    ],
+      [(/(tive)s$/i),                                                      "$1"     ],
+      [(/(hive)s$/i),                                                      "$1"     ],
+      [(/([^f])ves$/i),                                                    "$1fe"   ],
+      [(/(^analy)ses$/i),                                                  "$1sis"  ],
+      [(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i), "$1$2sis"],
+      [(/([ti])a$/i),                                                      "$1um"   ],
+      [(/(n)ews$/i),                                                       "$1ews"  ],
+      [(/people$/i),                                                       "person" ],
+      [(/s$/i),                                                            ""       ]
+    ],
+
+    
+     uncountable: [
+        "sheep",
+        "fish",
+        "series",
+        "species",
+        "money",
+        "rice",
+        "information",
+        "equipment",
+        "grass",
+        "mud",
+        "offspring",
+        "deer",
+        "means"
+    ],
+
+    
+    singular: function(matcher, replacer) {
+        this.singulars.unshift([matcher, replacer]);
+    },
+
+    
+    plural: function(matcher, replacer) {
+        this.plurals.unshift([matcher, replacer]);
+    },
+
+    
+    clearSingulars: function() {
+        this.singulars = [];
+    },
+
+    
+    clearPlurals: function() {
+        this.plurals = [];
+    },
+
+    
+    isTransnumeral: function(word) {
+        return Ext.Array.indexOf(this.uncountable, word) != -1;
+    },
+
+    
+    pluralize: function(word) {
+        if (this.isTransnumeral(word)) {
+            return word;
+        }
+
+        var plurals = this.plurals,
+            length  = plurals.length,
+            tuple, regex, i;
+
+        for (i = 0; i < length; i++) {
+            tuple = plurals[i];
+            regex = tuple[0];
+
+            if (regex == word || (regex.test && regex.test(word))) {
+                return word.replace(regex, tuple[1]);
+            }
+        }
+
+        return word;
+    },
+
+    
+    singularize: function(word) {
+        if (this.isTransnumeral(word)) {
+            return word;
+        }
+
+        var singulars = this.singulars,
+            length    = singulars.length,
+            tuple, regex, i;
+
+        for (i = 0; i < length; i++) {
+            tuple = singulars[i];
+            regex = tuple[0];
+
+            if (regex == word || (regex.test && regex.test(word))) {
+                return word.replace(regex, tuple[1]);
+            }
+        }
+
+        return word;
+    },
+
+    
+    classify: function(word) {
+        return Ext.String.capitalize(this.singularize(word));
+    },
+
+    
+    ordinalize: function(number) {
+        var parsed = parseInt(number, 10),
+            mod10  = parsed % 10,
+            mod100 = parsed % 100;
+
+        
+        if (11 <= mod100 && mod100 <= 13) {
+            return number + "th";
+        } else {
+            switch(mod10) {
+                case 1 : return number + "st";
+                case 2 : return number + "nd";
+                case 3 : return number + "rd";
+                default: return number + "th";
+            }
+        }
+    }
+}, function() {
+    
+    var irregulars = {
+            alumnus: 'alumni',
+            cactus : 'cacti',
+            focus  : 'foci',
+            nucleus: 'nuclei',
+            radius: 'radii',
+            stimulus: 'stimuli',
+            ellipsis: 'ellipses',
+            paralysis: 'paralyses',
+            oasis: 'oases',
+            appendix: 'appendices',
+            index: 'indexes',
+            beau: 'beaux',
+            bureau: 'bureaux',
+            tableau: 'tableaux',
+            woman: 'women',
+            child: 'children',
+            man: 'men',
+            corpus:	'corpora',
+            criterion: 'criteria',
+            curriculum:	'curricula',
+            genus: 'genera',
+            memorandum:	'memoranda',
+            phenomenon:	'phenomena',
+            foot: 'feet',
+            goose: 'geese',
+            tooth: 'teeth',
+            antenna: 'antennae',
+            formula: 'formulae',
+            nebula: 'nebulae',
+            vertebra: 'vertebrae',
+            vita: 'vitae'
+        },
+        singular;
+
+    for (singular in irregulars) {
+        this.plural(singular, irregulars[singular]);
+        this.singular(irregulars[singular], singular);
+    }
+});
+
+Ext.define('Ext.data.HasManyAssociation', {
+    extend: 'Ext.data.Association',
+    requires: ['Ext.util.Inflector'],
+
+    alias: 'association.hasmany',
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    constructor: function(config) {
+        var me = this,
+            ownerProto,
+            name;
+            
+        me.callParent(arguments);
+        
+        me.name = me.name || Ext.util.Inflector.pluralize(me.associatedName.toLowerCase());
+        
+        ownerProto = me.ownerModel.prototype;
+        name = me.name;
+        
+        Ext.applyIf(me, {
+            storeName : name + "Store",
+            foreignKey: me.ownerName.toLowerCase() + "_id"
+        });
+        
+        ownerProto[name] = me.createStore();
+    },
+    
+    
+    createStore: function() {
+        var that            = this,
+            associatedModel = that.associatedModel,
+            storeName       = that.storeName,
+            foreignKey      = that.foreignKey,
+            primaryKey      = that.primaryKey,
+            filterProperty  = that.filterProperty,
+            autoLoad        = that.autoLoad,
+            storeConfig     = that.storeConfig || {};
+        
+        return function() {
+            var me = this,
+                config, filter,
+                modelDefaults = {};
+                
+            if (me[storeName] === undefined) {
+                if (filterProperty) {
+                    filter = {
+                        property  : filterProperty,
+                        value     : me.get(filterProperty),
+                        exactMatch: true
+                    };
+                } else {
+                    filter = {
+                        property  : foreignKey,
+                        value     : me.get(primaryKey),
+                        exactMatch: true
+                    };
+                }
+                
+                modelDefaults[foreignKey] = me.get(primaryKey);
+                
+                config = Ext.apply({}, storeConfig, {
+                    model        : associatedModel,
+                    filters      : [filter],
+                    remoteFilter : false,
+                    modelDefaults: modelDefaults
+                });
+                
+                me[storeName] = Ext.create('Ext.data.Store', config);
+                if (autoLoad) {
+                    me[storeName].load();
+                }
+            }
+            
+            return me[storeName];
+        };
+    },
+    
+    
+    read: function(record, reader, associationData){
+        var store = record[this.name](),
+            inverse;
+    
+        store.add(reader.read(associationData).records);
+    
+        
+        
+        inverse = this.associatedModel.prototype.associations.findBy(function(assoc){
+            return assoc.type === 'belongsTo' && assoc.associatedName === record.$className;
+        });
+    
+        
+        if (inverse) {
+            store.data.each(function(associatedRecord){
+                associatedRecord[inverse.instanceName] = record;
+            });
+        }
+    }
+});
+
+Ext.define('Ext.data.JsonP', {
+
+    
+
+    singleton: true,
+
+    statics: {
+        requestCount: 0,
+        requests: {}
+    },
+
+    
+
+    
+    timeout: 30000,
+
+    
+    disableCaching: true,
+
+    
+    disableCachingParam: '_dc',
+
+    
+    callbackKey: 'callback',
+
+    
+    request: function(options){
+        options = Ext.apply({}, options);
+
+
+        var me = this,
+            disableCaching = Ext.isDefined(options.disableCaching) ? options.disableCaching : me.disableCaching,
+            cacheParam = options.disableCachingParam || me.disableCachingParam,
+            id = ++me.statics().requestCount,
+            callbackName = options.callbackName || 'callback' + id,
+            callbackKey = options.callbackKey || me.callbackKey,
+            timeout = Ext.isDefined(options.timeout) ? options.timeout : me.timeout,
+            params = Ext.apply({}, options.params),
+            url = options.url,
+            name = Ext.isSandboxed ? Ext.getUniqueGlobalNamespace() : 'Ext',
+            request,
+            script;
+
+        params[callbackKey] = name + '.data.JsonP.' + callbackName;
+        if (disableCaching) {
+            params[cacheParam] = new Date().getTime();
+        }
+
+        script = me.createScript(url, params);
+
+        me.statics().requests[id] = request = {
+            url: url,
+            params: params,
+            script: script,
+            id: id,
+            scope: options.scope,
+            success: options.success,
+            failure: options.failure,
+            callback: options.callback,
+            callbackName: callbackName
+        };
+
+        if (timeout > 0) {
+            request.timeout = setTimeout(Ext.bind(me.handleTimeout, me, [request]), timeout);
+        }
+
+        me.setupErrorHandling(request);
+        me[callbackName] = Ext.bind(me.handleResponse, me, [request], true);
+        Ext.getHead().appendChild(script);
+        return request;
+    },
+
+    
+    abort: function(request){
+        var requests = this.statics().requests,
+            key;
+
+        if (request) {
+            if (!request.id) {
+                request = requests[request];
+            }
+            this.abort(request);
+        } else {
+            for (key in requests) {
+                if (requests.hasOwnProperty(key)) {
+                    this.abort(requests[key]);
+                }
+            }
+        }
+    },
+
+    
+    setupErrorHandling: function(request){
+        request.script.onerror = Ext.bind(this.handleError, this, [request]);
+    },
+
+    
+    handleAbort: function(request){
+        request.errorType = 'abort';
+        this.handleResponse(null, request);
+    },
+
+    
+    handleError: function(request){
+        request.errorType = 'error';
+        this.handleResponse(null, request);
+    },
+
+    
+    cleanupErrorHandling: function(request){
+        request.script.onerror = null;
+    },
+
+    
+    handleTimeout: function(request){
+        request.errorType = 'timeout';
+        this.handleResponse(null, request);
+    },
+
+    
+    handleResponse: function(result, request){
+
+        var success = true;
+
+        if (request.timeout) {
+            clearTimeout(request.timeout);
+        }
+        delete this[request.callbackName];
+        delete this.statics()[request.id];
+        this.cleanupErrorHandling(request);
+        Ext.fly(request.script).remove();
+
+        if (request.errorType) {
+            success = false;
+            Ext.callback(request.failure, request.scope, [request.errorType]);
+        } else {
+            Ext.callback(request.success, request.scope, [result]);
+        }
+        Ext.callback(request.callback, request.scope, [success, result, request.errorType]);
+    },
+
+    
+    createScript: function(url, params) {
+        var script = document.createElement('script');
+        script.setAttribute("src", Ext.urlAppend(url, Ext.Object.toQueryString(params)));
+        script.setAttribute("async", true);
+        script.setAttribute("type", "text/javascript");
+        return script;
+    }
+});
+
+
+Ext.define('Ext.data.JsonPStore', {
+    extend: 'Ext.data.Store',
+    alias : 'store.jsonp',
+
+    
+    constructor: function(config) {
+        this.callParent(Ext.apply(config, {
+            reader: Ext.create('Ext.data.reader.Json', config),
+            proxy : Ext.create('Ext.data.proxy.JsonP', config)
+        }));
+    }
+});
+
+
+Ext.define('Ext.data.NodeInterface', {
+    requires: ['Ext.data.Field'],
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    statics: {
+        
+        decorate: function(record) {
+            if (!record.isNode) {
+                
+                
+                var mgr = Ext.ModelManager,
+                    modelName = record.modelName,
+                    modelClass = mgr.getModel(modelName),
+                    idName = modelClass.prototype.idProperty,
+                    newFields = [],
+                    i, newField, len;
+
+                
+                modelClass.override(this.getPrototypeBody());
+                newFields = this.applyFields(modelClass, [
+                    {name: idName,       type: 'string',  defaultValue: null},
+                    {name: 'parentId',   type: 'string',  defaultValue: null},
+                    {name: 'index',      type: 'int',     defaultValue: null},
+                    {name: 'depth',      type: 'int',     defaultValue: 0},
+                    {name: 'expanded',   type: 'bool',    defaultValue: false, persist: false},
+                    {name: 'expandable', type: 'bool',    defaultValue: true, persist: false},
+                    {name: 'checked',    type: 'auto',    defaultValue: null},
+                    {name: 'leaf',       type: 'bool',    defaultValue: false, persist: false},
+                    {name: 'cls',        type: 'string',  defaultValue: null, persist: false},
+                    {name: 'iconCls',    type: 'string',  defaultValue: null, persist: false},
+                    {name: 'icon',       type: 'string',  defaultValue: null, persist: false},
+                    {name: 'root',       type: 'boolean', defaultValue: false, persist: false},
+                    {name: 'isLast',     type: 'boolean', defaultValue: false, persist: false},
+                    {name: 'isFirst',    type: 'boolean', defaultValue: false, persist: false},
+                    {name: 'allowDrop',  type: 'boolean', defaultValue: true, persist: false},
+                    {name: 'allowDrag',  type: 'boolean', defaultValue: true, persist: false},
+                    {name: 'loaded',     type: 'boolean', defaultValue: false, persist: false},
+                    {name: 'loading',    type: 'boolean', defaultValue: false, persist: false},
+                    {name: 'href',       type: 'string',  defaultValue: null, persist: false},
+                    {name: 'hrefTarget', type: 'string',  defaultValue: null, persist: false},
+                    {name: 'qtip',       type: 'string',  defaultValue: null, persist: false},
+                    {name: 'qtitle',     type: 'string',  defaultValue: null, persist: false}
+                ]);
+
+                len = newFields.length;
+                
+                for (i = 0; i < len; ++i) {
+                    newField = newFields[i];
+                    if (record.get(newField.name) === undefined) {
+                        record.data[newField.name] = newField.defaultValue;
+                    }
+                }
+            }
+
+            Ext.applyIf(record, {
+                firstChild: null,
+                lastChild: null,
+                parentNode: null,
+                previousSibling: null,
+                nextSibling: null,
+                childNodes: []
+            });
+            
+            record.commit(true);
+
+            record.enableBubble([
+                
+                "append",
+
+                
+                "remove",
+
+                
+                "move",
+
+                
+                "insert",
+
+                
+                "beforeappend",
+
+                
+                "beforeremove",
+
+                
+                "beforemove",
+
+                 
+                "beforeinsert",
+
+                
+                "expand",
+
+                
+                "collapse",
+
+                
+                "beforeexpand",
+
+                
+                "beforecollapse",
+
+                
+                "sort"
+            ]);
+
+            return record;
+        },
+
+        applyFields: function(modelClass, addFields) {
+            var modelPrototype = modelClass.prototype,
+                fields = modelPrototype.fields,
+                keys = fields.keys,
+                ln = addFields.length,
+                addField, i, name,
+                newFields = [];
+
+            for (i = 0; i < ln; i++) {
+                addField = addFields[i];
+                if (!Ext.Array.contains(keys, addField.name)) {
+                    addField = Ext.create('data.field', addField);
+
+                    newFields.push(addField);
+                    fields.add(addField);
+                }
+            }
+
+            return newFields;
+        },
+
+        getPrototypeBody: function() {
+            return {
+                isNode: true,
+
+                
+                createNode: function(node) {
+                    if (Ext.isObject(node) && !node.isModel) {
+                        node = Ext.ModelManager.create(node, this.modelName);
+                    }
+                    
+                    return Ext.data.NodeInterface.decorate(node);
+                },
+
+                
+                isLeaf : function() {
+                    return this.get('leaf') === true;
+                },
+
+                
+                setFirstChild : function(node) {
+                    this.firstChild = node;
+                },
+
+                
+                setLastChild : function(node) {
+                    this.lastChild = node;
+                },
+
+                
+                updateInfo: function(silent) {
+                    var me = this,
+                        isRoot = me.isRoot(),
+                        parentNode = me.parentNode,
+                        isFirst = (!parentNode ? true : parentNode.firstChild == me),
+                        isLast = (!parentNode ? true : parentNode.lastChild == me),
+                        depth = 0,
+                        parent = me,
+                        children = me.childNodes,
+                        len = children.length,
+                        i = 0;
+
+                    while (parent.parentNode) {
+                        ++depth;
+                        parent = parent.parentNode;
+                    }
+
+                    me.beginEdit();
+                    me.set({
+                        isFirst: isFirst,
+                        isLast: isLast,
+                        depth: depth,
+                        index: parentNode ? parentNode.indexOf(me) : 0,
+                        parentId: parentNode ? parentNode.getId() : null
+                    });
+                    me.endEdit(silent);
+                    if (silent) {
+                        me.commit();
+                    }
+
+                    for (i = 0; i < len; i++) {
+                        children[i].updateInfo(silent);
+                    }
+                },
+
+                
+                isLast : function() {
+                   return this.get('isLast');
+                },
+
+                
+                isFirst : function() {
+                   return this.get('isFirst');
+                },
+
+                
+                hasChildNodes : function() {
+                    return !this.isLeaf() && this.childNodes.length > 0;
+                },
+
+                
+                isExpandable : function() {
+                    var me = this;
+
+                    if (me.get('expandable')) {
+                        return !(me.isLeaf() || (me.isLoaded() && !me.hasChildNodes()));
+                    }
+                    return false;
+                },
+
+                
+                appendChild : function(node, suppressEvents, suppressNodeUpdate) {
+                    var me = this,
+                        i, ln,
+                        index,
+                        oldParent,
+                        ps;
+
+                    
+                    if (Ext.isArray(node)) {
+                        for (i = 0, ln = node.length; i < ln; i++) {
+                            me.appendChild(node[i]);
+                        }
+                    } else {
+                        
+                        node = me.createNode(node);
+
+                        if (suppressEvents !== true && me.fireEvent("beforeappend", me, node) === false) {
+                            return false;
+                        }
+
+                        index = me.childNodes.length;
+                        oldParent = node.parentNode;
+
+                        
+                        if (oldParent) {
+                            if (suppressEvents !== true && node.fireEvent("beforemove", node, oldParent, me, index) === false) {
+                                return false;
+                            }
+                            oldParent.removeChild(node, null, false, true);
+                        }
+
+                        index = me.childNodes.length;
+                        if (index === 0) {
+                            me.setFirstChild(node);
+                        }
+
+                        me.childNodes.push(node);
+                        node.parentNode = me;
+                        node.nextSibling = null;
+
+                        me.setLastChild(node);
+
+                        ps = me.childNodes[index - 1];
+                        if (ps) {
+                            node.previousSibling = ps;
+                            ps.nextSibling = node;
+                            ps.updateInfo(suppressNodeUpdate);
+                        } else {
+                            node.previousSibling = null;
+                        }
+
+                        node.updateInfo(suppressNodeUpdate);
+
+                        
+                        if (!me.isLoaded()) {
+                            me.set('loaded', true);
+                        }
+                        
+                        else if (me.childNodes.length === 1) {
+                            me.set('loaded', me.isLoaded());
+                        }
+
+                        if (suppressEvents !== true) {
+                            me.fireEvent("append", me, node, index);
+
+                            if (oldParent) {
+                                node.fireEvent("move", node, oldParent, me, index);
+                            }
+                        }
+
+                        return node;
+                    }
+                },
+
+                
+                getBubbleTarget: function() {
+                    return this.parentNode;
+                },
+
+                
+                removeChild : function(node, destroy, suppressEvents, suppressNodeUpdate) {
+                    var me = this,
+                        index = me.indexOf(node);
+
+                    if (index == -1 || (suppressEvents !== true && me.fireEvent("beforeremove", me, node) === false)) {
+                        return false;
+                    }
+
+                    
+                    Ext.Array.erase(me.childNodes, index, 1);
+
+                    
+                    if (me.firstChild == node) {
+                        me.setFirstChild(node.nextSibling);
+                    }
+                    if (me.lastChild == node) {
+                        me.setLastChild(node.previousSibling);
+                    }
+
+                    
+                    if (node.previousSibling) {
+                        node.previousSibling.nextSibling = node.nextSibling;
+                        node.previousSibling.updateInfo(suppressNodeUpdate);
+                    }
+                    if (node.nextSibling) {
+                        node.nextSibling.previousSibling = node.previousSibling;
+                        node.nextSibling.updateInfo(suppressNodeUpdate);
+                    }
+
+                    if (suppressEvents !== true) {
+                        me.fireEvent("remove", me, node);
+                    }
+
+
+                    
+                    if (!me.childNodes.length) {
+                        me.set('loaded', me.isLoaded());
+                    }
+
+                    if (destroy) {
+                        node.destroy(true);
+                    } else {
+                        node.clear();
+                    }
+
+                    return node;
+                },
+
+                
+                copy: function(newId, deep) {
+                    var me = this,
+                        result = me.callOverridden(arguments),
+                        len = me.childNodes ? me.childNodes.length : 0,
+                        i;
+
+                    
+                    if (deep) {
+                        for (i = 0; i < len; i++) {
+                            result.appendChild(me.childNodes[i].copy(true));
+                        }
+                    }
+                    return result;
+                },
+
+                
+                clear : function(destroy) {
+                    var me = this;
+
+                    
+                    me.parentNode = me.previousSibling = me.nextSibling = null;
+                    if (destroy) {
+                        me.firstChild = me.lastChild = null;
+                    }
+                },
+
+                
+                destroy : function(silent) {
+                    
+                    var me = this,
+                        options = me.destroyOptions;
+
+                    if (silent === true) {
+                        me.clear(true);
+                        Ext.each(me.childNodes, function(n) {
+                            n.destroy(true);
+                        });
+                        me.childNodes = null;
+                        delete me.destroyOptions;
+                        me.callOverridden([options]);
+                    } else {
+                        me.destroyOptions = silent;
+                        
+                        me.remove(true);
+                    }
+                },
+
+                
+                insertBefore : function(node, refNode, suppressEvents) {
+                    var me = this,
+                        index     = me.indexOf(refNode),
+                        oldParent = node.parentNode,
+                        refIndex  = index,
+                        ps;
+
+                    if (!refNode) { 
+                        return me.appendChild(node);
+                    }
+
+                    
+                    if (node == refNode) {
+                        return false;
+                    }
+
+                    
+                    node = me.createNode(node);
+
+                    if (suppressEvents !== true && me.fireEvent("beforeinsert", me, node, refNode) === false) {
+                        return false;
+                    }
+
+                    
+                    if (oldParent == me && me.indexOf(node) < index) {
+                        refIndex--;
+                    }
+
+                    
+                    if (oldParent) {
+                        if (suppressEvents !== true && node.fireEvent("beforemove", node, oldParent, me, index, refNode) === false) {
+                            return false;
+                        }
+                        oldParent.removeChild(node);
+                    }
+
+                    if (refIndex === 0) {
+                        me.setFirstChild(node);
+                    }
+
+                    Ext.Array.splice(me.childNodes, refIndex, 0, node);
+                    node.parentNode = me;
+
+                    node.nextSibling = refNode;
+                    refNode.previousSibling = node;
+
+                    ps = me.childNodes[refIndex - 1];
+                    if (ps) {
+                        node.previousSibling = ps;
+                        ps.nextSibling = node;
+                        ps.updateInfo();
+                    } else {
+                        node.previousSibling = null;
+                    }
+
+                    node.updateInfo();
+
+                    if (!me.isLoaded()) {
+                        me.set('loaded', true);
+                    }
+                    
+                    else if (me.childNodes.length === 1) {
+                        me.set('loaded', me.isLoaded());
+                    }
+
+                    if (suppressEvents !== true) {
+                        me.fireEvent("insert", me, node, refNode);
+
+                        if (oldParent) {
+                            node.fireEvent("move", node, oldParent, me, refIndex, refNode);
+                        }
+                    }
+
+                    return node;
+                },
+
+                
+                insertChild: function(index, node) {
+                    var sibling = this.childNodes[index];
+                    if (sibling) {
+                        return this.insertBefore(node, sibling);
+                    }
+                    else {
+                        return this.appendChild(node);
+                    }
+                },
+
+                
+                remove : function(destroy, suppressEvents) {
+                    var parentNode = this.parentNode;
+
+                    if (parentNode) {
+                        parentNode.removeChild(this, destroy, suppressEvents, true);
+                    }
+                    return this;
+                },
+
+                
+                removeAll : function(destroy, suppressEvents) {
+                    var cn = this.childNodes,
+                        n;
+
+                    while ((n = cn[0])) {
+                        this.removeChild(n, destroy, suppressEvents);
+                    }
+                    return this;
+                },
+
+                
+                getChildAt : function(index) {
+                    return this.childNodes[index];
+                },
+
+                
+                replaceChild : function(newChild, oldChild, suppressEvents) {
+                    var s = oldChild ? oldChild.nextSibling : null;
+
+                    this.removeChild(oldChild, suppressEvents);
+                    this.insertBefore(newChild, s, suppressEvents);
+                    return oldChild;
+                },
+
+                
+                indexOf : function(child) {
+                    return Ext.Array.indexOf(this.childNodes, child);
+                },
+
+                
+                getPath: function(field, separator) {
+                    field = field || this.idProperty;
+                    separator = separator || '/';
+
+                    var path = [this.get(field)],
+                        parent = this.parentNode;
+
+                    while (parent) {
+                        path.unshift(parent.get(field));
+                        parent = parent.parentNode;
+                    }
+                    return separator + path.join(separator);
+                },
+
+                
+                getDepth : function() {
+                    return this.get('depth');
+                },
+
+                
+                bubble : function(fn, scope, args) {
+                    var p = this;
+                    while (p) {
+                        if (fn.apply(scope || p, args || [p]) === false) {
+                            break;
+                        }
+                        p = p.parentNode;
+                    }
+                },
+
+                cascade: function() {
+                    if (Ext.isDefined(Ext.global.console)) {
+                        Ext.global.console.warn('Ext.data.Node: cascade has been deprecated. Please use cascadeBy instead.');
+                    }
+                    return this.cascadeBy.apply(this, arguments);
+                },
+
+                
+                cascadeBy : function(fn, scope, args) {
+                    if (fn.apply(scope || this, args || [this]) !== false) {
+                        var childNodes = this.childNodes,
+                            length     = childNodes.length,
+                            i;
+
+                        for (i = 0; i < length; i++) {
+                            childNodes[i].cascadeBy(fn, scope, args);
+                        }
+                    }
+                },
+
+                
+                eachChild : function(fn, scope, args) {
+                    var childNodes = this.childNodes,
+                        length     = childNodes.length,
+                        i;
+
+                    for (i = 0; i < length; i++) {
+                        if (fn.apply(scope || this, args || [childNodes[i]]) === false) {
+                            break;
+                        }
+                    }
+                },
+
+                
+                findChild : function(attribute, value, deep) {
+                    return this.findChildBy(function() {
+                        return this.get(attribute) == value;
+                    }, null, deep);
+                },
+
+                
+                findChildBy : function(fn, scope, deep) {
+                    var cs = this.childNodes,
+                        len = cs.length,
+                        i = 0, n, res;
+
+                    for (; i < len; i++) {
+                        n = cs[i];
+                        if (fn.call(scope || n, n) === true) {
+                            return n;
+                        }
+                        else if (deep) {
+                            res = n.findChildBy(fn, scope, deep);
+                            if (res !== null) {
+                                return res;
+                            }
+                        }
+                    }
+
+                    return null;
+                },
+
+                
+                contains : function(node) {
+                    return node.isAncestor(this);
+                },
+
+                
+                isAncestor : function(node) {
+                    var p = this.parentNode;
+                    while (p) {
+                        if (p == node) {
+                            return true;
+                        }
+                        p = p.parentNode;
+                    }
+                    return false;
+                },
+
+                
+                sort : function(sortFn, recursive, suppressEvent) {
+                    var cs  = this.childNodes,
+                        ln = cs.length,
+                        i, n;
+
+                    if (ln > 0) {
+                        Ext.Array.sort(cs, sortFn);
+                        for (i = 0; i < ln; i++) {
+                            n = cs[i];
+                            n.previousSibling = cs[i-1];
+                            n.nextSibling = cs[i+1];
+
+                            if (i === 0) {
+                                this.setFirstChild(n);
+                                n.updateInfo();
+                            }
+                            if (i == ln - 1) {
+                                this.setLastChild(n);
+                                n.updateInfo();
+                            }
+                            if (recursive && !n.isLeaf()) {
+                                n.sort(sortFn, true, true);
+                            }
+                        }
+
+                        if (suppressEvent !== true) {
+                            this.fireEvent('sort', this, cs);
+                        }
+                    }
+                },
+
+                
+                isExpanded: function() {
+                    return this.get('expanded');
+                },
+
+                
+                isLoaded: function() {
+                    return this.get('loaded');
+                },
+
+                
+                isLoading: function() {
+                    return this.get('loading');
+                },
+
+                
+                isRoot: function() {
+                    return !this.parentNode;
+                },
+
+                
+                isVisible: function() {
+                    var parent = this.parentNode;
+                    while (parent) {
+                        if (!parent.isExpanded()) {
+                            return false;
+                        }
+                        parent = parent.parentNode;
+                    }
+                    return true;
+                },
+
+                
+                expand: function(recursive, callback, scope) {
+                    var me = this;
+
+                    
+                    
+
+                    
+                    if (!me.isLeaf()) {
+                        
+                        if (me.isLoading()) {
+                            me.on('expand', function(){
+                                me.expand(recursive, callback, scope);
+                            }, me, {single: true});
+                        } else {
+                            
+                            if (!me.isExpanded()) {
+                                
+                                
+                                
+                                
+                                me.fireEvent('beforeexpand', me, function(){
+                                    me.set('expanded', true);
+                                    me.fireEvent('expand', me, me.childNodes, false);
+
+                                    
+                                    if (recursive) {
+                                        me.expandChildren(true, callback, scope);
+                                    } else {
+                                        Ext.callback(callback, scope || me, [me.childNodes]);
+                                    }
+                                }, me);
+                            } else if (recursive) {
+                                
+                                me.expandChildren(true, callback, scope);
+                            } else {
+                                Ext.callback(callback, scope || me, [me.childNodes]);
+                            }
+                        }
+                    } else {
+                        
+                        Ext.callback(callback, scope || me); 
+                    }
+                },
+
+                
+                expandChildren: function(recursive, callback, scope) {
+                    var me = this,
+                        i = 0,
+                        nodes = me.childNodes,
+                        ln = nodes.length,
+                        node,
+                        expanding = 0;
+
+                    for (; i < ln; ++i) {
+                        node = nodes[i];
+                        if (!node.isLeaf() && !node.isExpanded()) {
+                            expanding++;
+                            nodes[i].expand(recursive, function () {
+                                expanding--;
+                                if (callback && !expanding) {
+                                    Ext.callback(callback, scope || me, [me.childNodes]);
+                                }
+                            });
+                        }
+                    }
+
+                    if (!expanding && callback) {
+                        Ext.callback(callback, scope || me, [me.childNodes]);                    }
+                },
+
+                
+                collapse: function(recursive, callback, scope) {
+                    var me = this;
+
+                    
+                    if (!me.isLeaf()) {
+                        
+                        if (!me.collapsing && me.isExpanded()) {
+                            me.fireEvent('beforecollapse', me, function() {
+                                me.set('expanded', false);
+                                me.fireEvent('collapse', me, me.childNodes, false);
+
+                                
+                                if (recursive) {
+                                    me.collapseChildren(true, callback, scope);
+                                }
+                                else {
+                                    Ext.callback(callback, scope || me, [me.childNodes]);
+                                }
+                            }, me);
+                        }
+                        
+                        else if (recursive) {
+                            me.collapseChildren(true, callback, scope);
+                        }
+                    }
+                    
+                    else {
+                        Ext.callback(callback, scope || me, [me.childNodes]);
+                    }
+                },
+
+                
+                collapseChildren: function(recursive, callback, scope) {
+                    var me = this,
+                        i = 0,
+                        nodes = me.childNodes,
+                        ln = nodes.length,
+                        node,
+                        collapsing = 0;
+
+                    for (; i < ln; ++i) {
+                        node = nodes[i];
+                        if (!node.isLeaf() && node.isExpanded()) {
+                            collapsing++;
+                            nodes[i].collapse(recursive, function () {
+                                collapsing--;
+                                if (callback && !collapsing) {
+                                    Ext.callback(callback, scope || me, [me.childNodes]);
+                                }
+                            });
+                        }
+                    }
+
+                    if (!collapsing && callback) {
+                        Ext.callback(callback, scope || me, [me.childNodes]);
+                    }
+                }
+            };
+        }
+    }
+});
+
+Ext.define('Ext.data.NodeStore', {
+    extend: 'Ext.data.Store',
+    alias: 'store.node',
+    requires: ['Ext.data.NodeInterface'],
+    
+    
+    node: null,
+    
+    
+    recursive: false,
+    
+        
+    rootVisible: false,
+    
+    constructor: function(config) {
+        var me = this,
+            node;
+            
+        config = config || {};
+        Ext.apply(me, config);
+        
+
+        config.proxy = {type: 'proxy'};
+        me.callParent([config]);
+
+        me.addEvents('expand', 'collapse', 'beforeexpand', 'beforecollapse');
+        
+        node = me.node;
+        if (node) {
+            me.node = null;
+            me.setNode(node);
+        }
+    },
+    
+    setNode: function(node) {
+        var me = this;
+        
+        if (me.node && me.node != node) {
+            
+            me.mun(me.node, {
+                expand: me.onNodeExpand,
+                collapse: me.onNodeCollapse,
+                append: me.onNodeAppend,
+                insert: me.onNodeInsert,
+                remove: me.onNodeRemove,
+                sort: me.onNodeSort,
+                scope: me
+            });
+            me.node = null;
+        }
+        
+        if (node) {
+            Ext.data.NodeInterface.decorate(node);
+            me.removeAll();
+            if (me.rootVisible) {
+                me.add(node);
+            }
+            me.mon(node, {
+                expand: me.onNodeExpand,
+                collapse: me.onNodeCollapse,
+                append: me.onNodeAppend,
+                insert: me.onNodeInsert,
+                remove: me.onNodeRemove,
+                sort: me.onNodeSort,
+                scope: me
+            });
+            me.node = node;
+            if (node.isExpanded() && node.isLoaded()) {
+                me.onNodeExpand(node, node.childNodes, true);
+            }
+        }
+    },
+    
+    onNodeSort: function(node, childNodes) {
+        var me = this;
+        
+        if ((me.indexOf(node) !== -1 || (node === me.node && !me.rootVisible) && node.isExpanded())) {
+            me.onNodeCollapse(node, childNodes, true);
+            me.onNodeExpand(node, childNodes, true);
+        }
+    },
+    
+    onNodeExpand: function(parent, records, suppressEvent) {
+        var me = this,
+            insertIndex = me.indexOf(parent) + 1,
+            ln = records ? records.length : 0,
+            i, record;
+            
+        if (!me.recursive && parent !== me.node) {
+            return;
+        }
+        
+        if (!me.isVisible(parent)) {
+            return;
+        }
+
+        if (!suppressEvent && me.fireEvent('beforeexpand', parent, records, insertIndex) === false) {
+            return;
+        }
+        
+        if (ln) {
+            me.insert(insertIndex, records);
+            for (i = 0; i < ln; i++) {
+                record = records[i];
+                if (record.isExpanded()) {
+                    if (record.isLoaded()) {
+                        
+                        me.onNodeExpand(record, record.childNodes, true);
+                    }
+                    else {
+                        record.set('expanded', false);
+                        record.expand();
+                    }
+                }
+            }
+        }
+
+        if (!suppressEvent) {
+            me.fireEvent('expand', parent, records);
+        }
+    },
+
+    onNodeCollapse: function(parent, records, suppressEvent) {
+        var me = this,
+            ln = records.length,
+            collapseIndex = me.indexOf(parent) + 1,
+            i, record;
+            
+        if (!me.recursive && parent !== me.node) {
+            return;
+        }
+        
+        if (!suppressEvent && me.fireEvent('beforecollapse', parent, records, collapseIndex) === false) {
+            return;
+        }
+
+        for (i = 0; i < ln; i++) {
+            record = records[i];
+            me.remove(record);
+            if (record.isExpanded()) {
+                me.onNodeCollapse(record, record.childNodes, true);
+            }
+        }
+        
+        if (!suppressEvent) {
+            me.fireEvent('collapse', parent, records, collapseIndex);
+        }
+    },
+    
+    onNodeAppend: function(parent, node, index) {
+        var me = this,
+            refNode, sibling;
+
+        if (me.isVisible(node)) {
+            if (index === 0) {
+                refNode = parent;
+            } else {
+                sibling = node.previousSibling;
+                while (sibling.isExpanded() && sibling.lastChild) {
+                    sibling = sibling.lastChild;
+                }
+                refNode = sibling;
+            }
+            me.insert(me.indexOf(refNode) + 1, node);
+            if (!node.isLeaf() && node.isExpanded()) {
+                if (node.isLoaded()) {
+                    
+                    me.onNodeExpand(node, node.childNodes, true);
+                }
+                else {
+                    node.set('expanded', false);
+                    node.expand();
+                }
+            }
+        } 
+    },
+    
+    onNodeInsert: function(parent, node, refNode) {
+        var me = this,
+            index = this.indexOf(refNode);
+            
+        if (index != -1 && me.isVisible(node)) {
+            me.insert(index, node);
+            if (!node.isLeaf() && node.isExpanded()) {
+                if (node.isLoaded()) {
+                    
+                    me.onNodeExpand(node, node.childNodes, true);
+                }
+                else {
+                    node.set('expanded', false);
+                    node.expand();
+                }
+            }
+        }
+    },
+    
+    onNodeRemove: function(parent, node, index) {
+        var me = this;
+        if (me.indexOf(node) != -1) {
+            if (!node.isLeaf() && node.isExpanded()) {
+                me.onNodeCollapse(node, node.childNodes, true);
+            }            
+            me.remove(node);
+        }
+    },
+    
+    isVisible: function(node) {
+        var parent = node.parentNode;
+        while (parent) {
+            if (parent === this.node && !this.rootVisible && parent.isExpanded()) {
+                return true;
+            }
+            
+            if (this.indexOf(parent) === -1 || !parent.isExpanded()) {
+                return false;
+            }
+            
+            parent = parent.parentNode;
+        }
+        return true;
+    }
+});
+
+Ext.define('Ext.data.Request', {
+    
+    action: undefined,
+    
+    
+    params: undefined,
+    
+    
+    method: 'GET',
+    
+    
+    url: undefined,
+
+    
+    constructor: function(config) {
+        Ext.apply(this, config);
+    }
+});
+
+Ext.define('Ext.data.SequentialIdGenerator', {
+    extend: 'Ext.data.IdGenerator',
+    alias: 'idgen.sequential',
+
+    constructor: function() {
+        var me = this;
+
+        me.callParent(arguments);
+
+        me.parts = [ me.prefix, ''];
+    },
+
+    
+    prefix: '',
+
+    
+    seed: 1,
+
+    
+    generate: function () {
+        var me = this,
+            parts = me.parts;
+
+        parts[1] = me.seed++;
+        return parts.join('');
+    }
+});
+
+
+Ext.define('Ext.data.Tree', {
+    alias: 'data.tree',
+
+    mixins: {
+        observable: "Ext.util.Observable"
+    },
+
+    
+    root: null,
+
+    
+    constructor: function(root) {
+        var me = this;
+
+        
+
+        me.mixins.observable.constructor.call(me);
+
+        if (root) {
+            me.setRootNode(root);
+        }
+    },
+
+    
+    getRootNode : function() {
+        return this.root;
+    },
+
+    
+    setRootNode : function(node) {
+        var me = this;
+
+        me.root = node;
+        Ext.data.NodeInterface.decorate(node);
+
+        if (me.fireEvent('beforeappend', null, node) !== false) {
+            node.set('root', true);
+            node.updateInfo();
+
+            me.relayEvents(node, [
+                
+                "append",
+
+                
+                "remove",
+
+                
+                "move",
+
+                
+                "insert",
+
+                
+                "beforeappend",
+
+                
+                "beforeremove",
+
+                
+                "beforemove",
+
+                
+                "beforeinsert",
+
+                 
+                 "expand",
+
+                 
+                 "collapse",
+
+                 
+                 "beforeexpand",
+
+                 
+                 "beforecollapse" ,
+
+                 
+                 "rootchange"
+            ]);
+
+            node.on({
+                scope: me,
+                insert: me.onNodeInsert,
+                append: me.onNodeAppend,
+                remove: me.onNodeRemove
+            });
+
+            me.nodeHash = {};
+            me.registerNode(node);
+            me.fireEvent('append', null, node);
+            me.fireEvent('rootchange', node);
+        }
+
+        return node;
+    },
+
+    
+    flatten: function(){
+        var nodes = [],
+            hash = this.nodeHash,
+            key;
+
+        for (key in hash) {
+            if (hash.hasOwnProperty(key)) {
+                nodes.push(hash[key]);
+            }
+        }
+        return nodes;
+    },
+
+    
+    onNodeInsert: function(parent, node) {
+        this.registerNode(node, true);
+    },
+
+    
+    onNodeAppend: function(parent, node) {
+        this.registerNode(node, true);
+    },
+
+    
+    onNodeRemove: function(parent, node) {
+        this.unregisterNode(node, true);
+    },
+
+    
+    getNodeById : function(id) {
+        return this.nodeHash[id];
+    },
+
+    
+    registerNode : function(node, includeChildren) {
+        this.nodeHash[node.getId() || node.internalId] = node;
+        if (includeChildren === true) {
+            node.eachChild(function(child){
+                this.registerNode(child, true);
+            }, this);
+        }
+    },
+
+    
+    unregisterNode : function(node, includeChildren) {
+        delete this.nodeHash[node.getId() || node.internalId];
+        if (includeChildren === true) {
+            node.eachChild(function(child){
+                this.unregisterNode(child, true);
+            }, this);
+        }
+    },
+
+    
+    sort: function(sorterFn, recursive) {
+        this.getRootNode().sort(sorterFn, recursive);
+    },
+
+     
+    filter: function(filters, recursive) {
+        this.getRootNode().filter(filters, recursive);
+    }
+});
+
+Ext.define('Ext.data.TreeStore', {
+    extend: 'Ext.data.AbstractStore',
+    alias: 'store.tree',
+    requires: ['Ext.data.Tree', 'Ext.data.NodeInterface', 'Ext.data.NodeStore'],
+
+    
+
+    
+    clearOnLoad : true,
+
+    
+    nodeParam: 'node',
+
+    
+    defaultRootId: 'root',
+
+    
+    defaultRootProperty: 'children',
+
+    
+    folderSort: false,
+
+    constructor: function(config) {
+        var me = this,
+            root,
+            fields;
+
+        config = Ext.apply({}, config);
+
+        
+        fields = config.fields || me.fields;
+        if (!fields) {
+            config.fields = [{name: 'text', type: 'string'}];
+        }
+
+        me.callParent([config]);
+
+        
+        me.tree = Ext.create('Ext.data.Tree');
+
+        me.relayEvents(me.tree, [
+            
+            "append",
+
+            
+            "remove",
+
+            
+            "move",
+
+            
+            "insert",
+
+            
+            "beforeappend",
+
+            
+            "beforeremove",
+
+            
+            "beforemove",
+
+            
+            "beforeinsert",
+
+             
+             "expand",
+
+             
+             "collapse",
+
+             
+             "beforeexpand",
+
+             
+             "beforecollapse",
+
+             
+             "rootchange"
+        ]);
+
+        me.tree.on({
+            scope: me,
+            remove: me.onNodeRemove,
+            
+            
+            beforeexpand: me.onBeforeNodeExpand,
+            beforecollapse: me.onBeforeNodeCollapse,
+            append: me.onNodeAdded,
+            insert: me.onNodeAdded
+        });
+
+        me.onBeforeSort();
+
+        root = me.root;
+        if (root) {
+            delete me.root;
+            me.setRootNode(root);
+        }
+
+        me.addEvents(
+            
+            'sort'
+        );
+
+        if (Ext.isDefined(me.nodeParameter)) {
+            if (Ext.isDefined(Ext.global.console)) {
+                Ext.global.console.warn('Ext.data.TreeStore: nodeParameter has been deprecated. Please use nodeParam instead.');
+            }
+            me.nodeParam = me.nodeParameter;
+            delete me.nodeParameter;
+        }
+    },
+
+    
+    setProxy: function(proxy) {
+        var reader,
+            needsRoot;
+
+        if (proxy instanceof Ext.data.proxy.Proxy) {
+            
+            needsRoot = Ext.isEmpty(proxy.getReader().root);
+        } else if (Ext.isString(proxy)) {
+            
+            needsRoot = true;
+        } else {
+            
+            reader = proxy.reader;
+            needsRoot = !(reader && !Ext.isEmpty(reader.root));
+        }
+        proxy = this.callParent(arguments);
+        if (needsRoot) {
+            reader = proxy.getReader();
+            reader.root = this.defaultRootProperty;
+            
+            reader.buildExtractors(true);
+        }
+    },
+
+    
+    onBeforeSort: function() {
+        if (this.folderSort) {
+            this.sort({
+                property: 'leaf',
+                direction: 'ASC'
+            }, 'prepend', false);
+        }
+    },
+
+    
+    onBeforeNodeExpand: function(node, callback, scope) {
+        if (node.isLoaded()) {
+            Ext.callback(callback, scope || node, [node.childNodes]);
+        }
+        else if (node.isLoading()) {
+            this.on('load', function() {
+                Ext.callback(callback, scope || node, [node.childNodes]);
+            }, this, {single: true});
+        }
+        else {
+            this.read({
+                node: node,
+                callback: function() {
+                    Ext.callback(callback, scope || node, [node.childNodes]);
+                }
+            });
+        }
+    },
+
+    
+    getNewRecords: function() {
+        return Ext.Array.filter(this.tree.flatten(), this.filterNew);
+    },
+
+    
+    getUpdatedRecords: function() {
+        return Ext.Array.filter(this.tree.flatten(), this.filterUpdated);
+    },
+
+    
+    onBeforeNodeCollapse: function(node, callback, scope) {
+        callback.call(scope || node, node.childNodes);
+    },
+
+    onNodeRemove: function(parent, node) {
+        var removed = this.removed;
+
+        if (!node.isReplace && Ext.Array.indexOf(removed, node) == -1) {
+            removed.push(node);
+        }
+    },
+
+    onNodeAdded: function(parent, node) {
+        var proxy = this.getProxy(),
+            reader = proxy.getReader(),
+            data = node.raw || node.data,
+            dataRoot, children;
+
+        Ext.Array.remove(this.removed, node);
+
+        if (!node.isLeaf() && !node.isLoaded()) {
+            dataRoot = reader.getRoot(data);
+            if (dataRoot) {
+                this.fillNode(node, reader.extractData(dataRoot));
+                delete data[reader.root];
+            }
+        }
+    },
+
+    
+    setRootNode: function(root) {
+        var me = this;
+
+        root = root || {};
+        if (!root.isNode) {
+            
+            Ext.applyIf(root, {
+                id: me.defaultRootId,
+                text: 'Root',
+                allowDrag: false
+            });
+            root = Ext.ModelManager.create(root, me.model);
+        }
+        Ext.data.NodeInterface.decorate(root);
+
+        
+        
+        me.getProxy().getReader().buildExtractors(true);
+
+        
+        me.tree.setRootNode(root);
+
+        
+        if (!root.isLoaded() && (me.autoLoad === true || root.isExpanded())) {
+            me.load({
+                node: root
+            });
+        }
+
+        return root;
+    },
+
+    
+    getRootNode: function() {
+        return this.tree.getRootNode();
+    },
+
+    
+    getNodeById: function(id) {
+        return this.tree.getNodeById(id);
+    },
+
+    
+    load: function(options) {
+        options = options || {};
+        options.params = options.params || {};
+
+        var me = this,
+            node = options.node || me.tree.getRootNode(),
+            root;
+
+        
+        
+        if (!node) {
+            node = me.setRootNode({
+                expanded: true
+            });
+        }
+
+        if (me.clearOnLoad) {
+            node.removeAll(true);
+        }
+
+        Ext.applyIf(options, {
+            node: node
+        });
+        options.params[me.nodeParam] = node ? node.getId() : 'root';
+
+        if (node) {
+            node.set('loading', true);
+        }
+
+        return me.callParent([options]);
+    },
+
+
+    
+    fillNode: function(node, records) {
+        var me = this,
+            ln = records ? records.length : 0,
+            i = 0, sortCollection;
+
+        if (ln && me.sortOnLoad && !me.remoteSort && me.sorters && me.sorters.items) {
+            sortCollection = Ext.create('Ext.util.MixedCollection');
+            sortCollection.addAll(records);
+            sortCollection.sort(me.sorters.items);
+            records = sortCollection.items;
+        }
+
+        node.set('loaded', true);
+        for (; i < ln; i++) {
+            node.appendChild(records[i], undefined, true);
+        }
+
+        return records;
+    },
+
+    
+    onProxyLoad: function(operation) {
+        var me = this,
+            successful = operation.wasSuccessful(),
+            records = operation.getRecords(),
+            node = operation.node;
+
+        me.loading = false;
+        node.set('loading', false);
+        if (successful) {
+            records = me.fillNode(node, records);
+        }
+        
+        
+        
+        
+        me.fireEvent('read', me, operation.node, records, successful);
+        me.fireEvent('load', me, operation.node, records, successful);
+        
+        Ext.callback(operation.callback, operation.scope || me, [records, operation, successful]);
+    },
+
+    
+    onCreateRecords: function(records, operation, success) {
+        if (success) {
+            var i = 0,
+                length = records.length,
+                originalRecords = operation.records,
+                parentNode,
+                record,
+                original,
+                index;
+
+            
+            for (; i < length; ++i) {
+                record = records[i];
+                original = originalRecords[i];
+                if (original) {
+                    parentNode = original.parentNode;
+                    if (parentNode) {
+                        
+                        original.isReplace = true;
+                        parentNode.replaceChild(record, original);
+                        delete original.isReplace;
+                    }
+                    record.phantom = false;
+                }
+            }
+        }
+    },
+
+    
+    onUpdateRecords: function(records, operation, success){
+        if (success) {
+            var me = this,
+                i = 0,
+                length = records.length,
+                data = me.data,
+                original,
+                parentNode,
+                record;
+
+            for (; i < length; ++i) {
+                record = records[i];
+                original = me.tree.getNodeById(record.getId());
+                parentNode = original.parentNode;
+                if (parentNode) {
+                    
+                    original.isReplace = true;
+                    parentNode.replaceChild(record, original);
+                    original.isReplace = false;
+                }
+            }
+        }
+    },
+
+    
+    onDestroyRecords: function(records, operation, success){
+        if (success) {
+            this.removed = [];
+        }
+    },
+
+    
+    removeAll: function() {
+        this.getRootNode().destroy(true);
+        this.fireEvent('clear', this);
+    },
+
+    
+    doSort: function(sorterFn) {
+        var me = this;
+        if (me.remoteSort) {
+            
+            me.load();
+        } else {
+            me.tree.sort(sorterFn, true);
+            me.fireEvent('datachanged', me);
+        }
+        me.fireEvent('sort', me);
+    }
+});
+
+
+Ext.define('Ext.data.UuidGenerator', function () {
+    var twoPow14 = Math.pow(2, 14),
+        twoPow16 = Math.pow(2, 16),
+        twoPow28 = Math.pow(2, 28),
+        twoPow32 = Math.pow(2, 32);
+
+    function toHex (value, length) {
+        var ret = value.toString(16);
+        if (ret.length > length) {
+            ret = ret.substring(ret.length - length); 
+        } else if (ret.length < length) {
+            ret = Ext.String.leftPad(ret, length, '0');
+        }
+        return ret;
+    }
+
+    function rand (lo, hi) {
+        var v = Math.random() * (hi - lo + 1);
+        return Math.floor(v) + lo;
+    }
+
+    function split (bignum) {
+        if (typeof(bignum) == 'number') {
+            var hi = Math.floor(bignum / twoPow32);
+            return {
+                lo: Math.floor(bignum - hi * twoPow32),
+                hi: hi
+            };
+        }
+        return bignum;
+    }
+
+    return {
+        extend: 'Ext.data.IdGenerator',
+
+        alias: 'idgen.uuid',
+
+        id: 'uuid', 
+
+        
+
+        
+
+        
+        version: 4,
+
+        constructor: function() {
+            var me = this;
+
+            me.callParent(arguments);
+
+            me.parts = [];
+            me.init();
+        },
+
+        generate: function () {
+            var me = this,
+                parts = me.parts,
+                ts = me.timestamp;
+
+            
+            parts[0] = toHex(ts.lo, 8);
+            parts[1] = toHex(ts.hi & 0xFFFF, 4);
+            parts[2] = toHex(((ts.hi >>> 16) & 0xFFF) | (me.version << 12), 4);
+            parts[3] = toHex(0x80 | ((me.clockSeq >>> 8) & 0x3F), 2) +
+                       toHex(me.clockSeq & 0xFF, 2);
+            parts[4] = toHex(me.salt.hi, 4) + toHex(me.salt.lo, 8);
+
+            if (me.version == 4) {
+                me.init(); 
+            } else {
+                
+                ++ts.lo;
+                if (ts.lo >= twoPow32) { 
+                    ts.lo = 0;
+                    ++ts.hi;
+                }
+            }
+
+            return parts.join('-').toLowerCase();
+        },
+
+        getRecId: function (rec) {
+            return rec.getId();
+        },
+
+        
+        init: function () {
+            var me = this,
+                salt, time;
+
+            if (me.version == 4) {
+                
+                
+                
+                
+                me.clockSeq = rand(0, twoPow14-1);
+
+                
+                salt = me.salt || (me.salt = {});
+                time = me.timestamp || (me.timestamp = {});
+
+                
+                salt.lo = rand(0, twoPow32-1);
+                salt.hi = rand(0, twoPow16-1);
+                time.lo = rand(0, twoPow32-1);
+                time.hi = rand(0, twoPow28-1);
+            } else {
+                
+                me.salt = split(me.salt);
+                me.timestamp = split(me.timestamp);
+
+                
+                
+                me.salt.hi |= 0x100;
+            }
+        },
+
+        
+        reconfigure: function (config) {
+            Ext.apply(this, config);
+            this.init();
+        }
+    };
+}());
+
+
+Ext.define('Ext.data.XmlStore', {
+    extend: 'Ext.data.Store',
+    alternateClassName: 'Ext.data.XmlStore',
+    alias: 'store.xml',
+
+    
+    constructor: function(config){
+        config = config || {};
+        config = config || {};
+
+        Ext.applyIf(config, {
+            proxy: {
+                type: 'ajax',
+                reader: 'xml',
+                writer: 'xml'
+            }
+        });
+
+        this.callParent([config]);
+    }
+});
+
+
+Ext.define('Ext.data.proxy.Client', {
+    extend: 'Ext.data.proxy.Proxy',
+    alternateClassName: 'Ext.data.ClientProxy',
+
+    
+    clear: function() {
+    }
+});
+
+Ext.define('Ext.data.proxy.JsonP', {
+    extend: 'Ext.data.proxy.Server',
+    alternateClassName: 'Ext.data.ScriptTagProxy',
+    alias: ['proxy.jsonp', 'proxy.scripttag'],
+    requires: ['Ext.data.JsonP'],
+
+    defaultWriterType: 'base',
+
+    
+    callbackKey : 'callback',
+
+    
+    recordParam: 'records',
+
+    
+    autoAppendParams: true,
+
+    constructor: function(){
+        this.addEvents(
+            
+            'exception'
+        );
+        this.callParent(arguments);
+    },
+
+    
+    doRequest: function(operation, callback, scope) {
+        
+        var me      = this,
+            writer  = me.getWriter(),
+            request = me.buildRequest(operation),
+            params = request.params;
+
+        if (operation.allowWrite()) {
+            request = writer.write(request);
+        }
+
+        
+        Ext.apply(request, {
+            callbackKey: me.callbackKey,
+            timeout: me.timeout,
+            scope: me,
+            disableCaching: false, 
+            callback: me.createRequestCallback(request, operation, callback, scope)
+        });
+
+        
+        if (me.autoAppendParams) {
+            request.params = {};
+        }
+
+        request.jsonp = Ext.data.JsonP.request(request);
+        
+        request.params = params;
+        operation.setStarted();
+        me.lastRequest = request;
+
+        return request;
+    },
+
+    
+    createRequestCallback: function(request, operation, callback, scope) {
+        var me = this;
+
+        return function(success, response, errorType) {
+            delete me.lastRequest;
+            me.processResponse(success, operation, request, response, callback, scope);
+        };
+    },
+
+    
+    setException: function(operation, response) {
+        operation.setException(operation.request.jsonp.errorType);
+    },
+
+
+    
+    buildUrl: function(request) {
+        var me      = this,
+            url     = me.callParent(arguments),
+            params  = Ext.apply({}, request.params),
+            filters = params.filters,
+            records,
+            filter, i;
+
+        delete params.filters;
+
+        if (me.autoAppendParams) {
+            url = Ext.urlAppend(url, Ext.Object.toQueryString(params));
+        }
+
+        if (filters && filters.length) {
+            for (i = 0; i < filters.length; i++) {
+                filter = filters[i];
+
+                if (filter.value) {
+                    url = Ext.urlAppend(url, filter.property + "=" + filter.value);
+                }
+            }
+        }
+
+        
+        records = request.records;
+
+        if (Ext.isArray(records) && records.length > 0) {
+            url = Ext.urlAppend(url, Ext.String.format("{0}={1}", me.recordParam, me.encodeRecords(records)));
+        }
+
+        return url;
+    },
+
+    
+    destroy: function() {
+        this.abort();
+        this.callParent();
+    },
+
+    
+    abort: function() {
+        var lastRequest = this.lastRequest;
+        if (lastRequest) {
+            Ext.data.JsonP.abort(lastRequest.jsonp);
+        }
+    },
+
+    
+    encodeRecords: function(records) {
+        var encoded = "",
+            i = 0,
+            len = records.length;
+
+        for (; i < len; i++) {
+            encoded += Ext.Object.toQueryString(records[i].data);
+        }
+
+        return encoded;
+    }
+});
+
+
+Ext.define('Ext.data.proxy.WebStorage', {
+    extend: 'Ext.data.proxy.Client',
+    alternateClassName: 'Ext.data.WebStorageProxy',
+
+    
+    id: undefined,
+
+    
+    constructor: function(config) {
+        this.callParent(arguments);
+
+        
+        this.cache = {};
+
+
+        
+        this.id = this.id || (this.store ? this.store.storeId : undefined);
+
+
+        this.initialize();
+    },
+
+    
+    create: function(operation, callback, scope) {
+        var records = operation.records,
+            length  = records.length,
+            ids     = this.getIds(),
+            id, record, i;
+
+        operation.setStarted();
+
+        for (i = 0; i < length; i++) {
+            record = records[i];
+
+            if (record.phantom) {
+                record.phantom = false;
+                id = this.getNextId();
+            } else {
+                id = record.getId();
+            }
+
+            this.setRecord(record, id);
+            ids.push(id);
+        }
+
+        this.setIds(ids);
+
+        operation.setCompleted();
+        operation.setSuccessful();
+
+        if (typeof callback == 'function') {
+            callback.call(scope || this, operation);
+        }
+    },
+
+    
+    read: function(operation, callback, scope) {
+        
+
+        var records = [],
+            ids     = this.getIds(),
+            length  = ids.length,
+            i, recordData, record;
+
+        
+        if (operation.id) {
+            record = this.getRecord(operation.id);
+
+            if (record) {
+                records.push(record);
+                operation.setSuccessful();
+            }
+        } else {
+            for (i = 0; i < length; i++) {
+                records.push(this.getRecord(ids[i]));
+            }
+            operation.setSuccessful();
+        }
+
+        operation.setCompleted();
+
+        operation.resultSet = Ext.create('Ext.data.ResultSet', {
+            records: records,
+            total  : records.length,
+            loaded : true
+        });
+
+        if (typeof callback == 'function') {
+            callback.call(scope || this, operation);
+        }
+    },
+
+    
+    update: function(operation, callback, scope) {
+        var records = operation.records,
+            length  = records.length,
+            ids     = this.getIds(),
+            record, id, i;
+
+        operation.setStarted();
+
+        for (i = 0; i < length; i++) {
+            record = records[i];
+            this.setRecord(record);
+
+            
+            
+            id = record.getId();
+            if (id !== undefined && Ext.Array.indexOf(ids, id) == -1) {
+                ids.push(id);
+            }
+        }
+        this.setIds(ids);
+
+        operation.setCompleted();
+        operation.setSuccessful();
+
+        if (typeof callback == 'function') {
+            callback.call(scope || this, operation);
+        }
+    },
+
+    
+    destroy: function(operation, callback, scope) {
+        var records = operation.records,
+            length  = records.length,
+            ids     = this.getIds(),
+
+            
+            newIds  = [].concat(ids),
+            i;
+
+        for (i = 0; i < length; i++) {
+            Ext.Array.remove(newIds, records[i].getId());
+            this.removeRecord(records[i], false);
+        }
+
+        this.setIds(newIds);
+
+        operation.setCompleted();
+        operation.setSuccessful();
+
+        if (typeof callback == 'function') {
+            callback.call(scope || this, operation);
+        }
+    },
+
+    
+    getRecord: function(id) {
+        if (this.cache[id] === undefined) {
+            var rawData = Ext.decode(this.getStorageObject().getItem(this.getRecordKey(id))),
+                data    = {},
+                Model   = this.model,
+                fields  = Model.prototype.fields.items,
+                length  = fields.length,
+                i, field, name, record;
+
+            for (i = 0; i < length; i++) {
+                field = fields[i];
+                name  = field.name;
+
+                if (typeof field.decode == 'function') {
+                    data[name] = field.decode(rawData[name]);
+                } else {
+                    data[name] = rawData[name];
+                }
+            }
+
+            record = new Model(data, id);
+            record.phantom = false;
+
+            this.cache[id] = record;
+        }
+
+        return this.cache[id];
+    },
+
+    
+    setRecord: function(record, id) {
+        if (id) {
+            record.setId(id);
+        } else {
+            id = record.getId();
+        }
+
+        var me = this,
+            rawData = record.data,
+            data    = {},
+            model   = me.model,
+            fields  = model.prototype.fields.items,
+            length  = fields.length,
+            i = 0,
+            field, name, obj, key;
+
+        for (; i < length; i++) {
+            field = fields[i];
+            name  = field.name;
+
+            if (typeof field.encode == 'function') {
+                data[name] = field.encode(rawData[name], record);
+            } else {
+                data[name] = rawData[name];
+            }
+        }
+
+        obj = me.getStorageObject();
+        key = me.getRecordKey(id);
+
+        
+        me.cache[id] = record;
+
+        
+        obj.removeItem(key);
+        obj.setItem(key, Ext.encode(data));
+    },
+
+    
+    removeRecord: function(id, updateIds) {
+        var me = this,
+            ids;
+
+        if (id.isModel) {
+            id = id.getId();
+        }
+
+        if (updateIds !== false) {
+            ids = me.getIds();
+            Ext.Array.remove(ids, id);
+            me.setIds(ids);
+        }
+
+        me.getStorageObject().removeItem(me.getRecordKey(id));
+    },
+
+    
+    getRecordKey: function(id) {
+        if (id.isModel) {
+            id = id.getId();
+        }
+
+        return Ext.String.format("{0}-{1}", this.id, id);
+    },
+
+    
+    getRecordCounterKey: function() {
+        return Ext.String.format("{0}-counter", this.id);
+    },
+
+    
+    getIds: function() {
+        var ids    = (this.getStorageObject().getItem(this.id) || "").split(","),
+            length = ids.length,
+            i;
+
+        if (length == 1 && ids[0] === "") {
+            ids = [];
+        } else {
+            for (i = 0; i < length; i++) {
+                ids[i] = parseInt(ids[i], 10);
+            }
+        }
+
+        return ids;
+    },
+
+    
+    setIds: function(ids) {
+        var obj = this.getStorageObject(),
+            str = ids.join(",");
+
+        obj.removeItem(this.id);
+
+        if (!Ext.isEmpty(str)) {
+            obj.setItem(this.id, str);
+        }
+    },
+
+    
+    getNextId: function() {
+        var obj  = this.getStorageObject(),
+            key  = this.getRecordCounterKey(),
+            last = obj.getItem(key),
+            ids, id;
+
+        if (last === null) {
+            ids = this.getIds();
+            last = ids[ids.length - 1] || 0;
+        }
+
+        id = parseInt(last, 10) + 1;
+        obj.setItem(key, id);
+
+        return id;
+    },
+
+    
+    initialize: function() {
+        var storageObject = this.getStorageObject();
+        storageObject.setItem(this.id, storageObject.getItem(this.id) || "");
+    },
+
+    
+    clear: function() {
+        var obj = this.getStorageObject(),
+            ids = this.getIds(),
+            len = ids.length,
+            i;
+
+        
+        for (i = 0; i < len; i++) {
+            this.removeRecord(ids[i]);
+        }
+
+        
+        obj.removeItem(this.getRecordCounterKey());
+        obj.removeItem(this.id);
+    },
+
+    
+    getStorageObject: function() {
+    }
+});
+
+Ext.define('Ext.data.proxy.LocalStorage', {
+    extend: 'Ext.data.proxy.WebStorage',
+    alias: 'proxy.localstorage',
+    alternateClassName: 'Ext.data.LocalStorageProxy',
+    
+    
+    getStorageObject: function() {
+        return window.localStorage;
+    }
+});
+
+Ext.define('Ext.data.proxy.Memory', {
+    extend: 'Ext.data.proxy.Client',
+    alias: 'proxy.memory',
+    alternateClassName: 'Ext.data.MemoryProxy',
+
+    
+
+    constructor: function(config) {
+        this.callParent([config]);
+
+        
+        this.setReader(this.reader);
+    },
+
+    
+    read: function(operation, callback, scope) {
+        var me     = this,
+            reader = me.getReader(),
+            result = reader.read(me.data);
+
+        Ext.apply(operation, {
+            resultSet: result
+        });
+
+        operation.setCompleted();
+        operation.setSuccessful();
+        Ext.callback(callback, scope || me, [operation]);
+    },
+
+    clear: Ext.emptyFn
+});
+
+
+Ext.define('Ext.data.proxy.Rest', {
+    extend: 'Ext.data.proxy.Ajax',
+    alternateClassName: 'Ext.data.RestProxy',
+    alias : 'proxy.rest',
+    
+    
+    appendId: true,
+    
+    
+    
+    
+    batchActions: false,
+    
+    
+    buildUrl: function(request) {
+        var me        = this,
+            operation = request.operation,
+            records   = operation.records || [],
+            record    = records[0],
+            format    = me.format,
+            url       = me.getUrl(request),
+            id        = record ? record.getId() : operation.id;
+        
+        if (me.appendId && id) {
+            if (!url.match(/\/$/)) {
+                url += '/';
+            }
+            
+            url += id;
+        }
+        
+        if (format) {
+            if (!url.match(/\.$/)) {
+                url += '.';
+            }
+            
+            url += format;
+        }
+        
+        request.url = url;
+        
+        return me.callParent(arguments);
+    }
+}, function() {
+    Ext.apply(this.prototype, {
+        
+        actionMethods: {
+            create : 'POST',
+            read   : 'GET',
+            update : 'PUT',
+            destroy: 'DELETE'
+        }
+    });
+});
+
+
+Ext.define('Ext.data.proxy.SessionStorage', {
+    extend: 'Ext.data.proxy.WebStorage',
+    alias: 'proxy.sessionstorage',
+    alternateClassName: 'Ext.data.SessionStorageProxy',
+    
+    
+    getStorageObject: function() {
+        return window.sessionStorage;
+    }
+});
+
+
+Ext.define('Ext.data.reader.Array', {
+    extend: 'Ext.data.reader.Json',
+    alternateClassName: 'Ext.data.ArrayReader',
+    alias : 'reader.array',
+
+    
+    buildExtractors: function() {
+        this.callParent(arguments);
+        
+        var fields = this.model.prototype.fields.items,
+            i = 0,
+            length = fields.length,
+            extractorFunctions = [],
+            map;
+        
+        for (; i < length; i++) {
+            map = fields[i].mapping;
+            extractorFunctions.push(function(index) {
+                return function(data) {
+                    return data[index];
+                };
+            }(map !== null ? map : i));
+        }
+        
+        this.extractorFunctions = extractorFunctions;
+    }
+});
+
+
+Ext.define('Ext.data.reader.Xml', {
+    extend: 'Ext.data.reader.Reader',
+    alternateClassName: 'Ext.data.XmlReader',
+    alias : 'reader.xml',
+
+    
+
+    
+    createAccessor: function(expr) {
+        var me = this;
+
+        if (Ext.isEmpty(expr)) {
+            return Ext.emptyFn;
+        }
+
+        if (Ext.isFunction(expr)) {
+            return expr;
+        }
+
+        return function(root) {
+            return me.getNodeValue(Ext.DomQuery.selectNode(expr, root));
+        };
+    },
+
+    getNodeValue: function(node) {
+        if (node && node.firstChild) {
+            return node.firstChild.nodeValue;
+        }
+        return undefined;
+    },
+
+    
+    getResponseData: function(response) {
+        var xml = response.responseXML;
+
+
+        return xml;
+    },
+
+    
+    getData: function(data) {
+        return data.documentElement || data;
+    },
+
+    
+    getRoot: function(data) {
+        var nodeName = data.nodeName,
+            root     = this.root;
+
+        if (!root || (nodeName && nodeName == root)) {
+            return data;
+        } else if (Ext.DomQuery.isXml(data)) {
+            
+            
+            
+            return Ext.DomQuery.selectNode(root, data);
+        }
+    },
+
+    
+    extractData: function(root) {
+        var recordName = this.record;
+
+
+        if (recordName != root.nodeName) {
+            root = Ext.DomQuery.select(recordName, root);
+        } else {
+            root = [root];
+        }
+        return this.callParent([root]);
+    },
+
+    
+    getAssociatedDataRoot: function(data, associationName) {
+        return Ext.DomQuery.select(associationName, data)[0];
+    },
+
+    
+    readRecords: function(doc) {
+        
+        if (Ext.isArray(doc)) {
+            doc = doc[0];
+        }
+
+        
+        this.xmlData = doc;
+        return this.callParent([doc]);
+    }
+});
+
+Ext.define('Ext.data.writer.Xml', {
+    
+    
+    
+    extend: 'Ext.data.writer.Writer',
+    alternateClassName: 'Ext.data.XmlWriter',
+    
+    alias: 'writer.xml',
+    
+    
+    
+    
+    documentRoot: 'xmlData',
+    
+    
+    defaultDocumentRoot: 'xmlData',
+
+    
+    header: '',
+
+    
+    record: 'record',
+
+    
+    writeRecords: function(request, data) {
+        var me = this,
+            xml = [],
+            i = 0,
+            len = data.length,
+            root = me.documentRoot,
+            record = me.record,
+            needsRoot = data.length !== 1,
+            item,
+            key;
+            
+        
+        xml.push(me.header || '');
+        
+        if (!root && needsRoot) {
+            root = me.defaultDocumentRoot;
+        }
+        
+        if (root) {
+            xml.push('<', root, '>');
+        }
+            
+        for (; i < len; ++i) {
+            item = data[i];
+            xml.push('<', record, '>');
+            for (key in item) {
+                if (item.hasOwnProperty(key)) {
+                    xml.push('<', key, '>', item[key], '</', key, '>');
+                }
+            }
+            xml.push('</', record, '>');
+        }
+        
+        if (root) {
+            xml.push('</', root, '>');
+        }
+            
+        request.xmlData = xml.join('');
+        return request;
+    }
+});
+
+
+Ext.define('Ext.direct.Event', {
+
+    
+
+    alias: 'direct.event',
+
+    requires: ['Ext.direct.Manager'],
+
+    
+
+    status: true,
+
+    
+    constructor: function(config) {
+        Ext.apply(this, config);
+    },
+
+    
+    getData: function(){
+        return this.data;
+    }
+});
+
+
+Ext.define('Ext.direct.RemotingEvent', {
+    
+    
+   
+    extend: 'Ext.direct.Event',
+    
+    alias: 'direct.rpc',
+    
+    
+    
+    
+    getTransaction: function(){
+        return this.transaction || Ext.direct.Manager.getTransaction(this.tid);
+    }
+});
+
+
+Ext.define('Ext.direct.ExceptionEvent', {
+    
+    
+   
+    extend: 'Ext.direct.RemotingEvent',
+    
+    alias: 'direct.exception',
+    
+    
+   
+   status: false
+});
+
+
+Ext.define('Ext.direct.Provider', {
+
+    
+
+   alias: 'direct.provider',
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    
+
+   
+
+    constructor : function(config){
+        var me = this;
+
+        Ext.apply(me, config);
+        me.addEvents(
+            
+            'connect',
+            
+            'disconnect',
+            
+            'data',
+            
+            'exception'
+        );
+        me.mixins.observable.constructor.call(me, config);
+    },
+
+    
+    isConnected: function(){
+        return false;
+    },
+
+    
+    connect: Ext.emptyFn,
+
+    
+    disconnect: Ext.emptyFn
+});
+
+
+
+Ext.define('Ext.direct.JsonProvider', {
+
+    
+
+    extend: 'Ext.direct.Provider',
+
+    alias: 'direct.jsonprovider',
+
+    uses: ['Ext.direct.ExceptionEvent'],
+
+    
+
+   
+   parseResponse: function(response){
+        if (!Ext.isEmpty(response.responseText)) {
+            if (Ext.isObject(response.responseText)) {
+                return response.responseText;
+            }
+            return Ext.decode(response.responseText);
+        }
+        return null;
+    },
+
+    
+    createEvents: function(response){
+        var data = null,
+            events = [],
+            event,
+            i = 0,
+            len;
+
+        try{
+            data = this.parseResponse(response);
+        } catch(e) {
+            event = Ext.create('Ext.direct.ExceptionEvent', {
+                data: e,
+                xhr: response,
+                code: Ext.direct.Manager.self.exceptions.PARSE,
+                message: 'Error parsing json response: \n\n ' + data
+            });
+            return [event];
+        }
+
+        if (Ext.isArray(data)) {
+            for (len = data.length; i < len; ++i) {
+                events.push(this.createEvent(data[i]));
+            }
+        } else {
+            events.push(this.createEvent(data));
+        }
+        return events;
+    },
+
+    
+    createEvent: function(response){
+        return Ext.create('direct.' + response.type, response);
+    }
+});
+
+Ext.define('Ext.direct.PollingProvider', {
+    
+    
+    
+    extend: 'Ext.direct.JsonProvider',
+    
+    alias: 'direct.pollingprovider',
+    
+    uses: ['Ext.direct.ExceptionEvent'],
+    
+    requires: ['Ext.Ajax', 'Ext.util.DelayedTask'],
+    
+    
+    
+    
+    interval: 3000,
+
+    
+    
+    
+
+    
+    constructor : function(config){
+        this.callParent(arguments);
+        this.addEvents(
+            
+            'beforepoll',            
+            
+            'poll'
+        );
+    },
+
+    
+    isConnected: function(){
+        return !!this.pollTask;
+    },
+
+    
+    connect: function(){
+        var me = this, url = me.url;
+        
+        if (url && !me.pollTask) {
+            me.pollTask = Ext.TaskManager.start({
+                run: function(){
+                    if (me.fireEvent('beforepoll', me) !== false) {
+                        if (Ext.isFunction(url)) {
+                            url(me.baseParams);
+                        } else {
+                            Ext.Ajax.request({
+                                url: url,
+                                callback: me.onData,
+                                scope: me,
+                                params: me.baseParams
+                            });
+                        }
+                    }
+                },
+                interval: me.interval,
+                scope: me
+            });
+            me.fireEvent('connect', me);
+        } else if (!url) {
+        }
+    },
+
+    
+    disconnect: function(){
+        var me = this;
+        
+        if (me.pollTask) {
+            Ext.TaskManager.stop(me.pollTask);
+            delete me.pollTask;
+            me.fireEvent('disconnect', me);
+        }
+    },
+
+    
+    onData: function(opt, success, response){
+        var me = this, 
+            i = 0, 
+            len,
+            events;
+        
+        if (success) {
+            events = me.createEvents(response);
+            for (len = events.length; i < len; ++i) {
+                me.fireEvent('data', me, events[i]);
+            }
+        } else {
+            me.fireEvent('data', me, Ext.create('Ext.direct.ExceptionEvent', {
+                data: null,
+                code: Ext.direct.Manager.self.exceptions.TRANSPORT,
+                message: 'Unable to connect to the server.',
+                xhr: response
+            }));
+        }
+    }
+});
+
+Ext.define('Ext.direct.RemotingMethod', {
+
+    constructor: function(config){
+        var me = this,
+            params = Ext.isDefined(config.params) ? config.params : config.len,
+            name;
+
+        me.name = config.name;
+        me.formHandler = config.formHandler;
+        if (Ext.isNumber(params)) {
+            
+            me.len = params;
+            me.ordered = true;
+        } else {
+            
+            me.params = [];
+            Ext.each(params, function(param){
+                name = Ext.isObject(param) ? param.name : param;
+                me.params.push(name);
+            });
+        }
+    },
+
+    
+    getCallData: function(args){
+        var me = this,
+            data = null,
+            len  = me.len,
+            params = me.params,
+            callback,
+            scope,
+            name;
+
+        if (me.ordered) {
+            callback = args[len];
+            scope = args[len + 1];
+            if (len !== 0) {
+                data = args.slice(0, len);
+            }
+        } else {
+            data = Ext.apply({}, args[0]);
+            callback = args[1];
+            scope = args[2];
+
+            
+            for (name in data) {
+                if (data.hasOwnProperty(name)) {
+                    if (!Ext.Array.contains(params, name)) {
+                        delete data[name];
+                    }
+                }
+            }
+        }
+
+        return {
+            data: data,
+            callback: callback,
+            scope: scope
+        };
+    }
+});
+
+
+Ext.define('Ext.direct.Transaction', {
+    
+    
+   
+    alias: 'direct.transaction',
+    alternateClassName: 'Ext.Direct.Transaction',
+   
+    statics: {
+        TRANSACTION_ID: 0
+    },
+   
+    
+
+    
+    constructor: function(config){
+        var me = this;
+        
+        Ext.apply(me, config);
+        me.id = ++me.self.TRANSACTION_ID;
+        me.retryCount = 0;
+    },
+   
+    send: function(){
+         this.provider.queueTransaction(this);
+    },
+
+    retry: function(){
+        this.retryCount++;
+        this.send();
+    },
+
+    getProvider: function(){
+        return this.provider;
+    }
+});
+
+
+Ext.define('Ext.direct.RemotingProvider', {
+    
+    
+   
+    alias: 'direct.remotingprovider',
+    
+    extend: 'Ext.direct.JsonProvider', 
+    
+    requires: [
+        'Ext.util.MixedCollection', 
+        'Ext.util.DelayedTask', 
+        'Ext.direct.Transaction',
+        'Ext.direct.RemotingMethod'
+    ],
+   
+    
+   
+   
+    
+    
+    
+    
+    
+    
+    
+    
+    enableBuffer: 10,
+    
+    
+    maxRetries: 1,
+    
+    
+    timeout: undefined,
+    
+    constructor : function(config){
+        var me = this;
+        me.callParent(arguments);
+        me.addEvents(
+                        
+            'beforecall',            
+                        
+            'call'
+        );
+        me.namespace = (Ext.isString(me.namespace)) ? Ext.ns(me.namespace) : me.namespace || window;
+        me.transactions = Ext.create('Ext.util.MixedCollection');
+        me.callBuffer = [];
+    },
+    
+    
+    initAPI : function(){
+        var actions = this.actions,
+            namespace = this.namespace,
+            action,
+            cls,
+            methods,
+            i,
+            len,
+            method;
+            
+        for (action in actions) {
+            cls = namespace[action];
+            if (!cls) {
+                cls = namespace[action] = {};
+            }
+            methods = actions[action];
+            
+            for (i = 0, len = methods.length; i < len; ++i) {
+                method = Ext.create('Ext.direct.RemotingMethod', methods[i]);
+                cls[method.name] = this.createHandler(action, method);
+            }
+        }
+    },
+    
+    
+    createHandler : function(action, method){
+        var me = this,
+            handler;
+        
+        if (!method.formHandler) {
+            handler = function(){
+                me.configureRequest(action, method, Array.prototype.slice.call(arguments, 0));
+            };
+        } else {
+            handler = function(form, callback, scope){
+                me.configureFormRequest(action, method, form, callback, scope);
+            };
+        }
+        handler.directCfg = {
+            action: action,
+            method: method
+        };
+        return handler;
+    },
+    
+    
+    isConnected: function(){
+        return !!this.connected;
+    },
+
+    
+    connect: function(){
+        var me = this;
+        
+        if (me.url) {
+            me.initAPI();
+            me.connected = true;
+            me.fireEvent('connect', me);
+        } else if(!me.url) {
+        }
+    },
+
+    
+    disconnect: function(){
+        var me = this;
+        
+        if (me.connected) {
+            me.connected = false;
+            me.fireEvent('disconnect', me);
+        }
+    },
+    
+    
+    runCallback: function(transaction, event){
+        var funcName = event.status ? 'success' : 'failure',
+            callback,
+            result;
+        
+        if (transaction && transaction.callback) {
+            callback = transaction.callback;
+            result = Ext.isDefined(event.result) ? event.result : event.data;
+        
+            if (Ext.isFunction(callback)) {
+                callback(result, event);
+            } else {
+                Ext.callback(callback[funcName], callback.scope, [result, event]);
+                Ext.callback(callback.callback, callback.scope, [result, event]);
+            }
+        }
+    },
+    
+    
+    onData: function(options, success, response){
+        var me = this,
+            i = 0,
+            len,
+            events,
+            event,
+            transaction,
+            transactions;
+            
+        if (success) {
+            events = me.createEvents(response);
+            for (len = events.length; i < len; ++i) {
+                event = events[i];
+                transaction = me.getTransaction(event);
+                me.fireEvent('data', me, event);
+                if (transaction) {
+                    me.runCallback(transaction, event, true);
+                    Ext.direct.Manager.removeTransaction(transaction);
+                }
+            }
+        } else {
+            transactions = [].concat(options.transaction);
+            for (len = transactions.length; i < len; ++i) {
+                transaction = me.getTransaction(transactions[i]);
+                if (transaction && transaction.retryCount < me.maxRetries) {
+                    transaction.retry();
+                } else {
+                    event = Ext.create('Ext.direct.ExceptionEvent', {
+                        data: null,
+                        transaction: transaction,
+                        code: Ext.direct.Manager.self.exceptions.TRANSPORT,
+                        message: 'Unable to connect to the server.',
+                        xhr: response
+                    });
+                    me.fireEvent('data', me, event);
+                    if (transaction) {
+                        me.runCallback(transaction, event, false);
+                        Ext.direct.Manager.removeTransaction(transaction);
+                    }
+                }
+            }
+        }
+    },
+    
+    
+    getTransaction: function(options){
+        return options && options.tid ? Ext.direct.Manager.getTransaction(options.tid) : null;
+    },
+    
+    
+    configureRequest: function(action, method, args){
+        var me = this,
+            callData = method.getCallData(args),
+            data = callData.data, 
+            callback = callData.callback, 
+            scope = callData.scope,
+            transaction;
+
+        transaction = Ext.create('Ext.direct.Transaction', {
+            provider: me,
+            args: args,
+            action: action,
+            method: method.name,
+            data: data,
+            callback: scope && Ext.isFunction(callback) ? Ext.Function.bind(callback, scope) : callback
+        });
+
+        if (me.fireEvent('beforecall', me, transaction, method) !== false) {
+            Ext.direct.Manager.addTransaction(transaction);
+            me.queueTransaction(transaction);
+            me.fireEvent('call', me, transaction, method);
+        }
+    },
+    
+    
+    getCallData: function(transaction){
+        return {
+            action: transaction.action,
+            method: transaction.method,
+            data: transaction.data,
+            type: 'rpc',
+            tid: transaction.id
+        };
+    },
+    
+    
+    sendRequest : function(data){
+        var me = this,
+            request = {
+                url: me.url,
+                callback: me.onData,
+                scope: me,
+                transaction: data,
+                timeout: me.timeout
+            }, callData,
+            enableUrlEncode = me.enableUrlEncode,
+            i = 0,
+            len,
+            params;
+            
+
+        if (Ext.isArray(data)) {
+            callData = [];
+            for (len = data.length; i < len; ++i) {
+                callData.push(me.getCallData(data[i]));
+            }
+        } else {
+            callData = me.getCallData(data);
+        }
+
+        if (enableUrlEncode) {
+            params = {};
+            params[Ext.isString(enableUrlEncode) ? enableUrlEncode : 'data'] = Ext.encode(callData);
+            request.params = params;
+        } else {
+            request.jsonData = callData;
+        }
+        Ext.Ajax.request(request);
+    },
+    
+    
+    queueTransaction: function(transaction){
+        var me = this,
+            enableBuffer = me.enableBuffer;
+        
+        if (transaction.form) {
+            me.sendFormRequest(transaction);
+            return;
+        }
+        
+        me.callBuffer.push(transaction);
+        if (enableBuffer) {
+            if (!me.callTask) {
+                me.callTask = Ext.create('Ext.util.DelayedTask', me.combineAndSend, me);
+            }
+            me.callTask.delay(Ext.isNumber(enableBuffer) ? enableBuffer : 10);
+        } else {
+            me.combineAndSend();
+        }
+    },
+    
+    
+    combineAndSend : function(){
+        var buffer = this.callBuffer,
+            len = buffer.length;
+            
+        if (len > 0) {
+            this.sendRequest(len == 1 ? buffer[0] : buffer);
+            this.callBuffer = [];
+        }
+    },
+    
+    
+    configureFormRequest : function(action, method, form, callback, scope){
+        var me = this,
+            transaction = Ext.create('Ext.direct.Transaction', {
+                provider: me,
+                action: action,
+                method: method.name,
+                args: [form, callback, scope],
+                callback: scope && Ext.isFunction(callback) ? Ext.Function.bind(callback, scope) : callback,
+                isForm: true
+            }),
+            isUpload,
+            params;
+
+        if (me.fireEvent('beforecall', me, transaction, method) !== false) {
+            Ext.direct.Manager.addTransaction(transaction);
+            isUpload = String(form.getAttribute("enctype")).toLowerCase() == 'multipart/form-data';
+            
+            params = {
+                extTID: transaction.id,
+                extAction: action,
+                extMethod: method.name,
+                extType: 'rpc',
+                extUpload: String(isUpload)
+            };
+            
+            
+            
+            Ext.apply(transaction, {
+                form: Ext.getDom(form),
+                isUpload: isUpload,
+                params: callback && Ext.isObject(callback.params) ? Ext.apply(params, callback.params) : params
+            });
+            me.fireEvent('call', me, transaction, method);
+            me.sendFormRequest(transaction);
+        }
+    },
+    
+    
+    sendFormRequest: function(transaction){
+        Ext.Ajax.request({
+            url: this.url,
+            params: transaction.params,
+            callback: this.onData,
+            scope: this,
+            form: transaction.form,
+            isUpload: transaction.isUpload,
+            transaction: transaction
+        });
+    }
+    
+});
+
+
+Ext.define('Ext.draw.Matrix', {
+
+    
+
+    requires: ['Ext.draw.Draw'],
+
+    
+
+    constructor: function(a, b, c, d, e, f) {
+        if (a != null) {
+            this.matrix = [[a, c, e], [b, d, f], [0, 0, 1]];
+        }
+        else {
+            this.matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
+        }
+    },
+
+    add: function(a, b, c, d, e, f) {
+        var me = this,
+            out = [[], [], []],
+            matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
+            x,
+            y,
+            z,
+            res;
+
+        for (x = 0; x < 3; x++) {
+            for (y = 0; y < 3; y++) {
+                res = 0;
+                for (z = 0; z < 3; z++) {
+                    res += me.matrix[x][z] * matrix[z][y];
+                }
+                out[x][y] = res;
+            }
+        }
+        me.matrix = out;
+    },
+
+    prepend: function(a, b, c, d, e, f) {
+        var me = this,
+            out = [[], [], []],
+            matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
+            x,
+            y,
+            z,
+            res;
+
+        for (x = 0; x < 3; x++) {
+            for (y = 0; y < 3; y++) {
+                res = 0;
+                for (z = 0; z < 3; z++) {
+                    res += matrix[x][z] * me.matrix[z][y];
+                }
+                out[x][y] = res;
+            }
+        }
+        me.matrix = out;
+    },
+
+    invert: function() {
+        var matrix = this.matrix,
+            a = matrix[0][0],
+            b = matrix[1][0],
+            c = matrix[0][1],
+            d = matrix[1][1],
+            e = matrix[0][2],
+            f = matrix[1][2],
+            x = a * d - b * c;
+        return new Ext.draw.Matrix(d / x, -b / x, -c / x, a / x, (c * f - d * e) / x, (b * e - a * f) / x);
+    },
+
+    clone: function() {
+        var matrix = this.matrix,
+            a = matrix[0][0],
+            b = matrix[1][0],
+            c = matrix[0][1],
+            d = matrix[1][1],
+            e = matrix[0][2],
+            f = matrix[1][2];
+        return new Ext.draw.Matrix(a, b, c, d, e, f);
+    },
+
+    translate: function(x, y) {
+        this.prepend(1, 0, 0, 1, x, y);
+    },
+
+    scale: function(x, y, cx, cy) {
+        var me = this;
+        if (y == null) {
+            y = x;
+        }
+        me.add(1, 0, 0, 1, cx, cy);
+        me.add(x, 0, 0, y, 0, 0);
+        me.add(1, 0, 0, 1, -cx, -cy);
+    },
+
+    rotate: function(a, x, y) {
+        a = Ext.draw.Draw.rad(a);
+        var me = this,
+            cos = +Math.cos(a).toFixed(9),
+            sin = +Math.sin(a).toFixed(9);
+        me.add(cos, sin, -sin, cos, x, y);
+        me.add(1, 0, 0, 1, -x, -y);
+    },
+
+    x: function(x, y) {
+        var matrix = this.matrix;
+        return x * matrix[0][0] + y * matrix[0][1] + matrix[0][2];
+    },
+
+    y: function(x, y) {
+        var matrix = this.matrix;
+        return x * matrix[1][0] + y * matrix[1][1] + matrix[1][2];
+    },
+
+    get: function(i, j) {
+        return + this.matrix[i][j].toFixed(4);
+    },
+
+    toString: function() {
+        var me = this;
+        return [me.get(0, 0), me.get(0, 1), me.get(1, 0), me.get(1, 1), 0, 0].join();
+    },
+
+    toSvg: function() {
+        var me = this;
+        return "matrix(" + [me.get(0, 0), me.get(1, 0), me.get(0, 1), me.get(1, 1), me.get(0, 2), me.get(1, 2)].join() + ")";
+    },
+
+    toFilter: function() {
+        var me = this;
+        return "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand',FilterType=bilinear,M11=" + me.get(0, 0) +
+            ", M12=" + me.get(0, 1) + ", M21=" + me.get(1, 0) + ", M22=" + me.get(1, 1) +
+            ", Dx=" + me.get(0, 2) + ", Dy=" + me.get(1, 2) + ")";
+    },
+
+    offset: function() {
+        var matrix = this.matrix;
+        return [(matrix[0][2] || 0).toFixed(4), (matrix[1][2] || 0).toFixed(4)];
+    },
+
+    
+    split: function () {
+        function norm(a) {
+            return a[0] * a[0] + a[1] * a[1];
+        }
+        function normalize(a) {
+            var mag = Math.sqrt(norm(a));
+            a[0] /= mag;
+            a[1] /= mag;
+        }
+        var matrix = this.matrix,
+            out = {
+                translateX: matrix[0][2],
+                translateY: matrix[1][2]
+            },
+            row;
+
+        
+        row = [[matrix[0][0], matrix[0][1]], [matrix[1][0], matrix[1][1]]];
+        out.scaleX = Math.sqrt(norm(row[0]));
+        normalize(row[0]);
+
+        out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];
+        row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];
+
+        out.scaleY = Math.sqrt(norm(row[1]));
+        normalize(row[1]);
+        out.shear /= out.scaleY;
+
+        
+        out.rotate = Math.asin(-row[0][1]);
+
+        out.isSimple = !+out.shear.toFixed(9) && (out.scaleX.toFixed(9) == out.scaleY.toFixed(9) || !out.rotate);
+
+        return out;
+    }
+});
+
+
+Ext.define('Ext.draw.SpriteDD', {
+    extend: 'Ext.dd.DragSource',
+
+    constructor : function(sprite, cfg){
+        var me = this,
+            el = sprite.el;
+        me.sprite = sprite;
+        me.el = el;
+        me.dragData = {el: el, sprite: sprite};
+        me.callParent([el, cfg]);
+        me.sprite.setStyle('cursor', 'move');
+    },
+
+    showFrame: Ext.emptyFn,
+    createFrame : Ext.emptyFn,
+
+    getDragEl : function(e){
+        return this.el;
+    },
+    
+    getRegion: function() {
+        var me = this,
+            el = me.el,
+            pos, x1, x2, y1, y2, t, r, b, l, bbox, sprite;
+        
+        sprite = me.sprite;
+        bbox = sprite.getBBox();
+        
+        try {
+            pos = Ext.Element.getXY(el);
+        } catch (e) { }
+
+        if (!pos) {
+            return null;
+        }
+
+        x1 = pos[0];
+        x2 = x1 + bbox.width;
+        y1 = pos[1];
+        y2 = y1 + bbox.height;
+        
+        return Ext.create('Ext.util.Region', y1, x2, y2, x1);
+    },
+
+    
+     
+    startDrag: function(x, y) {
+        var me = this,
+            attr = me.sprite.attr;
+        me.prev = me.sprite.surface.transformToViewBox(x, y);
+    },
+
+    onDrag: function(e) {
+        var xy = e.getXY(),
+            me = this,
+            sprite = me.sprite,
+            attr = sprite.attr, dx, dy;
+        xy = me.sprite.surface.transformToViewBox(xy[0], xy[1]);
+        dx = xy[0] - me.prev[0];
+        dy = xy[1] - me.prev[1];
+        sprite.setAttributes({
+            translate: {
+                x: attr.translation.x + dx,
+                y: attr.translation.y + dy
+            }
+        }, true);
+        me.prev = xy;
+    },
+
+    setDragElPos: function () {
+        
+        return false;
+    }
+});
+
+Ext.define('Ext.draw.Sprite', {
+
+    
+
+    mixins: {
+        observable: 'Ext.util.Observable',
+        animate: 'Ext.util.Animate'
+    },
+
+    requires: ['Ext.draw.SpriteDD'],
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    dirty: false,
+    dirtyHidden: false,
+    dirtyTransform: false,
+    dirtyPath: true,
+    dirtyFont: true,
+    zIndexDirty: true,
+    isSprite: true,
+    zIndex: 0,
+    fontProperties: [
+        'font',
+        'font-size',
+        'font-weight',
+        'font-style',
+        'font-family',
+        'text-anchor',
+        'text'
+    ],
+    pathProperties: [
+        'x',
+        'y',
+        'd',
+        'path',
+        'height',
+        'width',
+        'radius',
+        'r',
+        'rx',
+        'ry',
+        'cx',
+        'cy'
+    ],
+    constructor: function(config) {
+        var me = this;
+        config = config || {};
+        me.id = Ext.id(null, 'ext-sprite-');
+        me.transformations = [];
+        Ext.copyTo(this, config, 'surface,group,type,draggable');
+        
+        me.bbox = {};
+        me.attr = {
+            zIndex: 0,
+            translation: {
+                x: null,
+                y: null
+            },
+            rotation: {
+                degrees: null,
+                x: null,
+                y: null
+            },
+            scaling: {
+                x: null,
+                y: null,
+                cx: null,
+                cy: null
+            }
+        };
+        
+        delete config.surface;
+        delete config.group;
+        delete config.type;
+        delete config.draggable;
+        me.setAttributes(config);
+        me.addEvents(
+            'beforedestroy',
+            'destroy',
+            'render',
+            'mousedown',
+            'mouseup',
+            'mouseover',
+            'mouseout',
+            'mousemove',
+            'click'
+        );
+        me.mixins.observable.constructor.apply(this, arguments);
+    },
+
+    
+
+    initDraggable: function() {
+        var me = this;
+        me.draggable = true;
+        
+        if (!me.el) {
+            me.surface.createSpriteElement(me);
+        }
+        me.dd = Ext.create('Ext.draw.SpriteDD', me, Ext.isBoolean(me.draggable) ? null : me.draggable);
+        me.on('beforedestroy', me.dd.destroy, me.dd);
+    },
+
+    
+    setAttributes: function(attrs, redraw) {
+        var me = this,
+            fontProps = me.fontProperties,
+            fontPropsLength = fontProps.length,
+            pathProps = me.pathProperties,
+            pathPropsLength = pathProps.length,
+            hasSurface = !!me.surface,
+            custom = hasSurface && me.surface.customAttributes || {},
+            spriteAttrs = me.attr,
+            attr, i, translate, translation, rotate, rotation, scale, scaling;
+
+        attrs = Ext.apply({}, attrs);
+        for (attr in custom) {
+            if (attrs.hasOwnProperty(attr) && typeof custom[attr] == "function") {
+                Ext.apply(attrs, custom[attr].apply(me, [].concat(attrs[attr])));
+            }
+        }
+
+        
+        if (!!attrs.hidden !== !!spriteAttrs.hidden) {
+            me.dirtyHidden = true;
+        }
+
+        
+        for (i = 0; i < pathPropsLength; i++) {
+            attr = pathProps[i];
+            if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
+                me.dirtyPath = true;
+                break;
+            }
+        }
+
+        
+        if ('zIndex' in attrs) {
+            me.zIndexDirty = true;
+        }
+
+        
+        for (i = 0; i < fontPropsLength; i++) {
+            attr = fontProps[i];
+            if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
+                me.dirtyFont = true;
+                break;
+            }
+        }
+
+        translate = attrs.translate;
+        translation = spriteAttrs.translation;
+        if (translate) {
+            if ((translate.x && translate.x !== translation.x) ||
+                (translate.y && translate.y !== translation.y)) {
+                Ext.apply(translation, translate);
+                me.dirtyTransform = true;
+            }
+            delete attrs.translate;
+        }
+
+        rotate = attrs.rotate;
+        rotation = spriteAttrs.rotation;
+        if (rotate) {
+            if ((rotate.x && rotate.x !== rotation.x) ||
+                (rotate.y && rotate.y !== rotation.y) ||
+                (rotate.degrees && rotate.degrees !== rotation.degrees)) {
+                Ext.apply(rotation, rotate);
+                me.dirtyTransform = true;
+            }
+            delete attrs.rotate;
+        }
+
+        scale = attrs.scale;
+        scaling = spriteAttrs.scaling;
+        if (scale) {
+            if ((scale.x && scale.x !== scaling.x) ||
+                (scale.y && scale.y !== scaling.y) ||
+                (scale.cx && scale.cx !== scaling.cx) ||
+                (scale.cy && scale.cy !== scaling.cy)) {
+                Ext.apply(scaling, scale);
+                me.dirtyTransform = true;
+            }
+            delete attrs.scale;
+        }
+
+        Ext.apply(spriteAttrs, attrs);
+        me.dirty = true;
+
+        if (redraw === true && hasSurface) {
+            me.redraw();
+        }
+        return this;
+    },
+
+    
+    getBBox: function() {
+        return this.surface.getBBox(this);
+    },
+
+    setText: function(text) {
+        return this.surface.setText(this, text);
+    },
+
+    
+    hide: function(redraw) {
+        this.setAttributes({
+            hidden: true
+        }, redraw);
+        return this;
+    },
+
+    
+    show: function(redraw) {
+        this.setAttributes({
+            hidden: false
+        }, redraw);
+        return this;
+    },
+
+    
+    remove: function() {
+        if (this.surface) {
+            this.surface.remove(this);
+            return true;
+        }
+        return false;
+    },
+
+    onRemove: function() {
+        this.surface.onRemove(this);
+    },
+
+    
+    destroy: function() {
+        var me = this;
+        if (me.fireEvent('beforedestroy', me) !== false) {
+            me.remove();
+            me.surface.onDestroy(me);
+            me.clearListeners();
+            me.fireEvent('destroy');
+        }
+    },
+
+    
+    redraw: function() {
+        this.surface.renderItem(this);
+        return this;
+    },
+
+    
+    setStyle: function() {
+        this.el.setStyle.apply(this.el, arguments);
+        return this;
+    },
+
+    
+    addCls: function(obj) {
+        this.surface.addCls(this, obj);
+        return this;
+    },
+
+    
+    removeCls: function(obj) {
+        this.surface.removeCls(this, obj);
+        return this;
+    }
+});
+
+
+Ext.define('Ext.draw.engine.Svg', {
+
+    
+
+    extend: 'Ext.draw.Surface',
+
+    requires: ['Ext.draw.Draw', 'Ext.draw.Sprite', 'Ext.draw.Matrix', 'Ext.Element'],
+
+    
+
+    engine: 'Svg',
+
+    trimRe: /^\s+|\s+$/g,
+    spacesRe: /\s+/,
+    xlink: "http:/" + "/www.w3.org/1999/xlink",
+
+    translateAttrs: {
+        radius: "r",
+        radiusX: "rx",
+        radiusY: "ry",
+        path: "d",
+        lineWidth: "stroke-width",
+        fillOpacity: "fill-opacity",
+        strokeOpacity: "stroke-opacity",
+        strokeLinejoin: "stroke-linejoin"
+    },
+    
+    parsers: {},
+
+    minDefaults: {
+        circle: {
+            cx: 0,
+            cy: 0,
+            r: 0,
+            fill: "none",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        ellipse: {
+            cx: 0,
+            cy: 0,
+            rx: 0,
+            ry: 0,
+            fill: "none",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        rect: {
+            x: 0,
+            y: 0,
+            width: 0,
+            height: 0,
+            rx: 0,
+            ry: 0,
+            fill: "none",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        text: {
+            x: 0,
+            y: 0,
+            "text-anchor": "start",
+            "font-family": null,
+            "font-size": null,
+            "font-weight": null,
+            "font-style": null,
+            fill: "#000",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        path: {
+            d: "M0,0",
+            fill: "none",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        image: {
+            x: 0,
+            y: 0,
+            width: 0,
+            height: 0,
+            preserveAspectRatio: "none",
+            opacity: null
+        }
+    },
+
+    createSvgElement: function(type, attrs) {
+        var el = this.domRef.createElementNS("http:/" + "/www.w3.org/2000/svg", type),
+            key;
+        if (attrs) {
+            for (key in attrs) {
+                el.setAttribute(key, String(attrs[key]));
+            }
+        }
+        return el;
+    },
+
+    createSpriteElement: function(sprite) {
+        
+        var el = this.createSvgElement(sprite.type);
+        el.id = sprite.id;
+        if (el.style) {
+            el.style.webkitTapHighlightColor = "rgba(0,0,0,0)";
+        }
+        sprite.el = Ext.get(el);
+        this.applyZIndex(sprite); 
+        sprite.matrix = Ext.create('Ext.draw.Matrix');
+        sprite.bbox = {
+            plain: 0,
+            transform: 0
+        };
+        sprite.fireEvent("render", sprite);
+        return el;
+    },
+
+    getBBox: function (sprite, isWithoutTransform) {
+        var realPath = this["getPath" + sprite.type](sprite);
+        if (isWithoutTransform) {
+            sprite.bbox.plain = sprite.bbox.plain || Ext.draw.Draw.pathDimensions(realPath);
+            return sprite.bbox.plain;
+        }
+        sprite.bbox.transform = sprite.bbox.transform || Ext.draw.Draw.pathDimensions(Ext.draw.Draw.mapPath(realPath, sprite.matrix));
+        return sprite.bbox.transform;
+    },
+    
+    getBBoxText: function (sprite) {
+        var bbox = {},
+            bb, height, width, i, ln, el;
+
+        if (sprite && sprite.el) {
+            el = sprite.el.dom;
+            try {
+                bbox = el.getBBox();
+                return bbox;
+            } catch(e) {
+                
+            }
+            bbox = {x: bbox.x, y: Infinity, width: 0, height: 0};
+            ln = el.getNumberOfChars();
+            for (i = 0; i < ln; i++) {
+                bb = el.getExtentOfChar(i);
+                bbox.y = Math.min(bb.y, bbox.y);
+                height = bb.y + bb.height - bbox.y;
+                bbox.height = Math.max(bbox.height, height);
+                width = bb.x + bb.width - bbox.x;
+                bbox.width = Math.max(bbox.width, width);
+            }
+            return bbox;
+        }
+    },
+
+    hide: function() {
+        Ext.get(this.el).hide();
+    },
+
+    show: function() {
+        Ext.get(this.el).show();
+    },
+
+    hidePrim: function(sprite) {
+        this.addCls(sprite, Ext.baseCSSPrefix + 'hide-visibility');
+    },
+
+    showPrim: function(sprite) {
+        this.removeCls(sprite, Ext.baseCSSPrefix + 'hide-visibility');
+    },
+
+    getDefs: function() {
+        return this._defs || (this._defs = this.createSvgElement("defs"));
+    },
+
+    transform: function(sprite) {
+        var me = this,
+            matrix = Ext.create('Ext.draw.Matrix'),
+            transforms = sprite.transformations,
+            transformsLength = transforms.length,
+            i = 0,
+            transform, type;
+            
+        for (; i < transformsLength; i++) {
+            transform = transforms[i];
+            type = transform.type;
+            if (type == "translate") {
+                matrix.translate(transform.x, transform.y);
+            }
+            else if (type == "rotate") {
+                matrix.rotate(transform.degrees, transform.x, transform.y);
+            }
+            else if (type == "scale") {
+                matrix.scale(transform.x, transform.y, transform.centerX, transform.centerY);
+            }
+        }
+        sprite.matrix = matrix;
+        sprite.el.set({transform: matrix.toSvg()});
+    },
+
+    setSize: function(w, h) {
+        var me = this,
+            el = me.el;
+        
+        w = +w || me.width;
+        h = +h || me.height;
+        me.width = w;
+        me.height = h;
+
+        el.setSize(w, h);
+        el.set({
+            width: w,
+            height: h
+        });
+        me.callParent([w, h]);
+    },
+
+    
+    getRegion: function() {
+        
+        
+        var svgXY = this.el.getXY(),
+            rectXY = this.bgRect.getXY(),
+            max = Math.max,
+            x = max(svgXY[0], rectXY[0]),
+            y = max(svgXY[1], rectXY[1]);
+        return {
+            left: x,
+            top: y,
+            right: x + this.width,
+            bottom: y + this.height
+        };
+    },
+
+    onRemove: function(sprite) {
+        if (sprite.el) {
+            sprite.el.remove();
+            delete sprite.el;
+        }
+        this.callParent(arguments);
+    },
+    
+    setViewBox: function(x, y, width, height) {
+        if (isFinite(x) && isFinite(y) && isFinite(width) && isFinite(height)) {
+            this.callParent(arguments);
+            this.el.dom.setAttribute("viewBox", [x, y, width, height].join(" "));
+        }
+    },
+
+    render: function (container) {
+        var me = this;
+        if (!me.el) {
+            var width = me.width || 10,
+                height = me.height || 10,
+                el = me.createSvgElement('svg', {
+                    xmlns: "http:/" + "/www.w3.org/2000/svg",
+                    version: 1.1,
+                    width: width,
+                    height: height
+                }),
+                defs = me.getDefs(),
+
+                
+                
+                
+                
+                bgRect = me.createSvgElement("rect", {
+                    width: "100%",
+                    height: "100%",
+                    fill: "#000",
+                    stroke: "none",
+                    opacity: 0
+                }),
+                webkitRect;
+            
+                if (Ext.isSafari3) {
+                    
+                    webkitRect = me.createSvgElement("rect", {
+                        x: -10,
+                        y: -10,
+                        width: "110%",
+                        height: "110%",
+                        fill: "none",
+                        stroke: "#000"
+                    });
+                }
+            el.appendChild(defs);
+            if (Ext.isSafari3) {
+                el.appendChild(webkitRect);
+            }
+            el.appendChild(bgRect);
+            container.appendChild(el);
+            me.el = Ext.get(el);
+            me.bgRect = Ext.get(bgRect);
+            if (Ext.isSafari3) {
+                me.webkitRect = Ext.get(webkitRect);
+                me.webkitRect.hide();
+            }
+            me.el.on({
+                scope: me,
+                mouseup: me.onMouseUp,
+                mousedown: me.onMouseDown,
+                mouseover: me.onMouseOver,
+                mouseout: me.onMouseOut,
+                mousemove: me.onMouseMove,
+                mouseenter: me.onMouseEnter,
+                mouseleave: me.onMouseLeave,
+                click: me.onClick
+            });
+        }
+        me.renderAll();
+    },
+
+    
+    onMouseEnter: function(e) {
+        if (this.el.parent().getRegion().contains(e.getPoint())) {
+            this.fireEvent('mouseenter', e);
+        }
+    },
+
+    
+    onMouseLeave: function(e) {
+        if (!this.el.parent().getRegion().contains(e.getPoint())) {
+            this.fireEvent('mouseleave', e);
+        }
+    },
+    
+    processEvent: function(name, e) {
+        var target = e.getTarget(),
+            surface = this.surface,
+            sprite;
+
+        this.fireEvent(name, e);
+        
+        if (target.nodeName == "tspan" && target.parentNode) {
+            target = target.parentNode;
+        }
+        sprite = this.items.get(target.id);
+        if (sprite) {
+            sprite.fireEvent(name, sprite, e);
+        }
+    },
+
+    
+    tuneText: function (sprite, attrs) {
+        var el = sprite.el.dom,
+            tspans = [],
+            height, tspan, text, i, ln, texts, factor;
+
+        if (attrs.hasOwnProperty("text")) {
+           tspans = this.setText(sprite, attrs.text);
+        }
+        
+        if (tspans.length) {
+            height = this.getBBoxText(sprite).height;
+            for (i = 0, ln = tspans.length; i < ln; i++) {
+                
+                
+                factor = (Ext.isFF3_0 || Ext.isFF3_5) ? 2 : 4;
+                tspans[i].setAttribute("dy", i ? height * 1.2 : height / factor);
+            }
+            sprite.dirty = true;
+        }
+    },
+
+    setText: function(sprite, textString) {
+         var me = this,
+             el = sprite.el.dom,
+             x = el.getAttribute("x"),
+             tspans = [],
+             height, tspan, text, i, ln, texts;
+        
+        while (el.firstChild) {
+            el.removeChild(el.firstChild);
+        }
+        
+        texts = String(textString).split("\n");
+        for (i = 0, ln = texts.length; i < ln; i++) {
+            text = texts[i];
+            if (text) {
+                tspan = me.createSvgElement("tspan");
+                tspan.appendChild(document.createTextNode(Ext.htmlDecode(text)));
+                tspan.setAttribute("x", x);
+                el.appendChild(tspan);
+                tspans[i] = tspan;
+            }
+        }
+        return tspans;
+    },
+
+    renderAll: function() {
+        this.items.each(this.renderItem, this);
+    },
+
+    renderItem: function (sprite) {
+        if (!this.el) {
+            return;
+        }
+        if (!sprite.el) {
+            this.createSpriteElement(sprite);
+        }
+        if (sprite.zIndexDirty) {
+            this.applyZIndex(sprite);
+        }
+        if (sprite.dirty) {
+            this.applyAttrs(sprite);
+            this.applyTransformations(sprite);
+        }
+    },
+
+    redraw: function(sprite) {
+        sprite.dirty = sprite.zIndexDirty = true;
+        this.renderItem(sprite);
+    },
+
+    applyAttrs: function (sprite) {
+        var me = this,
+            el = sprite.el,
+            group = sprite.group,
+            sattr = sprite.attr,
+            parsers = me.parsers,
+            
+            
+            
+            gradientsMap = me.gradientsMap || {},
+            safariFix = Ext.isSafari && !Ext.isStrict,
+            groups, i, ln, attrs, font, key, style, name, rect;
+
+        if (group) {
+            groups = [].concat(group);
+            ln = groups.length;
+            for (i = 0; i < ln; i++) {
+                group = groups[i];
+                me.getGroup(group).add(sprite);
+            }
+            delete sprite.group;
+        }
+        attrs = me.scrubAttrs(sprite) || {};
+
+        
+            sprite.bbox.plain = 0;
+            sprite.bbox.transform = 0;
+            if (sprite.type == "circle" || sprite.type == "ellipse") {
+                attrs.cx = attrs.cx || attrs.x;
+                attrs.cy = attrs.cy || attrs.y;
+            }
+            else if (sprite.type == "rect") {
+                attrs.rx = attrs.ry = attrs.r;
+            }
+            else if (sprite.type == "path" && attrs.d) {
+                attrs.d = Ext.draw.Draw.pathToString(Ext.draw.Draw.pathToAbsolute(attrs.d));
+            }
+            sprite.dirtyPath = false;
+        
+        
+        
+        
+
+        if (attrs['clip-rect']) {
+            me.setClip(sprite, attrs);
+            delete attrs['clip-rect'];
+        }
+        if (sprite.type == 'text' && attrs.font && sprite.dirtyFont) {
+            el.set({ style: "font: " + attrs.font});
+            sprite.dirtyFont = false;
+        }
+        if (sprite.type == "image") {
+            el.dom.setAttributeNS(me.xlink, "href", attrs.src);
+        }
+        Ext.applyIf(attrs, me.minDefaults[sprite.type]);
+
+        if (sprite.dirtyHidden) {
+            (sattr.hidden) ? me.hidePrim(sprite) : me.showPrim(sprite);
+            sprite.dirtyHidden = false;
+        }
+        for (key in attrs) {
+            if (attrs.hasOwnProperty(key) && attrs[key] != null) {
+                
+                
+                
+                
+                
+                if (safariFix && ('color|stroke|fill'.indexOf(key) > -1) && (attrs[key] in gradientsMap)) {
+                    attrs[key] = gradientsMap[attrs[key]];
+                }
+                if (key in parsers) {
+                    el.dom.setAttribute(key, parsers[key](attrs[key], sprite, me));
+                } else {
+                    el.dom.setAttribute(key, attrs[key]);
+                }
+            }
+        }
+        
+        if (sprite.type == 'text') {
+            me.tuneText(sprite, attrs);
+        }
+
+        
+        style = sattr.style;
+        if (style) {
+            el.setStyle(style);
+        }
+
+        sprite.dirty = false;
+
+        if (Ext.isSafari3) {
+            
+            me.webkitRect.show();
+            setTimeout(function () {
+                me.webkitRect.hide();
+            });
+        }
+    },
+
+    setClip: function(sprite, params) {
+        var me = this,
+            rect = params["clip-rect"],
+            clipEl, clipPath;
+        if (rect) {
+            if (sprite.clip) {
+                sprite.clip.parentNode.parentNode.removeChild(sprite.clip.parentNode);
+            }
+            clipEl = me.createSvgElement('clipPath');
+            clipPath = me.createSvgElement('rect');
+            clipEl.id = Ext.id(null, 'ext-clip-');
+            clipPath.setAttribute("x", rect.x);
+            clipPath.setAttribute("y", rect.y);
+            clipPath.setAttribute("width", rect.width);
+            clipPath.setAttribute("height", rect.height);
+            clipEl.appendChild(clipPath);
+            me.getDefs().appendChild(clipEl);
+            sprite.el.dom.setAttribute("clip-path", "url(#" + clipEl.id + ")");
+            sprite.clip = clipPath;
+        }
+        
+        
+        
+        
+        
+        
+    },
+
+    
+    applyZIndex: function(sprite) {
+        var me = this,
+            items = me.items,
+            idx = items.indexOf(sprite),
+            el = sprite.el,
+            prevEl;
+        if (me.el.dom.childNodes[idx + 2] !== el.dom) { 
+            if (idx > 0) {
+                
+                do {
+                    prevEl = items.getAt(--idx).el;
+                } while (!prevEl && idx > 0);
+            }
+            el.insertAfter(prevEl || me.bgRect);
+        }
+        sprite.zIndexDirty = false;
+    },
+
+    createItem: function (config) {
+        var sprite = Ext.create('Ext.draw.Sprite', config);
+        sprite.surface = this;
+        return sprite;
+    },
+
+    addGradient: function(gradient) {
+        gradient = Ext.draw.Draw.parseGradient(gradient);
+        var me = this,
+            ln = gradient.stops.length,
+            vector = gradient.vector,
+            
+            
+            
+            usePlain = Ext.isSafari && !Ext.isStrict,
+            gradientEl, stop, stopEl, i, gradientsMap;
+            
+        gradientsMap = me.gradientsMap || {};
+        
+        if (!usePlain) {
+            if (gradient.type == "linear") {
+                gradientEl = me.createSvgElement("linearGradient");
+                gradientEl.setAttribute("x1", vector[0]);
+                gradientEl.setAttribute("y1", vector[1]);
+                gradientEl.setAttribute("x2", vector[2]);
+                gradientEl.setAttribute("y2", vector[3]);
+            }
+            else {
+                gradientEl = me.createSvgElement("radialGradient");
+                gradientEl.setAttribute("cx", gradient.centerX);
+                gradientEl.setAttribute("cy", gradient.centerY);
+                gradientEl.setAttribute("r", gradient.radius);
+                if (Ext.isNumber(gradient.focalX) && Ext.isNumber(gradient.focalY)) {
+                    gradientEl.setAttribute("fx", gradient.focalX);
+                    gradientEl.setAttribute("fy", gradient.focalY);
+                }
+            }
+            gradientEl.id = gradient.id;
+            me.getDefs().appendChild(gradientEl);
+            for (i = 0; i < ln; i++) {
+                stop = gradient.stops[i];
+                stopEl = me.createSvgElement("stop");
+                stopEl.setAttribute("offset", stop.offset + "%");
+                stopEl.setAttribute("stop-color", stop.color);
+                stopEl.setAttribute("stop-opacity",stop.opacity);
+                gradientEl.appendChild(stopEl);
+            }
+        } else {
+            gradientsMap['url(#' + gradient.id + ')'] = gradient.stops[0].color;
+        }
+        me.gradientsMap = gradientsMap;
+    },
+
+    
+    hasCls: function(sprite, className) {
+        return className && (' ' + (sprite.el.dom.getAttribute('class') || '') + ' ').indexOf(' ' + className + ' ') != -1;
+    },
+
+    addCls: function(sprite, className) {
+        var el = sprite.el,
+            i,
+            len,
+            v,
+            cls = [],
+            curCls =  el.getAttribute('class') || '';
+        
+        if (!Ext.isArray(className)) {
+            if (typeof className == 'string' && !this.hasCls(sprite, className)) {
+                el.set({ 'class': curCls + ' ' + className });
+            }
+        }
+        else {
+            for (i = 0, len = className.length; i < len; i++) {
+                v = className[i];
+                if (typeof v == 'string' && (' ' + curCls + ' ').indexOf(' ' + v + ' ') == -1) {
+                    cls.push(v);
+                }
+            }
+            if (cls.length) {
+                el.set({ 'class': ' ' + cls.join(' ') });
+            }
+        }
+    },
+
+    removeCls: function(sprite, className) {
+        var me = this,
+            el = sprite.el,
+            curCls =  el.getAttribute('class') || '',
+            i, idx, len, cls, elClasses;
+        if (!Ext.isArray(className)){
+            className = [className];
+        }
+        if (curCls) {
+            elClasses = curCls.replace(me.trimRe, ' ').split(me.spacesRe);
+            for (i = 0, len = className.length; i < len; i++) {
+                cls = className[i];
+                if (typeof cls == 'string') {
+                    cls = cls.replace(me.trimRe, '');
+                    idx = Ext.Array.indexOf(elClasses, cls);
+                    if (idx != -1) {
+                        Ext.Array.erase(elClasses, idx, 1);
+                    }
+                }
+            }
+            el.set({ 'class': elClasses.join(' ') });
+        }
+    },
+
+    destroy: function() {
+        var me = this;
+        
+        me.callParent();
+        if (me.el) {
+            me.el.remove();
+        }
+        delete me.el;
+    }
+});
+
+
+Ext.define('Ext.draw.engine.Vml', {
+
+    
+
+    extend: 'Ext.draw.Surface',
+
+    requires: ['Ext.draw.Draw', 'Ext.draw.Color', 'Ext.draw.Sprite', 'Ext.draw.Matrix', 'Ext.Element'],
+
+    
+
+    engine: 'Vml',
+
+    map: {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
+    bitesRe: /([clmz]),?([^clmz]*)/gi,
+    valRe: /-?[^,\s-]+/g,
+    fillUrlRe: /^url\(\s*['"]?([^\)]+?)['"]?\s*\)$/i,
+    pathlike: /^(path|rect)$/,
+    NonVmlPathRe: /[ahqstv]/ig, // Non-VML Pathing ops
+    partialPathRe: /[clmz]/g,
+    fontFamilyRe: /^['"]+|['"]+$/g,
+    baseVmlCls: Ext.baseCSSPrefix + 'vml-base',
+    vmlGroupCls: Ext.baseCSSPrefix + 'vml-group',
+    spriteCls: Ext.baseCSSPrefix + 'vml-sprite',
+    measureSpanCls: Ext.baseCSSPrefix + 'vml-measure-span',
+    zoom: 21600,
+    coordsize: 1000,
+    coordorigin: '0 0',
+
+    // VML uses CSS z-index and therefore doesn't need sprites to be kept in zIndex order
+    orderSpritesByZIndex: false,
+
+    
+    
+    path2vml: function (path) {
+        var me = this,
+            nonVML =  me.NonVmlPathRe,
+            map = me.map,
+            val = me.valRe,
+            zoom = me.zoom,
+            bites = me.bitesRe,
+            command = Ext.Function.bind(Ext.draw.Draw.pathToAbsolute, Ext.draw.Draw),
+            res, pa, p, r, i, ii, j, jj;
+        if (String(path).match(nonVML)) {
+            command = Ext.Function.bind(Ext.draw.Draw.path2curve, Ext.draw.Draw);
+        } else if (!String(path).match(me.partialPathRe)) {
+            res = String(path).replace(bites, function (all, command, args) {
+                var vals = [],
+                    isMove = command.toLowerCase() == "m",
+                    res = map[command];
+                args.replace(val, function (value) {
+                    if (isMove && vals[length] == 2) {
+                        res += vals + map[command == "m" ? "l" : "L"];
+                        vals = [];
+                    }
+                    vals.push(Math.round(value * zoom));
+                });
+                return res + vals;
+            });
+            return res;
+        }
+        pa = command(path);
+        res = [];
+        for (i = 0, ii = pa.length; i < ii; i++) {
+            p = pa[i];
+            r = pa[i][0].toLowerCase();
+            if (r == "z") {
+                r = "x";
+            }
+            for (j = 1, jj = p.length; j < jj; j++) {
+                r += Math.round(p[j] * me.zoom) + (j != jj - 1 ? "," : "");
+            }
+            res.push(r);
+        }
+        return res.join(" ");
+    },
+
+    
+    translateAttrs: {
+        radius: "r",
+        radiusX: "rx",
+        radiusY: "ry",
+        lineWidth: "stroke-width",
+        fillOpacity: "fill-opacity",
+        strokeOpacity: "stroke-opacity",
+        strokeLinejoin: "stroke-linejoin"
+    },
+
+    
+    minDefaults: {
+        circle: {
+            fill: "none",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        ellipse: {
+            cx: 0,
+            cy: 0,
+            rx: 0,
+            ry: 0,
+            fill: "none",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        rect: {
+            x: 0,
+            y: 0,
+            width: 0,
+            height: 0,
+            rx: 0,
+            ry: 0,
+            fill: "none",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        text: {
+            x: 0,
+            y: 0,
+            "text-anchor": "start",
+            font: '10px "Arial"',
+            fill: "#000",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        path: {
+            d: "M0,0",
+            fill: "none",
+            stroke: null,
+            "stroke-width": null,
+            opacity: null,
+            "fill-opacity": null,
+            "stroke-opacity": null
+        },
+        image: {
+            x: 0,
+            y: 0,
+            width: 0,
+            height: 0,
+            preserveAspectRatio: "none",
+            opacity: null
+        }
+    },
+
+    
+    onMouseEnter: function(e) {
+        this.fireEvent("mouseenter", e);
+    },
+
+    
+    onMouseLeave: function(e) {
+        this.fireEvent("mouseleave", e);
+    },
+
+    
+    processEvent: function(name, e) {
+        var target = e.getTarget(),
+            surface = this.surface,
+            sprite;
+        this.fireEvent(name, e);
+        sprite = this.items.get(target.id);
+        if (sprite) {
+            sprite.fireEvent(name, sprite, e);
+        }
+    },
+
+    
+    createSpriteElement: function(sprite) {
+        var me = this,
+            attr = sprite.attr,
+            type = sprite.type,
+            zoom = me.zoom,
+            vml = sprite.vml || (sprite.vml = {}),
+            round = Math.round,
+            el = me.createNode('shape'),
+            path, skew, textPath;
+
+        el.coordsize = zoom + ' ' + zoom;
+        el.coordorigin = attr.coordorigin || "0 0";
+        Ext.get(el).addCls(me.spriteCls);
+        if (type == "text") {
+            vml.path = path = me.createNode("path");
+            path.textpathok = true;
+            vml.textpath = textPath = me.createNode("textpath");
+            textPath.on = true;
+            el.appendChild(textPath);
+            el.appendChild(path);
+        }
+        el.id = sprite.id;
+        sprite.el = Ext.get(el);
+        me.el.appendChild(el);
+        if (type !== 'image') {
+            skew = me.createNode("skew");
+            skew.on = true;
+            el.appendChild(skew);
+            sprite.skew = skew;
+        }
+        sprite.matrix = Ext.create('Ext.draw.Matrix');
+        sprite.bbox = {
+            plain: null,
+            transform: null
+        };
+        sprite.fireEvent("render", sprite);
+        return sprite.el;
+    },
+
+    
+    getBBox: function (sprite, isWithoutTransform) {
+        var realPath = this["getPath" + sprite.type](sprite);
+        if (isWithoutTransform) {
+            sprite.bbox.plain = sprite.bbox.plain || Ext.draw.Draw.pathDimensions(realPath);
+            return sprite.bbox.plain;
+        }
+        sprite.bbox.transform = sprite.bbox.transform || Ext.draw.Draw.pathDimensions(Ext.draw.Draw.mapPath(realPath, sprite.matrix));
+        return sprite.bbox.transform;
+    },
+
+    getBBoxText: function (sprite) {
+        var vml = sprite.vml;
+        return {
+            x: vml.X + (vml.bbx || 0) - vml.W / 2,
+            y: vml.Y - vml.H / 2,
+            width: vml.W,
+            height: vml.H
+        };
+    },
+
+    applyAttrs: function (sprite) {
+        var me = this,
+            vml = sprite.vml,
+            group = sprite.group,
+            spriteAttr = sprite.attr,
+            el = sprite.el,
+            dom = el.dom,
+            style, name, groups, i, ln, scrubbedAttrs, font, key, bbox;
+
+        if (group) {
+            groups = [].concat(group);
+            ln = groups.length;
+            for (i = 0; i < ln; i++) {
+                group = groups[i];
+                me.getGroup(group).add(sprite);
+            }
+            delete sprite.group;
+        }
+        scrubbedAttrs = me.scrubAttrs(sprite) || {};
+
+        if (sprite.zIndexDirty) {
+            me.setZIndex(sprite);
+        }
+
+        
+        Ext.applyIf(scrubbedAttrs, me.minDefaults[sprite.type]);
+
+        if (dom.href) {
+            dom.href = scrubbedAttrs.href;
+        }
+        if (dom.title) {
+            dom.title = scrubbedAttrs.title;
+        }
+        if (dom.target) {
+            dom.target = scrubbedAttrs.target;
+        }
+        if (dom.cursor) {
+            dom.cursor = scrubbedAttrs.cursor;
+        }
+
+        
+        if (sprite.dirtyHidden) {
+            (scrubbedAttrs.hidden) ? me.hidePrim(sprite) : me.showPrim(sprite);
+            sprite.dirtyHidden = false;
+        }
+
+        
+        if (sprite.dirtyPath) {
+            if (sprite.type == "circle" || sprite.type == "ellipse") {
+                var cx = scrubbedAttrs.x,
+                    cy = scrubbedAttrs.y,
+                    rx = scrubbedAttrs.rx || scrubbedAttrs.r || 0,
+                    ry = scrubbedAttrs.ry || scrubbedAttrs.r || 0;
+                dom.path = Ext.String.format("ar{0},{1},{2},{3},{4},{1},{4},{1}",
+                            Math.round((cx - rx) * me.zoom),
+                            Math.round((cy - ry) * me.zoom),
+                            Math.round((cx + rx) * me.zoom),
+                            Math.round((cy + ry) * me.zoom),
+                            Math.round(cx * me.zoom));
+                sprite.dirtyPath = false;
+            }
+            else if (sprite.type !== "text") {
+                sprite.attr.path = scrubbedAttrs.path = me.setPaths(sprite, scrubbedAttrs) || scrubbedAttrs.path;
+                dom.path = me.path2vml(scrubbedAttrs.path);
+                sprite.dirtyPath = false;
+            }
+        }
+
+        
+        if ("clip-rect" in scrubbedAttrs) {
+            me.setClip(sprite, scrubbedAttrs);
+        }
+
+        
+        if (sprite.type == "text") {
+            me.setTextAttributes(sprite, scrubbedAttrs);
+        }
+
+        
+        if (sprite.type == 'image' || scrubbedAttrs.opacity  || scrubbedAttrs['fill-opacity'] || scrubbedAttrs.fill) {
+            me.setFill(sprite, scrubbedAttrs);
+        }
+
+        
+        if (scrubbedAttrs.stroke || scrubbedAttrs['stroke-opacity'] || scrubbedAttrs.fill) {
+            me.setStroke(sprite, scrubbedAttrs);
+        }
+        
+        
+        style = spriteAttr.style;
+        if (style) {
+            el.setStyle(style);
+        }
+
+        sprite.dirty = false;
+    },
+
+    setZIndex: function(sprite) {
+        if (sprite.el) {
+            if (sprite.attr.zIndex != undefined) {
+                sprite.el.setStyle('zIndex', sprite.attr.zIndex);
+            }
+            sprite.zIndexDirty = false;
+        }
+    },
+
+    
+    setPaths: function(sprite, params) {
+        var spriteAttr = sprite.attr;
+        
+        sprite.bbox.plain = null;
+        sprite.bbox.transform = null;
+        if (sprite.type == 'circle') {
+            spriteAttr.rx = spriteAttr.ry = params.r;
+            return Ext.draw.Draw.ellipsePath(sprite);
+        }
+        else if (sprite.type == 'ellipse') {
+            spriteAttr.rx = params.rx;
+            spriteAttr.ry = params.ry;
+            return Ext.draw.Draw.ellipsePath(sprite);
+        }
+        else if (sprite.type == 'rect' || sprite.type == 'image') {
+            spriteAttr.rx = spriteAttr.ry = params.r;
+            return Ext.draw.Draw.rectPath(sprite);
+        }
+        else if (sprite.type == 'path' && spriteAttr.path) {
+            return Ext.draw.Draw.pathToAbsolute(spriteAttr.path);
+        }
+        return false;
+    },
+
+    setFill: function(sprite, params) {
+        var me = this,
+            el = sprite.el,
+            dom = el.dom,
+            fillEl = dom.getElementsByTagName('fill')[0],
+            opacity, gradient, fillUrl, rotation, angle;
+
+        if (fillEl) {
+            dom.removeChild(fillEl);
+        } else {
+            fillEl = me.createNode('fill');
+        }
+        if (Ext.isArray(params.fill)) {
+            params.fill = params.fill[0];
+        }
+        if (sprite.type == 'image') {
+            fillEl.on = true;
+            fillEl.src = params.src;
+            fillEl.type = "tile";
+            fillEl.rotate = true;
+        } else if (params.fill == "none") {
+            fillEl.on = false;
+        } else {
+            if (typeof params.opacity == "number") {
+                fillEl.opacity = params.opacity;
+            }
+            if (typeof params["fill-opacity"] == "number") {
+                fillEl.opacity = params["fill-opacity"];
+            }
+            fillEl.on = true;
+            if (typeof params.fill == "string") {
+                fillUrl = params.fill.match(me.fillUrlRe);
+                if (fillUrl) {
+                    fillUrl = fillUrl[1];
+                    
+                    if (fillUrl.charAt(0) == "#") {
+                        gradient = me.gradientsColl.getByKey(fillUrl.substring(1));
+                    }
+                    if (gradient) {
+                        
+                        rotation = params.rotation;
+                        angle = -(gradient.angle + 270 + (rotation ? rotation.degrees : 0)) % 360;
+                        
+                        if (angle === 0) {
+                            angle = 180;
+                        }
+                        fillEl.angle = angle;
+                        fillEl.type = "gradient";
+                        fillEl.method = "sigma";
+                        fillEl.colors = gradient.colors;
+                    }
+                    
+                    else {
+                        fillEl.src = fillUrl;
+                        fillEl.type = "tile";
+                        fillEl.rotate = true;
+                    }
+                }
+                else {
+                    fillEl.color = Ext.draw.Color.toHex(params.fill) || params.fill;
+                    fillEl.src = "";
+                    fillEl.type = "solid";
+                }
+            }
+        }
+        dom.appendChild(fillEl);
+    },
+
+    setStroke: function(sprite, params) {
+        var me = this,
+            el = sprite.el.dom,
+            strokeEl = sprite.strokeEl,
+            newStroke = false,
+            width, opacity;
+
+        if (!strokeEl) {
+            strokeEl = sprite.strokeEl = me.createNode("stroke");
+            newStroke = true;
+        }
+        if (Ext.isArray(params.stroke)) {
+            params.stroke = params.stroke[0];
+        }
+        if (!params.stroke || params.stroke == "none" || params.stroke == 0 || params["stroke-width"] == 0) {
+            strokeEl.on = false;
+        }
+        else {
+            strokeEl.on = true;
+            if (params.stroke && !params.stroke.match(me.fillUrlRe)) {
+                
+                strokeEl.color = Ext.draw.Color.toHex(params.stroke);
+            }
+            strokeEl.joinstyle = params["stroke-linejoin"];
+            strokeEl.endcap = params["stroke-linecap"] || "round";
+            strokeEl.miterlimit = params["stroke-miterlimit"] || 8;
+            width = parseFloat(params["stroke-width"] || 1) * 0.75;
+            opacity = params["stroke-opacity"] || 1;
+            
+            if (Ext.isNumber(width) && width < 1) {
+                strokeEl.weight = 1;
+                strokeEl.opacity = opacity * width;
+            }
+            else {
+                strokeEl.weight = width;
+                strokeEl.opacity = opacity;
+            }
+        }
+        if (newStroke) {
+            el.appendChild(strokeEl);
+        }
+    },
+
+    setClip: function(sprite, params) {
+        var me = this,
+            el = sprite.el,
+            clipEl = sprite.clipEl,
+            rect = String(params["clip-rect"]).split(me.separatorRe);
+        if (!clipEl) {
+            clipEl = sprite.clipEl = me.el.insertFirst(Ext.getDoc().dom.createElement("div"));
+            clipEl.addCls(Ext.baseCSSPrefix + 'vml-sprite');
+        }
+        if (rect.length == 4) {
+            rect[2] = +rect[2] + (+rect[0]);
+            rect[3] = +rect[3] + (+rect[1]);
+            clipEl.setStyle("clip", Ext.String.format("rect({1}px {2}px {3}px {0}px)", rect[0], rect[1], rect[2], rect[3]));
+            clipEl.setSize(me.el.width, me.el.height);
+        }
+        else {
+            clipEl.setStyle("clip", "");
+        }
+    },
+
+    setTextAttributes: function(sprite, params) {
+        var me = this,
+            vml = sprite.vml,
+            textStyle = vml.textpath.style,
+            spanCacheStyle = me.span.style,
+            zoom = me.zoom,
+            round = Math.round,
+            fontObj = {
+                fontSize: "font-size",
+                fontWeight: "font-weight",
+                fontStyle: "font-style"
+            },
+            fontProp,
+            paramProp;
+        if (sprite.dirtyFont) {
+            if (params.font) {
+                textStyle.font = spanCacheStyle.font = params.font;
+            }
+            if (params["font-family"]) {
+                textStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(me.fontFamilyRe, "") + '"';
+                spanCacheStyle.fontFamily = params["font-family"];
+            }
+
+            for (fontProp in fontObj) {
+                paramProp = params[fontObj[fontProp]];
+                if (paramProp) {
+                    textStyle[fontProp] = spanCacheStyle[fontProp] = paramProp;
+                }
+            }
+
+            me.setText(sprite, params.text);
+            
+            if (vml.textpath.string) {
+                me.span.innerHTML = String(vml.textpath.string).replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>");
+            }
+            vml.W = me.span.offsetWidth;
+            vml.H = me.span.offsetHeight + 2; 
+
+            
+            if (params["text-anchor"] == "middle") {
+                textStyle["v-text-align"] = "center";
+            }
+            else if (params["text-anchor"] == "end") {
+                textStyle["v-text-align"] = "right";
+                vml.bbx = -Math.round(vml.W / 2);
+            }
+            else {
+                textStyle["v-text-align"] = "left";
+                vml.bbx = Math.round(vml.W / 2);
+            }
+        }
+        vml.X = params.x;
+        vml.Y = params.y;
+        vml.path.v = Ext.String.format("m{0},{1}l{2},{1}", Math.round(vml.X * zoom), Math.round(vml.Y * zoom), Math.round(vml.X * zoom) + 1);
+        
+        sprite.bbox.plain = null;
+        sprite.bbox.transform = null;
+        sprite.dirtyFont = false;
+    },
+    
+    setText: function(sprite, text) {
+        sprite.vml.textpath.string = Ext.htmlDecode(text);
+    },
+
+    hide: function() {
+        this.el.hide();
+    },
+
+    show: function() {
+        this.el.show();
+    },
+
+    hidePrim: function(sprite) {
+        sprite.el.addCls(Ext.baseCSSPrefix + 'hide-visibility');
+    },
+
+    showPrim: function(sprite) {
+        sprite.el.removeCls(Ext.baseCSSPrefix + 'hide-visibility');
+    },
+
+    setSize: function(width, height) {
+        var me = this;
+        width = width || me.width;
+        height = height || me.height;
+        me.width = width;
+        me.height = height;
+
+        if (me.el) {
+            
+            if (width != undefined) {
+                me.el.setWidth(width);
+            }
+            if (height != undefined) {
+                me.el.setHeight(height);
+            }
+
+            
+            me.applyViewBox();
+
+            me.callParent(arguments);
+        }
+    },
+
+    setViewBox: function(x, y, width, height) {
+        this.callParent(arguments);
+        this.viewBox = {
+            x: x,
+            y: y,
+            width: width,
+            height: height
+        };
+        this.applyViewBox();
+    },
+
+    
+    applyViewBox: function() {
+        var me = this,
+            viewBox = me.viewBox,
+            width = me.width,
+            height = me.height,
+            viewBoxX, viewBoxY, viewBoxWidth, viewBoxHeight,
+            relativeHeight, relativeWidth, size;
+
+        if (viewBox && (width || height)) {
+            viewBoxX = viewBox.x;
+            viewBoxY = viewBox.y;
+            viewBoxWidth = viewBox.width;
+            viewBoxHeight = viewBox.height;
+            relativeHeight = height / viewBoxHeight;
+            relativeWidth = width / viewBoxWidth;
+
+            if (viewBoxWidth * relativeHeight < width) {
+                viewBoxX -= (width - viewBoxWidth * relativeHeight) / 2 / relativeHeight;
+            }
+            if (viewBoxHeight * relativeWidth < height) {
+                viewBoxY -= (height - viewBoxHeight * relativeWidth) / 2 / relativeWidth;
+            }
+
+            size = 1 / Math.max(viewBoxWidth / width, viewBoxHeight / height);
+
+            me.viewBoxShift = {
+                dx: -viewBoxX,
+                dy: -viewBoxY,
+                scale: size
+            };
+            me.items.each(function(item) {
+                me.transform(item);
+            });
+        }
+    },
+
+    onAdd: function(item) {
+        this.callParent(arguments);
+        if (this.el) {
+            this.renderItem(item);
+        }
+    },
+
+    onRemove: function(sprite) {
+        if (sprite.el) {
+            sprite.el.remove();
+            delete sprite.el;
+        }
+        this.callParent(arguments);
+    },
+
+    
+    createNode : (function () {
+        try {
+            var doc = Ext.getDoc().dom;
+            if (!doc.namespaces.rvml) {
+                doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml");
+            }
+            return function (tagName) {
+                return doc.createElement("<rvml:" + tagName + ' class="rvml">');
+            };
+        } catch (e) {
+            return function (tagName) {
+                return doc.createElement("<" + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');
+            };
+        }
+    })(),
+
+    render: function (container) {
+        var me = this,
+            doc = Ext.getDoc().dom;
+
+        if (!me.el) {
+            var el = doc.createElement("div");
+            me.el = Ext.get(el);
+            me.el.addCls(me.baseVmlCls);
+
+            
+            me.span = doc.createElement("span");
+            Ext.get(me.span).addCls(me.measureSpanCls);
+            el.appendChild(me.span);
+            me.el.setSize(me.width || 10, me.height || 10);
+            container.appendChild(el);
+            me.el.on({
+                scope: me,
+                mouseup: me.onMouseUp,
+                mousedown: me.onMouseDown,
+                mouseover: me.onMouseOver,
+                mouseout: me.onMouseOut,
+                mousemove: me.onMouseMove,
+                mouseenter: me.onMouseEnter,
+                mouseleave: me.onMouseLeave,
+                click: me.onClick
+            });
+        }
+        me.renderAll();
+    },
+
+    renderAll: function() {
+        this.items.each(this.renderItem, this);
+    },
+
+    redraw: function(sprite) {
+        sprite.dirty = true;
+        this.renderItem(sprite);
+    },
+
+    renderItem: function (sprite) {
+        
+        if (!this.el) {
+            return;
+        }
+
+        
+        if (!sprite.el) {
+            this.createSpriteElement(sprite);
+        }
+
+        if (sprite.dirty) {
+            this.applyAttrs(sprite);
+            if (sprite.dirtyTransform) {
+                this.applyTransformations(sprite);
+            }
+        }
+    },
+
+    rotationCompensation: function (deg, dx, dy) {
+        var matrix = Ext.create('Ext.draw.Matrix');
+        matrix.rotate(-deg, 0.5, 0.5);
+        return {
+            x: matrix.x(dx, dy),
+            y: matrix.y(dx, dy)
+        };
+    },
+
+    extractTransform: function (sprite) {
+        var me = this,
+            matrix = Ext.create('Ext.draw.Matrix'), scale,
+            transformstions, tranformationsLength,
+            transform, i = 0,
+            shift = me.viewBoxShift;
+
+        for(transformstions = sprite.transformations, tranformationsLength = transformstions.length;
+            i < tranformationsLength; i ++) {
+            transform = transformstions[i];
+            switch (transform.type) {
+                case 'translate' :
+                    matrix.translate(transform.x, transform.y);
+                    break;
+                case 'rotate':
+                    matrix.rotate(transform.degrees, transform.x, transform.y);
+                    break;
+                case 'scale':
+                    matrix.scale(transform.x || transform.scale, transform.y || transform.scale, transform.centerX, transform.centerY);
+                    break;
+            }
+        }
+
+        if (shift) {
+            matrix.add(1, 0, 0, 1, shift.dx, shift.dy);
+            matrix.prepend(shift.scale, 0, 0, shift.scale, 0, 0);
+        }
+        
+        return sprite.matrix = matrix;
+    },
+
+    setSimpleCoords: function(sprite, sx, sy, dx, dy, rotate) {
+        var me = this,
+            matrix = sprite.matrix,
+            dom = sprite.el.dom,
+            style = dom.style,
+            yFlipper = 1,
+            flip = "",
+            fill = dom.getElementsByTagName('fill')[0],
+            kx = me.zoom / sx,
+            ky = me.zoom / sy,
+            rotationCompensation;
+        if (!sx || !sy) {
+            return;
+        }
+        dom.coordsize = Math.abs(kx) + ' ' + Math.abs(ky);
+        style.rotation = rotate * (sx * sy < 0 ? -1 : 1);
+        if (rotate) {
+            rotationCompensation = me.rotationCompensation(rotate, dx, dy);
+            dx = rotationCompensation.x;
+            dy = rotationCompensation.y;
+        }
+        if (sx < 0) {
+            flip += "x"
+        }
+        if (sy < 0) {
+            flip += " y";
+            yFlipper = -1;
+        }
+        style.flip = flip;
+        dom.coordorigin = (dx * -kx) + ' ' + (dy * -ky);
+        if (fill) {
+            dom.removeChild(fill);
+            rotationCompensation = me.rotationCompensation(rotate, matrix.x(sprite.x, sprite.y), matrix.y(sprite.x, sprite.y));
+            fill.position = rotationCompensation.x * yFlipper + ' ' + rotationCompensation.y * yFlipper;
+            fill.size = sprite.width * Math.abs(sx) + ' ' + sprite.height * Math.abs(sy);
+            dom.appendChild(fill);
+        }
+    },
+
+    transform : function (sprite) {
+        var me = this,
+            el = sprite.el,
+            skew = sprite.skew,
+            dom = el.dom,
+            domStyle = dom.style,
+            matrix = me.extractTransform(sprite).clone(),
+            split, zoom = me.zoom,
+            fill = dom.getElementsByTagName('fill')[0],
+            isPatt = !String(sprite.fill).indexOf("url("),
+            offset, c;
+
+
+        
+
+        if (sprite.type != "image" && skew && !isPatt) {
+            
+            skew.matrix = matrix.toString();
+            
+            
+            
+            offset = matrix.offset();
+            if (offset[0] > 32767) {
+                offset[0] = 32767;
+            } else if (offset[0] < -32768) {
+                offset[0] = -32768
+            }
+            if (offset[1] > 32767) {
+                offset[1] = 32767;
+            } else if (offset[1] < -32768) {
+                offset[1] = -32768
+            }
+            skew.offset = offset;
+        } else {
+            if (skew) {
+                skew.matrix = "1 0 0 1";
+                skew.offset = "0 0";
+            }
+            split = matrix.split();
+            if (split.isSimple) {
+                domStyle.filter = '';
+                me.setSimpleCoords(sprite, split.scaleX, split.scaleY, split.translateX, split.translateY, split.rotate / Math.PI * 180);
+            } else {
+                domStyle.filter = matrix.toFilter();
+                var bb = me.getBBox(sprite),
+                    dx = bb.x - sprite.x,
+                    dy = bb.y - sprite.y;
+                dom.coordorigin = (dx * -zoom) + ' ' + (dy * -zoom);
+                if (fill) {
+                    dom.removeChild(fill);
+                    fill.position = dx + ' ' + dy;
+                    fill.size = sprite.width * sprite.scale.x + ' ' + sprite.height * 1.1;
+                    dom.appendChild(fill);
+                }
+            }
+        }
+    },
+
+    createItem: function (config) {
+        return Ext.create('Ext.draw.Sprite', config);
+    },
+
+    getRegion: function() {
+        return this.el.getRegion();
+    },
+
+    addCls: function(sprite, className) {
+        if (sprite && sprite.el) {
+            sprite.el.addCls(className);
+        }
+    },
+
+    removeCls: function(sprite, className) {
+        if (sprite && sprite.el) {
+            sprite.el.removeCls(className);
+        }
+    },
+
+    
+    addGradient: function(gradient) {
+        var gradients = this.gradientsColl || (this.gradientsColl = Ext.create('Ext.util.MixedCollection')),
+            colors = [],
+            stops = Ext.create('Ext.util.MixedCollection');
+
+        
+        stops.addAll(gradient.stops);
+        stops.sortByKey("ASC", function(a, b) {
+            a = parseInt(a, 10);
+            b = parseInt(b, 10);
+            return a > b ? 1 : (a < b ? -1 : 0);
+        });
+        stops.eachKey(function(k, v) {
+            colors.push(k + "% " + v.color);
+        });
+
+        gradients.add(gradient.id, {
+            colors: colors.join(","),
+            angle: gradient.angle
+        });
+    },
+
+    destroy: function() {
+        var me = this;
+        
+        me.callParent(arguments);
+        if (me.el) {
+            me.el.remove();
+        }
+        delete me.el;
+    }
+});
+
+
+Ext.define('Ext.fx.target.ElementCSS', {
+
+    
+
+    extend: 'Ext.fx.target.Element',
+
+    
+
+    setAttr: function(targetData, isFirstFrame) {
+        var cssArr = {
+                attrs: [],
+                duration: [],
+                easing: []
+            },
+            ln = targetData.length,
+            attributes,
+            attrs,
+            attr,
+            easing,
+            duration,
+            o,
+            i,
+            j,
+            ln2;
+        for (i = 0; i < ln; i++) {
+            attrs = targetData[i];
+            duration = attrs.duration;
+            easing = attrs.easing;
+            attrs = attrs.attrs;
+            for (attr in attrs) {
+                if (Ext.Array.indexOf(cssArr.attrs, attr) == -1) {
+                    cssArr.attrs.push(attr.replace(/[A-Z]/g, function(v) {
+                        return '-' + v.toLowerCase();
+                    }));
+                    cssArr.duration.push(duration + 'ms');
+                    cssArr.easing.push(easing);
+                }
+            }
+        }
+        attributes = cssArr.attrs.join(',');
+        duration = cssArr.duration.join(',');
+        easing = cssArr.easing.join(', ');
+        for (i = 0; i < ln; i++) {
+            attrs = targetData[i].attrs;
+            for (attr in attrs) {
+                ln2 = attrs[attr].length;
+                for (j = 0; j < ln2; j++) {
+                    o = attrs[attr][j];
+                    o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionProperty', isFirstFrame ? '' : attributes);
+                    o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionDuration', isFirstFrame ? '' : duration);
+                    o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionTimingFunction', isFirstFrame ? '' : easing);
+                    o[0].setStyle(attr, o[1]);
+
+                    
+                    if (isFirstFrame) {
+                        o = o[0].dom.offsetWidth;
+                    }
+                    else {
+                        
+                        o[0].on(Ext.supports.CSS3TransitionEnd, function() {
+                            this.setStyle(Ext.supports.CSS3Prefix + 'TransitionProperty', null);
+                            this.setStyle(Ext.supports.CSS3Prefix + 'TransitionDuration', null);
+                            this.setStyle(Ext.supports.CSS3Prefix + 'TransitionTimingFunction', null);
+                        }, o[0], { single: true });
+                    }
+                }
+            }
+        }
+    }
+});
+
+Ext.define('Ext.fx.target.CompositeElementCSS', {
+
+    
+
+    extend: 'Ext.fx.target.CompositeElement',
+
+    requires: ['Ext.fx.target.ElementCSS'],
+
+    
+    setAttr: function() {
+        return Ext.fx.target.ElementCSS.prototype.setAttr.apply(this, arguments);
+    }
+});
+
+Ext.define('Ext.layout.container.AbstractFit', {
+
+    
+
+    extend: 'Ext.layout.container.Container',
+
+    
+
+    itemCls: Ext.baseCSSPrefix + 'fit-item',
+    targetCls: Ext.baseCSSPrefix + 'layout-fit',
+    type: 'fit'
+});
+
+Ext.define('Ext.layout.container.Fit', {
+
+    
+
+    extend: 'Ext.layout.container.AbstractFit',
+    alias: 'layout.fit',
+    alternateClassName: 'Ext.layout.FitLayout',
+    requires: ['Ext.layout.container.Box'],
+
+    
+
+    
+    defaultMargins: {
+        top: 0,
+        right: 0,
+        bottom: 0,
+        left: 0
+    },
+
+    
+    onLayout : function() {
+        var me = this,
+            size,
+            item,
+            margins;
+        me.callParent();
+
+        if (me.owner.items.length) {
+            item = me.owner.items.get(0);
+            margins = item.margins || me.defaultMargins;
+            size = me.getLayoutTargetSize();
+            size.width  -= margins.width;
+            size.height -= margins.height;
+            me.setItemBox(item, size);
+
+            
+            
+            if (margins.left || margins.top) {
+                item.setPosition(margins.left, margins.top);
+            }
+        }
+    },
+
+    getTargetBox : function() {
+        return this.getLayoutTargetSize();
+    },
+
+    setItemBox : function(item, box) {
+        var me = this;
+        if (item && box.height > 0) {
+            if (!me.owner.isFixedWidth()) {
+               box.width = undefined;
+            }
+            if (!me.owner.isFixedHeight()) {
+               box.height = undefined;
+            }
+            me.setItemSize(item, box.width, box.height);
+        }
+    },
+
+    configureItem: function(item) {
+
+        
+        
+        item.layoutManagedHeight = 0;
+        item.layoutManagedWidth = 0;
+
+        this.callParent(arguments);
+    }
+}, function() {
+    
+    
+    this.prototype.renderItem = Ext.layout.container.Box.prototype.renderItem;
+});
+
+Ext.define('Ext.layout.container.AbstractCard', {
+
+    
+
+    extend: 'Ext.layout.container.Fit',
+
+    
+
+    type: 'card',
+
+    sizeAllCards: false,
+
+    hideInactive: true,
+
+    
+    deferredRender : false,
+
+    beforeLayout: function() {
+        var me = this;
+        me.getActiveItem();
+        if (me.activeItem && me.deferredRender) {
+            me.renderItems([me.activeItem], me.getRenderTarget());
+            return true;
+        }
+        else {
+            return this.callParent(arguments);
+        }
+    },
+
+    renderChildren: function () {
+        if (!this.deferredRender) {
+            this.getActiveItem();
+            this.callParent();
+        }
+    },
+
+    onLayout: function() {
+        var me = this,
+            activeItem = me.activeItem,
+            items = me.getVisibleItems(),
+            ln = items.length,
+            targetBox = me.getTargetBox(),
+            i, item;
+
+        for (i = 0; i < ln; i++) {
+            item = items[i];
+            me.setItemBox(item, targetBox);
+        }
+
+        if (!me.firstActivated && activeItem) {
+            if (activeItem.fireEvent('beforeactivate', activeItem) !== false) {
+                activeItem.fireEvent('activate', activeItem);
+            }
+            me.firstActivated = true;
+        }
+    },
+
+    isValidParent : function(item, target, position) {
+        
+        
+        var itemEl = item.el ? item.el.dom : Ext.getDom(item);
+        return (itemEl && itemEl.parentNode === (target.dom || target)) || false;
+    },
+
+    
+    getActiveItem: function() {
+        var me = this;
+        if (!me.activeItem && me.owner) {
+            me.activeItem = me.parseActiveItem(me.owner.activeItem);
+        }
+
+        if (me.activeItem && me.owner.items.indexOf(me.activeItem) != -1) {
+            return me.activeItem;
+        }
+
+        return null;
+    },
+
+    
+    parseActiveItem: function(item) {
+        if (item && item.isComponent) {
+            return item;
+        }
+        else if (typeof item == 'number' || item === undefined) {
+            return this.getLayoutItems()[item || 0];
+        }
+        else {
+            return this.owner.getComponent(item);
+        }
+    },
+
+    
+    configureItem: function(item, position) {
+        this.callParent([item, position]);
+        if (this.hideInactive && this.activeItem !== item) {
+            item.hide();
+        }
+        else {
+            item.show();
+        }
+    },
+
+    onRemove: function(component) {
+        if (component === this.activeItem) {
+            this.activeItem = null;
+            if (this.owner.items.getCount() === 0) {
+                this.firstActivated = false;
+            }
+        }
+    },
+
+    
+    getAnimation: function(newCard, owner) {
+        var newAnim = (newCard || {}).cardSwitchAnimation;
+        if (newAnim === false) {
+            return false;
+        }
+        return newAnim || owner.cardSwitchAnimation;
+    },
+
+    
+    getNext: function() {
+        
+        
+        var wrap = arguments[0];
+        var items = this.getLayoutItems(),
+            index = Ext.Array.indexOf(items, this.activeItem);
+        return items[index + 1] || (wrap ? items[0] : false);
+    },
+
+    
+    next: function() {
+        
+        
+        var anim = arguments[0], wrap = arguments[1];
+        return this.setActiveItem(this.getNext(wrap), anim);
+    },
+
+    
+    getPrev: function() {
+        
+        
+        var wrap = arguments[0];
+        var items = this.getLayoutItems(),
+            index = Ext.Array.indexOf(items, this.activeItem);
+        return items[index - 1] || (wrap ? items[items.length - 1] : false);
+    },
+
+    
+    prev: function() {
+        
+        
+        var anim = arguments[0], wrap = arguments[1];
+        return this.setActiveItem(this.getPrev(wrap), anim);
+    }
+});
+
+
+Ext.define('Ext.selection.Model', {
+    extend: 'Ext.util.Observable',
+    alternateClassName: 'Ext.AbstractSelectionModel',
+    requires: ['Ext.data.StoreManager'],
+    
+
+    
+
+    
+    allowDeselect: false,
+
+    
+    selected: null,
+
+    
+    pruneRemoved: true,
+
+    constructor: function(cfg) {
+        var me = this;
+
+        cfg = cfg || {};
+        Ext.apply(me, cfg);
+
+        me.addEvents(
+            
+            'selectionchange'
+        );
+
+        me.modes = {
+            SINGLE: true,
+            SIMPLE: true,
+            MULTI: true
+        };
+
+        
+        me.setSelectionMode(cfg.mode || me.mode);
+
+        
+        me.selected = Ext.create('Ext.util.MixedCollection');
+
+        me.callParent(arguments);
+    },
+
+    
+    bind : function(store, initial){
+        var me = this;
+
+        if(!initial && me.store){
+            if(store !== me.store && me.store.autoDestroy){
+                me.store.destroyStore();
+            }else{
+                me.store.un("add", me.onStoreAdd, me);
+                me.store.un("clear", me.onStoreClear, me);
+                me.store.un("remove", me.onStoreRemove, me);
+                me.store.un("update", me.onStoreUpdate, me);
+            }
+        }
+        if(store){
+            store = Ext.data.StoreManager.lookup(store);
+            store.on({
+                add: me.onStoreAdd,
+                clear: me.onStoreClear,
+                remove: me.onStoreRemove,
+                update: me.onStoreUpdate,
+                scope: me
+            });
+        }
+        me.store = store;
+        if(store && !initial) {
+            me.refresh();
+        }
+    },
+
+    
+    selectAll: function(suppressEvent) {
+        var me = this,
+            selections = me.store.getRange(),
+            i = 0,
+            len = selections.length,
+            start = me.getSelection().length;
+
+        me.bulkChange = true;
+        for (; i < len; i++) {
+            me.doSelect(selections[i], true, suppressEvent);
+        }
+        delete me.bulkChange;
+        
+        me.maybeFireSelectionChange(me.getSelection().length !== start);
+    },
+
+    
+    deselectAll: function(suppressEvent) {
+        var me = this,
+            selections = me.getSelection(),
+            i = 0,
+            len = selections.length,
+            start = me.getSelection().length;
+
+        me.bulkChange = true;
+        for (; i < len; i++) {
+            me.doDeselect(selections[i], suppressEvent);
+        }
+        delete me.bulkChange;
+        
+        me.maybeFireSelectionChange(me.getSelection().length !== start);
+    },
+
+    
+    
+    
+    selectWithEvent: function(record, e, keepExisting) {
+        var me = this;
+
+        switch (me.selectionMode) {
+            case 'MULTI':
+                if (e.ctrlKey && me.isSelected(record)) {
+                    me.doDeselect(record, false);
+                } else if (e.shiftKey && me.lastFocused) {
+                    me.selectRange(me.lastFocused, record, e.ctrlKey);
+                } else if (e.ctrlKey) {
+                    me.doSelect(record, true, false);
+                } else if (me.isSelected(record) && !e.shiftKey && !e.ctrlKey && me.selected.getCount() > 1) {
+                    me.doSelect(record, keepExisting, false);
+                } else {
+                    me.doSelect(record, false);
+                }
+                break;
+            case 'SIMPLE':
+                if (me.isSelected(record)) {
+                    me.doDeselect(record);
+                } else {
+                    me.doSelect(record, true);
+                }
+                break;
+            case 'SINGLE':
+                
+                if (me.allowDeselect && me.isSelected(record)) {
+                    me.doDeselect(record);
+                
+                } else {
+                    me.doSelect(record, false);
+                }
+                break;
+        }
+    },
+
+    
+    selectRange : function(startRow, endRow, keepExisting, dir){
+        var me = this,
+            store = me.store,
+            selectedCount = 0,
+            i,
+            tmp,
+            dontDeselect,
+            records = [];
+
+        if (me.isLocked()){
+            return;
+        }
+
+        if (!keepExisting) {
+            me.deselectAll(true);
+        }
+
+        if (!Ext.isNumber(startRow)) {
+            startRow = store.indexOf(startRow);
+        }
+        if (!Ext.isNumber(endRow)) {
+            endRow = store.indexOf(endRow);
+        }
+
+        
+        if (startRow > endRow){
+            tmp = endRow;
+            endRow = startRow;
+            startRow = tmp;
+        }
+
+        for (i = startRow; i <= endRow; i++) {
+            if (me.isSelected(store.getAt(i))) {
+                selectedCount++;
+            }
+        }
+
+        if (!dir) {
+            dontDeselect = -1;
+        } else {
+            dontDeselect = (dir == 'up') ? startRow : endRow;
+        }
+
+        for (i = startRow; i <= endRow; i++){
+            if (selectedCount == (endRow - startRow + 1)) {
+                if (i != dontDeselect) {
+                    me.doDeselect(i, true);
+                }
+            } else {
+                records.push(store.getAt(i));
+            }
+        }
+        me.doMultiSelect(records, true);
+    },
+
+    
+    select: function(records, keepExisting, suppressEvent) {
+        
+        if (Ext.isDefined(records)) {
+            this.doSelect(records, keepExisting, suppressEvent);
+        }
+    },
+
+    
+    deselect: function(records, suppressEvent) {
+        this.doDeselect(records, suppressEvent);
+    },
+
+    doSelect: function(records, keepExisting, suppressEvent) {
+        var me = this,
+            record;
+
+        if (me.locked) {
+            return;
+        }
+        if (typeof records === "number") {
+            records = [me.store.getAt(records)];
+        }
+        if (me.selectionMode == "SINGLE" && records) {
+            record = records.length ? records[0] : records;
+            me.doSingleSelect(record, suppressEvent);
+        } else {
+            me.doMultiSelect(records, keepExisting, suppressEvent);
+        }
+    },
+
+    doMultiSelect: function(records, keepExisting, suppressEvent) {
+        var me = this,
+            selected = me.selected,
+            change = false,
+            i = 0,
+            len, record;
+
+        if (me.locked) {
+            return;
+        }
+
+
+        records = !Ext.isArray(records) ? [records] : records;
+        len = records.length;
+        if (!keepExisting && selected.getCount() > 0) {
+            if (me.doDeselect(me.getSelection(), suppressEvent) === false) {
+                return;
+            }
+            
+        }
+
+        function commit () {
+            selected.add(record);
+            change = true;
+        }
+
+        for (; i < len; i++) {
+            record = records[i];
+            if (keepExisting && me.isSelected(record)) {
+                continue;
+            }
+            me.lastSelected = record;
+
+            me.onSelectChange(record, true, suppressEvent, commit);
+        }
+        me.setLastFocused(record, suppressEvent);
+        
+        me.maybeFireSelectionChange(change && !suppressEvent);
+    },
+
+    
+    doDeselect: function(records, suppressEvent) {
+        var me = this,
+            selected = me.selected,
+            i = 0,
+            len, record,
+            attempted = 0,
+            accepted = 0;
+
+        if (me.locked) {
+            return false;
+        }
+
+        if (typeof records === "number") {
+            records = [me.store.getAt(records)];
+        } else if (!Ext.isArray(records)) {
+            records = [records];
+        }
+
+        function commit () {
+            ++accepted;
+            selected.remove(record);
+        }
+
+        len = records.length;
+
+        for (; i < len; i++) {
+            record = records[i];
+            if (me.isSelected(record)) {
+                if (me.lastSelected == record) {
+                    me.lastSelected = selected.last();
+                }
+                ++attempted;
+                me.onSelectChange(record, false, suppressEvent, commit);
+            }
+        }
+
+        
+        me.maybeFireSelectionChange(accepted > 0 && !suppressEvent);
+        return accepted === attempted;
+    },
+
+    doSingleSelect: function(record, suppressEvent) {
+        var me = this,
+            changed = false,
+            selected = me.selected;
+
+        if (me.locked) {
+            return;
+        }
+        
+        
+        if (me.isSelected(record)) {
+            return;
+        }
+
+        function commit () {
+            me.bulkChange = true;
+            if (selected.getCount() > 0 && me.doDeselect(me.lastSelected, suppressEvent) === false) {
+                delete me.bulkChange;
+                return false;
+            }
+            delete me.bulkChange;
+
+            selected.add(record);
+            me.lastSelected = record;
+            changed = true;
+        }
+
+        me.onSelectChange(record, true, suppressEvent, commit);
+
+        if (changed) {
+            if (!suppressEvent) {
+                me.setLastFocused(record);
+            }
+            me.maybeFireSelectionChange(!suppressEvent);
+        }
+    },
+
+    
+    setLastFocused: function(record, supressFocus) {
+        var me = this,
+            recordBeforeLast = me.lastFocused;
+        me.lastFocused = record;
+        me.onLastFocusChanged(recordBeforeLast, record, supressFocus);
+    },
+
+    
+    isFocused: function(record) {
+        return record === this.getLastFocused();
+    },
+
+
+    
+    
+    maybeFireSelectionChange: function(fireEvent) {
+        var me = this;
+        if (fireEvent && !me.bulkChange) {
+            me.fireEvent('selectionchange', me, me.getSelection());
+        }
+    },
+
+    
+    getLastSelected: function() {
+        return this.lastSelected;
+    },
+
+    getLastFocused: function() {
+        return this.lastFocused;
+    },
+
+    
+    getSelection: function() {
+        return this.selected.getRange();
+    },
+
+    
+    getSelectionMode: function() {
+        return this.selectionMode;
+    },
+
+    
+    setSelectionMode: function(selMode) {
+        selMode = selMode ? selMode.toUpperCase() : 'SINGLE';
+        
+        
+        this.selectionMode = this.modes[selMode] ? selMode : 'SINGLE';
+    },
+
+    
+    isLocked: function() {
+        return this.locked;
+    },
+
+    
+    setLocked: function(locked) {
+        this.locked = !!locked;
+    },
+
+    
+    isSelected: function(record) {
+        record = Ext.isNumber(record) ? this.store.getAt(record) : record;
+        return this.selected.indexOf(record) !== -1;
+    },
+
+    
+    hasSelection: function() {
+        return this.selected.getCount() > 0;
+    },
+
+    refresh: function() {
+        var me = this,
+            toBeSelected = [],
+            oldSelections = me.getSelection(),
+            len = oldSelections.length,
+            selection,
+            change,
+            i = 0,
+            lastFocused = this.getLastFocused();
+
+        
+        
+        
+        for (; i < len; i++) {
+            selection = oldSelections[i];
+            if (!this.pruneRemoved || me.store.indexOf(selection) !== -1) {
+                toBeSelected.push(selection);
+            }
+        }
+
+        
+        
+        if (me.selected.getCount() != toBeSelected.length) {
+            change = true;
+        }
+
+        me.clearSelections();
+
+        if (me.store.indexOf(lastFocused) !== -1) {
+            
+            this.setLastFocused(lastFocused, true);
+        }
+
+        if (toBeSelected.length) {
+            
+            me.doSelect(toBeSelected, false, true);
+        }
+
+        me.maybeFireSelectionChange(change);
+    },
+
+    
+    clearSelections: function() {
+        
+        this.selected.clear();
+        this.lastSelected = null;
+        this.setLastFocused(null);
+    },
+
+    
+    onStoreAdd: function() {
+
+    },
+
+    
+    
+    onStoreClear: function() {
+        if (this.selected.getCount > 0) {
+            this.clearSelections();
+            this.maybeFireSelectionChange(true);
+        }
+    },
+
+    
+    
+    
+    onStoreRemove: function(store, record) {
+        var me = this,
+            selected = me.selected;
+
+        if (me.locked || !me.pruneRemoved) {
+            return;
+        }
+
+        if (selected.remove(record)) {
+            if (me.lastSelected == record) {
+                me.lastSelected = null;
+            }
+            if (me.getLastFocused() == record) {
+                me.setLastFocused(null);
+            }
+            me.maybeFireSelectionChange(true);
+        }
+    },
+
+    
+    getCount: function() {
+        return this.selected.getCount();
+    },
+
+    
+    destroy: function() {
+
+    },
+
+    
+    onStoreUpdate: function() {
+
+    },
+
+    
+    onSelectChange: function(record, isSelected, suppressEvent) {
+
+    },
+
+    
+    onLastFocusChanged: function(oldFocused, newFocused) {
+
+    },
+
+    
+    onEditorKey: function(field, e) {
+
+    },
+
+    
+    bindComponent: function(cmp) {
+
+    }
+});
+
+Ext.define('Ext.selection.DataViewModel', {
+    extend: 'Ext.selection.Model',
+
+    requires: ['Ext.util.KeyNav'],
+
+    deselectOnContainerClick: true,
+
+    
+    enableKeyNav: true,
+
+    constructor: function(cfg){
+        this.addEvents(
+            
+            'beforedeselect',
+
+            
+            'beforeselect',
+
+            
+            'deselect',
+
+            
+            'select'
+        );
+        this.callParent(arguments);
+    },
+
+    bindComponent: function(view) {
+        var me = this,
+            eventListeners = {
+                refresh: me.refresh,
+                scope: me
+            };
+
+        me.view = view;
+        me.bind(view.getStore());
+
+        view.on(view.triggerEvent, me.onItemClick, me);
+        view.on(view.triggerCtEvent, me.onContainerClick, me);
+
+        view.on(eventListeners);
+
+        if (me.enableKeyNav) {
+            me.initKeyNav(view);
+        }
+    },
+
+    onItemClick: function(view, record, item, index, e) {
+        this.selectWithEvent(record, e);
+    },
+
+    onContainerClick: function() {
+        if (this.deselectOnContainerClick) {
+            this.deselectAll();
+        }
+    },
+
+    initKeyNav: function(view) {
+        var me = this;
+
+        if (!view.rendered) {
+            view.on('render', Ext.Function.bind(me.initKeyNav, me, [view], 0), me, {single: true});
+            return;
+        }
+
+        view.el.set({
+            tabIndex: -1
+        });
+        me.keyNav = Ext.create('Ext.util.KeyNav', view.el, {
+            down: Ext.pass(me.onNavKey, [1], me),
+            right: Ext.pass(me.onNavKey, [1], me),
+            left: Ext.pass(me.onNavKey, [-1], me),
+            up: Ext.pass(me.onNavKey, [-1], me),
+            scope: me
+        });
+    },
+
+    onNavKey: function(step) {
+        step = step || 1;
+        var me = this,
+            view = me.view,
+            selected = me.getSelection()[0],
+            numRecords = me.view.store.getCount(),
+            idx;
+
+        if (selected) {
+            idx = view.indexOf(view.getNode(selected)) + step;
+        } else {
+            idx = 0;
+        }
+
+        if (idx < 0) {
+            idx = numRecords - 1;
+        } else if (idx >= numRecords) {
+            idx = 0;
+        }
+
+        me.select(idx);
+    },
+
+    
+    onSelectChange: function(record, isSelected, suppressEvent, commitFn) {
+        var me = this,
+            view = me.view,
+            eventName = isSelected ? 'select' : 'deselect';
+
+        if ((suppressEvent || me.fireEvent('before' + eventName, me, record)) !== false &&
+                commitFn() !== false) {
+
+            if (isSelected) {
+                view.onItemSelect(record);
+            } else {
+                view.onItemDeselect(record);
+            }
+
+            if (!suppressEvent) {
+                me.fireEvent(eventName, me, record);
+            }
+        }
+    },
+    
+    destroy: function(){
+        Ext.destroy(this.keyNav);
+        this.callParent();
+    }
+});
+
+
+Ext.define('Ext.state.CookieProvider', {
+    extend: 'Ext.state.Provider',
+
+    
+
+    
+
+    
+
+    
+
+    
+    constructor : function(config){
+        var me = this;
+        me.path = "/";
+        me.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); 
+        me.domain = null;
+        me.secure = false;
+        me.callParent(arguments);
+        me.state = me.readCookies();
+    },
+
+    
+    set : function(name, value){
+        var me = this;
+
+        if(typeof value == "undefined" || value === null){
+            me.clear(name);
+            return;
+        }
+        me.setCookie(name, value);
+        me.callParent(arguments);
+    },
+
+    
+    clear : function(name){
+        this.clearCookie(name);
+        this.callParent(arguments);
+    },
+
+    
+    readCookies : function(){
+        var cookies = {},
+            c = document.cookie + ";",
+            re = /\s?(.*?)=(.*?);/g,
+            prefix = this.prefix,
+            len = prefix.length,
+            matches,
+            name,
+            value;
+
+        while((matches = re.exec(c)) != null){
+            name = matches[1];
+            value = matches[2];
+            if (name && name.substring(0, len) == prefix){
+                cookies[name.substr(len)] = this.decodeValue(value);
+            }
+        }
+        return cookies;
+    },
+
+    
+    setCookie : function(name, value){
+        var me = this;
+
+        document.cookie = me.prefix + name + "=" + me.encodeValue(value) +
+           ((me.expires == null) ? "" : ("; expires=" + me.expires.toGMTString())) +
+           ((me.path == null) ? "" : ("; path=" + me.path)) +
+           ((me.domain == null) ? "" : ("; domain=" + me.domain)) +
+           ((me.secure == true) ? "; secure" : "");
+    },
+
+    
+    clearCookie : function(name){
+        var me = this;
+
+        document.cookie = me.prefix + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
+           ((me.path == null) ? "" : ("; path=" + me.path)) +
+           ((me.domain == null) ? "" : ("; domain=" + me.domain)) +
+           ((me.secure == true) ? "; secure" : "");
+    }
+});
+
+
+
+Ext.define('Ext.state.LocalStorageProvider', {
+    
+    
+    extend: 'Ext.state.Provider',
+    
+    alias: 'state.localstorage',
+    
+    
+   
+    constructor: function(){
+        var me = this;
+        me.callParent(arguments);
+        me.store = me.getStorageObject();
+        me.state = me.readLocalStorage();
+    },
+    
+    readLocalStorage: function(){
+        var store = this.store,
+            i = 0,
+            len = store.length,
+            prefix = this.prefix,
+            prefixLen = prefix.length,
+            data = {},
+            key;
+            
+        for (; i < len; ++i) {
+            key = store.key(i);
+            if (key.substring(0, prefixLen) == prefix) {
+                data[key.substr(prefixLen)] = this.decodeValue(store.getItem(key));
+            }            
+        }
+        return data;
+    },
+    
+    set : function(name, value){
+        var me = this;
+        
+        me.clear(name);
+        if (typeof value == "undefined" || value === null) {
+            return;
+        }
+        me.store.setItem(me.prefix + name, me.encodeValue(value));
+        me.callParent(arguments);
+    },
+
+    
+    clear : function(name){
+        this.store.removeItem(this.prefix + name);
+        this.callParent(arguments);
+    },
+    
+    getStorageObject: function(){
+        try {
+            var supports = 'localStorage' in window && window['localStorage'] !== null;
+            if (supports) {
+                return window.localStorage;
+            }
+        } catch (e) {
+            return false;
+        }
+    }    
+});
+
+
+Ext.define('Ext.util.Point', {
+
+    
+    extend: 'Ext.util.Region',
+
+    statics: {
+
+        
+        fromEvent: function(e) {
+            e = (e.changedTouches && e.changedTouches.length > 0) ? e.changedTouches[0] : e;
+            return new this(e.pageX, e.pageY);
+        }
+    },
+
+    
+
+    
+    constructor: function(x, y) {
+        this.callParent([y, x, y, x]);
+    },
+
+    
+    toString: function() {
+        return "Point[" + this.x + "," + this.y + "]";
+    },
+
+    
+    equals: function(p) {
+        return (this.x == p.x && this.y == p.y);
+    },
+
+    
+    isWithin: function(p, threshold) {
+        if (!Ext.isObject(threshold)) {
+            threshold = {
+                x: threshold,
+                y: threshold
+            };
+        }
+
+        return (this.x <= p.x + threshold.x && this.x >= p.x - threshold.x &&
+                this.y <= p.y + threshold.y && this.y >= p.y - threshold.y);
+    },
+
+    
+    roundedEquals: function(p) {
+        return (Math.round(this.x) == Math.round(p.x) && Math.round(this.y) == Math.round(p.y));
+    }
+}, function() {
+    
+    this.prototype.translate = Ext.util.Region.prototype.translateBy;
+});
+
+
+
+Ext.define('Ext.LoadMask', {
+
+    extend: 'Ext.Component',
+
+    alias: 'widget.loadmask',
+
+    
+
+    mixins: {
+        floating: 'Ext.util.Floating'
+    },
+
+    uses: ['Ext.data.StoreManager'],
+
+    
+
+    
+
+    
+    msg : 'Loading...',
+    
+    msgCls : Ext.baseCSSPrefix + 'mask-loading',
+    
+    
+    useMsg: true,
+
+    
+    disabled: false,
+
+    baseCls: Ext.baseCSSPrefix + 'mask-msg',
+
+    renderTpl: '<div style="position:relative" class="{msgCls}"></div>',
+
+    
+    modal: true,
+
+    
+    floating: {
+        shadow: 'frame'
+    },
+
+    
+    focusOnToFront: false,
+
+    
+    constructor : function(el, config) {
+        var me = this;
+
+        
+        if (el.isComponent) {
+            me.ownerCt = el;
+            me.bindComponent(el);
+        }
+        
+        else {
+            me.ownerCt = new Ext.Component({
+                el: Ext.get(el),
+                rendered: true,
+                componentLayoutCounter: 1
+            });
+            me.container = el;
+        }
+        me.callParent([config]);
+
+        if (me.store) {
+            me.bindStore(me.store, true);
+        }
+        me.renderData = {
+            msgCls: me.msgCls
+        };
+        me.renderSelectors = {
+            msgEl: 'div'
+        };
+    },
+
+    bindComponent: function(comp) {
+        this.mon(comp, {
+            resize: this.onComponentResize,
+            scope: this
+        });
+    },
+
+    afterRender: function() {
+        this.callParent(arguments);
+        this.container = this.floatParent.getContentTarget();
+    },
+
+    
+    onComponentResize: function() {
+        var me = this;
+        if (me.rendered && me.isVisible()) {
+            me.toFront();
+            me.center();
+        }
+    },
+
+    
+    bindStore : function(store, initial) {
+        var me = this;
+
+        if (!initial && me.store) {
+            me.mun(me.store, {
+                scope: me,
+                beforeload: me.onBeforeLoad,
+                load: me.onLoad,
+                exception: me.onLoad
+            });
+            if (!store) {
+                me.store = null;
+            }
+        }
+        if (store) {
+            store = Ext.data.StoreManager.lookup(store);
+            me.mon(store, {
+                scope: me,
+                beforeload: me.onBeforeLoad,
+                load: me.onLoad,
+                exception: me.onLoad
+            });
+
+        }
+        me.store = store;
+        if (store && store.isLoading()) {
+            me.onBeforeLoad();
+        }
+    },
+
+    onDisable : function() {
+        this.callParent(arguments);
+        if (this.loading) {
+            this.onLoad();
+        }
+    },
+
+    
+    onBeforeLoad : function() {
+        var me = this,
+            owner = me.ownerCt || me.floatParent,
+            origin;
+        if (!this.disabled) {
+            
+            
+            if (owner.componentLayoutCounter) {
+                Ext.Component.prototype.show.call(me);
+            } else {
+                
+                origin = owner.afterComponentLayout;
+                owner.afterComponentLayout = function() {
+                    owner.afterComponentLayout = origin;
+                    origin.apply(owner, arguments);
+                    if(me.loading) {
+                        Ext.Component.prototype.show.call(me);
+                    }
+                };
+            }
+        }
+    },
+
+    onHide: function(){
+        var me = this;
+        me.callParent(arguments);
+        me.showOnParentShow = true;
+    },
+
+    onShow: function() {
+        var me = this,
+            msgEl = me.msgEl;
+            
+        me.callParent(arguments);
+        me.loading = true;
+        if (me.useMsg) {
+            msgEl.show().update(me.msg);
+        } else {
+            msgEl.parent().hide();
+        }
+    },
+
+    afterShow: function() {
+        this.callParent(arguments);
+        this.center();
+    },
+
+    
+    onLoad : function() {
+        this.loading = false;
+        Ext.Component.prototype.hide.call(this);
+    }
+});
+
+Ext.define('Ext.view.AbstractView', {
+    extend: 'Ext.Component',
+    alternateClassName: 'Ext.view.AbstractView',
+    requires: [
+        'Ext.LoadMask',
+        'Ext.data.StoreManager',
+        'Ext.CompositeElementLite',
+        'Ext.DomQuery',
+        'Ext.selection.DataViewModel'
+    ],
+
+    inheritableStatics: {
+        getRecord: function(node) {
+            return this.getBoundView(node).getRecord(node);
+        },
+
+        getBoundView: function(node) {
+            return Ext.getCmp(node.boundView);
+        }
+    },
+
+    
+    
+
+    
+    deferInitialRefresh: true,
+
+    
+
+    
+    itemCls: Ext.baseCSSPrefix + 'dataview-item',
+
+    
+
+    
+
+    
+    loadingText: 'Loading...',
+
+    
+    loadMask: true,
+
+    
+
+    
+    loadingUseMsg: true,
+
+
+    
+
+    
+    selectedItemCls: Ext.baseCSSPrefix + 'item-selected',
+
+    
+    emptyText: "",
+
+    
+    deferEmptyText: true,
+
+    
+    trackOver: false,
+
+    
+    blockRefresh: false,
+
+    
+
+
+    
+    last: false,
+
+    triggerEvent: 'itemclick',
+    triggerCtEvent: 'containerclick',
+
+    addCmpEvents: function() {
+
+    },
+
+    
+    initComponent : function(){
+        var me = this,
+            isDef = Ext.isDefined,
+            itemTpl = me.itemTpl,
+            memberFn = {};
+
+        if (itemTpl) {
+            if (Ext.isArray(itemTpl)) {
+                
+                itemTpl = itemTpl.join('');
+            } else if (Ext.isObject(itemTpl)) {
+                
+                memberFn = Ext.apply(memberFn, itemTpl.initialConfig);
+                itemTpl = itemTpl.html;
+            }
+
+            if (!me.itemSelector) {
+                me.itemSelector = '.' + me.itemCls;
+            }
+
+            itemTpl = Ext.String.format('<tpl for="."><div class="{0}">{1}</div></tpl>', me.itemCls, itemTpl);
+            me.tpl = Ext.create('Ext.XTemplate', itemTpl, memberFn);
+        }
+
+
+        me.callParent();
+        if(Ext.isString(me.tpl) || Ext.isArray(me.tpl)){
+            me.tpl = Ext.create('Ext.XTemplate', me.tpl);
+        }
+
+
+        me.addEvents(
+            
+            'beforerefresh',
+            
+            'refresh',
+            
+            'viewready',
+            
+            'itemupdate',
+            
+            'itemadd',
+            
+            'itemremove'
+        );
+
+        me.addCmpEvents();
+
+        
+        me.store = Ext.data.StoreManager.lookup(me.store || 'ext-empty-store');
+        me.all = new Ext.CompositeElementLite();
+    },
+
+    onRender: function() {
+        var me = this,
+            mask = me.loadMask,
+            cfg = {
+                msg: me.loadingText,
+                msgCls: me.loadingCls,
+                useMsg: me.loadingUseMsg
+            };
+
+        me.callParent(arguments);
+
+        if (mask) {
+            
+            if (Ext.isObject(mask)) {
+                cfg = Ext.apply(cfg, mask);
+            }
+            
+            
+            
+            
+            me.loadMask = Ext.create('Ext.LoadMask', me, cfg);
+            me.loadMask.on({
+                scope: me,
+                beforeshow: me.onMaskBeforeShow,
+                hide: me.onMaskHide
+            });
+        }
+    },
+
+    onMaskBeforeShow: function(){
+        var loadingHeight = this.loadingHeight;
+        
+        this.getSelectionModel().deselectAll();
+        if (loadingHeight) {
+            this.setCalculatedSize(undefined, loadingHeight);
+        }
+    },
+
+    onMaskHide: function(){
+        var me = this;
+        
+        if (!me.destroying && me.loadingHeight) {
+            me.setHeight(me.height);
+        }
+    },
+
+    afterRender: function() {
+        this.callParent(arguments);
+
+        
+        
+        
+        this.getSelectionModel().bindComponent(this);
+    },
+
+    
+    getSelectionModel: function(){
+        var me = this,
+            mode = 'SINGLE';
+
+        if (!me.selModel) {
+            me.selModel = {};
+        }
+
+        if (me.simpleSelect) {
+            mode = 'SIMPLE';
+        } else if (me.multiSelect) {
+            mode = 'MULTI';
+        }
+
+        Ext.applyIf(me.selModel, {
+            allowDeselect: me.allowDeselect,
+            mode: mode
+        });
+
+        if (!me.selModel.events) {
+            me.selModel = Ext.create('Ext.selection.DataViewModel', me.selModel);
+        }
+
+        if (!me.selModel.hasRelaySetup) {
+            me.relayEvents(me.selModel, [
+                'selectionchange', 'beforeselect', 'beforedeselect', 'select', 'deselect'
+            ]);
+            me.selModel.hasRelaySetup = true;
+        }
+
+        
+        
+        if (me.disableSelection) {
+            me.selModel.locked = true;
+        }
+
+        return me.selModel;
+    },
+
+    
+    refresh: function() {
+        var me = this,
+            el,
+            records;
+
+        if (!me.rendered || me.isDestroyed) {
+            return;
+        }
+
+        me.fireEvent('beforerefresh', me);
+        el = me.getTargetEl();
+        records = me.store.getRange();
+
+        el.update('');
+        if (records.length < 1) {
+            if (!me.deferEmptyText || me.hasSkippedEmptyText) {
+                el.update(me.emptyText);
+            }
+            me.all.clear();
+        } else {
+            me.tpl.overwrite(el, me.collectData(records, 0));
+            me.all.fill(Ext.query(me.getItemSelector(), el.dom));
+            me.updateIndexes(0);
+        }
+
+        me.selModel.refresh();
+        me.hasSkippedEmptyText = true;
+        me.fireEvent('refresh', me);
+
+        
+        
+        if (!me.viewReady) {
+            
+            
+            me.viewReady = true;
+            me.fireEvent('viewready', me);
+        }
+    },
+
+    
+    prepareData: function(data, index, record) {
+        if (record) {
+            Ext.apply(data, record.getAssociatedData());
+        }
+        return data;
+    },
+
+    
+    collectData : function(records, startIndex){
+        var r = [],
+            i = 0,
+            len = records.length,
+            record;
+
+        for(; i < len; i++){
+            record = records[i];
+            r[r.length] = this.prepareData(record[record.persistenceProperty], startIndex + i, record);
+        }
+        return r;
+    },
+
+    
+    bufferRender : function(records, index){
+        var div = document.createElement('div');
+        this.tpl.overwrite(div, this.collectData(records, index));
+        return Ext.query(this.getItemSelector(), div);
+    },
+
+    
+    onUpdate : function(ds, record){
+        var me = this,
+            index = me.store.indexOf(record),
+            node;
+
+        if (index > -1){
+            node = me.bufferRender([record], index)[0];
+            
+            if (me.getNode(record)) {
+                me.all.replaceElement(index, node, true);
+                me.updateIndexes(index, index);
+                
+                
+                me.selModel.refresh();
+                me.fireEvent('itemupdate', record, index, node);
+            }
+        }
+
+    },
+
+    
+    onAdd : function(ds, records, index) {
+        var me = this,
+            nodes;
+
+        if (me.all.getCount() === 0) {
+            me.refresh();
+            return;
+        }
+
+        nodes = me.bufferRender(records, index);
+        me.doAdd(nodes, records, index);
+
+        me.selModel.refresh();
+        me.updateIndexes(index);
+        me.fireEvent('itemadd', records, index, nodes);
+    },
+
+    doAdd: function(nodes, records, index) {
+        var all = this.all;
+
+        if (index < all.getCount()) {
+            all.item(index).insertSibling(nodes, 'before', true);
+        } else {
+            all.last().insertSibling(nodes, 'after', true);
+        }
+
+        Ext.Array.insert(all.elements, index, nodes);
+    },
+
+    
+    onRemove : function(ds, record, index) {
+        var me = this;
+
+        me.doRemove(record, index);
+        me.updateIndexes(index);
+        if (me.store.getCount() === 0){
+            me.refresh();
+        }
+        me.fireEvent('itemremove', record, index);
+    },
+
+    doRemove: function(record, index) {
+        this.all.removeElement(index, true);
+    },
+
+    
+    refreshNode : function(index){
+        this.onUpdate(this.store, this.store.getAt(index));
+    },
+
+    
+    updateIndexes : function(startIndex, endIndex) {
+        var ns = this.all.elements,
+            records = this.store.getRange(),
+            i;
+            
+        startIndex = startIndex || 0;
+        endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1));
+        for(i = startIndex; i <= endIndex; i++){
+            ns[i].viewIndex = i;
+            ns[i].viewRecordId = records[i].internalId;
+            if (!ns[i].boundView) {
+                ns[i].boundView = this.id;
+            }
+        }
+    },
+
+    
+    getStore : function(){
+        return this.store;
+    },
+
+    
+    bindStore : function(store, initial) {
+        var me = this,
+            maskStore;
+
+        if (!initial && me.store) {
+            if (store !== me.store && me.store.autoDestroy) {
+                me.store.destroyStore();
+            }
+            else {
+                me.mun(me.store, {
+                    scope: me,
+                    datachanged: me.onDataChanged,
+                    add: me.onAdd,
+                    remove: me.onRemove,
+                    update: me.onUpdate,
+                    clear: me.refresh
+                });
+            }
+            if (!store) {
+                
+                if (me.loadMask && me.loadMask.bindStore) {
+                    me.loadMask.bindStore(null);
+                }
+                me.store = null;
+            }
+        }
+        if (store) {
+            store = Ext.data.StoreManager.lookup(store);
+            me.mon(store, {
+                scope: me,
+                datachanged: me.onDataChanged,
+                add: me.onAdd,
+                remove: me.onRemove,
+                update: me.onUpdate,
+                clear: me.refresh
+            });
+            
+            if (me.loadMask && me.loadMask.bindStore) {
+                
+                if (Ext.Array.contains(store.alias, 'store.node')) {
+                    maskStore = this.ownerCt.store;
+                } else {
+                    maskStore = store;
+                }
+                me.loadMask.bindStore(maskStore);
+            }
+        }
+
+        
+        
+        me.viewReady = false;
+
+        me.store = store;
+        
+        me.getSelectionModel().bind(store);
+
+        
+        if (store) {
+            if (initial && me.deferInitialRefresh) {
+                Ext.Function.defer(function () {
+                    if (!me.isDestroyed) {
+                        me.refresh(true);
+                    }
+                }, 1);
+            } else {
+                me.refresh(true);
+            }
+        }
+    },
+
+    
+    onDataChanged: function() {
+        if (this.blockRefresh !== true) {
+            this.refresh.apply(this, arguments);
+        }
+    },
+
+    
+    findItemByChild: function(node){
+        return Ext.fly(node).findParent(this.getItemSelector(), this.getTargetEl());
+    },
+
+    
+    findTargetByEvent: function(e) {
+        return e.getTarget(this.getItemSelector(), this.getTargetEl());
+    },
+
+
+    
+    getSelectedNodes: function(){
+        var nodes   = [],
+            records = this.selModel.getSelection(),
+            ln = records.length,
+            i  = 0;
+
+        for (; i < ln; i++) {
+            nodes.push(this.getNode(records[i]));
+        }
+
+        return nodes;
+    },
+
+    
+    getRecords: function(nodes) {
+        var records = [],
+            i = 0,
+            len = nodes.length,
+            data = this.store.data;
+
+        for (; i < len; i++) {
+            records[records.length] = data.getByKey(nodes[i].viewRecordId);
+        }
+
+        return records;
+    },
+
+    
+    getRecord: function(node){
+        return this.store.data.getByKey(Ext.getDom(node).viewRecordId);
+    },
+
+
+    
+    isSelected : function(node) {
+        
+        var r = this.getRecord(node);
+        return this.selModel.isSelected(r);
+    },
+
+    
+    select: function(records, keepExisting, suppressEvent) {
+        this.selModel.select(records, keepExisting, suppressEvent);
+    },
+
+    
+    deselect: function(records, suppressEvent) {
+        this.selModel.deselect(records, suppressEvent);
+    },
+
+    
+    getNode : function(nodeInfo) {
+        if (!this.rendered) {
+            return null;
+        }
+        if (Ext.isString(nodeInfo)) {
+            return document.getElementById(nodeInfo);
+        }
+        if (Ext.isNumber(nodeInfo)) {
+            return this.all.elements[nodeInfo];
+        }
+        if (nodeInfo instanceof Ext.data.Model) {
+            return this.getNodeByRecord(nodeInfo);
+        }
+        return nodeInfo; 
+    },
+
+    
+    getNodeByRecord: function(record) {
+        var ns = this.all.elements,
+            ln = ns.length,
+            i = 0;
+
+        for (; i < ln; i++) {
+            if (ns[i].viewRecordId === record.internalId) {
+                return ns[i];
+            }
+        }
+
+        return null;
+    },
+
+    
+    getNodes: function(start, end) {
+        var ns = this.all.elements,
+            nodes = [],
+            i;
+
+        start = start || 0;
+        end = !Ext.isDefined(end) ? Math.max(ns.length - 1, 0) : end;
+        if (start <= end) {
+            for (i = start; i <= end && ns[i]; i++) {
+                nodes.push(ns[i]);
+            }
+        } else {
+            for (i = start; i >= end && ns[i]; i--) {
+                nodes.push(ns[i]);
+            }
+        }
+        return nodes;
+    },
+
+    
+    indexOf: function(node) {
+        node = this.getNode(node);
+        if (Ext.isNumber(node.viewIndex)) {
+            return node.viewIndex;
+        }
+        return this.all.indexOf(node);
+    },
+
+    onDestroy : function() {
+        var me = this;
+
+        me.all.clear();
+        me.callParent();
+        me.bindStore(null);
+        me.selModel.destroy();
+    },
+
+    
+    onItemSelect: function(record) {
+        var node = this.getNode(record);
+        
+        if (node) {
+            Ext.fly(node).addCls(this.selectedItemCls);
+        }
+    },
+
+    
+    onItemDeselect: function(record) {
+        var node = this.getNode(record);
+        
+        if (node) {
+            Ext.fly(node).removeCls(this.selectedItemCls);
+        }
+    },
+
+    getItemSelector: function() {
+        return this.itemSelector;
+    }
+}, function() {
+    
+    
+    
+    
+    Ext.deprecate('extjs', '4.0', function() {
+        Ext.view.AbstractView.override({
+            
+            
+            
+
+            
+            getSelectionCount : function(){
+                if (Ext.global.console) {
+                    Ext.global.console.warn("DataView: getSelectionCount will be removed, please interact with the Ext.selection.DataViewModel");
+                }
+                return this.selModel.getSelection().length;
+            },
+
+            
+            getSelectedRecords : function(){
+                if (Ext.global.console) {
+                    Ext.global.console.warn("DataView: getSelectedRecords will be removed, please interact with the Ext.selection.DataViewModel");
+                }
+                return this.selModel.getSelection();
+            },
+
+            select: function(records, keepExisting, supressEvents) {
+                if (Ext.global.console) {
+                    Ext.global.console.warn("DataView: select will be removed, please access select through a DataView's SelectionModel, ie: view.getSelectionModel().select()");
+                }
+                var sm = this.getSelectionModel();
+                return sm.select.apply(sm, arguments);
+            },
+
+            clearSelections: function() {
+                if (Ext.global.console) {
+                    Ext.global.console.warn("DataView: clearSelections will be removed, please access deselectAll through DataView's SelectionModel, ie: view.getSelectionModel().deselectAll()");
+                }
+                var sm = this.getSelectionModel();
+                return sm.deselectAll();
+            }
+        });
+    });
+});
+
+
+Ext.define('Ext.Action', {
+
+    
+
+    
+
+    
+    
+    
+    
+    
+    
+    
+
+    
+    constructor : function(config){
+        this.initialConfig = config;
+        this.itemId = config.itemId = (config.itemId || config.id || Ext.id());
+        this.items = [];
+    },
+
+    
+    isAction : true,
+
+    
+    setText : function(text){
+        this.initialConfig.text = text;
+        this.callEach('setText', [text]);
+    },
+
+    
+    getText : function(){
+        return this.initialConfig.text;
+    },
+
+    
+    setIconCls : function(cls){
+        this.initialConfig.iconCls = cls;
+        this.callEach('setIconCls', [cls]);
+    },
+
+    
+    getIconCls : function(){
+        return this.initialConfig.iconCls;
+    },
+
+    
+    setDisabled : function(v){
+        this.initialConfig.disabled = v;
+        this.callEach('setDisabled', [v]);
+    },
+
+    
+    enable : function(){
+        this.setDisabled(false);
+    },
+
+    
+    disable : function(){
+        this.setDisabled(true);
+    },
+
+    
+    isDisabled : function(){
+        return this.initialConfig.disabled;
+    },
+
+    
+    setHidden : function(v){
+        this.initialConfig.hidden = v;
+        this.callEach('setVisible', [!v]);
+    },
+
+    
+    show : function(){
+        this.setHidden(false);
+    },
+
+    
+    hide : function(){
+        this.setHidden(true);
+    },
+
+    
+    isHidden : function(){
+        return this.initialConfig.hidden;
+    },
+
+    
+    setHandler : function(fn, scope){
+        this.initialConfig.handler = fn;
+        this.initialConfig.scope = scope;
+        this.callEach('setHandler', [fn, scope]);
+    },
+
+    
+    each : function(fn, scope){
+        Ext.each(this.items, fn, scope);
+    },
+
+    
+    callEach : function(fnName, args){
+        var items = this.items,
+            i = 0,
+            len = items.length;
+
+        for(; i < len; i++){
+            items[i][fnName].apply(items[i], args);
+        }
+    },
+
+    
+    addComponent : function(comp){
+        this.items.push(comp);
+        comp.on('destroy', this.removeComponent, this);
+    },
+
+    
+    removeComponent : function(comp){
+        Ext.Array.remove(this.items, comp);
+    },
+
+    
+    execute : function(){
+        this.initialConfig.handler.apply(this.initialConfig.scope || Ext.global, arguments);
+    }
+});
+
+
+Ext.define('Ext.layout.component.Editor', {
+
+    
+
+    alias: ['layout.editor'],
+
+    extend: 'Ext.layout.component.Component',
+
+    
+
+    onLayout: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            autoSize = owner.autoSize;
+            
+        if (autoSize === true) {
+            autoSize = {
+                width: 'field',
+                height: 'field'    
+            };
+        }
+        
+        if (autoSize) {
+            width = me.getDimension(owner, autoSize.width, 'Width', width);
+            height = me.getDimension(owner, autoSize.height, 'Height', height);
+        }
+        me.setTargetSize(width, height);
+        owner.field.setSize(width, height);
+    },
+    
+    getDimension: function(owner, type, dimension, actual){
+        var method = 'get' + dimension;
+        switch (type) {
+            case 'boundEl':
+                return owner.boundEl[method]();
+            case 'field':
+                return owner.field[method]();
+            default:
+                return actual;
+        }
+    }
+});
+
+Ext.define('Ext.Editor', {
+
+    
+
+    extend: 'Ext.Component',
+
+    alias: 'widget.editor',
+
+    requires: ['Ext.layout.component.Editor'],
+
+    
+
+   componentLayout: 'editor',
+
+    
+
+    
+    allowBlur: true,
+
+    
+
+    
+    revertInvalid: true,
+
+    
+
+    
+
+    
+    value : '',
+
+    
+    alignment: 'c-c?',
+
+    
+    offsets: [0, 0],
+
+    
+    shadow : 'frame',
+
+    
+    constrain : false,
+
+    
+    swallowKeys : true,
+
+    
+    completeOnEnter : true,
+
+    
+    cancelOnEsc : true,
+
+    
+    updateEl : false,
+
+    
+
+    
+    hidden: true,
+    baseCls: Ext.baseCSSPrefix + 'editor',
+
+    initComponent : function() {
+        var me = this,
+            field = me.field = Ext.ComponentManager.create(me.field, 'textfield');
+
+        Ext.apply(field, {
+            inEditor: true,
+            msgTarget: field.msgTarget == 'title' ? 'title' :  'qtip'
+        });
+        me.mon(field, {
+            scope: me,
+            blur: {
+                fn: me.onBlur,
+                
+                delay: 1
+            },
+            specialkey: me.onSpecialKey
+        });
+
+        if (field.grow) {
+            me.mon(field, 'autosize', me.onAutoSize,  me, {delay: 1});
+        }
+        me.floating = {
+            constrain: me.constrain
+        };
+
+        me.callParent(arguments);
+
+        me.addEvents(
+            
+            'beforestartedit',
+
+            
+            'startedit',
+
+            
+            'beforecomplete',
+            
+            'complete',
+            
+            'canceledit',
+            
+            'specialkey'
+        );
+    },
+
+    
+    onAutoSize: function(){
+        this.doComponentLayout();
+    },
+
+    
+    onRender : function(ct, position) {
+        var me = this,
+            field = me.field,
+            inputEl = field.inputEl;
+
+        me.callParent(arguments);
+
+        field.render(me.el);
+        
+        
+        if (inputEl) {
+            inputEl.dom.name = '';
+            if (me.swallowKeys) {
+                inputEl.swallowEvent([
+                    'keypress', 
+                    'keydown'   
+                ]);
+            }
+        }
+    },
+
+    
+    onSpecialKey : function(field, event) {
+        var me = this,
+            key = event.getKey(),
+            complete = me.completeOnEnter && key == event.ENTER,
+            cancel = me.cancelOnEsc && key == event.ESC;
+
+        if (complete || cancel) {
+            event.stopEvent();
+            
+            
+            Ext.defer(function() {
+                if (complete) {
+                    me.completeEdit();
+                } else {
+                    me.cancelEdit();
+                }
+                if (field.triggerBlur) {
+                    field.triggerBlur();
+                }
+            }, 10);
+        }
+
+        this.fireEvent('specialkey', this, field, event);
+    },
+
+    
+    startEdit : function(el, value) {
+        var me = this,
+            field = me.field;
+
+        me.completeEdit();
+        me.boundEl = Ext.get(el);
+        value = Ext.isDefined(value) ? value : me.boundEl.dom.innerHTML;
+
+        if (!me.rendered) {
+            me.render(me.parentEl || document.body);
+        }
+
+        if (me.fireEvent('beforestartedit', me, me.boundEl, value) !== false) {
+            me.startValue = value;
+            me.show();
+            field.reset();
+            field.setValue(value);
+            me.realign(true);
+            field.focus(false, 10);
+            if (field.autoSize) {
+                field.autoSize();
+            }
+            me.editing = true;
+        }
+    },
+
+    
+    realign : function(autoSize) {
+        var me = this;
+        if (autoSize === true) {
+            me.doComponentLayout();
+        }
+        me.alignTo(me.boundEl, me.alignment, me.offsets);
+    },
+
+    
+    completeEdit : function(remainVisible) {
+        var me = this,
+            field = me.field,
+            value;
+
+        if (!me.editing) {
+            return;
+        }
+
+        
+        if (field.assertValue) {
+            field.assertValue();
+        }
+
+        value = me.getValue();
+        if (!field.isValid()) {
+            if (me.revertInvalid !== false) {
+                me.cancelEdit(remainVisible);
+            }
+            return;
+        }
+
+        if (String(value) === String(me.startValue) && me.ignoreNoChange) {
+            me.hideEdit(remainVisible);
+            return;
+        }
+
+        if (me.fireEvent('beforecomplete', me, value, me.startValue) !== false) {
+            
+            value = me.getValue();
+            if (me.updateEl && me.boundEl) {
+                me.boundEl.update(value);
+            }
+            me.hideEdit(remainVisible);
+            me.fireEvent('complete', me, value, me.startValue);
+        }
+    },
+
+    
+    onShow : function() {
+        var me = this;
+
+        me.callParent(arguments);
+        if (me.hideEl !== false) {
+            me.boundEl.hide();
+        }
+        me.fireEvent("startedit", me.boundEl, me.startValue);
+    },
+
+    
+    cancelEdit : function(remainVisible) {
+        var me = this,
+            startValue = me.startValue,
+            value;
+
+        if (me.editing) {
+            value = me.getValue();
+            me.setValue(startValue);
+            me.hideEdit(remainVisible);
+            me.fireEvent('canceledit', me, value, startValue);
+        }
+    },
+
+    
+    hideEdit: function(remainVisible) {
+        if (remainVisible !== true) {
+            this.editing = false;
+            this.hide();
+        }
+    },
+
+    
+    onBlur : function() {
+        var me = this;
+
+        
+        if(me.allowBlur === true && me.editing && me.selectSameEditor !== true) {
+            me.completeEdit();
+        }
+    },
+
+    
+    onHide : function() {
+        var me = this,
+            field = me.field;
+
+        if (me.editing) {
+            me.completeEdit();
+            return;
+        }
+        field.blur();
+        if (field.collapse) {
+            field.collapse();
+        }
+
+        
+        if (me.hideEl !== false) {
+            me.boundEl.show();
+        }
+        me.callParent(arguments);
+    },
+
+    
+    setValue : function(value) {
+        this.field.setValue(value);
+    },
+
+    
+    getValue : function() {
+        return this.field.getValue();
+    },
+
+    beforeDestroy : function() {
+        var me = this;
+
+        Ext.destroy(me.field);
+        delete me.field;
+        delete me.parentEl;
+        delete me.boundEl;
+
+        me.callParent(arguments);
+    }
+});
+
+Ext.define('Ext.Img', {
+    extend: 'Ext.Component',
+    alias: ['widget.image', 'widget.imagecomponent'],
+    
+    src: '',
+
+    getElConfig: function() {
+        return {
+            tag: 'img',
+            src: this.src
+        };
+    },
+    
+    
+    initRenderTpl: Ext.emptyFn,
+    
+    
+    setSrc: function(src) {
+        var me = this,
+            img = me.el;
+        me.src = src;
+        if (img) {
+            img.dom.src = src;
+        }
+    }
+});
+
+
+Ext.define('Ext.Layer', {
+    uses: ['Ext.Shadow'],
+
+    
+    statics: {
+        shims: []
+    },
+
+    extend: 'Ext.Element',
+
+    
+    constructor: function(config, existingEl) {
+        config = config || {};
+        var me = this,
+            dh = Ext.DomHelper,
+            cp = config.parentEl,
+            pel = cp ? Ext.getDom(cp) : document.body,
+        hm = config.hideMode;
+
+        if (existingEl) {
+            me.dom = Ext.getDom(existingEl);
+        }
+        if (!me.dom) {
+            me.dom = dh.append(pel, config.dh || {
+                tag: 'div',
+                cls: Ext.baseCSSPrefix + 'layer'
+            });
+        } else {
+            me.addCls(Ext.baseCSSPrefix + 'layer');
+            if (!me.dom.parentNode) {
+                pel.appendChild(me.dom);
+            }
+        }
+
+        if (config.cls) {
+            me.addCls(config.cls);
+        }
+        me.constrain = config.constrain !== false;
+
+        
+        
+        
+        if (hm) {
+            me.setVisibilityMode(Ext.Element[hm.toUpperCase()]);
+            if (me.visibilityMode == Ext.Element.ASCLASS) {
+                me.visibilityCls = config.visibilityCls;
+            }
+        } else if (config.useDisplay) {
+            me.setVisibilityMode(Ext.Element.DISPLAY);
+        } else {
+            me.setVisibilityMode(Ext.Element.VISIBILITY);
+        }
+
+        if (config.id) {
+            me.id = me.dom.id = config.id;
+        } else {
+            me.id = Ext.id(me.dom);
+        }
+        me.position('absolute');
+        if (config.shadow) {
+            me.shadowOffset = config.shadowOffset || 4;
+            me.shadow = Ext.create('Ext.Shadow', {
+                offset: me.shadowOffset,
+                mode: config.shadow
+            });
+            me.disableShadow();
+        } else {
+            me.shadowOffset = 0;
+        }
+        me.useShim = config.shim !== false && Ext.useShims;
+        if (config.hidden === true) {
+            me.hide();
+        } else {
+            me.show();
+        }
+    },
+
+    getZIndex: function() {
+        return parseInt((this.getShim() || this).getStyle('z-index'), 10);
+    },
+
+    getShim: function() {
+        var me = this,
+            shim, pn;
+
+        if (!me.useShim) {
+            return null;
+        }
+        if (!me.shim) {
+            shim = me.self.shims.shift();
+            if (!shim) {
+                shim = me.createShim();
+                shim.enableDisplayMode('block');
+                shim.hide();
+            }
+            pn = me.dom.parentNode;
+            if (shim.dom.parentNode != pn) {
+                pn.insertBefore(shim.dom, me.dom);
+            }
+            me.shim = shim;
+        }
+        return me.shim;
+    },
+
+    hideShim: function() {
+        var me = this;
+        
+        if (me.shim) {
+            me.shim.setDisplayed(false);
+            me.self.shims.push(me.shim);
+            delete me.shim;
+        }
+    },
+
+    disableShadow: function() {
+        var me = this;
+        
+        if (me.shadow && !me.shadowDisabled) {
+            me.shadowDisabled = true;
+            me.shadow.hide();
+            me.lastShadowOffset = me.shadowOffset;
+            me.shadowOffset = 0;
+        }
+    },
+
+    enableShadow: function(show) {
+        var me = this;
+        
+        if (me.shadow && me.shadowDisabled) {
+            me.shadowDisabled = false;
+            me.shadowOffset = me.lastShadowOffset;
+            delete me.lastShadowOffset;
+            if (show) {
+                me.sync(true);
+            }
+        }
+    },
+
+    
+    sync: function(doShow) {
+        var me = this,
+            shadow = me.shadow,
+            shadowPos, shimStyle, shadowSize;
+
+        if (!me.updating && me.isVisible() && (shadow || me.useShim)) {
+            var shim = me.getShim(),
+                l = me.getLeft(true),
+                t = me.getTop(true),
+                w = me.dom.offsetWidth,
+                h = me.dom.offsetHeight,
+                shimIndex;
+
+            if (shadow && !me.shadowDisabled) {
+                if (doShow && !shadow.isVisible()) {
+                    shadow.show(me);
+                } else {
+                    shadow.realign(l, t, w, h);
+                }
+                if (shim) {
+                    
+                    shimIndex = shim.getStyle('z-index');
+                    if (shimIndex > me.zindex) {
+                        me.shim.setStyle('z-index', me.zindex - 2);
+                    }
+                    shim.show();
+                    
+                    if (shadow.isVisible()) {
+                        shadowPos = shadow.el.getXY();
+                        shimStyle = shim.dom.style;
+                        shadowSize = shadow.el.getSize();
+                        if (Ext.supports.CSS3BoxShadow) {
+                            shadowSize.height += 6;
+                            shadowSize.width += 4;
+                            shadowPos[0] -= 2;
+                            shadowPos[1] -= 4;
+                        }
+                        shimStyle.left = (shadowPos[0]) + 'px';
+                        shimStyle.top = (shadowPos[1]) + 'px';
+                        shimStyle.width = (shadowSize.width) + 'px';
+                        shimStyle.height = (shadowSize.height) + 'px';
+                    } else {
+                        shim.setSize(w, h);
+                        shim.setLeftTop(l, t);
+                    }
+                }
+            } else if (shim) {
+                
+                shimIndex = shim.getStyle('z-index');
+                if (shimIndex > me.zindex) {
+                    me.shim.setStyle('z-index', me.zindex - 2);
+                }
+                shim.show();
+                shim.setSize(w, h);
+                shim.setLeftTop(l, t);
+            }
+        }
+        return me;
+    },
+
+    remove: function() {
+        this.hideUnders();
+        this.callParent();
+    },
+
+    
+    beginUpdate: function() {
+        this.updating = true;
+    },
+
+    
+    endUpdate: function() {
+        this.updating = false;
+        this.sync(true);
+    },
+
+    
+    hideUnders: function() {
+        if (this.shadow) {
+            this.shadow.hide();
+        }
+        this.hideShim();
+    },
+
+    
+    constrainXY: function() {
+        if (this.constrain) {
+            var vw = Ext.Element.getViewWidth(),
+                vh = Ext.Element.getViewHeight(),
+                s = Ext.getDoc().getScroll(),
+                xy = this.getXY(),
+                x = xy[0],
+                y = xy[1],
+                so = this.shadowOffset,
+                w = this.dom.offsetWidth + so,
+                h = this.dom.offsetHeight + so,
+                moved = false; 
+            
+            if ((x + w) > vw + s.left) {
+                x = vw - w - so;
+                moved = true;
+            }
+            if ((y + h) > vh + s.top) {
+                y = vh - h - so;
+                moved = true;
+            }
+            
+            if (x < s.left) {
+                x = s.left;
+                moved = true;
+            }
+            if (y < s.top) {
+                y = s.top;
+                moved = true;
+            }
+            if (moved) {
+                Ext.Layer.superclass.setXY.call(this, [x, y]);
+                this.sync();
+            }
+        }
+        return this;
+    },
+
+    getConstrainOffset: function() {
+        return this.shadowOffset;
+    },
+
+    
+    setVisible: function(visible, animate, duration, callback, easing) {
+        var me = this,
+            cb;
+
+        
+        cb = function() {
+            if (visible) {
+                me.sync(true);
+            }
+            if (callback) {
+                callback();
+            }
+        };
+
+        
+        if (!visible) {
+            me.hideUnders(true);
+        }
+        me.callParent([visible, animate, duration, callback, easing]);
+        if (!animate) {
+            cb();
+        }
+        return me;
+    },
+
+    
+    beforeFx: function() {
+        this.beforeAction();
+        return this.callParent(arguments);
+    },
+
+    
+    afterFx: function() {
+        this.callParent(arguments);
+        this.sync(this.isVisible());
+    },
+
+    
+    beforeAction: function() {
+        if (!this.updating && this.shadow) {
+            this.shadow.hide();
+        }
+    },
+
+    
+    setLeft: function(left) {
+        this.callParent(arguments);
+        return this.sync();
+    },
+
+    setTop: function(top) {
+        this.callParent(arguments);
+        return this.sync();
+    },
+
+    setLeftTop: function(left, top) {
+        this.callParent(arguments);
+        return this.sync();
+    },
+
+    setXY: function(xy, animate, duration, callback, easing) {
+        var me = this;
+        
+        
+        callback = me.createCB(callback);
+
+        me.fixDisplay();
+        me.beforeAction();
+        me.callParent([xy, animate, duration, callback, easing]);
+        if (!animate) {
+            callback();
+        }
+        return me;
+    },
+
+    
+    createCB: function(callback) {
+        var me = this,
+            showShadow = me.shadow && me.shadow.isVisible();
+
+        return function() {
+            me.constrainXY();
+            me.sync(showShadow);
+            if (callback) {
+                callback();
+            }
+        };
+    },
+
+    
+    setX: function(x, animate, duration, callback, easing) {
+        this.setXY([x, this.getY()], animate, duration, callback, easing);
+        return this;
+    },
+
+    
+    setY: function(y, animate, duration, callback, easing) {
+        this.setXY([this.getX(), y], animate, duration, callback, easing);
+        return this;
+    },
+
+    
+    setSize: function(w, h, animate, duration, callback, easing) {
+        var me = this;
+        
+        
+        callback = me.createCB(callback);
+
+        me.beforeAction();
+        me.callParent([w, h, animate, duration, callback, easing]);
+        if (!animate) {
+            callback();
+        }
+        return me;
+    },
+
+    
+    setWidth: function(w, animate, duration, callback, easing) {
+        var me = this;
+        
+        
+        callback = me.createCB(callback);
+
+        me.beforeAction();
+        me.callParent([w, animate, duration, callback, easing]);
+        if (!animate) {
+            callback();
+        }
+        return me;
+    },
+
+    
+    setHeight: function(h, animate, duration, callback, easing) {
+        var me = this;
+        
+        
+        callback = me.createCB(callback);
+
+        me.beforeAction();
+        me.callParent([h, animate, duration, callback, easing]);
+        if (!animate) {
+            callback();
+        }
+        return me;
+    },
+
+    
+    setBounds: function(x, y, width, height, animate, duration, callback, easing) {
+        var me = this;
+        
+        
+        callback = me.createCB(callback);
+
+        me.beforeAction();
+        if (!animate) {
+            Ext.Layer.superclass.setXY.call(me, [x, y]);
+            Ext.Layer.superclass.setSize.call(me, width, height);
+            callback();
+        } else {
+            me.callParent([x, y, width, height, animate, duration, callback, easing]);
+        }
+        return me;
+    },
+
+    
+    setZIndex: function(zindex) {
+        var me = this;
+        
+        me.zindex = zindex;
+        if (me.getShim()) {
+            me.shim.setStyle('z-index', zindex++);
+        }
+        if (me.shadow) {
+            me.shadow.setZIndex(zindex++);
+        }
+        return me.setStyle('z-index', zindex);
+    },
+    
+    setOpacity: function(opacity){
+        if (this.shadow) {
+            this.shadow.setOpacity(opacity);
+        }
+        return this.callParent(arguments);
+    }
+});
+
+
+
+Ext.define('Ext.layout.component.ProgressBar', {
+
+    
+
+    alias: ['layout.progressbar'],
+
+    extend: 'Ext.layout.component.Component',
+
+    
+
+    type: 'progressbar',
+
+    onLayout: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            textEl = owner.textEl;
+        
+        me.setElementSize(owner.el, width, height);
+        textEl.setWidth(owner.el.getWidth(true));
+        
+        me.callParent([width, height]);
+        
+        owner.updateProgress(owner.value);
+    }
+});
+
+Ext.define('Ext.ProgressBar', {
+    extend: 'Ext.Component',
+    alias: 'widget.progressbar',
+
+    requires: [
+        'Ext.Template',
+        'Ext.CompositeElement',
+        'Ext.TaskManager',
+        'Ext.layout.component.ProgressBar'
+    ],
+
+    uses: ['Ext.fx.Anim'],
+
+   
+
+   
+
+   
+
+   
+
+   
+    baseCls: Ext.baseCSSPrefix + 'progress',
+
+    config: {
+        
+        animate: false,
+
+        
+        text: ''
+    },
+
+    
+    waitTimer: null,
+
+    renderTpl: [
+        '<div class="{baseCls}-text {baseCls}-text-back">',
+            '<div> </div>',
+        '</div>',
+        '<div id="{id}-bar" class="{baseCls}-bar">',
+            '<div class="{baseCls}-text">',
+                '<div> </div>',
+            '</div>',
+        '</div>'
+    ],
+
+    componentLayout: 'progressbar',
+
+    
+    initComponent: function() {
+        this.callParent();
+
+        this.addChildEls('bar');
+
+        this.addEvents(
+            
+            "update"
+        );
+    },
+
+    afterRender : function() {
+        var me = this;
+
+        
+        
+        me.textEl = me.textEl ? Ext.get(me.textEl) : me.el.select('.' + me.baseCls + '-text');
+
+        me.callParent(arguments);
+
+        if (me.value) {
+            me.updateProgress(me.value, me.text);
+        }
+        else {
+            me.updateText(me.text);
+        }
+    },
+
+    
+    updateProgress: function(value, text, animate) {
+        var me = this,
+            newWidth;
+            
+        me.value = value || 0;
+        if (text) {
+            me.updateText(text);
+        }
+        if (me.rendered && !me.isDestroyed) {
+            if (me.isVisible(true)) {
+                newWidth = Math.floor(me.value * me.el.getWidth(true));
+                if (Ext.isForcedBorderBox) {
+                    newWidth += me.bar.getBorderWidth("lr");
+                }
+                if (animate === true || (animate !== false && me.animate)) {
+                    me.bar.stopAnimation();
+                    me.bar.animate(Ext.apply({
+                        to: {
+                            width: newWidth + 'px'
+                        }
+                    }, me.animate));
+                } else {
+                    me.bar.setWidth(newWidth);
+                }
+            } else {
+                
+                me.doComponentLayout();
+            }
+        }
+        me.fireEvent('update', me, me.value, text);
+        return me;
+    },
+
+    
+    updateText: function(text) {
+        var me = this;
+        
+        me.text = text;
+        if (me.rendered) {
+            me.textEl.update(me.text);
+        }
+        return me;
+    },
+
+    applyText : function(text) {
+        this.updateText(text);
+    },
+
+    
+    wait: function(o) {
+        var me = this;
+            
+        if (!me.waitTimer) {
+            scope = me;
+            o = o || {};
+            me.updateText(o.text);
+            me.waitTimer = Ext.TaskManager.start({
+                run: function(i){
+                    var inc = o.increment || 10;
+                    i -= 1;
+                    me.updateProgress(((((i+inc)%inc)+1)*(100/inc))*0.01, null, o.animate);
+                },
+                interval: o.interval || 1000,
+                duration: o.duration,
+                onStop: function(){
+                    if (o.fn) {
+                        o.fn.apply(o.scope || me);
+                    }
+                    me.reset();
+                },
+                scope: scope
+            });
+        }
+        return me;
+    },
+
+    
+    isWaiting: function(){
+        return this.waitTimer !== null;
+    },
+
+    
+    reset: function(hide){
+        var me = this;
+        
+        me.updateProgress(0);
+        me.clearTimer();
+        if (hide === true) {
+            me.hide();
+        }
+        return me;
+    },
+
+    
+    clearTimer: function(){
+        var me = this;
+        
+        if (me.waitTimer) {
+            me.waitTimer.onStop = null; 
+            Ext.TaskManager.stop(me.waitTimer);
+            me.waitTimer = null;
+        }
+    },
+
+    onDestroy: function(){
+        var me = this;
+        
+        me.clearTimer();
+        if (me.rendered) {
+            if (me.textEl.isComposite) {
+                me.textEl.clear();
+            }
+            Ext.destroyMembers(me, 'textEl', 'progressBar');
+        }
+        me.callParent();
+    }
+});
+
+
+Ext.define('Ext.ShadowPool', {
+    singleton: true,
+    requires: ['Ext.DomHelper'],
+
+    markup: function() {
+        if (Ext.supports.CSS3BoxShadow) {
+            return '<div class="' + Ext.baseCSSPrefix + 'css-shadow" role="presentation"></div>';
+        } else if (Ext.isIE) {
+            return '<div class="' + Ext.baseCSSPrefix + 'ie-shadow" role="presentation"></div>';
+        } else {
+            return '<div class="' + Ext.baseCSSPrefix + 'frame-shadow" role="presentation">' +
+                '<div class="xst" role="presentation">' +
+                    '<div class="xstl" role="presentation"></div>' +
+                    '<div class="xstc" role="presentation"></div>' +
+                    '<div class="xstr" role="presentation"></div>' +
+                '</div>' +
+                '<div class="xsc" role="presentation">' +
+                    '<div class="xsml" role="presentation"></div>' +
+                    '<div class="xsmc" role="presentation"></div>' +
+                    '<div class="xsmr" role="presentation"></div>' +
+                '</div>' +
+                '<div class="xsb" role="presentation">' +
+                    '<div class="xsbl" role="presentation"></div>' +
+                    '<div class="xsbc" role="presentation"></div>' +
+                    '<div class="xsbr" role="presentation"></div>' +
+                '</div>' +
+            '</div>';
+        }
+    }(),
+
+    shadows: [],
+
+    pull: function() {
+        var sh = this.shadows.shift();
+        if (!sh) {
+            sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, this.markup));
+            sh.autoBoxAdjust = false;
+        }
+        return sh;
+    },
+
+    push: function(sh) {
+        this.shadows.push(sh);
+    },
+    
+    reset: function() {
+        Ext.Array.each(this.shadows, function(shadow) {
+            shadow.remove();
+        });
+        this.shadows = [];
+    }
+});
+
+Ext.define('Ext.Shadow', {
+    requires: ['Ext.ShadowPool'],
+
+    
+    constructor: function(config) {
+        var me = this,
+            adjusts = {
+                h: 0
+            },
+            offset,
+            rad;
+        
+        Ext.apply(me, config);
+        if (!Ext.isString(me.mode)) {
+            me.mode = me.defaultMode;
+        }
+        offset = me.offset;
+        rad = Math.floor(offset / 2);
+        me.opacity = 50;
+        switch (me.mode.toLowerCase()) {
+            
+            case "drop":
+                if (Ext.supports.CSS3BoxShadow) {
+                    adjusts.w = adjusts.h = -offset;
+                    adjusts.l = adjusts.t = offset;
+                } else {
+                    adjusts.w = 0;
+                    adjusts.l = adjusts.t = offset;
+                    adjusts.t -= 1;
+                    if (Ext.isIE) {
+                        adjusts.l -= offset + rad;
+                        adjusts.t -= offset + rad;
+                        adjusts.w -= rad;
+                        adjusts.h -= rad;
+                        adjusts.t += 1;
+                    }
+                }
+                break;
+            case "sides":
+                if (Ext.supports.CSS3BoxShadow) {
+                    adjusts.h -= offset;
+                    adjusts.t = offset;
+                    adjusts.l = adjusts.w = 0;
+                } else {
+                    adjusts.w = (offset * 2);
+                    adjusts.l = -offset;
+                    adjusts.t = offset - 1;
+                    if (Ext.isIE) {
+                        adjusts.l -= (offset - rad);
+                        adjusts.t -= offset + rad;
+                        adjusts.l += 1;
+                        adjusts.w -= (offset - rad) * 2;
+                        adjusts.w -= rad + 1;
+                        adjusts.h -= 1;
+                    }
+                }
+                break;
+            case "frame":
+                if (Ext.supports.CSS3BoxShadow) {
+                    adjusts.l = adjusts.w = adjusts.t = 0;
+                } else {
+                    adjusts.w = adjusts.h = (offset * 2);
+                    adjusts.l = adjusts.t = -offset;
+                    adjusts.t += 1;
+                    adjusts.h -= 2;
+                    if (Ext.isIE) {
+                        adjusts.l -= (offset - rad);
+                        adjusts.t -= (offset - rad);
+                        adjusts.l += 1;
+                        adjusts.w -= (offset + rad + 1);
+                        adjusts.h -= (offset + rad);
+                        adjusts.h += 1;
+                    }
+                    break;
+                }
+        }
+        me.adjusts = adjusts;
+    },
+
+    
+    
+    offset: 4,
+
+    
+    defaultMode: "drop",
+
+    
+    show: function(target) {
+        var me = this,
+            index;
+        
+        target = Ext.get(target);
+        if (!me.el) {
+            me.el = Ext.ShadowPool.pull();
+            if (me.el.dom.nextSibling != target.dom) {
+                me.el.insertBefore(target);
+            }
+        }
+        index = (parseInt(target.getStyle("z-index"), 10) - 1) || 0;
+        me.el.setStyle("z-index", me.zIndex || index);
+        if (Ext.isIE && !Ext.supports.CSS3BoxShadow) {
+            me.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=" + me.opacity + ") progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (me.offset) + ")";
+        }
+        me.realign(
+            target.getLeft(true),
+            target.getTop(true),
+            target.dom.offsetWidth,
+            target.dom.offsetHeight
+        );
+        me.el.dom.style.display = "block";
+    },
+
+    
+    isVisible: function() {
+        return this.el ? true: false;
+    },
+
+    
+    realign: function(l, t, targetWidth, targetHeight) {
+        if (!this.el) {
+            return;
+        }
+        var adjusts = this.adjusts,
+            d = this.el.dom,
+            targetStyle = d.style,
+            shadowWidth,
+            shadowHeight,
+            cn,
+            sww, 
+            sws, 
+            shs;
+
+        targetStyle.left = (l + adjusts.l) + "px";
+        targetStyle.top = (t + adjusts.t) + "px";
+        shadowWidth = Math.max(targetWidth + adjusts.w, 0);
+        shadowHeight = Math.max(targetHeight + adjusts.h, 0);
+        sws = shadowWidth + "px";
+        shs = shadowHeight + "px";
+        if (targetStyle.width != sws || targetStyle.height != shs) {
+            targetStyle.width = sws;
+            targetStyle.height = shs;
+            if (Ext.supports.CSS3BoxShadow) {
+                targetStyle.boxShadow = '0 0 ' + this.offset + 'px 0 #888';
+            } else {
+
+                
+                if (!Ext.isIE) {
+                    cn = d.childNodes;
+                    sww = Math.max(0, (shadowWidth - 12)) + "px";
+                    cn[0].childNodes[1].style.width = sww;
+                    cn[1].childNodes[1].style.width = sww;
+                    cn[2].childNodes[1].style.width = sww;
+                    cn[1].style.height = Math.max(0, (shadowHeight - 12)) + "px";
+                }
+            }
+        }
+    },
+
+    
+    hide: function() {
+        var me = this;
+        
+        if (me.el) {
+            me.el.dom.style.display = "none";
+            Ext.ShadowPool.push(me.el);
+            delete me.el;
+        }
+    },
+
+    
+    setZIndex: function(z) {
+        this.zIndex = z;
+        if (this.el) {
+            this.el.setStyle("z-index", z);
+        }
+    },
+    
+    
+    setOpacity: function(opacity){
+        if (this.el) {
+            if (Ext.isIE && !Ext.supports.CSS3BoxShadow) {
+                opacity = Math.floor(opacity * 100 / 2) / 100;
+            }
+            this.opacity = opacity;
+            this.el.setOpacity(opacity);
+        }
+    }
+});
+
+Ext.define('Ext.button.Split', {
+
+    
+    alias: 'widget.splitbutton',
+
+    extend: 'Ext.button.Button',
+    alternateClassName: 'Ext.SplitButton',
+    
+    
+    
+    
+
+    
+    arrowCls      : 'split',
+    split         : true,
+
+    
+    initComponent : function(){
+        this.callParent();
+        
+        this.addEvents("arrowclick");
+    },
+
+    
+    setArrowHandler : function(handler, scope){
+        this.arrowHandler = handler;
+        this.scope = scope;
+    },
+
+    
+    onClick : function(e, t) {
+        var me = this;
+        
+        e.preventDefault();
+        if (!me.disabled) {
+            if (me.overMenuTrigger) {
+                me.maybeShowMenu();
+                me.fireEvent("arrowclick", me, e);
+                if (me.arrowHandler) {
+                    me.arrowHandler.call(me.scope || me, me, e);
+                }
+            } else {
+                me.doToggle();
+                me.fireHandler();
+            }
+        }
+    }
+});
+
+Ext.define('Ext.button.Cycle', {
+
+    
+
+    alias: 'widget.cycle',
+
+    extend: 'Ext.button.Split',
+    alternateClassName: 'Ext.CycleButton',
+
+    
+
+    
+    
+    
+    
+    
+    
+
+    
+    getButtonText: function(item) {
+        var me = this,
+            text = '';
+
+        if (item && me.showText === true) {
+            if (me.prependText) {
+                text += me.prependText;
+            }
+            text += item.text;
+            return text;
+        }
+        return me.text;
+    },
+
+    
+    setActiveItem: function(item, suppressEvent) {
+        var me = this;
+
+        if (!Ext.isObject(item)) {
+            item = me.menu.getComponent(item);
+        }
+        if (item) {
+            if (!me.rendered) {
+                me.text = me.getButtonText(item);
+                me.iconCls = item.iconCls;
+            } else {
+                me.setText(me.getButtonText(item));
+                me.setIconCls(item.iconCls);
+            }
+            me.activeItem = item;
+            if (!item.checked) {
+                item.setChecked(true, false);
+            }
+            if (me.forceIcon) {
+                me.setIconCls(me.forceIcon);
+            }
+            if (!suppressEvent) {
+                me.fireEvent('change', me, item);
+            }
+        }
+    },
+
+    
+    getActiveItem: function() {
+        return this.activeItem;
+    },
+
+    
+    initComponent: function() {
+        var me = this,
+            checked = 0,
+            items;
+
+        me.addEvents(
+            
+            "change"
+        );
+
+        if (me.changeHandler) {
+            me.on('change', me.changeHandler, me.scope || me);
+            delete me.changeHandler;
+        }
+
+        
+        
+        items = (me.menu.items||[]).concat(me.items||[]);
+        me.menu = Ext.applyIf({
+            cls: Ext.baseCSSPrefix + 'cycle-menu',
+            items: []
+        }, me.menu);
+
+        
+        Ext.each(items, function(item, i) {
+            item = Ext.applyIf({
+                group: me.id,
+                itemIndex: i,
+                checkHandler: me.checkHandler,
+                scope: me,
+                checked: item.checked || false
+            }, item);
+            me.menu.items.push(item);
+            if (item.checked) {
+                checked = i;
+            }
+        });
+        me.itemCount = me.menu.items.length;
+        me.callParent(arguments);
+        me.on('click', me.toggleSelected, me);
+        me.setActiveItem(checked, me);
+
+        
+        if (me.width && me.showText) {
+            me.addCls(Ext.baseCSSPrefix + 'cycle-fixed-width');
+        }
+    },
+
+    
+    checkHandler: function(item, pressed) {
+        if (pressed) {
+            this.setActiveItem(item);
+        }
+    },
+
+    
+    toggleSelected: function() {
+        var me = this,
+            m = me.menu,
+            checkItem;
+
+        checkItem = me.activeItem.next(':not([disabled])') || m.items.getAt(0);
+        checkItem.setChecked(true);
+    }
+});
+
+Ext.define('Ext.container.ButtonGroup', {
+    extend: 'Ext.panel.Panel',
+    alias: 'widget.buttongroup',
+    alternateClassName: 'Ext.ButtonGroup',
+
+    
+
+    
+    baseCls: Ext.baseCSSPrefix + 'btn-group',
+
+    
+    layout: {
+        type: 'table'
+    },
+
+    defaultType: 'button',
+
+    
+    frame: true,
+
+    frameHeader: false,
+
+    internalDefaults: {removeMode: 'container', hideParent: true},
+
+    initComponent : function(){
+        
+        var me = this,
+            cols = me.columns;
+
+        me.noTitleCls = me.baseCls + '-notitle';
+        if (cols) {
+            me.layout = Ext.apply({}, {columns: cols}, me.layout);
+        }
+
+        if (!me.title) {
+            me.addCls(me.noTitleCls);
+        }
+        me.callParent(arguments);
+    },
+
+    afterLayout: function() {
+        var me = this;
+
+        me.callParent(arguments);
+
+        
+        
+        if (me.layout.table && (Ext.isIEQuirks || Ext.isIE6) && !me.width) {
+            var t = me.getTargetEl();
+            t.setWidth(me.layout.table.offsetWidth + t.getPadding('lr'));
+        }
+
+        
+        if (Ext.isIE7) {
+            me.el.repaint();
+        }
+    },
+
+    afterRender: function() {
+        var me = this;
+
+        
+        if (me.header) {
+            
+            delete me.header.items.items[0].flex;
+
+            
+            me.suspendLayout = true;
+            me.header.insert(1, {
+                xtype: 'component',
+                ui   : me.ui,
+                flex : 1
+            });
+            me.header.insert(0, {
+                xtype: 'component',
+                ui   : me.ui,
+                flex : 1
+            });
+            me.suspendLayout = false;
+        }
+
+        me.callParent(arguments);
+    },
+
+    
+    onBeforeAdd: function(component) {
+        if (component.is('button')) {
+            component.ui = component.ui + '-toolbar';
+        }
+        this.callParent(arguments);
+    },
+
+    
+    applyDefaults: function(c) {
+        if (!Ext.isString(c)) {
+            c = this.callParent(arguments);
+            var d = this.internalDefaults;
+            if (c.events) {
+                Ext.applyIf(c.initialConfig, d);
+                Ext.apply(c, d);
+            } else {
+                Ext.applyIf(c, d);
+            }
+        }
+        return c;
+    }
+
+    
+    
+    
+    
+    
+});
+
+
+Ext.define('Ext.container.Viewport', {
+    extend: 'Ext.container.Container',
+    alias: 'widget.viewport',
+    requires: ['Ext.EventManager'],
+    alternateClassName: 'Ext.Viewport',
+
+    
+    
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    isViewport: true,
+
+    ariaRole: 'application',
+
+    initComponent : function() {
+        var me = this,
+            html = Ext.fly(document.body.parentNode),
+            el;
+        me.callParent(arguments);
+        html.addCls(Ext.baseCSSPrefix + 'viewport');
+        if (me.autoScroll) {
+            html.setStyle('overflow', 'auto');
+        }
+        me.el = el = Ext.getBody();
+        el.setHeight = Ext.emptyFn;
+        el.setWidth = Ext.emptyFn;
+        el.setSize = Ext.emptyFn;
+        el.dom.scroll = 'no';
+        me.allowDomMove = false;
+        Ext.EventManager.onWindowResize(me.fireResize, me);
+        me.renderTo = me.el;
+        me.width = Ext.Element.getViewportWidth();
+        me.height = Ext.Element.getViewportHeight();
+    },
+
+    fireResize : function(w, h){
+        
+        this.setSize(w, h);
+    }
+});
+
+
+
+
+
+Ext.define('Ext.dd.DDTarget', {
+    extend: 'Ext.dd.DragDrop',
+
+    
+    constructor: function(id, sGroup, config) {
+        if (id) {
+            this.initTarget(id, sGroup, config);
+        }
+    },
+
+    
+    getDragEl: Ext.emptyFn,
+    
+    isValidHandleChild: Ext.emptyFn,
+    
+    startDrag: Ext.emptyFn,
+    
+    endDrag: Ext.emptyFn,
+    
+    onDrag: Ext.emptyFn,
+    
+    onDragDrop: Ext.emptyFn,
+    
+    onDragEnter: Ext.emptyFn,
+    
+    onDragOut: Ext.emptyFn,
+    
+    onDragOver: Ext.emptyFn,
+    
+    onInvalidDrop: Ext.emptyFn,
+    
+    onMouseDown: Ext.emptyFn,
+    
+    onMouseUp: Ext.emptyFn,
+    
+    setXConstraint: Ext.emptyFn,
+    
+    setYConstraint: Ext.emptyFn,
+    
+    resetConstraints: Ext.emptyFn,
+    
+    clearConstraints: Ext.emptyFn,
+    
+    clearTicks: Ext.emptyFn,
+    
+    setInitPosition: Ext.emptyFn,
+    
+    setDragElId: Ext.emptyFn,
+    
+    setHandleElId: Ext.emptyFn,
+    
+    setOuterHandleElId: Ext.emptyFn,
+    
+    addInvalidHandleClass: Ext.emptyFn,
+    
+    addInvalidHandleId: Ext.emptyFn,
+    
+    addInvalidHandleType: Ext.emptyFn,
+    
+    removeInvalidHandleClass: Ext.emptyFn,
+    
+    removeInvalidHandleId: Ext.emptyFn,
+    
+    removeInvalidHandleType: Ext.emptyFn,
+
+    toString: function() {
+        return ("DDTarget " + this.id);
+    }
+});
+
+Ext.define('Ext.dd.DragTracker', {
+
+    uses: ['Ext.util.Region'],
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    
+    active: false,
+
+    
+
+    
+    trackOver: false,
+
+    
+
+    
+
+    
+    tolerance: 5,
+
+    
+    autoStart: false,
+
+    
+
+    
+
+    
+
+    constructor : function(config){
+        Ext.apply(this, config);
+        this.addEvents(
+            
+            'mouseover',
+
+            
+            'mouseout',
+
+            
+            'mousedown',
+
+            
+            'mouseup',
+
+            
+            'mousemove',
+
+            
+            'beforedragstart',
+
+            
+            'dragstart',
+
+            
+            'dragend',
+
+            
+            'drag'
+        );
+
+        this.dragRegion = Ext.create('Ext.util.Region', 0,0,0,0);
+
+        if (this.el) {
+            this.initEl(this.el);
+        }
+
+        
+        this.mixins.observable.constructor.call(this);
+        if (this.disabled) {
+            this.disable();
+        }
+
+    },
+
+    
+    initEl: function(el) {
+        this.el = Ext.get(el);
+
+        
+        this.handle = Ext.get(this.delegate);
+
+        
+        this.delegate = this.handle ? undefined : this.delegate;
+
+        if (!this.handle) {
+            this.handle = this.el;
+        }
+
+        
+        
+        this.mon(this.handle, {
+            mousedown: this.onMouseDown,
+            delegate: this.delegate,
+            scope: this
+        });
+
+        
+        
+        
+        if (this.trackOver || this.overCls) {
+            this.mon(this.handle, {
+                mouseover: this.onMouseOver,
+                mouseout: this.onMouseOut,
+                delegate: this.delegate,
+                scope: this
+            });
+        }
+    },
+
+    disable: function() {
+        this.disabled = true;
+    },
+
+    enable: function() {
+        this.disabled = false;
+    },
+
+    destroy : function() {
+        this.clearListeners();
+        delete this.el;
+    },
+
+    
+    
+    onMouseOver: function(e, target) {
+        var me = this;
+        if (!me.disabled) {
+            if (Ext.EventManager.contains(e) || me.delegate) {
+                me.mouseIsOut = false;
+                if (me.overCls) {
+                    me.el.addCls(me.overCls);
+                }
+                me.fireEvent('mouseover', me, e, me.delegate ? e.getTarget(me.delegate, target) : me.handle);
+            }
+        }
+    },
+
+    
+    
+    onMouseOut: function(e) {
+        if (this.mouseIsDown) {
+            this.mouseIsOut = true;
+        } else {
+            if (this.overCls) {
+                this.el.removeCls(this.overCls);
+            }
+            this.fireEvent('mouseout', this, e);
+        }
+    },
+
+    onMouseDown: function(e, target){
+        
+        if (this.disabled ||e.dragTracked) {
+            return;
+        }
+
+        
+        this.dragTarget = this.delegate ? target : this.handle.dom;
+        this.startXY = this.lastXY = e.getXY();
+        this.startRegion = Ext.fly(this.dragTarget).getRegion();
+
+        if (this.fireEvent('mousedown', this, e) === false ||
+            this.fireEvent('beforedragstart', this, e) === false ||
+            this.onBeforeStart(e) === false) {
+            return;
+        }
+
+        
+        
+        this.mouseIsDown = true;
+
+        
+        e.dragTracked = true;
+
+        if (this.preventDefault !== false) {
+            e.preventDefault();
+        }
+        Ext.getDoc().on({
+            scope: this,
+            mouseup: this.onMouseUp,
+            mousemove: this.onMouseMove,
+            selectstart: this.stopSelect
+        });
+        if (this.autoStart) {
+            this.timer =  Ext.defer(this.triggerStart, this.autoStart === true ? 1000 : this.autoStart, this, [e]);
+        }
+    },
+
+    onMouseMove: function(e, target){
+        
+        
+        if (this.active && Ext.isIE && !e.browserEvent.button) {
+            e.preventDefault();
+            this.onMouseUp(e);
+            return;
+        }
+
+        e.preventDefault();
+        var xy = e.getXY(),
+            s = this.startXY;
+
+        this.lastXY = xy;
+        if (!this.active) {
+            if (Math.max(Math.abs(s[0]-xy[0]), Math.abs(s[1]-xy[1])) > this.tolerance) {
+                this.triggerStart(e);
+            } else {
+                return;
+            }
+        }
+
+        
+        if (this.fireEvent('mousemove', this, e) === false) {
+            this.onMouseUp(e);
+        } else {
+            this.onDrag(e);
+            this.fireEvent('drag', this, e);
+        }
+    },
+
+    onMouseUp: function(e) {
+        
+        
+        this.mouseIsDown = false;
+
+        
+        if (this.mouseIsOut) {
+            this.mouseIsOut = false;
+            this.onMouseOut(e);
+        }
+        e.preventDefault();
+        this.fireEvent('mouseup', this, e);
+        this.endDrag(e);
+    },
+
+    
+    endDrag: function(e) {
+        var doc = Ext.getDoc(),
+        wasActive = this.active;
+
+        doc.un('mousemove', this.onMouseMove, this);
+        doc.un('mouseup', this.onMouseUp, this);
+        doc.un('selectstart', this.stopSelect, this);
+        this.clearStart();
+        this.active = false;
+        if (wasActive) {
+            this.onEnd(e);
+            this.fireEvent('dragend', this, e);
+        }
+        
+        delete this._constrainRegion;
+
+        
+        delete Ext.EventObject.dragTracked;
+    },
+
+    triggerStart: function(e) {
+        this.clearStart();
+        this.active = true;
+        this.onStart(e);
+        this.fireEvent('dragstart', this, e);
+    },
+
+    clearStart : function() {
+        if (this.timer) {
+            clearTimeout(this.timer);
+            delete this.timer;
+        }
+    },
+
+    stopSelect : function(e) {
+        e.stopEvent();
+        return false;
+    },
+
+    
+    onBeforeStart : function(e) {
+
+    },
+
+    
+    onStart : function(xy) {
+
+    },
+
+    
+    onDrag : function(e) {
+
+    },
+
+    
+    onEnd : function(e) {
+
+    },
+
+    
+    getDragTarget : function(){
+        return this.dragTarget;
+    },
+
+    
+    getDragCt : function(){
+        return this.el;
+    },
+
+    
+    getConstrainRegion: function() {
+        if (this.constrainTo) {
+            if (this.constrainTo instanceof Ext.util.Region) {
+                return this.constrainTo;
+            }
+            if (!this._constrainRegion) {
+                this._constrainRegion = Ext.fly(this.constrainTo).getViewRegion();
+            }
+        } else {
+            if (!this._constrainRegion) {
+                this._constrainRegion = this.getDragCt().getViewRegion();
+            }
+        }
+        return this._constrainRegion;
+    },
+
+    getXY : function(constrain){
+        return constrain ? this.constrainModes[constrain](this, this.lastXY) : this.lastXY;
+    },
+
+    
+    getOffset : function(constrain){
+        var xy = this.getXY(constrain),
+            s = this.startXY;
+
+        return [xy[0]-s[0], xy[1]-s[1]];
+    },
+
+    constrainModes: {
+        
+        point: function(me, xy) {
+            var dr = me.dragRegion,
+                constrainTo = me.getConstrainRegion();
+
+            
+            if (!constrainTo) {
+                return xy;
+            }
+
+            dr.x = dr.left = dr[0] = dr.right = xy[0];
+            dr.y = dr.top = dr[1] = dr.bottom = xy[1];
+            dr.constrainTo(constrainTo);
+
+            return [dr.left, dr.top];
+        },
+
+        
+        dragTarget: function(me, xy) {
+            var s = me.startXY,
+                dr = me.startRegion.copy(),
+                constrainTo = me.getConstrainRegion(),
+                adjust;
+
+            
+            if (!constrainTo) {
+                return xy;
+            }
+
+            
+            
+            
+            dr.translateBy(xy[0]-s[0], xy[1]-s[1]);
+
+            
+            if (dr.right > constrainTo.right) {
+                xy[0] += adjust = (constrainTo.right - dr.right);    
+                dr.left += adjust;
+            }
+            if (dr.left < constrainTo.left) {
+                xy[0] += (constrainTo.left - dr.left);      
+            }
+
+            
+            if (dr.bottom > constrainTo.bottom) {
+                xy[1] += adjust = (constrainTo.bottom - dr.bottom);  
+                dr.top += adjust;
+            }
+            if (dr.top < constrainTo.top) {
+                xy[1] += (constrainTo.top - dr.top);        
+            }
+            return xy;
+        }
+    }
+});
+
+Ext.define('Ext.dd.DragZone', {
+
+    extend: 'Ext.dd.DragSource',
+
+    
+    constructor : function(el, config){
+        this.callParent([el, config]);
+        if (this.containerScroll) {
+            Ext.dd.ScrollManager.register(this.el);
+        }
+    },
+
+    
+
+    
+
+    
+    getDragData : function(e){
+        return Ext.dd.Registry.getHandleFromEvent(e);
+    },
+
+    
+    onInitDrag : function(x, y){
+        this.proxy.update(this.dragData.ddel.cloneNode(true));
+        this.onStartDrag(x, y);
+        return true;
+    },
+
+    
+    afterRepair : function(){
+        var me = this;
+        if (Ext.enableFx) {
+            Ext.fly(me.dragData.ddel).highlight(me.repairHighlightColor);
+        }
+        me.dragging = false;
+    },
+
+    
+    getRepairXY : function(e){
+        return Ext.Element.fly(this.dragData.ddel).getXY();
+    },
+
+    destroy : function(){
+        this.callParent();
+        if (this.containerScroll) {
+            Ext.dd.ScrollManager.unregister(this.el);
+        }
+    }
+});
+
+
+Ext.define('Ext.dd.ScrollManager', {
+    singleton: true,
+    requires: [
+        'Ext.dd.DragDropManager'
+    ],
+
+    constructor: function() {
+        var ddm = Ext.dd.DragDropManager;
+        ddm.fireEvents = Ext.Function.createSequence(ddm.fireEvents, this.onFire, this);
+        ddm.stopDrag = Ext.Function.createSequence(ddm.stopDrag, this.onStop, this);
+        this.doScroll = Ext.Function.bind(this.doScroll, this);
+        this.ddmInstance = ddm;
+        this.els = {};
+        this.dragEl = null;
+        this.proc = {};
+    },
+
+    onStop: function(e){
+        var sm = Ext.dd.ScrollManager;
+        sm.dragEl = null;
+        sm.clearProc();
+    },
+
+    triggerRefresh: function() {
+        if (this.ddmInstance.dragCurrent) {
+            this.ddmInstance.refreshCache(this.ddmInstance.dragCurrent.groups);
+        }
+    },
+
+    doScroll: function() {
+        if (this.ddmInstance.dragCurrent) {
+            var proc   = this.proc,
+                procEl = proc.el,
+                ddScrollConfig = proc.el.ddScrollConfig,
+                inc = ddScrollConfig ? ddScrollConfig.increment : this.increment;
+
+            if (!this.animate) {
+                if (procEl.scroll(proc.dir, inc)) {
+                    this.triggerRefresh();
+                }
+            } else {
+                procEl.scroll(proc.dir, inc, true, this.animDuration, this.triggerRefresh);
+            }
+        }
+    },
+
+    clearProc: function() {
+        var proc = this.proc;
+        if (proc.id) {
+            clearInterval(proc.id);
+        }
+        proc.id = 0;
+        proc.el = null;
+        proc.dir = "";
+    },
+
+    startProc: function(el, dir) {
+        this.clearProc();
+        this.proc.el = el;
+        this.proc.dir = dir;
+        var group = el.ddScrollConfig ? el.ddScrollConfig.ddGroup : undefined,
+            freq  = (el.ddScrollConfig && el.ddScrollConfig.frequency)
+                  ? el.ddScrollConfig.frequency
+                  : this.frequency;
+
+        if (group === undefined || this.ddmInstance.dragCurrent.ddGroup == group) {
+            this.proc.id = setInterval(this.doScroll, freq);
+        }
+    },
+
+    onFire: function(e, isDrop) {
+        if (isDrop || !this.ddmInstance.dragCurrent) {
+            return;
+        }
+        if (!this.dragEl || this.dragEl != this.ddmInstance.dragCurrent) {
+            this.dragEl = this.ddmInstance.dragCurrent;
+            
+            this.refreshCache();
+        }
+
+        var xy = e.getXY(),
+            pt = e.getPoint(),
+            proc = this.proc,
+            els = this.els;
+
+        for (var id in els) {
+            var el = els[id], r = el._region;
+            var c = el.ddScrollConfig ? el.ddScrollConfig : this;
+            if (r && r.contains(pt) && el.isScrollable()) {
+                if (r.bottom - pt.y <= c.vthresh) {
+                    if(proc.el != el){
+                        this.startProc(el, "down");
+                    }
+                    return;
+                }else if (r.right - pt.x <= c.hthresh) {
+                    if (proc.el != el) {
+                        this.startProc(el, "left");
+                    }
+                    return;
+                } else if(pt.y - r.top <= c.vthresh) {
+                    if (proc.el != el) {
+                        this.startProc(el, "up");
+                    }
+                    return;
+                } else if(pt.x - r.left <= c.hthresh) {
+                    if (proc.el != el) {
+                        this.startProc(el, "right");
+                    }
+                    return;
+                }
+            }
+        }
+        this.clearProc();
+    },
+
+    
+    register : function(el){
+        if (Ext.isArray(el)) {
+            for(var i = 0, len = el.length; i < len; i++) {
+                    this.register(el[i]);
+            }
+        } else {
+            el = Ext.get(el);
+            this.els[el.id] = el;
+        }
+    },
+
+    
+    unregister : function(el){
+        if(Ext.isArray(el)){
+            for (var i = 0, len = el.length; i < len; i++) {
+                this.unregister(el[i]);
+            }
+        }else{
+            el = Ext.get(el);
+            delete this.els[el.id];
+        }
+    },
+
+    
+    vthresh : 25,
+    
+    hthresh : 25,
+
+    
+    increment : 100,
+
+    
+    frequency : 500,
+
+    
+    animate: true,
+
+    
+    animDuration: 0.4,
+
+    
+    ddGroup: undefined,
+
+    
+    refreshCache : function(){
+        var els = this.els,
+            id;
+        for (id in els) {
+            if(typeof els[id] == 'object'){ 
+                els[id]._region = els[id].getRegion();
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.dd.DropTarget', {
+    extend: 'Ext.dd.DDTarget',
+    requires: ['Ext.dd.ScrollManager'],
+
+    
+    constructor : function(el, config){
+        this.el = Ext.get(el);
+
+        Ext.apply(this, config);
+
+        if(this.containerScroll){
+            Ext.dd.ScrollManager.register(this.el);
+        }
+
+        this.callParent([this.el.dom, this.ddGroup || this.group,
+              {isTarget: true}]);
+    },
+
+    
+    
+    
+    dropAllowed : Ext.baseCSSPrefix + 'dd-drop-ok',
+    
+    dropNotAllowed : Ext.baseCSSPrefix + 'dd-drop-nodrop',
+
+    
+    isTarget : true,
+
+    
+    isNotifyTarget : true,
+
+    
+    notifyEnter : function(dd, e, data){
+        if(this.overClass){
+            this.el.addCls(this.overClass);
+        }
+        return this.dropAllowed;
+    },
+
+    
+    notifyOver : function(dd, e, data){
+        return this.dropAllowed;
+    },
+
+    
+    notifyOut : function(dd, e, data){
+        if(this.overClass){
+            this.el.removeCls(this.overClass);
+        }
+    },
+
+    
+    notifyDrop : function(dd, e, data){
+        return false;
+    },
+
+    destroy : function(){
+        this.callParent();
+        if(this.containerScroll){
+            Ext.dd.ScrollManager.unregister(this.el);
+        }
+    }
+});
+
+
+Ext.define('Ext.dd.Registry', {
+    singleton: true,
+    constructor: function() {
+        this.elements = {}; 
+        this.handles = {}; 
+        this.autoIdSeed = 0;
+    },
+    
+    getId: function(el, autogen){
+        if(typeof el == "string"){
+            return el;
+        }
+        var id = el.id;
+        if(!id && autogen !== false){
+            id = "extdd-" + (++this.autoIdSeed);
+            el.id = id;
+        }
+        return id;
+    },
+    
+    
+    register : function(el, data){
+        data = data || {};
+        if (typeof el == "string") {
+            el = document.getElementById(el);
+        }
+        data.ddel = el;
+        this.elements[this.getId(el)] = data;
+        if (data.isHandle !== false) {
+            this.handles[data.ddel.id] = data;
+        }
+        if (data.handles) {
+            var hs = data.handles;
+            for (var i = 0, len = hs.length; i < len; i++) {
+                this.handles[this.getId(hs[i])] = data;
+            }
+        }
+    },
+
+    
+    unregister : function(el){
+        var id = this.getId(el, false);
+        var data = this.elements[id];
+        if(data){
+            delete this.elements[id];
+            if(data.handles){
+                var hs = data.handles;
+                for (var i = 0, len = hs.length; i < len; i++) {
+                    delete this.handles[this.getId(hs[i], false)];
+                }
+            }
+        }
+    },
+
+    
+    getHandle : function(id){
+        if(typeof id != "string"){ 
+            id = id.id;
+        }
+        return this.handles[id];
+    },
+
+    
+    getHandleFromEvent : function(e){
+        var t = e.getTarget();
+        return t ? this.handles[t.id] : null;
+    },
+
+    
+    getTarget : function(id){
+        if(typeof id != "string"){ 
+            id = id.id;
+        }
+        return this.elements[id];
+    },
+
+    
+    getTargetFromEvent : function(e){
+        var t = e.getTarget();
+        return t ? this.elements[t.id] || this.handles[t.id] : null;
+    }
+});
+
+Ext.define('Ext.dd.DropZone', {
+    extend: 'Ext.dd.DropTarget',
+    requires: ['Ext.dd.Registry'],
+
+    
+    getTargetFromEvent : function(e){
+        return Ext.dd.Registry.getTargetFromEvent(e);
+    },
+
+    
+    onNodeEnter : function(n, dd, e, data){
+        
+    },
+
+    
+    onNodeOver : function(n, dd, e, data){
+        return this.dropAllowed;
+    },
+
+    
+    onNodeOut : function(n, dd, e, data){
+        
+    },
+
+    
+    onNodeDrop : function(n, dd, e, data){
+        return false;
+    },
+
+    
+    onContainerOver : function(dd, e, data){
+        return this.dropNotAllowed;
+    },
+
+    
+    onContainerDrop : function(dd, e, data){
+        return false;
+    },
+
+    
+    notifyEnter : function(dd, e, data){
+        return this.dropNotAllowed;
+    },
+
+    
+    notifyOver : function(dd, e, data){
+        var n = this.getTargetFromEvent(e);
+        if(!n) { 
+            if(this.lastOverNode){
+                this.onNodeOut(this.lastOverNode, dd, e, data);
+                this.lastOverNode = null;
+            }
+            return this.onContainerOver(dd, e, data);
+        }
+        if(this.lastOverNode != n){
+            if(this.lastOverNode){
+                this.onNodeOut(this.lastOverNode, dd, e, data);
+            }
+            this.onNodeEnter(n, dd, e, data);
+            this.lastOverNode = n;
+        }
+        return this.onNodeOver(n, dd, e, data);
+    },
+
+    
+    notifyOut : function(dd, e, data){
+        if(this.lastOverNode){
+            this.onNodeOut(this.lastOverNode, dd, e, data);
+            this.lastOverNode = null;
+        }
+    },
+
+    
+    notifyDrop : function(dd, e, data){
+        if(this.lastOverNode){
+            this.onNodeOut(this.lastOverNode, dd, e, data);
+            this.lastOverNode = null;
+        }
+        var n = this.getTargetFromEvent(e);
+        return n ?
+            this.onNodeDrop(n, dd, e, data) :
+            this.onContainerDrop(dd, e, data);
+    },
+
+    
+    triggerCacheRefresh : function() {
+        Ext.dd.DDM.refreshCache(this.groups);
+    }
+});
+
+Ext.define('Ext.flash.Component', {
+    extend: 'Ext.Component',
+    alternateClassName: 'Ext.FlashComponent',
+    alias: 'widget.flash',
+
+    
+    flashVersion : '9.0.115',
+
+    
+    backgroundColor: '#ffffff',
+
+    
+    wmode: 'opaque',
+
+    
+
+    
+
+    
+
+    
+
+    
+    swfWidth: '100%',
+
+    
+    swfHeight: '100%',
+
+    
+    expressInstall: false,
+
+    
+
+    
+    renderTpl: ['<div id="{swfId}"></div>'],
+
+    initComponent: function() {
+
+        this.callParent();
+        this.addEvents(
+            
+            'success',
+
+            
+            'failure'
+        );
+    },
+
+    onRender: function() {
+        var me = this,
+            params, vars, undef,
+            swfId = me.getSwfId();
+
+        me.renderData.swfId = swfId;
+
+        me.callParent(arguments);
+
+        params = Ext.apply({
+            allowScriptAccess: 'always',
+            bgcolor: me.backgroundColor,
+            wmode: me.wmode
+        }, me.flashParams);
+
+        vars = Ext.apply({
+            allowedDomain: document.location.hostname
+        }, me.flashVars);
+
+        new swfobject.embedSWF(
+            me.url,
+            swfId,
+            me.swfWidth,
+            me.swfHeight,
+            me.flashVersion,
+            me.expressInstall ? me.statics.EXPRESS_INSTALL_URL : undef,
+            vars,
+            params,
+            me.flashAttributes,
+            Ext.bind(me.swfCallback, me)
+        );
+    },
+
+    
+    swfCallback: function(e) {
+        var me = this;
+        if (e.success) {
+            me.swf = Ext.get(e.ref);
+            me.onSuccess();
+            me.fireEvent('success', me);
+        } else {
+            me.onFailure();
+            me.fireEvent('failure', me);
+        }
+    },
+
+    
+    getSwfId: function() {
+        return this.swfId || (this.swfId = "extswf" + this.getAutoId());
+    },
+
+    onSuccess: function() {
+        
+        
+        this.swf.setStyle('visibility', 'inherit');
+    },
+
+    onFailure: Ext.emptyFn,
+
+    beforeDestroy: function() {
+        var me = this,
+            swf = me.swf;
+        if (swf) {
+            swfobject.removeSWF(me.getSwfId());
+            Ext.destroy(swf);
+            delete me.swf;
+        }
+        me.callParent();
+    },
+
+    statics: {
+        
+        EXPRESS_INSTALL_URL: 'http:/' + '/swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf'
+    }
+});
+
+
+Ext.define('Ext.form.action.Action', {
+    alternateClassName: 'Ext.form.Action',
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    submitEmptyText : true,
+    
+
+    
+
+    
+
+    
+
+    
+    constructor: function(config) {
+        if (config) {
+            Ext.apply(this, config);
+        }
+
+        
+        var params = config.params;
+        if (Ext.isString(params)) {
+            this.params = Ext.Object.fromQueryString(params);
+        }
+    },
+
+    
+    run: Ext.emptyFn,
+
+    
+
+    
+
+    
+    onFailure : function(response){
+        this.response = response;
+        this.failureType = Ext.form.action.Action.CONNECT_FAILURE;
+        this.form.afterAction(this, false);
+    },
+
+    
+    processResponse : function(response){
+        this.response = response;
+        if (!response.responseText && !response.responseXML) {
+            return true;
+        }
+        return (this.result = this.handleResponse(response));
+    },
+
+    
+    getUrl: function() {
+        return this.url || this.form.url;
+    },
+
+    
+    getMethod: function() {
+        return (this.method || this.form.method || 'POST').toUpperCase();
+    },
+
+    
+    getParams: function() {
+        return Ext.apply({}, this.params, this.form.baseParams);
+    },
+
+    
+    createCallback: function() {
+        var me = this,
+            undef,
+            form = me.form;
+        return {
+            success: me.onSuccess,
+            failure: me.onFailure,
+            scope: me,
+            timeout: (this.timeout * 1000) || (form.timeout * 1000),
+            upload: form.fileUpload ? me.onSuccess : undef
+        };
+    },
+
+    statics: {
+        
+        CLIENT_INVALID: 'client',
+
+        
+        SERVER_INVALID: 'server',
+
+        
+        CONNECT_FAILURE: 'connect',
+
+        
+        LOAD_FAILURE: 'load'
+
+
+    }
+});
+
+
+Ext.define('Ext.form.action.Submit', {
+    extend:'Ext.form.action.Action',
+    alternateClassName: 'Ext.form.Action.Submit',
+    alias: 'formaction.submit',
+
+    type: 'submit',
+
+    
+
+    
+    run : function(){
+        var form = this.form;
+        if (this.clientValidation === false || form.isValid()) {
+            this.doSubmit();
+        } else {
+            
+            this.failureType = Ext.form.action.Action.CLIENT_INVALID;
+            form.afterAction(this, false);
+        }
+    },
+
+    
+    doSubmit: function() {
+        var formEl,
+            ajaxOptions = Ext.apply(this.createCallback(), {
+                url: this.getUrl(),
+                method: this.getMethod(),
+                headers: this.headers
+            });
+
+        
+        
+        if (this.form.hasUpload()) {
+            formEl = ajaxOptions.form = this.buildForm();
+            ajaxOptions.isUpload = true;
+        } else {
+            ajaxOptions.params = this.getParams();
+        }
+
+        Ext.Ajax.request(ajaxOptions);
+
+        if (formEl) {
+            Ext.removeNode(formEl);
+        }
+    },
+
+    
+    getParams: function() {
+        var nope = false,
+            configParams = this.callParent(),
+            fieldParams = this.form.getValues(nope, nope, this.submitEmptyText !== nope);
+        return Ext.apply({}, fieldParams, configParams);
+    },
+
+    
+    buildForm: function() {
+        var fieldsSpec = [],
+            formSpec,
+            formEl,
+            basicForm = this.form,
+            params = this.getParams(),
+            uploadFields = [];
+
+        basicForm.getFields().each(function(field) {
+            if (field.isFileUpload()) {
+                uploadFields.push(field);
+            }
+        });
+
+        function addField(name, val) {
+            fieldsSpec.push({
+                tag: 'input',
+                type: 'hidden',
+                name: name,
+                value: Ext.String.htmlEncode(val)
+            });
+        }
+
+        
+        Ext.iterate(params, function(key, val) {
+            if (Ext.isArray(val)) {
+                Ext.each(val, function(v) {
+                    addField(key, v);
+                });
+            } else {
+                addField(key, val);
+            }
+        });
+
+        formSpec = {
+            tag: 'form',
+            action: this.getUrl(),
+            method: this.getMethod(),
+            target: this.target || '_self',
+            style: 'display:none',
+            cn: fieldsSpec
+        };
+
+        
+        if (uploadFields.length) {
+            formSpec.encoding = formSpec.enctype = 'multipart/form-data';
+        }
+
+        
+        formEl = Ext.DomHelper.append(Ext.getBody(), formSpec);
+
+        
+        
+        
+        Ext.Array.each(uploadFields, function(field) {
+            if (field.rendered) { 
+                formEl.appendChild(field.extractFileInput());
+            }
+        });
+
+        return formEl;
+    },
+
+
+
+    
+    onSuccess: function(response) {
+        var form = this.form,
+            success = true,
+            result = this.processResponse(response);
+        if (result !== true && !result.success) {
+            if (result.errors) {
+                form.markInvalid(result.errors);
+            }
+            this.failureType = Ext.form.action.Action.SERVER_INVALID;
+            success = false;
+        }
+        form.afterAction(this, success);
+    },
+
+    
+    handleResponse: function(response) {
+        var form = this.form,
+            errorReader = form.errorReader,
+            rs, errors, i, len, records;
+        if (errorReader) {
+            rs = errorReader.read(response);
+            records = rs.records;
+            errors = [];
+            if (records) {
+                for(i = 0, len = records.length; i < len; i++) {
+                    errors[i] = records[i].data;
+                }
+            }
+            if (errors.length < 1) {
+                errors = null;
+            }
+            return {
+                success : rs.success,
+                errors : errors
+            };
+        }
+        return Ext.decode(response.responseText);
+    }
+});
+
+
+Ext.define('Ext.util.ComponentDragger', {
+
+    
+
+    
+
+    
+
+    extend: 'Ext.dd.DragTracker',
+
+    autoStart: 500,
+
+    
+    constructor: function(comp, config) {
+        this.comp = comp;
+        this.initialConstrainTo = config.constrainTo;
+        this.callParent([ config ]);
+    },
+
+    onStart: function(e) {
+        var me = this,
+            comp = me.comp;
+
+        
+        this.startPosition = comp.getPosition();
+
+        
+        
+        if (comp.ghost && !comp.liveDrag) {
+             me.proxy = comp.ghost();
+             me.dragTarget = me.proxy.header.el;
+        }
+
+        
+        if (me.constrain || me.constrainDelegate) {
+            me.constrainTo = me.calculateConstrainRegion();
+        }
+    },
+
+    calculateConstrainRegion: function() {
+        var me = this,
+            comp = me.comp,
+            c = me.initialConstrainTo,
+            delegateRegion,
+            elRegion,
+            shadowSize = comp.el.shadow ? comp.el.shadow.offset : 0;
+
+        
+        if (!(c instanceof Ext.util.Region)) {
+            c =  Ext.fly(c).getViewRegion();
+        }
+
+        
+        if (shadowSize) {
+            c.adjust(0, -shadowSize, -shadowSize, shadowSize);
+        }
+
+        
+        
+        
+        if (!me.constrainDelegate) {
+            delegateRegion = Ext.fly(me.dragTarget).getRegion();
+            elRegion = me.proxy ? me.proxy.el.getRegion() : comp.el.getRegion();
+
+            c.adjust(
+                delegateRegion.top - elRegion.top,
+                delegateRegion.right - elRegion.right,
+                delegateRegion.bottom - elRegion.bottom,
+                delegateRegion.left - elRegion.left
+            );
+        }
+        return c;
+    },
+
+    
+    onDrag: function(e) {
+        var me = this,
+            comp = (me.proxy && !me.comp.liveDrag) ? me.proxy : me.comp,
+            offset = me.getOffset(me.constrain || me.constrainDelegate ? 'dragTarget' : null);
+
+        comp.setPosition(me.startPosition[0] + offset[0], me.startPosition[1] + offset[1]);
+    },
+
+    onEnd: function(e) {
+        if (this.proxy && !this.comp.liveDrag) {
+            this.comp.unghost();
+        }
+    }
+});
+
+Ext.define("Ext.form.Labelable", {
+    requires: ['Ext.XTemplate'],
+
+    
+    labelableRenderTpl: [
+        '<tpl if="!hideLabel && !(!fieldLabel && hideEmptyLabel)">',
+            '<label id="{id}-labelEl"<tpl if="inputId"> for="{inputId}"</tpl> class="{labelCls}"',
+                '<tpl if="labelStyle"> style="{labelStyle}"</tpl>>',
+                '<tpl if="fieldLabel">{fieldLabel}{labelSeparator}</tpl>',
+            '</label>',
+        '</tpl>',
+        '<div class="{baseBodyCls} {fieldBodyCls}" id="{id}-bodyEl" role="presentation">{subTplMarkup}</div>',
+        '<div id="{id}-errorEl" class="{errorMsgCls}" style="display:none"></div>',
+        '<div class="{clearCls}" role="presentation"><!-- --></div>',
+        {
+            compiled: true,
+            disableFormats: true
+        }
+    ],
+
+    
+    activeErrorsTpl: [
+        '<tpl if="errors && errors.length">',
+            '<ul><tpl for="errors"><li<tpl if="xindex == xcount"> class="last"</tpl>>{.}</li></tpl></ul>',
+        '</tpl>'
+    ],
+
+    
+    isFieldLabelable: true,
+
+    
+    formItemCls: Ext.baseCSSPrefix + 'form-item',
+
+    
+    labelCls: Ext.baseCSSPrefix + 'form-item-label',
+
+    
+
+    
+    errorMsgCls: Ext.baseCSSPrefix + 'form-error-msg',
+
+    
+    baseBodyCls: Ext.baseCSSPrefix + 'form-item-body',
+
+    
+    fieldBodyCls: '',
+
+    
+    clearCls: Ext.baseCSSPrefix + 'clear',
+
+    
+    invalidCls : Ext.baseCSSPrefix + 'form-invalid',
+
+    
+    fieldLabel: undefined,
+
+    
+    labelAlign : 'left',
+
+    
+    labelWidth: 100,
+
+    
+    labelPad : 5,
+
+    
+    labelSeparator : ':',
+
+    
+
+    
+    hideLabel: false,
+
+    
+    hideEmptyLabel: true,
+
+    
+    preventMark: false,
+
+    
+    autoFitErrors: true,
+
+    
+    msgTarget: 'qtip',
+
+    
+
+
+    
+    initLabelable: function() {
+        this.addCls(this.formItemCls);
+
+        this.addEvents(
+            
+            'errorchange'
+        );
+    },
+
+    
+    getFieldLabel: function() {
+        return this.fieldLabel || '';
+    },
+
+    
+    getLabelableRenderData: function() {
+        var me = this,
+            labelAlign = me.labelAlign,
+            labelCls = me.labelCls,
+            labelClsExtra = me.labelClsExtra,
+            labelPad = me.labelPad,
+            labelStyle;
+
+        
+        
+        if (labelAlign === 'top') {
+            labelStyle = 'margin-bottom:' + labelPad + 'px;';
+        } else {
+            labelStyle = 'margin-right:' + labelPad + 'px;';
+            
+            if (Ext.isBorderBox) {
+                labelStyle += 'width:' + me.labelWidth + 'px;';
+            }
+        }
+
+        return Ext.copyTo(
+            {
+                inputId: me.getInputId(),
+                fieldLabel: me.getFieldLabel(),
+                labelCls: labelClsExtra ? labelCls + ' ' + labelClsExtra : labelCls,
+                labelStyle: labelStyle + (me.labelStyle || ''),
+                subTplMarkup: me.getSubTplMarkup()
+            },
+            me,
+            'hideLabel,hideEmptyLabel,fieldBodyCls,baseBodyCls,errorMsgCls,clearCls,labelSeparator',
+            true
+        );
+    },
+
+    onLabelableRender: function () {
+        this.addChildEls(
+            
+            'labelEl',
+
+            
+            'bodyEl',
+
+            
+            'errorEl'
+        );
+    },
+
+    
+    getSubTplMarkup: function() {
+        return '';
+    },
+
+    
+    getInputId: function() {
+        return '';
+    },
+
+    
+    getActiveError : function() {
+        return this.activeError || '';
+    },
+
+    
+    hasActiveError: function() {
+        return !!this.getActiveError();
+    },
+
+    
+    setActiveError: function(msg) {
+        this.activeError = msg;
+        this.activeErrors = [msg];
+        this.renderActiveError();
+    },
+
+    
+    getActiveErrors: function() {
+        return this.activeErrors || [];
+    },
+
+    
+    setActiveErrors: function(errors) {
+        this.activeErrors = errors;
+        this.activeError = this.getTpl('activeErrorsTpl').apply({errors: errors});
+        this.renderActiveError();
+    },
+
+    
+    unsetActiveError: function() {
+        delete this.activeError;
+        delete this.activeErrors;
+        this.renderActiveError();
+    },
+
+    
+    renderActiveError: function() {
+        var me = this,
+            activeError = me.getActiveError(),
+            hasError = !!activeError;
+
+        if (activeError !== me.lastActiveError) {
+            me.fireEvent('errorchange', me, activeError);
+            me.lastActiveError = activeError;
+        }
+
+        if (me.rendered && !me.isDestroyed && !me.preventMark) {
+            
+            me.el[hasError ? 'addCls' : 'removeCls'](me.invalidCls);
+
+            
+            me.getActionEl().dom.setAttribute('aria-invalid', hasError);
+
+            
+            me.errorEl.dom.innerHTML = activeError;
+        }
+    },
+
+    
+    setFieldDefaults: function(defaults) {
+        var me = this;
+        Ext.iterate(defaults, function(key, val) {
+            if (!me.hasOwnProperty(key)) {
+                me[key] = val;
+            }
+        });
+    },
+
+    
+    getBodyNaturalWidth: function() {
+        return this.bodyEl.getWidth();
+    }
+
+});
+
+
+Ext.define('Ext.form.field.Field', {
+    
+    isFormField : true,
+
+    
+
+    
+
+    
+    disabled : false,
+
+    
+    submitValue: true,
+
+    
+    validateOnChange: true,
+
+    
+    suspendCheckChange: 0,
+
+    
+    initField: function() {
+        this.addEvents(
+            
+            'change',
+            
+            'validitychange',
+            
+            'dirtychange'
+        );
+
+        this.initValue();
+    },
+
+    
+    initValue: function() {
+        var me = this;
+
+        
+        me.originalValue = me.lastValue = me.value;
+
+        
+        me.suspendCheckChange++;
+        me.setValue(me.value);
+        me.suspendCheckChange--;
+    },
+
+    
+    getName: function() {
+        return this.name;
+    },
+
+    
+    getValue: function() {
+        return this.value;
+    },
+
+    
+    setValue: function(value) {
+        var me = this;
+        me.value = value;
+        me.checkChange();
+        return me;
+    },
+
+    
+    isEqual: function(value1, value2) {
+        return String(value1) === String(value2);
+    },
+    
+    
+    isEqualAsString: function(value1, value2){
+        return String(Ext.value(value1, '')) === String(Ext.value(value2, ''));    
+    },
+
+    
+    getSubmitData: function() {
+        var me = this,
+            data = null;
+        if (!me.disabled && me.submitValue && !me.isFileUpload()) {
+            data = {};
+            data[me.getName()] = '' + me.getValue();
+        }
+        return data;
+    },
+
+    
+    getModelData: function() {
+        var me = this,
+            data = null;
+        if (!me.disabled && !me.isFileUpload()) {
+            data = {};
+            data[me.getName()] = me.getValue();
+        }
+        return data;
+    },
+
+    
+    reset : function(){
+        var me = this;
+
+        me.setValue(me.originalValue);
+        me.clearInvalid();
+        
+        delete me.wasValid;
+    },
+
+    
+    resetOriginalValue: function() {
+        this.originalValue = this.getValue();
+        this.checkDirty();
+    },
+
+    
+    checkChange: function() {
+        if (!this.suspendCheckChange) {
+            var me = this,
+                newVal = me.getValue(),
+                oldVal = me.lastValue;
+            if (!me.isEqual(newVal, oldVal) && !me.isDestroyed) {
+                me.lastValue = newVal;
+                me.fireEvent('change', me, newVal, oldVal);
+                me.onChange(newVal, oldVal);
+            }
+        }
+    },
+
+    
+    onChange: function(newVal, oldVal) {
+        if (this.validateOnChange) {
+            this.validate();
+        }
+        this.checkDirty();
+    },
+
+    
+    isDirty : function() {
+        var me = this;
+        return !me.disabled && !me.isEqual(me.getValue(), me.originalValue);
+    },
+
+    
+    checkDirty: function() {
+        var me = this,
+            isDirty = me.isDirty();
+        if (isDirty !== me.wasDirty) {
+            me.fireEvent('dirtychange', me, isDirty);
+            me.onDirtyChange(isDirty);
+            me.wasDirty = isDirty;
+        }
+    },
+
+    
+    onDirtyChange: Ext.emptyFn,
+
+    
+    getErrors: function(value) {
+        return [];
+    },
+
+    
+    isValid : function() {
+        var me = this;
+        return me.disabled || Ext.isEmpty(me.getErrors());
+    },
+
+    
+    validate : function() {
+        var me = this,
+            isValid = me.isValid();
+        if (isValid !== me.wasValid) {
+            me.wasValid = isValid;
+            me.fireEvent('validitychange', me, isValid);
+        }
+        return isValid;
+    },
+
+    
+    batchChanges: function(fn) {
+        try {
+            this.suspendCheckChange++;
+            fn();
+        } catch(e){
+            throw e;
+        } finally {
+            this.suspendCheckChange--;
+        }
+        this.checkChange();
+    },
+
+    
+    isFileUpload: function() {
+        return false;
+    },
+
+    
+    extractFileInput: function() {
+        return null;
+    },
+
+    
+    markInvalid: Ext.emptyFn,
+
+    
+    clearInvalid: Ext.emptyFn
+
+});
+
+
+Ext.define('Ext.layout.component.field.Field', {
+
+    
+
+    alias: ['layout.field'],
+
+    extend: 'Ext.layout.component.Component',
+
+    uses: ['Ext.tip.QuickTip', 'Ext.util.TextMetrics'],
+
+    
+
+    type: 'field',
+
+    beforeLayout: function(width, height) {
+        var me = this;
+        return me.callParent(arguments) || (!me.owner.preventMark && me.activeError !== me.owner.getActiveError());
+    },
+
+    onLayout: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            labelStrategy = me.getLabelStrategy(),
+            errorStrategy = me.getErrorStrategy(),
+            isDefined = Ext.isDefined,
+            isNumber = Ext.isNumber,
+            lastSize, autoWidth, autoHeight, info, undef;
+
+        lastSize = me.lastComponentSize || {};
+        if (!isDefined(width)) {
+            width = lastSize.width;
+            if (width < 0) { 
+                width = undef;
+            }
+        }
+        if (!isDefined(height)) {
+            height = lastSize.height;
+            if (height < 0) { 
+                height = undef;
+            }
+        }
+        autoWidth = !isNumber(width);
+        autoHeight = !isNumber(height);
+
+        info = {
+            autoWidth: autoWidth,
+            autoHeight: autoHeight,
+            width: autoWidth ? owner.getBodyNaturalWidth() : width, 
+            height: height,
+            setOuterWidth: false, 
+
+            
+            insets: {
+                top: 0,
+                right: 0,
+                bottom: 0,
+                left: 0
+            }
+        };
+
+        
+        
+        
+
+        
+        labelStrategy.prepare(owner, info);
+        errorStrategy.prepare(owner, info);
+
+        
+        labelStrategy.adjustHorizInsets(owner, info);
+        errorStrategy.adjustHorizInsets(owner, info);
+
+        
+        labelStrategy.layoutHoriz(owner, info);
+        errorStrategy.layoutHoriz(owner, info);
+
+        
+        labelStrategy.adjustVertInsets(owner, info);
+        errorStrategy.adjustVertInsets(owner, info);
+
+        
+        labelStrategy.layoutVert(owner, info);
+        errorStrategy.layoutVert(owner, info);
+
+        
+        if (autoWidth && autoHeight) {
+            
+            me.setElementSize(owner.el, (info.setOuterWidth ? info.width : undef), info.height);
+        } else {
+            me.setTargetSize((!autoWidth || info.setOuterWidth ? info.width : undef), info.height);
+        }
+        me.sizeBody(info);
+
+        me.activeError = owner.getActiveError();
+    },
+    
+    onFocus: function(){
+        this.getErrorStrategy().onFocus(this.owner);    
+    },
+
+
+    
+    sizeBody: function(info) {
+        var me = this,
+            owner = me.owner,
+            insets = info.insets,
+            totalWidth = info.width,
+            totalHeight = info.height,
+            width = Ext.isNumber(totalWidth) ? totalWidth - insets.left - insets.right : totalWidth,
+            height = Ext.isNumber(totalHeight) ? totalHeight - insets.top - insets.bottom : totalHeight;
+
+        
+        me.setElementSize(owner.bodyEl, width, height);
+
+        
+        me.sizeBodyContents(width, height);
+    },
+
+    
+    sizeBodyContents: Ext.emptyFn,
+
+
+    
+    getLabelStrategy: function() {
+        var me = this,
+            strategies = me.labelStrategies,
+            labelAlign = me.owner.labelAlign;
+        return strategies[labelAlign] || strategies.base;
+    },
+
+    
+    getErrorStrategy: function() {
+        var me = this,
+            owner = me.owner,
+            strategies = me.errorStrategies,
+            msgTarget = owner.msgTarget;
+        return !owner.preventMark && Ext.isString(msgTarget) ?
+                (strategies[msgTarget] || strategies.elementId) :
+                strategies.none;
+    },
+
+
+
+    
+    labelStrategies: (function() {
+        var applyIf = Ext.applyIf,
+            emptyFn = Ext.emptyFn,
+            base = {
+                prepare: function(owner, info) {
+                    var cls = owner.labelCls + '-' + owner.labelAlign,
+                        labelEl = owner.labelEl;
+                    if (labelEl && !labelEl.hasCls(cls)) {
+                        labelEl.addCls(cls);
+                    }
+                },
+                adjustHorizInsets: emptyFn,
+                adjustVertInsets: emptyFn,
+                layoutHoriz: emptyFn,
+                layoutVert: emptyFn
+            },
+            left = applyIf({
+                prepare: function(owner, info) {
+                    base.prepare(owner, info);
+                    
+                    if (info.autoWidth) {
+                        info.width += (!owner.labelEl ? 0 : owner.labelWidth + owner.labelPad);
+                    }
+                    
+                    info.setOuterWidth = true;
+                },
+                adjustHorizInsets: function(owner, info) {
+                    if (owner.labelEl) {
+                        info.insets.left += owner.labelWidth + owner.labelPad;
+                    }
+                },
+                layoutHoriz: function(owner, info) {
+                    
+                    
+                    
+                    
+                    
+                    var labelEl = owner.labelEl;
+                    if (labelEl && !owner.isLabelSized && !Ext.isBorderBox) {
+                        labelEl.setWidth(owner.labelWidth);
+                        owner.isLabelSized = true;
+                    }
+                }
+            }, base);
+
+
+        return {
+            base: base,
+
+            
+            top: applyIf({
+                adjustVertInsets: function(owner, info) {
+                    var labelEl = owner.labelEl;
+                    if (labelEl) {
+                        info.insets.top += Ext.util.TextMetrics.measure(labelEl, owner.fieldLabel, info.width).height +
+                                           labelEl.getFrameWidth('tb') + owner.labelPad;
+                    }
+                }
+            }, base),
+
+            
+            left: left,
+
+            
+            right: left
+        };
+    })(),
+
+
+
+    
+    errorStrategies: (function() {
+        function setDisplayed(el, displayed) {
+            var wasDisplayed = el.getStyle('display') !== 'none';
+            if (displayed !== wasDisplayed) {
+                el.setDisplayed(displayed);
+            }
+        }
+
+        function setStyle(el, name, value) {
+            if (el.getStyle(name) !== value) {
+                el.setStyle(name, value);
+            }
+        }
+        
+        function showTip(owner) {
+            var tip = Ext.layout.component.field.Field.tip,
+                target;
+                
+            if (tip && tip.isVisible()) {
+                target = tip.activeTarget;
+                if (target && target.el === owner.getActionEl().dom) {
+                    tip.toFront(true);
+                }
+            }
+        }
+
+        var applyIf = Ext.applyIf,
+            emptyFn = Ext.emptyFn,
+            base = {
+                prepare: function(owner) {
+                    setDisplayed(owner.errorEl, false);
+                },
+                adjustHorizInsets: emptyFn,
+                adjustVertInsets: emptyFn,
+                layoutHoriz: emptyFn,
+                layoutVert: emptyFn,
+                onFocus: emptyFn
+            };
+
+        return {
+            none: base,
+
+            
+            side: applyIf({
+                prepare: function(owner) {
+                    var errorEl = owner.errorEl;
+                    errorEl.addCls(Ext.baseCSSPrefix + 'form-invalid-icon');
+                    Ext.layout.component.field.Field.initTip();
+                    errorEl.dom.setAttribute('data-errorqtip', owner.getActiveError() || '');
+                    setDisplayed(errorEl, owner.hasActiveError());
+                },
+                adjustHorizInsets: function(owner, info) {
+                    if (owner.autoFitErrors && owner.hasActiveError()) {
+                        info.insets.right += owner.errorEl.getWidth();
+                    }
+                },
+                layoutHoriz: function(owner, info) {
+                    if (owner.hasActiveError()) {
+                        setStyle(owner.errorEl, 'left', info.width - info.insets.right + 'px');
+                    }
+                },
+                layoutVert: function(owner, info) {
+                    if (owner.hasActiveError()) {
+                        setStyle(owner.errorEl, 'top', info.insets.top + 'px');
+                    }
+                },
+                onFocus: showTip
+            }, base),
+
+            
+            under: applyIf({
+                prepare: function(owner) {
+                    var errorEl = owner.errorEl,
+                        cls = Ext.baseCSSPrefix + 'form-invalid-under';
+                    if (!errorEl.hasCls(cls)) {
+                        errorEl.addCls(cls);
+                    }
+                    setDisplayed(errorEl, owner.hasActiveError());
+                },
+                adjustVertInsets: function(owner, info) {
+                    if (owner.autoFitErrors) {
+                        info.insets.bottom += owner.errorEl.getHeight();
+                    }
+                },
+                layoutHoriz: function(owner, info) {
+                    var errorEl = owner.errorEl,
+                        insets = info.insets;
+
+                    setStyle(errorEl, 'width', info.width - insets.right - insets.left + 'px');
+                    setStyle(errorEl, 'marginLeft', insets.left + 'px');
+                }
+            }, base),
+
+            
+            qtip: applyIf({
+                prepare: function(owner) {
+                    setDisplayed(owner.errorEl, false);
+                    Ext.layout.component.field.Field.initTip();
+                    owner.getActionEl().dom.setAttribute('data-errorqtip', owner.getActiveError() || '');
+                },
+                onFocus: showTip
+            }, base),
+
+            
+            title: applyIf({
+                prepare: function(owner) {
+                    setDisplayed(owner.errorEl, false);
+                    owner.el.dom.title = owner.getActiveError() || '';
+                }
+            }, base),
+
+            
+            elementId: applyIf({
+                prepare: function(owner) {
+                    setDisplayed(owner.errorEl, false);
+                    var targetEl = Ext.fly(owner.msgTarget);
+                    if (targetEl) {
+                        targetEl.dom.innerHTML = owner.getActiveError() || '';
+                        targetEl.setDisplayed(owner.hasActiveError());
+                    }
+                }
+            }, base)
+        };
+    })(),
+
+    statics: {
+        
+        initTip: function() {
+            var tip = this.tip;
+            if (!tip) {
+                tip = this.tip = Ext.create('Ext.tip.QuickTip', {
+                    baseCls: Ext.baseCSSPrefix + 'form-invalid-tip',
+                    renderTo: Ext.getBody()
+                });
+                tip.tagConfig = Ext.apply({}, {attribute: 'errorqtip'}, tip.tagConfig);
+            }
+        },
+
+        
+        destroyTip: function() {
+            var tip = this.tip;
+            if (tip) {
+                tip.destroy();
+                delete this.tip;
+            }
+        }
+    }
+
+});
+
+
+Ext.define('Ext.form.field.VTypes', (function(){
+    
+    var alpha = /^[a-zA-Z_]+$/,
+        alphanum = /^[a-zA-Z0-9_]+$/,
+        email = /^(\w+)([\-+.][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/,
+        url = /(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
+
+    
+    return {
+        singleton: true,
+        alternateClassName: 'Ext.form.VTypes',
+
+        
+        'email' : function(v){
+            return email.test(v);
+        },
+        
+        'emailText' : 'This field should be an e-mail address in the format "user at example.com"',
+        
+        'emailMask' : /[a-z0-9_\.\-@\+]/i,
+
+        
+        'url' : function(v){
+            return url.test(v);
+        },
+        
+        'urlText' : 'This field should be a URL in the format "http:/'+'/www.example.com"',
+
+        
+        'alpha' : function(v){
+            return alpha.test(v);
+        },
+        
+        'alphaText' : 'This field should only contain letters and _',
+        
+        'alphaMask' : /[a-z_]/i,
+
+        
+        'alphanum' : function(v){
+            return alphanum.test(v);
+        },
+        
+        'alphanumText' : 'This field should only contain letters, numbers and _',
+        
+        'alphanumMask' : /[a-z0-9_]/i
+    };
+})());
+
+
+Ext.define('Ext.layout.component.field.Text', {
+    extend: 'Ext.layout.component.field.Field',
+    alias: 'layout.textfield',
+    requires: ['Ext.util.TextMetrics'],
+
+    type: 'textfield',
+
+
+    
+    beforeLayout: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            lastValue = this.lastValue,
+            value = owner.getRawValue();
+        this.lastValue = value;
+        return me.callParent(arguments) || (owner.grow && value !== lastValue);
+    },
+
+
+    
+    sizeBodyContents: function(width, height) {
+        var size = this.adjustForGrow(width, height);
+        this.setElementSize(this.owner.inputEl, size[0], size[1]);
+    },
+
+
+    
+    adjustForGrow: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            inputEl, value, calcWidth,
+            result = [width, height];
+
+        if (owner.grow) {
+            inputEl = owner.inputEl;
+
+            
+            value = (inputEl.dom.value || (owner.hasFocus ? '' : owner.emptyText) || '') + owner.growAppend;
+            calcWidth = inputEl.getTextWidth(value) + inputEl.getBorderWidth("lr") + inputEl.getPadding("lr");
+
+            
+            result[0] = Ext.Number.constrain(calcWidth, owner.growMin,
+                    Math.max(owner.growMin, Math.min(owner.growMax, Ext.isNumber(width) ? width : Infinity)));
+        }
+
+        return result;
+    }
+
+});
+
+
+Ext.define('Ext.layout.component.field.TextArea', {
+    extend: 'Ext.layout.component.field.Text',
+    alias: 'layout.textareafield',
+
+    type: 'textareafield',
+
+
+    
+    adjustForGrow: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            inputEl, value, max,
+            curWidth, curHeight, calcHeight,
+            result = [width, height];
+
+        if (owner.grow) {
+            inputEl = owner.inputEl;
+            curWidth = inputEl.getWidth(true); 
+            curHeight = inputEl.getHeight();
+
+            
+            value = inputEl.dom.value || ' ';
+            value += owner.growAppend;
+
+            
+            value = value.replace(/\n/g, '<br>');
+
+            
+            calcHeight = Ext.util.TextMetrics.measure(inputEl, value, curWidth).height +
+                         inputEl.getBorderWidth("tb") + inputEl.getPadding("tb");
+
+            
+            max = owner.growMax;
+            if (Ext.isNumber(height)) {
+                max = Math.min(max, height);
+            }
+            result[1] = Ext.Number.constrain(calcHeight, owner.growMin, max);
+        }
+
+        return result;
+    }
+
+});
+
+Ext.define('Ext.layout.container.Anchor', {
+
+    
+
+    alias: 'layout.anchor',
+    extend: 'Ext.layout.container.Container',
+    alternateClassName: 'Ext.layout.AnchorLayout',
+
+    
+
+    
+    type: 'anchor',
+
+    
+    defaultAnchor: '100%',
+
+    parseAnchorRE: /^(r|right|b|bottom)$/i,
+
+    
+    onLayout: function() {
+        this.callParent(arguments);
+
+        var me = this,
+            size = me.getLayoutTargetSize(),
+            owner = me.owner,
+            target = me.getTarget(),
+            ownerWidth = size.width,
+            ownerHeight = size.height,
+            overflow = target.getStyle('overflow'),
+            components = me.getVisibleItems(owner),
+            len = components.length,
+            boxes = [],
+            box, newTargetSize, component, anchorSpec, calcWidth, calcHeight,
+            i, el, cleaner;
+
+        if (ownerWidth < 20 && ownerHeight < 20) {
+            return;
+        }
+
+        
+        
+        
+        if (!me.clearEl) {
+            me.clearEl = target.createChild({
+                cls: Ext.baseCSSPrefix + 'clear',
+                role: 'presentation'
+            });
+        }
+
+        
+        if (!Ext.supports.RightMargin) {
+            cleaner = Ext.Element.getRightMarginFixCleaner(target);
+            target.addCls(Ext.baseCSSPrefix + 'inline-children');
+        }
+
+        for (i = 0; i < len; i++) {
+            component = components[i];
+            el = component.el;
+
+            anchorSpec = component.anchorSpec;
+            if (anchorSpec) {
+                if (anchorSpec.right) {
+                    calcWidth = me.adjustWidthAnchor(anchorSpec.right(ownerWidth) - el.getMargin('lr'), component);
+                } else {
+                    calcWidth = undefined;
+                }
+                if (anchorSpec.bottom) {
+                    calcHeight = me.adjustHeightAnchor(anchorSpec.bottom(ownerHeight) - el.getMargin('tb'), component);
+                } else {
+                    calcHeight = undefined;
+                }
+
+                boxes.push({
+                    component: component,
+                    anchor: true,
+                    width: calcWidth || undefined,
+                    height: calcHeight || undefined
+                });
+            } else {
+                boxes.push({
+                    component: component,
+                    anchor: false
+                });
+            }
+        }
+
+        
+        if (!Ext.supports.RightMargin) {
+            target.removeCls(Ext.baseCSSPrefix + 'inline-children');
+            cleaner();
+        }
+
+        for (i = 0; i < len; i++) {
+            box = boxes[i];
+            me.setItemSize(box.component, box.width, box.height);
+        }
+
+        if (overflow && overflow != 'hidden' && !me.adjustmentPass) {
+            newTargetSize = me.getLayoutTargetSize();
+            if (newTargetSize.width != size.width || newTargetSize.height != size.height) {
+                me.adjustmentPass = true;
+                me.onLayout();
+            }
+        }
+
+        delete me.adjustmentPass;
+    },
+
+    
+    parseAnchor: function(a, start, cstart) {
+        if (a && a != 'none') {
+            var ratio;
+            
+            if (this.parseAnchorRE.test(a)) {
+                var diff = cstart - start;
+                return function(v) {
+                    return v - diff;
+                };
+            }    
+            
+            else if (a.indexOf('%') != -1) {
+                ratio = parseFloat(a.replace('%', '')) * 0.01;
+                return function(v) {
+                    return Math.floor(v * ratio);
+                };
+            }    
+            
+            else {
+                a = parseInt(a, 10);
+                if (!isNaN(a)) {
+                    return function(v) {
+                        return v + a;
+                    };
+                }
+            }
+        }
+        return null;
+    },
+
+    
+    adjustWidthAnchor: function(value, comp) {
+        return value;
+    },
+
+    
+    adjustHeightAnchor: function(value, comp) {
+        return value;
+    },
+
+    configureItem: function(item) {
+        var me = this,
+            owner = me.owner,
+            anchor= item.anchor,
+            anchorsArray,
+            anchorSpec,
+            anchorWidth,
+            anchorHeight;
+
+        if (!item.anchor && item.items && !Ext.isNumber(item.width) && !(Ext.isIE6 && Ext.isStrict)) {
+            item.anchor = anchor = me.defaultAnchor;
+        }
+
+        
+        if (owner.anchorSize) {
+            if (typeof owner.anchorSize == 'number') {
+                anchorWidth = owner.anchorSize;
+            }
+            else {
+                anchorWidth = owner.anchorSize.width;
+                anchorHeight = owner.anchorSize.height;
+            }
+        }
+        else {
+            anchorWidth = owner.initialConfig.width;
+            anchorHeight = owner.initialConfig.height;
+        }
+
+        if (anchor) {
+            
+            anchorsArray = anchor.split(' ');
+            item.anchorSpec = anchorSpec = {
+                right: me.parseAnchor(anchorsArray[0], item.initialConfig.width, anchorWidth),
+                bottom: me.parseAnchor(anchorsArray[1], item.initialConfig.height, anchorHeight)
+            };
+
+            if (anchorSpec.right) {
+                item.layoutManagedWidth = 1;
+            } else {
+                item.layoutManagedWidth = 2;
+            }
+
+            if (anchorSpec.bottom) {
+                item.layoutManagedHeight = 1;
+            } else {
+                item.layoutManagedHeight = 2;
+            }
+        } else {
+            item.layoutManagedWidth = 2;
+            item.layoutManagedHeight = 2;
+        }
+        this.callParent(arguments);
+    }
+
+});
+
+Ext.define('Ext.form.action.Load', {
+    extend:'Ext.form.action.Action',
+    requires: ['Ext.data.Connection'],
+    alternateClassName: 'Ext.form.Action.Load',
+    alias: 'formaction.load',
+
+    type: 'load',
+
+    
+    run: function() {
+        Ext.Ajax.request(Ext.apply(
+            this.createCallback(),
+            {
+                method: this.getMethod(),
+                url: this.getUrl(),
+                headers: this.headers,
+                params: this.getParams()
+            }
+        ));
+    },
+
+    
+    onSuccess: function(response){
+        var result = this.processResponse(response),
+            form = this.form;
+        if (result === true || !result.success || !result.data) {
+            this.failureType = Ext.form.action.Action.LOAD_FAILURE;
+            form.afterAction(this, false);
+            return;
+        }
+        form.clearInvalid();
+        form.setValues(result.data);
+        form.afterAction(this, true);
+    },
+
+    
+    handleResponse: function(response) {
+        var reader = this.form.reader,
+            rs, data;
+        if (reader) {
+            rs = reader.read(response);
+            data = rs.records && rs.records[0] ? rs.records[0].data : null;
+            return {
+                success : rs.success,
+                data : data
+            };
+        }
+        return Ext.decode(response.responseText);
+    }
+});
+
+
+
+Ext.define('Ext.window.Window', {
+    extend: 'Ext.panel.Panel',
+
+    alternateClassName: 'Ext.Window',
+
+    requires: ['Ext.util.ComponentDragger', 'Ext.util.Region', 'Ext.EventManager'],
+
+    alias: 'widget.window',
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    baseCls: Ext.baseCSSPrefix + 'window',
+
+    
+    resizable: true,
+
+    
+    draggable: true,
+
+    
+    constrain: false,
+
+    
+    constrainHeader: false,
+
+    
+    plain: false,
+
+    
+    minimizable: false,
+
+    
+    maximizable: false,
+
+    
+    minHeight: 100,
+
+    
+    minWidth: 200,
+
+    
+    expandOnShow: true,
+
+    
+    collapsible: false,
+
+    
+    closable: true,
+
+    
+    hidden: true,
+
+    
+    autoRender: true,
+
+    
+    hideMode: 'visibility',
+
+    
+    floating: true,
+
+    ariaRole: 'alertdialog',
+
+    itemCls: 'x-window-item',
+
+    overlapHeader: true,
+
+    ignoreHeaderBorderManagement: true,
+
+    
+    initComponent: function() {
+        var me = this;
+        me.callParent();
+        me.addEvents(
+            
+
+            
+
+            
+            'resize',
+
+            
+            'maximize',
+
+            
+            'minimize',
+
+            
+            'restore'
+        );
+
+        if (me.plain) {
+            me.addClsWithUI('plain');
+        }
+
+        if (me.modal) {
+            me.ariaRole = 'dialog';
+        }
+    },
+
+    
+    
+
+    initStateEvents: function(){
+        var events = this.stateEvents;
+        
+        Ext.each(['maximize', 'restore', 'resize', 'dragend'], function(event){
+            if (Ext.Array.indexOf(events, event)) {
+                events.push(event);
+            }
+        });
+        this.callParent();
+    },
+
+    getState: function() {
+        var me = this,
+            state = me.callParent() || {},
+            maximized = !!me.maximized;
+
+        state.maximized = maximized;
+        Ext.apply(state, {
+            size: maximized ? me.restoreSize : me.getSize(),
+            pos: maximized ? me.restorePos : me.getPosition()
+        });
+        return state;
+    },
+
+    applyState: function(state){
+        var me = this;
+
+        if (state) {
+            me.maximized = state.maximized;
+            if (me.maximized) {
+                me.hasSavedRestore = true;
+                me.restoreSize = state.size;
+                me.restorePos = state.pos;
+            } else {
+                Ext.apply(me, {
+                    width: state.size.width,
+                    height: state.size.height,
+                    x: state.pos[0],
+                    y: state.pos[1]
+                });
+            }
+        }
+    },
+
+    
+    onMouseDown: function (e) {
+        var preventFocus;
+            
+        if (this.floating) {
+            if (Ext.fly(e.getTarget()).focusable()) {
+                preventFocus = true;
+            }
+            this.toFront(preventFocus);
+        }
+    },
+
+    
+    onRender: function(ct, position) {
+        var me = this;
+        me.callParent(arguments);
+        me.focusEl = me.el;
+
+        
+        if (me.maximizable) {
+            me.header.on({
+                dblclick: {
+                    fn: me.toggleMaximize,
+                    element: 'el',
+                    scope: me
+                }
+            });
+        }
+    },
+
+    
+    afterRender: function() {
+        var me = this,
+            hidden = me.hidden,
+            keyMap;
+
+        me.hidden = false;
+        
+        me.callParent();
+        me.hidden = hidden;
+
+        
+        me.proxy = me.getProxy();
+
+        
+        me.mon(me.el, 'mousedown', me.onMouseDown, me);
+        
+        
+        me.el.set({
+            tabIndex: -1
+        });
+
+        
+        if (me.maximized) {
+            me.maximized = false;
+            me.maximize();
+        }
+
+        if (me.closable) {
+            keyMap = me.getKeyMap();
+            keyMap.on(27, me.onEsc, me);
+
+            
+                keyMap.disable();
+            
+        }
+
+        if (!hidden) {
+            me.syncMonitorWindowResize();
+            me.doConstrain();
+        }
+    },
+
+    
+    initDraggable: function() {
+        var me = this,
+            ddConfig;
+
+        if (!me.header) {
+            me.updateHeader(true);
+        }
+
+        
+        if (me.header) {
+            ddConfig = Ext.applyIf({
+                el: me.el,
+                delegate: '#' + me.header.id
+            }, me.draggable);
+
+            
+            if (me.constrain || me.constrainHeader) {
+                ddConfig.constrain = me.constrain;
+                ddConfig.constrainDelegate = me.constrainHeader;
+                ddConfig.constrainTo = me.constrainTo || me.container;
+            }
+
+            
+            me.dd = Ext.create('Ext.util.ComponentDragger', this, ddConfig);
+            me.relayEvents(me.dd, ['dragstart', 'drag', 'dragend']);
+        }
+    },
+
+    
+    onEsc: function(k, e) {
+        e.stopEvent();
+        this[this.closeAction]();
+    },
+
+    
+    beforeDestroy: function() {
+        var me = this;
+        if (me.rendered) {
+            delete this.animateTarget;
+            me.hide();
+            Ext.destroy(
+                me.keyMap
+            );
+        }
+        me.callParent();
+    },
+
+    
+    addTools: function() {
+        var me = this;
+
+        
+        me.callParent();
+
+        if (me.minimizable) {
+            me.addTool({
+                type: 'minimize',
+                handler: Ext.Function.bind(me.minimize, me, [])
+            });
+        }
+        if (me.maximizable) {
+            me.addTool({
+                type: 'maximize',
+                handler: Ext.Function.bind(me.maximize, me, [])
+            });
+            me.addTool({
+                type: 'restore',
+                handler: Ext.Function.bind(me.restore, me, []),
+                hidden: true
+            });
+        }
+    },
+
+    
+    getFocusEl: function() {
+        var me = this,
+            f = me.focusEl,
+            defaultComp = me.defaultButton || me.defaultFocus,
+            t = typeof db,
+            el,
+            ct;
+
+        if (Ext.isDefined(defaultComp)) {
+            if (Ext.isNumber(defaultComp)) {
+                f = me.query('button')[defaultComp];
+            } else if (Ext.isString(defaultComp)) {
+                f = me.down('#' + defaultComp);
+            } else {
+                f = defaultComp;
+            }
+        }
+        return f || me.focusEl;
+    },
+
+    
+    beforeShow: function() {
+        this.callParent();
+
+        if (this.expandOnShow) {
+            this.expand(false);
+        }
+    },
+
+    
+    afterShow: function(animateTarget) {
+        var me = this,
+            animating = animateTarget || me.animateTarget;
+
+
+        
+        
+
+        
+        
+        me.callParent(arguments);
+
+        if (me.maximized) {
+            me.fitContainer();
+        }
+
+        me.syncMonitorWindowResize();
+        if (!animating) {
+            me.doConstrain();
+        }
+
+        if (me.keyMap) {
+            me.keyMap.enable();
+        }
+    },
+
+    
+    doClose: function() {
+        var me = this;
+
+        
+        if (me.hidden) {
+            me.fireEvent('close', me);
+            if (me.closeAction == 'destroy') {
+                this.destroy();
+            }
+        } else {
+            
+            me.hide(me.animateTarget, me.doClose, me);
+        }
+    },
+
+    
+    afterHide: function() {
+        var me = this;
+
+        
+        me.syncMonitorWindowResize();
+
+        
+        if (me.keyMap) {
+            me.keyMap.disable();
+        }
+
+        
+        me.callParent(arguments);
+    },
+
+    
+    onWindowResize: function() {
+        if (this.maximized) {
+            this.fitContainer();
+        }
+        this.doConstrain();
+    },
+
+    
+    minimize: function() {
+        this.fireEvent('minimize', this);
+        return this;
+    },
+
+    afterCollapse: function() {
+        var me = this;
+
+        if (me.maximizable) {
+            me.tools.maximize.hide();
+            me.tools.restore.hide();
+        }
+        if (me.resizer) {
+            me.resizer.disable();
+        }
+        me.callParent(arguments);
+    },
+
+    afterExpand: function() {
+        var me = this;
+
+        if (me.maximized) {
+            me.tools.restore.show();
+        } else if (me.maximizable) {
+            me.tools.maximize.show();
+        }
+        if (me.resizer) {
+            me.resizer.enable();
+        }
+        me.callParent(arguments);
+    },
+
+    
+    maximize: function() {
+        var me = this;
+
+        if (!me.maximized) {
+            me.expand(false);
+            if (!me.hasSavedRestore) {
+                me.restoreSize = me.getSize();
+                me.restorePos = me.getPosition(true);
+            }
+            if (me.maximizable) {
+                me.tools.maximize.hide();
+                me.tools.restore.show();
+            }
+            me.maximized = true;
+            me.el.disableShadow();
+
+            if (me.dd) {
+                me.dd.disable();
+            }
+            if (me.collapseTool) {
+                me.collapseTool.hide();
+            }
+            me.el.addCls(Ext.baseCSSPrefix + 'window-maximized');
+            me.container.addCls(Ext.baseCSSPrefix + 'window-maximized-ct');
+
+            me.syncMonitorWindowResize();
+            me.setPosition(0, 0);
+            me.fitContainer();
+            me.fireEvent('maximize', me);
+        }
+        return me;
+    },
+
+    
+    restore: function() {
+        var me = this,
+            tools = me.tools;
+
+        if (me.maximized) {
+            delete me.hasSavedRestore;
+            me.removeCls(Ext.baseCSSPrefix + 'window-maximized');
+
+            
+            if (tools.restore) {
+                tools.restore.hide();
+            }
+            if (tools.maximize) {
+                tools.maximize.show();
+            }
+            if (me.collapseTool) {
+                me.collapseTool.show();
+            }
+
+            
+            me.setPosition(me.restorePos);
+            me.setSize(me.restoreSize);
+
+            
+            delete me.restorePos;
+            delete me.restoreSize;
+
+            me.maximized = false;
+
+            me.el.enableShadow(true);
+
+            
+            if (me.dd) {
+                me.dd.enable();
+            }
+
+            me.container.removeCls(Ext.baseCSSPrefix + 'window-maximized-ct');
+
+            me.syncMonitorWindowResize();
+            me.doConstrain();
+            me.fireEvent('restore', me);
+        }
+        return me;
+    },
+
+    
+    syncMonitorWindowResize: function () {
+        var me = this,
+            currentlyMonitoring = me._monitoringResize,
+            
+            yes = me.monitorResize || me.constrain || me.constrainHeader || me.maximized,
+            
+            veto = me.hidden || me.destroying || me.isDestroyed;
+
+        if (yes && !veto) {
+            
+            if (!currentlyMonitoring) {
+                
+                Ext.EventManager.onWindowResize(me.onWindowResize, me);
+                me._monitoringResize = true;
+            }
+        } else if (currentlyMonitoring) {
+            
+            Ext.EventManager.removeResizeListener(me.onWindowResize, me);
+            me._monitoringResize = false;
+        }
+    },
+
+    
+    toggleMaximize: function() {
+        return this[this.maximized ? 'restore': 'maximize']();
+    }
+
+    
+});
+
+
+Ext.define('Ext.form.field.Base', {
+    extend: 'Ext.Component',
+    mixins: {
+        labelable: 'Ext.form.Labelable',
+        field: 'Ext.form.field.Field'
+    },
+    alias: 'widget.field',
+    alternateClassName: ['Ext.form.Field', 'Ext.form.BaseField'],
+    requires: ['Ext.util.DelayedTask', 'Ext.XTemplate', 'Ext.layout.component.field.Field'],
+
+    
+    fieldSubTpl: [ 
+        '<input id="{id}" type="{type}" ',
+        '<tpl if="name">name="{name}" </tpl>',
+        '<tpl if="size">size="{size}" </tpl>',
+        '<tpl if="tabIdx">tabIndex="{tabIdx}" </tpl>',
+        'class="{fieldCls} {typeCls}" autocomplete="off" />',
+        {
+            compiled: true,
+            disableFormats: true
+        }
+    ],
+
+    
+
+    
+    inputType: 'text',
+
+    
+
+    
+    invalidText : 'The value in this field is invalid',
+
+    
+    fieldCls : Ext.baseCSSPrefix + 'form-field',
+
+    
+
+    
+    focusCls : Ext.baseCSSPrefix + 'form-focus',
+
+    
+    dirtyCls : Ext.baseCSSPrefix + 'form-dirty',
+
+    
+    checkChangeEvents: Ext.isIE && (!document.documentMode || document.documentMode < 9) ?
+                        ['change', 'propertychange'] :
+                        ['change', 'input', 'textInput', 'keyup', 'dragdrop'],
+
+    
+    checkChangeBuffer: 50,
+
+    componentLayout: 'field',
+
+    
+    readOnly : false,
+
+    
+    readOnlyCls: Ext.baseCSSPrefix + 'form-readonly',
+
+    
+
+    
+    validateOnBlur: true,
+
+    
+    hasFocus : false,
+
+    baseCls: Ext.baseCSSPrefix + 'field',
+
+    maskOnDisable: false,
+
+    
+    initComponent : function() {
+        var me = this;
+
+        me.callParent();
+
+        me.subTplData = me.subTplData || {};
+
+        me.addEvents(
+            
+            'focus',
+            
+            'blur',
+            
+            'specialkey'
+        );
+
+        
+        me.initLabelable();
+        me.initField();
+
+        
+        if (!me.name) {
+            me.name = me.getInputId();
+        }
+    },
+
+    
+    getInputId: function() {
+        return this.inputId || (this.inputId = Ext.id());
+    },
+
+    
+    getSubTplData: function() {
+        var me = this,
+            type = me.inputType,
+            inputId = me.getInputId();
+
+        return Ext.applyIf(me.subTplData, {
+            id: inputId,
+            cmpId: me.id,
+            name: me.name || inputId,
+            type: type,
+            size: me.size || 20,
+            cls: me.cls,
+            fieldCls: me.fieldCls,
+            tabIdx: me.tabIndex,
+            typeCls: Ext.baseCSSPrefix + 'form-' + (type === 'password' ? 'text' : type)
+        });
+    },
+
+    afterRender: function() {
+        this.callParent();
+        
+        if (this.inputEl) {
+            this.inputEl.selectable();
+        }
+    },
+
+    
+    getSubTplMarkup: function() {
+        return this.getTpl('fieldSubTpl').apply(this.getSubTplData());
+    },
+
+    initRenderTpl: function() {
+        var me = this;
+        if (!me.hasOwnProperty('renderTpl')) {
+            me.renderTpl = me.getTpl('labelableRenderTpl');
+        }
+        return me.callParent();
+    },
+
+    initRenderData: function() {
+        return Ext.applyIf(this.callParent(), this.getLabelableRenderData());
+    },
+
+    
+    setFieldStyle: function(style) {
+        var me = this,
+            inputEl = me.inputEl;
+        if (inputEl) {
+            inputEl.applyStyles(style);
+        }
+        me.fieldStyle = style;
+    },
+
+    
+    onRender : function() {
+        var me = this,
+            fieldStyle = me.fieldStyle;
+
+        me.onLabelableRender();
+
+        
+        me.addChildEls({ name: 'inputEl', id: me.getInputId() });
+
+        me.callParent(arguments);
+
+        
+        me.setRawValue(me.rawValue);
+
+        if (me.readOnly) {
+            me.setReadOnly(true);
+        }
+        if (me.disabled) {
+            me.disable();
+        }
+        if (fieldStyle) {
+            me.setFieldStyle(fieldStyle);
+        }
+
+        me.renderActiveError();
+    },
+
+    initAria: function() {
+        var me = this;
+        me.callParent();
+
+        
+        me.getActionEl().dom.setAttribute('aria-describedby', Ext.id(me.errorEl));
+    },
+
+    getFocusEl: function() {
+        return this.inputEl;
+    },
+
+    isFileUpload: function() {
+        return this.inputType === 'file';
+    },
+
+    extractFileInput: function() {
+        var me = this,
+            fileInput = me.isFileUpload() ? me.inputEl.dom : null,
+            clone;
+        if (fileInput) {
+            clone = fileInput.cloneNode(true);
+            fileInput.parentNode.replaceChild(clone, fileInput);
+            me.inputEl = Ext.get(clone);
+        }
+        return fileInput;
+    },
+
+    
+    getSubmitData: function() {
+        var me = this,
+            data = null,
+            val;
+        if (!me.disabled && me.submitValue && !me.isFileUpload()) {
+            val = me.getSubmitValue();
+            if (val !== null) {
+                data = {};
+                data[me.getName()] = val;
+            }
+        }
+        return data;
+    },
+
+    
+    getSubmitValue: function() {
+        return this.processRawValue(this.getRawValue());
+    },
+
+    
+    getRawValue: function() {
+        var me = this,
+            v = (me.inputEl ? me.inputEl.getValue() : Ext.value(me.rawValue, ''));
+        me.rawValue = v;
+        return v;
+    },
+
+    
+    setRawValue: function(value) {
+        var me = this;
+        value = Ext.value(value, '');
+        me.rawValue = value;
+
+        
+        if (me.inputEl) {
+            me.inputEl.dom.value = value;
+        }
+        return value;
+    },
+
+    
+    valueToRaw: function(value) {
+        return '' + Ext.value(value, '');
+    },
+
+    
+    rawToValue: function(rawValue) {
+        return rawValue;
+    },
+
+    
+    processRawValue: function(value) {
+        return value;
+    },
+
+    
+    getValue: function() {
+        var me = this,
+            val = me.rawToValue(me.processRawValue(me.getRawValue()));
+        me.value = val;
+        return val;
+    },
+
+    
+    setValue: function(value) {
+        var me = this;
+        me.setRawValue(me.valueToRaw(value));
+        return me.mixins.field.setValue.call(me, value);
+    },
+
+
+    
+    onDisable: function() {
+        var me = this,
+            inputEl = me.inputEl;
+        me.callParent();
+        if (inputEl) {
+            inputEl.dom.disabled = true;
+        }
+    },
+
+    
+    onEnable: function() {
+        var me = this,
+            inputEl = me.inputEl;
+        me.callParent();
+        if (inputEl) {
+            inputEl.dom.disabled = false;
+        }
+    },
+
+    
+    setReadOnly: function(readOnly) {
+        var me = this,
+            inputEl = me.inputEl;
+        if (inputEl) {
+            inputEl.dom.readOnly = readOnly;
+            inputEl.dom.setAttribute('aria-readonly', readOnly);
+        }
+        me[readOnly ? 'addCls' : 'removeCls'](me.readOnlyCls);
+        me.readOnly = readOnly;
+    },
+
+    
+    fireKey: function(e){
+        if(e.isSpecialKey()){
+            this.fireEvent('specialkey', this, Ext.create('Ext.EventObjectImpl', e));
+        }
+    },
+
+    
+    initEvents : function(){
+        var me = this,
+            inputEl = me.inputEl,
+            onChangeTask,
+            onChangeEvent;
+        if (inputEl) {
+            me.mon(inputEl, Ext.EventManager.getKeyEvent(), me.fireKey,  me);
+            me.mon(inputEl, 'focus', me.onFocus, me);
+
+            
+            
+            me.mon(inputEl, 'blur', me.onBlur, me, me.inEditor ? {buffer:10} : null);
+
+            
+            onChangeTask = Ext.create('Ext.util.DelayedTask', me.checkChange, me);
+            me.onChangeEvent = onChangeEvent = function() {
+                onChangeTask.delay(me.checkChangeBuffer);
+            };
+            Ext.each(me.checkChangeEvents, function(eventName) {
+                if (eventName === 'propertychange') {
+                    me.usesPropertychange = true;
+                }
+                me.mon(inputEl, eventName, onChangeEvent);
+            }, me);
+        }
+        me.callParent();
+    },
+
+    doComponentLayout: function() {
+        var me = this,
+            inputEl = me.inputEl,
+            usesPropertychange = me.usesPropertychange,
+            ename = 'propertychange',
+            onChangeEvent = me.onChangeEvent;
+
+        
+        
+        
+        if (usesPropertychange) {
+            me.mun(inputEl, ename, onChangeEvent);
+        }
+        me.callParent(arguments);
+        if (usesPropertychange) {
+            me.mon(inputEl, ename, onChangeEvent);
+        }
+    },
+
+    
+    preFocus: Ext.emptyFn,
+
+    
+    onFocus: function() {
+        var me = this,
+            focusCls = me.focusCls,
+            inputEl = me.inputEl;
+        me.preFocus();
+        if (focusCls && inputEl) {
+            inputEl.addCls(focusCls);
+        }
+        if (!me.hasFocus) {
+            me.hasFocus = true;
+            me.componentLayout.onFocus();
+            me.fireEvent('focus', me);
+        }
+    },
+
+    
+    beforeBlur : Ext.emptyFn,
+
+    
+    onBlur : function(){
+        var me = this,
+            focusCls = me.focusCls,
+            inputEl = me.inputEl;
+
+        if (me.destroying) {
+            return;
+        }
+
+        me.beforeBlur();
+        if (focusCls && inputEl) {
+            inputEl.removeCls(focusCls);
+        }
+        if (me.validateOnBlur) {
+            me.validate();
+        }
+        me.hasFocus = false;
+        me.fireEvent('blur', me);
+        me.postBlur();
+    },
+
+    
+    postBlur : Ext.emptyFn,
+
+
+    
+    onDirtyChange: function(isDirty) {
+        this[isDirty ? 'addCls' : 'removeCls'](this.dirtyCls);
+    },
+
+
+    
+    isValid : function() {
+        var me = this;
+        return me.disabled || me.validateValue(me.processRawValue(me.getRawValue()));
+    },
+
+
+    
+    validateValue: function(value) {
+        var me = this,
+            errors = me.getErrors(value),
+            isValid = Ext.isEmpty(errors);
+        if (!me.preventMark) {
+            if (isValid) {
+                me.clearInvalid();
+            } else {
+                me.markInvalid(errors);
+            }
+        }
+
+        return isValid;
+    },
+
+    
+    markInvalid : function(errors) {
+        
+        var me = this,
+            oldMsg = me.getActiveError();
+        me.setActiveErrors(Ext.Array.from(errors));
+        if (oldMsg !== me.getActiveError()) {
+            me.doComponentLayout();
+        }
+    },
+
+    
+    clearInvalid : function() {
+        
+        var me = this,
+            hadError = me.hasActiveError();
+        me.unsetActiveError();
+        if (hadError) {
+            me.doComponentLayout();
+        }
+    },
+
+    
+    renderActiveError: function() {
+        var me = this,
+            hasError = me.hasActiveError();
+        if (me.inputEl) {
+            
+            me.inputEl[hasError ? 'addCls' : 'removeCls'](me.invalidCls + '-field');
+        }
+        me.mixins.labelable.renderActiveError.call(me);
+    },
+
+
+    getActionEl: function() {
+        return this.inputEl || this.el;
+    }
+
+});
+
+
+Ext.define('Ext.form.field.Text', {
+    extend:'Ext.form.field.Base',
+    alias: 'widget.textfield',
+    requires: ['Ext.form.field.VTypes', 'Ext.layout.component.field.Text'],
+    alternateClassName: ['Ext.form.TextField', 'Ext.form.Text'],
+
+    
+
+    
+
+    
+    size: 20,
+
+    
+
+    
+    growMin : 30,
+
+    
+    growMax : 800,
+
+    
+    growAppend: 'W',
+
+    
+
+    
+
+    
+
+    
+    allowBlank : true,
+
+    
+    minLength : 0,
+
+    
+    maxLength : Number.MAX_VALUE,
+
+    
+
+    
+    minLengthText : 'The minimum length for this field is {0}',
+
+    
+    maxLengthText : 'The maximum length for this field is {0}',
+
+    
+
+    
+    blankText : 'This field is required',
+
+    
+
+    
+
+    
+    regexText : '',
+
+    
+
+    
+    emptyCls : Ext.baseCSSPrefix + 'form-empty-field',
+
+    ariaRole: 'textbox',
+
+    
+
+    componentLayout: 'textfield',
+
+    initComponent : function(){
+        this.callParent();
+        this.addEvents(
+            
+            'autosize',
+
+            
+            'keydown',
+            
+            'keyup',
+            
+            'keypress'
+        );
+    },
+
+    
+    initEvents : function(){
+        var me = this,
+            el = me.inputEl;
+
+        me.callParent();
+        if(me.selectOnFocus || me.emptyText){
+            me.mon(el, 'mousedown', me.onMouseDown, me);
+        }
+        if(me.maskRe || (me.vtype && me.disableKeyFilter !== true && (me.maskRe = Ext.form.field.VTypes[me.vtype+'Mask']))){
+            me.mon(el, 'keypress', me.filterKeys, me);
+        }
+
+        if (me.enableKeyEvents) {
+            me.mon(el, {
+                scope: me,
+                keyup: me.onKeyUp,
+                keydown: me.onKeyDown,
+                keypress: me.onKeyPress
+            });
+        }
+    },
+
+    
+    isEqual: function(value1, value2) {
+        return this.isEqualAsString(value1, value2);
+    },
+
+    
+    onChange: function() {
+        this.callParent();
+        this.autoSize();
+    },
+
+    afterRender: function(){
+        var me = this;
+        if (me.enforceMaxLength) {
+            me.inputEl.dom.maxLength = me.maxLength;
+        }
+        me.applyEmptyText();
+        me.autoSize();
+        me.callParent();
+    },
+
+    onMouseDown: function(e){
+        var me = this;
+        if(!me.hasFocus){
+            me.mon(me.inputEl, 'mouseup', Ext.emptyFn, me, { single: true, preventDefault: true });
+        }
+    },
+
+    
+    processRawValue: function(value) {
+        var me = this,
+            stripRe = me.stripCharsRe,
+            newValue;
+
+        if (stripRe) {
+            newValue = value.replace(stripRe, '');
+            if (newValue !== value) {
+                me.setRawValue(newValue);
+                value = newValue;
+            }
+        }
+        return value;
+    },
+
+    
+    onDisable: function(){
+        this.callParent();
+        if (Ext.isIE) {
+            this.inputEl.dom.unselectable = 'on';
+        }
+    },
+
+    
+    onEnable: function(){
+        this.callParent();
+        if (Ext.isIE) {
+            this.inputEl.dom.unselectable = '';
+        }
+    },
+
+    onKeyDown: function(e) {
+        this.fireEvent('keydown', this, e);
+    },
+
+    onKeyUp: function(e) {
+        this.fireEvent('keyup', this, e);
+    },
+
+    onKeyPress: function(e) {
+        this.fireEvent('keypress', this, e);
+    },
+
+    
+    reset : function(){
+        this.callParent();
+        this.applyEmptyText();
+    },
+
+    applyEmptyText : function(){
+        var me = this,
+            emptyText = me.emptyText,
+            isEmpty;
+
+        if (me.rendered && emptyText) {
+            isEmpty = me.getRawValue().length < 1 && !me.hasFocus;
+
+            if (Ext.supports.Placeholder) {
+                me.inputEl.dom.placeholder = emptyText;
+            } else if (isEmpty) {
+                me.setRawValue(emptyText);
+            }
+
+            
+            
+            if (isEmpty) {
+                me.inputEl.addCls(me.emptyCls);
+            }
+
+            me.autoSize();
+        }
+    },
+
+    
+    preFocus : function(){
+        var me = this,
+            inputEl = me.inputEl,
+            emptyText = me.emptyText,
+            isEmpty;
+
+        if (emptyText && !Ext.supports.Placeholder && inputEl.dom.value === emptyText) {
+            me.setRawValue('');
+            isEmpty = true;
+            inputEl.removeCls(me.emptyCls);
+        } else if (Ext.supports.Placeholder) {
+            me.inputEl.removeCls(me.emptyCls);
+        }
+        if (me.selectOnFocus || isEmpty) {
+            inputEl.dom.select();
+        }
+    },
+
+    onFocus: function() {
+        var me = this;
+        me.callParent(arguments);
+        if (me.emptyText) {
+            me.autoSize();
+        }
+    },
+
+    
+    postBlur : function(){
+        this.applyEmptyText();
+    },
+
+    
+    filterKeys : function(e){
+        
+        if (e.ctrlKey && !e.altKey) {
+            return;
+        }
+        var key = e.getKey(),
+            charCode = String.fromCharCode(e.getCharCode());
+
+        if(Ext.isGecko && (e.isNavKeyPress() || key === e.BACKSPACE || (key === e.DELETE && e.button === -1))){
+            return;
+        }
+
+        if(!Ext.isGecko && e.isSpecialKey() && !charCode){
+            return;
+        }
+        if(!this.maskRe.test(charCode)){
+            e.stopEvent();
+        }
+    },
+
+    
+    getRawValue: function() {
+        var me = this,
+            v = me.callParent();
+        if (v === me.emptyText) {
+            v = '';
+        }
+        return v;
+    },
+
+    
+    setValue: function(value) {
+        var me = this,
+            inputEl = me.inputEl;
+
+        if (inputEl && me.emptyText && !Ext.isEmpty(value)) {
+            inputEl.removeCls(me.emptyCls);
+        }
+
+        me.callParent(arguments);
+
+        me.applyEmptyText();
+        return me;
+    },
+
+    
+    getErrors: function(value) {
+        var me = this,
+            errors = me.callParent(arguments),
+            validator = me.validator,
+            emptyText = me.emptyText,
+            allowBlank = me.allowBlank,
+            vtype = me.vtype,
+            vtypes = Ext.form.field.VTypes,
+            regex = me.regex,
+            format = Ext.String.format,
+            msg;
+
+        value = value || me.processRawValue(me.getRawValue());
+
+        if (Ext.isFunction(validator)) {
+            msg = validator.call(me, value);
+            if (msg !== true) {
+                errors.push(msg);
+            }
+        }
+
+        if (value.length < 1 || value === emptyText) {
+            if (!allowBlank) {
+                errors.push(me.blankText);
+            }
+            
+            return errors;
+        }
+
+        if (value.length < me.minLength) {
+            errors.push(format(me.minLengthText, me.minLength));
+        }
+
+        if (value.length > me.maxLength) {
+            errors.push(format(me.maxLengthText, me.maxLength));
+        }
+
+        if (vtype) {
+            if(!vtypes[vtype](value, me)){
+                errors.push(me.vtypeText || vtypes[vtype +'Text']);
+            }
+        }
+
+        if (regex && !regex.test(value)) {
+            errors.push(me.regexText || me.invalidText);
+        }
+
+        return errors;
+    },
+
+    
+    selectText : function(start, end){
+        var me = this,
+            v = me.getRawValue(),
+            doFocus = true,
+            el = me.inputEl.dom,
+            undef,
+            range;
+
+        if (v.length > 0) {
+            start = start === undef ? 0 : start;
+            end = end === undef ? v.length : end;
+            if (el.setSelectionRange) {
+                el.setSelectionRange(start, end);
+            }
+            else if(el.createTextRange) {
+                range = el.createTextRange();
+                range.moveStart('character', start);
+                range.moveEnd('character', end - v.length);
+                range.select();
+            }
+            doFocus = Ext.isGecko || Ext.isOpera;
+        }
+        if (doFocus) {
+            me.focus();
+        }
+    },
+
+    
+    autoSize: function() {
+        var me = this,
+            width;
+        if (me.grow && me.rendered) {
+            me.doComponentLayout();
+            width = me.inputEl.getWidth();
+            if (width !== me.lastInputWidth) {
+                me.fireEvent('autosize', width);
+                me.lastInputWidth = width;
+            }
+        }
+    },
+
+    initAria: function() {
+        this.callParent();
+        this.getActionEl().dom.setAttribute('aria-required', this.allowBlank === false);
+    },
+
+    
+    getBodyNaturalWidth: function() {
+        return Math.round(this.size * 6.5) + 20;
+    }
+
+});
+
+
+Ext.define('Ext.form.field.TextArea', {
+    extend:'Ext.form.field.Text',
+    alias: ['widget.textareafield', 'widget.textarea'],
+    alternateClassName: 'Ext.form.TextArea',
+    requires: ['Ext.XTemplate', 'Ext.layout.component.field.TextArea'],
+
+    fieldSubTpl: [
+        '<textarea id="{id}" ',
+            '<tpl if="name">name="{name}" </tpl>',
+            '<tpl if="rows">rows="{rows}" </tpl>',
+            '<tpl if="cols">cols="{cols}" </tpl>',
+            '<tpl if="tabIdx">tabIndex="{tabIdx}" </tpl>',
+            'class="{fieldCls} {typeCls}" ',
+            'autocomplete="off">',
+        '</textarea>',
+        {
+            compiled: true,
+            disableFormats: true
+        }
+    ],
+
+    
+    growMin: 60,
+
+    
+    growMax: 1000,
+
+    
+    growAppend: '\n-',
+
+    
+    cols: 20,
+
+    
+    rows: 4,
+
+    
+    enterIsSpecial: false,
+
+    
+    preventScrollbars: false,
+
+    
+    componentLayout: 'textareafield',
+
+    
+    onRender: function(ct, position) {
+        var me = this;
+        Ext.applyIf(me.subTplData, {
+            cols: me.cols,
+            rows: me.rows
+        });
+
+        me.callParent(arguments);
+    },
+
+    
+    afterRender: function(){
+        var me = this;
+
+        me.callParent(arguments);
+
+        if (me.grow) {
+            if (me.preventScrollbars) {
+                me.inputEl.setStyle('overflow', 'hidden');
+            }
+            me.inputEl.setHeight(me.growMin);
+        }
+    },
+
+    
+    fireKey: function(e) {
+        if (e.isSpecialKey() && (this.enterIsSpecial || (e.getKey() !== e.ENTER || e.hasModifier()))) {
+            this.fireEvent('specialkey', this, e);
+        }
+    },
+
+    
+    autoSize: function() {
+        var me = this,
+            height;
+
+        if (me.grow && me.rendered) {
+            me.doComponentLayout();
+            height = me.inputEl.getHeight();
+            if (height !== me.lastInputHeight) {
+                me.fireEvent('autosize', height);
+                me.lastInputHeight = height;
+            }
+        }
+    },
+
+    
+    initAria: function() {
+        this.callParent(arguments);
+        this.getActionEl().dom.setAttribute('aria-multiline', true);
+    },
+
+    
+    getBodyNaturalWidth: function() {
+        return Math.round(this.cols * 6.5) + 20;
+    }
+
+});
+
+
+
+Ext.define('Ext.window.MessageBox', {
+    extend: 'Ext.window.Window',
+
+    requires: [
+        'Ext.toolbar.Toolbar',
+        'Ext.form.field.Text',
+        'Ext.form.field.TextArea',
+        'Ext.button.Button',
+        'Ext.layout.container.Anchor',
+        'Ext.layout.container.HBox',
+        'Ext.ProgressBar'
+    ],
+
+    alias: 'widget.messagebox',
+
+    
+    OK : 1,
+    
+    YES : 2,
+    
+    NO : 4,
+    
+    CANCEL : 8,
+    
+    OKCANCEL : 9,
+    
+    YESNO : 6,
+    
+    YESNOCANCEL : 14,
+    
+    INFO : 'ext-mb-info',
+    
+    WARNING : 'ext-mb-warning',
+    
+    QUESTION : 'ext-mb-question',
+    
+    ERROR : 'ext-mb-error',
+
+    
+    hideMode: 'offsets',
+    closeAction: 'hide',
+    resizable: false,
+    title: ' ',
+
+    width: 600,
+    height: 500,
+    minWidth: 250,
+    maxWidth: 600,
+    minHeight: 110,
+    maxHeight: 500,
+    constrain: true,
+
+    cls: Ext.baseCSSPrefix + 'message-box',
+
+    layout: {
+        type: 'anchor'
+    },
+
+    
+    defaultTextHeight : 75,
+    
+    minProgressWidth : 250,
+    
+    minPromptWidth: 250,
+    
+    buttonText: {
+        ok: 'OK',
+        yes: 'Yes',
+        no: 'No',
+        cancel: 'Cancel'
+    },
+
+    buttonIds: [
+        'ok', 'yes', 'no', 'cancel'
+    ],
+
+    titleText: {
+        confirm: 'Confirm',
+        prompt: 'Prompt',
+        wait: 'Loading...',
+        alert: 'Attention'
+    },
+
+    iconHeight: 35,
+
+    makeButton: function(btnIdx) {
+        var btnId = this.buttonIds[btnIdx];
+        return Ext.create('Ext.button.Button', {
+            handler: this.btnCallback,
+            itemId: btnId,
+            scope: this,
+            text: this.buttonText[btnId],
+            minWidth: 75
+        });
+    },
+
+    btnCallback: function(btn) {
+        var me = this,
+            value,
+            field;
+
+        if (me.cfg.prompt || me.cfg.multiline) {
+            if (me.cfg.multiline) {
+                field = me.textArea;
+            } else {
+                field = me.textField;
+            }
+            value = field.getValue();
+            field.reset();
+        }
+
+        
+        btn.blur();
+        me.hide();
+        me.userCallback(btn.itemId, value, me.cfg);
+    },
+
+    hide: function() {
+        var me = this;
+        me.dd.endDrag();
+        me.progressBar.reset();
+        me.removeCls(me.cfg.cls);
+        me.callParent();
+    },
+
+    initComponent: function() {
+        var me = this,
+            i, button;
+
+        me.title = ' ';
+
+        me.topContainer = Ext.create('Ext.container.Container', {
+            anchor: '100%',
+            style: {
+                padding: '10px',
+                overflow: 'hidden'
+            },
+            items: [
+                me.iconComponent = Ext.create('Ext.Component', {
+                    cls: 'ext-mb-icon',
+                    width: 50,
+                    height: me.iconHeight,
+                    style: {
+                        'float': 'left'
+                    }
+                }),
+                me.promptContainer = Ext.create('Ext.container.Container', {
+                    layout: {
+                        type: 'anchor'
+                    },
+                    items: [
+                        me.msg = Ext.create('Ext.Component', {
+                            autoEl: { tag: 'span' },
+                            cls: 'ext-mb-text'
+                        }),
+                        me.textField = Ext.create('Ext.form.field.Text', {
+                            anchor: '100%',
+                            enableKeyEvents: true,
+                            listeners: {
+                                keydown: me.onPromptKey,
+                                scope: me
+                            }
+                        }),
+                        me.textArea = Ext.create('Ext.form.field.TextArea', {
+                            anchor: '100%',
+                            height: 75
+                        })
+                    ]
+                })
+            ]
+        });
+        me.progressBar = Ext.create('Ext.ProgressBar', {
+            anchor: '-10',
+            style: 'margin-left:10px'
+        });
+
+        me.items = [me.topContainer, me.progressBar];
+
+        
+        me.msgButtons = [];
+        for (i = 0; i < 4; i++) {
+            button = me.makeButton(i);
+            me.msgButtons[button.itemId] = button;
+            me.msgButtons.push(button);
+        }
+        me.bottomTb = Ext.create('Ext.toolbar.Toolbar', {
+            ui: 'footer',
+            dock: 'bottom',
+            layout: {
+                pack: 'center'
+            },
+            items: [
+                me.msgButtons[0],
+                me.msgButtons[1],
+                me.msgButtons[2],
+                me.msgButtons[3]
+            ]
+        });
+        me.dockedItems = [me.bottomTb];
+
+        me.callParent();
+    },
+
+    onPromptKey: function(textField, e) {
+        var me = this,
+            blur;
+
+        if (e.keyCode === Ext.EventObject.RETURN || e.keyCode === 10) {
+            if (me.msgButtons.ok.isVisible()) {
+                blur = true;
+                me.msgButtons.ok.handler.call(me, me.msgButtons.ok);
+            } else if (me.msgButtons.yes.isVisible()) {
+                me.msgButtons.yes.handler.call(me, me.msgButtons.yes);
+                blur = true;
+            }
+
+            if (blur) {
+                me.textField.blur();
+            }
+        }
+    },
+
+    reconfigure: function(cfg) {
+        var me = this,
+            buttons = cfg.buttons || 0,
+            hideToolbar = true,
+            initialWidth = me.maxWidth,
+            i;
+
+        cfg = cfg || {};
+        me.cfg = cfg;
+        if (cfg.width) {
+            initialWidth = cfg.width;
+        }
+
+        
+        delete me.defaultFocus;
+
+        
+        me.animateTarget = cfg.animateTarget || undefined;
+
+        
+        me.modal = cfg.modal !== false;
+
+        
+        if (cfg.title) {
+            me.setTitle(cfg.title||' ');
+        }
+
+        if (!me.rendered) {
+            me.width = initialWidth;
+            me.render(Ext.getBody());
+        } else {
+            me.setSize(initialWidth, me.maxHeight);
+        }
+        me.setPosition(-10000, -10000);
+
+        
+        me.closable = cfg.closable && !cfg.wait;
+        me.header.child('[type=close]').setVisible(cfg.closable !== false);
+
+        
+        if (!cfg.title && !me.closable) {
+            me.header.hide();
+        } else {
+            me.header.show();
+        }
+
+        
+        me.liveDrag = !cfg.proxyDrag;
+
+        
+        me.userCallback = Ext.Function.bind(cfg.callback ||cfg.fn || Ext.emptyFn, cfg.scope || Ext.global);
+
+        
+        me.setIcon(cfg.icon);
+
+        
+        if (cfg.msg) {
+            me.msg.update(cfg.msg);
+            me.msg.show();
+        } else {
+            me.msg.hide();
+        }
+
+        
+        if (cfg.prompt || cfg.multiline) {
+            me.multiline = cfg.multiline;
+            if (cfg.multiline) {
+                me.textArea.setValue(cfg.value);
+                me.textArea.setHeight(cfg.defaultTextHeight || me.defaultTextHeight);
+                me.textArea.show();
+                me.textField.hide();
+                me.defaultFocus = me.textArea;
+            } else {
+                me.textField.setValue(cfg.value);
+                me.textArea.hide();
+                me.textField.show();
+                me.defaultFocus = me.textField;
+            }
+        } else {
+            me.textArea.hide();
+            me.textField.hide();
+        }
+
+        
+        if (cfg.progress || cfg.wait) {
+            me.progressBar.show();
+            me.updateProgress(0, cfg.progressText);
+            if(cfg.wait === true){
+                me.progressBar.wait(cfg.waitConfig);
+            }
+        } else {
+            me.progressBar.hide();
+        }
+
+        
+        for (i = 0; i < 4; i++) {
+            if (buttons & Math.pow(2, i)) {
+
+                
+                if (!me.defaultFocus) {
+                    me.defaultFocus = me.msgButtons[i];
+                }
+                me.msgButtons[i].show();
+                hideToolbar = false;
+            } else {
+                me.msgButtons[i].hide();
+            }
+        }
+
+        
+        if (hideToolbar) {
+            me.bottomTb.hide();
+        } else {
+            me.bottomTb.show();
+        }
+    },
+
+    
+    show: function(cfg) {
+        var me = this;
+
+        me.reconfigure(cfg);
+        me.addCls(cfg.cls);
+        if (cfg.animateTarget) {
+            me.doAutoSize(true);
+            me.callParent();
+        } else {
+            me.callParent();
+            me.doAutoSize(true);
+        }
+        return me;
+    },
+
+    afterShow: function(){
+        if (this.animateTarget) {
+            this.center();
+        }
+        this.callParent(arguments);
+    },
+
+    doAutoSize: function(center) {
+        var me = this,
+            icon = me.iconComponent,
+            iconHeight = me.iconHeight;
+
+        if (!Ext.isDefined(me.frameWidth)) {
+            me.frameWidth = me.el.getWidth() - me.body.getWidth();
+        }
+
+        
+        icon.setHeight(iconHeight);
+
+        
+        me.minWidth = me.cfg.minWidth || Ext.getClass(this).prototype.minWidth;
+
+        
+        
+        me.topContainer.doLayout();
+        if (Ext.isIE6 || Ext.isIEQuirks) {
+            
+            
+            
+            me.textField.setCalculatedSize(9);
+            me.textArea.setCalculatedSize(9);
+        }
+        var width = me.cfg.width || me.msg.getWidth() + icon.getWidth() + 25, 
+            height = (me.header.rendered ? me.header.getHeight() : 0) +
+            Math.max(me.promptContainer.getHeight(), icon.getHeight()) +
+            me.progressBar.getHeight() +
+            (me.bottomTb.rendered ? me.bottomTb.getHeight() : 0) + 20 ;
+
+        
+        icon.setHeight(Math.max(iconHeight, me.msg.getHeight()));
+        me.setSize(width + me.frameWidth, height + me.frameWidth);
+        if (center) {
+            me.center();
+        }
+        return me;
+    },
+
+    updateText: function(text) {
+        this.msg.update(text);
+        return this.doAutoSize(true);
+    },
+
+    
+    setIcon : function(icon) {
+        var me = this;
+        me.iconComponent.removeCls(me.iconCls);
+        if (icon) {
+            me.iconComponent.show();
+            me.iconComponent.addCls(Ext.baseCSSPrefix + 'dlg-icon');
+            me.iconComponent.addCls(me.iconCls = icon);
+        } else {
+            me.iconComponent.removeCls(Ext.baseCSSPrefix + 'dlg-icon');
+            me.iconComponent.hide();
+        }
+        return me;
+    },
+
+    
+    updateProgress : function(value, progressText, msg){
+        this.progressBar.updateProgress(value, progressText);
+        if (msg){
+            this.updateText(msg);
+        }
+        return this;
+    },
+
+    onEsc: function() {
+        if (this.closable !== false) {
+            this.callParent(arguments);
+        }
+    },
+
+    
+    confirm: function(cfg, msg, fn, scope) {
+        if (Ext.isString(cfg)) {
+            cfg = {
+                title: cfg,
+                icon: 'ext-mb-question',
+                msg: msg,
+                buttons: this.YESNO,
+                callback: fn,
+                scope: scope
+            };
+        }
+        return this.show(cfg);
+    },
+
+    
+    prompt : function(cfg, msg, fn, scope, multiline, value){
+        if (Ext.isString(cfg)) {
+            cfg = {
+                prompt: true,
+                title: cfg,
+                minWidth: this.minPromptWidth,
+                msg: msg,
+                buttons: this.OKCANCEL,
+                callback: fn,
+                scope: scope,
+                multiline: multiline,
+                value: value
+            };
+        }
+        return this.show(cfg);
+    },
+
+    
+    wait : function(cfg, title, config){
+        if (Ext.isString(cfg)) {
+            cfg = {
+                title : title,
+                msg : cfg,
+                closable: false,
+                wait: true,
+                modal: true,
+                minWidth: this.minProgressWidth,
+                waitConfig: config
+            };
+        }
+        return this.show(cfg);
+    },
+
+    
+    alert: function(cfg, msg, fn, scope) {
+        if (Ext.isString(cfg)) {
+            cfg = {
+                title : cfg,
+                msg : msg,
+                buttons: this.OK,
+                fn: fn,
+                scope : scope,
+                minWidth: this.minWidth
+            };
+        }
+        return this.show(cfg);
+    },
+
+    
+    progress : function(cfg, msg, progressText){
+        if (Ext.isString(cfg)) {
+            cfg = {
+                title: cfg,
+                msg: msg,
+                progress: true,
+                progressText: progressText
+            };
+        }
+        return this.show(cfg);
+    }
+}, function() {
+    
+    Ext.MessageBox = Ext.Msg = new this();
+});
+
+Ext.define('Ext.form.Basic', {
+    extend: 'Ext.util.Observable',
+    alternateClassName: 'Ext.form.BasicForm',
+    requires: ['Ext.util.MixedCollection', 'Ext.form.action.Load', 'Ext.form.action.Submit',
+               'Ext.window.MessageBox', 'Ext.data.Errors', 'Ext.util.DelayedTask'],
+
+    
+    constructor: function(owner, config) {
+        var me = this,
+            onItemAddOrRemove = me.onItemAddOrRemove;
+
+        
+        me.owner = owner;
+
+        
+        me.mon(owner, {
+            add: onItemAddOrRemove,
+            remove: onItemAddOrRemove,
+            scope: me
+        });
+
+        Ext.apply(me, config);
+
+        
+        if (Ext.isString(me.paramOrder)) {
+            me.paramOrder = me.paramOrder.split(/[\s,|]/);
+        }
+
+        me.checkValidityTask = Ext.create('Ext.util.DelayedTask', me.checkValidity, me);
+
+        me.addEvents(
+            
+            'beforeaction',
+            
+            'actionfailed',
+            
+            'actioncomplete',
+            
+            'validitychange',
+            
+            'dirtychange'
+        );
+        me.callParent();
+    },
+
+    
+    initialize: function(){
+        this.initialized = true;
+        this.onValidityChange(!this.hasInvalidField());
+    },
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    timeout: 30,
+
+    
+
+    
+
+    
+    paramsAsHash: false,
+
+    
+    waitTitle: 'Please Wait...',
+
+    
+    trackResetOnLoad: false,
+
+    
+
+    
+
+
+    
+    wasDirty: false,
+
+
+    
+    destroy: function() {
+        this.clearListeners();
+        this.checkValidityTask.cancel();
+    },
+
+    
+    onItemAddOrRemove: function(parent, child) {
+        var me = this,
+            isAdding = !!child.ownerCt,
+            isContainer = child.isContainer;
+
+        function handleField(field) {
+            
+            me[isAdding ? 'mon' : 'mun'](field, {
+                validitychange: me.checkValidity,
+                dirtychange: me.checkDirty,
+                scope: me,
+                buffer: 100 
+            });
+            
+            delete me._fields;
+        }
+
+        if (child.isFormField) {
+            handleField(child);
+        } else if (isContainer) {
+            
+            if (child.isDestroyed) {
+                
+                
+                delete me._fields;
+            } else {
+                Ext.Array.forEach(child.query('[isFormField]'), handleField);
+            }
+        }
+
+        
+        delete this._boundItems;
+
+        
+        
+        if (me.initialized) {
+            me.checkValidityTask.delay(10);
+        }
+    },
+
+    
+    getFields: function() {
+        var fields = this._fields;
+        if (!fields) {
+            fields = this._fields = Ext.create('Ext.util.MixedCollection');
+            fields.addAll(this.owner.query('[isFormField]'));
+        }
+        return fields;
+    },
+
+    
+    getBoundItems: function() {
+        var boundItems = this._boundItems;
+        
+        if (!boundItems || boundItems.getCount() === 0) {
+            boundItems = this._boundItems = Ext.create('Ext.util.MixedCollection');
+            boundItems.addAll(this.owner.query('[formBind]'));
+        }
+        
+        return boundItems;
+    },
+
+    
+    hasInvalidField: function() {
+        return !!this.getFields().findBy(function(field) {
+            var preventMark = field.preventMark,
+                isValid;
+            field.preventMark = true;
+            isValid = field.isValid();
+            field.preventMark = preventMark;
+            return !isValid;
+        });
+    },
+
+    
+    isValid: function() {
+        var me = this,
+            invalid;
+        me.batchLayouts(function() {
+            invalid = me.getFields().filterBy(function(field) {
+                return !field.validate();
+            });
+        });
+        return invalid.length < 1;
+    },
+
+    
+    checkValidity: function() {
+        var me = this,
+            valid = !me.hasInvalidField();
+        if (valid !== me.wasValid) {
+            me.onValidityChange(valid);
+            me.fireEvent('validitychange', me, valid);
+            me.wasValid = valid;
+        }
+    },
+
+    
+    onValidityChange: function(valid) {
+        var boundItems = this.getBoundItems();
+        if (boundItems) {
+            boundItems.each(function(cmp) {
+                if (cmp.disabled === valid) {
+                    cmp.setDisabled(!valid);
+                }
+            });
+        }
+    },
+
+    
+    isDirty: function() {
+        return !!this.getFields().findBy(function(f) {
+            return f.isDirty();
+        });
+    },
+
+    
+    checkDirty: function() {
+        var dirty = this.isDirty();
+        if (dirty !== this.wasDirty) {
+            this.fireEvent('dirtychange', this, dirty);
+            this.wasDirty = dirty;
+        }
+    },
+
+    
+    hasUpload: function() {
+        return !!this.getFields().findBy(function(f) {
+            return f.isFileUpload();
+        });
+    },
+
+    
+    doAction: function(action, options) {
+        if (Ext.isString(action)) {
+            action = Ext.ClassManager.instantiateByAlias('formaction.' + action, Ext.apply({}, options, {form: this}));
+        }
+        if (this.fireEvent('beforeaction', this, action) !== false) {
+            this.beforeAction(action);
+            Ext.defer(action.run, 100, action);
+        }
+        return this;
+    },
+
+    
+    submit: function(options) {
+        return this.doAction(this.standardSubmit ? 'standardsubmit' : this.api ? 'directsubmit' : 'submit', options);
+    },
+
+    
+    load: function(options) {
+        return this.doAction(this.api ? 'directload' : 'load', options);
+    },
+
+    
+    updateRecord: function(record) {
+        var fields = record.fields,
+            values = this.getFieldValues(),
+            name,
+            obj = {};
+
+        fields.each(function(f) {
+            name = f.name;
+            if (name in values) {
+                obj[name] = values[name];
+            }
+        });
+
+        record.beginEdit();
+        record.set(obj);
+        record.endEdit();
+
+        return this;
+    },
+
+    
+    loadRecord: function(record) {
+        this._record = record;
+        return this.setValues(record.data);
+    },
+
+    
+    getRecord: function() {
+        return this._record;
+    },
+
+    
+    beforeAction: function(action) {
+        var waitMsg = action.waitMsg,
+            maskCls = Ext.baseCSSPrefix + 'mask-loading',
+            waitMsgTarget;
+
+        
+        this.getFields().each(function(f) {
+            if (f.isFormField && f.syncValue) {
+                f.syncValue();
+            }
+        });
+
+        if (waitMsg) {
+            waitMsgTarget = this.waitMsgTarget;
+            if (waitMsgTarget === true) {
+                this.owner.el.mask(waitMsg, maskCls);
+            } else if (waitMsgTarget) {
+                waitMsgTarget = this.waitMsgTarget = Ext.get(waitMsgTarget);
+                waitMsgTarget.mask(waitMsg, maskCls);
+            } else {
+                Ext.MessageBox.wait(waitMsg, action.waitTitle || this.waitTitle);
+            }
+        }
+    },
+
+    
+    afterAction: function(action, success) {
+        if (action.waitMsg) {
+            var MessageBox = Ext.MessageBox,
+                waitMsgTarget = this.waitMsgTarget;
+            if (waitMsgTarget === true) {
+                this.owner.el.unmask();
+            } else if (waitMsgTarget) {
+                waitMsgTarget.unmask();
+            } else {
+                MessageBox.updateProgress(1);
+                MessageBox.hide();
+            }
+        }
+        if (success) {
+            if (action.reset) {
+                this.reset();
+            }
+            Ext.callback(action.success, action.scope || action, [this, action]);
+            this.fireEvent('actioncomplete', this, action);
+        } else {
+            Ext.callback(action.failure, action.scope || action, [this, action]);
+            this.fireEvent('actionfailed', this, action);
+        }
+    },
+
+
+    
+    findField: function(id) {
+        return this.getFields().findBy(function(f) {
+            return f.id === id || f.getName() === id;
+        });
+    },
+
+
+    
+    markInvalid: function(errors) {
+        var me = this;
+
+        function mark(fieldId, msg) {
+            var field = me.findField(fieldId);
+            if (field) {
+                field.markInvalid(msg);
+            }
+        }
+
+        if (Ext.isArray(errors)) {
+            Ext.each(errors, function(err) {
+                mark(err.id, err.msg);
+            });
+        }
+        else if (errors instanceof Ext.data.Errors) {
+            errors.each(function(err) {
+                mark(err.field, err.message);
+            });
+        }
+        else {
+            Ext.iterate(errors, mark);
+        }
+        return this;
+    },
+
+    
+    setValues: function(values) {
+        var me = this;
+
+        function setVal(fieldId, val) {
+            var field = me.findField(fieldId);
+            if (field) {
+                field.setValue(val);
+                if (me.trackResetOnLoad) {
+                    field.resetOriginalValue();
+                }
+            }
+        }
+
+        if (Ext.isArray(values)) {
+            
+            Ext.each(values, function(val) {
+                setVal(val.id, val.value);
+            });
+        } else {
+            
+            Ext.iterate(values, setVal);
+        }
+        return this;
+    },
+
+    
+    getValues: function(asString, dirtyOnly, includeEmptyText, useDataValues) {
+        var values = {};
+
+        this.getFields().each(function(field) {
+            if (!dirtyOnly || field.isDirty()) {
+                var data = field[useDataValues ? 'getModelData' : 'getSubmitData'](includeEmptyText);
+                if (Ext.isObject(data)) {
+                    Ext.iterate(data, function(name, val) {
+                        if (includeEmptyText && val === '') {
+                            val = field.emptyText || '';
+                        }
+                        if (name in values) {
+                            var bucket = values[name],
+                                isArray = Ext.isArray;
+                            if (!isArray(bucket)) {
+                                bucket = values[name] = [bucket];
+                            }
+                            if (isArray(val)) {
+                                values[name] = bucket.concat(val);
+                            } else {
+                                bucket.push(val);
+                            }
+                        } else {
+                            values[name] = val;
+                        }
+                    });
+                }
+            }
+        });
+
+        if (asString) {
+            values = Ext.Object.toQueryString(values);
+        }
+        return values;
+    },
+
+    
+    getFieldValues: function(dirtyOnly) {
+        return this.getValues(false, dirtyOnly, false, true);
+    },
+
+    
+    clearInvalid: function() {
+        var me = this;
+        me.batchLayouts(function() {
+            me.getFields().each(function(f) {
+                f.clearInvalid();
+            });
+        });
+        return me;
+    },
+
+    
+    reset: function() {
+        var me = this;
+        me.batchLayouts(function() {
+            me.getFields().each(function(f) {
+                f.reset();
+            });
+        });
+        return me;
+    },
+
+    
+    applyToFields: function(obj) {
+        this.getFields().each(function(f) {
+            Ext.apply(f, obj);
+        });
+        return this;
+    },
+
+    
+    applyIfToFields: function(obj) {
+        this.getFields().each(function(f) {
+            Ext.applyIf(f, obj);
+        });
+        return this;
+    },
+
+    
+    batchLayouts: function(fn) {
+        var me = this,
+            suspended = new Ext.util.HashMap();
+
+        
+        me.getFields().each(function(field) {
+            var ownerCt = field.ownerCt;
+            if (!suspended.contains(ownerCt)) {
+                suspended.add(ownerCt);
+                ownerCt.oldSuspendLayout = ownerCt.suspendLayout;
+                ownerCt.suspendLayout = true;
+            }
+        });
+
+        
+        fn();
+
+        
+        suspended.each(function(id, ct) {
+            ct.suspendLayout = ct.oldSuspendLayout;
+            delete ct.oldSuspendLayout;
+        });
+
+        
+        me.owner.doComponentLayout();
+    }
+});
+
+
+Ext.define('Ext.form.FieldAncestor', {
+
+    
+
+
+    
+    initFieldAncestor: function() {
+        var me = this,
+            onSubtreeChange = me.onFieldAncestorSubtreeChange;
+
+        me.addEvents(
+            
+            'fieldvaliditychange',
+
+            
+            'fielderrorchange'
+        );
+
+        
+        me.on('add', onSubtreeChange, me);
+        me.on('remove', onSubtreeChange, me);
+
+        me.initFieldDefaults();
+    },
+
+    
+    initFieldDefaults: function() {
+        if (!this.fieldDefaults) {
+            this.fieldDefaults = {};
+        }
+    },
+
+    
+    onFieldAncestorSubtreeChange: function(parent, child) {
+        var me = this,
+            isAdding = !!child.ownerCt;
+
+        function handleCmp(cmp) {
+            var isLabelable = cmp.isFieldLabelable,
+                isField = cmp.isFormField;
+            if (isLabelable || isField) {
+                if (isLabelable) {
+                    me['onLabelable' + (isAdding ? 'Added' : 'Removed')](cmp);
+                }
+                if (isField) {
+                    me['onField' + (isAdding ? 'Added' : 'Removed')](cmp);
+                }
+            }
+            else if (cmp.isContainer) {
+                Ext.Array.forEach(cmp.getRefItems(), handleCmp);
+            }
+        }
+        handleCmp(child);
+    },
+
+    
+    onLabelableAdded: function(labelable) {
+        var me = this;
+
+        
+        me.mon(labelable, 'errorchange', me.handleFieldErrorChange, me, {buffer: 10});
+
+        labelable.setFieldDefaults(me.fieldDefaults);
+    },
+
+    
+    onFieldAdded: function(field) {
+        var me = this;
+        me.mon(field, 'validitychange', me.handleFieldValidityChange, me);
+    },
+
+    
+    onLabelableRemoved: function(labelable) {
+        var me = this;
+        me.mun(labelable, 'errorchange', me.handleFieldErrorChange, me);
+    },
+
+    
+    onFieldRemoved: function(field) {
+        var me = this;
+        me.mun(field, 'validitychange', me.handleFieldValidityChange, me);
+    },
+
+    
+    handleFieldValidityChange: function(field, isValid) {
+        var me = this;
+        me.fireEvent('fieldvaliditychange', me, field, isValid);
+        me.onFieldValidityChange();
+    },
+
+    
+    handleFieldErrorChange: function(labelable, activeError) {
+        var me = this;
+        me.fireEvent('fielderrorchange', me, labelable, activeError);
+        me.onFieldErrorChange();
+    },
+
+    
+    onFieldValidityChange: Ext.emptyFn,
+
+    
+    onFieldErrorChange: Ext.emptyFn
+
+});
+
+Ext.define('Ext.layout.container.CheckboxGroup', {
+    extend: 'Ext.layout.container.Container',
+    alias: ['layout.checkboxgroup'],
+
+
+    onLayout: function() {
+        var numCols = this.getColCount(),
+            shadowCt = this.getShadowCt(),
+            owner = this.owner,
+            items = owner.items,
+            shadowItems = shadowCt.items,
+            numItems = items.length,
+            colIndex = 0,
+            i, numRows;
+
+        
+        
+        
+        
+
+        shadowItems.each(function(col) {
+            col.items.clear();
+        });
+
+        
+        
+        while (shadowItems.length > numCols) {
+            shadowCt.remove(shadowItems.last());
+        }
+        while (shadowItems.length < numCols) {
+            shadowCt.add({
+                xtype: 'container',
+                cls: owner.groupCls,
+                flex: 1
+            });
+        }
+
+        if (owner.vertical) {
+            numRows = Math.ceil(numItems / numCols);
+            for (i = 0; i < numItems; i++) {
+                if (i > 0 && i % numRows === 0) {
+                    colIndex++;
+                }
+                shadowItems.getAt(colIndex).items.add(items.getAt(i));
+            }
+        } else {
+            for (i = 0; i < numItems; i++) {
+                colIndex = i % numCols;
+                shadowItems.getAt(colIndex).items.add(items.getAt(i));
+            }
+        }
+
+        if (!shadowCt.rendered) {
+            shadowCt.render(this.getRenderTarget());
+        } else {
+            
+            
+            shadowItems.each(function(col) {
+                var layout = col.getLayout();
+                layout.renderItems(layout.getLayoutItems(), layout.getRenderTarget());
+            });
+        }
+
+        shadowCt.doComponentLayout();
+    },
+
+
+    
+    renderItems: Ext.emptyFn,
+
+
+    
+    getShadowCt: function() {
+        var me = this,
+            shadowCt = me.shadowCt,
+            owner, items, item, columns, columnsIsArray, numCols, i;
+
+        if (!shadowCt) {
+            
+            owner = me.owner;
+            columns = owner.columns;
+            columnsIsArray = Ext.isArray(columns);
+            numCols = me.getColCount();
+            items = [];
+            for(i = 0; i < numCols; i++) {
+                item = {
+                    xtype: 'container',
+                    cls: owner.groupCls
+                };
+                if (columnsIsArray) {
+                    
+                    
+                    if (columns[i] < 1) {
+                        item.flex = columns[i];
+                    } else {
+                        item.width = columns[i];
+                    }
+                }
+                else {
+                    
+                    item.flex = 1;
+                }
+                items.push(item);
+            }
+
+            
+            shadowCt = me.shadowCt = Ext.createWidget('container', {
+                layout: 'hbox',
+                items: items,
+                ownerCt: owner
+            });
+        }
+        
+        return shadowCt;
+    },
+
+
+    
+    getColCount: function() {
+        var owner = this.owner,
+            colsCfg = owner.columns;
+        return Ext.isArray(colsCfg) ? colsCfg.length : (Ext.isNumber(colsCfg) ? colsCfg : owner.items.length);
+    }
+
+});
+
+
+Ext.define('Ext.form.FieldContainer', {
+    extend: 'Ext.container.Container',
+    mixins: {
+        labelable: 'Ext.form.Labelable',
+        fieldAncestor: 'Ext.form.FieldAncestor'
+    },
+    alias: 'widget.fieldcontainer',
+
+    componentLayout: 'field',
+
+    
+    combineLabels: false,
+
+    
+    labelConnector: ', ',
+
+    
+    combineErrors: false,
+
+    maskOnDisable: false,
+
+    initComponent: function() {
+        var me = this,
+            onSubCmpAddOrRemove = me.onSubCmpAddOrRemove;
+
+        
+        me.initLabelable();
+        me.initFieldAncestor();
+
+        me.callParent();
+    },
+
+    
+    onLabelableAdded: function(labelable) {
+        var me = this;
+        me.mixins.fieldAncestor.onLabelableAdded.call(this, labelable);
+        me.updateLabel();
+    },
+
+    
+    onLabelableRemoved: function(labelable) {
+        var me = this;
+        me.mixins.fieldAncestor.onLabelableRemoved.call(this, labelable);
+        me.updateLabel();
+    },
+
+    onRender: function() {
+        var me = this;
+
+        me.onLabelableRender();
+
+        me.callParent(arguments);
+    },
+
+    initRenderTpl: function() {
+        var me = this;
+        if (!me.hasOwnProperty('renderTpl')) {
+            me.renderTpl = me.getTpl('labelableRenderTpl');
+        }
+        return me.callParent();
+    },
+
+    initRenderData: function() {
+        return Ext.applyIf(this.callParent(), this.getLabelableRenderData());
+    },
+
+    
+    getFieldLabel: function() {
+        var label = this.fieldLabel || '';
+        if (!label && this.combineLabels) {
+            label = Ext.Array.map(this.query('[isFieldLabelable]'), function(field) {
+                return field.getFieldLabel();
+            }).join(this.labelConnector);
+        }
+        return label;
+    },
+
+    
+    updateLabel: function() {
+        var me = this,
+            label = me.labelEl;
+        if (label) {
+            label.update(me.getFieldLabel());
+        }
+    },
+
+
+    
+    onFieldErrorChange: function(field, activeError) {
+        if (this.combineErrors) {
+            var me = this,
+                oldError = me.getActiveError(),
+                invalidFields = Ext.Array.filter(me.query('[isFormField]'), function(field) {
+                    return field.hasActiveError();
+                }),
+                newErrors = me.getCombinedErrors(invalidFields);
+
+            if (newErrors) {
+                me.setActiveErrors(newErrors);
+            } else {
+                me.unsetActiveError();
+            }
+
+            if (oldError !== me.getActiveError()) {
+                me.doComponentLayout();
+            }
+        }
+    },
+
+    
+    getCombinedErrors: function(invalidFields) {
+        var forEach = Ext.Array.forEach,
+            errors = [];
+        forEach(invalidFields, function(field) {
+            forEach(field.getActiveErrors(), function(error) {
+                var label = field.getFieldLabel();
+                errors.push((label ? label + ': ' : '') + error);
+            });
+        });
+        return errors;
+    },
+
+    getTargetEl: function() {
+        return this.bodyEl || this.callParent();
+    }
+});
+
+
+Ext.define('Ext.form.CheckboxGroup', {
+    extend:'Ext.form.FieldContainer',
+    mixins: {
+        field: 'Ext.form.field.Field'
+    },
+    alias: 'widget.checkboxgroup',
+    requires: ['Ext.layout.container.CheckboxGroup', 'Ext.form.field.Base'],
+
+    
+
+    
+
+    
+    columns : 'auto',
+
+    
+    vertical : false,
+
+    
+    allowBlank : true,
+
+    
+    blankText : "You must select at least one item in this group",
+
+    
+    defaultType : 'checkboxfield',
+
+    
+    groupCls : Ext.baseCSSPrefix + 'form-check-group',
+
+    
+    fieldBodyCls: Ext.baseCSSPrefix + 'form-checkboxgroup-body',
+
+    
+    layout: 'checkboxgroup',
+
+    initComponent: function() {
+        var me = this;
+        me.callParent();
+        me.initField();
+    },
+
+    
+    initValue: function() {
+        var me = this,
+            valueCfg = me.value;
+        me.originalValue = me.lastValue = valueCfg || me.getValue();
+        if (valueCfg) {
+            me.setValue(valueCfg);
+        }
+    },
+
+    
+    onFieldAdded: function(field) {
+        var me = this;
+        if (field.isCheckbox) {
+            me.mon(field, 'change', me.checkChange, me);
+        }
+        me.callParent(arguments);
+    },
+
+    onFieldRemoved: function(field) {
+        var me = this;
+        if (field.isCheckbox) {
+            me.mun(field, 'change', me.checkChange, me);
+        }
+        me.callParent(arguments);
+    },
+
+    
+    isEqual: function(value1, value2) {
+        var toQueryString = Ext.Object.toQueryString;
+        return toQueryString(value1) === toQueryString(value2);
+    },
+
+    
+    getErrors: function() {
+        var errors = [];
+        if (!this.allowBlank && Ext.isEmpty(this.getChecked())) {
+            errors.push(this.blankText);
+        }
+        return errors;
+    },
+
+    
+    getBoxes: function() {
+        return this.query('[isCheckbox]');
+    },
+
+    
+    eachBox: function(fn, scope) {
+        Ext.Array.forEach(this.getBoxes(), fn, scope || this);
+    },
+
+    
+    getChecked: function() {
+        return Ext.Array.filter(this.getBoxes(), function(cb) {
+            return cb.getValue();
+        });
+    },
+
+    
+    isDirty: function(){
+        return Ext.Array.some(this.getBoxes(), function(cb) {
+            return cb.isDirty();
+        });
+    },
+
+    
+    setReadOnly: function(readOnly) {
+        this.eachBox(function(cb) {
+            cb.setReadOnly(readOnly);
+        });
+        this.readOnly = readOnly;
+    },
+
+    
+    reset: function() {
+        var me = this,
+            hadError = me.hasActiveError(),
+            preventMark = me.preventMark;
+        me.preventMark = true;
+        me.batchChanges(function() {
+            me.eachBox(function(cb) {
+                cb.reset();
+            });
+        });
+        me.preventMark = preventMark;
+        me.unsetActiveError();
+        if (hadError) {
+            me.doComponentLayout();
+        }
+    },
+
+    
+    resetOriginalValue: function() {
+        
+        
+        Ext.defer(function() {
+            this.callParent();
+        }, 1, this);
+    },
+
+
+    
+    setValue: function(value) {
+        var me = this;
+        me.batchChanges(function() {
+            me.eachBox(function(cb) {
+                var name = cb.getName(),
+                    cbValue = false;
+                if (value && name in value) {
+                    if (Ext.isArray(value[name])) {
+                        cbValue = Ext.Array.contains(value[name], cb.inputValue);
+                    } else {
+                        
+                        cbValue = value[name];
+                    }
+                }
+                cb.setValue(cbValue);
+            });
+        });
+        return me;
+    },
+
+
+    
+    getValue: function() {
+        var values = {};
+        this.eachBox(function(cb) {
+            var name = cb.getName(),
+                inputValue = cb.inputValue,
+                bucket;
+            if (cb.getValue()) {
+                if (name in values) {
+                    bucket = values[name];
+                    if (!Ext.isArray(bucket)) {
+                        bucket = values[name] = [bucket];
+                    }
+                    bucket.push(inputValue);
+                } else {
+                    values[name] = inputValue;
+                }
+            }
+        });
+        return values;
+    },
+
+    
+    getSubmitData: function() {
+        return null;
+    },
+
+    
+    getModelData: function() {
+        return null;
+    },
+
+    validate: function() {
+        var me = this,
+            errors = me.getErrors(),
+            isValid = Ext.isEmpty(errors),
+            wasValid = !me.hasActiveError();
+
+        if (isValid) {
+            me.unsetActiveError();
+        } else {
+            me.setActiveError(errors);
+        }
+        if (isValid !== wasValid) {
+            me.fireEvent('validitychange', me, isValid);
+            me.doComponentLayout();
+        }
+
+        return isValid;
+    }
+
+}, function() {
+
+    this.borrow(Ext.form.field.Base, ['markInvalid', 'clearInvalid']);
+
+});
+
+
+
+Ext.define('Ext.form.CheckboxManager', {
+    extend: 'Ext.util.MixedCollection',
+    singleton: true,
+
+    getByName: function(name) {
+        return this.filterBy(function(item) {
+            return item.name == name;
+        });
+    },
+
+    getWithValue: function(name, value) {
+        return this.filterBy(function(item) {
+            return item.name == name && item.inputValue == value;
+        });
+    },
+
+    getChecked: function(name) {
+        return this.filterBy(function(item) {
+            return item.name == name && item.checked;
+        });
+    }
+});
+
+
+Ext.define('Ext.form.FieldSet', {
+    extend: 'Ext.container.Container',
+    alias: 'widget.fieldset',
+    uses: ['Ext.form.field.Checkbox', 'Ext.panel.Tool', 'Ext.layout.container.Anchor', 'Ext.layout.component.FieldSet'],
+
+    
+
+    
+
+    
+
+    
+
+    
+    collapsed: false,
+
+    
+
+    
+    baseCls: Ext.baseCSSPrefix + 'fieldset',
+
+    
+    layout: 'anchor',
+
+    componentLayout: 'fieldset',
+
+    
+    ariaRole: '',
+
+    renderTpl: ['<div id="{id}-body" class="{baseCls}-body"></div>'],
+
+    maskOnDisable: false,
+
+    getElConfig: function(){
+        return {tag: 'fieldset', id: this.id};
+    },
+
+    initComponent: function() {
+        var me = this,
+            baseCls = me.baseCls;
+
+        me.callParent();
+
+        
+        me.initLegend();
+
+        
+        me.addChildEls('body');
+
+        if (me.collapsed) {
+            me.addCls(baseCls + '-collapsed');
+            me.collapse();
+        }
+    },
+
+    
+    onRender: function(container, position) {
+        this.callParent(arguments);
+        
+        this.initLegend();
+    },
+
+    
+    initLegend: function() {
+        var me = this,
+            legendItems,
+            legend = me.legend;
+
+        
+        if (!legend && (me.title || me.checkboxToggle || me.collapsible)) {
+            legendItems = [];
+
+            
+            if (me.checkboxToggle) {
+                legendItems.push(me.createCheckboxCmp());
+            }
+            
+            else if (me.collapsible) {
+                legendItems.push(me.createToggleCmp());
+            }
+
+            
+            legendItems.push(me.createTitleCmp());
+
+            legend = me.legend = Ext.create('Ext.container.Container', {
+                baseCls: me.baseCls + '-header',
+                ariaRole: '',
+                ownerCt: this,
+                getElConfig: function(){
+                    var result = {
+                        tag: 'legend',
+                        cls: this.baseCls
+                    };
+
+                    
+                    
+                    
+                    
+                    if (!Ext.isGecko3) {
+                        result.children = [{
+                            cls: Ext.baseCSSPrefix + 'clear'
+                        }];
+                    }
+                    return result;
+                },
+                items: legendItems
+            });
+        }
+
+        
+        if (legend && !legend.rendered && me.rendered) {
+            me.legend.render(me.el, me.body); 
+        }
+    },
+
+    
+    createTitleCmp: function() {
+        var me = this;
+        me.titleCmp = Ext.create('Ext.Component', {
+            html: me.title,
+            getElConfig: function() {
+                return {
+                    tag: Ext.isGecko3 ? 'span' : 'div',
+                    cls: me.titleCmp.cls,
+                    id: me.titleCmp.id
+                };
+            },
+            cls: me.baseCls + '-header-text'
+        });
+        return me.titleCmp;
+    },
+
+    
+
+    
+    createCheckboxCmp: function() {
+        var me = this,
+            suffix = '-checkbox';
+
+        me.checkboxCmp = Ext.create('Ext.form.field.Checkbox', {
+            getElConfig: function() {
+                return {
+                    tag: Ext.isGecko3 ? 'span' : 'div',
+                    id: me.checkboxCmp.id,
+                    cls: me.checkboxCmp.cls
+                };
+            },
+            name: me.checkboxName || me.id + suffix,
+            cls: me.baseCls + '-header' + suffix,
+            checked: !me.collapsed,
+            listeners: {
+                change: me.onCheckChange,
+                scope: me
+            }
+        });
+        return me.checkboxCmp;
+    },
+
+    
+
+    
+    createToggleCmp: function() {
+        var me = this;
+        me.toggleCmp = Ext.create('Ext.panel.Tool', {
+            getElConfig: function() {
+                return {
+                    tag: Ext.isGecko3 ? 'span' : 'div',
+                    id: me.toggleCmp.id,
+                    cls: me.toggleCmp.cls
+                };
+            },
+            type: 'toggle',
+            handler: me.toggle,
+            scope: me
+        });
+        return me.toggleCmp;
+    },
+
+    
+    setTitle: function(title) {
+        var me = this;
+        me.title = title;
+        me.initLegend();
+        me.titleCmp.update(title);
+        return me;
+    },
+
+    getTargetEl : function() {
+        return this.body || this.frameBody || this.el;
+    },
+
+    getContentTarget: function() {
+        return this.body;
+    },
+
+    
+    getRefItems: function(deep) {
+        var refItems = this.callParent(arguments),
+            legend = this.legend;
+
+        
+        if (legend) {
+            refItems.unshift(legend);
+            if (deep) {
+                refItems.unshift.apply(refItems, legend.getRefItems(true));
+            }
+        }
+        return refItems;
+    },
+
+    
+    expand : function(){
+        return this.setExpanded(true);
+    },
+
+    
+    collapse : function() {
+        return this.setExpanded(false);
+    },
+
+    
+    setExpanded: function(expanded) {
+        var me = this,
+            checkboxCmp = me.checkboxCmp;
+
+        expanded = !!expanded;
+
+        if (checkboxCmp) {
+            checkboxCmp.setValue(expanded);
+        }
+
+        if (expanded) {
+            me.removeCls(me.baseCls + '-collapsed');
+        } else {
+            me.addCls(me.baseCls + '-collapsed');
+        }
+        me.collapsed = !expanded;
+        if (expanded) {
+            
+            me.getComponentLayout().childrenChanged = true;
+        }
+        me.doComponentLayout();
+        return me;
+    },
+
+    
+    toggle: function() {
+        this.setExpanded(!!this.collapsed);
+    },
+
+    
+    onCheckChange: function(cmp, checked) {
+        this.setExpanded(checked);
+    },
+
+    beforeDestroy : function() {
+        var legend = this.legend;
+        if (legend) {
+            legend.destroy();
+        }
+        this.callParent();
+    }
+});
+
+
+Ext.define('Ext.form.Label', {
+    extend:'Ext.Component',
+    alias: 'widget.label',
+    requires: ['Ext.util.Format'],
+
+    
+    
+    
+    
+    maskOnDisable: false,
+    getElConfig: function(){
+        var me = this;
+        return {
+            tag: 'label', 
+            id: me.id, 
+            htmlFor: me.forId || '',
+            html: me.text ? Ext.util.Format.htmlEncode(me.text) : (me.html || '') 
+        };
+    },
+
+    
+    setText : function(text, encode){
+        var me = this;
+        
+        encode = encode !== false;
+        if(encode) {
+            me.text = text;
+            delete me.html;
+        } else {
+            me.html = text;
+            delete me.text;
+        }
+        
+        if(me.rendered){
+            me.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(text) : text;
+        }
+        return this;
+    }
+});
+
+
+
+Ext.define('Ext.form.Panel', {
+    extend:'Ext.panel.Panel',
+    mixins: {
+        fieldAncestor: 'Ext.form.FieldAncestor'
+    },
+    alias: 'widget.form',
+    alternateClassName: ['Ext.FormPanel', 'Ext.form.FormPanel'],
+    requires: ['Ext.form.Basic', 'Ext.util.TaskRunner'],
+
+    
+
+    
+
+    
+    layout: 'anchor',
+
+    ariaRole: 'form',
+
+    initComponent: function() {
+        var me = this;
+
+        if (me.frame) {
+            me.border = false;
+        }
+
+        me.initFieldAncestor();
+        me.callParent();
+
+        me.relayEvents(me.form, [
+            'beforeaction',
+            'actionfailed',
+            'actioncomplete',
+            'validitychange',
+            'dirtychange'
+        ]);
+
+        
+        if (me.pollForChanges) {
+            me.startPolling(me.pollInterval || 500);
+        }
+    },
+
+    initItems: function() {
+        
+        var me = this;
+
+        me.form = me.createForm();
+        me.callParent();
+        me.form.initialize();
+    },
+
+    
+    createForm: function() {
+        return Ext.create('Ext.form.Basic', this, Ext.applyIf({listeners: {}}, this.initialConfig));
+    },
+
+    
+    getForm: function() {
+        return this.form;
+    },
+
+    
+    loadRecord: function(record) {
+        return this.getForm().loadRecord(record);
+    },
+
+    
+    getRecord: function() {
+        return this.getForm().getRecord();
+    },
+
+    
+    getValues: function() {
+        return this.getForm().getValues();
+    },
+
+    beforeDestroy: function() {
+        this.stopPolling();
+        this.form.destroy();
+        this.callParent();
+    },
+
+    
+    load: function(options) {
+        this.form.load(options);
+    },
+
+    
+    submit: function(options) {
+        this.form.submit(options);
+    },
+
+    
+    disable: function(silent) {
+        this.callParent(arguments);
+        this.form.getFields().each(function(field) {
+            field.disable();
+        });
+    },
+
+    
+    enable: function(silent) {
+        this.callParent(arguments);
+        this.form.getFields().each(function(field) {
+            field.enable();
+        });
+    },
+
+    
+    startPolling: function(interval) {
+        this.stopPolling();
+        var task = Ext.create('Ext.util.TaskRunner', interval);
+        task.start({
+            interval: 0,
+            run: this.checkChange,
+            scope: this
+        });
+        this.pollTask = task;
+    },
+
+    
+    stopPolling: function() {
+        var task = this.pollTask;
+        if (task) {
+            task.stopAll();
+            delete this.pollTask;
+        }
+    },
+
+    
+    checkChange: function() {
+        this.form.getFields().each(function(field) {
+            field.checkChange();
+        });
+    }
+});
+
+
+Ext.define('Ext.form.RadioGroup', {
+    extend: 'Ext.form.CheckboxGroup',
+    alias: 'widget.radiogroup',
+
+    
+    
+    allowBlank : true,
+    
+    blankText : 'You must select one item in this group',
+
+    
+    defaultType : 'radiofield',
+
+    
+    groupCls : Ext.baseCSSPrefix + 'form-radio-group',
+
+    getBoxes: function() {
+        return this.query('[isRadio]');
+    },
+
+    
+    setValue: function(value) {
+        var me = this;
+        if (Ext.isObject(value)) {
+            Ext.Object.each(value, function(name, cbValue) {
+                var radios = Ext.form.RadioManager.getWithValue(name, cbValue);
+                radios.each(function(cb) {
+                    cb.setValue(true);
+                });
+            });
+        }
+        return me;
+    }
+});
+
+
+Ext.define('Ext.form.RadioManager', {
+    extend: 'Ext.util.MixedCollection',
+    singleton: true,
+
+    getByName: function(name) {
+        return this.filterBy(function(item) {
+            return item.name == name;
+        });
+    },
+
+    getWithValue: function(name, value) {
+        return this.filterBy(function(item) {
+            return item.name == name && item.inputValue == value;
+        });
+    },
+
+    getChecked: function(name) {
+        return this.findBy(function(item) {
+            return item.name == name && item.checked;
+        });
+    }
+});
+
+
+Ext.define('Ext.form.action.DirectLoad', {
+    extend:'Ext.form.action.Load',
+    requires: ['Ext.direct.Manager'],
+    alternateClassName: 'Ext.form.Action.DirectLoad',
+    alias: 'formaction.directload',
+
+    type: 'directload',
+
+    run: function() {
+        this.form.api.load.apply(window, this.getArgs());
+    },
+
+    
+    getArgs: function() {
+        var me = this,
+            args = [],
+            form = me.form,
+            paramOrder = form.paramOrder,
+            params = me.getParams(),
+            i, len;
+
+        
+        if (paramOrder) {
+            for (i = 0, len = paramOrder.length; i < len; i++) {
+                args.push(params[paramOrder[i]]);
+            }
+        }
+        
+        else if (form.paramsAsHash) {
+            args.push(params);
+        }
+
+        
+        args.push(me.onSuccess, me);
+
+        return args;
+    },
+
+    
+    
+    
+    processResponse: function(result) {
+        return (this.result = result);
+    },
+
+    onSuccess: function(result, trans) {
+        if (trans.type == Ext.direct.Manager.self.exceptions.SERVER) {
+            result = {};
+        }
+        this.callParent([result]);
+    }
+});
+
+
+
+
+Ext.define('Ext.form.action.DirectSubmit', {
+    extend:'Ext.form.action.Submit',
+    requires: ['Ext.direct.Manager'],
+    alternateClassName: 'Ext.form.Action.DirectSubmit',
+    alias: 'formaction.directsubmit',
+
+    type: 'directsubmit',
+
+    doSubmit: function() {
+        var me = this,
+            callback = Ext.Function.bind(me.onSuccess, me),
+            formEl = me.buildForm();
+        me.form.api.submit(formEl, callback, me);
+        Ext.removeNode(formEl);
+    },
+
+    
+    
+    
+    processResponse: function(result) {
+        return (this.result = result);
+    },
+
+    onSuccess: function(response, trans) {
+        if (trans.type === Ext.direct.Manager.self.exceptions.SERVER) {
+            response = {};
+        }
+        this.callParent([response]);
+    }
+});
+
+
+Ext.define('Ext.form.action.StandardSubmit', {
+    extend:'Ext.form.action.Submit',
+    alias: 'formaction.standardsubmit',
+
+    
+
+    
+    doSubmit: function() {
+        var form = this.buildForm();
+        form.submit();
+        Ext.removeNode(form);
+    }
+
+});
+
+
+Ext.define('Ext.form.field.Checkbox', {
+    extend: 'Ext.form.field.Base',
+    alias: ['widget.checkboxfield', 'widget.checkbox'],
+    alternateClassName: 'Ext.form.Checkbox',
+    requires: ['Ext.XTemplate', 'Ext.form.CheckboxManager'],
+
+    
+    fieldSubTpl: [
+        '<tpl if="boxLabel && boxLabelAlign == \'before\'">',
+            '<label id="{cmpId}-boxLabelEl" class="{boxLabelCls} {boxLabelCls}-{boxLabelAlign}" for="{id}">{boxLabel}</label>',
+        '</tpl>',
+        
+        
+        
+        '<input type="button" id="{id}" ',
+            '<tpl if="tabIdx">tabIndex="{tabIdx}" </tpl>',
+            'class="{fieldCls} {typeCls}" autocomplete="off" hidefocus="true" />',
+        '<tpl if="boxLabel && boxLabelAlign == \'after\'">',
+            '<label id="{cmpId}-boxLabelEl" class="{boxLabelCls} {boxLabelCls}-{boxLabelAlign}" for="{id}">{boxLabel}</label>',
+        '</tpl>',
+        {
+            disableFormats: true,
+            compiled: true
+        }
+    ],
+
+    isCheckbox: true,
+
+    
+    focusCls: Ext.baseCSSPrefix + 'form-cb-focus',
+
+    
+
+    
+    fieldBodyCls: Ext.baseCSSPrefix + 'form-cb-wrap',
+
+    
+    checked: false,
+
+    
+    checkedCls: Ext.baseCSSPrefix + 'form-cb-checked',
+
+    
+
+    
+    boxLabelCls: Ext.baseCSSPrefix + 'form-cb-label',
+
+    
+    boxLabelAlign: 'after',
+
+    
+    inputValue: 'on',
+
+    
+
+    
+
+    
+
+    
+    checkChangeEvents: [],
+    inputType: 'checkbox',
+    ariaRole: 'checkbox',
+
+    
+    onRe: /^on$/i,
+
+    initComponent: function(){
+        this.callParent(arguments);
+        this.getManager().add(this);
+    },
+
+    initValue: function() {
+        var me = this,
+            checked = !!me.checked;
+
+        
+        me.originalValue = me.lastValue = checked;
+
+        
+        me.setValue(checked);
+    },
+
+    
+    onRender : function(ct, position) {
+        var me = this;
+
+        
+        me.addChildEls('boxLabelEl');
+
+        Ext.applyIf(me.subTplData, {
+            boxLabel: me.boxLabel,
+            boxLabelCls: me.boxLabelCls,
+            boxLabelAlign: me.boxLabelAlign
+        });
+
+        me.callParent(arguments);
+    },
+
+    initEvents: function() {
+        var me = this;
+        me.callParent();
+        me.mon(me.inputEl, 'click', me.onBoxClick, me);
+    },
+
+    
+    onBoxClick: function(e) {
+        var me = this;
+        if (!me.disabled && !me.readOnly) {
+            this.setValue(!this.checked);
+        }
+    },
+
+    
+    getRawValue: function() {
+        return this.checked;
+    },
+
+    
+    getValue: function() {
+        return this.checked;
+    },
+
+    
+    getSubmitValue: function() {
+        var unchecked = this.uncheckedValue,
+            uncheckedVal = Ext.isDefined(unchecked) ? unchecked : null;
+        return this.checked ? this.inputValue : uncheckedVal;
+    },
+
+    
+    setRawValue: function(value) {
+        var me = this,
+            inputEl = me.inputEl,
+            inputValue = me.inputValue,
+            checked = (value === true || value === 'true' || value === '1' || value === 1 ||
+                (((Ext.isString(value) || Ext.isNumber(value)) && inputValue) ? value == inputValue : me.onRe.test(value)));
+
+        if (inputEl) {
+            inputEl.dom.setAttribute('aria-checked', checked);
+            me[checked ? 'addCls' : 'removeCls'](me.checkedCls);
+        }
+
+        me.checked = me.rawValue = checked;
+        return checked;
+    },
+
+    
+    setValue: function(checked) {
+        var me = this;
+
+        
+        
+        
+        
+        if (Ext.isArray(checked)) {
+            me.getManager().getByName(me.name).each(function(cb) {
+                cb.setValue(Ext.Array.contains(checked, cb.inputValue));
+            });
+        } else {
+            me.callParent(arguments);
+        }
+
+        return me;
+    },
+
+    
+    valueToRaw: function(value) {
+        
+        return value;
+    },
+
+    
+    onChange: function(newVal, oldVal) {
+        var me = this,
+            handler = me.handler;
+        if (handler) {
+            handler.call(me.scope || me, me, newVal);
+        }
+        me.callParent(arguments);
+    },
+
+    
+    beforeDestroy: function(){
+        this.callParent();
+        this.getManager().removeAtKey(this.id);
+    },
+
+    
+    getManager: function() {
+        return Ext.form.CheckboxManager;
+    },
+
+    onEnable: function() {
+        var me = this,
+            inputEl = me.inputEl;
+        me.callParent();
+        if (inputEl) {
+            
+            inputEl.dom.disabled = me.readOnly;
+        }
+    },
+
+    setReadOnly: function(readOnly) {
+        var me = this,
+            inputEl = me.inputEl;
+        if (inputEl) {
+            
+            inputEl.dom.disabled = readOnly || me.disabled;
+        }
+        me.readOnly = readOnly;
+    },
+
+    
+    
+    getBodyNaturalWidth: function() {
+        var me = this,
+            bodyEl = me.bodyEl,
+            ws = 'white-space',
+            width;
+        bodyEl.setStyle(ws, 'nowrap');
+        width = bodyEl.getWidth();
+        bodyEl.setStyle(ws, '');
+        return width;
+    }
+
+});
+
+
+
+Ext.define('Ext.layout.component.field.Trigger', {
+
+    
+
+    alias: ['layout.triggerfield'],
+
+    extend: 'Ext.layout.component.field.Field',
+
+    
+
+    type: 'triggerfield',
+
+    sizeBodyContents: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            inputEl = owner.inputEl,
+            triggerWrap = owner.triggerWrap,
+            triggerWidth = owner.getTriggerWidth();
+
+        
+        
+        if (owner.hideTrigger || owner.readOnly || triggerWidth > 0) {
+            
+            
+            me.setElementSize(inputEl, Ext.isNumber(width) ? width - triggerWidth : width);
+    
+            
+            triggerWrap.setWidth(triggerWidth);
+        }
+    }
+});
+
+Ext.define('Ext.view.View', {
+    extend: 'Ext.view.AbstractView',
+    alternateClassName: 'Ext.DataView',
+    alias: 'widget.dataview',
+
+    inheritableStatics: {
+        EventMap: {
+            mousedown: 'MouseDown',
+            mouseup: 'MouseUp',
+            click: 'Click',
+            dblclick: 'DblClick',
+            contextmenu: 'ContextMenu',
+            mouseover: 'MouseOver',
+            mouseout: 'MouseOut',
+            mouseenter: 'MouseEnter',
+            mouseleave: 'MouseLeave',
+            keydown: 'KeyDown',
+            focus: 'Focus'
+        }
+    },
+
+    addCmpEvents: function() {
+        this.addEvents(
+            
+            'beforeitemmousedown',
+            
+            'beforeitemmouseup',
+            
+            'beforeitemmouseenter',
+            
+            'beforeitemmouseleave',
+            
+            'beforeitemclick',
+            
+            'beforeitemdblclick',
+            
+            'beforeitemcontextmenu',
+            
+            'beforeitemkeydown',
+            
+            'itemmousedown',
+            
+            'itemmouseup',
+            
+            'itemmouseenter',
+            
+            'itemmouseleave',
+            
+            'itemclick',
+            
+            'itemdblclick',
+            
+            'itemcontextmenu',
+            
+            'itemkeydown',
+            
+            'beforecontainermousedown',
+            
+            'beforecontainermouseup',
+            
+            'beforecontainermouseover',
+            
+            'beforecontainermouseout',
+            
+            'beforecontainerclick',
+            
+            'beforecontainerdblclick',
+            
+            'beforecontainercontextmenu',
+            
+            'beforecontainerkeydown',
+            
+            'containermouseup',
+            
+            'containermouseover',
+            
+            'containermouseout',
+            
+            'containerclick',
+            
+            'containerdblclick',
+            
+            'containercontextmenu',
+            
+            'containerkeydown',
+
+            
+            'selectionchange',
+            
+            'beforeselect'
+        );
+    },
+    
+    afterRender: function(){
+        var me = this,
+            listeners;
+
+        me.callParent();
+
+        listeners = {
+            scope: me,
+            
+            freezeEvent: true,
+            click: me.handleEvent,
+            mousedown: me.handleEvent,
+            mouseup: me.handleEvent,
+            dblclick: me.handleEvent,
+            contextmenu: me.handleEvent,
+            mouseover: me.handleEvent,
+            mouseout: me.handleEvent,
+            keydown: me.handleEvent
+        };
+
+        me.mon(me.getTargetEl(), listeners);
+
+        if (me.store) {
+            me.bindStore(me.store, true);
+        }
+    },
+
+    handleEvent: function(e) {
+        if (this.processUIEvent(e) !== false) {
+            this.processSpecialEvent(e);
+        }
+    },
+
+    
+    processItemEvent: Ext.emptyFn,
+    processContainerEvent: Ext.emptyFn,
+    processSpecialEvent: Ext.emptyFn,
+
+    
+    stillOverItem: function (event, overItem) {
+        var nowOver;
+
+        
+        
+        
+        
+        
+        
+        if (overItem && typeof(overItem.offsetParent) === "object") {
+            
+            
+            nowOver = (event.type == 'mouseout') ? event.getRelatedTarget() : event.getTarget();
+            return Ext.fly(overItem).contains(nowOver);
+        }
+
+        return false;
+    },
+
+    processUIEvent: function(e) {
+        var me = this,
+            item = e.getTarget(me.getItemSelector(), me.getTargetEl()),
+            map = this.statics().EventMap,
+            index, record,
+            type = e.type,
+            overItem = me.mouseOverItem,
+            newType;
+
+        if (!item) {
+            if (type == 'mouseover' && me.stillOverItem(e, overItem)) {
+                item = overItem;
+            }
+
+            
+            if (type == 'keydown') {
+                record = me.getSelectionModel().getLastSelected();
+                if (record) {
+                    item = me.getNode(record);
+                }
+            }
+        }
+
+        if (item) {
+            index = me.indexOf(item);
+            if (!record) {
+                record = me.getRecord(item);
+            }
+
+            if (me.processItemEvent(record, item, index, e) === false) {
+                return false;
+            }
+
+            newType = me.isNewItemEvent(item, e);
+            if (newType === false) {
+                return false;
+            }
+
+            if (
+                (me['onBeforeItem' + map[newType]](record, item, index, e) === false) ||
+                (me.fireEvent('beforeitem' + newType, me, record, item, index, e) === false) ||
+                (me['onItem' + map[newType]](record, item, index, e) === false)
+            ) {
+                return false;
+            }
+
+            me.fireEvent('item' + newType, me, record, item, index, e);
+        }
+        else {
+            if (
+                (me.processContainerEvent(e) === false) ||
+                (me['onBeforeContainer' + map[type]](e) === false) ||
+                (me.fireEvent('beforecontainer' + type, me, e) === false) ||
+                (me['onContainer' + map[type]](e) === false)
+            ) {
+                return false;
+            }
+
+            me.fireEvent('container' + type, me, e);
+        }
+
+        return true;
+    },
+
+    isNewItemEvent: function (item, e) {
+        var me = this,
+            overItem = me.mouseOverItem,
+            type = e.type;
+
+        switch (type) {
+            case 'mouseover':
+                if (item === overItem) {
+                    return false;
+                }
+                me.mouseOverItem = item;
+                return 'mouseenter';
+
+            case 'mouseout':
+                
+                if (me.stillOverItem(e, overItem)) {
+                    return false;
+                }
+                me.mouseOverItem = null;
+                return 'mouseleave';
+        }
+        return type;
+    },
+
+    
+    onItemMouseEnter: function(record, item, index, e) {
+        if (this.trackOver) {
+            this.highlightItem(item);
+        }
+    },
+
+    
+    onItemMouseLeave : function(record, item, index, e) {
+        if (this.trackOver) {
+            this.clearHighlight();
+        }
+    },
+
+    
+    onItemMouseDown: Ext.emptyFn,
+    onItemMouseUp: Ext.emptyFn,
+    onItemFocus: Ext.emptyFn,
+    onItemClick: Ext.emptyFn,
+    onItemDblClick: Ext.emptyFn,
+    onItemContextMenu: Ext.emptyFn,
+    onItemKeyDown: Ext.emptyFn,
+    onBeforeItemMouseDown: Ext.emptyFn,
+    onBeforeItemMouseUp: Ext.emptyFn,
+    onBeforeItemFocus: Ext.emptyFn,
+    onBeforeItemMouseEnter: Ext.emptyFn,
+    onBeforeItemMouseLeave: Ext.emptyFn,
+    onBeforeItemClick: Ext.emptyFn,
+    onBeforeItemDblClick: Ext.emptyFn,
+    onBeforeItemContextMenu: Ext.emptyFn,
+    onBeforeItemKeyDown: Ext.emptyFn,
+
+    
+    onContainerMouseDown: Ext.emptyFn,
+    onContainerMouseUp: Ext.emptyFn,
+    onContainerMouseOver: Ext.emptyFn,
+    onContainerMouseOut: Ext.emptyFn,
+    onContainerClick: Ext.emptyFn,
+    onContainerDblClick: Ext.emptyFn,
+    onContainerContextMenu: Ext.emptyFn,
+    onContainerKeyDown: Ext.emptyFn,
+    onBeforeContainerMouseDown: Ext.emptyFn,
+    onBeforeContainerMouseUp: Ext.emptyFn,
+    onBeforeContainerMouseOver: Ext.emptyFn,
+    onBeforeContainerMouseOut: Ext.emptyFn,
+    onBeforeContainerClick: Ext.emptyFn,
+    onBeforeContainerDblClick: Ext.emptyFn,
+    onBeforeContainerContextMenu: Ext.emptyFn,
+    onBeforeContainerKeyDown: Ext.emptyFn,
+
+    
+    highlightItem: function(item) {
+        var me = this;
+        me.clearHighlight();
+        me.highlightedItem = item;
+        Ext.fly(item).addCls(me.overItemCls);
+    },
+
+    
+    clearHighlight: function() {
+        var me = this,
+            highlighted = me.highlightedItem;
+
+        if (highlighted) {
+            Ext.fly(highlighted).removeCls(me.overItemCls);
+            delete me.highlightedItem;
+        }
+    },
+
+    refresh: function() {
+        var me = this;
+        me.clearHighlight();
+        me.callParent(arguments);
+        if (!me.isFixedHeight()) {
+            me.doComponentLayout();
+        }
+    }
+});
+
+Ext.define('Ext.layout.component.BoundList', {
+    extend: 'Ext.layout.component.Component',
+    alias: 'layout.boundlist',
+
+    type: 'component',
+
+    beforeLayout: function() {
+        return this.callParent(arguments) || this.owner.refreshed > 0;
+    },
+
+    onLayout : function(width, height) {
+        var me = this,
+            owner = me.owner,
+            floating = owner.floating,
+            el = owner.el,
+            xy = el.getXY(),
+            isNumber = Ext.isNumber,
+            minWidth, maxWidth, minHeight, maxHeight,
+            naturalWidth, naturalHeight, constrainedWidth, constrainedHeight, undef;
+
+        if (floating) {
+            
+            el.setXY([-9999,-9999]);
+        }
+
+        
+        me.setTargetSize(width, height);
+
+        
+        if (!isNumber(width)) {
+            minWidth = owner.minWidth;
+            maxWidth = owner.maxWidth;
+            if (isNumber(minWidth) || isNumber(maxWidth)) {
+                naturalWidth = el.getWidth();
+                if (naturalWidth < minWidth) {
+                    constrainedWidth = minWidth;
+                }
+                else if (naturalWidth > maxWidth) {
+                    constrainedWidth = maxWidth;
+                }
+                if (constrainedWidth) {
+                    me.setTargetSize(constrainedWidth);
+                }
+            }
+        }
+        
+        if (!isNumber(height)) {
+            minHeight = owner.minHeight;
+            maxHeight = owner.maxHeight;
+            if (isNumber(minHeight) || isNumber(maxHeight)) {
+                naturalHeight = el.getHeight();
+                if (naturalHeight < minHeight) {
+                    constrainedHeight = minHeight;
+                }
+                else if (naturalHeight > maxHeight) {
+                    constrainedHeight = maxHeight;
+                }
+                if (constrainedHeight) {
+                    me.setTargetSize(undef, constrainedHeight);
+                }
+            }
+        }
+
+        if (floating) {
+            
+            el.setXY(xy);
+        }
+    },
+
+    afterLayout: function() {
+        var me = this,
+            toolbar = me.owner.pagingToolbar;
+        me.callParent();
+        if (toolbar) {
+            toolbar.doComponentLayout();
+        }
+    },
+
+    setTargetSize : function(width, height) {
+        var me = this,
+            owner = me.owner,
+            listHeight = null,
+            toolbar;
+
+        
+        if (Ext.isNumber(height)) {
+            listHeight = height - owner.el.getFrameWidth('tb');
+            toolbar = owner.pagingToolbar;
+            if (toolbar) {
+                listHeight -= toolbar.getHeight();
+            }
+        }
+        me.setElementSize(owner.listEl, null, listHeight);
+
+        me.callParent(arguments);
+    }
+
+});
+
+
+Ext.define('Ext.toolbar.TextItem', {
+    extend: 'Ext.toolbar.Item',
+    requires: ['Ext.XTemplate'],
+    alias: 'widget.tbtext',
+    alternateClassName: 'Ext.Toolbar.TextItem',
+
+    
+    text: '',
+
+    renderTpl: '{text}',
+    
+    baseCls: Ext.baseCSSPrefix + 'toolbar-text',
+
+    onRender : function() {
+        Ext.apply(this.renderData, {
+            text: this.text
+        });
+        this.callParent(arguments);
+    },
+
+    
+    setText : function(t) {
+        if (this.rendered) {
+            this.el.update(t);
+            this.ownerCt.doLayout(); 
+        } else {
+            this.text = t;
+        }
+    }
+});
+
+Ext.define('Ext.form.field.Trigger', {
+    extend:'Ext.form.field.Text',
+    alias: ['widget.triggerfield', 'widget.trigger'],
+    requires: ['Ext.DomHelper', 'Ext.util.ClickRepeater', 'Ext.layout.component.field.Trigger'],
+    alternateClassName: ['Ext.form.TriggerField', 'Ext.form.TwinTriggerField', 'Ext.form.Trigger'],
+
+    
+    fieldSubTpl: [
+        '<input id="{id}" type="{type}" ',
+            '<tpl if="name">name="{name}" </tpl>',
+            '<tpl if="size">size="{size}" </tpl>',
+            '<tpl if="tabIdx">tabIndex="{tabIdx}" </tpl>',
+            'class="{fieldCls} {typeCls}" autocomplete="off" />',
+        '<div id="{cmpId}-triggerWrap" class="{triggerWrapCls}" role="presentation">',
+            '{triggerEl}',
+            '<div class="{clearCls}" role="presentation"></div>',
+        '</div>',
+        {
+            compiled: true,
+            disableFormats: true
+        }
+    ],
+
+    
+
+    
+    triggerBaseCls: Ext.baseCSSPrefix + 'form-trigger',
+
+    
+    triggerWrapCls: Ext.baseCSSPrefix + 'form-trigger-wrap',
+
+    
+    hideTrigger: false,
+
+    
+    editable: true,
+
+    
+    readOnly: false,
+
+    
+
+    
+    repeatTriggerClick: false,
+
+
+    
+    autoSize: Ext.emptyFn,
+    
+    monitorTab: true,
+    
+    mimicing: false,
+    
+    triggerIndexRe: /trigger-index-(\d+)/,
+
+    componentLayout: 'triggerfield',
+
+    initComponent: function() {
+        this.wrapFocusCls = this.triggerWrapCls + '-focus';
+        this.callParent(arguments);
+    },
+
+    
+    onRender: function(ct, position) {
+        var me = this,
+            triggerCls,
+            triggerBaseCls = me.triggerBaseCls,
+            triggerWrapCls = me.triggerWrapCls,
+            triggerConfigs = [],
+            i;
+
+        
+        
+        
+        
+        if (!me.trigger1Cls) {
+            me.trigger1Cls = me.triggerCls;
+        }
+
+        
+        for (i = 0; (triggerCls = me['trigger' + (i + 1) + 'Cls']) || i < 1; i++) {
+            triggerConfigs.push({
+                cls: [Ext.baseCSSPrefix + 'trigger-index-' + i, triggerBaseCls, triggerCls].join(' '),
+                role: 'button'
+            });
+        }
+        triggerConfigs[i - 1].cls += ' ' + triggerBaseCls + '-last';
+
+        
+        me.addChildEls('triggerWrap');
+
+        Ext.applyIf(me.subTplData, {
+            triggerWrapCls: triggerWrapCls,
+            triggerEl: Ext.DomHelper.markup(triggerConfigs),
+            clearCls: me.clearCls
+        });
+
+        me.callParent(arguments);
+
+        
+        me.triggerEl = Ext.select('.' + triggerBaseCls, true, me.triggerWrap.dom);
+
+        me.doc = Ext.getDoc();
+        me.initTrigger();
+    },
+
+    onEnable: function() {
+        this.callParent();
+        this.triggerWrap.unmask();
+    },
+    
+    onDisable: function() {
+        this.callParent();
+        this.triggerWrap.mask();
+    },
+    
+    afterRender: function() {
+        this.callParent();
+        this.updateEditState();
+        this.triggerEl.unselectable();
+    },
+
+    updateEditState: function() {
+        var me = this,
+            inputEl = me.inputEl,
+            triggerWrap = me.triggerWrap,
+            noeditCls = Ext.baseCSSPrefix + 'trigger-noedit',
+            displayed,
+            readOnly;
+
+        if (me.rendered) {
+            if (me.readOnly) {
+                inputEl.addCls(noeditCls);
+                readOnly = true;
+                displayed = false;
+            } else {
+                if (me.editable) {
+                    inputEl.removeCls(noeditCls);
+                    readOnly = false;
+                } else {
+                    inputEl.addCls(noeditCls);
+                    readOnly = true;
+                }
+                displayed = !me.hideTrigger;
+            }
+
+            triggerWrap.setDisplayed(displayed);
+            inputEl.dom.readOnly = readOnly;
+            me.doComponentLayout();
+        }
+    },
+
+    
+    getTriggerWidth: function() {
+        var me = this,
+            triggerWrap = me.triggerWrap,
+            totalTriggerWidth = 0;
+        if (triggerWrap && !me.hideTrigger && !me.readOnly) {
+            me.triggerEl.each(function(trigger) {
+                totalTriggerWidth += trigger.getWidth();
+            });
+            totalTriggerWidth += me.triggerWrap.getFrameWidth('lr');
+        }
+        return totalTriggerWidth;
+    },
+
+    setHideTrigger: function(hideTrigger) {
+        if (hideTrigger != this.hideTrigger) {
+            this.hideTrigger = hideTrigger;
+            this.updateEditState();
+        }
+    },
+
+    
+    setEditable: function(editable) {
+        if (editable != this.editable) {
+            this.editable = editable;
+            this.updateEditState();
+        }
+    },
+
+    
+    setReadOnly: function(readOnly) {
+        if (readOnly != this.readOnly) {
+            this.readOnly = readOnly;
+            this.updateEditState();
+        }
+    },
+
+    
+    initTrigger: function() {
+        var me = this,
+            triggerWrap = me.triggerWrap,
+            triggerEl = me.triggerEl;
+
+        if (me.repeatTriggerClick) {
+            me.triggerRepeater = Ext.create('Ext.util.ClickRepeater', triggerWrap, {
+                preventDefault: true,
+                handler: function(cr, e) {
+                    me.onTriggerWrapClick(e);
+                }
+            });
+        } else {
+            me.mon(me.triggerWrap, 'click', me.onTriggerWrapClick, me);
+        }
+
+        triggerEl.addClsOnOver(me.triggerBaseCls + '-over');
+        triggerEl.each(function(el, c, i) {
+            el.addClsOnOver(me['trigger' + (i + 1) + 'Cls'] + '-over');
+        });
+        triggerEl.addClsOnClick(me.triggerBaseCls + '-click');
+        triggerEl.each(function(el, c, i) {
+            el.addClsOnClick(me['trigger' + (i + 1) + 'Cls'] + '-click');
+        });
+    },
+
+    
+    onDestroy: function() {
+        var me = this;
+        Ext.destroyMembers(me, 'triggerRepeater', 'triggerWrap', 'triggerEl');
+        delete me.doc;
+        me.callParent();
+    },
+
+    
+    onFocus: function() {
+        var me = this;
+        me.callParent();
+        if (!me.mimicing) {
+            me.bodyEl.addCls(me.wrapFocusCls);
+            me.mimicing = true;
+            me.mon(me.doc, 'mousedown', me.mimicBlur, me, {
+                delay: 10
+            });
+            if (me.monitorTab) {
+                me.on('specialkey', me.checkTab, me);
+            }
+        }
+    },
+
+    
+    checkTab: function(me, e) {
+        if (!this.ignoreMonitorTab && e.getKey() == e.TAB) {
+            this.triggerBlur();
+        }
+    },
+
+    
+    onBlur: Ext.emptyFn,
+
+    
+    mimicBlur: function(e) {
+        if (!this.isDestroyed && !this.bodyEl.contains(e.target) && this.validateBlur(e)) {
+            this.triggerBlur();
+        }
+    },
+
+    
+    triggerBlur: function() {
+        var me = this;
+        me.mimicing = false;
+        me.mun(me.doc, 'mousedown', me.mimicBlur, me);
+        if (me.monitorTab && me.inputEl) {
+            me.un('specialkey', me.checkTab, me);
+        }
+        Ext.form.field.Trigger.superclass.onBlur.call(me);
+        if (me.bodyEl) {
+            me.bodyEl.removeCls(me.wrapFocusCls);
+        }
+    },
+
+    beforeBlur: Ext.emptyFn,
+
+    
+    
+    validateBlur: function(e) {
+        return true;
+    },
+
+    
+    
+    
+    onTriggerWrapClick: function(e) {
+        var me = this,
+            t = e && e.getTarget('.' + Ext.baseCSSPrefix + 'form-trigger', null),
+            match = t && t.className.match(me.triggerIndexRe),
+            idx,
+            triggerClickMethod;
+
+        if (match && !me.readOnly) {
+            idx = parseInt(match[1], 10);
+            triggerClickMethod = me['onTrigger' + (idx + 1) + 'Click'] || me.onTriggerClick;
+            if (triggerClickMethod) {
+                triggerClickMethod.call(me, e);
+            }
+        }
+    },
+
+    
+    onTriggerClick: Ext.emptyFn
+
+    
+    
+    
+});
+
+
+Ext.define('Ext.form.field.Picker', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.pickerfield',
+    alternateClassName: 'Ext.form.Picker',
+    requires: ['Ext.util.KeyNav'],
+
+    
+    matchFieldWidth: true,
+
+    
+    pickerAlign: 'tl-bl?',
+
+    
+
+    
+    openCls: Ext.baseCSSPrefix + 'pickerfield-open',
+
+    
+
+    
+    editable: true,
+
+
+    initComponent: function() {
+        this.callParent();
+
+        
+        this.addEvents(
+            
+            'expand',
+            
+            'collapse',
+            
+            'select'
+        );
+    },
+
+
+    initEvents: function() {
+        var me = this;
+        me.callParent();
+
+        
+        me.keyNav = Ext.create('Ext.util.KeyNav', me.inputEl, {
+            down: function() {
+                if (!me.isExpanded) {
+                    
+                    
+                    me.onTriggerClick();
+                }
+            },
+            esc: me.collapse,
+            scope: me,
+            forceKeyDown: true
+        });
+
+        
+        if (!me.editable) {
+            me.mon(me.inputEl, 'click', me.onTriggerClick, me);
+        }
+
+        
+        if (Ext.isGecko) {
+            me.inputEl.dom.setAttribute('autocomplete', 'off');
+        }
+    },
+
+
+    
+    expand: function() {
+        var me = this,
+            bodyEl, picker, collapseIf;
+
+        if (me.rendered && !me.isExpanded && !me.isDestroyed) {
+            bodyEl = me.bodyEl;
+            picker = me.getPicker();
+            collapseIf = me.collapseIf;
+
+            
+            picker.show();
+            me.isExpanded = true;
+            me.alignPicker();
+            bodyEl.addCls(me.openCls);
+
+            
+            me.mon(Ext.getDoc(), {
+                mousewheel: collapseIf,
+                mousedown: collapseIf,
+                scope: me
+            });
+            Ext.EventManager.onWindowResize(me.alignPicker, me);
+            me.fireEvent('expand', me);
+            me.onExpand();
+        }
+    },
+
+    onExpand: Ext.emptyFn,
+
+    
+    alignPicker: function() {
+        var me = this,
+            picker;
+
+        if (me.isExpanded) {
+            picker = me.getPicker();
+            if (me.matchFieldWidth) {
+                
+                picker.setSize(me.bodyEl.getWidth(), picker.store && picker.store.getCount() ? null : 0);
+            }
+            if (picker.isFloating()) {
+                me.doAlign();
+            }
+        }
+    },
+
+    
+    doAlign: function(){
+        var me = this,
+            picker = me.picker,
+            aboveSfx = '-above',
+            isAbove;
+
+        me.picker.alignTo(me.inputEl, me.pickerAlign, me.pickerOffset);
+        
+        
+        isAbove = picker.el.getY() < me.inputEl.getY();
+        me.bodyEl[isAbove ? 'addCls' : 'removeCls'](me.openCls + aboveSfx);
+        picker[isAbove ? 'addCls' : 'removeCls'](picker.baseCls + aboveSfx);
+    },
+
+    
+    collapse: function() {
+        if (this.isExpanded && !this.isDestroyed) {
+            var me = this,
+                openCls = me.openCls,
+                picker = me.picker,
+                doc = Ext.getDoc(),
+                collapseIf = me.collapseIf,
+                aboveSfx = '-above';
+
+            
+            picker.hide();
+            me.isExpanded = false;
+
+            
+            me.bodyEl.removeCls([openCls, openCls + aboveSfx]);
+            picker.el.removeCls(picker.baseCls + aboveSfx);
+
+            
+            doc.un('mousewheel', collapseIf, me);
+            doc.un('mousedown', collapseIf, me);
+            Ext.EventManager.removeResizeListener(me.alignPicker, me);
+            me.fireEvent('collapse', me);
+            me.onCollapse();
+        }
+    },
+
+    onCollapse: Ext.emptyFn,
+
+
+    
+    collapseIf: function(e) {
+        var me = this;
+        if (!me.isDestroyed && !e.within(me.bodyEl, false, true) && !e.within(me.picker.el, false, true)) {
+            me.collapse();
+        }
+    },
+
+    
+    getPicker: function() {
+        var me = this;
+        return me.picker || (me.picker = me.createPicker());
+    },
+
+    
+    createPicker: Ext.emptyFn,
+
+    
+    onTriggerClick: function() {
+        var me = this;
+        if (!me.readOnly && !me.disabled) {
+            if (me.isExpanded) {
+                me.collapse();
+            } else {
+                me.expand();
+            }
+            me.inputEl.focus();
+        }
+    },
+
+    mimicBlur: function(e) {
+        var me = this,
+            picker = me.picker;
+        
+        if (!picker || !e.within(picker.el, false, true)) {
+            me.callParent(arguments);
+        }
+    },
+
+    onDestroy : function(){
+        var me = this,
+            picker = me.picker;
+
+        Ext.EventManager.removeResizeListener(me.alignPicker, me);
+        Ext.destroy(me.keyNav);
+        if (picker) {
+            delete picker.pickerField;
+            picker.destroy();
+        }
+        me.callParent();
+    }
+
+});
+
+
+
+Ext.define('Ext.form.field.Spinner', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.spinnerfield',
+    alternateClassName: 'Ext.form.Spinner',
+    requires: ['Ext.util.KeyNav'],
+
+    trigger1Cls: Ext.baseCSSPrefix + 'form-spinner-up',
+    trigger2Cls: Ext.baseCSSPrefix + 'form-spinner-down',
+
+    
+    spinUpEnabled: true,
+
+    
+    spinDownEnabled: true,
+
+    
+    keyNavEnabled: true,
+
+    
+    mouseWheelEnabled: true,
+
+    
+    repeatTriggerClick: true,
+
+    
+    onSpinUp: Ext.emptyFn,
+
+    
+    onSpinDown: Ext.emptyFn,
+
+    initComponent: function() {
+        this.callParent();
+
+        this.addEvents(
+            
+            'spin',
+
+            
+            'spinup',
+
+            
+            'spindown'
+        );
+    },
+
+    
+    onRender: function() {
+        var me = this,
+            triggers;
+
+        me.callParent(arguments);
+        triggers = me.triggerEl;
+
+        
+        me.spinUpEl = triggers.item(0);
+        
+        me.spinDownEl = triggers.item(1);
+
+        
+        me.setSpinUpEnabled(me.spinUpEnabled);
+        me.setSpinDownEnabled(me.spinDownEnabled);
+
+        
+        if (me.keyNavEnabled) {
+            me.spinnerKeyNav = Ext.create('Ext.util.KeyNav', me.inputEl, {
+                scope: me,
+                up: me.spinUp,
+                down: me.spinDown
+            });
+        }
+
+        
+        if (me.mouseWheelEnabled) {
+            me.mon(me.bodyEl, 'mousewheel', me.onMouseWheel, me);
+        }
+    },
+
+    
+    getTriggerWidth: function() {
+        return this.hideTrigger || this.readOnly ? 0 : this.spinUpEl.getWidth() + this.triggerWrap.getFrameWidth('lr');
+    },
+
+    
+    onTrigger1Click: function() {
+        this.spinUp();
+    },
+
+    
+    onTrigger2Click: function() {
+        this.spinDown();
+    },
+
+    
+    spinUp: function() {
+        var me = this;
+        if (me.spinUpEnabled && !me.disabled) {
+            me.fireEvent('spin', me, 'up');
+            me.fireEvent('spinup', me);
+            me.onSpinUp();
+        }
+    },
+
+    
+    spinDown: function() {
+        var me = this;
+        if (me.spinDownEnabled && !me.disabled) {
+            me.fireEvent('spin', me, 'down');
+            me.fireEvent('spindown', me);
+            me.onSpinDown();
+        }
+    },
+
+    
+    setSpinUpEnabled: function(enabled) {
+        var me = this,
+            wasEnabled = me.spinUpEnabled;
+        me.spinUpEnabled = enabled;
+        if (wasEnabled !== enabled && me.rendered) {
+            me.spinUpEl[enabled ? 'removeCls' : 'addCls'](me.trigger1Cls + '-disabled');
+        }
+    },
+
+    
+    setSpinDownEnabled: function(enabled) {
+        var me = this,
+            wasEnabled = me.spinDownEnabled;
+        me.spinDownEnabled = enabled;
+        if (wasEnabled !== enabled && me.rendered) {
+            me.spinDownEl[enabled ? 'removeCls' : 'addCls'](me.trigger2Cls + '-disabled');
+        }
+    },
+
+    
+    onMouseWheel: function(e) {
+        var me = this,
+            delta;
+        if (me.hasFocus) {
+            delta = e.getWheelDelta();
+            if (delta > 0) {
+                me.spinUp();
+            }
+            else if (delta < 0) {
+                me.spinDown();
+            }
+            e.stopEvent();
+        }
+    },
+
+    onDestroy: function() {
+        Ext.destroyMembers(this, 'spinnerKeyNav', 'spinUpEl', 'spinDownEl');
+        this.callParent();
+    }
+
+});
+
+Ext.define('Ext.form.field.Number', {
+    extend:'Ext.form.field.Spinner',
+    alias: 'widget.numberfield',
+    alternateClassName: ['Ext.form.NumberField', 'Ext.form.Number'],
+
+    
+    
+
+    
+    allowDecimals : true,
+
+    
+    decimalSeparator : '.',
+
+    
+    decimalPrecision : 2,
+
+    
+    minValue: Number.NEGATIVE_INFINITY,
+
+    
+    maxValue: Number.MAX_VALUE,
+
+    
+    step: 1,
+
+    
+    minText : 'The minimum value for this field is {0}',
+
+    
+    maxText : 'The maximum value for this field is {0}',
+
+    
+    nanText : '{0} is not a valid number',
+
+    
+    negativeText : 'The value cannot be negative',
+
+    
+    baseChars : '0123456789',
+
+    
+    autoStripChars: false,
+
+    initComponent: function() {
+        var me = this,
+            allowed;
+
+        me.callParent();
+
+        me.setMinValue(me.minValue);
+        me.setMaxValue(me.maxValue);
+
+        
+        if (me.disableKeyFilter !== true) {
+            allowed = me.baseChars + '';
+            if (me.allowDecimals) {
+                allowed += me.decimalSeparator;
+            }
+            if (me.minValue < 0) {
+                allowed += '-';
+            }
+            allowed = Ext.String.escapeRegex(allowed);
+            me.maskRe = new RegExp('[' + allowed + ']');
+            if (me.autoStripChars) {
+                me.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi');
+            }
+        }
+    },
+
+    
+    getErrors: function(value) {
+        var me = this,
+            errors = me.callParent(arguments),
+            format = Ext.String.format,
+            num;
+
+        value = Ext.isDefined(value) ? value : this.processRawValue(this.getRawValue());
+
+        if (value.length < 1) { 
+             return errors;
+        }
+
+        value = String(value).replace(me.decimalSeparator, '.');
+
+        if(isNaN(value)){
+            errors.push(format(me.nanText, value));
+        }
+
+        num = me.parseValue(value);
+
+        if (me.minValue === 0 && num < 0) {
+            errors.push(this.negativeText);
+        }
+        else if (num < me.minValue) {
+            errors.push(format(me.minText, me.minValue));
+        }
+
+        if (num > me.maxValue) {
+            errors.push(format(me.maxText, me.maxValue));
+        }
+
+
+        return errors;
+    },
+
+    rawToValue: function(rawValue) {
+        var value = this.fixPrecision(this.parseValue(rawValue));
+        if (value === null) {
+            value = rawValue || null;
+        }
+        return  value;
+    },
+
+    valueToRaw: function(value) {
+        var me = this,
+            decimalSeparator = me.decimalSeparator;
+        value = me.parseValue(value);
+        value = me.fixPrecision(value);
+        value = Ext.isNumber(value) ? value : parseFloat(String(value).replace(decimalSeparator, '.'));
+        value = isNaN(value) ? '' : String(value).replace('.', decimalSeparator);
+        return value;
+    },
+
+    onChange: function() {
+        var me = this,
+            value = me.getValue(),
+            valueIsNull = value === null;
+
+        me.callParent(arguments);
+
+        
+        me.setSpinUpEnabled(valueIsNull || value < me.maxValue);
+        me.setSpinDownEnabled(valueIsNull || value > me.minValue);
+    },
+
+    
+    setMinValue : function(value) {
+        this.minValue = Ext.Number.from(value, Number.NEGATIVE_INFINITY);
+    },
+
+    
+    setMaxValue: function(value) {
+        this.maxValue = Ext.Number.from(value, Number.MAX_VALUE);
+    },
+
+    
+    parseValue : function(value) {
+        value = parseFloat(String(value).replace(this.decimalSeparator, '.'));
+        return isNaN(value) ? null : value;
+    },
+
+    
+    fixPrecision : function(value) {
+        var me = this,
+            nan = isNaN(value),
+            precision = me.decimalPrecision;
+
+        if (nan || !value) {
+            return nan ? '' : value;
+        } else if (!me.allowDecimals || precision <= 0) {
+            precision = 0;
+        }
+
+        return parseFloat(Ext.Number.toFixed(parseFloat(value), precision));
+    },
+
+    beforeBlur : function() {
+        var me = this,
+            v = me.parseValue(me.getRawValue());
+
+        if (!Ext.isEmpty(v)) {
+            me.setValue(v);
+        }
+    },
+
+    onSpinUp: function() {
+        var me = this;
+        if (!me.readOnly) {
+            me.setValue(Ext.Number.constrain(me.getValue() + me.step, me.minValue, me.maxValue));
+        }
+    },
+
+    onSpinDown: function() {
+        var me = this;
+        if (!me.readOnly) {
+            me.setValue(Ext.Number.constrain(me.getValue() - me.step, me.minValue, me.maxValue));
+        }
+    }
+});
+
+
+Ext.define('Ext.toolbar.Paging', {
+    extend: 'Ext.toolbar.Toolbar',
+    alias: 'widget.pagingtoolbar',
+    alternateClassName: 'Ext.PagingToolbar',
+    requires: ['Ext.toolbar.TextItem', 'Ext.form.field.Number'],
+    
+
+    
+    displayInfo: false,
+
+    
+    prependButtons: false,
+
+    
+    displayMsg : 'Displaying {0} - {1} of {2}',
+
+    
+    emptyMsg : 'No data to display',
+
+    
+    beforePageText : 'Page',
+
+    
+    afterPageText : 'of {0}',
+
+    
+    firstText : 'First Page',
+
+    
+    prevText : 'Previous Page',
+
+    
+    nextText : 'Next Page',
+
+    
+    lastText : 'Last Page',
+
+    
+    refreshText : 'Refresh',
+
+    
+    inputItemWidth : 30,
+
+    
+    getPagingItems: function() {
+        var me = this;
+
+        return [{
+            itemId: 'first',
+            tooltip: me.firstText,
+            overflowText: me.firstText,
+            iconCls: Ext.baseCSSPrefix + 'tbar-page-first',
+            disabled: true,
+            handler: me.moveFirst,
+            scope: me
+        },{
+            itemId: 'prev',
+            tooltip: me.prevText,
+            overflowText: me.prevText,
+            iconCls: Ext.baseCSSPrefix + 'tbar-page-prev',
+            disabled: true,
+            handler: me.movePrevious,
+            scope: me
+        },
+        '-',
+        me.beforePageText,
+        {
+            xtype: 'numberfield',
+            itemId: 'inputItem',
+            name: 'inputItem',
+            cls: Ext.baseCSSPrefix + 'tbar-page-number',
+            allowDecimals: false,
+            minValue: 1,
+            hideTrigger: true,
+            enableKeyEvents: true,
+            selectOnFocus: true,
+            submitValue: false,
+            width: me.inputItemWidth,
+            margins: '-1 2 3 2',
+            listeners: {
+                scope: me,
+                keydown: me.onPagingKeyDown,
+                blur: me.onPagingBlur
+            }
+        },{
+            xtype: 'tbtext',
+            itemId: 'afterTextItem',
+            text: Ext.String.format(me.afterPageText, 1)
+        },
+        '-',
+        {
+            itemId: 'next',
+            tooltip: me.nextText,
+            overflowText: me.nextText,
+            iconCls: Ext.baseCSSPrefix + 'tbar-page-next',
+            disabled: true,
+            handler: me.moveNext,
+            scope: me
+        },{
+            itemId: 'last',
+            tooltip: me.lastText,
+            overflowText: me.lastText,
+            iconCls: Ext.baseCSSPrefix + 'tbar-page-last',
+            disabled: true,
+            handler: me.moveLast,
+            scope: me
+        },
+        '-',
+        {
+            itemId: 'refresh',
+            tooltip: me.refreshText,
+            overflowText: me.refreshText,
+            iconCls: Ext.baseCSSPrefix + 'tbar-loading',
+            handler: me.doRefresh,
+            scope: me
+        }];
+    },
+
+    initComponent : function(){
+        var me = this,
+            pagingItems = me.getPagingItems(),
+            userItems   = me.items || me.buttons || [];
+
+        if (me.prependButtons) {
+            me.items = userItems.concat(pagingItems);
+        } else {
+            me.items = pagingItems.concat(userItems);
+        }
+        delete me.buttons;
+
+        if (me.displayInfo) {
+            me.items.push('->');
+            me.items.push({xtype: 'tbtext', itemId: 'displayItem'});
+        }
+
+        me.callParent();
+
+        me.addEvents(
+            
+            'change',
+
+            
+            'beforechange'
+        );
+        me.on('afterlayout', me.onLoad, me, {single: true});
+
+        me.bindStore(me.store || 'ext-empty-store', true);
+    },
+    
+    updateInfo : function(){
+        var me = this,
+            displayItem = me.child('#displayItem'),
+            store = me.store,
+            pageData = me.getPageData(),
+            count, msg;
+
+        if (displayItem) {
+            count = store.getCount();
+            if (count === 0) {
+                msg = me.emptyMsg;
+            } else {
+                msg = Ext.String.format(
+                    me.displayMsg,
+                    pageData.fromRecord,
+                    pageData.toRecord,
+                    pageData.total
+                );
+            }
+            displayItem.setText(msg);
+            me.doComponentLayout();
+        }
+    },
+
+    
+    onLoad : function(){
+        var me = this,
+            pageData,
+            currPage,
+            pageCount,
+            afterText;
+
+        if (!me.rendered) {
+            return;
+        }
+
+        pageData = me.getPageData();
+        currPage = pageData.currentPage;
+        pageCount = pageData.pageCount;
+        afterText = Ext.String.format(me.afterPageText, isNaN(pageCount) ? 1 : pageCount);
+
+        me.child('#afterTextItem').setText(afterText);
+        me.child('#inputItem').setValue(currPage);
+        me.child('#first').setDisabled(currPage === 1);
+        me.child('#prev').setDisabled(currPage === 1);
+        me.child('#next').setDisabled(currPage === pageCount);
+        me.child('#last').setDisabled(currPage === pageCount);
+        me.child('#refresh').enable();
+        me.updateInfo();
+        me.fireEvent('change', me, pageData);
+    },
+
+    
+    getPageData : function(){
+        var store = this.store,
+            totalCount = store.getTotalCount();
+
+        return {
+            total : totalCount,
+            currentPage : store.currentPage,
+            pageCount: Math.ceil(totalCount / store.pageSize),
+            fromRecord: ((store.currentPage - 1) * store.pageSize) + 1,
+            toRecord: Math.min(store.currentPage * store.pageSize, totalCount)
+
+        };
+    },
+
+    
+    onLoadError : function(){
+        if (!this.rendered) {
+            return;
+        }
+        this.child('#refresh').enable();
+    },
+
+    
+    readPageFromInput : function(pageData){
+        var v = this.child('#inputItem').getValue(),
+            pageNum = parseInt(v, 10);
+
+        if (!v || isNaN(pageNum)) {
+            this.child('#inputItem').setValue(pageData.currentPage);
+            return false;
+        }
+        return pageNum;
+    },
+
+    onPagingFocus : function(){
+        this.child('#inputItem').select();
+    },
+
+    
+    onPagingBlur : function(e){
+        var curPage = this.getPageData().currentPage;
+        this.child('#inputItem').setValue(curPage);
+    },
+
+    
+    onPagingKeyDown : function(field, e){
+        var me = this,
+            k = e.getKey(),
+            pageData = me.getPageData(),
+            increment = e.shiftKey ? 10 : 1,
+            pageNum;
+
+        if (k == e.RETURN) {
+            e.stopEvent();
+            pageNum = me.readPageFromInput(pageData);
+            if (pageNum !== false) {
+                pageNum = Math.min(Math.max(1, pageNum), pageData.pageCount);
+                if(me.fireEvent('beforechange', me, pageNum) !== false){
+                    me.store.loadPage(pageNum);
+                }
+            }
+        } else if (k == e.HOME || k == e.END) {
+            e.stopEvent();
+            pageNum = k == e.HOME ? 1 : pageData.pageCount;
+            field.setValue(pageNum);
+        } else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN) {
+            e.stopEvent();
+            pageNum = me.readPageFromInput(pageData);
+            if (pageNum) {
+                if (k == e.DOWN || k == e.PAGEDOWN) {
+                    increment *= -1;
+                }
+                pageNum += increment;
+                if (pageNum >= 1 && pageNum <= pageData.pages) {
+                    field.setValue(pageNum);
+                }
+            }
+        }
+    },
+
+    
+    beforeLoad : function(){
+        if(this.rendered && this.refresh){
+            this.refresh.disable();
+        }
+    },
+
+    
+    doLoad : function(start){
+        if(this.fireEvent('beforechange', this, o) !== false){
+            this.store.load();
+        }
+    },
+
+    
+    moveFirst : function(){
+        if (this.fireEvent('beforechange', this, 1) !== false){
+            this.store.loadPage(1);
+        }
+    },
+
+    
+    movePrevious : function(){
+        var me = this,
+            prev = me.store.currentPage - 1;
+
+        if (prev > 0) {
+            if (me.fireEvent('beforechange', me, prev) !== false) {
+                me.store.previousPage();
+            }
+        }
+    },
+
+    
+    moveNext : function(){
+        var me = this,
+            total = me.getPageData().pageCount,
+            next = me.store.currentPage + 1;
+
+        if (next <= total) {
+            if (me.fireEvent('beforechange', me, next) !== false) {
+                me.store.nextPage();
+            }
+        }
+    },
+
+    
+    moveLast : function(){
+        var me = this,
+            last = me.getPageData().pageCount;
+
+        if (me.fireEvent('beforechange', me, last) !== false) {
+            me.store.loadPage(last);
+        }
+    },
+
+    
+    doRefresh : function(){
+        var me = this,
+            current = me.store.currentPage;
+
+        if (me.fireEvent('beforechange', me, current) !== false) {
+            me.store.loadPage(current);
+        }
+    },
+
+    
+    bindStore : function(store, initial){
+        var me = this;
+
+        if (!initial && me.store) {
+            if(store !== me.store && me.store.autoDestroy){
+                me.store.destroyStore();
+            }else{
+                me.store.un('beforeload', me.beforeLoad, me);
+                me.store.un('load', me.onLoad, me);
+                me.store.un('exception', me.onLoadError, me);
+            }
+            if(!store){
+                me.store = null;
+            }
+        }
+        if (store) {
+            store = Ext.data.StoreManager.lookup(store);
+            store.on({
+                scope: me,
+                beforeload: me.beforeLoad,
+                load: me.onLoad,
+                exception: me.onLoadError
+            });
+        }
+        me.store = store;
+    },
+
+    
+    unbind : function(store){
+        this.bindStore(null);
+    },
+
+    
+    bind : function(store){
+        this.bindStore(store);
+    },
+
+    
+    onDestroy : function(){
+        this.bindStore(null);
+        this.callParent();
+    }
+});
+
+
+Ext.define('Ext.view.BoundList', {
+    extend: 'Ext.view.View',
+    alias: 'widget.boundlist',
+    alternateClassName: 'Ext.BoundList',
+    requires: ['Ext.layout.component.BoundList', 'Ext.toolbar.Paging'],
+
+    
+    pageSize: 0,
+
+    
+
+    
+    autoScroll: true,
+    baseCls: Ext.baseCSSPrefix + 'boundlist',
+    itemCls: Ext.baseCSSPrefix + 'boundlist-item',
+    listItemCls: '',
+    shadow: false,
+    trackOver: true,
+    refreshed: 0,
+
+    ariaRole: 'listbox',
+
+    componentLayout: 'boundlist',
+
+    renderTpl: ['<div id="{id}-listEl" class="list-ct"></div>'],
+
+    initComponent: function() {
+        var me = this,
+            baseCls = me.baseCls,
+            itemCls = me.itemCls;
+            
+        me.selectedItemCls = baseCls + '-selected';
+        me.overItemCls = baseCls + '-item-over';
+        me.itemSelector = "." + itemCls;
+
+        if (me.floating) {
+            me.addCls(baseCls + '-floating');
+        }
+
+        if (!me.tpl) {
+            
+            
+            me.tpl = Ext.create('Ext.XTemplate',
+                '<ul><tpl for=".">',
+                    '<li role="option" class="' + itemCls + '">' + me.getInnerTpl(me.displayField) + '</li>',
+                '</tpl></ul>'
+            );
+        } else if (Ext.isString(me.tpl)) {
+            me.tpl = Ext.create('Ext.XTemplate', me.tpl);
+        }
+
+        if (me.pageSize) {
+            me.pagingToolbar = me.createPagingToolbar();
+        }
+
+        me.callParent();
+
+        me.addChildEls('listEl');
+    },
+
+    createPagingToolbar: function() {
+        return Ext.widget('pagingtoolbar', {
+            pageSize: this.pageSize,
+            store: this.store,
+            border: false
+        });
+    },
+
+    onRender: function() {
+        var me = this,
+            toolbar = me.pagingToolbar;
+        me.callParent(arguments);
+        if (toolbar) {
+            toolbar.render(me.el);
+        }
+    },
+
+    bindStore : function(store, initial) {
+        var me = this,
+            toolbar = me.pagingToolbar;
+        me.callParent(arguments);
+        if (toolbar) {
+            toolbar.bindStore(store, initial);
+        }
+    },
+
+    getTargetEl: function() {
+        return this.listEl || this.el;
+    },
+
+    getInnerTpl: function(displayField) {
+        return '{' + displayField + '}';
+    },
+
+    refresh: function() {
+        var me = this;
+        me.callParent();
+        if (me.isVisible()) {
+            me.refreshed++;
+            me.doComponentLayout();
+            me.refreshed--;
+        }
+    },
+
+    initAria: function() {
+        this.callParent();
+
+        var selModel = this.getSelectionModel(),
+            mode     = selModel.getSelectionMode(),
+            actionEl = this.getActionEl();
+
+        
+        if (mode !== 'SINGLE') {
+            actionEl.dom.setAttribute('aria-multiselectable', true);
+        }
+    },
+
+    onDestroy: function() {
+        Ext.destroyMembers(this, 'pagingToolbar', 'listEl');
+        this.callParent();
+    }
+});
+
+
+Ext.define('Ext.view.BoundListKeyNav', {
+    extend: 'Ext.util.KeyNav',
+    requires: 'Ext.view.BoundList',
+
+    
+
+    constructor: function(el, config) {
+        var me = this;
+        me.boundList = config.boundList;
+        me.callParent([el, Ext.apply({}, config, me.defaultHandlers)]);
+    },
+
+    defaultHandlers: {
+        up: function() {
+            var me = this,
+                boundList = me.boundList,
+                allItems = boundList.all,
+                oldItem = boundList.highlightedItem,
+                oldItemIdx = oldItem ? boundList.indexOf(oldItem) : -1,
+                newItemIdx = oldItemIdx > 0 ? oldItemIdx - 1 : allItems.getCount() - 1; 
+            me.highlightAt(newItemIdx);
+        },
+
+        down: function() {
+            var me = this,
+                boundList = me.boundList,
+                allItems = boundList.all,
+                oldItem = boundList.highlightedItem,
+                oldItemIdx = oldItem ? boundList.indexOf(oldItem) : -1,
+                newItemIdx = oldItemIdx < allItems.getCount() - 1 ? oldItemIdx + 1 : 0; 
+            me.highlightAt(newItemIdx);
+        },
+
+        pageup: function() {
+            
+        },
+
+        pagedown: function() {
+            
+        },
+
+        home: function() {
+            this.highlightAt(0);
+        },
+
+        end: function() {
+            var me = this;
+            me.highlightAt(me.boundList.all.getCount() - 1);
+        },
+
+        enter: function(e) {
+            this.selectHighlighted(e);
+        }
+    },
+
+    
+    highlightAt: function(index) {
+        var boundList = this.boundList,
+            item = boundList.all.item(index);
+        if (item) {
+            item = item.dom;
+            boundList.highlightItem(item);
+            boundList.getTargetEl().scrollChildIntoView(item, false);
+        }
+    },
+
+    
+    selectHighlighted: function(e) {
+        var me = this,
+            boundList = me.boundList,
+            highlighted = boundList.highlightedItem,
+            selModel = boundList.getSelectionModel();
+        if (highlighted) {
+            selModel.selectWithEvent(boundList.getRecord(highlighted), e);
+        }
+    }
+
+});
+
+Ext.define('Ext.form.field.ComboBox', {
+    extend:'Ext.form.field.Picker',
+    requires: ['Ext.util.DelayedTask', 'Ext.EventObject', 'Ext.view.BoundList', 'Ext.view.BoundListKeyNav', 'Ext.data.StoreManager'],
+    alternateClassName: 'Ext.form.ComboBox',
+    alias: ['widget.combobox', 'widget.combo'],
+
+    
+    triggerCls: Ext.baseCSSPrefix + 'form-arrow-trigger',
+
+    
+    hiddenDataCls: Ext.baseCSSPrefix + 'hide-display ' + Ext.baseCSSPrefix + 'form-data-hidden',
+
+    
+    fieldSubTpl: [
+        '<div class="{hiddenDataCls}" role="presentation"></div>',
+        '<input id="{id}" type="{type}" ',
+            '<tpl if="size">size="{size}" </tpl>',
+            '<tpl if="tabIdx">tabIndex="{tabIdx}" </tpl>',
+            'class="{fieldCls} {typeCls}" autocomplete="off" />',
+        '<div id="{cmpId}-triggerWrap" class="{triggerWrapCls}" role="presentation">',
+            '{triggerEl}',
+            '<div class="{clearCls}" role="presentation"></div>',
+        '</div>',
+        {
+            compiled: true,
+            disableFormats: true
+        }
+    ],
+
+    getSubTplData: function(){
+        var me = this;
+        Ext.applyIf(me.subTplData, {
+            hiddenDataCls: me.hiddenDataCls
+        });
+        return me.callParent(arguments);
+    },
+
+    afterRender: function(){
+        var me = this;
+        me.callParent(arguments);
+        me.setHiddenValue(me.value);
+    },
+
+    
+
+    
+    multiSelect: false,
+
+    
+    delimiter: ', ',
+
+    
+    displayField: 'text',
+
+    
+
+    
+    triggerAction: 'all',
+
+    
+    allQuery: '',
+
+    
+    queryParam: 'query',
+
+    
+    queryMode: 'remote',
+
+    queryCaching: true,
+
+    
+    pageSize: 0,
+
+    
+
+    
+
+    
+    autoSelect: true,
+
+    
+    typeAhead: false,
+
+    
+    typeAheadDelay: 250,
+
+    
+    selectOnTab: true,
+
+    
+    forceSelection: false,
+
+    
+
+    
+
+    
+    defaultListConfig: {
+        emptyText: '',
+        loadingText: 'Loading...',
+        loadingHeight: 70,
+        minWidth: 70,
+        maxHeight: 300,
+        shadow: 'sides'
+    },
+
+    
+
+    
+
+    
+    ignoreSelection: 0,
+
+    initComponent: function() {
+        var me = this,
+            isDefined = Ext.isDefined,
+            store = me.store,
+            transform = me.transform,
+            transformSelect, isLocalMode;
+
+        Ext.applyIf(me.renderSelectors, {
+            hiddenDataEl: '.' + me.hiddenDataCls.split(' ').join('.')
+        });
+        
+
+        this.addEvents(
+            
+            'beforequery',
+
+            
+            'select',
+
+            
+            'beforeselect',
+
+            
+            'beforedeselect'
+        );
+
+        
+        if (transform) {
+            transformSelect = Ext.getDom(transform);
+            if (transformSelect) {
+                store = Ext.Array.map(Ext.Array.from(transformSelect.options), function(option) {
+                    return [option.value, option.text];
+                });
+                if (!me.name) {
+                    me.name = transformSelect.name;
+                }
+                if (!('value' in me)) {
+                    me.value = transformSelect.value;
+                }
+            }
+        }
+
+        me.bindStore(store || 'ext-empty-store', true);
+        store = me.store;
+        if (store.autoCreated) {
+            me.queryMode = 'local';
+            me.valueField = me.displayField = 'field1';
+            if (!store.expanded) {
+                me.displayField = 'field2';
+            }
+        }
+
+
+        if (!isDefined(me.valueField)) {
+            me.valueField = me.displayField;
+        }
+
+        isLocalMode = me.queryMode === 'local';
+        if (!isDefined(me.queryDelay)) {
+            me.queryDelay = isLocalMode ? 10 : 500;
+        }
+        if (!isDefined(me.minChars)) {
+            me.minChars = isLocalMode ? 0 : 4;
+        }
+
+        if (!me.displayTpl) {
+            me.displayTpl = Ext.create('Ext.XTemplate',
+                '<tpl for=".">' +
+                    '{[typeof values === "string" ? values : values["' + me.displayField + '"]]}' +
+                    '<tpl if="xindex < xcount">' + me.delimiter + '</tpl>' +
+                '</tpl>'
+            );
+        } else if (Ext.isString(me.displayTpl)) {
+            me.displayTpl = Ext.create('Ext.XTemplate', me.displayTpl);
+        }
+
+        me.callParent();
+
+        me.doQueryTask = Ext.create('Ext.util.DelayedTask', me.doRawQuery, me);
+
+        
+        if (me.store.getCount() > 0) {
+            me.setValue(me.value);
+        }
+
+        
+        if (transformSelect) {
+            me.render(transformSelect.parentNode, transformSelect);
+            Ext.removeNode(transformSelect);
+            delete me.renderTo;
+        }
+    },
+
+    
+    getStore : function(){
+        return this.store;
+    },
+
+    beforeBlur: function() {
+        this.doQueryTask.cancel();
+        this.assertValue();
+    },
+
+    
+    assertValue: function() {
+        var me = this,
+            value = me.getRawValue(),
+            rec;
+
+        if (me.forceSelection) {
+            if (me.multiSelect) {
+                
+                
+                if (value !== me.getDisplayValue()) {
+                    me.setValue(me.lastSelection);
+                }
+            } else {
+                
+                
+                rec = me.findRecordByDisplay(value);
+                if (rec) {
+                    me.select(rec);
+                } else {
+                    me.setValue(me.lastSelection);
+                }
+            }
+        }
+        me.collapse();
+    },
+
+    onTypeAhead: function() {
+        var me = this,
+            displayField = me.displayField,
+            record = me.store.findRecord(displayField, me.getRawValue()),
+            boundList = me.getPicker(),
+            newValue, len, selStart;
+
+        if (record) {
+            newValue = record.get(displayField);
+            len = newValue.length;
+            selStart = me.getRawValue().length;
+
+            boundList.highlightItem(boundList.getNode(record));
+
+            if (selStart !== 0 && selStart !== len) {
+                me.setRawValue(newValue);
+                me.selectText(selStart, newValue.length);
+            }
+        }
+    },
+
+    
+    
+    resetToDefault: function() {
+
+    },
+
+    bindStore: function(store, initial) {
+        var me = this,
+            oldStore = me.store;
+
+        
+        
+        if (oldStore && !initial) {
+            if (oldStore !== store && oldStore.autoDestroy) {
+                oldStore.destroyStore();
+            } else {
+                oldStore.un({
+                    scope: me,
+                    load: me.onLoad,
+                    exception: me.collapse
+                });
+            }
+            if (!store) {
+                me.store = null;
+                if (me.picker) {
+                    me.picker.bindStore(null);
+                }
+            }
+        }
+        if (store) {
+            if (!initial) {
+                me.resetToDefault();
+            }
+
+            me.store = Ext.data.StoreManager.lookup(store);
+            me.store.on({
+                scope: me,
+                load: me.onLoad,
+                exception: me.collapse
+            });
+
+            if (me.picker) {
+                me.picker.bindStore(store);
+            }
+        }
+    },
+
+    onLoad: function() {
+        var me = this,
+            value = me.value;
+
+        
+        if (me.rawQuery) {
+            me.rawQuery = false;
+            me.syncSelection();
+            if (me.picker && !me.picker.getSelectionModel().hasSelection()) {
+                me.doAutoSelect();
+            }
+        }
+        
+        else {
+            
+            if (me.value) {
+                me.setValue(me.value);
+            } else {
+                
+                
+                if (me.store.getCount()) {
+                    me.doAutoSelect();
+                } else {
+                    me.setValue('');
+                }
+            }
+        }
+    },
+
+    
+    doRawQuery: function() {
+        this.doQuery(this.getRawValue(), false, true);
+    },
+
+    
+    doQuery: function(queryString, forceAll, rawQuery) {
+        queryString = queryString || '';
+
+        
+        
+        var me = this,
+            qe = {
+                query: queryString,
+                forceAll: forceAll,
+                combo: me,
+                cancel: false
+            },
+            store = me.store,
+            isLocalMode = me.queryMode === 'local';
+
+        if (me.fireEvent('beforequery', qe) === false || qe.cancel) {
+            return false;
+        }
+
+        
+        queryString = qe.query;
+        forceAll = qe.forceAll;
+
+        
+        if (forceAll || (queryString.length >= me.minChars)) {
+            
+            me.expand();
+
+            
+            if (!me.queryCaching || me.lastQuery !== queryString) {
+                me.lastQuery = queryString;
+
+                if (isLocalMode) {
+                    
+                    if (forceAll) {
+                        store.clearFilter();
+                    } else {
+                        
+                        store.clearFilter(true);
+                        store.filter(me.displayField, queryString);
+                    }
+                } else {
+                    
+                    me.rawQuery = rawQuery;
+
+                    
+                    
+                    if (me.pageSize) {
+                        
+                        me.loadPage(1);
+                    } else {
+                        store.load({
+                            params: me.getParams(queryString)
+                        });
+                    }
+                }
+            }
+
+            
+            if (me.getRawValue() !== me.getDisplayValue()) {
+                me.ignoreSelection++;
+                me.picker.getSelectionModel().deselectAll();
+                me.ignoreSelection--;
+            }
+
+            if (isLocalMode) {
+                me.doAutoSelect();
+            }
+            if (me.typeAhead) {
+                me.doTypeAhead();
+            }
+        }
+        return true;
+    },
+
+    loadPage: function(pageNum){
+        this.store.loadPage(pageNum, {
+            params: this.getParams(this.lastQuery)
+        });
+    },
+
+    onPageChange: function(toolbar, newPage){
+        
+        this.loadPage(newPage);
+        return false;
+    },
+
+    
+    getParams: function(queryString) {
+        var params = {},
+            param = this.queryParam;
+
+        if (param) {
+            params[param] = queryString;
+        }
+        return params;
+    },
+
+    
+    doAutoSelect: function() {
+        var me = this,
+            picker = me.picker,
+            lastSelected, itemNode;
+        if (picker && me.autoSelect && me.store.getCount() > 0) {
+            
+            lastSelected = picker.getSelectionModel().lastSelected;
+            itemNode = picker.getNode(lastSelected || 0);
+            if (itemNode) {
+                picker.highlightItem(itemNode);
+                picker.listEl.scrollChildIntoView(itemNode, false);
+            }
+        }
+    },
+
+    doTypeAhead: function() {
+        if (!this.typeAheadTask) {
+            this.typeAheadTask = Ext.create('Ext.util.DelayedTask', this.onTypeAhead, this);
+        }
+        if (this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE) {
+            this.typeAheadTask.delay(this.typeAheadDelay);
+        }
+    },
+
+    onTriggerClick: function() {
+        var me = this;
+        if (!me.readOnly && !me.disabled) {
+            if (me.isExpanded) {
+                me.collapse();
+            } else {
+                me.onFocus({});
+                if (me.triggerAction === 'all') {
+                    me.doQuery(me.allQuery, true);
+                } else {
+                    me.doQuery(me.getRawValue(), false, true);
+                }
+            }
+            me.inputEl.focus();
+        }
+    },
+
+
+    
+    onKeyUp: function(e, t) {
+        var me = this,
+            key = e.getKey();
+
+        if (!me.readOnly && !me.disabled && me.editable) {
+            me.lastKey = key;
+            
+            
+
+            
+            if (!e.isSpecialKey() || key == e.BACKSPACE || key == e.DELETE) {
+                me.doQueryTask.delay(me.queryDelay);
+            }
+        }
+
+        if (me.enableKeyEvents) {
+            me.callParent(arguments);
+        }
+    },
+
+    initEvents: function() {
+        var me = this;
+        me.callParent();
+
+        
+        if (!me.enableKeyEvents) {
+            me.mon(me.inputEl, 'keyup', me.onKeyUp, me);
+        }
+    },
+    
+    onDestroy: function(){
+        this.bindStore(null);
+        this.callParent();    
+    },
+
+    createPicker: function() {
+        var me = this,
+            picker,
+            menuCls = Ext.baseCSSPrefix + 'menu',
+            opts = Ext.apply({
+                pickerField: me,
+                selModel: {
+                    mode: me.multiSelect ? 'SIMPLE' : 'SINGLE'
+                },
+                floating: true,
+                hidden: true,
+                ownerCt: me.ownerCt,
+                cls: me.el.up('.' + menuCls) ? menuCls : '',
+                store: me.store,
+                displayField: me.displayField,
+                focusOnToFront: false,
+                pageSize: me.pageSize,
+                tpl: me.tpl
+            }, me.listConfig, me.defaultListConfig);
+
+        picker = me.picker = Ext.create('Ext.view.BoundList', opts);
+        if (me.pageSize) {
+            picker.pagingToolbar.on('beforechange', me.onPageChange, me);
+        }
+
+        me.mon(picker, {
+            itemclick: me.onItemClick,
+            refresh: me.onListRefresh,
+            scope: me
+        });
+
+        me.mon(picker.getSelectionModel(), {
+            'beforeselect': me.onBeforeSelect,
+            'beforedeselect': me.onBeforeDeselect,
+            'selectionchange': me.onListSelectionChange,
+            scope: me
+        });
+
+        return picker;
+    },
+
+    alignPicker: function(){
+        var me = this,
+            picker = me.picker,
+            heightAbove = me.getPosition()[1] - Ext.getBody().getScroll().top,
+            heightBelow = Ext.Element.getViewHeight() - heightAbove - me.getHeight(),
+            space = Math.max(heightAbove, heightBelow);
+
+        me.callParent();
+        if (picker.getHeight() > space) {
+            picker.setHeight(space - 5); 
+            me.doAlign();
+        }
+    },
+
+    onListRefresh: function() {
+        this.alignPicker();
+        this.syncSelection();
+    },
+
+    onItemClick: function(picker, record){
+        
+        var me = this,
+            lastSelection = me.lastSelection,
+            valueField = me.valueField,
+            selected;
+
+        if (!me.multiSelect && lastSelection) {
+            selected = lastSelection[0];
+            if (selected && (record.get(valueField) === selected.get(valueField))) {
+                
+                me.displayTplData = [record.data];
+                me.setRawValue(me.getDisplayValue());
+                me.collapse();
+            }
+        }
+    },
+
+    onBeforeSelect: function(list, record) {
+        return this.fireEvent('beforeselect', this, record, record.index);
+    },
+
+    onBeforeDeselect: function(list, record) {
+        return this.fireEvent('beforedeselect', this, record, record.index);
+    },
+
+    onListSelectionChange: function(list, selectedRecords) {
+        var me = this,
+            isMulti = me.multiSelect,
+            hasRecords = selectedRecords.length > 0;
+        
+        
+        if (!me.ignoreSelection && me.isExpanded) {
+            if (!isMulti) {
+                Ext.defer(me.collapse, 1, me);
+            }
+            
+            if (isMulti || hasRecords) {
+                me.setValue(selectedRecords, false);
+            }
+            if (hasRecords) {
+                me.fireEvent('select', me, selectedRecords);
+            }
+            me.inputEl.focus();
+        }
+    },
+
+    
+    onExpand: function() {
+        var me = this,
+            keyNav = me.listKeyNav,
+            selectOnTab = me.selectOnTab,
+            picker = me.getPicker();
+
+        
+        if (keyNav) {
+            keyNav.enable();
+        } else {
+            keyNav = me.listKeyNav = Ext.create('Ext.view.BoundListKeyNav', this.inputEl, {
+                boundList: picker,
+                forceKeyDown: true,
+                tab: function(e) {
+                    if (selectOnTab) {
+                        this.selectHighlighted(e);
+                        me.triggerBlur();
+                    }
+                    
+                    return true;
+                }
+            });
+        }
+
+        
+        if (selectOnTab) {
+            me.ignoreMonitorTab = true;
+        }
+
+        Ext.defer(keyNav.enable, 1, keyNav); 
+        me.inputEl.focus();
+    },
+
+    
+    onCollapse: function() {
+        var me = this,
+            keyNav = me.listKeyNav;
+        if (keyNav) {
+            keyNav.disable();
+            me.ignoreMonitorTab = false;
+        }
+    },
+
+    
+    select: function(r) {
+        this.setValue(r, true);
+    },
+
+    
+    findRecord: function(field, value) {
+        var ds = this.store,
+            idx = ds.findExact(field, value);
+        return idx !== -1 ? ds.getAt(idx) : false;
+    },
+
+    
+    findRecordByValue: function(value) {
+        return this.findRecord(this.valueField, value);
+    },
+
+    
+    findRecordByDisplay: function(value) {
+        return this.findRecord(this.displayField, value);
+    },
+
+    
+    setValue: function(value, doSelect) {
+        var me = this,
+            valueNotFoundText = me.valueNotFoundText,
+            inputEl = me.inputEl,
+            i, len, record,
+            models = [],
+            displayTplData = [],
+            processedValue = [];
+
+        if (me.store.loading) {
+            
+            me.value = value;
+            me.setHiddenValue(me.value);
+            return me;
+        }
+
+        
+        value = Ext.Array.from(value);
+
+        
+        for (i = 0, len = value.length; i < len; i++) {
+            record = value[i];
+            if (!record || !record.isModel) {
+                record = me.findRecordByValue(record);
+            }
+            
+            if (record) {
+                models.push(record);
+                displayTplData.push(record.data);
+                processedValue.push(record.get(me.valueField));
+            }
+            
+            
+            else {
+                
+                if (!me.forceSelection) {
+                    displayTplData.push(value[i]);
+                    processedValue.push(value[i]);
+                }
+                
+                else if (Ext.isDefined(valueNotFoundText)) {
+                    displayTplData.push(valueNotFoundText);
+                }
+            }
+        }
+
+        
+        me.setHiddenValue(processedValue);
+        me.value = me.multiSelect ? processedValue : processedValue[0];
+        if (!Ext.isDefined(me.value)) {
+            me.value = null;
+        }
+        me.displayTplData = displayTplData; 
+        me.lastSelection = me.valueModels = models;
+
+        if (inputEl && me.emptyText && !Ext.isEmpty(value)) {
+            inputEl.removeCls(me.emptyCls);
+        }
+
+        
+        me.setRawValue(me.getDisplayValue());
+        me.checkChange();
+
+        if (doSelect !== false) {
+            me.syncSelection();
+        }
+        me.applyEmptyText();
+
+        return me;
+    },
+
+    
+    setHiddenValue: function(values){
+        var me = this, i;
+        if (!me.hiddenDataEl) {
+            return;
+        }
+        values = Ext.Array.from(values);
+        var dom = me.hiddenDataEl.dom,
+            childNodes = dom.childNodes,
+            input = childNodes[0],
+            valueCount = values.length,
+            childrenCount = childNodes.length;
+        
+        if (!input && valueCount > 0) {
+            me.hiddenDataEl.update(Ext.DomHelper.markup({tag:'input', type:'hidden', name:me.name}));
+            childrenCount = 1;
+            input = dom.firstChild;
+        }
+        while (childrenCount > valueCount) {
+            dom.removeChild(childNodes[0]);
+            -- childrenCount;
+        }
+        while (childrenCount < valueCount) {
+            dom.appendChild(input.cloneNode(true));
+            ++ childrenCount;
+        }
+        for (i = 0; i < valueCount; i++) {
+            childNodes[i].value = values[i];
+        }
+    },
+
+    
+    getDisplayValue: function() {
+        return this.displayTpl.apply(this.displayTplData);
+    },
+
+    getValue: function() {
+        
+        
+        
+        var me = this,
+            picker = me.picker,
+            rawValue = me.getRawValue(), 
+            value = me.value; 
+
+        if (me.getDisplayValue() !== rawValue) {
+            value = rawValue;
+            me.value = me.displayTplData = me.valueModels = null;
+            if (picker) {
+                me.ignoreSelection++;
+                picker.getSelectionModel().deselectAll();
+                me.ignoreSelection--;
+            }
+        }
+
+        return value;
+    },
+
+    getSubmitValue: function() {
+        return this.getValue();
+    },
+
+    isEqual: function(v1, v2) {
+        var fromArray = Ext.Array.from,
+            i, len;
+
+        v1 = fromArray(v1);
+        v2 = fromArray(v2);
+        len = v1.length;
+
+        if (len !== v2.length) {
+            return false;
+        }
+
+        for(i = 0; i < len; i++) {
+            if (v2[i] !== v1[i]) {
+                return false;
+            }
+        }
+
+        return true;
+    },
+
+    
+    clearValue: function() {
+        this.setValue([]);
+    },
+
+    
+    syncSelection: function() {
+        var me = this,
+            ExtArray = Ext.Array,
+            picker = me.picker,
+            selection, selModel;
+        if (picker) {
+            
+            selection = [];
+            ExtArray.forEach(me.valueModels || [], function(value) {
+                if (value && value.isModel && me.store.indexOf(value) >= 0) {
+                    selection.push(value);
+                }
+            });
+
+            
+            me.ignoreSelection++;
+            selModel = picker.getSelectionModel();
+            selModel.deselectAll();
+            if (selection.length) {
+                selModel.select(selection);
+            }
+            me.ignoreSelection--;
+        }
+    }
+});
+
+
+Ext.define('Ext.picker.Month', {
+    extend: 'Ext.Component',
+    requires: ['Ext.XTemplate', 'Ext.util.ClickRepeater', 'Ext.Date', 'Ext.button.Button'],
+    alias: 'widget.monthpicker',
+    alternateClassName: 'Ext.MonthPicker',
+
+    renderTpl: [
+        '<div id="{id}-bodyEl" class="{baseCls}-body">',
+          '<div class="{baseCls}-months">',
+              '<tpl for="months">',
+                  '<div class="{parent.baseCls}-item {parent.baseCls}-month"><a href="#" hidefocus="on">{.}</a></div>',
+              '</tpl>',
+          '</div>',
+          '<div class="{baseCls}-years">',
+              '<div class="{baseCls}-yearnav">',
+                  '<button id="{id}-prevEl" class="{baseCls}-yearnav-prev"></button>',
+                  '<button id="{id}-nextEl" class="{baseCls}-yearnav-next"></button>',
+              '</div>',
+              '<tpl for="years">',
+                  '<div class="{parent.baseCls}-item {parent.baseCls}-year"><a href="#" hidefocus="on">{.}</a></div>',
+              '</tpl>',
+          '</div>',
+          '<div class="' + Ext.baseCSSPrefix + 'clear"></div>',
+        '</div>',
+        '<tpl if="showButtons">',
+          '<div id="{id}-buttonsEl" class="{baseCls}-buttons"></div>',
+        '</tpl>'
+    ],
+
+    
+    okText: 'OK',
+
+    
+    cancelText: 'Cancel',
+
+    
+    baseCls: Ext.baseCSSPrefix + 'monthpicker',
+
+    
+    showButtons: true,
+
+    
+
+    
+    width: 178,
+
+    
+    smallCls: Ext.baseCSSPrefix + 'monthpicker-small',
+
+    
+    totalYears: 10,
+    yearOffset: 5, 
+    monthOffset: 6, 
+
+    
+    initComponent: function(){
+        var me = this;
+
+        me.selectedCls = me.baseCls + '-selected';
+        me.addEvents(
+            
+            'cancelclick',
+
+            
+            'monthclick',
+
+            
+            'monthdblclick',
+
+            
+            'okclick',
+
+            
+            'select',
+
+            
+            'yearclick',
+
+            
+            'yeardblclick'
+        );
+        if (me.small) {
+            me.addCls(me.smallCls);
+        }
+        me.setValue(me.value);
+        me.activeYear = me.getYear(new Date().getFullYear() - 4, -4);
+        this.callParent();
+    },
+
+    
+    onRender: function(ct, position){
+        var me = this,
+            i = 0,
+            months = [],
+            shortName = Ext.Date.getShortMonthName,
+            monthLen = me.monthOffset;
+
+        for (; i < monthLen; ++i) {
+            months.push(shortName(i), shortName(i + monthLen));
+        }
+
+        Ext.apply(me.renderData, {
+            months: months,
+            years: me.getYears(),
+            showButtons: me.showButtons
+        });
+
+        me.addChildEls('bodyEl', 'prevEl', 'nextEl', 'buttonsEl');
+
+        me.callParent(arguments);
+    },
+
+    
+    afterRender: function(){
+        var me = this,
+            body = me.bodyEl,
+            buttonsEl = me.buttonsEl;
+
+        me.callParent();
+
+        me.mon(body, 'click', me.onBodyClick, me);
+        me.mon(body, 'dblclick', me.onBodyClick, me);
+
+        
+        me.years = body.select('.' + me.baseCls + '-year a');
+        me.months = body.select('.' + me.baseCls + '-month a');
+
+        if (me.showButtons) {
+            me.okBtn = Ext.create('Ext.button.Button', {
+                text: me.okText,
+                renderTo: buttonsEl,
+                handler: me.onOkClick,
+                scope: me
+            });
+            me.cancelBtn = Ext.create('Ext.button.Button', {
+                text: me.cancelText,
+                renderTo: buttonsEl,
+                handler: me.onCancelClick,
+                scope: me
+            });
+        }
+
+        me.backRepeater = Ext.create('Ext.util.ClickRepeater', me.prevEl, {
+            handler: Ext.Function.bind(me.adjustYear, me, [-me.totalYears])
+        });
+
+        me.prevEl.addClsOnOver(me.baseCls + '-yearnav-prev-over');
+        me.nextRepeater = Ext.create('Ext.util.ClickRepeater', me.nextEl, {
+            handler: Ext.Function.bind(me.adjustYear, me, [me.totalYears])
+        });
+        me.nextEl.addClsOnOver(me.baseCls + '-yearnav-next-over');
+        me.updateBody();
+    },
+
+    
+    setValue: function(value){
+        var me = this,
+            active = me.activeYear,
+            offset = me.monthOffset,
+            year,
+            index;
+
+        if (!value) {
+            me.value = [null, null];
+        } else if (Ext.isDate(value)) {
+            me.value = [value.getMonth(), value.getFullYear()];
+        } else {
+            me.value = [value[0], value[1]];
+        }
+
+        if (me.rendered) {
+            year = me.value[1];
+            if (year !== null) {
+                if ((year < active || year > active + me.yearOffset)) {
+                    me.activeYear = year - me.yearOffset + 1;
+                }
+            }
+            me.updateBody();
+        }
+
+        return me;
+    },
+
+    
+    getValue: function(){
+        return this.value;
+    },
+
+    
+    hasSelection: function(){
+        var value = this.value;
+        return value[0] !== null && value[1] !== null;
+    },
+
+    
+    getYears: function(){
+        var me = this,
+            offset = me.yearOffset,
+            start = me.activeYear, 
+            end = start + offset,
+            i = start,
+            years = [];
+
+        for (; i < end; ++i) {
+            years.push(i, i + offset);
+        }
+
+        return years;
+    },
+
+    
+    updateBody: function(){
+        var me = this,
+            years = me.years,
+            months = me.months,
+            yearNumbers = me.getYears(),
+            cls = me.selectedCls,
+            value = me.getYear(null),
+            month = me.value[0],
+            monthOffset = me.monthOffset,
+            year;
+
+        if (me.rendered) {
+            years.removeCls(cls);
+            months.removeCls(cls);
+            years.each(function(el, all, index){
+                year = yearNumbers[index];
+                el.dom.innerHTML = year;
+                if (year == value) {
+                    el.dom.className = cls;
+                }
+            });
+            if (month !== null) {
+                if (month < monthOffset) {
+                    month = month * 2;
+                } else {
+                    month = (month - monthOffset) * 2 + 1;
+                }
+                months.item(month).addCls(cls);
+            }
+        }
+    },
+
+    
+    getYear: function(defaultValue, offset) {
+        var year = this.value[1];
+        offset = offset || 0;
+        return year === null ? defaultValue : year + offset;
+    },
+
+    
+    onBodyClick: function(e, t) {
+        var me = this,
+            isDouble = e.type == 'dblclick';
+
+        if (e.getTarget('.' + me.baseCls + '-month')) {
+            e.stopEvent();
+            me.onMonthClick(t, isDouble);
+        } else if (e.getTarget('.' + me.baseCls + '-year')) {
+            e.stopEvent();
+            me.onYearClick(t, isDouble);
+        }
+    },
+
+    
+    adjustYear: function(offset){
+        if (typeof offset != 'number') {
+            offset = this.totalYears;
+        }
+        this.activeYear += offset;
+        this.updateBody();
+    },
+
+    
+    onOkClick: function(){
+        this.fireEvent('okclick', this, this.value);
+    },
+
+    
+    onCancelClick: function(){
+        this.fireEvent('cancelclick', this);
+    },
+
+    
+    onMonthClick: function(target, isDouble){
+        var me = this;
+        me.value[0] = me.resolveOffset(me.months.indexOf(target), me.monthOffset);
+        me.updateBody();
+        me.fireEvent('month' + (isDouble ? 'dbl' : '') + 'click', me, me.value);
+        me.fireEvent('select', me, me.value);
+    },
+
+    
+    onYearClick: function(target, isDouble){
+        var me = this;
+        me.value[1] = me.activeYear + me.resolveOffset(me.years.indexOf(target), me.yearOffset);
+        me.updateBody();
+        me.fireEvent('year' + (isDouble ? 'dbl' : '') + 'click', me, me.value);
+        me.fireEvent('select', me, me.value);
+
+    },
+
+    
+    resolveOffset: function(index, offset){
+        if (index % 2 === 0) {
+            return (index / 2);
+        } else {
+            return offset + Math.floor(index / 2);
+        }
+    },
+
+    
+    beforeDestroy: function(){
+        var me = this;
+        me.years = me.months = null;
+        Ext.destroyMembers(me, 'backRepeater', 'nextRepeater', 'okBtn', 'cancelBtn');
+        me.callParent();
+    }
+});
+
+
+Ext.define('Ext.picker.Date', {
+    extend: 'Ext.Component',
+    requires: [
+        'Ext.XTemplate',
+        'Ext.button.Button',
+        'Ext.button.Split',
+        'Ext.util.ClickRepeater',
+        'Ext.util.KeyNav',
+        'Ext.EventObject',
+        'Ext.fx.Manager',
+        'Ext.picker.Month'
+    ],
+    alias: 'widget.datepicker',
+    alternateClassName: 'Ext.DatePicker',
+
+    renderTpl: [
+        '<div class="{cls}" id="{id}" role="grid" title="{ariaTitle} {value:this.longDay}">',
+            '<div role="presentation" class="{baseCls}-header">',
+                '<div class="{baseCls}-prev"><a id="{id}-prevEl" href="#" role="button" title="{prevText}"></a></div>',
+                '<div class="{baseCls}-month" id="{id}-middleBtnEl"></div>',
+                '<div class="{baseCls}-next"><a id="{id}-nextEl" href="#" role="button" title="{nextText}"></a></div>',
+            '</div>',
+            '<table id="{id}-eventEl" class="{baseCls}-inner" cellspacing="0" role="presentation">',
+                '<thead role="presentation"><tr role="presentation">',
+                    '<tpl for="dayNames">',
+                        '<th role="columnheader" title="{.}"><span>{.:this.firstInitial}</span></th>',
+                    '</tpl>',
+                '</tr></thead>',
+                '<tbody role="presentation"><tr role="presentation">',
+                    '<tpl for="days">',
+                        '{#:this.isEndOfWeek}',
+                        '<td role="gridcell" id="{[Ext.id()]}">',
+                            '<a role="presentation" href="#" hidefocus="on" class="{parent.baseCls}-date" tabIndex="1">',
+                                '<em role="presentation"><span role="presentation"></span></em>',
+                            '</a>',
+                        '</td>',
+                    '</tpl>',
+                '</tr></tbody>',
+            '</table>',
+            '<tpl if="showToday">',
+                '<div id="{id}-footerEl" role="presentation" class="{baseCls}-footer"></div>',
+            '</tpl>',
+        '</div>',
+        {
+            firstInitial: function(value) {
+                return value.substr(0,1);
+            },
+            isEndOfWeek: function(value) {
+                
+                
+                value--;
+                var end = value % 7 === 0 && value !== 0;
+                return end ? '</tr><tr role="row">' : '';
+            },
+            longDay: function(value){
+                return Ext.Date.format(value, this.longDayFormat);
+            }
+        }
+    ],
+
+    ariaTitle: 'Date Picker',
+
+    
+    todayText : 'Today',
+
+    
+
+    
+
+    
+    todayTip : '{0} (Spacebar)',
+
+    
+    minText : 'This date is before the minimum date',
+
+    
+    maxText : 'This date is after the maximum date',
+
+    
+
+    
+    disabledDaysText : 'Disabled',
+
+    
+    disabledDatesText : 'Disabled',
+
+    
+
+    
+
+    
+    nextText : 'Next Month (Control+Right)',
+
+    
+    prevText : 'Previous Month (Control+Left)',
+
+    
+    monthYearText : 'Choose a month (Control+Up/Down to move years)',
+
+    
+    startDay : 0,
+
+    
+    showToday : true,
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    disableAnim: false,
+
+    
+    baseCls: Ext.baseCSSPrefix + 'datepicker',
+
+    
+
+    
+
+    
+    longDayFormat: 'F d, Y',
+
+    
+
+    
+    focusOnShow: false,
+
+    
+    
+    focusOnSelect: true,
+
+    width: 178,
+
+    
+    
+    initHour: 12, 
+
+    numDays: 42,
+
+    
+    initComponent : function() {
+        var me = this,
+            clearTime = Ext.Date.clearTime;
+
+        me.selectedCls = me.baseCls + '-selected';
+        me.disabledCellCls = me.baseCls + '-disabled';
+        me.prevCls = me.baseCls + '-prevday';
+        me.activeCls = me.baseCls + '-active';
+        me.nextCls = me.baseCls + '-prevday';
+        me.todayCls = me.baseCls + '-today';
+        me.dayNames = me.dayNames.slice(me.startDay).concat(me.dayNames.slice(0, me.startDay));
+        this.callParent();
+
+        me.value = me.value ?
+                 clearTime(me.value, true) : clearTime(new Date());
+
+        me.addEvents(
+            
+            'select'
+        );
+
+        me.initDisabledDays();
+    },
+
+    
+    onRender : function(container, position){
+        
+
+        var me = this,
+            days = new Array(me.numDays),
+            today = Ext.Date.format(new Date(), me.format);
+
+        Ext.applyIf(me, {
+            renderData: {}
+        });
+
+        Ext.apply(me.renderData, {
+            dayNames: me.dayNames,
+            ariaTitle: me.ariaTitle,
+            value: me.value,
+            showToday: me.showToday,
+            prevText: me.prevText,
+            nextText: me.nextText,
+            days: days
+        });
+        me.getTpl('renderTpl').longDayFormat = me.longDayFormat;
+
+        me.addChildEls('eventEl', 'prevEl', 'nextEl', 'middleBtnEl', 'footerEl');
+
+        this.callParent(arguments);
+        me.el.unselectable();
+
+        me.cells = me.eventEl.select('tbody td');
+        me.textNodes = me.eventEl.query('tbody td span');
+
+        me.monthBtn = Ext.create('Ext.button.Split', {
+            text: '',
+            tooltip: me.monthYearText,
+            renderTo: me.middleBtnEl
+        });
+        
+
+
+        me.todayBtn = Ext.create('Ext.button.Button', {
+            renderTo: me.footerEl,
+            text: Ext.String.format(me.todayText, today),
+            tooltip: Ext.String.format(me.todayTip, today),
+            handler: me.selectToday,
+            scope: me
+        });
+    },
+
+    
+    initEvents: function(){
+        var me = this,
+            eDate = Ext.Date,
+            day = eDate.DAY;
+
+        this.callParent();
+
+        me.prevRepeater = Ext.create('Ext.util.ClickRepeater', me.prevEl, {
+            handler: me.showPrevMonth,
+            scope: me,
+            preventDefault: true,
+            stopDefault: true
+        });
+
+        me.nextRepeater = Ext.create('Ext.util.ClickRepeater', me.nextEl, {
+            handler: me.showNextMonth,
+            scope: me,
+            preventDefault:true,
+            stopDefault:true
+        });
+
+        me.keyNav = Ext.create('Ext.util.KeyNav', me.eventEl, Ext.apply({
+            scope: me,
+            'left' : function(e){
+                if(e.ctrlKey){
+                    me.showPrevMonth();
+                }else{
+                    me.update(eDate.add(me.activeDate, day, -1));
+                }
+            },
+
+            'right' : function(e){
+                if(e.ctrlKey){
+                    me.showNextMonth();
+                }else{
+                    me.update(eDate.add(me.activeDate, day, 1));
+                }
+            },
+
+            'up' : function(e){
+                if(e.ctrlKey){
+                    me.showNextYear();
+                }else{
+                    me.update(eDate.add(me.activeDate, day, -7));
+                }
+            },
+
+            'down' : function(e){
+                if(e.ctrlKey){
+                    me.showPrevYear();
+                }else{
+                    me.update(eDate.add(me.activeDate, day, 7));
+                }
+            },
+            'pageUp' : me.showNextMonth,
+            'pageDown' : me.showPrevMonth,
+            'enter' : function(e){
+                e.stopPropagation();
+                return true;
+            }
+        }, me.keyNavConfig));
+
+        if(me.showToday){
+            me.todayKeyListener = me.eventEl.addKeyListener(Ext.EventObject.SPACE, me.selectToday,  me);
+        }
+        me.mon(me.eventEl, 'mousewheel', me.handleMouseWheel, me);
+        me.mon(me.eventEl, 'click', me.handleDateClick,  me, {delegate: 'a.' + me.baseCls + '-date'});
+        me.mon(me.monthBtn, 'click', me.showMonthPicker, me);
+        me.mon(me.monthBtn, 'arrowclick', me.showMonthPicker, me);
+        me.update(me.value);
+    },
+
+    
+    initDisabledDays : function(){
+        var me = this,
+            dd = me.disabledDates,
+            re = '(?:',
+            len;
+
+        if(!me.disabledDatesRE && dd){
+                len = dd.length - 1;
+
+            Ext.each(dd, function(d, i){
+                re += Ext.isDate(d) ? '^' + Ext.String.escapeRegex(Ext.Date.dateFormat(d, me.format)) + '$' : dd[i];
+                if(i != len){
+                    re += '|';
+                }
+            }, me);
+            me.disabledDatesRE = new RegExp(re + ')');
+        }
+    },
+
+    
+    setDisabledDates : function(dd){
+        var me = this;
+
+        if(Ext.isArray(dd)){
+            me.disabledDates = dd;
+            me.disabledDatesRE = null;
+        }else{
+            me.disabledDatesRE = dd;
+        }
+        me.initDisabledDays();
+        me.update(me.value, true);
+        return me;
+    },
+
+    
+    setDisabledDays : function(dd){
+        this.disabledDays = dd;
+        return this.update(this.value, true);
+    },
+
+    
+    setMinDate : function(dt){
+        this.minDate = dt;
+        return this.update(this.value, true);
+    },
+
+    
+    setMaxDate : function(dt){
+        this.maxDate = dt;
+        return this.update(this.value, true);
+    },
+
+    
+    setValue : function(value){
+        this.value = Ext.Date.clearTime(value, true);
+        return this.update(this.value);
+    },
+
+    
+    getValue : function(){
+        return this.value;
+    },
+
+    
+    focus : function(){
+        this.update(this.activeDate);
+    },
+
+    
+    onEnable: function(){
+        this.callParent();
+        this.setDisabledStatus(false);
+        this.update(this.activeDate);
+
+    },
+
+    
+    onDisable : function(){
+        this.callParent();
+        this.setDisabledStatus(true);
+    },
+
+    
+    setDisabledStatus : function(disabled){
+        var me = this;
+
+        me.keyNav.setDisabled(disabled);
+        me.prevRepeater.setDisabled(disabled);
+        me.nextRepeater.setDisabled(disabled);
+        if (me.showToday) {
+            me.todayKeyListener.setDisabled(disabled);
+            me.todayBtn.setDisabled(disabled);
+        }
+    },
+
+    
+    getActive: function(){
+        return this.activeDate || this.value;
+    },
+
+    
+    runAnimation: function(isHide){
+        var picker = this.monthPicker,
+            options = {
+                duration: 200,
+                callback: function(){
+                    if (isHide) {
+                        picker.hide();
+                    } else {
+                        picker.show();
+                    }
+                }
+            };
+
+        if (isHide) {
+            picker.el.slideOut('t', options);
+        } else {
+            picker.el.slideIn('t', options);
+        }
+    },
+
+    
+    hideMonthPicker : function(animate){
+        var me = this,
+            picker = me.monthPicker;
+
+        if (picker) {
+            if (me.shouldAnimate(animate)) {
+                me.runAnimation(true);
+            } else {
+                picker.hide();
+            }
+        }
+        return me;
+    },
+
+    
+    showMonthPicker : function(animate){
+        var me = this,
+            picker;
+        
+        if (me.rendered && !me.disabled) {
+            picker = me.createMonthPicker();
+            picker.setValue(me.getActive());
+            picker.setSize(me.getSize());
+            picker.setPosition(-1, -1);
+            if (me.shouldAnimate(animate)) {
+                me.runAnimation(false);
+            } else {
+                picker.show();
+            }
+        }
+        return me;
+    },
+    
+    
+    shouldAnimate: function(animate){
+        return Ext.isDefined(animate) ? animate : !this.disableAnim;
+    },
+
+    
+    createMonthPicker: function(){
+        var me = this,
+            picker = me.monthPicker;
+
+        if (!picker) {
+            me.monthPicker = picker = Ext.create('Ext.picker.Month', {
+                renderTo: me.el,
+                floating: true,
+                shadow: false,
+                small: me.showToday === false,
+                listeners: {
+                    scope: me,
+                    cancelclick: me.onCancelClick,
+                    okclick: me.onOkClick,
+                    yeardblclick: me.onOkClick,
+                    monthdblclick: me.onOkClick
+                }
+            });
+            if (!me.disableAnim) {
+                
+                picker.el.setStyle('display', 'none');
+            }
+            me.on('beforehide', Ext.Function.bind(me.hideMonthPicker, me, [false]));
+        }
+        return picker;
+    },
+
+    
+    onOkClick: function(picker, value){
+        var me = this,
+            month = value[0],
+            year = value[1],
+            date = new Date(year, month, me.getActive().getDate());
+
+        if (date.getMonth() !== month) {
+            
+            date = new Date(year, month, 1).getLastDateOfMonth();
+        }
+        me.update(date);
+        me.hideMonthPicker();
+    },
+
+    
+    onCancelClick: function(){
+        this.hideMonthPicker();
+    },
+
+    
+    showPrevMonth : function(e){
+        return this.update(Ext.Date.add(this.activeDate, Ext.Date.MONTH, -1));
+    },
+
+    
+    showNextMonth : function(e){
+        return this.update(Ext.Date.add(this.activeDate, Ext.Date.MONTH, 1));
+    },
+
+    
+    showPrevYear : function(){
+        this.update(Ext.Date.add(this.activeDate, Ext.Date.YEAR, -1));
+    },
+
+    
+    showNextYear : function(){
+        this.update(Ext.Date.add(this.activeDate, Ext.Date.YEAR, 1));
+    },
+
+    
+    handleMouseWheel : function(e){
+        e.stopEvent();
+        if(!this.disabled){
+            var delta = e.getWheelDelta();
+            if(delta > 0){
+                this.showPrevMonth();
+            } else if(delta < 0){
+                this.showNextMonth();
+            }
+        }
+    },
+
+    
+    handleDateClick : function(e, t){
+        var me = this,
+            handler = me.handler;
+
+        e.stopEvent();
+        if(!me.disabled && t.dateValue && !Ext.fly(t.parentNode).hasCls(me.disabledCellCls)){
+            me.cancelFocus = me.focusOnSelect === false;
+            me.setValue(new Date(t.dateValue));
+            delete me.cancelFocus;
+            me.fireEvent('select', me, me.value);
+            if (handler) {
+                handler.call(me.scope || me, me, me.value);
+            }
+            
+            
+            
+            
+            me.onSelect();
+        }
+    },
+
+    
+    onSelect: function() {
+        if (this.hideOnSelect) {
+             this.hide();
+         }
+    },
+
+    
+    selectToday : function(){
+        var me = this,
+            btn = me.todayBtn,
+            handler = me.handler;
+
+        if(btn && !btn.disabled){
+            me.setValue(Ext.Date.clearTime(new Date()));
+            me.fireEvent('select', me, me.value);
+            if (handler) {
+                handler.call(me.scope || me, me, me.value);
+            }
+            me.onSelect();
+        }
+        return me;
+    },
+
+    
+    selectedUpdate: function(date, active){
+        var me = this,
+            t = date.getTime(),
+            cells = me.cells,
+            cls = me.selectedCls;
+
+        cells.removeCls(cls);
+        cells.each(function(c){
+            if (c.dom.firstChild.dateValue == t) {
+                me.el.dom.setAttribute('aria-activedescendent', c.dom.id);
+                c.addCls(cls);
+                if(me.isVisible() && !me.cancelFocus){
+                    Ext.fly(c.dom.firstChild).focus(50);
+                }
+                return false;
+            }
+        }, this);
+    },
+
+    
+    fullUpdate: function(date, active){
+        var me = this,
+            cells = me.cells.elements,
+            textNodes = me.textNodes,
+            disabledCls = me.disabledCellCls,
+            eDate = Ext.Date,
+            i = 0,
+            extraDays = 0,
+            visible = me.isVisible(),
+            sel = +eDate.clearTime(date, true),
+            today = +eDate.clearTime(new Date()),
+            min = me.minDate ? eDate.clearTime(me.minDate, true) : Number.NEGATIVE_INFINITY,
+            max = me.maxDate ? eDate.clearTime(me.maxDate, true) : Number.POSITIVE_INFINITY,
+            ddMatch = me.disabledDatesRE,
+            ddText = me.disabledDatesText,
+            ddays = me.disabledDays ? me.disabledDays.join('') : false,
+            ddaysText = me.disabledDaysText,
+            format = me.format,
+            days = eDate.getDaysInMonth(date),
+            firstOfMonth = eDate.getFirstDateOfMonth(date),
+            startingPos = firstOfMonth.getDay() - me.startDay,
+            previousMonth = eDate.add(date, eDate.MONTH, -1),
+            longDayFormat = me.longDayFormat,
+            prevStart,
+            current,
+            disableToday,
+            tempDate,
+            setCellClass,
+            html,
+            cls,
+            formatValue,
+            value;
+
+        if (startingPos < 0) {
+            startingPos += 7;
+        }
+
+        days += startingPos;
+        prevStart = eDate.getDaysInMonth(previousMonth) - startingPos;
+        current = new Date(previousMonth.getFullYear(), previousMonth.getMonth(), prevStart, me.initHour);
+
+        if (me.showToday) {
+            tempDate = eDate.clearTime(new Date());
+            disableToday = (tempDate < min || tempDate > max ||
+                (ddMatch && format && ddMatch.test(eDate.dateFormat(tempDate, format))) ||
+                (ddays && ddays.indexOf(tempDate.getDay()) != -1));
+
+            if (!me.disabled) {
+                me.todayBtn.setDisabled(disableToday);
+                me.todayKeyListener.setDisabled(disableToday);
+            }
+        }
+
+        setCellClass = function(cell){
+            value = +eDate.clearTime(current, true);
+            cell.title = eDate.format(current, longDayFormat);
+            
+            cell.firstChild.dateValue = value;
+            if(value == today){
+                cell.className += ' ' + me.todayCls;
+                cell.title = me.todayText;
+            }
+            if(value == sel){
+                cell.className += ' ' + me.selectedCls;
+                me.el.dom.setAttribute('aria-activedescendant', cell.id);
+                if (visible && me.floating) {
+                    Ext.fly(cell.firstChild).focus(50);
+                }
+            }
+            
+            if(value < min) {
+                cell.className = disabledCls;
+                cell.title = me.minText;
+                return;
+            }
+            if(value > max) {
+                cell.className = disabledCls;
+                cell.title = me.maxText;
+                return;
+            }
+            if(ddays){
+                if(ddays.indexOf(current.getDay()) != -1){
+                    cell.title = ddaysText;
+                    cell.className = disabledCls;
+                }
+            }
+            if(ddMatch && format){
+                formatValue = eDate.dateFormat(current, format);
+                if(ddMatch.test(formatValue)){
+                    cell.title = ddText.replace('%0', formatValue);
+                    cell.className = disabledCls;
+                }
+            }
+        };
+
+        for(; i < me.numDays; ++i) {
+            if (i < startingPos) {
+                html = (++prevStart);
+                cls = me.prevCls;
+            } else if (i >= days) {
+                html = (++extraDays);
+                cls = me.nextCls;
+            } else {
+                html = i - startingPos + 1;
+                cls = me.activeCls;
+            }
+            textNodes[i].innerHTML = html;
+            cells[i].className = cls;
+            current.setDate(current.getDate() + 1);
+            setCellClass(cells[i]);
+        }
+
+        me.monthBtn.setText(me.monthNames[date.getMonth()] + ' ' + date.getFullYear());
+    },
+
+    
+    update : function(date, forceRefresh){
+        var me = this,
+            active = me.activeDate;
+
+        if (me.rendered) {
+            me.activeDate = date;
+            if(!forceRefresh && active && me.el && active.getMonth() == date.getMonth() && active.getFullYear() == date.getFullYear()){
+                me.selectedUpdate(date, active);
+            } else {
+                me.fullUpdate(date, active);
+            }
+        }
+        return me;
+    },
+
+    
+    beforeDestroy : function() {
+        var me = this;
+
+        if (me.rendered) {
+            Ext.destroy(
+                me.todayKeyListener,
+                me.keyNav,
+                me.monthPicker,
+                me.monthBtn,
+                me.nextRepeater,
+                me.prevRepeater,
+                me.todayBtn
+            );
+            delete me.textNodes;
+            delete me.cells.elements;
+        }
+        me.callParent();
+    },
+
+    
+    onShow: function() {
+        this.callParent(arguments);
+        if (this.focusOnShow) {
+            this.focus();
+        }
+    }
+},
+
+
+function() {
+    var proto = this.prototype;
+
+    proto.monthNames = Ext.Date.monthNames;
+
+    proto.dayNames = Ext.Date.dayNames;
+
+    proto.format = Ext.Date.defaultFormat;
+});
+
+
+Ext.define('Ext.form.field.Date', {
+    extend:'Ext.form.field.Picker',
+    alias: 'widget.datefield',
+    requires: ['Ext.picker.Date'],
+    alternateClassName: ['Ext.form.DateField', 'Ext.form.Date'],
+
+    
+    format : "m/d/Y",
+    
+    altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",
+    
+    disabledDaysText : "Disabled",
+    
+    disabledDatesText : "Disabled",
+    
+    minText : "The date in this field must be equal to or after {0}",
+    
+    maxText : "The date in this field must be equal to or before {0}",
+    
+    invalidText : "{0} is not a valid date - it must be in the format {1}",
+    
+    triggerCls : Ext.baseCSSPrefix + 'form-date-trigger',
+    
+    showToday : true,
+    
+    
+    
+    
+
+    
+
+    
+    
+    initTime: '12', 
+
+    initTimeFormat: 'H',
+
+    matchFieldWidth: false,
+    
+    startDay: 0,
+
+    initComponent : function(){
+        var me = this,
+            isString = Ext.isString,
+            min, max;
+
+        min = me.minValue;
+        max = me.maxValue;
+        if(isString(min)){
+            me.minValue = me.parseDate(min);
+        }
+        if(isString(max)){
+            me.maxValue = me.parseDate(max);
+        }
+        me.disabledDatesRE = null;
+        me.initDisabledDays();
+
+        me.callParent();
+    },
+
+    initValue: function() {
+        var me = this,
+            value = me.value;
+
+        
+        if (Ext.isString(value)) {
+            me.value = me.rawToValue(value);
+        }
+
+        me.callParent();
+    },
+
+    
+    initDisabledDays : function(){
+        if(this.disabledDates){
+            var dd = this.disabledDates,
+                len = dd.length - 1,
+                re = "(?:";
+
+            Ext.each(dd, function(d, i){
+                re += Ext.isDate(d) ? '^' + Ext.String.escapeRegex(d.dateFormat(this.format)) + '$' : dd[i];
+                if (i !== len) {
+                    re += '|';
+                }
+            }, this);
+            this.disabledDatesRE = new RegExp(re + ')');
+        }
+    },
+
+    
+    setDisabledDates : function(dd){
+        var me = this,
+            picker = me.picker;
+
+        me.disabledDates = dd;
+        me.initDisabledDays();
+        if (picker) {
+            picker.setDisabledDates(me.disabledDatesRE);
+        }
+    },
+
+    
+    setDisabledDays : function(dd){
+        var picker = this.picker;
+
+        this.disabledDays = dd;
+        if (picker) {
+            picker.setDisabledDays(dd);
+        }
+    },
+
+    
+    setMinValue : function(dt){
+        var me = this,
+            picker = me.picker,
+            minValue = (Ext.isString(dt) ? me.parseDate(dt) : dt);
+
+        me.minValue = minValue;
+        if (picker) {
+            picker.minText = Ext.String.format(me.minText, me.formatDate(me.minValue));
+            picker.setMinDate(minValue);
+        }
+    },
+
+    
+    setMaxValue : function(dt){
+        var me = this,
+            picker = me.picker,
+            maxValue = (Ext.isString(dt) ? me.parseDate(dt) : dt);
+
+        me.maxValue = maxValue;
+        if (picker) {
+            picker.maxText = Ext.String.format(me.maxText, me.formatDate(me.maxValue));
+            picker.setMaxDate(maxValue);
+        }
+    },
+
+    
+    getErrors: function(value) {
+        var me = this,
+            format = Ext.String.format,
+            clearTime = Ext.Date.clearTime,
+            errors = me.callParent(arguments),
+            disabledDays = me.disabledDays,
+            disabledDatesRE = me.disabledDatesRE,
+            minValue = me.minValue,
+            maxValue = me.maxValue,
+            len = disabledDays ? disabledDays.length : 0,
+            i = 0,
+            svalue,
+            fvalue,
+            day,
+            time;
+
+        value = me.formatDate(value || me.processRawValue(me.getRawValue()));
+
+        if (value === null || value.length < 1) { 
+             return errors;
+        }
+
+        svalue = value;
+        value = me.parseDate(value);
+        if (!value) {
+            errors.push(format(me.invalidText, svalue, me.format));
+            return errors;
+        }
+
+        time = value.getTime();
+        if (minValue && time < clearTime(minValue).getTime()) {
+            errors.push(format(me.minText, me.formatDate(minValue)));
+        }
+
+        if (maxValue && time > clearTime(maxValue).getTime()) {
+            errors.push(format(me.maxText, me.formatDate(maxValue)));
+        }
+
+        if (disabledDays) {
+            day = value.getDay();
+
+            for(; i < len; i++) {
+                if (day === disabledDays[i]) {
+                    errors.push(me.disabledDaysText);
+                    break;
+                }
+            }
+        }
+
+        fvalue = me.formatDate(value);
+        if (disabledDatesRE && disabledDatesRE.test(fvalue)) {
+            errors.push(format(me.disabledDatesText, fvalue));
+        }
+
+        return errors;
+    },
+
+    rawToValue: function(rawValue) {
+        return this.parseDate(rawValue) || rawValue || null;
+    },
+
+    valueToRaw: function(value) {
+        return this.formatDate(this.parseDate(value));
+    },
+
+    
+
+    
+    safeParse : function(value, format) {
+        var me = this,
+            utilDate = Ext.Date,
+            parsedDate,
+            result = null;
+
+        if (utilDate.formatContainsHourInfo(format)) {
+            
+            result = utilDate.parse(value, format);
+        } else {
+            
+            parsedDate = utilDate.parse(value + ' ' + me.initTime, format + ' ' + me.initTimeFormat);
+            if (parsedDate) {
+                result = utilDate.clearTime(parsedDate);
+            }
+        }
+        return result;
+    },
+
+    
+    getSubmitValue: function() {
+        var format = this.submitFormat || this.format,
+            value = this.getValue();
+
+        return value ? Ext.Date.format(value, format) : '';
+    },
+
+    
+    parseDate : function(value) {
+        if(!value || Ext.isDate(value)){
+            return value;
+        }
+
+        var me = this,
+            val = me.safeParse(value, me.format),
+            altFormats = me.altFormats,
+            altFormatsArray = me.altFormatsArray,
+            i = 0,
+            len;
+
+        if (!val && altFormats) {
+            altFormatsArray = altFormatsArray || altFormats.split('|');
+            len = altFormatsArray.length;
+            for (; i < len && !val; ++i) {
+                val = me.safeParse(value, altFormatsArray[i]);
+            }
+        }
+        return val;
+    },
+
+    
+    formatDate : function(date){
+        return Ext.isDate(date) ? Ext.Date.dateFormat(date, this.format) : date;
+    },
+
+    createPicker: function() {
+        var me = this,
+            format = Ext.String.format;
+
+        return Ext.create('Ext.picker.Date', {
+            pickerField: me,
+            ownerCt: me.ownerCt,
+            renderTo: document.body,
+            floating: true,
+            hidden: true,
+            focusOnShow: true,
+            minDate: me.minValue,
+            maxDate: me.maxValue,
+            disabledDatesRE: me.disabledDatesRE,
+            disabledDatesText: me.disabledDatesText,
+            disabledDays: me.disabledDays,
+            disabledDaysText: me.disabledDaysText,
+            format: me.format,
+            showToday: me.showToday,
+            startDay: me.startDay,
+            minText: format(me.minText, me.formatDate(me.minValue)),
+            maxText: format(me.maxText, me.formatDate(me.maxValue)),
+            listeners: {
+                scope: me,
+                select: me.onSelect
+            },
+            keyNavConfig: {
+                esc: function() {
+                    me.collapse();
+                }
+            }
+        });
+    },
+
+    onSelect: function(m, d) {
+        var me = this;
+
+        me.setValue(d);
+        me.fireEvent('select', me, d);
+        me.collapse();
+    },
+
+    
+    onExpand: function() {
+        var value = this.getValue();
+        this.picker.setValue(Ext.isDate(value) ? value : new Date());
+    },
+
+    
+    onCollapse: function() {
+        this.focus(false, 60);
+    },
+
+    
+    beforeBlur : function(){
+        var me = this,
+            v = me.parseDate(me.getRawValue()),
+            focusTask = me.focusTask;
+
+        if (focusTask) {
+            focusTask.cancel();
+        }
+
+        if (v) {
+            me.setValue(v);
+        }
+    }
+
+    
+    
+    
+    
+});
+
+
+Ext.define('Ext.form.field.Display', {
+    extend:'Ext.form.field.Base',
+    alias: 'widget.displayfield',
+    requires: ['Ext.util.Format', 'Ext.XTemplate'],
+    alternateClassName: ['Ext.form.DisplayField', 'Ext.form.Display'],
+    fieldSubTpl: [
+        '<div id="{id}" class="{fieldCls}"></div>',
+        {
+            compiled: true,
+            disableFormats: true
+        }
+    ],
+
+    
+    fieldCls: Ext.baseCSSPrefix + 'form-display-field',
+
+    
+    htmlEncode: false,
+
+    validateOnChange: false,
+
+    initEvents: Ext.emptyFn,
+
+    submitValue: false,
+
+    isValid: function() {
+        return true;
+    },
+
+    validate: function() {
+        return true;
+    },
+
+    getRawValue: function() {
+        return this.rawValue;
+    },
+
+    setRawValue: function(value) {
+        var me = this;
+        value = Ext.value(value, '');
+        me.rawValue = value;
+        if (me.rendered) {
+            me.inputEl.dom.innerHTML = me.htmlEncode ? Ext.util.Format.htmlEncode(value) : value;
+        }
+        return value;
+    },
+
+    
+    getContentTarget: function() {
+        return this.inputEl;
+    }
+
+    
+    
+    
+    
+    
+    
+});
+
+
+Ext.define("Ext.form.field.File", {
+    extend: 'Ext.form.field.Text',
+    alias: ['widget.filefield', 'widget.fileuploadfield'],
+    alternateClassName: ['Ext.form.FileUploadField', 'Ext.ux.form.FileUploadField', 'Ext.form.File'],
+    uses: ['Ext.button.Button', 'Ext.layout.component.field.File'],
+
+    
+    buttonText: 'Browse...',
+
+    
+    buttonOnly: false,
+
+    
+    buttonMargin: 3,
+
+    
+
+    
+
+    
+
+    
+
+    
+    fieldBodyCls: Ext.baseCSSPrefix + 'form-file-wrap',
+
+    
+    readOnly: true,
+
+    
+    componentLayout: 'filefield',
+
+    
+    onRender: function() {
+        var me = this,
+            inputEl;
+
+        me.callParent(arguments);
+
+        me.createButton();
+        me.createFileInput();
+        
+        
+        
+        if (me.disabled) {
+            me.disableItems();
+        }
+
+        inputEl = me.inputEl;
+        inputEl.dom.removeAttribute('name'); 
+        if (me.buttonOnly) {
+            inputEl.setDisplayed(false);
+        }
+    },
+
+    
+    createButton: function() {
+        var me = this;
+        me.button = Ext.widget('button', Ext.apply({
+            ui: me.ui,
+            renderTo: me.bodyEl,
+            text: me.buttonText,
+            cls: Ext.baseCSSPrefix + 'form-file-btn',
+            preventDefault: false,
+            style: me.buttonOnly ? '' : 'margin-left:' + me.buttonMargin + 'px'
+        }, me.buttonConfig));
+    },
+
+    
+    createFileInput : function() {
+        var me = this;
+        me.fileInputEl = me.button.el.createChild({
+            name: me.getName(),
+            cls: Ext.baseCSSPrefix + 'form-file-input',
+            tag: 'input',
+            type: 'file',
+            size: 1
+        }).on('change', me.onFileChange, me);
+    },
+
+    
+    onFileChange: function() {
+        this.lastValue = null; 
+        Ext.form.field.File.superclass.setValue.call(this, this.fileInputEl.dom.value);
+    },
+
+    
+    setValue: Ext.emptyFn,
+
+    reset : function(){
+        var me = this;
+        if (me.rendered) {
+            me.fileInputEl.remove();
+            me.createFileInput();
+            me.inputEl.dom.value = '';
+        }
+        me.callParent();
+    },
+
+    onDisable: function(){
+        this.callParent();
+        this.disableItems();
+    },
+    
+    disableItems: function(){
+        var file = this.fileInputEl,
+            button = this.button;
+             
+        if (file) {
+            file.dom.disabled = true;
+        }
+        if (button) {
+            button.disable();
+        }    
+    },
+
+    onEnable: function(){
+        var me = this;
+        me.callParent();
+        me.fileInputEl.dom.disabled = false;
+        me.button.enable();
+    },
+
+    isFileUpload: function() {
+        return true;
+    },
+
+    extractFileInput: function() {
+        var fileInput = this.fileInputEl.dom;
+        this.reset();
+        return fileInput;
+    },
+
+    onDestroy: function(){
+        Ext.destroyMembers(this, 'fileInputEl', 'button');
+        this.callParent();
+    }
+
+
+});
+
+
+Ext.define('Ext.form.field.Hidden', {
+    extend:'Ext.form.field.Base',
+    alias: ['widget.hiddenfield', 'widget.hidden'],
+    alternateClassName: 'Ext.form.Hidden',
+
+    
+    inputType : 'hidden',
+    hideLabel: true,
+    
+    initComponent: function(){
+        this.formItemCls += '-hidden';
+        this.callParent();    
+    },
+    
+    
+    isEqual: function(value1, value2) {
+        return this.isEqualAsString(value1, value2);
+    },
+
+    
+    initEvents: Ext.emptyFn,
+    setSize : Ext.emptyFn,
+    setWidth : Ext.emptyFn,
+    setHeight : Ext.emptyFn,
+    setPosition : Ext.emptyFn,
+    setPagePosition : Ext.emptyFn,
+    markInvalid : Ext.emptyFn,
+    clearInvalid : Ext.emptyFn
+});
+
+
+Ext.define('Ext.picker.Color', {
+    extend: 'Ext.Component',
+    requires: 'Ext.XTemplate',
+    alias: 'widget.colorpicker',
+    alternateClassName: 'Ext.ColorPalette',
+
+    
+    componentCls : Ext.baseCSSPrefix + 'color-picker',
+
+    
+    selectedCls: Ext.baseCSSPrefix + 'color-picker-selected',
+
+    
+    value : null,
+
+    
+    clickEvent :'click',
+
+    
+    allowReselect : false,
+
+    
+    colors : [
+        '000000', '993300', '333300', '003300', '003366', '000080', '333399', '333333',
+        '800000', 'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080',
+        'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', '969696',
+        'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0',
+        'FF99CC', 'FFCC99', 'FFFF99', 'CCFFCC', 'CCFFFF', '99CCFF', 'CC99FF', 'FFFFFF'
+    ],
+
+    
+
+    
+
+    colorRe: /(?:^|\s)color-(.{6})(?:\s|$)/,
+    
+    renderTpl: [
+        '<tpl for="colors">',
+            '<a href="#" class="color-{.}" hidefocus="on">',
+                '<em><span style="background:#{.}" unselectable="on"> </span></em>',
+            '</a>',
+        '</tpl>'
+    ],
+
+    
+    initComponent : function(){
+        var me = this;
+
+        me.callParent(arguments);
+        me.addEvents(
+            
+            'select'
+        );
+
+        if (me.handler) {
+            me.on('select', me.handler, me.scope, true);
+        }
+    },
+
+
+    
+    onRender : function(container, position){
+        var me = this,
+            clickEvent = me.clickEvent;
+
+        Ext.apply(me.renderData, {
+            itemCls: me.itemCls,
+            colors: me.colors
+        });
+        me.callParent(arguments);
+
+        me.mon(me.el, clickEvent, me.handleClick, me, {delegate: 'a'});
+        
+        if(clickEvent != 'click'){
+            me.mon(me.el, 'click', Ext.emptyFn, me, {delegate: 'a', stopEvent: true});
+        }
+    },
+
+    
+    afterRender : function(){
+        var me = this,
+            value;
+
+        me.callParent(arguments);
+        if (me.value) {
+            value = me.value;
+            me.value = null;
+            me.select(value, true);
+        }
+    },
+
+    
+    handleClick : function(event, target){
+        var me = this,
+            color;
+
+        event.stopEvent();
+        if (!me.disabled) {
+            color = target.className.match(me.colorRe)[1];
+            me.select(color.toUpperCase());
+        }
+    },
+
+    
+    select : function(color, suppressEvent){
+
+        var me = this,
+            selectedCls = me.selectedCls,
+            value = me.value,
+            el;
+
+        color = color.replace('#', '');
+        if (!me.rendered) {
+            me.value = color;
+            return;
+        }
+
+
+        if (color != value || me.allowReselect) {
+            el = me.el;
+
+            if (me.value) {
+                el.down('a.color-' + value).removeCls(selectedCls);
+            }
+            el.down('a.color-' + color).addCls(selectedCls);
+            me.value = color;
+            if (suppressEvent !== true) {
+                me.fireEvent('select', me, color);
+            }
+        }
+    },
+
+    
+    getValue: function(){
+        return this.value || null;
+    }
+});
+
+
+
+Ext.define('Ext.layout.component.field.HtmlEditor', {
+    extend: 'Ext.layout.component.field.Field',
+    alias: ['layout.htmleditor'],
+
+    type: 'htmleditor',
+
+    sizeBodyContents: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            bodyEl = owner.bodyEl,
+            toolbar = owner.getToolbar(),
+            textarea = owner.textareaEl,
+            iframe = owner.iframeEl,
+            editorHeight;
+
+        if (Ext.isNumber(width)) {
+            width -= bodyEl.getFrameWidth('lr');
+        }
+        toolbar.setWidth(width);
+        textarea.setWidth(width);
+        iframe.setWidth(width);
+
+        
+        if (Ext.isNumber(height)) {
+            editorHeight = height - toolbar.getHeight() - bodyEl.getFrameWidth('tb');
+            textarea.setHeight(editorHeight);
+            iframe.setHeight(editorHeight);
+        }
+    }
+});
+
+Ext.define('Ext.form.field.HtmlEditor', {
+    extend:'Ext.Component',
+    mixins: {
+        labelable: 'Ext.form.Labelable',
+        field: 'Ext.form.field.Field'
+    },
+    alias: 'widget.htmleditor',
+    alternateClassName: 'Ext.form.HtmlEditor',
+    requires: [
+        'Ext.tip.QuickTipManager',
+        'Ext.picker.Color',
+        'Ext.toolbar.Item',
+        'Ext.toolbar.Toolbar',
+        'Ext.util.Format',
+        'Ext.layout.component.field.HtmlEditor'
+    ],
+
+    fieldSubTpl: [
+        '<div id="{cmpId}-toolbarWrap" class="{toolbarWrapCls}"></div>',
+        '<textarea id="{cmpId}-textareaEl" name="{name}" tabIndex="-1" class="{textareaCls}" ',
+            'style="{size}" autocomplete="off"></textarea>',
+        '<iframe id="{cmpId}-iframeEl" name="{iframeName}" frameBorder="0" style="overflow:auto;{size}" src="{iframeSrc}"></iframe>',
+        {
+            compiled: true,
+            disableFormats: true
+        }
+    ],
+
+    
+    enableFormat : true,
+    
+    enableFontSize : true,
+    
+    enableColors : true,
+    
+    enableAlignments : true,
+    
+    enableLists : true,
+    
+    enableSourceEdit : true,
+    
+    enableLinks : true,
+    
+    enableFont : true,
+    
+    createLinkText : 'Please enter the URL for the link:',
+    
+    defaultLinkValue : 'http:/'+'/',
+    
+    fontFamilies : [
+        'Arial',
+        'Courier New',
+        'Tahoma',
+        'Times New Roman',
+        'Verdana'
+    ],
+    defaultFont: 'tahoma',
+    
+    defaultValue: (Ext.isOpera || Ext.isIE6) ? ' ' : '​',
+
+    fieldBodyCls: Ext.baseCSSPrefix + 'html-editor-wrap',
+
+    componentLayout: 'htmleditor',
+
+    
+    initialized : false,
+    activated : false,
+    sourceEditMode : false,
+    iframePad:3,
+    hideMode:'offsets',
+
+    maskOnDisable: true,
+
+    
+    initComponent : function(){
+        var me = this;
+
+        me.addEvents(
+            
+            'initialize',
+            
+            'activate',
+             
+            'beforesync',
+             
+            'beforepush',
+             
+            'sync',
+             
+            'push',
+             
+            'editmodechange'
+        );
+
+        me.callParent(arguments);
+
+        
+        me.initLabelable();
+        me.initField();
+    },
+
+    
+    createToolbar : function(editor){
+        var me = this,
+            items = [],
+            tipsEnabled = Ext.tip.QuickTipManager && Ext.tip.QuickTipManager.isEnabled(),
+            baseCSSPrefix = Ext.baseCSSPrefix,
+            fontSelectItem, toolbar, undef;
+
+        function btn(id, toggle, handler){
+            return {
+                itemId : id,
+                cls : baseCSSPrefix + 'btn-icon',
+                iconCls: baseCSSPrefix + 'edit-'+id,
+                enableToggle:toggle !== false,
+                scope: editor,
+                handler:handler||editor.relayBtnCmd,
+                clickEvent:'mousedown',
+                tooltip: tipsEnabled ? editor.buttonTips[id] || undef : undef,
+                overflowText: editor.buttonTips[id].title || undef,
+                tabIndex:-1
+            };
+        }
+
+
+        if (me.enableFont && !Ext.isSafari2) {
+            fontSelectItem = Ext.widget('component', {
+                renderTpl: [
+                    '<select id="{id}-selectEl" class="{cls}">',
+                        '<tpl for="fonts">',
+                            '<option value="{[values.toLowerCase()]}" style="font-family:{.}"<tpl if="values.toLowerCase()==parent.defaultFont"> selected</tpl>>{.}</option>',
+                        '</tpl>',
+                    '</select>'
+                ],
+                renderData: {
+                    cls: baseCSSPrefix + 'font-select',
+                    fonts: me.fontFamilies,
+                    defaultFont: me.defaultFont
+                },
+                childEls: ['selectEl'],
+                onDisable: function() {
+                    var selectEl = this.selectEl;
+                    if (selectEl) {
+                        selectEl.dom.disabled = true;
+                    }
+                    Ext.Component.superclass.onDisable.apply(this, arguments);
+                },
+                onEnable: function() {
+                    var selectEl = this.selectEl;
+                    if (selectEl) {
+                        selectEl.dom.disabled = false;
+                    }
+                    Ext.Component.superclass.onEnable.apply(this, arguments);
+                }
+            });
+
+            items.push(
+                fontSelectItem,
+                '-'
+            );
+        }
+
+        if (me.enableFormat) {
+            items.push(
+                btn('bold'),
+                btn('italic'),
+                btn('underline')
+            );
+        }
+
+        if (me.enableFontSize) {
+            items.push(
+                '-',
+                btn('increasefontsize', false, me.adjustFont),
+                btn('decreasefontsize', false, me.adjustFont)
+            );
+        }
+
+        if (me.enableColors) {
+            items.push(
+                '-', {
+                    itemId: 'forecolor',
+                    cls: baseCSSPrefix + 'btn-icon',
+                    iconCls: baseCSSPrefix + 'edit-forecolor',
+                    overflowText: editor.buttonTips.forecolor.title,
+                    tooltip: tipsEnabled ? editor.buttonTips.forecolor || undef : undef,
+                    tabIndex:-1,
+                    menu : Ext.widget('menu', {
+                        plain: true,
+                        items: [{
+                            xtype: 'colorpicker',
+                            allowReselect: true,
+                            focus: Ext.emptyFn,
+                            value: '000000',
+                            plain: true,
+                            clickEvent: 'mousedown',
+                            handler: function(cp, color) {
+                                me.execCmd('forecolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
+                                me.deferFocus();
+                                this.up('menu').hide();
+                            }
+                        }]
+                    })
+                }, {
+                    itemId: 'backcolor',
+                    cls: baseCSSPrefix + 'btn-icon',
+                    iconCls: baseCSSPrefix + 'edit-backcolor',
+                    overflowText: editor.buttonTips.backcolor.title,
+                    tooltip: tipsEnabled ? editor.buttonTips.backcolor || undef : undef,
+                    tabIndex:-1,
+                    menu : Ext.widget('menu', {
+                        plain: true,
+                        items: [{
+                            xtype: 'colorpicker',
+                            focus: Ext.emptyFn,
+                            value: 'FFFFFF',
+                            plain: true,
+                            allowReselect: true,
+                            clickEvent: 'mousedown',
+                            handler: function(cp, color) {
+                                if (Ext.isGecko) {
+                                    me.execCmd('useCSS', false);
+                                    me.execCmd('hilitecolor', color);
+                                    me.execCmd('useCSS', true);
+                                    me.deferFocus();
+                                } else {
+                                    me.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
+                                    me.deferFocus();
+                                }
+                                this.up('menu').hide();
+                            }
+                        }]
+                    })
+                }
+            );
+        }
+
+        if (me.enableAlignments) {
+            items.push(
+                '-',
+                btn('justifyleft'),
+                btn('justifycenter'),
+                btn('justifyright')
+            );
+        }
+
+        if (!Ext.isSafari2) {
+            if (me.enableLinks) {
+                items.push(
+                    '-',
+                    btn('createlink', false, me.createLink)
+                );
+            }
+
+            if (me.enableLists) {
+                items.push(
+                    '-',
+                    btn('insertorderedlist'),
+                    btn('insertunorderedlist')
+                );
+            }
+            if (me.enableSourceEdit) {
+                items.push(
+                    '-',
+                    btn('sourceedit', true, function(btn){
+                        me.toggleSourceEdit(!me.sourceEditMode);
+                    })
+                );
+            }
+        }
+
+        
+        toolbar = Ext.widget('toolbar', {
+            renderTo: me.toolbarWrap,
+            enableOverflow: true,
+            items: items
+        });
+
+        if (fontSelectItem) {
+            me.fontSelect = fontSelectItem.selectEl;
+
+            me.mon(me.fontSelect, 'change', function(){
+                me.relayCmd('fontname', me.fontSelect.dom.value);
+                me.deferFocus();
+            });
+        }
+
+        
+        me.mon(toolbar.el, 'click', function(e){
+            e.preventDefault();
+        });
+
+        me.toolbar = toolbar;
+    },
+
+    onDisable: function() {
+        this.bodyEl.mask();
+        this.callParent(arguments);
+    },
+
+    onEnable: function() {
+        this.bodyEl.unmask();
+        this.callParent(arguments);
+    },
+
+    
+    setReadOnly: function(readOnly) {
+        var me = this,
+            textareaEl = me.textareaEl,
+            iframeEl = me.iframeEl,
+            body;
+
+        me.readOnly = readOnly;
+
+        if (textareaEl) {
+            textareaEl.dom.readOnly = readOnly;
+        }
+
+        if (me.initialized) {
+            body = me.getEditorBody();
+            if (Ext.isIE) {
+                
+                iframeEl.setDisplayed(false);
+                body.contentEditable = !readOnly;
+                iframeEl.setDisplayed(true);
+            } else {
+                me.setDesignMode(!readOnly);
+            }
+            if (body) {
+                body.style.cursor = readOnly ? 'default' : 'text';
+            }
+            me.disableItems(readOnly);
+        }
+    },
+
+    
+    getDocMarkup: function() {
+        var me = this,
+            h = me.iframeEl.getHeight() - me.iframePad * 2;
+        return Ext.String.format('<html><head><style type="text/css">body{border:0;margin:0;padding:{0}px;height:{1}px;box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;cursor:text}</style></head><body></body></html>', me.iframePad, h);
+    },
+
+    
+    getEditorBody: function() {
+        var doc = this.getDoc();
+        return doc.body || doc.documentElement;
+    },
+
+    
+    getDoc: function() {
+        return (!Ext.isIE && this.iframeEl.dom.contentDocument) || this.getWin().document;
+    },
+
+    
+    getWin: function() {
+        return Ext.isIE ? this.iframeEl.dom.contentWindow : window.frames[this.iframeEl.dom.name];
+    },
+
+    
+    onRender: function() {
+        var me = this;
+
+        me.onLabelableRender();
+
+        me.addChildEls('toolbarWrap', 'iframeEl', 'textareaEl');
+
+        me.callParent(arguments);
+
+        me.textareaEl.dom.value = me.value || '';
+
+        
+        me.monitorTask = Ext.TaskManager.start({
+            run: me.checkDesignMode,
+            scope: me,
+            interval:100
+        });
+
+        me.createToolbar(me);
+        me.disableItems(true);
+    },
+
+    initRenderTpl: function() {
+        var me = this;
+        if (!me.hasOwnProperty('renderTpl')) {
+            me.renderTpl = me.getTpl('labelableRenderTpl');
+        }
+        return me.callParent();
+    },
+
+    initRenderData: function() {
+        return Ext.applyIf(this.callParent(), this.getLabelableRenderData());
+    },
+
+    getSubTplData: function() {
+        var cssPrefix = Ext.baseCSSPrefix;
+        return {
+            cmpId: this.id,
+            id: this.getInputId(),
+            toolbarWrapCls: cssPrefix + 'html-editor-tb',
+            textareaCls: cssPrefix + 'hidden',
+            iframeName: Ext.id(),
+            iframeSrc: Ext.SSL_SECURE_URL,
+            size: 'height:100px;'
+        };
+    },
+
+    getSubTplMarkup: function() {
+        var data = this.getSubTplData();
+        return this.getTpl('fieldSubTpl').apply(data);
+    },
+
+    getBodyNaturalWidth: function() {
+        return 565;
+    },
+
+    initFrameDoc: function() {
+        var me = this,
+            doc, task;
+
+        Ext.TaskManager.stop(me.monitorTask);
+
+        doc = me.getDoc();
+        me.win = me.getWin();
+
+        doc.open();
+        doc.write(me.getDocMarkup());
+        doc.close();
+
+        task = { 
+            run: function() {
+                var doc = me.getDoc();
+                if (doc.body || doc.readyState === 'complete') {
+                    Ext.TaskManager.stop(task);
+                    me.setDesignMode(true);
+                    Ext.defer(me.initEditor, 10, me);
+                }
+            },
+            interval : 10,
+            duration:10000,
+            scope: me
+        };
+        Ext.TaskManager.start(task);
+    },
+
+    checkDesignMode: function() {
+        var me = this,
+            doc = me.getDoc();
+        if (doc && (!doc.editorInitialized || me.getDesignMode() !== 'on')) {
+            me.initFrameDoc();
+        }
+    },
+
+    
+    setDesignMode: function(mode) {
+        var me = this,
+            doc = me.getDoc();
+        if (doc) {
+            if (me.readOnly) {
+                mode = false;
+            }
+            doc.designMode = (/on|true/i).test(String(mode).toLowerCase()) ?'on':'off';
+        }
+    },
+
+    
+    getDesignMode: function() {
+        var doc = this.getDoc();
+        return !doc ? '' : String(doc.designMode).toLowerCase();
+    },
+
+    disableItems: function(disabled) {
+        this.getToolbar().items.each(function(item){
+            if(item.getItemId() !== 'sourceedit'){
+                item.setDisabled(disabled);
+            }
+        });
+    },
+
+    
+    toggleSourceEdit: function(sourceEditMode) {
+        var me = this,
+            iframe = me.iframeEl,
+            textarea = me.textareaEl,
+            hiddenCls = Ext.baseCSSPrefix + 'hidden',
+            btn = me.getToolbar().getComponent('sourceedit');
+
+        if (!Ext.isBoolean(sourceEditMode)) {
+            sourceEditMode = !me.sourceEditMode;
+        }
+        me.sourceEditMode = sourceEditMode;
+
+        if (btn.pressed !== sourceEditMode) {
+            btn.toggle(sourceEditMode);
+        }
+        if (sourceEditMode) {
+            me.disableItems(true);
+            me.syncValue();
+            iframe.addCls(hiddenCls);
+            textarea.removeCls(hiddenCls);
+            textarea.dom.removeAttribute('tabIndex');
+            textarea.focus();
+        }
+        else {
+            if (me.initialized) {
+                me.disableItems(me.readOnly);
+            }
+            me.pushValue();
+            iframe.removeCls(hiddenCls);
+            textarea.addCls(hiddenCls);
+            textarea.dom.setAttribute('tabIndex', -1);
+            me.deferFocus();
+        }
+        me.fireEvent('editmodechange', me, sourceEditMode);
+        me.doComponentLayout();
+    },
+
+    
+    createLink : function() {
+        var url = prompt(this.createLinkText, this.defaultLinkValue);
+        if (url && url !== 'http:/'+'/') {
+            this.relayCmd('createlink', url);
+        }
+    },
+
+    clearInvalid: Ext.emptyFn,
+
+    
+    setValue: function(value) {
+        var me = this,
+            textarea = me.textareaEl;
+        me.mixins.field.setValue.call(me, value);
+        if (value === null || value === undefined) {
+            value = '';
+        }
+        if (textarea) {
+            textarea.dom.value = value;
+        }
+        me.pushValue();
+        return this;
+    },
+
+    
+    cleanHtml: function(html) {
+        html = String(html);
+        if (Ext.isWebKit) { 
+            html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, '');
+        }
+
+        
+        if (html.charCodeAt(0) === this.defaultValue.replace(/\D/g, '')) {
+            html = html.substring(1);
+        }
+        return html;
+    },
+
+    
+    syncValue : function(){
+        var me = this,
+            body, html, bodyStyle, match;
+        if (me.initialized) {
+            body = me.getEditorBody();
+            html = body.innerHTML;
+            if (Ext.isWebKit) {
+                bodyStyle = body.getAttribute('style'); 
+                match = bodyStyle.match(/text-align:(.*?);/i);
+                if (match && match[1]) {
+                    html = '<div style="' + match[0] + '">' + html + '</div>';
+                }
+            }
+            html = me.cleanHtml(html);
+            if (me.fireEvent('beforesync', me, html) !== false) {
+                me.textareaEl.dom.value = html;
+                me.fireEvent('sync', me, html);
+            }
+        }
+    },
+
+    
+    getValue : function() {
+        var me = this,
+            value;
+        if (!me.sourceEditMode) {
+            me.syncValue();
+        }
+        value = me.rendered ? me.textareaEl.dom.value : me.value;
+        me.value = value;
+        return value;
+    },
+
+    
+    pushValue: function() {
+        var me = this,
+            v;
+        if(me.initialized){
+            v = me.textareaEl.dom.value || '';
+            if (!me.activated && v.length < 1) {
+                v = me.defaultValue;
+            }
+            if (me.fireEvent('beforepush', me, v) !== false) {
+                me.getEditorBody().innerHTML = v;
+                if (Ext.isGecko) {
+                    
+                    me.setDesignMode(false);  
+                    me.setDesignMode(true);
+                }
+                me.fireEvent('push', me, v);
+            }
+        }
+    },
+
+    
+    deferFocus : function(){
+         this.focus(false, true);
+    },
+
+    getFocusEl: function() {
+        var me = this,
+            win = me.win;
+        return win && !me.sourceEditMode ? win : me.textareaEl;
+    },
+
+    
+    initEditor : function(){
+        
+        try {
+            var me = this,
+                dbody = me.getEditorBody(),
+                ss = me.textareaEl.getStyles('font-size', 'font-family', 'background-image', 'background-repeat', 'background-color', 'color'),
+                doc,
+                fn;
+
+            ss['background-attachment'] = 'fixed'; 
+            dbody.bgProperties = 'fixed'; 
+
+            Ext.DomHelper.applyStyles(dbody, ss);
+
+            doc = me.getDoc();
+
+            if (doc) {
+                try {
+                    Ext.EventManager.removeAll(doc);
+                } catch(e) {}
+            }
+
+            
+            fn = Ext.Function.bind(me.onEditorEvent, me);
+            Ext.EventManager.on(doc, {
+                mousedown: fn,
+                dblclick: fn,
+                click: fn,
+                keyup: fn,
+                buffer:100
+            });
+
+            
+            
+            
+            
+            
+            fn = me.onRelayedEvent;
+            Ext.EventManager.on(doc, {
+                mousedown: fn, 
+                mousemove: fn, 
+                mouseup: fn,   
+                click: fn,     
+                dblclick: fn,  
+                scope: me
+            });
+
+            if (Ext.isGecko) {
+                Ext.EventManager.on(doc, 'keypress', me.applyCommand, me);
+            }
+            if (me.fixKeys) {
+                Ext.EventManager.on(doc, 'keydown', me.fixKeys, me);
+            }
+
+            
+            Ext.EventManager.on(window, 'unload', me.beforeDestroy, me);
+            doc.editorInitialized = true;
+
+            me.initialized = true;
+            me.pushValue();
+            me.setReadOnly(me.readOnly);
+            me.fireEvent('initialize', me);
+        } catch(ex) {
+            
+        }
+    },
+
+    
+    beforeDestroy : function(){
+        var me = this,
+            monitorTask = me.monitorTask,
+            doc, prop;
+
+        if (monitorTask) {
+            Ext.TaskManager.stop(monitorTask);
+        }
+        if (me.rendered) {
+            try {
+                doc = me.getDoc();
+                if (doc) {
+                    Ext.EventManager.removeAll(doc);
+                    for (prop in doc) {
+                        if (doc.hasOwnProperty(prop)) {
+                            delete doc[prop];
+                        }
+                    }
+                }
+            } catch(e) {
+                
+            }
+            Ext.destroyMembers(me, 'tb', 'toolbarWrap', 'iframeEl', 'textareaEl');
+        }
+        me.callParent();
+    },
+
+    
+    onRelayedEvent: function (event) {
+        
+
+        var iframeEl = this.iframeEl,
+            iframeXY = iframeEl.getXY(),
+            eventXY = event.getXY();
+
+        
+        
+        event.xy = [iframeXY[0] + eventXY[0], iframeXY[1] + eventXY[1]];
+
+        event.injectEvent(iframeEl); 
+
+        event.xy = eventXY; 
+    },
+
+    
+    onFirstFocus : function(){
+        var me = this,
+            selection, range;
+        me.activated = true;
+        me.disableItems(me.readOnly);
+        if (Ext.isGecko) { 
+            me.win.focus();
+            selection = me.win.getSelection();
+            if (!selection.focusNode || selection.focusNode.nodeType !== 3) {
+                range = selection.getRangeAt(0);
+                range.selectNodeContents(me.getEditorBody());
+                range.collapse(true);
+                me.deferFocus();
+            }
+            try {
+                me.execCmd('useCSS', true);
+                me.execCmd('styleWithCSS', false);
+            } catch(e) {
+                
+            }
+        }
+        me.fireEvent('activate', me);
+    },
+
+    
+    adjustFont: function(btn) {
+        var adjust = btn.getItemId() === 'increasefontsize' ? 1 : -1,
+            size = this.getDoc().queryCommandValue('FontSize') || '2',
+            isPxSize = Ext.isString(size) && size.indexOf('px') !== -1,
+            isSafari;
+        size = parseInt(size, 10);
+        if (isPxSize) {
+            
+            
+            if (size <= 10) {
+                size = 1 + adjust;
+            }
+            else if (size <= 13) {
+                size = 2 + adjust;
+            }
+            else if (size <= 16) {
+                size = 3 + adjust;
+            }
+            else if (size <= 18) {
+                size = 4 + adjust;
+            }
+            else if (size <= 24) {
+                size = 5 + adjust;
+            }
+            else {
+                size = 6 + adjust;
+            }
+            size = Ext.Number.constrain(size, 1, 6);
+        } else {
+            isSafari = Ext.isSafari;
+            if (isSafari) { 
+                adjust *= 2;
+            }
+            size = Math.max(1, size + adjust) + (isSafari ? 'px' : 0);
+        }
+        this.execCmd('FontSize', size);
+    },
+
+    
+    onEditorEvent: function(e) {
+        this.updateToolbar();
+    },
+
+    
+    updateToolbar: function() {
+        var me = this,
+            btns, doc, name, fontSelect;
+
+        if (me.readOnly) {
+            return;
+        }
+
+        if (!me.activated) {
+            me.onFirstFocus();
+            return;
+        }
+
+        btns = me.getToolbar().items.map;
+        doc = me.getDoc();
+
+        if (me.enableFont && !Ext.isSafari2) {
+            name = (doc.queryCommandValue('FontName') || me.defaultFont).toLowerCase();
+            fontSelect = me.fontSelect.dom;
+            if (name !== fontSelect.value) {
+                fontSelect.value = name;
+            }
+        }
+
+        function updateButtons() {
+            Ext.Array.forEach(Ext.Array.toArray(arguments), function(name) {
+                btns[name].toggle(doc.queryCommandState(name));
+            });
+        }
+        if(me.enableFormat){
+            updateButtons('bold', 'italic', 'underline');
+        }
+        if(me.enableAlignments){
+            updateButtons('justifyleft', 'justifycenter', 'justifyright');
+        }
+        if(!Ext.isSafari2 && me.enableLists){
+            updateButtons('insertorderedlist', 'insertunorderedlist');
+        }
+
+        Ext.menu.Manager.hideAll();
+
+        me.syncValue();
+    },
+
+    
+    relayBtnCmd: function(btn) {
+        this.relayCmd(btn.getItemId());
+    },
+
+    
+    relayCmd: function(cmd, value) {
+        Ext.defer(function() {
+            var me = this;
+            me.focus();
+            me.execCmd(cmd, value);
+            me.updateToolbar();
+        }, 10, this);
+    },
+
+    
+    execCmd : function(cmd, value){
+        var me = this,
+            doc = me.getDoc(),
+            undef;
+        doc.execCommand(cmd, false, value === undef ? null : value);
+        me.syncValue();
+    },
+
+    
+    applyCommand : function(e){
+        if (e.ctrlKey) {
+            var me = this,
+                c = e.getCharCode(), cmd;
+            if (c > 0) {
+                c = String.fromCharCode(c);
+                switch (c) {
+                    case 'b':
+                        cmd = 'bold';
+                    break;
+                    case 'i':
+                        cmd = 'italic';
+                    break;
+                    case 'u':
+                        cmd = 'underline';
+                    break;
+                }
+                if (cmd) {
+                    me.win.focus();
+                    me.execCmd(cmd);
+                    me.deferFocus();
+                    e.preventDefault();
+                }
+            }
+        }
+    },
+
+    
+    insertAtCursor : function(text){
+        var me = this,
+            range;
+
+        if (me.activated) {
+            me.win.focus();
+            if (Ext.isIE) {
+                range = me.getDoc().selection.createRange();
+                if (range) {
+                    range.pasteHTML(text);
+                    me.syncValue();
+                    me.deferFocus();
+                }
+            }else{
+                me.execCmd('InsertHTML', text);
+                me.deferFocus();
+            }
+        }
+    },
+
+    
+    fixKeys: function() { 
+        if (Ext.isIE) {
+            return function(e){
+                var me = this,
+                    k = e.getKey(),
+                    doc = me.getDoc(),
+                    range, target;
+                if (k === e.TAB) {
+                    e.stopEvent();
+                    range = doc.selection.createRange();
+                    if(range){
+                        range.collapse(true);
+                        range.pasteHTML('    ');
+                        me.deferFocus();
+                    }
+                }
+                else if (k === e.ENTER) {
+                    range = doc.selection.createRange();
+                    if (range) {
+                        target = range.parentElement();
+                        if(!target || target.tagName.toLowerCase() !== 'li'){
+                            e.stopEvent();
+                            range.pasteHTML('<br />');
+                            range.collapse(false);
+                            range.select();
+                        }
+                    }
+                }
+            };
+        }
+
+        if (Ext.isOpera) {
+            return function(e){
+                var me = this;
+                if (e.getKey() === e.TAB) {
+                    e.stopEvent();
+                    me.win.focus();
+                    me.execCmd('InsertHTML','    ');
+                    me.deferFocus();
+                }
+            };
+        }
+
+        if (Ext.isWebKit) {
+            return function(e){
+                var me = this,
+                    k = e.getKey();
+                if (k === e.TAB) {
+                    e.stopEvent();
+                    me.execCmd('InsertText','\t');
+                    me.deferFocus();
+                }
+                else if (k === e.ENTER) {
+                    e.stopEvent();
+                    me.execCmd('InsertHtml','<br /><br />');
+                    me.deferFocus();
+                }
+            };
+        }
+
+        return null; 
+    }(),
+
+    
+    getToolbar : function(){
+        return this.toolbar;
+    },
+
+    
+    buttonTips : {
+        bold : {
+            title: 'Bold (Ctrl+B)',
+            text: 'Make the selected text bold.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        italic : {
+            title: 'Italic (Ctrl+I)',
+            text: 'Make the selected text italic.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        underline : {
+            title: 'Underline (Ctrl+U)',
+            text: 'Underline the selected text.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        increasefontsize : {
+            title: 'Grow Text',
+            text: 'Increase the font size.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        decreasefontsize : {
+            title: 'Shrink Text',
+            text: 'Decrease the font size.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        backcolor : {
+            title: 'Text Highlight Color',
+            text: 'Change the background color of the selected text.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        forecolor : {
+            title: 'Font Color',
+            text: 'Change the color of the selected text.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        justifyleft : {
+            title: 'Align Text Left',
+            text: 'Align text to the left.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        justifycenter : {
+            title: 'Center Text',
+            text: 'Center text in the editor.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        justifyright : {
+            title: 'Align Text Right',
+            text: 'Align text to the right.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        insertunorderedlist : {
+            title: 'Bullet List',
+            text: 'Start a bulleted list.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        insertorderedlist : {
+            title: 'Numbered List',
+            text: 'Start a numbered list.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        createlink : {
+            title: 'Hyperlink',
+            text: 'Make the selected text a hyperlink.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        },
+        sourceedit : {
+            title: 'Source Edit',
+            text: 'Switch to source editing mode.',
+            cls: Ext.baseCSSPrefix + 'html-editor-tip'
+        }
+    }
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+});
+
+
+Ext.define('Ext.form.field.Radio', {
+    extend:'Ext.form.field.Checkbox',
+    alias: ['widget.radiofield', 'widget.radio'],
+    alternateClassName: 'Ext.form.Radio',
+    requires: ['Ext.form.RadioManager'],
+
+    isRadio: true,
+
+    
+
+    
+    inputType: 'radio',
+    ariaRole: 'radio',
+
+    
+    getGroupValue: function() {
+        var selected = this.getManager().getChecked(this.name);
+        return selected ? selected.inputValue : null;
+    },
+
+    
+    onBoxClick: function(e) {
+        var me = this;
+        if (!me.disabled && !me.readOnly) {
+            this.setValue(true);
+        }
+    },
+
+    
+    setValue: function(v) {
+        var me = this,
+            active;
+
+        if (Ext.isBoolean(v)) {
+            me.callParent(arguments);
+        } else {
+            active = me.getManager().getWithValue(me.name, v).getAt(0);
+            if (active) {
+                active.setValue(true);
+            }
+        }
+        return me;
+    },
+
+    
+    getSubmitValue: function() {
+        return this.checked ? this.inputValue : null;
+    },
+
+    getModelData: function() {
+        return this.getSubmitData();
+    },
+
+    
+    onChange: function(newVal, oldVal) {
+        var me = this;
+        me.callParent(arguments);
+
+        if (newVal) {
+            this.getManager().getByName(me.name).each(function(item){
+                if (item !== me) {
+                    item.setValue(false);
+                }
+            }, me);
+        }
+    },
+
+    
+    getManager: function() {
+        return Ext.form.RadioManager;
+    }
+});
+
+
+Ext.define('Ext.picker.Time', {
+    extend: 'Ext.view.BoundList',
+    alias: 'widget.timepicker',
+    requires: ['Ext.data.Store', 'Ext.Date'],
+
+    
+
+    
+
+    
+    increment: 15,
+
+    
+    format : "g:i A",
+
+    
+    displayField: 'disp',
+
+    
+    initDate: [2008,0,1],
+
+    componentCls: Ext.baseCSSPrefix + 'timepicker',
+
+    
+    loadMask: false,
+
+    initComponent: function() {
+        var me = this,
+            dateUtil = Ext.Date,
+            clearTime = dateUtil.clearTime,
+            initDate = me.initDate;
+
+        
+        me.absMin = clearTime(new Date(initDate[0], initDate[1], initDate[2]));
+        me.absMax = dateUtil.add(clearTime(new Date(initDate[0], initDate[1], initDate[2])), 'mi', (24 * 60) - 1);
+
+        me.store = me.createStore();
+        me.updateList();
+
+        me.callParent();
+    },
+
+    
+    setMinValue: function(value) {
+        this.minValue = value;
+        this.updateList();
+    },
+
+    
+    setMaxValue: function(value) {
+        this.maxValue = value;
+        this.updateList();
+    },
+
+    
+    normalizeDate: function(date) {
+        var initDate = this.initDate;
+        date.setFullYear(initDate[0], initDate[1], initDate[2]);
+        return date;
+    },
+
+    
+    updateList: function() {
+        var me = this,
+            min = me.normalizeDate(me.minValue || me.absMin),
+            max = me.normalizeDate(me.maxValue || me.absMax);
+
+        me.store.filterBy(function(record) {
+            var date = record.get('date');
+            return date >= min && date <= max;
+        });
+    },
+
+    
+    createStore: function() {
+        var me = this,
+            utilDate = Ext.Date,
+            times = [],
+            min = me.absMin,
+            max = me.absMax;
+
+        while(min <= max){
+            times.push({
+                disp: utilDate.dateFormat(min, me.format),
+                date: min
+            });
+            min = utilDate.add(min, 'mi', me.increment);
+        }
+
+        return Ext.create('Ext.data.Store', {
+            fields: ['disp', 'date'],
+            data: times
+        });
+    }
+
+});
+
+
+Ext.define('Ext.form.field.Time', {
+    extend:'Ext.form.field.Picker',
+    alias: 'widget.timefield',
+    requires: ['Ext.form.field.Date', 'Ext.picker.Time', 'Ext.view.BoundListKeyNav', 'Ext.Date'],
+    alternateClassName: ['Ext.form.TimeField', 'Ext.form.Time'],
+
+    
+    triggerCls: Ext.baseCSSPrefix + 'form-time-trigger',
+
+    
+
+    
+
+    
+    minText : "The time in this field must be equal to or after {0}",
+
+    
+    maxText : "The time in this field must be equal to or before {0}",
+
+    
+    invalidText : "{0} is not a valid time",
+
+    
+    format : "g:i A",
+
+    
+
+    
+    altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",
+
+    
+    increment: 15,
+
+    
+    pickerMaxHeight: 300,
+
+    
+    selectOnTab: true,
+
+    
+    initDate: '1/1/2008',
+    initDateFormat: 'j/n/Y',
+
+
+    initComponent: function() {
+        var me = this,
+            min = me.minValue,
+            max = me.maxValue;
+        if (min) {
+            me.setMinValue(min);
+        }
+        if (max) {
+            me.setMaxValue(max);
+        }
+        this.callParent();
+    },
+
+    initValue: function() {
+        var me = this,
+            value = me.value;
+
+        
+        if (Ext.isString(value)) {
+            me.value = me.rawToValue(value);
+        }
+
+        me.callParent();
+    },
+
+    
+    setMinValue: function(value) {
+        var me = this,
+            picker = me.picker;
+        me.setLimit(value, true);
+        if (picker) {
+            picker.setMinValue(me.minValue);
+        }
+    },
+
+    
+    setMaxValue: function(value) {
+        var me = this,
+            picker = me.picker;
+        me.setLimit(value, false);
+        if (picker) {
+            picker.setMaxValue(me.maxValue);
+        }
+    },
+
+    
+    setLimit: function(value, isMin) {
+        var me = this,
+            d, val;
+        if (Ext.isString(value)) {
+            d = me.parseDate(value);
+        }
+        else if (Ext.isDate(value)) {
+            d = value;
+        }
+        if (d) {
+            val = Ext.Date.clearTime(new Date(me.initDate));
+            val.setHours(d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds());
+            me[isMin ? 'minValue' : 'maxValue'] = val;
+        }
+    },
+
+    rawToValue: function(rawValue) {
+        return this.parseDate(rawValue) || rawValue || null;
+    },
+
+    valueToRaw: function(value) {
+        return this.formatDate(this.parseDate(value));
+    },
+
+    
+    getErrors: function(value) {
+        var me = this,
+            format = Ext.String.format,
+            errors = me.callParent(arguments),
+            minValue = me.minValue,
+            maxValue = me.maxValue,
+            date;
+
+        value = me.formatDate(value || me.processRawValue(me.getRawValue()));
+
+        if (value === null || value.length < 1) { 
+             return errors;
+        }
+
+        date = me.parseDate(value);
+        if (!date) {
+            errors.push(format(me.invalidText, value, me.format));
+            return errors;
+        }
+
+        if (minValue && date < minValue) {
+            errors.push(format(me.minText, me.formatDate(minValue)));
+        }
+
+        if (maxValue && date > maxValue) {
+            errors.push(format(me.maxText, me.formatDate(maxValue)));
+        }
+
+        return errors;
+    },
+
+    formatDate: function() {
+        return Ext.form.field.Date.prototype.formatDate.apply(this, arguments);
+    },
+
+    
+    parseDate: function(value) {
+        if (!value || Ext.isDate(value)) {
+            return value;
+        }
+
+        var me = this,
+            val = me.safeParse(value, me.format),
+            altFormats = me.altFormats,
+            altFormatsArray = me.altFormatsArray,
+            i = 0,
+            len;
+
+        if (!val && altFormats) {
+            altFormatsArray = altFormatsArray || altFormats.split('|');
+            len = altFormatsArray.length;
+            for (; i < len && !val; ++i) {
+                val = me.safeParse(value, altFormatsArray[i]);
+            }
+        }
+        return val;
+    },
+
+    safeParse: function(value, format){
+        var me = this,
+            utilDate = Ext.Date,
+            parsedDate,
+            result = null;
+
+        if (utilDate.formatContainsDateInfo(format)) {
+            
+            result = utilDate.parse(value, format);
+        } else {
+            
+            parsedDate = utilDate.parse(me.initDate + ' ' + value, me.initDateFormat + ' ' + format);
+            if (parsedDate) {
+                result = parsedDate;
+            }
+        }
+        return result;
+    },
+
+    
+    getSubmitValue: function() {
+        var me = this,
+            format = me.submitFormat || me.format,
+            value = me.getValue();
+
+        return value ? Ext.Date.format(value, format) : null;
+    },
+
+    
+    createPicker: function() {
+        var me = this,
+            picker = Ext.create('Ext.picker.Time', {
+                pickerField: me,
+                selModel: {
+                    mode: 'SINGLE'
+                },
+                floating: true,
+                hidden: true,
+                minValue: me.minValue,
+                maxValue: me.maxValue,
+                increment: me.increment,
+                format: me.format,
+                ownerCt: this.ownerCt,
+                renderTo: document.body,
+                maxHeight: me.pickerMaxHeight,
+                focusOnToFront: false
+            });
+
+        me.mon(picker.getSelectionModel(), {
+            selectionchange: me.onListSelect,
+            scope: me
+        });
+
+        return picker;
+    },
+
+    
+    onExpand: function() {
+        var me = this,
+            keyNav = me.pickerKeyNav,
+            selectOnTab = me.selectOnTab,
+            picker = me.getPicker(),
+            lastSelected = picker.getSelectionModel().lastSelected,
+            itemNode;
+
+        if (!keyNav) {
+            keyNav = me.pickerKeyNav = Ext.create('Ext.view.BoundListKeyNav', this.inputEl, {
+                boundList: picker,
+                forceKeyDown: true,
+                tab: function(e) {
+                    if (selectOnTab) {
+                        if(me.picker.highlightedItem) {
+                            this.selectHighlighted(e);
+                        } else {
+                            me.collapse();
+                        }
+                        me.triggerBlur();
+                    }
+                    
+                    return true;
+                }
+            });
+            
+            if (selectOnTab) {
+                me.ignoreMonitorTab = true;
+            }
+        }
+        Ext.defer(keyNav.enable, 1, keyNav); 
+
+        
+        if (lastSelected) {
+            itemNode = picker.getNode(lastSelected);
+            if (itemNode) {
+                picker.highlightItem(itemNode);
+                picker.el.scrollChildIntoView(itemNode, false);
+            }
+        }
+    },
+
+    
+    onCollapse: function() {
+        var me = this,
+            keyNav = me.pickerKeyNav;
+        if (keyNav) {
+            keyNav.disable();
+            me.ignoreMonitorTab = false;
+        }
+    },
+
+    
+    onChange: function() {
+        var me = this,
+            picker = me.picker;
+
+        me.callParent(arguments);
+        if(picker) {
+            picker.clearHighlight();
+        }
+    },
+
+    
+    onListSelect: function(list, recordArray) {
+        var me = this,
+            record = recordArray[0],
+            val = record ? record.get('date') : null;
+        me.setValue(val);
+        me.fireEvent('select', me, val);
+        me.picker.clearHighlight();
+        me.collapse();
+        me.inputEl.focus();
+    }
+});
+
+
+
+Ext.define('Ext.grid.CellEditor', {
+    extend: 'Ext.Editor',
+    constructor: function(config) {
+        config = Ext.apply({}, config);
+        
+        if (config.field) {
+            config.field.monitorTab = false;
+        }
+        if (!Ext.isDefined(config.autoSize)) {
+            config.autoSize = {
+                width: 'boundEl'
+            };
+        }
+        this.callParent([config]);
+    },
+    
+    
+    onShow: function() {
+        var first = this.boundEl.first();
+        if (first) {
+            first.hide();
+        }
+        this.callParent(arguments);
+    },
+    
+    
+    onHide: function() {
+        var first = this.boundEl.first();
+        if (first) {
+            first.show();
+        }
+        this.callParent(arguments);
+    },
+    
+    
+    afterRender: function() {
+        this.callParent(arguments);
+        var field = this.field;
+        if (field.isXType('checkboxfield')) {
+            field.mon(field.inputEl, 'mousedown', this.onCheckBoxMouseDown, this);
+            field.mon(field.inputEl, 'click', this.onCheckBoxClick, this);
+        }
+    },
+    
+    
+    onCheckBoxMouseDown: function() {
+        this.completeEdit = Ext.emptyFn;
+    },
+    
+    
+    onCheckBoxClick: function() {
+        delete this.completeEdit;
+        this.field.focus(false, 10);
+    },
+    
+    alignment: "tl-tl",
+    hideEl : false,
+    cls: Ext.baseCSSPrefix + "small-editor " + Ext.baseCSSPrefix + "grid-editor",
+    shim: false,
+    shadow: false
+});
+
+Ext.define('Ext.grid.ColumnLayout', {
+    extend: 'Ext.layout.container.HBox',
+    alias: 'layout.gridcolumn',
+    type : 'column',
+
+    reserveOffset: false,
+
+    shrinkToFit: false,
+
+    
+    clearInnerCtOnLayout: true,
+
+    beforeLayout: function() {
+        var me = this,
+            i = 0,
+            items = me.getLayoutItems(),
+            len = items.length,
+            item, returnValue,
+            s;
+
+        
+        if (!Ext.isDefined(me.availableSpaceOffset)) {
+            s = me.owner.up('tablepanel').verticalScroller;
+            me.availableSpaceOffset = s ? s.width-1 : 0;
+        }
+
+        returnValue = me.callParent(arguments);
+
+        
+        me.innerCt.setHeight(23);
+
+        
+        for (; i < len; i++) {
+            item = items[i];
+            item.el.setStyle({
+                height: 'auto'
+            });
+            item.titleContainer.setStyle({
+                height: 'auto',
+                paddingTop: '0'
+            });
+            if (item.componentLayout && item.componentLayout.lastComponentSize) {
+                item.componentLayout.lastComponentSize.height = item.el.dom.offsetHeight;
+            }
+        }
+        return returnValue;
+    },
+
+    
+    calculateChildBoxes: function(visibleItems, targetSize) {
+        var me = this,
+            calculations = me.callParent(arguments),
+            boxes = calculations.boxes,
+            metaData = calculations.meta,
+            len = boxes.length, i = 0, box, item;
+
+        if (targetSize.width && !me.isHeader) {
+            
+            if (me.owner.forceFit) {
+
+                for (; i < len; i++) {
+                    box = boxes[i];
+                    item = box.component;
+
+                    
+                    item.minWidth = Ext.grid.plugin.HeaderResizer.prototype.minColWidth;
+
+                    
+                    
+                    item.flex = box.width;
+                }
+
+                
+                calculations = me.callParent(arguments);
+            }
+            else if (metaData.tooNarrow) {
+                targetSize.width = metaData.desiredSize;
+            }
+        }
+
+        return calculations;
+    },
+
+    afterLayout: function() {
+        var me = this,
+            owner = me.owner,
+            topGrid,
+            bothHeaderCts,
+            otherHeaderCt,
+            thisHeight,
+            otherHeight,
+            modifiedGrid,
+            i = 0,
+            items,
+            len,
+            headerHeight;
+
+        me.callParent(arguments);
+
+        
+        if (!me.owner.hideHeaders) {
+
+            
+            
+            if (owner.lockableInjected) {
+                topGrid = owner.up('tablepanel').up('tablepanel');
+                bothHeaderCts = topGrid.query('headercontainer:not([isHeader])');
+                otherHeaderCt = (bothHeaderCts[0] === owner) ? bothHeaderCts[1] : bothHeaderCts[0];
+
+                
+                if (!otherHeaderCt.rendered) {
+                    return;
+                }
+
+                
+                otherHeight = otherHeaderCt.layout.getRenderTarget().getViewSize().height;
+                if (!otherHeight) {
+                    return;
+                }
+                thisHeight = this.getRenderTarget().getViewSize().height;
+                if (!thisHeight) {
+                    return;
+                }
+
+                
+                
+                topGrid.componentLayout.layoutBusy = true;
+
+                
+                headerHeight = thisHeight;
+
+                
+                if (thisHeight > otherHeight) {
+                    otherHeaderCt.layout.align = 'stretch';
+                    otherHeaderCt.setCalculatedSize(otherHeaderCt.getWidth(), owner.getHeight(), otherHeaderCt.ownerCt);
+                    delete otherHeaderCt.layout.align;
+                    modifiedGrid = otherHeaderCt.up('tablepanel');
+                } else if (otherHeight > thisHeight) {
+                    headerHeight = otherHeight;
+                    this.align = 'stretch';
+                    owner.setCalculatedSize(owner.getWidth(), otherHeaderCt.getHeight(), owner.ownerCt);
+                    delete this.align;
+                    modifiedGrid = owner.up('tablepanel');
+                }
+                topGrid.componentLayout.layoutBusy = false;
+
+                
+                items = bothHeaderCts[0].layout.getLayoutItems().concat(bothHeaderCts[1].layout.getLayoutItems());
+            } else {
+                headerHeight = this.getRenderTarget().getViewSize().height;
+                items = me.getLayoutItems();
+            }
+
+            len = items.length;
+            for (; i < len; i++) {
+                items[i].setPadding(headerHeight);
+            }
+
+            
+            if (modifiedGrid) {
+                setTimeout(function() {
+                    modifiedGrid.doLayout();
+                }, 1);
+            }
+        }
+    },
+
+    
+    
+    updateInnerCtSize: function(tSize, calcs) {
+        var me = this,
+            extra;
+
+        
+        if (!me.isHeader) {
+            me.tooNarrow = calcs.meta.tooNarrow;
+            extra = (me.reserveOffset ? me.availableSpaceOffset : 0);
+
+            if (calcs.meta.tooNarrow) {
+                tSize.width = calcs.meta.desiredSize + extra;
+            } else {
+                tSize.width += extra;
+            }
+        }
+
+        return me.callParent(arguments);
+    },
+
+    doOwnerCtLayouts: function() {
+        var ownerCt = this.owner.ownerCt;
+        if (!ownerCt.componentLayout.layoutBusy) {
+            ownerCt.doComponentLayout();
+        }
+    }
+});
+
+Ext.define('Ext.grid.LockingView', {
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    eventRelayRe: /^(beforeitem|beforecontainer|item|container|cell)/,
+
+    constructor: function(config){
+        var me = this,
+            eventNames = [],
+            eventRe = me.eventRelayRe,
+            locked = config.locked.getView(),
+            normal = config.normal.getView(),
+            events,
+            event;
+
+        Ext.apply(me, {
+            lockedView: locked,
+            normalView: normal,
+            lockedGrid: config.locked,
+            normalGrid: config.normal,
+            panel: config.panel
+        });
+        me.mixins.observable.constructor.call(me, config);
+
+        
+        events = locked.events;
+        for (event in events) {
+            if (events.hasOwnProperty(event) && eventRe.test(event)) {
+                eventNames.push(event);
+            }
+        }
+        me.relayEvents(locked, eventNames);
+        me.relayEvents(normal, eventNames);
+
+        normal.on({
+            scope: me,
+            itemmouseleave: me.onItemMouseLeave,
+            itemmouseenter: me.onItemMouseEnter
+        });
+
+        locked.on({
+            scope: me,
+            itemmouseleave: me.onItemMouseLeave,
+            itemmouseenter: me.onItemMouseEnter
+        });
+    },
+
+    getGridColumns: function() {
+        var cols = this.lockedGrid.headerCt.getGridColumns();
+        return cols.concat(this.normalGrid.headerCt.getGridColumns());
+    },
+
+    getEl: function(column){
+        return this.getViewForColumn(column).getEl();
+    },
+
+    getViewForColumn: function(column) {
+        var view = this.lockedView,
+            inLocked;
+
+        view.headerCt.cascade(function(col){
+            if (col === column) {
+                inLocked = true;
+                return false;
+            }
+        });
+
+        return inLocked ? view : this.normalView;
+    },
+
+    onItemMouseEnter: function(view, record){
+        var me = this,
+            locked = me.lockedView,
+            other = me.normalView,
+            item;
+
+        if (view.trackOver) {
+            if (view !== locked) {
+                other = locked;
+            }
+            item = other.getNode(record);
+            other.highlightItem(item);
+        }
+    },
+
+    onItemMouseLeave: function(view, record){
+        var me = this,
+            locked = me.lockedView,
+            other = me.normalView;
+
+        if (view.trackOver) {
+            if (view !== locked) {
+                other = locked;
+            }
+            other.clearHighlight();
+        }
+    },
+
+    relayFn: function(name, args){
+        args = args || [];
+
+        var view = this.lockedView;
+        view[name].apply(view, args || []);
+        view = this.normalView;
+        view[name].apply(view, args || []);
+    },
+
+    getSelectionModel: function(){
+        return this.panel.getSelectionModel();
+    },
+
+    getStore: function(){
+        return this.panel.store;
+    },
+
+    getNode: function(nodeInfo){
+        
+        return this.normalView.getNode(nodeInfo);
+    },
+
+    getCell: function(record, column){
+        var view = this.getViewForColumn(column),
+            row;
+
+        row = view.getNode(record);
+        return Ext.fly(row).down(column.getCellSelector());
+    },
+
+    getRecord: function(node){
+        var result = this.lockedView.getRecord(node);
+        if (!node) {
+            result = this.normalView.getRecord(node);
+        }
+        return result;
+    },
+
+    addElListener: function(eventName, fn, scope){
+        this.relayFn('addElListener', arguments);
+    },
+
+    refreshNode: function(){
+        this.relayFn('refreshNode', arguments);
+    },
+
+    refresh: function(){
+        this.relayFn('refresh', arguments);
+    },
+
+    bindStore: function(){
+        this.relayFn('bindStore', arguments);
+    },
+
+    addRowCls: function(){
+        this.relayFn('addRowCls', arguments);
+    },
+
+    removeRowCls: function(){
+        this.relayFn('removeRowCls', arguments);
+    }
+
+});
+
+Ext.define('Ext.grid.Lockable', {
+
+    requires: ['Ext.grid.LockingView'],
+
+    
+    syncRowHeight: true,
+
+    
+
+    
+
+    
+
+    
+    spacerHidden: true,
+
+    headerCounter: 0,
+
+    
+    unlockText: 'Unlock',
+    lockText: 'Lock',
+
+    determineXTypeToCreate: function() {
+        var me = this,
+            typeToCreate;
+
+        if (me.subGridXType) {
+            typeToCreate = me.subGridXType;
+        } else {
+            var xtypes     = this.getXTypes().split('/'),
+                xtypesLn   = xtypes.length,
+                xtype      = xtypes[xtypesLn - 1],
+                superxtype = xtypes[xtypesLn - 2];
+
+            if (superxtype !== 'tablepanel') {
+                typeToCreate = superxtype;
+            } else {
+                typeToCreate = xtype;
+            }
+        }
+
+        return typeToCreate;
+    },
+
+    
+    
+    injectLockable: function() {
+        
+        this.lockable = true;
+        
+        
+        this.hasView = true;
+
+        var me = this,
+            
+            
+            
+            xtype = me.determineXTypeToCreate(),
+            
+            selModel = me.getSelectionModel(),
+            lockedGrid = {
+                xtype: xtype,
+                
+                enableAnimations: false,
+                scroll: false,
+                scrollerOwner: false,
+                selModel: selModel,
+                border: false,
+                cls: Ext.baseCSSPrefix + 'grid-inner-locked'
+            },
+            normalGrid = {
+                xtype: xtype,
+                enableAnimations: false,
+                scrollerOwner: false,
+                selModel: selModel,
+                border: false
+            },
+            i = 0,
+            columns,
+            lockedHeaderCt,
+            normalHeaderCt;
+
+        me.addCls(Ext.baseCSSPrefix + 'grid-locked');
+
+        
+        
+        
+        Ext.copyTo(normalGrid, me, me.normalCfgCopy);
+        Ext.copyTo(lockedGrid, me, me.lockedCfgCopy);
+        for (; i < me.normalCfgCopy.length; i++) {
+            delete me[me.normalCfgCopy[i]];
+        }
+        for (i = 0; i < me.lockedCfgCopy.length; i++) {
+            delete me[me.lockedCfgCopy[i]];
+        }
+
+        me.addEvents(
+            
+            'lockcolumn',
+
+            
+            'unlockcolumn'
+        );
+
+        me.addStateEvents(['lockcolumn', 'unlockcolumn']);
+
+        me.lockedHeights = [];
+        me.normalHeights = [];
+
+        columns = me.processColumns(me.columns);
+
+        lockedGrid.width = columns.lockedWidth + Ext.num(selModel.headerWidth, 0);
+        lockedGrid.columns = columns.locked;
+        normalGrid.columns = columns.normal;
+
+        me.store = Ext.StoreManager.lookup(me.store);
+        lockedGrid.store = me.store;
+        normalGrid.store = me.store;
+
+        
+        normalGrid.flex = 1;
+        lockedGrid.viewConfig = me.lockedViewConfig || {};
+        lockedGrid.viewConfig.loadingUseMsg = false;
+        normalGrid.viewConfig = me.normalViewConfig || {};
+
+        Ext.applyIf(lockedGrid.viewConfig, me.viewConfig);
+        Ext.applyIf(normalGrid.viewConfig, me.viewConfig);
+
+        me.normalGrid = Ext.ComponentManager.create(normalGrid);
+        me.lockedGrid = Ext.ComponentManager.create(lockedGrid);
+
+        me.view = Ext.create('Ext.grid.LockingView', {
+            locked: me.lockedGrid,
+            normal: me.normalGrid,
+            panel: me
+        });
+
+        if (me.syncRowHeight) {
+            me.lockedGrid.getView().on({
+                refresh: me.onLockedGridAfterRefresh,
+                itemupdate: me.onLockedGridAfterUpdate,
+                scope: me
+            });
+
+            me.normalGrid.getView().on({
+                refresh: me.onNormalGridAfterRefresh,
+                itemupdate: me.onNormalGridAfterUpdate,
+                scope: me
+            });
+        }
+
+        lockedHeaderCt = me.lockedGrid.headerCt;
+        normalHeaderCt = me.normalGrid.headerCt;
+
+        lockedHeaderCt.lockedCt = true;
+        lockedHeaderCt.lockableInjected = true;
+        normalHeaderCt.lockableInjected = true;
+
+        lockedHeaderCt.on({
+            columnshow: me.onLockedHeaderShow,
+            columnhide: me.onLockedHeaderHide,
+            columnmove: me.onLockedHeaderMove,
+            sortchange: me.onLockedHeaderSortChange,
+            columnresize: me.onLockedHeaderResize,
+            scope: me
+        });
+
+        normalHeaderCt.on({
+            columnmove: me.onNormalHeaderMove,
+            sortchange: me.onNormalHeaderSortChange,
+            scope: me
+        });
+
+        me.normalGrid.on({
+            scrollershow: me.onScrollerShow,
+            scrollerhide: me.onScrollerHide,
+            scope: me
+        });
+
+        me.lockedGrid.on('afterlayout', me.onLockedGridAfterLayout, me, {single: true});
+
+        me.modifyHeaderCt();
+        me.items = [me.lockedGrid, me.normalGrid];
+
+        me.relayHeaderCtEvents(lockedHeaderCt);
+        me.relayHeaderCtEvents(normalHeaderCt);
+
+        me.layout = {
+            type: 'hbox',
+            align: 'stretch'
+        };
+    },
+
+    processColumns: function(columns){
+        
+        var i = 0,
+            len = columns.length,
+            lockedWidth = 1,
+            lockedHeaders = [],
+            normalHeaders = [],
+            column;
+
+        for (; i < len; ++i) {
+            column = columns[i];
+            
+            
+            column.processed = true;
+            if (column.locked) {
+                if (!column.hidden) {
+                    lockedWidth += column.width || Ext.grid.header.Container.prototype.defaultWidth;
+                }
+                lockedHeaders.push(column);
+            } else {
+                normalHeaders.push(column);
+            }
+            if (!column.headerId) {
+                column.headerId = (column.initialConfig || column).id || ('L' + (++this.headerCounter));
+            }
+        }
+        return {
+            lockedWidth: lockedWidth,
+            locked: lockedHeaders,
+            normal: normalHeaders
+        };
+    },
+
+    
+    onLockedGridAfterLayout: function() {
+        var me         = this,
+            lockedView = me.lockedGrid.getView();
+        lockedView.on({
+            beforerefresh: me.destroySpacer,
+            scope: me
+        });
+    },
+
+    
+    onLockedHeaderMove: function() {
+        if (this.syncRowHeight) {
+            this.onNormalGridAfterRefresh();
+        }
+    },
+
+    
+    onNormalHeaderMove: function() {
+        if (this.syncRowHeight) {
+            this.onLockedGridAfterRefresh();
+        }
+    },
+
+    
+    
+    getSpacerEl: function() {
+        var me   = this,
+            w,
+            view,
+            el;
+
+        if (!me.spacerEl) {
+            
+            
+            w    = Ext.getScrollBarWidth() + (Ext.isIE ? 2 : 0);
+            view = me.lockedGrid.getView();
+            el   = view.el;
+
+            me.spacerEl = Ext.DomHelper.append(el, {
+                cls: me.spacerHidden ? (Ext.baseCSSPrefix + 'hidden') : '',
+                style: 'height: ' + w + 'px;'
+            }, true);
+        }
+        return me.spacerEl;
+    },
+
+    destroySpacer: function() {
+        var me = this;
+        if (me.spacerEl) {
+            me.spacerEl.destroy();
+            delete me.spacerEl;
+        }
+    },
+
+    
+    onLockedGridAfterRefresh: function() {
+        var me     = this,
+            view   = me.lockedGrid.getView(),
+            el     = view.el,
+            rowEls = el.query(view.getItemSelector()),
+            ln     = rowEls.length,
+            i = 0;
+
+        
+        me.lockedHeights = [];
+
+        for (; i < ln; i++) {
+            me.lockedHeights[i] = rowEls[i].clientHeight;
+        }
+        me.syncRowHeights();
+    },
+
+    
+    onNormalGridAfterRefresh: function() {
+        var me     = this,
+            view   = me.normalGrid.getView(),
+            el     = view.el,
+            rowEls = el.query(view.getItemSelector()),
+            ln     = rowEls.length,
+            i = 0;
+
+        
+        me.normalHeights = [];
+
+        for (; i < ln; i++) {
+            me.normalHeights[i] = rowEls[i].clientHeight;
+        }
+        me.syncRowHeights();
+    },
+
+    
+    onLockedGridAfterUpdate: function(record, index, node) {
+        this.lockedHeights[index] = node.clientHeight;
+        this.syncRowHeights();
+    },
+
+    
+    onNormalGridAfterUpdate: function(record, index, node) {
+        this.normalHeights[index] = node.clientHeight;
+        this.syncRowHeights();
+    },
+
+    
+    
+    syncRowHeights: function() {
+        var me = this,
+            lockedHeights = me.lockedHeights,
+            normalHeights = me.normalHeights,
+            calcHeights   = [],
+            ln = lockedHeights.length,
+            i  = 0,
+            lockedView, normalView,
+            lockedRowEls, normalRowEls,
+            vertScroller = me.getVerticalScroller(),
+            scrollTop;
+
+        
+        
+        if (lockedHeights.length && normalHeights.length) {
+            lockedView = me.lockedGrid.getView();
+            normalView = me.normalGrid.getView();
+            lockedRowEls = lockedView.el.query(lockedView.getItemSelector());
+            normalRowEls = normalView.el.query(normalView.getItemSelector());
+
+            
+            for (; i < ln; i++) {
+                
+                if (!isNaN(lockedHeights[i]) && !isNaN(normalHeights[i])) {
+                    if (lockedHeights[i] > normalHeights[i]) {
+                        Ext.fly(normalRowEls[i]).setHeight(lockedHeights[i]);
+                    } else if (lockedHeights[i] < normalHeights[i]) {
+                        Ext.fly(lockedRowEls[i]).setHeight(normalHeights[i]);
+                    }
+                }
+            }
+
+            
+            me.normalGrid.invalidateScroller();
+
+            
+            
+            if (vertScroller && vertScroller.setViewScrollTop) {
+                vertScroller.setViewScrollTop(me.virtualScrollTop);
+            } else {
+                
+                
+                
+                scrollTop = normalView.el.dom.scrollTop;
+                normalView.el.dom.scrollTop = scrollTop;
+                lockedView.el.dom.scrollTop = scrollTop;
+            }
+
+            
+            me.lockedHeights = [];
+            me.normalHeights = [];
+        }
+    },
+
+    
+    onScrollerShow: function(scroller, direction) {
+        if (direction === 'horizontal') {
+            this.spacerHidden = false;
+            this.getSpacerEl().removeCls(Ext.baseCSSPrefix + 'hidden');
+        }
+    },
+
+    
+    onScrollerHide: function(scroller, direction) {
+        if (direction === 'horizontal') {
+            this.spacerHidden = true;
+            if (this.spacerEl) {
+                this.spacerEl.addCls(Ext.baseCSSPrefix + 'hidden');
+            }
+        }
+    },
+
+
+    
+    modifyHeaderCt: function() {
+        var me = this;
+        me.lockedGrid.headerCt.getMenuItems = me.getMenuItems(true);
+        me.normalGrid.headerCt.getMenuItems = me.getMenuItems(false);
+    },
+
+    onUnlockMenuClick: function() {
+        this.unlock();
+    },
+
+    onLockMenuClick: function() {
+        this.lock();
+    },
+
+    getMenuItems: function(locked) {
+        var me            = this,
+            unlockText    = me.unlockText,
+            lockText      = me.lockText,
+            unlockCls     = Ext.baseCSSPrefix + 'hmenu-unlock',
+            lockCls       = Ext.baseCSSPrefix + 'hmenu-lock',
+            unlockHandler = Ext.Function.bind(me.onUnlockMenuClick, me),
+            lockHandler   = Ext.Function.bind(me.onLockMenuClick, me);
+
+        
+        return function() {
+            var o = Ext.grid.header.Container.prototype.getMenuItems.call(this);
+            o.push('-',{
+                cls: unlockCls,
+                text: unlockText,
+                handler: unlockHandler,
+                disabled: !locked
+            });
+            o.push({
+                cls: lockCls,
+                text: lockText,
+                handler: lockHandler,
+                disabled: locked
+            });
+            return o;
+        };
+    },
+
+    
+    
+    lock: function(activeHd, toIdx) {
+        var me         = this,
+            normalGrid = me.normalGrid,
+            lockedGrid = me.lockedGrid,
+            normalHCt  = normalGrid.headerCt,
+            lockedHCt  = lockedGrid.headerCt;
+
+        activeHd = activeHd || normalHCt.getMenu().activeHeader;
+
+        
+        
+        if (activeHd.flex) {
+            activeHd.width = activeHd.getWidth();
+            delete activeHd.flex;
+        }
+
+        normalHCt.remove(activeHd, false);
+        lockedHCt.suspendLayout = true;
+        activeHd.locked = true;
+        if (Ext.isDefined(toIdx)) {
+            lockedHCt.insert(toIdx, activeHd);
+        } else {
+            lockedHCt.add(activeHd);
+        }
+        lockedHCt.suspendLayout = false;
+        me.syncLockedSection();
+
+        me.fireEvent('lockcolumn', me, activeHd);
+    },
+
+    syncLockedSection: function() {
+        var me = this;
+        me.syncLockedWidth();
+        me.lockedGrid.getView().refresh();
+        me.normalGrid.getView().refresh();
+    },
+
+    
+    
+    syncLockedWidth: function() {
+        var me = this,
+            width = me.lockedGrid.headerCt.getFullWidth(true);
+        me.lockedGrid.setWidth(width+1); 
+        me.doComponentLayout();
+    },
+
+    onLockedHeaderResize: function() {
+        this.syncLockedWidth();
+    },
+
+    onLockedHeaderHide: function() {
+        this.syncLockedWidth();
+    },
+
+    onLockedHeaderShow: function() {
+        this.syncLockedWidth();
+    },
+
+    onLockedHeaderSortChange: function(headerCt, header, sortState) {
+        if (sortState) {
+            
+            
+            this.normalGrid.headerCt.clearOtherSortStates(null, true);
+        }
+    },
+
+    onNormalHeaderSortChange: function(headerCt, header, sortState) {
+        if (sortState) {
+            
+            
+            this.lockedGrid.headerCt.clearOtherSortStates(null, true);
+        }
+    },
+
+    
+    
+    unlock: function(activeHd, toIdx) {
+        var me         = this,
+            normalGrid = me.normalGrid,
+            lockedGrid = me.lockedGrid,
+            normalHCt  = normalGrid.headerCt,
+            lockedHCt  = lockedGrid.headerCt;
+
+        if (!Ext.isDefined(toIdx)) {
+            toIdx = 0;
+        }
+        activeHd = activeHd || lockedHCt.getMenu().activeHeader;
+
+        lockedHCt.remove(activeHd, false);
+        me.syncLockedWidth();
+        me.lockedGrid.getView().refresh();
+        activeHd.locked = false;
+        normalHCt.insert(toIdx, activeHd);
+        me.normalGrid.getView().refresh();
+
+        me.fireEvent('unlockcolumn', me, activeHd);
+    },
+
+    applyColumnsState: function (columns) {
+        var me = this,
+            lockedGrid = me.lockedGrid,
+            lockedHeaderCt = lockedGrid.headerCt,
+            normalHeaderCt = me.normalGrid.headerCt,
+            lockedCols = lockedHeaderCt.items,
+            normalCols = normalHeaderCt.items,
+            existing,
+            locked = [],
+            normal = [],
+            lockedDefault,
+            lockedWidth = 1;
+
+        Ext.each(columns, function (col) {
+            function matches (item) {
+                return item.headerId == col.id;
+            }
+
+            lockedDefault = true;
+            if (!(existing = lockedCols.findBy(matches))) {
+                existing = normalCols.findBy(matches);
+                lockedDefault = false;
+            }
+
+            if (existing) {
+                if (existing.applyColumnState) {
+                    existing.applyColumnState(col);
+                }
+                if (!Ext.isDefined(existing.locked)) {
+                    existing.locked = lockedDefault;
+                }
+                if (existing.locked) {
+                    locked.push(existing);
+                    if (!existing.hidden && Ext.isNumber(existing.width)) {
+                        lockedWidth += existing.width;
+                    }
+                } else {
+                    normal.push(existing);
+                }
+            }
+        });
+
+        
+        if (locked.length + normal.length == lockedCols.getCount() + normalCols.getCount()) {
+            lockedHeaderCt.removeAll(false);
+            normalHeaderCt.removeAll(false);
+
+            lockedHeaderCt.add(locked);
+            normalHeaderCt.add(normal);
+
+            lockedGrid.setWidth(lockedWidth);
+        }
+    },
+
+    getColumnsState: function () {
+        var me = this,
+            locked = me.lockedGrid.headerCt.getColumnsState(),
+            normal = me.normalGrid.headerCt.getColumnsState();
+
+        return locked.concat(normal);
+    },
+
+    
+    reconfigureLockable: function(store, columns) {
+        var me = this,
+            lockedGrid = me.lockedGrid,
+            normalGrid = me.normalGrid;
+
+        if (columns) {
+            lockedGrid.headerCt.suspendLayout = true;
+            normalGrid.headerCt.suspendLayout = true;
+            lockedGrid.headerCt.removeAll();
+            normalGrid.headerCt.removeAll();
+
+            columns = me.processColumns(columns);
+            lockedGrid.setWidth(columns.lockedWidth);
+            lockedGrid.headerCt.add(columns.locked);
+            normalGrid.headerCt.add(columns.normal);
+        }
+
+        if (store) {
+            store = Ext.data.StoreManager.lookup(store);
+            me.store = store;
+            lockedGrid.bindStore(store);
+            normalGrid.bindStore(store);
+        } else {
+            lockedGrid.getView().refresh();
+            normalGrid.getView().refresh();
+        }
+
+        if (columns) {
+            lockedGrid.headerCt.suspendLayout = false;
+            normalGrid.headerCt.suspendLayout = false;
+            lockedGrid.headerCt.forceComponentLayout();
+            normalGrid.headerCt.forceComponentLayout();
+        }
+    }
+});
+
+
+Ext.define('Ext.grid.Scroller', {
+    extend: 'Ext.Component',
+    alias: 'widget.gridscroller',
+    weight: 110,
+    baseCls: Ext.baseCSSPrefix + 'scroller',
+    focusable: false,
+    reservedSpace: 0,
+
+    renderTpl: [
+        '<div class="' + Ext.baseCSSPrefix + 'scroller-ct" id="{baseId}_ct">',
+            '<div class="' + Ext.baseCSSPrefix + 'stretcher" id="{baseId}_stretch"></div>',
+        '</div>'
+    ],
+
+    initComponent: function() {
+        var me       = this,
+            dock     = me.dock,
+            cls      = Ext.baseCSSPrefix + 'scroller-vertical';
+
+        me.offsets = {bottom: 0};
+        me.scrollProp = 'scrollTop';
+        me.vertical = true;
+        me.sizeProp = 'width';
+
+        if (dock === 'top' || dock === 'bottom') {
+            cls = Ext.baseCSSPrefix + 'scroller-horizontal';
+            me.sizeProp = 'height';
+            me.scrollProp = 'scrollLeft';
+            me.vertical = false;
+            me.weight += 5;
+        }
+
+        me.cls += (' ' + cls);
+
+        Ext.applyIf(me.renderSelectors, {
+            stretchEl: '.' + Ext.baseCSSPrefix + 'stretcher',
+            scrollEl: '.' + Ext.baseCSSPrefix + 'scroller-ct'
+        });
+        me.callParent();
+    },
+    
+    ensureDimension: function(){
+        var me = this,
+            sizeProp = me.sizeProp;
+            
+        me[sizeProp] = me.scrollerSize = Ext.getScrollbarSize()[sizeProp];  
+    },
+
+    initRenderData: function () {
+        var me = this,
+            ret = me.callParent(arguments) || {};
+
+        ret.baseId = me.id;
+
+        return ret;
+    },
+
+    afterRender: function() {
+        var me = this;
+        me.callParent();
+        
+        me.mon(me.scrollEl, 'scroll', me.onElScroll, me);
+        Ext.cache[me.el.id].skipGarbageCollection = true;
+    },
+
+    onAdded: function(container) {
+        
+        this.ownerGrid = container;
+        this.callParent(arguments);
+    },
+
+    getSizeCalculation: function() {
+        var me     = this,
+            owner  = me.getPanel(),
+            width  = 1,
+            height = 1,
+            view, tbl;
+
+        if (!me.vertical) {
+            
+            
+            var items  = owner.query('tableview'),
+                center = items[1] || items[0];
+
+            if (!center) {
+                return false;
+            }
+            
+            
+            
+            width = center.headerCt.getFullWidth();
+
+            if (Ext.isIEQuirks) {
+                width--;
+            }
+        } else {
+            view = owner.down('tableview:not([lockableInjected])');
+            if (!view || !view.el) {
+                return false;
+            }
+            tbl = view.el.child('table', true);
+            if (!tbl) {
+                return false;
+            }
+
+            
+            
+            height = tbl.offsetHeight;
+        }
+        if (isNaN(width)) {
+            width = 1;
+        }
+        if (isNaN(height)) {
+            height = 1;
+        }
+        return {
+            width: width,
+            height: height
+        };
+    },
+
+    invalidate: function(firstPass) {
+        var me = this,
+            stretchEl = me.stretchEl;
+
+        if (!stretchEl || !me.ownerCt) {
+            return;
+        }
+
+        var size  = me.getSizeCalculation(),
+            scrollEl = me.scrollEl,
+            elDom = scrollEl.dom,
+            reservedSpace = me.reservedSpace,
+            pos,
+            extra = 5;
+
+        if (size) {
+            stretchEl.setSize(size);
+
+            size = me.el.getSize(true);
+
+            if (me.vertical) {
+                size.width += extra;
+                size.height -= reservedSpace;
+                pos = 'left';
+            } else {
+                size.width -= reservedSpace;
+                size.height += extra;
+                pos = 'top';
+            }
+
+            scrollEl.setSize(size);
+            elDom.style[pos] = (-extra) + 'px';
+
+            
+            
+            elDom.scrollTop = elDom.scrollTop;
+        }
+    },
+
+    afterComponentLayout: function() {
+        this.callParent(arguments);
+        this.invalidate();
+    },
+
+    restoreScrollPos: function () {
+        var me = this,
+            el = this.scrollEl,
+            elDom = el && el.dom;
+
+        if (me._scrollPos !== null && elDom) {
+            elDom[me.scrollProp] = me._scrollPos;
+            me._scrollPos = null;
+        }
+    },
+
+    setReservedSpace: function (reservedSpace) {
+        var me = this;
+        if (me.reservedSpace !== reservedSpace) {
+            me.reservedSpace = reservedSpace;
+            me.invalidate();
+        }
+    },
+
+    saveScrollPos: function () {
+        var me = this,
+            el = this.scrollEl,
+            elDom = el && el.dom;
+
+        me._scrollPos = elDom ? elDom[me.scrollProp] : null;
+    },
+
+    
+    setScrollTop: function(scrollTop) {
+        var el = this.scrollEl,
+            elDom = el && el.dom;
+
+        if (elDom) {
+            return elDom.scrollTop = Ext.Number.constrain(scrollTop, 0, elDom.scrollHeight - elDom.clientHeight);
+        }
+    },
+
+    
+    setScrollLeft: function(scrollLeft) {
+        var el = this.scrollEl,
+            elDom = el && el.dom;
+
+        if (elDom) {
+            return elDom.scrollLeft = Ext.Number.constrain(scrollLeft, 0, elDom.scrollWidth - elDom.clientWidth);
+        }
+    },
+
+    
+    scrollByDeltaY: function(delta) {
+        var el = this.scrollEl,
+            elDom = el && el.dom;
+
+        if (elDom) {
+            return this.setScrollTop(elDom.scrollTop + delta);
+        }
+    },
+
+    
+    scrollByDeltaX: function(delta) {
+        var el = this.scrollEl,
+            elDom = el && el.dom;
+
+        if (elDom) {
+            return this.setScrollLeft(elDom.scrollLeft + delta);
+        }
+    },
+
+
+    
+    scrollToTop : function(){
+        this.setScrollTop(0);
+    },
+
+    
+    onElScroll: function(event, target) {
+        this.fireEvent('bodyscroll', event, target);
+    },
+
+    getPanel: function() {
+        var me = this;
+        if (!me.panel) {
+            me.panel = this.up('[scrollerOwner]');
+        }
+        return me.panel;
+    }
+});
+
+
+
+Ext.define('Ext.grid.PagingScroller', {
+    extend: 'Ext.grid.Scroller',
+    alias: 'widget.paginggridscroller',
+    
+    
+    
+    
+    
+    
+    
+    percentageFromEdge: 0.35,
+
+    
+    scrollToLoadBuffer: 200,
+
+    activePrefetch: true,
+
+    chunkSize: 50,
+    snapIncrement: 25,
+
+    syncScroll: true,
+
+    initComponent: function() {
+        var me = this,
+            ds = me.store;
+
+        ds.on('guaranteedrange', me.onGuaranteedRange, me);
+        me.callParent(arguments);
+    },
+
+    onGuaranteedRange: function(range, start, end) {
+        var me = this,
+            ds = me.store,
+            rs;
+        
+        if (range.length && me.visibleStart < range[0].index) {
+            return;
+        }
+
+        ds.loadRecords(range);
+
+        if (!me.firstLoad) {
+            if (me.rendered) {
+                me.invalidate();
+            } else {
+                me.on('afterrender', me.invalidate, me, {single: true});
+            }
+            me.firstLoad = true;
+        } else {
+            
+            
+            if (me.scrollEl && me.scrollEl.dom && me.scrollEl.dom.scrollHeight) {
+                me.syncTo();
+            }
+        }
+    },
+
+    syncTo: function() {
+        var me            = this,
+            pnl           = me.getPanel(),
+            store         = pnl.store,
+            scrollerElDom = this.scrollEl.dom,
+            rowOffset     = me.visibleStart - store.guaranteedStart,
+            scrollBy      = rowOffset * me.rowHeight,
+            scrollHeight  = scrollerElDom.scrollHeight,
+            clientHeight  = scrollerElDom.clientHeight,
+            scrollTop     = scrollerElDom.scrollTop,
+            useMaximum;
+            
+
+        
+        
+        if (Ext.isIE9 && Ext.isStrict) {
+            clientHeight = scrollerElDom.offsetHeight + 2;
+        }
+
+        
+        
+        useMaximum = (scrollHeight - clientHeight - scrollTop <= 0);
+        this.setViewScrollTop(scrollBy, useMaximum);
+    },
+
+    getPageData : function(){
+        var panel = this.getPanel(),
+            store = panel.store,
+            totalCount = store.getTotalCount();
+
+        return {
+            total : totalCount,
+            currentPage : store.currentPage,
+            pageCount: Math.ceil(totalCount / store.pageSize),
+            fromRecord: ((store.currentPage - 1) * store.pageSize) + 1,
+            toRecord: Math.min(store.currentPage * store.pageSize, totalCount)
+        };
+    },
+
+    onElScroll: function(e, t) {
+        var me = this,
+            panel = me.getPanel(),
+            store = panel.store,
+            pageSize = store.pageSize,
+            guaranteedStart = store.guaranteedStart,
+            guaranteedEnd = store.guaranteedEnd,
+            totalCount = store.getTotalCount(),
+            numFromEdge = Math.ceil(me.percentageFromEdge * pageSize),
+            position = t.scrollTop,
+            visibleStart = Math.floor(position / me.rowHeight),
+            view = panel.down('tableview'),
+            viewEl = view.el,
+            visibleHeight = viewEl.getHeight(),
+            visibleAhead = Math.ceil(visibleHeight / me.rowHeight),
+            visibleEnd = visibleStart + visibleAhead,
+            prevPage = Math.floor(visibleStart / pageSize),
+            nextPage = Math.floor(visibleEnd / pageSize) + 2,
+            lastPage = Math.ceil(totalCount / pageSize),
+            snap = me.snapIncrement,
+            requestStart = Math.floor(visibleStart / snap) * snap,
+            requestEnd = requestStart + pageSize - 1,
+            activePrefetch = me.activePrefetch;
+
+        me.visibleStart = visibleStart;
+        me.visibleEnd = visibleEnd;
+        
+        
+        me.syncScroll = true;
+        if (totalCount >= pageSize) {
+            
+            if (requestEnd > totalCount - 1) {
+                me.cancelLoad();
+                if (store.rangeSatisfied(totalCount - pageSize, totalCount - 1)) {
+                    me.syncScroll = true;
+                }
+                store.guaranteeRange(totalCount - pageSize, totalCount - 1);
+            
+            } else if (visibleStart <= guaranteedStart || visibleEnd > guaranteedEnd) {
+                if (visibleStart <= guaranteedStart) {
+                    
+                    requestStart -= snap;
+                    requestEnd -= snap;
+                    
+                    if (requestStart < 0) {
+                        requestStart = 0;
+                        requestEnd = pageSize;
+                    }
+                }
+                if (store.rangeSatisfied(requestStart, requestEnd)) {
+                    me.cancelLoad();
+                    store.guaranteeRange(requestStart, requestEnd);
+                } else {
+                    store.mask();
+                    me.attemptLoad(requestStart, requestEnd);
+                }
+                
+                me.syncScroll = false;
+            } else if (activePrefetch && visibleStart < (guaranteedStart + numFromEdge) && prevPage > 0) {
+                me.syncScroll = true;
+                store.prefetchPage(prevPage);
+            } else if (activePrefetch && visibleEnd > (guaranteedEnd - numFromEdge) && nextPage < lastPage) {
+                me.syncScroll = true;
+                store.prefetchPage(nextPage);
+            }
+        }
+
+        if (me.syncScroll) {
+            me.syncTo();
+        }
+    },
+
+    getSizeCalculation: function() {
+        
+        
+        var me     = this,
+            owner  = me.ownerGrid,
+            view   = owner.getView(),
+            store  = me.store,
+            dock   = me.dock,
+            elDom  = me.el.dom,
+            width  = 1,
+            height = 1;
+
+        if (!me.rowHeight) {
+            me.rowHeight = view.el.down(view.getItemSelector()).getHeight(false, true);
+        }
+
+        
+        height = store[(!store.remoteFilter && store.isFiltered()) ? 'getCount' : 'getTotalCount']() * me.rowHeight;
+
+        if (isNaN(width)) {
+            width = 1;
+        }
+        if (isNaN(height)) {
+            height = 1;
+        }
+        return {
+            width: width,
+            height: height
+        };
+    },
+
+    attemptLoad: function(start, end) {
+        var me = this;
+        if (!me.loadTask) {
+            me.loadTask = Ext.create('Ext.util.DelayedTask', me.doAttemptLoad, me, []);
+        }
+        me.loadTask.delay(me.scrollToLoadBuffer, me.doAttemptLoad, me, [start, end]);
+    },
+
+    cancelLoad: function() {
+        if (this.loadTask) {
+            this.loadTask.cancel();
+        }
+    },
+
+    doAttemptLoad:  function(start, end) {
+        var store = this.getPanel().store;
+        store.guaranteeRange(start, end);
+    },
+
+    setViewScrollTop: function(scrollTop, useMax) {
+        var me = this,
+            owner = me.getPanel(),
+            items = owner.query('tableview'),
+            i = 0,
+            len = items.length,
+            center,
+            centerEl,
+            calcScrollTop,
+            maxScrollTop,
+            scrollerElDom = me.el.dom;
+
+        owner.virtualScrollTop = scrollTop;
+
+        center = items[1] || items[0];
+        centerEl = center.el.dom;
+
+        maxScrollTop = ((owner.store.pageSize * me.rowHeight) - centerEl.clientHeight);
+        calcScrollTop = (scrollTop % ((owner.store.pageSize * me.rowHeight) + 1));
+        if (useMax) {
+            calcScrollTop = maxScrollTop;
+        }
+        if (calcScrollTop > maxScrollTop) {
+            
+            return;
+            
+        }
+        for (; i < len; i++) {
+            items[i].el.dom.scrollTop = calcScrollTop;
+        }
+    }
+});
+
+
+Ext.define('Ext.panel.Table', {
+    extend: 'Ext.panel.Panel',
+
+    alias: 'widget.tablepanel',
+
+    uses: [
+        'Ext.selection.RowModel',
+        'Ext.grid.Scroller',
+        'Ext.grid.header.Container',
+        'Ext.grid.Lockable'
+    ],
+
+    extraBaseCls: Ext.baseCSSPrefix + 'grid',
+    extraBodyCls: Ext.baseCSSPrefix + 'grid-body',
+
+    layout: 'fit',
+    
+    hasView: false,
+
+    
+    
+    viewType: null,
+
+    
+
+    
+
+    
+    selType: 'rowmodel',
+
+    
+
+    
+
+    
+
+    
+
+    
+    scrollDelta: 40,
+
+    
+    scroll: true,
+
+    
+
+    
+
+    
+
+    
+
+    
+
+     deferRowRender: true,
+     
+    
+    sortableColumns: true,
+
+    
+    enableLocking: false,
+
+    verticalScrollDock: 'right',
+    verticalScrollerType: 'gridscroller',
+
+    horizontalScrollerPresentCls: Ext.baseCSSPrefix + 'horizontal-scroller-present',
+    verticalScrollerPresentCls: Ext.baseCSSPrefix + 'vertical-scroller-present',
+
+    
+    
+    scrollerOwner: true,
+
+    invalidateScrollerOnRefresh: true,
+
+    
+    enableColumnMove: true,
+
+    
+    enableColumnResize: true,
+
+    
+    enableColumnHide: true,
+
+    initComponent: function() {
+
+        var me          = this,
+            scroll      = me.scroll,
+            vertical    = false,
+            horizontal  = false,
+            headerCtCfg = me.columns || me.colModel,
+            i           = 0,
+            view,
+            border = me.border;
+
+        if (me.hideHeaders) {
+            border = false;
+        }
+
+        
+        me.store = Ext.data.StoreManager.lookup(me.store || 'ext-empty-store');
+
+        
+        
+        if (headerCtCfg instanceof Ext.grid.header.Container) {
+            me.headerCt = headerCtCfg;
+            me.headerCt.border = border;
+            me.columns = me.headerCt.items.items;
+        } else {
+            if (Ext.isArray(headerCtCfg)) {
+                headerCtCfg = {
+                    items: headerCtCfg,
+                    border: border
+                };
+            }
+            Ext.apply(headerCtCfg, {
+                forceFit: me.forceFit,
+                sortable: me.sortableColumns,
+                enableColumnMove: me.enableColumnMove,
+                enableColumnResize: me.enableColumnResize,
+                enableColumnHide: me.enableColumnHide,
+                border:  border
+            });
+            me.columns = headerCtCfg.items;
+
+             
+             
+             if (me.enableLocking || Ext.ComponentQuery.query('{locked !== undefined}{processed != true}', me.columns).length) {
+                 me.self.mixin('lockable', Ext.grid.Lockable);
+                 me.injectLockable();
+             }
+        }
+
+        me.addEvents(
+            
+            'reconfigure',
+            
+            'viewready',
+            
+            'scrollerhide',
+            
+            'scrollershow'
+        );
+
+        me.bodyCls = me.bodyCls || '';
+        me.bodyCls += (' ' + me.extraBodyCls);
+        
+        me.cls = me.cls || '';
+        me.cls += (' ' + me.extraBaseCls);
+
+        
+        delete me.autoScroll;
+
+        
+        
+        if (!me.hasView) {
+
+            
+            
+            if (!me.headerCt) {
+                me.headerCt = Ext.create('Ext.grid.header.Container', headerCtCfg);
+            }
+
+            
+            me.columns = me.headerCt.items.items;
+
+            if (me.hideHeaders) {
+                me.headerCt.height = 0;
+                me.headerCt.border = false;
+                me.headerCt.addCls(Ext.baseCSSPrefix + 'grid-header-ct-hidden');
+                me.addCls(Ext.baseCSSPrefix + 'grid-header-hidden');
+                
+                
+                if (Ext.isIEQuirks) {
+                    me.headerCt.style = {
+                        display: 'none'
+                    };
+                }
+            }
+
+            
+            if (scroll === true || scroll === 'both') {
+                vertical = horizontal = true;
+            } else if (scroll === 'horizontal') {
+                horizontal = true;
+            } else if (scroll === 'vertical') {
+                vertical = true;
+            
+            } else {
+                me.headerCt.availableSpaceOffset = 0;
+            }
+
+            if (vertical) {
+                me.verticalScroller = Ext.ComponentManager.create(me.initVerticalScroller());
+                me.mon(me.verticalScroller, {
+                    bodyscroll: me.onVerticalScroll,
+                    scope: me
+                });
+            }
+
+            if (horizontal) {
+                me.horizontalScroller = Ext.ComponentManager.create(me.initHorizontalScroller());
+                me.mon(me.horizontalScroller, {
+                    bodyscroll: me.onHorizontalScroll,
+                    scope: me
+                });
+            }
+
+            me.headerCt.on('resize', me.onHeaderResize, me);
+            me.relayHeaderCtEvents(me.headerCt);
+            me.features = me.features || [];
+            if (!Ext.isArray(me.features)) {
+                me.features = [me.features];
+            }
+            me.dockedItems = me.dockedItems || [];
+            me.dockedItems.unshift(me.headerCt);
+            me.viewConfig = me.viewConfig || {};
+            me.viewConfig.invalidateScrollerOnRefresh = me.invalidateScrollerOnRefresh;
+
+            
+            
+            view = me.getView();
+
+            view.on({
+                afterrender: function () {
+                    
+                    view.el.scroll = Ext.Function.bind(me.elScroll, me);
+                    
+                    
+                    me.mon(view.el, {
+                        mousewheel: me.onMouseWheel,
+                        scope: me
+                    });
+                },
+                single: true
+            });
+            me.items = [view];
+            me.hasView = true;
+
+            me.mon(view.store, {
+                load: me.onStoreLoad,
+                scope: me
+            });
+            me.mon(view, {
+                viewReady: me.onViewReady,
+                resize: me.onViewResize,
+                refresh: {
+                    fn: me.onViewRefresh,
+                    scope: me,
+                    buffer: 50
+                },
+                scope: me
+            });
+            this.relayEvents(view, [
+                
+                'beforeitemmousedown',
+                
+                'beforeitemmouseup',
+                
+                'beforeitemmouseenter',
+                
+                'beforeitemmouseleave',
+                
+                'beforeitemclick',
+                
+                'beforeitemdblclick',
+                
+                'beforeitemcontextmenu',
+                
+                'itemmousedown',
+                
+                'itemmouseup',
+                
+                'itemmouseenter',
+                
+                'itemmouseleave',
+                
+                'itemclick',
+                
+                'itemdblclick',
+                
+                'itemcontextmenu',
+                
+                'beforecontainermousedown',
+                
+                'beforecontainermouseup',
+                
+                'beforecontainermouseover',
+                
+                'beforecontainermouseout',
+                
+                'beforecontainerclick',
+                
+                'beforecontainerdblclick',
+                
+                'beforecontainercontextmenu',
+                
+                'containermouseup',
+                
+                'containermouseover',
+                
+                'containermouseout',
+                
+                'containerclick',
+                
+                'containerdblclick',
+                
+                'containercontextmenu',
+                
+                'selectionchange',
+                
+                'beforeselect',
+                
+                'select',
+                
+                'beforedeselect',
+                
+                'deselect'
+            ]);
+        }
+
+        me.callParent(arguments);
+    },
+    
+    onRender: function(){
+        var vScroll = this.verticalScroller,
+            hScroll = this.horizontalScroller;
+
+        if (vScroll) {
+            vScroll.ensureDimension();
+        }
+        if (hScroll) {
+            hScroll.ensureDimension();
+        }
+        this.callParent(arguments);    
+    },
+
+    
+    initStateEvents: function(){
+        var events = this.stateEvents;
+        
+        Ext.each(['columnresize', 'columnmove', 'columnhide', 'columnshow', 'sortchange'], function(event){
+            if (Ext.Array.indexOf(events, event)) {
+                events.push(event);
+            }
+        });
+        this.callParent();
+    },
+
+    
+    initHorizontalScroller: function () {
+        var me = this,
+            ret = {
+                xtype: 'gridscroller',
+                dock: 'bottom',
+                section: me,
+                store: me.store
+            };
+
+        return ret;
+    },
+
+    
+    initVerticalScroller: function () {
+        var me = this,
+            ret = me.verticalScroller || {};
+
+        Ext.applyIf(ret, {
+            xtype: me.verticalScrollerType,
+            dock: me.verticalScrollDock,
+            store: me.store
+        });
+
+        return ret;
+    },
+
+    relayHeaderCtEvents: function (headerCt) {
+        this.relayEvents(headerCt, [
+            
+            'columnresize',
+            
+            'columnmove',
+            
+            'columnhide',
+            
+            'columnshow',
+            
+            'sortchange'
+        ]);
+    },
+
+    getState: function(){
+        var me = this,
+            state = me.callParent(),
+            sorter = me.store.sorters.first();
+
+        state.columns = (me.headerCt || me).getColumnsState();
+
+        if (sorter) {
+            state.sort = {
+                property: sorter.property,
+                direction: sorter.direction
+            };
+        }
+
+        return state;
+    },
+
+    applyState: function(state) {
+        var me = this,
+            sorter = state.sort,
+            store = me.store,
+            columns = state.columns;
+
+        delete state.columns;
+
+        
+        
+        me.callParent(arguments);
+
+        if (columns) {
+            (me.headerCt || me).applyColumnsState(columns);
+        }
+
+        if (sorter) {
+            if (store.remoteSort) {
+                store.sorters.add(Ext.create('Ext.util.Sorter', {
+                    property: sorter.property,
+                    direction: sorter.direction
+                }));
+            }
+            else {
+                store.sort(sorter.property, sorter.direction);
+            }
+        }
+    },
+
+    
+    getStore: function(){
+        return this.store;
+    },
+
+    
+    getView: function() {
+        var me = this,
+            sm;
+
+        if (!me.view) {
+            sm = me.getSelectionModel();
+            me.view = me.createComponent(Ext.apply({}, me.viewConfig, {
+                deferInitialRefresh: me.deferRowRender,
+                xtype: me.viewType,
+                store: me.store,
+                headerCt: me.headerCt,
+                selModel: sm,
+                features: me.features,
+                panel: me
+            }));
+            me.mon(me.view, {
+                uievent: me.processEvent,
+                scope: me
+            });
+            sm.view = me.view;
+            me.headerCt.view = me.view;
+            me.relayEvents(me.view, ['cellclick', 'celldblclick']);
+        }
+        return me.view;
+    },
+
+    
+    setAutoScroll: Ext.emptyFn,
+
+    
+    
+    
+    elScroll: function(direction, distance, animate) {
+        var me = this,
+            scroller;
+
+        if (direction === "up" || direction === "left") {
+            distance = -distance;
+        }
+        
+        if (direction === "down" || direction === "up") {
+            scroller = me.getVerticalScroller();
+            
+            
+            if (scroller) {
+                scroller.scrollByDeltaY(distance);
+            }
+        } else {
+            scroller = me.getHorizontalScroller();
+            
+            
+            if (scroller) {
+                scroller.scrollByDeltaX(distance);
+            }
+        }
+    },
+
+    
+    processEvent: function(type, view, cell, recordIndex, cellIndex, e) {
+        var me = this,
+            header;
+
+        if (cellIndex !== -1) {
+            header = me.headerCt.getGridColumns()[cellIndex];
+            return header.processEvent.apply(header, arguments);
+        }
+    },
+
+    
+    determineScrollbars: function() {
+        
+        if (this.determineScrollbarsRunning) {
+            return;
+        }
+        this.determineScrollbarsRunning = true;
+        var me = this,
+            view = me.view,
+            box,
+            tableEl,
+            scrollWidth,
+            clientWidth,
+            scrollHeight,
+            clientHeight,
+            verticalScroller = me.verticalScroller,
+            horizontalScroller = me.horizontalScroller,
+            curScrollbars = (verticalScroller   && verticalScroller.ownerCt === me ? 1 : 0) |
+                            (horizontalScroller && horizontalScroller.ownerCt === me ? 2 : 0),
+            reqScrollbars = 0; 
+
+        
+        if (!me.collapsed && view && view.viewReady) {
+
+            
+            
+            box = view.el.getSize();
+
+            clientWidth  = box.width  + ((curScrollbars & 1) ? verticalScroller.width : 0);
+            clientHeight = box.height + ((curScrollbars & 2) ? horizontalScroller.height : 0);
+
+            
+            
+
+            scrollWidth = (me.headerCt.query('[flex]').length && !me.headerCt.layout.tooNarrow) ? 0 : me.headerCt.getFullWidth();
+
+            
+            if (verticalScroller && verticalScroller.el) {
+                scrollHeight = verticalScroller.getSizeCalculation().height;
+            } else {
+                tableEl = view.el.child('table', true);
+                scrollHeight = tableEl ? tableEl.offsetHeight : 0;
+            }
+
+            
+            
+            if (scrollHeight > clientHeight) {
+                reqScrollbars = 1;
+
+                
+                if (horizontalScroller && ((clientWidth - scrollWidth) < verticalScroller.width)) {
+                    reqScrollbars = 3;
+                }
+            }
+
+            
+            else {
+                
+                
+                if (scrollWidth > clientWidth) {
+                    reqScrollbars = 2;
+
+                    
+                    if (verticalScroller && ((clientHeight - scrollHeight) < horizontalScroller.height)) {
+                        reqScrollbars = 3;
+                    }
+                }
+            }
+
+            
+            if (reqScrollbars !== curScrollbars) {
+
+                
+                me.suspendLayout = true;
+                if (reqScrollbars & 1) {
+                    me.showVerticalScroller();
+                } else {
+                    me.hideVerticalScroller();
+                }
+                if (reqScrollbars & 2) {
+                    me.showHorizontalScroller();
+                } else {
+                    me.hideHorizontalScroller();
+                }
+                me.suspendLayout = false;
+
+                
+                me.doComponentLayout();
+                
+                me.getLayout().layout();
+            }
+        }
+        delete me.determineScrollbarsRunning;
+    },
+
+    onViewResize: function() {
+        this.determineScrollbars();
+    },
+
+    afterComponentLayout: function() {
+        this.callParent(arguments);
+        this.determineScrollbars();
+        this.invalidateScroller();
+    },
+
+    onHeaderResize: function() {
+        if (!this.componentLayout.layoutBusy && this.view && this.view.rendered) {
+            this.determineScrollbars();
+            this.invalidateScroller();
+        }
+    },
+
+    afterCollapse: function() {
+        var me = this;
+        if (me.verticalScroller) {
+            me.verticalScroller.saveScrollPos();
+        }
+        if (me.horizontalScroller) {
+            me.horizontalScroller.saveScrollPos();
+        }
+        me.callParent(arguments);
+    },
+
+    afterExpand: function() {
+        var me = this;
+        me.callParent(arguments);
+        if (me.verticalScroller) {
+            me.verticalScroller.restoreScrollPos();
+        }
+        if (me.horizontalScroller) {
+            me.horizontalScroller.restoreScrollPos();
+        }
+    },
+
+    
+    hideHorizontalScroller: function() {
+        var me = this;
+
+        if (me.horizontalScroller && me.horizontalScroller.ownerCt === me) {
+            me.verticalScroller.setReservedSpace(0);
+            me.removeDocked(me.horizontalScroller, false);
+            me.removeCls(me.horizontalScrollerPresentCls);
+            me.fireEvent('scrollerhide', me.horizontalScroller, 'horizontal');
+        }
+
+    },
+
+    
+    showHorizontalScroller: function() {
+        var me = this;
+
+        if (me.verticalScroller) {
+            me.verticalScroller.setReservedSpace(Ext.getScrollbarSize().height - 1);
+        }
+        if (me.horizontalScroller && me.horizontalScroller.ownerCt !== me) {
+            me.addDocked(me.horizontalScroller);
+            me.addCls(me.horizontalScrollerPresentCls);
+            me.fireEvent('scrollershow', me.horizontalScroller, 'horizontal');
+        }
+    },
+
+    
+    hideVerticalScroller: function() {
+        var me = this;
+
+        me.setHeaderReserveOffset(false);
+        if (me.verticalScroller && me.verticalScroller.ownerCt === me) {
+            me.removeDocked(me.verticalScroller, false);
+            me.removeCls(me.verticalScrollerPresentCls);
+            me.fireEvent('scrollerhide', me.verticalScroller, 'vertical');
+        }
+    },
+
+    
+    showVerticalScroller: function() {
+        var me = this;
+
+        me.setHeaderReserveOffset(true);
+        if (me.verticalScroller && me.verticalScroller.ownerCt !== me) {
+            me.addDocked(me.verticalScroller);
+            me.addCls(me.verticalScrollerPresentCls);
+            me.fireEvent('scrollershow', me.verticalScroller, 'vertical');
+        }
+    },
+
+    setHeaderReserveOffset: function (reserveOffset) {
+        var headerCt = this.headerCt,
+            layout = headerCt.layout;
+
+        
+        if (layout && layout.reserveOffset !== reserveOffset) {
+            layout.reserveOffset = reserveOffset;
+            if (!this.suspendLayout) {
+                headerCt.doLayout();
+            }
+        }
+    },
+
+    
+    invalidateScroller: function() {
+        var me = this,
+            vScroll = me.verticalScroller,
+            hScroll = me.horizontalScroller;
+
+        if (vScroll) {
+            vScroll.invalidate();
+        }
+        if (hScroll) {
+            hScroll.invalidate();
+        }
+    },
+
+    
+    onHeaderMove: function(headerCt, header, fromIdx, toIdx) {
+        this.view.refresh();
+    },
+
+    
+    onHeaderHide: function(headerCt, header) {
+        this.invalidateScroller();
+    },
+
+    onHeaderShow: function(headerCt, header) {
+        this.invalidateScroller();
+    },
+
+    getVerticalScroller: function() {
+        return this.getScrollerOwner().down('gridscroller[dock=' + this.verticalScrollDock + ']');
+    },
+
+    getHorizontalScroller: function() {
+        return this.getScrollerOwner().down('gridscroller[dock=bottom]');
+    },
+
+    onMouseWheel: function(e) {
+        var me = this,
+            vertScroller = me.getVerticalScroller(),
+            horizScroller = me.getHorizontalScroller(),
+            scrollDelta = -me.scrollDelta,
+            deltas = e.getWheelDeltas(),
+            deltaX = scrollDelta * deltas.x,
+            deltaY = scrollDelta * deltas.y,
+            vertScrollerEl, horizScrollerEl,
+            vertScrollerElDom, horizScrollerElDom,
+            horizontalCanScrollLeft, horizontalCanScrollRight,
+            verticalCanScrollDown, verticalCanScrollUp;
+
+        
+        if (horizScroller) {
+            horizScrollerEl = horizScroller.scrollEl;
+            if (horizScrollerEl) {
+                horizScrollerElDom = horizScrollerEl.dom;
+                horizontalCanScrollRight = horizScrollerElDom.scrollLeft !== horizScrollerElDom.scrollWidth - horizScrollerElDom.clientWidth;
+                horizontalCanScrollLeft  = horizScrollerElDom.scrollLeft !== 0;
+            }
+        }
+        if (vertScroller) {
+            vertScrollerEl = vertScroller.scrollEl;
+            if (vertScrollerEl) {
+                vertScrollerElDom = vertScrollerEl.dom;
+                verticalCanScrollDown = vertScrollerElDom.scrollTop !== vertScrollerElDom.scrollHeight - vertScrollerElDom.clientHeight;
+                verticalCanScrollUp   = vertScrollerElDom.scrollTop !== 0;
+            }
+        }
+
+        if (horizScroller) {
+            if ((deltaX < 0 && horizontalCanScrollLeft) || (deltaX > 0 && horizontalCanScrollRight)) {
+                e.stopEvent();
+                horizScroller.scrollByDeltaX(deltaX);
+            }
+        }
+        if (vertScroller) {
+            if ((deltaY < 0 && verticalCanScrollUp) || (deltaY > 0 && verticalCanScrollDown)) {
+                e.stopEvent();
+                vertScroller.scrollByDeltaY(deltaY);
+            }
+        }
+    },
+
+    
+    onViewReady: function() {
+        var me = this;
+        me.fireEvent('viewready', me);
+        if (me.deferRowRender) {
+            me.determineScrollbars();
+            me.invalidateScroller();
+        }
+    },
+
+    
+    onViewRefresh: function() {
+        var me = this;
+
+        
+        if (!me.rendering) {
+            this.determineScrollbars();
+            if (this.invalidateScrollerOnRefresh) {
+                this.invalidateScroller();
+            }
+        }
+    },
+
+    
+    setScrollTop: function(top) {
+        var me               = this,
+            rootCmp          = me.getScrollerOwner(),
+            verticalScroller = me.getVerticalScroller();
+
+        rootCmp.virtualScrollTop = top;
+        if (verticalScroller) {
+            verticalScroller.setScrollTop(top);
+        }
+    },
+
+    getScrollerOwner: function() {
+        var rootCmp = this;
+        if (!this.scrollerOwner) {
+            rootCmp = this.up('[scrollerOwner]');
+        }
+        return rootCmp;
+    },
+
+    
+    scrollByDeltaY: function(deltaY) {
+        var verticalScroller = this.getVerticalScroller();
+
+        if (verticalScroller) {
+            verticalScroller.scrollByDeltaY(deltaY);
+        }
+    },
+
+    
+    scrollByDeltaX: function(deltaX) {
+        var horizontalScroller = this.getHorizontalScroller();
+
+        if (horizontalScroller) {
+            horizontalScroller.scrollByDeltaX(deltaX);
+        }
+    },
+
+    
+    getLhsMarker: function() {
+        var me = this;
+
+        if (!me.lhsMarker) {
+            me.lhsMarker = Ext.DomHelper.append(me.el, {
+                cls: Ext.baseCSSPrefix + 'grid-resize-marker'
+            }, true);
+        }
+        return me.lhsMarker;
+    },
+
+    
+    getRhsMarker: function() {
+        var me = this;
+
+        if (!me.rhsMarker) {
+            me.rhsMarker = Ext.DomHelper.append(me.el, {
+                cls: Ext.baseCSSPrefix + 'grid-resize-marker'
+            }, true);
+        }
+        return me.rhsMarker;
+    },
+
+    
+    getSelectionModel: function(){
+        if (!this.selModel) {
+            this.selModel = {};
+        }
+
+        var mode = 'SINGLE',
+            type;
+        if (this.simpleSelect) {
+            mode = 'SIMPLE';
+        } else if (this.multiSelect) {
+            mode = 'MULTI';
+        }
+
+        Ext.applyIf(this.selModel, {
+            allowDeselect: this.allowDeselect,
+            mode: mode
+        });
+
+        if (!this.selModel.events) {
+            type = this.selModel.selType || this.selType;
+            this.selModel = Ext.create('selection.' + type, this.selModel);
+        }
+
+        if (!this.selModel.hasRelaySetup) {
+            this.relayEvents(this.selModel, [
+                'selectionchange', 'beforeselect', 'beforedeselect', 'select', 'deselect'
+            ]);
+            this.selModel.hasRelaySetup = true;
+        }
+
+        
+        
+        if (this.disableSelection) {
+            this.selModel.locked = true;
+        }
+        return this.selModel;
+    },
+
+    onVerticalScroll: function(event, target) {
+        var owner = this.getScrollerOwner(),
+            items = owner.query('tableview'),
+            i = 0,
+            len = items.length;
+
+        for (; i < len; i++) {
+            items[i].el.dom.scrollTop = target.scrollTop;
+        }
+    },
+
+    onHorizontalScroll: function(event, target) {
+        var owner = this.getScrollerOwner(),
+            items = owner.query('tableview'),
+            center = items[1] || items[0];
+
+        center.el.dom.scrollLeft = target.scrollLeft;
+        this.headerCt.el.dom.scrollLeft = target.scrollLeft;
+    },
+
+    
+    onStoreLoad: Ext.emptyFn,
+
+    getEditorParent: function() {
+        return this.body;
+    },
+
+    bindStore: function(store) {
+        var me = this;
+        me.store = store;
+        me.getView().bindStore(store);
+    },
+    
+    beforeDestroy: function(){
+        
+        
+        
+        Ext.destroy(this.horizontalScroller, this.verticalScroller);
+        this.callParent();
+    },
+
+    
+    reconfigure: function(store, columns) {
+        var me = this,
+            headerCt = me.headerCt;
+
+        if (me.lockable) {
+            me.reconfigureLockable(store, columns);
+        } else {
+            if (columns) {
+                headerCt.suspendLayout = true;
+                headerCt.removeAll();
+                headerCt.add(columns);
+            }
+            if (store) {
+                store = Ext.StoreManager.lookup(store);
+                me.bindStore(store);
+            } else {
+                me.getView().refresh();
+            }
+            if (columns) {
+                headerCt.suspendLayout = false;
+                me.forceComponentLayout();
+            }
+        }
+        me.fireEvent('reconfigure', me);
+    }
+});
+
+Ext.define('Ext.view.Table', {
+    extend: 'Ext.view.View',
+    alias: 'widget.tableview',
+    uses: [
+        'Ext.view.TableChunker',
+        'Ext.util.DelayedTask',
+        'Ext.util.MixedCollection'
+    ],
+
+    baseCls: Ext.baseCSSPrefix + 'grid-view',
+
+    
+    itemSelector: '.' + Ext.baseCSSPrefix + 'grid-row',
+    
+    cellSelector: '.' + Ext.baseCSSPrefix + 'grid-cell',
+
+    selectedItemCls: Ext.baseCSSPrefix + 'grid-row-selected',
+    selectedCellCls: Ext.baseCSSPrefix + 'grid-cell-selected',
+    focusedItemCls: Ext.baseCSSPrefix + 'grid-row-focused',
+    overItemCls: Ext.baseCSSPrefix + 'grid-row-over',
+    altRowCls:   Ext.baseCSSPrefix + 'grid-row-alt',
+    rowClsRe: /(?:^|\s*)grid-row-(first|last|alt)(?:\s+|$)/g,
+    cellRe: new RegExp('x-grid-cell-([^\\s]+) ', ''),
+
+    
+    trackOver: true,
+
+    
+    getRowClass: null,
+
+    initComponent: function() {
+        var me = this;
+
+        me.scrollState = {};
+        me.selModel.view = me;
+        me.headerCt.view = me;
+        me.initFeatures();
+        me.tpl = '<div></div>';
+        me.callParent();
+        me.mon(me.store, {
+            load: me.onStoreLoad,
+            scope: me
+        });
+
+        
+        
+        
+        
+        
+        
+        
+        
+        
+    },
+
+    
+    onStoreLoad: function(){
+        var me = this;
+
+        if (me.invalidateScrollerOnRefresh) {
+            if (Ext.isGecko) {
+                if (!me.scrollToTopTask) {
+                    me.scrollToTopTask = Ext.create('Ext.util.DelayedTask', me.scrollToTop, me);
+                }
+                me.scrollToTopTask.delay(1);
+            } else {
+                me    .scrollToTop();
+            }
+        }
+    },
+
+    
+    scrollToTop: Ext.emptyFn,
+
+    
+    addElListener: function(eventName, fn, scope){
+        this.mon(this, eventName, fn, scope, {
+            element: 'el'
+        });
+    },
+
+    
+    getGridColumns: function() {
+        return this.headerCt.getGridColumns();
+    },
+
+    
+    getHeaderAtIndex: function(index) {
+        return this.headerCt.getHeaderAtIndex(index);
+    },
+
+    
+    getCell: function(record, column) {
+        var row = this.getNode(record);
+        return Ext.fly(row).down(column.getCellSelector());
+    },
+
+    
+    getFeature: function(id) {
+        var features = this.featuresMC;
+        if (features) {
+            return features.get(id);
+        }
+    },
+
+    
+    initFeatures: function() {
+        var me = this,
+            i = 0,
+            features,
+            len;
+
+        me.features = me.features || [];
+        features = me.features;
+        len = features.length;
+
+        me.featuresMC = Ext.create('Ext.util.MixedCollection');
+        for (; i < len; i++) {
+            
+            if (!features[i].isFeature) {
+                features[i] = Ext.create('feature.' + features[i].ftype, features[i]);
+            }
+            
+            features[i].view = me;
+            me.featuresMC.add(features[i]);
+        }
+    },
+
+    
+    attachEventsForFeatures: function() {
+        var features = this.features,
+            ln       = features.length,
+            i        = 0;
+
+        for (; i < ln; i++) {
+            if (features[i].isFeature) {
+                features[i].attachEvents();
+            }
+        }
+    },
+
+    afterRender: function() {
+        var me = this;
+
+        me.callParent();
+        me.mon(me.el, {
+            scroll: me.fireBodyScroll,
+            scope: me
+        });
+        me.el.unselectable();
+        me.attachEventsForFeatures();
+    },
+
+    fireBodyScroll: function(e, t) {
+        this.fireEvent('bodyscroll', e, t);
+    },
+
+    
+    
+    prepareData: function(data, idx, record) {
+        var me       = this,
+            orig     = me.headerCt.prepareData(data, idx, record, me, me.ownerCt),
+            features = me.features,
+            ln       = features.length,
+            i        = 0,
+            node, feature;
+
+        for (; i < ln; i++) {
+            feature = features[i];
+            if (feature.isFeature) {
+                Ext.apply(orig, feature.getAdditionalData(data, idx, record, orig, me));
+            }
+        }
+
+        return orig;
+    },
+
+    
+    collectData: function(records, startIndex) {
+        var preppedRecords = this.callParent(arguments),
+            headerCt  = this.headerCt,
+            fullWidth = headerCt.getFullWidth(),
+            features  = this.features,
+            ln = features.length,
+            o = {
+                rows: preppedRecords,
+                fullWidth: fullWidth
+            },
+            i  = 0,
+            feature,
+            j = 0,
+            jln,
+            rowParams;
+
+        jln = preppedRecords.length;
+        
+        
+        if (this.getRowClass) {
+            for (; j < jln; j++) {
+                rowParams = {};
+                preppedRecords[j]['rowCls'] = this.getRowClass(records[j], j, rowParams, this.store);
+            }
+        }
+        
+        
+        for (; i < ln; i++) {
+            feature = features[i];
+            if (feature.isFeature && feature.collectData && !feature.disabled) {
+                o = feature.collectData(records, preppedRecords, startIndex, fullWidth, o);
+                break;
+            }
+        }
+        return o;
+    },
+
+    
+    
+    onHeaderResize: function(header, w, suppressFocus) {
+        var me = this,
+            el = me.el;
+
+        if (el) {
+            me.saveScrollState();
+            
+            
+            
+
+            
+            
+            
+            if (Ext.isIE6 || Ext.isIE7) {
+                if (header.el.hasCls(Ext.baseCSSPrefix + 'column-header-first')) {
+                    w += 1;
+                }
+            }
+            el.select('.' + Ext.baseCSSPrefix + 'grid-col-resizer-'+header.id).setWidth(w);
+            el.select('.' + Ext.baseCSSPrefix + 'grid-table-resizer').setWidth(me.headerCt.getFullWidth());
+            me.restoreScrollState();
+            if (!me.ignoreTemplate) {
+                me.setNewTemplate();
+            }
+            if (!suppressFocus) {
+                me.el.focus();
+            }
+        }
+    },
+
+    
+    onHeaderShow: function(headerCt, header, suppressFocus) {
+        var me = this;
+        me.ignoreTemplate = true;
+        
+        if (header.oldWidth) {
+            me.onHeaderResize(header, header.oldWidth, suppressFocus);
+            delete header.oldWidth;
+        
+        
+        
+        } else if (header.width && !header.flex) {
+            me.onHeaderResize(header, header.width, suppressFocus);
+        }
+        delete me.ignoreTemplate;
+        me.setNewTemplate();
+    },
+
+    
+    onHeaderHide: function(headerCt, header, suppressFocus) {
+        this.onHeaderResize(header, 0, suppressFocus);
+    },
+
+    
+    setNewTemplate: function() {
+        var me = this,
+            columns = me.headerCt.getColumnsForTpl(true);
+
+        me.tpl = me.getTableChunker().getTableTpl({
+            columns: columns,
+            features: me.features
+        });
+    },
+
+    
+    getTableChunker: function() {
+        return this.chunker || Ext.view.TableChunker;
+    },
+
+    
+    addRowCls: function(rowInfo, cls) {
+        var row = this.getNode(rowInfo);
+        if (row) {
+            Ext.fly(row).addCls(cls);
+        }
+    },
+
+    
+    removeRowCls: function(rowInfo, cls) {
+        var row = this.getNode(rowInfo);
+        if (row) {
+            Ext.fly(row).removeCls(cls);
+        }
+    },
+
+    
+    onRowSelect : function(rowIdx) {
+        this.addRowCls(rowIdx, this.selectedItemCls);
+    },
+
+    
+    onRowDeselect : function(rowIdx) {
+        var me = this;
+
+        me.removeRowCls(rowIdx, me.selectedItemCls);
+        me.removeRowCls(rowIdx, me.focusedItemCls);
+    },
+
+    onCellSelect: function(position) {
+        var cell = this.getCellByPosition(position);
+        if (cell) {
+            cell.addCls(this.selectedCellCls);
+        }
+    },
+
+    onCellDeselect: function(position) {
+        var cell = this.getCellByPosition(position);
+        if (cell) {
+            cell.removeCls(this.selectedCellCls);
+        }
+
+    },
+
+    onCellFocus: function(position) {
+        
+        this.focusCell(position);
+    },
+
+    getCellByPosition: function(position) {
+        var row    = position.row,
+            column = position.column,
+            store  = this.store,
+            node   = this.getNode(row),
+            header = this.headerCt.getHeaderAtIndex(column),
+            cellSelector,
+            cell = false;
+
+        if (header && node) {
+            cellSelector = header.getCellSelector();
+            cell = Ext.fly(node).down(cellSelector);
+        }
+        return cell;
+    },
+
+    
+    
+    onRowFocus: function(rowIdx, highlight, supressFocus) {
+        var me = this,
+            row = me.getNode(rowIdx);
+
+        if (highlight) {
+            me.addRowCls(rowIdx, me.focusedItemCls);
+            if (!supressFocus) {
+                me.focusRow(rowIdx);
+            }
+            
+        } else {
+            me.removeRowCls(rowIdx, me.focusedItemCls);
+        }
+    },
+
+    
+    focusRow: function(rowIdx) {
+        var me         = this,
+            row        = me.getNode(rowIdx),
+            el         = me.el,
+            adjustment = 0,
+            panel      = me.ownerCt,
+            rowRegion,
+            elRegion,
+            record;
+
+        if (row && el) {
+            elRegion  = el.getRegion();
+            rowRegion = Ext.fly(row).getRegion();
+            
+            if (rowRegion.top < elRegion.top) {
+                adjustment = rowRegion.top - elRegion.top;
+            
+            } else if (rowRegion.bottom > elRegion.bottom) {
+                adjustment = rowRegion.bottom - elRegion.bottom;
+            }
+            record = me.getRecord(row);
+            rowIdx = me.store.indexOf(record);
+
+            if (adjustment) {
+                
+                panel.scrollByDeltaY(adjustment);
+            }
+            me.fireEvent('rowfocus', record, row, rowIdx);
+        }
+    },
+
+    focusCell: function(position) {
+        var me          = this,
+            cell        = me.getCellByPosition(position),
+            el          = me.el,
+            adjustmentY = 0,
+            adjustmentX = 0,
+            elRegion    = el.getRegion(),
+            panel       = me.ownerCt,
+            cellRegion,
+            record;
+
+        if (cell) {
+            cellRegion = cell.getRegion();
+            
+            if (cellRegion.top < elRegion.top) {
+                adjustmentY = cellRegion.top - elRegion.top;
+            
+            } else if (cellRegion.bottom > elRegion.bottom) {
+                adjustmentY = cellRegion.bottom - elRegion.bottom;
+            }
+
+            
+            if (cellRegion.left < elRegion.left) {
+                adjustmentX = cellRegion.left - elRegion.left;
+            
+            } else if (cellRegion.right > elRegion.right) {
+                adjustmentX = cellRegion.right - elRegion.right;
+            }
+
+            if (adjustmentY) {
+                
+                panel.scrollByDeltaY(adjustmentY);
+            }
+            if (adjustmentX) {
+                panel.scrollByDeltaX(adjustmentX);
+            }
+            el.focus();
+            me.fireEvent('cellfocus', record, cell, position);
+        }
+    },
+
+    
+    scrollByDelta: function(delta, dir) {
+        dir = dir || 'scrollTop';
+        var elDom = this.el.dom;
+        elDom[dir] = (elDom[dir] += delta);
+    },
+
+    onUpdate: function(ds, index) {
+        this.callParent(arguments);
+    },
+
+    
+    saveScrollState: function() {
+        if (this.rendered) {
+            var dom = this.el.dom, 
+                state = this.scrollState;
+            
+            state.left = dom.scrollLeft;
+            state.top = dom.scrollTop;
+        }
+    },
+
+    
+    restoreScrollState: function() {
+        if (this.rendered) {
+            var dom = this.el.dom, 
+                state = this.scrollState, 
+                headerEl = this.headerCt.el.dom;
+            
+            headerEl.scrollLeft = dom.scrollLeft = state.left;
+            dom.scrollTop = state.top;
+        }
+    },
+
+    
+    refresh: function() {
+        this.setNewTemplate();
+        this.callParent(arguments);
+    },
+
+    processItemEvent: function(record, row, rowIndex, e) {
+        var me = this,
+            cell = e.getTarget(me.cellSelector, row),
+            cellIndex = cell ? cell.cellIndex : -1,
+            map = me.statics().EventMap,
+            selModel = me.getSelectionModel(),
+            type = e.type,
+            result;
+
+        if (type == 'keydown' && !cell && selModel.getCurrentPosition) {
+            
+            cell = me.getCellByPosition(selModel.getCurrentPosition());
+            if (cell) {
+                cell = cell.dom;
+                cellIndex = cell.cellIndex;
+            }
+        }
+
+        result = me.fireEvent('uievent', type, me, cell, rowIndex, cellIndex, e);
+
+        if (result === false || me.callParent(arguments) === false) {
+            return false;
+        }
+
+        
+        if (type == 'mouseover' || type == 'mouseout') {
+            return true;
+        }
+
+        return !(
+            
+            (me['onBeforeCell' + map[type]](cell, cellIndex, record, row, rowIndex, e) === false) ||
+            (me.fireEvent('beforecell' + type, me, cell, cellIndex, record, row, rowIndex, e) === false) ||
+            (me['onCell' + map[type]](cell, cellIndex, record, row, rowIndex, e) === false) ||
+            (me.fireEvent('cell' + type, me, cell, cellIndex, record, row, rowIndex, e) === false)
+        );
+    },
+
+    processSpecialEvent: function(e) {
+        var me = this,
+            map = me.statics().EventMap,
+            features = me.features,
+            ln = features.length,
+            type = e.type,
+            i, feature, prefix, featureTarget,
+            beforeArgs, args,
+            panel = me.ownerCt;
+
+        me.callParent(arguments);
+
+        if (type == 'mouseover' || type == 'mouseout') {
+            return;
+        }
+
+        for (i = 0; i < ln; i++) {
+            feature = features[i];
+            if (feature.hasFeatureEvent) {
+                featureTarget = e.getTarget(feature.eventSelector, me.getTargetEl());
+                if (featureTarget) {
+                    prefix = feature.eventPrefix;
+                    
+                    
+                    beforeArgs = feature.getFireEventArgs('before' + prefix + type, me, featureTarget, e);
+                    args = feature.getFireEventArgs(prefix + type, me, featureTarget, e);
+
+                    if (
+                        
+                        (me.fireEvent.apply(me, beforeArgs) === false) ||
+                        
+                        (panel.fireEvent.apply(panel, beforeArgs) === false) ||
+                        
+                        (me.fireEvent.apply(me, args) === false) ||
+                        
+                        (panel.fireEvent.apply(panel, args) === false)
+                    ) {
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    },
+
+    onCellMouseDown: Ext.emptyFn,
+    onCellMouseUp: Ext.emptyFn,
+    onCellClick: Ext.emptyFn,
+    onCellDblClick: Ext.emptyFn,
+    onCellContextMenu: Ext.emptyFn,
+    onCellKeyDown: Ext.emptyFn,
+    onBeforeCellMouseDown: Ext.emptyFn,
+    onBeforeCellMouseUp: Ext.emptyFn,
+    onBeforeCellClick: Ext.emptyFn,
+    onBeforeCellDblClick: Ext.emptyFn,
+    onBeforeCellContextMenu: Ext.emptyFn,
+    onBeforeCellKeyDown: Ext.emptyFn,
+
+    
+    expandToFit: function(header) {
+        if (header) {
+            var maxWidth = this.getMaxContentWidth(header);
+            delete header.flex;
+            header.setWidth(maxWidth);
+        }
+    },
+
+    
+    getMaxContentWidth: function(header) {
+        var cellSelector = header.getCellInnerSelector(),
+            cells        = this.el.query(cellSelector),
+            i = 0,
+            ln = cells.length,
+            maxWidth = header.el.dom.scrollWidth,
+            scrollWidth;
+
+        for (; i < ln; i++) {
+            scrollWidth = cells[i].scrollWidth;
+            if (scrollWidth > maxWidth) {
+                maxWidth = scrollWidth;
+            }
+        }
+        return maxWidth;
+    },
+
+    getPositionByEvent: function(e) {
+        var me       = this,
+            cellNode = e.getTarget(me.cellSelector),
+            rowNode  = e.getTarget(me.itemSelector),
+            record   = me.getRecord(rowNode),
+            header   = me.getHeaderByCell(cellNode);
+
+        return me.getPosition(record, header);
+    },
+
+    getHeaderByCell: function(cell) {
+        if (cell) {
+            var m = cell.className.match(this.cellRe);
+            if (m && m[1]) {
+                return Ext.getCmp(m[1]);
+            }
+        }
+        return false;
+    },
+
+    
+    walkCells: function(pos, direction, e, preventWrap, verifierFn, scope) {
+        var me       = this,
+            row      = pos.row,
+            column   = pos.column,
+            rowCount = me.store.getCount(),
+            firstCol = me.getFirstVisibleColumnIndex(),
+            lastCol  = me.getLastVisibleColumnIndex(),
+            newPos   = {row: row, column: column},
+            activeHeader = me.headerCt.getHeaderAtIndex(column);
+
+        
+        if (!activeHeader || activeHeader.hidden) {
+            return false;
+        }
+
+        e = e || {};
+        direction = direction.toLowerCase();
+        switch (direction) {
+            case 'right':
+                
+                if (column === lastCol) {
+                    
+                    if (preventWrap || row === rowCount - 1) {
+                        return false;
+                    }
+                    if (!e.ctrlKey) {
+                        
+                        newPos.row = row + 1;
+                        newPos.column = firstCol;
+                    }
+                
+                } else {
+                    if (!e.ctrlKey) {
+                        newPos.column = column + me.getRightGap(activeHeader);
+                    } else {
+                        newPos.column = lastCol;
+                    }
+                }
+                break;
+
+            case 'left':
+                
+                if (column === firstCol) {
+                    
+                    if (preventWrap || row === 0) {
+                        return false;
+                    }
+                    if (!e.ctrlKey) {
+                        
+                        newPos.row = row - 1;
+                        newPos.column = lastCol;
+                    }
+                
+                } else {
+                    if (!e.ctrlKey) {
+                        newPos.column = column + me.getLeftGap(activeHeader);
+                    } else {
+                        newPos.column = firstCol;
+                    }
+                }
+                break;
+
+            case 'up':
+                
+                if (row === 0) {
+                    return false;
+                
+                } else {
+                    if (!e.ctrlKey) {
+                        newPos.row = row - 1;
+                    } else {
+                        newPos.row = 0;
+                    }
+                }
+                break;
+
+            case 'down':
+                
+                if (row === rowCount - 1) {
+                    return false;
+                
+                } else {
+                    if (!e.ctrlKey) {
+                        newPos.row = row + 1;
+                    } else {
+                        newPos.row = rowCount - 1;
+                    }
+                }
+                break;
+        }
+
+        if (verifierFn && verifierFn.call(scope || window, newPos) !== true) {
+            return false;
+        } else {
+            return newPos;
+        }
+    },
+    getFirstVisibleColumnIndex: function() {
+        var headerCt   = this.getHeaderCt(),
+            allColumns = headerCt.getGridColumns(),
+            visHeaders = Ext.ComponentQuery.query(':not([hidden])', allColumns),
+            firstHeader = visHeaders[0];
+
+        return headerCt.getHeaderIndex(firstHeader);
+    },
+
+    getLastVisibleColumnIndex: function() {
+        var headerCt   = this.getHeaderCt(),
+            allColumns = headerCt.getGridColumns(),
+            visHeaders = Ext.ComponentQuery.query(':not([hidden])', allColumns),
+            lastHeader = visHeaders[visHeaders.length - 1];
+
+        return headerCt.getHeaderIndex(lastHeader);
+    },
+
+    getHeaderCt: function() {
+        return this.headerCt;
+    },
+
+    getPosition: function(record, header) {
+        var me = this,
+            store = me.store,
+            gridCols = me.headerCt.getGridColumns();
+
+        return {
+            row: store.indexOf(record),
+            column: Ext.Array.indexOf(gridCols, header)
+        };
+    },
+
+    
+    getRightGap: function(activeHeader) {
+        var headerCt        = this.getHeaderCt(),
+            headers         = headerCt.getGridColumns(),
+            activeHeaderIdx = Ext.Array.indexOf(headers, activeHeader),
+            i               = activeHeaderIdx + 1,
+            nextIdx;
+
+        for (; i <= headers.length; i++) {
+            if (!headers[i].hidden) {
+                nextIdx = i;
+                break;
+            }
+        }
+
+        return nextIdx - activeHeaderIdx;
+    },
+
+    beforeDestroy: function() {
+        if (this.rendered) {
+            this.el.removeAllListeners();
+        }
+        this.callParent(arguments);
+    },
+
+    
+    getLeftGap: function(activeHeader) {
+        var headerCt        = this.getHeaderCt(),
+            headers         = headerCt.getGridColumns(),
+            activeHeaderIdx = Ext.Array.indexOf(headers, activeHeader),
+            i               = activeHeaderIdx - 1,
+            prevIdx;
+
+        for (; i >= 0; i--) {
+            if (!headers[i].hidden) {
+                prevIdx = i;
+                break;
+            }
+        }
+
+        return prevIdx - activeHeaderIdx;
+    }
+});
+
+Ext.define('Ext.grid.View', {
+    extend: 'Ext.view.Table',
+    alias: 'widget.gridview',
+
+    
+    stripeRows: true,
+
+    invalidateScrollerOnRefresh: true,
+
+    
+    scrollToTop : function(){
+        if (this.rendered) {
+            var section = this.ownerCt,
+                verticalScroller = section.verticalScroller;
+
+            if (verticalScroller) {
+                verticalScroller.scrollToTop();
+            }
+        }
+    },
+
+    
+    onAdd: function(ds, records, index) {
+        this.callParent(arguments);
+        this.doStripeRows(index);
+    },
+
+    
+    onRemove: function(ds, records, index) {
+        this.callParent(arguments);
+        this.doStripeRows(index);
+    },
+
+    onUpdate: function(ds, record, operation) {
+        var index = ds.indexOf(record);
+        this.callParent(arguments);
+        this.doStripeRows(index, index);
+    },
+
+    
+    doStripeRows: function(startRow, endRow) {
+        
+        if (this.stripeRows) {
+            var rows   = this.getNodes(startRow, endRow),
+                rowsLn = rows.length,
+                i      = 0,
+                row;
+
+            for (; i < rowsLn; i++) {
+                row = rows[i];
+                
+                row.className = row.className.replace(this.rowClsRe, ' ');
+                startRow++;
+                
+                if (startRow % 2 === 0) {
+                    row.className += (' ' + this.altRowCls);
+                }
+            }
+        }
+    },
+
+    refresh: function(firstPass) {
+        this.callParent(arguments);
+        this.doStripeRows(0);
+        
+        var g = this.up('gridpanel');
+        if (g && this.invalidateScrollerOnRefresh) {
+            g.invalidateScroller();
+        }
+    }
+});
+
+
+Ext.define('Ext.grid.Panel', {
+    extend: 'Ext.panel.Table',
+    requires: ['Ext.grid.View'],
+    alias: ['widget.gridpanel', 'widget.grid'],
+    alternateClassName: ['Ext.list.ListView', 'Ext.ListView', 'Ext.grid.GridPanel'],
+    viewType: 'gridview',
+
+    lockable: false,
+
+    
+    
+    normalCfgCopy: ['invalidateScrollerOnRefresh', 'verticalScroller', 'verticalScrollDock', 'verticalScrollerType', 'scroll'],
+    lockedCfgCopy: ['invalidateScrollerOnRefresh'],
+
+    
+
+    initComponent: function() {
+        var me = this;
+
+        if (me.columnLines) {
+            me.setColumnLines(me.columnLines);
+        }
+
+        me.callParent();
+    },
+
+    setColumnLines: function(show) {
+        var me = this,
+            method = (show) ? 'addClsWithUI' : 'removeClsWithUI';
+
+        me[method]('with-col-lines');
+    }
+});
+
+
+
+
+
+
+
+
+
+
+Ext.define('Ext.grid.RowEditor', {
+    extend: 'Ext.form.Panel',
+    requires: [
+        'Ext.tip.ToolTip',
+        'Ext.util.HashMap',
+        'Ext.util.KeyNav'
+    ],
+
+    saveBtnText  : 'Update',
+    cancelBtnText: 'Cancel',
+    errorsText: 'Errors',
+    dirtyText: 'You need to commit or cancel your changes',
+
+    lastScrollLeft: 0,
+    lastScrollTop: 0,
+
+    border: false,
+    
+    
+    
+    hideMode: 'offsets',
+
+    initComponent: function() {
+        var me = this,
+            form;
+
+        me.cls = Ext.baseCSSPrefix + 'grid-row-editor';
+
+        me.layout = {
+            type: 'hbox',
+            align: 'middle'
+        };
+
+        
+        
+        me.columns = Ext.create('Ext.util.HashMap');
+        me.columns.getKey = function(columnHeader) {
+            var f;
+            if (columnHeader.getEditor) {
+                f = columnHeader.getEditor();
+                if (f) {
+                    return f.id;
+                }
+            }
+            return columnHeader.id;
+        };
+        me.mon(me.columns, {
+            add: me.onFieldAdd,
+            remove: me.onFieldRemove,
+            replace: me.onFieldReplace,
+            scope: me
+        });
+
+        me.callParent(arguments);
+
+        if (me.fields) {
+            me.setField(me.fields);
+            delete me.fields;
+        }
+
+        form = me.getForm();
+        form.trackResetOnLoad = true;
+    },
+
+    onFieldChange: function() {
+        var me = this,
+            form = me.getForm(),
+            valid = form.isValid();
+        if (me.errorSummary && me.isVisible()) {
+            me[valid ? 'hideToolTip' : 'showToolTip']();
+        }
+        if (me.floatingButtons) {
+            me.floatingButtons.child('#update').setDisabled(!valid);
+        }
+        me.isValid = valid;
+    },
+
+    afterRender: function() {
+        var me = this,
+            plugin = me.editingPlugin;
+
+        me.callParent(arguments);
+        me.mon(me.renderTo, 'scroll', me.onCtScroll, me, { buffer: 100 });
+
+        
+        me.mon(me.el, {
+            click: Ext.emptyFn,
+            stopPropagation: true
+        });
+
+        me.el.swallowEvent([
+            'keypress',
+            'keydown'
+        ]);
+
+        me.keyNav = Ext.create('Ext.util.KeyNav', me.el, {
+            enter: plugin.completeEdit,
+            esc: plugin.onEscKey,
+            scope: plugin
+        });
+
+        me.mon(plugin.view, {
+            beforerefresh: me.onBeforeViewRefresh,
+            refresh: me.onViewRefresh,
+            scope: me
+        });
+    },
+
+    onBeforeViewRefresh: function(view) {
+        var me = this,
+            viewDom = view.el.dom;
+
+        if (me.el.dom.parentNode === viewDom) {
+            viewDom.removeChild(me.el.dom);
+        }
+    },
+
+    onViewRefresh: function(view) {
+        var me = this,
+            viewDom = view.el.dom,
+            context = me.context,
+            idx;
+
+        viewDom.appendChild(me.el.dom);
+
+        
+        if (context && (idx = context.store.indexOf(context.record)) >= 0) {
+            context.row = view.getNode(idx);
+            me.reposition();
+            if (me.tooltip && me.tooltip.isVisible()) {
+                me.tooltip.setTarget(context.row);
+            }
+        } else {
+            me.editingPlugin.cancelEdit();
+        }
+    },
+
+    onCtScroll: function(e, target) {
+        var me = this,
+            scrollTop  = target.scrollTop,
+            scrollLeft = target.scrollLeft;
+
+        if (scrollTop !== me.lastScrollTop) {
+            me.lastScrollTop = scrollTop;
+            if ((me.tooltip && me.tooltip.isVisible()) || me.hiddenTip) {
+                me.repositionTip();
+            }
+        }
+        if (scrollLeft !== me.lastScrollLeft) {
+            me.lastScrollLeft = scrollLeft;
+            me.reposition();
+        }
+    },
+
+    onColumnAdd: function(column) {
+        this.setField(column);
+    },
+
+    onColumnRemove: function(column) {
+        this.columns.remove(column);
+    },
+
+    onColumnResize: function(column, width) {
+        column.getEditor().setWidth(width - 2);
+        if (this.isVisible()) {
+            this.reposition();
+        }
+    },
+
+    onColumnHide: function(column) {
+        column.getEditor().hide();
+        if (this.isVisible()) {
+            this.reposition();
+        }
+    },
+
+    onColumnShow: function(column) {
+        var field = column.getEditor();
+        field.setWidth(column.getWidth() - 2).show();
+        if (this.isVisible()) {
+            this.reposition();
+        }
+    },
+
+    onColumnMove: function(column, fromIdx, toIdx) {
+        var field = column.getEditor();
+        if (this.items.indexOf(field) != toIdx) {
+            this.move(fromIdx, toIdx);
+        }
+    },
+
+    onFieldAdd: function(map, fieldId, column) {
+        var me = this,
+            colIdx = me.editingPlugin.grid.headerCt.getHeaderIndex(column),
+            field = column.getEditor({ xtype: 'displayfield' });
+
+        me.insert(colIdx, field);
+    },
+
+    onFieldRemove: function(map, fieldId, column) {
+        var me = this,
+            field = column.getEditor(),
+            fieldEl = field.el;
+        me.remove(field, false);
+        if (fieldEl) {
+            fieldEl.remove();
+        }
+    },
+
+    onFieldReplace: function(map, fieldId, column, oldColumn) {
+        var me = this;
+        me.onFieldRemove(map, fieldId, oldColumn);
+    },
+
+    clearFields: function() {
+        var me = this,
+            map = me.columns;
+        map.each(function(fieldId) {
+            map.removeAtKey(fieldId);
+        });
+    },
+
+    getFloatingButtons: function() {
+        var me = this,
+            cssPrefix = Ext.baseCSSPrefix,
+            btnsCss = cssPrefix + 'grid-row-editor-buttons',
+            plugin = me.editingPlugin,
+            btns;
+
+        if (!me.floatingButtons) {
+            btns = me.floatingButtons = Ext.create('Ext.Container', {
+                renderTpl: [
+                    '<div class="{baseCls}-ml"></div>',
+                    '<div class="{baseCls}-mr"></div>',
+                    '<div class="{baseCls}-bl"></div>',
+                    '<div class="{baseCls}-br"></div>',
+                    '<div class="{baseCls}-bc"></div>'
+                ],
+
+                renderTo: me.el,
+                baseCls: btnsCss,
+                layout: {
+                    type: 'hbox',
+                    align: 'middle'
+                },
+                defaults: {
+                    margins: '0 1 0 1'
+                },
+                items: [{
+                    itemId: 'update',
+                    flex: 1,
+                    xtype: 'button',
+                    handler: plugin.completeEdit,
+                    scope: plugin,
+                    text: me.saveBtnText,
+                    disabled: !me.isValid
+                }, {
+                    flex: 1,
+                    xtype: 'button',
+                    handler: plugin.cancelEdit,
+                    scope: plugin,
+                    text: me.cancelBtnText
+                }]
+            });
+
+            
+            me.mon(btns.el, {
+                
+                
+                mousedown: Ext.emptyFn,
+                click: Ext.emptyFn,
+                stopEvent: true
+            });
+        }
+        return me.floatingButtons;
+    },
+
+    reposition: function(animateConfig) {
+        var me = this,
+            context = me.context,
+            row = context && Ext.get(context.row),
+            btns = me.getFloatingButtons(),
+            btnEl = btns.el,
+            grid = me.editingPlugin.grid,
+            viewEl = grid.view.el,
+            scroller = grid.verticalScroller,
+
+            
+            
+            mainBodyWidth = grid.headerCt.getFullWidth(),
+            scrollerWidth = grid.getWidth(),
+
+            
+            
+            width = Math.min(mainBodyWidth, scrollerWidth),
+            scrollLeft = grid.view.el.dom.scrollLeft,
+            btnWidth = btns.getWidth(),
+            left = (width - btnWidth) / 2 + scrollLeft,
+            y, rowH, newHeight,
+
+            invalidateScroller = function() {
+                if (scroller) {
+                    scroller.invalidate();
+                    btnEl.scrollIntoView(viewEl, false);
+                }
+                if (animateConfig && animateConfig.callback) {
+                    animateConfig.callback.call(animateConfig.scope || me);
+                }
+            };
+
+        
+        if (row && Ext.isElement(row.dom)) {
+            
+            
+            row.scrollIntoView(viewEl, false);
+
+            
+            
+            
+            y = row.getXY()[1] - 5;
+            rowH = row.getHeight();
+            newHeight = rowH + 10;
+
+            
+            
+            
+            
+            if (Ext.isIE) {
+                newHeight += 2;
+            }
+
+            
+            if (me.getHeight() != newHeight) {
+                me.setHeight(newHeight);
+                me.el.setLeft(0);
+            }
+
+            if (animateConfig) {
+                var animObj = {
+                    to: {
+                        y: y
+                    },
+                    duration: animateConfig.duration || 125,
+                    listeners: {
+                        afteranimate: function() {
+                            invalidateScroller();
+                            y = row.getXY()[1] - 5;
+                            me.el.setY(y);
+                        }
+                    }
+                };
+                me.animate(animObj);
+            } else {
+                me.el.setY(y);
+                invalidateScroller();
+            }
+        }
+        if (me.getWidth() != mainBodyWidth) {
+            me.setWidth(mainBodyWidth);
+        }
+        btnEl.setLeft(left);
+    },
+
+    getEditor: function(fieldInfo) {
+        var me = this;
+
+        if (Ext.isNumber(fieldInfo)) {
+            
+            
+            
+            return me.query('>[isFormField]')[fieldInfo];
+        } else if (fieldInfo instanceof Ext.grid.column.Column) {
+            return fieldInfo.getEditor();
+        }
+    },
+
+    removeField: function(field) {
+        var me = this;
+
+        
+        field = me.getEditor(field);
+        me.mun(field, 'validitychange', me.onValidityChange, me);
+
+        
+        
+        me.columns.removeKey(field.id);
+    },
+
+    setField: function(column) {
+        var me = this,
+            field;
+
+        if (Ext.isArray(column)) {
+            Ext.Array.forEach(column, me.setField, me);
+            return;
+        }
+
+        
+        field = column.getEditor(null, {
+            xtype: 'displayfield',
+            
+            
+            getModelData: function() {
+                return null;
+            }
+        });
+        field.margins = '0 0 0 2';
+        field.setWidth(column.getDesiredWidth() - 2);
+        me.mon(field, 'change', me.onFieldChange, me);
+
+        
+        
+        me.columns.add(field.id, column);
+        if (column.hidden) {
+            me.onColumnHide(column);
+        }
+        if (me.isVisible() && me.context) {
+            me.renderColumnData(field, me.context.record);
+        }
+    },
+
+    loadRecord: function(record) {
+        var me = this,
+            form = me.getForm();
+        form.loadRecord(record);
+        if (form.isValid()) {
+            me.hideToolTip();
+        } else {
+            me.showToolTip();
+        }
+
+        
+        Ext.Array.forEach(me.query('>displayfield'), function(field) {
+            me.renderColumnData(field, record);
+        }, me);
+    },
+
+    renderColumnData: function(field, record) {
+        var me = this,
+            grid = me.editingPlugin.grid,
+            headerCt = grid.headerCt,
+            view = grid.view,
+            store = view.store,
+            column = me.columns.get(field.id),
+            value = record.get(column.dataIndex);
+
+        
+        if (column.renderer) {
+            var metaData = { tdCls: '', style: '' },
+                rowIdx = store.indexOf(record),
+                colIdx = headerCt.getHeaderIndex(column);
+
+            value = column.renderer.call(
+                column.scope || headerCt.ownerCt,
+                value,
+                metaData,
+                record,
+                rowIdx,
+                colIdx,
+                store,
+                view
+            );
+        }
+
+        field.setRawValue(value);
+        field.resetOriginalValue();
+    },
+
+    beforeEdit: function() {
+        var me = this;
+
+        if (me.isVisible() && !me.autoCancel && me.isDirty()) {
+            me.showToolTip();
+            return false;
+        }
+    },
+
+    
+    startEdit: function(record, columnHeader) {
+        var me = this,
+            grid = me.editingPlugin.grid,
+            view = grid.getView(),
+            store = grid.store,
+            context = me.context = Ext.apply(me.editingPlugin.context, {
+                view: grid.getView(),
+                store: store
+            });
+
+        
+        context.grid.getSelectionModel().select(record);
+
+        
+        me.loadRecord(record);
+
+        if (!me.isVisible()) {
+            me.show();
+            me.focusContextCell();
+        } else {
+            me.reposition({
+                callback: this.focusContextCell
+            });
+        }
+    },
+
+    
+    focusContextCell: function() {
+        var field = this.getEditor(this.context.colIdx);
+        if (field && field.focus) {
+            field.focus();
+        }
+    },
+
+    cancelEdit: function() {
+        var me = this,
+            form = me.getForm();
+
+        me.hide();
+        form.clearInvalid();
+        form.reset();
+    },
+
+    completeEdit: function() {
+        var me = this,
+            form = me.getForm();
+
+        if (!form.isValid()) {
+            return;
+        }
+
+        form.updateRecord(me.context.record);
+        me.hide();
+        return true;
+    },
+
+    onShow: function() {
+        var me = this;
+        me.callParent(arguments);
+        me.reposition();
+    },
+
+    onHide: function() {
+        var me = this;
+        me.callParent(arguments);
+        me.hideToolTip();
+        me.invalidateScroller();
+        if (me.context) {
+            me.context.view.focus();
+            me.context = null;
+        }
+    },
+
+    isDirty: function() {
+        var me = this,
+            form = me.getForm();
+        return form.isDirty();
+    },
+
+    getToolTip: function() {
+        var me = this,
+            tip;
+
+        if (!me.tooltip) {
+            tip = me.tooltip = Ext.createWidget('tooltip', {
+                cls: Ext.baseCSSPrefix + 'grid-row-editor-errors',
+                title: me.errorsText,
+                autoHide: false,
+                closable: true,
+                closeAction: 'disable',
+                anchor: 'left'
+            });
+        }
+        return me.tooltip;
+    },
+
+    hideToolTip: function() {
+        var me = this,
+            tip = me.getToolTip();
+        if (tip.rendered) {
+            tip.disable();
+        }
+        me.hiddenTip = false;
+    },
+
+    showToolTip: function() {
+        var me = this,
+            tip = me.getToolTip(),
+            context = me.context,
+            row = Ext.get(context.row),
+            viewEl = context.grid.view.el;
+
+        tip.setTarget(row);
+        tip.showAt([-10000, -10000]);
+        tip.body.update(me.getErrors());
+        tip.mouseOffset = [viewEl.getWidth() - row.getWidth() + me.lastScrollLeft + 15, 0];
+        me.repositionTip();
+        tip.doLayout();
+        tip.enable();
+    },
+
+    repositionTip: function() {
+        var me = this,
+            tip = me.getToolTip(),
+            context = me.context,
+            row = Ext.get(context.row),
+            viewEl = context.grid.view.el,
+            viewHeight = viewEl.getHeight(),
+            viewTop = me.lastScrollTop,
+            viewBottom = viewTop + viewHeight,
+            rowHeight = row.getHeight(),
+            rowTop = row.dom.offsetTop,
+            rowBottom = rowTop + rowHeight;
+
+        if (rowBottom > viewTop && rowTop < viewBottom) {
+            tip.show();
+            me.hiddenTip = false;
+        } else {
+            tip.hide();
+            me.hiddenTip = true;
+        }
+    },
+
+    getErrors: function() {
+        var me = this,
+            dirtyText = !me.autoCancel && me.isDirty() ? me.dirtyText + '<br />' : '',
+            errors = [];
+
+        Ext.Array.forEach(me.query('>[isFormField]'), function(field) {
+            errors = errors.concat(
+                Ext.Array.map(field.getErrors(), function(e) {
+                    return '<li>' + e + '</li>';
+                })
+            );
+        }, me);
+
+        return dirtyText + '<ul>' + errors.join('') + '</ul>';
+    },
+
+    invalidateScroller: function() {
+        var me = this,
+            context = me.context,
+            scroller = context.grid.verticalScroller;
+
+        if (scroller) {
+            scroller.invalidate();
+        }
+    }
+});
+
+Ext.define('Ext.grid.header.Container', {
+    extend: 'Ext.container.Container',
+    uses: [
+        'Ext.grid.ColumnLayout',
+        'Ext.grid.column.Column',
+        'Ext.menu.Menu',
+        'Ext.menu.CheckItem',
+        'Ext.menu.Separator',
+        'Ext.grid.plugin.HeaderResizer',
+        'Ext.grid.plugin.HeaderReorderer'
+    ],
+    border: true,
+
+    alias: 'widget.headercontainer',
+
+    baseCls: Ext.baseCSSPrefix + 'grid-header-ct',
+    dock: 'top',
+
+    
+    weight: 100,
+    defaultType: 'gridcolumn',
+    
+    defaultWidth: 100,
+
+
+    sortAscText: 'Sort Ascending',
+    sortDescText: 'Sort Descending',
+    sortClearText: 'Clear Sort',
+    columnsText: 'Columns',
+
+    lastHeaderCls: Ext.baseCSSPrefix + 'column-header-last',
+    firstHeaderCls: Ext.baseCSSPrefix + 'column-header-first',
+    headerOpenCls: Ext.baseCSSPrefix + 'column-header-open',
+
+    
+    triStateSort: false,
+
+    ddLock: false,
+
+    dragging: false,
+
+    
+
+    
+    sortable: true,
+
+    initComponent: function() {
+        var me = this;
+
+        me.headerCounter = 0;
+        me.plugins = me.plugins || [];
+
+        
+        
+
+        
+        
+        if (!me.isHeader) {
+            me.resizer   = Ext.create('Ext.grid.plugin.HeaderResizer');
+            me.reorderer = Ext.create('Ext.grid.plugin.HeaderReorderer');
+            if (!me.enableColumnResize) {
+                me.resizer.disable();
+            }
+            if (!me.enableColumnMove) {
+                me.reorderer.disable();
+            }
+            me.plugins.push(me.reorderer, me.resizer);
+        }
+
+        
+        if (me.isHeader && !me.items) {
+            me.layout = 'auto';
+        }
+        
+        else {
+            me.layout = {
+                type: 'gridcolumn',
+                availableSpaceOffset: me.availableSpaceOffset,
+                align: 'stretchmax',
+                resetStretch: true
+            };
+        }
+        me.defaults = me.defaults || {};
+        Ext.applyIf(me.defaults, {
+            width: me.defaultWidth,
+            triStateSort: me.triStateSort,
+            sortable: me.sortable
+        });
+        me.callParent();
+        me.addEvents(
+            
+            'columnresize',
+
+            
+            'headerclick',
+
+            
+            'headertriggerclick',
+
+            
+            'columnmove',
+            
+            'columnhide',
+            
+            'columnshow',
+            
+            'sortchange',
+            
+            'menucreate'
+        );
+    },
+
+    onDestroy: function() {
+        Ext.destroy(this.resizer, this.reorderer);
+        this.callParent();
+    },
+    
+    applyDefaults: function(config){
+        
+        if (config && !config.isComponent && config.xtype == 'rownumberer') {
+            return config;
+        }
+        return this.callParent([config]);
+    },
+
+    applyColumnsState: function(columns) {
+        if (!columns || !columns.length) {
+            return;
+        }
+
+        var me = this,
+            i = 0,
+            index,
+            col;
+
+        Ext.each(columns, function (columnState) {
+            col = me.down('gridcolumn[headerId=' + columnState.id + ']');
+            if (col) {
+                index = me.items.indexOf(col);
+                if (i !== index) {
+                    me.moveHeader(index, i);
+                }
+
+                if (col.applyColumnState) {
+                    col.applyColumnState(columnState);
+                }
+                ++i;
+            }
+        });
+    },
+
+    getColumnsState: function () {
+        var me = this,
+            columns = [],
+            state;
+
+        me.items.each(function (col) {
+            state = col.getColumnState && col.getColumnState();
+            if (state) {
+                columns.push(state);
+            }
+        });
+
+        return columns;
+    },
+
+    
+    
+    
+    onAdd: function(c) {
+        var me = this;
+        if (!c.headerId) {
+            c.headerId = c.initialConfig.id || ('h' + (++me.headerCounter));
+        }
+        me.callParent(arguments);
+        me.purgeCache();
+    },
+
+    
+    
+    
+    onRemove: function(c) {
+        var me = this;
+        me.callParent(arguments);
+        me.purgeCache();
+    },
+
+    afterRender: function() {
+        this.callParent();
+        var store   = this.up('[store]').store,
+            sorters = store.sorters,
+            first   = sorters.first(),
+            hd;
+
+        if (first) {
+            hd = this.down('gridcolumn[dataIndex=' + first.property  +']');
+            if (hd) {
+                hd.setSortState(first.direction, false, true);
+            }
+        }
+    },
+
+    afterLayout: function() {
+        if (!this.isHeader) {
+            var me = this,
+                topHeaders = me.query('>gridcolumn:not([hidden])'),
+                viewEl,
+                firstHeaderEl,
+                lastHeaderEl;
+
+            me.callParent(arguments);
+
+            if (topHeaders.length) {
+                firstHeaderEl = topHeaders[0].el;
+                if (firstHeaderEl !== me.pastFirstHeaderEl) {
+                    if (me.pastFirstHeaderEl) {
+                        me.pastFirstHeaderEl.removeCls(me.firstHeaderCls);
+                    }
+                    firstHeaderEl.addCls(me.firstHeaderCls);
+                    me.pastFirstHeaderEl = firstHeaderEl;
+                }
+
+                lastHeaderEl = topHeaders[topHeaders.length - 1].el;
+                if (lastHeaderEl !== me.pastLastHeaderEl) {
+                    if (me.pastLastHeaderEl) {
+                        me.pastLastHeaderEl.removeCls(me.lastHeaderCls);
+                    }
+                    lastHeaderEl.addCls(me.lastHeaderCls);
+                    me.pastLastHeaderEl = lastHeaderEl;
+                }
+            }
+        }
+
+    },
+
+    onHeaderShow: function(header, preventLayout) {
+        
+        var me = this,
+            gridSection = me.ownerCt,
+            menu = me.getMenu(),
+            topItems, topItemsVisible,
+            colCheckItem,
+            itemToEnable,
+            len, i;
+
+        if (menu) {
+
+            colCheckItem = menu.down('menucheckitem[headerId=' + header.id + ']');
+            if (colCheckItem) {
+                colCheckItem.setChecked(true, true);
+            }
+
+            
+            topItems = menu.query('#columnItem>menucheckitem[checked]');
+            topItemsVisible = topItems.length;
+            if ((me.getVisibleGridColumns().length > 1) && me.disabledMenuItems && me.disabledMenuItems.length) {
+                if (topItemsVisible == 1) {
+                    Ext.Array.remove(me.disabledMenuItems, topItems[0]);
+                }
+                for (i = 0, len = me.disabledMenuItems.length; i < len; i++) {
+                    itemToEnable = me.disabledMenuItems[i];
+                    if (!itemToEnable.isDestroyed) {
+                        itemToEnable[itemToEnable.menu ? 'enableCheckChange' : 'enable']();
+                    }
+                }
+                if (topItemsVisible == 1) {
+                    me.disabledMenuItems = topItems;
+                } else {
+                    me.disabledMenuItems = [];
+                }
+            }
+        }
+
+        
+        
+        if (!header.isGroupHeader) {
+            if (me.view) {
+                me.view.onHeaderShow(me, header, true);
+            }
+            if (gridSection) {
+                gridSection.onHeaderShow(me, header);
+            }
+        }
+        me.fireEvent('columnshow', me, header);
+
+        
+        if (preventLayout !== true) {
+            me.doLayout();
+        }
+    },
+
+    doComponentLayout: function(){
+        var me = this;
+        if (me.view && me.view.saveScrollState) {
+            me.view.saveScrollState();
+        }
+        me.callParent(arguments);
+        if (me.view && me.view.restoreScrollState) {
+            me.view.restoreScrollState();
+        }
+    },
+
+    onHeaderHide: function(header, suppressLayout) {
+        
+        var me = this,
+            gridSection = me.ownerCt,
+            menu = me.getMenu(),
+            colCheckItem;
+
+        if (menu) {
+
+            
+            colCheckItem = menu.down('menucheckitem[headerId=' + header.id + ']');
+            if (colCheckItem) {
+                colCheckItem.setChecked(false, true);
+            }
+            me.setDisabledItems();
+        }
+
+        
+        if (!header.isGroupHeader) {
+            if (me.view) {
+                me.view.onHeaderHide(me, header, true);
+            }
+            if (gridSection) {
+                gridSection.onHeaderHide(me, header);
+            }
+
+            
+            if (!suppressLayout) {
+                me.doLayout();
+            }
+        }
+        me.fireEvent('columnhide', me, header);
+    },
+
+    setDisabledItems: function(){
+        var me = this,
+            menu = me.getMenu(),
+            i = 0,
+            len,
+            itemsToDisable,
+            itemToDisable;
+
+        
+        itemsToDisable = menu.query('#columnItem>menucheckitem[checked]');
+        if ((itemsToDisable.length === 1)) {
+            if (!me.disabledMenuItems) {
+                me.disabledMenuItems = [];
+            }
+
+            
+            if ((me.getVisibleGridColumns().length === 1) && itemsToDisable[0].menu) {
+                itemsToDisable = itemsToDisable.concat(itemsToDisable[0].menu.query('menucheckitem[checked]'));
+            }
+
+            len = itemsToDisable.length;
+            
+            for (i = 0; i < len; i++) {
+                itemToDisable = itemsToDisable[i];
+                if (!Ext.Array.contains(me.disabledMenuItems, itemToDisable)) {
+
+                    
+                    
+                    itemToDisable.disabled = false;
+                    itemToDisable[itemToDisable.menu ? 'disableCheckChange' : 'disable']();
+                    me.disabledMenuItems.push(itemToDisable);
+                }
+            }
+        }
+    },
+
+    
+    tempLock: function() {
+        this.ddLock = true;
+        Ext.Function.defer(function() {
+            this.ddLock = false;
+        }, 200, this);
+    },
+
+    onHeaderResize: function(header, w, suppressFocus) {
+        this.tempLock();
+        if (this.view && this.view.rendered) {
+            this.view.onHeaderResize(header, w, suppressFocus);
+        }
+    },
+
+    onHeaderClick: function(header, e, t) {
+        this.fireEvent("headerclick", this, header, e, t);
+    },
+
+    onHeaderTriggerClick: function(header, e, t) {
+        
+        if (this.fireEvent("headertriggerclick", this, header, e, t) !== false) {
+            this.showMenuBy(t, header);
+        }
+    },
+
+    showMenuBy: function(t, header) {
+        var menu = this.getMenu(),
+            ascItem  = menu.down('#ascItem'),
+            descItem = menu.down('#descItem'),
+            sortableMth;
+
+        menu.activeHeader = menu.ownerCt = header;
+        menu.setFloatParent(header);
+        
+        header.titleContainer.addCls(this.headerOpenCls);
+
+        
+        sortableMth = header.sortable ? 'enable' : 'disable';
+        if (ascItem) {
+            ascItem[sortableMth]();
+        }
+        if (descItem) {
+            descItem[sortableMth]();
+        }
+        menu.showBy(t);
+    },
+
+    
+    onMenuDeactivate: function() {
+        var menu = this.getMenu();
+        
+        menu.activeHeader.titleContainer.removeCls(this.headerOpenCls);
+    },
+
+    moveHeader: function(fromIdx, toIdx) {
+
+        
+        this.tempLock();
+        this.onHeaderMoved(this.move(fromIdx, toIdx), fromIdx, toIdx);
+    },
+
+    purgeCache: function() {
+        var me = this;
+        
+        delete me.gridDataColumns;
+        delete me.hideableColumns;
+
+        
+        if (me.menu) {
+            me.menu.destroy();
+            delete me.menu;
+        }
+    },
+
+    onHeaderMoved: function(header, fromIdx, toIdx) {
+        var me = this,
+            gridSection = me.ownerCt;
+
+        if (gridSection && gridSection.onHeaderMove) {
+            gridSection.onHeaderMove(me, header, fromIdx, toIdx);
+        }
+        me.fireEvent("columnmove", me, header, fromIdx, toIdx);
+    },
+
+    
+    getMenu: function() {
+        var me = this;
+
+        if (!me.menu) {
+            me.menu = Ext.create('Ext.menu.Menu', {
+                hideOnParentHide: false,  
+                items: me.getMenuItems(),
+                listeners: {
+                    deactivate: me.onMenuDeactivate,
+                    scope: me
+                }
+            });
+            me.setDisabledItems();
+            me.fireEvent('menucreate', me, me.menu);
+        }
+        return me.menu;
+    },
+
+    
+    getMenuItems: function() {
+        var me = this,
+            menuItems = [],
+            hideableColumns = me.enableColumnHide ? me.getColumnMenu(me) : null;
+
+        if (me.sortable) {
+            menuItems = [{
+                itemId: 'ascItem',
+                text: me.sortAscText,
+                cls: Ext.baseCSSPrefix + 'hmenu-sort-asc',
+                handler: me.onSortAscClick,
+                scope: me
+            },{
+                itemId: 'descItem',
+                text: me.sortDescText,
+                cls: Ext.baseCSSPrefix + 'hmenu-sort-desc',
+                handler: me.onSortDescClick,
+                scope: me
+            }];
+        }
+        if (hideableColumns && hideableColumns.length) {
+            menuItems.push('-', {
+                itemId: 'columnItem',
+                text: me.columnsText,
+                cls: Ext.baseCSSPrefix + 'cols-icon',
+                menu: hideableColumns
+            });
+        }
+        return menuItems;
+    },
+
+    
+    onSortAscClick: function() {
+        var menu = this.getMenu(),
+            activeHeader = menu.activeHeader;
+
+        activeHeader.setSortState('ASC');
+    },
+
+    
+    onSortDescClick: function() {
+        var menu = this.getMenu(),
+            activeHeader = menu.activeHeader;
+
+        activeHeader.setSortState('DESC');
+    },
+
+    
+    getColumnMenu: function(headerContainer) {
+        var menuItems = [],
+            i = 0,
+            item,
+            items = headerContainer.query('>gridcolumn[hideable]'),
+            itemsLn = items.length,
+            menuItem;
+
+        for (; i < itemsLn; i++) {
+            item = items[i];
+            menuItem = Ext.create('Ext.menu.CheckItem', {
+                text: item.text,
+                checked: !item.hidden,
+                hideOnClick: false,
+                headerId: item.id,
+                menu: item.isGroupHeader ? this.getColumnMenu(item) : undefined,
+                checkHandler: this.onColumnCheckChange,
+                scope: this
+            });
+            if (itemsLn === 1) {
+                menuItem.disabled = true;
+            }
+            menuItems.push(menuItem);
+
+            
+            
+            item.on({
+                destroy: Ext.Function.bind(menuItem.destroy, menuItem)
+            });
+        }
+        return menuItems;
+    },
+
+    onColumnCheckChange: function(checkItem, checked) {
+        var header = Ext.getCmp(checkItem.headerId);
+        header[checked ? 'show' : 'hide']();
+    },
+
+    
+    getColumnsForTpl: function(flushCache) {
+        var cols    = [],
+            headers   = this.getGridColumns(flushCache),
+            headersLn = headers.length,
+            i = 0,
+            header,
+            width;
+
+        for (; i < headersLn; i++) {
+            header = headers[i];
+
+            if (header.hidden || header.up('headercontainer[hidden=true]')) {
+                width = 0;
+            } else {
+                width = header.getDesiredWidth();
+                
+                
+                
+                if ((i === 0) && (Ext.isIE6 || Ext.isIE7)) {
+                    width += 1;
+                }
+            }
+            cols.push({
+                dataIndex: header.dataIndex,
+                align: header.align,
+                width: width,
+                id: header.id,
+                cls: header.tdCls,
+                columnId: header.getItemId()
+            });
+        }
+        return cols;
+    },
+
+    
+    getColumnCount: function() {
+        return this.getGridColumns().length;
+    },
+
+    
+    getFullWidth: function(flushCache) {
+        var fullWidth = 0,
+            headers     = this.getVisibleGridColumns(flushCache),
+            headersLn   = headers.length,
+            i         = 0;
+
+        for (; i < headersLn; i++) {
+            if (!isNaN(headers[i].width)) {
+                
+                if (headers[i].getDesiredWidth) {
+                    fullWidth += headers[i].getDesiredWidth();
+                
+                } else {
+                    fullWidth += headers[i].getWidth();
+                }
+            }
+        }
+        return fullWidth;
+    },
+
+    
+    clearOtherSortStates: function(activeHeader) {
+        var headers   = this.getGridColumns(),
+            headersLn = headers.length,
+            i         = 0,
+            oldSortState;
+
+        for (; i < headersLn; i++) {
+            if (headers[i] !== activeHeader) {
+                oldSortState = headers[i].sortState;
+                
+                headers[i].setSortState(null, true);
+                
+                
+                
+            }
+        }
+    },
+
+    
+    getVisibleGridColumns: function(refreshCache) {
+        return Ext.ComponentQuery.query(':not([hidden])', this.getGridColumns(refreshCache));
+    },
+
+    
+    getGridColumns: function(refreshCache) {
+        var me = this,
+            result = refreshCache ? null : me.gridDataColumns;
+
+        
+        if (!result) {
+            me.gridDataColumns = result = [];
+            me.cascade(function(c) {
+                if ((c !== me) && !c.isGroupHeader) {
+                    result.push(c);
+                }
+            });
+        }
+
+        return result;
+    },
+
+    
+    getHideableColumns: function(refreshCache) {
+        var me = this,
+            result = refreshCache ? null : me.hideableColumns;
+
+        if (!result) {
+            result = me.hideableColumns = me.query('[hideable]');
+        }
+        return result;
+    },
+
+    
+    getHeaderIndex: function(header) {
+        var columns = this.getGridColumns();
+        return Ext.Array.indexOf(columns, header);
+    },
+
+    
+    getHeaderAtIndex: function(index) {
+        var columns = this.getGridColumns();
+        return columns[index];
+    },
+
+    
+    prepareData: function(data, rowIdx, record, view, panel) {
+        var obj       = {},
+            headers   = this.gridDataColumns || this.getGridColumns(),
+            headersLn = headers.length,
+            colIdx    = 0,
+            header,
+            headerId,
+            renderer,
+            value,
+            metaData,
+            store = panel.store;
+
+        for (; colIdx < headersLn; colIdx++) {
+            metaData = {
+                tdCls: '',
+                style: ''
+            };
+            header = headers[colIdx];
+            headerId = header.id;
+            renderer = header.renderer;
+            value = data[header.dataIndex];
+
+            
+            
+            if (typeof renderer === "string") {
+                header.renderer = renderer = Ext.util.Format[renderer];
+            }
+
+            if (typeof renderer === "function") {
+                value = renderer.call(
+                    header.scope || this.ownerCt,
+                    value,
+                    
+                    
+                    metaData,
+                    record,
+                    rowIdx,
+                    colIdx,
+                    store,
+                    view
+                );
+            }
+
+
+            obj[headerId+'-modified'] = record.isModified(header.dataIndex) ? Ext.baseCSSPrefix + 'grid-dirty-cell' : '';
+            obj[headerId+'-tdCls'] = metaData.tdCls;
+            obj[headerId+'-tdAttr'] = metaData.tdAttr;
+            obj[headerId+'-style'] = metaData.style;
+            if (value === undefined || value === null || value === '') {
+                value = ' ';
+            }
+            obj[headerId] = value;
+        }
+        return obj;
+    },
+
+    expandToFit: function(header) {
+        if (this.view) {
+            this.view.expandToFit(header);
+        }
+    }
+});
+
+
+Ext.define('Ext.grid.column.Column', {
+    extend: 'Ext.grid.header.Container',
+    alias: 'widget.gridcolumn',
+    requires: ['Ext.util.KeyNav'],
+    alternateClassName: 'Ext.grid.Column',
+
+    baseCls: Ext.baseCSSPrefix + 'column-header ' + Ext.baseCSSPrefix + 'unselectable',
+
+    
+    hoverCls: Ext.baseCSSPrefix + 'column-header-over',
+
+    handleWidth: 5,
+
+    sortState: null,
+
+    possibleSortStates: ['ASC', 'DESC'],
+
+    renderTpl:
+        '<div id="{id}-titleContainer" class="' + Ext.baseCSSPrefix + 'column-header-inner">' +
+            '<span id="{id}-textEl" class="' + Ext.baseCSSPrefix + 'column-header-text">' +
+                '{text}' +
+            '</span>' +
+            '<tpl if="!values.menuDisabled">'+
+                '<div id="{id}-triggerEl" class="' + Ext.baseCSSPrefix + 'column-header-trigger"></div>'+
+            '</tpl>' +
+        '</div>',
+
+    
+
+    
+    dataIndex: null,
+
+    
+    text: ' ',
+
+    
+    sortable: true,
+
+    
+
+    
+
+    
+
+    
+    hideable: true,
+
+    
+    menuDisabled: false,
+
+    
+    renderer: false,
+
+    
+    align: 'left',
+
+    
+    draggable: true,
+
+    
+    
+    initDraggable: Ext.emptyFn,
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    isHeader: true,
+
+    initComponent: function() {
+        var me = this,
+            i,
+            len,
+            item;
+
+        if (Ext.isDefined(me.header)) {
+            me.text = me.header;
+            delete me.header;
+        }
+
+        
+        
+        
+        if (me.flex) {
+            me.minWidth = me.minWidth || Ext.grid.plugin.HeaderResizer.prototype.minColWidth;
+        }
+        
+        
+        else {
+            me.minWidth = me.width;
+        }
+
+        if (!me.triStateSort) {
+            me.possibleSortStates.length = 2;
+        }
+
+        
+        if (Ext.isDefined(me.columns)) {
+            me.isGroupHeader = true;
+
+
+            
+            me.items = me.columns;
+            delete me.columns;
+            delete me.flex;
+            me.width = 0;
+
+            
+            for (i = 0, len = me.items.length; i < len; i++) {
+                item = me.items[i];
+                if (!item.hidden) {
+                    me.width += item.width || Ext.grid.header.Container.prototype.defaultWidth;
+                }
+            }
+            me.minWidth = me.width;
+
+            me.cls = (me.cls||'') + ' ' + Ext.baseCSSPrefix + 'group-header';
+            me.sortable = false;
+            me.resizable = false;
+            me.align = 'center';
+        }
+
+        me.addChildEls('titleContainer', 'triggerEl', 'textEl');
+
+        
+        me.callParent(arguments);
+    },
+
+    onAdd: function(childHeader) {
+        childHeader.isSubHeader = true;
+        childHeader.addCls(Ext.baseCSSPrefix + 'group-sub-header');
+        this.callParent(arguments);
+    },
+
+    onRemove: function(childHeader) {
+        childHeader.isSubHeader = false;
+        childHeader.removeCls(Ext.baseCSSPrefix + 'group-sub-header');
+        this.callParent(arguments);
+    },
+
+    initRenderData: function() {
+        var me = this;
+
+        Ext.applyIf(me.renderData, {
+            text: me.text,
+            menuDisabled: me.menuDisabled
+        });
+        return me.callParent(arguments);
+    },
+
+    applyColumnState: function (state) {
+        var me = this,
+            defined = Ext.isDefined;
+            
+        
+        me.applyColumnsState(state.columns);
+
+        
+        
+        if (defined(state.hidden)) {
+            me.hidden = state.hidden;
+        }
+        if (defined(state.locked)) {
+            me.locked = state.locked;
+        }
+        if (defined(state.sortable)) {
+            me.sortable = state.sortable;
+        }
+        if (defined(state.width)) {
+            delete me.flex;
+            me.width = state.width;
+        } else if (defined(state.flex)) {
+            delete me.width;
+            me.flex = state.flex;
+        }
+    },
+
+    getColumnState: function () {
+        var me = this,
+            columns = [],
+            state = {
+                id: me.headerId
+            };
+
+        me.savePropsToState(['hidden', 'sortable', 'locked', 'flex', 'width'], state);
+        
+        if (me.isGroupHeader) {
+            me.items.each(function(column){
+                columns.push(column.getColumnState());
+            });
+            if (columns.length) {
+                state.columns = columns;
+            }
+        } else if (me.isSubHeader && me.ownerCt.hidden) {
+            
+            delete me.hidden;
+        }
+
+        if ('width' in state) {
+            delete state.flex; 
+        }
+        return state;
+    },
+
+    
+    setText: function(text) {
+        this.text = text;
+        if (this.rendered) {
+            this.textEl.update(text);
+        }
+    },
+
+    
+    
+    getOwnerHeaderCt: function() {
+        return this.up(':not([isHeader])');
+    },
+
+    
+    getIndex: function() {
+        return this.isGroupColumn ? false : this.getOwnerHeaderCt().getHeaderIndex(this);
+    },
+
+    onRender: function() {
+        var me = this,
+            grid = me.up('tablepanel');
+
+        
+        
+        if (grid && (!me.sortable || grid.sortableColumns === false) && !me.groupable && !me.lockable && (grid.enableColumnHide === false || !me.getOwnerHeaderCt().getHideableColumns().length)) {
+            me.menuDisabled = true;
+        }
+        me.callParent(arguments);
+    },
+
+    afterRender: function() {
+        var me = this,
+            el = me.el;
+
+        me.callParent(arguments);
+
+        el.addCls(Ext.baseCSSPrefix + 'column-header-align-' + me.align).addClsOnOver(me.overCls);
+
+        me.mon(el, {
+            click:     me.onElClick,
+            dblclick:  me.onElDblClick,
+            scope:     me
+        });
+
+        
+        
+        if (!Ext.isIE8 || !Ext.isStrict) {
+            me.mon(me.getFocusEl(), {
+                focus: me.onTitleMouseOver,
+                blur: me.onTitleMouseOut,
+                scope: me
+            });
+        }
+
+        me.mon(me.titleContainer, {
+            mouseenter:  me.onTitleMouseOver,
+            mouseleave:  me.onTitleMouseOut,
+            scope:      me
+        });
+
+        me.keyNav = Ext.create('Ext.util.KeyNav', el, {
+            enter: me.onEnterKey,
+            down: me.onDownKey,
+            scope: me
+        });
+    },
+
+    
+    setWidth: function(width,  doLayout) {
+        var me = this,
+            headerCt = me.ownerCt,
+            siblings,
+            len, i,
+            oldWidth = me.getWidth(),
+            groupWidth = 0,
+            sibling;
+
+        if (width !== oldWidth) {
+            me.oldWidth = oldWidth;
+
+            
+            
+            me.minWidth = me.width = width;
+
+            
+            if (headerCt.isGroupHeader) {
+                siblings = headerCt.items.items;
+                len = siblings.length;
+
+                for (i = 0; i < len; i++) {
+                    sibling = siblings[i];
+                    if (!sibling.hidden) {
+                        groupWidth += (sibling === me) ? width : sibling.getWidth();
+                    }
+                }
+                headerCt.setWidth(groupWidth, doLayout);
+            } else if (doLayout !== false) {
+                
+                headerCt.doLayout();
+            }
+        }
+    },
+
+    afterComponentLayout: function(width, height) {
+        var me = this,
+            ownerHeaderCt = this.getOwnerHeaderCt();
+
+        me.callParent(arguments);
+
+        
+        
+        
+        if (width && !me.isGroupHeader && ownerHeaderCt) {
+            ownerHeaderCt.onHeaderResize(me, width, true);
+        }
+        if (me.oldWidth && (width !== me.oldWidth)) {
+            ownerHeaderCt.fireEvent('columnresize', ownerHeaderCt, this, width);
+        }
+        delete me.oldWidth;
+    },
+
+    
+    
+    
+    setPadding: function(headerHeight) {
+        var me = this,
+            lineHeight = Ext.util.TextMetrics.measure(me.textEl.dom, me.text).height;
+
+        
+        if (!me.isGroupHeader) {
+            if (me.titleContainer.getHeight() < headerHeight) {
+                me.titleContainer.dom.style.height = headerHeight + 'px';
+            }
+        }
+        headerHeight = me.titleContainer.getViewSize().height;
+
+        
+        if (lineHeight) {
+            me.titleContainer.setStyle({
+                paddingTop: Math.max(((headerHeight - lineHeight) / 2), 0) + 'px'
+            });
+        }
+
+        
+        if (Ext.isIE && me.triggerEl) {
+            me.triggerEl.setHeight(headerHeight);
+        }
+    },
+
+    onDestroy: function() {
+        var me = this;
+        
+        Ext.destroy(me.textEl, me.keyNav);
+        delete me.keyNav;
+        me.callParent(arguments);
+    },
+
+    onTitleMouseOver: function() {
+        this.titleContainer.addCls(this.hoverCls);
+    },
+
+    onTitleMouseOut: function() {
+        this.titleContainer.removeCls(this.hoverCls);
+    },
+
+    onDownKey: function(e) {
+        if (this.triggerEl) {
+            this.onElClick(e, this.triggerEl.dom || this.el.dom);
+        }
+    },
+
+    onEnterKey: function(e) {
+        this.onElClick(e, this.el.dom);
+    },
+
+    
+    onElDblClick: function(e, t) {
+        var me = this,
+            ownerCt = me.ownerCt;
+        if (ownerCt && Ext.Array.indexOf(ownerCt.items, me) !== 0 && me.isOnLeftEdge(e) ) {
+            ownerCt.expandToFit(me.previousSibling('gridcolumn'));
+        }
+    },
+
+    onElClick: function(e, t) {
+
+        
+        var me = this,
+            ownerHeaderCt = me.getOwnerHeaderCt();
+
+        if (ownerHeaderCt && !ownerHeaderCt.ddLock) {
+            
+            
+            if (me.triggerEl && (e.target === me.triggerEl.dom || t === me.triggerEl.dom || e.within(me.triggerEl))) {
+                ownerHeaderCt.onHeaderTriggerClick(me, e, t);
+            
+            } else if (e.getKey() || (!me.isOnLeftEdge(e) && !me.isOnRightEdge(e))) {
+                me.toggleSortState();
+                ownerHeaderCt.onHeaderClick(me, e, t);
+            }
+        }
+    },
+
+    
+    processEvent: function(type, view, cell, recordIndex, cellIndex, e) {
+        return this.fireEvent.apply(this, arguments);
+    },
+
+    toggleSortState: function() {
+        var me = this,
+            idx,
+            nextIdx;
+
+        if (me.sortable) {
+            idx = Ext.Array.indexOf(me.possibleSortStates, me.sortState);
+
+            nextIdx = (idx + 1) % me.possibleSortStates.length;
+            me.setSortState(me.possibleSortStates[nextIdx]);
+        }
+    },
+
+    doSort: function(state) {
+        var ds = this.up('tablepanel').store;
+        ds.sort({
+            property: this.getSortParam(),
+            direction: state
+        });
+    },
+
+    
+    getSortParam: function() {
+        return this.dataIndex;
+    },
+
+    
+    
+    setSortState: function(state, skipClear, initial) {
+        var me = this,
+            colSortClsPrefix = Ext.baseCSSPrefix + 'column-header-sort-',
+            ascCls = colSortClsPrefix + 'ASC',
+            descCls = colSortClsPrefix + 'DESC',
+            nullCls = colSortClsPrefix + 'null',
+            ownerHeaderCt = me.getOwnerHeaderCt(),
+            oldSortState = me.sortState;
+
+        if (oldSortState !== state && me.getSortParam()) {
+            me.addCls(colSortClsPrefix + state);
+            
+            if (state && !initial) {
+                me.doSort(state);
+            }
+            switch (state) {
+                case 'DESC':
+                    me.removeCls([ascCls, nullCls]);
+                    break;
+                case 'ASC':
+                    me.removeCls([descCls, nullCls]);
+                    break;
+                case null:
+                    me.removeCls([ascCls, descCls]);
+                    break;
+            }
+            if (ownerHeaderCt && !me.triStateSort && !skipClear) {
+                ownerHeaderCt.clearOtherSortStates(me);
+            }
+            me.sortState = state;
+            ownerHeaderCt.fireEvent('sortchange', ownerHeaderCt, me, state);
+        }
+    },
+
+    hide: function() {
+        var me = this,
+            items,
+            len, i,
+            lb,
+            newWidth = 0,
+            ownerHeaderCt = me.getOwnerHeaderCt();
+
+        
+        me.oldWidth = me.getWidth();
+
+        
+        if (me.isGroupHeader) {
+            items = me.items.items;
+            me.callParent(arguments);
+            ownerHeaderCt.onHeaderHide(me);
+            for (i = 0, len = items.length; i < len; i++) {
+                items[i].hidden = true;
+                ownerHeaderCt.onHeaderHide(items[i], true);
+            }
+            return;
+        }
+
+        
+        lb = me.ownerCt.componentLayout.layoutBusy;
+        me.ownerCt.componentLayout.layoutBusy = true;
+        me.callParent(arguments);
+        me.ownerCt.componentLayout.layoutBusy = lb;
+
+        
+        ownerHeaderCt.onHeaderHide(me);
+
+        if (me.ownerCt.isGroupHeader) {
+            
+            items = me.ownerCt.query('>:not([hidden])');
+            if (!items.length) {
+                me.ownerCt.hide();
+            }
+            
+            else {
+                for (i = 0, len = items.length; i < len; i++) {
+                    newWidth += items[i].getWidth();
+                }
+                me.ownerCt.minWidth = newWidth;
+                me.ownerCt.setWidth(newWidth);
+            }
+        }
+    },
+
+    show: function() {
+        var me = this,
+            ownerCt = me.ownerCt,
+            ownerCtCompLayout = ownerCt.componentLayout,
+            ownerCtCompLayoutBusy = ownerCtCompLayout.layoutBusy,
+            ownerCtLayout = ownerCt.layout,
+            ownerCtLayoutBusy = ownerCtLayout.layoutBusy,
+            items,
+            len, i,
+            item,
+            newWidth = 0;
+
+        
+
+        
+        ownerCtCompLayout.layoutBusy = ownerCtLayout.layoutBusy = true;
+
+        me.callParent(arguments);
+
+        ownerCtCompLayout.layoutBusy = ownerCtCompLayoutBusy;
+        ownerCtLayout.layoutBusy = ownerCtLayoutBusy;
+
+        
+        if (me.isSubHeader) {
+            if (!ownerCt.isVisible()) {
+                ownerCt.show();
+            }
+        }
+
+        
+        if (me.isGroupHeader && !me.query(':not([hidden])').length) {
+            items = me.query('>*');
+            for (i = 0, len = items.length; i < len; i++) {
+                item = items[i];
+                item.preventLayout = true;
+                item.show();
+                newWidth += item.getWidth();
+                delete item.preventLayout;
+            }
+            me.setWidth(newWidth);
+        }
+
+        
+        if (ownerCt.isGroupHeader && me.preventLayout !== true) {
+            items = ownerCt.query('>:not([hidden])');
+            for (i = 0, len = items.length; i < len; i++) {
+                newWidth += items[i].getWidth();
+            }
+            ownerCt.minWidth = newWidth;
+            ownerCt.setWidth(newWidth);
+        }
+
+        
+        ownerCt = me.getOwnerHeaderCt();
+        if (ownerCt) {
+            ownerCt.onHeaderShow(me, me.preventLayout);
+        }
+    },
+
+    getDesiredWidth: function() {
+        var me = this;
+        if (me.rendered && me.componentLayout && me.componentLayout.lastComponentSize) {
+            
+            
+            
+            
+            
+            
+            return me.componentLayout.lastComponentSize.width;
+        
+        
+        
+        }
+        else if (me.flex) {
+            
+            return me.width;
+        }
+        else {
+            return me.width;
+        }
+    },
+
+    getCellSelector: function() {
+        return '.' + Ext.baseCSSPrefix + 'grid-cell-' + this.getItemId();
+    },
+
+    getCellInnerSelector: function() {
+        return this.getCellSelector() + ' .' + Ext.baseCSSPrefix + 'grid-cell-inner';
+    },
+
+    isOnLeftEdge: function(e) {
+        return (e.getXY()[0] - this.el.getLeft() <= this.handleWidth);
+    },
+
+    isOnRightEdge: function(e) {
+        return (this.el.getRight() - e.getXY()[0] <= this.handleWidth);
+    }
+
+    
+    
+
+    
+    
+});
+
+
+Ext.define('Ext.grid.RowNumberer', {
+    extend: 'Ext.grid.column.Column',
+    alias: 'widget.rownumberer',
+
+    
+    text: "&#160",
+
+    
+    width: 23,
+
+    
+    sortable: false,
+
+    align: 'right',
+
+    constructor : function(config){
+        this.callParent(arguments);
+        if (this.rowspan) {
+            this.renderer = Ext.Function.bind(this.renderer, this);
+        }
+    },
+
+    
+    resizable: false,
+    hideable: false,
+    menuDisabled: true,
+    dataIndex: '',
+    cls: Ext.baseCSSPrefix + 'row-numberer',
+    rowspan: undefined,
+
+    
+    renderer: function(value, metaData, record, rowIdx, colIdx, store) {
+        if (this.rowspan){
+            metaData.cellAttr = 'rowspan="'+this.rowspan+'"';
+        }
+
+        metaData.tdCls = Ext.baseCSSPrefix + 'grid-cell-special';
+        return store.indexOfTotal(record) + 1;
+    }
+});
+
+
+Ext.define('Ext.view.DropZone', {
+    extend: 'Ext.dd.DropZone',
+
+    indicatorHtml: '<div class="x-grid-drop-indicator-left"></div><div class="x-grid-drop-indicator-right"></div>',
+    indicatorCls: 'x-grid-drop-indicator',
+
+    constructor: function(config) {
+        var me = this;
+        Ext.apply(me, config);
+
+        
+        
+        
+        
+        
+        if (!me.ddGroup) {
+            me.ddGroup = 'view-dd-zone-' + me.view.id;
+        }
+
+        
+        
+        
+        me.callParent([me.view.el]);
+    },
+
+
+
+    fireViewEvent: function() {
+        var me = this,
+            result;
+
+        me.lock();
+        result = me.view.fireEvent.apply(me.view, arguments);
+        me.unlock();
+        return result;
+    },
+
+    getTargetFromEvent : function(e) {
+        var node = e.getTarget(this.view.getItemSelector()),
+            mouseY, nodeList, testNode, i, len, box;
+
+
+
+        if (!node) {
+            mouseY = e.getPageY();
+            for (i = 0, nodeList = this.view.getNodes(), len = nodeList.length; i < len; i++) {
+                testNode = nodeList[i];
+                box = Ext.fly(testNode).getBox();
+                if (mouseY <= box.bottom) {
+                    return testNode;
+                }
+            }
+        }
+        return node;
+    },
+
+    getIndicator: function() {
+        var me = this;
+
+        if (!me.indicator) {
+            me.indicator = Ext.createWidget('component', {
+                html: me.indicatorHtml,
+                cls: me.indicatorCls,
+                ownerCt: me.view,
+                floating: true,
+                shadow: false
+            });
+        }
+        return me.indicator;
+    },
+
+    getPosition: function(e, node) {
+        var y      = e.getXY()[1],
+            region = Ext.fly(node).getRegion(),
+            pos;
+
+        if ((region.bottom - y) >= (region.bottom - region.top) / 2) {
+            pos = "before";
+        } else {
+            pos = "after";
+        }
+        return pos;
+    },
+
+    
+    containsRecordAtOffset: function(records, record, offset) {
+        if (!record) {
+            return false;
+        }
+        var view = this.view,
+            recordIndex = view.indexOf(record),
+            nodeBefore = view.getNode(recordIndex + offset),
+            recordBefore = nodeBefore ? view.getRecord(nodeBefore) : null;
+
+        return recordBefore && Ext.Array.contains(records, recordBefore);
+    },
+
+    positionIndicator: function(node, data, e) {
+        var me = this,
+            view = me.view,
+            pos = me.getPosition(e, node),
+            overRecord = view.getRecord(node),
+            draggingRecords = data.records,
+            indicator, indicatorY;
+
+        if (!Ext.Array.contains(draggingRecords, overRecord) && (
+            pos == 'before' && !me.containsRecordAtOffset(draggingRecords, overRecord, -1) ||
+            pos == 'after' && !me.containsRecordAtOffset(draggingRecords, overRecord, 1)
+        )) {
+            me.valid = true;
+
+            if (me.overRecord != overRecord || me.currentPosition != pos) {
+
+                indicatorY = Ext.fly(node).getY() - view.el.getY() - 1;
+                if (pos == 'after') {
+                    indicatorY += Ext.fly(node).getHeight();
+                }
+                me.getIndicator().setWidth(Ext.fly(view.el).getWidth()).showAt(0, indicatorY);
+
+                
+                me.overRecord = overRecord;
+                me.currentPosition = pos;
+            }
+        } else {
+            me.invalidateDrop();
+        }
+    },
+
+    invalidateDrop: function() {
+        if (this.valid) {
+            this.valid = false;
+            this.getIndicator().hide();
+        }
+    },
+
+    
+    onNodeOver: function(node, dragZone, e, data) {
+        var me = this;
+
+        if (!Ext.Array.contains(data.records, me.view.getRecord(node))) {
+            me.positionIndicator(node, data, e);
+        }
+        return me.valid ? me.dropAllowed : me.dropNotAllowed;
+    },
+
+    
+    
+    notifyOut: function(node, dragZone, e, data) {
+        var me = this;
+
+        me.callParent(arguments);
+        delete me.overRecord;
+        delete me.currentPosition;
+        if (me.indicator) {
+            me.indicator.hide();
+        }
+    },
+
+    
+    onContainerOver : function(dd, e, data) {
+        var me = this,
+            view = me.view,
+            count = view.store.getCount();
+
+        
+        if (count) {
+            me.positionIndicator(view.getNode(count - 1), data, e);
+        }
+
+        
+        else {
+            delete me.overRecord;
+            delete me.currentPosition;
+            me.getIndicator().setWidth(Ext.fly(view.el).getWidth()).showAt(0, 0);
+            me.valid = true;
+        }
+        return me.dropAllowed;
+    },
+
+    onContainerDrop : function(dd, e, data) {
+        return this.onNodeDrop(dd, null, e, data);
+    },
+
+    onNodeDrop: function(node, dragZone, e, data) {
+        var me = this,
+            dropped = false,
+
+            
+            
+            
+            
+            processDrop = function () {
+                me.invalidateDrop();
+                me.handleNodeDrop(data, me.overRecord, me.currentPosition);
+                dropped = true;
+                me.fireViewEvent('drop', node, data, me.overRecord, me.currentPosition);
+            },
+            performOperation = false;
+
+        if (me.valid) {
+            performOperation = me.fireViewEvent('beforedrop', node, data, me.overRecord, me.currentPosition, processDrop);
+            if (performOperation !== false) {
+                
+                if (!dropped) {
+                    processDrop();
+                }
+            }
+        }
+        return performOperation;
+    },
+    
+    destroy: function(){
+        Ext.destroy(this.indicator);
+        delete this.indicator;
+        this.callParent();
+    }
+});
+
+Ext.define('Ext.grid.ViewDropZone', {
+    extend: 'Ext.view.DropZone',
+
+    indicatorHtml: '<div class="x-grid-drop-indicator-left"></div><div class="x-grid-drop-indicator-right"></div>',
+    indicatorCls: 'x-grid-drop-indicator',
+
+    handleNodeDrop : function(data, record, position) {
+        var view = this.view,
+            store = view.getStore(),
+            index, records, i, len;
+
+        
+        if (data.copy) {
+            records = data.records;
+            data.records = [];
+            for (i = 0, len = records.length; i < len; i++) {
+                data.records.push(records[i].copy(records[i].getId()));
+            }
+        } else {
+            
+            data.view.store.remove(data.records, data.view === view);
+        }
+
+        index = store.indexOf(record);
+
+        
+        if (position !== 'before') {
+            index++;
+        }
+        store.insert(index, data.records);
+        view.getSelectionModel().select(data.records);
+    }
+});
+
+Ext.define('Ext.grid.column.Action', {
+    extend: 'Ext.grid.column.Column',
+    alias: ['widget.actioncolumn'],
+    alternateClassName: 'Ext.grid.ActionColumn',
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    header: ' ',
+
+    actionIdRe: new RegExp(Ext.baseCSSPrefix + 'action-col-(\\d+)'),
+
+    
+    altText: '',
+
+    sortable: false,
+
+    constructor: function(config) {
+        var me = this,
+            cfg = Ext.apply({}, config),
+            items = cfg.items || [me],
+            l = items.length,
+            i,
+            item;
+
+        
+        delete cfg.items;
+        me.callParent([cfg]);
+
+        
+        me.items = items;
+
+
+
+        me.renderer = function(v, meta) {
+
+            v = Ext.isFunction(cfg.renderer) ? cfg.renderer.apply(this, arguments)||'' : '';
+
+            meta.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell';
+            for (i = 0; i < l; i++) {
+                item = items[i];
+                item.disable = Ext.Function.bind(me.disableAction, me, [i]);
+                item.enable = Ext.Function.bind(me.enableAction, me, [i]);
+                v += '<img alt="' + (item.altText || me.altText) + '" src="' + (item.icon || Ext.BLANK_IMAGE_URL) +
+                    '" class="' + Ext.baseCSSPrefix + 'action-col-icon ' + Ext.baseCSSPrefix + 'action-col-' + String(i) + ' ' + (item.disabled ? Ext.baseCSSPrefix + 'item-disabled' : ' ') + (item.iconCls || '') +
+                    ' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope||me.scope||me, arguments) : (me.iconCls || '')) + '"' +
+                    ((item.tooltip) ? ' data-qtip="' + item.tooltip + '"' : '') + ' />';
+            }
+            return v;
+        };
+    },
+
+    
+    enableAction: function(index) {
+        var me = this;
+
+        if (!index) {
+            index = 0;
+        } else if (!Ext.isNumber(index)) {
+            index = Ext.Array.indexOf(me.items, index);
+        }
+        me.items[index].disabled = false;
+        me.up('tablepanel').el.select('.' + Ext.baseCSSPrefix + 'action-col-' + index).removeCls(me.disabledCls);
+    },
+
+    
+    disableAction: function(index) {
+        var me = this;
+
+        if (!index) {
+            index = 0;
+        } else if (!Ext.isNumber(index)) {
+            index = Ext.Array.indexOf(me.items, index);
+        }
+        me.items[index].disabled = true;
+        me.up('tablepanel').el.select('.' + Ext.baseCSSPrefix + 'action-col-' + index).addCls(me.disabledCls);
+    },
+
+    destroy: function() {
+        delete this.items;
+        delete this.renderer;
+        return this.callParent(arguments);
+    },
+
+    
+    processEvent : function(type, view, cell, recordIndex, cellIndex, e){
+        var me = this,
+            match = e.getTarget().className.match(me.actionIdRe),
+            item, fn;
+            
+        if (match) {
+            item = me.items[parseInt(match[1], 10)];
+            if (item) {
+                if (type == 'click') {
+                    fn = item.handler || me.handler;
+                    if (fn && !item.disabled) {
+                        fn.call(item.scope || me.scope || me, view, recordIndex, cellIndex, item, e);
+                    }
+                } else if (type == 'mousedown' && item.stopSelection !== false) {
+                    return false;
+                }
+            }
+        }
+        return me.callParent(arguments);
+    },
+
+    cascade: function(fn, scope) {
+        fn.call(scope||this, this);
+    },
+
+    
+    getRefItems: function() {
+        return [];
+    }
+});
+
+Ext.define('Ext.grid.column.Boolean', {
+    extend: 'Ext.grid.column.Column',
+    alias: ['widget.booleancolumn'],
+    alternateClassName: 'Ext.grid.BooleanColumn',
+
+    
+    trueText: 'true',
+
+    
+    falseText: 'false',
+
+    
+    undefinedText: ' ',
+
+    constructor: function(cfg){
+        this.callParent(arguments);
+        var trueText      = this.trueText,
+            falseText     = this.falseText,
+            undefinedText = this.undefinedText;
+
+        this.renderer = function(value){
+            if(value === undefined){
+                return undefinedText;
+            }
+            if(!value || value === 'false'){
+                return falseText;
+            }
+            return trueText;
+        };
+    }
+});
+
+Ext.define('Ext.grid.column.Date', {
+    extend: 'Ext.grid.column.Column',
+    alias: ['widget.datecolumn'],
+    requires: ['Ext.Date'],
+    alternateClassName: 'Ext.grid.DateColumn',
+
+    
+
+    initComponent: function(){
+        var me = this;
+        
+        me.callParent(arguments);
+        if (!me.format) {
+            me.format = Ext.Date.defaultFormat;
+        }
+        me.renderer = Ext.util.Format.dateRenderer(me.format);
+    }
+});
+
+Ext.define('Ext.grid.column.Number', {
+    extend: 'Ext.grid.column.Column',
+    alias: ['widget.numbercolumn'],
+    requires: ['Ext.util.Format'],
+    alternateClassName: 'Ext.grid.NumberColumn',
+
+    
+    format : '0,000.00',
+
+    constructor: function(cfg) {
+        this.callParent(arguments);
+        this.renderer = Ext.util.Format.numberRenderer(this.format);
+    }
+});
+
+Ext.define('Ext.grid.column.Template', {
+    extend: 'Ext.grid.column.Column',
+    alias: ['widget.templatecolumn'],
+    requires: ['Ext.XTemplate'],
+    alternateClassName: 'Ext.grid.TemplateColumn',
+
+    
+
+    constructor: function(cfg){
+        var me = this,
+            tpl;
+            
+        me.callParent(arguments);
+        tpl = me.tpl = (!Ext.isPrimitive(me.tpl) && me.tpl.compile) ? me.tpl : Ext.create('Ext.XTemplate', me.tpl);
+
+        me.renderer = function(value, p, record) {
+            var data = Ext.apply({}, record.data, record.getAssociatedData());
+            return tpl.apply(data);
+        };
+    }
+});
+
+
+Ext.define('Ext.grid.feature.Feature', {
+    extend: 'Ext.util.Observable',
+    alias: 'feature.feature',
+    
+    isFeature: true,
+    disabled: false,
+    
+    
+    hasFeatureEvent: true,
+    
+    
+    eventPrefix: null,
+    
+    
+    eventSelector: null,
+    
+    
+    view: null,
+    
+    
+    grid: null,
+    
+    
+    collectData: false,
+        
+    getFeatureTpl: function() {
+        return '';
+    },
+    
+    
+    getFireEventArgs: function(eventName, view, featureTarget, e) {
+        return [eventName, view, featureTarget, e];
+    },
+    
+    
+    attachEvents: function() {
+        
+    },
+    
+    getFragmentTpl: function() {
+        return;
+    },
+    
+    
+    mutateMetaRowTpl: function(metaRowTplArray) {
+        
+    },
+    
+    
+    getMetaRowTplFragments: function() {
+        return {};
+    },
+
+    getTableFragments: function() {
+        return {};
+    },
+    
+    
+    getAdditionalData: function(data, idx, record, orig) {
+        return {};
+    },
+    
+    
+    enable: function() {
+        this.disabled = false;
+    },
+    
+    
+    disable: function() {
+        this.disabled = true;
+    }
+    
+});
+
+Ext.define('Ext.grid.feature.AbstractSummary', {
+    
+    
+   
+    extend: 'Ext.grid.feature.Feature',
+    
+    alias: 'feature.abstractsummary',
+   
+    
+   
+   
+    showSummaryRow: true,
+    
+    
+    nestedIdRe: /\{\{id\}([\w\-]*)\}/g,
+    
+    
+    toggleSummaryRow: function(visible){
+        this.showSummaryRow = !!visible;
+    },
+    
+    
+    getSummaryFragments: function(){
+        var fragments = {};
+        if (this.showSummaryRow) {
+            Ext.apply(fragments, {
+                printSummaryRow: Ext.bind(this.printSummaryRow, this)
+            });
+        }
+        return fragments;
+    },
+    
+    
+    printSummaryRow: function(index){
+        var inner = this.view.getTableChunker().metaRowTpl.join(''),
+            prefix = Ext.baseCSSPrefix;
+        
+        inner = inner.replace(prefix + 'grid-row', prefix + 'grid-row-summary');
+        inner = inner.replace('{{id}}', '{gridSummaryValue}');
+        inner = inner.replace(this.nestedIdRe, '{id$1}');  
+        inner = inner.replace('{[this.embedRowCls()]}', '{rowCls}');
+        inner = inner.replace('{[this.embedRowAttr()]}', '{rowAttr}');
+        inner = Ext.create('Ext.XTemplate', inner, {
+            firstOrLastCls: Ext.view.TableChunker.firstOrLastCls
+        });
+        
+        return inner.applyTemplate({
+            columns: this.getPrintData(index)
+        });
+    },
+    
+    
+    getColumnValue: function(column, summaryData){
+        var comp     = Ext.getCmp(column.id),
+            value    = summaryData[column.id],
+            renderer = comp.summaryRenderer;
+
+        if (renderer) {
+            value = renderer.call(
+                comp.scope || this,
+                value,
+                summaryData,
+                column.dataIndex
+            );
+        }
+        return value;
+    },
+    
+    
+    getSummary: function(store, type, field, group){
+        if (type) {
+            if (Ext.isFunction(type)) {
+                return store.aggregate(type, null, group);
+            }
+            
+            switch (type) {
+                case 'count':
+                    return store.count(group);
+                case 'min':
+                    return store.min(field, group);
+                case 'max':
+                    return store.max(field, group);
+                case 'sum':
+                    return store.sum(field, group);
+                case 'average':
+                    return store.average(field, group);
+                default:
+                    return group ? {} : '';
+                    
+            }
+        }
+    }
+    
+});
+
+
+Ext.define('Ext.grid.feature.Chunking', {
+    extend: 'Ext.grid.feature.Feature',
+    alias: 'feature.chunking',
+    
+    chunkSize: 20,
+    rowHeight: Ext.isIE ? 27 : 26,
+    visibleChunk: 0,
+    hasFeatureEvent: false,
+    attachEvents: function() {
+        var grid = this.view.up('gridpanel'),
+            scroller = grid.down('gridscroller[dock=right]');
+        scroller.el.on('scroll', this.onBodyScroll, this, {buffer: 300});
+        
+    },
+    
+    onBodyScroll: function(e, t) {
+        var view = this.view,
+            top  = t.scrollTop,
+            nextChunk = Math.floor(top / this.rowHeight / this.chunkSize);
+        if (nextChunk !== this.visibleChunk) {
+        
+            this.visibleChunk = nextChunk;
+            view.refresh();
+            view.el.dom.scrollTop = top;
+            
+            view.el.dom.scrollTop = top;
+        }
+    },
+    
+    collectData: function(records, preppedRecords, startIndex, fullWidth, orig) {
+        var o = {
+            fullWidth: orig.fullWidth,
+            chunks: []
+        },
+        
+        
+        recordCount = orig.rows.length,
+        start = 0,
+        i = 0,
+        visibleChunk = this.visibleChunk,
+        chunk,
+        rows,
+        chunkLength;
+
+        for (; start < recordCount; start+=this.chunkSize, i++) {
+            if (start+this.chunkSize > recordCount) {
+                chunkLength = recordCount - start;
+            } else {
+                chunkLength = this.chunkSize;
+            }
+            
+            if (i >= visibleChunk - 1 && i <= visibleChunk + 1) {
+                rows = orig.rows.slice(start, start+this.chunkSize);
+            } else {
+                rows = [];
+            }
+            o.chunks.push({
+                rows: rows,
+                fullWidth: fullWidth,
+                chunkHeight: chunkLength * this.rowHeight
+            });
+        }
+        
+        
+        return o;
+    },
+    
+    getTableFragments: function() {
+        return {
+            openTableWrap: function() {
+                return '<tpl for="chunks"><div class="' + Ext.baseCSSPrefix + 'grid-chunk" style="height: {chunkHeight}px;">';
+            },
+            closeTableWrap: function() {
+                return '</div></tpl>';
+            }
+        };
+    }
+});
+
+
+Ext.define('Ext.grid.feature.Grouping', {
+    extend: 'Ext.grid.feature.Feature',
+    alias: 'feature.grouping',
+
+    eventPrefix: 'group',
+    eventSelector: '.' + Ext.baseCSSPrefix + 'grid-group-hd',
+
+    constructor: function() {
+        var me = this;
+        
+        me.collapsedState = {};
+        me.callParent(arguments);
+    },
+    
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    groupHeaderTpl: 'Group: {name}',
+
+    
+    depthToIndent: 17,
+
+    collapsedCls: Ext.baseCSSPrefix + 'grid-group-collapsed',
+    hdCollapsedCls: Ext.baseCSSPrefix + 'grid-group-hd-collapsed',
+
+    
+    groupByText : 'Group By This Field',
+    
+    showGroupsText : 'Show in Groups',
+
+    
+    hideGroupedHeader : false,
+
+    
+    startCollapsed : false,
+
+    
+    enableGroupingMenu : true,
+
+    
+    enableNoGroups : true,
+    
+    enable: function() {
+        var me    = this,
+            view  = me.view,
+            store = view.store,
+            groupToggleMenuItem;
+            
+        me.lastGroupField = me.getGroupField();
+
+        if (me.lastGroupIndex) {
+            store.group(me.lastGroupIndex);
+        }
+        me.callParent();
+        groupToggleMenuItem = me.view.headerCt.getMenu().down('#groupToggleMenuItem');
+        groupToggleMenuItem.setChecked(true, true);
+        me.refreshIf();
+    },
+
+    disable: function() {
+        var me    = this,
+            view  = me.view,
+            store = view.store,
+            remote = store.remoteGroup,
+            groupToggleMenuItem,
+            lastGroup;
+            
+        lastGroup = store.groupers.first();
+        if (lastGroup) {
+            me.lastGroupIndex = lastGroup.property;
+            me.block();
+            store.clearGrouping();
+            me.unblock();
+        }
+        
+        me.callParent();
+        groupToggleMenuItem = me.view.headerCt.getMenu().down('#groupToggleMenuItem');
+        groupToggleMenuItem.setChecked(true, true);
+        groupToggleMenuItem.setChecked(false, true);
+        if (!remote) {
+            view.refresh();
+        }
+    },
+    
+    refreshIf: function() {
+        if (this.blockRefresh !== true) {
+            this.view.refresh();
+        }    
+    },
+
+    getFeatureTpl: function(values, parent, x, xcount) {
+        var me = this;
+        
+        return [
+            '<tpl if="typeof rows !== \'undefined\'">',
+                
+                '<tr class="' + Ext.baseCSSPrefix + 'grid-group-hd ' + (me.startCollapsed ? me.hdCollapsedCls : '') + ' {hdCollapsedCls}"><td class="' + Ext.baseCSSPrefix + 'grid-cell" colspan="' + parent.columns.length + '" {[this.indentByDepth(values)]}><div class="' + Ext.baseCSSPrefix + 'grid-cell-inner"><div class="' + Ext.baseCSSPrefix + 'grid-group-title">{collapsed}' + me.groupHeaderTpl + '</div></div></td></tr>',
+                
+                '<tr id="{viewId}-gp-{name}" class="' + Ext.baseCSSPrefix + 'grid-group-body ' + (me.startCollapsed ? me.collapsedCls : '') + ' {collapsedCls}"><td colspan="' + parent.columns.length + '">{[this.recurse(values)]}</td></tr>',
+            '</tpl>'
+        ].join('');
+    },
+
+    getFragmentTpl: function() {
+        return {
+            indentByDepth: this.indentByDepth,
+            depthToIndent: this.depthToIndent
+        };
+    },
+
+    indentByDepth: function(values) {
+        var depth = values.depth || 0;
+        return 'style="padding-left:'+ depth * this.depthToIndent + 'px;"';
+    },
+
+    
+    
+    destroy: function() {
+        var me = this;
+        
+        delete me.view;
+        delete me.prunedHeader;
+    },
+
+    
+    attachEvents: function() {
+        var me = this,
+            view = me.view;
+
+        view.on({
+            scope: me,
+            groupclick: me.onGroupClick,
+            rowfocus: me.onRowFocus
+        });
+        view.store.on('groupchange', me.onGroupChange, me);
+
+        me.pruneGroupedHeader();
+
+        if (me.enableGroupingMenu) {
+            me.injectGroupingMenu();
+        }
+        me.lastGroupField = me.getGroupField();
+        me.block();
+        me.onGroupChange();
+        me.unblock();
+    },
+    
+    injectGroupingMenu: function() {
+        var me       = this,
+            view     = me.view,
+            headerCt = view.headerCt;
+        headerCt.showMenuBy = me.showMenuBy;
+        headerCt.getMenuItems = me.getMenuItems();
+    },
+    
+    showMenuBy: function(t, header) {
+        var menu = this.getMenu(),
+            groupMenuItem  = menu.down('#groupMenuItem'),
+            groupableMth = header.groupable === false ?  'disable' : 'enable';
+            
+        groupMenuItem[groupableMth]();
+        Ext.grid.header.Container.prototype.showMenuBy.apply(this, arguments);
+    },
+    
+    getMenuItems: function() {
+        var me                 = this,
+            groupByText        = me.groupByText,
+            disabled           = me.disabled,
+            showGroupsText     = me.showGroupsText,
+            enableNoGroups     = me.enableNoGroups,
+            groupMenuItemClick = Ext.Function.bind(me.onGroupMenuItemClick, me),
+            groupToggleMenuItemClick = Ext.Function.bind(me.onGroupToggleMenuItemClick, me);
+        
+        
+        return function() {
+            var o = Ext.grid.header.Container.prototype.getMenuItems.call(this);
+            o.push('-', {
+                iconCls: Ext.baseCSSPrefix + 'group-by-icon',
+                itemId: 'groupMenuItem',
+                text: groupByText,
+                handler: groupMenuItemClick
+            });
+            if (enableNoGroups) {
+                o.push({
+                    itemId: 'groupToggleMenuItem',
+                    text: showGroupsText,
+                    checked: !disabled,
+                    checkHandler: groupToggleMenuItemClick
+                });
+            }
+            return o;
+        };
+    },
+
+
+    
+    onGroupMenuItemClick: function(menuItem, e) {
+        var me = this,
+            menu = menuItem.parentMenu,
+            hdr  = menu.activeHeader,
+            view = me.view,
+            store = view.store,
+            remote = store.remoteGroup;
+
+        delete me.lastGroupIndex;
+        me.block();
+        me.enable();
+        store.group(hdr.dataIndex);
+        me.pruneGroupedHeader();
+        me.unblock();
+        if (!remote) {
+            view.refresh();
+        }  
+    },
+    
+    block: function(){
+        this.blockRefresh = this.view.blockRefresh = true;
+    },
+    
+    unblock: function(){
+        this.blockRefresh = this.view.blockRefresh = false;
+    },
+
+    
+    onGroupToggleMenuItemClick: function(menuItem, checked) {
+        this[checked ? 'enable' : 'disable']();
+    },
+
+    
+    pruneGroupedHeader: function() {
+        var me         = this,
+            view       = me.view,
+            store      = view.store,
+            groupField = me.getGroupField(),
+            headerCt   = view.headerCt,
+            header     = headerCt.down('header[dataIndex=' + groupField + ']');
+
+        if (header) {
+            if (me.prunedHeader) {
+                me.prunedHeader.show();
+            }
+            me.prunedHeader = header;
+            header.hide();
+        }
+    },
+
+    getGroupField: function(){
+        var group = this.view.store.groupers.first();
+        if (group) {
+            return group.property;    
+        }
+        return ''; 
+    },
+
+    
+    onRowFocus: function(rowIdx) {
+        var node    = this.view.getNode(rowIdx),
+            groupBd = Ext.fly(node).up('.' + this.collapsedCls);
+
+        if (groupBd) {
+            
+            
+            this.expand(groupBd);
+        }
+    },
+
+    
+    expand: function(groupBd) {
+        var me = this,
+            view = me.view,
+            grid = view.up('gridpanel'),
+            groupBdDom = Ext.getDom(groupBd);
+            
+        me.collapsedState[groupBdDom.id] = false;
+
+        groupBd.removeCls(me.collapsedCls);
+        groupBd.prev().removeCls(me.hdCollapsedCls);
+
+        grid.determineScrollbars();
+        grid.invalidateScroller();
+        view.fireEvent('groupexpand');
+    },
+
+    
+    collapse: function(groupBd) {
+        var me = this,
+            view = me.view,
+            grid = view.up('gridpanel'),
+            groupBdDom = Ext.getDom(groupBd);
+            
+        me.collapsedState[groupBdDom.id] = true;
+
+        groupBd.addCls(me.collapsedCls);
+        groupBd.prev().addCls(me.hdCollapsedCls);
+
+        grid.determineScrollbars();
+        grid.invalidateScroller();
+        view.fireEvent('groupcollapse');
+    },
+    
+    onGroupChange: function(){
+        var me = this,
+            field = me.getGroupField(),
+            menuItem;
+            
+        if (me.hideGroupedHeader) {
+            if (me.lastGroupField) {
+                menuItem = me.getMenuItem(me.lastGroupField);
+                if (menuItem) {
+                    menuItem.setChecked(true);
+                }
+            }
+            if (field) {
+                menuItem = me.getMenuItem(field);
+                if (menuItem) {
+                    menuItem.setChecked(false);
+                }
+            }
+        }
+        if (me.blockRefresh !== true) {
+            me.view.refresh();
+        }
+        me.lastGroupField = field;
+    },
+    
+    
+    getMenuItem: function(dataIndex){
+        var view = this.view,
+            header = view.headerCt.down('gridcolumn[dataIndex=' + dataIndex + ']'),
+            menu = view.headerCt.getMenu();
+            
+        return menu.down('menuitem[headerId='+ header.id +']');
+    },
+
+    
+    onGroupClick: function(view, group, idx, foo, e) {
+        var me = this,
+            toggleCls = me.toggleCls,
+            groupBd = Ext.fly(group.nextSibling, '_grouping');
+
+        if (groupBd.hasCls(me.collapsedCls)) {
+            me.expand(groupBd);
+        } else {
+            me.collapse(groupBd);
+        }
+    },
+
+    
+    getMetaRowTplFragments: function() {
+        return {
+            isRow: this.isRow,
+            closeRow: this.closeRow
+        };
+    },
+
+    
+    
+    isRow: function() {
+        return '<tpl if="typeof rows === \'undefined\'">';
+    },
+
+    
+    
+    closeRow: function() {
+        return '</tpl>';
+    },
+
+    
+    mutateMetaRowTpl: function(metaRowTpl) {
+        metaRowTpl.unshift('{[this.isRow()]}');
+        metaRowTpl.push('{[this.closeRow()]}');
+    },
+
+    
+    
+    getAdditionalData: function(data, idx, record, orig) {
+        var view = this.view,
+            hCt  = view.headerCt,
+            col  = hCt.items.getAt(0),
+            o = {},
+            tdAttrKey = col.id + '-tdAttr';
+
+        
+        o[tdAttrKey] = this.indentByDepth(data) + " " + (orig[tdAttrKey] ? orig[tdAttrKey] : '');
+        o.collapsed = 'true';
+        return o;
+    },
+
+    
+    getGroupRows: function(group, records, preppedRecords, fullWidth) {
+        var me = this,
+            children = group.children,
+            rows = group.rows = [],
+            view = me.view;
+        group.viewId = view.id;
+
+        Ext.Array.each(records, function(record, idx) {
+            if (Ext.Array.indexOf(children, record) != -1) {
+                rows.push(Ext.apply(preppedRecords[idx], {
+                    depth: 1
+                }));
+            }
+        });
+        delete group.children;
+        group.fullWidth = fullWidth;
+        if (me.collapsedState[view.id + '-gp-' + group.name]) {
+            group.collapsedCls = me.collapsedCls;
+            group.hdCollapsedCls = me.hdCollapsedCls;
+        }
+
+        return group;
+    },
+
+    
+    collectData: function(records, preppedRecords, startIndex, fullWidth, o) {
+        var me    = this,
+            store = me.view.store,
+            groups;
+            
+        if (!me.disabled && store.isGrouped()) {
+            groups = store.getGroups();
+            Ext.Array.each(groups, function(group, idx){
+                me.getGroupRows(group, records, preppedRecords, fullWidth);
+            }, me);
+            return {
+                rows: groups,
+                fullWidth: fullWidth
+            };
+        }
+        return o;
+    },
+    
+    
+    
+    
+    
+    getFireEventArgs: function(type, view, featureTarget, e) {
+        var returnArray = [type, view, featureTarget],
+            groupBd     = Ext.fly(featureTarget.nextSibling, '_grouping'),
+            groupBdId   = Ext.getDom(groupBd).id,
+            prefix      = view.id + '-gp-',
+            groupName   = groupBdId.substr(prefix.length);
+        
+        returnArray.push(groupName, e);
+        
+        return returnArray;
+    }
+});
+
+
+Ext.define('Ext.grid.feature.GroupingSummary', {
+
+    
+
+    extend: 'Ext.grid.feature.Grouping',
+
+    alias: 'feature.groupingsummary',
+
+    mixins: {
+        summary: 'Ext.grid.feature.AbstractSummary'
+    },
+
+    
+
+
+   
+   getFeatureTpl: function() {
+        var tpl = this.callParent(arguments);
+
+        if (this.showSummaryRow) {
+            
+            tpl = tpl.replace('</tpl>', '');
+            tpl += '{[this.printSummaryRow(xindex)]}</tpl>';
+        }
+        return tpl;
+    },
+
+    
+    getFragmentTpl: function() {
+        var me = this,
+            fragments = me.callParent();
+
+        Ext.apply(fragments, me.getSummaryFragments());
+        if (me.showSummaryRow) {
+            
+            me.summaryGroups = me.view.store.getGroups();
+            me.summaryData = me.generateSummaryData();
+        }
+        return fragments;
+    },
+
+    
+    getPrintData: function(index){
+        var me = this,
+            columns = me.view.headerCt.getColumnsForTpl(),
+            i = 0,
+            length = columns.length,
+            data = [],
+            name = me.summaryGroups[index - 1].name,
+            active = me.summaryData[name],
+            column;
+
+        for (; i < length; ++i) {
+            column = columns[i];
+            column.gridSummaryValue = this.getColumnValue(column, active);
+            data.push(column);
+        }
+        return data;
+    },
+
+    
+    generateSummaryData: function(){
+        var me = this,
+            data = {},
+            remoteData = {},
+            store = me.view.store,
+            groupField = this.getGroupField(),
+            reader = store.proxy.reader,
+            groups = me.summaryGroups,
+            columns = me.view.headerCt.getColumnsForTpl(),
+            remote,
+            i,
+            length,
+            fieldData,
+            root,
+            key,
+            comp;
+
+        for (i = 0, length = groups.length; i < length; ++i) {
+            data[groups[i].name] = {};
+        }
+
+        
+        if (me.remoteRoot && reader.rawData) {
+            
+            root = reader.root;
+            reader.root = me.remoteRoot;
+            reader.buildExtractors(true);
+            Ext.Array.each(reader.getRoot(reader.rawData), function(value) {
+                 remoteData[value[groupField]] = value;
+            });
+            
+            reader.root = root;
+            reader.buildExtractors(true);
+        }
+
+        for (i = 0, length = columns.length; i < length; ++i) {
+            comp = Ext.getCmp(columns[i].id);
+            fieldData = me.getSummary(store, comp.summaryType, comp.dataIndex, true);
+
+            for (key in fieldData) {
+                if (fieldData.hasOwnProperty(key)) {
+                    data[key][comp.id] = fieldData[key];
+                }
+            }
+
+            for (key in remoteData) {
+                if (remoteData.hasOwnProperty(key)) {
+                    remote = remoteData[key][comp.dataIndex];
+                    if (remote !== undefined && data[key] !== undefined) {
+                        data[key][comp.id] = remote;
+                    }
+                }
+            }
+        }
+        return data;
+    }
+});
+
+
+Ext.define('Ext.grid.feature.RowBody', {
+    extend: 'Ext.grid.feature.Feature',
+    alias: 'feature.rowbody',
+    rowBodyHiddenCls: Ext.baseCSSPrefix + 'grid-row-body-hidden',
+    rowBodyTrCls: Ext.baseCSSPrefix + 'grid-rowbody-tr',
+    rowBodyTdCls: Ext.baseCSSPrefix + 'grid-cell-rowbody',
+    rowBodyDivCls: Ext.baseCSSPrefix + 'grid-rowbody',
+
+    eventPrefix: 'rowbody',
+    eventSelector: '.' + Ext.baseCSSPrefix + 'grid-rowbody-tr',
+    
+    getRowBody: function(values) {
+        return [
+            '<tr class="' + this.rowBodyTrCls + ' {rowBodyCls}">',
+                '<td class="' + this.rowBodyTdCls + '" colspan="{rowBodyColspan}">',
+                    '<div class="' + this.rowBodyDivCls + '">{rowBody}</div>',
+                '</td>',
+            '</tr>'
+        ].join('');
+    },
+    
+    
+    getMetaRowTplFragments: function() {
+        return {
+            getRowBody: this.getRowBody,
+            rowBodyTrCls: this.rowBodyTrCls,
+            rowBodyTdCls: this.rowBodyTdCls,
+            rowBodyDivCls: this.rowBodyDivCls
+        };
+    },
+
+    mutateMetaRowTpl: function(metaRowTpl) {
+        metaRowTpl.push('{[this.getRowBody(values)]}');
+    },
+
+    
+    getAdditionalData: function(data, idx, record, orig) {
+        var headerCt = this.view.headerCt,
+            colspan  = headerCt.getColumnCount();
+
+        return {
+            rowBody: "",
+            rowBodyCls: this.rowBodyCls,
+            rowBodyColspan: colspan
+        };
+    }
+});
+
+Ext.define('Ext.grid.feature.RowWrap', {
+    extend: 'Ext.grid.feature.Feature',
+    alias: 'feature.rowwrap',
+
+    
+    hasFeatureEvent: false,
+    
+    mutateMetaRowTpl: function(metaRowTpl) {        
+        
+        
+        metaRowTpl[0] = metaRowTpl[0].replace(Ext.baseCSSPrefix + 'grid-row', '');
+        metaRowTpl[0] = metaRowTpl[0].replace("{[this.embedRowCls()]}", "");
+        
+        metaRowTpl.unshift('<table class="' + Ext.baseCSSPrefix + 'grid-table ' + Ext.baseCSSPrefix + 'grid-table-resizer" style="width: {[this.embedFullWidth()]}px;">');
+        
+        metaRowTpl.unshift('<tr class="' + Ext.baseCSSPrefix + 'grid-row {[this.embedRowCls()]}"><td colspan="{[this.embedColSpan()]}"><div class="' + Ext.baseCSSPrefix + 'grid-rowwrap-div">');
+        
+        
+        metaRowTpl.push('</table>');
+        
+        metaRowTpl.push('</div></td></tr>');
+    },
+    
+    embedColSpan: function() {
+        return '{colspan}';
+    },
+    
+    embedFullWidth: function() {
+        return '{fullWidth}';
+    },
+    
+    getAdditionalData: function(data, idx, record, orig) {
+        var headerCt = this.view.headerCt,
+            colspan  = headerCt.getColumnCount(),
+            fullWidth = headerCt.getFullWidth(),
+            items    = headerCt.query('gridcolumn'),
+            itemsLn  = items.length,
+            i = 0,
+            o = {
+                colspan: colspan,
+                fullWidth: fullWidth
+            },
+            id,
+            tdClsKey,
+            colResizerCls;
+
+        for (; i < itemsLn; i++) {
+            id = items[i].id;
+            tdClsKey = id + '-tdCls';
+            colResizerCls = Ext.baseCSSPrefix + 'grid-col-resizer-'+id;
+            
+            
+            
+            o[tdClsKey] = colResizerCls + " " + (orig[tdClsKey] ? orig[tdClsKey] : '');
+            
+            o[id+'-tdAttr'] = " style=\"width: " + (items[i].hidden ? 0 : items[i].getDesiredWidth()) + "px;\" ";
+            if (orig[id+'-tdAttr']) {
+                o[id+'-tdAttr'] += orig[id+'-tdAttr'];
+            }
+            
+        }
+
+        return o;
+    },
+    
+    getMetaRowTplFragments: function() {
+        return {
+            embedFullWidth: this.embedFullWidth,
+            embedColSpan: this.embedColSpan
+        };
+    }
+    
+});
+
+Ext.define('Ext.grid.feature.Summary', {
+    
+    
+    
+    extend: 'Ext.grid.feature.AbstractSummary',
+    
+    alias: 'feature.summary',
+    
+    
+    
+    
+    getFragmentTpl: function() {
+        
+        this.summaryData = this.generateSummaryData(); 
+        return this.getSummaryFragments();
+    },
+    
+    
+    getTableFragments: function(){
+        if (this.showSummaryRow) {
+            return {
+                closeRows: this.closeRows
+            };
+        }
+    },
+    
+    
+    closeRows: function() {
+        return '</tpl>{[this.printSummaryRow()]}';
+    },
+    
+    
+    getPrintData: function(index){
+        var me = this,
+            columns = me.view.headerCt.getColumnsForTpl(),
+            i = 0,
+            length = columns.length,
+            data = [],
+            active = me.summaryData,
+            column;
+            
+        for (; i < length; ++i) {
+            column = columns[i];
+            column.gridSummaryValue = this.getColumnValue(column, active);
+            data.push(column);
+        }
+        return data;
+    },
+    
+    
+    generateSummaryData: function(){
+        var me = this,
+            data = {},
+            store = me.view.store,
+            columns = me.view.headerCt.getColumnsForTpl(),
+            i = 0,
+            length = columns.length,
+            fieldData,
+            key,
+            comp;
+            
+        for (i = 0, length = columns.length; i < length; ++i) {
+            comp = Ext.getCmp(columns[i].id);
+            data[comp.id] = me.getSummary(store, comp.summaryType, comp.dataIndex, false);
+        }
+        return data;
+    }
+});
+
+Ext.define('Ext.grid.header.DragZone', {
+    extend: 'Ext.dd.DragZone',
+    colHeaderCls: Ext.baseCSSPrefix + 'column-header',
+    maxProxyWidth: 120,
+
+    constructor: function(headerCt) {
+        this.headerCt = headerCt;
+        this.ddGroup =  this.getDDGroup();
+        this.callParent([headerCt.el]);
+        this.proxy.el.addCls(Ext.baseCSSPrefix + 'grid-col-dd');
+    },
+
+    getDDGroup: function() {
+        return 'header-dd-zone-' + this.headerCt.up('[scrollerOwner]').id;
+    },
+
+    getDragData: function(e) {
+        var header = e.getTarget('.'+this.colHeaderCls),
+            headerCmp;
+
+        if (header) {
+            headerCmp = Ext.getCmp(header.id);
+            if (!this.headerCt.dragging && headerCmp.draggable && !(headerCmp.isOnLeftEdge(e) || headerCmp.isOnRightEdge(e))) {
+                var ddel = document.createElement('div');
+                ddel.innerHTML = Ext.getCmp(header.id).text;
+                return {
+                    ddel: ddel,
+                    header: headerCmp
+                };
+            }
+        }
+        return false;
+    },
+
+    onBeforeDrag: function() {
+        return !(this.headerCt.dragging || this.disabled);
+    },
+
+    onInitDrag: function() {
+        this.headerCt.dragging = true;
+        this.callParent(arguments);
+    },
+
+    onDragDrop: function() {
+        this.headerCt.dragging = false;
+        this.callParent(arguments);
+    },
+
+    afterRepair: function() {
+        this.callParent();
+        this.headerCt.dragging = false;
+    },
+
+    getRepairXY: function() {
+        return this.dragData.header.el.getXY();
+    },
+    
+    disable: function() {
+        this.disabled = true;
+    },
+    
+    enable: function() {
+        this.disabled = false;
+    }
+});
+
+
+Ext.define('Ext.grid.header.DropZone', {
+    extend: 'Ext.dd.DropZone',
+    colHeaderCls: Ext.baseCSSPrefix + 'column-header',
+    proxyOffsets: [-4, -9],
+
+    constructor: function(headerCt){
+        this.headerCt = headerCt;
+        this.ddGroup = this.getDDGroup();
+        this.callParent([headerCt.el]);
+    },
+
+    getDDGroup: function() {
+        return 'header-dd-zone-' + this.headerCt.up('[scrollerOwner]').id;
+    },
+
+    getTargetFromEvent : function(e){
+        return e.getTarget('.' + this.colHeaderCls);
+    },
+
+    getTopIndicator: function() {
+        if (!this.topIndicator) {
+            this.topIndicator = Ext.DomHelper.append(Ext.getBody(), {
+                cls: "col-move-top",
+                html: " "
+            }, true);
+        }
+        return this.topIndicator;
+    },
+
+    getBottomIndicator: function() {
+        if (!this.bottomIndicator) {
+            this.bottomIndicator = Ext.DomHelper.append(Ext.getBody(), {
+                cls: "col-move-bottom",
+                html: " "
+            }, true);
+        }
+        return this.bottomIndicator;
+    },
+
+    getLocation: function(e, t) {
+        var x      = e.getXY()[0],
+            region = Ext.fly(t).getRegion(),
+            pos, header;
+
+        if ((region.right - x) <= (region.right - region.left) / 2) {
+            pos = "after";
+        } else {
+            pos = "before";
+        }
+        return {
+            pos: pos,
+            header: Ext.getCmp(t.id),
+            node: t
+        };
+    },
+
+    positionIndicator: function(draggedHeader, node, e){
+        var location = this.getLocation(e, node),
+            header = location.header,
+            pos    = location.pos,
+            nextHd = draggedHeader.nextSibling('gridcolumn:not([hidden])'),
+            prevHd = draggedHeader.previousSibling('gridcolumn:not([hidden])'),
+            region, topIndicator, bottomIndicator, topAnchor, bottomAnchor,
+            topXY, bottomXY, headerCtEl, minX, maxX;
+
+        
+        if (!header.draggable && header.getIndex() == 0) {
+            return false;
+        }
+
+        this.lastLocation = location;
+
+        if ((draggedHeader !== header) &&
+            ((pos === "before" && nextHd !== header) ||
+            (pos === "after" && prevHd !== header)) &&
+            !header.isDescendantOf(draggedHeader)) {
+
+            
+            
+            
+            var allDropZones = Ext.dd.DragDropManager.getRelated(this),
+                ln = allDropZones.length,
+                i  = 0,
+                dropZone;
+
+            for (; i < ln; i++) {
+                dropZone = allDropZones[i];
+                if (dropZone !== this && dropZone.invalidateDrop) {
+                    dropZone.invalidateDrop();
+                }
+            }
+
+
+            this.valid = true;
+            topIndicator = this.getTopIndicator();
+            bottomIndicator = this.getBottomIndicator();
+            if (pos === 'before') {
+                topAnchor = 'tl';
+                bottomAnchor = 'bl';
+            } else {
+                topAnchor = 'tr';
+                bottomAnchor = 'br';
+            }
+            topXY = header.el.getAnchorXY(topAnchor);
+            bottomXY = header.el.getAnchorXY(bottomAnchor);
+
+            
+            headerCtEl = this.headerCt.el;
+            minX = headerCtEl.getLeft();
+            maxX = headerCtEl.getRight();
+
+            topXY[0] = Ext.Number.constrain(topXY[0], minX, maxX);
+            bottomXY[0] = Ext.Number.constrain(bottomXY[0], minX, maxX);
+
+            
+            
+            topXY[0] -= 4;
+            topXY[1] -= 9;
+            bottomXY[0] -= 4;
+
+            
+            topIndicator.setXY(topXY);
+            bottomIndicator.setXY(bottomXY);
+            topIndicator.show();
+            bottomIndicator.show();
+        
+        } else {
+            this.invalidateDrop();
+        }
+    },
+
+    invalidateDrop: function() {
+        this.valid = false;
+        this.hideIndicators();
+    },
+
+    onNodeOver: function(node, dragZone, e, data) {
+        if (data.header.el.dom !== node) {
+            this.positionIndicator(data.header, node, e);
+        }
+        return this.valid ? this.dropAllowed : this.dropNotAllowed;
+    },
+
+    hideIndicators: function() {
+        this.getTopIndicator().hide();
+        this.getBottomIndicator().hide();
+    },
+
+    onNodeOut: function() {
+        this.hideIndicators();
+    },
+
+    onNodeDrop: function(node, dragZone, e, data) {
+        if (this.valid) {
+            this.invalidateDrop();
+            var hd = data.header,
+                lastLocation = this.lastLocation,
+                fromCt  = hd.ownerCt,
+                fromIdx = fromCt.items.indexOf(hd), 
+                toCt    = lastLocation.header.ownerCt,
+                toIdx   = toCt.items.indexOf(lastLocation.header),
+                headerCt = this.headerCt,
+                groupCt,
+                scrollerOwner;
+
+            if (lastLocation.pos === 'after') {
+                toIdx++;
+            }
+
+            
+            
+            
+            if (fromCt !== toCt && fromCt.lockableInjected && toCt.lockableInjected && toCt.lockedCt) {
+                scrollerOwner = fromCt.up('[scrollerOwner]');
+                scrollerOwner.lock(hd, toIdx);
+            } else if (fromCt !== toCt && fromCt.lockableInjected && toCt.lockableInjected && fromCt.lockedCt) {
+                scrollerOwner = fromCt.up('[scrollerOwner]');
+                scrollerOwner.unlock(hd, toIdx);
+            } else {
+                
+                
+                if ((fromCt === toCt) && (toIdx > fromCt.items.indexOf(hd))) {
+                    toIdx--;
+                }
+
+                
+                if (fromCt !== toCt) {
+                    fromCt.suspendLayout = true;
+                    fromCt.remove(hd, false);
+                    fromCt.suspendLayout = false;
+                }
+
+                
+                if (fromCt.isGroupHeader) {
+                    if (!fromCt.items.getCount()) {
+                        groupCt = fromCt.ownerCt;
+                        groupCt.suspendLayout = true;
+                        groupCt.remove(fromCt, false);
+                        fromCt.el.dom.parentNode.removeChild(fromCt.el.dom);
+                        groupCt.suspendLayout = false;
+                    } else {
+                        fromCt.minWidth = fromCt.getWidth() - hd.getWidth();
+                        fromCt.setWidth(fromCt.minWidth);
+                    }
+                }
+
+                
+                toCt.suspendLayout = true;
+                if (fromCt === toCt) {
+                    toCt.move(fromIdx, toIdx);
+                } else {
+                    toCt.insert(toIdx, hd);
+                }
+                toCt.suspendLayout = false;
+
+                
+                
+                
+                if (toCt.isGroupHeader) {
+                    hd.savedFlex = hd.flex;
+                    delete hd.flex;
+                    hd.width = hd.getWidth();
+                    
+                    
+                    toCt.minWidth = toCt.getWidth() + hd.getWidth() - (hd.savedFlex ? 1 : 0);
+                    toCt.setWidth(toCt.minWidth);
+                } else {
+                    if (hd.savedFlex) {
+                        hd.flex = hd.savedFlex;
+                        delete hd.width;
+                    }
+                }
+
+
+                
+                headerCt.purgeCache();
+                headerCt.doLayout();
+                headerCt.onHeaderMoved(hd, fromIdx, toIdx);
+                
+                if (!fromCt.items.getCount()) {
+                    fromCt.destroy();
+                }
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.grid.plugin.Editing', {
+    alias: 'editing.editing',
+
+    requires: [
+        'Ext.grid.column.Column',
+        'Ext.util.KeyNav'
+    ],
+
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    
+    clicksToEdit: 2,
+
+    
+    defaultFieldXType: 'textfield',
+
+    
+    editStyle: '',
+
+    constructor: function(config) {
+        var me = this;
+        Ext.apply(me, config);
+
+        me.addEvents(
+            
+            'beforeedit',
+
+            
+            'edit',
+
+            
+            'validateedit'
+        );
+        me.mixins.observable.constructor.call(me);
+        
+        me.relayEvents(me, ['afteredit'], 'after');
+    },
+
+    
+    init: function(grid) {
+        var me = this;
+
+        me.grid = grid;
+        me.view = grid.view;
+        me.initEvents();
+        me.mon(grid, 'reconfigure', me.onReconfigure, me);
+        me.onReconfigure();
+
+        grid.relayEvents(me, ['beforeedit', 'edit', 'validateedit']);
+        
+        
+        grid.isEditable = true;
+        grid.editingPlugin = grid.view.editingPlugin = me;
+    },
+
+    
+    onReconfigure: function(){
+        this.initFieldAccessors(this.view.getGridColumns());
+    },
+
+    
+    destroy: function() {
+        var me = this,
+            grid = me.grid,
+            headerCt = grid.headerCt,
+            events = grid.events;
+
+        Ext.destroy(me.keyNav);
+        me.removeFieldAccessors(grid.getView().getGridColumns());
+
+        
+        me.clearListeners();
+
+        delete me.grid.editingPlugin;
+        delete me.grid.view.editingPlugin;
+        delete me.grid;
+        delete me.view;
+        delete me.editor;
+        delete me.keyNav;
+    },
+
+    
+    getEditStyle: function() {
+        return this.editStyle;
+    },
+
+    
+    initFieldAccessors: function(column) {
+        var me = this;
+
+        if (Ext.isArray(column)) {
+            Ext.Array.forEach(column, me.initFieldAccessors, me);
+            return;
+        }
+
+        
+        
+        Ext.applyIf(column, {
+            getEditor: function(record, defaultField) {
+                return me.getColumnField(this, defaultField);
+            },
+
+            setEditor: function(field) {
+                me.setColumnField(this, field);
+            }
+        });
+    },
+
+    
+    removeFieldAccessors: function(column) {
+        var me = this;
+
+        if (Ext.isArray(column)) {
+            Ext.Array.forEach(column, me.removeFieldAccessors, me);
+            return;
+        }
+
+        delete column.getEditor;
+        delete column.setEditor;
+    },
+
+    
+    
+    getColumnField: function(columnHeader, defaultField) {
+        var field = columnHeader.field;
+
+        if (!field && columnHeader.editor) {
+            field = columnHeader.editor;
+            delete columnHeader.editor;
+        }
+
+        if (!field && defaultField) {
+            field = defaultField;
+        }
+
+        if (field) {
+            if (Ext.isString(field)) {
+                field = { xtype: field };
+            }
+            if (Ext.isObject(field) && !field.isFormField) {
+                field = Ext.ComponentManager.create(field, this.defaultFieldXType);
+                columnHeader.field = field;
+            }
+
+            Ext.apply(field, {
+                name: columnHeader.dataIndex
+            });
+
+            return field;
+        }
+    },
+
+    
+    
+    setColumnField: function(column, field) {
+        if (Ext.isObject(field) && !field.isFormField) {
+            field = Ext.ComponentManager.create(field, this.defaultFieldXType);
+        }
+        column.field = field;
+    },
+
+    
+    initEvents: function() {
+        var me = this;
+        me.initEditTriggers();
+        me.initCancelTriggers();
+    },
+
+    
+    initCancelTriggers: Ext.emptyFn,
+
+    
+    initEditTriggers: function() {
+        var me = this,
+            view = me.view,
+            clickEvent = me.clicksToEdit === 1 ? 'click' : 'dblclick';
+
+        
+        me.mon(view, 'cell' + clickEvent, me.startEditByClick, me);
+        view.on('render', function() {
+            me.keyNav = Ext.create('Ext.util.KeyNav', view.el, {
+                enter: me.onEnterKey,
+                esc: me.onEscKey,
+                scope: me
+            });
+        }, me, { single: true });
+    },
+
+    
+    onEnterKey: function(e) {
+        var me = this,
+            grid = me.grid,
+            selModel = grid.getSelectionModel(),
+            record,
+            columnHeader = grid.headerCt.getHeaderAtIndex(0);
+
+        
+        
+        if (selModel.getCurrentPosition) {
+            pos = selModel.getCurrentPosition();
+            record = grid.store.getAt(pos.row);
+            columnHeader = grid.headerCt.getHeaderAtIndex(pos.column);
+        }
+        
+        else {
+            record = selModel.getLastSelected();
+        }
+        me.startEdit(record, columnHeader);
+    },
+
+    
+    onEscKey: function(e) {
+        this.cancelEdit();
+    },
+
+    
+    startEditByClick: function(view, cell, colIdx, record, row, rowIdx, e) {
+        this.startEdit(record, view.getHeaderAtIndex(colIdx));
+    },
+
+    
+    beforeEdit: Ext.emptyFn,
+
+    
+    startEdit: function(record, columnHeader) {
+        var me = this,
+            context = me.getEditingContext(record, columnHeader);
+
+        if (me.beforeEdit(context) === false || me.fireEvent('beforeedit', context) === false || context.cancel) {
+            return false;
+        }
+
+        me.context = context;
+        me.editing = true;
+    },
+
+    
+    getEditingContext: function(record, columnHeader) {
+        var me = this,
+            grid = me.grid,
+            store = grid.store,
+            rowIdx,
+            colIdx,
+            view = grid.getView(),
+            value;
+
+        
+        if (Ext.isNumber(record)) {
+            rowIdx = record;
+            record = store.getAt(rowIdx);
+        } else {
+            rowIdx = store.indexOf(record);
+        }
+        if (Ext.isNumber(columnHeader)) {
+            colIdx = columnHeader;
+            columnHeader = grid.headerCt.getHeaderAtIndex(colIdx);
+        } else {
+            colIdx = columnHeader.getIndex();
+        }
+
+        value = record.get(columnHeader.dataIndex);
+        return {
+            grid: grid,
+            record: record,
+            field: columnHeader.dataIndex,
+            value: value,
+            row: view.getNode(rowIdx),
+            column: columnHeader,
+            rowIdx: rowIdx,
+            colIdx: colIdx
+        };
+    },
+
+    
+    cancelEdit: function() {
+        this.editing = false;
+    },
+
+    
+    completeEdit: function() {
+        var me = this;
+
+        if (me.editing && me.validateEdit()) {
+            me.fireEvent('edit', me.context);
+        }
+
+        delete me.context;
+        me.editing = false;
+    },
+
+    
+    validateEdit: function() {
+        var me = this,
+            context = me.context;
+
+        return me.fireEvent('validateedit', me, context) !== false && !context.cancel;
+    }
+});
+
+
+Ext.define('Ext.grid.plugin.CellEditing', {
+    alias: 'plugin.cellediting',
+    extend: 'Ext.grid.plugin.Editing',
+    requires: ['Ext.grid.CellEditor', 'Ext.util.DelayedTask'],
+
+    constructor: function() {
+        
+        
+        
+        this.callParent(arguments);
+        this.editors = Ext.create('Ext.util.MixedCollection', false, function(editor) {
+            return editor.editorId;
+        });
+        this.editTask = Ext.create('Ext.util.DelayedTask');
+    },
+    
+    onReconfigure: function(){
+        this.editors.clear();
+        this.callParent();    
+    },
+
+    
+    destroy: function() {
+        var me = this;
+        me.editTask.cancel();
+        me.editors.each(Ext.destroy, Ext);
+        me.editors.clear();
+        me.callParent(arguments);
+    },
+    
+    onBodyScroll: function() {
+        var ed = this.getActiveEditor();
+        if (ed && ed.field) {
+            if (ed.field.triggerBlur) {
+                ed.field.triggerBlur();
+            } else {
+                ed.field.blur();
+            }
+        }
+    },
+
+    
+    
+    initCancelTriggers: function() {
+        var me   = this,
+            grid = me.grid,
+            view = grid.view;
+            
+        view.addElListener('mousewheel', me.cancelEdit, me);
+        me.mon(view, 'bodyscroll', me.onBodyScroll, me);
+        me.mon(grid, {
+            columnresize: me.cancelEdit,
+            columnmove: me.cancelEdit,
+            scope: me
+        });
+    },
+
+    
+    startEdit: function(record, columnHeader) {
+        var me = this,
+            value = record.get(columnHeader.dataIndex),
+            context = me.getEditingContext(record, columnHeader),
+            ed;
+
+        record = context.record;
+        columnHeader = context.column;
+
+        
+        
+        me.completeEdit();
+
+        context.originalValue = context.value = value;
+        if (me.beforeEdit(context) === false || me.fireEvent('beforeedit', context) === false || context.cancel) {
+            return false;
+        }
+        
+        
+        if (columnHeader && !columnHeader.getEditor(record)) {
+            return false;
+        }
+        
+        ed = me.getEditor(record, columnHeader);
+        if (ed) {
+            me.context = context;
+            me.setActiveEditor(ed);
+            me.setActiveRecord(record);
+            me.setActiveColumn(columnHeader);
+
+            
+            me.editTask.delay(15, ed.startEdit, ed, [me.getCell(record, columnHeader), value]);
+        } else {
+            
+            
+            
+            
+            me.grid.getView().getEl(columnHeader).focus((Ext.isWebKit || Ext.isIE) ? 10 : false);
+        }
+    },
+
+    completeEdit: function() {
+        var activeEd = this.getActiveEditor();
+        if (activeEd) {
+            activeEd.completeEdit();
+        }
+    },
+
+    
+    setActiveEditor: function(ed) {
+        this.activeEditor = ed;
+    },
+
+    getActiveEditor: function() {
+        return this.activeEditor;
+    },
+
+    setActiveColumn: function(column) {
+        this.activeColumn = column;
+    },
+
+    getActiveColumn: function() {
+        return this.activeColumn;
+    },
+
+    setActiveRecord: function(record) {
+        this.activeRecord = record;
+    },
+
+    getActiveRecord: function() {
+        return this.activeRecord;
+    },
+
+    getEditor: function(record, column) {
+        var me = this,
+            editors = me.editors,
+            editorId = column.getItemId(),
+            editor = editors.getByKey(editorId);
+
+        if (editor) {
+            return editor;
+        } else {
+            editor = column.getEditor(record);
+            if (!editor) {
+                return false;
+            }
+
+            
+            if (!(editor instanceof Ext.grid.CellEditor)) {
+                editor = Ext.create('Ext.grid.CellEditor', {
+                    editorId: editorId,
+                    field: editor
+                });
+            }
+            editor.parentEl = me.grid.getEditorParent();
+            
+            editor.on({
+                scope: me,
+                specialkey: me.onSpecialKey,
+                complete: me.onEditComplete,
+                canceledit: me.cancelEdit
+            });
+            editors.add(editor);
+            return editor;
+        }
+    },
+    
+    
+    setColumnField: function(column, field) {
+        var ed = this.editors.getByKey(column.getItemId());
+        Ext.destroy(ed, column.field);
+        this.editors.removeAtKey(column.getItemId());
+        this.callParent(arguments);
+    },
+
+    
+    getCell: function(record, column) {
+        return this.grid.getView().getCell(record, column);
+    },
+
+    onSpecialKey: function(ed, field, e) {
+        var grid = this.grid,
+            sm;
+        if (e.getKey() === e.TAB) {
+            e.stopEvent();
+            sm = grid.getSelectionModel();
+            if (sm.onEditorTab) {
+                sm.onEditorTab(this, e);
+            }
+        }
+    },
+
+    onEditComplete : function(ed, value, startValue) {
+        var me = this,
+            grid = me.grid,
+            sm = grid.getSelectionModel(),
+            activeColumn = me.getActiveColumn(),
+            dataIndex;
+
+        if (activeColumn) {
+            dataIndex = activeColumn.dataIndex;
+
+            me.setActiveEditor(null);
+            me.setActiveColumn(null);
+            me.setActiveRecord(null);
+            delete sm.wasEditing;
+    
+            if (!me.validateEdit()) {
+                return;
+            }
+            
+            
+            if (value !== startValue) {
+                me.context.record.set(dataIndex, value);
+            
+            } else {
+                grid.getView().getEl(activeColumn).focus();
+            }
+            me.context.value = value;
+            me.fireEvent('edit', me, me.context);
+        }
+    },
+
+    
+    cancelEdit: function() {
+        var me = this,
+            activeEd = me.getActiveEditor(),
+            viewEl = me.grid.getView().getEl(me.getActiveColumn());
+
+        me.setActiveEditor(null);
+        me.setActiveColumn(null);
+        me.setActiveRecord(null);
+        if (activeEd) {
+            activeEd.cancelEdit();
+            viewEl.focus();
+        }
+    },
+
+    
+    startEditByPosition: function(position) {
+        var me = this,
+            grid = me.grid,
+            sm = grid.getSelectionModel(),
+            editRecord = grid.store.getAt(position.row),
+            editColumnHeader = grid.headerCt.getHeaderAtIndex(position.column);
+
+        if (sm.selectByPosition) {
+            sm.selectByPosition(position);
+        }
+        me.startEdit(editRecord, editColumnHeader);
+    }
+});
+
+Ext.define('Ext.grid.plugin.DragDrop', {
+    extend: 'Ext.AbstractPlugin',
+    alias: 'plugin.gridviewdragdrop',
+
+    uses: [
+        'Ext.view.DragZone',
+        'Ext.grid.ViewDropZone'
+    ],
+
+    
+
+    
+
+    dragText : '{0} selected row{1}',
+
+    
+    ddGroup : "GridDD",
+
+    
+
+    
+
+    
+    enableDrop: true,
+
+    
+    enableDrag: true,
+
+    init : function(view) {
+        view.on('render', this.onViewRender, this, {single: true});
+    },
+
+    
+    destroy: function() {
+        Ext.destroy(this.dragZone, this.dropZone);
+    },
+
+    enable: function() {
+        var me = this;
+        if (me.dragZone) {
+            me.dragZone.unlock();
+        }
+        if (me.dropZone) {
+            me.dropZone.unlock();
+        }
+        me.callParent();
+    },
+
+    disable: function() {
+        var me = this;
+        if (me.dragZone) {
+            me.dragZone.lock();
+        }
+        if (me.dropZone) {
+            me.dropZone.lock();
+        }
+        me.callParent();
+    },
+
+    onViewRender : function(view) {
+        var me = this;
+
+        if (me.enableDrag) {
+            me.dragZone = Ext.create('Ext.view.DragZone', {
+                view: view,
+                ddGroup: me.dragGroup || me.ddGroup,
+                dragText: me.dragText
+            });
+        }
+
+        if (me.enableDrop) {
+            me.dropZone = Ext.create('Ext.grid.ViewDropZone', {
+                view: view,
+                ddGroup: me.dropGroup || me.ddGroup
+            });
+        }
+    }
+});
+
+Ext.define('Ext.grid.plugin.HeaderReorderer', {
+    extend: 'Ext.util.Observable',
+    requires: ['Ext.grid.header.DragZone', 'Ext.grid.header.DropZone'],
+    alias: 'plugin.gridheaderreorderer',
+
+    init: function(headerCt) {
+        this.headerCt = headerCt;
+        headerCt.on('render', this.onHeaderCtRender, this);
+    },
+
+    
+    destroy: function() {
+        Ext.destroy(this.dragZone, this.dropZone);
+    },
+
+    onHeaderCtRender: function() {
+        this.dragZone = Ext.create('Ext.grid.header.DragZone', this.headerCt);
+        this.dropZone = Ext.create('Ext.grid.header.DropZone', this.headerCt);
+        if (this.disabled) {
+            this.dragZone.disable();
+        }
+    },
+    
+    enable: function() {
+        this.disabled = false;
+        if (this.dragZone) {
+            this.dragZone.enable();
+        }
+    },
+    
+    disable: function() {
+        this.disabled = true;
+        if (this.dragZone) {
+            this.dragZone.disable();
+        }
+    }
+});
+
+Ext.define('Ext.grid.plugin.HeaderResizer', {
+    extend: 'Ext.util.Observable',
+    requires: ['Ext.dd.DragTracker', 'Ext.util.Region'],
+    alias: 'plugin.gridheaderresizer',
+
+    disabled: false,
+
+    
+    configs: {
+        dynamic: true
+    },
+
+    colHeaderCls: Ext.baseCSSPrefix + 'column-header',
+
+    minColWidth: 40,
+    maxColWidth: 1000,
+    wResizeCursor: 'col-resize',
+    eResizeCursor: 'col-resize',
+    
+    
+    
+    
+
+    init: function(headerCt) {
+        this.headerCt = headerCt;
+        headerCt.on('render', this.afterHeaderRender, this, {single: true});
+    },
+
+    
+    destroy: function() {
+        if (this.tracker) {
+            this.tracker.destroy();
+        }
+    },
+
+    afterHeaderRender: function() {
+        var headerCt = this.headerCt,
+            el = headerCt.el;
+
+        headerCt.mon(el, 'mousemove', this.onHeaderCtMouseMove, this);
+
+        this.tracker = Ext.create('Ext.dd.DragTracker', {
+            disabled: this.disabled,
+            onBeforeStart: Ext.Function.bind(this.onBeforeStart, this),
+            onStart: Ext.Function.bind(this.onStart, this),
+            onDrag: Ext.Function.bind(this.onDrag, this),
+            onEnd: Ext.Function.bind(this.onEnd, this),
+            tolerance: 3,
+            autoStart: 300,
+            el: el
+        });
+    },
+
+    
+    
+    
+    onHeaderCtMouseMove: function(e, t) {
+        if (this.headerCt.dragging) {
+            if (this.activeHd) {
+                this.activeHd.el.dom.style.cursor = '';
+                delete this.activeHd;
+            }
+        } else {
+            var headerEl = e.getTarget('.' + this.colHeaderCls, 3, true),
+                overHeader, resizeHeader;
+
+            if (headerEl){
+                overHeader = Ext.getCmp(headerEl.id);
+
+                
+                if (overHeader.isOnLeftEdge(e)) {
+                    resizeHeader = overHeader.previousNode('gridcolumn:not([hidden])');
+
+                }
+                
+                else if (overHeader.isOnRightEdge(e)) {
+                    resizeHeader = overHeader;
+                }
+                
+                else {
+                    resizeHeader = null;
+                }
+
+                
+                if (resizeHeader) {
+                    
+                    
+                    
+                    if (resizeHeader.isGroupHeader) {
+                        resizeHeader = resizeHeader.down(':not([isGroupHeader]):not([hidden]):last');
+                    }
+
+                    
+                    
+                    if (resizeHeader && !(resizeHeader.fixed || (resizeHeader.resizable === false) || this.disabled)) {
+                        this.activeHd = resizeHeader;
+                        overHeader.el.dom.style.cursor = this.eResizeCursor;
+                    }
+                
+                } else {
+                    overHeader.el.dom.style.cursor = '';
+                    delete this.activeHd;
+                }
+            }
+        }
+    },
+
+    
+    onBeforeStart : function(e){
+        var t = e.getTarget();
+        
+        this.dragHd = this.activeHd;
+
+        if (!!this.dragHd && !Ext.fly(t).hasCls('x-column-header-trigger') && !this.headerCt.dragging) {
+            
+            this.tracker.constrainTo = this.getConstrainRegion();
+            return true;
+        } else {
+            this.headerCt.dragging = false;
+            return false;
+        }
+    },
+
+    
+    getConstrainRegion: function() {
+        var dragHdEl = this.dragHd.el,
+            region   = Ext.util.Region.getRegion(dragHdEl);
+
+        return region.adjust(
+            0,
+            this.maxColWidth - dragHdEl.getWidth(),
+            0,
+            this.minColWidth
+        );
+    },
+
+    
+    
+    onStart: function(e){
+        var me       = this,
+            dragHd   = me.dragHd,
+            dragHdEl = dragHd.el,
+            width    = dragHdEl.getWidth(),
+            headerCt = me.headerCt,
+            t        = e.getTarget();
+
+        if (me.dragHd && !Ext.fly(t).hasCls('x-column-header-trigger')) {
+            headerCt.dragging = true;
+        }
+
+        me.origWidth = width;
+
+        
+        if (!me.dynamic) {
+            var xy           = dragHdEl.getXY(),
+                gridSection  = headerCt.up('[scrollerOwner]'),
+                dragHct      = me.dragHd.up(':not([isGroupHeader])'),
+                firstSection = dragHct.up(),
+                lhsMarker    = gridSection.getLhsMarker(),
+                rhsMarker    = gridSection.getRhsMarker(),
+                el           = rhsMarker.parent(),
+                offsetLeft   = el.getLeft(true),
+                offsetTop    = el.getTop(true),
+                topLeft      = el.translatePoints(xy),
+                markerHeight = firstSection.body.getHeight() + headerCt.getHeight(),
+                top = topLeft.top - offsetTop;
+
+            lhsMarker.setTop(top);
+            rhsMarker.setTop(top);
+            lhsMarker.setHeight(markerHeight);
+            rhsMarker.setHeight(markerHeight);
+            lhsMarker.setLeft(topLeft.left - offsetLeft);
+            rhsMarker.setLeft(topLeft.left + width - offsetLeft);
+        }
+    },
+
+    
+    onDrag: function(e){
+        if (!this.dynamic) {
+            var xy          = this.tracker.getXY('point'),
+                gridSection = this.headerCt.up('[scrollerOwner]'),
+                rhsMarker   = gridSection.getRhsMarker(),
+                el          = rhsMarker.parent(),
+                topLeft     = el.translatePoints(xy),
+                offsetLeft  = el.getLeft(true);
+
+            rhsMarker.setLeft(topLeft.left - offsetLeft);
+        
+        } else {
+            this.doResize();
+        }
+    },
+
+    onEnd: function(e){
+        this.headerCt.dragging = false;
+        if (this.dragHd) {
+            if (!this.dynamic) {
+                var dragHd      = this.dragHd,
+                    gridSection = this.headerCt.up('[scrollerOwner]'),
+                    lhsMarker   = gridSection.getLhsMarker(),
+                    rhsMarker   = gridSection.getRhsMarker(),
+                    currWidth   = dragHd.getWidth(),
+                    offset      = this.tracker.getOffset('point'),
+                    offscreen   = -9999;
+
+                
+                lhsMarker.setLeft(offscreen);
+                rhsMarker.setLeft(offscreen);
+            }
+            this.doResize();
+        }
+    },
+
+    doResize: function() {
+        if (this.dragHd) {
+            var dragHd = this.dragHd,
+                nextHd,
+                offset = this.tracker.getOffset('point');
+
+            
+            if (dragHd.flex) {
+                delete dragHd.flex;
+            }
+
+            this.headerCt.suspendLayout = true;
+            dragHd.setWidth(this.origWidth + offset[0], false);
+
+            
+            
+            
+            
+            if (this.headerCt.forceFit) {
+                nextHd = dragHd.nextNode('gridcolumn:not([hidden]):not([isGroupHeader])');
+                if (nextHd) {
+                    delete nextHd.flex;
+                    nextHd.setWidth(nextHd.getWidth() - offset[0], false);
+                }
+            }
+            this.headerCt.suspendLayout = false;
+            this.headerCt.doComponentLayout(this.headerCt.getFullWidth());
+        }
+    },
+
+    disable: function() {
+        this.disabled = true;
+        if (this.tracker) {
+            this.tracker.disable();
+        }
+    },
+
+    enable: function() {
+        this.disabled = false;
+        if (this.tracker) {
+            this.tracker.enable();
+        }
+    }
+});
+
+Ext.define('Ext.grid.plugin.RowEditing', {
+    extend: 'Ext.grid.plugin.Editing',
+    alias: 'plugin.rowediting',
+
+    requires: [
+        'Ext.grid.RowEditor'
+    ],
+
+    editStyle: 'row',
+
+    
+    autoCancel: true,
+
+    
+
+    
+    errorSummary: true,
+
+    
+    
+    
+    
+    
+    
+
+    constructor: function() {
+        var me = this;
+        me.callParent(arguments);
+
+        if (!me.clicksToMoveEditor) {
+            me.clicksToMoveEditor = me.clicksToEdit;
+        }
+
+        me.autoCancel = !!me.autoCancel;
+    },
+
+    
+    destroy: function() {
+        var me = this;
+        Ext.destroy(me.editor);
+        me.callParent(arguments);
+    },
+
+    
+    startEdit: function(record, columnHeader) {
+        var me = this,
+            editor = me.getEditor();
+
+        if (me.callParent(arguments) === false) {
+            return false;
+        }
+
+        
+        if (editor.beforeEdit() !== false) {
+            editor.startEdit(me.context.record, me.context.column);
+        }
+    },
+
+    
+    cancelEdit: function() {
+        var me = this;
+
+        if (me.editing) {
+            me.getEditor().cancelEdit();
+            me.callParent(arguments);
+            
+            me.fireEvent('canceledit', me.context);
+        }
+    },
+
+    
+    completeEdit: function() {
+        var me = this;
+
+        if (me.editing && me.validateEdit()) {
+            me.editing = false;
+            me.fireEvent('edit', me.context);
+        }
+    },
+
+    
+    validateEdit: function() {
+        var me             = this,
+            editor         = me.editor,
+            context        = me.context,
+            record         = context.record,
+            newValues      = {},
+            originalValues = {},
+            name;
+
+        editor.items.each(function(item) {
+            name = item.name;
+
+            newValues[name]      = item.getValue();
+            originalValues[name] = record.get(name);
+        });
+
+        Ext.apply(context, {
+            newValues      : newValues,
+            originalValues : originalValues
+        });
+
+        return me.callParent(arguments) && me.getEditor().completeEdit();
+    },
+
+    
+    getEditor: function() {
+        var me = this;
+
+        if (!me.editor) {
+            me.editor = me.initEditor();
+        }
+        return me.editor;
+    },
+
+    
+    initEditor: function() {
+        var me = this,
+            grid = me.grid,
+            view = me.view,
+            headerCt = grid.headerCt;
+
+        return Ext.create('Ext.grid.RowEditor', {
+            autoCancel: me.autoCancel,
+            errorSummary: me.errorSummary,
+            fields: headerCt.getGridColumns(),
+            hidden: true,
+
+            
+            editingPlugin: me,
+            renderTo: view.el
+        });
+    },
+
+    
+    initEditTriggers: function() {
+        var me = this,
+            grid = me.grid,
+            view = me.view,
+            headerCt = grid.headerCt,
+            moveEditorEvent = me.clicksToMoveEditor === 1 ? 'click' : 'dblclick';
+
+        me.callParent(arguments);
+
+        if (me.clicksToMoveEditor !== me.clicksToEdit) {
+            me.mon(view, 'cell' + moveEditorEvent, me.moveEditorByClick, me);
+        }
+
+        view.on('render', function() {
+            
+            me.mon(headerCt, {
+                add: me.onColumnAdd,
+                remove: me.onColumnRemove,
+                columnresize: me.onColumnResize,
+                columnhide: me.onColumnHide,
+                columnshow: me.onColumnShow,
+                columnmove: me.onColumnMove,
+                scope: me
+            });
+        }, me, { single: true });
+    },
+
+    startEditByClick: function() {
+        var me = this;
+        if (!me.editing || me.clicksToMoveEditor === me.clicksToEdit) {
+            me.callParent(arguments);
+        }
+    },
+
+    moveEditorByClick: function() {
+        var me = this;
+        if (me.editing) {
+            me.superclass.startEditByClick.apply(me, arguments);
+        }
+    },
+
+    
+    onColumnAdd: function(ct, column) {
+        if (column.isHeader) {
+            var me = this,
+                editor;
+
+            me.initFieldAccessors(column);
+            editor = me.getEditor();
+
+            if (editor && editor.onColumnAdd) {
+                editor.onColumnAdd(column);
+            }
+        }
+    },
+
+    
+    onColumnRemove: function(ct, column) {
+        if (column.isHeader) {
+            var me = this,
+                editor = me.getEditor();
+
+            if (editor && editor.onColumnRemove) {
+                editor.onColumnRemove(column);
+            }
+            me.removeFieldAccessors(column);
+        }
+    },
+
+    
+    onColumnResize: function(ct, column, width) {
+        if (column.isHeader) {
+            var me = this,
+                editor = me.getEditor();
+
+            if (editor && editor.onColumnResize) {
+                editor.onColumnResize(column, width);
+            }
+        }
+    },
+
+    
+    onColumnHide: function(ct, column) {
+        
+        var me = this,
+            editor = me.getEditor();
+
+        if (editor && editor.onColumnHide) {
+            editor.onColumnHide(column);
+        }
+    },
+
+    
+    onColumnShow: function(ct, column) {
+        
+        var me = this,
+            editor = me.getEditor();
+
+        if (editor && editor.onColumnShow) {
+            editor.onColumnShow(column);
+        }
+    },
+
+    
+    onColumnMove: function(ct, column, fromIdx, toIdx) {
+        
+        var me = this,
+            editor = me.getEditor();
+
+        if (editor && editor.onColumnMove) {
+            editor.onColumnMove(column, fromIdx, toIdx);
+        }
+    },
+
+    
+    setColumnField: function(column, field) {
+        var me = this;
+        me.callParent(arguments);
+        me.getEditor().setField(column.field, column);
+    }
+});
+
+
+Ext.define('Ext.grid.property.Grid', {
+
+    extend: 'Ext.grid.Panel',
+
+    alias: 'widget.propertygrid',
+
+    alternateClassName: 'Ext.grid.PropertyGrid',
+
+    uses: [
+       'Ext.grid.plugin.CellEditing',
+       'Ext.grid.property.Store',
+       'Ext.grid.property.HeaderContainer',
+       'Ext.XTemplate',
+       'Ext.grid.CellEditor',
+       'Ext.form.field.Date',
+       'Ext.form.field.Text',
+       'Ext.form.field.Number'
+    ],
+
+   
+
+    
+
+    
+
+    
+
+    
+
+    
+    valueField: 'value',
+
+    
+    nameField: 'name',
+
+    
+
+    
+    enableColumnMove: false,
+    columnLines: true,
+    stripeRows: false,
+    trackMouseOver: false,
+    clicksToEdit: 1,
+    enableHdMenu: false,
+
+    
+    initComponent : function(){
+        var me = this;
+
+        me.addCls(Ext.baseCSSPrefix + 'property-grid');
+        me.plugins = me.plugins || [];
+
+        
+        me.plugins.push(Ext.create('Ext.grid.plugin.CellEditing', {
+            clicksToEdit: me.clicksToEdit,
+
+            
+            startEdit: function(record, column) {
+                
+                return this.self.prototype.startEdit.call(this, record, me.headerCt.child('#' + me.valueField));
+            }
+        }));
+
+        me.selModel = {
+            selType: 'cellmodel',
+            onCellSelect: function(position) {
+                if (position.column != 1) {
+                    position.column = 1;
+                }
+                return this.self.prototype.onCellSelect.call(this, position);
+            }
+        };
+        me.customRenderers = me.customRenderers || {};
+        me.customEditors = me.customEditors || {};
+
+        
+        if (!me.store) {
+            me.propStore = me.store = Ext.create('Ext.grid.property.Store', me, me.source);
+        }
+
+        me.store.sort('name', 'ASC');
+        me.columns = Ext.create('Ext.grid.property.HeaderContainer', me, me.store);
+
+        me.addEvents(
+            
+            'beforepropertychange',
+            
+            'propertychange'
+        );
+        me.callParent();
+
+        
+        me.getView().walkCells = this.walkCells;
+
+        
+        me.editors = {
+            'date'    : Ext.create('Ext.grid.CellEditor', { field: Ext.create('Ext.form.field.Date',   {selectOnFocus: true})}),
+            'string'  : Ext.create('Ext.grid.CellEditor', { field: Ext.create('Ext.form.field.Text',   {selectOnFocus: true})}),
+            'number'  : Ext.create('Ext.grid.CellEditor', { field: Ext.create('Ext.form.field.Number', {selectOnFocus: true})}),
+            'boolean' : Ext.create('Ext.grid.CellEditor', { field: Ext.create('Ext.form.field.ComboBox', {
+                editable: false,
+                store: [[ true, me.headerCt.trueText ], [false, me.headerCt.falseText ]]
+            })})
+        };
+
+        
+        me.store.on('update', me.onUpdate, me);
+    },
+
+    
+    onUpdate : function(store, record, operation) {
+        var me = this,
+            v, oldValue;
+
+        if (operation == Ext.data.Model.EDIT) {
+            v = record.get(me.valueField);
+            oldValue = record.modified.value;
+            if (me.fireEvent('beforepropertychange', me.source, record.getId(), v, oldValue) !== false) {
+                if (me.source) {
+                    me.source[record.getId()] = v;
+                }
+                record.commit();
+                me.fireEvent('propertychange', me.source, record.getId(), v, oldValue);
+            } else {
+                record.reject();
+            }
+        }
+    },
+
+    
+    walkCells: function(pos, direction, e, preventWrap, verifierFn, scope) {
+        if (direction == 'left') {
+            direction = 'up';
+        } else if (direction == 'right') {
+            direction = 'down';
+        }
+        pos = Ext.view.Table.prototype.walkCells.call(this, pos, direction, e, preventWrap, verifierFn, scope);
+        if (!pos.column) {
+            pos.column = 1;
+        }
+        return pos;
+    },
+
+    
+    
+    getCellEditor : function(record, column) {
+        var me = this,
+            propName = record.get(me.nameField),
+            val = record.get(me.valueField),
+            editor = me.customEditors[propName];
+
+        
+        
+        if (editor) {
+            if (!(editor instanceof Ext.grid.CellEditor)) {
+                if (!(editor instanceof Ext.form.field.Base)) {
+                    editor = Ext.ComponentManager.create(editor, 'textfield');
+                }
+                editor = me.customEditors[propName] = Ext.create('Ext.grid.CellEditor', { field: editor });
+            }
+        } else if (Ext.isDate(val)) {
+            editor = me.editors.date;
+        } else if (Ext.isNumber(val)) {
+            editor = me.editors.number;
+        } else if (Ext.isBoolean(val)) {
+            editor = me.editors['boolean'];
+        } else {
+            editor = me.editors.string;
+        }
+
+        
+        editor.editorId = propName;
+        return editor;
+    },
+
+    beforeDestroy: function() {
+        var me = this;
+        me.callParent();
+        me.destroyEditors(me.editors);
+        me.destroyEditors(me.customEditors);
+        delete me.source;
+    },
+
+    destroyEditors: function (editors) {
+        for (var ed in editors) {
+            if (editors.hasOwnProperty(ed)) {
+                Ext.destroy(editors[ed]);
+            }
+        }
+    },
+
+    
+    setSource: function(source) {
+        this.source = source;
+        this.propStore.setSource(source);
+    },
+
+    
+    getSource: function() {
+        return this.propStore.getSource();
+    },
+
+    
+    setProperty: function(prop, value, create) {
+        this.propStore.setValue(prop, value, create);
+    },
+
+    
+    removeProperty: function(prop) {
+        this.propStore.remove(prop);
+    }
+
+    
+    
+    
+    
+});
+
+Ext.define('Ext.grid.property.HeaderContainer', {
+
+    extend: 'Ext.grid.header.Container',
+
+    alternateClassName: 'Ext.grid.PropertyColumnModel',
+    
+    nameWidth: 115,
+
+    
+    nameText : 'Name',
+    valueText : 'Value',
+    dateFormat : 'm/j/Y',
+    trueText: 'true',
+    falseText: 'false',
+
+    
+    nameColumnCls: Ext.baseCSSPrefix + 'grid-property-name',
+
+    
+    constructor : function(grid, store) {
+        var me = this;
+        
+        me.grid = grid;
+        me.store = store;
+        me.callParent([{
+            items: [{
+                header: me.nameText,
+                width: grid.nameColumnWidth || me.nameWidth,
+                sortable: true,
+                dataIndex: grid.nameField,
+                renderer: Ext.Function.bind(me.renderProp, me),
+                itemId: grid.nameField,
+                menuDisabled :true,
+                tdCls: me.nameColumnCls
+            }, {
+                header: me.valueText,
+                renderer: Ext.Function.bind(me.renderCell, me),
+                getEditor: Ext.Function.bind(me.getCellEditor, me),
+                flex: 1,
+                fixed: true,
+                dataIndex: grid.valueField,
+                itemId: grid.valueField,
+                menuDisabled: true
+            }]
+        }]);
+    },
+    
+    getCellEditor: function(record){
+        return this.grid.getCellEditor(record, this);
+    },
+
+    
+    
+    renderProp : function(v) {
+        return this.getPropertyName(v);
+    },
+
+    
+    
+    renderCell : function(val, meta, rec) {
+        var me = this,
+            renderer = me.grid.customRenderers[rec.get(me.grid.nameField)],
+            result = val;
+
+        if (renderer) {
+            return renderer.apply(me, arguments);
+        }
+        if (Ext.isDate(val)) {
+            result = me.renderDate(val);
+        } else if (Ext.isBoolean(val)) {
+            result = me.renderBool(val);
+        }
+        return Ext.util.Format.htmlEncode(result);
+    },
+
+    
+    renderDate : Ext.util.Format.date,
+
+    
+    renderBool : function(bVal) {
+        return this[bVal ? 'trueText' : 'falseText'];
+    },
+
+    
+    
+    getPropertyName : function(name) {
+        var pn = this.grid.propertyNames;
+        return pn && pn[name] ? pn[name] : name;
+    }
+});
+
+Ext.define('Ext.grid.property.Property', {
+    extend: 'Ext.data.Model',
+
+    alternateClassName: 'Ext.PropGridProperty',
+
+    fields: [{
+        name: 'name',
+        type: 'string'
+    }, {
+        name: 'value'
+    }],
+    idProperty: 'name'
+});
+
+Ext.define('Ext.grid.property.Store', {
+
+    extend: 'Ext.data.Store',
+
+    alternateClassName: 'Ext.grid.PropertyStore',
+
+    uses: ['Ext.data.reader.Reader', 'Ext.data.proxy.Proxy', 'Ext.data.ResultSet', 'Ext.grid.property.Property'],
+
+    
+    constructor : function(grid, source){
+        var me = this;
+        
+        me.grid = grid;
+        me.source = source;
+        me.callParent([{
+            data: source,
+            model: Ext.grid.property.Property,
+            proxy: me.getProxy()
+        }]);
+    },
+
+    
+    getProxy: function() {
+        if (!this.proxy) {
+            Ext.grid.property.Store.prototype.proxy = Ext.create('Ext.data.proxy.Memory', {
+                model: Ext.grid.property.Property,
+                reader: this.getReader()
+            });
+        }
+        return this.proxy;
+    },
+
+    
+    getReader: function() {
+        if (!this.reader) {
+            Ext.grid.property.Store.prototype.reader = Ext.create('Ext.data.reader.Reader', {
+                model: Ext.grid.property.Property,
+
+                buildExtractors: Ext.emptyFn,
+
+                read: function(dataObject) {
+                    return this.readRecords(dataObject);
+                },
+
+                readRecords: function(dataObject) {
+                    var val,
+                        propName,
+                        result = {
+                            records: [],
+                            success: true
+                        };
+
+                    for (propName in dataObject) {
+                        if (dataObject.hasOwnProperty(propName)) {
+                            val = dataObject[propName];
+                            if (this.isEditableValue(val)) {
+                                result.records.push(new Ext.grid.property.Property({
+                                    name: propName,
+                                    value: val
+                                }, propName));
+                            }
+                        }
+                    }
+                    result.total = result.count = result.records.length;
+                    return Ext.create('Ext.data.ResultSet', result);
+                },
+
+                
+                isEditableValue: function(val){
+                    return Ext.isPrimitive(val) || Ext.isDate(val);
+                }
+            });
+        }
+        return this.reader;
+    },
+
+    
+    setSource : function(dataObject) {
+        var me = this;
+
+        me.source = dataObject;
+        me.suspendEvents();
+        me.removeAll();
+        me.proxy.data = dataObject;
+        me.load();
+        me.resumeEvents();
+        me.fireEvent('datachanged', me);
+    },
+
+    
+    getProperty : function(row) {
+       return Ext.isNumber(row) ? this.getAt(row) : this.getById(row);
+    },
+
+    
+    setValue : function(prop, value, create){
+        var me = this,
+            rec = me.getRec(prop);
+            
+        if (rec) {
+            rec.set('value', value);
+            me.source[prop] = value;
+        } else if (create) {
+            
+            me.source[prop] = value;
+            rec = new Ext.grid.property.Property({name: prop, value: value}, prop);
+            me.add(rec);
+        }
+    },
+
+    
+    remove : function(prop) {
+        var rec = this.getRec(prop);
+        if (rec) {
+            this.callParent([rec]);
+            delete this.source[prop];
+        }
+    },
+
+    
+    getRec : function(prop) {
+        return this.getById(prop);
+    },
+
+    
+    getSource : function() {
+        return this.source;
+    }
+});
+
+
+Ext.define('Ext.layout.component.Body', {
+
+    
+
+    alias: ['layout.body'],
+
+    extend: 'Ext.layout.component.Component',
+
+    uses: ['Ext.layout.container.Container'],
+
+    
+
+    type: 'body',
+    
+    onLayout: function(width, height) {
+        var me = this,
+            owner = me.owner;
+
+        
+        me.setTargetSize(width, height);
+
+        
+        me.setBodySize.apply(me, arguments);
+
+        
+        if (owner && owner.layout && owner.layout.isLayout) {
+            if (!Ext.isNumber(owner.height) || !Ext.isNumber(owner.width)) {
+                owner.layout.bindToOwnerCtComponent = true;
+            }
+            else {
+                owner.layout.bindToOwnerCtComponent = false;
+            }
+        }
+        
+        me.callParent(arguments);
+    },
+
+    
+    setBodySize: function(width, height) {
+        var me = this,
+            owner = me.owner,
+            frameSize = owner.frameSize,
+            isNumber = Ext.isNumber;
+
+        if (isNumber(width)) {
+            width -= owner.el.getFrameWidth('lr') - frameSize.left - frameSize.right;
+        }
+        if (isNumber(height)) {
+            height -= owner.el.getFrameWidth('tb') - frameSize.top - frameSize.bottom;
+        }
+
+        me.setElementSize(owner.body, width, height);
+    }
+});
+
+Ext.define('Ext.layout.component.FieldSet', {
+    extend: 'Ext.layout.component.Body',
+    alias: ['layout.fieldset'],
+
+    type: 'fieldset',
+
+    doContainerLayout: function() {
+        
+        if (!this.owner.collapsed) {
+            this.callParent();
+        }
+    }
+});
+
+Ext.define('Ext.layout.component.Tab', {
+
+    alias: ['layout.tab'],
+
+    extend: 'Ext.layout.component.Button',
+
+    
+
+    beforeLayout: function() {
+        var me = this, dirty = me.lastClosable !== me.owner.closable;
+
+        if (dirty) {
+            delete me.adjWidth;
+        }
+
+        return this.callParent(arguments) || dirty;
+    },
+
+    onLayout: function () {
+        var me = this;
+
+        me.callParent(arguments);
+
+        me.lastClosable = me.owner.closable;
+    }
+});
+
+
+Ext.define('Ext.layout.component.field.File', {
+    alias: ['layout.filefield'],
+    extend: 'Ext.layout.component.field.Field',
+
+    type: 'filefield',
+
+    sizeBodyContents: function(width, height) {
+        var me = this,
+            owner = me.owner;
+
+        if (!owner.buttonOnly) {
+            
+            
+            me.setElementSize(owner.inputEl, Ext.isNumber(width) ? width - owner.button.getWidth() - owner.buttonMargin : width);
+        }
+    }
+});
+
+
+Ext.define('Ext.layout.component.field.Slider', {
+
+    
+
+    alias: ['layout.sliderfield'],
+
+    extend: 'Ext.layout.component.field.Field',
+
+    
+
+    type: 'sliderfield',
+
+    sizeBodyContents: function(width, height) {
+        var owner = this.owner,
+            thumbs = owner.thumbs,
+            length = thumbs.length,
+            inputEl = owner.inputEl,
+            innerEl = owner.innerEl,
+            endEl = owner.endEl,
+            i = 0;
+
+        
+        for(; i < length; ++i) {
+            thumbs[i].el.stopAnimation();
+        }
+        
+        if (owner.vertical) {
+            inputEl.setHeight(height);
+            innerEl.setHeight(Ext.isNumber(height) ? height - inputEl.getPadding('t') - endEl.getPadding('b') : height);
+        }
+        else {
+            inputEl.setWidth(width);
+            innerEl.setWidth(Ext.isNumber(width) ? width - inputEl.getPadding('l') - endEl.getPadding('r') : width);
+        }
+        owner.syncThumbs();
+    }
+});
+
+
+Ext.define('Ext.layout.container.Absolute', {
+
+    
+
+    alias: 'layout.absolute',
+    extend: 'Ext.layout.container.Anchor',
+    alternateClassName: 'Ext.layout.AbsoluteLayout',
+
+    
+
+    itemCls: Ext.baseCSSPrefix + 'abs-layout-item',
+
+    type: 'absolute',
+
+    onLayout: function() {
+        var me = this,
+            target = me.getTarget(),
+            targetIsBody = target.dom === document.body;
+
+        
+        if (!targetIsBody) {
+            target.position();
+        }
+        me.paddingLeft = target.getPadding('l');
+        me.paddingTop = target.getPadding('t');
+        me.callParent(arguments);
+    },
+
+    
+    adjustWidthAnchor: function(value, comp) {
+        
+        return value ? value - comp.getPosition(true)[0] : value;
+    },
+
+    
+    adjustHeightAnchor: function(value, comp) {
+        
+        return value ? value - comp.getPosition(true)[1] : value;
+    }
+});
+
+Ext.define('Ext.layout.container.Accordion', {
+    extend: 'Ext.layout.container.VBox',
+    alias: ['layout.accordion'],
+    alternateClassName: 'Ext.layout.AccordionLayout',
+
+    itemCls: Ext.baseCSSPrefix + 'box-item ' + Ext.baseCSSPrefix + 'accordion-item',
+
+    align: 'stretch',
+
+    
+    fill : true,
+
+    
+    autoWidth : true,
+
+    
+    titleCollapse : true,
+
+    
+    hideCollapseTool : false,
+
+    
+    collapseFirst : false,
+
+    
+    animate : true,
+    
+    activeOnTop : false,
+    
+    multi: false,
+
+    constructor: function() {
+        var me = this;
+
+        me.callParent(arguments);
+
+        
+        me.initialAnimate = me.animate;
+        me.animate = false;
+
+        
+        if (me.fill === false) {
+            me.itemCls = Ext.baseCSSPrefix + 'accordion-item';
+        }
+    },
+
+    
+    
+    beforeLayout: function() {
+        var me = this;
+
+        me.callParent(arguments);
+        if (me.fill) {
+            if (!(me.owner.el.dom.style.height || me.getLayoutTargetSize().height)) {
+                return false;
+            }
+        } else {
+            me.owner.componentLayout.monitorChildren = false;
+            me.autoSize = true;
+            me.owner.setAutoScroll(true);
+        }
+    },
+
+    renderItems : function(items, target) {
+        var me = this,
+            ln = items.length,
+            i = 0,
+            comp,
+            targetSize = me.getLayoutTargetSize(),
+            renderedPanels = [];
+
+        for (; i < ln; i++) {
+            comp = items[i];
+            if (!comp.rendered) {
+                renderedPanels.push(comp);
+
+                
+                if (me.collapseFirst) {
+                    comp.collapseFirst = me.collapseFirst;
+                }
+                if (me.hideCollapseTool) {
+                    comp.hideCollapseTool = me.hideCollapseTool;
+                    comp.titleCollapse = true;
+                }
+                else if (me.titleCollapse) {
+                    comp.titleCollapse = me.titleCollapse;
+                }
+
+                delete comp.hideHeader;
+                comp.collapsible = true;
+                comp.title = comp.title || ' ';
+
+                
+                comp.width = targetSize.width;
+                if (me.fill) {
+                    delete comp.height;
+                    delete comp.flex;
+
+                    
+                    if (me.expandedItem !== undefined) {
+                        comp.collapsed = true;
+                    }
+                    
+                    else if (comp.hasOwnProperty('collapsed') && comp.collapsed === false) {
+                        comp.flex = 1;
+                        me.expandedItem = i;
+                    } else {
+                        comp.collapsed = true;
+                    }
+                    
+                    me.owner.mon(comp, {
+                        show: me.onComponentShow,
+                        beforeexpand: me.onComponentExpand,
+                        beforecollapse: me.onComponentCollapse,
+                        scope: me
+                    });
+                } else {
+                    delete comp.flex;
+                    comp.animCollapse = me.initialAnimate;
+                    comp.autoHeight = true;
+                    comp.autoScroll = false;
+                }
+                comp.border = comp.collapsed;
+            }
+        }
+
+        
+        if (ln && me.expandedItem === undefined) {
+            me.expandedItem = 0;
+            comp = items[0];
+            comp.collapsed = comp.border = false;
+            if (me.fill) {
+                comp.flex = 1;
+            }
+        }
+
+        
+        me.callParent(arguments);
+
+        
+        ln = renderedPanels.length;
+        for (i = 0; i < ln; i++) {
+            comp = renderedPanels[i];
+
+            
+            delete comp.width;
+
+            comp.header.addCls(Ext.baseCSSPrefix + 'accordion-hd');
+            comp.body.addCls(Ext.baseCSSPrefix + 'accordion-body');
+        }
+    },
+
+    onLayout: function() {
+        var me = this;
+
+
+        if (me.fill) {
+            me.callParent(arguments);
+        } else {
+            var targetSize = me.getLayoutTargetSize(),
+                items = me.getVisibleItems(),
+                len = items.length,
+                i = 0, comp;
+
+            for (; i < len; i++) {
+                comp = items[i];
+                if (comp.collapsed) {
+                    items[i].setWidth(targetSize.width);
+                } else {
+                    items[i].setSize(null, null);
+                }
+            }
+        }
+        me.updatePanelClasses();
+
+        return me;
+    },
+
+    updatePanelClasses: function() {
+        var children = this.getLayoutItems(),
+            ln = children.length,
+            siblingCollapsed = true,
+            i, child;
+
+        for (i = 0; i < ln; i++) {
+            child = children[i];
+
+            
+            
+            if (Ext.isWindows) {
+                child.el.dom.scrollTop = 0;
+            }
+
+            if (siblingCollapsed) {
+                child.header.removeCls(Ext.baseCSSPrefix + 'accordion-hd-sibling-expanded');
+            }
+            else {
+                child.header.addCls(Ext.baseCSSPrefix + 'accordion-hd-sibling-expanded');
+            }
+
+            if (i + 1 == ln && child.collapsed) {
+                child.header.addCls(Ext.baseCSSPrefix + 'accordion-hd-last-collapsed');
+            }
+            else {
+                child.header.removeCls(Ext.baseCSSPrefix + 'accordion-hd-last-collapsed');
+            }
+            siblingCollapsed = child.collapsed;
+        }
+    },
+    
+    animCallback: function(){
+        Ext.Array.forEach(this.toCollapse, function(comp){
+            comp.fireEvent('collapse', comp);
+        });
+        
+        Ext.Array.forEach(this.toExpand, function(comp){
+            comp.fireEvent('expand', comp);
+        });    
+    },
+    
+    setupEvents: function(){
+        this.toCollapse = [];
+        this.toExpand = [];    
+    },
+
+    
+    
+    
+    onComponentExpand: function(toExpand) {
+        var me = this,
+            it = me.owner.items.items,
+            len = it.length,
+            i = 0,
+            comp;
+
+        me.setupEvents();
+        for (; i < len; i++) {
+            comp = it[i];
+            if (comp === toExpand && comp.collapsed) {
+                me.setExpanded(comp);
+            } else if (!me.multi && (comp.rendered && comp.header.rendered && comp !== toExpand && !comp.collapsed)) {
+                me.setCollapsed(comp);
+            }
+        }
+
+        me.animate = me.initialAnimate;
+        if (me.activeOnTop) {
+            
+            me.owner.insert(0, toExpand); 
+        } else {
+            me.layout();
+        }
+        me.animate = false;
+        return false;
+    },
+
+    onComponentCollapse: function(comp) {
+        var me = this,
+            toExpand = comp.next() || comp.prev(),
+            expanded = me.multi ? me.owner.query('>panel:not([collapsed])') : [];
+
+        me.setupEvents();
+        
+        
+        if (me.multi) {
+            me.setCollapsed(comp);
+
+            
+            
+            if (expanded.length === 1 && expanded[0] === comp) {
+                me.setExpanded(toExpand);
+            }
+
+            me.animate = me.initialAnimate;
+            me.layout();
+            me.animate = false;
+        }
+        
+        else if (toExpand) {
+            me.onComponentExpand(toExpand);
+        }
+        return false;
+    },
+
+    onComponentShow: function(comp) {
+        
+        this.onComponentExpand(comp);
+    },
+
+    setCollapsed: function(comp) {
+        var otherDocks = comp.getDockedItems(),
+            dockItem,
+            len = otherDocks.length,
+            i = 0;
+
+        
+        comp.hiddenDocked = [];
+        for (; i < len; i++) {
+            dockItem = otherDocks[i];
+            if ((dockItem !== comp.header) && !dockItem.hidden) {
+                dockItem.hidden = true;
+                comp.hiddenDocked.push(dockItem);
+            }
+        }
+        comp.addCls(comp.collapsedCls);
+        comp.header.addCls(comp.collapsedHeaderCls);
+        comp.height = comp.header.getHeight();
+        comp.el.setHeight(comp.height);
+        comp.collapsed = true;
+        delete comp.flex;
+        if (this.initialAnimate) {
+            this.toCollapse.push(comp);
+        } else {
+            comp.fireEvent('collapse', comp);
+        }
+        if (comp.collapseTool) {
+            comp.collapseTool.setType('expand-' + comp.getOppositeDirection(comp.collapseDirection));
+        }
+    },
+
+    setExpanded: function(comp) {
+        var otherDocks = comp.hiddenDocked,
+            len = otherDocks ? otherDocks.length : 0,
+            i = 0;
+
+        
+        for (; i < len; i++) {
+            otherDocks[i].show();
+        }
+
+        
+        if (!comp.body.isVisible()) {
+            comp.body.show();
+        }
+        delete comp.collapsed;
+        delete comp.height;
+        delete comp.componentLayout.lastComponentSize;
+        comp.suspendLayout = false;
+        comp.flex = 1;
+        comp.removeCls(comp.collapsedCls);
+        comp.header.removeCls(comp.collapsedHeaderCls);
+         if (this.initialAnimate) {
+            this.toExpand.push(comp);
+        } else {
+            comp.fireEvent('expand', comp);
+        }
+        if (comp.collapseTool) {
+            comp.collapseTool.setType('collapse-' + comp.collapseDirection);
+        }
+        comp.setAutoScroll(comp.initialConfig.autoScroll);
+    }
+});
+
+Ext.define('Ext.resizer.Splitter', {
+    extend: 'Ext.Component',
+    requires: ['Ext.XTemplate'],
+    uses: ['Ext.resizer.SplitterTracker'],
+    alias: 'widget.splitter',
+
+    renderTpl: [
+        '<tpl if="collapsible===true">',
+            '<div id="{id}-collapseEl" class="', Ext.baseCSSPrefix, 'collapse-el ',
+                    Ext.baseCSSPrefix, 'layout-split-{collapseDir}"> </div>',
+        '</tpl>'
+    ],
+
+    baseCls: Ext.baseCSSPrefix + 'splitter',
+    collapsedClsInternal: Ext.baseCSSPrefix + 'splitter-collapsed',
+
+    
+    collapsible: false,
+
+    
+
+    
+    collapseOnDblClick: true,
+
+    
+    defaultSplitMin: 40,
+
+    
+    defaultSplitMax: 1000,
+
+    
+
+    width: 5,
+    height: 5,
+
+    
+    collapseTarget: 'next',
+
+    
+
+    onRender: function() {
+        var me = this,
+            target = me.getCollapseTarget(),
+            collapseDir = me.getCollapseDirection();
+
+        Ext.applyIf(me.renderData, {
+            collapseDir: collapseDir,
+            collapsible: me.collapsible || target.collapsible
+        });
+
+        me.addChildEls('collapseEl');
+
+        this.callParent(arguments);
+
+        
+        if (me.performCollapse !== false) {
+            if (me.renderData.collapsible) {
+                me.mon(me.collapseEl, 'click', me.toggleTargetCmp, me);
+            }
+            if (me.collapseOnDblClick) {
+                me.mon(me.el, 'dblclick', me.toggleTargetCmp, me);
+            }
+        }
+
+        
+        me.mon(target, 'collapse', me.onTargetCollapse, me);
+        me.mon(target, 'expand', me.onTargetExpand, me);
+
+        me.el.addCls(me.baseCls + '-' + me.orientation);
+        me.el.unselectable();
+
+        me.tracker = Ext.create('Ext.resizer.SplitterTracker', {
+            el: me.el
+        });
+
+        
+        me.relayEvents(me.tracker, [ 'beforedragstart', 'dragstart', 'dragend' ]);
+    },
+
+    getCollapseDirection: function() {
+        var me = this,
+            idx,
+            type = me.ownerCt.layout.type;
+
+        
+        
+        
+        
+        
+        
+        
+        if (me.collapseTarget.isComponent) {
+            idx = Number(me.ownerCt.items.indexOf(me.collapseTarget) == me.ownerCt.items.indexOf(me) - 1) << 1 | Number(type == 'hbox');
+        } else {
+            idx = Number(me.collapseTarget == 'prev') << 1 | Number(type == 'hbox');
+        }
+
+        
+        me.orientation = ['horizontal', 'vertical'][idx & 1];
+        return ['bottom', 'right', 'top', 'left'][idx];
+    },
+
+    getCollapseTarget: function() {
+        var me = this;
+
+        return me.collapseTarget.isComponent ? me.collapseTarget : me.collapseTarget == 'prev' ? me.previousSibling() : me.nextSibling();
+    },
+
+    onTargetCollapse: function(target) {
+        this.el.addCls([this.collapsedClsInternal, this.collapsedCls]);
+    },
+
+    onTargetExpand: function(target) {
+        this.el.removeCls([this.collapsedClsInternal, this.collapsedCls]);
+    },
+
+    toggleTargetCmp: function(e, t) {
+        var cmp = this.getCollapseTarget();
+
+        if (cmp.isVisible()) {
+            
+            if (cmp.collapsed) {
+                cmp.expand(cmp.animCollapse);
+            
+            } else {
+                cmp.collapse(this.renderData.collapseDir, cmp.animCollapse);
+            }
+        }
+    },
+
+    
+    setSize: function() {
+        var me = this;
+        me.callParent(arguments);
+        if (Ext.isIE) {
+            me.el.repaint();
+        }
+    }
+});
+
+
+Ext.define('Ext.layout.container.Border', {
+
+    alias: ['layout.border'],
+    extend: 'Ext.layout.container.Container',
+    requires: ['Ext.resizer.Splitter', 'Ext.container.Container', 'Ext.fx.Anim'],
+    alternateClassName: 'Ext.layout.BorderLayout',
+
+    targetCls: Ext.baseCSSPrefix + 'border-layout-ct',
+
+    itemCls: Ext.baseCSSPrefix + 'border-item',
+
+    bindToOwnerCtContainer: true,
+
+    percentageRe: /(\d+)%/,
+
+    slideDirection: {
+        north: 't',
+        south: 'b',
+        west: 'l',
+        east: 'r'
+    },
+
+    constructor: function(config) {
+        this.initialConfig = config;
+        this.callParent(arguments);
+    },
+
+    onLayout: function() {
+        var me = this;
+        if (!me.borderLayoutInitialized) {
+            me.initializeBorderLayout();
+        }
+
+        
+        me.fixHeightConstraints();
+        me.shadowLayout.onLayout();
+        if (me.embeddedContainer) {
+            me.embeddedContainer.layout.onLayout();
+        }
+
+        
+        
+        if (!me.initialCollapsedComplete) {
+            Ext.iterate(me.regions, function(name, region){
+                if (region.borderCollapse) {
+                    me.onBeforeRegionCollapse(region, region.collapseDirection, false, 0);
+                }
+            });
+            me.initialCollapsedComplete = true;
+        }
+    },
+
+    isValidParent : function(item, target, position) {
+        if (!this.borderLayoutInitialized) {
+            this.initializeBorderLayout();
+        }
+
+        
+        return this.shadowLayout.isValidParent(item, target, position);
+    },
+
+    beforeLayout: function() {
+        if (!this.borderLayoutInitialized) {
+            this.initializeBorderLayout();
+        }
+
+        
+        this.shadowLayout.beforeLayout();
+
+        
+    },
+
+    renderItems: function(items, target) {
+    },
+
+    renderItem: function(item) {
+    },
+
+    renderChildren: function() {
+        if (!this.borderLayoutInitialized) {
+            this.initializeBorderLayout();
+        }
+
+        this.shadowLayout.renderChildren();
+    },
+
+    
+    getVisibleItems: function() {
+        return Ext.ComponentQuery.query(':not([slideOutAnim])', this.callParent(arguments));
+    },
+
+    initializeBorderLayout: function() {
+        var me = this,
+            i = 0,
+            items = me.getLayoutItems(),
+            ln = items.length,
+            regions = (me.regions = {}),
+            vBoxItems = [],
+            hBoxItems = [],
+            horizontalFlex = 0,
+            verticalFlex = 0,
+            comp, percentage;
+
+        
+        me.splitters = {};
+
+        
+        for (; i < ln; i++) {
+            comp = items[i];
+            regions[comp.region] = comp;
+
+            
+            if (comp.region != 'center' && comp.collapsible && comp.collapseMode != 'header') {
+
+                
+                comp.borderCollapse = comp.collapsed;
+                comp.collapsed = false;
+
+                comp.on({
+                    beforecollapse: me.onBeforeRegionCollapse,
+                    beforeexpand: me.onBeforeRegionExpand,
+                    destroy: me.onRegionDestroy,
+                    scope: me
+                });
+                me.setupState(comp);
+            }
+        }
+        comp = regions.center;
+        if (!comp.flex) {
+            comp.flex = 1;
+        }
+        delete comp.width;
+        comp.maintainFlex = true;
+
+        
+        comp = regions.west;
+        if (comp) {
+            comp.collapseDirection = Ext.Component.DIRECTION_LEFT;
+            hBoxItems.push(comp);
+            if (comp.split) {
+                hBoxItems.push(me.splitters.west = me.createSplitter(comp));
+            }
+            percentage = Ext.isString(comp.width) && comp.width.match(me.percentageRe);
+            if (percentage) {
+                horizontalFlex += (comp.flex = parseInt(percentage[1], 10) / 100);
+                delete comp.width;
+            }
+        }
+        comp = regions.north;
+        if (comp) {
+            comp.collapseDirection = Ext.Component.DIRECTION_TOP;
+            vBoxItems.push(comp);
+            if (comp.split) {
+                vBoxItems.push(me.splitters.north = me.createSplitter(comp));
+            }
+            percentage = Ext.isString(comp.height) && comp.height.match(me.percentageRe);
+            if (percentage) {
+                verticalFlex += (comp.flex = parseInt(percentage[1], 10) / 100);
+                delete comp.height;
+            }
+        }
+
+        
+        if (regions.north || regions.south) {
+            if (regions.east || regions.west) {
+
+                
+                vBoxItems.push(me.embeddedContainer = Ext.create('Ext.container.Container', {
+                    xtype: 'container',
+                    region: 'center',
+                    id: me.owner.id + '-embedded-center',
+                    cls: Ext.baseCSSPrefix + 'border-item',
+                    flex: regions.center.flex,
+                    maintainFlex: true,
+                    layout: {
+                        type: 'hbox',
+                        align: 'stretch',
+                        getVisibleItems: me.getVisibleItems
+                    }
+                }));
+                hBoxItems.push(regions.center);
+            }
+            
+            else {
+                vBoxItems.push(regions.center);
+            }
+        }
+        
+        else {
+            hBoxItems.push(regions.center);
+        }
+
+        
+        comp = regions.south;
+        if (comp) {
+            comp.collapseDirection = Ext.Component.DIRECTION_BOTTOM;
+            if (comp.split) {
+                vBoxItems.push(me.splitters.south = me.createSplitter(comp));
+            }
+            percentage = Ext.isString(comp.height) && comp.height.match(me.percentageRe);
+            if (percentage) {
+                verticalFlex += (comp.flex = parseInt(percentage[1], 10) / 100);
+                delete comp.height;
+            }
+            vBoxItems.push(comp);
+        }
+        comp = regions.east;
+        if (comp) {
+            comp.collapseDirection = Ext.Component.DIRECTION_RIGHT;
+            if (comp.split) {
+                hBoxItems.push(me.splitters.east = me.createSplitter(comp));
+            }
+            percentage = Ext.isString(comp.width) && comp.width.match(me.percentageRe);
+            if (percentage) {
+                horizontalFlex += (comp.flex = parseInt(percentage[1], 10) / 100);
+                delete comp.width;
+            }
+            hBoxItems.push(comp);
+        }
+
+        
+        
+        
+        
+        if (regions.north || regions.south) {
+
+            me.shadowContainer = Ext.create('Ext.container.Container', {
+                ownerCt: me.owner,
+                el: me.getTarget(),
+                layout: Ext.applyIf({
+                    type: 'vbox',
+                    align: 'stretch',
+                    getVisibleItems: me.getVisibleItems
+                }, me.initialConfig)
+            });
+            me.createItems(me.shadowContainer, vBoxItems);
+
+            
+            if (me.splitters.north) {
+                me.splitters.north.ownerCt = me.shadowContainer;
+            }
+            if (me.splitters.south) {
+                me.splitters.south.ownerCt = me.shadowContainer;
+            }
+
+            
+            if (me.embeddedContainer) {
+                me.embeddedContainer.ownerCt = me.shadowContainer;
+                me.createItems(me.embeddedContainer, hBoxItems);
+
+                
+                if (me.splitters.east) {
+                    me.splitters.east.ownerCt = me.embeddedContainer;
+                }
+                if (me.splitters.west) {
+                    me.splitters.west.ownerCt = me.embeddedContainer;
+                }
+
+                
+                
+                
+                
+                
+                Ext.each([me.splitters.north, me.splitters.south], function (splitter) {
+                    if (splitter) {
+                        splitter.on('beforedragstart', me.fixHeightConstraints, me);
+                    }
+                });
+
+                
+                if (horizontalFlex) {
+                    regions.center.flex -= horizontalFlex;
+                }
+                
+                if (verticalFlex) {
+                    me.embeddedContainer.flex -= verticalFlex;
+                }
+            } else {
+                
+                if (verticalFlex) {
+                    regions.center.flex -= verticalFlex;
+                }
+            }
+        }
+        
+        
+        else {
+            me.shadowContainer = Ext.create('Ext.container.Container', {
+                ownerCt: me.owner,
+                el: me.getTarget(),
+                layout: Ext.applyIf({
+                    type: (hBoxItems.length == 1) ? 'fit' : 'hbox',
+                    align: 'stretch'
+                }, me.initialConfig)
+            });
+            me.createItems(me.shadowContainer, hBoxItems);
+
+            
+            if (me.splitters.east) {
+                me.splitters.east.ownerCt = me.shadowContainer;
+            }
+            if (me.splitters.west) {
+                me.splitters.west.ownerCt = me.shadowContainer;
+            }
+
+            
+            if (horizontalFlex) {
+                regions.center.flex -= verticalFlex;
+            }
+        }
+
+        
+        for (i = 0, items = me.shadowContainer.items.items, ln = items.length; i < ln; i++) {
+            items[i].shadowOwnerCt = me.shadowContainer;
+        }
+        if (me.embeddedContainer) {
+            for (i = 0, items = me.embeddedContainer.items.items, ln = items.length; i < ln; i++) {
+                items[i].shadowOwnerCt = me.embeddedContainer;
+            }
+        }
+
+        
+        me.shadowLayout = me.shadowContainer.getLayout();
+
+        me.borderLayoutInitialized = true;
+    },
+
+    setupState: function(comp){
+        var getState = comp.getState;
+        comp.getState = function(){
+            
+            var state = getState.call(comp) || {},
+                region = comp.region;
+
+            state.collapsed = !!comp.collapsed;
+            if (region == 'west' || region == 'east') {
+                state.width = comp.getWidth();
+            } else {
+                state.height = comp.getHeight();
+            }
+            return state;
+        };
+        comp.addStateEvents(['collapse', 'expand', 'resize']);
+    },
+
+    
+    createItems: function(container, items){
+        
+        
+        delete container.items;
+        container.initItems();
+        container.items.addAll(items);
+    },
+
+    
+    
+    createSplitter: function(comp) {
+        var me = this,
+            interceptCollapse = (comp.collapseMode != 'header'),
+            resizer;
+
+        resizer = Ext.create('Ext.resizer.Splitter', {
+            hidden: !!comp.hidden,
+            collapseTarget: comp,
+            performCollapse: !interceptCollapse,
+            listeners: interceptCollapse ? {
+                click: {
+                    fn: Ext.Function.bind(me.onSplitterCollapseClick, me, [comp]),
+                    element: 'collapseEl'
+                }
+            } : null
+        });
+
+        
+        if (comp.collapseMode == 'mini') {
+            comp.placeholder = resizer;
+            resizer.collapsedCls = comp.collapsedCls;
+        }
+
+        
+        comp.on({
+            hide: me.onRegionVisibilityChange,
+            show: me.onRegionVisibilityChange,
+            scope: me
+        });
+        return resizer;
+    },
+
+    
+    
+    fixHeightConstraints: function () {
+        var me = this,
+            ct = me.embeddedContainer,
+            maxHeight = 1e99, minHeight = -1;
+
+        if (!ct) {
+            return;
+        }
+
+        ct.items.each(function (item) {
+            if (Ext.isNumber(item.maxHeight)) {
+                maxHeight = Math.max(maxHeight, item.maxHeight);
+            }
+            if (Ext.isNumber(item.minHeight)) {
+                minHeight = Math.max(minHeight, item.minHeight);
+            }
+        });
+
+        ct.maxHeight = maxHeight;
+        ct.minHeight = minHeight;
+    },
+
+    
+    onRegionVisibilityChange: function(comp){
+        this.splitters[comp.region][comp.hidden ? 'hide' : 'show']();
+        this.layout();
+    },
+
+    
+    
+    
+    onSplitterCollapseClick: function(comp) {
+        if (comp.collapsed) {
+            this.onPlaceHolderToolClick(null, null, null, {client: comp});
+        } else {
+            comp.collapse();
+        }
+    },
+
+    
+    getPlaceholder: function(comp) {
+        var me = this,
+            placeholder = comp.placeholder,
+            shadowContainer = comp.shadowOwnerCt,
+            shadowLayout = shadowContainer.layout,
+            oppositeDirection = Ext.panel.Panel.prototype.getOppositeDirection(comp.collapseDirection),
+            horiz = (comp.region == 'north' || comp.region == 'south');
+
+        
+        if (comp.collapseMode == 'header') {
+            return;
+        }
+
+        
+        if (!placeholder) {
+            if (comp.collapseMode == 'mini') {
+                placeholder = Ext.create('Ext.resizer.Splitter', {
+                    id: 'collapse-placeholder-' + comp.id,
+                    collapseTarget: comp,
+                    performCollapse: false,
+                    listeners: {
+                        click: {
+                            fn: Ext.Function.bind(me.onSplitterCollapseClick, me, [comp]),
+                            element: 'collapseEl'
+                        }
+                    }
+                });
+                placeholder.addCls(placeholder.collapsedCls);
+            } else {
+                placeholder = {
+                    id: 'collapse-placeholder-' + comp.id,
+                    margins: comp.initialConfig.margins || Ext.getClass(comp).prototype.margins,
+                    xtype: 'header',
+                    orientation: horiz ? 'horizontal' : 'vertical',
+                    title: comp.title,
+                    textCls: comp.headerTextCls,
+                    iconCls: comp.iconCls,
+                    baseCls: comp.baseCls + '-header',
+                    ui: comp.ui,
+                    indicateDrag: comp.draggable,
+                    cls: Ext.baseCSSPrefix + 'region-collapsed-placeholder ' + Ext.baseCSSPrefix + 'region-collapsed-' + comp.collapseDirection + '-placeholder ' + comp.collapsedCls,
+                    listeners: comp.floatable ? {
+                        click: {
+                            fn: function(e) {
+                                me.floatCollapsedPanel(e, comp);
+                            },
+                            element: 'el'
+                        }
+                    } : null
+                };
+                
+                if ((Ext.isIE6 || Ext.isIE7 || (Ext.isIEQuirks)) && !horiz) {
+                    placeholder.width = 25;
+                }
+                if (!comp.hideCollapseTool) {
+                    placeholder[horiz ? 'tools' : 'items'] = [{
+                        xtype: 'tool',
+                        client: comp,
+                        type: 'expand-' + oppositeDirection,
+                        handler: me.onPlaceHolderToolClick,
+                        scope: me
+                    }];
+                }
+            }
+            placeholder = me.owner.createComponent(placeholder);
+            if (comp.isXType('panel')) {
+                comp.on({
+                    titlechange: me.onRegionTitleChange,
+                    iconchange: me.onRegionIconChange,
+                    scope: me
+                });
+            }
+        }
+
+        
+        comp.placeholder = placeholder;
+        placeholder.comp = comp;
+
+        return placeholder;
+    },
+
+    
+    onRegionTitleChange: function(comp, newTitle) {
+        comp.placeholder.setTitle(newTitle);
+    },
+
+    
+    onRegionIconChange: function(comp, newIconCls) {
+        comp.placeholder.setIconCls(newIconCls);
+    },
+
+    
+    calculateChildBox: function(comp) {
+        var me = this;
+        if (me.shadowContainer.items.contains(comp)) {
+            return me.shadowContainer.layout.calculateChildBox(comp);
+        }
+        else if (me.embeddedContainer && me.embeddedContainer.items.contains(comp)) {
+            return me.embeddedContainer.layout.calculateChildBox(comp);
+        }
+    },
+
+    
+    onBeforeRegionCollapse: function(comp, direction, animate) {
+        if (comp.collapsedChangingLayout) {
+            return false;
+        }
+        comp.collapsedChangingLayout = true;
+        var me = this,
+            compEl = comp.el,
+            width,
+            miniCollapse = comp.collapseMode == 'mini',
+            shadowContainer = comp.shadowOwnerCt,
+            shadowLayout = shadowContainer.layout,
+            placeholder = comp.placeholder,
+            sl = me.owner.suspendLayout,
+            scsl = shadowContainer.suspendLayout,
+            isNorthOrWest = (comp.region == 'north' || comp.region == 'west'); 
+
+        
+        me.owner.suspendLayout = true;
+        shadowContainer.suspendLayout = true;
+
+        
+        shadowLayout.layoutBusy = true;
+        if (shadowContainer.componentLayout) {
+            shadowContainer.componentLayout.layoutBusy = true;
+        }
+        me.shadowContainer.layout.layoutBusy = true;
+        me.layoutBusy = true;
+        me.owner.componentLayout.layoutBusy = true;
+
+        
+        if (!placeholder) {
+            placeholder = me.getPlaceholder(comp);
+        }
+
+        
+        if (placeholder.shadowOwnerCt === shadowContainer) {
+            placeholder.show();
+        }
+        
+        
+        
+        else {
+            shadowContainer.insert(shadowContainer.items.indexOf(comp) + (isNorthOrWest ? 0 : 1), placeholder);
+            placeholder.shadowOwnerCt = shadowContainer;
+            placeholder.ownerCt = me.owner;
+        }
+
+        
+        
+        
+        comp.hidden = true;
+
+        if (!placeholder.rendered) {
+            shadowLayout.renderItem(placeholder, shadowLayout.innerCt);
+
+            
+            
+            
+            
+            
+            if (comp.region == 'north' || comp.region == 'south') {
+                placeholder.setCalculatedSize(comp.getWidth());
+            } else {
+                placeholder.setCalculatedSize(undefined, comp.getHeight());
+            }
+        }
+
+        
+        function afterCollapse() {
+            
+            me.owner.suspendLayout = sl;
+            shadowContainer.suspendLayout = scsl;
+            delete shadowLayout.layoutBusy;
+            if (shadowContainer.componentLayout) {
+                delete shadowContainer.componentLayout.layoutBusy;
+            }
+            delete me.shadowContainer.layout.layoutBusy;
+            delete me.layoutBusy;
+            delete me.owner.componentLayout.layoutBusy;
+            delete comp.collapsedChangingLayout;
+
+            
+            comp.collapsed = true;
+            comp.fireEvent('collapse', comp);
+        }
+
+        
+        if (comp.animCollapse && me.initialCollapsedComplete) {
+            shadowLayout.layout();
+            compEl.dom.style.zIndex = 100;
+
+            
+            if (!miniCollapse) {
+                placeholder.el.hide();
+            }
+            compEl.slideOut(me.slideDirection[comp.region], {
+                duration: Ext.Number.from(comp.animCollapse, Ext.fx.Anim.prototype.duration),
+                listeners: {
+                    afteranimate: function() {
+                        compEl.show().setLeftTop(-10000, -10000);
+                        compEl.dom.style.zIndex = '';
+
+                        
+                       if (!miniCollapse) {
+                            placeholder.el.slideIn(me.slideDirection[comp.region], {
+                                easing: 'linear',
+                                duration: 100
+                            });
+                        }
+                        afterCollapse();
+                    }
+                }
+            });
+        } else {
+            compEl.setLeftTop(-10000, -10000);
+            shadowLayout.layout();
+            afterCollapse();
+        }
+
+        return false;
+    },
+
+    
+    onBeforeRegionExpand: function(comp, animate) {
+        
+        this.onPlaceHolderToolClick(null, null, null, {client: comp, shouldFireBeforeexpand: false});
+        return false;
+    },
+
+    
+    onPlaceHolderToolClick: function(e, target, owner, tool) {
+        var me = this,
+            comp = tool.client,
+
+            
+            hidePlaceholder = (comp.collapseMode != 'mini') || !comp.split,
+            compEl = comp.el,
+            toCompBox,
+            placeholder = comp.placeholder,
+            placeholderEl = placeholder.el,
+            shadowContainer = comp.shadowOwnerCt,
+            shadowLayout = shadowContainer.layout,
+            curSize,
+            sl = me.owner.suspendLayout,
+            scsl = shadowContainer.suspendLayout,
+            isFloating;
+
+        if (comp.collapsedChangingLayout) {
+            return false;
+        }
+        if (tool.shouldFireBeforeexpand !== false && comp.fireEvent('beforeexpand', comp, true) === false) {
+            return false;
+        }
+        comp.collapsedChangingLayout = true;
+        
+        
+        
+        if (comp.getActiveAnimation()) {
+            comp.stopAnimation();
+        }
+
+        
+        
+        
+        if (comp.slideOutAnim) {
+            
+            compEl.un(comp.panelMouseMon);
+            placeholderEl.un(comp.placeholderMouseMon);
+
+            delete comp.slideOutAnim;
+            delete comp.panelMouseMon;
+            delete comp.placeholderMouseMon;
+
+            
+            isFloating = true;
+        }
+
+        
+        me.owner.suspendLayout = true;
+        shadowContainer.suspendLayout = true;
+
+        
+        shadowLayout.layoutBusy = true;
+        if (shadowContainer.componentLayout) {
+            shadowContainer.componentLayout.layoutBusy = true;
+        }
+        me.shadowContainer.layout.layoutBusy = true;
+        me.layoutBusy = true;
+        me.owner.componentLayout.layoutBusy = true;
+
+        
+        
+        comp.hidden = false;
+        comp.collapsed = false;
+        if (hidePlaceholder) {
+            placeholder.hidden = true;
+        }
+        toCompBox = shadowLayout.calculateChildBox(comp);
+
+        
+        if (comp.collapseTool) {
+            comp.collapseTool.show();
+        }
+
+        
+        if (comp.animCollapse && !isFloating) {
+            compEl.setStyle('visibility', 'hidden');
+        }
+        compEl.setLeftTop(toCompBox.left, toCompBox.top);
+
+        
+        
+        curSize = comp.getSize();
+        if (curSize.height != toCompBox.height || curSize.width != toCompBox.width) {
+            me.setItemSize(comp, toCompBox.width, toCompBox.height);
+        }
+
+        
+        function afterExpand() {
+            
+            me.owner.suspendLayout = sl;
+            shadowContainer.suspendLayout = scsl;
+            delete shadowLayout.layoutBusy;
+            if (shadowContainer.componentLayout) {
+                delete shadowContainer.componentLayout.layoutBusy;
+            }
+            delete me.shadowContainer.layout.layoutBusy;
+            delete me.layoutBusy;
+            delete me.owner.componentLayout.layoutBusy;
+            delete comp.collapsedChangingLayout;
+
+            
+            comp.removeCls(Ext.baseCSSPrefix + 'border-region-slide-in');
+
+            
+            comp.fireEvent('expand', comp);
+        }
+
+        
+        if (hidePlaceholder) {
+            placeholder.el.hide();
+        }
+
+        
+        
+        if (comp.animCollapse && !isFloating) {
+            compEl.dom.style.zIndex = 100;
+            compEl.slideIn(me.slideDirection[comp.region], {
+                duration: Ext.Number.from(comp.animCollapse, Ext.fx.Anim.prototype.duration),
+                listeners: {
+                    afteranimate: function() {
+                        compEl.dom.style.zIndex = '';
+                        comp.hidden = false;
+                        shadowLayout.onLayout();
+                        afterExpand();
+                    }
+                }
+            });
+        } else {
+            shadowLayout.onLayout();
+            afterExpand();
+        }
+    },
+
+    floatCollapsedPanel: function(e, comp) {
+
+        if (comp.floatable === false) {
+            return;
+        }
+
+        var me = this,
+            compEl = comp.el,
+            placeholder = comp.placeholder,
+            placeholderEl = placeholder.el,
+            shadowContainer = comp.shadowOwnerCt,
+            shadowLayout = shadowContainer.layout,
+            placeholderBox = shadowLayout.getChildBox(placeholder),
+            scsl = shadowContainer.suspendLayout,
+            curSize, toCompBox, compAnim;
+
+        
+        if (e.getTarget('.' + Ext.baseCSSPrefix + 'tool')) {
+            return;
+        }
+
+        
+        
+        if (compEl.getActiveAnimation()) {
+            return;
+        }
+
+        
+        
+        if (comp.slideOutAnim) {
+            me.slideOutFloatedComponent(comp);
+            return;
+        }
+
+        
+        
+        function onMouseLeaveFloated(e) {
+            var slideRegion = compEl.getRegion().union(placeholderEl.getRegion()).adjust(1, -1, -1, 1);
+
+            
+            if (!slideRegion.contains(e.getPoint())) {
+                me.slideOutFloatedComponent(comp);
+            }
+        }
+
+        
+        comp.placeholderMouseMon = placeholderEl.monitorMouseLeave(500, onMouseLeaveFloated);
+
+        
+        shadowContainer.suspendLayout = true;
+
+        
+        me.layoutBusy = true;
+        me.owner.componentLayout.layoutBusy = true;
+
+        
+        
+        if (comp.collapseTool) {
+            comp.collapseTool.hide();
+        }
+
+        
+        comp.hidden = false;
+        comp.collapsed = false;
+        placeholder.hidden = true;
+
+        
+        toCompBox = shadowLayout.calculateChildBox(comp);
+        placeholder.hidden = false;
+
+        
+        if (comp.region == 'north' || comp.region == 'west') {
+            toCompBox[shadowLayout.parallelBefore] += placeholderBox[shadowLayout.parallelPrefix] - 1;
+        } else {
+            toCompBox[shadowLayout.parallelBefore] -= (placeholderBox[shadowLayout.parallelPrefix] - 1);
+        }
+        compEl.setStyle('visibility', 'hidden');
+        compEl.setLeftTop(toCompBox.left, toCompBox.top);
+
+        
+        
+        curSize = comp.getSize();
+        if (curSize.height != toCompBox.height || curSize.width != toCompBox.width) {
+            me.setItemSize(comp, toCompBox.width, toCompBox.height);
+        }
+
+        
+        compAnim = {
+            listeners: {
+                afteranimate: function() {
+                    shadowContainer.suspendLayout = scsl;
+                    delete me.layoutBusy;
+                    delete me.owner.componentLayout.layoutBusy;
+
+                    
+                    compAnim.listeners = {
+                        afterAnimate: function() {
+                            compEl.show().removeCls(Ext.baseCSSPrefix + 'border-region-slide-in').setLeftTop(-10000, -10000);
+
+                            
+                            comp.hidden = true;
+                            comp.collapsed = true;
+                            delete comp.slideOutAnim;
+                            delete comp.panelMouseMon;
+                            delete comp.placeholderMouseMon;
+                        }
+                    };
+                    comp.slideOutAnim = compAnim;
+                }
+            },
+            duration: 500
+        };
+
+        
+        compEl.addCls(Ext.baseCSSPrefix + 'border-region-slide-in');
+
+        
+        compEl.slideIn(me.slideDirection[comp.region], compAnim);
+
+        
+        comp.panelMouseMon = compEl.monitorMouseLeave(500, onMouseLeaveFloated);
+
+    },
+
+    slideOutFloatedComponent: function(comp) {
+        var compEl = comp.el,
+            slideOutAnim;
+
+        
+        compEl.un(comp.panelMouseMon);
+        comp.placeholder.el.un(comp.placeholderMouseMon);
+
+        
+        compEl.slideOut(this.slideDirection[comp.region], comp.slideOutAnim);
+
+        delete comp.slideOutAnim;
+        delete comp.panelMouseMon;
+        delete comp.placeholderMouseMon;
+    },
+
+    
+    onRegionDestroy: function(comp) {
+        var placeholder = comp.placeholder;
+        if (placeholder) {
+            delete placeholder.ownerCt;
+            placeholder.destroy();
+        }
+    },
+
+    
+    onDestroy: function() {
+        var me = this,
+            shadowContainer = me.shadowContainer,
+            embeddedContainer = me.embeddedContainer;
+
+        if (shadowContainer) {
+            delete shadowContainer.ownerCt;
+            Ext.destroy(shadowContainer);
+        }
+
+        if (embeddedContainer) {
+            delete embeddedContainer.ownerCt;
+            Ext.destroy(embeddedContainer);
+        }
+        delete me.regions;
+        delete me.splitters;
+        delete me.shadowContainer;
+        delete me.embeddedContainer;
+        me.callParent(arguments);
+    }
+});
+
+
+Ext.define('Ext.layout.container.Card', {
+
+    
+
+    alias: ['layout.card'],
+    alternateClassName: 'Ext.layout.CardLayout',
+
+    extend: 'Ext.layout.container.AbstractCard',
+
+    
+
+    
+    setActiveItem: function(newCard) {
+        var me = this,
+            owner = me.owner,
+            oldCard = me.activeItem,
+            newIndex;
+
+        newCard = me.parseActiveItem(newCard);
+        newIndex = owner.items.indexOf(newCard);
+
+        
+        if (newIndex == -1) {
+            newIndex = owner.items.items.length;
+            owner.add(newCard);
+        }
+
+        
+        if (newCard && oldCard != newCard) {
+            
+            if (!newCard.rendered) {
+                me.renderItem(newCard, me.getRenderTarget(), owner.items.length);
+                me.configureItem(newCard, 0);
+            }
+
+            me.activeItem = newCard;
+
+            
+            if (newCard.fireEvent('beforeactivate', newCard, oldCard) === false) {
+                return false;
+            }
+            if (oldCard && oldCard.fireEvent('beforedeactivate', oldCard, newCard) === false) {
+                return false;
+            }
+
+            
+            if (me.sizeAllCards) {
+                
+                me.onLayout();
+            }
+            else {
+                me.setItemBox(newCard, me.getTargetBox());
+            }
+
+            me.owner.suspendLayout = true;
+
+            if (oldCard) {
+                if (me.hideInactive) {
+                    oldCard.hide();
+                }
+                oldCard.fireEvent('deactivate', oldCard, newCard);
+            }
+
+            
+            me.owner.suspendLayout = false;
+            if (newCard.hidden) {
+                newCard.show();
+            } else {
+                me.onLayout();
+            }
+
+            newCard.fireEvent('activate', newCard, oldCard);
+
+            return newCard;
+        }
+        return false;
+    },
+
+    configureItem: function(item) {
+        
+        
+        item.layoutManagedHeight = 0;
+        item.layoutManagedWidth = 0;
+
+        this.callParent(arguments);
+    }});
+
+Ext.define('Ext.layout.container.Column', {
+
+    extend: 'Ext.layout.container.Auto',
+    alias: ['layout.column'],
+    alternateClassName: 'Ext.layout.ColumnLayout',
+
+    type: 'column',
+
+    itemCls: Ext.baseCSSPrefix + 'column',
+
+    targetCls: Ext.baseCSSPrefix + 'column-layout-ct',
+
+    scrollOffset: 0,
+
+    bindToOwnerCtComponent: false,
+
+    getRenderTarget : function() {
+        if (!this.innerCt) {
+
+            
+            
+            this.innerCt = this.getTarget().createChild({
+                cls: Ext.baseCSSPrefix + 'column-inner'
+            });
+
+            
+            
+            
+            this.clearEl = this.innerCt.createChild({
+                cls: Ext.baseCSSPrefix + 'clear',
+                role: 'presentation'
+            });
+        }
+        return this.innerCt;
+    },
+
+    
+    onLayout : function() {
+        var me = this,
+            target = me.getTarget(),
+            items = me.getLayoutItems(),
+            len = items.length,
+            item,
+            i,
+            parallelMargins = [],
+            itemParallelMargins,
+            size,
+            availableWidth,
+            columnWidth;
+
+        size = me.getLayoutTargetSize();
+        if (size.width < len * 10) { 
+            return;
+        }
+
+        
+        
+        
+        if (me.adjustmentPass) {
+            if (Ext.isIE6 || Ext.isIE7 || Ext.isIEQuirks) {
+                size.width = me.adjustedWidth;
+            }
+        } else {
+            i = target.getStyle('overflow');
+            if (i && i != 'hidden') {
+                me.autoScroll = true;
+                if (!(Ext.isIE6 || Ext.isIE7 || Ext.isIEQuirks)) {
+                    target.setStyle('overflow', 'hidden');
+                    size = me.getLayoutTargetSize();
+                }
+            }
+        }
+
+        availableWidth = size.width - me.scrollOffset;
+        me.innerCt.setWidth(availableWidth);
+
+        
+        
+        for (i = 0; i < len; i++) {
+            item = items[i];
+            itemParallelMargins = parallelMargins[i] = item.getEl().getMargin('lr');
+            if (!item.columnWidth) {
+                availableWidth -= (item.getWidth() + itemParallelMargins);
+            }
+        }
+
+        availableWidth = availableWidth < 0 ? 0 : availableWidth;
+        for (i = 0; i < len; i++) {
+            item = items[i];
+            if (item.columnWidth) {
+                columnWidth = Math.floor(item.columnWidth * availableWidth) - parallelMargins[i];
+                me.setItemSize(item, columnWidth, item.height);
+            } else {
+                me.layoutItem(item);
+            }
+        }
+
+        
+        if (!me.adjustmentPass && me.autoScroll) {
+
+            
+            target.setStyle('overflow', 'auto');
+            me.adjustmentPass = (target.dom.scrollHeight > size.height);
+            if (Ext.isIE6 || Ext.isIE7 || Ext.isIEQuirks) {
+                me.adjustedWidth = size.width - Ext.getScrollBarWidth();
+            } else {
+                target.setStyle('overflow', 'auto');
+            }
+
+            
+            if (me.adjustmentPass) {
+                me.onLayout();
+            }
+        }
+        delete me.adjustmentPass;
+    },
+
+    configureItem: function(item) {
+        this.callParent(arguments);
+
+        if (item.columnWidth) {
+            item.layoutManagedWidth = 1;
+        }
+    }
+});
+
+Ext.define('Ext.layout.container.Table', {
+
+    
+
+    alias: ['layout.table'],
+    extend: 'Ext.layout.container.Auto',
+    alternateClassName: 'Ext.layout.TableLayout',
+
+    
+
+    
+
+    
+    monitorResize:false,
+
+    type: 'table',
+
+    
+    
+    autoSize: true,
+
+    clearEl: true, 
+
+    targetCls: Ext.baseCSSPrefix + 'table-layout-ct',
+    tableCls: Ext.baseCSSPrefix + 'table-layout',
+    cellCls: Ext.baseCSSPrefix + 'table-layout-cell',
+
+    
+    tableAttrs:null,
+
+    
+
+    
+
+    
+    renderItems: function(items) {
+        var tbody = this.getTable().tBodies[0],
+            rows = tbody.rows,
+            i = 0,
+            len = items.length,
+            cells, curCell, rowIdx, cellIdx, item, trEl, tdEl, itemCt;
+
+        
+        cells = this.calculateCells(items);
+
+        
+        
+        
+        for (; i < len; i++) {
+            curCell = cells[i];
+            rowIdx = curCell.rowIdx;
+            cellIdx = curCell.cellIdx;
+            item = items[i];
+
+            
+            trEl = rows[rowIdx];
+            if (!trEl) {
+                trEl = tbody.insertRow(rowIdx);
+                if (this.trAttrs) {
+                    trEl.set(this.trAttrs);
+                }
+            }
+
+            
+            itemCt = tdEl = Ext.get(trEl.cells[cellIdx] || trEl.insertCell(cellIdx));
+            if (this.needsDivWrap()) { 
+                itemCt = tdEl.first() || tdEl.createChild({tag: 'div'});
+                itemCt.setWidth(null);
+            }
+
+            
+            if (!item.rendered) {
+                this.renderItem(item, itemCt, 0);
+            }
+            else if (!this.isValidParent(item, itemCt, 0)) {
+                this.moveItem(item, itemCt, 0);
+            }
+
+            
+            if (this.tdAttrs) {
+                tdEl.set(this.tdAttrs);
+            }
+            tdEl.set({
+                colSpan: item.colspan || 1,
+                rowSpan: item.rowspan || 1,
+                id: item.cellId || '',
+                cls: this.cellCls + ' ' + (item.cellCls || '')
+            });
+
+            
+            if (!cells[i + 1] || cells[i + 1].rowIdx !== rowIdx) {
+                cellIdx++;
+                while (trEl.cells[cellIdx]) {
+                    trEl.deleteCell(cellIdx);
+                }
+            }
+        }
+
+        
+        rowIdx++;
+        while (tbody.rows[rowIdx]) {
+            tbody.deleteRow(rowIdx);
+        }
+    },
+
+    afterLayout: function() {
+        this.callParent();
+
+        if (this.needsDivWrap()) {
+            
+            Ext.Array.forEach(this.getLayoutItems(), function(item) {
+                Ext.fly(item.el.dom.parentNode).setWidth(item.getWidth());
+            });
+        }
+    },
+
+    
+    calculateCells: function(items) {
+        var cells = [],
+            rowIdx = 0,
+            colIdx = 0,
+            cellIdx = 0,
+            totalCols = this.columns || Infinity,
+            rowspans = [], 
+            i = 0, j,
+            len = items.length,
+            item;
+
+        for (; i < len; i++) {
+            item = items[i];
+
+            
+            while (colIdx >= totalCols || rowspans[colIdx] > 0) {
+                if (colIdx >= totalCols) {
+                    
+                    colIdx = 0;
+                    cellIdx = 0;
+                    rowIdx++;
+
+                    
+                    for (j = 0; j < totalCols; j++) {
+                        if (rowspans[j] > 0) {
+                            rowspans[j]--;
+                        }
+                    }
+                } else {
+                    colIdx++;
+                }
+            }
+
+            
+            cells.push({
+                rowIdx: rowIdx,
+                cellIdx: cellIdx
+            });
+
+            
+            for (j = item.colspan || 1; j; --j) {
+                rowspans[colIdx] = item.rowspan || 1;
+                ++colIdx;
+            }
+            ++cellIdx;
+        }
+
+        return cells;
+    },
+
+    
+    getTable: function() {
+        var table = this.table;
+        if (!table) {
+            table = this.table = this.getTarget().createChild(
+                Ext.apply({
+                    tag: 'table',
+                    role: 'presentation',
+                    cls: this.tableCls,
+                    cellspacing: 0, 
+                    cn: {tag: 'tbody'}
+                }, this.tableAttrs),
+                null, true
+            );
+        }
+        return table;
+    },
+
+    
+    needsDivWrap: function() {
+        return Ext.isOpera10_5;
+    }
+});
+
+Ext.define('Ext.menu.Item', {
+    extend: 'Ext.Component',
+    alias: 'widget.menuitem',
+    alternateClassName: 'Ext.menu.TextItem',
+
+    
+
+    
+
+    
+    activeCls: Ext.baseCSSPrefix + 'menu-item-active',
+
+    
+    ariaRole: 'menuitem',
+
+    
+    canActivate: true,
+
+    
+    clickHideDelay: 1,
+
+    
+    destroyMenu: true,
+
+    
+    disabledCls: Ext.baseCSSPrefix + 'menu-item-disabled',
+
+    
+
+     
+
+    
+    hideOnClick: true,
+
+    
+
+    
+
+    isMenuItem: true,
+
+    
+
+    
+    menuAlign: 'tl-tr?',
+
+    
+    menuExpandDelay: 200,
+
+    
+    menuHideDelay: 200,
+
+    
+
+    renderTpl: [
+        '<tpl if="plain">',
+            '{text}',
+        '</tpl>',
+        '<tpl if="!plain">',
+            '<a id="{id}-itemEl" class="' + Ext.baseCSSPrefix + 'menu-item-link" href="{href}" <tpl if="hrefTarget">target="{hrefTarget}"</tpl> hidefocus="true" unselectable="on">',
+                '<img id="{id}-iconEl" src="{icon}" class="' + Ext.baseCSSPrefix + 'menu-item-icon {iconCls}" />',
+                '<span id="{id}-textEl" class="' + Ext.baseCSSPrefix + 'menu-item-text" <tpl if="menu">style="margin-right: 17px;"</tpl> >{text}</span>',
+                '<tpl if="menu">',
+                    '<img id="{id}-arrowEl" src="{blank}" class="' + Ext.baseCSSPrefix + 'menu-item-arrow" />',
+                '</tpl>',
+            '</a>',
+        '</tpl>'
+    ],
+
+    maskOnDisable: false,
+
+    
+
+    activate: function() {
+        var me = this;
+
+        if (!me.activated && me.canActivate && me.rendered && !me.isDisabled() && me.isVisible()) {
+            me.el.addCls(me.activeCls);
+            me.focus();
+            me.activated = true;
+            me.fireEvent('activate', me);
+        }
+    },
+
+    blur: function() {
+        this.$focused = false;
+        this.callParent(arguments);
+    },
+
+    deactivate: function() {
+        var me = this;
+
+        if (me.activated) {
+            me.el.removeCls(me.activeCls);
+            me.blur();
+            me.hideMenu();
+            me.activated = false;
+            me.fireEvent('deactivate', me);
+        }
+    },
+
+    deferExpandMenu: function() {
+        var me = this;
+
+        if (!me.menu.rendered || !me.menu.isVisible()) {
+            me.parentMenu.activeChild = me.menu;
+            me.menu.parentItem = me;
+            me.menu.parentMenu = me.menu.ownerCt = me.parentMenu;
+            me.menu.showBy(me, me.menuAlign);
+        }
+    },
+
+    deferHideMenu: function() {
+        if (this.menu.isVisible()) {
+            this.menu.hide();
+        }
+    },
+
+    deferHideParentMenus: function() {
+        Ext.menu.Manager.hideAll();
+    },
+
+    expandMenu: function(delay) {
+        var me = this;
+
+        if (me.menu) {
+            clearTimeout(me.hideMenuTimer);
+            if (delay === 0) {
+                me.deferExpandMenu();
+            } else {
+                me.expandMenuTimer = Ext.defer(me.deferExpandMenu, Ext.isNumber(delay) ? delay : me.menuExpandDelay, me);
+            }
+        }
+    },
+
+    focus: function() {
+        this.$focused = true;
+        this.callParent(arguments);
+    },
+
+    getRefItems: function(deep){
+        var menu = this.menu,
+            items;
+
+        if (menu) {
+            items = menu.getRefItems(deep);
+            items.unshift(menu);
+        }
+        return items || [];
+    },
+
+    hideMenu: function(delay) {
+        var me = this;
+
+        if (me.menu) {
+            clearTimeout(me.expandMenuTimer);
+            me.hideMenuTimer = Ext.defer(me.deferHideMenu, Ext.isNumber(delay) ? delay : me.menuHideDelay, me);
+        }
+    },
+
+    initComponent: function() {
+        var me = this,
+            prefix = Ext.baseCSSPrefix,
+            cls = [prefix + 'menu-item'];
+
+        me.addEvents(
+            
+            'activate',
+
+            
+            'click',
+
+            
+            'deactivate'
+        );
+
+        if (me.plain) {
+            cls.push(prefix + 'menu-item-plain');
+        }
+
+        if (me.cls) {
+            cls.push(me.cls);
+        }
+
+        me.cls = cls.join(' ');
+
+        if (me.menu) {
+            me.menu = Ext.menu.Manager.get(me.menu);
+        }
+
+        me.callParent(arguments);
+    },
+
+    onClick: function(e) {
+        var me = this;
+
+        if (!me.href) {
+            e.stopEvent();
+        }
+
+        if (me.disabled) {
+            return;
+        }
+
+        if (me.hideOnClick) {
+            me.deferHideParentMenusTimer = Ext.defer(me.deferHideParentMenus, me.clickHideDelay, me);
+        }
+
+        Ext.callback(me.handler, me.scope || me, [me, e]);
+        me.fireEvent('click', me, e);
+
+        if (!me.hideOnClick) {
+            me.focus();
+        }
+    },
+
+    onDestroy: function() {
+        var me = this;
+
+        clearTimeout(me.expandMenuTimer);
+        clearTimeout(me.hideMenuTimer);
+        clearTimeout(me.deferHideParentMenusTimer);
+
+        if (me.menu) {
+            delete me.menu.parentItem;
+            delete me.menu.parentMenu;
+            delete me.menu.ownerCt;
+            if (me.destroyMenu !== false) {
+                me.menu.destroy();
+            }
+        }
+        me.callParent(arguments);
+    },
+
+    onRender: function(ct, pos) {
+        var me = this,
+            blank = Ext.BLANK_IMAGE_URL;
+
+        Ext.applyIf(me.renderData, {
+            href: me.href || '#',
+            hrefTarget: me.hrefTarget,
+            icon: me.icon || blank,
+            iconCls: me.iconCls + (me.checkChangeDisabled ? ' ' + me.disabledCls : ''),
+            menu: Ext.isDefined(me.menu),
+            plain: me.plain,
+            text: me.text,
+            blank: blank
+        });
+
+        me.addChildEls('itemEl', 'iconEl', 'textEl', 'arrowEl');
+
+        me.callParent(arguments);
+    },
+
+    
+    setHandler: function(fn, scope) {
+        this.handler = fn || null;
+        this.scope = scope;
+    },
+
+    
+    setIconCls: function(iconCls) {
+        var me = this;
+
+        if (me.iconEl) {
+            if (me.iconCls) {
+                me.iconEl.removeCls(me.iconCls);
+            }
+
+            if (iconCls) {
+                me.iconEl.addCls(iconCls);
+            }
+        }
+
+        me.iconCls = iconCls;
+    },
+
+    
+    setText: function(text) {
+        var me = this,
+            el = me.textEl || me.el;
+
+        me.text = text;
+
+        if (me.rendered) {
+            el.update(text || '');
+            
+            me.ownerCt.redoComponentLayout();
+        }
+    }
+});
+
+
+Ext.define('Ext.menu.CheckItem', {
+    extend: 'Ext.menu.Item',
+    alias: 'widget.menucheckitem',
+
+    
+    checkedCls: Ext.baseCSSPrefix + 'menu-item-checked',
+    
+    uncheckedCls: Ext.baseCSSPrefix + 'menu-item-unchecked',
+    
+    groupCls: Ext.baseCSSPrefix + 'menu-group-icon',
+
+    
+    hideOnClick: false,
+
+    afterRender: function() {
+        var me = this;
+        this.callParent();
+        me.checked = !me.checked;
+        me.setChecked(!me.checked, true);
+    },
+
+    initComponent: function() {
+        var me = this;
+        me.addEvents(
+            
+            'beforecheckchange',
+
+            
+            'checkchange'
+        );
+
+        me.callParent(arguments);
+
+        Ext.menu.Manager.registerCheckable(me);
+
+        if (me.group) {
+            if (!me.iconCls) {
+                me.iconCls = me.groupCls;
+            }
+            if (me.initialConfig.hideOnClick !== false) {
+                me.hideOnClick = true;
+            }
+        }
+    },
+
+    
+    disableCheckChange: function() {
+        var me = this;
+
+        if (me.iconEl) {
+            me.iconEl.addCls(me.disabledCls);
+        }
+        me.checkChangeDisabled = true;
+    },
+
+    
+    enableCheckChange: function() {
+        var me = this;
+
+        me.iconEl.removeCls(me.disabledCls);
+        me.checkChangeDisabled = false;
+    },
+
+    onClick: function(e) {
+        var me = this;
+        if(!me.disabled && !me.checkChangeDisabled && !(me.checked && me.group)) {
+            me.setChecked(!me.checked);
+        }
+        this.callParent([e]);
+    },
+
+    onDestroy: function() {
+        Ext.menu.Manager.unregisterCheckable(this);
+        this.callParent(arguments);
+    },
+
+    
+    setChecked: function(checked, suppressEvents) {
+        var me = this;
+        if (me.checked !== checked && (suppressEvents || me.fireEvent('beforecheckchange', me, checked) !== false)) {
+            if (me.el) {
+                me.el[checked  ? 'addCls' : 'removeCls'](me.checkedCls)[!checked ? 'addCls' : 'removeCls'](me.uncheckedCls);
+            }
+            me.checked = checked;
+            Ext.menu.Manager.onCheckChange(me, checked);
+            if (!suppressEvents) {
+                Ext.callback(me.checkHandler, me.scope, [me, checked]);
+                me.fireEvent('checkchange', me, checked);
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.menu.KeyNav', {
+    extend: 'Ext.util.KeyNav',
+
+    requires: ['Ext.FocusManager'],
+    
+    constructor: function(menu) {
+        var me = this;
+
+        me.menu = menu;
+        me.callParent([menu.el, {
+            down: me.down,
+            enter: me.enter,
+            esc: me.escape,
+            left: me.left,
+            right: me.right,
+            space: me.enter,
+            tab: me.tab,
+            up: me.up
+        }]);
+    },
+
+    down: function(e) {
+        var me = this,
+            fi = me.menu.focusedItem;
+
+        if (fi && e.getKey() == Ext.EventObject.DOWN && me.isWhitelisted(fi)) {
+            return true;
+        }
+        me.focusNextItem(1);
+    },
+
+    enter: function(e) {
+        var menu = this.menu,
+            focused = menu.focusedItem;
+ 
+        if (menu.activeItem) {
+            menu.onClick(e);
+        } else if (focused && focused.isFormField) {
+            
+            return true;
+        }
+    },
+
+    escape: function(e) {
+        Ext.menu.Manager.hideAll();
+    },
+
+    focusNextItem: function(step) {
+        var menu = this.menu,
+            items = menu.items,
+            focusedItem = menu.focusedItem,
+            startIdx = focusedItem ? items.indexOf(focusedItem) : -1,
+            idx = startIdx + step;
+
+        while (idx != startIdx) {
+            if (idx < 0) {
+                idx = items.length - 1;
+            } else if (idx >= items.length) {
+                idx = 0;
+            }
+
+            var item = items.getAt(idx);
+            if (menu.canActivateItem(item)) {
+                menu.setActiveItem(item);
+                break;
+            }
+            idx += step;
+        }
+    },
+
+    isWhitelisted: function(item) {
+        return Ext.FocusManager.isWhitelisted(item);
+    },
+
+    left: function(e) {
+        var menu = this.menu,
+            fi = menu.focusedItem,
+            ai = menu.activeItem;
+
+        if (fi && this.isWhitelisted(fi)) {
+            return true;
+        }
+
+        menu.hide();
+        if (menu.parentMenu) {
+            menu.parentMenu.focus();
+        }
+    },
+
+    right: function(e) {
+        var menu = this.menu,
+            fi = menu.focusedItem,
+            ai = menu.activeItem,
+            am;
+
+        if (fi && this.isWhitelisted(fi)) {
+            return true;
+        }
+
+        if (ai) {
+            am = menu.activeItem.menu;
+            if (am) {
+                ai.expandMenu(0);
+                Ext.defer(function() {
+                    am.setActiveItem(am.items.getAt(0));
+                }, 25);
+            }
+        }
+    },
+
+    tab: function(e) {
+        var me = this;
+
+        if (e.shiftKey) {
+            me.up(e);
+        } else {
+            me.down(e);
+        }
+    },
+
+    up: function(e) {
+        var me = this,
+            fi = me.menu.focusedItem;
+
+        if (fi && e.getKey() == Ext.EventObject.UP && me.isWhitelisted(fi)) {
+            return true;
+        }
+        me.focusNextItem(-1);
+    }
+});
+
+Ext.define('Ext.menu.Separator', {
+    extend: 'Ext.menu.Item',
+    alias: 'widget.menuseparator',
+
+    
+
+    
+    canActivate: false,
+
+    
+
+    
+
+    
+
+    focusable: false,
+
+    
+
+    
+
+    
+    hideOnClick: false,
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    plain: true,
+
+    
+    separatorCls: Ext.baseCSSPrefix + 'menu-item-separator',
+
+    
+    text: ' ',
+
+    onRender: function(ct, pos) {
+        var me = this,
+            sepCls = me.separatorCls;
+
+        me.cls += ' ' + sepCls;
+
+        me.callParent(arguments);
+    }
+});
+
+Ext.define('Ext.menu.Menu', {
+    extend: 'Ext.panel.Panel',
+    alias: 'widget.menu',
+    requires: [
+        'Ext.layout.container.Fit',
+        'Ext.layout.container.VBox',
+        'Ext.menu.CheckItem',
+        'Ext.menu.Item',
+        'Ext.menu.KeyNav',
+        'Ext.menu.Manager',
+        'Ext.menu.Separator'
+    ],
+
+    
+
+    
+    allowOtherMenus: false,
+
+    
+    ariaRole: 'menu',
+
+    
+
+    
+    defaultAlign: 'tl-bl?',
+
+    
+    floating: true,
+
+    
+    constrain: true,
+
+    
+    hidden: true,
+
+    hideMode: 'visibility',
+
+    
+    ignoreParentClicks: false,
+
+    isMenu: true,
+
+    
+
+    
+    showSeparator : true,
+
+    
+    minWidth: 120,
+
+    
+
+    initComponent: function() {
+        var me = this,
+            prefix = Ext.baseCSSPrefix,
+            cls = [prefix + 'menu'],
+            bodyCls = me.bodyCls ? [me.bodyCls] : [];
+
+        me.addEvents(
+            
+            'click',
+
+            
+            'mouseenter',
+
+            
+            'mouseleave',
+
+            
+            'mouseover'
+        );
+
+        Ext.menu.Manager.register(me);
+
+        
+        if (me.plain) {
+            cls.push(prefix + 'menu-plain');
+        }
+        me.cls = cls.join(' ');
+
+        
+        bodyCls.unshift(prefix + 'menu-body');
+        me.bodyCls = bodyCls.join(' ');
+
+        
+        
+        
+        
+        me.layout = {
+            type: 'vbox',
+            align: 'stretchmax',
+            autoSize: true,
+            clearInnerCtOnLayout: true,
+            overflowHandler: 'Scroller'
+        };
+
+        
+        if (me.floating === false && me.initialConfig.hidden !== true) {
+            me.hidden = false;
+        }
+
+        me.callParent(arguments);
+
+        me.on('beforeshow', function() {
+            var hasItems = !!me.items.length;
+            
+            
+            
+            if (hasItems && me.rendered) {
+                me.el.setStyle('visibility', null);
+            }
+            return hasItems;
+        });
+    },
+
+    afterRender: function(ct) {
+        var me = this,
+            prefix = Ext.baseCSSPrefix,
+            space = ' ';
+
+        me.callParent(arguments);
+
+        
+        if (me.showSeparator) {
+            me.iconSepEl = me.layout.getRenderTarget().insertFirst({
+                cls: prefix + 'menu-icon-separator',
+                html: space
+            });
+        }
+
+        me.focusEl = me.el.createChild({
+            cls: prefix + 'menu-focus',
+            tabIndex: '-1',
+            html: space
+        });
+
+        me.mon(me.el, {
+            click: me.onClick,
+            mouseover: me.onMouseOver,
+            scope: me
+        });
+        me.mouseMonitor = me.el.monitorMouseLeave(100, me.onMouseLeave, me);
+
+        if (me.showSeparator && ((!Ext.isStrict && Ext.isIE) || Ext.isIE6)) {
+            me.iconSepEl.setHeight(me.el.getHeight());
+        }
+
+        me.keyNav = Ext.create('Ext.menu.KeyNav', me);
+    },
+
+    afterLayout: function() {
+        var me = this;
+        me.callParent(arguments);
+
+        
+        
+        
+        
+        if ((!Ext.isStrict && Ext.isIE) || Ext.isIE6) {
+            var innerCt = me.layout.getRenderTarget(),
+                innerCtWidth = 0,
+                dis = me.dockedItems,
+                l = dis.length,
+                i = 0,
+                di, clone, newWidth;
+
+            innerCtWidth = innerCt.getWidth();
+
+            newWidth = innerCtWidth + me.body.getBorderWidth('lr') + me.body.getPadding('lr');
+
+            
+            me.body.setWidth(newWidth);
+
+            
+            for (; i < l, di = dis.getAt(i); i++) {
+                if (di.dock == 'left' || di.dock == 'right') {
+                    newWidth += di.getWidth();
+                }
+            }
+            me.el.setWidth(newWidth);
+        }
+    },
+    
+    getBubbleTarget: function(){
+        return this.parentMenu || this.callParent();
+    },
+
+    
+    canActivateItem: function(item) {
+        return item && !item.isDisabled() && item.isVisible() && (item.canActivate || item.getXTypes().indexOf('menuitem') < 0);
+    },
+
+    
+    deactivateActiveItem: function() {
+        var me = this;
+
+        if (me.activeItem) {
+            me.activeItem.deactivate();
+            if (!me.activeItem.activated) {
+                delete me.activeItem;
+            }
+        }
+
+        
+        if (me.focusedItem && !me.filtered) {
+            me.focusedItem.blur();
+            if (!me.focusedItem.$focused) {
+                delete me.focusedItem;
+            }
+        }
+    },
+
+    clearStretch: function () {
+        
+        
+        if (this.rendered) {
+            this.items.each(function (item) {
+                
+                if (item.componentLayout) {
+                    delete item.componentLayout.lastComponentSize;
+                }
+                if (item.el) {
+                    item.el.setWidth(null);
+                }
+            });
+        }
+    },
+
+    onAdd: function () {
+        var me = this;
+
+        me.clearStretch();
+        me.callParent(arguments);
+
+        if (Ext.isIE6 || Ext.isIE7) {
+            
+            Ext.Function.defer(me.doComponentLayout, 10, me);
+        }
+    },
+
+    onRemove: function () {
+        this.clearStretch();
+        this.callParent(arguments);
+
+    },
+
+    redoComponentLayout: function () {
+        if (this.rendered) {
+            this.clearStretch();
+            this.doComponentLayout();
+        }
+    },
+
+    
+    getFocusEl: function() {
+        return this.focusEl;
+    },
+
+    
+    hide: function() {
+        this.deactivateActiveItem();
+        this.callParent(arguments);
+    },
+
+    
+    getItemFromEvent: function(e) {
+        return this.getChildByElement(e.getTarget());
+    },
+
+    lookupComponent: function(cmp) {
+        var me = this;
+
+        if (Ext.isString(cmp)) {
+            cmp = me.lookupItemFromString(cmp);
+        } else if (Ext.isObject(cmp)) {
+            cmp = me.lookupItemFromObject(cmp);
+        }
+
+        
+        
+        cmp.minWidth = cmp.minWidth || me.minWidth;
+
+        return cmp;
+    },
+
+    
+    lookupItemFromObject: function(cmp) {
+        var me = this,
+            prefix = Ext.baseCSSPrefix,
+            cls,
+            intercept;
+
+        if (!cmp.isComponent) {
+            if (!cmp.xtype) {
+                cmp = Ext.create('Ext.menu.' + (Ext.isBoolean(cmp.checked) ? 'Check': '') + 'Item', cmp);
+            } else {
+                cmp = Ext.ComponentManager.create(cmp, cmp.xtype);
+            }
+        }
+
+        if (cmp.isMenuItem) {
+            cmp.parentMenu = me;
+        }
+
+        if (!cmp.isMenuItem && !cmp.dock) {
+            cls = [prefix + 'menu-item', prefix + 'menu-item-cmp'];
+            intercept = Ext.Function.createInterceptor;
+
+            
+            cmp.focus = intercept(cmp.focus, function() {
+                this.$focused = true;
+            }, cmp);
+            cmp.blur = intercept(cmp.blur, function() {
+                this.$focused = false;
+            }, cmp);
+
+            if (!me.plain && (cmp.indent === true || cmp.iconCls === 'no-icon')) {
+                cls.push(prefix + 'menu-item-indent');
+            }
+
+            if (cmp.rendered) {
+                cmp.el.addCls(cls);
+            } else {
+                cmp.cls = (cmp.cls ? cmp.cls : '') + ' ' + cls.join(' ');
+            }
+            cmp.isMenuItem = true;
+        }
+        return cmp;
+    },
+
+    
+    lookupItemFromString: function(cmp) {
+        return (cmp == 'separator' || cmp == '-') ?
+            Ext.createWidget('menuseparator')
+            : Ext.createWidget('menuitem', {
+                canActivate: false,
+                hideOnClick: false,
+                plain: true,
+                text: cmp
+            });
+    },
+
+    onClick: function(e) {
+        var me = this,
+            item;
+
+        if (me.disabled) {
+            e.stopEvent();
+            return;
+        }
+
+        if ((e.getTarget() == me.focusEl.dom) || e.within(me.layout.getRenderTarget())) {
+            item = me.getItemFromEvent(e) || me.activeItem;
+
+            if (item) {
+                if (item.getXTypes().indexOf('menuitem') >= 0) {
+                    if (!item.menu || !me.ignoreParentClicks) {
+                        item.onClick(e);
+                    } else {
+                        e.stopEvent();
+                    }
+                }
+            }
+            me.fireEvent('click', me, item, e);
+        }
+    },
+
+    onDestroy: function() {
+        var me = this;
+
+        Ext.menu.Manager.unregister(me);
+        if (me.rendered) {
+            me.el.un(me.mouseMonitor);
+            me.keyNav.destroy();
+            delete me.keyNav;
+        }
+        me.callParent(arguments);
+    },
+
+    onMouseLeave: function(e) {
+        var me = this;
+
+        me.deactivateActiveItem();
+
+        if (me.disabled) {
+            return;
+        }
+
+        me.fireEvent('mouseleave', me, e);
+    },
+
+    onMouseOver: function(e) {
+        var me = this,
+            fromEl = e.getRelatedTarget(),
+            mouseEnter = !me.el.contains(fromEl),
+            item = me.getItemFromEvent(e);
+
+        if (mouseEnter && me.parentMenu) {
+            me.parentMenu.setActiveItem(me.parentItem);
+            me.parentMenu.mouseMonitor.mouseenter();
+        }
+
+        if (me.disabled) {
+            return;
+        }
+
+        if (item) {
+            me.setActiveItem(item);
+            if (item.activated && item.expandMenu) {
+                item.expandMenu();
+            }
+        }
+        if (mouseEnter) {
+            me.fireEvent('mouseenter', me, e);
+        }
+        me.fireEvent('mouseover', me, item, e);
+    },
+
+    setActiveItem: function(item) {
+        var me = this;
+
+        if (item && (item != me.activeItem && item != me.focusedItem)) {
+            me.deactivateActiveItem();
+            if (me.canActivateItem(item)) {
+                if (item.activate) {
+                    item.activate();
+                    if (item.activated) {
+                        me.activeItem = item;
+                        me.focusedItem = item;
+                        me.focus();
+                    }
+                } else {
+                    item.focus();
+                    me.focusedItem = item;
+                }
+            }
+            item.el.scrollIntoView(me.layout.getRenderTarget());
+        }
+    },
+
+    
+    showBy: function(cmp, pos, off) {
+        var me = this,
+            xy,
+            region;
+
+        if (me.floating && cmp) {
+            me.layout.autoSize = true;
+
+            
+            me.doAutoRender();
+            delete me.needsLayout;
+
+            
+            cmp = cmp.el || cmp;
+
+            
+            xy = me.el.getAlignToXY(cmp, pos || me.defaultAlign, off);
+            if (me.floatParent) {
+                region = me.floatParent.getTargetEl().getViewRegion();
+                xy[0] -= region.x;
+                xy[1] -= region.y;
+            }
+            me.showAt(xy);
+        }
+        return me;
+    },
+
+    doConstrain : function() {
+        var me = this,
+            y = me.el.getY(),
+            max, full,
+            vector,
+            returnY = y, normalY, parentEl, scrollTop, viewHeight;
+
+        delete me.height;
+        me.setSize();
+        full = me.getHeight();
+        if (me.floating) {
+            
+            parentEl = Ext.fly(me.el.getScopeParent());
+            scrollTop = parentEl.getScroll().top;
+            viewHeight = parentEl.getViewSize().height;
+            
+            
+            normalY = y - scrollTop;
+            max = me.maxHeight ? me.maxHeight : viewHeight - normalY;
+            if (full > viewHeight) {
+                max = viewHeight;
+                
+                returnY = y - normalY;
+            } else if (max < full) {
+                returnY = y - (full - max);
+                max = full;
+            }
+        }else{
+            max = me.getHeight();
+        }
+        
+        if (me.maxHeight){
+            max = Math.min(me.maxHeight, max);
+        }
+        if (full > max && max > 0){
+            me.layout.autoSize = false;
+            me.setHeight(max);
+            if (me.showSeparator){
+                me.iconSepEl.setHeight(me.layout.getRenderTarget().dom.scrollHeight);
+            }
+        }
+        vector = me.getConstrainVector(me.el.getScopeParent());
+        if (vector) {
+            me.setPosition(me.getPosition()[0] + vector[0]);
+        }
+        me.el.setY(returnY);
+    }
+});
+
+
+ Ext.define('Ext.menu.ColorPicker', {
+     extend: 'Ext.menu.Menu',
+
+     alias: 'widget.colormenu',
+
+     requires: [
+        'Ext.picker.Color'
+     ],
+
+    
+    hideOnClick : true,
+
+    
+    pickerId : null,
+
+    
+
+    
+
+    
+
+    
+
+    initComponent : function(){
+        var me = this,
+            cfg = Ext.apply({}, me.initialConfig);
+
+        
+        delete cfg.listeners;
+        Ext.apply(me, {
+            plain: true,
+            showSeparator: false,
+            items: Ext.applyIf({
+                cls: Ext.baseCSSPrefix + 'menu-color-item',
+                id: me.pickerId,
+                xtype: 'colorpicker'
+            }, cfg)
+        });
+
+        me.callParent(arguments);
+
+        me.picker = me.down('colorpicker');
+
+        
+        me.relayEvents(me.picker, ['select']);
+
+        if (me.hideOnClick) {
+            me.on('select', me.hidePickerOnSelect, me);
+        }
+    },
+
+    
+    hidePickerOnSelect: function() {
+        Ext.menu.Manager.hideAll();
+    }
+ });
+
+ Ext.define('Ext.menu.DatePicker', {
+     extend: 'Ext.menu.Menu',
+
+     alias: 'widget.datemenu',
+
+     requires: [
+        'Ext.picker.Date'
+     ],
+
+    
+    hideOnClick : true,
+
+    
+    pickerId : null,
+
+    
+
+    
+
+    
+
+    
+
+    initComponent : function(){
+        var me = this;
+
+        Ext.apply(me, {
+            showSeparator: false,
+            plain: true,
+            border: false,
+            bodyPadding: 0, 
+            items: Ext.applyIf({
+                cls: Ext.baseCSSPrefix + 'menu-date-item',
+                id: me.pickerId,
+                xtype: 'datepicker'
+            }, me.initialConfig)
+        });
+
+        me.callParent(arguments);
+
+        me.picker = me.down('datepicker');
+        
+        me.relayEvents(me.picker, ['select']);
+
+        if (me.hideOnClick) {
+            me.on('select', me.hidePickerOnSelect, me);
+        }
+    },
+
+    hidePickerOnSelect: function() {
+        Ext.menu.Manager.hideAll();
+    }
+ });
+
+Ext.define('Ext.panel.Tool', {
+    extend: 'Ext.Component',
+    requires: ['Ext.tip.QuickTipManager'],
+    alias: 'widget.tool',
+
+    baseCls: Ext.baseCSSPrefix + 'tool',
+    disabledCls: Ext.baseCSSPrefix + 'tool-disabled',
+    toolPressedCls: Ext.baseCSSPrefix + 'tool-pressed',
+    toolOverCls: Ext.baseCSSPrefix + 'tool-over',
+    ariaRole: 'button',
+    renderTpl: ['<img id="{id}-toolEl" src="{blank}" class="{baseCls}-{type}" role="presentation"/>'],
+
+    
+
+    
+
+    
+
+    
+
+     
+    tooltipType: 'qtip',
+
+    
+    stopEvent: true,
+
+    initComponent: function() {
+        var me = this;
+        me.addEvents(
+            
+            'click'
+        );
+
+
+        me.type = me.type || me.id;
+
+        Ext.applyIf(me.renderData, {
+            baseCls: me.baseCls,
+            blank: Ext.BLANK_IMAGE_URL,
+            type: me.type
+        });
+
+        me.addChildEls('toolEl');
+
+        
+        me.tooltip = me.tooltip || me.qtip;
+        me.callParent();
+    },
+
+    
+    afterRender: function() {
+        var me = this,
+            attr;
+
+        me.callParent(arguments);
+        if (me.tooltip) {
+            if (Ext.isObject(me.tooltip)) {
+                Ext.tip.QuickTipManager.register(Ext.apply({
+                    target: me.id
+                }, me.tooltip));
+            }
+            else {
+                attr = me.tooltipType == 'qtip' ? 'data-qtip' : 'title';
+                me.toolEl.dom.setAttribute(attr, me.tooltip);
+            }
+        }
+
+        me.mon(me.toolEl, {
+            click: me.onClick,
+            mousedown: me.onMouseDown,
+            mouseover: me.onMouseOver,
+            mouseout: me.onMouseOut,
+            scope: me
+        });
+    },
+
+    
+    setType: function(type) {
+        var me = this;
+
+        me.type = type;
+        if (me.rendered) {
+            me.toolEl.dom.className = me.baseCls + '-' + type;
+        }
+        return me;
+    },
+
+    
+    bindTo: function(component) {
+        this.owner = component;
+    },
+
+    
+    onClick: function(e, target) {
+        var me = this,
+            owner;
+
+        if (me.disabled) {
+            return false;
+        }
+        owner = me.owner || me.ownerCt;
+
+        
+        me.el.removeCls(me.toolPressedCls);
+        me.el.removeCls(me.toolOverCls);
+
+        if (me.stopEvent !== false) {
+            e.stopEvent();
+        }
+
+        Ext.callback(me.handler, me.scope || me, [e, target, owner, me]);
+        me.fireEvent('click', me, e);
+        return true;
+    },
+
+    
+    onDestroy: function(){
+        if (Ext.isObject(this.tooltip)) {
+            Ext.tip.QuickTipManager.unregister(this.id);
+        }
+        this.callParent();
+    },
+
+    
+    onMouseDown: function() {
+        if (this.disabled) {
+            return false;
+        }
+
+        this.el.addCls(this.toolPressedCls);
+    },
+
+    
+    onMouseOver: function() {
+        if (this.disabled) {
+            return false;
+        }
+        this.el.addCls(this.toolOverCls);
+    },
+
+    
+    onMouseOut: function() {
+        this.el.removeCls(this.toolOverCls);
+    }
+});
+
+Ext.define('Ext.resizer.Handle', {
+    extend: 'Ext.Component',
+    handleCls: '',
+    baseHandleCls: Ext.baseCSSPrefix + 'resizable-handle',
+    
+    
+    region: '',
+
+    onRender: function() {
+        this.addCls(
+            this.baseHandleCls,
+            this.baseHandleCls + '-' + this.region,
+            this.handleCls
+        );
+        this.callParent(arguments);
+        this.el.unselectable();
+    }
+});
+
+
+Ext.define('Ext.resizer.Resizer', {
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+    uses: ['Ext.resizer.ResizeTracker', 'Ext.Component'],
+
+    alternateClassName: 'Ext.Resizable',
+
+    handleCls: Ext.baseCSSPrefix + 'resizable-handle',
+    pinnedCls: Ext.baseCSSPrefix + 'resizable-pinned',
+    overCls:   Ext.baseCSSPrefix + 'resizable-over',
+    wrapCls:   Ext.baseCSSPrefix + 'resizable-wrap',
+
+    
+    dynamic: true,
+
+    
+    handles: 's e se',
+
+    
+    height : null,
+
+    
+    width : null,
+
+    
+    heightIncrement : 0,
+
+    
+    widthIncrement : 0,
+
+    
+    minHeight : 20,
+
+    
+    minWidth : 20,
+
+    
+    maxHeight : 10000,
+
+    
+    maxWidth : 10000,
+
+    
+    pinned: false,
+
+    
+    preserveRatio: false,
+
+    
+    transparent: false,
+
+    
+
+    possiblePositions: {
+        n:  'north',
+        s:  'south',
+        e:  'east',
+        w:  'west',
+        se: 'southeast',
+        sw: 'southwest',
+        nw: 'northwest',
+        ne: 'northeast'
+    },
+
+    
+
+    
+
+    constructor: function(config) {
+        var me = this,
+            target,
+            tag,
+            handles = me.handles,
+            handleCls,
+            possibles,
+            len,
+            i = 0,
+            pos;
+
+        this.addEvents(
+            
+            'beforeresize',
+            
+            'resizedrag',
+            
+            'resize'
+        );
+
+        if (Ext.isString(config) || Ext.isElement(config) || config.dom) {
+            target = config;
+            config = arguments[1] || {};
+            config.target = target;
+        }
+        
+        me.mixins.observable.constructor.call(me, config);
+
+        
+        
+        target = me.target;
+        if (target) {
+            if (target.isComponent) {
+                me.el = target.getEl();
+                if (target.minWidth) {
+                    me.minWidth = target.minWidth;
+                }
+                if (target.minHeight) {
+                    me.minHeight = target.minHeight;
+                }
+                if (target.maxWidth) {
+                    me.maxWidth = target.maxWidth;
+                }
+                if (target.maxHeight) {
+                    me.maxHeight = target.maxHeight;
+                }
+                if (target.floating) {
+                    if (!this.hasOwnProperty('handles')) {
+                        this.handles = 'n ne e se s sw w nw';
+                    }
+                }
+            } else {
+                me.el = me.target = Ext.get(target);
+            }
+        }
+        
+        else {
+            me.target = me.el = Ext.get(me.el);
+        }
+
+        
+        
+        
+        tag = me.el.dom.tagName;
+        if (tag == 'TEXTAREA' || tag == 'IMG') {
+            
+            me.originalTarget = me.target;
+            me.target = me.el = me.el.wrap({
+                cls: me.wrapCls,
+                id: me.el.id + '-rzwrap'
+            });
+
+            
+            me.el.setPositioning(me.originalTarget.getPositioning());
+            me.originalTarget.clearPositioning();
+            var box = me.originalTarget.getBox();
+            me.el.setBox(box);
+        }
+
+        
+        
+        me.el.position();
+        if (me.pinned) {
+            me.el.addCls(me.pinnedCls);
+        }
+
+        
+        me.resizeTracker = Ext.create('Ext.resizer.ResizeTracker', {
+            disabled: me.disabled,
+            target: me.target,
+            constrainTo: me.constrainTo,
+            overCls: me.overCls,
+            throttle: me.throttle,
+            originalTarget: me.originalTarget,
+            delegate: '.' + me.handleCls,
+            dynamic: me.dynamic,
+            preserveRatio: me.preserveRatio,
+            heightIncrement: me.heightIncrement,
+            widthIncrement: me.widthIncrement,
+            minHeight: me.minHeight,
+            maxHeight: me.maxHeight,
+            minWidth: me.minWidth,
+            maxWidth: me.maxWidth
+        });
+
+        
+        me.resizeTracker.on('mousedown', me.onBeforeResize, me);
+        me.resizeTracker.on('drag', me.onResize, me);
+        me.resizeTracker.on('dragend', me.onResizeEnd, me);
+
+        if (me.handles == 'all') {
+            me.handles = 'n s e w ne nw se sw';
+        }
+
+        handles = me.handles = me.handles.split(/ |\s*?[,;]\s*?/);
+        possibles = me.possiblePositions;
+        len = handles.length;
+        handleCls = me.handleCls + ' ' + (this.target.isComponent ? (me.target.baseCls + '-handle ') : '') + me.handleCls + '-';
+
+        for(; i < len; i++){
+            
+            if (handles[i] && possibles[handles[i]]) {
+                pos = possibles[handles[i]];
+                
+
+                me[pos] = Ext.create('Ext.Component', {
+                    owner: this,
+                    region: pos,
+                    cls: handleCls + pos,
+                    renderTo: me.el
+                });
+                me[pos].el.unselectable();
+                if (me.transparent) {
+                    me[pos].el.setOpacity(0);
+                }
+            }
+        }
+
+        
+        if (Ext.isNumber(me.width)) {
+            me.width = Ext.Number.constrain(me.width, me.minWidth, me.maxWidth);
+        }
+        if (Ext.isNumber(me.height)) {
+            me.height = Ext.Number.constrain(me.height, me.minHeight, me.maxHeight);
+        }
+
+        
+        if (me.width != null || me.height != null) {
+            if (me.originalTarget) {
+                me.originalTarget.setWidth(me.width);
+                me.originalTarget.setHeight(me.height);
+            }
+            me.resizeTo(me.width, me.height);
+        }
+
+        me.forceHandlesHeight();
+    },
+
+    disable: function() {
+        this.resizeTracker.disable();
+    },
+
+    enable: function() {
+        this.resizeTracker.enable();
+    },
+
+    
+    onBeforeResize: function(tracker, e) {
+        var b = this.target.getBox();
+        return this.fireEvent('beforeresize', this, b.width, b.height, e);
+    },
+
+    
+    onResize: function(tracker, e) {
+        var me = this,
+            b = me.target.getBox();
+        me.forceHandlesHeight();
+        return me.fireEvent('resizedrag', me, b.width, b.height, e);
+    },
+
+    
+    onResizeEnd: function(tracker, e) {
+        var me = this,
+            b = me.target.getBox();
+        me.forceHandlesHeight();
+        return me.fireEvent('resize', me, b.width, b.height, e);
+    },
+
+    
+    resizeTo : function(width, height){
+        this.target.setSize(width, height);
+        this.fireEvent('resize', this, width, height, null);
+    },
+
+    
+    getEl : function() {
+        return this.el;
+    },
+
+    
+    getTarget: function() {
+        return this.target;
+    },
+
+    destroy: function() {
+        var h;
+        for (var i = 0, l = this.handles.length; i < l; i++) {
+            h = this[this.possiblePositions[this.handles[i]]];
+            delete h.owner;
+            Ext.destroy(h);
+        }
+    },
+
+    
+    forceHandlesHeight : function() {
+        var me = this,
+            handle;
+        if (Ext.isIE6) {
+            handle = me.east;
+            if (handle) {
+                handle.setHeight(me.el.getHeight());
+            }
+            handle = me.west;
+            if (handle) {
+                handle.setHeight(me.el.getHeight());
+            }
+            me.el.repaint();
+        }
+    }
+});
+
+
+Ext.define('Ext.resizer.ResizeTracker', {
+    extend: 'Ext.dd.DragTracker',
+    dynamic: true,
+    preserveRatio: false,
+
+    
+    constrainTo: null,
+    
+    proxyCls:  Ext.baseCSSPrefix + 'resizable-proxy',
+
+    constructor: function(config) {
+        var me = this;
+
+        if (!config.el) {
+            if (config.target.isComponent) {
+                me.el = config.target.getEl();
+            } else {
+                me.el = config.target;
+            }
+        }
+        this.callParent(arguments);
+
+        
+        if (me.preserveRatio && me.minWidth && me.minHeight) {
+            var widthRatio = me.minWidth / me.el.getWidth(),
+                heightRatio = me.minHeight / me.el.getHeight();
+
+            
+            
+            
+            if (heightRatio > widthRatio) {
+                me.minWidth = me.el.getWidth() * heightRatio;
+            } else {
+                me.minHeight = me.el.getHeight() * widthRatio;
+            }
+        }
+
+        
+        
+        if (me.throttle) {
+            var throttledResizeFn = Ext.Function.createThrottled(function() {
+                    Ext.resizer.ResizeTracker.prototype.resize.apply(me, arguments);
+                }, me.throttle);
+
+            me.resize = function(box, direction, atEnd) {
+                if (atEnd) {
+                    Ext.resizer.ResizeTracker.prototype.resize.apply(me, arguments);
+                } else {
+                    throttledResizeFn.apply(null, arguments);
+                }
+            };
+        }
+    },
+
+    onBeforeStart: function(e) {
+        
+        this.startBox = this.el.getBox();
+    },
+
+    
+    getDynamicTarget: function() {
+        var me = this,
+            target = me.target;
+            
+        if (me.dynamic) {
+            return target;
+        } else if (!me.proxy) {
+            me.proxy = me.createProxy(target);
+        }
+        me.proxy.show();
+        return me.proxy;
+    },
+    
+    
+    createProxy: function(target){
+        var proxy,
+            cls = this.proxyCls,
+            renderTo;
+            
+        if (target.isComponent) {
+            proxy = target.getProxy().addCls(cls);
+        } else {
+            renderTo = Ext.getBody();
+            if (Ext.scopeResetCSS) {
+                renderTo = Ext.getBody().createChild({
+                    cls: Ext.baseCSSPrefix + 'reset'
+                });
+            }
+            proxy = target.createProxy({
+                tag: 'div',
+                cls: cls,
+                id: target.id + '-rzproxy'
+            }, renderTo);
+        }
+        proxy.removeCls(Ext.baseCSSPrefix + 'proxy-el');
+        return proxy;
+    },
+
+    onStart: function(e) {
+        
+        this.activeResizeHandle = Ext.getCmp(this.getDragTarget().id);
+
+        
+        if (!this.dynamic) {
+            this.resize(this.startBox, {
+                horizontal: 'none',
+                vertical: 'none'
+            });
+        }
+    },
+
+    onDrag: function(e) {
+        
+        if (this.dynamic || this.proxy) {
+            this.updateDimensions(e);
+        }
+    },
+
+    updateDimensions: function(e, atEnd) {
+        var me = this,
+            region = me.activeResizeHandle.region,
+            offset = me.getOffset(me.constrainTo ? 'dragTarget' : null),
+            box = me.startBox,
+            ratio,
+            widthAdjust = 0,
+            heightAdjust = 0,
+            snappedWidth,
+            snappedHeight,
+            adjustX = 0,
+            adjustY = 0,
+            dragRatio,
+            horizDir = offset[0] < 0 ? 'right' : 'left',
+            vertDir = offset[1] < 0 ? 'down' : 'up',
+            oppositeCorner,
+            axis; 
+
+        switch (region) {
+            case 'south':
+                heightAdjust = offset[1];
+                axis = 2;
+                break;
+            case 'north':
+                heightAdjust = -offset[1];
+                adjustY = -heightAdjust;
+                axis = 2;
+                break;
+            case 'east':
+                widthAdjust = offset[0];
+                axis = 1;
+                break;
+            case 'west':
+                widthAdjust = -offset[0];
+                adjustX = -widthAdjust;
+                axis = 1;
+                break;
+            case 'northeast':
+                heightAdjust = -offset[1];
+                adjustY = -heightAdjust;
+                widthAdjust = offset[0];
+                oppositeCorner = [box.x, box.y + box.height];
+                axis = 3;
+                break;
+            case 'southeast':
+                heightAdjust = offset[1];
+                widthAdjust = offset[0];
+                oppositeCorner = [box.x, box.y];
+                axis = 3;
+                break;
+            case 'southwest':
+                widthAdjust = -offset[0];
+                adjustX = -widthAdjust;
+                heightAdjust = offset[1];
+                oppositeCorner = [box.x + box.width, box.y];
+                axis = 3;
+                break;
+            case 'northwest':
+                heightAdjust = -offset[1];
+                adjustY = -heightAdjust;
+                widthAdjust = -offset[0];
+                adjustX = -widthAdjust;
+                oppositeCorner = [box.x + box.width, box.y + box.height];
+                axis = 3;
+                break;
+        }
+
+        var newBox = {
+            width: box.width + widthAdjust,
+            height: box.height + heightAdjust,
+            x: box.x + adjustX,
+            y: box.y + adjustY
+        };
+
+        
+        snappedWidth = Ext.Number.snap(newBox.width, me.widthIncrement);
+        snappedHeight = Ext.Number.snap(newBox.height, me.heightIncrement);
+        if (snappedWidth != newBox.width || snappedHeight != newBox.height){
+            switch (region) {
+                case 'northeast':
+                    newBox.y -= snappedHeight - newBox.height;
+                    break;
+                case 'north':
+                    newBox.y -= snappedHeight - newBox.height;
+                    break;
+                case 'southwest':
+                    newBox.x -= snappedWidth - newBox.width;
+                    break;
+                case 'west':
+                    newBox.x -= snappedWidth - newBox.width;
+                    break;
+                case 'northwest':
+                    newBox.x -= snappedWidth - newBox.width;
+                    newBox.y -= snappedHeight - newBox.height;
+            }
+            newBox.width = snappedWidth;
+            newBox.height = snappedHeight;
+        }
+
+        
+        if (newBox.width < me.minWidth || newBox.width > me.maxWidth) {
+            newBox.width = Ext.Number.constrain(newBox.width, me.minWidth, me.maxWidth);
+
+            
+            if (adjustX) {
+                newBox.x = box.x + (box.width - newBox.width);
+            }
+        } else {
+            me.lastX = newBox.x;
+        }
+        if (newBox.height < me.minHeight || newBox.height > me.maxHeight) {
+            newBox.height = Ext.Number.constrain(newBox.height, me.minHeight, me.maxHeight);
+
+            
+            if (adjustY) {
+                newBox.y = box.y + (box.height - newBox.height);
+            }
+        } else {
+            me.lastY = newBox.y;
+        }
+
+        
+        if (me.preserveRatio || e.shiftKey) {
+            var newHeight,
+                newWidth;
+
+            ratio = me.startBox.width / me.startBox.height;
+
+            
+            newHeight = Math.min(Math.max(me.minHeight, newBox.width / ratio), me.maxHeight);
+            newWidth = Math.min(Math.max(me.minWidth, newBox.height * ratio), me.maxWidth);
+
+            
+            if (axis == 1) {
+                newBox.height = newHeight;
+            }
+
+            
+            else if (axis == 2) {
+                newBox.width = newWidth;
+            }
+
+            
+            else {
+                
+                
+                dragRatio = Math.abs(oppositeCorner[0] - this.lastXY[0]) / Math.abs(oppositeCorner[1] - this.lastXY[1]);
+
+                
+                if (dragRatio > ratio) {
+                    newBox.height = newHeight;
+                } else {
+                    newBox.width = newWidth;
+                }
+
+                
+                if (region == 'northeast') {
+                    newBox.y = box.y - (newBox.height - box.height);
+                } else if (region == 'northwest') {
+                    newBox.y = box.y - (newBox.height - box.height);
+                    newBox.x = box.x - (newBox.width - box.width);
+                } else if (region == 'southwest') {
+                    newBox.x = box.x - (newBox.width - box.width);
+                }
+            }
+        }
+
+        if (heightAdjust === 0) {
+            vertDir = 'none';
+        }
+        if (widthAdjust === 0) {
+            horizDir = 'none';
+        }
+        me.resize(newBox, {
+            horizontal: horizDir,
+            vertical: vertDir
+        }, atEnd);
+    },
+
+    getResizeTarget: function(atEnd) {
+        return atEnd ? this.target : this.getDynamicTarget();
+    },
+
+    resize: function(box, direction, atEnd) {
+        var target = this.getResizeTarget(atEnd);
+        if (target.isComponent) {
+            if (target.floating) {
+                target.setPagePosition(box.x, box.y);
+            }
+            target.setSize(box.width, box.height);
+        } else {
+            target.setBox(box);
+            
+            if (this.originalTarget) {
+                this.originalTarget.setBox(box);
+            }
+        }
+    },
+
+    onEnd: function(e) {
+        this.updateDimensions(e, true);
+        if (this.proxy) {
+            this.proxy.hide();
+        }
+    }
+});
+
+
+Ext.define('Ext.resizer.SplitterTracker', {
+    extend: 'Ext.dd.DragTracker',
+    requires: ['Ext.util.Region'],
+    enabled: true,
+    
+    overlayCls: Ext.baseCSSPrefix + 'resizable-overlay',
+
+    getPrevCmp: function() {
+        var splitter = this.getSplitter();
+        return splitter.previousSibling();
+    },
+
+    getNextCmp: function() {
+        var splitter = this.getSplitter();
+        return splitter.nextSibling();
+    },
+
+    
+    
+    onBeforeStart: function(e) {
+        var me = this,
+            prevCmp = me.getPrevCmp(),
+            nextCmp = me.getNextCmp(),
+            collapseEl = me.getSplitter().collapseEl,
+            overlay;
+            
+        if (collapseEl && (e.getTarget() === me.getSplitter().collapseEl.dom)) {
+            return false;
+        }
+
+        
+        if (nextCmp.collapsed || prevCmp.collapsed) {
+            return false;
+        }
+        
+        overlay = me.overlay =  Ext.getBody().createChild({
+            cls: me.overlayCls, 
+            html: ' '
+        });
+        overlay.unselectable();
+        overlay.setSize(Ext.Element.getViewWidth(true), Ext.Element.getViewHeight(true));
+        overlay.show();
+        
+        
+        me.prevBox  = prevCmp.getEl().getBox();
+        me.nextBox  = nextCmp.getEl().getBox();
+        me.constrainTo = me.calculateConstrainRegion();
+    },
+
+    
+    onStart: function(e) {
+        var splitter = this.getSplitter();
+        splitter.addCls(splitter.baseCls + '-active');
+    },
+
+    
+    calculateConstrainRegion: function() {
+        var me         = this,
+            splitter   = me.getSplitter(),
+            splitWidth = splitter.getWidth(),
+            defaultMin = splitter.defaultSplitMin,
+            orient     = splitter.orientation,
+            prevBox    = me.prevBox,
+            prevCmp    = me.getPrevCmp(),
+            nextBox    = me.nextBox,
+            nextCmp    = me.getNextCmp(),
+            
+            
+            
+            prevConstrainRegion, nextConstrainRegion;
+
+        
+        if (orient === 'vertical') {
+
+            
+            
+            prevConstrainRegion = Ext.create('Ext.util.Region',
+                prevBox.y,
+                
+                
+                (prevCmp.maxWidth ? prevBox.x + prevCmp.maxWidth : nextBox.right - (nextCmp.minWidth || defaultMin)) + splitWidth,
+                prevBox.bottom,
+                prevBox.x + (prevCmp.minWidth || defaultMin)
+            );
+            
+            nextConstrainRegion = Ext.create('Ext.util.Region',
+                nextBox.y,
+                nextBox.right - (nextCmp.minWidth || defaultMin),
+                nextBox.bottom,
+                
+                
+                (nextCmp.maxWidth ? nextBox.right - nextCmp.maxWidth : prevBox.x + (prevBox.minWidth || defaultMin)) - splitWidth
+            );
+        } else {
+            
+            prevConstrainRegion = Ext.create('Ext.util.Region',
+                prevBox.y + (prevCmp.minHeight || defaultMin),
+                prevBox.right,
+                
+                
+                (prevCmp.maxHeight ? prevBox.y + prevCmp.maxHeight : nextBox.bottom - (nextCmp.minHeight || defaultMin)) + splitWidth,
+                prevBox.x
+            );
+            
+            nextConstrainRegion = Ext.create('Ext.util.Region',
+                
+                
+                (nextCmp.maxHeight ? nextBox.bottom - nextCmp.maxHeight : prevBox.y + (prevCmp.minHeight || defaultMin)) - splitWidth,
+                nextBox.right,
+                nextBox.bottom - (nextCmp.minHeight || defaultMin),
+                nextBox.x
+            );
+        }
+
+        
+        return prevConstrainRegion.intersect(nextConstrainRegion);
+    },
+
+    
+    performResize: function(e) {
+        var me       = this,
+            offset   = me.getOffset('dragTarget'),
+            splitter = me.getSplitter(),
+            orient   = splitter.orientation,
+            prevCmp  = me.getPrevCmp(),
+            nextCmp  = me.getNextCmp(),
+            owner    = splitter.ownerCt,
+            layout   = owner.getLayout();
+
+        
+        owner.suspendLayout = true;
+
+        if (orient === 'vertical') {
+            if (prevCmp) {
+                if (!prevCmp.maintainFlex) {
+                    delete prevCmp.flex;
+                    prevCmp.setSize(me.prevBox.width + offset[0], prevCmp.getHeight());
+                }
+            }
+            if (nextCmp) {
+                if (!nextCmp.maintainFlex) {
+                    delete nextCmp.flex;
+                    nextCmp.setSize(me.nextBox.width - offset[0], nextCmp.getHeight());
+                }
+            }
+        
+        } else {
+            if (prevCmp) {
+                if (!prevCmp.maintainFlex) {
+                    delete prevCmp.flex;
+                    prevCmp.setSize(prevCmp.getWidth(), me.prevBox.height + offset[1]);
+                }
+            }
+            if (nextCmp) {
+                if (!nextCmp.maintainFlex) {
+                    delete nextCmp.flex;
+                    nextCmp.setSize(prevCmp.getWidth(), me.nextBox.height - offset[1]);
+                }
+            }
+        }
+        delete owner.suspendLayout;
+        layout.onLayout();
+    },
+
+    
+    
+    
+    endDrag: function () {
+        var me = this;
+
+        if (me.overlay) {
+             me.overlay.remove();
+             delete me.overlay;
+        }
+
+        me.callParent(arguments); 
+    },
+
+    
+    onEnd: function(e) {
+        var me = this,
+            splitter = me.getSplitter();
+            
+        splitter.removeCls(splitter.baseCls + '-active');
+        me.performResize();
+    },
+
+    
+    
+    onDrag: function(e) {
+        var me        = this,
+            offset    = me.getOffset('dragTarget'),
+            splitter  = me.getSplitter(),
+            splitEl   = splitter.getEl(),
+            orient    = splitter.orientation;
+
+        if (orient === "vertical") {
+            splitEl.setX(me.startRegion.left + offset[0]);
+        } else {
+            splitEl.setY(me.startRegion.top + offset[1]);
+        }
+    },
+
+    getSplitter: function() {
+        return Ext.getCmp(this.getDragCt().id);
+    }
+});
+
+Ext.define('Ext.selection.CellModel', {
+    extend: 'Ext.selection.Model',
+    alias: 'selection.cellmodel',
+    requires: ['Ext.util.KeyNav'],
+
+    
+    enableKeyNav: true,
+
+    
+    preventWrap: false,
+
+    constructor: function(){
+        this.addEvents(
+            
+            'deselect',
+
+            
+            'select'
+        );
+        this.callParent(arguments);
+    },
+
+    bindComponent: function(view) {
+        var me = this;
+        me.primaryView = view;
+        me.views = me.views || [];
+        me.views.push(view);
+        me.bind(view.getStore(), true);
+
+        view.on({
+            cellmousedown: me.onMouseDown,
+            refresh: me.onViewRefresh,
+            scope: me
+        });
+
+        if (me.enableKeyNav) {
+            me.initKeyNav(view);
+        }
+    },
+
+    initKeyNav: function(view) {
+        var me = this;
+
+        if (!view.rendered) {
+            view.on('render', Ext.Function.bind(me.initKeyNav, me, [view], 0), me, {single: true});
+            return;
+        }
+
+        view.el.set({
+            tabIndex: -1
+        });
+
+        
+        
+        me.keyNav = Ext.create('Ext.util.KeyNav', view.el, {
+            up: me.onKeyUp,
+            down: me.onKeyDown,
+            right: me.onKeyRight,
+            left: me.onKeyLeft,
+            tab: me.onKeyTab,
+            scope: me
+        });
+    },
+
+    getHeaderCt: function() {
+        return this.primaryView.headerCt;
+    },
+
+    onKeyUp: function(e, t) {
+        this.move('up', e);
+    },
+
+    onKeyDown: function(e, t) {
+        this.move('down', e);
+    },
+
+    onKeyLeft: function(e, t) {
+        this.move('left', e);
+    },
+
+    onKeyRight: function(e, t) {
+        this.move('right', e);
+    },
+
+    move: function(dir, e) {
+        var me = this,
+            pos = me.primaryView.walkCells(me.getCurrentPosition(), dir, e, me.preventWrap);
+        if (pos) {
+            me.setCurrentPosition(pos);
+        }
+        return pos;
+    },
+
+    
+    getCurrentPosition: function() {
+        return this.position;
+    },
+
+    
+    setCurrentPosition: function(pos) {
+        var me = this;
+
+        if (me.position) {
+            me.onCellDeselect(me.position);
+        }
+        if (pos) {
+            me.onCellSelect(pos);
+        }
+        me.position = pos;
+    },
+
+    
+    onMouseDown: function(view, cell, cellIndex, record, row, rowIndex, e) {
+        this.setCurrentPosition({
+            row: rowIndex,
+            column: cellIndex
+        });
+    },
+
+    
+    
+    onCellSelect: function(position) {
+        var me = this,
+            store = me.view.getStore(),
+            record = store.getAt(position.row);
+
+        me.doSelect(record);
+        me.primaryView.onCellSelect(position);
+        
+        me.primaryView.onCellFocus(position);
+        me.fireEvent('select', me, record, position.row, position.column);
+    },
+
+    
+    
+    onCellDeselect: function(position) {
+        var me = this,
+            store = me.view.getStore(),
+            record = store.getAt(position.row);
+
+        me.doDeselect(record);
+        me.primaryView.onCellDeselect(position);
+        me.fireEvent('deselect', me, record, position.row, position.column);
+    },
+
+    onKeyTab: function(e, t) {
+        var me = this,
+            direction = e.shiftKey ? 'left' : 'right',
+            editingPlugin = me.view.editingPlugin,
+            position = me.move(direction, e);
+
+        if (editingPlugin && position && me.wasEditing) {
+            editingPlugin.startEditByPosition(position);
+        }
+        delete me.wasEditing;
+    },
+
+    onEditorTab: function(editingPlugin, e) {
+        var me = this,
+            direction = e.shiftKey ? 'left' : 'right',
+            position  = me.move(direction, e);
+
+        if (position) {
+            editingPlugin.startEditByPosition(position);
+            me.wasEditing = true;
+        }
+    },
+
+    refresh: function() {
+        var pos = this.getCurrentPosition();
+        if (pos) {
+            this.onCellSelect(pos);
+        }
+    },
+
+    onViewRefresh: function() {
+        var pos = this.getCurrentPosition();
+        if (pos) {
+            this.onCellDeselect(pos);
+            this.setCurrentPosition(null);
+        }
+    },
+
+    selectByPosition: function(position) {
+        this.setCurrentPosition(position);
+    }
+});
+
+Ext.define('Ext.selection.RowModel', {
+    extend: 'Ext.selection.Model',
+    alias: 'selection.rowmodel',
+    requires: ['Ext.util.KeyNav'],
+
+    
+    deltaScroll: 5,
+
+    
+    enableKeyNav: true,
+    
+    
+    ignoreRightMouseSelection: true,
+
+    constructor: function(){
+        this.addEvents(
+            
+            'beforedeselect',
+
+            
+            'beforeselect',
+
+            
+            'deselect',
+
+            
+            'select'
+        );
+        this.callParent(arguments);
+    },
+
+    bindComponent: function(view) {
+        var me = this;
+
+        me.views = me.views || [];
+        me.views.push(view);
+        me.bind(view.getStore(), true);
+
+        view.on({
+            itemmousedown: me.onRowMouseDown,
+            scope: me
+        });
+
+        if (me.enableKeyNav) {
+            me.initKeyNav(view);
+        }
+    },
+
+    initKeyNav: function(view) {
+        var me = this;
+
+        if (!view.rendered) {
+            view.on('render', Ext.Function.bind(me.initKeyNav, me, [view], 0), me, {single: true});
+            return;
+        }
+
+        view.el.set({
+            tabIndex: -1
+        });
+
+        
+        
+        me.keyNav = new Ext.util.KeyNav(view.el, {
+            up: me.onKeyUp,
+            down: me.onKeyDown,
+            right: me.onKeyRight,
+            left: me.onKeyLeft,
+            pageDown: me.onKeyPageDown,
+            pageUp: me.onKeyPageUp,
+            home: me.onKeyHome,
+            end: me.onKeyEnd,
+            scope: me
+        });
+        view.el.on(Ext.EventManager.getKeyEvent(), me.onKeyPress, me);
+    },
+
+    
+    
+    
+    getRowsVisible: function() {
+        var rowsVisible = false,
+            view = this.views[0],
+            row = view.getNode(0),
+            rowHeight, gridViewHeight;
+
+        if (row) {
+            rowHeight = Ext.fly(row).getHeight();
+            gridViewHeight = view.el.getHeight();
+            rowsVisible = Math.floor(gridViewHeight / rowHeight);
+        }
+
+        return rowsVisible;
+    },
+
+    
+    onKeyEnd: function(e, t) {
+        var me = this,
+            last = me.store.getAt(me.store.getCount() - 1);
+
+        if (last) {
+            if (e.shiftKey) {
+                me.selectRange(last, me.lastFocused || 0);
+                me.setLastFocused(last);
+            } else if (e.ctrlKey) {
+                me.setLastFocused(last);
+            } else {
+                me.doSelect(last);
+            }
+        }
+    },
+
+    
+    onKeyHome: function(e, t) {
+        var me = this,
+            first = me.store.getAt(0);
+
+        if (first) {
+            if (e.shiftKey) {
+                me.selectRange(first, me.lastFocused || 0);
+                me.setLastFocused(first);
+            } else if (e.ctrlKey) {
+                me.setLastFocused(first);
+            } else {
+                me.doSelect(first, false);
+            }
+        }
+    },
+
+    
+    onKeyPageUp: function(e, t) {
+        var me = this,
+            rowsVisible = me.getRowsVisible(),
+            selIdx,
+            prevIdx,
+            prevRecord,
+            currRec;
+
+        if (rowsVisible) {
+            selIdx = me.lastFocused ? me.store.indexOf(me.lastFocused) : 0;
+            prevIdx = selIdx - rowsVisible;
+            if (prevIdx < 0) {
+                prevIdx = 0;
+            }
+            prevRecord = me.store.getAt(prevIdx);
+            if (e.shiftKey) {
+                currRec = me.store.getAt(selIdx);
+                me.selectRange(prevRecord, currRec, e.ctrlKey, 'up');
+                me.setLastFocused(prevRecord);
+            } else if (e.ctrlKey) {
+                e.preventDefault();
+                me.setLastFocused(prevRecord);
+            } else {
+                me.doSelect(prevRecord);
+            }
+
+        }
+    },
+
+    
+    onKeyPageDown: function(e, t) {
+        var me = this,
+            rowsVisible = me.getRowsVisible(),
+            selIdx,
+            nextIdx,
+            nextRecord,
+            currRec;
+
+        if (rowsVisible) {
+            selIdx = me.lastFocused ? me.store.indexOf(me.lastFocused) : 0;
+            nextIdx = selIdx + rowsVisible;
+            if (nextIdx >= me.store.getCount()) {
+                nextIdx = me.store.getCount() - 1;
+            }
+            nextRecord = me.store.getAt(nextIdx);
+            if (e.shiftKey) {
+                currRec = me.store.getAt(selIdx);
+                me.selectRange(nextRecord, currRec, e.ctrlKey, 'down');
+                me.setLastFocused(nextRecord);
+            } else if (e.ctrlKey) {
+                
+                
+                e.preventDefault();
+                me.setLastFocused(nextRecord);
+            } else {
+                me.doSelect(nextRecord);
+            }
+        }
+    },
+
+    
+    
+    onKeyPress: function(e, t) {
+        if (e.getKey() === e.SPACE) {
+            e.stopEvent();
+            var me = this,
+                record = me.lastFocused;
+
+            if (record) {
+                if (me.isSelected(record)) {
+                    me.doDeselect(record, false);
+                } else {
+                    me.doSelect(record, true);
+                }
+            }
+        }
+    },
+
+    
+    
+    
+    onKeyUp: function(e, t) {
+        var me = this,
+            view = me.views[0],
+            idx  = me.store.indexOf(me.lastFocused),
+            record;
+
+        if (idx > 0) {
+            
+            
+            record = me.store.getAt(idx - 1);
+            if (e.shiftKey && me.lastFocused) {
+                if (me.isSelected(me.lastFocused) && me.isSelected(record)) {
+                    me.doDeselect(me.lastFocused, true);
+                    me.setLastFocused(record);
+                } else if (!me.isSelected(me.lastFocused)) {
+                    me.doSelect(me.lastFocused, true);
+                    me.doSelect(record, true);
+                } else {
+                    me.doSelect(record, true);
+                }
+            } else if (e.ctrlKey) {
+                me.setLastFocused(record);
+            } else {
+                me.doSelect(record);
+                
+            }
+        }
+        
+        
+        
+        
+        
+        
+        
+    },
+
+    
+    
+    
+    onKeyDown: function(e, t) {
+        var me = this,
+            view = me.views[0],
+            idx  = me.store.indexOf(me.lastFocused),
+            record;
+
+        
+        
+        if (idx + 1 < me.store.getCount()) {
+            record = me.store.getAt(idx + 1);
+            if (me.selected.getCount() === 0) {
+                me.doSelect(record);
+                
+            } else if (e.shiftKey && me.lastFocused) {
+                if (me.isSelected(me.lastFocused) && me.isSelected(record)) {
+                    me.doDeselect(me.lastFocused, true);
+                    me.setLastFocused(record);
+                } else if (!me.isSelected(me.lastFocused)) {
+                    me.doSelect(me.lastFocused, true);
+                    me.doSelect(record, true);
+                } else {
+                    me.doSelect(record, true);
+                }
+            } else if (e.ctrlKey) {
+                me.setLastFocused(record);
+            } else {
+                me.doSelect(record);
+                
+            }
+        }
+    },
+
+    scrollByDeltaX: function(delta) {
+        var view    = this.views[0],
+            section = view.up(),
+            hScroll = section.horizontalScroller;
+
+        if (hScroll) {
+            hScroll.scrollByDeltaX(delta);
+        }
+    },
+
+    onKeyLeft: function(e, t) {
+        this.scrollByDeltaX(-this.deltaScroll);
+    },
+
+    onKeyRight: function(e, t) {
+        this.scrollByDeltaX(this.deltaScroll);
+    },
+
+    
+    
+    onRowMouseDown: function(view, record, item, index, e) {
+        view.el.focus();
+        if (!this.allowRightMouseSelection(e)) {
+            return;
+        }
+        this.selectWithEvent(record, e);
+    },
+    
+    
+    allowRightMouseSelection: function(e) {
+        var disallow = this.ignoreRightMouseSelection && e.button !== 0;
+        if (disallow) {
+            disallow = this.hasSelection();
+        }
+        return !disallow;
+    },
+
+    
+    
+    onSelectChange: function(record, isSelected, suppressEvent, commitFn) {
+        var me      = this,
+            views   = me.views,
+            viewsLn = views.length,
+            store   = me.store,
+            rowIdx  = store.indexOf(record),
+            eventName = isSelected ? 'select' : 'deselect',
+            i = 0;
+
+        if ((suppressEvent || me.fireEvent('before' + eventName, me, record, rowIdx)) !== false &&
+                commitFn() !== false) {
+
+            for (; i < viewsLn; i++) {
+                if (isSelected) {
+                    views[i].onRowSelect(rowIdx, suppressEvent);
+                } else {
+                    views[i].onRowDeselect(rowIdx, suppressEvent);
+                }
+            }
+
+            if (!suppressEvent) {
+                me.fireEvent(eventName, me, record, rowIdx);
+            }
+        }
+    },
+
+    
+    
+    onLastFocusChanged: function(oldFocused, newFocused, supressFocus) {
+        var views   = this.views,
+            viewsLn = views.length,
+            store   = this.store,
+            rowIdx,
+            i = 0;
+
+        if (oldFocused) {
+            rowIdx = store.indexOf(oldFocused);
+            if (rowIdx != -1) {
+                for (; i < viewsLn; i++) {
+                    views[i].onRowFocus(rowIdx, false);
+                }
+            }
+        }
+
+        if (newFocused) {
+            rowIdx = store.indexOf(newFocused);
+            if (rowIdx != -1) {
+                for (i = 0; i < viewsLn; i++) {
+                    views[i].onRowFocus(rowIdx, true, supressFocus);
+                }
+            }
+        }
+    },
+
+    onEditorTab: function(editingPlugin, e) {
+        var me = this,
+            view = me.views[0],
+            record = editingPlugin.getActiveRecord(),
+            header = editingPlugin.getActiveColumn(),
+            position = view.getPosition(record, header),
+            direction = e.shiftKey ? 'left' : 'right',
+            newPosition  = view.walkCells(position, direction, e, this.preventWrap);
+
+        if (newPosition) {
+            editingPlugin.startEditByPosition(newPosition);
+        }
+    },
+
+    selectByPosition: function(position) {
+        var record = this.store.getAt(position.row);
+        this.select(record);
+    }
+});
+
+Ext.define('Ext.selection.CheckboxModel', {
+    alias: 'selection.checkboxmodel',
+    extend: 'Ext.selection.RowModel',
+
+    
+    mode: 'MULTI',
+
+    
+    injectCheckbox: 0,
+
+    
+    checkOnly: false,
+
+    headerWidth: 24,
+
+    
+    checkerOnCls: Ext.baseCSSPrefix + 'grid-hd-checker-on',
+
+    bindComponent: function(view) {
+        var me = this;
+
+        me.sortable = false;
+        me.callParent(arguments);
+        if (!me.hasLockedHeader() || view.headerCt.lockedCt) {
+            
+            view.headerCt.on('headerclick', me.onHeaderClick, me);
+            me.addCheckbox(true);
+            me.mon(view.ownerCt, 'reconfigure', me.addCheckbox, me);
+        }
+    },
+
+    hasLockedHeader: function(){
+        var hasLocked = false;
+        Ext.each(this.views, function(view){
+            if (view.headerCt.lockedCt) {
+                hasLocked = true;
+                return false;
+            }
+        });
+        return hasLocked;
+    },
+
+    
+    addCheckbox: function(initial){
+        var me = this,
+            checkbox = me.injectCheckbox,
+            view = me.views[0],
+            headerCt = view.headerCt;
+
+        if (checkbox !== false) {
+            if (checkbox == 'first') {
+                checkbox = 0;
+            } else if (checkbox == 'last') {
+                checkbox = headerCt.getColumnCount();
+            }
+            headerCt.add(checkbox,  me.getHeaderConfig());
+        }
+
+        if (initial !== true) {
+            view.refresh();
+        }
+    },
+
+    
+    toggleUiHeader: function(isChecked) {
+        var view     = this.views[0],
+            headerCt = view.headerCt,
+            checkHd  = headerCt.child('gridcolumn[isCheckerHd]');
+
+        if (checkHd) {
+            if (isChecked) {
+                checkHd.el.addCls(this.checkerOnCls);
+            } else {
+                checkHd.el.removeCls(this.checkerOnCls);
+            }
+        }
+    },
+
+    
+    onHeaderClick: function(headerCt, header, e) {
+        if (header.isCheckerHd) {
+            e.stopEvent();
+            var isChecked = header.el.hasCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');
+            if (isChecked) {
+                
+                this.deselectAll(true);
+            } else {
+                
+                this.selectAll(true);
+            }
+        }
+    },
+
+    
+    getHeaderConfig: function() {
+        var me = this;
+
+        return {
+            isCheckerHd: true,
+            text : ' ',
+            width: me.headerWidth,
+            sortable: false,
+            draggable: false,
+            resizable: false,
+            hideable: false,
+            menuDisabled: true,
+            dataIndex: '',
+            cls: Ext.baseCSSPrefix + 'column-header-checkbox ',
+            renderer: Ext.Function.bind(me.renderer, me),
+            locked: me.hasLockedHeader()
+        };
+    },
+
+    
+    renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
+        metaData.tdCls = Ext.baseCSSPrefix + 'grid-cell-special';
+        return '<div class="' + Ext.baseCSSPrefix + 'grid-row-checker"> </div>';
+    },
+
+    
+    onRowMouseDown: function(view, record, item, index, e) {
+        view.el.focus();
+        var me = this,
+            checker = e.getTarget('.' + Ext.baseCSSPrefix + 'grid-row-checker');
+            
+        if (!me.allowRightMouseSelection(e)) {
+            return;
+        }
+
+        
+        if (me.checkOnly && !checker) {
+            return;
+        }
+
+        if (checker) {
+            var mode = me.getSelectionMode();
+            
+            
+            if (mode !== 'SINGLE') {
+                me.setSelectionMode('SIMPLE');
+            }
+            me.selectWithEvent(record, e);
+            me.setSelectionMode(mode);
+        } else {
+            me.selectWithEvent(record, e);
+        }
+    },
+
+    
+    onSelectChange: function() {
+        this.callParent(arguments);
+
+        
+        var hdSelectStatus = this.selected.getCount() === this.store.getCount();
+        this.toggleUiHeader(hdSelectStatus);
+    }
+});
+
+
+Ext.define('Ext.selection.TreeModel', {
+    extend: 'Ext.selection.RowModel',
+    alias: 'selection.treemodel',
+    
+    
+    
+    
+    pruneRemoved: false,
+    
+    onKeyRight: function(e, t) {
+        var focused = this.getLastFocused(),
+            view    = this.view;
+            
+        if (focused) {
+            
+            
+            
+            if (focused.isExpanded()) {
+                this.onKeyDown(e, t);
+            
+            } else if (!focused.isLeaf()) {
+                view.expand(focused);
+            }
+        }
+    },
+    
+    onKeyLeft: function(e, t) {
+        var focused = this.getLastFocused(),
+            view    = this.view,
+            viewSm  = view.getSelectionModel(),
+            parentNode, parentRecord;
+
+        if (focused) {
+            parentNode = focused.parentNode;
+            
+            if (focused.isExpanded()) {
+                view.collapse(focused);
+            
+            
+            } else if (parentNode && !parentNode.isRoot()) {
+                
+                if (e.shiftKey) {
+                    viewSm.selectRange(parentNode, focused, e.ctrlKey, 'up');
+                    viewSm.setLastFocused(parentNode);
+                
+                } else if (e.ctrlKey) {
+                    viewSm.setLastFocused(parentNode);
+                
+                } else {
+                    viewSm.select(parentNode);
+                }
+            }
+        }
+    },
+    
+    onKeyPress: function(e, t) {
+        var key = e.getKey(),
+            selected, 
+            checked;
+        
+        if (key === e.SPACE || key === e.ENTER) {
+            e.stopEvent();
+            selected = this.getLastSelected();
+            if (selected) {
+                this.view.onCheckChange(selected);
+            }
+        } else {
+            this.callParent(arguments);
+        }
+    }
+});
+
+
+Ext.define('Ext.slider.Thumb', {
+    requires: ['Ext.dd.DragTracker', 'Ext.util.Format'],
+    
+    topZIndex: 10000,
+
+    
+
+    
+    constructor: function(config) {
+        var me = this;
+
+        
+        Ext.apply(me, config || {}, {
+            cls: Ext.baseCSSPrefix + 'slider-thumb',
+
+            
+            constrain: false
+        });
+        me.callParent([config]);
+
+        if (me.slider.vertical) {
+            Ext.apply(me, Ext.slider.Thumb.Vertical);
+        }
+    },
+
+    
+    render: function() {
+        var me = this;
+
+        me.el = me.slider.innerEl.insertFirst({cls: me.cls});
+        if (me.disabled) {
+            me.disable();
+        }
+        me.initEvents();
+    },
+
+    
+    move: function(v, animate){
+        if(!animate){
+            this.el.setLeft(v);
+        }else{
+            Ext.create('Ext.fx.Anim', {
+                target: this.el,
+                duration: 350,
+                to: {
+                    left: v
+                }
+            });
+        }
+    },
+
+    
+    bringToFront: function() {
+        this.el.setStyle('zIndex', this.topZIndex);
+    },
+
+    
+    sendToBack: function() {
+        this.el.setStyle('zIndex', '');
+    },
+
+    
+    enable: function() {
+        var me = this;
+
+        me.disabled = false;
+        if (me.el) {
+            me.el.removeCls(me.slider.disabledCls);
+        }
+    },
+
+    
+    disable: function() {
+        var me = this;
+
+        me.disabled = true;
+        if (me.el) {
+            me.el.addCls(me.slider.disabledCls);
+        }
+    },
+
+    
+    initEvents: function() {
+        var me = this,
+            el = me.el;
+
+        me.tracker = Ext.create('Ext.dd.DragTracker', {
+            onBeforeStart: Ext.Function.bind(me.onBeforeDragStart, me),
+            onStart      : Ext.Function.bind(me.onDragStart, me),
+            onDrag       : Ext.Function.bind(me.onDrag, me),
+            onEnd        : Ext.Function.bind(me.onDragEnd, me),
+            tolerance    : 3,
+            autoStart    : 300,
+            overCls      : Ext.baseCSSPrefix + 'slider-thumb-over'
+        });
+
+        me.tracker.initEl(el);
+    },
+
+    
+    onBeforeDragStart : function(e) {
+        if (this.disabled) {
+            return false;
+        } else {
+            this.slider.promoteThumb(this);
+            return true;
+        }
+    },
+
+    
+    onDragStart: function(e){
+        var me = this;
+
+        me.el.addCls(Ext.baseCSSPrefix + 'slider-thumb-drag');
+        me.dragging = true;
+        me.dragStartValue = me.value;
+
+        me.slider.fireEvent('dragstart', me.slider, e, me);
+    },
+
+    
+    onDrag: function(e) {
+        var me       = this,
+            slider   = me.slider,
+            index    = me.index,
+            newValue = me.getNewValue(),
+            above,
+            below;
+
+        if (me.constrain) {
+            above = slider.thumbs[index + 1];
+            below = slider.thumbs[index - 1];
+
+            if (below !== undefined && newValue <= below.value) {
+                newValue = below.value;
+            }
+
+            if (above !== undefined && newValue >= above.value) {
+                newValue = above.value;
+            }
+        }
+
+        slider.setValue(index, newValue, false);
+        slider.fireEvent('drag', slider, e, me);
+    },
+
+    getNewValue: function() {
+        var slider = this.slider,
+            pos = slider.innerEl.translatePoints(this.tracker.getXY());
+
+        return Ext.util.Format.round(slider.reverseValue(pos.left), slider.decimalPrecision);
+    },
+
+    
+    onDragEnd: function(e) {
+        var me     = this,
+            slider = me.slider,
+            value  = me.value;
+
+        me.el.removeCls(Ext.baseCSSPrefix + 'slider-thumb-drag');
+
+        me.dragging = false;
+        slider.fireEvent('dragend', slider, e);
+
+        if (me.dragStartValue != value) {
+            slider.fireEvent('changecomplete', slider, value, me);
+        }
+    },
+
+    destroy: function() {
+        Ext.destroy(this.tracker);
+    },
+    statics: {
+        
+        Vertical: {
+            getNewValue: function() {
+                var slider   = this.slider,
+                    innerEl  = slider.innerEl,
+                    pos      = innerEl.translatePoints(this.tracker.getXY()),
+                    bottom   = innerEl.getHeight() - pos.top;
+
+                return Ext.util.Format.round(slider.reverseValue(bottom), slider.decimalPrecision);
+            },
+            move: function(v, animate) {
+                if (!animate) {
+                    this.el.setBottom(v);
+                } else {
+                    Ext.create('Ext.fx.Anim', {
+                        target: this.el,
+                        duration: 350,
+                        to: {
+                            bottom: v
+                        }
+                    });
+                }
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.slider.Tip', {
+    extend: 'Ext.tip.Tip',
+    minWidth: 10,
+    alias: 'widget.slidertip',
+    offsets : [0, -10],
+
+    isSliderTip: true,
+
+    init: function(slider) {
+        var me = this;
+
+        slider.on({
+            scope    : me,
+            dragstart: me.onSlide,
+            drag     : me.onSlide,
+            dragend  : me.hide,
+            destroy  : me.destroy
+        });
+    },
+    
+    onSlide : function(slider, e, thumb) {
+        var me = this;
+        me.show();
+        me.update(me.getText(thumb));
+        me.doComponentLayout();
+        me.el.alignTo(thumb.el, 'b-t?', me.offsets);
+    },
+
+    
+    getText : function(thumb) {
+        return String(thumb.value);
+    }
+});
+
+Ext.define('Ext.slider.Multi', {
+    extend: 'Ext.form.field.Base',
+    alias: 'widget.multislider',
+    alternateClassName: 'Ext.slider.MultiSlider',
+
+    requires: [
+        'Ext.slider.Thumb',
+        'Ext.slider.Tip',
+        'Ext.Number',
+        'Ext.util.Format',
+        'Ext.Template',
+        'Ext.layout.component.field.Slider'
+    ],
+
+    
+    fieldSubTpl: [
+        '<div id="{id}" class="' + Ext.baseCSSPrefix + 'slider {fieldCls} {vertical}" aria-valuemin="{minValue}" aria-valuemax="{maxValue}" aria-valuenow="{value}" aria-valuetext="{value}">',
+            '<div id="{cmpId}-endEl" class="' + Ext.baseCSSPrefix + 'slider-end" role="presentation">',
+                '<div id="{cmpId}-innerEl" class="' + Ext.baseCSSPrefix + 'slider-inner" role="presentation">',
+                    '<a id="{cmpId}-focusEl" class="' + Ext.baseCSSPrefix + 'slider-focus" href="#" tabIndex="-1" hidefocus="on" role="presentation"></a>',
+                '</div>',
+            '</div>',
+        '</div>',
+        {
+            disableFormats: true,
+            compiled: true
+        }
+    ],
+
+    
+
+    
+
+    
+    vertical: false,
+
+    
+    minValue: 0,
+
+    
+    maxValue: 100,
+
+    
+    decimalPrecision: 0,
+
+    
+    keyIncrement: 1,
+
+    
+    increment: 0,
+
+    
+    clickRange: [5,15],
+
+    
+    clickToChange : true,
+
+    
+    animate: true,
+
+    
+    dragging: false,
+
+    
+    constrainThumbs: true,
+
+    componentLayout: 'sliderfield',
+
+    
+    useTips : true,
+
+    
+    tipText : null,
+
+    ariaRole: 'slider',
+
+    
+    initValue: function() {
+        var me = this,
+            extValue = Ext.value,
+            
+            values = extValue(me.values, [extValue(me.value, extValue(me.minValue, 0))]),
+            i = 0,
+            len = values.length;
+
+        
+        me.originalValue = values;
+
+        
+        for (; i < len; i++) {
+            me.addThumb(values[i]);
+        }
+    },
+
+    
+    initComponent : function() {
+        var me = this,
+            tipPlug,
+            hasTip;
+
+        
+        me.thumbs = [];
+
+        me.keyIncrement = Math.max(me.increment, me.keyIncrement);
+
+        me.addEvents(
+            
+            'beforechange',
+
+            
+            'change',
+
+            
+            'changecomplete',
+
+            
+            'dragstart',
+
+            
+            'drag',
+
+            
+            'dragend'
+        );
+
+        if (me.vertical) {
+            Ext.apply(me, Ext.slider.Multi.Vertical);
+        }
+
+        me.callParent();
+
+        
+        if (me.useTips) {
+            tipPlug = me.tipText ? {getText: me.tipText} : {};
+            me.plugins = me.plugins || [];
+            Ext.each(me.plugins, function(plug){
+                if (plug.isSliderTip) {
+                    hasTip = true;
+                    return false;
+                }
+            });
+            if (!hasTip) {
+                me.plugins.push(Ext.create('Ext.slider.Tip', tipPlug));
+            }
+        }
+    },
+
+    
+    addThumb: function(value) {
+        var me = this,
+            thumb = Ext.create('Ext.slider.Thumb', {
+            value    : value,
+            slider   : me,
+            index    : me.thumbs.length,
+            constrain: me.constrainThumbs
+        });
+        me.thumbs.push(thumb);
+
+        
+        if (me.rendered) {
+            thumb.render();
+        }
+
+        return thumb;
+    },
+
+    
+    promoteThumb: function(topThumb) {
+        var thumbs = this.thumbs,
+            ln = thumbs.length,
+            zIndex, thumb, i;
+
+        for (i = 0; i < ln; i++) {
+            thumb = thumbs[i];
+
+            if (thumb == topThumb) {
+                thumb.bringToFront();
+            } else {
+                thumb.sendToBack();
+            }
+        }
+    },
+
+    
+    onRender : function() {
+        var me = this,
+            i = 0,
+            thumbs = me.thumbs,
+            len = thumbs.length,
+            thumb;
+
+        Ext.applyIf(me.subTplData, {
+            vertical: me.vertical ? Ext.baseCSSPrefix + 'slider-vert' : Ext.baseCSSPrefix + 'slider-horz',
+            minValue: me.minValue,
+            maxValue: me.maxValue,
+            value: me.value
+        });
+
+        me.addChildEls('endEl', 'innerEl', 'focusEl');
+
+        me.callParent(arguments);
+
+        
+        for (; i < len; i++) {
+            thumbs[i].render();
+        }
+
+        
+        thumb = me.innerEl.down('.' + Ext.baseCSSPrefix + 'slider-thumb');
+        me.halfThumb = (me.vertical ? thumb.getHeight() : thumb.getWidth()) / 2;
+
+    },
+
+    
+    onChange : function(slider, v) {
+        this.setValue(v, undefined, true);
+    },
+
+    
+    initEvents : function() {
+        var me = this;
+
+        me.mon(me.el, {
+            scope    : me,
+            mousedown: me.onMouseDown,
+            keydown  : me.onKeyDown,
+            change : me.onChange
+        });
+
+        me.focusEl.swallowEvent("click", true);
+    },
+
+    
+    onMouseDown : function(e) {
+        var me = this,
+            thumbClicked = false,
+            i = 0,
+            thumbs = me.thumbs,
+            len = thumbs.length,
+            local;
+
+        if (me.disabled) {
+            return;
+        }
+
+        
+        for (; i < len; i++) {
+            thumbClicked = thumbClicked || e.target == thumbs[i].el.dom;
+        }
+
+        if (me.clickToChange && !thumbClicked) {
+            local = me.innerEl.translatePoints(e.getXY());
+            me.onClickChange(local);
+        }
+        me.focus();
+    },
+
+    
+    onClickChange : function(local) {
+        var me = this,
+            thumb, index;
+
+        if (local.top > me.clickRange[0] && local.top < me.clickRange[1]) {
+            
+            thumb = me.getNearest(local, 'left');
+            if (!thumb.disabled) {
+                index = thumb.index;
+                me.setValue(index, Ext.util.Format.round(me.reverseValue(local.left), me.decimalPrecision), undefined, true);
+            }
+        }
+    },
+
+    
+    getNearest: function(local, prop) {
+        var me = this,
+            localValue = prop == 'top' ? me.innerEl.getHeight() - local[prop] : local[prop],
+            clickValue = me.reverseValue(localValue),
+            nearestDistance = (me.maxValue - me.minValue) + 5, 
+            index = 0,
+            nearest = null,
+            thumbs = me.thumbs,
+            i = 0,
+            len = thumbs.length,
+            thumb,
+            value,
+            dist;
+
+        for (; i < len; i++) {
+            thumb = me.thumbs[i];
+            value = thumb.value;
+            dist  = Math.abs(value - clickValue);
+
+            if (Math.abs(dist <= nearestDistance)) {
+                nearest = thumb;
+                index = i;
+                nearestDistance = dist;
+            }
+        }
+        return nearest;
+    },
+
+    
+    onKeyDown : function(e) {
+        
+        var me = this,
+            k,
+            val;
+
+        if(me.disabled || me.thumbs.length !== 1) {
+            e.preventDefault();
+            return;
+        }
+        k = e.getKey();
+
+        switch(k) {
+            case e.UP:
+            case e.RIGHT:
+                e.stopEvent();
+                val = e.ctrlKey ? me.maxValue : me.getValue(0) + me.keyIncrement;
+                me.setValue(0, val, undefined, true);
+            break;
+            case e.DOWN:
+            case e.LEFT:
+                e.stopEvent();
+                val = e.ctrlKey ? me.minValue : me.getValue(0) - me.keyIncrement;
+                me.setValue(0, val, undefined, true);
+            break;
+            default:
+                e.preventDefault();
+        }
+    },
+
+    
+    afterRender : function() {
+        var me = this,
+            i = 0,
+            thumbs = me.thumbs,
+            len = thumbs.length,
+            thumb,
+            v;
+
+        me.callParent(arguments);
+
+        for (; i < len; i++) {
+            thumb = thumbs[i];
+
+            if (thumb.value !== undefined) {
+                v = me.normalizeValue(thumb.value);
+                if (v !== thumb.value) {
+                    
+                    me.setValue(i, v, false);
+                } else {
+                    thumb.move(me.translateValue(v), false);
+                }
+            }
+        }
+    },
+
+    
+    getRatio : function() {
+        var w = this.innerEl.getWidth(),
+            v = this.maxValue - this.minValue;
+        return v === 0 ? w : (w/v);
+    },
+
+    
+    normalizeValue : function(v) {
+        var me = this;
+
+        v = Ext.Number.snap(v, this.increment, this.minValue, this.maxValue);
+        v = Ext.util.Format.round(v, me.decimalPrecision);
+        v = Ext.Number.constrain(v, me.minValue, me.maxValue);
+        return v;
+    },
+
+    
+    setMinValue : function(val) {
+        var me = this,
+            i = 0,
+            thumbs = me.thumbs,
+            len = thumbs.length,
+            t;
+
+        me.minValue = val;
+        if (me.rendered) {
+            me.inputEl.dom.setAttribute('aria-valuemin', val);
+        }
+
+        for (; i < len; ++i) {
+            t = thumbs[i];
+            t.value = t.value < val ? val : t.value;
+        }
+        me.syncThumbs();
+    },
+
+    
+    setMaxValue : function(val) {
+        var me = this,
+            i = 0,
+            thumbs = me.thumbs,
+            len = thumbs.length,
+            t;
+
+        me.maxValue = val;
+        if (me.rendered) {
+            me.inputEl.dom.setAttribute('aria-valuemax', val);
+        }
+
+        for (; i < len; ++i) {
+            t = thumbs[i];
+            t.value = t.value > val ? val : t.value;
+        }
+        me.syncThumbs();
+    },
+
+    
+    setValue : function(index, value, animate, changeComplete) {
+        var me = this,
+            thumb = me.thumbs[index];
+
+        
+        value = me.normalizeValue(value);
+
+        if (value !== thumb.value && me.fireEvent('beforechange', me, value, thumb.value, thumb) !== false) {
+            thumb.value = value;
+            if (me.rendered) {
+                
+                
+                me.inputEl.set({
+                    'aria-valuenow': value,
+                    'aria-valuetext': value
+                });
+
+                thumb.move(me.translateValue(value), Ext.isDefined(animate) ? animate !== false : me.animate);
+
+                me.fireEvent('change', me, value, thumb);
+                if (changeComplete) {
+                    me.fireEvent('changecomplete', me, value, thumb);
+                }
+            }
+        }
+    },
+
+    
+    translateValue : function(v) {
+        var ratio = this.getRatio();
+        return (v * ratio) - (this.minValue * ratio) - this.halfThumb;
+    },
+
+    
+    reverseValue : function(pos) {
+        var ratio = this.getRatio();
+        return (pos + (this.minValue * ratio)) / ratio;
+    },
+
+    
+    focus : function() {
+        this.focusEl.focus(10);
+    },
+
+    
+    onDisable: function() {
+        var me = this,
+            i = 0,
+            thumbs = me.thumbs,
+            len = thumbs.length,
+            thumb,
+            el,
+            xy;
+
+        me.callParent();
+
+        for (; i < len; i++) {
+            thumb = thumbs[i];
+            el = thumb.el;
+
+            thumb.disable();
+
+            if(Ext.isIE) {
+                
+                
+                xy = el.getXY();
+                el.hide();
+
+                me.innerEl.addCls(me.disabledCls).dom.disabled = true;
+
+                if (!me.thumbHolder) {
+                    me.thumbHolder = me.endEl.createChild({cls: Ext.baseCSSPrefix + 'slider-thumb ' + me.disabledCls});
+                }
+
+                me.thumbHolder.show().setXY(xy);
+            }
+        }
+    },
+
+    
+    onEnable: function() {
+        var me = this,
+            i = 0,
+            thumbs = me.thumbs,
+            len = thumbs.length,
+            thumb,
+            el;
+
+        this.callParent();
+
+        for (; i < len; i++) {
+            thumb = thumbs[i];
+            el = thumb.el;
+
+            thumb.enable();
+
+            if (Ext.isIE) {
+                me.innerEl.removeCls(me.disabledCls).dom.disabled = false;
+
+                if (me.thumbHolder) {
+                    me.thumbHolder.hide();
+                }
+
+                el.show();
+                me.syncThumbs();
+            }
+        }
+    },
+
+    
+    syncThumbs : function() {
+        if (this.rendered) {
+            var thumbs = this.thumbs,
+                length = thumbs.length,
+                i = 0;
+
+            for (; i < length; i++) {
+                thumbs[i].move(this.translateValue(thumbs[i].value));
+            }
+        }
+    },
+
+    
+    getValue : function(index) {
+        return Ext.isNumber(index) ? this.thumbs[index].value : this.getValues();
+    },
+
+    
+    getValues: function() {
+        var values = [],
+            i = 0,
+            thumbs = this.thumbs,
+            len = thumbs.length;
+
+        for (; i < len; i++) {
+            values.push(thumbs[i].value);
+        }
+
+        return values;
+    },
+
+    getSubmitValue: function() {
+        var me = this;
+        return (me.disabled || !me.submitValue) ? null : me.getValue();
+    },
+
+    reset: function() {
+        var me = this,
+            Array = Ext.Array;
+        Array.forEach(Array.from(me.originalValue), function(val, i) {
+            me.setValue(i, val);
+        });
+        me.clearInvalid();
+        
+        delete me.wasValid;
+    },
+
+    
+    beforeDestroy : function() {
+        var me = this;
+
+        Ext.destroy(me.innerEl, me.endEl, me.focusEl);
+        Ext.each(me.thumbs, function(thumb) {
+            Ext.destroy(thumb);
+        }, me);
+
+        me.callParent();
+    },
+
+    statics: {
+        
+        Vertical: {
+            getRatio : function() {
+                var h = this.innerEl.getHeight(),
+                    v = this.maxValue - this.minValue;
+                return h/v;
+            },
+
+            onClickChange : function(local) {
+                var me = this,
+                    thumb, index, bottom;
+
+                if (local.left > me.clickRange[0] && local.left < me.clickRange[1]) {
+                    thumb = me.getNearest(local, 'top');
+                    if (!thumb.disabled) {
+                        index = thumb.index;
+                        bottom =  me.reverseValue(me.innerEl.getHeight() - local.top);
+
+                        me.setValue(index, Ext.util.Format.round(me.minValue + bottom, me.decimalPrecision), undefined, true);
+                    }
+                }
+            }
+        }
+    }
+});
+
+
+Ext.define('Ext.slider.Single', {
+    extend: 'Ext.slider.Multi',
+    alias: ['widget.slider', 'widget.sliderfield'],
+    alternateClassName: ['Ext.Slider', 'Ext.form.SliderField', 'Ext.slider.SingleSlider', 'Ext.slider.Slider'],
+
+    
+    getValue: function() {
+        
+        return this.callParent([0]);
+    },
+
+    
+    setValue: function(value, animate) {
+        var args = Ext.toArray(arguments),
+            len  = args.length;
+
+        
+        
+        
+        if (len == 1 || (len <= 3 && typeof arguments[1] != 'number')) {
+            args.unshift(0);
+        }
+
+        return this.callParent(args);
+    },
+
+    
+    getNearest : function(){
+        
+        return this.thumbs[0];
+    }
+});
+
+
+Ext.define('Ext.tab.Tab', {
+    extend: 'Ext.button.Button',
+    alias: 'widget.tab',
+
+    requires: [
+        'Ext.layout.component.Tab',
+        'Ext.util.KeyNav'
+    ],
+
+    componentLayout: 'tab',
+
+    isTab: true,
+
+    baseCls: Ext.baseCSSPrefix + 'tab',
+
+    
+    activeCls: 'active',
+
+    
+
+    
+    closableCls: 'closable',
+
+    
+    closable: true,
+
+    
+    closeText: 'Close Tab',
+
+    
+    active: false,
+
+    
+
+    scale: false,
+
+    position: 'top',
+
+    initComponent: function() {
+        var me = this;
+
+        me.addEvents(
+            
+            'activate',
+
+            
+            'deactivate',
+
+            
+            'beforeclose',
+
+            
+            'close'
+        );
+
+        me.callParent(arguments);
+
+        if (me.card) {
+            me.setCard(me.card);
+        }
+    },
+
+    
+    onRender: function() {
+        var me = this,
+            tabBar = me.up('tabbar'),
+            tabPanel = me.up('tabpanel');
+
+        me.addClsWithUI(me.position);
+
+        
+        
+
+        me.syncClosableUI();
+
+        
+        if (!me.minWidth) {
+            me.minWidth = (tabBar) ? tabBar.minTabWidth : me.minWidth;
+            if (!me.minWidth && tabPanel) {
+                me.minWidth = tabPanel.minTabWidth;
+            }
+            if (me.minWidth && me.iconCls) {
+                me.minWidth += 25;
+            }
+        }
+        if (!me.maxWidth) {
+            me.maxWidth = (tabBar) ? tabBar.maxTabWidth : me.maxWidth;
+            if (!me.maxWidth && tabPanel) {
+                me.maxWidth = tabPanel.maxTabWidth;
+            }
+        }
+
+        me.callParent(arguments);
+
+        if (me.active) {
+            me.activate(true);
+        }
+
+        me.syncClosableElements();
+
+        me.keyNav = Ext.create('Ext.util.KeyNav', me.el, {
+            enter: me.onEnterKey,
+            del: me.onDeleteKey,
+            scope: me
+        });
+    },
+
+    
+    enable : function(silent) {
+        var me = this;
+
+        me.callParent(arguments);
+
+        me.removeClsWithUI(me.position + '-disabled');
+
+        return me;
+    },
+
+    
+    disable : function(silent) {
+        var me = this;
+
+        me.callParent(arguments);
+
+        me.addClsWithUI(me.position + '-disabled');
+
+        return me;
+    },
+
+    
+    onDestroy: function() {
+        var me = this;
+
+        if (me.closeEl) {
+            me.closeEl.un('click', Ext.EventManager.preventDefault);
+            me.closeEl = null;
+        }
+
+        Ext.destroy(me.keyNav);
+        delete me.keyNav;
+
+        me.callParent(arguments);
+    },
+
+    
+    setClosable: function(closable) {
+        var me = this;
+
+        
+        closable = (!arguments.length || !!closable);
+
+        if (me.closable != closable) {
+            me.closable = closable;
+
+            
+            if (me.card) {
+                me.card.closable = closable;
+            }
+
+            me.syncClosableUI();
+
+            if (me.rendered) {
+                me.syncClosableElements();
+
+                
+                me.doComponentLayout();
+                if (me.ownerCt) {
+                    me.ownerCt.doLayout();
+                }
+            }
+        }
+    },
+
+    
+    syncClosableElements: function () {
+        var me = this;
+
+        if (me.closable) {
+            if (!me.closeEl) {
+                me.closeEl = me.el.createChild({
+                    tag: 'a',
+                    cls: me.baseCls + '-close-btn',
+                    href: '#',
+                    
+                    title: me.closeText
+                }).on('click', Ext.EventManager.preventDefault);  
+            }
+        } else {
+            var closeEl = me.closeEl;
+            if (closeEl) {
+                closeEl.un('click', Ext.EventManager.preventDefault);
+                closeEl.remove();
+                me.closeEl = null;
+            }
+        }
+    },
+
+    
+    syncClosableUI: function () {
+        var me = this, classes = [me.closableCls, me.closableCls + '-' + me.position];
+
+        if (me.closable) {
+            me.addClsWithUI(classes);
+        } else {
+            me.removeClsWithUI(classes);
+        }
+    },
+
+    
+    setCard: function(card) {
+        var me = this;
+
+        me.card = card;
+        me.setText(me.title || card.title);
+        me.setIconCls(me.iconCls || card.iconCls);
+    },
+
+    
+    onCloseClick: function() {
+        var me = this;
+
+        if (me.fireEvent('beforeclose', me) !== false) {
+            if (me.tabBar) {
+                if (me.tabBar.closeTab(me) === false) {
+                    
+                    return;
+                }
+            } else {
+                
+                me.fireEvent('close', me);
+            }
+        }
+    },
+
+    
+    fireClose: function(){
+        this.fireEvent('close', this);
+    },
+
+    
+    onEnterKey: function(e) {
+        var me = this;
+
+        if (me.tabBar) {
+            me.tabBar.onClick(e, me.el);
+        }
+    },
+
+   
+    onDeleteKey: function(e) {
+        var me = this;
+
+        if (me.closable) {
+            me.onCloseClick();
+        }
+    },
+
+    
+    activate : function(supressEvent) {
+        var me = this;
+
+        me.active = true;
+        me.addClsWithUI([me.activeCls, me.position + '-' + me.activeCls]);
+
+        if (supressEvent !== true) {
+            me.fireEvent('activate', me);
+        }
+    },
+
+    
+    deactivate : function(supressEvent) {
+        var me = this;
+
+        me.active = false;
+        me.removeClsWithUI([me.activeCls, me.position + '-' + me.activeCls]);
+
+        if (supressEvent !== true) {
+            me.fireEvent('deactivate', me);
+        }
+    }
+});
+
+
+Ext.define('Ext.tab.Bar', {
+    extend: 'Ext.panel.Header',
+    alias: 'widget.tabbar',
+    baseCls: Ext.baseCSSPrefix + 'tab-bar',
+
+    requires: [
+        'Ext.tab.Tab',
+        'Ext.FocusManager'
+    ],
+
+    isTabBar: true,
+    
+    
+    
+    
+
+    
+    defaultType: 'tab',
+
+    
+    plain: false,
+
+    
+    renderTpl: [
+        '<div id="{id}-body" class="{baseCls}-body <tpl if="bodyCls"> {bodyCls}</tpl> <tpl if="ui"> {baseCls}-body-{ui}<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl></tpl>"<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>></div>',
+        '<div id="{id}-strip" class="{baseCls}-strip<tpl if="ui"> {baseCls}-strip-{ui}<tpl for="uiCls"> {parent.baseCls}-strip-{parent.ui}-{.}</tpl></tpl>"></div>'
+    ],
+
+    
+
+    
+
+    
+    initComponent: function() {
+        var me = this,
+            keys;
+
+        if (me.plain) {
+            me.setUI(me.ui + '-plain');
+        }
+
+        me.addClsWithUI(me.dock);
+
+        me.addEvents(
+            
+            'change'
+        );
+
+        me.addChildEls('body', 'strip');
+        me.callParent(arguments);
+
+        
+        me.layout.align = (me.orientation == 'vertical') ? 'left' : 'top';
+        me.layout.overflowHandler = Ext.create('Ext.layout.container.boxOverflow.Scroller', me.layout);
+
+        me.remove(me.titleCmp);
+        delete me.titleCmp;
+
+        
+        keys = me.orientation == 'vertical' ? ['up', 'down'] : ['left', 'right'];
+        Ext.FocusManager.subscribe(me, {
+            keys: keys
+        });
+
+        Ext.apply(me.renderData, {
+            bodyCls: me.bodyCls
+        });
+    },
+
+    
+    onAdd: function(tab) {
+        tab.position = this.dock;
+        this.callParent(arguments);
+    },
+    
+    onRemove: function(tab) {
+        var me = this;
+        
+        if (tab === me.previousTab) {
+            me.previousTab = null;
+        }
+        if (me.items.getCount() === 0) {
+            me.activeTab = null;
+        }
+        me.callParent(arguments);    
+    },
+
+    
+    afterRender: function() {
+        var me = this;
+
+        me.mon(me.el, {
+            scope: me,
+            click: me.onClick,
+            delegate: '.' + Ext.baseCSSPrefix + 'tab'
+        });
+        me.callParent(arguments);
+
+    },
+
+    afterComponentLayout : function() {
+        var me = this;
+
+        me.callParent(arguments);
+        me.strip.setWidth(me.el.getWidth());
+    },
+
+    
+    onClick: function(e, target) {
+        
+        var tab = Ext.getCmp(target.id),
+            tabPanel = this.tabPanel;
+
+        target = e.getTarget();
+
+        if (tab && tab.isDisabled && !tab.isDisabled()) {
+            if (tab.closable && target === tab.closeEl.dom) {
+                tab.onCloseClick();
+            } else {
+                if (tabPanel) {
+                    
+                    tabPanel.setActiveTab(tab.card);
+                } else {
+                    this.setActiveTab(tab);
+                }
+                tab.focus();
+            }
+        }
+    },
+
+    
+    closeTab: function(tab) {
+        var me = this,
+            card = tab.card,
+            tabPanel = me.tabPanel,
+            nextTab;
+
+        if (card && card.fireEvent('beforeclose', card) === false) {
+            return false;
+        }
+
+        if (tab.active && me.items.getCount() > 1) {
+            nextTab = me.previousTab || tab.next('tab') || me.items.first();
+            me.setActiveTab(nextTab);
+            if (tabPanel) {
+                tabPanel.setActiveTab(nextTab.card);
+            }
+        }
+        
+        tab.fireClose();
+        me.remove(tab);
+
+        if (tabPanel && card) {
+            card.fireEvent('close', card);
+            tabPanel.remove(card);
+        }
+
+        if (nextTab) {
+            nextTab.focus();
+        }
+    },
+
+    
+    setActiveTab: function(tab) {
+        if (tab.disabled) {
+            return;
+        }
+        var me = this;
+        if (me.activeTab) {
+            me.previousTab = me.activeTab;
+            me.activeTab.deactivate();
+        }
+        tab.activate();
+
+        if (me.rendered) {
+            me.layout.layout();
+            tab.el && tab.el.scrollIntoView(me.layout.getRenderTarget());
+        }
+        me.activeTab = tab;
+        me.fireEvent('change', me, tab, tab.card);
+    }
+});
+
+
+Ext.define('Ext.tab.Panel', {
+    extend: 'Ext.panel.Panel',
+    alias: 'widget.tabpanel',
+    alternateClassName: ['Ext.TabPanel'],
+
+    requires: ['Ext.layout.container.Card', 'Ext.tab.Bar'],
+
+    
+    tabPosition : 'top',
+
+    
+
+    
+
+    
+
+    
+
+    
+    removePanelHeader: true,
+
+    
+    plain: false,
+
+    
+    itemCls: 'x-tabpanel-child',
+
+    
+    minTabWidth: undefined,
+
+    
+    maxTabWidth: undefined,
+
+    
+    deferredRender : true,
+
+    
+    initComponent: function() {
+        var me = this,
+            dockedItems = me.dockedItems || [],
+            activeTab = me.activeTab || 0;
+
+        me.layout = Ext.create('Ext.layout.container.Card', Ext.apply({
+            owner: me,
+            deferredRender: me.deferredRender,
+            itemCls: me.itemCls
+        }, me.layout));
+
+        
+        me.tabBar = Ext.create('Ext.tab.Bar', Ext.apply({}, me.tabBar, {
+            dock: me.tabPosition,
+            plain: me.plain,
+            border: me.border,
+            cardLayout: me.layout,
+            tabPanel: me
+        }));
+
+        if (dockedItems && !Ext.isArray(dockedItems)) {
+            dockedItems = [dockedItems];
+        }
+
+        dockedItems.push(me.tabBar);
+        me.dockedItems = dockedItems;
+
+        me.addEvents(
+            
+            'beforetabchange',
+
+            
+            'tabchange'
+        );
+        me.callParent(arguments);
+
+        
+        me.setActiveTab(activeTab);
+        
+        me.on('afterlayout', me.afterInitialLayout, me, {single: true});
+    },
+
+    
+    afterInitialLayout: function() {
+        var me = this,
+            card = me.getComponent(me.activeTab);
+
+        if (card) {
+            me.layout.setActiveItem(card);
+        }
+    },
+
+    
+    setActiveTab: function(card) {
+        var me = this,
+            previous;
+
+        card = me.getComponent(card);
+        if (card) {
+            previous = me.getActiveTab();
+
+            if (previous && previous !== card && me.fireEvent('beforetabchange', me, card, previous) === false) {
+                return false;
+            }
+
+            me.tabBar.setActiveTab(card.tab);
+            me.activeTab = card;
+            if (me.rendered) {
+                me.layout.setActiveItem(card);
+            }
+
+            if (previous && previous !== card) {
+                me.fireEvent('tabchange', me, card, previous);
+            }
+        }
+    },
+
+    
+    getActiveTab: function() {
+        return this.activeTab;
+    },
+
+    
+    getTabBar: function() {
+        return this.tabBar;
+    },
+
+    
+    onAdd: function(item, index) {
+        var me = this,
+            cfg = item.tabConfig || {},
+            defaultConfig = {
+                xtype: 'tab',
+                card: item,
+                disabled: item.disabled,
+                closable: item.closable,
+                hidden: item.hidden,
+                tabBar: me.tabBar
+            };
+
+        if (item.closeText) {
+            defaultConfig.closeText = item.closeText;
+        }
+        cfg = Ext.applyIf(cfg, defaultConfig);
+        item.tab = me.tabBar.insert(index, cfg);
+
+        item.on({
+            scope : me,
+            enable: me.onItemEnable,
+            disable: me.onItemDisable,
+            beforeshow: me.onItemBeforeShow,
+            iconchange: me.onItemIconChange,
+            titlechange: me.onItemTitleChange
+        });
+
+        if (item.isPanel) {
+            if (me.removePanelHeader) {
+                item.preventHeader = true;
+                if (item.rendered) {
+                    item.updateHeader();
+                }
+            }
+            if (item.isPanel && me.border) {
+                item.setBorder(false);
+            }
+        }
+
+        
+        if (this.rendered && me.items.getCount() === 1) {
+            me.setActiveTab(0);
+        }
+    },
+
+    
+    onItemEnable: function(item){
+        item.tab.enable();
+    },
+
+    
+    onItemDisable: function(item){
+        item.tab.disable();
+    },
+
+    
+    onItemBeforeShow: function(item) {
+        if (item !== this.activeTab) {
+            this.setActiveTab(item);
+            return false;
+        }
+    },
+
+    
+    onItemIconChange: function(item, newIconCls) {
+        item.tab.setIconCls(newIconCls);
+        this.getTabBar().doLayout();
+    },
+
+    
+    onItemTitleChange: function(item, newTitle) {
+        item.tab.setText(newTitle);
+        this.getTabBar().doLayout();
+    },
+
+
+    
+    doRemove: function(item, autoDestroy) {
+        var me = this,
+            items = me.items,
+            
+            
+            
+            hasItemsLeft = items.getCount() > 1;
+
+        if (me.destroying || !hasItemsLeft) {
+            me.activeTab = null;
+        } else if (item === me.activeTab) {
+             me.setActiveTab(item.next() || items.getAt(0));
+        }
+        me.callParent(arguments);
+
+        
+        delete item.tab.card;
+        delete item.tab;
+    },
+
+    
+    onRemove: function(item, autoDestroy) {
+        var me = this;
+
+        item.un({
+            scope : me,
+            enable: me.onItemEnable,
+            disable: me.onItemDisable,
+            beforeshow: me.onItemBeforeShow
+        });
+        if (!me.destroying && item.tab.ownerCt == me.tabBar) {
+            me.tabBar.remove(item.tab);
+        }
+    }
+});
+
+
+Ext.define('Ext.toolbar.Spacer', {
+    extend: 'Ext.Component',
+    alias: 'widget.tbspacer',
+    alternateClassName: 'Ext.Toolbar.Spacer',
+    baseCls: Ext.baseCSSPrefix + 'toolbar-spacer',
+    focusable: false
+});
+
+Ext.define('Ext.tree.Column', {
+    extend: 'Ext.grid.column.Column',
+    alias: 'widget.treecolumn',
+
+    initComponent: function() {
+        var origRenderer = this.renderer || this.defaultRenderer,
+            origScope    = this.scope || window;
+
+        this.renderer = function(value, metaData, record, rowIdx, colIdx, store, view) {
+            var buf   = [],
+                format = Ext.String.format,
+                depth = record.getDepth(),
+                treePrefix  = Ext.baseCSSPrefix + 'tree-',
+                elbowPrefix = treePrefix + 'elbow-',
+                expanderCls = treePrefix + 'expander',
+                imgText     = '<img src="{1}" class="{0}" />',
+                checkboxText= '<input type="button" role="checkbox" class="{0}" {1} />',
+                formattedValue = origRenderer.apply(origScope, arguments),
+                href = record.get('href'),
+                target = record.get('hrefTarget'),
+                cls = record.get('cls');
+
+            while (record) {
+                if (!record.isRoot() || (record.isRoot() && view.rootVisible)) {
+                    if (record.getDepth() === depth) {
+                        buf.unshift(format(imgText,
+                            treePrefix + 'icon ' + 
+                            treePrefix + 'icon' + (record.get('icon') ? '-inline ' : (record.isLeaf() ? '-leaf ' : '-parent ')) +
+                            (record.get('iconCls') || ''),
+                            record.get('icon') || Ext.BLANK_IMAGE_URL
+                        ));
+                        if (record.get('checked') !== null) {
+                            buf.unshift(format(
+                                checkboxText,
+                                (treePrefix + 'checkbox') + (record.get('checked') ? ' ' + treePrefix + 'checkbox-checked' : ''),
+                                record.get('checked') ? 'aria-checked="true"' : ''
+                            ));
+                            if (record.get('checked')) {
+                                metaData.tdCls += (' ' + treePrefix + 'checked');
+                            }
+                        }
+                        if (record.isLast()) {
+                            if (record.isExpandable()) {
+                                buf.unshift(format(imgText, (elbowPrefix + 'end-plus ' + expanderCls), Ext.BLANK_IMAGE_URL));
+                            } else {
+                                buf.unshift(format(imgText, (elbowPrefix + 'end'), Ext.BLANK_IMAGE_URL));
+                            }
+                            
+                        } else {
+                            if (record.isExpandable()) {
+                                buf.unshift(format(imgText, (elbowPrefix + 'plus ' + expanderCls), Ext.BLANK_IMAGE_URL));
+                            } else {
+                                buf.unshift(format(imgText, (treePrefix + 'elbow'), Ext.BLANK_IMAGE_URL));
+                            }
+                        }
+                    } else {
+                        if (record.isLast() || record.getDepth() === 0) {
+                            buf.unshift(format(imgText, (elbowPrefix + 'empty'), Ext.BLANK_IMAGE_URL));
+                        } else if (record.getDepth() !== 0) {
+                            buf.unshift(format(imgText, (elbowPrefix + 'line'), Ext.BLANK_IMAGE_URL));
+                        }                      
+                    }
+                }
+                record = record.parentNode;
+            }
+            if (href) {
+                buf.push('<a href="', href, '" target="', target, '">', formattedValue, '</a>');
+            } else {
+                buf.push(formattedValue);
+            }
+            if (cls) {
+                metaData.tdCls += ' ' + cls;
+            }
+            return buf.join('');
+        };
+        this.callParent(arguments);
+    },
+
+    defaultRenderer: function(value) {
+        return value;
+    }
+});
+
+Ext.define('Ext.tree.View', {
+    extend: 'Ext.view.Table',
+    alias: 'widget.treeview',
+
+    loadingCls: Ext.baseCSSPrefix + 'grid-tree-loading',
+    expandedCls: Ext.baseCSSPrefix + 'grid-tree-node-expanded',
+
+    expanderSelector: '.' + Ext.baseCSSPrefix + 'tree-expander',
+    checkboxSelector: '.' + Ext.baseCSSPrefix + 'tree-checkbox',
+    expanderIconOverCls: Ext.baseCSSPrefix + 'tree-expander-over',
+
+    
+    
+    
+    nodeAnimWrapCls: Ext.baseCSSPrefix + 'tree-animator-wrap',
+
+    blockRefresh: true,
+
+    
+    rootVisible: true,
+
+    
+
+    expandDuration: 250,
+    collapseDuration: 250,
+    
+    toggleOnDblClick: true,
+
+    initComponent: function() {
+        var me = this;
+        
+        if (me.initialConfig.animate === undefined) {
+            me.animate = Ext.enableFx;
+        }
+        
+        me.store = Ext.create('Ext.data.NodeStore', {
+            recursive: true,
+            rootVisible: me.rootVisible,
+            listeners: {
+                beforeexpand: me.onBeforeExpand,
+                expand: me.onExpand,
+                beforecollapse: me.onBeforeCollapse,
+                collapse: me.onCollapse,
+                scope: me
+            }
+        });
+        
+        if (me.node) {
+            me.setRootNode(me.node);
+        }
+        me.animQueue = {};
+        me.callParent(arguments);
+    },
+
+    processUIEvent: function(e) {
+        
+        
+        
+        if (e.getTarget('.' + this.nodeAnimWrapCls, this.el)) {
+            return false;
+        }
+        return this.callParent(arguments);
+    },
+
+    onClear: function(){
+        this.store.removeAll();    
+    },
+
+    setRootNode: function(node) {
+        var me = this;        
+        me.store.setNode(node);
+        me.node = node;
+        if (!me.rootVisible) {
+            node.expand();
+        }
+    },
+    
+    onRender: function() {
+        var me = this,
+            el;
+
+        me.callParent(arguments);
+
+        el = me.el;
+        el.on({
+            scope: me,
+            delegate: me.expanderSelector,
+            mouseover: me.onExpanderMouseOver,
+            mouseout: me.onExpanderMouseOut
+        });
+        el.on({
+            scope: me,
+            delegate: me.checkboxSelector,
+            click: me.onCheckboxChange
+        });
+    },
+
+    onCheckboxChange: function(e, t) {
+        var me = this,
+            item = e.getTarget(me.getItemSelector(), me.getTargetEl());
+            
+        if (item) {
+            me.onCheckChange(me.getRecord(item));
+        }
+    },
+    
+    onCheckChange: function(record){
+        var checked = record.get('checked');
+        if (Ext.isBoolean(checked)) {
+            checked = !checked;
+            record.set('checked', checked);
+            this.fireEvent('checkchange', record, checked);
+        }
+    },
+
+    getChecked: function() {
+        var checked = [];
+        this.node.cascadeBy(function(rec){
+            if (rec.get('checked')) {
+                checked.push(rec);
+            }
+        });
+        return checked;
+    },
+    
+    isItemChecked: function(rec){
+        return rec.get('checked');
+    },
+
+    createAnimWrap: function(record, index) {
+        var thHtml = '',
+            headerCt = this.panel.headerCt,
+            headers = headerCt.getGridColumns(),
+            i = 0, len = headers.length, item,
+            node = this.getNode(record),
+            tmpEl, nodeEl;
+
+        for (; i < len; i++) {
+            item = headers[i];
+            thHtml += '<th style="width: ' + (item.hidden ? 0 : item.getDesiredWidth()) + 'px; height: 0px;"></th>';
+        }
+
+        nodeEl = Ext.get(node);        
+        tmpEl = nodeEl.insertSibling({
+            tag: 'tr',
+            html: [
+                '<td colspan="' + headerCt.getColumnCount() + '">',
+                    '<div class="' + this.nodeAnimWrapCls + '">',
+                        '<table class="' + Ext.baseCSSPrefix + 'grid-table" style="width: ' + headerCt.getFullWidth() + 'px;"><tbody>',
+                            thHtml,
+                        '</tbody></table>',
+                    '</div>',
+                '</td>'
+            ].join('')
+        }, 'after');
+
+        return {
+            record: record,
+            node: node,
+            el: tmpEl,
+            expanding: false,
+            collapsing: false,
+            animating: false,
+            animateEl: tmpEl.down('div'),
+            targetEl: tmpEl.down('tbody')
+        };
+    },
+
+    getAnimWrap: function(parent) {
+        if (!this.animate) {
+            return null;
+        }
+
+        
+        while (parent) {
+            if (parent.animWrap) {
+                return parent.animWrap;
+            }
+            parent = parent.parentNode;
+        }
+        return null;
+    },
+
+    doAdd: function(nodes, records, index) {
+        
+        
+        var me = this,
+            record = records[0],
+            parent = record.parentNode,
+            a = me.all.elements,
+            relativeIndex = 0,
+            animWrap = me.getAnimWrap(parent),
+            targetEl, children, len;
+
+        if (!animWrap || !animWrap.expanding) {
+            me.resetScrollers();
+            return me.callParent(arguments);
+        }
+
+        
+        parent = animWrap.record;
+        
+        
+        targetEl = animWrap.targetEl;
+        children = targetEl.dom.childNodes;
+        
+        
+        len = children.length - 1;
+        
+        
+        relativeIndex = index - me.indexOf(parent) - 1;
+        
+        
+        
+        if (!len || relativeIndex >= len) {
+            targetEl.appendChild(nodes);
+        }
+        
+        
+        else {
+            
+            Ext.fly(children[relativeIndex + 1]).insertSibling(nodes, 'before', true);
+        }
+
+        
+        Ext.Array.insert(a, index, nodes);
+        
+        
+        
+        if (animWrap.isAnimating) {
+            me.onExpand(parent);
+        }
+    },
+    
+    beginBulkUpdate: function(){
+        this.bulkUpdate = true;
+        this.ownerCt.changingScrollbars = true;  
+    },
+    
+    endBulkUpdate: function(){
+        var me = this,
+            ownerCt = me.ownerCt;
+        
+        me.bulkUpdate = false;
+        me.ownerCt.changingScrollbars = true;  
+        me.resetScrollers();  
+    },
+    
+    onRemove : function(ds, record, index) {
+        var me = this,
+            bulk = me.bulkUpdate;
+
+        me.doRemove(record, index);
+        if (!bulk) {
+            me.updateIndexes(index);
+        }
+        if (me.store.getCount() === 0){
+            me.refresh();
+        }
+        if (!bulk) {
+            me.fireEvent('itemremove', record, index);
+        }
+    },
+    
+    doRemove: function(record, index) {
+        
+        
+        var me = this,
+            parent = record.parentNode,
+            all = me.all,
+            animWrap = me.getAnimWrap(record),
+            node = all.item(index).dom;
+
+        if (!animWrap || !animWrap.collapsing) {
+            me.resetScrollers();
+            return me.callParent(arguments);
+        }
+
+        animWrap.targetEl.appendChild(node);
+        all.removeElement(index);
+    },
+
+    onBeforeExpand: function(parent, records, index) {
+        var me = this,
+            animWrap;
+            
+        if (!me.rendered || !me.animate) {
+            return;
+        }
+
+        if (me.getNode(parent)) {
+            animWrap = me.getAnimWrap(parent);
+            if (!animWrap) {
+                animWrap = parent.animWrap = me.createAnimWrap(parent);
+                animWrap.animateEl.setHeight(0);
+            }
+            else if (animWrap.collapsing) {
+                
+                
+                animWrap.targetEl.select(me.itemSelector).remove();
+            } 
+            animWrap.expanding = true;
+            animWrap.collapsing = false;
+        }
+    },
+
+    onExpand: function(parent) {
+        var me = this,
+            queue = me.animQueue,
+            id = parent.getId(),
+            animWrap,
+            animateEl, 
+            targetEl,
+            queueItem;        
+        
+        if (me.singleExpand) {
+            me.ensureSingleExpand(parent);
+        }
+        
+        animWrap = me.getAnimWrap(parent);
+
+        if (!animWrap) {
+            me.resetScrollers();
+            return;
+        }
+        
+        animateEl = animWrap.animateEl;
+        targetEl = animWrap.targetEl;
+
+        animateEl.stopAnimation();
+        
+        queue[id] = true;
+        animateEl.slideIn('t', {
+            duration: me.expandDuration,
+            listeners: {
+                scope: me,
+                lastframe: function() {
+                    
+                    animWrap.el.insertSibling(targetEl.query(me.itemSelector), 'before');
+                    animWrap.el.remove();
+                    me.resetScrollers();
+                    delete animWrap.record.animWrap;
+                    delete queue[id];
+                }
+            }
+        });
+        
+        animWrap.isAnimating = true;
+    },
+    
+    resetScrollers: function(){
+        if (!this.bulkUpdate) {
+            var panel = this.panel;
+            
+            panel.determineScrollbars();
+            panel.invalidateScroller();
+        }
+    },
+
+    onBeforeCollapse: function(parent, records, index) {
+        var me = this,
+            animWrap;
+            
+        if (!me.rendered || !me.animate) {
+            return;
+        }
+
+        if (me.getNode(parent)) {
+            animWrap = me.getAnimWrap(parent);
+            if (!animWrap) {
+                animWrap = parent.animWrap = me.createAnimWrap(parent, index);
+            }
+            else if (animWrap.expanding) {
+                
+                
+                animWrap.targetEl.select(this.itemSelector).remove();
+            }
+            animWrap.expanding = false;
+            animWrap.collapsing = true;
+        }
+    },
+    
+    onCollapse: function(parent) {
+        var me = this,
+            queue = me.animQueue,
+            id = parent.getId(),
+            animWrap = me.getAnimWrap(parent),
+            animateEl, targetEl;
+
+        if (!animWrap) {
+            me.resetScrollers();
+            return;
+        }
+        
+        animateEl = animWrap.animateEl;
+        targetEl = animWrap.targetEl;
+
+        queue[id] = true;
+        
+        
+        animateEl.stopAnimation();
+        animateEl.slideOut('t', {
+            duration: me.collapseDuration,
+            listeners: {
+                scope: me,
+                lastframe: function() {
+                    animWrap.el.remove();
+                    delete animWrap.record.animWrap;
+                    me.resetScrollers();
+                    delete queue[id];
+                }             
+            }
+        });
+        animWrap.isAnimating = true;
+    },
+    
+    
+    isAnimating: function(node) {
+        return !!this.animQueue[node.getId()];    
+    },
+    
+    collectData: function(records) {
+        var data = this.callParent(arguments),
+            rows = data.rows,
+            len = rows.length,
+            i = 0,
+            row, record;
+            
+        for (; i < len; i++) {
+            row = rows[i];
+            record = records[i];
+            if (record.get('qtip')) {
+                row.rowAttr = 'data-qtip="' + record.get('qtip') + '"';
+                if (record.get('qtitle')) {
+                    row.rowAttr += ' ' + 'data-qtitle="' + record.get('qtitle') + '"';
+                }
+            }
+            if (record.isExpanded()) {
+                row.rowCls = (row.rowCls || '') + ' ' + this.expandedCls;
+            }
+            if (record.isLoading()) {
+                row.rowCls = (row.rowCls || '') + ' ' + this.loadingCls;
+            }
+        }
+        
+        return data;
+    },
+    
+    
+    expand: function(record, deep, callback, scope) {
+        return record.expand(deep, callback, scope);
+    },
+    
+    
+    collapse: function(record, deep, callback, scope) {
+        return record.collapse(deep, callback, scope);
+    },
+    
+    
+    toggle: function(record) {
+        this[record.isExpanded() ? 'collapse' : 'expand'](record);
+    },
+    
+    onItemDblClick: function(record, item, index) {
+        this.callParent(arguments);
+        if (this.toggleOnDblClick) {
+            this.toggle(record);
+        }
+    },
+    
+    onBeforeItemMouseDown: function(record, item, index, e) {
+        if (e.getTarget(this.expanderSelector, item)) {
+            return false;
+        }
+        return this.callParent(arguments);
+    },
+    
+    onItemClick: function(record, item, index, e) {
+        if (e.getTarget(this.expanderSelector, item)) {
+            this.toggle(record);
+            return false;
+        }
+        return this.callParent(arguments);
+    },
+    
+    onExpanderMouseOver: function(e, t) {
+        e.getTarget(this.cellSelector, 10, true).addCls(this.expanderIconOverCls);
+    },
+    
+    onExpanderMouseOut: function(e, t) {
+        e.getTarget(this.cellSelector, 10, true).removeCls(this.expanderIconOverCls);
+    },
+    
+    
+    getTreeStore: function() {
+        return this.panel.store;
+    },    
+    
+    ensureSingleExpand: function(node) {
+        var parent = node.parentNode;
+        if (parent) {
+            parent.eachChild(function(child) {
+                if (child !== node && child.isExpanded()) {
+                    child.collapse();
+                }
+            });
+        }
+    }
+});
+
+Ext.define('Ext.tree.Panel', {
+    extend: 'Ext.panel.Table',
+    alias: 'widget.treepanel',
+    alternateClassName: ['Ext.tree.TreePanel', 'Ext.TreePanel'],
+    requires: ['Ext.tree.View', 'Ext.selection.TreeModel', 'Ext.tree.Column'],
+    viewType: 'treeview',
+    selType: 'treemodel',
+
+    treeCls: Ext.baseCSSPrefix + 'tree-panel',
+
+    deferRowRender: false,
+
+    
+    lines: true,
+
+    
+    useArrows: false,
+
+    
+    singleExpand: false,
+
+    ddConfig: {
+        enableDrag: true,
+        enableDrop: true
+    },
+
+    
+
+    
+    rootVisible: true,
+
+    
+    displayField: 'text',
+
+    
+    root: null,
+
+    
+    
+    normalCfgCopy: ['displayField', 'root', 'singleExpand', 'useArrows', 'lines', 'rootVisible', 'scroll'],
+    lockedCfgCopy: ['displayField', 'root', 'singleExpand', 'useArrows', 'lines', 'rootVisible'],
+
+    
+
+    
+
+    constructor: function(config) {
+        config = config || {};
+        if (config.animate === undefined) {
+            config.animate = Ext.enableFx;
+        }
+        this.enableAnimations = config.animate;
+        delete config.animate;
+
+        this.callParent([config]);
+    },
+
+    initComponent: function() {
+        var me = this,
+            cls = [me.treeCls];
+
+        if (me.useArrows) {
+            cls.push(Ext.baseCSSPrefix + 'tree-arrows');
+            me.lines = false;
+        }
+
+        if (me.lines) {
+            cls.push(Ext.baseCSSPrefix + 'tree-lines');
+        } else if (!me.useArrows) {
+            cls.push(Ext.baseCSSPrefix + 'tree-no-lines');
+        }
+
+        if (Ext.isString(me.store)) {
+            me.store = Ext.StoreMgr.lookup(me.store);
+        } else if (!me.store || Ext.isObject(me.store) && !me.store.isStore) {
+            me.store = Ext.create('Ext.data.TreeStore', Ext.apply({}, me.store || {}, {
+                root: me.root,
+                fields: me.fields,
+                model: me.model,
+                folderSort: me.folderSort
+            }));
+        } else if (me.root) {
+            me.store = Ext.data.StoreManager.lookup(me.store);
+            me.store.setRootNode(me.root);
+            if (me.folderSort !== undefined) {
+                me.store.folderSort = me.folderSort;
+                me.store.sort();
+            }
+        }
+
+        
+        
+        
+        
+
+        me.viewConfig = Ext.applyIf(me.viewConfig || {}, {
+            rootVisible: me.rootVisible,
+            animate: me.enableAnimations,
+            singleExpand: me.singleExpand,
+            node: me.store.getRootNode(),
+            hideHeaders: me.hideHeaders
+        });
+
+        me.mon(me.store, {
+            scope: me,
+            rootchange: me.onRootChange,
+            clear: me.onClear
+        });
+
+        me.relayEvents(me.store, [
+            
+            'beforeload',
+
+            
+            'load'
+        ]);
+
+        me.store.on({
+            
+            append: me.createRelayer('itemappend'),
+
+            
+            remove: me.createRelayer('itemremove'),
+
+            
+            move: me.createRelayer('itemmove'),
+
+            
+            insert: me.createRelayer('iteminsert'),
+
+            
+            beforeappend: me.createRelayer('beforeitemappend'),
+
+            
+            beforeremove: me.createRelayer('beforeitemremove'),
+
+            
+            beforemove: me.createRelayer('beforeitemmove'),
+
+            
+            beforeinsert: me.createRelayer('beforeiteminsert'),
+
+            
+            expand: me.createRelayer('itemexpand'),
+
+            
+            collapse: me.createRelayer('itemcollapse'),
+
+            
+            beforeexpand: me.createRelayer('beforeitemexpand'),
+
+            
+            beforecollapse: me.createRelayer('beforeitemcollapse')
+        });
+
+        
+        if (!me.columns) {
+            if (me.initialConfig.hideHeaders === undefined) {
+                me.hideHeaders = true;
+            }
+            me.columns = [{
+                xtype    : 'treecolumn',
+                text     : 'Name',
+                flex     : 1,
+                dataIndex: me.displayField
+            }];
+        }
+
+        if (me.cls) {
+            cls.push(me.cls);
+        }
+        me.cls = cls.join(' ');
+        me.callParent();
+
+        me.relayEvents(me.getView(), [
+            
+            'checkchange'
+        ]);
+
+        
+        if (!me.getView().rootVisible && !me.getRootNode()) {
+            me.setRootNode({
+                expanded: true
+            });
+        }
+    },
+
+    onClear: function(){
+        this.view.onClear();
+    },
+
+    
+    setRootNode: function() {
+        return this.store.setRootNode.apply(this.store, arguments);
+    },
+
+    
+    getRootNode: function() {
+        return this.store.getRootNode();
+    },
+
+    onRootChange: function(root) {
+        this.view.setRootNode(root);
+    },
+
+    
+    getChecked: function() {
+        return this.getView().getChecked();
+    },
+
+    isItemChecked: function(rec) {
+        return rec.get('checked');
+    },
+
+    
+    expandAll : function(callback, scope) {
+        var root = this.getRootNode(),
+            animate = this.enableAnimations,
+            view = this.getView();
+        if (root) {
+            if (!animate) {
+                view.beginBulkUpdate();
+            }
+            root.expand(true, callback, scope);
+            if (!animate) {
+                view.endBulkUpdate();
+            }
+        }
+    },
+
+    
+    collapseAll : function(callback, scope) {
+        var root = this.getRootNode(),
+            animate = this.enableAnimations,
+            view = this.getView();
+
+        if (root) {
+            if (!animate) {
+                view.beginBulkUpdate();
+            }
+            if (view.rootVisible) {
+                root.collapse(true, callback, scope);
+            } else {
+                root.collapseChildren(true, callback, scope);
+            }
+            if (!animate) {
+                view.endBulkUpdate();
+            }
+        }
+    },
+
+    
+    expandPath: function(path, field, separator, callback, scope) {
+        var me = this,
+            current = me.getRootNode(),
+            index = 1,
+            view = me.getView(),
+            keys,
+            expander;
+
+        field = field || me.getRootNode().idProperty;
+        separator = separator || '/';
+
+        if (Ext.isEmpty(path)) {
+            Ext.callback(callback, scope || me, [false, null]);
+            return;
+        }
+
+        keys = path.split(separator);
+        if (current.get(field) != keys[1]) {
+            
+            Ext.callback(callback, scope || me, [false, current]);
+            return;
+        }
+
+        expander = function(){
+            if (++index === keys.length) {
+                Ext.callback(callback, scope || me, [true, current]);
+                return;
+            }
+            var node = current.findChild(field, keys[index]);
+            if (!node) {
+                Ext.callback(callback, scope || me, [false, current]);
+                return;
+            }
+            current = node;
+            current.expand(false, expander);
+        };
+        current.expand(false, expander);
+    },
+
+    
+    selectPath: function(path, field, separator, callback, scope) {
+        var me = this,
+            keys,
+            last;
+
+        field = field || me.getRootNode().idProperty;
+        separator = separator || '/';
+
+        keys = path.split(separator);
+        last = keys.pop();
+
+        me.expandPath(keys.join(separator), field, separator, function(success, node){
+            var doSuccess = false;
+            if (success && node) {
+                node = node.findChild(field, last);
+                if (node) {
+                    me.getSelectionModel().select(node);
+                    Ext.callback(callback, scope || me, [true, node]);
+                    doSuccess = true;
+                }
+            } else if (node === me.getRootNode()) {
+                doSuccess = true;
+            }
+            Ext.callback(callback, scope || me, [doSuccess, node]);
+        }, me);
+    }
+});
+
+
+Ext.define('Ext.view.DragZone', {
+    extend: 'Ext.dd.DragZone',
+    containerScroll: false,
+
+    constructor: function(config) {
+        var me = this;
+
+        Ext.apply(me, config);
+
+        
+        
+        
+        
+        
+        if (!me.ddGroup) {
+            me.ddGroup = 'view-dd-zone-' + me.view.id;
+        }
+
+        
+        
+        
+        
+        
+        
+        
+        me.callParent([me.view.el.dom.parentNode]);
+
+        me.ddel = Ext.get(document.createElement('div'));
+        me.ddel.addCls(Ext.baseCSSPrefix + 'grid-dd-wrap');
+    },
+
+    init: function(id, sGroup, config) {
+        this.initTarget(id, sGroup, config);
+        this.view.mon(this.view, {
+            itemmousedown: this.onItemMouseDown,
+            scope: this
+        });
+    },
+
+    onItemMouseDown: function(view, record, item, index, e) {
+        if (!this.isPreventDrag(e, record, item, index)) {
+            this.handleMouseDown(e);
+
+            
+            
+            if (view.getSelectionModel().selectionMode == 'MULTI' && !e.ctrlKey && view.getSelectionModel().isSelected(record)) {
+                return false;
+            }
+        }
+    },
+
+    
+    isPreventDrag: function(e) {
+        return false;
+    },
+
+    getDragData: function(e) {
+        var view = this.view,
+            item = e.getTarget(view.getItemSelector()),
+            record, selectionModel, records;
+
+        if (item) {
+            record = view.getRecord(item);
+            selectionModel = view.getSelectionModel();
+            records = selectionModel.getSelection();
+            return {
+                copy: this.view.copy || (this.view.allowCopy && e.ctrlKey),
+                event: new Ext.EventObjectImpl(e),
+                view: view,
+                ddel: this.ddel,
+                item: item,
+                records: records,
+                fromPosition: Ext.fly(item).getXY()
+            };
+        }
+    },
+
+    onInitDrag: function(x, y) {
+        var me = this,
+            data = me.dragData,
+            view = data.view,
+            selectionModel = view.getSelectionModel(),
+            record = view.getRecord(data.item),
+            e = data.event;
+
+        
+        
+        if (!selectionModel.isSelected(record) || e.hasModifier()) {
+            selectionModel.selectWithEvent(record, e, true);
+        }
+        data.records = selectionModel.getSelection();
+
+        me.ddel.update(me.getDragText());
+        me.proxy.update(me.ddel.dom);
+        me.onStartDrag(x, y);
+        return true;
+    },
+
+    getDragText: function() {
+        var count = this.dragData.records.length;
+        return Ext.String.format(this.dragText, count, count == 1 ? '' : 's');
+    },
+
+    getRepairXY : function(e, data){
+        return data ? data.fromPosition : false;
+    }
+});
+Ext.define('Ext.tree.ViewDragZone', {
+    extend: 'Ext.view.DragZone',
+
+    isPreventDrag: function(e, record) {
+        return (record.get('allowDrag') === false) || !!e.getTarget(this.view.expanderSelector);
+    },
+    
+    afterRepair: function() {
+        var me = this,
+            view = me.view,
+            selectedRowCls = view.selectedItemCls,
+            records = me.dragData.records,
+            fly = Ext.fly;
+        
+        if (Ext.enableFx && me.repairHighlight) {
+            
+            Ext.Array.forEach(records, function(record) {
+                
+                
+                var item = view.getNode(record);
+                
+                
+                
+                fly(item.firstChild).highlight(me.repairHighlightColor, {
+                    listeners: {
+                        beforeanimate: function() {
+                            if (view.isSelected(item)) {
+                                fly(item).removeCls(selectedRowCls);
+                            }
+                        },
+                        afteranimate: function() {
+                            if (view.isSelected(item)) {
+                                fly(item).addCls(selectedRowCls);
+                            }
+                        }
+                    }
+                });
+            });
+        }
+        me.dragging = false;
+    }
+});
+
+Ext.define('Ext.tree.ViewDropZone', {
+    extend: 'Ext.view.DropZone',
+
+    
+    allowParentInserts: false,
+ 
+    
+    allowContainerDrops: false,
+
+    
+    appendOnly: false,
+
+    
+    expandDelay : 500,
+
+    indicatorCls: 'x-tree-ddindicator',
+
+    
+    expandNode : function(node) {
+        var view = this.view;
+        if (!node.isLeaf() && !node.isExpanded()) {
+            view.expand(node);
+            this.expandProcId = false;
+        }
+    },
+
+    
+    queueExpand : function(node) {
+        this.expandProcId = Ext.Function.defer(this.expandNode, this.expandDelay, this, [node]);
+    },
+
+    
+    cancelExpand : function() {
+        if (this.expandProcId) {
+            clearTimeout(this.expandProcId);
+            this.expandProcId = false;
+        }
+    },
+
+    getPosition: function(e, node) {
+        var view = this.view,
+            record = view.getRecord(node),
+            y = e.getPageY(),
+            noAppend = record.isLeaf(),
+            noBelow = false,
+            region = Ext.fly(node).getRegion(),
+            fragment;
+
+        
+        if (record.isRoot()) {
+            return 'append';
+        }
+
+        
+        if (this.appendOnly) {
+            return noAppend ? false : 'append';
+        }
+
+        if (!this.allowParentInsert) {
+            noBelow = record.hasChildNodes() && record.isExpanded();
+        }
+
+        fragment = (region.bottom - region.top) / (noAppend ? 2 : 3);
+        if (y >= region.top && y < (region.top + fragment)) {
+            return 'before';
+        }
+        else if (!noBelow && (noAppend || (y >= (region.bottom - fragment) && y <= region.bottom))) {
+            return 'after';
+        }
+        else {
+            return 'append';
+        }
+    },
+
+    isValidDropPoint : function(node, position, dragZone, e, data) {
+        if (!node || !data.item) {
+            return false;
+        }
+
+        var view = this.view,
+            targetNode = view.getRecord(node),
+            draggedRecords = data.records,
+            dataLength = draggedRecords.length,
+            ln = draggedRecords.length,
+            i, record;
+
+        
+        if (!(targetNode && position && dataLength)) {
+            return false;
+        }
+
+        
+        for (i = 0; i < ln; i++) {
+            record = draggedRecords[i];
+            if (record.isNode && record.contains(targetNode)) {
+                return false;
+            }
+        }
+        
+        
+        if (position === 'append' && targetNode.get('allowDrop') === false) {
+            return false;
+        }
+        else if (position != 'append' && targetNode.parentNode.get('allowDrop') === false) {
+            return false;
+        }
+
+        
+        if (Ext.Array.contains(draggedRecords, targetNode)) {
+             return false;
+        }
+
+        
+        
+        return true;
+    },
+
+    onNodeOver : function(node, dragZone, e, data) {
+        var position = this.getPosition(e, node),
+            returnCls = this.dropNotAllowed,
+            view = this.view,
+            targetNode = view.getRecord(node),
+            indicator = this.getIndicator(),
+            indicatorX = 0,
+            indicatorY = 0;
+
+        
+        this.cancelExpand();
+        if (position == 'append' && !this.expandProcId && !Ext.Array.contains(data.records, targetNode) && !targetNode.isLeaf() && !targetNode.isExpanded()) {
+            this.queueExpand(targetNode);
+        }
+            
+            
+        if (this.isValidDropPoint(node, position, dragZone, e, data)) {
+            this.valid = true;
+            this.currentPosition = position;
+            this.overRecord = targetNode;
+
+            indicator.setWidth(Ext.fly(node).getWidth());
+            indicatorY = Ext.fly(node).getY() - Ext.fly(view.el).getY() - 1;
+
+            
+            if (position == 'before') {
+                returnCls = targetNode.isFirst() ? Ext.baseCSSPrefix + 'tree-drop-ok-above' : Ext.baseCSSPrefix + 'tree-drop-ok-between';
+                indicator.showAt(0, indicatorY);
+                dragZone.proxy.show();
+            } else if (position == 'after') {
+                returnCls = targetNode.isLast() ? Ext.baseCSSPrefix + 'tree-drop-ok-below' : Ext.baseCSSPrefix + 'tree-drop-ok-between';
+                indicatorY += Ext.fly(node).getHeight();
+                indicator.showAt(0, indicatorY);
+                dragZone.proxy.show();
+            } else {
+                returnCls = Ext.baseCSSPrefix + 'tree-drop-ok-append';
+                
+                indicator.hide();
+            }
+        } else {
+            this.valid = false;
+        }
+
+        this.currentCls = returnCls;
+        return returnCls;
+    },
+
+    onContainerOver : function(dd, e, data) {
+        return e.getTarget('.' + this.indicatorCls) ? this.currentCls : this.dropNotAllowed;
+    },
+    
+    notifyOut: function() {
+        this.callParent(arguments);
+        this.cancelExpand();
+    },
+
+    handleNodeDrop : function(data, targetNode, position) {
+        var me = this,
+            view = me.view,
+            parentNode = targetNode.parentNode,
+            store = view.getStore(),
+            recordDomNodes = [],
+            records, i, len,
+            insertionMethod, argList,
+            needTargetExpand,
+            transferData,
+            processDrop;
+
+        
+        if (data.copy) {
+            records = data.records;
+            data.records = [];
+            for (i = 0, len = records.length; i < len; i++) {
+                data.records.push(Ext.apply({}, records[i].data));
+            }
+        }
+
+        
+        me.cancelExpand();
+
+        
+        
+        
+        
+        if (position == 'before') {
+            insertionMethod = parentNode.insertBefore;
+            argList = [null, targetNode];
+            targetNode = parentNode;
+        }
+        else if (position == 'after') {
+            if (targetNode.nextSibling) {
+                insertionMethod = parentNode.insertBefore;
+                argList = [null, targetNode.nextSibling];
+            }
+            else {
+                insertionMethod = parentNode.appendChild;
+                argList = [null];
+            }
+            targetNode = parentNode;
+        }
+        else {
+            if (!targetNode.isExpanded()) {
+                needTargetExpand = true;
+            }
+            insertionMethod = targetNode.appendChild;
+            argList = [null];
+        }
+
+        
+        transferData = function() {
+            var node;
+            for (i = 0, len = data.records.length; i < len; i++) {
+                argList[0] = data.records[i];
+                node = insertionMethod.apply(targetNode, argList);
+                
+                if (Ext.enableFx && me.dropHighlight) {
+                    recordDomNodes.push(view.getNode(node));
+                }
+            }
+            
+            
+            
+            if (Ext.enableFx && me.dropHighlight) {
+                
+                
+                Ext.Array.forEach(recordDomNodes, function(n) {
+                    if (n) {
+                        Ext.fly(n.firstChild ? n.firstChild : n).highlight(me.dropHighlightColor);
+                    }
+                });
+            }
+        };
+
+        
+        if (needTargetExpand) {
+            targetNode.expand(false, transferData);
+        }
+        
+        else {
+            transferData();
+        }
+    }
+});
+
+Ext.define('Ext.tree.plugin.TreeViewDragDrop', {
+    extend: 'Ext.AbstractPlugin',
+    alias: 'plugin.treeviewdragdrop',
+
+    uses: [
+        'Ext.tree.ViewDragZone',
+        'Ext.tree.ViewDropZone'
+    ],
+
+    
+
+    
+
+    dragText : '{0} selected node{1}',
+
+    
+    allowParentInserts: false,
+
+    
+    allowContainerDrops: false,
+
+    
+    appendOnly: false,
+
+    
+    ddGroup : "TreeDD",
+
+    
+
+    
+
+    
+    expandDelay : 1000,
+
+    
+    enableDrop: true,
+
+    
+    enableDrag: true,
+
+    
+    nodeHighlightColor: 'c3daf9',
+
+    
+    nodeHighlightOnDrop: Ext.enableFx,
+
+    
+    nodeHighlightOnRepair: Ext.enableFx,
+
+    init : function(view) {
+        view.on('render', this.onViewRender, this, {single: true});
+    },
+
+    
+    destroy: function() {
+        Ext.destroy(this.dragZone, this.dropZone);
+    },
+
+    onViewRender : function(view) {
+        var me = this;
+
+        if (me.enableDrag) {
+            me.dragZone = Ext.create('Ext.tree.ViewDragZone', {
+                view: view,
+                ddGroup: me.dragGroup || me.ddGroup,
+                dragText: me.dragText,
+                repairHighlightColor: me.nodeHighlightColor,
+                repairHighlight: me.nodeHighlightOnRepair
+            });
+        }
+
+        if (me.enableDrop) {
+            me.dropZone = Ext.create('Ext.tree.ViewDropZone', {
+                view: view,
+                ddGroup: me.dropGroup || me.ddGroup,
+                allowContainerDrops: me.allowContainerDrops,
+                appendOnly: me.appendOnly,
+                allowParentInserts: me.allowParentInserts,
+                expandDelay: me.expandDelay,
+                dropHighlightColor: me.nodeHighlightColor,
+                dropHighlight: me.nodeHighlightOnDrop
+            });
+        }
+    }
+});
+
+Ext.define('Ext.util.Cookies', {
+    singleton: true,
+    
+    
+    set : function(name, value){
+        var argv = arguments,
+            argc = arguments.length,
+            expires = (argc > 2) ? argv[2] : null,
+            path = (argc > 3) ? argv[3] : '/',
+            domain = (argc > 4) ? argv[4] : null,
+            secure = (argc > 5) ? argv[5] : false;
+            
+        document.cookie = name + "=" + escape(value) + ((expires === null) ? "" : ("; expires=" + expires.toGMTString())) + ((path === null) ? "" : ("; path=" + path)) + ((domain === null) ? "" : ("; domain=" + domain)) + ((secure === true) ? "; secure" : "");
+    },
+
+    
+    get : function(name){
+        var arg = name + "=",
+            alen = arg.length,
+            clen = document.cookie.length,
+            i = 0,
+            j = 0;
+            
+        while(i < clen){
+            j = i + alen;
+            if(document.cookie.substring(i, j) == arg){
+                return this.getCookieVal(j);
+            }
+            i = document.cookie.indexOf(" ", i) + 1;
+            if(i === 0){
+                break;
+            }
+        }
+        return null;
+    },
+
+    
+    clear : function(name, path){
+        if(this.get(name)){
+            path = path || '/';
+            document.cookie = name + '=' + '; expires=Thu, 01-Jan-70 00:00:01 GMT; path=' + path;
+        }
+    },
+    
+    
+    getCookieVal : function(offset){
+        var endstr = document.cookie.indexOf(";", offset);
+        if(endstr == -1){
+            endstr = document.cookie.length;
+        }
+        return unescape(document.cookie.substring(offset, endstr));
+    }
+});
+
+
+Ext.define('Ext.util.CSS', function() {
+    var rules = null;
+    var doc = document;
+
+    var camelRe = /(-[a-z])/gi;
+    var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
+
+    return {
+
+        singleton: true,
+
+        constructor: function() {
+            this.rules = {};
+            this.initialized = false;
+        },
+
+        
+        createStyleSheet : function(cssText, id) {
+            var ss,
+                head = doc.getElementsByTagName("head")[0],
+                styleEl = doc.createElement("style");
+
+            styleEl.setAttribute("type", "text/css");
+            if (id) {
+               styleEl.setAttribute("id", id);
+            }
+
+            if (Ext.isIE) {
+               head.appendChild(styleEl);
+               ss = styleEl.styleSheet;
+               ss.cssText = cssText;
+            } else {
+                try{
+                    styleEl.appendChild(doc.createTextNode(cssText));
+                } catch(e) {
+                   styleEl.cssText = cssText;
+                }
+                head.appendChild(styleEl);
+                ss = styleEl.styleSheet ? styleEl.styleSheet : (styleEl.sheet || doc.styleSheets[doc.styleSheets.length-1]);
+            }
+            this.cacheStyleSheet(ss);
+            return ss;
+        },
+
+        
+        removeStyleSheet : function(id) {
+            var existing = document.getElementById(id);
+            if (existing) {
+                existing.parentNode.removeChild(existing);
+            }
+        },
+
+        
+        swapStyleSheet : function(id, url) {
+            var doc = document;
+            this.removeStyleSheet(id);
+            var ss = doc.createElement("link");
+            ss.setAttribute("rel", "stylesheet");
+            ss.setAttribute("type", "text/css");
+            ss.setAttribute("id", id);
+            ss.setAttribute("href", url);
+            doc.getElementsByTagName("head")[0].appendChild(ss);
+        },
+
+        
+        refreshCache : function() {
+            return this.getRules(true);
+        },
+
+        
+        cacheStyleSheet : function(ss) {
+            if(!rules){
+                rules = {};
+            }
+            try {
+                var ssRules = ss.cssRules || ss.rules,
+                    selectorText,
+                    i = ssRules.length - 1,
+                    j,
+                    selectors;
+
+                for (; i >= 0; --i) {
+                    selectorText = ssRules[i].selectorText;
+                    if (selectorText) {
+
+                        
+                        selectorText = selectorText.split(',');
+                        selectors = selectorText.length;
+                        for (j = 0; j < selectors; j++) {
+                            rules[Ext.String.trim(selectorText[j]).toLowerCase()] = ssRules[i];
+                        }
+                    }
+                }
+            } catch(e) {}
+        },
+
+        
+        getRules : function(refreshCache) {
+            if (rules === null || refreshCache) {
+                rules = {};
+                var ds = doc.styleSheets,
+                    i = 0,
+                    len = ds.length;
+
+                for (; i < len; i++) {
+                    try {
+                        if (!ds[i].disabled) {
+                            this.cacheStyleSheet(ds[i]);
+                        }
+                    } catch(e) {}
+                }
+            }
+            return rules;
+        },
+
+        
+        getRule: function(selector, refreshCache) {
+            var rs = this.getRules(refreshCache);
+            if (!Ext.isArray(selector)) {
+                return rs[selector.toLowerCase()];
+            }
+            for (var i = 0; i < selector.length; i++) {
+                if (rs[selector[i]]) {
+                    return rs[selector[i].toLowerCase()];
+                }
+            }
+            return null;
+        },
+
+        
+        updateRule : function(selector, property, value){
+            if (!Ext.isArray(selector)) {
+                var rule = this.getRule(selector);
+                if (rule) {
+                    rule.style[property.replace(camelRe, camelFn)] = value;
+                    return true;
+                }
+            } else {
+                for (var i = 0; i < selector.length; i++) {
+                    if (this.updateRule(selector[i], property, value)) {
+                        return true;
+                    }
+                }
+            }
+            return false;
+        }
+    };
+}());
+
+Ext.define('Ext.util.History', {
+    singleton: true,
+    alternateClassName: 'Ext.History',
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+
+    constructor: function() {
+        var me = this;
+        me.oldIEMode = Ext.isIE6 || Ext.isIE7 || !Ext.isStrict && Ext.isIE8;
+        me.iframe = null;
+        me.hiddenField = null;
+        me.ready = false;
+        me.currentToken = null;
+    },
+
+    getHash: function() {
+        var href = window.location.href,
+            i = href.indexOf("#");
+
+        return i >= 0 ? href.substr(i + 1) : null;
+    },
+
+    doSave: function() {
+        this.hiddenField.value = this.currentToken;
+    },
+
+
+    handleStateChange: function(token) {
+        this.currentToken = token;
+        this.fireEvent('change', token);
+    },
+
+    updateIFrame: function(token) {
+        var html = '<html><body><div id="state">' +
+                    Ext.util.Format.htmlEncode(token) +
+                    '</div></body></html>';
+
+        try {
+            var doc = this.iframe.contentWindow.document;
+            doc.open();
+            doc.write(html);
+            doc.close();
+            return true;
+        } catch (e) {
+            return false;
+        }
+    },
+
+    checkIFrame: function () {
+        var me = this,
+            contentWindow = me.iframe.contentWindow;
+
+        if (!contentWindow || !contentWindow.document) {
+            Ext.Function.defer(this.checkIFrame, 10, this);
+            return;
+        }
+
+        var doc = contentWindow.document,
+            elem = doc.getElementById("state"),
+            oldToken = elem ? elem.innerText : null,
+            oldHash = me.getHash();
+
+        Ext.TaskManager.start({
+            run: function () {
+                var doc = contentWindow.document,
+                    elem = doc.getElementById("state"),
+                    newToken = elem ? elem.innerText : null,
+                    newHash = me.getHash();
+
+                if (newToken !== oldToken) {
+                    oldToken = newToken;
+                    me.handleStateChange(newToken);
+                    window.top.location.hash = newToken;
+                    oldHash = newToken;
+                    me.doSave();
+                } else if (newHash !== oldHash) {
+                    oldHash = newHash;
+                    me.updateIFrame(newHash);
+                }
+            },
+            interval: 50,
+            scope: me
+        });
+        me.ready = true;
+        me.fireEvent('ready', me);
+    },
+
+    startUp: function () {
+        var me = this;
+
+        me.currentToken = me.hiddenField.value || this.getHash();
+
+        if (me.oldIEMode) {
+            me.checkIFrame();
+        } else {
+            var hash = me.getHash();
+            Ext.TaskManager.start({
+                run: function () {
+                    var newHash = me.getHash();
+                    if (newHash !== hash) {
+                        hash = newHash;
+                        me.handleStateChange(hash);
+                        me.doSave();
+                    }
+                },
+                interval: 50,
+                scope: me
+            });
+            me.ready = true;
+            me.fireEvent('ready', me);
+        }
+
+    },
+
+    
+    fieldId: Ext.baseCSSPrefix + 'history-field',
+    
+    iframeId: Ext.baseCSSPrefix + 'history-frame',
+
+    
+    init: function (onReady, scope) {
+        var me = this;
+
+        if (me.ready) {
+            Ext.callback(onReady, scope, [me]);
+            return;
+        }
+
+        if (!Ext.isReady) {
+            Ext.onReady(function() {
+                me.init(onReady, scope);
+            });
+            return;
+        }
+
+        me.hiddenField = Ext.getDom(me.fieldId);
+
+        if (me.oldIEMode) {
+            me.iframe = Ext.getDom(me.iframeId);
+        }
+
+        me.addEvents(
+            
+            'ready',
+            
+            'change'
+        );
+
+        if (onReady) {
+            me.on('ready', onReady, scope, {single: true});
+        }
+        me.startUp();
+    },
+
+    
+    add: function (token, preventDup) {
+        var me = this;
+
+        if (preventDup !== false) {
+            if (me.getToken() === token) {
+                return true;
+            }
+        }
+
+        if (me.oldIEMode) {
+            return me.updateIFrame(token);
+        } else {
+            window.top.location.hash = token;
+            return true;
+        }
+    },
+
+    
+    back: function() {
+        window.history.go(-1);
+    },
+
+    
+    forward: function(){
+        window.history.go(1);
+    },
+
+    
+    getToken: function() {
+        return this.ready ? this.currentToken : this.getHash();
+    }
+});
+
+Ext.define('Ext.view.TableChunker', {
+    singleton: true,
+    requires: ['Ext.XTemplate'],
+    metaTableTpl: [
+        '{[this.openTableWrap()]}',
+        '<table class="' + Ext.baseCSSPrefix + 'grid-table ' + Ext.baseCSSPrefix + 'grid-table-resizer" border="0" cellspacing="0" cellpadding="0" {[this.embedFullWidth()]}>',
+            '<tbody>',
+            '<tr class="' + Ext.baseCSSPrefix + 'grid-header-row">',
+            '<tpl for="columns">',
+                '<th class="' + Ext.baseCSSPrefix + 'grid-col-resizer-{id}" style="width: {width}px; height: 0px;"></th>',
+            '</tpl>',
+            '</tr>',
+            '{[this.openRows()]}',
+                '{row}',
+                '<tpl for="features">',
+                    '{[this.embedFeature(values, parent, xindex, xcount)]}',
+                '</tpl>',
+            '{[this.closeRows()]}',
+            '</tbody>',
+        '</table>',
+        '{[this.closeTableWrap()]}'
+    ],
+
+    constructor: function() {
+        Ext.XTemplate.prototype.recurse = function(values, reference) {
+            return this.apply(reference ? values[reference] : values);
+        };
+    },
+
+    embedFeature: function(values, parent, x, xcount) {
+        var tpl = '';
+        if (!values.disabled) {
+            tpl = values.getFeatureTpl(values, parent, x, xcount);
+        }
+        return tpl;
+    },
+
+    embedFullWidth: function() {
+        return 'style="width: {fullWidth}px;"';
+    },
+
+    openRows: function() {
+        return '<tpl for="rows">';
+    },
+
+    closeRows: function() {
+        return '</tpl>';
+    },
+
+    metaRowTpl: [
+        '<tr class="' + Ext.baseCSSPrefix + 'grid-row {addlSelector} {[this.embedRowCls()]}" {[this.embedRowAttr()]}>',
+            '<tpl for="columns">',
+                '<td class="{cls} ' + Ext.baseCSSPrefix + 'grid-cell ' + Ext.baseCSSPrefix + 'grid-cell-{columnId} {{id}-modified} {{id}-tdCls} {[this.firstOrLastCls(xindex, xcount)]}" {{id}-tdAttr}><div unselectable="on" class="' + Ext.baseCSSPrefix + 'grid-cell-inner ' + Ext.baseCSSPrefix + 'unselectable" style="{{id}-style}; text-align: {align};">{{id}}</div></td>',
+            '</tpl>',
+        '</tr>'
+    ],
+    
+    firstOrLastCls: function(xindex, xcount) {
+        var cssCls = '';
+        if (xindex === 1) {
+            cssCls = Ext.baseCSSPrefix + 'grid-cell-first';
+        } else if (xindex === xcount) {
+            cssCls = Ext.baseCSSPrefix + 'grid-cell-last';
+        }
+        return cssCls;
+    },
+    
+    embedRowCls: function() {
+        return '{rowCls}';
+    },
+    
+    embedRowAttr: function() {
+        return '{rowAttr}';
+    },
+    
+    openTableWrap: function() {
+        return '';
+    },
+    
+    closeTableWrap: function() {
+        return '';
+    },
+
+    getTableTpl: function(cfg, textOnly) {
+        var tpl,
+            tableTplMemberFns = {
+                openRows: this.openRows,
+                closeRows: this.closeRows,
+                embedFeature: this.embedFeature,
+                embedFullWidth: this.embedFullWidth,
+                openTableWrap: this.openTableWrap,
+                closeTableWrap: this.closeTableWrap
+            },
+            tplMemberFns = {},
+            features = cfg.features || [],
+            ln = features.length,
+            i  = 0,
+            memberFns = {
+                embedRowCls: this.embedRowCls,
+                embedRowAttr: this.embedRowAttr,
+                firstOrLastCls: this.firstOrLastCls
+            },
+            
+            metaRowTpl = Array.prototype.slice.call(this.metaRowTpl, 0),
+            metaTableTpl;
+            
+        for (; i < ln; i++) {
+            if (!features[i].disabled) {
+                features[i].mutateMetaRowTpl(metaRowTpl);
+                Ext.apply(memberFns, features[i].getMetaRowTplFragments());
+                Ext.apply(tplMemberFns, features[i].getFragmentTpl());
+                Ext.apply(tableTplMemberFns, features[i].getTableFragments());
+            }
+        }
+        
+        metaRowTpl = Ext.create('Ext.XTemplate', metaRowTpl.join(''), memberFns);
+        cfg.row = metaRowTpl.applyTemplate(cfg);
+        
+        metaTableTpl = Ext.create('Ext.XTemplate', this.metaTableTpl.join(''), tableTplMemberFns);
+        
+        tpl = metaTableTpl.applyTemplate(cfg);
+        
+        
+        if (!textOnly) {
+            tpl = Ext.create('Ext.XTemplate', tpl, tplMemberFns);
+        }
+        return tpl;
+        
+    }
+});
+
+
+
+
diff --git a/interface/ext/resources/css/ext-all-access.css b/interface/ext/resources/css/ext-all-access.css
new file mode 100755
index 0000000..a9cd8e0
--- /dev/null
+++ b/interface/ext/resources/css/ext-all-access.css
@@ -0,0 +1 @@
+body{background:#000}html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{ver [...]
diff --git a/interface/ext/resources/css/ext-all-gray.css b/interface/ext/resources/css/ext-all-gray.css
new file mode 100755
index 0000000..7159597
--- /dev/null
+++ b/interface/ext/resources/css/ext-all-gray.css
@@ -0,0 +1 @@
+html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bott [...]
diff --git a/interface/ext/resources/css/ext-all-scoped.css b/interface/ext/resources/css/ext-all-scoped.css
new file mode 100755
index 0000000..4ce7f4c
--- /dev/null
+++ b/interface/ext/resources/css/ext-all-scoped.css
@@ -0,0 +1 @@
+.x-border-box .x-reset,.x-border-box .x-reset *{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-reset html,.x-reset body,.x-reset div,.x-reset dl,.x-reset dt,.x-reset dd,.x-reset ul,.x-reset ol,.x-reset li,.x-reset h1,.x-reset h2,.x-reset h3,.x-reset h4,.x-reset h5,.x-reset h6,.x-reset pre,.x-reset code,.x-reset form,.x-reset fieldset,.x-reset legend,.x-reset input,.x-reset textarea,.x-reset p,.x-reset blockquote,.x-reset th,.x- [...]
diff --git a/interface/ext/resources/css/ext-all.css b/interface/ext/resources/css/ext-all.css
new file mode 100755
index 0000000..9ed1e1d
--- /dev/null
+++ b/interface/ext/resources/css/ext-all.css
@@ -0,0 +1 @@
+html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bott [...]
diff --git a/interface/ext/resources/css/ext-ie-scoped.css b/interface/ext/resources/css/ext-ie-scoped.css
new file mode 100755
index 0000000..0d0548c
--- /dev/null
+++ b/interface/ext/resources/css/ext-ie-scoped.css
@@ -0,0 +1 @@
+.x-border-box .x-reset,.x-border-box .x-reset *{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-reset html,.x-reset body,.x-reset div,.x-reset dl,.x-reset dt,.x-reset dd,.x-reset ul,.x-reset ol,.x-reset li,.x-reset h1,.x-reset h2,.x-reset h3,.x-reset h4,.x-reset h5,.x-reset h6,.x-reset pre,.x-reset code,.x-reset form,.x-reset fieldset,.x-reset legend,.x-reset input,.x-reset textarea,.x-reset p,.x-reset blockquote,.x-reset th,.x- [...]
diff --git a/interface/ext/resources/css/ext-ie.css b/interface/ext/resources/css/ext-ie.css
new file mode 100755
index 0000000..8338ac2
--- /dev/null
+++ b/interface/ext/resources/css/ext-ie.css
@@ -0,0 +1 @@
+html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bott [...]
diff --git a/interface/ext/resources/css/ext-sandbox.css b/interface/ext/resources/css/ext-sandbox.css
new file mode 100755
index 0000000..a1fd48f
--- /dev/null
+++ b/interface/ext/resources/css/ext-sandbox.css
@@ -0,0 +1 @@
+.x4-border-box .x4-reset,.x4-border-box .x4-reset *{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x4-reset html,.x4-reset body,.x4-reset div,.x4-reset dl,.x4-reset dt,.x4-reset dd,.x4-reset ul,.x4-reset ol,.x4-reset li,.x4-reset h1,.x4-reset h2,.x4-reset h3,.x4-reset h4,.x4-reset h5,.x4-reset h6,.x4-reset pre,.x4-reset code,.x4-reset form,.x4-reset fieldset,.x4-reset legend,.x4-reset input,.x4-reset textarea,.x4-reset p,.x4-rese [...]
diff --git a/interface/ext/resources/css/ext-standard-scoped.css b/interface/ext/resources/css/ext-standard-scoped.css
new file mode 100755
index 0000000..8e94ebe
--- /dev/null
+++ b/interface/ext/resources/css/ext-standard-scoped.css
@@ -0,0 +1 @@
+.x-border-box .x-reset,.x-border-box .x-reset *{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-reset html,.x-reset body,.x-reset div,.x-reset dl,.x-reset dt,.x-reset dd,.x-reset ul,.x-reset ol,.x-reset li,.x-reset h1,.x-reset h2,.x-reset h3,.x-reset h4,.x-reset h5,.x-reset h6,.x-reset pre,.x-reset code,.x-reset form,.x-reset fieldset,.x-reset legend,.x-reset input,.x-reset textarea,.x-reset p,.x-reset blockquote,.x-reset th,.x- [...]
diff --git a/interface/ext/resources/css/ext-standard.css b/interface/ext/resources/css/ext-standard.css
new file mode 100755
index 0000000..39d7700
--- /dev/null
+++ b/interface/ext/resources/css/ext-standard.css
@@ -0,0 +1 @@
+html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bott [...]
diff --git a/interface/ext/resources/sass/config.rb b/interface/ext/resources/sass/config.rb
new file mode 100755
index 0000000..103079b
--- /dev/null
+++ b/interface/ext/resources/sass/config.rb
@@ -0,0 +1,22 @@
+# $ext_path: This should be the path of where the ExtJS SDK is installed
+# Generally this will be in a lib/extjs folder in your applications root
+# <root>/lib/extjs
+$ext_path = "../../"
+
+# sass_path: the directory your Sass files are in. THIS file should also be in the Sass folder
+# Generally this will be in a resources/sass folder
+# <root>/resources/sass
+sass_path = File.dirname(__FILE__)
+
+# css_path: the directory you want your CSS files to be.
+# Generally this is a folder in the parent directory of your Sass files
+# <root>/resources/css
+css_path = File.join(sass_path, "..", "css")
+
+# output_style: The output style for your compiled CSS
+# nested, expanded, compact, compressed
+# More information can be found here http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#output_style
+output_style = :compressed
+
+# We need to load in the Ext4 themes folder, which includes all it's default styling, images, variables and mixins
+load File.join(File.dirname(__FILE__), $ext_path, 'resources', 'themes')
diff --git a/interface/ext/resources/sass/ext-all-access.scss b/interface/ext/resources/sass/ext-all-access.scss
new file mode 100755
index 0000000..69390a7
--- /dev/null
+++ b/interface/ext/resources/sass/ext-all-access.scss
@@ -0,0 +1,219 @@
+$theme-name: 'access';
+
+body {
+    background: #000;
+}
+
+$base-color: #3f4757;
+$orange: #ed9200;
+$color: #fff;
+$font-size: 15px;
+$css-shadow-background-color: #000000;
+$include-shadow-images: false;
+
+//panel
+$panel-header-background-color: #3a4155;
+$panel-header-color: #fff;
+$panel-body-background-color: #232d38;
+$panel-body-color: #fff;
+//$panel-header-font-size: 14px;
+$panel-border-color: #18181a;
+$panel-header-inner-border: false;
+
+$border-layout-ct-background: #3f4757;
+
+//framed panel
+$panel-frame-border-radius: 3px;
+$frame-base-color: #232d38;
+$panel-frame-background-color: #3f4757;
+
+//window
+$window-background-color: #3f4757;
+$window-body-background-color: #1f2833;
+$window-body-color: #fff;
+$window-body-border-color: #18181a;
+$window-inner-border-color: #414b5c;
+$window-header-color: #fff;
+
+//loadmask
+$loadmask-msg-background-color: #3f4757;
+$loadmask-msg-border-color: #222233;
+$loadmask-msg-inner-border-color: #555566;
+$loadmask-msg-inner-background-color: #232d38;
+$loadmask-msg-inner-color: #fff;
+$loadmask-msg-inner-padding: 5px 10px;
+$loadmask-msg-inner-icon: null;
+
+//toolbar
+$toolbar-border-color: $window-body-border-color;
+$toolbar-background-color: #3a3e4f;
+$toolbar-text-color: #fff;
+
+$toolbar-separator-color: #1b1b29 !default;
+$toolbar-separator-highlight-color: #5d5d6e !default;
+
+//buttons
+$button-default-base-color: #2a3142;
+$button-default-base-color-over: $orange;
+$button-default-base-color-pressed: #da7b19;
+$button-default-color: #fff;
+
+$button-toolbar-border-color-over: #d97e27;
+$button-toolbar-border-color-pressed: #c86e19;
+$button-toolbar-background-color-over: $orange;
+$button-toolbar-background-color-pressed: #db7b1f;
+$button-toolbar-background-gradient: null;
+$button-toolbar-background-gradient-over: null;
+$button-toolbar-background-gradient-focus: null;
+$button-toolbar-background-gradient-pressed: null;
+$button-toolbar-background-gradient-disabled: null;
+$button-toolbar-color: #fff !default;
+$button-toolbar-color-over: #fff !default;
+$button-toolbar-color-pressed: #fff !default;
+
+//forms
+$form-field-height: 26px;
+$form-toolbar-field-height: 24px;
+//$form-field-font-size: 15px;
+$form-field-border-width: 2px;
+$form-field-border-color: #737b8c;
+$form-field-background-color: #34383f;
+$form-field-color: #fff;
+$form-checkbox-size: 19px;
+
+$form-field-focus-border-color: #ff9c33;
+
+$form-field-invalid-background-color: #15171A;
+$form-field-invalid-border-color: #C30;
+
+$form-trigger-width: 20px;
+$form-trigger-border-bottom-width: 2px;
+$form-trigger-border-bottom-color: $form-field-border-color;
+$form-trigger-border-bottom-color-over: $form-field-focus-border-color;
+$form-trigger-border-bottom-color-focus: $form-field-border-color;
+$form-trigger-border-bottom-color-focus-over: $form-field-focus-border-color;
+$form-trigger-border-bottom-color-pressed: #c76e12;
+
+//htmleditor
+$html-editor-border-color: #737b8c;
+
+//fieldsets
+$fieldset-header-color: #fff;
+$fieldset-border-color: #727c8c;
+
+//tabs
+$tab-base-color: #616f8c;
+$tab-base-color-over: lighten(#616f8c, 5);
+$tab-base-color-active: $orange;
+
+$tab-height: 27px;
+
+$tab-color: #fff;
+$tab-color-active: $tab-color;
+
+$tab-inner-border: false;
+$tab-border-color: #2e3746;
+$tab-border-color-active: #74400e;
+
+$tab-background-gradient: null;
+$tab-background-gradient-over: null;
+$tab-background-gradient-active: null;
+$tab-background-gradient-disabled: null;
+
+$tab-closable-icon: 'tabs/tab-close.gif';
+$tab-closable-background-position: top right;
+$tab-closable-width: 16px;
+
+$tabbar-strip-background-color: $orange;
+
+//grid
+$grid-header-background-color: #373c4b;
+$grid-header-over-background-color: #496085;
+$grid-header-background-gradient: 'glossy';
+$grid-header-over-background-gradient: 'glossy';
+$grid-header-color: #fff;
+
+$grid-row-wrap-border-color: #101010;
+
+$grid-row-cell-color: #fff;
+
+$grid-row-cell-background: #1f2933;
+
+$grid-row-cell-alt-background: #1a232b;
+
+$grid-row-cell-over-background-color: #7e552f;
+$grid-row-cell-over-border-color: #101010;
+
+$grid-row-cell-selected-background-color: #e48627;
+$grid-row-cell-selected-border-color: #101010;
+
+$grid-row-cell-over-background-gradient: 'flat';
+$grid-row-cell-focus-background-gradient: 'flat';
+
+//layout
+$accordion-header-color: #fff;
+$accordion-header-background-color: #5c6b82;
+
+//progress bar
+$progress-border-color: #18181a;
+$progress-background-color: #232d38;
+$progress-text-color-back: #aaa;
+$progress-bar-background-color: $orange;
+
+//btn group
+$btn-group-background-color: #393d4e;
+$btn-group-header-background-color: #676772;
+$btn-group-border-color: #606068;
+$btn-group-inner-border-color: #757478;
+$btn-group-header-color: #D2D2D2;
+
+//datepicker
+$datepicker-background-color: #21252e;
+$datepicker-border-color: #798294;
+$datepicker-today-item-border-color: #9999aa;
+
+$datepicker-header-background-color: #5c6980;
+
+$datepicker-th-background-color: #3a4051;
+$datepicker-th-color: #fff;
+$datepicker-th-border-bottom-color: #535b5c;
+
+$datepicker-td-height: 21px;
+
+$datepicker-item-color: #fff;
+$datepicker-item-hover-background-color: #7e5530;
+$datepicker-selected-item-border-color: #864900;
+$datepicker-selected-item-background-color: #e5872c;
+
+$datepicker-monthpicker-height: 172px;
+
+$datepicker-monthpicker-item-color: #fff;
+$datepicker-monthpicker-item-border: 0 none;
+$datepicker-monthpicker-item-selected-background-color: $datepicker-selected-item-background-color;
+
+// boundlist
+$boundlist-background-color: #404551;
+$boundlist-border-color: #222732;
+$boundlist-border-width: 2px;
+
+$boundlist-item-border-width: 0;
+$boundlist-item-over-background-color: #e5872c;
+$boundlist-item-selected-background-color: #e5872c; 
+
+//tips
+$tip-base-color: #5e6986;
+$tip-border-color: #122d5e;
+$tip-body-color: #000;
+
+//menu
+$menu-background-color: #414551;
+$menu-text-color: #fff;
+
+$menu-item-active-background-color: $orange;
+$menu-item-active-border-color: darken($orange, 5);
+
+$menu-separator-border-color: #222233;
+$menu-separator-background-color: #666666;
+
+ at import 'compass';
+ at import 'ext4/default/all';
\ No newline at end of file
diff --git a/interface/ext/resources/sass/ext-all-gray.scss b/interface/ext/resources/sass/ext-all-gray.scss
new file mode 100755
index 0000000..1f2142d
--- /dev/null
+++ b/interface/ext/resources/sass/ext-all-gray.scss
@@ -0,0 +1,118 @@
+$theme-name: 'gray';
+$base-color: #ccc;
+
+//panel
+$panel-header-background-gradient: color-stops(#F0F0F0, #D7D7D7);
+$panel-border-color: #D0D0D0;
+$panel-header-color: #333;
+
+$panel-frame-background-color: #f1f1f1;
+
+//window
+$window-background-color: #e8e8e8;
+$window-header-color: #333;
+
+//menu
+$menu-item-active-background-color: darken(#f3f3f3, 5);
+$menu-item-active-border-color: #9d9d9d;
+
+//datepicker
+$datepicker-header-background-color: #6f6f6f;
+$datepicker-border-color: #585858;
+$datepicker-th-background-color: #e9e9e9;
+$datepicker-selected-item-background-color: #d8d8d8;
+$datepicker-item-hover-background-color: transparent;
+
+//progress bar
+$progress-border-color: #8e8e8e;
+$progress-background-color: #f1f1f1;
+$progress-bar-background-color: #ababab;
+
+//tips
+$tip-base-color: $base-color;
+
+//grid
+$grid-header-over-border-color: darken($base-color, 3);
+
+//toolbar
+$toolbar-background-gradient: color-stops(#e6e6e6, #efefef);
+$toolbar-separator-color: #aca899;
+$toolbar-text-color: #000;
+
+//btn group
+$btn-group-background-color: #f0f0f0;
+$btn-group-header-background-color: #dfdfdf;
+$btn-group-border-color: #d0d0d0;
+$btn-group-header-color: #666;
+
+//form
+$fieldset-header-color: #333;
+
+$boundlist-border-color: #b5b8c8;
+
+//acordion
+$accordion-header-background-color: #e5e5e5;
+
+//tabs
+$tab-base-color: #eaeaea;
+$tab-color-active: #333333;
+
+$tab-background-gradient: color-stops(#dcdcdc, #eaeaea);
+$tab-background-gradient-over: 'tab-over' !default;
+$tab-background-gradient-active: color-stops(#ffffff, #eaeaea);
+$tab-background-gradient-disabled: 'tab-disabled' !default;
+
+//buttons
+$button-default-base-color: #f8f8f8;
+$button-default-base-color-over: #f3f3f3;
+$button-default-base-color-focus: $button-default-base-color-over;
+$button-default-base-color-pressed: #d6d6d6;
+$button-default-base-color-disabled: adjust-color($base-color, $hue: 0deg, $saturation: -55.556%, $lightness: 12.745%) !default; //F7F7F7
+
+$button-default-border-color: #bbbbbb;
+$button-default-border-color-over: #9d9d9d;
+$button-default-border-color-focus: $button-default-border-color-over;
+$button-default-border-color-pressed: $button-default-border-color-over;
+$button-default-border-color-disabled: adjust-color($button-default-base-color-disabled, $hue: 0deg, $saturation: 0%, $lightness: -8.627%) !default;
+
+$button-default-background-gradient: 'matte';
+$button-default-background-gradient-over: 'matte';
+$button-default-background-gradient-focus: 'matte';
+$button-default-background-gradient-pressed: 'matte-reverse';
+$button-default-background-gradient-disabled: 'matte';
+
+$button-default-background-gradient-color-stops: null;
+$button-default-background-gradient-color-stops-over: null;
+$button-default-background-gradient-color-stops-focus: null;
+$button-default-background-gradient-color-stops-pressed: null;
+$button-default-background-gradient-color-stops-disabled: null;
+
+
+$button-toolbar-base-color: $button-default-base-color;
+
+$button-toolbar-border-color: transparent !default;
+$button-toolbar-border-color-over: $button-default-border-color-over;
+$button-toolbar-border-color-focus: $button-default-border-color-focus;
+$button-toolbar-border-color-pressed: $button-default-border-color-pressed;
+$button-toolbar-border-color-disabled: $button-default-border-color-disabled;
+
+$button-toolbar-background-color: transparent !default;
+$button-toolbar-background-color-over: $button-default-base-color-over;
+$button-toolbar-background-color-focus: $button-default-base-color-focus;
+$button-toolbar-background-color-pressed: $button-default-base-color-pressed;
+$button-toolbar-background-color-disabled: transparent;
+
+$button-toolbar-background-gradient: null;
+$button-toolbar-background-gradient-over: 'matte';
+$button-toolbar-background-gradient-focus: 'matte';
+$button-toolbar-background-gradient-pressed: 'matte-reverse';
+$button-toolbar-background-gradient-disabled: null;
+
+$button-toolbar-background-gradient-color-stops: null;
+$button-toolbar-background-gradient-color-stops-over: null;
+$button-toolbar-background-gradient-color-stops-focus: null;
+$button-toolbar-background-gradient-color-stops-pressed: null;
+$button-toolbar-background-gradient-color-stops-disabled: null;
+
+ at import 'compass';
+ at import 'ext4/default/all';
\ No newline at end of file
diff --git a/interface/ext/resources/sass/ext-all-scoped.scss b/interface/ext/resources/sass/ext-all-scoped.scss
new file mode 100755
index 0000000..244a2c2
--- /dev/null
+++ b/interface/ext/resources/sass/ext-all-scoped.scss
@@ -0,0 +1,5 @@
+$scope-reset-css: true;
+$compile-all: true;
+
+ at import 'compass';
+ at import 'ext4/default/all';
\ No newline at end of file
diff --git a/interface/ext/resources/sass/ext-all.scss b/interface/ext/resources/sass/ext-all.scss
new file mode 100755
index 0000000..3c12ab9
--- /dev/null
+++ b/interface/ext/resources/sass/ext-all.scss
@@ -0,0 +1,2 @@
+ at import 'compass';
+ at import 'ext4/default/all';
\ No newline at end of file
diff --git a/interface/ext/resources/sass/ext-ie-scoped.scss b/interface/ext/resources/sass/ext-ie-scoped.scss
new file mode 100755
index 0000000..b9f0045
--- /dev/null
+++ b/interface/ext/resources/sass/ext-ie-scoped.scss
@@ -0,0 +1,16 @@
+$prefix: 'x-';
+
+$scope-reset-css: true;
+
+$include-ie: true;
+$include-ff: false;
+$include-chrome: false;
+$include-safari: false;
+$include-opera: false;
+
+$compile-all: false;
+$supports-border-radius: false;
+$supports-gradients: false;
+
+ at import 'compass';
+ at import 'ext4/default/all';
\ No newline at end of file
diff --git a/interface/ext/resources/sass/ext-ie.scss b/interface/ext/resources/sass/ext-ie.scss
new file mode 100755
index 0000000..c9ce9f8
--- /dev/null
+++ b/interface/ext/resources/sass/ext-ie.scss
@@ -0,0 +1,14 @@
+$prefix: 'x-';
+
+$include-ie: true;
+$include-ff: false;
+$include-chrome: false;
+$include-safari: false;
+$include-opera: false;
+
+$compile-all: false;
+$supports-border-radius: false;
+$supports-gradients: false;
+
+ at import 'compass';
+ at import 'ext4/default/all';
\ No newline at end of file
diff --git a/interface/ext/resources/sass/ext-sandbox.scss b/interface/ext/resources/sass/ext-sandbox.scss
new file mode 100755
index 0000000..4e8f3b4
--- /dev/null
+++ b/interface/ext/resources/sass/ext-sandbox.scss
@@ -0,0 +1,4 @@
+$prefix: 'x4-';
+$scope-reset-css: true;
+ at import 'compass';
+ at import 'ext4/default/all';
diff --git a/interface/ext/resources/sass/ext-standard-scoped.scss b/interface/ext/resources/sass/ext-standard-scoped.scss
new file mode 100755
index 0000000..d2cc36f
--- /dev/null
+++ b/interface/ext/resources/sass/ext-standard-scoped.scss
@@ -0,0 +1,16 @@
+$prefix: 'x-';
+
+$scope-reset-css: true;
+
+$include-ff: true;
+$include-chrome: true;
+$include-safari: true;
+$include-opera: true;
+$include-ie: false;
+
+$compile-all: false;
+$supports-border-radius: true;
+$supports-gradients: false;
+
+ at import 'compass';
+ at import 'ext4/default/all';
\ No newline at end of file
diff --git a/interface/ext/resources/sass/ext-standard.scss b/interface/ext/resources/sass/ext-standard.scss
new file mode 100755
index 0000000..a6750c0
--- /dev/null
+++ b/interface/ext/resources/sass/ext-standard.scss
@@ -0,0 +1,14 @@
+$prefix: 'x-';
+
+$include-ff: true;
+$include-chrome: true;
+$include-safari: true;
+$include-opera: true;
+$include-ie: false;
+
+$compile-all: false;
+$supports-border-radius: true;
+$supports-gradients: false;
+
+ at import 'compass';
+ at import 'ext4/default/all';
\ No newline at end of file
diff --git a/interface/ext/resources/themes/compass_init.rb b/interface/ext/resources/themes/compass_init.rb
new file mode 100755
index 0000000..167d822
--- /dev/null
+++ b/interface/ext/resources/themes/compass_init.rb
@@ -0,0 +1,6 @@
+# include the utils rb file which has extra functionality for the ext theme
+dir = File.dirname(__FILE__)
+require File.join(dir, 'lib', 'utils.rb')
+
+# register ext4 as a compass framework
+Compass::Frameworks.register 'ext4', dir
\ No newline at end of file
diff --git a/interface/ext/resources/themes/images/access/boundlist/trigger-arrow.png b/interface/ext/resources/themes/images/access/boundlist/trigger-arrow.png
new file mode 100755
index 0000000..11daac3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/boundlist/trigger-arrow.png differ
diff --git a/interface/ext/resources/themes/images/access/box/corners-blue.gif b/interface/ext/resources/themes/images/access/box/corners-blue.gif
new file mode 100755
index 0000000..fa419b5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/box/corners-blue.gif differ
diff --git a/interface/ext/resources/themes/images/access/box/corners.gif b/interface/ext/resources/themes/images/access/box/corners.gif
new file mode 100755
index 0000000..8aa8cae
Binary files /dev/null and b/interface/ext/resources/themes/images/access/box/corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/box/l-blue.gif b/interface/ext/resources/themes/images/access/box/l-blue.gif
new file mode 100755
index 0000000..5ed7f00
Binary files /dev/null and b/interface/ext/resources/themes/images/access/box/l-blue.gif differ
diff --git a/interface/ext/resources/themes/images/access/box/l.gif b/interface/ext/resources/themes/images/access/box/l.gif
new file mode 100755
index 0000000..0160f97
Binary files /dev/null and b/interface/ext/resources/themes/images/access/box/l.gif differ
diff --git a/interface/ext/resources/themes/images/access/box/r-blue.gif b/interface/ext/resources/themes/images/access/box/r-blue.gif
new file mode 100755
index 0000000..3ea5cae
Binary files /dev/null and b/interface/ext/resources/themes/images/access/box/r-blue.gif differ
diff --git a/interface/ext/resources/themes/images/access/box/r.gif b/interface/ext/resources/themes/images/access/box/r.gif
new file mode 100755
index 0000000..34237f6
Binary files /dev/null and b/interface/ext/resources/themes/images/access/box/r.gif differ
diff --git a/interface/ext/resources/themes/images/access/box/tb-blue.gif b/interface/ext/resources/themes/images/access/box/tb-blue.gif
new file mode 100755
index 0000000..4b1382c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/box/tb-blue.gif differ
diff --git a/interface/ext/resources/themes/images/access/box/tb.gif b/interface/ext/resources/themes/images/access/box/tb.gif
new file mode 100755
index 0000000..435889b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/box/tb.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-corners.gif b/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-corners.gif
new file mode 100755
index 0000000..a566e9e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-notitle-corners.gif b/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-notitle-corners.gif
new file mode 100755
index 0000000..a566e9e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-notitle-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-notitle-sides.gif b/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-notitle-sides.gif
new file mode 100755
index 0000000..fef2284
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-notitle-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-sides.gif b/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-sides.gif
new file mode 100755
index 0000000..3334e4f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn-group/btn-group-default-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-corners.gif b/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-corners.gif
new file mode 100755
index 0000000..af08662
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-notitle-corners.gif b/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-notitle-corners.gif
new file mode 100755
index 0000000..54fd6eb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-notitle-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-notitle-sides.gif b/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-notitle-sides.gif
new file mode 100755
index 0000000..0aaf799
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-notitle-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-sides.gif b/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-sides.gif
new file mode 100755
index 0000000..af4e726
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn-group/btn-group-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-bg.gif
new file mode 100755
index 0000000..87148ee
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-corners.gif
new file mode 100755
index 0000000..64b4423
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-bg.gif
new file mode 100755
index 0000000..33c469e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-corners.gif
new file mode 100755
index 0000000..67310a1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-sides.gif
new file mode 100755
index 0000000..f2751fa
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-bg.gif
new file mode 100755
index 0000000..ce9e359
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-corners.gif
new file mode 100755
index 0000000..dc53444
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-sides.gif
new file mode 100755
index 0000000..63b96f2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-over-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-over-bg.gif
new file mode 100755
index 0000000..a9adb0d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-over-corners.gif
new file mode 100755
index 0000000..dc53444
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-over-sides.gif
new file mode 100755
index 0000000..768e07b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-bg.gif
new file mode 100755
index 0000000..845885b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-corners.gif
new file mode 100755
index 0000000..b147bdf
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-sides.gif
new file mode 100755
index 0000000..57fbcb9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-large-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-large-sides.gif
new file mode 100755
index 0000000..39f35ea
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-large-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-bg.gif
new file mode 100755
index 0000000..14cf679
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-corners.gif
new file mode 100755
index 0000000..64b4423
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-bg.gif
new file mode 100755
index 0000000..2c35b3b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-corners.gif
new file mode 100755
index 0000000..0a092cd
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-sides.gif
new file mode 100755
index 0000000..9f79ef6
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-bg.gif
new file mode 100755
index 0000000..f522fc8
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-corners.gif
new file mode 100755
index 0000000..d404d0f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-sides.gif
new file mode 100755
index 0000000..2fa7f1a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-bg.gif
new file mode 100755
index 0000000..f522fc8
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-corners.gif
new file mode 100755
index 0000000..d404d0f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-sides.gif
new file mode 100755
index 0000000..2fa7f1a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-bg.gif
new file mode 100755
index 0000000..95828bd
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-corners.gif
new file mode 100755
index 0000000..6e70c65
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-sides.gif
new file mode 100755
index 0000000..e4738d5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-medium-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-medium-sides.gif
new file mode 100755
index 0000000..553ed4b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-medium-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-bg.gif
new file mode 100755
index 0000000..23cfa11
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-corners.gif
new file mode 100755
index 0000000..1c31353
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-bg.gif
new file mode 100755
index 0000000..d39b545
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-corners.gif
new file mode 100755
index 0000000..0a092cd
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-sides.gif
new file mode 100755
index 0000000..109ca82
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-bg.gif
new file mode 100755
index 0000000..78775ba
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-corners.gif
new file mode 100755
index 0000000..e190818
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-sides.gif
new file mode 100755
index 0000000..affc4b3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-over-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-over-bg.gif
new file mode 100755
index 0000000..78775ba
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-over-corners.gif
new file mode 100755
index 0000000..07dda54
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-over-sides.gif
new file mode 100755
index 0000000..affc4b3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-bg.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-bg.gif
new file mode 100755
index 0000000..5542914
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-corners.gif
new file mode 100755
index 0000000..6e70c65
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-sides.gif
new file mode 100755
index 0000000..6411971
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-small-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-small-sides.gif
new file mode 100755
index 0000000..d6203ef
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-small-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-corners.gif
new file mode 100755
index 0000000..ff76693
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-disabled-corners.gif
new file mode 100755
index 0000000..ff76693
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-disabled-sides.gif
new file mode 100755
index 0000000..28cf5d5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-focus-corners.gif
new file mode 100755
index 0000000..6bd98f0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-focus-sides.gif
new file mode 100755
index 0000000..ab6770a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-over-corners.gif
new file mode 100755
index 0000000..6bd98f0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-over-sides.gif
new file mode 100755
index 0000000..ab6770a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-pressed-corners.gif
new file mode 100755
index 0000000..44c0031
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-pressed-sides.gif
new file mode 100755
index 0000000..a1b6cfe
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-sides.gif
new file mode 100755
index 0000000..28cf5d5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-large-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-corners.gif
new file mode 100755
index 0000000..ff76693
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-disabled-corners.gif
new file mode 100755
index 0000000..ff76693
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-disabled-sides.gif
new file mode 100755
index 0000000..d1e5001
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-focus-corners.gif
new file mode 100755
index 0000000..a5b0f5f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-focus-sides.gif
new file mode 100755
index 0000000..e359f4b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-over-corners.gif
new file mode 100755
index 0000000..a5b0f5f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-over-sides.gif
new file mode 100755
index 0000000..e359f4b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-pressed-corners.gif
new file mode 100755
index 0000000..527e49f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-pressed-sides.gif
new file mode 100755
index 0000000..3eaaf74
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-sides.gif
new file mode 100755
index 0000000..d1e5001
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-medium-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-corners.gif
new file mode 100755
index 0000000..ff76693
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-disabled-corners.gif
new file mode 100755
index 0000000..ff76693
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-disabled-sides.gif
new file mode 100755
index 0000000..b50b4db
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-focus-corners.gif
new file mode 100755
index 0000000..a5b0f5f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-focus-sides.gif
new file mode 100755
index 0000000..42e0f9f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-over-corners.gif
new file mode 100755
index 0000000..a5b0f5f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-over-sides.gif
new file mode 100755
index 0000000..42e0f9f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-pressed-corners.gif
new file mode 100755
index 0000000..527e49f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-pressed-sides.gif
new file mode 100755
index 0000000..f38c20e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-sides.gif
new file mode 100755
index 0000000..b50b4db
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-default-toolbar-small-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-corners.gif
new file mode 100755
index 0000000..2fb4c43
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-disabled-corners.gif
new file mode 100755
index 0000000..2fb4c43
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-disabled-sides.gif
new file mode 100755
index 0000000..338914f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-focus-corners.gif
new file mode 100755
index 0000000..165cacf
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-focus-sides.gif
new file mode 100755
index 0000000..8de9574
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-over-corners.gif
new file mode 100755
index 0000000..165cacf
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-over-sides.gif
new file mode 100755
index 0000000..8de9574
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-pressed-corners.gif
new file mode 100755
index 0000000..45dfef6
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-pressed-sides.gif
new file mode 100755
index 0000000..724a76d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-sides.gif
new file mode 100755
index 0000000..338914f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-large-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-corners.gif
new file mode 100755
index 0000000..2fb4c43
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-disabled-corners.gif
new file mode 100755
index 0000000..2fb4c43
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-disabled-sides.gif
new file mode 100755
index 0000000..cc48c8f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-focus-corners.gif
new file mode 100755
index 0000000..62ca4fe
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-focus-sides.gif
new file mode 100755
index 0000000..adf64f0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-over-corners.gif
new file mode 100755
index 0000000..62ca4fe
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-over-sides.gif
new file mode 100755
index 0000000..adf64f0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-pressed-corners.gif
new file mode 100755
index 0000000..51cb112
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-pressed-sides.gif
new file mode 100755
index 0000000..6c76ce6
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-sides.gif
new file mode 100755
index 0000000..cc48c8f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-medium-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-corners.gif
new file mode 100755
index 0000000..2fb4c43
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-disabled-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-disabled-corners.gif
new file mode 100755
index 0000000..2fb4c43
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-disabled-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-disabled-sides.gif
new file mode 100755
index 0000000..7f61b96
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-focus-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-focus-corners.gif
new file mode 100755
index 0000000..62ca4fe
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-focus-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-focus-sides.gif
new file mode 100755
index 0000000..3508cba
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-over-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-over-corners.gif
new file mode 100755
index 0000000..62ca4fe
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-over-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-over-sides.gif
new file mode 100755
index 0000000..3508cba
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-pressed-corners.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-pressed-corners.gif
new file mode 100755
index 0000000..51cb112
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-pressed-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-pressed-sides.gif
new file mode 100755
index 0000000..0253331
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-sides.gif b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-sides.gif
new file mode 100755
index 0000000..7f61b96
Binary files /dev/null and b/interface/ext/resources/themes/images/access/btn/btn-toolbar-small-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/arrow.gif b/interface/ext/resources/themes/images/access/button/arrow.gif
new file mode 100755
index 0000000..087b450
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/arrow.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/btn.gif b/interface/ext/resources/themes/images/access/button/btn.gif
new file mode 100755
index 0000000..3e705ba
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/btn.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/group-cs.gif b/interface/ext/resources/themes/images/access/button/group-cs.gif
new file mode 100755
index 0000000..aaf0d46
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/group-cs.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/group-lr.gif b/interface/ext/resources/themes/images/access/button/group-lr.gif
new file mode 100755
index 0000000..374ea75
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/group-lr.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/group-tb.gif b/interface/ext/resources/themes/images/access/button/group-tb.gif
new file mode 100755
index 0000000..50a9972
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/group-tb.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/s-arrow-b-noline.gif b/interface/ext/resources/themes/images/access/button/s-arrow-b-noline.gif
new file mode 100755
index 0000000..644e9f3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/s-arrow-b-noline.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/s-arrow-b.gif b/interface/ext/resources/themes/images/access/button/s-arrow-b.gif
new file mode 100755
index 0000000..ba55d0a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/s-arrow-b.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/s-arrow-bo.gif b/interface/ext/resources/themes/images/access/button/s-arrow-bo.gif
new file mode 100755
index 0000000..c672b60
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/s-arrow-bo.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/s-arrow-light.gif b/interface/ext/resources/themes/images/access/button/s-arrow-light.gif
new file mode 100755
index 0000000..08783c9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/s-arrow-light.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/s-arrow-noline.gif b/interface/ext/resources/themes/images/access/button/s-arrow-noline.gif
new file mode 100755
index 0000000..f3cd351
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/s-arrow-noline.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/s-arrow-o.gif b/interface/ext/resources/themes/images/access/button/s-arrow-o.gif
new file mode 100755
index 0000000..4bdafd0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/s-arrow-o.gif differ
diff --git a/interface/ext/resources/themes/images/access/button/s-arrow.gif b/interface/ext/resources/themes/images/access/button/s-arrow.gif
new file mode 100755
index 0000000..a77be7f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/button/s-arrow.gif differ
diff --git a/interface/ext/resources/themes/images/access/datepicker/datepicker-footer-bg.gif b/interface/ext/resources/themes/images/access/datepicker/datepicker-footer-bg.gif
new file mode 100755
index 0000000..7a2f569
Binary files /dev/null and b/interface/ext/resources/themes/images/access/datepicker/datepicker-footer-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/datepicker/datepicker-header-bg.gif b/interface/ext/resources/themes/images/access/datepicker/datepicker-header-bg.gif
new file mode 100755
index 0000000..f6353ad
Binary files /dev/null and b/interface/ext/resources/themes/images/access/datepicker/datepicker-header-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/dd/drop-add.gif b/interface/ext/resources/themes/images/access/dd/drop-add.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/access/dd/drop-add.gif differ
diff --git a/interface/ext/resources/themes/images/access/dd/drop-between.gif b/interface/ext/resources/themes/images/access/dd/drop-between.gif
new file mode 100755
index 0000000..5c6c09d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/dd/drop-between.gif differ
diff --git a/interface/ext/resources/themes/images/access/dd/drop-no.gif b/interface/ext/resources/themes/images/access/dd/drop-no.gif
new file mode 100755
index 0000000..9d9c6a9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/dd/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/access/dd/drop-over.gif b/interface/ext/resources/themes/images/access/dd/drop-over.gif
new file mode 100755
index 0000000..30d1ca7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/dd/drop-over.gif differ
diff --git a/interface/ext/resources/themes/images/access/dd/drop-under.gif b/interface/ext/resources/themes/images/access/dd/drop-under.gif
new file mode 100755
index 0000000..85f66b1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/dd/drop-under.gif differ
diff --git a/interface/ext/resources/themes/images/access/dd/drop-yes.gif b/interface/ext/resources/themes/images/access/dd/drop-yes.gif
new file mode 100755
index 0000000..8aacb30
Binary files /dev/null and b/interface/ext/resources/themes/images/access/dd/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/access/editor/tb-sprite.gif b/interface/ext/resources/themes/images/access/editor/tb-sprite.gif
new file mode 100755
index 0000000..bd4011d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/editor/tb-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/form-invalid-tip/form-invalid-tip-default-corners.gif b/interface/ext/resources/themes/images/access/form-invalid-tip/form-invalid-tip-default-corners.gif
new file mode 100755
index 0000000..b817887
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form-invalid-tip/form-invalid-tip-default-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/form-invalid-tip/form-invalid-tip-default-sides.gif b/interface/ext/resources/themes/images/access/form-invalid-tip/form-invalid-tip-default-sides.gif
new file mode 100755
index 0000000..bd64f32
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form-invalid-tip/form-invalid-tip-default-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/checkbox.gif b/interface/ext/resources/themes/images/access/form/checkbox.gif
new file mode 100755
index 0000000..baf44f9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/checkbox.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/checkbox_.gif b/interface/ext/resources/themes/images/access/form/checkbox_.gif
new file mode 100755
index 0000000..835b346
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/checkbox_.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/clear-trigger.gif b/interface/ext/resources/themes/images/access/form/clear-trigger.gif
new file mode 100755
index 0000000..9bfd184
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/clear-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/date-trigger.gif b/interface/ext/resources/themes/images/access/form/date-trigger.gif
new file mode 100755
index 0000000..048506d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/date-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/error-tip-corners.gif b/interface/ext/resources/themes/images/access/form/error-tip-corners.gif
new file mode 100755
index 0000000..6ea4c38
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/error-tip-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/exclamation.gif b/interface/ext/resources/themes/images/access/form/exclamation.gif
new file mode 100755
index 0000000..daa88b8
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/exclamation.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/radio.gif b/interface/ext/resources/themes/images/access/form/radio.gif
new file mode 100755
index 0000000..1d7fd15
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/radio.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/radio_.gif b/interface/ext/resources/themes/images/access/form/radio_.gif
new file mode 100755
index 0000000..36bb91d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/radio_.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/search-trigger.gif b/interface/ext/resources/themes/images/access/form/search-trigger.gif
new file mode 100755
index 0000000..ab8b3b4
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/search-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/spinner-small.gif b/interface/ext/resources/themes/images/access/form/spinner-small.gif
new file mode 100755
index 0000000..c0944f9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/spinner-small.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/spinner.gif b/interface/ext/resources/themes/images/access/form/spinner.gif
new file mode 100755
index 0000000..c0944f9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/spinner.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/spinner_.gif b/interface/ext/resources/themes/images/access/form/spinner_.gif
new file mode 100755
index 0000000..f8c5ab5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/spinner_.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/text-bg.gif b/interface/ext/resources/themes/images/access/form/text-bg.gif
new file mode 100755
index 0000000..4ce90bb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/text-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/trigger-tpl.gif b/interface/ext/resources/themes/images/access/form/trigger-tpl.gif
new file mode 100755
index 0000000..2574ead
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/trigger-tpl.gif differ
diff --git a/interface/ext/resources/themes/images/access/form/trigger.gif b/interface/ext/resources/themes/images/access/form/trigger.gif
new file mode 100755
index 0000000..bd25572
Binary files /dev/null and b/interface/ext/resources/themes/images/access/form/trigger.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/arrow-left-white.gif b/interface/ext/resources/themes/images/access/grid/arrow-left-white.gif
new file mode 100755
index 0000000..63088f5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/arrow-left-white.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/arrow-right-white.gif b/interface/ext/resources/themes/images/access/grid/arrow-right-white.gif
new file mode 100755
index 0000000..e9e0678
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/arrow-right-white.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/cell-special-bg.gif b/interface/ext/resources/themes/images/access/grid/cell-special-bg.gif
new file mode 100755
index 0000000..d76ffbc
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/cell-special-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/cell-special-selected-bg.gif b/interface/ext/resources/themes/images/access/grid/cell-special-selected-bg.gif
new file mode 100755
index 0000000..291a404
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/cell-special-selected-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/checked.gif b/interface/ext/resources/themes/images/access/grid/checked.gif
new file mode 100755
index 0000000..fad5893
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/checked.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/col-move-bottom.gif b/interface/ext/resources/themes/images/access/grid/col-move-bottom.gif
new file mode 100755
index 0000000..cc1e473
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/col-move-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/col-move-top.gif b/interface/ext/resources/themes/images/access/grid/col-move-top.gif
new file mode 100755
index 0000000..58ff32c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/col-move-top.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/column-header-bg.gif b/interface/ext/resources/themes/images/access/grid/column-header-bg.gif
new file mode 100755
index 0000000..707f6f1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/column-header-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/column-header-over-bg.gif b/interface/ext/resources/themes/images/access/grid/column-header-over-bg.gif
new file mode 100755
index 0000000..8c66304
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/column-header-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/columns.gif b/interface/ext/resources/themes/images/access/grid/columns.gif
new file mode 100755
index 0000000..2d3a823
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/columns.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-left.gif b/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-left.gif
new file mode 100755
index 0000000..5d923b2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-left.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-left.png b/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-left.png
new file mode 100755
index 0000000..5dc6967
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-left.png differ
diff --git a/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-right.gif b/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-right.gif
new file mode 100755
index 0000000..8d154db
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-right.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-right.png b/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-right.png
new file mode 100755
index 0000000..b1a1819
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/dd-insert-arrow-right.png differ
diff --git a/interface/ext/resources/themes/images/access/grid/dirty.gif b/interface/ext/resources/themes/images/access/grid/dirty.gif
new file mode 100755
index 0000000..d524ee5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/dirty.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/done.gif b/interface/ext/resources/themes/images/access/grid/done.gif
new file mode 100755
index 0000000..a937cb2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/done.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/drop-no.gif b/interface/ext/resources/themes/images/access/grid/drop-no.gif
new file mode 100755
index 0000000..31a332b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/drop-yes.gif b/interface/ext/resources/themes/images/access/grid/drop-yes.gif
new file mode 100755
index 0000000..926010e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/footer-bg.gif b/interface/ext/resources/themes/images/access/grid/footer-bg.gif
new file mode 100755
index 0000000..126120f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/footer-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid-blue-hd.gif b/interface/ext/resources/themes/images/access/grid/grid-blue-hd.gif
new file mode 100755
index 0000000..862094e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid-blue-hd.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid-blue-split.gif b/interface/ext/resources/themes/images/access/grid/grid-blue-split.gif
new file mode 100755
index 0000000..1b0bae3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid-blue-split.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid-hrow.gif b/interface/ext/resources/themes/images/access/grid/grid-hrow.gif
new file mode 100755
index 0000000..6374104
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid-hrow.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid-loading.gif b/interface/ext/resources/themes/images/access/grid/grid-loading.gif
new file mode 100755
index 0000000..d112c54
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid-loading.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid-split.gif b/interface/ext/resources/themes/images/access/grid/grid-split.gif
new file mode 100755
index 0000000..c76a16e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid-split.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid-vista-hd.gif b/interface/ext/resources/themes/images/access/grid/grid-vista-hd.gif
new file mode 100755
index 0000000..d097263
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid-vista-hd.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid3-hd-btn.gif b/interface/ext/resources/themes/images/access/grid/grid3-hd-btn.gif
new file mode 100755
index 0000000..9ecd650
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid3-hd-btn.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid3-hrow-over.gif b/interface/ext/resources/themes/images/access/grid/grid3-hrow-over.gif
new file mode 100755
index 0000000..0405f6c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid3-hrow-over.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid3-hrow.gif b/interface/ext/resources/themes/images/access/grid/grid3-hrow.gif
new file mode 100755
index 0000000..509737a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid3-hrow.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid3-special-col-bg.gif b/interface/ext/resources/themes/images/access/grid/grid3-special-col-bg.gif
new file mode 100755
index 0000000..8ec57f5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid3-special-col-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/grid3-special-col-sel-bg.gif b/interface/ext/resources/themes/images/access/grid/grid3-special-col-sel-bg.gif
new file mode 100755
index 0000000..93a9ca6
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/grid3-special-col-sel-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/group-by.gif b/interface/ext/resources/themes/images/access/grid/group-by.gif
new file mode 100755
index 0000000..d6075bb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/group-by.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/group-collapse.gif b/interface/ext/resources/themes/images/access/grid/group-collapse.gif
new file mode 100755
index 0000000..9bd255e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/group-collapse.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/group-expand-sprite.gif b/interface/ext/resources/themes/images/access/grid/group-expand-sprite.gif
new file mode 100755
index 0000000..f230489
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/group-expand-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/group-expand.gif b/interface/ext/resources/themes/images/access/grid/group-expand.gif
new file mode 100755
index 0000000..fd22e6b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/group-expand.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/hd-pop.gif b/interface/ext/resources/themes/images/access/grid/hd-pop.gif
new file mode 100755
index 0000000..eb8ba79
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/hd-pop.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/hmenu-asc.gif b/interface/ext/resources/themes/images/access/grid/hmenu-asc.gif
new file mode 100755
index 0000000..8917e0e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/hmenu-asc.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/hmenu-desc.gif b/interface/ext/resources/themes/images/access/grid/hmenu-desc.gif
new file mode 100755
index 0000000..f26b7c2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/hmenu-desc.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/hmenu-lock.gif b/interface/ext/resources/themes/images/access/grid/hmenu-lock.gif
new file mode 100755
index 0000000..1596126
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/hmenu-lock.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/hmenu-lock.png b/interface/ext/resources/themes/images/access/grid/hmenu-lock.png
new file mode 100755
index 0000000..8b81e7f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/hmenu-lock.png differ
diff --git a/interface/ext/resources/themes/images/access/grid/hmenu-unlock.gif b/interface/ext/resources/themes/images/access/grid/hmenu-unlock.gif
new file mode 100755
index 0000000..af59cf9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/hmenu-unlock.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/hmenu-unlock.png b/interface/ext/resources/themes/images/access/grid/hmenu-unlock.png
new file mode 100755
index 0000000..9dd5df3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/hmenu-unlock.png differ
diff --git a/interface/ext/resources/themes/images/access/grid/invalid_line.gif b/interface/ext/resources/themes/images/access/grid/invalid_line.gif
new file mode 100755
index 0000000..025cffc
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/invalid_line.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/loading.gif b/interface/ext/resources/themes/images/access/grid/loading.gif
new file mode 100755
index 0000000..e846e1d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/loading.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/mso-hd.gif b/interface/ext/resources/themes/images/access/grid/mso-hd.gif
new file mode 100755
index 0000000..669f3cf
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/mso-hd.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/nowait.gif b/interface/ext/resources/themes/images/access/grid/nowait.gif
new file mode 100755
index 0000000..4c5862c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/nowait.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/page-first-disabled.gif b/interface/ext/resources/themes/images/access/grid/page-first-disabled.gif
new file mode 100755
index 0000000..e4df7a7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/page-first-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/page-first.gif b/interface/ext/resources/themes/images/access/grid/page-first.gif
new file mode 100755
index 0000000..aa0a822
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/page-first.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/page-last-disabled.gif b/interface/ext/resources/themes/images/access/grid/page-last-disabled.gif
new file mode 100755
index 0000000..67fee75
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/page-last-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/page-last.gif b/interface/ext/resources/themes/images/access/grid/page-last.gif
new file mode 100755
index 0000000..e0cf111
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/page-last.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/page-next-disabled.gif b/interface/ext/resources/themes/images/access/grid/page-next-disabled.gif
new file mode 100755
index 0000000..e3e8e87
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/page-next-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/page-next.gif b/interface/ext/resources/themes/images/access/grid/page-next.gif
new file mode 100755
index 0000000..69899c0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/page-next.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/page-prev-disabled.gif b/interface/ext/resources/themes/images/access/grid/page-prev-disabled.gif
new file mode 100755
index 0000000..0f94bf7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/page-prev-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/page-prev.gif b/interface/ext/resources/themes/images/access/grid/page-prev.gif
new file mode 100755
index 0000000..289b126
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/page-prev.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/pick-button.gif b/interface/ext/resources/themes/images/access/grid/pick-button.gif
new file mode 100755
index 0000000..6957924
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/pick-button.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/property-cell-bg.gif b/interface/ext/resources/themes/images/access/grid/property-cell-bg.gif
new file mode 100755
index 0000000..77d029f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/property-cell-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/refresh-disabled.gif b/interface/ext/resources/themes/images/access/grid/refresh-disabled.gif
new file mode 100755
index 0000000..607800b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/refresh-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/refresh.gif b/interface/ext/resources/themes/images/access/grid/refresh.gif
new file mode 100755
index 0000000..8435d1e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/refresh.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/row-check-sprite.gif b/interface/ext/resources/themes/images/access/grid/row-check-sprite.gif
new file mode 100755
index 0000000..6101164
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/row-check-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/row-expand-sprite.gif b/interface/ext/resources/themes/images/access/grid/row-expand-sprite.gif
new file mode 100755
index 0000000..6f4d874
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/row-expand-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/row-over.gif b/interface/ext/resources/themes/images/access/grid/row-over.gif
new file mode 100755
index 0000000..b288e38
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/row-over.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/row-sel.gif b/interface/ext/resources/themes/images/access/grid/row-sel.gif
new file mode 100755
index 0000000..98209e6
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/row-sel.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/sort-hd.gif b/interface/ext/resources/themes/images/access/grid/sort-hd.gif
new file mode 100755
index 0000000..681628f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/sort-hd.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/sort_asc.gif b/interface/ext/resources/themes/images/access/grid/sort_asc.gif
new file mode 100755
index 0000000..371f5e4
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/sort_asc.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/sort_desc.gif b/interface/ext/resources/themes/images/access/grid/sort_desc.gif
new file mode 100755
index 0000000..000e363
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/sort_desc.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/unchecked.gif b/interface/ext/resources/themes/images/access/grid/unchecked.gif
new file mode 100755
index 0000000..43823e5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/unchecked.gif differ
diff --git a/interface/ext/resources/themes/images/access/grid/wait.gif b/interface/ext/resources/themes/images/access/grid/wait.gif
new file mode 100755
index 0000000..471c1a4
Binary files /dev/null and b/interface/ext/resources/themes/images/access/grid/wait.gif differ
diff --git a/interface/ext/resources/themes/images/access/layout/mini-bottom.gif b/interface/ext/resources/themes/images/access/layout/mini-bottom.gif
new file mode 100755
index 0000000..c18f9e3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/layout/mini-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/access/layout/mini-left.gif b/interface/ext/resources/themes/images/access/layout/mini-left.gif
new file mode 100755
index 0000000..99f7993
Binary files /dev/null and b/interface/ext/resources/themes/images/access/layout/mini-left.gif differ
diff --git a/interface/ext/resources/themes/images/access/layout/mini-right.gif b/interface/ext/resources/themes/images/access/layout/mini-right.gif
new file mode 100755
index 0000000..5b13c5a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/layout/mini-right.gif differ
diff --git a/interface/ext/resources/themes/images/access/layout/mini-top.gif b/interface/ext/resources/themes/images/access/layout/mini-top.gif
new file mode 100755
index 0000000..a4ca2bb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/layout/mini-top.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/checked.gif b/interface/ext/resources/themes/images/access/menu/checked.gif
new file mode 100755
index 0000000..fad5893
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/checked.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/group-checked.gif b/interface/ext/resources/themes/images/access/menu/group-checked.gif
new file mode 100755
index 0000000..d8b08f5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/group-checked.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/item-over.gif b/interface/ext/resources/themes/images/access/menu/item-over.gif
new file mode 100755
index 0000000..0167839
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/item-over.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/menu-item-active-bg.gif b/interface/ext/resources/themes/images/access/menu/menu-item-active-bg.gif
new file mode 100755
index 0000000..bd6c83b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/menu-item-active-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/menu-item-active-corners.gif b/interface/ext/resources/themes/images/access/menu/menu-item-active-corners.gif
new file mode 100755
index 0000000..0df1469
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/menu-item-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/menu-item-active-sides.gif b/interface/ext/resources/themes/images/access/menu/menu-item-active-sides.gif
new file mode 100755
index 0000000..1894f23
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/menu-item-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/menu-parent.gif b/interface/ext/resources/themes/images/access/menu/menu-parent.gif
new file mode 100755
index 0000000..49286cd
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/menu-parent.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/menu.gif b/interface/ext/resources/themes/images/access/menu/menu.gif
new file mode 100755
index 0000000..9bb3960
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/menu.gif differ
diff --git a/interface/ext/resources/themes/images/access/menu/unchecked.gif b/interface/ext/resources/themes/images/access/menu/unchecked.gif
new file mode 100755
index 0000000..43823e5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/menu/unchecked.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-bg.gif
new file mode 100755
index 0000000..30b7e77
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-bottom-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-bottom-bg.gif
new file mode 100755
index 0000000..2c2eb4f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-bg.gif
new file mode 100755
index 0000000..58049d5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-corners.gif
new file mode 100755
index 0000000..7971476
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-bg.gif
new file mode 100755
index 0000000..a649fb0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-corners.gif
new file mode 100755
index 0000000..310bd7b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-sides.gif
new file mode 100755
index 0000000..fa628e8
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-noborder-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-sides.gif
new file mode 100755
index 0000000..cf03b6d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif
new file mode 100755
index 0000000..e5e1d34
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif
new file mode 100755
index 0000000..9f136e1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif
new file mode 100755
index 0000000..4b92e43
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-bg.gif
new file mode 100755
index 0000000..a7069fe
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-corners.gif
new file mode 100755
index 0000000..d58e9fd
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-sides.gif
new file mode 100755
index 0000000..275b158
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-bg.gif
new file mode 100755
index 0000000..ef6d339
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-corners.gif
new file mode 100755
index 0000000..7405d51
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-sides.gif
new file mode 100755
index 0000000..2c3fd36
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-bg.gif
new file mode 100755
index 0000000..35d9129
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-corners.gif
new file mode 100755
index 0000000..42d67f3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-sides.gif
new file mode 100755
index 0000000..6764adb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-collapsed-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-bg.gif
new file mode 100755
index 0000000..f891c0c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-corners.gif
new file mode 100755
index 0000000..dbc2200
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-bg.gif
new file mode 100755
index 0000000..ae97f9b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-corners.gif
new file mode 100755
index 0000000..932c0a0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-sides.gif
new file mode 100755
index 0000000..12d4d70
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-noborder-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-sides.gif
new file mode 100755
index 0000000..83e96ff
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-bg.gif
new file mode 100755
index 0000000..d2d02e5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-corners.gif
new file mode 100755
index 0000000..f37fc88
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-bg.gif
new file mode 100755
index 0000000..bbbb021
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-corners.gif
new file mode 100755
index 0000000..9048968
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-sides.gif
new file mode 100755
index 0000000..b1cb5be
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-noborder-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-sides.gif
new file mode 100755
index 0000000..5e69a27
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-bg.gif
new file mode 100755
index 0000000..938a755
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-corners.gif
new file mode 100755
index 0000000..e1ad0d7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-bg.gif
new file mode 100755
index 0000000..0dfb0f3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-corners.gif
new file mode 100755
index 0000000..4096f03
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-sides.gif
new file mode 100755
index 0000000..de2fbbb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-noborder-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-sides.gif
new file mode 100755
index 0000000..35c2fa5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-framed-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-left-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-left-bg.gif
new file mode 100755
index 0000000..330d689
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-right-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-right-bg.gif
new file mode 100755
index 0000000..d95ba74
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-default-top-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-top-bg.gif
new file mode 100755
index 0000000..f95a4dd
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-default-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-bg.gif
new file mode 100755
index 0000000..524cdfb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-corners.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-corners.gif
new file mode 100755
index 0000000..eb27561
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-sides.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-sides.gif
new file mode 100755
index 0000000..f92110a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel-header/panel-header-vertical-bg.gif b/interface/ext/resources/themes/images/access/panel-header/panel-header-vertical-bg.gif
new file mode 100755
index 0000000..410c9ee
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel-header/panel-header-vertical-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/corners-sprite.gif b/interface/ext/resources/themes/images/access/panel/corners-sprite.gif
new file mode 100755
index 0000000..43e2862
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/corners-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/left-right.gif b/interface/ext/resources/themes/images/access/panel/left-right.gif
new file mode 100755
index 0000000..51850b7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/left-right.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/light-hd.gif b/interface/ext/resources/themes/images/access/panel/light-hd.gif
new file mode 100755
index 0000000..660bedb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/light-hd.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/panel-default-framed-corners.gif b/interface/ext/resources/themes/images/access/panel/panel-default-framed-corners.gif
new file mode 100755
index 0000000..c0985ea
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/panel-default-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/panel-default-framed-noborder-corners.gif b/interface/ext/resources/themes/images/access/panel/panel-default-framed-noborder-corners.gif
new file mode 100755
index 0000000..087079f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/panel-default-framed-noborder-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/panel-default-framed-noborder-sides.gif b/interface/ext/resources/themes/images/access/panel/panel-default-framed-noborder-sides.gif
new file mode 100755
index 0000000..f4d4736
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/panel-default-framed-noborder-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/panel-default-framed-sides.gif b/interface/ext/resources/themes/images/access/panel/panel-default-framed-sides.gif
new file mode 100755
index 0000000..1676cd1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/panel-default-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/panel-framed-corners.gif b/interface/ext/resources/themes/images/access/panel/panel-framed-corners.gif
new file mode 100755
index 0000000..ca1184f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/panel-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/panel-framed-sides.gif b/interface/ext/resources/themes/images/access/panel/panel-framed-sides.gif
new file mode 100755
index 0000000..3efa308
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/panel-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/tool-sprite-tpl.gif b/interface/ext/resources/themes/images/access/panel/tool-sprite-tpl.gif
new file mode 100755
index 0000000..e647867
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/tool-sprite-tpl.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/tool-sprites.gif b/interface/ext/resources/themes/images/access/panel/tool-sprites.gif
new file mode 100755
index 0000000..a3ffe58
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/tool-sprites.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/tools-sprites-trans.gif b/interface/ext/resources/themes/images/access/panel/tools-sprites-trans.gif
new file mode 100755
index 0000000..ead931e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/tools-sprites-trans.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/top-bottom.gif b/interface/ext/resources/themes/images/access/panel/top-bottom.gif
new file mode 100755
index 0000000..6b2649d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/top-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/white-corners-sprite.gif b/interface/ext/resources/themes/images/access/panel/white-corners-sprite.gif
new file mode 100755
index 0000000..22d4bba
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/white-corners-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/white-left-right.gif b/interface/ext/resources/themes/images/access/panel/white-left-right.gif
new file mode 100755
index 0000000..51850b7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/white-left-right.gif differ
diff --git a/interface/ext/resources/themes/images/access/panel/white-top-bottom.gif b/interface/ext/resources/themes/images/access/panel/white-top-bottom.gif
new file mode 100755
index 0000000..08f8fae
Binary files /dev/null and b/interface/ext/resources/themes/images/access/panel/white-top-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/access/progress/progress-default-bg.gif b/interface/ext/resources/themes/images/access/progress/progress-default-bg.gif
new file mode 100755
index 0000000..ade77c1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/progress/progress-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/qtip/close.gif b/interface/ext/resources/themes/images/access/qtip/close.gif
new file mode 100755
index 0000000..69ab915
Binary files /dev/null and b/interface/ext/resources/themes/images/access/qtip/close.gif differ
diff --git a/interface/ext/resources/themes/images/access/qtip/tip-anchor-sprite.gif b/interface/ext/resources/themes/images/access/qtip/tip-anchor-sprite.gif
new file mode 100755
index 0000000..f46d31d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/qtip/tip-anchor-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/qtip/tip-sprite.gif b/interface/ext/resources/themes/images/access/qtip/tip-sprite.gif
new file mode 100755
index 0000000..9f6a629
Binary files /dev/null and b/interface/ext/resources/themes/images/access/qtip/tip-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/blue-loading.gif b/interface/ext/resources/themes/images/access/shared/blue-loading.gif
new file mode 100755
index 0000000..3bbf639
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/blue-loading.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/glass-bg.gif b/interface/ext/resources/themes/images/access/shared/glass-bg.gif
new file mode 100755
index 0000000..ed3c886
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/glass-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/hd-sprite.gif b/interface/ext/resources/themes/images/access/shared/hd-sprite.gif
new file mode 100755
index 0000000..446be92
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/hd-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/icon-error.gif b/interface/ext/resources/themes/images/access/shared/icon-error.gif
new file mode 100755
index 0000000..397b655
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/icon-error.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/icon-info.gif b/interface/ext/resources/themes/images/access/shared/icon-info.gif
new file mode 100755
index 0000000..58281c3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/icon-info.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/icon-question.gif b/interface/ext/resources/themes/images/access/shared/icon-question.gif
new file mode 100755
index 0000000..08abd82
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/icon-question.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/icon-warning.gif b/interface/ext/resources/themes/images/access/shared/icon-warning.gif
new file mode 100755
index 0000000..27ff98b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/icon-warning.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/large-loading.gif b/interface/ext/resources/themes/images/access/shared/large-loading.gif
new file mode 100755
index 0000000..b36b555
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/large-loading.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/left-btn.gif b/interface/ext/resources/themes/images/access/shared/left-btn.gif
new file mode 100755
index 0000000..0622439
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/left-btn.gif differ
diff --git a/interface/ext/resources/themes/images/access/shared/right-btn.gif b/interface/ext/resources/themes/images/access/shared/right-btn.gif
new file mode 100755
index 0000000..5e3215d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/shared/right-btn.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/e-handle-dark.gif b/interface/ext/resources/themes/images/access/sizer/e-handle-dark.gif
new file mode 100755
index 0000000..70aad3f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/e-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/e-handle.gif b/interface/ext/resources/themes/images/access/sizer/e-handle.gif
new file mode 100755
index 0000000..52c045e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/e-handle.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/ne-handle-dark.gif b/interface/ext/resources/themes/images/access/sizer/ne-handle-dark.gif
new file mode 100755
index 0000000..3a30ca2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/ne-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/ne-handle.gif b/interface/ext/resources/themes/images/access/sizer/ne-handle.gif
new file mode 100755
index 0000000..e48f9f9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/ne-handle.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/nw-handle-dark.gif b/interface/ext/resources/themes/images/access/sizer/nw-handle-dark.gif
new file mode 100755
index 0000000..5ea8b51
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/nw-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/nw-handle.gif b/interface/ext/resources/themes/images/access/sizer/nw-handle.gif
new file mode 100755
index 0000000..65d5cc2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/nw-handle.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/s-handle-dark.gif b/interface/ext/resources/themes/images/access/sizer/s-handle-dark.gif
new file mode 100755
index 0000000..421b534
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/s-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/s-handle.gif b/interface/ext/resources/themes/images/access/sizer/s-handle.gif
new file mode 100755
index 0000000..2b635de
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/s-handle.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/se-handle-dark.gif b/interface/ext/resources/themes/images/access/sizer/se-handle-dark.gif
new file mode 100755
index 0000000..881a5c4
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/se-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/se-handle.gif b/interface/ext/resources/themes/images/access/sizer/se-handle.gif
new file mode 100755
index 0000000..5f1e3b8
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/se-handle.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/square.gif b/interface/ext/resources/themes/images/access/sizer/square.gif
new file mode 100755
index 0000000..4dc5a2d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/square.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/sw-handle-dark.gif b/interface/ext/resources/themes/images/access/sizer/sw-handle-dark.gif
new file mode 100755
index 0000000..030d8f8
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/sw-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/access/sizer/sw-handle.gif b/interface/ext/resources/themes/images/access/sizer/sw-handle.gif
new file mode 100755
index 0000000..79bcb84
Binary files /dev/null and b/interface/ext/resources/themes/images/access/sizer/sw-handle.gif differ
diff --git a/interface/ext/resources/themes/images/access/slider/slider-bg.gif b/interface/ext/resources/themes/images/access/slider/slider-bg.gif
new file mode 100755
index 0000000..50b7624
Binary files /dev/null and b/interface/ext/resources/themes/images/access/slider/slider-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/slider/slider-bg.png b/interface/ext/resources/themes/images/access/slider/slider-bg.png
new file mode 100755
index 0000000..d213754
Binary files /dev/null and b/interface/ext/resources/themes/images/access/slider/slider-bg.png differ
diff --git a/interface/ext/resources/themes/images/access/slider/slider-thumb.gif b/interface/ext/resources/themes/images/access/slider/slider-thumb.gif
new file mode 100755
index 0000000..d7dadda
Binary files /dev/null and b/interface/ext/resources/themes/images/access/slider/slider-thumb.gif differ
diff --git a/interface/ext/resources/themes/images/access/slider/slider-thumb.png b/interface/ext/resources/themes/images/access/slider/slider-thumb.png
new file mode 100755
index 0000000..4991a74
Binary files /dev/null and b/interface/ext/resources/themes/images/access/slider/slider-thumb.png differ
diff --git a/interface/ext/resources/themes/images/access/slider/slider-v-bg.gif b/interface/ext/resources/themes/images/access/slider/slider-v-bg.gif
new file mode 100755
index 0000000..70b70ad
Binary files /dev/null and b/interface/ext/resources/themes/images/access/slider/slider-v-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/slider/slider-v-bg.png b/interface/ext/resources/themes/images/access/slider/slider-v-bg.png
new file mode 100755
index 0000000..f1221c4
Binary files /dev/null and b/interface/ext/resources/themes/images/access/slider/slider-v-bg.png differ
diff --git a/interface/ext/resources/themes/images/access/slider/slider-v-thumb.gif b/interface/ext/resources/themes/images/access/slider/slider-v-thumb.gif
new file mode 100755
index 0000000..7478fad
Binary files /dev/null and b/interface/ext/resources/themes/images/access/slider/slider-v-thumb.gif differ
diff --git a/interface/ext/resources/themes/images/access/slider/slider-v-thumb.png b/interface/ext/resources/themes/images/access/slider/slider-v-thumb.png
new file mode 100755
index 0000000..e0c0e27
Binary files /dev/null and b/interface/ext/resources/themes/images/access/slider/slider-v-thumb.png differ
diff --git a/interface/ext/resources/themes/images/access/spinner.gif b/interface/ext/resources/themes/images/access/spinner.gif
new file mode 100755
index 0000000..f764d31
Binary files /dev/null and b/interface/ext/resources/themes/images/access/spinner.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab-bar/scroll-left.gif b/interface/ext/resources/themes/images/access/tab-bar/scroll-left.gif
new file mode 100755
index 0000000..71a2e88
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab-bar/scroll-left.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab-bar/scroll-right.gif b/interface/ext/resources/themes/images/access/tab-bar/scroll-right.gif
new file mode 100755
index 0000000..8f3d659
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab-bar/scroll-right.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab-bar/tab-bar-default-bg.gif b/interface/ext/resources/themes/images/access/tab-bar/tab-bar-default-bg.gif
new file mode 100755
index 0000000..37e3369
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab-bar/tab-bar-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-bottom-active-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-bottom-active-corners.gif
new file mode 100755
index 0000000..c6fbc8c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-bottom-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-bottom-active-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-bottom-active-sides.gif
new file mode 100755
index 0000000..82fe92a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-bottom-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-bottom-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-bottom-corners.gif
new file mode 100755
index 0000000..cd3c32c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-bottom-disabled-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-bottom-disabled-corners.gif
new file mode 100755
index 0000000..aa733ef
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-bottom-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-bottom-disabled-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-bottom-disabled-sides.gif
new file mode 100755
index 0000000..305a1bb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-bottom-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-bottom-over-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-bottom-over-corners.gif
new file mode 100755
index 0000000..c21bb91
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-bottom-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-bottom-over-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-bottom-over-sides.gif
new file mode 100755
index 0000000..0a6ed0a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-bottom-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-bottom-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-bottom-sides.gif
new file mode 100755
index 0000000..f70390a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-bottom-active-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-active-corners.gif
new file mode 100755
index 0000000..82de9b2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-bottom-active-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-active-sides.gif
new file mode 100755
index 0000000..1ff28ac
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-bottom-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-corners.gif
new file mode 100755
index 0000000..8164892
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-bottom-disabled-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-disabled-corners.gif
new file mode 100755
index 0000000..6fbe9e3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-bottom-disabled-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-disabled-sides.gif
new file mode 100755
index 0000000..f4740f3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-bottom-over-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-over-corners.gif
new file mode 100755
index 0000000..a606de4
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-bottom-over-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-over-sides.gif
new file mode 100755
index 0000000..6cb80a2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-bottom-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-sides.gif
new file mode 100755
index 0000000..122f7e7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-top-active-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-default-top-active-corners.gif
new file mode 100755
index 0000000..d999e09
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-top-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-top-active-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-default-top-active-sides.gif
new file mode 100755
index 0000000..c7c6189
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-top-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-top-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-default-top-corners.gif
new file mode 100755
index 0000000..fac36a9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-top-disabled-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-default-top-disabled-corners.gif
new file mode 100755
index 0000000..e71c109
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-top-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-top-disabled-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-default-top-disabled-sides.gif
new file mode 100755
index 0000000..d7cd0d7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-top-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-top-over-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-default-top-over-corners.gif
new file mode 100755
index 0000000..9685325
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-top-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-top-over-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-default-top-over-sides.gif
new file mode 100755
index 0000000..d9bf081
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-top-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-default-top-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-default-top-sides.gif
new file mode 100755
index 0000000..8394350
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-default-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-top-active-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-top-active-corners.gif
new file mode 100755
index 0000000..cf98156
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-top-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-top-active-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-top-active-sides.gif
new file mode 100755
index 0000000..1b27451
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-top-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-top-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-top-corners.gif
new file mode 100755
index 0000000..53babd7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-top-disabled-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-top-disabled-corners.gif
new file mode 100755
index 0000000..bf6e742
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-top-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-top-disabled-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-top-disabled-sides.gif
new file mode 100755
index 0000000..229b1d2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-top-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-top-over-corners.gif b/interface/ext/resources/themes/images/access/tab/tab-top-over-corners.gif
new file mode 100755
index 0000000..a17354d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-top-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-top-over-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-top-over-sides.gif
new file mode 100755
index 0000000..b13c25a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-top-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tab/tab-top-sides.gif b/interface/ext/resources/themes/images/access/tab/tab-top-sides.gif
new file mode 100755
index 0000000..0744024
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tab/tab-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tabs/tab-btm-inactive-left-bg.gif b/interface/ext/resources/themes/images/access/tabs/tab-btm-inactive-left-bg.gif
new file mode 100755
index 0000000..687af2b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tabs/tab-btm-inactive-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/tabs/tab-btm-inactive-right-bg.gif b/interface/ext/resources/themes/images/access/tabs/tab-btm-inactive-right-bg.gif
new file mode 100755
index 0000000..3c1b3eb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tabs/tab-btm-inactive-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/tabs/tab-btm-left-bg.gif b/interface/ext/resources/themes/images/access/tabs/tab-btm-left-bg.gif
new file mode 100755
index 0000000..e5f827a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tabs/tab-btm-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/tabs/tab-btm-right-bg.gif b/interface/ext/resources/themes/images/access/tabs/tab-btm-right-bg.gif
new file mode 100755
index 0000000..2551f4c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tabs/tab-btm-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/tabs/tab-close.gif b/interface/ext/resources/themes/images/access/tabs/tab-close.gif
new file mode 100755
index 0000000..ef9a7c2
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tabs/tab-close.gif differ
diff --git a/interface/ext/resources/themes/images/access/tabs/tab-strip-bg.gif b/interface/ext/resources/themes/images/access/tabs/tab-strip-bg.gif
new file mode 100755
index 0000000..fc1fdcd
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tabs/tab-strip-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/tabs/tab-strip-btm-bg.gif b/interface/ext/resources/themes/images/access/tabs/tab-strip-btm-bg.gif
new file mode 100755
index 0000000..a151553
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tabs/tab-strip-btm-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/tabs/tabs-sprite.gif b/interface/ext/resources/themes/images/access/tabs/tabs-sprite.gif
new file mode 100755
index 0000000..8194001
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tabs/tabs-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/tip/tip-corners.gif b/interface/ext/resources/themes/images/access/tip/tip-corners.gif
new file mode 100755
index 0000000..dd2901c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tip/tip-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/tip/tip-corners.png b/interface/ext/resources/themes/images/access/tip/tip-corners.png
new file mode 100755
index 0000000..4454e54
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tip/tip-corners.png differ
diff --git a/interface/ext/resources/themes/images/access/tip/tip-sides.gif b/interface/ext/resources/themes/images/access/tip/tip-sides.gif
new file mode 100755
index 0000000..27360d6
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tip/tip-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/tip/tip-sides.png b/interface/ext/resources/themes/images/access/tip/tip-sides.png
new file mode 100755
index 0000000..dc4b87d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tip/tip-sides.png differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/bg.gif b/interface/ext/resources/themes/images/access/toolbar/bg.gif
new file mode 100755
index 0000000..b67a54e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/btn-arrow-light.gif b/interface/ext/resources/themes/images/access/toolbar/btn-arrow-light.gif
new file mode 100755
index 0000000..b0e24b5
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/btn-arrow-light.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/btn-arrow.gif b/interface/ext/resources/themes/images/access/toolbar/btn-arrow.gif
new file mode 100755
index 0000000..8acb460
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/btn-arrow.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/btn-over-bg.gif b/interface/ext/resources/themes/images/access/toolbar/btn-over-bg.gif
new file mode 100755
index 0000000..ee2dd98
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/btn-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/gray-bg.gif b/interface/ext/resources/themes/images/access/toolbar/gray-bg.gif
new file mode 100755
index 0000000..bd49438
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/gray-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/more.gif b/interface/ext/resources/themes/images/access/toolbar/more.gif
new file mode 100755
index 0000000..4f01020
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/more.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/s-arrow-bo.gif b/interface/ext/resources/themes/images/access/toolbar/s-arrow-bo.gif
new file mode 100755
index 0000000..1505edd
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/s-arrow-bo.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/scroll-left.gif b/interface/ext/resources/themes/images/access/toolbar/scroll-left.gif
new file mode 100755
index 0000000..71a2e88
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/scroll-left.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/scroll-right.gif b/interface/ext/resources/themes/images/access/toolbar/scroll-right.gif
new file mode 100755
index 0000000..8f3d659
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/scroll-right.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/tb-btn-sprite.gif b/interface/ext/resources/themes/images/access/toolbar/tb-btn-sprite.gif
new file mode 100755
index 0000000..19bbef3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/tb-btn-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/tb-xl-btn-sprite.gif b/interface/ext/resources/themes/images/access/toolbar/tb-xl-btn-sprite.gif
new file mode 100755
index 0000000..1bc0420
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/tb-xl-btn-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/tb-xl-sep.gif b/interface/ext/resources/themes/images/access/toolbar/tb-xl-sep.gif
new file mode 100755
index 0000000..30555ee
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/tb-xl-sep.gif differ
diff --git a/interface/ext/resources/themes/images/access/toolbar/toolbar-default-bg.gif b/interface/ext/resources/themes/images/access/toolbar/toolbar-default-bg.gif
new file mode 100755
index 0000000..57b73f0
Binary files /dev/null and b/interface/ext/resources/themes/images/access/toolbar/toolbar-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/access/tools/tool-sprite-tpl.gif b/interface/ext/resources/themes/images/access/tools/tool-sprite-tpl.gif
new file mode 100755
index 0000000..e647867
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tools/tool-sprite-tpl.gif differ
diff --git a/interface/ext/resources/themes/images/access/tools/tool-sprites.gif b/interface/ext/resources/themes/images/access/tools/tool-sprites.gif
new file mode 100755
index 0000000..a3ffe58
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tools/tool-sprites.gif differ
diff --git a/interface/ext/resources/themes/images/access/tools/tools-sprites-trans.gif b/interface/ext/resources/themes/images/access/tools/tools-sprites-trans.gif
new file mode 100755
index 0000000..ead931e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tools/tools-sprites-trans.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/arrows.gif b/interface/ext/resources/themes/images/access/tree/arrows.gif
new file mode 100755
index 0000000..2e635eb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/arrows.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-above.gif b/interface/ext/resources/themes/images/access/tree/drop-above.gif
new file mode 100755
index 0000000..30d1ca7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-above.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-add.gif b/interface/ext/resources/themes/images/access/tree/drop-add.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-add.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-append.gif b/interface/ext/resources/themes/images/access/tree/drop-append.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-append.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-below.gif b/interface/ext/resources/themes/images/access/tree/drop-below.gif
new file mode 100755
index 0000000..85f66b1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-below.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-between.gif b/interface/ext/resources/themes/images/access/tree/drop-between.gif
new file mode 100755
index 0000000..5c6c09d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-between.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-no.gif b/interface/ext/resources/themes/images/access/tree/drop-no.gif
new file mode 100755
index 0000000..9d9c6a9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-over.gif b/interface/ext/resources/themes/images/access/tree/drop-over.gif
new file mode 100755
index 0000000..30d1ca7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-over.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-under.gif b/interface/ext/resources/themes/images/access/tree/drop-under.gif
new file mode 100755
index 0000000..85f66b1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-under.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/drop-yes.gif b/interface/ext/resources/themes/images/access/tree/drop-yes.gif
new file mode 100755
index 0000000..8aacb30
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-end-minus-nl.gif b/interface/ext/resources/themes/images/access/tree/elbow-end-minus-nl.gif
new file mode 100755
index 0000000..b4ae595
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-end-minus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-end-minus.gif b/interface/ext/resources/themes/images/access/tree/elbow-end-minus.gif
new file mode 100755
index 0000000..514cf3e
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-end-minus.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-end-plus-nl.gif b/interface/ext/resources/themes/images/access/tree/elbow-end-plus-nl.gif
new file mode 100755
index 0000000..6af2e29
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-end-plus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-end-plus.gif b/interface/ext/resources/themes/images/access/tree/elbow-end-plus.gif
new file mode 100755
index 0000000..96df679
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-end-plus.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-end.gif b/interface/ext/resources/themes/images/access/tree/elbow-end.gif
new file mode 100755
index 0000000..f24ddee
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-end.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-line.gif b/interface/ext/resources/themes/images/access/tree/elbow-line.gif
new file mode 100755
index 0000000..75e6da4
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-line.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-minus-nl.gif b/interface/ext/resources/themes/images/access/tree/elbow-minus-nl.gif
new file mode 100755
index 0000000..b4ae595
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-minus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-minus.gif b/interface/ext/resources/themes/images/access/tree/elbow-minus.gif
new file mode 100755
index 0000000..68ba298
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-minus.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-plus-nl.gif b/interface/ext/resources/themes/images/access/tree/elbow-plus-nl.gif
new file mode 100755
index 0000000..6af2e29
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-plus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow-plus.gif b/interface/ext/resources/themes/images/access/tree/elbow-plus.gif
new file mode 100755
index 0000000..58ba9e4
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow-plus.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/elbow.gif b/interface/ext/resources/themes/images/access/tree/elbow.gif
new file mode 100755
index 0000000..b8f4208
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/elbow.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/folder-open.gif b/interface/ext/resources/themes/images/access/tree/folder-open.gif
new file mode 100755
index 0000000..7c52965
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/folder-open.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/folder.gif b/interface/ext/resources/themes/images/access/tree/folder.gif
new file mode 100755
index 0000000..501e75c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/folder.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/leaf.gif b/interface/ext/resources/themes/images/access/tree/leaf.gif
new file mode 100755
index 0000000..445769d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/leaf.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/loading.gif b/interface/ext/resources/themes/images/access/tree/loading.gif
new file mode 100755
index 0000000..e846e1d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/loading.gif differ
diff --git a/interface/ext/resources/themes/images/access/tree/s.gif b/interface/ext/resources/themes/images/access/tree/s.gif
new file mode 100755
index 0000000..1d11fa9
Binary files /dev/null and b/interface/ext/resources/themes/images/access/tree/s.gif differ
diff --git a/interface/ext/resources/themes/images/access/util/splitter/mini-bottom.gif b/interface/ext/resources/themes/images/access/util/splitter/mini-bottom.gif
new file mode 100755
index 0000000..c18f9e3
Binary files /dev/null and b/interface/ext/resources/themes/images/access/util/splitter/mini-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/access/util/splitter/mini-left.gif b/interface/ext/resources/themes/images/access/util/splitter/mini-left.gif
new file mode 100755
index 0000000..99f7993
Binary files /dev/null and b/interface/ext/resources/themes/images/access/util/splitter/mini-left.gif differ
diff --git a/interface/ext/resources/themes/images/access/util/splitter/mini-right.gif b/interface/ext/resources/themes/images/access/util/splitter/mini-right.gif
new file mode 100755
index 0000000..5b13c5a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/util/splitter/mini-right.gif differ
diff --git a/interface/ext/resources/themes/images/access/util/splitter/mini-top.gif b/interface/ext/resources/themes/images/access/util/splitter/mini-top.gif
new file mode 100755
index 0000000..a4ca2bb
Binary files /dev/null and b/interface/ext/resources/themes/images/access/util/splitter/mini-top.gif differ
diff --git a/interface/ext/resources/themes/images/access/window-header/window-header-default-bottom-corners.gif b/interface/ext/resources/themes/images/access/window-header/window-header-default-bottom-corners.gif
new file mode 100755
index 0000000..b809d7f
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window-header/window-header-default-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/window-header/window-header-default-bottom-sides.gif b/interface/ext/resources/themes/images/access/window-header/window-header-default-bottom-sides.gif
new file mode 100755
index 0000000..ed742ca
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window-header/window-header-default-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/window-header/window-header-default-left-corners.gif b/interface/ext/resources/themes/images/access/window-header/window-header-default-left-corners.gif
new file mode 100755
index 0000000..c4705f7
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window-header/window-header-default-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/window-header/window-header-default-left-sides.gif b/interface/ext/resources/themes/images/access/window-header/window-header-default-left-sides.gif
new file mode 100755
index 0000000..dbafdc1
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window-header/window-header-default-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/window-header/window-header-default-right-corners.gif b/interface/ext/resources/themes/images/access/window-header/window-header-default-right-corners.gif
new file mode 100755
index 0000000..00ba4b6
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window-header/window-header-default-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/window-header/window-header-default-right-sides.gif b/interface/ext/resources/themes/images/access/window-header/window-header-default-right-sides.gif
new file mode 100755
index 0000000..d97805a
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window-header/window-header-default-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/window-header/window-header-default-top-corners.gif b/interface/ext/resources/themes/images/access/window-header/window-header-default-top-corners.gif
new file mode 100755
index 0000000..b2dfd9d
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window-header/window-header-default-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/window-header/window-header-default-top-sides.gif b/interface/ext/resources/themes/images/access/window-header/window-header-default-top-sides.gif
new file mode 100755
index 0000000..ed742ca
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window-header/window-header-default-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/window/icon-error.gif b/interface/ext/resources/themes/images/access/window/icon-error.gif
new file mode 100755
index 0000000..05c713c
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window/icon-error.gif differ
diff --git a/interface/ext/resources/themes/images/access/window/icon-info.gif b/interface/ext/resources/themes/images/access/window/icon-info.gif
new file mode 100755
index 0000000..adc0613
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window/icon-info.gif differ
diff --git a/interface/ext/resources/themes/images/access/window/icon-question.gif b/interface/ext/resources/themes/images/access/window/icon-question.gif
new file mode 100755
index 0000000..9b31a94
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window/icon-question.gif differ
diff --git a/interface/ext/resources/themes/images/access/window/icon-warning.gif b/interface/ext/resources/themes/images/access/window/icon-warning.gif
new file mode 100755
index 0000000..0d89077
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window/icon-warning.gif differ
diff --git a/interface/ext/resources/themes/images/access/window/window-corners.gif b/interface/ext/resources/themes/images/access/window/window-corners.gif
new file mode 100755
index 0000000..82d456b
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window/window-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/window/window-default-corners.gif b/interface/ext/resources/themes/images/access/window/window-default-corners.gif
new file mode 100755
index 0000000..a8998ec
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window/window-default-corners.gif differ
diff --git a/interface/ext/resources/themes/images/access/window/window-default-sides.gif b/interface/ext/resources/themes/images/access/window/window-default-sides.gif
new file mode 100755
index 0000000..eff9537
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window/window-default-sides.gif differ
diff --git a/interface/ext/resources/themes/images/access/window/window-sides.gif b/interface/ext/resources/themes/images/access/window/window-sides.gif
new file mode 100755
index 0000000..43af359
Binary files /dev/null and b/interface/ext/resources/themes/images/access/window/window-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/boundlist/trigger-arrow.png b/interface/ext/resources/themes/images/default/boundlist/trigger-arrow.png
new file mode 100755
index 0000000..11daac3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/boundlist/trigger-arrow.png differ
diff --git a/interface/ext/resources/themes/images/default/box/corners-blue.gif b/interface/ext/resources/themes/images/default/box/corners-blue.gif
new file mode 100755
index 0000000..fa419b5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/box/corners-blue.gif differ
diff --git a/interface/ext/resources/themes/images/default/box/corners.gif b/interface/ext/resources/themes/images/default/box/corners.gif
new file mode 100755
index 0000000..8aa8cae
Binary files /dev/null and b/interface/ext/resources/themes/images/default/box/corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/box/l-blue.gif b/interface/ext/resources/themes/images/default/box/l-blue.gif
new file mode 100755
index 0000000..5ed7f00
Binary files /dev/null and b/interface/ext/resources/themes/images/default/box/l-blue.gif differ
diff --git a/interface/ext/resources/themes/images/default/box/l.gif b/interface/ext/resources/themes/images/default/box/l.gif
new file mode 100755
index 0000000..0160f97
Binary files /dev/null and b/interface/ext/resources/themes/images/default/box/l.gif differ
diff --git a/interface/ext/resources/themes/images/default/box/r-blue.gif b/interface/ext/resources/themes/images/default/box/r-blue.gif
new file mode 100755
index 0000000..3ea5cae
Binary files /dev/null and b/interface/ext/resources/themes/images/default/box/r-blue.gif differ
diff --git a/interface/ext/resources/themes/images/default/box/r.gif b/interface/ext/resources/themes/images/default/box/r.gif
new file mode 100755
index 0000000..34237f6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/box/r.gif differ
diff --git a/interface/ext/resources/themes/images/default/box/tb-blue.gif b/interface/ext/resources/themes/images/default/box/tb-blue.gif
new file mode 100755
index 0000000..562fecc
Binary files /dev/null and b/interface/ext/resources/themes/images/default/box/tb-blue.gif differ
diff --git a/interface/ext/resources/themes/images/default/box/tb.gif b/interface/ext/resources/themes/images/default/box/tb.gif
new file mode 100755
index 0000000..435889b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/box/tb.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-corners.gif b/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-corners.gif
new file mode 100755
index 0000000..70f2dd4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-notitle-corners.gif b/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-notitle-corners.gif
new file mode 100755
index 0000000..70f2dd4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-notitle-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-notitle-sides.gif b/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-notitle-sides.gif
new file mode 100755
index 0000000..44a9334
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-notitle-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-sides.gif b/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-sides.gif
new file mode 100755
index 0000000..ebe97b7
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn-group/btn-group-default-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-bg.gif
new file mode 100755
index 0000000..5e1f83f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-corners.gif
new file mode 100755
index 0000000..87e2f82
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-bg.gif
new file mode 100755
index 0000000..e5ae29f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-corners.gif
new file mode 100755
index 0000000..744c027
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-sides.gif
new file mode 100755
index 0000000..84d257c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-bg.gif
new file mode 100755
index 0000000..a1b1124
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-corners.gif
new file mode 100755
index 0000000..697108e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-sides.gif
new file mode 100755
index 0000000..8137ad2
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-over-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-over-bg.gif
new file mode 100755
index 0000000..7d2fd84
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-over-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-over-corners.gif
new file mode 100755
index 0000000..91cdc04
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-over-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-over-sides.gif
new file mode 100755
index 0000000..6dfce7c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-bg.gif
new file mode 100755
index 0000000..7fc6792
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-corners.gif
new file mode 100755
index 0000000..ce1852d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-sides.gif
new file mode 100755
index 0000000..521dd33
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-large-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-large-sides.gif
new file mode 100755
index 0000000..754621f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-large-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-bg.gif
new file mode 100755
index 0000000..3d8286e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-corners.gif
new file mode 100755
index 0000000..87e2f82
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-bg.gif
new file mode 100755
index 0000000..23d7e57
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-corners.gif
new file mode 100755
index 0000000..9188a88
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-sides.gif
new file mode 100755
index 0000000..22c15a2
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-bg.gif
new file mode 100755
index 0000000..fe97ab4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-corners.gif
new file mode 100755
index 0000000..c5f926b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-sides.gif
new file mode 100755
index 0000000..ca5fe98
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-bg.gif
new file mode 100755
index 0000000..fe97ab4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-corners.gif
new file mode 100755
index 0000000..c5f926b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-sides.gif
new file mode 100755
index 0000000..ca5fe98
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-bg.gif
new file mode 100755
index 0000000..734afa8
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-corners.gif
new file mode 100755
index 0000000..049c338
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-sides.gif
new file mode 100755
index 0000000..7664991
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-medium-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-medium-sides.gif
new file mode 100755
index 0000000..1cb4817
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-medium-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-bg.gif
new file mode 100755
index 0000000..c18f640
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-corners.gif
new file mode 100755
index 0000000..76f32bd
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-bg.gif
new file mode 100755
index 0000000..fd57be5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-corners.gif
new file mode 100755
index 0000000..9188a88
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-sides.gif
new file mode 100755
index 0000000..850df2b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-bg.gif
new file mode 100755
index 0000000..bab2a90
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-corners.gif
new file mode 100755
index 0000000..a0ed287
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-sides.gif
new file mode 100755
index 0000000..f3f673c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-over-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-over-bg.gif
new file mode 100755
index 0000000..bab2a90
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-over-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-over-corners.gif
new file mode 100755
index 0000000..1f89ac5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-over-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-over-sides.gif
new file mode 100755
index 0000000..f3f673c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-bg.gif
new file mode 100755
index 0000000..7703b64
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-corners.gif
new file mode 100755
index 0000000..b36e111
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-sides.gif
new file mode 100755
index 0000000..d322e2c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-small-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-small-sides.gif
new file mode 100755
index 0000000..52a797e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-small-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-disabled-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-disabled-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-disabled-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-disabled-sides.gif
new file mode 100755
index 0000000..51698b0
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-bg.gif
new file mode 100755
index 0000000..f182b67
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-corners.gif
new file mode 100755
index 0000000..e1f77cf
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-sides.gif
new file mode 100755
index 0000000..f787cda
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-bg.gif
new file mode 100755
index 0000000..febf0a6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-corners.gif
new file mode 100755
index 0000000..e1f77cf
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-sides.gif
new file mode 100755
index 0000000..f2c097f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-bg.gif
new file mode 100755
index 0000000..37a8a7a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-corners.gif
new file mode 100755
index 0000000..02e660e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-sides.gif
new file mode 100755
index 0000000..dc7e3c6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-sides.gif
new file mode 100755
index 0000000..51698b0
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-large-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-disabled-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-disabled-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-disabled-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-disabled-sides.gif
new file mode 100755
index 0000000..94256ef
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-bg.gif
new file mode 100755
index 0000000..012108c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-corners.gif
new file mode 100755
index 0000000..361fc55
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-sides.gif
new file mode 100755
index 0000000..3605c0d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-bg.gif
new file mode 100755
index 0000000..012108c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-corners.gif
new file mode 100755
index 0000000..361fc55
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-sides.gif
new file mode 100755
index 0000000..3605c0d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-bg.gif
new file mode 100755
index 0000000..a624fe1
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-corners.gif
new file mode 100755
index 0000000..b1d183b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-sides.gif
new file mode 100755
index 0000000..bfc6efb
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-sides.gif
new file mode 100755
index 0000000..94256ef
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-medium-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-disabled-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-disabled-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-disabled-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-disabled-sides.gif
new file mode 100755
index 0000000..522f864
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-bg.gif
new file mode 100755
index 0000000..8444d32
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-corners.gif
new file mode 100755
index 0000000..7703119
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-sides.gif
new file mode 100755
index 0000000..6c47a7c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-bg.gif
new file mode 100755
index 0000000..8444d32
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-corners.gif
new file mode 100755
index 0000000..7703119
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-sides.gif
new file mode 100755
index 0000000..6c47a7c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-bg.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-bg.gif
new file mode 100755
index 0000000..eb0d7a8
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-corners.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-corners.gif
new file mode 100755
index 0000000..2f60752
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-sides.gif
new file mode 100755
index 0000000..fdf6889
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-sides.gif b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-sides.gif
new file mode 100755
index 0000000..522f864
Binary files /dev/null and b/interface/ext/resources/themes/images/default/btn/btn-default-toolbar-small-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/arrow.gif b/interface/ext/resources/themes/images/default/button/arrow.gif
new file mode 100755
index 0000000..2d84376
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/arrow.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/btn.gif b/interface/ext/resources/themes/images/default/button/btn.gif
new file mode 100755
index 0000000..06b404d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/btn.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/group-cs.gif b/interface/ext/resources/themes/images/default/button/group-cs.gif
new file mode 100755
index 0000000..3d1dca8
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/group-cs.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/group-lr.gif b/interface/ext/resources/themes/images/default/button/group-lr.gif
new file mode 100755
index 0000000..7c549f9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/group-lr.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/group-tb.gif b/interface/ext/resources/themes/images/default/button/group-tb.gif
new file mode 100755
index 0000000..adeb0a4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/group-tb.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/s-arrow-b-noline.gif b/interface/ext/resources/themes/images/default/button/s-arrow-b-noline.gif
new file mode 100755
index 0000000..a4220ee
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/s-arrow-b-noline.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/s-arrow-b.gif b/interface/ext/resources/themes/images/default/button/s-arrow-b.gif
new file mode 100755
index 0000000..84b6470
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/s-arrow-b.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/s-arrow-bo.gif b/interface/ext/resources/themes/images/default/button/s-arrow-bo.gif
new file mode 100755
index 0000000..548700b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/s-arrow-bo.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/s-arrow-light.gif b/interface/ext/resources/themes/images/default/button/s-arrow-light.gif
new file mode 100755
index 0000000..08783c9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/s-arrow-light.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/s-arrow-noline.gif b/interface/ext/resources/themes/images/default/button/s-arrow-noline.gif
new file mode 100755
index 0000000..0953eab
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/s-arrow-noline.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/s-arrow-o.gif b/interface/ext/resources/themes/images/default/button/s-arrow-o.gif
new file mode 100755
index 0000000..89c70f3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/s-arrow-o.gif differ
diff --git a/interface/ext/resources/themes/images/default/button/s-arrow.gif b/interface/ext/resources/themes/images/default/button/s-arrow.gif
new file mode 100755
index 0000000..8940774
Binary files /dev/null and b/interface/ext/resources/themes/images/default/button/s-arrow.gif differ
diff --git a/interface/ext/resources/themes/images/default/datepicker/datepicker-footer-bg.gif b/interface/ext/resources/themes/images/default/datepicker/datepicker-footer-bg.gif
new file mode 100755
index 0000000..1152ee3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/datepicker/datepicker-footer-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/datepicker/datepicker-footer-bg.png b/interface/ext/resources/themes/images/default/datepicker/datepicker-footer-bg.png
new file mode 100755
index 0000000..c062d0d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/datepicker/datepicker-footer-bg.png differ
diff --git a/interface/ext/resources/themes/images/default/datepicker/datepicker-header-bg.gif b/interface/ext/resources/themes/images/default/datepicker/datepicker-header-bg.gif
new file mode 100755
index 0000000..ee316fb
Binary files /dev/null and b/interface/ext/resources/themes/images/default/datepicker/datepicker-header-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/datepicker/datepicker-header-bg.png b/interface/ext/resources/themes/images/default/datepicker/datepicker-header-bg.png
new file mode 100755
index 0000000..45d74d7
Binary files /dev/null and b/interface/ext/resources/themes/images/default/datepicker/datepicker-header-bg.png differ
diff --git a/interface/ext/resources/themes/images/default/dd/drop-add.gif b/interface/ext/resources/themes/images/default/dd/drop-add.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/default/dd/drop-add.gif differ
diff --git a/interface/ext/resources/themes/images/default/dd/drop-no.gif b/interface/ext/resources/themes/images/default/dd/drop-no.gif
new file mode 100755
index 0000000..08d0833
Binary files /dev/null and b/interface/ext/resources/themes/images/default/dd/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/default/dd/drop-yes.gif b/interface/ext/resources/themes/images/default/dd/drop-yes.gif
new file mode 100755
index 0000000..8aacb30
Binary files /dev/null and b/interface/ext/resources/themes/images/default/dd/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/default/editor/tb-sprite.gif b/interface/ext/resources/themes/images/default/editor/tb-sprite.gif
new file mode 100755
index 0000000..fb70577
Binary files /dev/null and b/interface/ext/resources/themes/images/default/editor/tb-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-corners.gif b/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-corners.gif
new file mode 100755
index 0000000..6aeab5b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-default-corners.gif b/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-default-corners.gif
new file mode 100755
index 0000000..a16f169
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-default-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-default-sides.gif b/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-default-sides.gif
new file mode 100755
index 0000000..bd64f32
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-default-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-sides.gif b/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-sides.gif
new file mode 100755
index 0000000..bd64f32
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form-invalid-tip/form-invalid-tip-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/checkbox.gif b/interface/ext/resources/themes/images/default/form/checkbox.gif
new file mode 100755
index 0000000..835b346
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/checkbox.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/clear-trigger.gif b/interface/ext/resources/themes/images/default/form/clear-trigger.gif
new file mode 100755
index 0000000..da78d45
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/clear-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/date-trigger.gif b/interface/ext/resources/themes/images/default/form/date-trigger.gif
new file mode 100755
index 0000000..b012d2a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/date-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/error-tip-corners.gif b/interface/ext/resources/themes/images/default/form/error-tip-corners.gif
new file mode 100755
index 0000000..6ea4c38
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/error-tip-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/exclamation.gif b/interface/ext/resources/themes/images/default/form/exclamation.gif
new file mode 100755
index 0000000..ea31a30
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/exclamation.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/radio.gif b/interface/ext/resources/themes/images/default/form/radio.gif
new file mode 100755
index 0000000..36bb91d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/radio.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/search-trigger.gif b/interface/ext/resources/themes/images/default/form/search-trigger.gif
new file mode 100755
index 0000000..db8802b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/search-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/spinner-small.gif b/interface/ext/resources/themes/images/default/form/spinner-small.gif
new file mode 100755
index 0000000..e70f8d8
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/spinner-small.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/spinner.gif b/interface/ext/resources/themes/images/default/form/spinner.gif
new file mode 100755
index 0000000..1e323bf
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/spinner.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/text-bg.gif b/interface/ext/resources/themes/images/default/form/text-bg.gif
new file mode 100755
index 0000000..4179607
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/text-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/trigger-square.gif b/interface/ext/resources/themes/images/default/form/trigger-square.gif
new file mode 100755
index 0000000..3004ec5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/trigger-square.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/trigger-tpl.gif b/interface/ext/resources/themes/images/default/form/trigger-tpl.gif
new file mode 100755
index 0000000..e3701a3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/trigger-tpl.gif differ
diff --git a/interface/ext/resources/themes/images/default/form/trigger.gif b/interface/ext/resources/themes/images/default/form/trigger.gif
new file mode 100755
index 0000000..d015fbc
Binary files /dev/null and b/interface/ext/resources/themes/images/default/form/trigger.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/arrow-left-white.gif b/interface/ext/resources/themes/images/default/grid/arrow-left-white.gif
new file mode 100755
index 0000000..63088f5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/arrow-left-white.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/arrow-right-white.gif b/interface/ext/resources/themes/images/default/grid/arrow-right-white.gif
new file mode 100755
index 0000000..e9e0678
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/arrow-right-white.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/cell-special-bg.gif b/interface/ext/resources/themes/images/default/grid/cell-special-bg.gif
new file mode 100755
index 0000000..d76ffbc
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/cell-special-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/cell-special-bg.png b/interface/ext/resources/themes/images/default/grid/cell-special-bg.png
new file mode 100755
index 0000000..0bcc236
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/cell-special-bg.png differ
diff --git a/interface/ext/resources/themes/images/default/grid/cell-special-selected-bg.gif b/interface/ext/resources/themes/images/default/grid/cell-special-selected-bg.gif
new file mode 100755
index 0000000..f1da867
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/cell-special-selected-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/cell-special-selected-bg.png b/interface/ext/resources/themes/images/default/grid/cell-special-selected-bg.png
new file mode 100755
index 0000000..500c3bd
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/cell-special-selected-bg.png differ
diff --git a/interface/ext/resources/themes/images/default/grid/checked.gif b/interface/ext/resources/themes/images/default/grid/checked.gif
new file mode 100755
index 0000000..fad5893
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/checked.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/col-move-bottom.gif b/interface/ext/resources/themes/images/default/grid/col-move-bottom.gif
new file mode 100755
index 0000000..cc1e473
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/col-move-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/col-move-top.gif b/interface/ext/resources/themes/images/default/grid/col-move-top.gif
new file mode 100755
index 0000000..58ff32c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/col-move-top.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/column-header-bg.gif b/interface/ext/resources/themes/images/default/grid/column-header-bg.gif
new file mode 100755
index 0000000..5895dba
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/column-header-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/column-header-bg.png b/interface/ext/resources/themes/images/default/grid/column-header-bg.png
new file mode 100755
index 0000000..b181a47
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/column-header-bg.png differ
diff --git a/interface/ext/resources/themes/images/default/grid/column-header-over-bg.gif b/interface/ext/resources/themes/images/default/grid/column-header-over-bg.gif
new file mode 100755
index 0000000..54c1294
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/column-header-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/column-header-over-bg.png b/interface/ext/resources/themes/images/default/grid/column-header-over-bg.png
new file mode 100755
index 0000000..3f20649
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/column-header-over-bg.png differ
diff --git a/interface/ext/resources/themes/images/default/grid/columns.gif b/interface/ext/resources/themes/images/default/grid/columns.gif
new file mode 100755
index 0000000..2d3a823
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/columns.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-left.gif b/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-left.gif
new file mode 100755
index 0000000..5d923b2
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-left.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-left.png b/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-left.png
new file mode 100755
index 0000000..5dc6967
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-left.png differ
diff --git a/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-right.gif b/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-right.gif
new file mode 100755
index 0000000..8d154db
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-right.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-right.png b/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-right.png
new file mode 100755
index 0000000..b1a1819
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/dd-insert-arrow-right.png differ
diff --git a/interface/ext/resources/themes/images/default/grid/dirty.gif b/interface/ext/resources/themes/images/default/grid/dirty.gif
new file mode 100755
index 0000000..4f217a4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/dirty.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/done.gif b/interface/ext/resources/themes/images/default/grid/done.gif
new file mode 100755
index 0000000..a937cb2
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/done.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/drop-no.gif b/interface/ext/resources/themes/images/default/grid/drop-no.gif
new file mode 100755
index 0000000..31a332b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/drop-yes.gif b/interface/ext/resources/themes/images/default/grid/drop-yes.gif
new file mode 100755
index 0000000..926010e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/footer-bg.gif b/interface/ext/resources/themes/images/default/grid/footer-bg.gif
new file mode 100755
index 0000000..126120f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/footer-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid-blue-hd.gif b/interface/ext/resources/themes/images/default/grid/grid-blue-hd.gif
new file mode 100755
index 0000000..862094e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid-blue-hd.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid-blue-split.gif b/interface/ext/resources/themes/images/default/grid/grid-blue-split.gif
new file mode 100755
index 0000000..5286f58
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid-blue-split.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid-hrow.gif b/interface/ext/resources/themes/images/default/grid/grid-hrow.gif
new file mode 100755
index 0000000..6374104
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid-hrow.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid-loading.gif b/interface/ext/resources/themes/images/default/grid/grid-loading.gif
new file mode 100755
index 0000000..d112c54
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid-loading.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid-split.gif b/interface/ext/resources/themes/images/default/grid/grid-split.gif
new file mode 100755
index 0000000..c76a16e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid-split.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid-vista-hd.gif b/interface/ext/resources/themes/images/default/grid/grid-vista-hd.gif
new file mode 100755
index 0000000..d097263
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid-vista-hd.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid3-hd-btn.gif b/interface/ext/resources/themes/images/default/grid/grid3-hd-btn.gif
new file mode 100755
index 0000000..2112607
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid3-hd-btn.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid3-hrow-over.gif b/interface/ext/resources/themes/images/default/grid/grid3-hrow-over.gif
new file mode 100755
index 0000000..f9c07af
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid3-hrow-over.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid3-hrow.gif b/interface/ext/resources/themes/images/default/grid/grid3-hrow.gif
new file mode 100755
index 0000000..8d459a3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid3-hrow.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/grid3-rowheader.gif b/interface/ext/resources/themes/images/default/grid/grid3-rowheader.gif
new file mode 100755
index 0000000..2799b45
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/grid3-rowheader.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/group-by.gif b/interface/ext/resources/themes/images/default/grid/group-by.gif
new file mode 100755
index 0000000..d6075bb
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/group-by.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/group-collapse.gif b/interface/ext/resources/themes/images/default/grid/group-collapse.gif
new file mode 100755
index 0000000..495bb05
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/group-collapse.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/group-expand-sprite.gif b/interface/ext/resources/themes/images/default/grid/group-expand-sprite.gif
new file mode 100755
index 0000000..9c1653b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/group-expand-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/group-expand.gif b/interface/ext/resources/themes/images/default/grid/group-expand.gif
new file mode 100755
index 0000000..a33ac30
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/group-expand.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/hd-pop.gif b/interface/ext/resources/themes/images/default/grid/hd-pop.gif
new file mode 100755
index 0000000..eb8ba79
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/hd-pop.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/hmenu-asc.gif b/interface/ext/resources/themes/images/default/grid/hmenu-asc.gif
new file mode 100755
index 0000000..8917e0e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/hmenu-asc.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/hmenu-desc.gif b/interface/ext/resources/themes/images/default/grid/hmenu-desc.gif
new file mode 100755
index 0000000..f26b7c2
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/hmenu-desc.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/hmenu-lock.gif b/interface/ext/resources/themes/images/default/grid/hmenu-lock.gif
new file mode 100755
index 0000000..1596126
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/hmenu-lock.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/hmenu-lock.png b/interface/ext/resources/themes/images/default/grid/hmenu-lock.png
new file mode 100755
index 0000000..8b81e7f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/hmenu-lock.png differ
diff --git a/interface/ext/resources/themes/images/default/grid/hmenu-unlock.gif b/interface/ext/resources/themes/images/default/grid/hmenu-unlock.gif
new file mode 100755
index 0000000..af59cf9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/hmenu-unlock.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/hmenu-unlock.png b/interface/ext/resources/themes/images/default/grid/hmenu-unlock.png
new file mode 100755
index 0000000..9dd5df3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/hmenu-unlock.png differ
diff --git a/interface/ext/resources/themes/images/default/grid/invalid_line.gif b/interface/ext/resources/themes/images/default/grid/invalid_line.gif
new file mode 100755
index 0000000..fb7e0f3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/invalid_line.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/loading.gif b/interface/ext/resources/themes/images/default/grid/loading.gif
new file mode 100755
index 0000000..e846e1d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/loading.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/mso-hd.gif b/interface/ext/resources/themes/images/default/grid/mso-hd.gif
new file mode 100755
index 0000000..669f3cf
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/mso-hd.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/nowait.gif b/interface/ext/resources/themes/images/default/grid/nowait.gif
new file mode 100755
index 0000000..4c5862c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/nowait.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/page-first-disabled.gif b/interface/ext/resources/themes/images/default/grid/page-first-disabled.gif
new file mode 100755
index 0000000..1e02c41
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/page-first-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/page-first.gif b/interface/ext/resources/themes/images/default/grid/page-first.gif
new file mode 100755
index 0000000..d84f41a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/page-first.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/page-last-disabled.gif b/interface/ext/resources/themes/images/default/grid/page-last-disabled.gif
new file mode 100755
index 0000000..8697067
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/page-last-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/page-last.gif b/interface/ext/resources/themes/images/default/grid/page-last.gif
new file mode 100755
index 0000000..3df5c2b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/page-last.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/page-next-disabled.gif b/interface/ext/resources/themes/images/default/grid/page-next-disabled.gif
new file mode 100755
index 0000000..90a7756
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/page-next-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/page-next.gif b/interface/ext/resources/themes/images/default/grid/page-next.gif
new file mode 100755
index 0000000..9601635
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/page-next.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/page-prev-disabled.gif b/interface/ext/resources/themes/images/default/grid/page-prev-disabled.gif
new file mode 100755
index 0000000..37154d6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/page-prev-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/page-prev.gif b/interface/ext/resources/themes/images/default/grid/page-prev.gif
new file mode 100755
index 0000000..eb70cf8
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/page-prev.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/pick-button.gif b/interface/ext/resources/themes/images/default/grid/pick-button.gif
new file mode 100755
index 0000000..6957924
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/pick-button.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/property-cell-bg.gif b/interface/ext/resources/themes/images/default/grid/property-cell-bg.gif
new file mode 100755
index 0000000..77d029f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/property-cell-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/property-cell-selected-bg.gif b/interface/ext/resources/themes/images/default/grid/property-cell-selected-bg.gif
new file mode 100755
index 0000000..1dfe9a6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/property-cell-selected-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/refresh-disabled.gif b/interface/ext/resources/themes/images/default/grid/refresh-disabled.gif
new file mode 100755
index 0000000..607800b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/refresh-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/refresh.gif b/interface/ext/resources/themes/images/default/grid/refresh.gif
new file mode 100755
index 0000000..110f684
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/refresh.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/row-check-sprite.gif b/interface/ext/resources/themes/images/default/grid/row-check-sprite.gif
new file mode 100755
index 0000000..6101164
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/row-check-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/row-expand-sprite.gif b/interface/ext/resources/themes/images/default/grid/row-expand-sprite.gif
new file mode 100755
index 0000000..6f4d874
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/row-expand-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/row-over.gif b/interface/ext/resources/themes/images/default/grid/row-over.gif
new file mode 100755
index 0000000..b288e38
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/row-over.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/row-sel.gif b/interface/ext/resources/themes/images/default/grid/row-sel.gif
new file mode 100755
index 0000000..98209e6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/row-sel.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/sort-hd.gif b/interface/ext/resources/themes/images/default/grid/sort-hd.gif
new file mode 100755
index 0000000..45e545f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/sort-hd.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/sort_asc.gif b/interface/ext/resources/themes/images/default/grid/sort_asc.gif
new file mode 100755
index 0000000..67a2a4c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/sort_asc.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/sort_desc.gif b/interface/ext/resources/themes/images/default/grid/sort_desc.gif
new file mode 100755
index 0000000..34db47c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/sort_desc.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/unchecked.gif b/interface/ext/resources/themes/images/default/grid/unchecked.gif
new file mode 100755
index 0000000..43823e5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/unchecked.gif differ
diff --git a/interface/ext/resources/themes/images/default/grid/wait.gif b/interface/ext/resources/themes/images/default/grid/wait.gif
new file mode 100755
index 0000000..471c1a4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/grid/wait.gif differ
diff --git a/interface/ext/resources/themes/images/default/layout/mini-bottom.gif b/interface/ext/resources/themes/images/default/layout/mini-bottom.gif
new file mode 100755
index 0000000..c18f9e3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/layout/mini-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/default/layout/mini-left.gif b/interface/ext/resources/themes/images/default/layout/mini-left.gif
new file mode 100755
index 0000000..99f7993
Binary files /dev/null and b/interface/ext/resources/themes/images/default/layout/mini-left.gif differ
diff --git a/interface/ext/resources/themes/images/default/layout/mini-right.gif b/interface/ext/resources/themes/images/default/layout/mini-right.gif
new file mode 100755
index 0000000..5b13c5a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/layout/mini-right.gif differ
diff --git a/interface/ext/resources/themes/images/default/layout/mini-top.gif b/interface/ext/resources/themes/images/default/layout/mini-top.gif
new file mode 100755
index 0000000..a4ca2bb
Binary files /dev/null and b/interface/ext/resources/themes/images/default/layout/mini-top.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/checked.gif b/interface/ext/resources/themes/images/default/menu/checked.gif
new file mode 100755
index 0000000..fad5893
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/checked.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/group-checked.gif b/interface/ext/resources/themes/images/default/menu/group-checked.gif
new file mode 100755
index 0000000..d30b3e5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/group-checked.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/item-over.gif b/interface/ext/resources/themes/images/default/menu/item-over.gif
new file mode 100755
index 0000000..da1f289
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/item-over.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/menu-item-active-bg.gif b/interface/ext/resources/themes/images/default/menu/menu-item-active-bg.gif
new file mode 100755
index 0000000..afb0225
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/menu-item-active-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/menu-item-active-corners.gif b/interface/ext/resources/themes/images/default/menu/menu-item-active-corners.gif
new file mode 100755
index 0000000..bac40a3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/menu-item-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/menu-item-active-sides.gif b/interface/ext/resources/themes/images/default/menu/menu-item-active-sides.gif
new file mode 100755
index 0000000..becc1a5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/menu-item-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/menu-parent.gif b/interface/ext/resources/themes/images/default/menu/menu-parent.gif
new file mode 100755
index 0000000..1e37562
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/menu-parent.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/menu.gif b/interface/ext/resources/themes/images/default/menu/menu.gif
new file mode 100755
index 0000000..30a2c4b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/menu.gif differ
diff --git a/interface/ext/resources/themes/images/default/menu/unchecked.gif b/interface/ext/resources/themes/images/default/menu/unchecked.gif
new file mode 100755
index 0000000..43823e5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/menu/unchecked.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-bottom-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-bottom-bg.gif
new file mode 100755
index 0000000..408066b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-bg.gif
new file mode 100755
index 0000000..ad2113f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-corners.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-corners.gif
new file mode 100755
index 0000000..f4380fa
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-sides.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-sides.gif
new file mode 100755
index 0000000..2f5557f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif
new file mode 100755
index 0000000..4556726
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif
new file mode 100755
index 0000000..8328b05
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif
new file mode 100755
index 0000000..59d140b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-bg.gif
new file mode 100755
index 0000000..73a97fd
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-corners.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-corners.gif
new file mode 100755
index 0000000..301eec6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-sides.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-sides.gif
new file mode 100755
index 0000000..40f49b0
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-bg.gif
new file mode 100755
index 0000000..3a2f9de
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-corners.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-corners.gif
new file mode 100755
index 0000000..2c57889
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-sides.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-sides.gif
new file mode 100755
index 0000000..31b23e6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-bg.gif
new file mode 100755
index 0000000..78f64e4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-corners.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-corners.gif
new file mode 100755
index 0000000..12bcf23
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-sides.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-sides.gif
new file mode 100755
index 0000000..33d2022
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-collapsed-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-bg.gif
new file mode 100755
index 0000000..ff78a2b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-corners.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-corners.gif
new file mode 100755
index 0000000..bb487a5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-sides.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-sides.gif
new file mode 100755
index 0000000..14f4971
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-bg.gif
new file mode 100755
index 0000000..df72cd3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-corners.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-corners.gif
new file mode 100755
index 0000000..30d9895
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-sides.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-sides.gif
new file mode 100755
index 0000000..0abe4a3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-bg.gif
new file mode 100755
index 0000000..810660c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-corners.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-corners.gif
new file mode 100755
index 0000000..e3d7bb5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-sides.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-sides.gif
new file mode 100755
index 0000000..38b2755
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-framed-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-left-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-left-bg.gif
new file mode 100755
index 0000000..381535d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-right-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-right-bg.gif
new file mode 100755
index 0000000..7240859
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel-header/panel-header-default-top-bg.gif b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-top-bg.gif
new file mode 100755
index 0000000..df8ba35
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel-header/panel-header-default-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel/panel-default-framed-corners.gif b/interface/ext/resources/themes/images/default/panel/panel-default-framed-corners.gif
new file mode 100755
index 0000000..fac8dca
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel/panel-default-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/panel/panel-default-framed-sides.gif b/interface/ext/resources/themes/images/default/panel/panel-default-framed-sides.gif
new file mode 100755
index 0000000..5bb75e2
Binary files /dev/null and b/interface/ext/resources/themes/images/default/panel/panel-default-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/progress/progress-default-bg.gif b/interface/ext/resources/themes/images/default/progress/progress-default-bg.gif
new file mode 100755
index 0000000..a19c88c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/progress/progress-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/blue-loading.gif b/interface/ext/resources/themes/images/default/shared/blue-loading.gif
new file mode 100755
index 0000000..3bbf639
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/blue-loading.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/calendar.gif b/interface/ext/resources/themes/images/default/shared/calendar.gif
new file mode 100755
index 0000000..133cf23
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/calendar.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/glass-bg.gif b/interface/ext/resources/themes/images/default/shared/glass-bg.gif
new file mode 100755
index 0000000..26fbbae
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/glass-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/hd-sprite.gif b/interface/ext/resources/themes/images/default/shared/hd-sprite.gif
new file mode 100755
index 0000000..42da1ea
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/hd-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/icon-error.gif b/interface/ext/resources/themes/images/default/shared/icon-error.gif
new file mode 100755
index 0000000..397b655
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/icon-error.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/icon-info.gif b/interface/ext/resources/themes/images/default/shared/icon-info.gif
new file mode 100755
index 0000000..58281c3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/icon-info.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/icon-question.gif b/interface/ext/resources/themes/images/default/shared/icon-question.gif
new file mode 100755
index 0000000..08abd82
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/icon-question.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/icon-warning.gif b/interface/ext/resources/themes/images/default/shared/icon-warning.gif
new file mode 100755
index 0000000..27ff98b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/icon-warning.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/large-loading.gif b/interface/ext/resources/themes/images/default/shared/large-loading.gif
new file mode 100755
index 0000000..b36b555
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/large-loading.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/left-btn.gif b/interface/ext/resources/themes/images/default/shared/left-btn.gif
new file mode 100755
index 0000000..fe4b4ed
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/left-btn.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/loading-balls.gif b/interface/ext/resources/themes/images/default/shared/loading-balls.gif
new file mode 100755
index 0000000..9ce214b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/loading-balls.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/right-btn.gif b/interface/ext/resources/themes/images/default/shared/right-btn.gif
new file mode 100755
index 0000000..1be433a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/right-btn.gif differ
diff --git a/interface/ext/resources/themes/images/default/shared/shadow-c.png b/interface/ext/resources/themes/images/default/shared/shadow-c.png
new file mode 100755
index 0000000..d435f80
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/shadow-c.png differ
diff --git a/interface/ext/resources/themes/images/default/shared/shadow-lr.png b/interface/ext/resources/themes/images/default/shared/shadow-lr.png
new file mode 100755
index 0000000..bb88b6f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/shadow-lr.png differ
diff --git a/interface/ext/resources/themes/images/default/shared/shadow.png b/interface/ext/resources/themes/images/default/shared/shadow.png
new file mode 100755
index 0000000..75c0eba
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/shadow.png differ
diff --git a/interface/ext/resources/themes/images/default/shared/warning.gif b/interface/ext/resources/themes/images/default/shared/warning.gif
new file mode 100755
index 0000000..806d4bc
Binary files /dev/null and b/interface/ext/resources/themes/images/default/shared/warning.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/e-handle-dark.gif b/interface/ext/resources/themes/images/default/sizer/e-handle-dark.gif
new file mode 100755
index 0000000..b5486c1
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/e-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/e-handle.gif b/interface/ext/resources/themes/images/default/sizer/e-handle.gif
new file mode 100755
index 0000000..00ba835
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/e-handle.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/ne-handle-dark.gif b/interface/ext/resources/themes/images/default/sizer/ne-handle-dark.gif
new file mode 100755
index 0000000..04e5ecf
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/ne-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/ne-handle.gif b/interface/ext/resources/themes/images/default/sizer/ne-handle.gif
new file mode 100755
index 0000000..09405c7
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/ne-handle.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/nw-handle-dark.gif b/interface/ext/resources/themes/images/default/sizer/nw-handle-dark.gif
new file mode 100755
index 0000000..6e49d69
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/nw-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/nw-handle.gif b/interface/ext/resources/themes/images/default/sizer/nw-handle.gif
new file mode 100755
index 0000000..2fcea8a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/nw-handle.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/s-handle-dark.gif b/interface/ext/resources/themes/images/default/sizer/s-handle-dark.gif
new file mode 100755
index 0000000..4eb5f0f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/s-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/s-handle.gif b/interface/ext/resources/themes/images/default/sizer/s-handle.gif
new file mode 100755
index 0000000..bf069c2
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/s-handle.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/se-handle-dark.gif b/interface/ext/resources/themes/images/default/sizer/se-handle-dark.gif
new file mode 100755
index 0000000..c4c1087
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/se-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/se-handle.gif b/interface/ext/resources/themes/images/default/sizer/se-handle.gif
new file mode 100755
index 0000000..972055e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/se-handle.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/square.gif b/interface/ext/resources/themes/images/default/sizer/square.gif
new file mode 100755
index 0000000..14ce6f7
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/square.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/sw-handle-dark.gif b/interface/ext/resources/themes/images/default/sizer/sw-handle-dark.gif
new file mode 100755
index 0000000..77224b0
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/sw-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/default/sizer/sw-handle.gif b/interface/ext/resources/themes/images/default/sizer/sw-handle.gif
new file mode 100755
index 0000000..3ca0ed9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/sizer/sw-handle.gif differ
diff --git a/interface/ext/resources/themes/images/default/slider/slider-bg.gif b/interface/ext/resources/themes/images/default/slider/slider-bg.gif
new file mode 100755
index 0000000..fbf3ba8
Binary files /dev/null and b/interface/ext/resources/themes/images/default/slider/slider-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/slider/slider-bg.png b/interface/ext/resources/themes/images/default/slider/slider-bg.png
new file mode 100755
index 0000000..b3eaf52
Binary files /dev/null and b/interface/ext/resources/themes/images/default/slider/slider-bg.png differ
diff --git a/interface/ext/resources/themes/images/default/slider/slider-thumb.gif b/interface/ext/resources/themes/images/default/slider/slider-thumb.gif
new file mode 100755
index 0000000..5ba1dfb
Binary files /dev/null and b/interface/ext/resources/themes/images/default/slider/slider-thumb.gif differ
diff --git a/interface/ext/resources/themes/images/default/slider/slider-thumb.png b/interface/ext/resources/themes/images/default/slider/slider-thumb.png
new file mode 100755
index 0000000..cd654a4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/slider/slider-thumb.png differ
diff --git a/interface/ext/resources/themes/images/default/slider/slider-v-bg.gif b/interface/ext/resources/themes/images/default/slider/slider-v-bg.gif
new file mode 100755
index 0000000..0cf8c4b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/slider/slider-v-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/slider/slider-v-bg.png b/interface/ext/resources/themes/images/default/slider/slider-v-bg.png
new file mode 100755
index 0000000..121450c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/slider/slider-v-bg.png differ
diff --git a/interface/ext/resources/themes/images/default/slider/slider-v-thumb.gif b/interface/ext/resources/themes/images/default/slider/slider-v-thumb.gif
new file mode 100755
index 0000000..58afe96
Binary files /dev/null and b/interface/ext/resources/themes/images/default/slider/slider-v-thumb.gif differ
diff --git a/interface/ext/resources/themes/images/default/slider/slider-v-thumb.png b/interface/ext/resources/themes/images/default/slider/slider-v-thumb.png
new file mode 100755
index 0000000..7b3d725
Binary files /dev/null and b/interface/ext/resources/themes/images/default/slider/slider-v-thumb.png differ
diff --git a/interface/ext/resources/themes/images/default/tab-bar/scroll-left.gif b/interface/ext/resources/themes/images/default/tab-bar/scroll-left.gif
new file mode 100755
index 0000000..afa125b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab-bar/scroll-left.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab-bar/scroll-right.gif b/interface/ext/resources/themes/images/default/tab-bar/scroll-right.gif
new file mode 100755
index 0000000..20460f2
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab-bar/scroll-right.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab-bar/tab-bar-default-bg.gif b/interface/ext/resources/themes/images/default/tab-bar/tab-bar-default-bg.gif
new file mode 100755
index 0000000..5b01cf9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab-bar/tab-bar-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-bg.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-bg.gif
new file mode 100755
index 0000000..48fa1c8
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-corners.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-corners.gif
new file mode 100755
index 0000000..9fce01a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-sides.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-sides.gif
new file mode 100755
index 0000000..5110be9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-bg.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-bg.gif
new file mode 100755
index 0000000..5e2b3bf
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-corners.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-corners.gif
new file mode 100755
index 0000000..5cae8ae
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-bg.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-bg.gif
new file mode 100755
index 0000000..84368f0
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-corners.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-corners.gif
new file mode 100755
index 0000000..396aad7
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-sides.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-sides.gif
new file mode 100755
index 0000000..f5e887f
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-bg.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-bg.gif
new file mode 100755
index 0000000..bd751fd
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-corners.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-corners.gif
new file mode 100755
index 0000000..bbaa39d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-sides.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-sides.gif
new file mode 100755
index 0000000..3864ac9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-bottom-sides.gif b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-sides.gif
new file mode 100755
index 0000000..d791f86
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-close.gif b/interface/ext/resources/themes/images/default/tab/tab-default-close.gif
new file mode 100755
index 0000000..e699878
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-close.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-active-bg.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-active-bg.gif
new file mode 100755
index 0000000..aee1957
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-active-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-active-corners.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-active-corners.gif
new file mode 100755
index 0000000..e4ee0d9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-active-sides.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-active-sides.gif
new file mode 100755
index 0000000..0aa990b
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-bg.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-bg.gif
new file mode 100755
index 0000000..47fbdac
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-corners.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-corners.gif
new file mode 100755
index 0000000..3cccd3a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-bg.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-bg.gif
new file mode 100755
index 0000000..1e50a8c
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-corners.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-corners.gif
new file mode 100755
index 0000000..2eccc81
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-sides.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-sides.gif
new file mode 100755
index 0000000..641602a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-over-bg.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-over-bg.gif
new file mode 100755
index 0000000..b03c103
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-over-corners.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-over-corners.gif
new file mode 100755
index 0000000..087db87
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-over-sides.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-over-sides.gif
new file mode 100755
index 0000000..b88406a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/tab/tab-default-top-sides.gif b/interface/ext/resources/themes/images/default/tab/tab-default-top-sides.gif
new file mode 100755
index 0000000..f545916
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tab/tab-default-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/tip/tip-corners.gif b/interface/ext/resources/themes/images/default/tip/tip-corners.gif
new file mode 100755
index 0000000..e26ea6e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tip/tip-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/tip/tip-sides.gif b/interface/ext/resources/themes/images/default/tip/tip-sides.gif
new file mode 100755
index 0000000..cf4c2f6
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tip/tip-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/toolbar/more.gif b/interface/ext/resources/themes/images/default/toolbar/more.gif
new file mode 100755
index 0000000..02c2509
Binary files /dev/null and b/interface/ext/resources/themes/images/default/toolbar/more.gif differ
diff --git a/interface/ext/resources/themes/images/default/toolbar/scroll-left.gif b/interface/ext/resources/themes/images/default/toolbar/scroll-left.gif
new file mode 100755
index 0000000..2db8cf5
Binary files /dev/null and b/interface/ext/resources/themes/images/default/toolbar/scroll-left.gif differ
diff --git a/interface/ext/resources/themes/images/default/toolbar/scroll-right.gif b/interface/ext/resources/themes/images/default/toolbar/scroll-right.gif
new file mode 100755
index 0000000..5d5a7ab
Binary files /dev/null and b/interface/ext/resources/themes/images/default/toolbar/scroll-right.gif differ
diff --git a/interface/ext/resources/themes/images/default/toolbar/toolbar-default-bg.gif b/interface/ext/resources/themes/images/default/toolbar/toolbar-default-bg.gif
new file mode 100755
index 0000000..22e3302
Binary files /dev/null and b/interface/ext/resources/themes/images/default/toolbar/toolbar-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/default/tools/tool-sprite-tpl.gif b/interface/ext/resources/themes/images/default/tools/tool-sprite-tpl.gif
new file mode 100755
index 0000000..e647867
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tools/tool-sprite-tpl.gif differ
diff --git a/interface/ext/resources/themes/images/default/tools/tool-sprites.gif b/interface/ext/resources/themes/images/default/tools/tool-sprites.gif
new file mode 100755
index 0000000..2b6b809
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tools/tool-sprites.gif differ
diff --git a/interface/ext/resources/themes/images/default/tools/tools-sprites-trans.gif b/interface/ext/resources/themes/images/default/tools/tools-sprites-trans.gif
new file mode 100755
index 0000000..ead931e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tools/tools-sprites-trans.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/arrows.gif b/interface/ext/resources/themes/images/default/tree/arrows.gif
new file mode 100755
index 0000000..2683463
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/arrows.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-above.gif b/interface/ext/resources/themes/images/default/tree/drop-above.gif
new file mode 100755
index 0000000..30d1ca7
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-above.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-add.gif b/interface/ext/resources/themes/images/default/tree/drop-add.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-add.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-append.gif b/interface/ext/resources/themes/images/default/tree/drop-append.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-append.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-below.gif b/interface/ext/resources/themes/images/default/tree/drop-below.gif
new file mode 100755
index 0000000..85f66b1
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-below.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-between.gif b/interface/ext/resources/themes/images/default/tree/drop-between.gif
new file mode 100755
index 0000000..5c6c09d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-between.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-no.gif b/interface/ext/resources/themes/images/default/tree/drop-no.gif
new file mode 100755
index 0000000..9d9c6a9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-over.gif b/interface/ext/resources/themes/images/default/tree/drop-over.gif
new file mode 100755
index 0000000..30d1ca7
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-over.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-under.gif b/interface/ext/resources/themes/images/default/tree/drop-under.gif
new file mode 100755
index 0000000..85f66b1
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-under.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/drop-yes.gif b/interface/ext/resources/themes/images/default/tree/drop-yes.gif
new file mode 100755
index 0000000..8aacb30
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-end-minus-nl.gif b/interface/ext/resources/themes/images/default/tree/elbow-end-minus-nl.gif
new file mode 100755
index 0000000..928779e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-end-minus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-end-minus.gif b/interface/ext/resources/themes/images/default/tree/elbow-end-minus.gif
new file mode 100755
index 0000000..9a8d727
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-end-minus.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-end-plus-nl.gif b/interface/ext/resources/themes/images/default/tree/elbow-end-plus-nl.gif
new file mode 100755
index 0000000..9f7f698
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-end-plus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-end-plus.gif b/interface/ext/resources/themes/images/default/tree/elbow-end-plus.gif
new file mode 100755
index 0000000..5943a01
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-end-plus.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-end.gif b/interface/ext/resources/themes/images/default/tree/elbow-end.gif
new file mode 100755
index 0000000..f24ddee
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-end.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-line.gif b/interface/ext/resources/themes/images/default/tree/elbow-line.gif
new file mode 100755
index 0000000..75e6da4
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-line.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-minus-nl.gif b/interface/ext/resources/themes/images/default/tree/elbow-minus-nl.gif
new file mode 100755
index 0000000..928779e
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-minus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-minus.gif b/interface/ext/resources/themes/images/default/tree/elbow-minus.gif
new file mode 100755
index 0000000..97dcc71
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-minus.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-plus-nl.gif b/interface/ext/resources/themes/images/default/tree/elbow-plus-nl.gif
new file mode 100755
index 0000000..9f7f698
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-plus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow-plus.gif b/interface/ext/resources/themes/images/default/tree/elbow-plus.gif
new file mode 100755
index 0000000..698de47
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow-plus.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/elbow.gif b/interface/ext/resources/themes/images/default/tree/elbow.gif
new file mode 100755
index 0000000..b8f4208
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/elbow.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/folder-open.gif b/interface/ext/resources/themes/images/default/tree/folder-open.gif
new file mode 100755
index 0000000..56ba737
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/folder-open.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/folder.gif b/interface/ext/resources/themes/images/default/tree/folder.gif
new file mode 100755
index 0000000..20412f7
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/folder.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/leaf.gif b/interface/ext/resources/themes/images/default/tree/leaf.gif
new file mode 100755
index 0000000..445769d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/leaf.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/loading.gif b/interface/ext/resources/themes/images/default/tree/loading.gif
new file mode 100755
index 0000000..e846e1d
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/loading.gif differ
diff --git a/interface/ext/resources/themes/images/default/tree/s.gif b/interface/ext/resources/themes/images/default/tree/s.gif
new file mode 100755
index 0000000..1d11fa9
Binary files /dev/null and b/interface/ext/resources/themes/images/default/tree/s.gif differ
diff --git a/interface/ext/resources/themes/images/default/util/splitter/mini-bottom.gif b/interface/ext/resources/themes/images/default/util/splitter/mini-bottom.gif
new file mode 100755
index 0000000..c18f9e3
Binary files /dev/null and b/interface/ext/resources/themes/images/default/util/splitter/mini-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/default/util/splitter/mini-left.gif b/interface/ext/resources/themes/images/default/util/splitter/mini-left.gif
new file mode 100755
index 0000000..99f7993
Binary files /dev/null and b/interface/ext/resources/themes/images/default/util/splitter/mini-left.gif differ
diff --git a/interface/ext/resources/themes/images/default/util/splitter/mini-right.gif b/interface/ext/resources/themes/images/default/util/splitter/mini-right.gif
new file mode 100755
index 0000000..5b13c5a
Binary files /dev/null and b/interface/ext/resources/themes/images/default/util/splitter/mini-right.gif differ
diff --git a/interface/ext/resources/themes/images/default/util/splitter/mini-top.gif b/interface/ext/resources/themes/images/default/util/splitter/mini-top.gif
new file mode 100755
index 0000000..a4ca2bb
Binary files /dev/null and b/interface/ext/resources/themes/images/default/util/splitter/mini-top.gif differ
diff --git a/interface/ext/resources/themes/images/default/window-header/window-header-default-bottom-corners.gif b/interface/ext/resources/themes/images/default/window-header/window-header-default-bottom-corners.gif
new file mode 100755
index 0000000..5daef14
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window-header/window-header-default-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/window-header/window-header-default-bottom-sides.gif b/interface/ext/resources/themes/images/default/window-header/window-header-default-bottom-sides.gif
new file mode 100755
index 0000000..5188482
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window-header/window-header-default-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/window-header/window-header-default-left-corners.gif b/interface/ext/resources/themes/images/default/window-header/window-header-default-left-corners.gif
new file mode 100755
index 0000000..3c5f242
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window-header/window-header-default-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/window-header/window-header-default-left-sides.gif b/interface/ext/resources/themes/images/default/window-header/window-header-default-left-sides.gif
new file mode 100755
index 0000000..8c0c187
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window-header/window-header-default-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/window-header/window-header-default-right-corners.gif b/interface/ext/resources/themes/images/default/window-header/window-header-default-right-corners.gif
new file mode 100755
index 0000000..853c313
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window-header/window-header-default-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/window-header/window-header-default-right-sides.gif b/interface/ext/resources/themes/images/default/window-header/window-header-default-right-sides.gif
new file mode 100755
index 0000000..0a31ccd
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window-header/window-header-default-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/window-header/window-header-default-top-corners.gif b/interface/ext/resources/themes/images/default/window-header/window-header-default-top-corners.gif
new file mode 100755
index 0000000..7978dd8
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window-header/window-header-default-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/window-header/window-header-default-top-sides.gif b/interface/ext/resources/themes/images/default/window-header/window-header-default-top-sides.gif
new file mode 100755
index 0000000..5188482
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window-header/window-header-default-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/default/window/window-default-corners.gif b/interface/ext/resources/themes/images/default/window/window-default-corners.gif
new file mode 100755
index 0000000..efae7da
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window/window-default-corners.gif differ
diff --git a/interface/ext/resources/themes/images/default/window/window-default-sides.gif b/interface/ext/resources/themes/images/default/window/window-default-sides.gif
new file mode 100755
index 0000000..39edc88
Binary files /dev/null and b/interface/ext/resources/themes/images/default/window/window-default-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/boundlist/trigger-arrow.png b/interface/ext/resources/themes/images/gray/boundlist/trigger-arrow.png
new file mode 100755
index 0000000..11daac3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/boundlist/trigger-arrow.png differ
diff --git a/interface/ext/resources/themes/images/gray/box/corners-blue.gif b/interface/ext/resources/themes/images/gray/box/corners-blue.gif
new file mode 100755
index 0000000..fa419b5
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/box/corners-blue.gif differ
diff --git a/interface/ext/resources/themes/images/gray/box/corners.gif b/interface/ext/resources/themes/images/gray/box/corners.gif
new file mode 100755
index 0000000..8aa8cae
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/box/corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/box/l-blue.gif b/interface/ext/resources/themes/images/gray/box/l-blue.gif
new file mode 100755
index 0000000..5ed7f00
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/box/l-blue.gif differ
diff --git a/interface/ext/resources/themes/images/gray/box/l.gif b/interface/ext/resources/themes/images/gray/box/l.gif
new file mode 100755
index 0000000..0160f97
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/box/l.gif differ
diff --git a/interface/ext/resources/themes/images/gray/box/r-blue.gif b/interface/ext/resources/themes/images/gray/box/r-blue.gif
new file mode 100755
index 0000000..3ea5cae
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/box/r-blue.gif differ
diff --git a/interface/ext/resources/themes/images/gray/box/r.gif b/interface/ext/resources/themes/images/gray/box/r.gif
new file mode 100755
index 0000000..34237f6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/box/r.gif differ
diff --git a/interface/ext/resources/themes/images/gray/box/tb-blue.gif b/interface/ext/resources/themes/images/gray/box/tb-blue.gif
new file mode 100755
index 0000000..562fecc
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/box/tb-blue.gif differ
diff --git a/interface/ext/resources/themes/images/gray/box/tb.gif b/interface/ext/resources/themes/images/gray/box/tb.gif
new file mode 100755
index 0000000..435889b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/box/tb.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-corners.gif b/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-corners.gif
new file mode 100755
index 0000000..70f2dd4
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-notitle-corners.gif b/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-notitle-corners.gif
new file mode 100755
index 0000000..70f2dd4
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-notitle-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-notitle-sides.gif b/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-notitle-sides.gif
new file mode 100755
index 0000000..44a9334
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-notitle-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-sides.gif b/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-sides.gif
new file mode 100755
index 0000000..ebe97b7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn-group/btn-group-default-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-bg.gif
new file mode 100755
index 0000000..6e5d399
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-corners.gif
new file mode 100755
index 0000000..29fe186
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-bg.gif
new file mode 100755
index 0000000..f3706ba
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-corners.gif
new file mode 100755
index 0000000..9137750
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-sides.gif
new file mode 100755
index 0000000..edff2b2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-bg.gif
new file mode 100755
index 0000000..03ca692
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-corners.gif
new file mode 100755
index 0000000..7466b5d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-sides.gif
new file mode 100755
index 0000000..896e181
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-bg.gif
new file mode 100755
index 0000000..03ca692
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-corners.gif
new file mode 100755
index 0000000..7466b5d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-sides.gif
new file mode 100755
index 0000000..896e181
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-bg.gif
new file mode 100755
index 0000000..fc79aea
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-corners.gif
new file mode 100755
index 0000000..477d5bb
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-sides.gif
new file mode 100755
index 0000000..1da24ee
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-large-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-large-sides.gif
new file mode 100755
index 0000000..8c18988
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-large-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-bg.gif
new file mode 100755
index 0000000..c858645
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-corners.gif
new file mode 100755
index 0000000..29fe186
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-bg.gif
new file mode 100755
index 0000000..b03af35
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-corners.gif
new file mode 100755
index 0000000..7d44a4e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-sides.gif
new file mode 100755
index 0000000..ef79b91
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-bg.gif
new file mode 100755
index 0000000..25b27ad
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-corners.gif
new file mode 100755
index 0000000..7466b5d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-sides.gif
new file mode 100755
index 0000000..9ca76f8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-bg.gif
new file mode 100755
index 0000000..25b27ad
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-corners.gif
new file mode 100755
index 0000000..7466b5d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-sides.gif
new file mode 100755
index 0000000..9ca76f8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-bg.gif
new file mode 100755
index 0000000..7299470
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-corners.gif
new file mode 100755
index 0000000..9533cde
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-sides.gif
new file mode 100755
index 0000000..ab47f16
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-medium-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-sides.gif
new file mode 100755
index 0000000..7ec6186
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-medium-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-bg.gif
new file mode 100755
index 0000000..eb930d1
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-corners.gif
new file mode 100755
index 0000000..f075cbf
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-bg.gif
new file mode 100755
index 0000000..cac2151
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-corners.gif
new file mode 100755
index 0000000..7d44a4e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-sides.gif
new file mode 100755
index 0000000..28f51a8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-bg.gif
new file mode 100755
index 0000000..bfb864f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-corners.gif
new file mode 100755
index 0000000..0326eef
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-sides.gif
new file mode 100755
index 0000000..2d90e1e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-bg.gif
new file mode 100755
index 0000000..bfb864f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-corners.gif
new file mode 100755
index 0000000..252a7ad
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-sides.gif
new file mode 100755
index 0000000..2d90e1e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-bg.gif
new file mode 100755
index 0000000..d1d244b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-corners.gif
new file mode 100755
index 0000000..9533cde
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-sides.gif
new file mode 100755
index 0000000..2675355
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-small-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-small-sides.gif
new file mode 100755
index 0000000..fa4d868
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-small-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-disabled-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-disabled-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-disabled-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-disabled-sides.gif
new file mode 100755
index 0000000..51698b0
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-bg.gif
new file mode 100755
index 0000000..6ec023a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-corners.gif
new file mode 100755
index 0000000..ca45195
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-sides.gif
new file mode 100755
index 0000000..c081bb1
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-bg.gif
new file mode 100755
index 0000000..6ec023a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-corners.gif
new file mode 100755
index 0000000..ca45195
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-sides.gif
new file mode 100755
index 0000000..c081bb1
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-bg.gif
new file mode 100755
index 0000000..3362886
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-corners.gif
new file mode 100755
index 0000000..b2927a9
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-sides.gif
new file mode 100755
index 0000000..73614a9
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-sides.gif
new file mode 100755
index 0000000..51698b0
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-large-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-disabled-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-disabled-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-disabled-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-disabled-sides.gif
new file mode 100755
index 0000000..94256ef
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-bg.gif
new file mode 100755
index 0000000..25b27ad
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-corners.gif
new file mode 100755
index 0000000..7466b5d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-sides.gif
new file mode 100755
index 0000000..9ca76f8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-bg.gif
new file mode 100755
index 0000000..25b27ad
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-corners.gif
new file mode 100755
index 0000000..7466b5d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-sides.gif
new file mode 100755
index 0000000..9ca76f8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-bg.gif
new file mode 100755
index 0000000..7299470
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-corners.gif
new file mode 100755
index 0000000..9533cde
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-sides.gif
new file mode 100755
index 0000000..ab47f16
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-sides.gif
new file mode 100755
index 0000000..94256ef
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-medium-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-disabled-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-disabled-corners.gif
new file mode 100755
index 0000000..f19715a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-disabled-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-disabled-sides.gif
new file mode 100755
index 0000000..522f864
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-bg.gif
new file mode 100755
index 0000000..bfb864f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-corners.gif
new file mode 100755
index 0000000..773747d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-sides.gif
new file mode 100755
index 0000000..2d90e1e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-focus-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-bg.gif
new file mode 100755
index 0000000..bfb864f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-corners.gif
new file mode 100755
index 0000000..773747d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-sides.gif
new file mode 100755
index 0000000..2d90e1e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-bg.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-bg.gif
new file mode 100755
index 0000000..d1d244b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-corners.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-corners.gif
new file mode 100755
index 0000000..9533cde
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-sides.gif
new file mode 100755
index 0000000..2675355
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-pressed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-sides.gif b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-sides.gif
new file mode 100755
index 0000000..522f864
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/btn/btn-default-toolbar-small-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/arrow.gif b/interface/ext/resources/themes/images/gray/button/arrow.gif
new file mode 100755
index 0000000..3ab4f71
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/arrow.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/btn-arrow.gif b/interface/ext/resources/themes/images/gray/button/btn-arrow.gif
new file mode 100755
index 0000000..f90d5df
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/btn-arrow.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/btn-sprite.gif b/interface/ext/resources/themes/images/gray/button/btn-sprite.gif
new file mode 100755
index 0000000..834ff97
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/btn-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/btn.gif b/interface/ext/resources/themes/images/gray/button/btn.gif
new file mode 100755
index 0000000..96ea61a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/btn.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/group-cs.gif b/interface/ext/resources/themes/images/gray/button/group-cs.gif
new file mode 100755
index 0000000..7059e2b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/group-cs.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/group-lr.gif b/interface/ext/resources/themes/images/gray/button/group-lr.gif
new file mode 100755
index 0000000..3f41fbd
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/group-lr.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/group-tb.gif b/interface/ext/resources/themes/images/gray/button/group-tb.gif
new file mode 100755
index 0000000..c5ea8ca
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/group-tb.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/s-arrow-b-noline.gif b/interface/ext/resources/themes/images/gray/button/s-arrow-b-noline.gif
new file mode 100755
index 0000000..a4220ee
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/s-arrow-b-noline.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/s-arrow-b.gif b/interface/ext/resources/themes/images/gray/button/s-arrow-b.gif
new file mode 100755
index 0000000..84b6470
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/s-arrow-b.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/s-arrow-bo.gif b/interface/ext/resources/themes/images/gray/button/s-arrow-bo.gif
new file mode 100755
index 0000000..fa5b2f4
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/s-arrow-bo.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/s-arrow-light.gif b/interface/ext/resources/themes/images/gray/button/s-arrow-light.gif
new file mode 100755
index 0000000..08783c9
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/s-arrow-light.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/s-arrow-noline.gif b/interface/ext/resources/themes/images/gray/button/s-arrow-noline.gif
new file mode 100755
index 0000000..0953eab
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/s-arrow-noline.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/s-arrow-o.gif b/interface/ext/resources/themes/images/gray/button/s-arrow-o.gif
new file mode 100755
index 0000000..52a5141
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/s-arrow-o.gif differ
diff --git a/interface/ext/resources/themes/images/gray/button/s-arrow.gif b/interface/ext/resources/themes/images/gray/button/s-arrow.gif
new file mode 100755
index 0000000..8940774
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/button/s-arrow.gif differ
diff --git a/interface/ext/resources/themes/images/gray/datepicker/datepicker-footer-bg.gif b/interface/ext/resources/themes/images/gray/datepicker/datepicker-footer-bg.gif
new file mode 100755
index 0000000..e4993a2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/datepicker/datepicker-footer-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/datepicker/datepicker-footer-bg.png b/interface/ext/resources/themes/images/gray/datepicker/datepicker-footer-bg.png
new file mode 100755
index 0000000..c062d0d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/datepicker/datepicker-footer-bg.png differ
diff --git a/interface/ext/resources/themes/images/gray/datepicker/datepicker-header-bg.gif b/interface/ext/resources/themes/images/gray/datepicker/datepicker-header-bg.gif
new file mode 100755
index 0000000..2427815
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/datepicker/datepicker-header-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/datepicker/datepicker-header-bg.png b/interface/ext/resources/themes/images/gray/datepicker/datepicker-header-bg.png
new file mode 100755
index 0000000..45d74d7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/datepicker/datepicker-header-bg.png differ
diff --git a/interface/ext/resources/themes/images/gray/dd/drop-add.gif b/interface/ext/resources/themes/images/gray/dd/drop-add.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/dd/drop-add.gif differ
diff --git a/interface/ext/resources/themes/images/gray/dd/drop-no.gif b/interface/ext/resources/themes/images/gray/dd/drop-no.gif
new file mode 100755
index 0000000..08d0833
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/dd/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/gray/dd/drop-yes.gif b/interface/ext/resources/themes/images/gray/dd/drop-yes.gif
new file mode 100755
index 0000000..8aacb30
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/dd/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/gray/editor/tb-sprite.gif b/interface/ext/resources/themes/images/gray/editor/tb-sprite.gif
new file mode 100755
index 0000000..fb70577
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/editor/tb-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-corners.gif b/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-corners.gif
new file mode 100755
index 0000000..a16f169
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-default-corners.gif b/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-default-corners.gif
new file mode 100755
index 0000000..a16f169
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-default-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-default-sides.gif b/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-default-sides.gif
new file mode 100755
index 0000000..bd64f32
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-default-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-sides.gif b/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-sides.gif
new file mode 100755
index 0000000..bd64f32
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form-invalid-tip/form-invalid-tip-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/checkbox.gif b/interface/ext/resources/themes/images/gray/form/checkbox.gif
new file mode 100755
index 0000000..835b346
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/checkbox.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/clear-trigger.gif b/interface/ext/resources/themes/images/gray/form/clear-trigger.gif
new file mode 100755
index 0000000..be3ff58
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/clear-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/date-trigger.gif b/interface/ext/resources/themes/images/gray/form/date-trigger.gif
new file mode 100755
index 0000000..e0537cb
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/date-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/error-tip-corners.gif b/interface/ext/resources/themes/images/gray/form/error-tip-corners.gif
new file mode 100755
index 0000000..6ea4c38
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/error-tip-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/exclamation.gif b/interface/ext/resources/themes/images/gray/form/exclamation.gif
new file mode 100755
index 0000000..ea31a30
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/exclamation.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/radio.gif b/interface/ext/resources/themes/images/gray/form/radio.gif
new file mode 100755
index 0000000..36bb91d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/radio.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/search-trigger.gif b/interface/ext/resources/themes/images/gray/form/search-trigger.gif
new file mode 100755
index 0000000..0cc4f59
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/search-trigger.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/spinner-small.gif b/interface/ext/resources/themes/images/gray/form/spinner-small.gif
new file mode 100755
index 0000000..e70f8d8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/spinner-small.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/spinner.gif b/interface/ext/resources/themes/images/gray/form/spinner.gif
new file mode 100755
index 0000000..1e323bf
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/spinner.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/text-bg.gif b/interface/ext/resources/themes/images/gray/form/text-bg.gif
new file mode 100755
index 0000000..4179607
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/text-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/trigger-square.gif b/interface/ext/resources/themes/images/gray/form/trigger-square.gif
new file mode 100755
index 0000000..7a0f585
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/trigger-square.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/trigger-tpl.gif b/interface/ext/resources/themes/images/gray/form/trigger-tpl.gif
new file mode 100755
index 0000000..e3701a3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/trigger-tpl.gif differ
diff --git a/interface/ext/resources/themes/images/gray/form/trigger.gif b/interface/ext/resources/themes/images/gray/form/trigger.gif
new file mode 100755
index 0000000..b563474
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/form/trigger.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/arrow-left-white.gif b/interface/ext/resources/themes/images/gray/grid/arrow-left-white.gif
new file mode 100755
index 0000000..63088f5
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/arrow-left-white.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/arrow-right-white.gif b/interface/ext/resources/themes/images/gray/grid/arrow-right-white.gif
new file mode 100755
index 0000000..e9e0678
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/arrow-right-white.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/cell-special-bg.gif b/interface/ext/resources/themes/images/gray/grid/cell-special-bg.gif
new file mode 100755
index 0000000..d76ffbc
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/cell-special-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/cell-special-bg.png b/interface/ext/resources/themes/images/gray/grid/cell-special-bg.png
new file mode 100755
index 0000000..0bcc236
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/cell-special-bg.png differ
diff --git a/interface/ext/resources/themes/images/gray/grid/cell-special-selected-bg.gif b/interface/ext/resources/themes/images/gray/grid/cell-special-selected-bg.gif
new file mode 100755
index 0000000..f1da867
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/cell-special-selected-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/cell-special-selected-bg.png b/interface/ext/resources/themes/images/gray/grid/cell-special-selected-bg.png
new file mode 100755
index 0000000..500c3bd
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/cell-special-selected-bg.png differ
diff --git a/interface/ext/resources/themes/images/gray/grid/checked.gif b/interface/ext/resources/themes/images/gray/grid/checked.gif
new file mode 100755
index 0000000..fad5893
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/checked.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/col-move-bottom.gif b/interface/ext/resources/themes/images/gray/grid/col-move-bottom.gif
new file mode 100755
index 0000000..c525f7e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/col-move-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/col-move-top.gif b/interface/ext/resources/themes/images/gray/grid/col-move-top.gif
new file mode 100755
index 0000000..ccc92b6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/col-move-top.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/column-header-bg.gif b/interface/ext/resources/themes/images/gray/grid/column-header-bg.gif
new file mode 100755
index 0000000..5895dba
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/column-header-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/column-header-bg.png b/interface/ext/resources/themes/images/gray/grid/column-header-bg.png
new file mode 100755
index 0000000..b181a47
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/column-header-bg.png differ
diff --git a/interface/ext/resources/themes/images/gray/grid/column-header-over-bg.gif b/interface/ext/resources/themes/images/gray/grid/column-header-over-bg.gif
new file mode 100755
index 0000000..9a60738
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/column-header-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/column-header-over-bg.png b/interface/ext/resources/themes/images/gray/grid/column-header-over-bg.png
new file mode 100755
index 0000000..3f20649
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/column-header-over-bg.png differ
diff --git a/interface/ext/resources/themes/images/gray/grid/columns.gif b/interface/ext/resources/themes/images/gray/grid/columns.gif
new file mode 100755
index 0000000..2d3a823
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/columns.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-left.gif b/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-left.gif
new file mode 100755
index 0000000..5d923b2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-left.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-left.png b/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-left.png
new file mode 100755
index 0000000..5dc6967
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-left.png differ
diff --git a/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-right.gif b/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-right.gif
new file mode 100755
index 0000000..8d154db
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-right.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-right.png b/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-right.png
new file mode 100755
index 0000000..b1a1819
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/dd-insert-arrow-right.png differ
diff --git a/interface/ext/resources/themes/images/gray/grid/dirty.gif b/interface/ext/resources/themes/images/gray/grid/dirty.gif
new file mode 100755
index 0000000..4f217a4
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/dirty.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/done.gif b/interface/ext/resources/themes/images/gray/grid/done.gif
new file mode 100755
index 0000000..a937cb2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/done.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/drop-no.gif b/interface/ext/resources/themes/images/gray/grid/drop-no.gif
new file mode 100755
index 0000000..31a332b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/drop-yes.gif b/interface/ext/resources/themes/images/gray/grid/drop-yes.gif
new file mode 100755
index 0000000..926010e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/footer-bg.gif b/interface/ext/resources/themes/images/gray/grid/footer-bg.gif
new file mode 100755
index 0000000..126120f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/footer-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid-blue-hd.gif b/interface/ext/resources/themes/images/gray/grid/grid-blue-hd.gif
new file mode 100755
index 0000000..862094e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid-blue-hd.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid-blue-split.gif b/interface/ext/resources/themes/images/gray/grid/grid-blue-split.gif
new file mode 100755
index 0000000..5286f58
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid-blue-split.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid-hrow.gif b/interface/ext/resources/themes/images/gray/grid/grid-hrow.gif
new file mode 100755
index 0000000..6374104
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid-hrow.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid-loading.gif b/interface/ext/resources/themes/images/gray/grid/grid-loading.gif
new file mode 100755
index 0000000..d112c54
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid-loading.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid-split.gif b/interface/ext/resources/themes/images/gray/grid/grid-split.gif
new file mode 100755
index 0000000..c76a16e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid-split.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid-vista-hd.gif b/interface/ext/resources/themes/images/gray/grid/grid-vista-hd.gif
new file mode 100755
index 0000000..d097263
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid-vista-hd.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid3-hd-btn.gif b/interface/ext/resources/themes/images/gray/grid/grid3-hd-btn.gif
new file mode 100755
index 0000000..daf1ef2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid3-hd-btn.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid3-hrow-over.gif b/interface/ext/resources/themes/images/gray/grid/grid3-hrow-over.gif
new file mode 100755
index 0000000..f9c07af
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid3-hrow-over.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid3-hrow.gif b/interface/ext/resources/themes/images/gray/grid/grid3-hrow.gif
new file mode 100755
index 0000000..8d459a3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid3-hrow.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/grid3-rowheader.gif b/interface/ext/resources/themes/images/gray/grid/grid3-rowheader.gif
new file mode 100755
index 0000000..2799b45
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/grid3-rowheader.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/group-by.gif b/interface/ext/resources/themes/images/gray/grid/group-by.gif
new file mode 100755
index 0000000..d6075bb
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/group-by.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/group-collapse.gif b/interface/ext/resources/themes/images/gray/grid/group-collapse.gif
new file mode 100755
index 0000000..c9ad30d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/group-collapse.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/group-expand-sprite.gif b/interface/ext/resources/themes/images/gray/grid/group-expand-sprite.gif
new file mode 100755
index 0000000..d24891d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/group-expand-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/group-expand.gif b/interface/ext/resources/themes/images/gray/grid/group-expand.gif
new file mode 100755
index 0000000..663b5c8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/group-expand.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/hd-pop.gif b/interface/ext/resources/themes/images/gray/grid/hd-pop.gif
new file mode 100755
index 0000000..eb8ba79
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/hd-pop.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/hmenu-asc.gif b/interface/ext/resources/themes/images/gray/grid/hmenu-asc.gif
new file mode 100755
index 0000000..8917e0e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/hmenu-asc.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/hmenu-desc.gif b/interface/ext/resources/themes/images/gray/grid/hmenu-desc.gif
new file mode 100755
index 0000000..f26b7c2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/hmenu-desc.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/hmenu-lock.gif b/interface/ext/resources/themes/images/gray/grid/hmenu-lock.gif
new file mode 100755
index 0000000..1596126
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/hmenu-lock.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/hmenu-lock.png b/interface/ext/resources/themes/images/gray/grid/hmenu-lock.png
new file mode 100755
index 0000000..8b81e7f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/hmenu-lock.png differ
diff --git a/interface/ext/resources/themes/images/gray/grid/hmenu-unlock.gif b/interface/ext/resources/themes/images/gray/grid/hmenu-unlock.gif
new file mode 100755
index 0000000..af59cf9
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/hmenu-unlock.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/hmenu-unlock.png b/interface/ext/resources/themes/images/gray/grid/hmenu-unlock.png
new file mode 100755
index 0000000..9dd5df3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/hmenu-unlock.png differ
diff --git a/interface/ext/resources/themes/images/gray/grid/invalid_line.gif b/interface/ext/resources/themes/images/gray/grid/invalid_line.gif
new file mode 100755
index 0000000..fb7e0f3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/invalid_line.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/loading.gif b/interface/ext/resources/themes/images/gray/grid/loading.gif
new file mode 100755
index 0000000..e846e1d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/loading.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/mso-hd.gif b/interface/ext/resources/themes/images/gray/grid/mso-hd.gif
new file mode 100755
index 0000000..669f3cf
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/mso-hd.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/nowait.gif b/interface/ext/resources/themes/images/gray/grid/nowait.gif
new file mode 100755
index 0000000..4c5862c
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/nowait.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/page-first-disabled.gif b/interface/ext/resources/themes/images/gray/grid/page-first-disabled.gif
new file mode 100755
index 0000000..1e02c41
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/page-first-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/page-first.gif b/interface/ext/resources/themes/images/gray/grid/page-first.gif
new file mode 100755
index 0000000..60be4bc
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/page-first.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/page-last-disabled.gif b/interface/ext/resources/themes/images/gray/grid/page-last-disabled.gif
new file mode 100755
index 0000000..8697067
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/page-last-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/page-last.gif b/interface/ext/resources/themes/images/gray/grid/page-last.gif
new file mode 100755
index 0000000..beb4a83
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/page-last.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/page-next-disabled.gif b/interface/ext/resources/themes/images/gray/grid/page-next-disabled.gif
new file mode 100755
index 0000000..90a7756
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/page-next-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/page-next.gif b/interface/ext/resources/themes/images/gray/grid/page-next.gif
new file mode 100755
index 0000000..97db1c2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/page-next.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/page-prev-disabled.gif b/interface/ext/resources/themes/images/gray/grid/page-prev-disabled.gif
new file mode 100755
index 0000000..37154d6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/page-prev-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/page-prev.gif b/interface/ext/resources/themes/images/gray/grid/page-prev.gif
new file mode 100755
index 0000000..d07e61c
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/page-prev.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/pick-button.gif b/interface/ext/resources/themes/images/gray/grid/pick-button.gif
new file mode 100755
index 0000000..6957924
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/pick-button.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/property-cell-bg.gif b/interface/ext/resources/themes/images/gray/grid/property-cell-bg.gif
new file mode 100755
index 0000000..77d029f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/property-cell-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/property-cell-selected-bg.gif b/interface/ext/resources/themes/images/gray/grid/property-cell-selected-bg.gif
new file mode 100755
index 0000000..1dfe9a6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/property-cell-selected-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/refresh-disabled.gif b/interface/ext/resources/themes/images/gray/grid/refresh-disabled.gif
new file mode 100755
index 0000000..607800b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/refresh-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/refresh.gif b/interface/ext/resources/themes/images/gray/grid/refresh.gif
new file mode 100755
index 0000000..868b2dc
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/refresh.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/row-check-sprite.gif b/interface/ext/resources/themes/images/gray/grid/row-check-sprite.gif
new file mode 100755
index 0000000..6101164
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/row-check-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/row-expand-sprite.gif b/interface/ext/resources/themes/images/gray/grid/row-expand-sprite.gif
new file mode 100755
index 0000000..09c00a6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/row-expand-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/row-over.gif b/interface/ext/resources/themes/images/gray/grid/row-over.gif
new file mode 100755
index 0000000..b288e38
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/row-over.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/row-sel.gif b/interface/ext/resources/themes/images/gray/grid/row-sel.gif
new file mode 100755
index 0000000..98209e6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/row-sel.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/sort-hd.gif b/interface/ext/resources/themes/images/gray/grid/sort-hd.gif
new file mode 100755
index 0000000..4cf483d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/sort-hd.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/sort_asc.gif b/interface/ext/resources/themes/images/gray/grid/sort_asc.gif
new file mode 100755
index 0000000..7e562e2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/sort_asc.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/sort_desc.gif b/interface/ext/resources/themes/images/gray/grid/sort_desc.gif
new file mode 100755
index 0000000..9b7a871
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/sort_desc.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/unchecked.gif b/interface/ext/resources/themes/images/gray/grid/unchecked.gif
new file mode 100755
index 0000000..43823e5
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/unchecked.gif differ
diff --git a/interface/ext/resources/themes/images/gray/grid/wait.gif b/interface/ext/resources/themes/images/gray/grid/wait.gif
new file mode 100755
index 0000000..471c1a4
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/grid/wait.gif differ
diff --git a/interface/ext/resources/themes/images/gray/layout/mini-bottom.gif b/interface/ext/resources/themes/images/gray/layout/mini-bottom.gif
new file mode 100755
index 0000000..c18f9e3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/layout/mini-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/gray/layout/mini-left.gif b/interface/ext/resources/themes/images/gray/layout/mini-left.gif
new file mode 100755
index 0000000..99f7993
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/layout/mini-left.gif differ
diff --git a/interface/ext/resources/themes/images/gray/layout/mini-right.gif b/interface/ext/resources/themes/images/gray/layout/mini-right.gif
new file mode 100755
index 0000000..5b13c5a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/layout/mini-right.gif differ
diff --git a/interface/ext/resources/themes/images/gray/layout/mini-top.gif b/interface/ext/resources/themes/images/gray/layout/mini-top.gif
new file mode 100755
index 0000000..a4ca2bb
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/layout/mini-top.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/checked.gif b/interface/ext/resources/themes/images/gray/menu/checked.gif
new file mode 100755
index 0000000..fad5893
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/checked.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/group-checked.gif b/interface/ext/resources/themes/images/gray/menu/group-checked.gif
new file mode 100755
index 0000000..c882488
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/group-checked.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/item-over-disabled.gif b/interface/ext/resources/themes/images/gray/menu/item-over-disabled.gif
new file mode 100755
index 0000000..97d5ffa
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/item-over-disabled.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/item-over.gif b/interface/ext/resources/themes/images/gray/menu/item-over.gif
new file mode 100755
index 0000000..e0dc5f7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/item-over.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/menu-item-active-bg.gif b/interface/ext/resources/themes/images/gray/menu/menu-item-active-bg.gif
new file mode 100755
index 0000000..2edcaf8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/menu-item-active-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/menu-item-active-corners.gif b/interface/ext/resources/themes/images/gray/menu/menu-item-active-corners.gif
new file mode 100755
index 0000000..45041a8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/menu-item-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/menu-item-active-sides.gif b/interface/ext/resources/themes/images/gray/menu/menu-item-active-sides.gif
new file mode 100755
index 0000000..2f14a8c
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/menu-item-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/menu-parent.gif b/interface/ext/resources/themes/images/gray/menu/menu-parent.gif
new file mode 100755
index 0000000..5461a8b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/menu-parent.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/menu.gif b/interface/ext/resources/themes/images/gray/menu/menu.gif
new file mode 100755
index 0000000..30a2c4b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/menu.gif differ
diff --git a/interface/ext/resources/themes/images/gray/menu/unchecked.gif b/interface/ext/resources/themes/images/gray/menu/unchecked.gif
new file mode 100755
index 0000000..43823e5
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/menu/unchecked.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-bottom-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-bottom-bg.gif
new file mode 100755
index 0000000..54f62aa
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-bg.gif
new file mode 100755
index 0000000..9b2f057
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-corners.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-corners.gif
new file mode 100755
index 0000000..9d6aaaf
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-sides.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-sides.gif
new file mode 100755
index 0000000..b4eba79
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif
new file mode 100755
index 0000000..f68ef47
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif
new file mode 100755
index 0000000..7d03854
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif
new file mode 100755
index 0000000..e2bb230
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-bg.gif
new file mode 100755
index 0000000..360fbb0
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-corners.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-corners.gif
new file mode 100755
index 0000000..e4b7d1d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-sides.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-sides.gif
new file mode 100755
index 0000000..63526a7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-bg.gif
new file mode 100755
index 0000000..82a5869
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-corners.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-corners.gif
new file mode 100755
index 0000000..5cbcbb6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-sides.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-sides.gif
new file mode 100755
index 0000000..a95bab4
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-bg.gif
new file mode 100755
index 0000000..f1bf548
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-corners.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-corners.gif
new file mode 100755
index 0000000..3b08d54
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-sides.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-sides.gif
new file mode 100755
index 0000000..16f5233
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-collapsed-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-bg.gif
new file mode 100755
index 0000000..1285ccb
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-corners.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-corners.gif
new file mode 100755
index 0000000..620f8db
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-sides.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-sides.gif
new file mode 100755
index 0000000..eecdf66
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-bg.gif
new file mode 100755
index 0000000..68113ab
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-corners.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-corners.gif
new file mode 100755
index 0000000..80a12ba
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-sides.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-sides.gif
new file mode 100755
index 0000000..825a104
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-bg.gif
new file mode 100755
index 0000000..0c64048
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-corners.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-corners.gif
new file mode 100755
index 0000000..e94d882
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-sides.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-sides.gif
new file mode 100755
index 0000000..b2dcaad
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-framed-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-left-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-left-bg.gif
new file mode 100755
index 0000000..c95dd31
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-left-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-right-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-right-bg.gif
new file mode 100755
index 0000000..cdc8017
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-right-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-top-bg.gif b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-top-bg.gif
new file mode 100755
index 0000000..d256e1b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel-header/panel-header-default-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel/panel-default-framed-corners.gif b/interface/ext/resources/themes/images/gray/panel/panel-default-framed-corners.gif
new file mode 100755
index 0000000..06cb319
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel/panel-default-framed-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/panel/panel-default-framed-sides.gif b/interface/ext/resources/themes/images/gray/panel/panel-default-framed-sides.gif
new file mode 100755
index 0000000..3391ee6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/panel/panel-default-framed-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/progress/progress-default-bg.gif b/interface/ext/resources/themes/images/gray/progress/progress-default-bg.gif
new file mode 100755
index 0000000..b29379d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/progress/progress-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/blue-loading.gif b/interface/ext/resources/themes/images/gray/shared/blue-loading.gif
new file mode 100755
index 0000000..3bbf639
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/blue-loading.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/calendar.gif b/interface/ext/resources/themes/images/gray/shared/calendar.gif
new file mode 100755
index 0000000..133cf23
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/calendar.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/glass-bg.gif b/interface/ext/resources/themes/images/gray/shared/glass-bg.gif
new file mode 100755
index 0000000..26fbbae
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/glass-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/hd-sprite.gif b/interface/ext/resources/themes/images/gray/shared/hd-sprite.gif
new file mode 100755
index 0000000..42da1ea
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/hd-sprite.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/icon-error.gif b/interface/ext/resources/themes/images/gray/shared/icon-error.gif
new file mode 100755
index 0000000..397b655
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/icon-error.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/icon-info.gif b/interface/ext/resources/themes/images/gray/shared/icon-info.gif
new file mode 100755
index 0000000..58281c3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/icon-info.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/icon-question.gif b/interface/ext/resources/themes/images/gray/shared/icon-question.gif
new file mode 100755
index 0000000..08abd82
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/icon-question.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/icon-warning.gif b/interface/ext/resources/themes/images/gray/shared/icon-warning.gif
new file mode 100755
index 0000000..27ff98b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/icon-warning.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/large-loading.gif b/interface/ext/resources/themes/images/gray/shared/large-loading.gif
new file mode 100755
index 0000000..b36b555
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/large-loading.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/left-btn.gif b/interface/ext/resources/themes/images/gray/shared/left-btn.gif
new file mode 100755
index 0000000..3301054
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/left-btn.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/loading-balls.gif b/interface/ext/resources/themes/images/gray/shared/loading-balls.gif
new file mode 100755
index 0000000..9ce214b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/loading-balls.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/right-btn.gif b/interface/ext/resources/themes/images/gray/shared/right-btn.gif
new file mode 100755
index 0000000..c529110
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/right-btn.gif differ
diff --git a/interface/ext/resources/themes/images/gray/shared/shadow-c.png b/interface/ext/resources/themes/images/gray/shared/shadow-c.png
new file mode 100755
index 0000000..d435f80
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/shadow-c.png differ
diff --git a/interface/ext/resources/themes/images/gray/shared/shadow-lr.png b/interface/ext/resources/themes/images/gray/shared/shadow-lr.png
new file mode 100755
index 0000000..bb88b6f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/shadow-lr.png differ
diff --git a/interface/ext/resources/themes/images/gray/shared/shadow.png b/interface/ext/resources/themes/images/gray/shared/shadow.png
new file mode 100755
index 0000000..75c0eba
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/shadow.png differ
diff --git a/interface/ext/resources/themes/images/gray/shared/warning.gif b/interface/ext/resources/themes/images/gray/shared/warning.gif
new file mode 100755
index 0000000..806d4bc
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/shared/warning.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/e-handle-dark.gif b/interface/ext/resources/themes/images/gray/sizer/e-handle-dark.gif
new file mode 100755
index 0000000..b5486c1
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/e-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/e-handle.gif b/interface/ext/resources/themes/images/gray/sizer/e-handle.gif
new file mode 100755
index 0000000..a8ed0ed
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/e-handle.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/ne-handle-dark.gif b/interface/ext/resources/themes/images/gray/sizer/ne-handle-dark.gif
new file mode 100755
index 0000000..04e5ecf
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/ne-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/ne-handle.gif b/interface/ext/resources/themes/images/gray/sizer/ne-handle.gif
new file mode 100755
index 0000000..6f7b0c2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/ne-handle.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/nw-handle-dark.gif b/interface/ext/resources/themes/images/gray/sizer/nw-handle-dark.gif
new file mode 100755
index 0000000..6e49d69
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/nw-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/nw-handle.gif b/interface/ext/resources/themes/images/gray/sizer/nw-handle.gif
new file mode 100755
index 0000000..92ad82c
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/nw-handle.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/s-handle-dark.gif b/interface/ext/resources/themes/images/gray/sizer/s-handle-dark.gif
new file mode 100755
index 0000000..4eb5f0f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/s-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/s-handle.gif b/interface/ext/resources/themes/images/gray/sizer/s-handle.gif
new file mode 100755
index 0000000..d7eeae2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/s-handle.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/se-handle-dark.gif b/interface/ext/resources/themes/images/gray/sizer/se-handle-dark.gif
new file mode 100755
index 0000000..c4c1087
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/se-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/se-handle.gif b/interface/ext/resources/themes/images/gray/sizer/se-handle.gif
new file mode 100755
index 0000000..f011a3b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/se-handle.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/square.gif b/interface/ext/resources/themes/images/gray/sizer/square.gif
new file mode 100755
index 0000000..7751d5e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/square.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/sw-handle-dark.gif b/interface/ext/resources/themes/images/gray/sizer/sw-handle-dark.gif
new file mode 100755
index 0000000..77224b0
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/sw-handle-dark.gif differ
diff --git a/interface/ext/resources/themes/images/gray/sizer/sw-handle.gif b/interface/ext/resources/themes/images/gray/sizer/sw-handle.gif
new file mode 100755
index 0000000..aa903dd
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/sizer/sw-handle.gif differ
diff --git a/interface/ext/resources/themes/images/gray/slider/slider-bg.gif b/interface/ext/resources/themes/images/gray/slider/slider-bg.gif
new file mode 100755
index 0000000..fbf3ba8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/slider/slider-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/slider/slider-bg.png b/interface/ext/resources/themes/images/gray/slider/slider-bg.png
new file mode 100755
index 0000000..b3eaf52
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/slider/slider-bg.png differ
diff --git a/interface/ext/resources/themes/images/gray/slider/slider-thumb.gif b/interface/ext/resources/themes/images/gray/slider/slider-thumb.gif
new file mode 100755
index 0000000..5ba1dfb
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/slider/slider-thumb.gif differ
diff --git a/interface/ext/resources/themes/images/gray/slider/slider-thumb.png b/interface/ext/resources/themes/images/gray/slider/slider-thumb.png
new file mode 100755
index 0000000..4bf01be
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/slider/slider-thumb.png differ
diff --git a/interface/ext/resources/themes/images/gray/slider/slider-v-bg.gif b/interface/ext/resources/themes/images/gray/slider/slider-v-bg.gif
new file mode 100755
index 0000000..0cf8c4b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/slider/slider-v-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/slider/slider-v-bg.png b/interface/ext/resources/themes/images/gray/slider/slider-v-bg.png
new file mode 100755
index 0000000..121450c
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/slider/slider-v-bg.png differ
diff --git a/interface/ext/resources/themes/images/gray/slider/slider-v-thumb.gif b/interface/ext/resources/themes/images/gray/slider/slider-v-thumb.gif
new file mode 100755
index 0000000..58afe96
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/slider/slider-v-thumb.gif differ
diff --git a/interface/ext/resources/themes/images/gray/slider/slider-v-thumb.png b/interface/ext/resources/themes/images/gray/slider/slider-v-thumb.png
new file mode 100755
index 0000000..6b3eeb7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/slider/slider-v-thumb.png differ
diff --git a/interface/ext/resources/themes/images/gray/tab-bar/scroll-left.gif b/interface/ext/resources/themes/images/gray/tab-bar/scroll-left.gif
new file mode 100755
index 0000000..bbb3e3d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab-bar/scroll-left.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab-bar/scroll-right.gif b/interface/ext/resources/themes/images/gray/tab-bar/scroll-right.gif
new file mode 100755
index 0000000..feb6a76
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab-bar/scroll-right.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab-bar/tab-bar-default-bg.gif b/interface/ext/resources/themes/images/gray/tab-bar/tab-bar-default-bg.gif
new file mode 100755
index 0000000..d0f507b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab-bar/tab-bar-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-bg.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-bg.gif
new file mode 100755
index 0000000..2c7b7b3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-corners.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-corners.gif
new file mode 100755
index 0000000..a99eabf
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-sides.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-sides.gif
new file mode 100755
index 0000000..0c90ec0
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-bg.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-bg.gif
new file mode 100755
index 0000000..e85bebe
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-corners.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-corners.gif
new file mode 100755
index 0000000..95a6f12
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-bg.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-bg.gif
new file mode 100755
index 0000000..7969299
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-corners.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-corners.gif
new file mode 100755
index 0000000..d856670
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-sides.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-sides.gif
new file mode 100755
index 0000000..7364cfe
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-bg.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-bg.gif
new file mode 100755
index 0000000..9b0e608
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-corners.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-corners.gif
new file mode 100755
index 0000000..8129ad7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-sides.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-sides.gif
new file mode 100755
index 0000000..697ee94
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-sides.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-sides.gif
new file mode 100755
index 0000000..39e70ae
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-close.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-close.gif
new file mode 100755
index 0000000..98d5da9
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-close.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-bg.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-bg.gif
new file mode 100755
index 0000000..9bd16dd
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-corners.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-corners.gif
new file mode 100755
index 0000000..10220d4
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-sides.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-sides.gif
new file mode 100755
index 0000000..057bd7e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-active-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-bg.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-bg.gif
new file mode 100755
index 0000000..65e303b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-corners.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-corners.gif
new file mode 100755
index 0000000..c1ac52e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-bg.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-bg.gif
new file mode 100755
index 0000000..6ba389c
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-corners.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-corners.gif
new file mode 100755
index 0000000..30a99b0
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-sides.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-sides.gif
new file mode 100755
index 0000000..8ed83d2
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-disabled-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-bg.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-bg.gif
new file mode 100755
index 0000000..64edaf0
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-corners.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-corners.gif
new file mode 100755
index 0000000..54efa0c
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-sides.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-sides.gif
new file mode 100755
index 0000000..90c3f64
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-over-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tab/tab-default-top-sides.gif b/interface/ext/resources/themes/images/gray/tab/tab-default-top-sides.gif
new file mode 100755
index 0000000..39ea2d8
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tab/tab-default-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tip/tip-corners.gif b/interface/ext/resources/themes/images/gray/tip/tip-corners.gif
new file mode 100755
index 0000000..b9000bd
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tip/tip-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tip/tip-sides.gif b/interface/ext/resources/themes/images/gray/tip/tip-sides.gif
new file mode 100755
index 0000000..48ad83d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tip/tip-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/toolbar/more.gif b/interface/ext/resources/themes/images/gray/toolbar/more.gif
new file mode 100755
index 0000000..02c2509
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/toolbar/more.gif differ
diff --git a/interface/ext/resources/themes/images/gray/toolbar/scroll-left.gif b/interface/ext/resources/themes/images/gray/toolbar/scroll-left.gif
new file mode 100755
index 0000000..2db8cf5
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/toolbar/scroll-left.gif differ
diff --git a/interface/ext/resources/themes/images/gray/toolbar/scroll-right.gif b/interface/ext/resources/themes/images/gray/toolbar/scroll-right.gif
new file mode 100755
index 0000000..5d5a7ab
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/toolbar/scroll-right.gif differ
diff --git a/interface/ext/resources/themes/images/gray/toolbar/toolbar-default-bg.gif b/interface/ext/resources/themes/images/gray/toolbar/toolbar-default-bg.gif
new file mode 100755
index 0000000..cd96024
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/toolbar/toolbar-default-bg.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tools/tool-sprite-tpl.gif b/interface/ext/resources/themes/images/gray/tools/tool-sprite-tpl.gif
new file mode 100755
index 0000000..18277a3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tools/tool-sprite-tpl.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tools/tool-sprites.gif b/interface/ext/resources/themes/images/gray/tools/tool-sprites.gif
new file mode 100755
index 0000000..36b6b67
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tools/tool-sprites.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tools/tools-sprites-trans.gif b/interface/ext/resources/themes/images/gray/tools/tools-sprites-trans.gif
new file mode 100755
index 0000000..b6d7ba3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tools/tools-sprites-trans.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/arrows.gif b/interface/ext/resources/themes/images/gray/tree/arrows.gif
new file mode 100755
index 0000000..2683463
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/arrows.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-above.gif b/interface/ext/resources/themes/images/gray/tree/drop-above.gif
new file mode 100755
index 0000000..30d1ca7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-above.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-add.gif b/interface/ext/resources/themes/images/gray/tree/drop-add.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-add.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-append.gif b/interface/ext/resources/themes/images/gray/tree/drop-append.gif
new file mode 100755
index 0000000..b22cd14
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-append.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-below.gif b/interface/ext/resources/themes/images/gray/tree/drop-below.gif
new file mode 100755
index 0000000..85f66b1
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-below.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-between.gif b/interface/ext/resources/themes/images/gray/tree/drop-between.gif
new file mode 100755
index 0000000..5c6c09d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-between.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-no.gif b/interface/ext/resources/themes/images/gray/tree/drop-no.gif
new file mode 100755
index 0000000..9d9c6a9
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-no.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-over.gif b/interface/ext/resources/themes/images/gray/tree/drop-over.gif
new file mode 100755
index 0000000..30d1ca7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-over.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-under.gif b/interface/ext/resources/themes/images/gray/tree/drop-under.gif
new file mode 100755
index 0000000..85f66b1
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-under.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/drop-yes.gif b/interface/ext/resources/themes/images/gray/tree/drop-yes.gif
new file mode 100755
index 0000000..8aacb30
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/drop-yes.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-end-minus-nl.gif b/interface/ext/resources/themes/images/gray/tree/elbow-end-minus-nl.gif
new file mode 100755
index 0000000..928779e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-end-minus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-end-minus.gif b/interface/ext/resources/themes/images/gray/tree/elbow-end-minus.gif
new file mode 100755
index 0000000..9a8d727
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-end-minus.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-end-plus-nl.gif b/interface/ext/resources/themes/images/gray/tree/elbow-end-plus-nl.gif
new file mode 100755
index 0000000..9f7f698
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-end-plus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-end-plus.gif b/interface/ext/resources/themes/images/gray/tree/elbow-end-plus.gif
new file mode 100755
index 0000000..5943a01
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-end-plus.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-end.gif b/interface/ext/resources/themes/images/gray/tree/elbow-end.gif
new file mode 100755
index 0000000..f24ddee
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-end.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-line.gif b/interface/ext/resources/themes/images/gray/tree/elbow-line.gif
new file mode 100755
index 0000000..75e6da4
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-line.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-minus-nl.gif b/interface/ext/resources/themes/images/gray/tree/elbow-minus-nl.gif
new file mode 100755
index 0000000..928779e
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-minus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-minus.gif b/interface/ext/resources/themes/images/gray/tree/elbow-minus.gif
new file mode 100755
index 0000000..97dcc71
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-minus.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-plus-nl.gif b/interface/ext/resources/themes/images/gray/tree/elbow-plus-nl.gif
new file mode 100755
index 0000000..9f7f698
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-plus-nl.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow-plus.gif b/interface/ext/resources/themes/images/gray/tree/elbow-plus.gif
new file mode 100755
index 0000000..698de47
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow-plus.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/elbow.gif b/interface/ext/resources/themes/images/gray/tree/elbow.gif
new file mode 100755
index 0000000..b8f4208
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/elbow.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/folder-open.gif b/interface/ext/resources/themes/images/gray/tree/folder-open.gif
new file mode 100755
index 0000000..56ba737
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/folder-open.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/folder.gif b/interface/ext/resources/themes/images/gray/tree/folder.gif
new file mode 100755
index 0000000..20412f7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/folder.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/leaf.gif b/interface/ext/resources/themes/images/gray/tree/leaf.gif
new file mode 100755
index 0000000..445769d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/leaf.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/loading.gif b/interface/ext/resources/themes/images/gray/tree/loading.gif
new file mode 100755
index 0000000..e846e1d
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/loading.gif differ
diff --git a/interface/ext/resources/themes/images/gray/tree/s.gif b/interface/ext/resources/themes/images/gray/tree/s.gif
new file mode 100755
index 0000000..1d11fa9
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/tree/s.gif differ
diff --git a/interface/ext/resources/themes/images/gray/util/splitter/mini-bottom.gif b/interface/ext/resources/themes/images/gray/util/splitter/mini-bottom.gif
new file mode 100755
index 0000000..c18f9e3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/util/splitter/mini-bottom.gif differ
diff --git a/interface/ext/resources/themes/images/gray/util/splitter/mini-left.gif b/interface/ext/resources/themes/images/gray/util/splitter/mini-left.gif
new file mode 100755
index 0000000..99f7993
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/util/splitter/mini-left.gif differ
diff --git a/interface/ext/resources/themes/images/gray/util/splitter/mini-right.gif b/interface/ext/resources/themes/images/gray/util/splitter/mini-right.gif
new file mode 100755
index 0000000..5b13c5a
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/util/splitter/mini-right.gif differ
diff --git a/interface/ext/resources/themes/images/gray/util/splitter/mini-top.gif b/interface/ext/resources/themes/images/gray/util/splitter/mini-top.gif
new file mode 100755
index 0000000..a4ca2bb
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/util/splitter/mini-top.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window-header/window-header-default-bottom-corners.gif b/interface/ext/resources/themes/images/gray/window-header/window-header-default-bottom-corners.gif
new file mode 100755
index 0000000..2508ffa
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window-header/window-header-default-bottom-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window-header/window-header-default-bottom-sides.gif b/interface/ext/resources/themes/images/gray/window-header/window-header-default-bottom-sides.gif
new file mode 100755
index 0000000..3693bd7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window-header/window-header-default-bottom-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window-header/window-header-default-left-corners.gif b/interface/ext/resources/themes/images/gray/window-header/window-header-default-left-corners.gif
new file mode 100755
index 0000000..2567539
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window-header/window-header-default-left-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window-header/window-header-default-left-sides.gif b/interface/ext/resources/themes/images/gray/window-header/window-header-default-left-sides.gif
new file mode 100755
index 0000000..a75896b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window-header/window-header-default-left-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window-header/window-header-default-right-corners.gif b/interface/ext/resources/themes/images/gray/window-header/window-header-default-right-corners.gif
new file mode 100755
index 0000000..6a630bc
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window-header/window-header-default-right-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window-header/window-header-default-right-sides.gif b/interface/ext/resources/themes/images/gray/window-header/window-header-default-right-sides.gif
new file mode 100755
index 0000000..89d50f7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window-header/window-header-default-right-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window-header/window-header-default-top-corners.gif b/interface/ext/resources/themes/images/gray/window-header/window-header-default-top-corners.gif
new file mode 100755
index 0000000..2d2d8f6
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window-header/window-header-default-top-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window-header/window-header-default-top-sides.gif b/interface/ext/resources/themes/images/gray/window-header/window-header-default-top-sides.gif
new file mode 100755
index 0000000..3693bd7
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window-header/window-header-default-top-sides.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window/icon-error.gif b/interface/ext/resources/themes/images/gray/window/icon-error.gif
new file mode 100755
index 0000000..397b655
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window/icon-error.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window/icon-info.gif b/interface/ext/resources/themes/images/gray/window/icon-info.gif
new file mode 100755
index 0000000..58281c3
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window/icon-info.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window/icon-question.gif b/interface/ext/resources/themes/images/gray/window/icon-question.gif
new file mode 100755
index 0000000..08abd82
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window/icon-question.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window/icon-warning.gif b/interface/ext/resources/themes/images/gray/window/icon-warning.gif
new file mode 100755
index 0000000..27ff98b
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window/icon-warning.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window/window-default-corners.gif b/interface/ext/resources/themes/images/gray/window/window-default-corners.gif
new file mode 100755
index 0000000..f9bccbb
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window/window-default-corners.gif differ
diff --git a/interface/ext/resources/themes/images/gray/window/window-default-sides.gif b/interface/ext/resources/themes/images/gray/window/window-default-sides.gif
new file mode 100755
index 0000000..d02950f
Binary files /dev/null and b/interface/ext/resources/themes/images/gray/window/window-default-sides.gif differ
diff --git a/interface/ext/resources/themes/lib/utils.rb b/interface/ext/resources/themes/lib/utils.rb
new file mode 100755
index 0000000..d105d6c
--- /dev/null
+++ b/interface/ext/resources/themes/lib/utils.rb
@@ -0,0 +1,93 @@
+module ExtJS4
+  module SassExtensions
+    module Functions
+      module Utils
+        def parsebox(list, n)
+          assert_type n, :Number
+          if !n.int?
+            raise ArgumentError.new("List index #{n} must be an integer")
+          elsif n.to_i < 1
+            raise ArgumentError.new("List index #{n} must be greater than or equal to 1")
+          elsif n.to_i > 4
+            raise ArgumentError.new("A box string can't contain more then 4")
+          end
+
+          new_list = list.clone.to_a
+          size = new_list.size
+                      
+          if n.to_i >= size
+            if size == 1
+              new_list[1] = new_list[0]
+              new_list[2] = new_list[0]
+              new_list[3] = new_list[0]
+            elsif size == 2
+              new_list[2] = new_list[0]
+              new_list[3] = new_list[1]
+            elsif size == 3
+              new_list[3] = new_list[1]
+            end
+          end
+          
+          new_list.to_a[n.to_i - 1]
+        end
+        
+        def parseint(value)
+          Sass::Script::Number.new(value.to_i)
+        end
+        
+        # Returns a background-image property for a specified images for the theme
+        def theme_image(theme, path, without_url = false, relative = false)
+          path = path.value
+          theme = theme.value
+          without_url = (without_url.class == FalseClass) ? without_url : without_url.value
+          
+          relative_path = "../images/"
+          
+          if relative
+            if relative.class == Sass::Script::String
+              relative_path = relative.value
+              relative = true
+            elsif relative.class == FalseClass || relative.class == TrueClass
+              relative = relative
+            else
+              relative = relative.value
+            end
+          else
+            relative = false
+          end
+          
+          if relative
+            image_path = File.join(relative_path, theme, path)
+          else
+            images_path = File.join($ext_path, 'resources', 'themes', 'images', theme)
+            image_path = File.join(images_path, path)
+          end
+          
+          if !without_url
+            url = "url('#{image_path}')"
+          else
+            url = "#{image_path}"
+          end
+          
+          Sass::Script::String.new(url)
+        end
+
+        def theme_image_exists(path)
+          result = false
+
+          where_to_look = path.value.gsub('../../resources', 'resources')
+
+          if where_to_look && FileTest.exists?("#{where_to_look}")
+            result = true
+          end
+
+          return Sass::Script::Bool.new(result)
+        end
+      end
+    end
+  end
+end
+
+module Sass::Script::Functions
+  include ExtJS4::SassExtensions::Functions::Utils
+end
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/_all.scss b/interface/ext/resources/themes/stylesheets/ext4/default/_all.scss
new file mode 100755
index 0000000..c758115
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/_all.scss
@@ -0,0 +1,113 @@
+ at import "compass/css3";
+ at import "blueprint/typography";
+
+$include-default: true !default;
+$include-default-uis: true !default;
+
+ at import 'functions';
+ at import 'variables';
+ at import 'mixins';
+
+//core
+ at import 'core';
+
+//layout
+ at import 'layout/layout';
+
+//utils
+ at import 'util/tool';
+ at import 'util/messagebox';
+ at import 'util/splitter';
+ at import 'util/resizable';
+ at import 'util/dragdrop';
+ at import 'util/scroller';
+ at import 'util/focus';
+
+//widgets
+ at import 'widgets';
+
+ at if $scope-reset-css {
+    .#{$prefix}reset {
+        @if $include-default {
+        	@include extjs-boundlist;
+        	@include extjs-button;
+        	@include extjs-btn-group;
+        	@include extjs-datepicker;
+        	@include extjs-colorpicker;
+        	@include extjs-menu;
+        	@include extjs-grid;
+        	@include extjs-form;
+        	    @include extjs-form-field;
+        	    @include extjs-form-fieldset;
+        	    @include extjs-form-file;
+        	    @include extjs-form-checkboxfield;
+        	    @include extjs-form-checkboxgroup;
+        	    @include extjs-form-triggerfield;
+        	    @include extjs-form-htmleditor;
+        	@include extjs-panel;
+        	@include extjs-qtip;
+        	@include extjs-slider;
+        	@include extjs-progress;
+        	@include extjs-toolbar;
+            @include extjs-window;
+            @include extjs-messagebox;
+            @include extjs-tabbar;
+        	@include extjs-tab;
+        	@include extjs-tree;
+        	@include extjs-drawcomponent;
+        	@include extjs-viewport;
+        }
+
+        @include extjs-dragdrop;
+        @include extjs-resizable;
+        @include extjs-splitter;
+        @include extjs-layout;
+        @include extjs-tool;
+        @include extjs-scroller;
+        
+        @include extjs-html;
+    }
+
+    @include extjs-reset-extras;
+}
+ at else {
+    @if $include-default {
+    	@include extjs-boundlist;
+    	@include extjs-button;
+    	@include extjs-btn-group;
+    	@include extjs-datepicker;
+    	@include extjs-colorpicker;
+    	@include extjs-menu;
+    	@include extjs-grid;
+    	@include extjs-form;
+    	    @include extjs-form-field;
+    	    @include extjs-form-fieldset;
+    	    @include extjs-form-file;
+    	    @include extjs-form-checkboxfield;
+    	    @include extjs-form-checkboxgroup;
+    	    @include extjs-form-triggerfield;
+    	    @include extjs-form-htmleditor;
+    	@include extjs-panel;
+    	@include extjs-qtip;
+    	@include extjs-slider;
+    	@include extjs-progress;
+    	@include extjs-toolbar;
+        @include extjs-window;
+        @include extjs-messagebox;
+        @include extjs-tabbar;
+    	@include extjs-tab;
+    	@include extjs-tree;
+    	@include extjs-drawcomponent;
+    	@include extjs-viewport;
+    }
+
+    @include extjs-dragdrop;
+    @include extjs-resizable;
+    @include extjs-splitter;
+    @include extjs-layout;
+    @include extjs-tool;
+    @include extjs-scroller;
+    
+    @include extjs-html;
+}
+
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/_core.scss b/interface/ext/resources/themes/stylesheets/ext4/default/_core.scss
new file mode 100755
index 0000000..6e47424
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/_core.scss
@@ -0,0 +1,2 @@
+ at import 'core/reset';
+ at import 'core/core';
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/_functions.scss b/interface/ext/resources/themes/stylesheets/ext4/default/_functions.scss
new file mode 100755
index 0000000..3cb0414
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/_functions.scss
@@ -0,0 +1,44 @@
+ at function min($value1, $value2) {
+    @if $value1 > $value2 {
+        @return $value2;
+    }
+    @else if $value2 > $value1 {
+        @return $value1;
+    }
+    @return $value1;
+}
+
+ at function max($value1, $value2) {
+    @if $value1 > $value2 {
+        @return $value1;
+    }
+    @else if $value2 > $value1 {
+        @return $value2;
+    }
+    @return $value1;
+}
+
+ at function top($box) {
+    @return parsebox($box, 1);
+}
+ at function right($box) {
+    @return parsebox($box, 2);
+}
+ at function bottom($box) {
+    @return parsebox($box, 3);
+}
+ at function left($box) {
+    @return parsebox($box, 4);
+}
+ at function vertical($box) {
+    @return top($box) + bottom($box);
+}
+ at function horizontal($box) {
+    @return left($box) + right($box);
+}
+ at function boxmax($box) {
+    @return max(max(top($box), right($box)), max(bottom($box), left($box)));
+}
+ at function boxmin($box) {
+    @return min(min(top($box), right($box)), min(bottom($box), left($box)));
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/_mixins.scss b/interface/ext/resources/themes/stylesheets/ext4/default/_mixins.scss
new file mode 100755
index 0000000..65f15db
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/_mixins.scss
@@ -0,0 +1,25 @@
+ at import 'mixins/background-gradient';
+ at import 'mixins/theme-background-image';
+ at import 'mixins/inner-border';
+ at import 'mixins/frame';
+ at import 'mixins/reset-extras';
+
+ at mixin no-select {
+    user-select: none;
+    -o-user-select: none;
+    -ms-user-select: none;
+    -moz-user-select: -moz-none;
+    -webkit-user-select: none;
+    
+    cursor:default;
+}
+
+ at mixin important-no-border-radius {
+    //we need to hard code this so we can declare !important
+    -moz-border-radius: 0 !important;
+    -webkit-border-radius: 0 !important;
+    -o-border-radius: 0 !important;
+    -ms-border-radius: 0 !important;
+    -khtml-border-radius: 0 !important;
+    border-radius: 0 !important;
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/_variables.scss b/interface/ext/resources/themes/stylesheets/ext4/default/_variables.scss
new file mode 100755
index 0000000..eb110ae
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/_variables.scss
@@ -0,0 +1,41 @@
+ at import 'variables/core';
+
+$mix-color: desaturate(lighten($base-color, 37), 5) !default;
+
+ at import 'variables/focus';
+ at import 'variables/panel';
+ at import 'variables/grid';
+ at import 'variables/button';
+ at import 'variables/pickers';
+ at import 'variables/toolbar';
+ at import 'variables/form';
+ at import 'variables/menu';
+ at import 'variables/window';
+ at import 'variables/tabs';
+ at import 'variables/qtip';
+ at import 'variables/progress-bar';
+ at import 'variables/btn-group';
+ at import 'variables/boundlist';
+ at import 'variables/tree';
+ at import 'variables/layout';
+ at import 'variables/loadmask';
+ at import 'variables/htmleditor';
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/_widgets.scss b/interface/ext/resources/themes/stylesheets/ext4/default/_widgets.scss
new file mode 100755
index 0000000..b7b466a
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/_widgets.scss
@@ -0,0 +1,22 @@
+ at import 'widgets/boundlist';
+ at import 'widgets/button';
+ at import 'widgets/btn-group';
+ at import 'widgets/datepicker';
+ at import 'widgets/colorpicker';
+ at import 'widgets/menu';
+ at import 'widgets/panel';
+ at import 'widgets/toolbar';
+ at import 'widgets/form';
+ at import 'widgets/qtip';
+ at import 'widgets/window';
+ at import 'widgets/tabbar';
+ at import 'widgets/tab';
+ at import 'widgets/slider';
+ at import 'widgets/grid';
+ at import 'widgets/tree';
+ at import 'widgets/loadmask';
+ at import 'widgets/progress-bar';
+ at import 'widgets/drawcomponent';
+ at import 'widgets/viewport';
+
+ at import 'widgets/html';
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/core/_core.scss b/interface/ext/resources/themes/stylesheets/ext4/default/core/_core.scss
new file mode 100755
index 0000000..61346d7
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/core/_core.scss
@@ -0,0 +1,317 @@
+.#{$prefix}body {
+    color: $color;
+    font-size: $font-size;
+    font-family: $font-family;
+}
+
+.#{$prefix}clear {
+    overflow: hidden;
+    clear: both;
+    height: 0;
+    width: 0;
+    font-size: 0;
+    line-height: 0;
+}
+
+.#{$prefix}layer {
+    position: absolute;
+    overflow: hidden;
+    zoom: 1;
+}
+
+.#{$prefix}shim {
+    position: absolute;
+    left: 0;
+    top: 0;
+    overflow: hidden;
+    @include opacity(0);
+}
+
+.#{$prefix}hide-display {
+    display: none !important;
+}
+
+.#{$prefix}hide-visibility {
+    visibility:hidden !important;
+}
+
+.#{$prefix}item-disabled {
+    @include opacity(0.3);
+}
+
+.#{$prefix}ie6 .#{$prefix}item-disabled {
+    filter:none;
+}
+
+.#{$prefix}hidden,
+.#{$prefix}hide-offsets {
+    display: block !important;
+    position: absolute!important;
+    left: -10000px!important;
+    top: -10000px!important;
+}
+
+.#{$prefix}hide-nosize {
+    height: 0!important;
+    width: 0!important;
+}
+
+.#{$prefix}masked-relative {
+    position: relative;
+}
+
+ at if $include-ie {
+    .#{$prefix}ie6 .#{$prefix}masked select,
+    .#{$prefix}ie6.#{$prefix}body-masked select {
+        visibility: hidden !important;
+    }
+}
+
+// Styles for the three schemes for showing shadows under an element: CSS3, IE blur transform, or 9 point framing with images.
+.#{$prefix}css-shadow {
+    position: absolute;
+    @include border-radius($window-border-radius);
+}
+
+.#{$prefix}ie-shadow {
+    background-color:#777;
+    display: none;
+    position: absolute;
+    overflow: hidden;
+    zoom: 1;
+}
+
+.#{$prefix}frame-shadow {
+    display: none;
+    position: absolute;
+    overflow: hidden;
+}
+
+.#{$prefix}frame-shadow * {
+    overflow: hidden;
+}
+
+.#{$prefix}frame-shadow * {
+    padding: 0;
+    border: 0;
+    margin: 0;
+    clear: none;
+    zoom: 1;
+}
+
+/* top  bottom */
+.#{$prefix}frame-shadow .xstc,
+.#{$prefix}frame-shadow .xsbc {
+    height: 6px;
+    float: left;
+}
+
+.#{$prefix}frame-shadow .xsc {
+    width: 100%;
+}
+
+.#{$prefix}frame-shadow .xsml {
+    background: transparent repeat-y 0 0;
+}
+
+.#{$prefix}frame-shadow .xsmr {
+    background: transparent repeat-y -6px 0;
+}
+
+.#{$prefix}frame-shadow .xstl {
+    background: transparent no-repeat 0 0;
+}
+
+.#{$prefix}frame-shadow .xstc {
+    background: transparent repeat-x 0 -30px;
+}
+
+.#{$prefix}frame-shadow .xstr {
+    background: transparent repeat-x 0 -18px;
+}
+
+.#{$prefix}frame-shadow .xsbl {
+    background: transparent no-repeat 0 -12px;
+}
+
+.#{$prefix}frame-shadow .xsbc {
+    background: transparent repeat-x 0 -36px;
+}
+
+.#{$prefix}frame-shadow .xsbr {
+    background: transparent repeat-x 0 -6px;
+}
+.#{$prefix}frame-shadow .xstl,
+.#{$prefix}frame-shadow .xstc,
+.#{$prefix}frame-shadow .xstr,
+.#{$prefix}frame-shadow .xsbl,
+.#{$prefix}frame-shadow .xsbc,
+.#{$prefix}frame-shadow .xsbr {
+    width: 6px;
+    height: 6px;
+    float: left;
+
+    @if $include-shadow-images {
+        background-image: theme-background-image($theme-name, 'shared/shadow.png');
+    }
+}
+
+.#{$prefix}frame-shadow .xsml,
+.#{$prefix}frame-shadow .xsmr {
+    width: 6px;
+    float: left;
+    height: 100%;
+
+    @if $include-shadow-images {
+        background-image: theme-background-image($theme-name, 'shared/shadow-lr.png');
+    }
+}
+
+.#{$prefix}frame-shadow .xsmc {
+    float: left;
+    height: 100%;
+
+    @if $include-shadow-images {
+        background-image: theme-background-image($theme-name, 'shared/shadow-c.png');
+    }
+}
+
+.#{$prefix}frame-shadow .xst,
+.#{$prefix}frame-shadow .xsb {
+    height: 6px;
+    overflow: hidden;
+    width: 100%;
+}
+
+//box wrap - Ext.get("foo").boxWrap();
+.x-box-tl {
+    background: transparent no-repeat 0 0;
+    zoom:1;
+}
+
+.x-box-tc {
+    height: 8px;
+    background: transparent repeat-x 0 0;
+    overflow: hidden;
+}
+
+.x-box-tr {
+    background: transparent no-repeat right -8px;
+}
+
+.x-box-ml {
+    background: transparent repeat-y 0;
+    padding-left: 4px;
+    overflow: hidden;
+    zoom:1;
+}
+
+.x-box-mc {
+    background: repeat-x 0 -16px;
+    padding: 4px 10px;
+}
+
+.x-box-mc h3 {
+    margin: 0 0 4px 0;
+    zoom:1;
+}
+
+.x-box-mr {
+    background: transparent repeat-y right;
+    padding-right: 4px;
+    overflow: hidden;
+}
+
+.x-box-bl {
+    background: transparent no-repeat 0 -16px;
+    zoom:1;
+}
+
+.x-box-bc {
+    background: transparent repeat-x 0 -8px;
+    height: 8px;
+    overflow: hidden;
+}
+
+.x-box-br {
+    background: transparent no-repeat right -24px;
+}
+
+.x-box-tl, .x-box-bl {
+    padding-left: 8px;
+    overflow: hidden;
+}
+
+.x-box-tr, .x-box-br {
+    padding-right: 8px;
+    overflow: hidden;
+}
+
+.x-box-tl {
+    background-image: theme-background-image($theme-name, 'box/corners.gif');
+}
+
+.x-box-tc {
+    background-image: theme-background-image($theme-name, 'box/tb.gif');
+}
+
+.x-box-tr {
+    background-image: theme-background-image($theme-name, 'box/corners.gif');
+}
+
+.x-box-ml {
+    background-image: theme-background-image($theme-name, 'box/l.gif');
+}
+
+.x-box-mc {
+    background-color: #eee;
+    background-image: theme-background-image($theme-name, 'box/tb.gif');
+    font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;
+    color: #393939;
+    font-size: 15px;
+}
+
+.x-box-mc h3 {
+    font-size: 18px;
+    font-weight: bold;
+}
+
+.x-box-mr {
+    background-image: theme-background-image($theme-name, 'box/r.gif');
+}
+
+.x-box-bl {
+    background-image: theme-background-image($theme-name, 'box/corners.gif');
+}
+
+.x-box-bc {
+    background-image: theme-background-image($theme-name, 'box/tb.gif');
+}
+
+.x-box-br {
+    background-image: theme-background-image($theme-name, 'box/corners.gif');
+}
+
+.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr {
+    background-image: theme-background-image($theme-name, 'box/corners-blue.gif');
+}
+
+.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc {
+    background-image: theme-background-image($theme-name, 'box/tb-blue.gif');
+}
+
+.x-box-blue .x-box-mc {
+    background-color: #c3daf9;
+}
+
+.x-box-blue .x-box-mc h3 {
+    color: #17385b;
+}
+
+.x-box-blue .x-box-ml {
+    background-image: theme-background-image($theme-name, 'box/l-blue.gif');
+}
+
+.x-box-blue .x-box-mr {
+    background-image: theme-background-image($theme-name, 'box/r-blue.gif');
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/core/_reset.scss b/interface/ext/resources/themes/stylesheets/ext4/default/core/_reset.scss
new file mode 100755
index 0000000..f8b8631
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/core/_reset.scss
@@ -0,0 +1,146 @@
+ at if $scope-reset-css {
+    .#{$prefix}border-box .#{$prefix}reset, 
+    .#{$prefix}border-box .#{$prefix}reset * {
+        box-sizing:border-box;
+        -moz-box-sizing:border-box;
+        -ms-box-sizing:border-box;
+        -webkit-box-sizing:border-box;
+    }
+
+    .#{$prefix}reset {
+        html, body, div, dl, dt, dd, ul, ol, li, h1, h2, h3,
+        h4, h5, h6, pre, code, form, fieldset, legend,
+        input, textarea, p, blockquote, th, td {
+            margin:0;
+            padding:0;
+        }
+
+        table {
+            border-collapse:collapse;
+            border-spacing:0;
+        }
+
+        fieldset, img {
+            border:0;
+        }
+
+        address, caption, cite, code,
+        dfn, em, strong, th, var {
+            font-style:normal;
+            font-weight:normal;
+        }
+
+        li {
+            list-style:none;
+        }
+
+        caption, th {
+            text-align:left;
+        }
+
+        h1, h2, h3, h4, h5, h6 {
+            font-size: 100%;
+        }
+
+        q:before,
+        q:after {
+            content:"";
+        }
+
+        abbr, acronym {
+            border:0;
+            font-variant:normal;
+        }
+
+        sup {
+            vertical-align:text-top;
+        }
+
+        sub {
+            vertical-align:text-bottom;
+        }
+
+        input, textarea, select {
+            font-family:inherit;
+            font-size:inherit;
+            font-weight:inherit;
+        }
+
+        *:focus {
+            outline:none;
+        }
+    }
+}
+ at else {
+    html, body, div, dl, dt, dd, ul, ol, li, h1, h2, h3,
+    h4, h5, h6, pre, code, form, fieldset, legend,
+    input, textarea, p, blockquote, th, td {
+        margin:0;
+        padding:0;
+    }
+
+    table {
+        border-collapse:collapse;
+        border-spacing:0;
+    }
+
+    fieldset, img {
+        border:0;
+    }
+
+    address, caption, cite, code,
+    dfn, em, strong, th, var {
+        font-style:normal;
+        font-weight:normal;
+    }
+
+    li {
+        list-style:none;
+    }
+
+    caption, th {
+        text-align:left;
+    }
+
+    h1, h2, h3, h4, h5, h6 {
+        font-size: 100%;
+    }
+
+    q:before,
+    q:after {
+        content:"";
+    }
+
+    abbr, acronym {
+        border:0;
+        font-variant:normal;
+    }
+
+    sup {
+        vertical-align:text-top;
+    }
+
+    sub {
+        vertical-align:text-bottom;
+    }
+
+    input, textarea, select {
+        font-family:inherit;
+        font-size:inherit;
+        font-weight:inherit;
+    }
+
+    *:focus {
+        outline:none;
+    }
+
+    .#{$prefix}border-box, 
+    .#{$prefix}border-box * {
+        box-sizing:border-box;
+        -moz-box-sizing:border-box;
+        -ms-box-sizing:border-box;
+        -webkit-box-sizing:border-box;
+    }
+}
+
+
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/layout/_layout.scss b/interface/ext/resources/themes/stylesheets/ext4/default/layout/_layout.scss
new file mode 100755
index 0000000..7e5e211
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/layout/_layout.scss
@@ -0,0 +1,309 @@
+ at mixin extjs-layout {
+    .#{$prefix}docked {
+        position: absolute;
+        z-index: 1;
+    }
+    
+    /**
+      * Dock Layouts
+      * @todo move this somewhere else?
+      */
+    .#{$prefix}docked-top {
+        border-bottom-width: 0 !important;
+    }
+
+    .#{$prefix}docked-bottom {
+        border-top-width: 0 !important;
+    }
+
+    .#{$prefix}docked-left {
+        border-right-width: 0 !important;
+    }
+
+    .#{$prefix}docked-right {
+        border-left-width: 0 !important;
+    }
+    
+    .#{$prefix}docked-noborder-top {
+        border-top-width: 0 !important;
+    }
+
+    .#{$prefix}docked-noborder-right {
+        border-right-width: 0 !important;
+    }
+    
+    .#{$prefix}docked-noborder-bottom {
+        border-bottom-width: 0 !important;
+    }
+    
+    .#{$prefix}docked-noborder-left {
+        border-left-width: 0 !important;
+    }
+    
+    .#{$prefix}box-inner {
+        overflow:hidden;
+
+        zoom:1;
+
+        position:relative;
+        left:0;
+        top:0;
+    }
+
+    .#{$prefix}box-item {
+        position:absolute !important;
+        left:0;
+        top:0;
+    }
+
+    .#{$prefix}box-layout-ct,
+    .#{$prefix}border-layout-ct {
+        overflow: hidden;
+        zoom: 1;
+    }
+
+    .#{$prefix}overflow-hidden {
+        overflow:hidden !important;
+    }
+
+    .#{$prefix}inline-children > * {
+        display: inline-block !important;
+    }
+
+    .#{$prefix}abs-layout-item {
+        position: absolute;
+    }
+
+    .#{$prefix}fit-item {
+        position: relative;
+    }
+
+    .#{$prefix}border-layout-ct {
+        background-color: $border-layout-ct-background;
+    }
+
+    .#{$prefix}border-region-slide-in {
+        z-index: 5;
+    }
+
+    .#{$prefix}region-collapsed-placeholder {
+        z-index: 4;
+    }
+
+    .#{$prefix}accordion-hd .#{$prefix}panel-header-text {
+        color: $accordion-header-color;
+        font-weight: normal;
+    }
+
+    .#{$prefix}accordion-hd {
+        .#{$prefix}tool-collapse-top,
+        .#{$prefix}tool-collapse-right,
+        .#{$prefix}tool-collapse-bottom,
+        .#{$prefix}tool-collapse-left {
+            background-position: 0 -255px;
+        }
+
+        .#{$prefix}tool-expand-top,
+        .#{$prefix}tool-expand-right,
+        .#{$prefix}tool-expand-bottom,
+        .#{$prefix}tool-expand-left {
+            background-position: 0 -240px;
+        }
+
+        .#{$prefix}tool-over {
+            .#{$prefix}tool-collapse-top,
+            .#{$prefix}tool-collapse-right,
+            .#{$prefix}tool-collapse-bottom,
+            .#{$prefix}tool-collapse-left {
+                background-position: -15px -255px;
+            }
+        }
+
+        .#{$prefix}tool-over {
+            .#{$prefix}tool-expand-top,
+            .#{$prefix}tool-expand-right,
+            .#{$prefix}tool-expand-bottom,
+            .#{$prefix}tool-expand-left {
+                background-position: -15px -240px;
+            }
+        }
+
+        background: $accordion-header-background-color !important;
+        @include single-box-shadow($accordion-header-background-color, 0, 0, 0, 0, true);
+    }
+
+    .#{$prefix}accordion-hd {
+        border-width: 1px 0 1px 0 !important;
+        padding: 4px 5px 5px 5px;
+        border-top-color: $panel-header-inner-border-color !important;
+    }
+    
+    .#{$prefix}accordion-body {
+        border-width: 0 !important;
+    }
+    
+    .#{$prefix}accordion-hd-sibling-expanded {
+        border-top-color: $panel-border-color !important;
+        @include single-box-shadow($panel-header-inner-border-color, 0, 1px, 0, 0, true);
+    }
+
+    .#{$prefix}accordion-hd-last-collapsed {
+        border-bottom-color: $accordion-header-background-color !important;
+    }
+
+    .#{$prefix}frame-tl,
+    .#{$prefix}frame-tr,
+    .#{$prefix}frame-tc,
+    .#{$prefix}frame-bl,
+    .#{$prefix}frame-br,
+    .#{$prefix}frame-bc {
+        overflow: hidden;
+        background-repeat: no-repeat;
+    }
+
+    .#{$prefix}frame-tc,
+    .#{$prefix}frame-bc {
+        background-repeat: repeat-x;
+    }
+
+    .#{$prefix}frame-mc {
+        position: relative;
+        background-repeat: repeat-x;
+        overflow: hidden;
+    }
+
+    // Classes for horizontal Box layout scroller.
+    // Uses the *TAB* scroller image because it's all we have.
+    // This will not work well in other cases
+    .#{$prefix}box-scroller-left {
+        float: left;
+        height: 100%;
+
+        z-index: 5;
+
+        .#{$prefix}toolbar-scroll-left,
+        .#{$prefix}tabbar-scroll-left {
+            width: 18px;
+            position: relative;
+            cursor: pointer;
+            height: $tab-height;
+            background: transparent no-repeat -18px 0;
+            background-image: theme-background-image($theme-name, 'tab-bar/scroll-left.gif');
+        }
+        .#{$prefix}toolbar-scroll-left-hover {
+            background-position: 0 0;
+        }
+        .#{$prefix}toolbar-scroll-left-disabled,
+        .#{$prefix}tabbar-scroll-left-disabled {
+            background-position: -18px 0;
+            @include opacity(.5);
+            
+            cursor:default;
+        }
+
+        .#{$prefix}toolbar-scroll-left {
+            background-image: theme-background-image($theme-name, 'toolbar/scroll-left.gif');
+            background-position: -14px 0;
+        }
+        .#{$prefix}toolbar-scroll-left-hover {
+            background-position: 0 0;
+        }
+        .#{$prefix}toolbar-scroll-left-disabled {
+            background-position: -14px 0;
+        }
+
+        .#{$prefix}toolbar-scroll-left {
+            width: 14px;
+            height: 22px;
+
+            border-bottom: 1px solid #8db2e3;
+        }
+    }
+
+    .#{$prefix}horizontal-box-overflow-body {
+        float: left;
+    }
+    .#{$prefix}box-scroller-right {
+        float: right;
+        height: 100%;
+
+        z-index: 5;
+
+        .#{$prefix}toolbar-scroll-right,
+        .#{$prefix}tabbar-scroll-right {
+            width: 18px;
+            position: relative;
+            cursor: pointer;
+            height: $tab-height;
+            background: transparent no-repeat 0 0;
+            background-image: theme-background-image($theme-name, 'tab-bar/scroll-right.gif');
+        }
+        .#{$prefix}toolbar-scroll-right-hover {
+            background-position: -18px 0;
+        }
+        .#{$prefix}toolbar-scroll-right-disabled,
+        .#{$prefix}tabbar-scroll-right-disabled {
+            background-position: 0 0;
+            @include opacity(.5);
+            
+            cursor:default;
+        }
+
+        .#{$prefix}toolbar-scroll-right {
+            background-image: theme-background-image($theme-name, 'toolbar/scroll-right.gif');
+        }
+        .#{$prefix}toolbar-scroll-right-hover {
+            background-position: -14px 0;
+        }
+        .#{$prefix}toolbar-scroll-right-disabled {
+            background-position: 0 0;
+        }
+
+        .#{$prefix}toolbar-scroll-right {
+            width: 14px;
+            height: 22px;
+
+            border-bottom: 1px solid #8db2e3;
+        }
+    }
+
+// Classes for vertical Box layout scroller
+    .#{$prefix}box-scroller-top {
+        .#{$prefix}box-scroller {
+            line-height: 0;
+            font-size: 0;
+        }
+        .#{$prefix}menu-scroll-top {
+            background: transparent no-repeat center center;
+            background-image: theme-background-image($theme-name, 'layout/mini-top.gif');
+            height: 8px;
+            cursor: pointer;
+        }
+    }
+    .#{$prefix}box-scroller-bottom {
+        .#{$prefix}box-scroller {
+            line-height: 0;
+            font-size: 0;
+        }
+        .#{$prefix}menu-scroll-bottom {
+            background: transparent no-repeat center center;
+            background-image: theme-background-image($theme-name, 'layout/mini-bottom.gif');
+            height: 8px;
+            cursor: pointer;
+        }
+    }
+
+    .#{$prefix}box-menu-right {
+        float: right;
+        padding-right: $toolbar-horizontal-spacing;
+    }
+
+    .#{$prefix}column {
+        float: left;
+    }
+    @if $include-ie {
+        .#{$prefix}ie6 .#{$prefix}column {
+            display: inline; /*prevent IE6 double-margin bug*/
+        }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_background-gradient.scss b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_background-gradient.scss
new file mode 100755
index 0000000..c37681f
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_background-gradient.scss
@@ -0,0 +1,122 @@
+/**
+ * @mixin background-gradient
+ * 
+ * @param {Color} $background-color The background color of the gradient
+ * @param {String/List} $type The type of gradient to be used. Can either be a String which is a predefined gradient, or it can
+ *                            can be a list of color_stops. If none is set, it will still set the `background-color` to the $background-color.
+ * @param {String} $direction The direction of the gradient. Can either me `top` or `left`. (defaults to `top`)
+ */
+ at mixin background-gradient($bg-color, $type: $base-gradient, $direction: top) {
+    background-image: none;
+    background-color: $bg-color;
+    
+    @if $base-gradient != null and $bg-color != transparent {
+        //color_stops
+        @if type-of($type) == "list" {
+            @include background-image(linear-gradient($direction, $type));
+        }
+        
+        //default gradients
+        @else if $type == bevel {
+            @include background-image(linear-gradient($direction, color_stops(
+                lighten($bg-color, 15%), 
+                lighten($bg-color, 8%) 30%, 
+                $bg-color 65%, 
+                darken($bg-color, 6%)
+            )));
+        } @else if $type == glossy {
+            @include background-image(linear-gradient($direction, color_stops(lighten($bg-color, 15%), lighten($bg-color, 5%) 50%, $bg-color 51%, darken($bg-color, 5%))));
+        } @else if $type == recessed {
+            @include background-image(linear-gradient($direction, color_stops(darken($bg-color, 10%), darken($bg-color, 5%) 10%, $bg-color 65%, lighten($bg-color, .5%))));
+        } @else if $type == matte {
+            @include background-image(linear-gradient($direction, color_stops(lighten($bg-color, 3%), darken($bg-color, 4%))));
+        } @else if $type == matte-reverse {
+            @include background-image(linear-gradient($direction, color_stops(darken($bg-color, 6%), lighten($bg-color, 4%))));
+        } @else if $type == glossy-toolbar {
+            @include background-image(linear-gradient($direction, color_stops(#F0F5FA, #DAE6F4 2%, #CEDDEF)));
+        }
+        
+        //ext3.3 gradients
+        @else if $type == panel-header {
+            @include background-image(linear-gradient($direction, color_stops(
+                adjust-color($bg-color, $hue: -0.857deg, $saturation: -1.63%, $lightness: 3.529%), 
+                adjust-color($bg-color, $hue: 0.158deg, $saturation: -1.21%, $lightness: 0.392%) 45%, 
+                adjust-color($bg-color, $hue: 1.154deg, $saturation: 0.607%, $lightness: -7.647%) 46%,
+                adjust-color($bg-color, $hue: 1.154deg, $saturation: 0.607%, $lightness: -7.647%) 50%,
+                adjust-color($bg-color, $hue: 1.444deg, $saturation: -1.136%, $lightness: -4.706%) 51%,
+                $bg-color
+            )));
+        } @else if $type == tabbar {
+            @include background-image(linear-gradient($direction, color_stops(
+                adjust-color($bg-color, $hue: 0.0deg, $saturation: 1.604%, $lightness: 4.706%),
+                $bg-color
+            )));
+        } @else if $type == tab {
+            @include background-image(linear-gradient($direction, color_stops(
+                adjust-color($bg-color, $hue: 1.382deg, $saturation: -18.571%, $lightness: -4.902%),
+                adjust-color($bg-color, $hue: 0.43deg, $saturation: -10.311%, $lightness: -2.157%) 25%,
+                $bg-color 45%
+            )));
+        } @else if $type == tab-active {
+            @include background-image(linear-gradient($direction, color_stops(
+                adjust-color($bg-color, $hue: -212.903deg, $saturation: -88.571%, $lightness: 6.863%),
+                adjust-color($bg-color, $hue: 0.43deg, $saturation: -6.753%, $lightness: 4.706%) 25%,
+                $bg-color 45%
+            )));
+        } @else if $type == tab-over {
+            @include background-image(linear-gradient($direction, color_stops(
+                adjust-color($bg-color, $hue: 4.462deg, $saturation: -9.524%, $lightness: -3.725%),
+                adjust-color($bg-color, $hue: 2.272deg, $saturation: 0.0%, $lightness: -1.569%) 25%,
+                $bg-color 45%
+            )));
+        } @else if $type == tab-disabled {
+            @include background-image(linear-gradient($direction, color_stops(
+                $bg-color,
+                adjust-color($bg-color, $hue: -0.267deg, $saturation: 18.571%, $lightness: 2.941%)
+            )));
+        } @else if $type == grid-header {
+            @include background-image(linear-gradient($direction, color_stops(
+                adjust-color($bg-color, $hue: 0deg, $saturation: 0%, $lightness: 20.392%),
+                adjust-color($bg-color, $hue: 220.0deg, $saturation: 5.66%, $lightness: 12.353%)
+            )));
+        } @else if $type == grid-header-over {
+            @include background-image(linear-gradient($direction, color_stops(
+                adjust-color($bg-color, $hue: 0.175deg, $saturation: 0.967%, $lightness: 14.118%),
+                adjust-color($bg-color, $hue: 0.175deg, $saturation: 0.967%, $lightness: 14.118%) 39%,
+                adjust-color($bg-color, $hue: 0.372deg, $saturation: 0.101%, $lightness: 10.196%) 40%,
+                adjust-color($bg-color, $hue: 0.372deg, $saturation: 0.101%, $lightness: 10.196%)
+            )));
+        } @else if $type == grid-row-over {
+            @include background-image(linear-gradient($direction, color_stops(
+                adjust-color($bg-color, $hue: 0.175deg, $saturation: 0.967%, $lightness: 14.118%),
+                $bg-color
+            )));
+        } @else if $type == grid-cell-special {
+            @include background-image(linear-gradient(left, color_stops(
+                $bg-color,
+                darken($bg-color, 5)
+            )));
+        } @else if $type == glossy-button or $type == glossy-button-disabled {
+            @include background-image(linear-gradient($direction, color_stops(
+                $bg-color,
+                adjust-color($bg-color, $hue: 0deg, $saturation: 0%, $lightness: -2.353%) 48%,
+                adjust-color($bg-color, $hue: 0deg, $saturation: 0%, $lightness: -11.373%) 52%,
+                adjust-color($bg-color, $hue: 0deg, $saturation: 0%, $lightness: -9.412%)
+            )));
+        } @else if $type == glossy-button-over {
+            @include background-image(linear-gradient($direction, color_stops(
+                $bg-color,
+                adjust-color($bg-color, $hue: 1.754deg, $saturation: 0.0%, $lightness: -2.157%) 48%,
+                adjust-color($bg-color, $hue: 5.833deg, $saturation: -35.135%, $lightness: -9.216%) 52%,
+                adjust-color($bg-color, $hue: 5.833deg, $saturation: -27.273%, $lightness: -7.647%)
+            )));
+        } @else if $type == glossy-button-pressed {
+            @include background-image(linear-gradient($direction, color_stops(
+                $bg-color,
+                adjust-color($bg-color, $hue: -1.839deg, $saturation: -2.18%, $lightness: 2.157%) 48%,
+                adjust-color($bg-color, $hue: -2.032deg, $saturation: 37.871%, $lightness: -4.706%) 52%,
+                adjust-color($bg-color, $hue: -1.641deg, $saturation: 36.301%, $lightness: -2.549%)
+            )));
+        }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_color-by-background.scss b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_color-by-background.scss
new file mode 100755
index 0000000..c10eab1
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_color-by-background.scss
@@ -0,0 +1,23 @@
+/**
+ *
+ */
+ at mixin color-by-background($bg-color, $contrast: 70%, $default-color: null, $bevel-text: true) {
+    @if ($default-color != null) {
+        color: $default-color;
+    } @else {
+        @if (lightness($bg-color) > 40) {
+            color: darken($bg-color, $contrast);
+        }
+        @else {
+            color: lighten($bg-color, $contrast)
+        }
+    }
+
+    @if ($bevel-text != false) {
+        @if (lightness($bg-color) < 40) {
+            @include text-shadow(rgba(0,0,0,.5) 0 -1px 0);
+        } @else {
+            @include text-shadow(rgba(255,255,255,.25) 0 1px 0);
+        }
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_frame.scss b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_frame.scss
new file mode 100755
index 0000000..e681e1c
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_frame.scss
@@ -0,0 +1,205 @@
+ at mixin x-frame(
+    $cls, 
+    $ui: null, 
+    $border-radius: 0px, 
+    $border-width: 0px, 
+    $padding: null, 
+    $background-color: null, 
+    $background-gradient: null,
+    $table: false,
+    $background-direction: top
+) {
+    $cls-ui: $cls;
+    @if $ui != null {
+        $cls-ui: $cls + '-' + $ui;
+    }
+    
+    $vertical: false;
+    @if $background-direction == left or $background-direction == right {
+        $vertical: true;
+    }
+
+    $frame-top: max(top($border-radius), right($border-radius));
+    $frame-right: max(right($border-radius), bottom($border-radius));
+    $frame-bottom: max(bottom($border-radius), left($border-radius));
+    $frame-left: max(left($border-radius), top($border-radius));
+    
+    $padding-top: 0;
+    $padding-right: 0;
+    $padding-bottom: 0;
+    $padding-left: 0;
+    
+    @if $padding == null {
+        $padding-top: $frame-top - top($border-width);
+        $padding-right: $frame-right - right($border-width);
+        $padding-bottom: $frame-bottom - bottom($border-width);
+        $padding-left: $frame-left - left($border-width);
+    }
+    @else {
+        $padding-top: top($padding);
+        $padding-right: right($padding);
+        $padding-bottom: bottom($padding);
+        $padding-left: left($padding);    
+    }
+    
+    @if $padding-top < $frame-top {
+        $padding-top: $frame-top - top($border-width);
+    }
+    @if $padding-right < $frame-right {
+        $padding-right: $frame-right - right($border-width);
+    }
+    @if $padding-bottom < $frame-bottom {
+        $padding-bottom: $frame-bottom - bottom($border-width);
+    }
+    @if $padding-left < $frame-left {
+        $padding-left: $frame-left - left($border-width);
+    }
+     
+    .#{$prefix}#{$cls-ui} {
+        @if $supports-border-radius {
+            @if length($border-radius) == 2 {
+                @include border-top-left-radius(nth($border-radius, 1));
+                @include border-top-right-radius(nth($border-radius, 2));
+            } @else if length($border-radius) == 3 {
+                @include border-top-left-radius(nth($border-radius, 1));
+                @include border-top-right-radius(nth($border-radius, 2));
+                @include border-bottom-right-radius(nth($border-radius, 3));
+            } @else if length($border-radius) == 4 {
+                @include border-top-left-radius(nth($border-radius, 1));
+                @include border-top-right-radius(nth($border-radius, 2));
+                @include border-bottom-right-radius(nth($border-radius, 3));
+                @include border-bottom-left-radius(nth($border-radius, 4));
+            } @else {
+                @include border-radius($border-radius);
+            }
+        }
+        padding: $padding-top $padding-right $padding-bottom $padding-left;
+        border-width: $border-width;
+        border-style: solid;
+        @if $background-color != null {
+            @if $supports-gradients and $background-gradient != null {
+                @include background-gradient($background-color, $background-gradient, $background-direction);
+            }
+            @else {
+                background-color: $background-color;
+            }      
+        }
+    }
+    
+    @if not $supports-gradients or $compile-all {
+        .#{$prefix}nlg {
+            .#{$prefix}#{$cls-ui}-mc {
+                @if $background-gradient != null {
+                    background-image: theme-background-image($theme-name, '#{$cls}/#{$cls-ui}-bg.gif', false, $relative-image-path-for-uis);
+                }
+                @if $background-color != null {
+                    background-color: $background-color;
+                }
+            }
+        }        
+    }
+    
+    @if not $supports-border-radius or $compile-all {
+        .#{$prefix}nbr {
+            .#{$prefix}#{$cls-ui} {
+                padding: 0 !important;
+                border-width: 0 !important;
+                @include border-radius(0px);
+                @if $background-color != null {
+                    background-color: transparent;
+                }
+                @else {
+                    background: #fff;
+                }
+
+                @function pad($radius) {
+                    $radius: boxmax($radius);
+                    $radius: parseint($radius);
+                    @if $radius > 10 {
+                        @return $radius;
+                    }
+                    @else {
+                        @return "0" + $radius;
+                    }
+                }
+                
+                $type: '100';
+                @if $table == true {
+                    $type: '110';
+                }
+                $direction: '100';
+                @if $vertical == true {
+                    $direction: '110';
+                }
+                
+                $left: $type + pad(top($border-radius)) + pad(right($border-radius)) + 'px';
+                $top: $direction + pad(bottom($border-radius)) + pad(left($border-radius)) + 'px';
+                background-position: unquote($left) unquote($top);
+            }
+
+            .#{$prefix}#{$cls-ui}-tl,
+            .#{$prefix}#{$cls-ui}-bl,
+            .#{$prefix}#{$cls-ui}-tr,
+            .#{$prefix}#{$cls-ui}-br,
+            .#{$prefix}#{$cls-ui}-tc,
+            .#{$prefix}#{$cls-ui}-bc,
+            .#{$prefix}#{$cls-ui}-ml,
+            .#{$prefix}#{$cls-ui}-mr {
+                zoom:1;
+                
+                @if $background-color != transparent {
+                    background-image: theme-background-image($theme-name, '#{$cls}/#{$cls-ui}-corners.gif', false, $relative-image-path-for-uis);
+                }
+            }
+            
+            @if $vertical == true {
+                .#{$prefix}#{$cls-ui}-tc,
+                .#{$prefix}#{$cls-ui}-bc {
+                    zoom:1;
+
+                    @if $background-color != transparent {
+                        background-image: theme-background-image($theme-name, '#{$cls}/#{$cls-ui}-sides.gif', false, $relative-image-path-for-uis);
+                        background-position: 0 0;
+                        background-repeat: repeat-x;
+                    }
+                }
+            } @else {
+                .#{$prefix}#{$cls-ui}-ml,
+                .#{$prefix}#{$cls-ui}-mr {
+                    zoom:1;
+
+                    @if $background-color != transparent {
+                        background-image: theme-background-image($theme-name, '#{$cls}/#{$cls-ui}-sides.gif', false, $relative-image-path-for-uis);
+                        background-position: 0 0;
+                        @if $background-gradient == null {
+                            background-repeat: repeat-y;
+                        }
+                    }
+                }
+            }
+
+            $padding-top: $padding-top - $frame-top;
+            $padding-right: $padding-right - $frame-right;
+            $padding-bottom: $padding-bottom - $frame-bottom;
+            $padding-left: $padding-left - $frame-left;
+            
+            
+            @if $padding-top < 0 {
+                $padding-top: 0;
+            }
+            @if $padding-right < 0 {
+                $padding-right: 0;
+            }
+            @if $padding-bottom < 0 {
+                $padding-bottom: 0;
+            }
+            @if $padding-left < 0 {
+                $padding-left: 0;
+            }
+
+            .#{$prefix}#{$cls-ui}-mc {
+                padding: $padding-top $padding-right $padding-bottom $padding-left;
+            }    
+        }   
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_inner-border.scss b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_inner-border.scss
new file mode 100755
index 0000000..e1f09d0
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_inner-border.scss
@@ -0,0 +1,149 @@
+ at function inner-border-spread($width) {
+    $top: top($width);
+    $right: right($width);
+    $bottom: bottom($width);
+    $left: left($width);
+    
+    @return min(($top + $bottom) / 2, ($left + $right) / 2);
+}
+
+ at function inner-border-hoff($width, $spread) {
+    $left: left($width); 
+    $right: right($width);
+
+    @if $right <= 0 {
+        @return $left - $spread;
+    }
+    @else {
+        @return $spread - $right;
+    }
+}
+
+ at function inner-border-voff($width, $spread) {
+    $top: top($width);
+    $bottom: bottom($width);
+
+    @if $bottom <= 0 {
+        @return $top - $spread;
+    }
+    @else {
+        @return $spread - $bottom;
+    }
+}
+
+ at function even($number) {
+    @return ceil($number / 2) == ($number / 2);
+}
+
+ at function odd($number) {
+    @return ceil($number / 2) != ($number / 2);
+}
+
+ at function inner-border-usesingle-width($width) {
+    $top: top($width);
+    $right: right($width);
+    $bottom: bottom($width);
+    $left: left($width);
+        
+    @if $top == 0 {
+        @if $left + $right == 0 {
+            @return true;
+        }
+        @if $bottom >= $left + $right {
+            @return true;
+        }
+    }
+    
+    @if $bottom == 0 {
+        @if $left + $right == 0 {
+            @return true;
+        }
+        @if $top >= $left + $right {
+            @return true;
+        }
+    }
+    
+    @if $left == 0 {
+        @if $top + $bottom == 0 {
+            @return true;
+        }
+        @if $right >= $top + $bottom {
+            @return true;
+        }
+    }
+    
+    @if $right == 0 {
+        @if $top + $bottom == 0 {
+            @return true;
+        }
+        @if $left >= $top + $bottom {
+            @return true;
+        }
+    }
+    
+    @if $top + $bottom == $left + $right and even($top) == even($bottom) and even($left) == even($right) {
+        @return true;
+    }
+    
+    @return false;
+}
+
+ at function inner-border-usesingle-color($color) {
+    $top: top($color);
+    $right: right($color);
+    $bottom: bottom($color);
+    $left: left($color);
+    
+    @if $top == $right == $bottom == $left {
+        @return true;
+    }
+    
+    @return false;
+}
+
+ at function inner-border-usesingle($width, $color) {
+    @if inner-border-usesingle-color($color) and inner-border-usesingle-width($width) {
+        @return true;
+    }
+    @return false;
+}
+
+ at mixin inner-border($width: 1px, $color: #fff, $blur: 0px) {
+    @if inner-border-usesingle($width, $color) {
+        $spread: inner-border-spread($width);
+        $hoff: inner-border-hoff($width, $spread);
+        $voff: inner-border-voff($width, $spread);
+        @include single-box-shadow($color-top, $hoff, $voff, $blur, $spread, true);
+    }
+    @else {
+        $width-top: top($width);
+        $width-right: right($width);
+        $width-bottom: bottom($width);
+        $width-left: left($width);
+
+        $color-top: top($color);
+        $color-right: right($color);
+        $color-bottom: bottom($color);
+        $color-left: left($color);
+        
+        $shadow-top: false;
+        $shadow-right: false;
+        $shadow-bottom: false;
+        $shadow-left: false;
+        
+        @if $width-top > 0 {
+            $shadow-top: $color-top 0 $width-top $blur 0 inset;
+        }
+        @if $width-right > 0 {
+            $shadow-right: $color-right (-1 * $width-right) 0 $blur 0 inset;
+        }
+        @if $width-bottom > 0 {
+            $shadow-bottom: $color-bottom 0 (-1 * $width-bottom) $blur 0 inset;
+        }
+        @if $width-left > 0 {
+            $shadow-left: $color-left $width-left 0 $blur 0 inset;
+        }
+                
+        @include box-shadow($shadow-top, $shadow-bottom, $shadow-right, $shadow-left);
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_reset-extras.scss b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_reset-extras.scss
new file mode 100755
index 0000000..6ef7778
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_reset-extras.scss
@@ -0,0 +1,144 @@
+ at mixin extjs-reset-extras {
+	.#{$prefix}border-box {
+		.#{$prefix}reset {
+			//tab.scss
+			.#{$prefix}tab-default-top {
+				height: $tab-height + top($tabbar-top-strip-border-width);
+			}
+			.#{$prefix}tab-default-bottom {
+				height: $tab-height + bottom($tabbar-bottom-strip-border-width);
+			}
+
+			//qtip.scss
+			.#{$prefix}tip-anchor {
+		        width: 10px;
+		        height: 10px;
+		    }
+
+			//field.scss
+			.#{$prefix}form-text {
+		        height: $form-field-height;
+		    }
+
+			textarea.#{$prefix}form-field {
+		        height: auto;
+		    }
+
+		    .#{$prefix}field-default-toolbar .#{$prefix}form-text {
+		        height: $form-toolbar-field-height;
+		    }
+
+		    //triggerfield.scss
+		    .#{$prefix}form-trigger {
+		        height: $form-trigger-height;
+		    }
+
+		    .#{$prefix}field-default-toolbar .#{$prefix}form-trigger {
+		        height: $form-toolbar-trigger-height;
+		    }
+
+		    //grid.scss
+		    @if $include-ie or $compile-all {
+		        &.#{$prefix}ie9 {
+		            .#{$prefix}grid-header-ct {
+		                padding-left: 1px;
+		            }
+		        }
+		    }
+		}
+    }
+
+    .#{$prefix}webkit {
+    	.#{$prefix}reset {
+	    	//form.scss
+	        * {
+	            &:focus {
+	                outline:none !important;
+	            }
+	        }
+
+	        //field
+	        .#{$prefix}form-empty-field {
+	            line-height: 15px;
+	        }
+
+	        //fieldset
+	        .#{$prefix}fieldset-header {
+		        padding-top: 1px;
+		    }
+	    }
+	}
+
+    /* Top Tabs */
+	@include tab-bar-top-reset(
+	    "tab-bar-top",
+	    "tab-bar-body",
+	    "tab-bar-strip",
+	    $tabbar-top-body-padding,
+	    $tabbar-top-body-border-width,
+	    $tabbar-top-strip-border-width,
+	    $tabbar-strip-height
+	);
+	@include tab-bar-top-reset(
+	    "tab-bar-top",
+	    "tab-bar-body-default-plain",
+	    "tab-bar-strip-default-plain",
+	    $tabbar-top-plain-body-padding,
+	    $tabbar-top-plain-body-border-width,
+	    $tabbar-top-strip-border-width,
+	    $tabbar-strip-height
+	);
+
+	/* Bottom Tabs */
+	@include tab-bar-bottom-reset(
+	    "tab-bar-bottom",
+	    "tab-bar-body",
+	    "tab-bar-strip",
+	    $tabbar-bottom-body-padding,
+	    $tabbar-bottom-body-border-width,
+	    $tabbar-bottom-strip-border-width,
+	    $tabbar-strip-height
+	);
+
+	@include tab-bar-bottom-reset(
+	    "tab-bar-bottom",
+	    "tab-bar-body-default-plain",
+	    "tab-bar-strip-default-plain",
+	    $tabbar-bottom-plain-body-padding,
+	    $tabbar-bottom-plain-body-border-width,
+	    $tabbar-bottom-strip-border-width,
+	    $tabbar-strip-height
+	);
+}
+
+ at mixin tab-bar-top-reset($toolbarCls, $bodyCls, $stripCls, $body-padding, $body-border-width, $strip-border-width, $strip-height) {
+    .#{$prefix}border-box {
+    	.#{$prefix}reset {
+	        .#{$prefix}#{$toolbarCls} {
+	            .#{$prefix}#{$bodyCls} {
+	                height: $tab-height + vertical($body-border-width) + vertical($body-padding);
+	            }
+
+	            .#{$prefix}#{$stripCls} {
+	                height: $strip-height;
+	            }
+	        }
+		}
+    }
+}
+
+ at mixin tab-bar-bottom-reset($toolbarCls, $bodyCls, $stripCls, $body-padding, $body-border-width, $strip-border-width, $strip-height) {
+    .#{$prefix}border-box {
+    	.#{$prefix}reset {
+	        .#{$prefix}#{$toolbarCls} {
+	            .#{$prefix}#{$bodyCls} {
+	                height: $tab-height + vertical($body-border-width) + vertical($body-padding);
+	            }
+
+	            .#{$prefix}#{$stripCls} {
+	                height: $strip-height;
+	            }
+	        }
+	    }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_theme-background-image.scss b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_theme-background-image.scss
new file mode 100755
index 0000000..f280c4e
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/mixins/_theme-background-image.scss
@@ -0,0 +1,28 @@
+/**
+ * Method which inserts a full background-image property for a theme image.
+ * It checks if the file exists and if it doesn't, it'll throw an error. 
+ * By default it will not include the background-image property if it is not found,
+ * but this can be changed by changing the default value of $include-missing-images to 
+ * be true. 
+ */
+ at function theme-background-image($theme-name, $path, $without-url: false, $relative: false) {
+    $exists_image: theme-image($theme-name, $path, true, false);
+    
+    @if $exists_image {
+        $exists: theme_image_exists($exists_image);
+
+        @if $exists == true {
+            @return theme-image($theme-name, $path, $without-url, $relative);
+        }
+        @else {
+            @warn "@theme-background-image: Theme image not found: #{$exists_image}";
+
+            @if $include-missing-images {
+                @return theme-image($theme-name, $path, $without-url, $relative);
+            }
+        }
+    }
+    @else {
+        @warn "@theme-background-image: No arguments passed";
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/util/_dragdrop.scss b/interface/ext/resources/themes/stylesheets/ext4/default/util/_dragdrop.scss
new file mode 100755
index 0000000..6d0c20a
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/util/_dragdrop.scss
@@ -0,0 +1,76 @@
+ at mixin extjs-dragdrop {
+    .#{$prefix}dd-drag-proxy {
+        
+    }
+    
+    .#{$prefix}dd-drag-repair {
+        .#{$prefix}dd-drag-ghost {
+            @include opacity(.6);
+        }
+
+        .#{$prefix}dd-drop-icon {
+            display: none;
+        }
+    }
+
+    .#{$prefix}dd-drag-ghost {
+        @include opacity(.85);
+        
+        padding: 5px;
+        padding-left: 20px;
+        
+        white-space: nowrap;
+        
+        color: #000;
+        font: normal ceil($font-size * .9) $font-family;
+        
+        border: 1px solid;
+        border-color: #ddd #bbb #bbb #ddd;
+        
+        background-color: #fff;
+    }
+
+    .#{$prefix}dd-drop-icon {
+        position: absolute;
+        top: 3px;
+        left: 3px;
+        
+        display: block;
+        
+        width: 16px;
+        height: 16px;
+        
+        background-color: transparent;
+        background-position:  center;
+        background-repeat:  no-repeat;
+        
+        z-index: 1;
+    }
+
+    .#{$prefix}view-selector {
+        position: absolute;
+        left: 0;
+        top: 0;
+        
+        width: 0;
+        
+        background-color: #c3daf9;
+        border: 1px dotted #3399bb;
+            
+        @include opacity(.5);
+        
+        zoom: 1;
+    }
+    
+    .#{$prefix}dd-drop-nodrop .#{$prefix}dd-drop-icon {
+        background-image: theme-background-image($theme-name, 'dd/drop-no.gif');
+    }
+
+    .#{$prefix}dd-drop-ok .#{$prefix}dd-drop-icon {
+        background-image: theme-background-image($theme-name, 'dd/drop-yes.gif');
+    }
+
+    .#{$prefix}dd-drop-ok-add .#{$prefix}dd-drop-icon {
+        background-image: theme-background-image($theme-name, 'dd/drop-add.gif');
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/util/_focus.scss b/interface/ext/resources/themes/stylesheets/ext4/default/util/_focus.scss
new file mode 100755
index 0000000..eeca010
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/util/_focus.scss
@@ -0,0 +1,37 @@
+.#{$prefix}focus-element {
+    position: absolute;
+    top: -10px;
+    left: -10px;
+    width: 0px;
+    height: 0px;
+}
+
+.#{$prefix}focus-frame {
+    position: absolute;
+    left: 0px;
+    top: 0px;
+    z-index: 100000000;
+    width: 0px;
+    height: 0px;
+}
+
+.#{$prefix}focus-frame-top,
+.#{$prefix}focus-frame-bottom,
+.#{$prefix}focus-frame-left,
+.#{$prefix}focus-frame-right {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+}
+
+.#{$prefix}focus-frame-top,
+.#{$prefix}focus-frame-bottom {
+    border-top: $focus-frame-style $focus-frame-width $focus-frame-color;
+    height: $focus-frame-width;
+}
+
+.#{$prefix}focus-frame-left,
+.#{$prefix}focus-frame-right {
+    border-left: $focus-frame-style $focus-frame-width $focus-frame-color;
+    width: $focus-frame-width;
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/util/_messagebox.scss b/interface/ext/resources/themes/stylesheets/ext4/default/util/_messagebox.scss
new file mode 100755
index 0000000..469406a
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/util/_messagebox.scss
@@ -0,0 +1,50 @@
+ at mixin extjs-messagebox {
+    .#{$prefix}message-box .#{$prefix}window-body {
+        background-color: $window-background-color;
+        border: none;
+    }
+
+    .#{$prefix}message-box .ext-mb-textarea {
+        margin-top: 4px;
+    }
+
+    .#{$prefix}message-box .#{$prefix}progress-wrap {
+        margin-top: 4px;
+    }
+
+    .#{$prefix}message-box .ext-mb-icon {
+        width: 47px;
+        height: 32px;
+    }
+
+    .#{$prefix}message-box .ext-mb-info,
+    .#{$prefix}message-box .ext-mb-warning,
+    .#{$prefix}message-box .ext-mb-question,
+    .#{$prefix}message-box .ext-mb-error {
+        background: transparent no-repeat top left;
+    }
+
+    .ext-gecko2 .ext-mb-fix-cursor {
+        overflow: auto;
+    }
+
+    .#{$prefix}message-box .#{$prefix}msg-box-wait {
+        background-image: theme-background-image($theme-name, 'shared/blue-loading.gif');
+    }
+
+    .#{$prefix}message-box .ext-mb-info {
+        background-image: theme-background-image($theme-name, 'shared/icon-info.gif');
+    }
+
+    .#{$prefix}message-box .ext-mb-warning {
+        background-image: theme-background-image($theme-name, 'shared/icon-warning.gif');
+    }
+
+    .#{$prefix}message-box .ext-mb-question {
+        background-image: theme-background-image($theme-name, 'shared/icon-question.gif');
+    }
+
+    .#{$prefix}message-box .ext-mb-error {
+        background-image: theme-background-image($theme-name, 'shared/icon-error.gif');
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/util/_resizable.scss b/interface/ext/resources/themes/stylesheets/ext4/default/util/_resizable.scss
new file mode 100755
index 0000000..5f5cb1c
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/util/_resizable.scss
@@ -0,0 +1,222 @@
+ at mixin extjs-resizable {
+    .#{$prefix}resizable-handle {
+        position: absolute;
+        
+        z-index: 100;
+        
+        font-size: 1px;
+        line-height: 6px;
+        
+        overflow: hidden;
+            
+        zoom: 1;
+        
+        @include opacity(0);
+        
+        background-color: #fff;
+    }
+
+    .#{$prefix}resizable-handle-east {
+        width: 6px;
+        height: 100%;
+        
+        right: 0;
+        top: 0;
+    }
+    
+    .#{$prefix}resizable-over {
+        .#{$prefix}resizable-handle-east {
+            cursor: e-resize;
+        }
+    }
+    
+    .#{$prefix}resizable-handle-south {
+        width: 100%;
+        height: 6px;
+        
+        left: 0;
+        bottom: 0;
+    }
+    
+    .#{$prefix}resizable-over {
+        .#{$prefix}resizable-handle-south {
+            cursor: s-resize;
+        }
+    }
+    
+    .#{$prefix}resizable-handle-west {
+        width: 6px;
+        height: 100%;
+        
+        left: 0;
+        top: 0;
+    }
+    
+    .#{$prefix}resizable-over {
+        .#{$prefix}resizable-handle-west {
+            cursor: w-resize;
+        }
+    }
+
+    .#{$prefix}resizable-handle-north {
+        width: 100%;
+        height: 6px;
+        
+        left: 0;
+        top: 0;
+    }
+    
+    .#{$prefix}resizable-over {
+        .#{$prefix}resizable-handle-north {
+            cursor: n-resize;
+        }
+    }
+
+    .#{$prefix}resizable-handle-southeast {
+        width: 6px;
+        height: 6px;
+        
+        right: 0;
+        bottom: 0;
+        
+        z-index: 101;
+    }
+    
+    .#{$prefix}resizable-over {
+        .#{$prefix}resizable-handle-southeast {
+            cursor: se-resize;
+        }
+    }
+
+    .#{$prefix}resizable-handle-northwest {
+        width: 6px;
+        height: 6px;
+        
+        left: 0;
+        top: 0;
+        
+        z-index: 101;
+    }
+    
+    .#{$prefix}resizable-over {
+        .#{$prefix}resizable-handle-northwest {
+            cursor: nw-resize;
+        }
+    }
+
+    .#{$prefix}resizable-handle-northeast {
+        width: 6px;
+        height: 6px;
+        
+        right: 0;
+        top: 0;
+        
+        z-index: 101;
+    }
+    
+    .#{$prefix}resizable-over {
+        .#{$prefix}resizable-handle-northeast {
+            cursor: ne-resize;
+        }
+    }
+
+    .#{$prefix}resizable-handle-southwest {
+        width: 6px;
+        height: 6px;
+        
+        left: 0;
+        bottom: 0;
+        
+        z-index: 101;
+    }
+    
+    .#{$prefix}resizable-over {
+        .#{$prefix}resizable-handle-southwest {
+            cursor: sw-resize;
+        }
+    }
+    
+    /*IE rounding error*/
+    .#{$prefix}ie {
+        .#{$prefix}resizable-handle-east {
+            margin-right: -1px; /*IE rounding error*/
+        }
+        
+        .#{$prefix}resizable-handle-south {
+            margin-bottom: -1px;
+        }
+    }
+
+    .#{$prefix}resizable-over .#{$prefix}resizable-handle, .#{$prefix}resizable-pinned .#{$prefix}resizable-handle{
+        @include opacity(1);
+    }
+
+    .#{$prefix}window .#{$prefix}window-handle {
+        @include opacity(0);
+    }
+
+    .#{$prefix}window-collapsed .#{$prefix}window-handle {
+        display: none;
+    }
+
+    .#{$prefix}resizable-proxy {
+        border: 1px dashed #3b5a82;
+        position: absolute;
+        left: 0;
+        top: 0;
+        overflow: hidden;
+        z-index: 50000;
+    }
+
+    .#{$prefix}resizable-overlay {
+        position: absolute;
+        left: 0;
+        top: 0;
+        
+        width: 100%;
+        height: 100%;
+        
+        display: none;
+        
+        z-index: 200000;
+        
+        background-color: #fff;
+            
+        @include opacity(0);
+    }
+    
+    .#{$prefix}resizable-over,
+    .#{$prefix}resizable-pinned {
+        .#{$prefix}resizable-handle-east,
+        .#{$prefix}resizable-handle-west {
+                background-position: left;
+                background-image: theme-background-image($theme-name, 'sizer/e-handle.gif');
+        }
+        
+        .#{$prefix}resizable-handle-south,
+        .#{$prefix}resizable-handle-north {
+            background-position: top;
+            background-image: theme-background-image($theme-name, 'sizer/s-handle.gif');
+        }
+        
+        .#{$prefix}resizable-handle-southeast {
+            background-position: top left;
+            background-image: theme-background-image($theme-name, 'sizer/se-handle.gif');
+        }
+        
+        .#{$prefix}resizable-handle-northwest {
+            background-position: bottom right;
+            background-image: theme-background-image($theme-name, 'sizer/nw-handle.gif');
+        }
+        
+        .#{$prefix}resizable-handle-northeast {
+            background-position: bottom left;
+            background-image: theme-background-image($theme-name, 'sizer/ne-handle.gif');
+        }
+
+        .#{$prefix}resizable-handle-southwest {
+            background-position: top right;
+            background-image: theme-background-image($theme-name, 'sizer/sw-handle.gif');
+        }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/util/_scroller.scss b/interface/ext/resources/themes/stylesheets/ext4/default/util/_scroller.scss
new file mode 100755
index 0000000..4a99cb3
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/util/_scroller.scss
@@ -0,0 +1,55 @@
+ at mixin extjs-scroller {
+    .#{$prefix}horizontal-scroller-present .#{$prefix}grid-body {
+        border-bottom-width: 0px;
+    }
+        
+    .#{$prefix}vertical-scroller-present .#{$prefix}grid-body {
+        border-right-width: 0px;
+    }
+
+    .#{$prefix}scroller {
+        overflow: hidden;
+    }
+    
+    .#{$prefix}scroller-vertical {
+        border: 1px solid $panel-border-color;
+        border-top-color: $grid-header-background-color;
+    }
+    
+    .#{$prefix}scroller-horizontal {
+        border: 1px solid $panel-border-color;
+    }
+
+    .#{$prefix}vertical-scroller-present .#{$prefix}scroller-horizontal {
+        border-right-width: 0px;
+    }
+    
+    .#{$prefix}scroller-ct {
+        overflow: hidden;
+        position: absolute;
+        margin: 0;
+        padding: 0;
+        border: none;
+        left: 0px;
+        top: 0px;
+
+        /*
+        In IE9 (only), the border-box style causes the scroller-ct to be 0px in the
+        perpendicular dimension and breaks the scroll as well as offsets it by the left
+        offset that we use to try and keep some size on this element. This works on all
+        browsers (including IE9).
+        */
+        box-sizing: content-box !important;
+        -ms-box-sizing: content-box !important;
+        -moz-box-sizing: content-box !important;
+        -webkit-box-sizing: content-box !important;
+    }
+    
+    .#{$prefix}scroller-vertical .#{$prefix}scroller-ct {
+        overflow-y: scroll;
+    }
+    
+    .#{$prefix}scroller-horizontal .#{$prefix}scroller-ct {
+        overflow-x: scroll;
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/util/_splitter.scss b/interface/ext/resources/themes/stylesheets/ext4/default/util/_splitter.scss
new file mode 100755
index 0000000..3fc87a6
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/util/_splitter.scss
@@ -0,0 +1,106 @@
+ at mixin extjs-splitter {
+    .#{$prefix}splitter {
+        .#{$prefix}collapse-el {
+            position: absolute;
+
+            cursor: pointer;
+
+            background-color: transparent;
+            background-repeat: no-repeat !important;
+        }
+    }
+
+    .#{$prefix}layout-split-left,
+    .#{$prefix}layout-split-right {
+        top: 50%;
+
+        margin-top: -17px;
+
+        width: 5px;
+        height: 35px;
+    }
+
+    .#{$prefix}layout-split-top,
+    .#{$prefix}layout-split-bottom {
+        left: 50%;
+
+        width: 35px;
+        height: 5px;
+
+        margin-left: -17px;
+    }
+
+    .#{$prefix}layout-split-left {
+        background: no-repeat top right;
+        background-image: theme-background-image($theme-name, 'util/splitter/mini-left.gif');
+    }
+
+    .#{$prefix}layout-split-right {
+        background: no-repeat top left;
+        background-image: theme-background-image($theme-name, 'util/splitter/mini-right.gif');
+    }
+
+    .#{$prefix}layout-split-top {
+        background: no-repeat top left;
+        background-image: theme-background-image($theme-name, 'util/splitter/mini-top.gif');
+    }
+
+    .#{$prefix}layout-split-bottom {
+        background: no-repeat top left;
+        background-image: theme-background-image($theme-name, 'util/splitter/mini-bottom.gif');
+    }
+
+    .#{$prefix}splitter-collapsed {
+        .#{$prefix}layout-split-left {
+            background: no-repeat top left;
+            background-image: theme-background-image($theme-name, 'util/splitter/mini-right.gif');
+        }
+
+        .#{$prefix}layout-split-right {
+            background: no-repeat top right;
+            background-image: theme-background-image($theme-name, 'util/splitter/mini-left.gif');
+        }
+
+        .#{$prefix}layout-split-top {
+            background: no-repeat top left;
+            background-image: theme-background-image($theme-name, 'util/splitter/mini-bottom.gif');
+        }
+
+        .#{$prefix}layout-split-bottom {
+            background: no-repeat top left;
+            background-image: theme-background-image($theme-name, 'util/splitter/mini-top.gif');
+        }
+    }
+
+    .#{$prefix}splitter-horizontal {
+        cursor: e-resize;
+        cursor: row-resize;
+        font-size:1px;
+    }
+    .#{$prefix}splitter-vertical {
+        cursor: e-resize;
+        cursor: col-resize;
+        font-size:1px;
+    }
+    .#{$prefix}splitter-collapsed {
+        cursor: default;
+    }
+
+    .#{$prefix}splitter-active {
+        z-index: 4;
+        font-size:1px;
+        background-color: rgb(180, 180, 180);
+        @include opacity(0.8);
+    }
+    .#{$prefix}splitter-active {
+        .#{$prefix}collapse-el {
+            @include opacity(0.3);
+        }
+    }
+
+    .#{$prefix}proxy-el {
+        position: absolute;
+        background: rgb(180, 180, 180);
+        @include opacity(0.8);
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/util/_tool.scss b/interface/ext/resources/themes/stylesheets/ext4/default/util/_tool.scss
new file mode 100755
index 0000000..5d1a8ec
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/util/_tool.scss
@@ -0,0 +1,295 @@
+ at mixin extjs-tool {
+    .#{$prefix}tool {
+        height: $tool-size;
+
+        img {
+            overflow: hidden;
+
+            width: $tool-size;
+            height: $tool-size;
+
+            cursor: pointer;
+
+            background-color: transparent;
+            background-repeat: no-repeat;
+            background-image: theme-background-image($theme-name, 'tools/tool-sprites.gif');
+
+            margin: 0;
+        }
+    }
+
+    .#{$prefix}panel-header-horizontal,
+    .#{$prefix}window-header-horizontal {
+        .#{$prefix}tool {
+                margin-left: 2px;
+        }
+    }
+
+    .#{$prefix}panel-header-vertical,
+    .#{$prefix}window-header-vertical {
+        .#{$prefix}tool {
+                margin-bottom: 2px;
+        }
+    }
+
+.#{$prefix}tool-placeholder {
+        visibility: hidden;
+    }
+
+    .#{$prefix}tool-toggle {
+        background-position: 0 -60px;
+    }
+
+    .#{$prefix}tool-over {
+        .#{$prefix}tool-toggle {
+            background-position: -15px -60px;
+        }
+    }
+
+    .#{$prefix}panel-collapsed,
+    .#{$prefix}fieldset-collapsed {
+        .#{$prefix}tool-toggle {
+            background-position: 0 -75px;
+        }
+
+        .#{$prefix}tool-over {
+            .#{$prefix}tool-toggle {
+                background-position: -15px -75px;
+            }
+        }
+    }
+
+    .#{$prefix}tool-close {
+        background-position: 0 0;
+    }
+    
+    .#{$prefix}tool-minimize {
+        background-position: 0 -15px;
+    }
+    
+    .#{$prefix}tool-maximize {
+        background-position: 0 -30px;
+    }
+    
+    .#{$prefix}tool-restore {
+        background-position: 0 -45px;
+    }
+    
+    .#{$prefix}tool-gear {
+        background-position: 0 -90px;
+    }
+    
+    .#{$prefix}tool-prev {
+        background-position: 0 -105px;
+    }
+    
+    .#{$prefix}tool-next {
+        background-position: 0 -120px;
+    }
+    
+    .#{$prefix}tool-pin {
+        background-position: 0 -135px;
+    }
+
+    .#{$prefix}tool-unpin {
+        background-position: 0 -150px;
+    }
+
+    .#{$prefix}tool-right {
+        background-position: 0 -165px;
+    }
+
+    .#{$prefix}tool-left {
+        background-position: 0 -180px;
+    }
+    
+    .#{$prefix}tool-help {
+        background-position: 0 -300px;
+    }
+
+    .#{$prefix}tool-save {
+        background-position: 0 -285px;
+    }
+
+    .#{$prefix}tool-search {
+        background-position: 0 -270px;
+    }
+
+    .#{$prefix}tool-minus {
+        background-position: 0 -255px;
+    }
+
+    .#{$prefix}tool-plus {
+        background-position: 0 -240px;
+    }
+
+    .#{$prefix}tool-refresh {
+        background-position: 0 -225px;
+    }
+
+    .#{$prefix}tool-up {
+        background-position: 0 -210px;
+    }
+
+    .#{$prefix}tool-down {
+        background-position: 0 -195px;
+    }
+    
+    .#{$prefix}tool-move {
+        background-position: 0 -375px;
+    }
+
+    .#{$prefix}tool-resize {
+        background-position: 0 -360px;
+    }
+    
+    .#{$prefix}tool-collapse {
+        background-position: 0 -345px;
+    }
+
+    .#{$prefix}tool-expand {
+        background-position: 0 -330px;
+    }
+
+    .#{$prefix}tool-print {
+        background-position: 0 -315px;
+    }
+
+    .#{$prefix}tool-expand-bottom,
+    .#{$prefix}tool-collapse-bottom {
+        background-position: 0 -195px;
+    }
+
+    .#{$prefix}tool-expand-top,
+    .#{$prefix}tool-collapse-top {
+        background-position: 0 -210px;
+    }
+
+    .#{$prefix}tool-expand-left,
+    .#{$prefix}tool-collapse-left {
+        background-position: 0 -180px;
+    }
+
+    .#{$prefix}tool-expand-right,
+    .#{$prefix}tool-collapse-right {
+        background-position: 0 -165px;
+    }
+
+    .#{$prefix}tool-over {
+        .#{$prefix}tool-close {
+            background-position: -15px 0;
+        }
+
+        .#{$prefix}tool-minimize {
+            background-position: -15px -15px;
+        }
+    
+        .#{$prefix}tool-maximize {
+            background-position: -15px -30px;
+        }
+
+        .#{$prefix}tool-restore {
+            background-position: -15px -45px;
+        }
+    
+        .#{$prefix}tool-gear {
+            background-position: -15px -90px;
+        }
+    
+        .#{$prefix}tool-prev {
+            background-position: -15px -105px;
+        }
+    
+        .#{$prefix}tool-next {
+            background-position: -15px -120px;
+        }
+    
+        .#{$prefix}tool-pin {
+            background-position: -15px -135px;
+        }
+    
+        .#{$prefix}tool-unpin {
+            background-position: -15px -150px;
+        }
+    
+        .#{$prefix}tool-right {
+            background-position: -15px -165px;
+        }
+    
+        .#{$prefix}tool-left {
+            background-position: -15px -180px;
+        }
+
+        .#{$prefix}tool-down {
+            background-position: -15px -195px;
+        }
+    
+        .#{$prefix}tool-up {
+            background-position: -15px -210px;
+        }
+    
+        .#{$prefix}tool-refresh {
+            background-position: -15px -225px;
+        }
+    
+        .#{$prefix}tool-plus {
+            background-position: -15px -240px;
+        }
+
+        .#{$prefix}tool-minus {
+            background-position: -15px -255px;
+        }
+
+        .#{$prefix}tool-search {
+            background-position: -15px -270px;
+        }
+
+        .#{$prefix}tool-save {
+            background-position: -15px -285px;
+        }
+
+        .#{$prefix}tool-help {
+            background-position: -15px -300px;
+        }
+
+        .#{$prefix}tool-print {
+            background-position: -15px -315px;
+        }
+
+        .#{$prefix}tool-expand {
+            background-position: -15px -330px;
+        }
+
+        .#{$prefix}tool-collapse {
+            background-position: -15px -345px;
+        }
+    
+        .#{$prefix}tool-resize {
+            background-position: -15px -360px;
+        }
+    
+        .#{$prefix}tool-move {
+            background-position: -15px -375px;
+        }
+        
+        .#{$prefix}tool-expand-bottom,
+        .#{$prefix}tool-collapse-bottom {
+            background-position: -15px -195px;
+        }
+    
+        .#{$prefix}tool-expand-top,
+        .#{$prefix}tool-collapse-top {
+            background-position: -15px -210px;
+        }
+    
+        .#{$prefix}tool-expand-left,
+        .#{$prefix}tool-collapse-left {
+            background-position: -15px -180px;
+        }
+    
+        .#{$prefix}tool-expand-right,
+        .#{$prefix}tool-collapse-right {
+            background-position: -15px -165px;
+        }
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_boundlist.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_boundlist.scss
new file mode 100755
index 0000000..5b19d04
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_boundlist.scss
@@ -0,0 +1,18 @@
+//background
+$boundlist-background-color: #fff !default;
+
+//borders
+$boundlist-border-color: adjust-color($base-color, $hue: 0.58deg, $saturation: 25.146%, $lightness: -6.471%) !default;
+$boundlist-border-width: 1px !default;
+$boundlist-border-style: solid !default;
+
+$boundlist-item-padding: 2px !default;
+$boundlist-item-border-width: 1px !default;
+$boundlist-item-border-style: dotted !default;
+$boundlist-item-border-color: $boundlist-background-color !default;
+
+$boundlist-item-over-border-color: adjust-color($base-color, $hue: 6.952deg, $saturation: 5.848%, $lightness: -6.471%) !default;
+$boundlist-item-selected-border-color: darken($boundlist-item-over-border-color, 5) !default;
+
+$boundlist-item-over-background-color: adjust-color($base-color, $hue: 3.188deg, $saturation: 0.542%, $lightness: 7.843%) !default;
+$boundlist-item-selected-background-color: darken($boundlist-item-over-background-color, 5) !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_btn-group.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_btn-group.scss
new file mode 100755
index 0000000..02c4af3
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_btn-group.scss
@@ -0,0 +1,15 @@
+$btn-group-background-color: #d0def0 !default;
+$btn-group-margin: 2px 0 !default;
+$btn-group-border-color: #b7c8d7 !default;
+$btn-group-border-radius: 2px !default;
+$btn-group-border-width: 1px !default;
+$btn-group-padding: 0 1px !default;
+
+$btn-group-inner-border-width: 1px !default;
+$btn-group-inner-border-color: #e3ebf5 !default;
+
+$btn-group-header-margin: 2px 2px 0 2px !default;
+$btn-group-header-font: normal ceil($font-size * .9) $font-family !default;
+$btn-group-header-color: #3E6AAA !default;
+$btn-group-header-padding: 1px 0 !default;
+$btn-group-header-background-color: #c2d8f0 !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_button.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_button.scss
new file mode 100755
index 0000000..e818934
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_button.scss
@@ -0,0 +1,141 @@
+$button-arrow-size: 12px !default;
+$button-split-size: 14px !default;
+$button-icon-spacing: 4px !default;
+
+$button-small-border-radius: 3px !default;
+$button-small-border-width: 1px !default;
+$button-small-padding: 2px !default;
+$button-small-text-padding: 4px;
+$button-small-font-size: ceil($font-size * .9) !default; //11px
+$button-small-font-size-over: $button-small-font-size !default;
+$button-small-font-size-focus: $button-small-font-size-over;
+$button-small-font-size-pressed: $button-small-font-size !default;
+$button-small-font-size-disabled: $button-small-font-size !default;
+$button-small-font-weight: normal !default;
+$button-small-font-weight-over: $button-small-font-weight !default;
+$button-small-font-weight-focus: $button-small-font-weight-over;
+$button-small-font-weight-pressed: $button-small-font-weight !default;
+$button-small-font-weight-disabled: $button-small-font-weight !default;
+$button-small-font-family: $font-family !default;
+$button-small-font-family-over: $button-small-font-family !default;
+$button-small-font-family-focus: $button-small-font-family-over;
+$button-small-font-family-pressed: $button-small-font-family !default;
+$button-small-font-family-disabled: $button-small-font-family !default;
+$button-small-icon-size: 16px !default;
+
+$button-medium-border-radius: 3px !default;
+$button-medium-border-width: 1px !default;
+$button-medium-padding: 3px !default;
+$button-medium-text-padding: 3px;
+$button-medium-font-size: ceil($font-size * .9) !default; //11px
+$button-medium-font-size-over: $button-medium-font-size !default;
+$button-medium-font-size-focus: $button-medium-font-size-over;
+$button-medium-font-size-pressed: $button-medium-font-size !default;
+$button-medium-font-size-disabled: $button-medium-font-size !default;
+$button-medium-font-weight: normal !default;
+$button-medium-font-weight-over: $button-medium-font-weight !default;
+$button-medium-font-weight-focus: $button-medium-font-weight-over;
+$button-medium-font-weight-pressed: $button-medium-font-weight !default;
+$button-medium-font-weight-disabled: $button-medium-font-weight !default;
+$button-medium-font-family: $font-family !default;
+$button-medium-font-family-over: $button-medium-font-family !default;
+$button-medium-font-family-focus: $button-medium-font-family-over;
+$button-medium-font-family-pressed: $button-medium-font-family !default;
+$button-medium-font-family-disabled: $button-medium-font-family !default;
+$button-medium-icon-size: 24px !default;
+
+$button-large-border-radius: 3px !default;
+$button-large-border-width: 1px !default;
+$button-large-padding: 3px !default;
+$button-large-text-padding: 3px;
+$button-large-font-size: ceil($font-size * .9) !default; //11px
+$button-large-font-size-over: $button-large-font-size !default;
+$button-large-font-size-focus: $button-large-font-size-over;
+$button-large-font-size-pressed: $button-large-font-size !default;
+$button-large-font-size-disabled: $button-large-font-size !default;
+$button-large-font-weight: normal !default;
+$button-large-font-weight-over: $button-large-font-weight !default;
+$button-large-font-weight-focus: $button-large-font-weight-over;
+$button-large-font-weight-pressed: $button-large-font-weight !default;
+$button-large-font-weight-disabled: $button-large-font-weight !default;
+$button-large-font-family: $font-family !default;
+$button-large-font-family-over: $button-large-font-family !default;
+$button-large-font-family-focus: $button-large-font-family-over;
+$button-large-font-family-pressed: $button-large-font-family !default;
+$button-large-font-family-disabled: $button-large-font-family !default;
+$button-large-icon-size: 32px !default;
+
+//base colors for the default button
+$button-default-base-color: adjust-color($neutral-color, $hue: 0deg, $saturation: -55.556%, $lightness: 12.745%) !default; //F7F7F7
+$button-default-base-color-over: adjust-color($base-color, $hue: -6.667deg, $saturation: 44.444%, $lightness: 10.588%) !default; //E4F3FF
+$button-default-base-color-focus: $button-default-base-color-over !default;
+$button-default-base-color-pressed: adjust-color($base-color, $hue: -0.725deg, $saturation: -9.556%, $lightness: -3.725%) !default; //B6CBE4
+$button-default-base-color-disabled: adjust-color($base-color, $hue: 0deg, $saturation: -55.556%, $lightness: 12.745%) !default; //F7F7F7
+
+$button-default-border-color: adjust-color($button-default-base-color, $hue: 0deg, $saturation: 0%, $lightness: -18.039%) !default;
+$button-default-border-color-over: adjust-color($button-default-base-color-over, $hue: 8.177deg, $saturation: -28.283%, $lightness: -12.745%) !default;
+$button-default-border-color-focus: $button-default-border-color-over !default;
+$button-default-border-color-pressed: adjust-color($button-default-base-color-pressed, $hue: 2.317deg, $saturation: 6.756%, $lightness: -5.294%) !default;
+$button-default-border-color-disabled: adjust-color($button-default-base-color-disabled, $hue: 0deg, $saturation: 0%, $lightness: -8.627%) !default;
+
+$button-default-background-color: $button-default-base-color !default;
+$button-default-background-color-over: $button-default-base-color-over !default;
+$button-default-background-color-focus: $button-default-background-color-over !default;
+$button-default-background-color-pressed: $button-default-base-color-pressed !default;
+$button-default-background-color-disabled: $button-default-base-color-disabled !default;
+
+$button-default-background-gradient: 'glossy-button' !default;
+$button-default-background-gradient-over: 'glossy-button-over' !default;
+$button-default-background-gradient-focus: $button-default-background-gradient-over !default;
+$button-default-background-gradient-pressed: 'glossy-button-pressed' !default;
+$button-default-background-gradient-disabled: 'glossy-button-disabled' !default;
+
+$button-default-background-gradient-color-stops: null !default;
+$button-default-background-gradient-color-stops-over: $button-default-background-gradient-color-stops !default;
+$button-default-background-gradient-color-stops-focus: $button-default-background-gradient-color-stops-over !default;
+$button-default-background-gradient-color-stops-pressed: $button-default-background-gradient-color-stops !default;
+$button-default-background-gradient-color-stops-disabled: $button-default-background-gradient-color-stops !default;
+
+$button-default-color: #333 !default;
+$button-default-color-over: $button-default-color !default;
+$button-default-color-focus: $button-default-color-over !default;
+$button-default-color-pressed: $button-default-color !default;
+$button-default-color-disabled: lighten($button-default-color, 35) !default;
+
+/**
+ * Toolbar buttons
+ */
+$button-toolbar-arrow-size: 12px !default;
+$button-toolbar-split-size: 12px !default;
+
+$button-toolbar-base-color: adjust-color($base-color, $hue: -213.333deg, $saturation: -55.556%, $lightness: 3.333%) !default;
+
+$button-toolbar-border-color: transparent !default;
+$button-toolbar-border-color-over: adjust-color($base-color, $hue: 0.084deg, $saturation: -9.891%, $lightness: -18.039%) !default;
+$button-toolbar-border-color-focus: $button-toolbar-border-color-over;
+$button-toolbar-border-color-pressed: adjust-color($base-color, $hue: 0.721deg, $saturation: -17.014%, $lightness: -21.765%) !default;
+$button-toolbar-border-color-disabled: transparent !default;
+
+$button-toolbar-background-color: transparent !default;
+$button-toolbar-background-color-over: adjust-color($base-color, $hue: -5deg, $saturation: 44.444%, $lightness: 8.824%) !default;
+$button-toolbar-background-color-focus: $button-toolbar-background-color-over;
+$button-toolbar-background-color-pressed: adjust-color($base-color, $hue: -1.138deg, $saturation: -11.47%, $lightness: -2.353%) !default;
+$button-toolbar-background-color-disabled: transparent !default;
+
+$button-toolbar-background-gradient: null !default;
+$button-toolbar-background-gradient-over: 'glossy-button-over' !default;
+$button-toolbar-background-gradient-focus: $button-toolbar-background-gradient-over;
+$button-toolbar-background-gradient-pressed: 'glossy-button-pressed' !default;
+$button-toolbar-background-gradient-disabled: null !default;
+
+$button-toolbar-background-gradient-color-stops: null !default;
+$button-toolbar-background-gradient-color-stops-over: null !default;
+$button-toolbar-background-gradient-color-stops-focus: $button-toolbar-background-gradient-color-stops-over;
+$button-toolbar-background-gradient-color-stops-pressed: null !default;
+$button-toolbar-background-gradient-color-stops-disabled: null !default;
+
+$button-toolbar-color: #333 !default;
+$button-toolbar-color-over: $button-toolbar-color !default;
+$button-toolbar-color-focus: $button-toolbar-color-over;
+$button-toolbar-color-pressed: $button-toolbar-color !default;
+$button-toolbar-color-disabled: lighten($button-toolbar-color, 35) !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_core.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_core.scss
new file mode 100755
index 0000000..2ea7f50
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_core.scss
@@ -0,0 +1,114 @@
+/**
+ * @var {string} $prefix 
+ * The prefix to be applied to all CSS selectors. If this is changed, it must also be changed in your 
+ * JavaScript application.
+ */
+$prefix: 'x-' !default;
+
+/**
+ * @var {string} $theme-name 
+ * The name of the theme. This must match the the output directory of the images.
+ * (defaults to 'default')
+ */
+$theme-name: 'default' !default;
+
+/**
+ * @var {boolean/string} $relative-image-path-for-uis 
+ * True to use a relative image path for all new UIs. If true, the path will be "../images/".
+ * It can also be a string of the path value.
+ * It defaults to false, which means it will look for the images in the ExtJS SDK folder.
+ */
+$relative-image-path-for-uis: false !default;
+
+$color: #000 !default;
+
+/**
+ * @var {string} $font-family 
+ * The default font-family to be used throughout the theme.
+ */
+$font-family: tahoma,arial,verdana,sans-serif !default;
+
+$font-size  : 12px !default;
+
+/**
+ * @var {string} $base-gradient 
+ * The base gradient to be used throughout the theme.
+ */
+$base-gradient: 'matte' !default;
+
+/**
+ * @var {color} $base-color
+ * The base color to be used throughout the theme.
+ */
+$base-color   : #C0D4ED !default;
+$neutral-color: #eeeeee !default;
+
+/**
+ * @var {boolean} $include-not-found-images
+ * True to include files which are not found when compiling your SASS
+ */
+$include-missing-images: true !default;
+
+/**
+ * @var {boolean} $include-ie
+ * True to include Internet Explorer specific rules
+ */
+$include-ie: true !default;
+
+/**
+ * @var {boolean} $include-ff
+ * True to include Firefox specific rules
+ */
+$include-ff: true !default;
+
+/**
+ * @var {boolean} $include-chrome
+ * True to include Chrome specific rules
+ */
+$include-chrome: true !default;
+
+/**
+ * @var {boolean} $include-safari
+ * True to include Safari specific rules
+ */
+$include-safari: true !default;
+
+/**
+ * @var {boolean} $include-opera
+ * True to include Opera specific rules
+ */
+$include-opera: true !default;
+
+/**
+ * @var {boolean} $include-webkit
+ * True to include Webkit specific rules
+ */
+$include-webkit: true !default;
+
+$supports-border-radius: true !default;
+$supports-gradients: true !default;
+
+/**
+ * @var {boolean} $compile-all
+ * True to copile all CSS, even if above include rules are false
+ */
+$compile-all: true !default;
+
+/**
+ * @var {boolean} $scope-reset-css
+ * True to scope the reset CSS within the $prefix variable.
+ */
+$scope-reset-css: false !default;
+
+/**
+ * @var {color} $css-shadow-background-color
+ * The base color for CSS shadows
+ */
+$css-shadow-background-color: #ccc !default;
+
+
+/**
+ * @var {color} $include-shadow-images
+ * True to include all shadow images.
+ */
+$include-shadow-images: true !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_focus.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_focus.scss
new file mode 100755
index 0000000..37286de
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_focus.scss
@@ -0,0 +1,3 @@
+$focus-frame-color: rgb(21, 66, 139);
+$focus-frame-style: solid;
+$focus-frame-width: 2px;
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_form.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_form.scss
new file mode 100755
index 0000000..d1fdae1
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_form.scss
@@ -0,0 +1,114 @@
+/**
+ * @class Ext.form.*
+ */
+
+/**
+ * @class Ext.form.field.Base
+ */
+
+$form-field-height: 22px !default;
+$form-toolbar-field-height: 20px !default;
+
+//padding
+$form-field-padding: 1px 3px !default;
+
+//fonts
+$form-field-font-size: $font-size !default;
+
+$form-field-font-family: $font-family !default;
+$form-field-font-weight: normal !default;
+$form-field-font: $form-field-font-weight $form-field-font-size $form-field-font-family !default;
+$form-field-color: #000 !default;
+
+$form-field-empty-color: gray !default;
+
+//border
+$form-field-border-color: #B5B8C8 !default;
+$form-field-border-width: 1px !default;
+
+$form-field-focus-border-color: adjust-color($base-color, $hue: -4.322deg, $saturation: -1.065%, $lightness: -16.863%) !default;
+$form-field-invalid-border-color: #c30 !default;
+
+//background
+$form-field-background-color: #fff !default;
+$form-field-background-image: 'form/text-bg.gif' !default;
+
+$form-field-invalid-background-color: #fff !default;
+$form-field-invalid-background-image: 'grid/invalid_line.gif' !default;
+$form-field-invalid-background-repeat: repeat-x !default;
+$form-field-invalid-background-position: bottom !default;
+
+/**
+ * @class Ext.form.field.TextArea
+ */
+$form-textarea-padding: 2px 3px !default;
+
+/**
+ * @class Ext.form.Label
+ */
+$form-label-font-weight: normal !default;
+$form-label-font-size: $font-size !default;
+$form-label-font-family: $font-family !default;
+$form-label-font: $form-label-font-weight $form-label-font-size $form-label-font-family !default;
+
+/**
+ * @class Ext.form.field.Checkbox
+ */
+$form-checkbox-image: 'form/checkbox.gif' !default;
+$form-checkbox-size: 13px !default;
+
+/**
+ * @class Ext.form.field.Radio
+ */
+$form-radio-image: 'form/radio.gif' !default;
+
+
+/**
+ * Error messages
+ */
+//icons
+$form-exclamation-icon: 'form/exclamation.gif' !default;
+
+//font
+$form-error-msg-color: #c0272b !default;
+$form-error-msg-font-weight: normal !default;
+$form-error-msg-font-size: ceil($font-size * .9) !default;
+$form-error-msg-font-family: $font-family !default;
+$form-error-msg-font: $form-error-msg-font-weight $form-error-msg-font-size $form-error-msg-font-family !default;
+$form-error-msg-line-height: 16px !default;
+
+/**
+ * Trigger Field
+ */
+$form-trigger-width: 17px !default;
+$form-trigger-height: $form-field-height !default;
+$form-toolbar-trigger-height: $form-toolbar-field-height !default;
+
+$form-trigger-border-bottom-width: 1px !default;
+$form-trigger-border-bottom-style: solid !default;
+$form-trigger-border-bottom-color: $form-field-border-color !default;
+$form-trigger-border-bottom: $form-trigger-border-bottom-width $form-trigger-border-bottom-style $form-trigger-border-bottom-color !default;
+
+$form-trigger-border-bottom-color-over: adjust-color($base-color, $hue: -4.322deg, $saturation: -1.065%, $lightness: -16.863%) !default;
+$form-trigger-border-bottom-color-focus: adjust-color($base-color, $hue: -4.322deg, $saturation: -1.065%, $lightness: -16.863%) !default;
+$form-trigger-border-bottom-color-focus-over: null !default;
+$form-trigger-border-bottom-color-pressed: null !default;
+
+$form-trigger-icon-background-position: 7px 6px !default;
+
+/**
+ * Fieldsets
+ */
+$fieldset-header-font-size: ceil($font-size * .9) !default;
+$fieldset-header-font-weight: bold !default;
+$fieldset-header-font-family: $font-family !default;
+$fieldset-header-font: $fieldset-header-font-size $fieldset-header-font-weight $fieldset-header-font-family !default;
+$fieldset-header-color: adjust-color($base-color, $hue: 3.785deg, $saturation: 18.194%, $lightness: -52.745%) !default;
+
+$fieldset-border-width: 1px !default;
+$fieldset-border-style: solid !default;
+$fieldset-border-color: $form-field-border-color !default;
+$fieldset-border: $fieldset-border-width $fieldset-border-style $fieldset-border-color !default;
+
+$fieldset-padding: 10px !default;
+$fieldset-header-padding: 0 3px !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_grid.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_grid.scss
new file mode 100755
index 0000000..e6fa45a
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_grid.scss
@@ -0,0 +1,91 @@
+// ===============================
+// ========= GRID BASE ===========
+// ===============================
+$grid-base-color: $base-color !default;
+
+// ===============================
+// ========= GRID HEADER =========
+// ===============================
+$grid-header-background-color: adjust-color($neutral-color, $hue: 0deg, $saturation: 0%, $lightness: -16.078%) !default;
+$grid-header-background-gradient: 'grid-header' !default;
+$grid-header-border-color: $neutral-color !default;
+$grid-header-over-border-color: adjust-color(#C0D4ED, $hue: -0.175deg, $saturation: 25.296%, $lightness: -2.549%) !default;
+$grid-header-over-background-color: $grid-header-over-border-color !default;
+$grid-header-over-background-gradient: 'grid-header-over' !default;
+$grid-header-background-color: $grid-base-color !default;
+$grid-header-padding: 0px 6px !default;
+$grid-header-trigger-height: 22px !default;
+$grid-header-trigger-width: 14px !default;
+$grid-header-color: null !default;
+
+// ===============================
+// ========= GRID ROWS ===========
+// ===============================
+$grid-row-cell-color: null !default;
+$grid-row-cell-font: normal ceil($font-size * .9) $font-family !default;
+$grid-row-padding: 0 1px !default;
+
+//row wrap
+$grid-row-wrap-border-color: #ededed !default;
+$grid-row-wrap-border-width: 1px 0 !default;
+$grid-row-wrap-border-style: solid !default;
+
+//row body
+$grid-row-body-font: normal 11px/13px $font-family !default;
+$grid-row-body-padding: 4px !default;
+
+//row cell
+$grid-row-cell-background: #fff !default;
+$grid-row-cell-border-color: $grid-row-wrap-border-color !default;
+$grid-row-cell-border-style: solid !default;
+$grid-row-cell-border-width: 1px 0 !default;
+
+//row cell alt
+$grid-row-cell-alt-background: darken($grid-row-cell-background, 2) !default;
+
+//row cell over
+$grid-row-cell-over-border-color: adjust-color($neutral-color, $hue: 0deg, $saturation: 0%, $lightness: -6.667%) !default;
+$grid-row-cell-over-background-color: adjust-color($neutral-color, $hue: 0deg, $saturation: 0%, $lightness: 0.392%) !default;
+$grid-row-cell-over-background-gradient: 'grid-row-over' !default;
+
+//row cell selected
+$grid-row-cell-selected-border-style: dotted !default;
+$grid-row-cell-selected-border-color: adjust-color($base-color, $hue: 6.952deg, $saturation: 5.848%, $lightness: -6.471%) !default;
+$grid-row-cell-selected-background-color: adjust-color($base-color, $hue: 3.188deg, $saturation: 0.542%, $lightness: 7.843%) !default;
+
+//row cell focus
+$grid-row-cell-focus-border-color: adjust-color($neutral-color, $hue: 0deg, $saturation: 0%, $lightness: -6.667%) !default;
+$grid-row-cell-focus-background-color: adjust-color($neutral-color, $hue: 0deg, $saturation: 0%, $lightness: 0.392%) !default;
+$grid-row-cell-focus-background-gradient: 'grid-row-over' !default;
+
+//standard cells
+$grid-cell-font: normal 13px $font-family !default;
+$grid-cell-inner-padding: 3px 6px !default;
+
+//special cell
+$grid-cell-special-over-background-color: adjust-color($base-color, $hue: -0.476deg, $saturation: 25.214%, $lightness: 5.686%) !default;
+
+//cell with col lines
+$grid-cell-with-col-lines-border-color: adjust-color($base-color, $hue: 0deg, $saturation: -55.556%, $lightness: -2.549%) !default;
+
+// ===============================
+// ======== GROUPED GRID =========
+// ===============================
+$grid-grouped-header-background-color: #fff;
+$grid-grouped-header-border-width: 0 0 2px 0;
+$grid-grouped-header-border-style: solid;
+$grid-grouped-header-border-color: adjust-color($base-color, $hue: 0.844deg, $saturation: 7.644%, $lightness: -8.627%);
+$grid-grouped-header-padding: 6px 0 0 0;
+
+$grid-grouped-title-color: adjust-color($base-color, $hue: 0.952deg, $saturation: -6.718%, $lightness: -41.961%);
+$grid-grouped-title-font: bold ceil($font-size * .9) $font-family;
+$grid-grouped-title-padding: 4px 4px 4px 17px;
+
+// ===============================
+// ========= ROW EDITOR ==========
+// ===============================
+$grid-row-editor-background-color: adjust-color($base-color, $hue: 1deg, $saturation: 11%, $lightness: 11%) !default;
+$grid-row-editor-border-color: $panel-border-color !default;
+$grid-row-editor-border-width: 1px !default;
+$grid-row-editor-border: $grid-row-editor-border-width solid $grid-row-editor-border-color !important;
+$grid-row-editor-font: $grid-row-cell-font !important;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_htmleditor.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_htmleditor.scss
new file mode 100755
index 0000000..8943449
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_htmleditor.scss
@@ -0,0 +1,2 @@
+$html-editor-border-color: $form-field-border-color !default;
+$html-editor-background-color: $form-field-background-color !default;
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_layout.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_layout.scss
new file mode 100755
index 0000000..f4de98b
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_layout.scss
@@ -0,0 +1,5 @@
+$border-layout-ct-background: adjust-color($base-color, $hue: 3.188deg, $saturation: 0.542%, $lightness: 7.843%) !default;
+
+$accordion-header-color: #000 !default;
+$accordion-header-background-color: #d9e7f8 !default;
+$accordion-header-background-gradient: null !default;
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_loadmask.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_loadmask.scss
new file mode 100755
index 0000000..7ae2271
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_loadmask.scss
@@ -0,0 +1,17 @@
+$loadmask-opacity: 0.5 !default;
+$loadmask-backgorund: #ccc !default;
+
+$loadmask-msg-padding: 2px !default;
+$loadmask-msg-border-color: $panel-header-border-color !default;
+$loadmask-msg-background-color: $panel-base-color !default;
+$loadmask-msg-background-gradient: null !default;
+
+$loadmask-msg-inner-padding: 5px 10px 5px 25px !default;
+$loadmask-msg-inner-icon: 'grid/loading.gif' !default;
+$loadmask-msg-inner-border-color: adjust-color($base-color, $hue: 1.111deg, $saturation: -14.017%, $lightness: -9.608%) !default;
+$loadmask-msg-inner-background-color: #eee !default;
+$loadmask-msg-inner-color: #222 !default;
+$loadmask-msg-inner-font-size: ceil($font-size * .9) !default; //11px
+$loadmask-msg-inner-font-weight: normal !default;
+$loadmask-msg-inner-font-family: $font-family !default;
+$loadmask-msg-inner-font: $loadmask-msg-inner-font-weight $loadmask-msg-inner-font-size $loadmask-msg-inner-font-family !default;
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_menu.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_menu.scss
new file mode 100755
index 0000000..6bbbd3a
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_menu.scss
@@ -0,0 +1,23 @@
+//backgrounds
+$menu-background-color: #F0F0F0 !default;
+$menu-item-active-background-image: 'menu/menu-item-active-bg.gif';
+$menu-item-active-background-color: #D9E8FB !default;
+
+//border
+$menu-item-active-border-color: #A9CBF5 !default;
+$menu-separator-border-color: #E0E0E0 !default;
+$menu-separator-background-color: #FFF !default;
+
+//sizes
+$menu-item-indent: 27px !default;
+$menu-padding: 2px !default;
+$menu-link-padding: 6px 2px 3px 32px !default;
+
+//text
+$menu-text-color: #222 !default;
+
+//icons
+$menu-icon-arrow: 'menu/menu-parent.gif';
+$menu-icon-checked: 'menu/checked.gif';
+$menu-icon-group-checked: 'menu/group-checked.gif';
+$menu-icon-unchecked: 'menu/unchecked.gif';
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_panel.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_panel.scss
new file mode 100755
index 0000000..2c57796
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_panel.scss
@@ -0,0 +1,65 @@
+// TODO: Change value to $include-default-uis !default;
+$include-panel-uis: true;
+
+// ===============================
+// ========= BASE PANEL ==========
+// ===============================
+$panel-border-radius: null !default;
+$panel-border-width: 1px !default;
+$panel-base-color: adjust-color($base-color, $hue: 0deg, $saturation: 0.542%, $lightness: 7.843%) !default; //#DFE8F6
+$panel-border-color: adjust-color($base-color, $hue: 0deg, $saturation: 7.644%, $lightness: -8.627%) !default;
+
+// ===============================
+// ========= PANEL BODY ==========
+// ===============================
+$panel-body-border-style: solid !default;
+$panel-body-background-color: #fff !default;
+$panel-body-color: #000 !default;
+$panel-body-border-color: $panel-border-color !default;
+$panel-body-font-size: 12px !default;
+
+// ===============================
+// ======== PANEL TOOLS ==========
+// ===============================
+$tool-size: 15px !default;
+
+// ===============================
+// ======== PANEL HEADER =========
+// ===============================
+$panel-header-border-width: 1px !default;
+$panel-header-border-style: solid !default;
+$panel-header-inner-border: true !default;
+$panel-header-inner-border-width: 1px 0 0 !default;
+
+//padding
+$panel-header-padding: 5px 4px 4px 5px !default;
+
+//fonts
+$panel-header-font-size: ceil($font-size * .9) !default; //11px
+$panel-header-line-height: $tool-size !default;
+$panel-header-font-weight: bold !default;
+$panel-header-font-family: $font-family !default;
+
+//background
+$panel-header-background-gradient: 'panel-header' !default;
+
+// UI defaults
+$panel-header-border-color: $panel-border-color !default;
+$panel-header-inner-border-color: adjust-color($panel-base-color, $hue: 0deg, $saturation: -6.098%, $lightness: 4.902%) !default;
+$panel-header-color: adjust-color($panel-base-color, $hue: 0deg, $saturation: 38.347%, $lightness: -63.725%) !default;
+$panel-header-background-color: adjust-color($panel-base-color, $hue: 0deg, $saturation: 6.402%, $lightness: -4.51%) !default;
+
+// ===============================
+// ======== FRAMED PANEL =========
+// ===============================
+$frame-base-color: $panel-base-color !default;
+
+//border
+$panel-frame-border-radius: 4px !default;
+$panel-frame-border-width: 1px !default;
+$panel-frame-border-style: solid !default;
+$panel-frame-padding: 4px !default;
+
+// UI defaults
+$panel-frame-background-color: $frame-base-color !default;
+$panel-frame-border-color: $panel-border-color !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_pickers.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_pickers.scss
new file mode 100755
index 0000000..911c80b
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_pickers.scss
@@ -0,0 +1,66 @@
+// color picker
+$colorpicker-item-border-color: #aca899 !default;
+$colorpicker-over-border-color: #8bb8f3 !default;
+$colorpicker-over-background-color: #deecfd !default;
+
+// date picker
+$datepicker-base-color: $base-color !default;
+
+$datepicker-border-color: adjust-color($datepicker-base-color, $hue: 5.926deg, $saturation: 4.444%, $lightness: -57.647%) !default; //#1b376c
+$datepicker-border-width: 1px !default;
+$datepicker-border-style: solid !default;
+$datepicker-border: $datepicker-border-width $datepicker-border-style $datepicker-border-color !default;
+$datepicker-background-color: #ffffff !default;
+
+$datepicker-next-image: 'shared/right-btn.gif' !default;
+$datepicker-prev-image: 'shared/left-btn.gif' !default;
+$datepicker-month-arrow-image: 'button/s-arrow-light.gif' !default;
+$datepicker-tool-sprite-image: 'tools/tool-sprites.gif' !default;
+
+$datepicker-header-background-color: adjust-color($datepicker-base-color, $hue: 5.768deg, $saturation: 0.419%, $lightness: -52.941%) !default; //#23427c
+$datepicker-header-background-gradient: matte !default;
+
+$datepicker-monthpicker-color: #fff !default;
+
+$datepicker-th-color: adjust-color($datepicker-base-color, $hue: 5.586deg, $saturation: -4.167%, $lightness: -55.882%) !default; //#233d6d
+$datepicker-th-font-family: $font-family !default;
+$datepicker-th-font-size: 10px !default;
+$datepicker-th-font-weight: normal !default;
+$datepicker-th-font: $datepicker-th-font-weight $datepicker-th-font-size $font-family !default;
+$datepicker-th-background-color: adjust-color($datepicker-base-color, $hue: -1.19deg, $saturation: 22.222%, $lightness: 8.824%) !default; //#dfecfb
+$datepicker-th-background-gradient: matte !default;
+$datepicker-th-border-bottom-color: darken($datepicker-th-background-color, 10) !default;
+$datepicker-th-text-align: right !default;
+
+$datepicker-td-height: 17px !default;
+
+//item
+$datepicker-item-color: #000 !default;
+$datepicker-item-border-width: 1px !default;
+$datepicker-item-border-style: solid !default;
+$datepicker-item-border-color: #fff !default;
+$datepicker-item-border: $datepicker-item-border-width $datepicker-item-border-style $datepicker-item-border-color !default;
+
+$datepicker-item-hover-background-color: adjust-color($datepicker-base-color, $hue: -0.606deg, $saturation: 38.73%, $lightness: 9.02%) !default; //#ddecfe
+
+$datepicker-today-item-border-color: darkred !default;
+
+$datepicker-selected-item-border-width: 1px !default;
+$datepicker-selected-item-border-style: solid !default;
+$datepicker-selected-item-border-color: adjust-color($datepicker-base-color, $hue: 0.853deg, $saturation: 5.008%, $lightness: -11.961%) !default; //#8db2e3
+$datepicker-selected-item-border: $datepicker-selected-item-border-width $datepicker-selected-item-border-style $datepicker-selected-item-border-color !default;
+$datepicker-selected-item-background-color: adjust-color($datepicker-base-color, $hue: 0.267deg, $saturation: -4.535%, $lightness: 6.275%) !default;
+
+$datepicker-footer-background-color: $datepicker-th-background-color !default;
+$datepicker-footer-background-gradient: color_stops(adjust-color($datepicker-base-color, $hue: 0.58deg, $saturation: -2.067%, $lightness: 7.451%), adjust-color($datepicker-base-color, $hue: -0.43deg, $saturation: -4.736%, $lightness: 3.922%) 49%, adjust-color($datepicker-base-color, $hue: -0.175deg, $saturation: -4.204%, $lightness: 1.373%) 51%, adjust-color($datepicker-base-color, $hue: 0.952deg, $saturation: -4.831%, $lightness: 2.353%)) !default;
+$datepicker-footer-border-top-color: $datepicker-th-border-bottom-color !default; //a3bad9
+
+$datepicker-monthpicker-height: 167px !default;
+
+$datepicker-monthpicker-item-color: adjust-color($datepicker-base-color, $hue: 3.785deg, $saturation: 18.194%, $lightness: -52.745%) !default; //#15428B
+$datepicker-monthpicker-item-border: $datepicker-item-border !default;
+
+$datepicker-monthpicker-item-hover-background-color: $datepicker-item-hover-background-color !default;
+
+$datepicker-monthpicker-item-selected-background-color: $datepicker-footer-background-color !default;
+$datepicker-monthpicker-item-selected-border: $datepicker-selected-item-border !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_progress-bar.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_progress-bar.scss
new file mode 100755
index 0000000..5f440b6
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_progress-bar.scss
@@ -0,0 +1,21 @@
+$progress-bar-base-color: $base-color !default;
+
+$progress-height: 20px !default;
+
+//borders
+$progress-border-color: adjust-color($progress-bar-base-color, $hue: 0deg, $saturation: -3.08%, $lightness: -23.725%) !default;
+$progress-border-width: 1px !default;
+$progress-border-radius: 0 !default;
+
+//backgrounds
+$progress-background-color: adjust-color($progress-bar-base-color, $hue: 0deg, $saturation: -11.37%, $lightness: 7.451%) !default;
+
+//bar
+$progress-bar-background-color: adjust-color($progress-bar-base-color, $hue: 0deg, $saturation: 8.187%, $lightness: -17.647%) !default;
+
+//text
+$progress-text-color-front: #fff !default;
+$progress-text-color-back: adjust-color($progress-bar-base-color, $hue: 0deg, $saturation: -10.895%, $lightness: -43.725%) !default;
+$progress-text-text-align: center !default;
+$progress-text-font-size: ceil($font-size * .9) !default;
+$progress-text-font-weight: bold !default;
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_qtip.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_qtip.scss
new file mode 100755
index 0000000..f830f51
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_qtip.scss
@@ -0,0 +1,29 @@
+$tip-base-color: adjust-color($base-color, $hue: 2.121deg, $saturation: 44.444%, $lightness: 11.569%) !default;
+
+//background
+$tip-background-color: $tip-base-color !default;
+$tip-background-gradient: null !default;
+
+//text
+$tip-body-color      : adjust-color($neutral-color, $hue: 0deg, $saturation: 0%, $lightness: -66.667%) !default;
+$tip-body-font-size  : ceil($font-size * .9) !default;
+$tip-body-font-weight: normal !default;
+$tip-body-padding: 3px !default;
+$tip-body-link-color: darken($tip-body-color, 10%) !default;
+
+$tip-header-color      : $tip-body-color !default;
+$tip-header-font-size  : $tip-body-font-size !default;
+$tip-header-font-weight: bold !default;
+$tip-header-padding    : 3px 3px 0 !default;  
+
+//borders
+$tip-border-color: adjust-color($tip-base-color, $hue: -1.705deg, $saturation: -60.494%, $lightness: -27.451%) !default;
+$tip-border-width: 1px !default;
+$tip-border-radius: 3px !default;
+
+//error tips
+$tip-error-inner-border-color: #d87166 !default;
+$tip-error-border-color: #a1311f !default;
+$tip-error-border-radius: 5px !default;
+$tip-error-border-width: 1px !default;
+$tip-error-background-color: #fff !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_tabs.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_tabs.scss
new file mode 100755
index 0000000..4174dfc
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_tabs.scss
@@ -0,0 +1,87 @@
+//color
+$tabbar-base-color: adjust-color($panel-base-color, $hue: 0deg, $saturation: -3.156%, $lightness: -5.294%) !default;
+$tabbar-background-gradient: 'tabbar' !default;
+
+//background
+$tab-base-color: adjust-color($base-color, $hue: 0deg, $saturation: 33.016%, $lightness: 9.02%) !default; //#deecfd
+$tab-base-color-over: adjust-color($tab-base-color, $hue: 0deg, $saturation: 11.429%, $lightness: 2.353%) !default;
+$tab-base-color-active: $tab-base-color !default;
+$tab-base-color-disabled: adjust-color($base-color, $hue: 0deg, $saturation: 15.873%, $lightness: 9.02%) !default; //E1ECFA
+
+$tab-background: $tab-base-color !default;
+$tab-background-over: $tab-base-color-over !default;
+$tab-background-active: $tab-base-color-active !default;
+$tab-background-disabled: $tab-base-color-disabled !default;
+
+$tab-color: adjust-color($tab-base-color, $hue: 0deg, $saturation: -45.589%, $lightness: -48.431%) !default;
+$tab-color-over: $tab-color !default;
+$tab-color-active: adjust-color($tab-color, $hue: 0deg, $saturation: 30.768%, $lightness: -13.333%) !default;
+$tab-color-disabled: #c3b3b3 !default;
+
+$tab-font-size: ceil($font-size * .9) !default; //11px
+$tab-font-size-over: $tab-font-size !default;
+$tab-font-size-active: $tab-font-size !default;
+$tab-font-size-disabled: $tab-font-size !default;
+
+$tab-font-family: $font-family;
+$tab-font-family-over: $tab-font-family;
+$tab-font-family-active: $tab-font-family;
+$tab-font-family-disabled: $tab-font-family;
+
+$tab-font-weight: bold !default;
+$tab-font-weight-over: $tab-font-weight !default;
+$tab-font-weight-active: $tab-font-weight !default;
+$tab-font-weight-disabled: $tab-font-weight !default;
+
+$tab-background-gradient: 'tab' !default;
+$tab-background-gradient-over: 'tab-over' !default;
+$tab-background-gradient-active: 'tab-active' !default;
+$tab-background-gradient-disabled: 'tab-disabled' !default;
+
+//borders
+$tab-inner-border: true !default;
+
+$tab-top-border-radius: 4px 4px 0 0 !default;
+$tab-top-border-width: 1px 1px 0 1px !default;
+$tab-top-inner-border-width: 1px 1px 0 !default;
+
+$tab-bottom-border-radius: 0 0 4px 4px !default;
+$tab-bottom-border-width: 0 1px 1px 1px !default;
+$tab-bottom-inner-border-width: 0 1px 1px 1px !default;
+
+$tab-border-color: adjust-color($tab-base-color, $hue:0deg, $saturation: -28.008%, $lightness: -20.98%) !default;
+$tab-border-color-over: $tab-border-color !default;
+$tab-border-color-active: $tab-border-color !default;
+$tab-border-color-disabled: adjust-color($base-color, $hue:0deg, $saturation: 6.349%, $lightness: -0.588%) !default;
+
+$tab-inner-border-color: adjust-color($tab-base-color, $hue: 0deg, $saturation: -8.571%, $lightness: 8.941%) !default;
+
+$tabbar-border-color: $panel-header-border-color !default;
+
+//size
+$tab-height: 20px !default;
+$tab-spacing: 2px;
+
+//tab bar body border and padding
+$tabbar-top-body-border-width: 1px 1px 0 !default;
+$tabbar-top-body-padding: 1px 0 3px !default;
+$tabbar-top-plain-body-border-width: 0 !default;
+$tabbar-top-plain-body-padding: 0 0 3px !default;
+$tabbar-bottom-body-border-width: 0 1px 1px !default;
+$tabbar-bottom-body-padding: 3px 0 1px !default;
+$tabbar-bottom-plain-body-border-width: 0 !default;
+$tabbar-bottom-plain-body-padding: 3px 0 0 !default;
+
+//closable tab
+$tab-closable-icon: 'tab/tab-default-close.gif' !default;
+$tab-closable-icon-width: 11px !default;
+$tab-closable-icon-height: 11px !default;
+$tab-closable-icon-top: 3px !default;
+$tab-closable-icon-right: 3px !default;
+
+//tab bar strip
+$tabbar-strip-height: 3px !default;
+$tabbar-strip-border-color: $panel-header-border-color !default;
+$tabbar-strip-background-color: $tab-base-color !default;
+$tabbar-top-strip-border-width: 1px 1px 0 !default;
+$tabbar-bottom-strip-border-width: 0 1px 1px !default;
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_toolbar.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_toolbar.scss
new file mode 100755
index 0000000..c1438e1
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_toolbar.scss
@@ -0,0 +1,30 @@
+$toolbar-font-size: ceil($font-size * .9) !default;
+
+$toolbar-background-color: adjust-color($base-color, $hue: -1.333deg, $saturation: -3.831%, $lightness: 4.51%) !default;
+$toolbar-background-gradient: color_stops(lighten($toolbar-background-color, 3), $toolbar-background-color) !default;
+$toolbar-inner-border-width: 1px 0px 0px !default;
+$toolbar-inner-border-color: lighten($toolbar-background-color, 5%) !default;
+
+//margins
+$toolbar-horizontal-spacing: 2px;
+$toolbar-vertical-spacing: 2px;
+$toolbar-footer-horizontal-spacing: 6px;
+$toolbar-footer-vertical-spacing: 2px;
+
+//border
+$toolbar-border-color: $panel-body-border-color !default;
+
+//spacer
+$toolbar-spacer-width: 2px !default;
+
+//separator
+$toolbar-separator-color: #98c8ff !default;
+$toolbar-separator-highlight-color: #fff !default;
+
+//text
+$toolbar-text-font-family: $font-family;
+$toolbar-text-font-size: ceil($font-size * .9) !default; //11px
+$toolbar-text-font-weight: normal !default;
+$toolbar-text-color: mix($mix-color, #000, 30) !default;
+$toolbar-text-padding: 3px 4px 0 4px !default;
+$toolbar-text-line-height: 16px !default;
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_tree.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_tree.scss
new file mode 100755
index 0000000..c5d649c
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_tree.scss
@@ -0,0 +1,2 @@
+$tree-elbow-height: 18px !default;
+$tree-elbow-width: 16px !default;
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/variables/_window.scss b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_window.scss
new file mode 100755
index 0000000..86b7303
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/variables/_window.scss
@@ -0,0 +1,19 @@
+$window-base-color: $base-color !default;
+
+$window-border-radius: 5px 5px !default;
+$window-border-width: 1px !default;
+$window-border-color: adjust-color($window-base-color, $hue: 0.952deg, $saturation: -32.377%, $lightness: -13.725%) !default;
+$window-inner-border-width: 1px !default;
+$window-inner-border-color: adjust-color($window-base-color, $hue: 2.667deg, $saturation: 9.662%, $lightness: 11.373%) !default;
+$window-background-color: adjust-color($window-base-color, $hue: 0.267deg, $saturation: -21.309%, $lightness: 1.569%) !default;
+
+$window-body-border-width: 1px !default;
+$window-body-border-style: solid !default;
+$window-body-border-color: adjust-color($window-base-color, $hue: 0.844deg, $saturation: 7.644%, $lightness: -8.627%) !default;
+$window-body-background-color: adjust-color($window-base-color, $hue: 3.188deg, $saturation: 0.542%, $lightness: 7.843%) !default;
+$window-body-color: #000 !default;
+
+$window-header-padding: 5px 5px 0 !default;
+$window-header-font-size: ceil($font-size * .9) !default; //11px
+$window-header-color: adjust-color($window-base-color, $hue: -2.451deg, $saturation: 38.889%, $lightness: -55.882%) !default;
+$window-header-font-weight: bold !default;
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_boundlist.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_boundlist.scss
new file mode 100755
index 0000000..5726408
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_boundlist.scss
@@ -0,0 +1,45 @@
+ at mixin extjs-boundlist {
+    .#{$prefix}boundlist {
+        border-width: $boundlist-border-width;
+        border-style: $boundlist-border-style;
+        border-color: $boundlist-border-color;
+        background: $boundlist-background-color;
+
+        .#{$prefix}toolbar {
+            border-width: 1px 0 0 0;
+        }
+    }
+
+    .#{$prefix}boundlist-item {
+        padding: $boundlist-item-padding;
+
+        @include no-select;
+
+        cursor: pointer;
+        cursor: hand;
+        position: relative; /*allow hover in IE on empty items*/
+
+        border-width: $boundlist-item-border-width;
+        border-style: $boundlist-item-border-style;
+        border-color: $boundlist-item-border-color;
+    }
+
+    .#{$prefix}boundlist-selected {
+        background: $boundlist-item-selected-background-color;
+        border-color: $boundlist-item-selected-border-color;
+    }
+
+    .#{$prefix}boundlist-item-over {
+        background: $boundlist-item-over-background-color;
+        border-color: $boundlist-item-over-border-color;
+    }
+
+    .#{$prefix}boundlist-floating {
+        border-top-width: 0;
+    }
+
+    .#{$prefix}boundlist-above {
+        border-top-width: 1px;
+        border-bottom-width: 1px;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_btn-group.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_btn-group.scss
new file mode 100755
index 0000000..c11b60d
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_btn-group.scss
@@ -0,0 +1,80 @@
+ at mixin extjs-btn-group {
+    .#{$prefix}btn-group {
+        position: relative;
+        overflow: hidden;
+    }
+
+    .#{$prefix}btn-group-body {
+        position: relative;
+        zoom: 1;
+        padding: $btn-group-padding;
+        .#{$prefix}table-layout-cell {
+            vertical-align: top;
+        }
+    }
+
+    .#{$prefix}btn-group-header-text {
+        white-space: nowrap;
+    }
+
+    @include extjs-btn-group-ui('default');
+}
+
+/**
+ * @mixin extjs-btn-group-ui
+ * @class Ext.ButtonGroup
+ */
+ at mixin extjs-btn-group-ui(
+    $ui-label,
+    $ui-base-color: null,
+
+    // background
+    $ui-background-color: $btn-group-background-color,
+
+    // borders
+    $ui-border-color: $btn-group-border-color,
+    $ui-border-width: $btn-group-border-width,
+    $ui-border-radius: $btn-group-border-radius,
+    $ui-inner-border-color: $btn-group-inner-border-color,
+
+    //header
+    $ui-header-background-color: $btn-group-header-background-color,
+    $ui-header-font: $btn-group-header-font,
+    $ui-header-color: $btn-group-header-color
+){
+    @include x-frame(
+        'btn-group',
+        $ui: '#{$ui-label}-framed',
+
+        /* Radius, width, padding and background-color */
+        $border-radius: $ui-border-radius,
+        $border-width: $ui-border-width,
+        $padding: $btn-group-padding,
+        $background-color: $ui-background-color
+    );
+
+    .#{$prefix}btn-group-#{$ui-label}-framed {
+        border-color: $ui-border-color;
+        @include inner-border(
+            $width: $btn-group-inner-border-width,
+            $color: $ui-inner-border-color
+        );
+    }
+
+    .#{$prefix}btn-group-header-#{$ui-label}-framed {
+        margin: $btn-group-header-margin;
+    }
+
+    .#{$prefix}btn-group-header-body-#{$ui-label}-framed {
+        padding: $btn-group-header-padding;
+
+        background: $ui-header-background-color;
+
+        @include border-top-radius($ui-border-radius);
+    }
+
+    .#{$prefix}btn-group-header-text-#{$ui-label}-framed {
+        font: $ui-header-font;
+        color: $ui-header-color;
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_button.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_button.scss
new file mode 100755
index 0000000..6524599
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_button.scss
@@ -0,0 +1,996 @@
+/**
+  * @class Ext.Button
+  * Used to create the base structure of an Ext.Button
+  */
+ at mixin extjs-button {
+    .#{$prefix}btn {
+        display: inline-block;
+        zoom: 1;
+        *display: inline;
+        position: relative;
+        
+        cursor: pointer;
+        cursor: hand;
+        
+        white-space: nowrap;
+        
+        vertical-align: middle;
+        
+        * {
+            cursor: pointer;
+            cursor: hand;
+        }
+        
+        background-repeat: no-repeat;
+        
+        em {
+            background-repeat: no-repeat;
+
+            // Styles for an anchor button.
+            a {
+                text-decoration: none;
+                display: inline-block;
+                color: inherit;
+            }
+        }
+        
+        button {
+            margin: 0;
+            padding: 0;      
+            border: 0;  
+            width: auto;    
+            background: none;
+            outline: 0 none;
+            overflow: hidden;
+            vertical-align: bottom;
+            -webkit-appearance: none;
+
+            &::-moz-focus-inner {
+                border: 0;
+                padding: 0;
+            }
+        }
+
+        .#{$prefix}btn-inner {
+            display: block;
+            white-space: nowrap;
+            background-color: transparent;
+            background-repeat: no-repeat;
+            background-position: left center;
+        }
+
+        .#{$prefix}btn-left .#{$prefix}btn-inner {
+            text-align: left;
+        }
+
+        .#{$prefix}btn-center .#{$prefix}btn-inner {
+            text-align: center;
+        }
+
+        .#{$prefix}btn-right .#{$prefix}btn-inner {
+            text-align: right;
+        }
+    }
+    
+    .#{$prefix}btn-disabled {
+        @include opacity(1);
+    }
+    
+    .#{$prefix}btn-disabled span {
+        @include opacity(.5);
+
+        .#{$prefix}ie6 &,
+        .#{$prefix}ie7 & {
+            filter:none;
+        }
+    }
+    
+    //remove the opacity rule of IE8
+    .#{$prefix}ie7 .#{$prefix}btn-disabled,
+    .#{$prefix}ie8 .#{$prefix}btn-disabled {
+        filter:none;
+    }
+
+    .#{$prefix}ie6 .#{$prefix}btn-disabled,
+    .#{$prefix}ie7 .#{$prefix}btn-disabled,
+    .#{$prefix}ie8 .#{$prefix}btn-disabled {
+        .#{$prefix}btn-icon {
+            @include opacity(.6);
+        }
+    }
+    
+    @if $include-ie {
+        * html .#{$prefix}ie {
+            .#{$prefix}btn button {
+                width: 1px;
+            }
+        }
+
+        .#{$prefix}ie .#{$prefix}btn button {
+            overflow-x: visible; /*prevents extra horiz space in IE*/
+            vertical-align: baseline; /*IE doesn't like bottom*/
+        }
+
+        .#{$prefix}strict .#{$prefix}ie6,
+        .#{$prefix}strict .#{$prefix}ie7 {
+            .#{$prefix}btn .#{$prefix}frame-mc {
+                height: 100%;
+            }
+        }  
+    }
+  
+    @if not $supports-border-radius or $compile-all {
+        .#{$prefix}nbr {
+            .#{$prefix}btn {
+                .#{$prefix}frame-mc {
+                    vertical-align: middle;
+                    white-space: nowrap;
+                    text-align: center;
+                    cursor: pointer;
+                }
+            }
+        }    
+    }
+
+    .#{$prefix}btn-icon-text-left .#{$prefix}btn-icon {
+        background-position: left center;
+    }
+
+    .#{$prefix}btn-icon-text-right .#{$prefix}btn-icon {
+        background-position: right center;
+    }
+
+    .#{$prefix}btn-icon-text-top .#{$prefix}btn-icon {
+        background-position: center top;
+    }
+
+    .#{$prefix}btn-icon-text-bottom .#{$prefix}btn-icon {
+        background-position: center bottom;
+    }
+
+    .#{$prefix}btn {
+        button, a {
+            position: relative;
+
+            .#{$prefix}btn-icon {
+                position: absolute;
+                background-repeat: no-repeat;
+            }
+        }
+    }
+  
+    .#{$prefix}btn-arrow-right {
+        background: transparent no-repeat right center;
+        padding-right: $button-arrow-size;
+        
+        .#{$prefix}btn-inner {
+            padding-right: 0 !important;
+        }
+    }
+
+    .#{$prefix}toolbar .#{$prefix}btn-arrow-right {
+        padding-right: $button-toolbar-arrow-size;
+    }
+
+    .#{$prefix}btn-arrow-bottom {
+        background: transparent no-repeat center bottom;
+        padding-bottom: $button-arrow-size;
+    }
+
+    .#{$prefix}btn-arrow {
+        background-image: theme-background-image($theme-name, 'button/arrow.gif');    
+        display: block;
+    }
+
+
+    //split buttons
+    .#{$prefix}btn-split-right,
+    .#{$prefix}btn-over .#{$prefix}btn-split-right {
+        background: transparent no-repeat right center;
+        background-image: theme-background-image($theme-name, 'button/s-arrow.gif');
+        padding-right: $button-split-size !important;
+    }
+  
+    .#{$prefix}btn-split-bottom,
+    .#{$prefix}btn-over .#{$prefix}btn-split-bottom {
+        background: transparent no-repeat center bottom;
+        background-image: theme-background-image($theme-name, 'button/s-arrow-b.gif');
+        padding-bottom: $button-split-size;
+    }
+    
+    .#{$prefix}toolbar .#{$prefix}btn-split-right {
+        background-image: theme-background-image($theme-name, 'button/s-arrow-noline.gif');
+        padding-right: $button-toolbar-split-size !important;
+    }
+    
+    .#{$prefix}toolbar .#{$prefix}btn-split-bottom {
+        background-image: theme-background-image($theme-name, 'button/s-arrow-b-noline.gif');
+    }
+  
+    .#{$prefix}btn-split {
+        display: block;
+    }
+           
+    .#{$prefix}item-disabled,
+    .#{$prefix}item-disabled * {
+        cursor: default;
+    }
+
+    .#{$prefix}cycle-fixed-width .#{$prefix}btn-inner {
+        text-align: inherit;
+    }
+
+    .#{$prefix}btn-over .#{$prefix}btn-split-right { background-image: theme-background-image($theme-name, 'button/s-arrow-o.gif'); }
+    .#{$prefix}btn-over .#{$prefix}btn-split-bottom { background-image: theme-background-image($theme-name, 'button/s-arrow-bo.gif'); }
+    
+    @include extjs-button-ui(
+        /* UI + Scale */
+        'default-small',
+        
+        $button-small-border-radius,
+        $button-small-border-width,    
+        
+        $button-default-border-color,
+        $button-default-border-color-over,
+        $button-default-border-color-focus,
+        $button-default-border-color-pressed,
+        $button-default-border-color-disabled,
+        
+        $button-small-padding,
+        $button-small-text-padding,
+
+        $button-default-background-color,
+        $button-default-background-color-over,
+        $button-default-background-color-focus,
+        $button-default-background-color-pressed,
+        $button-default-background-color-disabled,
+        
+        $button-default-background-gradient,
+        $button-default-background-gradient-over,
+        $button-default-background-gradient-focus,
+        $button-default-background-gradient-pressed,
+        $button-default-background-gradient-disabled,
+
+        $button-default-color,
+        $button-default-color-over,
+        $button-default-color-focus,
+        $button-default-color-pressed,
+        $button-default-color-disabled,
+                
+        $button-small-font-size,
+        $button-small-font-size-over,
+        $button-small-font-size-focus,
+        $button-small-font-size-pressed,
+        $button-small-font-size-disabled,
+        
+        $button-small-font-weight,
+        $button-small-font-weight-over,
+        $button-small-font-weight-focus,
+        $button-small-font-weight-pressed,
+        $button-small-font-weight-disabled,
+        
+        $button-small-font-family,
+        $button-small-font-family-over,
+        $button-small-font-family-focus,
+        $button-small-font-family-pressed,
+        $button-small-font-family-disabled,
+        
+        $button-small-icon-size
+    );
+        
+    @include extjs-button-ui(
+        'default-medium',
+        
+        $button-medium-border-radius,
+        $button-medium-border-width,    
+        
+        $button-default-border-color,
+        $button-default-border-color-over,
+        $button-default-border-color-focus,
+        $button-default-border-color-pressed,
+        $button-default-border-color-disabled,
+        
+        $button-medium-padding,
+        $button-medium-text-padding,
+
+        $button-default-background-color,
+        $button-default-background-color-over,
+        $button-default-background-color-focus,
+        $button-default-background-color-pressed,
+        $button-default-background-color-disabled,
+        
+        $button-default-background-gradient,
+        $button-default-background-gradient-over,
+        $button-default-background-gradient-focus,
+        $button-default-background-gradient-pressed,
+        $button-default-background-gradient-disabled,
+
+        $button-default-color,
+        $button-default-color-over,
+        $button-default-color-focus,
+        $button-default-color-pressed,
+        $button-default-color-disabled,
+                
+        $button-medium-font-size,
+        $button-medium-font-size-over,
+        $button-medium-font-size-focus,
+        $button-medium-font-size-pressed,
+        $button-medium-font-size-disabled,
+        
+        $button-medium-font-weight,
+        $button-medium-font-weight-over,
+        $button-medium-font-weight-focus,
+        $button-medium-font-weight-pressed,
+        $button-medium-font-weight-disabled,
+        
+        $button-medium-font-family,
+        $button-medium-font-family-over,
+        $button-medium-font-family-focus,
+        $button-medium-font-family-pressed,
+        $button-medium-font-family-disabled,
+        
+        $button-medium-icon-size
+    );
+    
+    @include extjs-button-ui(
+        'default-large',
+        
+        $button-large-border-radius,
+        $button-large-border-width,    
+        
+        $button-default-border-color,
+        $button-default-border-color-over,
+        $button-default-border-color-focus,
+        $button-default-border-color-pressed,
+        $button-default-border-color-disabled,
+        
+        $button-large-padding,
+        $button-large-text-padding,
+
+        $button-default-background-color,
+        $button-default-background-color-over,
+        $button-default-background-color-focus,
+        $button-default-background-color-pressed,
+        $button-default-background-color-disabled,
+        
+        $button-default-background-gradient,
+        $button-default-background-gradient-over,
+        $button-default-background-gradient-focus,
+        $button-default-background-gradient-pressed,
+        $button-default-background-gradient-disabled,
+
+        $button-default-color,
+        $button-default-color-over,
+        $button-default-color-focus,
+        $button-default-color-pressed,
+        $button-default-color-disabled,
+                
+        $button-large-font-size,
+        $button-large-font-size-over,
+        $button-large-font-size-focus,
+        $button-large-font-size-pressed,
+        $button-large-font-size-disabled,
+        
+        $button-large-font-weight,
+        $button-large-font-weight-over,
+        $button-large-font-weight-focus,
+        $button-large-font-weight-pressed,
+        $button-large-font-weight-disabled,
+        
+        $button-large-font-family,
+        $button-large-font-family-over,
+        $button-large-font-family-focus,
+        $button-large-font-family-pressed,
+        $button-large-font-family-disabled,
+        
+        $button-large-icon-size
+    );
+    
+    @include extjs-button-ui(
+        'default-toolbar-small',
+        
+        $button-small-border-radius,
+        $button-small-border-width,    
+        
+        $button-toolbar-border-color,
+        $button-toolbar-border-color-over,
+        $button-toolbar-border-color-focus,
+        $button-toolbar-border-color-pressed,
+        $button-toolbar-border-color-disabled,
+        
+        $button-small-padding,
+        $button-small-text-padding,
+
+        $button-toolbar-background-color,
+        $button-toolbar-background-color-over,
+        $button-toolbar-background-color-focus,
+        $button-toolbar-background-color-pressed,
+        $button-toolbar-background-color-disabled,
+        
+        $button-toolbar-background-gradient,
+        $button-toolbar-background-gradient-over,
+        $button-toolbar-background-gradient-focus,
+        $button-toolbar-background-gradient-pressed,
+        $button-toolbar-background-gradient-disabled,
+
+        $button-toolbar-color,
+        $button-toolbar-color-over,
+        $button-toolbar-color-focus,
+        $button-toolbar-color-pressed,
+        $button-toolbar-color-disabled,
+                
+        $button-small-font-size,
+        $button-small-font-size-over,
+        $button-small-font-size-focus,
+        $button-small-font-size-pressed,
+        $button-small-font-size-disabled,
+        
+        $button-small-font-weight,
+        $button-small-font-weight-over,
+        $button-small-font-weight-focus,
+        $button-small-font-weight-pressed,
+        $button-small-font-weight-disabled,
+        
+        $button-small-font-family,
+        $button-small-font-family-over,
+        $button-small-font-family-focus,
+        $button-small-font-family-pressed,
+        $button-small-font-family-disabled,
+        
+        $button-small-icon-size
+    );
+    
+    @include extjs-button-ui(
+        'default-toolbar-medium',
+        
+        $button-medium-border-radius,
+        $button-medium-border-width,    
+        
+        $button-toolbar-border-color,
+        $button-toolbar-border-color-over,
+        $button-toolbar-border-color-focus,
+        $button-toolbar-border-color-pressed,
+        $button-toolbar-border-color-disabled,
+        
+        $button-medium-padding,
+        $button-medium-text-padding,
+
+        $button-toolbar-background-color,
+        $button-toolbar-background-color-over,
+        $button-toolbar-background-color-focus,
+        $button-toolbar-background-color-pressed,
+        $button-toolbar-background-color-disabled,
+        
+        $button-toolbar-background-gradient,
+        $button-toolbar-background-gradient-over,
+        $button-toolbar-background-gradient-focus,
+        $button-toolbar-background-gradient-pressed,
+        $button-toolbar-background-gradient-disabled,
+
+        $button-toolbar-color,
+        $button-toolbar-color-over,
+        $button-toolbar-color-focus,
+        $button-toolbar-color-pressed,
+        $button-toolbar-color-disabled,
+                
+        $button-medium-font-size,
+        $button-medium-font-size-over,
+        $button-medium-font-size-focus,
+        $button-medium-font-size-pressed,
+        $button-medium-font-size-disabled,
+        
+        $button-medium-font-weight,
+        $button-medium-font-weight-over,
+        $button-medium-font-weight-focus,
+        $button-medium-font-weight-pressed,
+        $button-medium-font-weight-disabled,
+        
+        $button-medium-font-family,
+        $button-medium-font-family-over,
+        $button-medium-font-family-focus,
+        $button-medium-font-family-pressed,
+        $button-medium-font-family-disabled,
+        
+        $button-medium-icon-size
+    );
+    
+    @include extjs-button-ui(
+        'default-toolbar-large',
+        
+        $button-large-border-radius,
+        $button-large-border-width,    
+        
+        $button-toolbar-border-color,
+        $button-toolbar-border-color-over,
+        $button-toolbar-border-color-focus,
+        $button-toolbar-border-color-pressed,
+        $button-toolbar-border-color-disabled,
+        
+        $button-large-padding,
+        $button-large-text-padding,
+
+        $button-toolbar-background-color,
+        $button-toolbar-background-color-over,
+        $button-toolbar-background-color-focus,
+        $button-toolbar-background-color-pressed,
+        $button-toolbar-background-color-disabled,
+        
+        $button-toolbar-background-gradient,
+        $button-toolbar-background-gradient-over,
+        $button-toolbar-background-gradient-focus,
+        $button-toolbar-background-gradient-pressed,
+        $button-toolbar-background-gradient-disabled,
+
+        $button-toolbar-color,
+        $button-toolbar-color-over,
+        $button-toolbar-color-focus,
+        $button-toolbar-color-pressed,
+        $button-toolbar-color-disabled,
+                
+        $button-large-font-size,
+        $button-large-font-size-over,
+        $button-large-font-size-focus,
+        $button-large-font-size-pressed,
+        $button-large-font-size-disabled,
+        
+        $button-large-font-weight,
+        $button-large-font-weight-over,
+        $button-large-font-weight-focus,
+        $button-large-font-weight-pressed,
+        $button-large-font-weight-disabled,
+        
+        $button-large-font-family,
+        $button-large-font-family-over,
+        $button-large-font-family-focus,
+        $button-large-font-family-pressed,
+        $button-large-font-family-disabled,
+        
+        $button-large-icon-size
+    );
+    
+    .#{$prefix}btn-default-toolbar-small-disabled,
+    .#{$prefix}btn-default-toolbar-medium-disabled,
+    .#{$prefix}btn-default-toolbar-large-disabled {
+        border-color: transparent;
+        
+        background-image: none;
+        background: transparent;
+    }
+}
+
+ at mixin extjs-button-ui(
+    $ui,  
+    
+    $border-radius: 0px,
+    
+    $border-width: 0px,
+            
+    $border-color: null,
+    $border-color-over: null,
+    $border-color-focus: null,
+    $border-color-pressed: null,
+    $border-color-disabled: null,
+    
+    $padding: null,
+    $text-padding: null,
+    
+    $background-color: null,
+    $background-color-over: null,
+    $background-color-focus: null,
+    $background-color-pressed: null,
+    $background-color-disabled: null,
+    
+    $background-gradient: null,
+    $background-gradient-over: null,
+    $background-gradient-focus: null,
+    $background-gradient-pressed: null,
+    $background-gradient-disabled: null,
+    
+    $color: null,
+    $color-over: null,
+    $color-focus: null,
+    $color-pressed: null,
+    $color-disabled: null,
+    
+    $font-size: null,
+    $font-size-over: null,
+    $font-size-focus: null,
+    $font-size-pressed: null,
+    $font-size-disabled: null,
+    
+    $font-weight: null,
+    $font-weight-over: null,
+    $font-weight-focus: null,
+    $font-weight-pressed: null,
+    $font-weight-disabled: null,
+    
+    $font-family: null,
+    $font-family-over: null,
+    $font-family-focus: null,
+    $font-family-pressed: null,
+    $font-family-disabled: null,
+    
+    $icon-size: null
+) {
+    .#{$prefix}btn-#{$ui} {
+        border-color: $border-color;
+    }
+    
+    @include x-frame('btn', $ui, $border-radius, $border-width, $padding, $background-color, $background-gradient, true);
+    
+    .#{$prefix}btn-#{$ui} .#{$prefix}btn-inner {
+        font-size: $font-size;
+        font-weight: $font-weight;
+        font-family: $font-family;
+        color: $color;
+        background-repeat: no-repeat;
+        padding: 0 $text-padding;
+    }
+    
+    .#{$prefix}btn-#{$ui}-icon,
+    .#{$prefix}btn-#{$ui}-noicon {
+        button,
+        .#{$prefix}btn-inner {
+            height: $icon-size;
+            line-height: $icon-size;
+        }
+    }
+
+    //icons
+    .#{$prefix}btn-#{$ui}-icon {
+        button {
+            padding: 0;
+            width: $icon-size !important;
+            height: $icon-size;
+        }
+
+        .#{$prefix}btn-icon {
+            width: $icon-size;
+            height: $icon-size;
+            top: 0;
+            left: 0;
+            bottom: 0;
+            right: 0;
+        }
+    }
+    
+    .#{$prefix}btn-#{$ui}-icon-text-left {
+        button {
+            height: $icon-size;
+        }
+        .#{$prefix}btn-inner {
+            height: $icon-size;
+            line-height: $icon-size;
+            padding-left: $icon-size + 4px;
+        }
+
+        .#{$prefix}btn-icon {
+            width: $icon-size;
+            height: auto;
+            top: 0;
+            left: 0;
+            bottom: 0;
+            right: auto;
+
+            .#{$prefix}ie6 &,
+            .#{$prefix}quirks & {
+                height: $icon-size;
+            }
+        }
+    }
+
+    .#{$prefix}btn-#{$ui}-icon-text-right {
+        button {
+            height: $icon-size;
+        }
+        .#{$prefix}btn-inner {
+            height: $icon-size;
+            line-height: $icon-size;
+            padding-right: $icon-size + 4px !important;
+        }
+
+        .#{$prefix}btn-icon {
+            width: $icon-size;
+            height: auto;
+            top: 0;
+            left: auto;
+            bottom: 0;
+            right: 0;
+
+            .#{$prefix}ie6 &,
+            .#{$prefix}quirks & {
+                height: $icon-size;
+            }
+        }
+    }
+    
+    .#{$prefix}btn-#{$ui}-icon-text-top {
+        .#{$prefix}btn-inner {
+            padding-top: $icon-size + 4px;
+        }
+
+        .#{$prefix}btn-icon {
+            width: auto;
+            height: $icon-size;
+            top: 0;
+            left: 0;
+            bottom: auto;
+            right: 0;
+
+            .#{$prefix}ie6 &,
+            .#{$prefix}quirks .#{$prefix}ie & {
+                width: $icon-size;
+            }
+        }
+    }
+    
+    .#{$prefix}btn-#{$ui}-icon-text-bottom {
+        .#{$prefix}btn-inner {
+            padding-bottom: $icon-size + 4px;
+        }
+
+        .#{$prefix}btn-icon {
+            width: auto;
+            height: $icon-size;
+            top: auto;
+            left: 0;
+            bottom: 0;
+            right: 0;
+
+            .#{$prefix}ie6 &,
+            .#{$prefix}quirks .#{$prefix}ie & {
+                width: $icon-size;
+            }
+        }
+    }
+    
+    .#{$prefix}btn-#{$ui}-over {
+        @if $border-color-over != $border-color {
+            border-color: $border-color-over;
+        }
+        @if $background-color-over != null {
+            @include background-gradient($background-color-over, $background-gradient-over);
+        }
+
+        .#{$prefix}btn-inner {
+            @if $color-over != $color {
+                color: $color-over;
+            }
+            @if $font-weight-over != $font-weight {
+                font-weight: $font-weight-over;
+            }
+            @if $font-size-over != $font-size {
+                font-size: $font-size-over;
+            }
+            @if $font-family-over != $font-family {
+                font-family: $font-family-over;
+            } 
+        }
+    }
+    
+    .#{$prefix}btn-#{$ui}-focus {
+        @if $border-color-focus != $border-color {
+            border-color: $border-color-focus;
+        }
+        @if $background-color-focus != null {
+            @include background-gradient($background-color-focus, $background-gradient-focus);
+        }
+
+        .#{$prefix}btn-inner {
+            @if $color-focus != $color {
+                color: $color-focus;
+            }
+            @if $font-weight-focus != $font-weight {
+                font-weight: $font-weight-focus;
+            }
+            @if $font-size-focus != $font-size {
+                font-size: $font-size-focus;
+            }
+            @if $font-family-focus != $font-family {
+                font-family: $font-family-focus;
+            } 
+        }
+    }
+
+    .#{$prefix}btn-#{$ui}-menu-active,
+    .#{$prefix}btn-#{$ui}-pressed {
+        @if $border-color-pressed != $border-color {
+            border-color: $border-color-pressed;
+        }
+        @if $background-color-pressed != null {
+            @include background-gradient($background-color-pressed, $background-gradient-pressed);
+        }
+
+        .#{$prefix}btn-inner {
+            @if $color-pressed != $color {
+                color: $color-pressed;
+            }
+            @if $font-weight-pressed != $font-weight {
+                font-weight: $font-weight-pressed;
+            }
+            @if $font-size-pressed != $font-size {
+                font-size: $font-size-pressed;
+            }
+            @if $font-family-pressed != $font-family {
+                font-family: $font-family-pressed;
+            } 
+        }
+    }
+    
+    .#{$prefix}btn-#{$ui}-disabled {
+        @if $border-color-disabled != $border-color {
+            border-color: $border-color-disabled;
+        }
+        @if $background-color-disabled != null {
+            @include background-gradient($background-color-disabled, $background-gradient-disabled);
+        }
+
+        .#{$prefix}btn-inner {
+            @if $color-disabled != $color {
+                color: $color !important;
+            }
+            @if $font-weight-disabled != $font-weight {
+                font-weight: $font-weight-disabled;
+            }
+            @if $font-size-disabled != $font-size {
+                font-size: $font-size-disabled;
+            }
+            @if $font-family-disabled != $font-family {
+                font-family: $font-family-disabled;
+            } 
+        }
+    }
+    
+    .#{$prefix}ie .#{$prefix}btn-#{$ui}-disabled {
+        .#{$prefix}btn-inner {
+            @if $color-disabled != $color {
+                color: darken($color-disabled, 20) !important;
+            }
+        }
+    }
+    
+    .#{$prefix}ie6 .#{$prefix}btn-#{$ui}-disabled {
+        .#{$prefix}btn-inner {
+            @if $color-disabled != $color {
+                color: $color-disabled !important;
+            }
+        }
+    }
+    
+    @if not $supports-border-radius or $compile-all {    
+        .#{$prefix}nbr { 
+            .#{$prefix}btn-#{$ui}-over {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-over-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-over-sides.gif');
+                }
+                .#{$prefix}frame-mc {
+                    background-color: $background-color-over;
+                    @if $background-gradient-over != null {
+                        background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-over-bg.gif');
+                    }
+                }
+            }
+            
+            .#{$prefix}btn-#{$ui}-focus {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-focus-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-focus-sides.gif');
+                }
+                .#{$prefix}frame-mc {
+                    background-color: $background-color-focus;
+                    @if $background-gradient-focus != null {
+                        background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-focus-bg.gif');
+                    }
+                }
+            }
+            
+            .#{$prefix}btn-#{$ui}-menu-active,
+            .#{$prefix}btn-#{$ui}-pressed {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-pressed-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-pressed-sides.gif');
+                }
+                .#{$prefix}frame-mc {
+                    background-color: $background-color-pressed;
+                    @if $background-gradient-pressed != null {
+                        background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-pressed-bg.gif');
+                    }
+                }
+            }
+            
+            .#{$prefix}btn-#{$ui}-disabled {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-disabled-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-disabled-sides.gif');
+                }
+                .#{$prefix}frame-mc {
+                    background-color: $background-color-disabled;
+                    @if $background-gradient-disabled != null {
+                        background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-disabled-bg.gif');
+                    }
+                }  
+            }
+        }
+    }
+    
+    @if not $supports-gradients or $compile-all {
+        @if $background-gradient != null {
+            .#{$prefix}nlg { 
+                .#{$prefix}btn-#{$ui} {
+                    background-repeat: repeat-x;
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-bg.gif');
+                }
+            }
+        }
+        
+        @if $background-gradient-over != null {
+            .#{$prefix}nlg { 
+                .#{$prefix}btn-#{$ui}-over {
+                    background-repeat: repeat-x;
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-over-bg.gif');
+                }
+            }
+        }
+        
+        @if $background-gradient-focus != null {
+            .#{$prefix}nlg { 
+                .#{$prefix}btn-#{$ui}-focus {
+                    background-repeat: repeat-x;
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-focus-bg.gif');
+                }
+            }
+        }
+
+        @if $background-gradient-pressed != null {
+            .#{$prefix}nlg { 
+                .#{$prefix}btn-#{$ui}-menu-active,
+                .#{$prefix}btn-#{$ui}-pressed {
+                    background-repeat: repeat-x;
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-pressed-bg.gif');
+                }
+            }
+        }
+        
+        @if $background-gradient-disabled != null {
+            .#{$prefix}nlg {
+                .#{$prefix}btn-#{$ui}-disabled {
+                    background-repeat: repeat-x;
+                    background-image: theme-background-image($theme-name, 'btn/btn-#{$ui}-disabled-bg.gif');
+                }
+            }
+        }
+    }
+};
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_colorpicker.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_colorpicker.scss
new file mode 100755
index 0000000..c35c6c0
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_colorpicker.scss
@@ -0,0 +1,45 @@
+ at mixin extjs-colorpicker {
+    .#{$prefix}color-picker {
+        width: 144px;
+        height: 90px;
+        cursor: pointer;
+    }
+
+    .#{$prefix}color-picker a {
+        border: 1px solid #fff;
+        
+        float: left;
+        
+        padding: 2px;
+        
+        text-decoration: none;
+        
+        -moz-outline: 0 none;
+        outline: 0 none;
+        
+        cursor: pointer;
+    }
+
+    .#{$prefix}color-picker a:hover,
+    .#{$prefix}color-picker a.#{$prefix}color-picker-selected {
+        border-color: $colorpicker-over-border-color;
+        background-color: $colorpicker-over-background-color;
+    }
+
+    .#{$prefix}color-picker em {
+        display: block;
+        
+        border: 1px solid $colorpicker-item-border-color;
+    }
+
+    .#{$prefix}color-picker em span {
+        cursor: pointer;
+        
+        display: block;
+        
+        height: 10px;
+        width: 10px;
+        
+        line-height: 10px;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_datepicker.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_datepicker.scss
new file mode 100755
index 0000000..d30dc9b
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_datepicker.scss
@@ -0,0 +1,422 @@
+ at mixin extjs-datepicker {
+    .#{$prefix}datepicker {
+        border: $datepicker-border;
+        
+        background-color: $datepicker-background-color;
+        position: relative;
+        
+        a {
+            -moz-outline: 0 none;
+            outline: 0 none;
+            
+            color: $datepicker-monthpicker-item-color;
+            text-decoration: none;
+            
+            border-width: 0;
+        }
+    }
+    
+    .#{$prefix}datepicker-inner,
+    .#{$prefix}datepicker-inner td,
+    .#{$prefix}datepicker-inner th {
+        border-collapse: separate;
+    }
+        
+    .#{$prefix}datepicker-header {
+        position: relative;
+
+        height: 26px;
+        
+        @if $datepicker-header-background-gradient {
+            @include background-gradient($datepicker-header-background-color, $datepicker-header-background-gradient);
+        } @else {
+            background-color: $datepicker-header-background-color;
+        }
+    }
+         
+    .#{$prefix}datepicker-prev,
+    .#{$prefix}datepicker-next {
+        position: absolute;
+        top: 5px;
+
+        width: 18px;
+        
+        a {
+            display: block;
+            
+            width: 16px;
+            height: 16px;
+            
+            background-position: top;
+            background-repeat: no-repeat;
+            
+            cursor: pointer;
+            
+            text-decoration: none !important;
+
+            @include opacity(.7);
+            
+            &:hover {
+                @include opacity(1);
+            }
+        }
+    }
+            
+    .#{$prefix}datepicker-next {
+        right: 5px;
+
+        a {
+            background-image: theme-background-image($theme-name, $datepicker-next-image);
+        }
+    }
+
+    .#{$prefix}datepicker-prev {
+        left: 5px;
+
+        a {
+            background-image: theme-background-image($theme-name, $datepicker-prev-image);
+        }
+    }      
+            
+    .#{$prefix}item-disabled .#{$prefix}datepicker-prev a:hover,
+    .#{$prefix}item-disabled .#{$prefix}datepicker-next a:hover {
+        @include opacity(.6);
+    }    
+                
+    .#{$prefix}datepicker-month {
+        padding-top: 3px;
+
+        .#{$prefix}btn,
+        button,
+        .#{$prefix}btn-tc,
+        .#{$prefix}btn-tl,
+        .#{$prefix}btn-tr,
+        .#{$prefix}btn-mc,
+        .#{$prefix}btn-ml,
+        .#{$prefix}btn-mr,
+        .#{$prefix}btn-bc,
+        .#{$prefix}btn-bl,
+        .#{$prefix}btn-br {
+            background: transparent !important;
+            border-width: 0 !important;
+        }
+        
+        span {
+            color: #fff !important;
+        }
+        
+        .#{$prefix}btn-split-right {
+            background: no-repeat right center !important;
+            background-image: theme-background-image($theme-name, $datepicker-month-arrow-image);
+            
+            padding-right: 12px;
+        }
+    }
+            
+    .#{$prefix}datepicker-next {
+        text-align: right;
+    }
+
+    .#{$prefix}datepicker-month {
+        //width: 120px;
+        text-align: center;
+        
+        button {
+            color: $datepicker-monthpicker-color !important;
+        }
+    }
+        
+        
+    table.#{$prefix}datepicker-inner {
+        width: 100%;
+        table-layout: fixed;
+        
+        th {
+            width: 25px;
+            height: 19px;
+            
+            padding: 0;
+            
+            color: $datepicker-th-color;
+            font: $datepicker-th-font;
+            text-align: $datepicker-th-text-align;
+            
+            border-bottom: 1px solid $datepicker-th-border-bottom-color;
+            border-collapse: separate;
+            
+            @if $datepicker-th-background-gradient {
+                @include background-gradient($datepicker-th-background-color, $datepicker-th-background-gradient);
+            } @else {
+                background-color: $datepicker-th-background-color;
+            }
+            
+            cursor: default;
+            
+            span {
+                display: block;
+                padding-right: 7px;
+            }
+        }
+        
+        tr {
+            height: 20px;
+        }
+        
+        td {
+            border: $datepicker-border-width $datepicker-border-style;
+            height: $datepicker-td-height;
+            border-color: $datepicker-background-color;
+            text-align: right;
+            padding: 0;
+        }
+        
+        a {
+            padding-right: 4px;
+            
+            display: block;
+            
+            zoom: 1;
+            
+            font: normal ceil($font-size * .9) $font-family;
+            color: $datepicker-item-color;
+            text-decoration: none;
+            text-align: right;
+        }
+        
+        .#{$prefix}datepicker-active {
+            cursor: pointer;
+            color: black;
+        }
+        
+        .#{$prefix}datepicker-selected {
+            a {
+                background: repeat-x left top;
+                background-color: $datepicker-selected-item-background-color;
+                border: 1px solid $datepicker-selected-item-border-color;
+            }
+            
+            span {
+                font-weight: bold;
+            }
+        }
+        
+        .#{$prefix}datepicker-today {
+            a {
+                border: $datepicker-border-width $datepicker-border-style;
+                border-color: $datepicker-today-item-border-color;
+            }
+        }
+        
+        .#{$prefix}datepicker-prevday,
+        .#{$prefix}datepicker-nextday {
+            a {
+                text-decoration: none !important;
+                color: #aaa;
+            }
+        }
+        
+        a:hover,
+        .#{$prefix}datepicker-disabled a:hover {
+            text-decoration: none !important;
+            
+            color: #000;
+            
+            background-color: $datepicker-item-hover-background-color;
+        }
+        
+        .#{$prefix}datepicker-disabled a {
+            cursor: default;
+            background-color: #eee;
+            color: #bbb;
+        }
+    }
+
+    .#{$prefix}datepicker-footer,
+    .#{$prefix}monthpicker-buttons {
+        position: relative;
+        
+        border-top: $datepicker-border-width $datepicker-border-style $datepicker-footer-border-top-color;
+        
+        @if $datepicker-footer-background-gradient {
+            @include background-gradient($datepicker-footer-background-color, $datepicker-footer-background-gradient);
+        } @else {
+            background-color: $datepicker-footer-background-color;
+        }
+        
+        text-align: center;
+        
+        .#{$prefix}btn {
+            position: relative;
+            margin: 4px;
+        } 
+    }
+    
+    .#{$prefix}item-disabled .#{$prefix}datepicker-inner a:hover {
+        background: none;
+    }
+
+    // month picker
+    .#{$prefix}datepicker .#{$prefix}monthpicker {
+        position: absolute;
+        left: 0;
+        top: 0;
+    }
+    
+    
+    .#{$prefix}monthpicker {        
+        border: $datepicker-border;
+        background-color: $datepicker-background-color;
+    }
+
+    .#{$prefix}monthpicker-months,
+    .#{$prefix}monthpicker-years {
+        float: left;
+        
+        height: $datepicker-monthpicker-height;
+        width: 88px;
+    }
+        
+    .#{$prefix}monthpicker-item {
+        float: left;
+        
+        margin: 4px 0 5px 0;
+        
+        font: normal ceil($font-size * .9) $font-family;
+        text-align: center;
+        vertical-align: middle;
+        
+        height: 18px;
+        width: 43px;
+        
+        border: 0 none;
+        
+        a {
+            display: block;
+            
+            margin: 0 5px 0 5px;
+            
+            text-decoration: none;
+            
+            color: $datepicker-monthpicker-item-color;
+            
+            border: $datepicker-monthpicker-item-border;
+            
+            line-height: 17px;
+            
+            &:hover {
+                background-color: $datepicker-monthpicker-item-hover-background-color;
+            }
+            
+            &.#{$prefix}monthpicker-selected {
+                background-color: $datepicker-monthpicker-item-selected-background-color;
+                border: $datepicker-monthpicker-item-selected-border;
+            }
+        }
+    }
+        
+    .#{$prefix}monthpicker-months {
+        border-right: $datepicker-border;
+        width: 87px;
+    }
+    
+    .#{$prefix}monthpicker-years .#{$prefix}monthpicker-item {
+        width: 44px;
+    }
+    
+    .#{$prefix}monthpicker-yearnav {
+        height: 28px;
+        
+        button {
+            background-image: theme-background-image($theme-name, $datepicker-tool-sprite-image);
+            height: 15px;
+            width: 15px;
+            padding: 0;
+            margin: 6px 12px 5px 15px;
+            border: 0;
+            outline: 0 none;
+            &::-moz-focus-inner {
+                border: 0;
+                padding: 0;
+            }
+        }
+    }
+    
+    .#{$prefix}monthpicker-yearnav-next {
+        background-position: 0 -120px;
+    }
+    
+    .#{$prefix}monthpicker-yearnav-next-over {
+        cursor: pointer;
+        cursor: hand;
+        background-position: -15px -120px;
+    }
+    
+    .#{$prefix}monthpicker-yearnav-prev {
+        background-position: 0 -105px;
+    }
+    
+    .#{$prefix}monthpicker-yearnav-prev-over {
+        cursor: pointer;
+        cursor: hand;
+        background-position: -15px -105px;
+    }
+    
+    .#{$prefix}monthpicker-small {
+        .#{$prefix}monthpicker-item {
+            margin: 2px 0 2px 0;
+        }
+        
+        .#{$prefix}monthpicker-yearnav {
+            height: 23px;
+        }
+        
+        .#{$prefix}monthpicker-months, .#{$prefix}monthpicker-years {
+            height: 136px;
+        }
+    }
+    
+    @if $include-ie {
+        .#{$prefix}quirks {
+            .#{$prefix}ie7,
+            .#{$prefix}ie8 {
+                .#{$prefix}monthpicker-buttons {
+                    .#{$prefix}btn {
+                        margin-top: 2px;
+                    }
+                }
+            }
+            
+            .#{$prefix}monthpicker-small .#{$prefix}monthpicker-yearnav button {
+                margin-top: 3px;
+                margin-bottom: 3px;
+            }
+        }
+        
+        .#{$prefix}ie6 .#{$prefix}monthpicker-small .#{$prefix}monthpicker-yearnav button {
+            margin-top: 3px;
+            margin-bottom: 3px;
+        }
+    }
+
+    //nlg support
+    @if not $supports-gradients or $compile-all {
+        .#{$prefix}nlg {
+            @if $datepicker-header-background-gradient != null {
+                .#{$prefix}datepicker-header {
+                    background-image: theme-background-image($theme-name, 'datepicker/datepicker-header-bg.gif');
+                    background-repeat: repeat-x;
+                    background-position: top left;
+                }
+            }
+
+            @if $datepicker-footer-background-gradient != null {
+                .#{$prefix}datepicker-footer,
+                .#{$prefix}monthpicker-buttons {
+                    background-image: theme-background-image($theme-name, 'datepicker/datepicker-footer-bg.gif');
+                    background-repeat: repeat-x;
+                    background-position: top left;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_drawcomponent.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_drawcomponent.scss
new file mode 100755
index 0000000..0e47229
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_drawcomponent.scss
@@ -0,0 +1,55 @@
+ at mixin extjs-drawcomponent {
+    .#{$prefix}surface {
+        @include inline-block;
+    }
+
+    .rvml {
+        behavior: url(#default#VML);
+    }
+
+    .#{$prefix}surface tspan {
+        @include no-select;
+    }
+
+    .#{$prefix}vml-sprite {
+        position: absolute;
+        left: 0;
+        top: 0;
+        width: 1px;
+        height: 1px;
+    }
+
+    .#{$prefix}vml-group {
+        position: absolute;
+        left: 0;
+        top: 0;
+        width: 1000px;
+        height: 1000px;
+    }
+
+    .#{$prefix}vml-measure-span {
+        position: absolute;
+        left: -9999em;
+        top: -9999em;
+        padding: 0;
+        margin: 0;
+        display: inline;
+    }
+
+    .#{$prefix}vml-base {
+        position: relative; 
+        top: 0;
+        left: 0;
+        overflow: hidden;
+        display: inline-block;
+    }
+
+    .#{$prefix}vml-base {
+        position: relative; 
+        top: 0;
+        left: 0;
+        overflow: hidden;
+        display: inline-block;
+    }
+}
+
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_form.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_form.scss
new file mode 100755
index 0000000..446554e
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_form.scss
@@ -0,0 +1,8 @@
+ at import 'form/all';
+ at import 'form/field';
+ at import 'form/fieldset';
+ at import 'form/file';
+ at import 'form/checkbox';
+ at import 'form/checkboxgroup';
+ at import 'form/triggerfield';
+ at import 'form/htmleditor';
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_grid.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_grid.scss
new file mode 100755
index 0000000..bd4092a
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_grid.scss
@@ -0,0 +1,817 @@
+ at mixin extjs-grid {
+    //main grid view
+    .#{$prefix}panel {
+        .#{$prefix}grid-body {
+            background: $panel-body-background-color;
+            border-color: $panel-body-border-color;
+            border-style: $panel-body-border-style;
+            border-width: 1px;
+            border-top-color: $grid-header-background-color;
+        }
+
+        // Still needs left and right border even if it's not visible so that its available width can be calculated correctly
+        .#{$prefix}grid-header-ct-hidden {
+            border-top-width: 0 !important;
+        }
+    }
+
+    .#{$prefix}grid-header-hidden .#{$prefix}grid-body {
+        border-top-color: $panel-body-border-color !important;
+    }
+
+    .#{$prefix}grid-view {
+        overflow: hidden;
+
+        position: relative;
+    }
+
+    .#{$prefix}grid-table {
+        table-layout: fixed;
+        border-collapse: separate;
+    }
+
+    .#{$prefix}grid-row .#{$prefix}grid-table {
+        border-collapse: collapse;
+    }
+
+    .#{$prefix}grid-locked .#{$prefix}grid-inner-locked {
+        border-width: 0 1px 0 0 !important;
+        border-style: solid;
+    }
+
+    .#{$prefix}grid-header-ct {
+        cursor: default;
+        zoom: 1;
+        padding: 0;
+        border: 1px solid $panel-body-border-color;
+
+        @if $supports-gradients or $compile-all {
+            @include background-gradient($grid-header-background-color, $grid-header-background-gradient);
+        }
+    }
+
+    .#{$prefix}accordion-item .#{$prefix}grid-header-ct {
+        border: 0 none;
+    }
+
+    @if $include-ie or $compile-all {
+        .#{$prefix}border-box .#{$prefix}ie9 {
+            .#{$prefix}grid-header-ct {
+                padding-left: 1px;
+            }
+        }
+        .#{$prefix}ie6, .#{$prefix}ie7 {
+            .#{$prefix}grid-header-ct {
+                padding-left: 1px;
+            }
+        }
+
+    }
+
+    .#{$prefix}column-header {
+        padding: 0;
+        position: absolute;
+        overflow: hidden;
+
+        border-right: 1px solid $grid-header-background-color;
+        border-left: 0 none;
+        border-top: 0 none;
+        border-bottom: 0 none;
+
+        text-shadow: 0 1px 0 rgba(255, 255, 255, .3);
+        font: normal 11px/15px $font-family;
+
+        @if $grid-header-color {
+            color: $grid-header-color;
+        }
+        font: normal ceil($font-size * .9) $font-family;
+
+        @if $supports-gradients or $compile-all {
+            @include background-gradient($grid-header-background-color, $grid-header-background-gradient);
+        }
+    }
+
+    .#{$prefix}group-header {
+        padding: 0;
+        border-left-width: 0;
+    }
+    .#{$prefix}group-sub-header {
+        background: transparent;
+        border-top: 1px solid $grid-header-background-color;
+        border-left-width: 0;
+    }
+
+    .#{$prefix}column-header-inner {
+        zoom: 1;
+        position: relative;
+        white-space: nowrap;
+        line-height: 22px;
+        padding: $grid-header-padding;
+
+        .#{$prefix}column-header-text {
+            white-space: nowrap;
+        }
+    }
+
+    .#{$prefix}column-header-over,
+    .#{$prefix}column-header-sort-ASC,
+    .#{$prefix}column-header-sort-DESC {
+        border-left-color: $grid-header-over-border-color;
+        border-right-color: $grid-header-over-border-color;
+
+        @if $supports-gradients or $compile-all {
+            @include background-gradient($grid-header-over-background-color, $grid-header-over-background-gradient);
+        }
+    }
+
+    @if not $supports-gradients or $compile-all {
+        .#{$prefix}nlg {
+            .#{$prefix}grid-header-ct,
+            .#{$prefix}column-header {
+                background: repeat-x 0 top;
+                background-image: theme-background-image($theme-name, 'grid/column-header-bg.gif');
+            }
+
+            .#{$prefix}column-header-over,
+            .#{$prefix}column-header-sort-ASC,
+            .#{$prefix}column-header-sort-DESC {
+                background: #ebf3fd repeat-x 0 top;
+                background-image: theme-background-image($theme-name, 'grid/column-header-over-bg.gif');
+            }
+        }
+    }
+
+    .#{$prefix}column-header-trigger {
+        display: none;
+        height: 100%;
+        width: $grid-header-trigger-width;
+        background: no-repeat left center;
+        background-color: #c3daf9;
+        background-image: theme-background-image($theme-name, 'grid/grid3-hd-btn.gif');
+        position: absolute;
+        right: 0;
+        top: 0;
+        z-index: 2;
+        cursor: pointer;
+    }
+
+    .#{$prefix}column-header-over, .#{$prefix}column-header-open {
+        .#{$prefix}column-header-trigger {
+            display: block;
+        }
+    }
+
+    .#{$prefix}column-header-align-right {
+        text-align: right;
+
+        .#{$prefix}column-header-text {
+            padding-right: 0.5ex;
+            margin-right: 6px;
+        }
+    }
+    .#{$prefix}column-header-align-center {
+        text-align: center;
+    }
+    .#{$prefix}column-header-align-left {
+        text-align: left;
+    }
+
+    // Sort direction indicator is a background of the text span.
+    .#{$prefix}column-header-sort-ASC .#{$prefix}column-header-text {
+        padding-right: 16px;
+        background: no-repeat right 6px;
+        background-image: theme-background-image($theme-name, 'grid/sort_asc.gif');
+    }
+    .#{$prefix}column-header-sort-DESC .#{$prefix}column-header-text {
+        padding-right: 16px;
+        background: no-repeat right 6px;
+        background-image: theme-background-image($theme-name, 'grid/sort_desc.gif');
+    }
+
+    //grid rows
+    .#{$prefix}grid-row {
+        line-height: 13px;
+
+        vertical-align: top;
+
+        padding: $grid-row-padding;
+
+        @include no-select;
+
+        .#{$prefix}grid-cell {
+            @if $grid-row-cell-color {
+                color: $grid-row-cell-color;
+            }
+            font: $grid-row-cell-font;
+            background-color: $grid-row-cell-background;
+            border-color: $grid-row-cell-border-color;
+            border-style: $grid-row-cell-border-style;
+            border-width: $grid-row-cell-border-width;
+            border-top-color: lighten($grid-row-cell-border-color, 5);
+        }
+    }
+
+    .#{$prefix}grid-rowwrap-div {
+        border-width: $grid-row-wrap-border-width;
+        border-color: $grid-row-wrap-border-color;
+        border-style: $grid-row-wrap-border-style;
+        border-top-color: lighten($grid-row-wrap-border-color, 5);
+
+        overflow: hidden;
+    }
+
+    .#{$prefix}grid-row-alt .#{$prefix}grid-cell,
+    .#{$prefix}grid-row-alt .#{$prefix}grid-rowwrap-div {
+        background-color: $grid-row-cell-alt-background;
+    }
+
+    .#{$prefix}grid-row-over .#{$prefix}grid-cell,
+    .#{$prefix}grid-row-over .#{$prefix}grid-rowwrap-div {
+        border-color: $grid-row-cell-over-border-color;
+
+        background-color: $grid-row-cell-over-background-color;
+    }
+
+    .#{$prefix}grid-row-focused .#{$prefix}grid-cell,
+    .#{$prefix}grid-row-focused .#{$prefix}grid-rowwrap-div {
+        border-color: $grid-row-cell-focus-border-color;
+
+        background-color: $grid-row-cell-focus-background-color;
+    }
+
+    .#{$prefix}grid-row-selected .#{$prefix}grid-cell,
+    .#{$prefix}grid-row-selected .#{$prefix}grid-rowwrap-div {
+        border-style: $grid-row-cell-selected-border-style;
+        border-color: $grid-row-cell-selected-border-color;
+
+        background-color: $grid-row-cell-selected-background-color !important;
+    }
+
+    .#{$prefix}grid-rowwrap-div {
+        .#{$prefix}grid-cell,
+        .#{$prefix}grid-cell-inner {
+            border-width: 0;
+
+            background: transparent;
+        }
+    }
+
+    .#{$prefix}grid-row-body-hidden {
+        display: none;
+    }
+
+    .#{$prefix}grid-rowbody {
+        font: $grid-row-body-font;
+
+        padding: $grid-row-body-padding;
+
+        p {
+            margin: 5px 5px 10px 5px;
+        }
+    }
+
+    //grid cells
+    .#{$prefix}grid-cell {
+        overflow: hidden;
+
+        font: $grid-cell-font;
+
+        @include no-select;
+    }
+
+    .#{$prefix}grid-cell-inner {
+        overflow: hidden;
+
+        -o-text-overflow: ellipsis;
+        text-overflow: ellipsis;
+
+        padding: $grid-cell-inner-padding;
+
+        white-space: nowrap;
+    }
+
+    // Action columns with a standard, 16x16 icon require less padding
+    .#{$prefix}action-col-cell .#{$prefix}grid-cell-inner {
+        padding: 1px 2px 0 2px;
+    }
+
+    .#{$prefix}ie6,
+    .#{$prefix}ie7,
+    .#{$prefix}quirks .#{$prefix}ie9,
+    .#{$prefix}quirks .#{$prefix}ie8,
+    .#{$prefix}strict .#{$prefix}ie8 {
+        .#{$prefix}action-col-cell .#{$prefix}grid-cell-inner {
+            padding: 2px 2px 1px 2px;
+        }
+    }
+
+    .#{$prefix}grid-row .#{$prefix}grid-cell-special {
+        padding: 0;
+        border-right: 1px solid $grid-cell-with-col-lines-border-color;
+
+        @include background-gradient(#f6f6f6, 'grid-cell-special');
+    }
+
+    /*
+    IE6-8 have issues with shrinking the TR to 0px (even w/line-height=0), so we
+    use an IE-specific trick to make the row disappear. We cannot do this on any
+    other browser, because it is not a non-standard thing to do and those other
+    browsers will do whacky things with it.
+    */
+
+    .#{$prefix}ie6,
+    .#{$prefix}ie7,
+    .#{$prefix}quirks .#{$prefix}ie8,
+    .#{$prefix}strict .#{$prefix}ie8 {
+        .#{$prefix}grid-header-row {
+            position: absolute;
+        }
+    }
+
+    .#{$prefix}grid-row-selected .#{$prefix}grid-cell-special {
+        border-right: 1px solid adjust-color($base-color, $hue: -0.175deg, $saturation: 25.296%, $lightness: -2.549%);
+
+        @include background-gradient($grid-row-cell-selected-background-color, 'grid-cell-special');
+    }
+
+    .#{$prefix}grid-dirty-cell {
+        background-image: theme-background-image($theme-name, 'grid/dirty.gif');
+        background-position: 0 0;
+        background-repeat: no-repeat;
+    }
+
+    .#{$prefix}grid-cell-selected {
+        background-color: #B8CFEE !important;
+    }
+
+    @if not $supports-gradients or $compile-all {
+        .#{$prefix}nlg {
+            .#{$prefix}grid-cell-special {
+                background-repeat: repeat-y;
+                background-position: top right;
+            }
+
+            .#{$prefix}grid-row .#{$prefix}grid-cell-special,
+            .#{$prefix}grid-row-over .#{$prefix}grid-cell-special {
+                background-image: theme-background-image($theme-name, 'grid/cell-special-bg.gif');
+
+            }
+
+            .#{$prefix}grid-row-focused .#{$prefix}grid-cell-special,
+            .#{$prefix}grid-row-selected .#{$prefix}grid-cell-special {
+                background-image: theme-background-image($theme-name, 'grid/cell-special-selected-bg.gif');
+            }
+        }
+    }
+
+    //this is panel as gridpanel doesn't use a baseCls
+    .#{$prefix}panel-with-col-lines .#{$prefix}grid-row .#{$prefix}grid-cell {
+        padding-right: 0;
+        border-right: 1px solid $grid-cell-with-col-lines-border-color;
+    }
+
+    @if $include-ie {
+        .#{$prefix}ie {
+            .#{$prefix}grid-cell-special {
+                border-right-width: 0 !important;
+            }
+        }
+    }
+
+    .#{$prefix}property-grid {
+        .#{$prefix}grid-row .#{$prefix}grid-cell-inner {
+            padding: 3px 6px 5px;
+        }
+
+        .#{$prefix}grid-row .#{$prefix}grid-property-name .#{$prefix}grid-cell-inner,
+        .#{$prefix}grid-row-over .#{$prefix}grid-property-name .#{$prefix}grid-cell-inner {
+            padding-left: 12px;
+            background-image: theme-background-image($theme-name, 'grid/property-cell-bg.gif');
+            background-repeat: no-repeat;
+            background-position: -16px 1px;
+        }
+    }
+
+    @if $include-ie {
+        .#{$prefix}quirks .#{$prefix}ie .#{$prefix}grid-row .#{$prefix}grid-property-name .#{$prefix}grid-cell-inner {
+            background-position: -16px 2px;
+        }
+    }
+
+    .#{$prefix}unselectable {
+        @include no-select;
+    }
+
+    .#{$prefix}grid-row-body-hidden {
+        display: none;
+    }
+
+    .#{$prefix}grid-group-collapsed {
+        display: none;
+    }
+
+    //grid expander
+    .#{$prefix}grid-view {
+        .#{$prefix}grid-td-expander {
+            vertical-align: top;
+        }
+    }
+
+    .#{$prefix}grid-td-expander {
+        background: repeat-y right transparent;
+    }
+
+    .#{$prefix}grid-view {
+        .#{$prefix}grid-td-expander {
+            .#{$prefix}grid-cell-inner {
+                padding: 0 !important;
+            }
+        }
+    }
+
+    .#{$prefix}grid-row-expander {
+        background-image: theme-background-image($theme-name, 'grid/group-collapse.gif');
+        background-color: transparent;
+
+        width: 9px;
+        height: 13px;
+
+        margin-left: 3px;
+
+        background-repeat: no-repeat;
+        background-position: 0 -2px;
+    }
+
+    .#{$prefix}grid-row-collapsed {
+        .#{$prefix}grid-row-expander {
+            background-image: theme-background-image($theme-name, 'grid/group-expand.gif');
+        }
+    }
+
+    .#{$prefix}grid-resize-marker {
+        position: absolute;
+        z-index: 5;
+        top: 0;
+        width: 1px;
+        background-color: #0f0f0f;
+    }
+
+    //column move icons, when moving columns
+    .col-move-top,
+    .col-move-bottom {
+        width: 9px;
+        height: 9px;
+        position: absolute;
+        top: 0;
+        line-height: 0;
+        font-size: 0;
+        overflow: hidden;
+        z-index: 20000;
+        background: no-repeat left top transparent;
+    }
+
+    .col-move-top {
+        background-image: theme-background-image($theme-name, 'grid/col-move-top.gif');
+    }
+
+    .col-move-bottom {
+        background-image: theme-background-image($theme-name, 'grid/col-move-bottom.gif');
+    }
+
+    //pading toolbar
+    .#{$prefix}tbar-page-number {
+        width: 30px;
+    }
+
+    //grouped grid
+    .#{$prefix}grid-group,
+    .#{$prefix}grid-group-body,
+    .#{$prefix}grid-group-hd {
+        zoom: 1;
+    }
+
+    .#{$prefix}grid-group-hd {
+        padding-top: 6px;
+
+        .#{$prefix}grid-cell-inner {
+            padding: 10px 4px 4px 4px;
+
+            background: $grid-grouped-header-background-color;
+
+            border-width: $grid-grouped-header-border-width;
+            border-style: $grid-grouped-header-border-style;
+            border-color: $grid-grouped-header-border-color;
+
+            cursor: pointer;
+        }
+    }
+
+    .#{$prefix}grid-group-title {
+        background: transparent no-repeat 0 -1px;
+        background-image: theme-background-image($theme-name, 'grid/group-collapse.gif');
+
+        color: $grid-grouped-title-color;
+        font: $grid-grouped-title-font;
+
+        padding: 0 0 0 14px;
+    }
+
+    .#{$prefix}grid-group-hd-collapsed {
+        .#{$prefix}grid-group-title {
+            background-image: theme-background-image($theme-name, 'grid/group-expand.gif');
+        }
+    }
+
+    .#{$prefix}grid-group-collapsed .#{$prefix}grid-group-body {
+        display: none;
+    }
+
+    .#{$prefix}grid-group-collapsed .#{$prefix}grid-group-title {
+        background-image: theme-background-image($theme-name, 'grid/group-expand.gif');
+    }
+
+    .#{$prefix}group-by-icon {
+        background-image: theme-background-image($theme-name, 'grid/group-by.gif');
+    }
+
+    .#{$prefix}show-groups-icon {
+        background-image: theme-background-image($theme-name, 'grid/group-by.gif');
+    }
+
+    .#{$prefix}column-header-checkbox .#{$prefix}column-header-inner {
+        padding: 1px;
+    }
+
+    .#{$prefix}grid-cell-special .#{$prefix}grid-cell-inner {
+        padding: 4px;
+    }
+
+    .#{$prefix}grid-row-checker,
+    .#{$prefix}column-header-checkbox .#{$prefix}column-header-text {
+        height: 14px;
+        width: 14px;
+        background-image: theme-background-image($theme-name, 'grid/unchecked.gif');
+        background-position: -1px -1px;
+        background-repeat: no-repeat;
+        background-color: transparent;
+    }
+
+    // Row checker is a div but column header checker is the text span element, so make it display: block
+    // Header checkbox element needs centering
+    .#{$prefix}column-header-checkbox .#{$prefix}column-header-text {
+        display: block;
+        margin-top: 4px;
+        margin-left: 4px;
+    }
+
+    @if $include-ie or $compile-all {
+        /* All IE Quirks mode need to squish the header height or the line-height will become too tall */
+        /* IE6 always needs the hack regardless of quirks/strict */
+        .#{$prefix}quirks .#{$prefix}ie, .#{$prefix}ie6 {
+            .#{$prefix}column-header-checkbox .#{$prefix}column-header-inner {
+                line-height: 18px;
+            }
+        }
+
+        /* IE 6, 7 & 9 are 1px too far to the right when centering, drop the margin 1px. */
+        .#{$prefix}ie6, .#{$prefix}ie7, .#{$prefix}ie9 {
+            .#{$prefix}column-header-checkbox .#{$prefix}column-header-text {
+                margin-left: 3px;
+            }
+        }
+    }
+
+    .#{$prefix}grid-hd-checker-on .#{$prefix}column-header-text {
+        background-image: theme-background-image($theme-name, 'grid/checked.gif');
+    }
+
+    .#{$prefix}grid-row-checker {
+        margin-left: 1px;
+
+        background-position: 50% -2px;
+    }
+
+    .#{$prefix}grid-row-selected .#{$prefix}grid-row-checker,
+    .#{$prefix}grid-row-checked .#{$prefix}grid-row-checker {
+        background-image: theme-background-image($theme-name, 'grid/checked.gif');
+    }
+
+    //grid icons
+    .#{$prefix}tbar-page-first {
+        background-image: theme-background-image($theme-name, 'grid/page-first.gif') !important;
+    }
+
+    .#{$prefix}tbar-loading {
+        background-image: theme-background-image($theme-name, 'grid/refresh.gif') !important;
+    }
+
+    .#{$prefix}tbar-page-last {
+        background-image: theme-background-image($theme-name, 'grid/page-last.gif') !important;
+    }
+
+    .#{$prefix}tbar-page-next {
+        background-image: theme-background-image($theme-name, 'grid/page-next.gif') !important;
+    }
+
+    .#{$prefix}tbar-page-prev {
+        background-image: theme-background-image($theme-name, 'grid/page-prev.gif') !important;
+    }
+
+    .#{$prefix}item-disabled {
+        .#{$prefix}tbar-loading {
+            background-image: theme-background-image($theme-name, 'grid/refresh-disabled.gif') !important;
+        }
+
+        .#{$prefix}tbar-page-first {
+            background-image: theme-background-image($theme-name, 'grid/page-first-disabled.gif') !important;
+        }
+
+        .#{$prefix}tbar-page-last {
+            background-image: theme-background-image($theme-name, 'grid/page-last-disabled.gif') !important;
+        }
+
+        .#{$prefix}tbar-page-next {
+            background-image: theme-background-image($theme-name, 'grid/page-next-disabled.gif') !important;
+        }
+
+        .#{$prefix}tbar-page-prev {
+            background-image: theme-background-image($theme-name, 'grid/page-prev-disabled.gif') !important;
+        }
+    }
+
+    //menu icons
+    .#{$prefix}hmenu-sort-asc .#{$prefix}menu-item-icon {
+        background-image: theme-background-image($theme-name, 'grid/hmenu-asc.gif');
+    }
+
+    .#{$prefix}hmenu-sort-desc .#{$prefix}menu-item-icon {
+        background-image: theme-background-image($theme-name, 'grid/hmenu-desc.gif');
+    }
+
+    .#{$prefix}hmenu-lock .#{$prefix}menu-item-icon {
+        background-image: theme-background-image($theme-name, 'grid/hmenu-lock.gif');
+    }
+
+    .#{$prefix}hmenu-unlock .#{$prefix}menu-item-icon {
+        background-image: theme-background-image($theme-name, 'grid/hmenu-unlock.gif');
+    }
+
+    .#{$prefix}group-by-icon {
+        background-image: theme-background-image($theme-name, 'grid/group-by.gif');
+    }
+
+    .#{$prefix}cols-icon .#{$prefix}menu-item-icon {
+        background-image: theme-background-image($theme-name, 'grid/columns.gif');
+    }
+
+    .#{$prefix}show-groups-icon {
+        background-image: theme-background-image($theme-name, 'grid/group-by.gif');
+    }
+
+    // Drag/drop indicator styles
+    .#{$prefix}grid-drop-indicator {
+        position: absolute;
+        height: 1px;
+        line-height: 0px;
+        background-color: #77BC71;
+        overflow: visible;
+
+        .#{$prefix}grid-drop-indicator-left {
+            position: absolute;
+            top: -8px;
+            left: -12px;
+            background-image: theme-background-image($theme-name, 'grid/dd-insert-arrow-right.png');
+            height: 16px;
+            width: 16px;
+        }
+
+        .#{$prefix}grid-drop-indicator-right {
+            position: absolute;
+            top: -8px;
+            right: -11px;
+            background-image: theme-background-image($theme-name, 'grid/dd-insert-arrow-left.png');
+            height: 16px;
+            width: 16px;
+        }
+    }
+
+    .#{$prefix}ie6 {
+        .#{$prefix}grid-drop-indicator-left {
+            background-image: theme-background-image($theme-name, 'grid/dd-insert-arrow-right.gif');
+        }
+
+        .#{$prefix}grid-drop-indicator-right {
+            background-image: theme-background-image($theme-name, 'grid/dd-insert-arrow-left.gif');
+        }
+    }
+
+    // Row Editor
+    .#{$prefix}grid-row-editor {
+        position: absolute !important;
+        z-index: 1;
+        zoom: 1;
+        overflow: visible !important;
+
+        .#{$prefix}form-field {
+            font: $grid-row-editor-font;
+        }
+        .#{$prefix}form-display-field {
+            font: $grid-row-editor-font;
+            padding-top: 0;
+            padding-left: 4px;
+        }
+
+        .#{$prefix}panel-body {
+            background-color: $grid-row-editor-background-color;
+            border-top: $grid-row-editor-border;
+            border-bottom: $grid-row-editor-border;
+        }
+    }
+
+    // Perfect alignment of input text with cell text
+    .#{$prefix}grid-row-editor {
+        // Align input text with text value in cell
+        .#{$prefix}form-text {
+            padding-left: 2px;
+        }
+    }
+    .#{$prefix}grid-editor {
+        // Align checkboxes input
+        .#{$prefix}form-cb-wrap {
+            text-align: center;
+        }
+    }
+
+.#{$prefix}grid-row-editor-buttons {
+        background-color: $grid-row-editor-background-color;
+        position: absolute;
+        bottom: -31px;
+        padding: 4px;
+        width: 200px;
+        height: 32px;
+
+        .#{$prefix}strict & {
+            width: 192px;
+            height: 24px;
+        }
+
+        &-ml,
+        &-mr,
+        &-bl,
+        &-br,
+        &-bc {
+            position: absolute;
+            overflow: hidden;
+        }
+
+        &-bl,
+        &-br {
+            width: 4px;
+            height: 4px;
+            bottom: 0px;
+            background-image: theme-background-image($theme-name, 'panel/panel-default-framed-corners.gif');
+        }
+        &-bl {
+            left: 0px;
+            background-position: 0px -16px;
+        }
+        &-br {
+            right: 0px;
+            background-position: 0px -20px;
+        }
+
+        &-bc {
+            position: absolute;
+            left: 4px;
+            bottom: 0px;
+            width: 192px;
+            height: 1px;
+            background-color: $grid-row-editor-border-color;
+        }
+
+        &-ml,
+        &-mr {
+            height: 27px;
+            width: 1px;
+            top: 1px;
+            background-color: $grid-row-editor-border-color;
+        }
+        &-ml {
+            left: 0px
+        }
+        &-mr {
+            background-position: 0px -20px;
+            right: 0px;
+        }
+    }
+
+    .#{$prefix}grid-row-editor-errors {
+        ul {
+            margin-left: 5px;
+        }
+        li {
+            list-style: disc;
+            margin-left: 15px;
+        }
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_html.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_html.scss
new file mode 100755
index 0000000..a6acf00
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_html.scss
@@ -0,0 +1,126 @@
+/**
+ * W3C Suggested Default style sheet for HTML 4
+ * http://www.w3.org/TR/CSS21/sample.html
+ */
+ at mixin extjs-html {
+    .#{$prefix}html {
+        html,
+        address,
+        blockquote,
+        body,
+        dd,
+        div,
+        dl,
+        dt,
+        fieldset,
+        form,
+        frame, frameset,
+        h1,
+        h2,
+        h3,
+        h4,
+        h5,
+        h6,
+        noframes,
+        ol,
+        p,
+        ul,
+        center,
+        dir,
+        hr,
+        menu,
+        pre 			{ display: block; }
+        li              { display: list-item; list-style: disc; }
+        head            { display: none; }
+        table           { display: table; }
+        tr              { display: table-row; }
+        thead           { display: table-header-group; }
+        tbody           { display: table-row-group; }
+        tfoot           { display: table-footer-group; }
+        col             { display: table-column; }
+        colgroup        { display: table-column-group; }
+        td,
+        th 	            { display: table-cell; }
+        caption         { display: table-caption; }
+        th              { font-weight: bolder; text-align: center; }
+        caption         { text-align: center; }
+        body            { margin: 8px; }
+        h1              { font-size: 2em; margin: .67em 0; }
+        h2              { font-size: 1.5em; margin: .75em 0; }
+        h3              { font-size: 1.17em; margin: .83em 0; }
+        h4,
+        p,
+        blockquote,
+        ul,
+        fieldset,
+        form,
+        ol,
+        dl,
+        dir,
+        menu            { margin: 1.12em 0; }
+        h5              { font-size: .83em; margin: 1.5em 0; }
+        h6              { font-size: .75em; margin: 1.67em 0; }
+        h1,
+        h2,
+        h3,
+        h4,
+        h5,
+        h6,
+        b,
+        strong          { font-weight: bolder; }
+        blockquote      { margin-left: 40px; margin-right: 40px; }
+        i,
+        cite,
+        em,
+        var,
+        address    	    { font-style: italic; }
+        pre,
+        tt,
+        code,
+        kbd,
+        samp       	    { font-family: monospace; }
+        pre             { white-space: pre; }
+        button,
+        textarea,
+        input,
+        select   		{ display: inline-block; }
+        big             { font-size: 1.17em; }
+        small,
+        sub,
+        sup 			{ font-size: .83em; }
+        sub             { vertical-align: sub; }
+        sup             { vertical-align: super; }
+        table           { border-spacing: 2px; }
+        thead,
+        tbody,
+        tfoot           { vertical-align: middle; }
+        td,
+        th          	{ vertical-align: inherit; }
+        s,
+        strike,
+        del  			{ text-decoration: line-through; }
+        hr              { border: 1px inset; }
+        ol,
+        ul,
+        dir,
+        menu,
+        dd        	    { margin-left: 40px; }
+        ul, menu, dir   { list-style-type: disc; }
+        ol              { list-style-type: decimal; }
+        ol ul,
+        ul ol,
+        ul ul,
+        ol ol    		{ margin-top: 0; margin-bottom: 0; }
+        u,
+        ins          	{ text-decoration: underline; }
+        br:before       { content: "\A"; }
+        :before, :after { white-space: pre-line; }
+        center          { text-align: center; }
+        :link, :visited { text-decoration: underline; }
+        :focus          { outline: invert dotted thin; }
+
+        /* Begin bidirectionality settings (do not change) */
+        BDO[DIR="ltr"]  { direction: ltr; unicode-bidi: bidi-override; }
+        BDO[DIR="rtl"]  { direction: rtl; unicode-bidi: bidi-override; }
+   ; }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_loadmask.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_loadmask.scss
new file mode 100755
index 0000000..5215309
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_loadmask.scss
@@ -0,0 +1,59 @@
+/**
+  * @class Ext.LoadMask
+  * Component used to mask a component
+  */
+.#{$prefix}mask {
+    z-index: 100;
+    
+    position: absolute;
+    top: 0;
+    left: 0;
+    
+    @include opacity($loadmask-opacity);
+    
+    width: 100%;
+    height: 100%;
+    zoom: 1;
+    
+    background: $loadmask-backgorund;
+}
+
+.#{$prefix}mask-msg {
+    z-index: 20001;
+
+    position: absolute;
+    top: 0;
+    left: 0;
+    
+    padding: $loadmask-msg-padding;
+    border: 1px solid;
+    border-color: $loadmask-msg-border-color;
+    
+    @if $loadmask-msg-background-gradient {
+        @if $supports-gradients or $compile-all {
+            @include background-gradient($loadmask-msg-background-color, $loadmask-msg-background-gradient);
+        }
+    } @else {
+        background: $loadmask-msg-background-color;
+    }
+    
+    div {
+        padding: $loadmask-msg-inner-padding;
+        
+        //if an icon is defined show it
+        @if $loadmask-msg-inner-icon != null {
+            background-image: theme-background-image($theme-name, $loadmask-msg-inner-icon);
+            background-repeat: no-repeat;
+            background-position: 5px center;
+        }
+        
+        cursor: wait;
+        
+        border: 1px solid $loadmask-msg-inner-border-color;
+        
+        background-color: $loadmask-msg-inner-background-color;
+        
+        color: $loadmask-msg-inner-color;
+        font: $loadmask-msg-inner-font;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_menu.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_menu.scss
new file mode 100755
index 0000000..cf17f05
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_menu.scss
@@ -0,0 +1,191 @@
+/**
+  * @class Ext.menu.*
+  */
+ at mixin extjs-menu {
+    .#{$prefix}menu-body {
+        @include no-select;
+        background: $menu-background-color !important;
+        padding: $menu-padding;
+    }
+    
+    .#{$prefix}menu-item .#{$prefix}form-text {
+        user-select: text;
+        -webkit-user-select: text;
+        -o-user-select: text;
+        -ie-user-select: text;
+        -moz-user-select: text;
+        -ie-user-select: text;
+    }
+
+    .#{$prefix}menu-icon-separator {
+        position: absolute;
+        top: 0px;
+        left: $menu-item-indent;
+        z-index: 0;
+        border-left: solid 1px $menu-separator-border-color;
+        background-color: $menu-separator-background-color;
+        width: 2px;
+        height: 100%!important;
+        overflow: hidden;
+    }
+
+    .#{$prefix}menu-plain {
+        .#{$prefix}menu-icon-separator {
+            display: none;
+        }
+    }
+
+    .#{$prefix}menu-focus {
+        display: block;
+        position: absolute;
+        top: -10px;
+        left: -10px;
+        width: 0px;
+        height: 0px;
+    }
+
+    .#{$prefix}menu-item {
+        white-space: nowrap;
+        overflow: hidden;
+        z-index: 1;
+    }
+
+    .#{$prefix}menu-item-cmp {
+        margin-bottom: 1px;
+    }
+
+    .#{$prefix}menu-item-link {
+        display: block;
+        margin: 1px;
+        padding: $menu-link-padding;
+        text-decoration: none !important;
+        line-height: 16px;
+        cursor: default;
+    }
+    
+    @if $include-opera {
+        .#{$prefix}opera {
+            // Opera 10.5 absolute positioning of submenu arrow has issues
+            // This will fix it, and not affect newer Operas
+            .#{$prefix}menu-item-link {
+                position: relative;
+            }
+        }
+    }
+
+    .#{$prefix}menu-item-icon {
+        width: 16px;
+        height: 16px;
+        position: absolute;
+        top: 5px;
+        left: 4px;
+        background: no-repeat center center;
+    }
+
+    .#{$prefix}menu-item-text {
+        font-size: ceil($font-size * .9);
+        color: $menu-text-color;
+    }
+
+    .#{$prefix}menu-item-checked {
+        .#{$prefix}menu-item-icon {
+            background-image: theme-background-image($theme-name, $menu-icon-checked);
+        }
+        .#{$prefix}menu-group-icon {
+            background-image: theme-background-image($theme-name, $menu-icon-group-checked);
+        }
+    }
+
+    .#{$prefix}menu-item-unchecked {
+        .#{$prefix}menu-item-icon {
+            background-image: theme-background-image($theme-name, $menu-icon-unchecked);
+        }
+        .#{$prefix}menu-group-icon {
+            background-image: none;
+        }
+    }
+
+    .#{$prefix}menu-item-separator {
+        height: 2px;
+        border-top: solid 1px $menu-separator-border-color;
+        background-color: $menu-separator-background-color;
+        margin: $menu-padding 0px;
+        overflow: hidden;
+    }
+
+    .#{$prefix}menu-item-arrow {
+        position: absolute;
+        width: 12px;
+        height: 9px;
+        top: 9px;
+        right: 0px;
+        background: no-repeat center center;
+        background-image: theme-background-image($theme-name, $menu-icon-arrow);
+    }
+
+    .#{$prefix}menu-item-indent {
+        margin-left: $menu-item-indent + $menu-padding + 2px; /* The 2px is the width of the seperator */
+    }
+
+    .#{$prefix}menu-item-active {
+        cursor: pointer;
+
+        .#{$prefix}menu-item-link {
+            @include background-gradient($menu-item-active-background-color, 'matte');
+            margin: 0px;
+            border: 1px solid $menu-item-active-border-color;
+            cursor: pointer;
+            @include border-radius(3px);
+        }
+    }
+
+    .#{$prefix}menu-item-disabled {
+        @include opacity(.5);
+    }
+
+    @if $include-ie {
+        .#{$prefix}ie {
+            .#{$prefix}menu-item-disabled {
+                .#{$prefix}menu-item-icon {
+                    @include opacity(.5);
+                }
+
+                .#{$prefix}menu-item-text {
+                    // IE opacity/cleartype bug workaround
+                    background-color: transparent;
+                }
+            }
+            
+            .#{$prefix}strict & {
+                .#{$prefix}menu-icon-separator {
+                    width: 1px;
+                }
+                
+                .#{$prefix}menu-item-separator {
+                    height: 1px;
+                }
+            }
+        }
+        
+        .#{$prefix}ie6,
+        .#{$prefix}ie7,
+        .#{$prefix}quirks .#{$prefix}ie8 {
+            .#{$prefix}menu-item-link {
+                padding-bottom: $menu-padding;
+            }
+        }
+    }
+
+    @if not $supports-gradients or $compile-all {
+        .#{$prefix}nlg {
+            .#{$prefix}menu-item-active .#{$prefix}menu-item-link {
+                background: $menu-item-active-background-color repeat-x left top;
+                background-image: theme-background-image($theme-name, $menu-item-active-background-image);
+            }
+        }
+    }
+    
+    .#{$prefix}menu-date-item {
+        border-color: #99BBE8;
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_panel.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_panel.scss
new file mode 100755
index 0000000..de24a23
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_panel.scss
@@ -0,0 +1,448 @@
+/**
+  * @class Ext.Panel
+  * Used to create the base structure of an Ext.Panel
+  */
+ at mixin extjs-panel {
+    .#{$prefix}panel,
+    .#{$prefix}plain {
+        overflow: hidden;
+        position: relative;
+    }
+    
+     @if $include-ie {
+        // Workaround for disappearing right edge in IE6
+        .#{$prefix}ie {
+            .#{$prefix}panel-header,
+            .#{$prefix}panel-header-tl,
+            .#{$prefix}panel-header-tc,
+            .#{$prefix}panel-header-tr,
+            .#{$prefix}panel-header-ml,
+            .#{$prefix}panel-header-mc,
+            .#{$prefix}panel-header-mr,
+            .#{$prefix}panel-header-bl,
+            .#{$prefix}panel-header-bc,
+            .#{$prefix}panel-header-br {
+                zoom: 1;
+            }
+        }
+        // Fix for IE8 clipping. EXTJSIV-1553
+        .#{$prefix}ie8 {
+            td.#{$prefix}frame-mc {
+                vertical-align: top;
+            }
+        }
+    }
+    
+    //panel header
+    .#{$prefix}panel-header {
+        padding: $panel-header-padding;
+    }
+    
+    .#{$prefix}panel-header-icon,
+    .#{$prefix}window-header-icon {
+        width:16px;
+        height:16px;
+        background-repeat:no-repeat;
+        background-position:0 0;
+        vertical-align:middle;
+        margin-right:4px;
+        margin-top:-1px;
+        margin-bottom:-1px;
+    }
+    
+    .#{$prefix}panel-header-draggable,
+    .#{$prefix}panel-header-draggable .#{$prefix}panel-header-text,
+    .#{$prefix}window-header-draggable,
+    .#{$prefix}window-header-draggable .#{$prefix}window-header-text{
+        cursor: move;
+    }
+
+    // A ghost is just a Panel. The only extra it needs is opacity.
+    // TODO: Make opacity a variable
+    .#{$prefix}panel-ghost, .#{$prefix}window-ghost {
+        @include opacity(0.65);
+        cursor: move;
+    }
+
+    .#{$prefix}panel-header-horizontal, .#{$prefix}window-header-horizontal, .#{$prefix}btn-group-header-horizontal {
+        .#{$prefix}panel-header-body, .#{$prefix}window-header-body, .#{$prefix}btn-group-header-body {
+            width: 100%;
+        }
+    }
+
+    .#{$prefix}panel-header-vertical, .#{$prefix}window-header-vertical, .#{$prefix}btn-group-header-vertical {
+        .#{$prefix}panel-header-body, .#{$prefix}window-header-body, .#{$prefix}btn-group-header-body {
+            height: 100%;
+        }
+    }
+
+    // Vertical headers must be inline blocks so that they acquire width from the content
+    .#{$prefix}panel-header-vertical, .#{$prefix}panel-header-vertical .#{$prefix}panel-header-body,
+    .#{$prefix}btn-group-header-vertical, .#{$prefix}btn-group-header-vertical .#{$prefix}btn-group-header-body,
+    .#{$prefix}window-header-vertical, .#{$prefix}window-header-vertical .#{$prefix}window-header-body {
+        display: -moz-inline-stack;
+        display: inline-block;
+    }
+    
+    .#{$prefix}panel-header-text-container {
+        overflow: hidden;
+        -o-text-overflow: ellipsis;
+        text-overflow: ellipsis;
+    }
+
+    .#{$prefix}panel-header-text {
+        @include no-select;
+        white-space: nowrap;
+    }
+
+    .#{$prefix}panel-header-left,
+    .#{$prefix}panel-header-right {
+        .#{$prefix}vml-base {
+            left: -3px !important;
+        }
+    }
+
+    //panel body
+    .#{$prefix}panel-body {
+        overflow: hidden;
+        position: relative;
+        
+        font-size: $panel-body-font-size;
+    }
+
+    .#{$prefix}panel-header-vertical {
+        .#{$prefix}surface {
+            margin-top: 2px;
+        }
+    }
+    
+    .#{$prefix}panel-header-plain-vertical {
+        .#{$prefix}surface {
+            margin-top: 0;
+        }
+    }
+    
+        
+    .#{$prefix}panel-collapsed {
+        .#{$prefix}panel-header-collapsed-border-top {
+            border-bottom-width: $panel-header-border-width !important;
+        }
+        .#{$prefix}panel-header-collapsed-border-right {
+            border-left-width: $panel-header-border-width !important;
+        }
+        .#{$prefix}panel-header-collapsed-border-bottom {
+            border-top-width: $panel-header-border-width !important;
+        }
+        .#{$prefix}panel-header-collapsed-border-left {
+            border-right-width: $panel-header-border-width !important;
+        }
+    }
+
+    @if not $supports-gradients or $compile-all {
+        .#{$prefix}nlg .#{$prefix}panel-header-vertical {
+            .#{$prefix}frame-mc {
+                background-repeat: repeat-y;
+            }
+        }
+    }
+
+    @if $include-panel-uis == true {
+        @include extjs-panel-ui(
+            'default',
+
+            $ui-base-color: $panel-base-color,
+            $ui-border-width: $panel-border-width,
+            $ui-border-color: $panel-border-color,
+            $ui-border-radius: $panel-border-radius,
+            
+            $ui-header-color: $panel-header-color,
+            $ui-header-font-size: $panel-header-font-size,
+            $ui-header-font-weight: $panel-header-font-weight,
+            $ui-header-border-color: $panel-header-border-color,
+            $ui-header-background-color: $panel-header-background-color,
+            $ui-header-background-gradient: $panel-header-background-gradient,
+
+            $ui-body-color: $panel-body-color,
+            $ui-body-border-color: $panel-body-border-color,
+            $ui-body-border-width: 1px,
+            $ui-body-background-color: $panel-body-background-color
+        );
+        
+        @include extjs-panel-ui(
+            'default-framed',
+
+            $ui-base-color: $panel-base-color,
+            $ui-border-width: $panel-frame-border-width,
+            $ui-border-color: $panel-frame-border-color,
+            $ui-border-radius: $panel-frame-border-radius,
+
+            $ui-header-color: $panel-header-color,
+            $ui-header-font-size: $panel-header-font-size,
+            $ui-header-font-weight: $panel-header-font-weight,
+            $ui-header-border-color: $panel-frame-border-color,
+            $ui-header-background-color: $panel-header-background-color,
+            $ui-header-background-gradient: $panel-header-background-gradient,
+
+            $ui-body-color: $panel-body-color,
+            $ui-body-border-color: $panel-body-border-color,
+            $ui-body-border-width: 0,
+            $ui-body-background-color: $panel-frame-background-color
+        );
+    }
+
+    .x-panel-header-plain,
+    .x-panel-body-plain {
+        border: 0;
+        padding: 0;
+    }
+}
+
+/**
+  * @class Ext.Panel
+  * Used to create a visual theme for an Ext.Panel
+  */
+ at mixin extjs-panel-ui(
+    $ui-label,
+
+    $ui-base-color: null,
+
+    $ui-border-color: null,
+    $ui-border-radius: null,
+    $ui-border-width: 0,
+
+    $ui-header-color: null,
+    $ui-header-font-family: $panel-header-font-family,
+    $ui-header-font-size: $panel-header-font-size,
+    $ui-header-font-weight: $panel-header-font-weight,
+    $ui-header-border-color: $ui-border-color,
+    $ui-header-background-color: null,
+    $ui-header-background-gradient: matte,
+    $ui-header-inner-border-color: null,
+
+    $ui-body-color: null,
+    $ui-body-border-color: null,
+    $ui-body-border-width: null,
+    $ui-body-border-style: solid,
+    $ui-body-background-color: null,
+    $ui-body-font-size: null,
+    $ui-body-font-weight: null
+){
+    @if $ui-base-color != null {
+        @if $ui-border-color == null { $ui-border-color: $ui-base-color; }
+
+        @if $ui-header-color == null { $ui-header-color: #fff; }
+        @if $ui-header-background-color == null { $ui-header-background-color: lighten($ui-base-color, 15); }
+    }
+    
+    @if $ui-header-inner-border-color == null and $ui-header-background-color != null {
+        $ui-header-inner-border-color: lighten($ui-header-background-color, 10);
+    }
+
+    .#{$prefix}panel-#{$ui-label} {
+        @if $ui-border-color != null { border-color: $ui-border-color; }
+    }
+
+    // header
+    .#{$prefix}panel-header-#{$ui-label} {
+        @if $ui-header-font-size != null { font-size: $ui-header-font-size; }
+        line-height: $panel-header-line-height;
+
+        @if $ui-header-border-color != null {
+            border-color: $ui-header-border-color;
+            border-width: $panel-header-border-width;
+            border-style: $panel-header-border-style;
+        }
+
+        @if $supports-gradients or $compile-all {
+            @if $ui-header-background-color != null { @include background-gradient($ui-header-background-color, $ui-header-background-gradient); }
+
+            @if $panel-header-inner-border and $ui-header-inner-border-color != null {
+                @include inner-border(
+                    $width: $panel-header-inner-border-width,
+                    $color: $ui-header-inner-border-color
+                );
+            }
+        }
+    }
+    
+    // header background images
+    @if $ui-header-background-color != null and $ui-header-background-gradient != null {
+        @if not $supports-gradients or $compile-all {
+            .#{$prefix}nlg .#{$prefix}panel-header-#{$ui-label}-top {
+                background-image: theme-background-image($theme-name, 'panel-header/panel-header-#{$ui-label}-top-bg.gif');
+            }
+            
+            .#{$prefix}nlg .#{$prefix}panel-header-#{$ui-label}-bottom {
+                background-image: theme-background-image($theme-name, 'panel-header/panel-header-#{$ui-label}-bottom-bg.gif');
+            }
+
+            .#{$prefix}nlg .#{$prefix}panel-header-#{$ui-label}-left {
+                background-image: theme-background-image($theme-name, 'panel-header/panel-header-#{$ui-label}-left-bg.gif');
+            }
+
+            .#{$prefix}nlg .#{$prefix}panel-header-#{$ui-label}-right {
+                background-image: theme-background-image($theme-name, 'panel-header/panel-header-#{$ui-label}-right-bg.gif');
+            }
+        }
+    }
+    
+    // header text
+    .#{$prefix}panel-header-text-#{$ui-label} {
+        @if $ui-header-color != null { color: $ui-header-color; }
+
+        @if $ui-header-font-size != null {   font-size: $ui-header-font-size; }
+        @if $ui-header-font-weight != null { font-weight: $ui-header-font-weight; }
+        @if $ui-header-font-family != null { font-family: $ui-header-font-family; }
+    }
+
+    // body
+    .#{$prefix}panel-body-#{$ui-label} {
+        @if $ui-body-background-color != null { background: $ui-body-background-color; }
+        @if $ui-body-border-color != null {     border-color: $ui-body-border-color; }
+        @if $ui-body-color != null {            color: $ui-body-color; }
+        @if $ui-body-font-size != null {        font-size: $ui-body-font-size; }
+        @if $ui-body-font-weight != null {      font-size: $ui-body-font-weight; }
+        
+        @if $ui-body-border-width != null {
+            border-width: $ui-body-border-width;
+            @if $ui-body-border-style != null { border-style: $ui-body-border-style; }
+        }
+    }
+    
+    .#{$prefix}panel-collapsed {
+        .#{$prefix}window-header-#{$ui-label},
+        .#{$prefix}panel-header-#{$ui-label} {
+            @if $ui-body-border-color != null { border-color: $ui-body-border-color; }
+        }
+    }
+
+    .#{$prefix}panel-header-#{$ui-label}-vertical {
+        @if $ui-body-border-color != null { border-color: $ui-body-border-color; }
+    }
+
+    @if $ui-base-color != null {
+        @if $supports-gradients or $compile-all {
+            .#{$prefix}panel-header-#{$ui-label}-left,
+            .#{$prefix}panel-header-#{$ui-label}-right {
+                @include background-gradient($ui-header-background-color, $ui-header-background-gradient, right);
+            }
+        }
+    }
+
+    @if $ui-border-radius != null {
+        @include x-frame(
+            'panel',
+            $ui: '#{$ui-label}',
+
+            /* Radius, width, padding and background-color */
+            $border-radius   : $ui-border-radius,
+            $border-width    : $ui-border-width,
+            $padding         : $panel-frame-padding,
+            $background-color: $ui-body-background-color
+        );
+
+
+        @include x-frame('panel-header', '#{$ui-label}-top',    top($ui-border-radius) right($ui-border-radius) 0 0,    $ui-border-width, 4px 5px 4px 5px, $ui-header-background-color, $ui-header-background-gradient);
+        @include x-frame('panel-header', '#{$ui-label}-right',  0 right($ui-border-radius) bottom($ui-border-radius) 0, $ui-border-width, 4px 5px 4px 5px, $ui-header-background-color, $ui-header-background-gradient, false, right);
+        @include x-frame('panel-header', '#{$ui-label}-bottom', 0 0 bottom($ui-border-radius) left($ui-border-radius),  $ui-border-width, 4px 5px 4px 5px, $ui-header-background-color, $ui-header-background-gradient);
+        @include x-frame('panel-header', '#{$ui-label}-left',   top($ui-border-radius) 0 0 left($ui-border-radius),     $ui-border-width, 4px 5px 4px 5px, $ui-header-background-color, $ui-header-background-gradient, false, right);
+        
+        .#{$prefix}panel-header-#{$ui-label}-top {
+            @include inner-border(1px 1px 0 1px, $ui-header-inner-border-color);
+        }
+
+        .#{$prefix}panel-header-#{$ui-label}-right {
+            @include inner-border(1px 1px 1px 0, $ui-header-inner-border-color);
+        }
+
+        .#{$prefix}panel-header-#{$ui-label}-bottom {
+            @include inner-border(0 1px 1px 1px, $ui-header-inner-border-color);
+        }
+
+        .#{$prefix}panel-header-#{$ui-label}-left {
+            @include inner-border(1px 0 1px 1px, $ui-header-inner-border-color);
+        }
+    } @else {
+        .#{$prefix}panel-collapsed {
+            .#{$prefix}panel-header-#{$ui-label}-top {
+                @include border-bottom-radius($ui-border-radius);
+            }
+
+            .#{$prefix}panel-header-#{$ui-label}-right {
+                @include border-left-radius($ui-border-radius);
+            }
+
+            .#{$prefix}panel-header-#{$ui-label}-bottom {
+                @include border-top-radius($ui-border-radius);
+            }
+
+            .#{$prefix}panel-header-#{$ui-label}-left {
+                @include border-right-radius($ui-border-radius);
+            }
+        }
+        
+        .#{$prefix}nlg .#{$prefix}panel-header-#{$ui-label}-right {
+            background-position: top right;
+        }
+        
+        .#{$prefix}panel-header-#{$ui-label}-top {
+            @include inner-border(1px 0 0 0, $ui-header-inner-border-color);
+        }
+
+        .#{$prefix}panel-header-#{$ui-label}-right {
+            @include inner-border(0 1px 0 0, $ui-header-inner-border-color);
+        }
+
+        .#{$prefix}panel-header-#{$ui-label}-bottom {
+            @include inner-border(0 0 1px, $ui-header-inner-border-color);
+        }
+
+        .#{$prefix}panel-header-#{$ui-label}-left {
+            @include inner-border(0 0 0 1px, $ui-header-inner-border-color);
+        }
+    }
+    
+    .#{$prefix}nlg .#{$prefix}panel-header-#{$ui-label}-bottom {
+        background-position: bottom left;
+    }
+    
+    @if $ui-border-radius != null {
+        .#{$prefix}panel .#{$prefix}panel-header-#{$ui-label}-top {
+            border-bottom-width: 1px !important;
+        }
+
+        .#{$prefix}panel .#{$prefix}panel-header-#{$ui-label}-right {
+            border-left-width: 1px !important;
+        }
+
+        .#{$prefix}panel .#{$prefix}panel-header-#{$ui-label}-bottom {
+            border-top-width: 1px !important;
+        }
+
+        .#{$prefix}panel .#{$prefix}panel-header-#{$ui-label}-left {
+            border-right-width: 1px !important;
+        }
+        
+        .#{$prefix}panel-header-#{$ui-label}-collapsed {
+            @include border-radius($ui-border-radius);
+        }
+        
+        @include x-frame('panel-header', '#{$ui-label}-collapsed-top',    top($ui-border-radius) right($ui-border-radius) bottom($ui-border-radius) left($ui-border-radius), $ui-border-width, 4px 5px 4px 5px, $ui-header-background-color, $ui-header-background-gradient);
+        @include x-frame('panel-header', '#{$ui-label}-collapsed-right',  top($ui-border-radius) right($ui-border-radius) bottom($ui-border-radius) left($ui-border-radius), $ui-border-width, 4px 5px 4px 5px, $ui-header-background-color, $ui-header-background-gradient, false, right);
+        @include x-frame('panel-header', '#{$ui-label}-collapsed-bottom', top($ui-border-radius) right($ui-border-radius) bottom($ui-border-radius) left($ui-border-radius), $ui-border-width, 4px 5px 4px 5px, $ui-header-background-color, $ui-header-background-gradient);
+        @include x-frame('panel-header', '#{$ui-label}-collapsed-left',   top($ui-border-radius) right($ui-border-radius) bottom($ui-border-radius) left($ui-border-radius), $ui-border-width, 4px 5px 4px 5px, $ui-header-background-color, $ui-header-background-gradient, false, right);
+    }
+    
+    //background positioning of images
+    .#{$prefix}panel-header-#{$ui-label}-right-tc,
+    .#{$prefix}panel-header-#{$ui-label}-right-mc,
+    .#{$prefix}panel-header-#{$ui-label}-right-bc {
+        background-position: right 0;
+    }
+    
+    .#{$prefix}panel-header-#{$ui-label}-bottom-tc,
+    .#{$prefix}panel-header-#{$ui-label}-bottom-mc,
+    .#{$prefix}panel-header-#{$ui-label}-bottom-bc {
+        background-position: 0 bottom;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_progress-bar.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_progress-bar.scss
new file mode 100755
index 0000000..f2df2ca
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_progress-bar.scss
@@ -0,0 +1,118 @@
+ at mixin extjs-progress {
+    .#{$prefix}progress {
+        border-width: $progress-border-width;
+        border-style: solid;
+        @include border-radius($progress-border-radius);
+        
+        overflow: hidden;
+        
+        height: $progress-height;
+    }
+    
+    .#{$prefix}progress-bar {
+        height: $progress-height - ($progress-border-width * 2);
+        
+        overflow: hidden;
+        position: absolute;
+        
+        width: 0;
+        
+        @include border-radius($progress-border-radius);
+        border-right: 1px solid;
+        border-top: 1px solid;
+    }
+
+    .#{$prefix}progress-text {
+        overflow: hidden;
+        
+        position: absolute;
+        
+        padding: 0 5px;
+        
+        height: $progress-height - ($progress-border-width * 2);
+        
+        font-weight: $progress-text-font-weight;
+        font-size: $progress-text-font-size;
+        line-height: 16px;
+        text-align: $progress-text-text-align;
+    }
+    
+    .#{$prefix}progress-text-back {
+        padding-top: 1px;
+    }
+    
+    @if $include-ie or $compile-all {
+        .#{$prefix}strict .#{$prefix}progress  {
+            height: $progress-height - ($progress-border-width * 2);
+        }
+    }
+    
+    @include extjs-progress-ui(
+        'default',
+        
+        $ui-background-color: $progress-background-color,
+        $ui-border-color: $progress-border-color,
+        
+        $ui-bar-background-color: $progress-bar-background-color,
+
+        $ui-color-front: $progress-text-color-front,
+        $ui-color-back: $progress-text-color-back
+    )
+}
+
+/**
+ * @mixin extjs-progress-ui
+ */
+ at mixin extjs-progress-ui(
+    $ui-label,
+    
+    $ui-base-color: null,
+    
+    $ui-border-color: null,
+    $ui-background-color: null,
+    
+    $ui-bar-background-color: null,
+    $ui-bar-background-gradient: glossy,
+    
+    $ui-color-front: null,
+    $ui-color-back: null
+){
+    @if $ui-base-color != null {
+        @if $ui-border-color == null {         $ui-border-color: $ui-base-color; }
+        @if $ui-bar-background-color == null { $ui-bar-background-color: $ui-base-color; }
+        @if $ui-color-front == null {          $ui-color-front: lighten($ui-base-color, 60); }
+        @if $ui-color-back == null {           $ui-color-back: darken($ui-base-color, 60); }
+    }
+    
+    .#{$prefix}progress-#{$ui-label} {
+        @if $ui-border-color != null { border-color: $ui-border-color; }
+        
+        .#{$prefix}progress-bar {
+            @if $ui-border-color != null { border-right-color: $ui-border-color; }
+            @if $ui-border-color != null { border-top-color: lighten($ui-border-color, 25); }
+
+            @if $ui-bar-background-color != null { @include background-gradient($ui-bar-background-color, $ui-bar-background-gradient); }
+        }
+        
+        .#{$prefix}progress-text {
+            @if $ui-color-front != null { color: $ui-color-front; }
+        }
+        
+        .#{$prefix}progress-text-back {
+            @if $ui-color-back != null { color: $ui-color-back; }
+        }
+    }
+    
+    @if $ui-background-color != null {
+        @if not $supports-gradients or $compile-all {
+            .#{$prefix}nlg {
+                .#{$prefix}progress-#{$ui-label} {
+                    .#{$prefix}progress-bar {
+                        background: repeat-x;
+                        background-image: theme-background-image($theme-name, 'progress/progress-#{$ui-label}-bg.gif');
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_qtip.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_qtip.scss
new file mode 100755
index 0000000..ffb2a2e
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_qtip.scss
@@ -0,0 +1,164 @@
+ at mixin extjs-qtip {
+    .#{$prefix}tip {
+        position: absolute;
+        overflow: visible; /*pointer needs to be able to stick out*/
+        border-color: $tip-border-color;
+
+        .#{$prefix}tip-header {
+            .#{$prefix}box-item {
+                padding: $tip-header-padding;
+            }
+
+            .#{$prefix}tool {
+                padding: 0px 1px 0 0 !important;
+            }
+        }
+    }
+    
+    @include x-frame(
+        $cls: 'tip',
+        $border-radius: $tip-border-radius,
+        $border-width: $tip-border-width,
+        $background-color: $tip-background-color,
+        $background-gradient: $tip-background-gradient,
+        $table: true
+    );
+
+    .#{$prefix}tip-header-text {
+        @include no-select;
+
+        color: $tip-header-color;
+        font-size: $tip-header-font-size;
+        font-weight: $tip-header-font-weight;
+    }
+
+    .#{$prefix}tip-header-draggable {
+        .#{$prefix}tip-header-text {
+            cursor: move;
+        }
+    }
+
+    // Tip is a Panel. It uses dock layout. Body style must be the same
+    .#{$prefix}tip-body,
+    .#{$prefix}form-invalid-tip-body {
+        overflow: hidden;
+        position: relative;
+        padding: $tip-body-padding;
+    }
+
+    .#{$prefix}tip-header,
+    .#{$prefix}tip-body,
+    .#{$prefix}form-invalid-tip-body {
+        color: $tip-body-color;
+        font-size: $tip-body-font-size;
+        font-weight: $tip-body-font-weight;
+        a {
+            color: $tip-body-link-color;
+        }
+    }
+
+    .#{$prefix}tip-anchor {
+        position: absolute;
+
+        overflow: hidden;
+
+        height: 0;
+        width: 0;
+
+        border-style: solid;
+        border-width: 5px;
+        border-color: $tip-border-color;
+
+        zoom: 1;
+    }
+
+    .#{$prefix}border-box .#{$prefix}tip-anchor {
+        width: 10px;
+        height: 10px;
+    }
+
+    .#{$prefix}tip-anchor-top {
+        border-top-color: transparent;
+        border-left-color: transparent;
+        border-right-color: transparent;
+
+        @if $include_ie {
+            _border-top-color: pink;
+            _border-left-color: pink;
+            _border-right-color: pink;
+            _filter: chroma(color=pink);
+        }
+    }
+
+    .#{$prefix}tip-anchor-bottom {
+        border-bottom-color: transparent;
+        border-left-color: transparent;
+        border-right-color: transparent;
+        
+        @if $include_ie {
+            _border-bottom-color: pink;
+            _border-left-color: pink;
+            _border-right-color: pink;
+            _filter: chroma(color=pink);
+        }
+    }
+    
+    .#{$prefix}tip-anchor-left {
+        border-top-color: transparent;
+        border-bottom-color: transparent;
+        border-left-color: transparent;
+        
+        @if $include-ie {
+            _border-top-color: pink;
+            _border-bottom-color: pink;
+            _border-left-color: pink;
+            _filter: chroma(color=pink);
+        }
+    }
+    
+    .#{$prefix}tip-anchor-right {
+        border-top-color: transparent;
+        border-bottom-color: transparent;
+        border-right-color: transparent;
+        
+        @if $include-ie {
+            _border-top-color: pink;
+            _border-bottom-color: pink;
+            _border-right-color: pink;
+            _filter: chroma(color=pink);
+        }
+    }
+    
+    //error qtip
+    .#{$prefix}form-invalid-tip {
+        border-color: $tip-error-border-color;
+        
+        @include inner-border(
+            $width: 1px,
+            $color: $tip-error-inner-border-color
+        );
+    }
+
+    .#{$prefix}form-invalid-tip-body {
+        background: 1px 1px no-repeat;
+        background-image: theme-background-image($theme-name, 'form/exclamation.gif');
+        padding-left: 22px;
+
+        li {
+            margin-bottom: 4px;
+            &.last {
+                margin-bottom: 0;
+            }
+        }
+    }
+
+    @include x-frame(
+        $cls: 'form-invalid-tip',
+        $ui: 'default',
+        $border-radius: $tip-error-border-radius,
+        $border-width: $tip-error-border-width,
+        $background-color: $tip-error-background-color,
+        $background-gradient: $tip-background-gradient,
+        $table: true
+    );
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_slider.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_slider.scss
new file mode 100755
index 0000000..bd478b6
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_slider.scss
@@ -0,0 +1,141 @@
+ at mixin extjs-slider {
+    .#{$prefix}slider {
+        zoom:1;
+    }
+
+    .#{$prefix}slider-inner {
+        position:relative;
+        left:0;
+        top:0;
+        overflow:visible;
+        zoom:1;
+    }
+
+    .#{$prefix}slider-focus {
+        position:absolute;
+        left:0;
+        top:0;
+        width:1px;
+        height:1px;
+        line-height:1px;
+        font-size:1px;
+        -moz-outline:0 none;
+        outline:0 none;
+        @include no-select;
+        display:block;
+        overflow:hidden;  
+    }
+
+    /* Horizontal styles */
+    .#{$prefix}slider-horz {
+        padding-left:7px;
+        background:transparent no-repeat 0 -24px;
+    }
+
+    .#{$prefix}slider-horz .#{$prefix}slider-end {
+        padding-right:7px;
+        zoom:1;
+        background:transparent no-repeat right -46px;
+    }
+
+    .#{$prefix}slider-horz .#{$prefix}slider-inner {
+        background:transparent repeat-x 0 -2px;
+        height:18px;
+    }
+
+    .#{$prefix}slider-horz .#{$prefix}slider-thumb {
+        width:14px;
+        height:15px;
+        position:absolute;
+        left:0;
+        top:1px;
+        background:transparent no-repeat 0 0;
+    }
+
+    .#{$prefix}slider-horz .#{$prefix}slider-thumb-over {
+        background-position: -14px -15px;
+    }
+
+    .#{$prefix}slider-horz .#{$prefix}slider-thumb-drag {
+        background-position: -28px -30px;
+    }
+
+    /* Vertical styles */
+    .#{$prefix}slider-vert {
+        padding-top:7px;
+        background:transparent no-repeat -44px 0;
+    }
+
+    .#{$prefix}slider-vert .#{$prefix}slider-end {
+        padding-bottom:7px;
+        zoom:1;
+        background:transparent no-repeat -22px bottom;
+        width:22px;
+    }
+
+    .#{$prefix}slider-vert .#{$prefix}slider-inner {
+        background:transparent repeat-y 0 0;
+        width:22px;
+    }
+
+    .#{$prefix}slider-vert .#{$prefix}slider-thumb {
+        width:15px;
+        height:14px;
+        position:absolute;
+        left:3px;
+        bottom:0;
+        background:transparent no-repeat 0 0;
+    }
+
+    .#{$prefix}slider-vert .#{$prefix}slider-thumb-over {
+        background-position: -15px -14px;
+    }
+
+    .#{$prefix}slider-vert .#{$prefix}slider-thumb-drag {
+        background-position: -30px -28px;
+    }
+    
+    .#{$prefix}slider-horz,
+    .#{$prefix}slider-horz .#{$prefix}slider-end,
+    .#{$prefix}slider-horz .#{$prefix}slider-inner {
+        background-image: theme-background-image($theme-name, 'slider/slider-bg.png');
+    }
+
+    .#{$prefix}slider-horz .#{$prefix}slider-thumb {
+        background-image: theme-background-image($theme-name, 'slider/slider-thumb.png');
+    }
+
+    .#{$prefix}slider-vert,
+    .#{$prefix}slider-vert .#{$prefix}slider-end,
+    .#{$prefix}slider-vert .#{$prefix}slider-inner {
+        background-image: theme-background-image($theme-name, 'slider/slider-v-bg.png');
+    }
+
+    .#{$prefix}slider-vert .#{$prefix}slider-thumb {
+        background-image: theme-background-image($theme-name, 'slider/slider-v-thumb.png');
+    }
+    
+    @if $include-ie {
+        .#{$prefix}ie6 {
+            .#{$prefix}slider-horz,
+            .#{$prefix}slider-horz .#{$prefix}slider-end,
+            .#{$prefix}slider-horz .#{$prefix}slider-inner {
+                background-image: theme-background-image($theme-name, 'slider/slider-bg.gif');
+            }
+
+            .#{$prefix}slider-horz .#{$prefix}slider-thumb {
+                background-image: theme-background-image($theme-name, 'slider/slider-thumb.gif');
+            }
+
+            .#{$prefix}slider-vert,
+            .#{$prefix}slider-vert .#{$prefix}slider-end,
+            .#{$prefix}slider-vert .#{$prefix}slider-inner {
+                background-image: theme-background-image($theme-name, 'slider/slider-v-bg.gif');
+            }
+
+            .#{$prefix}slider-vert .#{$prefix}slider-thumb {
+                background-image: theme-background-image($theme-name, 'slider/slider-v-thumb.gif');
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tab.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tab.scss
new file mode 100755
index 0000000..860c001
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tab.scss
@@ -0,0 +1,501 @@
+/**
+  * @class Ext.Tab
+  */
+ at mixin extjs-tab {
+    @include x-frame(
+        $cls: 'tab',
+        $ui: 'default-top',
+        $border-radius: $tab-top-border-radius,
+        $border-width: $tab-top-border-width,
+        $background-color: $tab-base-color,
+        $background-gradient: $tab-background-gradient,
+        $background-direction: top,
+        $table: true
+    );
+
+    @include x-frame(
+        $cls: 'tab',
+        $ui: 'default-bottom',
+        $border-radius: $tab-bottom-border-radius,
+        $border-width: $tab-bottom-border-width,
+        $background-color: $tab-base-color,
+        $background-gradient: $tab-background-gradient,
+        $background-direction: bottom,
+        $table: true
+    );
+
+    .#{$prefix}tab {
+        z-index: 1;
+        margin: 0 0 0 $tab-spacing;
+        display: inline-block;
+        zoom: 1;
+        *display: inline;
+        white-space: nowrap;
+        height: $tab-height;
+        border-color: $tab-border-color;
+        cursor: pointer;
+        cursor: hand;
+
+        * {
+            cursor: pointer;
+            cursor: hand;
+        }
+
+        em {
+            display: block;
+            padding: 0 6px;
+            line-height: 1px;
+        }
+
+        button {
+            background: none;
+            border: 0;
+            padding: 0;
+            margin: 0;
+            -webkit-appearance: none;
+            font-size: $tab-font-size;
+            @if $tab-font-weight {
+                font-weight: $tab-font-weight;
+            }
+            @if $tab-font-family {
+                $font-family: $tab-font-family;
+            }
+
+            color: $tab-color;
+            outline: 0 none;
+
+            overflow: hidden;
+            overflow-x: visible;
+            -o-text-overflow: ellipsis;
+            text-overflow: ellipsis;
+
+            &::-moz-focus-inner {
+                border: 0;
+                padding: 0;
+            }
+
+            .#{$prefix}tab-inner {
+                background-color: transparent;
+                background-repeat: no-repeat;
+                background-position: 0 -2px;
+                display: block;
+                text-align: center;
+                white-space: nowrap;
+            }
+        }
+
+        img {
+            display: none;
+        }
+    }
+
+    .#{$prefix}tab-disabled {
+        @include opacity(1);
+    }
+
+    .#{$prefix}border-box {
+        .#{$prefix}tab-default-top {
+            height: $tab-height + top($tabbar-top-strip-border-width);
+        }
+        .#{$prefix}tab-default-bottom {
+            height: $tab-height + bottom($tabbar-bottom-strip-border-width);
+        }
+    }
+
+    @if $include-ie {
+        * html .#{$prefix}ie {
+            .#{$prefix}tab button {
+                width: 1px;
+            }
+        }
+
+        .#{$prefix}strict .#{$prefix}ie6,
+        .#{$prefix}strict .#{$prefix}ie7 {
+            .#{$prefix}tab .#{$prefix}frame-mc {
+                height: 100%;
+            }
+        }
+
+        .#{$prefix}ie .#{$prefix}tab-active button:active {
+            position: relative;
+            top: -1px;
+            left: -1px;
+        }
+    }
+
+    $framepad: max(top($tab-top-border-radius), right($tab-top-border-radius)) - top($tab-top-border-width);
+
+    .#{$prefix}tab-default-top {
+        @if $tab-inner-border {
+            @include inner-border(
+                $width: $tab-top-inner-border-width,
+                $color: $tab-inner-border-color
+            );
+        }
+
+        border-bottom: 1px solid $tabbar-strip-border-color !important;
+
+        em {
+            padding-bottom: $framepad;
+        }
+
+        button,
+        .#{$prefix}tab-inner {
+            height: $tab-height - $framepad * 2 - top($tab-top-border-width);
+            line-height: $tab-height - $framepad * 2 - top($tab-top-border-width);
+        }
+    }
+
+    .#{$prefix}nbr .#{$prefix}tab-default-top {
+        border-bottom-width: 1px !important;
+    }
+
+    .#{$prefix}tab-default-top-active {
+        border-bottom-color: $tabbar-strip-background-color !important;
+    }
+
+    $framepad: max(bottom($tab-bottom-border-radius), left($tab-bottom-border-radius)) - bottom($tab-bottom-border-width);
+
+    .#{$prefix}tab-default-bottom {
+        @if $tab-inner-border {
+            @include inner-border(
+                $width: $tab-bottom-inner-border-width,
+                $color: $tab-inner-border-color
+            );
+        }
+
+        border-top: 1px solid $tabbar-strip-border-color !important;
+
+        @include inner-border(
+            $width: $tab-bottom-inner-border-width,
+            $color: $tab-inner-border-color
+        );
+
+        em {
+            padding-top: $framepad;
+        }
+
+        button,
+        .#{$prefix}tab-inner {
+            height: $tab-height - $framepad * 2 - bottom($tab-bottom-border-width);
+            line-height: $tab-height - $framepad * 2 - bottom($tab-bottom-border-width);
+        }
+    }
+
+    .#{$prefix}nbr .#{$prefix}tab-default-bottom {
+        border-top-width: 1px !important;
+    }
+
+    .#{$prefix}tab-default-bottom-active {
+        border-top-color: $tabbar-strip-background-color !important;
+    }
+
+    .#{$prefix}tab-default-disabled {
+        cursor: default;
+
+        * {
+            cursor: default;
+        }
+
+        border-color: $tab-border-color-disabled;
+        @include background-gradient($tab-base-color-disabled, $tab-background-gradient-disabled);
+
+        button {
+            color: $tab-color-disabled !important;
+        }
+    }
+
+    .#{$prefix}tab-icon-text-left {
+        .#{$prefix}tab-inner {
+            padding-left: 20px;
+        }
+    }
+
+    .#{$prefix}tab {
+        button, a {
+            position: relative;
+
+            .#{$prefix}tab-icon {
+                position: absolute;
+                background-repeat: no-repeat;
+                top: 0;
+                left:0;
+                right:auto;
+                bottom:0;
+                width: 18px;
+                height: 18px;
+            }
+        }
+    }
+
+    //over
+    .#{$prefix}tab-over {
+        @if $tab-border-color-over != $tab-border-color {
+            border-color: $tab-border-color-over;
+        }
+
+        button {
+            @if $tab-color-over != $tab-color {
+                color: $tab-color-over;
+            }
+            @if $tab-font-weight-over != $tab-font-weight {
+                font-weight: $tab-font-weight-over;
+            }
+            @if $tab-font-size-over != $tab-font-size {
+                font-size: $tab-font-size-over;
+            }
+            @if $tab-font-family-over != $tab-font-family {
+                font-family: $tab-font-family-over;
+            }
+        }
+    }
+
+    .#{$prefix}tab-top-over {
+        @include background-gradient($tab-base-color-over, $tab-background-gradient-over, top);
+    }
+    .#{$prefix}tab-bottom-over {
+        @include background-gradient($tab-base-color-over, $tab-background-gradient-over, bottom);
+    }
+
+    //active
+    .#{$prefix}tab-active {
+        z-index: 3;
+        @if $tab-border-color-active != $tab-border-color {
+            border-color: $tab-border-color-active;
+        }
+
+        button {
+            @if $tab-color-active != $tab-color {
+                color: $tab-color-active;
+            }
+            @if $tab-font-weight-active != $tab-font-weight {
+                font-weight: $tab-font-weight-active;
+            }
+            @if $tab-font-size-active != $tab-font-size {
+                font-size: $tab-font-size-active;
+            }
+            @if $tab-font-family-active != $tab-font-family {
+                font-family: $tab-font-family-active;
+            }
+        }
+    }
+
+    .#{$prefix}tab-top-active {
+        @include background-gradient($tab-base-color-active, $tab-background-gradient-active, top);
+    }
+    .#{$prefix}tab-bottom-active {
+        @include background-gradient($tab-base-color-active, $tab-background-gradient-active, bottom);
+    }
+
+    //disabled
+    .#{$prefix}tab-disabled {
+        @if $tab-border-color-disabled != $tab-border-color {
+            border-color: $tab-border-color-disabled;
+        }
+
+        button {
+            @if $tab-color-disabled != $tab-color {
+                color: $tab-color-disabled;
+            }
+            @if $tab-font-weight-disabled != $tab-font-weight {
+                font-weight: $tab-font-weight-disabled;
+            }
+            @if $tab-font-size-disabled != $tab-font-size {
+                font-size: $tab-font-size-disabled;
+            }
+            @if $tab-font-family-disabled != $tab-font-family {
+                font-family: $tab-font-family-disabled;
+            }
+        }
+    }
+
+    .#{$prefix}tab-top-disabled {
+        background-image: none;
+        background: transparent;
+        @include background-gradient($tab-base-color-disabled, $tab-background-gradient-disabled, top);
+    }
+    .#{$prefix}tab-bottom-disabled {
+        background-image: none;
+        background: transparent;
+        @include background-gradient($tab-base-color-disabled, $tab-background-gradient-disabled, bottom);
+    }
+
+    @if not $supports-gradients or $compile-all {
+        .#{$prefix}nlg {
+            @if $tab-background-gradient != null {
+                .#{$prefix}tab-top { background-image: theme-background-image($theme-name, 'tab/tab-default-top-bg.gif'); }
+                .#{$prefix}tab-bottom { background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-bg.gif'); }
+            }
+
+            @if $tab-background-gradient-over != null {
+                .#{$prefix}tab-top-over { background-image: theme-background-image($theme-name, 'tab/tab-default-top-over-bg.gif'); }
+                .#{$prefix}tab-bottom-over { background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-over-bg.gif'); }
+            }
+
+            @if $tab-background-gradient-active != null {
+                .#{$prefix}tab-top-active { background-image: theme-background-image($theme-name, 'tab/tab-default-top-active-bg.gif'); }
+                .#{$prefix}tab-bottom-active { background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-active-bg.gif'); }
+            }
+
+            @if $tab-background-gradient-disabled != null {
+                .#{$prefix}tab-top-disabled { background-image: theme-background-image($theme-name, 'tab/tab-default-top-disabled-bg.gif') !important; }
+                .#{$prefix}tab-bottom-disabled { background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-disabled-bg.gif') !important; }
+            }
+        }
+    }
+
+    .#{$prefix}tab-closable em {
+        padding-right: $tab-closable-icon-width + 3;
+    }
+
+    .#{$prefix}tab-close-btn {
+        position: absolute !important;
+        top: $tab-closable-icon-top;
+        right: $tab-closable-icon-right;
+        width: $tab-closable-icon-width;
+        height: $tab-closable-icon-height;
+        font-size: 0;
+        line-height: 0;
+        text-indent: -999px;
+        background: no-repeat;
+        background-image: theme-background-image($theme-name, $tab-closable-icon);
+        @include opacity(.6);
+    }
+    .#{$prefix}tab-close-btn:hover {
+        @include opacity(1);
+    }
+
+    @if not $supports-border-radius or $compile-all {
+        .#{$prefix}nbr {
+            .#{$prefix}tab-top-over {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-top-over-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-top-over-sides.gif');
+                }
+                @if $tab-background-gradient-over != null {
+                    .#{$prefix}frame-mc {
+                        background-color: $tab-base-color-over;
+                        background-repeat: repeat-x;
+                        background-image: theme-background-image($theme-name, 'tab/tab-default-top-over-bg.gif');
+                    }
+                }
+            }
+
+            .#{$prefix}tab-bottom-over {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-over-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-over-sides.gif');
+                }
+                @if $tab-background-gradient-over != null {
+                    .#{$prefix}frame-mc {
+                        background-color: $tab-base-color-over;
+                        background-repeat: repeat-x;
+                        background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-over-bg.gif');
+                    }
+                }
+            }
+
+            .#{$prefix}tab-top-active {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-top-active-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-top-active-sides.gif');
+                }
+                @if $tab-background-gradient-active != null {
+                    .#{$prefix}frame-mc {
+                        background-color: $tab-base-color-active;
+                        background-repeat: repeat-x;
+                        background-image: theme-background-image($theme-name, 'tab/tab-default-top-active-bg.gif');
+                    }
+                }
+            }
+
+            .#{$prefix}tab-bottom-active {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-active-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-active-sides.gif');
+                }
+                @if $tab-background-gradient-active != null {
+                    .#{$prefix}frame-mc {
+                        background-color: $tab-base-color-active;
+                        background-repeat: repeat-x;
+                        background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-active-bg.gif');
+                    }
+                }
+            }
+
+            .#{$prefix}tab-top-disabled {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-top-disabled-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-top-disabled-sides.gif');
+                }
+                @if $tab-background-gradient-disabled != null {
+                    .#{$prefix}frame-mc {
+                        background-repeat: repeat-x;
+                        background-image: theme-background-image($theme-name, 'tab/tab-default-top-disabled-bg.gif');
+                    }
+                }
+            }
+
+            .#{$prefix}tab-bottom-disabled {
+                .#{$prefix}frame-tl,
+                .#{$prefix}frame-bl,
+                .#{$prefix}frame-tr,
+                .#{$prefix}frame-br,
+                .#{$prefix}frame-tc,
+                .#{$prefix}frame-bc {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-disabled-corners.gif');
+                }
+                .#{$prefix}frame-ml,
+                .#{$prefix}frame-mr {
+                    background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-disabled-sides.gif');
+                }
+                @if $tab-background-gradient-disabled != null {
+                    .#{$prefix}frame-mc {
+                        background-repeat: repeat-x;
+                        background-image: theme-background-image($theme-name, 'tab/tab-default-bottom-disabled-bg.gif');
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tabbar.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tabbar.scss
new file mode 100755
index 0000000..211e357
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tabbar.scss
@@ -0,0 +1,151 @@
+/**
+  * @class Ext.tab.Bar
+  */
+ at mixin extjs-tabbar {
+    .#{$prefix}tab-bar {
+        position: relative;
+        background-color: transparent;
+        @include background-gradient($tabbar-base-color, $tabbar-background-gradient);
+        font-size: $tab-font-size;
+    }
+
+    .#{$prefix}nlg .#{$prefix}tab-bar {
+        background-image: theme-background-image($theme-name, 'tab-bar/tab-bar-default-bg.gif');
+    }
+
+    .#{$prefix}tab-bar-default-plain,
+    .#{$prefix}nlg .#{$prefix}tab-bar-default-plain {
+        background: transparent none;
+    }
+
+    
+    .#{$prefix}tab-bar-body {
+        border-style: solid;
+        border-color: $tabbar-border-color;
+
+        position: relative;
+        z-index: 2;
+        zoom: 1;
+    }
+
+    @mixin tab-bar-top($toolbarCls, $bodyCls, $stripCls, $body-padding, $body-border-width, $strip-border-width, $strip-height) {
+        .#{$prefix}#{$toolbarCls} {
+            .#{$prefix}#{$bodyCls} {
+                height: $tab-height;
+                border-width: $body-border-width;
+                padding: $body-padding;
+            }
+
+            .#{$prefix}#{$stripCls} {
+                /*position strip from top rather than bottom to avoid off-by-one error in IE6*/
+                top: $tab-height + top($body-border-width) + top($body-padding);
+                border-width: $strip-border-width;
+                height: $strip-height - vertical($strip-border-width);
+            }
+        }
+        .#{$prefix}border-box {
+            .#{$prefix}#{$toolbarCls} {
+                .#{$prefix}#{$bodyCls} {
+                    height: $tab-height + vertical($body-border-width) + vertical($body-padding);
+                }
+
+                .#{$prefix}#{$stripCls} {
+                    height: $strip-height;
+                }
+            }
+        }
+    }
+
+    @mixin tab-bar-bottom($toolbarCls, $bodyCls, $stripCls, $body-padding, $body-border-width, $strip-border-width, $strip-height) {
+        .#{$prefix}#{$toolbarCls} {
+            .#{$prefix}#{$bodyCls} {
+                height: $tab-height;
+                border-width: $body-border-width;
+                padding: $body-padding;
+
+                .#{$prefix}box-inner {
+                    position: relative;
+                    top: 0 - bottom($strip-border-width);
+                }
+
+                .#{$prefix}box-scroller,
+                .#{$prefix}box-scroller-left,
+                .#{$prefix}box-scroller-right {
+                    height: $tab-height + bottom($body-padding) + bottom($strip-border-width);
+                }
+            }
+
+            .#{$prefix}#{$stripCls} {
+                top: top($body-border-width);
+                border-width: $strip-border-width;
+                height: $strip-height - vertical($strip-border-width);
+            }
+        }
+        .#{$prefix}border-box {
+            .#{$prefix}#{$toolbarCls} {
+                .#{$prefix}#{$bodyCls} {
+                    height: $tab-height + vertical($body-border-width) + vertical($body-padding);
+                }
+
+                .#{$prefix}#{$stripCls} {
+                    height: $strip-height;
+                }
+            }
+        }
+    }
+
+
+    /* Top Tabs */
+    @include tab-bar-top(
+        "tab-bar-top",
+        "tab-bar-body",
+        "tab-bar-strip",
+        $tabbar-top-body-padding,
+        $tabbar-top-body-border-width,
+        $tabbar-top-strip-border-width,
+        $tabbar-strip-height
+    );
+    @include tab-bar-top(
+        "tab-bar-top",
+        "tab-bar-body-default-plain",
+        "tab-bar-strip-default-plain",
+        $tabbar-top-plain-body-padding,
+        $tabbar-top-plain-body-border-width,
+        $tabbar-top-strip-border-width,
+        $tabbar-strip-height
+    );
+
+    /* Bottom Tabs */
+    @include tab-bar-bottom(
+        "tab-bar-bottom",
+        "tab-bar-body",
+        "tab-bar-strip",
+        $tabbar-bottom-body-padding,
+        $tabbar-bottom-body-border-width,
+        $tabbar-bottom-strip-border-width,
+        $tabbar-strip-height
+    );
+    
+    @include tab-bar-bottom(
+        "tab-bar-bottom",
+        "tab-bar-body-default-plain",
+        "tab-bar-strip-default-plain",
+        $tabbar-bottom-plain-body-padding,
+        $tabbar-bottom-plain-body-border-width,
+        $tabbar-bottom-strip-border-width,
+        $tabbar-strip-height
+    );
+
+    .#{$prefix}tab-bar-strip-default,
+    .#{$prefix}tab-bar-strip-default-plain {
+        font-size: 0;
+        line-height: 0;
+        position: absolute;
+        z-index: 1;
+        border-style: solid;
+        overflow: hidden;
+        border-color: $tabbar-strip-border-color;
+        background-color: $tabbar-strip-background-color;
+        zoom: 1;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_toolbar.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_toolbar.scss
new file mode 100755
index 0000000..a9a8c01
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_toolbar.scss
@@ -0,0 +1,158 @@
+ at mixin extjs-toolbar {
+    .#{$prefix}toolbar {
+        font-size: $toolbar-font-size;
+
+        border: 1px solid;
+        
+        padding: $toolbar-vertical-spacing 0 $toolbar-vertical-spacing $toolbar-horizontal-spacing;
+
+        .#{$prefix}form-item-label{
+            font-size: $toolbar-font-size;
+            line-height: 15px;
+        }
+        
+        .#{$prefix}toolbar-item {
+            margin: 0 $toolbar-horizontal-spacing 0 0;
+        }
+        
+        .#{$prefix}toolbar-text {
+            margin-left: 4px;
+            margin-right: 6px;
+            white-space: nowrap;
+            color: $toolbar-text-color !important;
+            line-height: $toolbar-text-line-height;
+            font-family: $toolbar-text-font-family;
+            font-size: $toolbar-text-font-size;
+            font-weight: $toolbar-text-font-weight;
+        }
+        
+        .#{$prefix}toolbar-separator {
+            display: block;
+            font-size: 1px;
+            overflow: hidden;
+            cursor: default;
+            border: 0;
+        }
+        
+        .#{$prefix}toolbar-separator-horizontal {
+            margin: 0 3px 0 2px;
+
+            height: 14px;
+            width: 0px;
+
+            border-left: 1px solid $toolbar-separator-color;
+            border-right: 1px solid $toolbar-separator-highlight-color;
+        }
+    }
+    
+    @if $include-ie {
+        .#{$prefix}quirks .#{$prefix}ie .#{$prefix}toolbar .#{$prefix}toolbar-separator-horizontal {
+            width: 2px;
+        } 
+    }
+    
+    .#{$prefix}toolbar-footer {
+        background: transparent;
+        border: 0px none;
+        margin-top: 3px;
+        
+        padding: $toolbar-footer-vertical-spacing 0 $toolbar-footer-vertical-spacing $toolbar-footer-horizontal-spacing;
+        
+        .#{$prefix}box-inner {
+            border-width: 0;
+        }
+        
+        .#{$prefix}toolbar-item {
+            margin: 0 $toolbar-footer-horizontal-spacing 0 0;
+        }
+    }
+    
+    .#{$prefix}toolbar-vertical {
+        padding: $toolbar-vertical-spacing $toolbar-horizontal-spacing 0 $toolbar-horizontal-spacing;
+        
+        .#{$prefix}toolbar-item {
+            margin: 0 0 $toolbar-horizontal-spacing 0;
+        }
+        
+        .#{$prefix}toolbar-text {
+            margin-top: 4px;
+            margin-bottom: 6px;
+        }     
+        
+        .#{$prefix}toolbar-separator-vertical {
+            margin: 2px 5px 3px 5px;
+
+            height: 0px;
+            width: 10px;
+            line-height: 0px;
+
+            border-top: 1px solid $toolbar-separator-color;
+            border-bottom: 1px solid $toolbar-separator-highlight-color;
+        }
+    }
+    
+    .#{$prefix}toolbar-scroller {
+        padding-left: 0;
+    }
+
+    .#{$prefix}toolbar-spacer {
+        width: $toolbar-spacer-width;
+    }
+
+    // Background for overflow button inserted by the Menu box overflow handler within a toolbar
+    .#{$prefix}toolbar-more-icon {
+        background-image: theme-background-image($theme-name, 'toolbar/more.gif') !important;
+        background-position: 2px center !important;
+        background-repeat: no-repeat;
+    }
+    
+    @include extjs-toolbar-ui(
+        'default',
+        $background-color: $toolbar-background-color,
+        $background-gradient: $toolbar-background-gradient,
+        $border-color: $toolbar-border-color
+    );
+    
+    //plain toolbars have no border
+    //by default they get no color, so they are transparent. IE6 doesnt support transparent borders
+    //so we must set the width to 0.
+    .#{$prefix}toolbar-plain {
+        border: 0;
+    }
+}
+
+/**
+ * @mixin ext-toolbar-ui
+ * @class Ext.toolbar.Toolbar
+ * @param {String} $ui The name of the UI
+ * @param {Color} $background-color The background color of the toolbar (defaults to transparent)
+ * @param {Gradient/color-stops} $background-gradient The background gradient of the toolbar (defaults to null)
+ * @param {Color} $border-color The border color of the toolbar (defaults to null)
+ */
+ at mixin extjs-toolbar-ui(
+    $ui,
+    
+    $background-color: transparent,
+    $background-gradient: null,
+    
+    $border-color: null
+) {
+    .#{$prefix}toolbar-#{$ui} {
+        @if $border-color != null {
+            border-color: $border-color;
+        }
+        
+        @include background-gradient($background-color, $background-gradient);
+    }
+    
+    @if not $supports-gradients or $compile-all {
+        @if $background-gradient != null {
+            .#{$prefix}nlg {
+                .#{$prefix}toolbar-#{$ui} {
+                    background-image: theme-background-image($theme-name, 'toolbar/toolbar-#{$ui}-bg.gif') !important;
+                    background-repeat: repeat-x;
+                }
+            }
+        }
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tree.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tree.scss
new file mode 100755
index 0000000..b7029d6
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_tree.scss
@@ -0,0 +1,277 @@
+ at mixin extjs-tree {
+    .#{$prefix}tree-no-lines .#{$prefix}tree-elbow {
+        background-color: transparent;
+    }
+
+    .#{$prefix}tree-no-lines .#{$prefix}tree-elbow-end {
+        background-color: transparent;
+    }
+
+    .#{$prefix}tree-no-lines .#{$prefix}tree-elbow-line {
+        background-color: transparent;
+    }
+    
+    //arrows
+    .#{$prefix}tree-arrows .#{$prefix}tree-elbow-plus {
+        background: transparent no-repeat 0 0;
+    }
+    
+    .#{$prefix}tree-arrows .#{$prefix}tree-elbow-end-plus {
+        background: transparent no-repeat 0 0;
+    }
+
+    .#{$prefix}tree-arrows .#{$prefix}tree-elbow-end-minus {
+        background: transparent no-repeat -16px 0;
+    }
+
+    .#{$prefix}tree-arrows .#{$prefix}tree-elbow-minus {
+        background: transparent no-repeat -16px 0;
+    }
+    
+    .#{$prefix}tree-arrows .#{$prefix}tree-elbow {
+        background-color: transparent !important;
+    }
+    
+    .#{$prefix}tree-arrows .#{$prefix}tree-elbow-end {
+        background-color: transparent !important;
+    }
+    
+    .#{$prefix}tree-arrows .#{$prefix}tree-elbow-line {
+        background-color: transparent !important;
+    }
+    
+    //elbows
+    .#{$prefix}tree-arrows .#{$prefix}tree-expander-over .#{$prefix}tree-elbow-plus,
+    .#{$prefix}tree-arrows .#{$prefix}tree-expander-over .#{$prefix}tree-elbow-end-plus {
+        background-position: -32px 0;
+    }
+
+    .#{$prefix}tree-arrows .#{$prefix}tree-expander-over .#{$prefix}tree-elbow-minus,
+    .#{$prefix}tree-arrows .#{$prefix}tree-expander-over .#{$prefix}tree-elbow-end-minus {
+        background-position: -48px 0;
+    }
+    
+    .#{$prefix}tree-arrows .x-grid-tree-node-expanded .#{$prefix}tree-elbow-plus,
+    .#{$prefix}tree-arrows .x-grid-tree-node-expanded .#{$prefix}tree-elbow-end-plus {
+        background-position: -16px 0;
+    }
+    
+    .#{$prefix}tree-arrows .x-grid-tree-node-expanded .#{$prefix}tree-expander-over .#{$prefix}tree-elbow-plus,
+    .#{$prefix}tree-arrows .x-grid-tree-node-expanded .#{$prefix}tree-expander-over .#{$prefix}tree-elbow-end-plus {
+        background-position: -48px 0;
+    }
+
+    .#{$prefix}tree-elbow-plus,
+    .#{$prefix}tree-elbow-minus,
+    .#{$prefix}tree-elbow-end-plus,
+    .#{$prefix}tree-elbow-end-minus{
+        cursor: pointer;
+    }
+    
+    //elbows
+    .#{$prefix}tree-lines {
+        .#{$prefix}tree-elbow {
+            background-image: theme-background-image($theme-name, 'tree/elbow.gif');
+        }
+        
+        .#{$prefix}tree-elbow-end {
+            background-image: theme-background-image($theme-name, 'tree/elbow-end.gif');
+        }
+
+        .#{$prefix}tree-elbow-plus {
+            background-image: theme-background-image($theme-name, 'tree/elbow-plus.gif');
+        }
+
+        .#{$prefix}tree-elbow-end-plus {
+            background-image: theme-background-image($theme-name, 'tree/elbow-end-plus.gif');
+        }
+
+        .#{$prefix}grid-tree-node-expanded .#{$prefix}tree-elbow-plus {
+            background-image: theme-background-image($theme-name, 'tree/elbow-minus.gif');
+        }
+
+        .#{$prefix}grid-tree-node-expanded .#{$prefix}tree-elbow-end-plus {
+            background-image: theme-background-image($theme-name, 'tree/elbow-end-minus.gif');
+        }
+        
+        .#{$prefix}tree-elbow-line {
+            background-image: theme-background-image($theme-name, 'tree/elbow-line.gif');
+        }
+    }
+    
+    .#{$prefix}tree-no-lines {
+        .#{$prefix}tree-elbow-plus,
+        .#{$prefix}tree-elbow-end-plus {
+        	background-image: theme-background-image($theme-name, 'tree/elbow-plus-nl.gif');
+        }
+
+        .#{$prefix}grid-tree-node-expanded .#{$prefix}tree-elbow-plus,
+        .#{$prefix}grid-tree-node-expanded .#{$prefix}tree-elbow-end-plus {
+            background-image: theme-background-image($theme-name, 'tree/elbow-end-minus-nl.gif');
+        }
+    }
+    
+    .#{$prefix}tree-arrows {
+        .#{$prefix}tree-elbow-plus,
+        .#{$prefix}tree-elbow-minus,
+        .#{$prefix}tree-elbow-end-plus,
+        .#{$prefix}tree-elbow-end-minus {
+            background-image: theme-background-image($theme-name, 'tree/arrows.gif');
+        }
+    }
+    
+    .#{$prefix}tree-icon {
+        margin-right: 3px;
+    }
+
+    .#{$prefix}tree-elbow,
+    .#{$prefix}tree-elbow-end,
+    .#{$prefix}tree-elbow-plus,
+    .#{$prefix}tree-elbow-end-plus,
+    .#{$prefix}tree-elbow-empty,
+    .#{$prefix}tree-elbow-line {
+        height: $tree-elbow-height;
+        width: $tree-elbow-width;
+    }
+    
+    .#{$prefix}tree-icon-leaf {
+        width: $tree-elbow-width;
+        background-image: theme-background-image($theme-name, 'tree/leaf.gif');
+    }
+
+    .#{$prefix}tree-icon-parent {
+        width: $tree-elbow-width;
+        background-image: theme-background-image($theme-name, 'tree/folder.gif');
+    }
+    
+    .#{$prefix}grid-tree-node-expanded .#{$prefix}tree-icon-parent {
+        background-image: theme-background-image($theme-name, 'tree/folder-open.gif');
+    }
+    
+    .#{$prefix}grid-rowbody {
+        padding: 0;
+    }
+    
+    .#{$prefix}tree-panel .#{$prefix}grid-cell-inner {
+        padding: 0px;
+    }
+
+    .#{$prefix}tree-panel .#{$prefix}grid-row .#{$prefix}grid-cell {
+        border: none;
+    }
+    
+    .#{$prefix}tree-panel .#{$prefix}grid-row .#{$prefix}grid-cell-inner {
+        height: $tree-elbow-height;
+        
+        line-height: $tree-elbow-height;
+        cursor: pointer;
+        white-space: nowrap;
+        vertical-align: middle;
+        
+        img {
+            margin-top: 0;
+            display: inline-block;
+            vertical-align: top;
+        }
+    }
+    
+    .#{$prefix}tree-checkbox {
+        margin: 2px 3px 0 0;
+        display: inline-block;
+        vertical-align: top;
+
+        width: $form-checkbox-size;
+        height: $form-checkbox-size;
+        background: no-repeat;
+        background-image: theme-background-image($theme-name, $form-checkbox-image);
+
+        overflow: hidden;
+        padding: 0;
+        border: 0;
+        &::-moz-focus-inner {
+            padding: 0;
+            border: 0;
+        }
+    }
+
+    @if $include-ie {
+        /* Hack for IE; causes alignment problem in IE9 standards mode so exclude that */
+        .#{$prefix}nbr.#{$prefix}ie {
+            .#{$prefix}tree-checkbox {
+                font-size: 0;
+            }
+        }
+    }
+    .#{$prefix}tree-checkbox-checked {
+        background-position: 0 (0 - $form-checkbox-size);
+    }
+
+    @if $include-ie {
+        .#{$prefix}tree-panel .#{$prefix}grid-cell-inner {
+            border-width: 0 !important;
+        }
+
+        .#{$prefix}ie6 .#{$prefix}tree-panel .#{$prefix}grid-row .#{$prefix}grid-cell-inner img,
+        .#{$prefix}quirks .#{$prefix}ie .#{$prefix}tree-panel .#{$prefix}grid-row .#{$prefix}grid-cell-inner img {
+            margin-top: -1px;
+            vertical-align: middle;
+        }
+        .#{$prefix}strict .#{$prefix}ie7 .#{$prefix}tree-panel .#{$prefix}grid-row .#{$prefix}grid-cell-inner img {
+            margin-top: -3px;
+            vertical-align: middle;
+        }
+        .#{$prefix}ie6 .#{$prefix}tree-checkbox,
+        .#{$prefix}quirks .#{$prefix}ie7 .#{$prefix}tree-checkbox {
+            margin-top: 0;
+            vertical-align: middle;
+        }
+        .#{$prefix}strict .#{$prefix}ie7 .#{$prefix}tree-checkbox {
+            margin-top: -2px;
+            vertical-align: middle;
+        }
+    }
+    
+    @if $include-ff {
+        .#{$prefix}gecko {
+            .#{$prefix}tree-panel .#{$prefix}grid-row .#{$prefix}grid-cell-inner {
+                line-height: $tree-elbow-height - 2;
+            }
+        }
+    }
+    
+    .#{$prefix}tree-drop-ok-append .#{$prefix}dd-drop-icon {
+        background-image: theme-background-image($theme-name, 'tree/drop-append.gif');
+    }
+
+    .#{$prefix}tree-drop-ok-above .#{$prefix}dd-drop-icon {
+        background-image: theme-background-image($theme-name, 'tree/drop-above.gif');
+    }
+
+    .#{$prefix}tree-drop-ok-below .#{$prefix}dd-drop-icon {
+        background-image: theme-background-image($theme-name, 'tree/drop-below.gif');
+    }
+
+    .#{$prefix}tree-drop-ok-between .#{$prefix}dd-drop-icon {
+        background-image: theme-background-image($theme-name, 'tree/drop-between.gif');
+    }
+    
+    .#{$prefix}grid-tree-loading .#{$prefix}tree-icon {
+        background-image: theme-background-image($theme-name, 'tree/loading.gif');
+    }
+
+    .#{$prefix}tree-ddindicator {
+        height: 1px;
+        border-width: 1px 0px 0px;
+        border-style: dotted;
+        border-color: green;
+    }
+        
+    .#{$prefix}grid-tree-loading span {
+    	 font-style: italic;
+    	 color: #444444;
+    }
+    
+    .#{$prefix}tree-animator-wrap {
+        overflow: hidden;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_viewport.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_viewport.scss
new file mode 100755
index 0000000..5f1bf93
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_viewport.scss
@@ -0,0 +1,9 @@
+ at mixin extjs-viewport {
+    .#{$prefix}viewport, .#{$prefix}viewport body {
+        margin: 0;
+        padding: 0;
+        border: 0 none;
+        overflow: hidden;
+        height: 100%;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_window.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_window.scss
new file mode 100755
index 0000000..7479d6f
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/_window.scss
@@ -0,0 +1,179 @@
+ at mixin extjs-window {
+    .#{$prefix}window {
+        outline: none;
+        
+        .#{$prefix}window-wrap {
+            position: relative;
+
+            .#{$prefix}window-body {
+                overflow: hidden;
+            }
+        }
+    }
+    
+    .#{$prefix}window-body {
+        position: relative;
+        border-style: $window-body-border-style;
+    }
+
+    //maximized window
+    .#{$prefix}window-maximized {
+        .#{$prefix}window-wrap {
+            .#{$prefix}window-header {
+                @include important-no-border-radius;
+            }
+        }
+    }
+    
+    // collapsed window header styles
+    .#{$prefix}window-collapsed {
+        .#{$prefix}window-header-vertical {
+            @include border-radius(5px);
+        }
+        .#{$prefix}window-header-horizontal {
+            @include border-radius(5px);
+        }
+
+        // Padding changes for collapsed headers.
+        .#{$prefix}window-header-left {
+            padding-right: 5px !important;
+        }
+        
+        .#{$prefix}window-header-right {
+            padding-left: 5px !important;
+        }
+        
+        .#{$prefix}window-header-top {
+            padding-bottom: 5px !important;
+        }
+        
+        .#{$prefix}window-header-bottom {
+            padding-top: 5px !important;
+        }
+    }
+    
+    .#{$prefix}window-header-left,
+    .#{$prefix}window-header-right {
+        .#{$prefix}vml-base {
+            left: -3px !important;
+        }
+    }
+
+    .#{$prefix}window-header-text {
+        @include no-select;
+        white-space: nowrap;
+        display: block;
+    }
+    
+    @include extjs-window-ui(
+        'default',
+        
+        $ui-border-radius: $window-border-radius,
+        $ui-border-color: $window-border-color,
+        $ui-inner-border-color: $window-inner-border-color,
+
+        $ui-header-color: $window-header-color,
+
+        $ui-body-border-color: $window-body-border-color,
+        $ui-body-background-color: $window-body-background-color,
+        $ui-body-color: $window-body-color,
+
+        $ui-background-color: $window-background-color
+    );
+    
+    .#{$prefix}window-body-plain {
+        background: transparent;
+    }
+}
+
+/**
+  * @class Ext.Window
+  * Used to create a visual theme for an Ext.Panel
+  */
+ at mixin extjs-window-ui(
+    $ui-label,
+    
+    $ui-padding: null,
+    $ui-border-radius: null,
+    $ui-border-color: null,
+    $ui-inner-border-color: null,
+    
+    $ui-header-color: null,
+    $ui-header-font-size: $window-header-font-size,
+    $ui-header-font-weight: $window-header-font-weight,
+    
+    $ui-body-border-color: null,
+    $ui-body-background-color: null,
+    $ui-body-color: null,
+    
+    $ui-background-color: null
+){
+    $ui-header-text-height: round($ui-header-font-size * 1.46); // 11px / 16px
+    
+    .#{$prefix}window-#{$ui-label} {
+        @if $ui-border-color != null { border-color: $ui-border-color; }
+        @if $ui-border-radius != null { @include border-radius($ui-border-radius); }
+        
+        @if $ui-inner-border-color != null { @include inner-border($window-inner-border-width, $ui-inner-border-color); }
+    }
+    
+    @if $ui-border-radius != null {
+        @include x-frame(
+            'window',
+            $ui-label,
+        
+            $border-radius: $ui-border-radius,
+            $border-width: $window-border-width,
+            $padding: $ui-padding,
+            $background-color: $ui-background-color
+        );
+    }
+    
+    .#{$prefix}window-body-#{$ui-label} {
+        @if $ui-body-border-color !=null {
+            border-color: $ui-body-border-color;
+            border-width: $window-body-border-width;
+        }
+        
+        @if $ui-body-background-color != null { background: $ui-body-background-color; }
+        @if $ui-body-color != null { color: $ui-body-color; }
+    }
+    
+    .#{$prefix}window-header-#{$ui-label} {
+        @if $ui-border-color != null { border-color: $ui-border-color; }
+        zoom:1;
+    }
+    
+    .#{$prefix}window-header-text-#{$ui-label} {
+        @if $ui-header-color != null { color: $ui-header-color; }
+        @if $ui-header-font-weight != null { font-weight: $ui-header-font-weight; }
+        
+        line-height: $ui-header-text-height;
+        
+        font-family: $font-family;
+        font-size: $ui-header-font-size;
+    }
+    
+    @if $ui-border-radius != null {
+        @include x-frame('window-header', '#{$ui-label}-top',    top($ui-border-radius) right($ui-border-radius) 0 0, $window-border-width, 5px 5px 0, $ui-background-color);
+        @include x-frame('window-header', '#{$ui-label}-right',  0 right($ui-border-radius) bottom($ui-border-radius) 0, $window-border-width, 5px 5px 5px 0, $ui-background-color);
+        @include x-frame('window-header', '#{$ui-label}-bottom', 0 0 bottom($ui-border-radius) left($ui-border-radius), $window-border-width, 0 5px 5px, $ui-background-color);
+        @include x-frame('window-header', '#{$ui-label}-left',   top($ui-border-radius) 0 0 left($ui-border-radius), $window-border-width, 5px 0px 5px 5px, $ui-background-color);
+    }
+    
+    .#{$prefix}window-header-#{$ui-label}-top {
+        @include inner-border(1px 1px 0, $ui-inner-border-color);
+    }
+
+    .#{$prefix}window-header-#{$ui-label}-right {
+        @include inner-border(1px 1px 1px 0, $ui-inner-border-color);
+    }
+
+    .#{$prefix}window-header-#{$ui-label}-bottom {
+        @include inner-border(0px 1px 1px, $ui-inner-border-color);
+    }
+
+    .#{$prefix}window-header-#{$ui-label}-left {
+        @include inner-border(1px 0 1px 1px, $ui-inner-border-color);
+    }
+}
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_all.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_all.scss
new file mode 100755
index 0000000..977a34a
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_all.scss
@@ -0,0 +1,75 @@
+ at mixin extjs-form {
+    /*misc*/
+    .#{$prefix}webkit {
+        * {
+            &:focus {
+                outline:none !important;
+            }
+        }
+    }
+    
+    //form items
+    .#{$prefix}form-item {
+        display: block;
+        zoom: 1;
+        position: relative;
+        margin-bottom: 5px;
+    }
+    
+    .#{$prefix}form-item-label {
+        float: left;
+        padding: 3px 0 0;
+        z-index: 2;
+        position: relative;
+        font-size: $form-label-font-size;
+        @include no-select;
+    }
+
+    .#{$prefix}form-item-label-top {
+        float: none;
+        clear: none;
+        padding: 0;
+        display: block;
+    }
+
+    .#{$prefix}form-item-label-right {
+        float: left;
+        text-align: right;
+    }
+
+    .#{$prefix}form-item-body {
+        position: relative;
+        float: left;
+    }
+
+    .#{$prefix}form-invalid-under {
+        padding: 2px 2px 2px 18px;
+        clear: left;
+
+        color: $form-error-msg-color;
+        font: $form-error-msg-font;
+        line-height: $form-error-msg-line-height;
+
+        background: no-repeat 0 2px;
+        background-image: theme-background-image($theme-name, $form-exclamation-icon);
+    }
+    
+    .#{$prefix}form-invalid-icon {
+        width: 18px;
+        height: 18px;
+        overflow: hidden;
+        text-indent: -9999px;
+        
+        position: absolute;
+        left: 0;
+        top: 0;
+        
+        background: no-repeat 2px 3px;
+        background-image: theme-background-image($theme-name, $form-exclamation-icon);
+
+        ul {
+            /* prevent inner elements from interfering with QuickTip hovering */
+            display: none;
+        }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_checkbox.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_checkbox.scss
new file mode 100755
index 0000000..56bec9c
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_checkbox.scss
@@ -0,0 +1,65 @@
+ at mixin extjs-form-checkboxfield {
+    .#{$prefix}form-cb-wrap {
+        padding-top: 3px;
+    }
+
+    .#{$prefix}form-checkbox,
+    .#{$prefix}form-radio {
+        float: none;
+        vertical-align: -1px;
+
+        width: $form-checkbox-size;
+        height: $form-checkbox-size;
+        background: no-repeat;
+        background-image: theme-background-image($theme-name, $form-checkbox-image);
+
+        overflow: hidden;
+        padding: 0;
+        border: 0;
+        &::-moz-focus-inner {
+            padding: 0;
+            border: 0;
+        }
+    }
+    @if $include-ie {
+        /* Hack for IE; causes alignment problem in IE9 standards mode so exclude that */
+        .#{$prefix}nbr.#{$prefix}ie {
+            .#{$prefix}form-checkbox,
+            .#{$prefix}form-radio {
+                font-size: 0;
+            }
+        }
+    }
+    .#{$prefix}form-cb-checked {
+        .#{$prefix}form-checkbox,
+        .#{$prefix}form-radio {
+            background-position: 0 (0 - $form-checkbox-size);
+        }
+    }
+
+    /* Focused */
+    .#{$prefix}form-cb-focus {
+        background-position: (0 - $form-checkbox-size) 0;
+    }
+    .#{$prefix}form-cb-checked {
+        .#{$prefix}form-cb-focus {
+            background-position: (0 - $form-checkbox-size) (0 - $form-checkbox-size);
+        }
+    }
+
+    /* Radios */
+    .#{$prefix}form-radio {
+        background-image: theme-background-image($theme-name, $form-radio-image);
+    }
+
+    /* boxLabel */
+    .#{$prefix}form-cb-label-before {
+        margin-right: 4px;
+    }
+    .#{$prefix}form-cb-label-after {
+        margin-left: 4px;
+    }
+
+    
+
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_checkboxgroup.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_checkboxgroup.scss
new file mode 100755
index 0000000..e720538
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_checkboxgroup.scss
@@ -0,0 +1,31 @@
+ at mixin extjs-form-checkboxgroup {
+
+    .#{$prefix}form-checkboxgroup-body {
+        //padding: 3px 4px;
+    }
+
+    .#{$prefix}form-invalid {
+        .#{$prefix}form-checkboxgroup-body {
+            border: 1px solid #c30;
+            background: #fff repeat-x bottom;
+            background-image: theme-background-image($theme-name, 'grid/invalid_line.gif');
+            padding: 2px 3px;
+        }
+    }
+    
+    .#{$prefix}check-group-alt {
+        background: adjust-color($base-color, $hue: 2.667deg, $saturation: -7.168%, $lightness: 3.725%);
+        
+        border-top:1px dotted adjust-color($base-color, $hue: 17.193deg, $saturation: -40.827%, $lightness: -9.412%);
+        border-bottom:1px dotted adjust-color($base-color, $hue: 17.193deg, $saturation: -40.827%, $lightness: -9.412%);
+    }
+
+    .#{$prefix}form-check-group-label {
+        color: #333;
+        
+        border-bottom: 1px solid #333;
+        
+        margin: 0 30px 5px 0;
+        padding: 2px;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_field.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_field.scss
new file mode 100755
index 0000000..4f1df54
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_field.scss
@@ -0,0 +1,125 @@
+ at mixin extjs-form-field {
+    .#{$prefix}form-field,
+    .#{$prefix}form-display-field {
+        float: left;
+        
+        margin: 0 0 0 0;
+        
+        font: $form-field-font;
+        color: $form-field-color;
+    }
+    
+    .#{$prefix}form-text,
+    textarea.#{$prefix}form-field {
+        padding: $form-field-padding;
+        
+        background: repeat-x 0 0;
+        border: $form-field-border-width solid;
+        
+        background-color: $form-field-background-color;
+        @if $form-field-background-image {
+            background-image: theme-background-image($theme-name, $form-field-background-image);
+        }
+        
+        border-color: $form-field-border-color;
+    }
+    
+    $form-field-content-height: $form-field-height - top($form-field-padding) - top($form-field-border-width) - bottom($form-field-padding) - bottom($form-field-border-width);
+
+    .#{$prefix}form-text {
+        height: $form-field-content-height;
+        line-height: $form-field-content-height;
+        vertical-align: middle;
+    }
+    
+    .#{$prefix}ie6,
+    .#{$prefix}ie7,
+    .#{$prefix}ie8 {
+        .#{$prefix}form-text {
+            line-height: $form-field-content-height - 3px;
+        }
+    }
+
+    .#{$prefix}border-box .#{$prefix}form-text {
+        height: $form-field-height;
+    }
+
+    textarea.#{$prefix}form-field {
+        color: $form-field-color;
+        overflow: auto;
+        height: auto;
+        line-height: normal;
+        background: repeat-x 0 0;
+        background-color: $form-field-background-color;
+        @if $form-field-background-image {
+            background-image: theme-background-image($theme-name, $form-field-background-image);
+        }
+        resize: none; //Disable browser resizable textarea
+    }
+
+    .#{$prefix}border-box textarea.#{$prefix}form-field {
+        height: auto;
+    }
+
+    @if $include-safari {
+        .#{$prefix}safari.#{$prefix}mac textarea.#{$prefix}form-field {
+            margin-bottom: -2px; // another bogus margin bug, safari/mac only
+        }
+    }
+
+    .#{$prefix}form-focus,
+    textarea.#{$prefix}form-focus {
+  	  	border-color: $form-field-focus-border-color;
+    }
+    
+    .#{$prefix}form-invalid-field,
+    textarea.#{$prefix}form-invalid-field {
+        background-color: $form-field-invalid-background-color;
+        @if $form-field-invalid-background-image {
+            background-image: theme-background-image($theme-name, $form-field-invalid-background-image);
+            background-repeat: $form-field-invalid-background-repeat;
+            background-position: $form-field-invalid-background-position;
+        }
+        border-color: $form-field-invalid-border-color;
+    }
+    
+    .#{$prefix}form-item {
+        font: $form-label-font;
+    }
+
+    .#{$prefix}form-empty-field, textarea.#{$prefix}form-empty-field {
+        color: $form-field-empty-color;
+    }
+    
+    .#{$prefix}webkit {
+        .#{$prefix}form-empty-field {
+            line-height: 15px;
+        }
+    }
+    
+    .#{$prefix}form-display-field {
+        padding-top: 3px;
+    }
+
+    @if $include-ie {
+        .#{$prefix}ie .#{$prefix}form-file {
+            height: $form-field-height + 1;
+
+            line-height: 18px;
+
+            vertical-align: middle;
+        }
+    }
+    
+    .#{$prefix}field-default-toolbar .#{$prefix}form-text {
+        height: $form-toolbar-field-height - vertical($form-field-padding) - vertical($form-field-border-width);
+    }
+    
+    .#{$prefix}border-box .#{$prefix}field-default-toolbar .#{$prefix}form-text {
+        height: $form-toolbar-field-height;
+    }
+    
+    .#{$prefix}field-default-toolbar .#{$prefix}form-item-label-left {
+        padding-left: 4px;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_fieldset.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_fieldset.scss
new file mode 100755
index 0000000..c354d16
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_fieldset.scss
@@ -0,0 +1,109 @@
+ at mixin extjs-form-fieldset {
+    .#{$prefix}fieldset {
+        border: $fieldset-border;
+        
+        padding: 0 $fieldset-padding;
+        margin-bottom: $fieldset-padding;
+        
+        display: block; /* preserve margins in IE */
+    }
+    
+    .#{$prefix}ie .#{$prefix}fieldset {
+        padding-top: 0;
+        padding-bottom: $fieldset-padding;
+    }
+    
+    .#{$prefix}fieldset-header {
+        font: $fieldset-header-font;
+        color: $fieldset-header-color;
+        padding: $fieldset-header-padding;
+        line-height: 16px;
+
+        .#{$prefix}fieldset-header-text {
+            float: left;
+        }
+        
+        .#{$prefix}form-item,
+        .#{$prefix}tool {
+            float: left;
+            margin: 0 3px 0 0;
+        }
+
+        .#{$prefix}form-cb-wrap {
+            padding: 0;
+        }
+    }
+
+    .#{$prefix}webkit .#{$prefix}fieldset-header {
+        padding-top: 1px;
+    }
+
+    @if $include-ie {
+        .#{$prefix}quirks .#{$prefix}ie .#{$prefix}fieldset-header,
+        .#{$prefix}ie6 .#{$prefix}fieldset-header,
+        .#{$prefix}ie7 .#{$prefix}fieldset-header,
+        .#{$prefix}ie8 .#{$prefix}fieldset-header {
+            padding: 0;
+        }
+
+        .#{$prefix}ie9 .#{$prefix}fieldset-header {
+            padding-top: 1px;
+        }
+    }
+    
+    .#{$prefix}fieldset-collapsed {
+        .#{$prefix}fieldset-body {
+            display: none;
+        }
+    }
+
+    .#{$prefix}fieldset-collapsed {
+        padding-bottom: 0 !important;
+        
+        border-width: 1px 1px 0 1px !important;
+        border-left-color: transparent !important;
+        border-right-color: transparent !important;
+    }
+
+    @if $include-ie {
+        .#{$prefix}ie6 .#{$prefix}fieldset-collapsed {
+            border-width: 1px 0 0 0 !important;
+
+            padding-bottom: 0 !important;
+            margin-left: 1px;
+            margin-right: 1px;
+        }
+
+        .#{$prefix}ie .#{$prefix}fieldset-bwrap {
+            zoom: 1;
+        }
+    }
+
+    @if $include-ie {
+        /* IE legend positioning bug */
+        .#{$prefix}ie .#{$prefix}fieldset-noborder legend {
+            position: relative;
+
+            margin-bottom: 23px;
+        }
+
+        .#{$prefix}ie .#{$prefix}fieldset-noborder legend span {
+            position: absolute;
+            left: 16px;
+        }
+    }
+    
+    .#{$prefix}fieldset {
+        overflow: hidden;
+    }
+
+    .#{$prefix}fieldset-bwrap {
+        overflow: hidden;
+        
+        zoom: 1;
+    }
+
+    .#{$prefix}fieldset-body {
+        overflow: hidden;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_file.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_file.scss
new file mode 100755
index 0000000..3f83ea2
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_file.scss
@@ -0,0 +1,32 @@
+ at mixin extjs-form-file {
+
+    .#{$prefix}form-file-wrap {
+        .#{$prefix}form-text {
+            color: #777;
+        }
+
+        .#{$prefix}form-file-btn {
+            overflow: hidden;
+            float: left;
+        }
+
+        .#{$prefix}form-file-input {
+            position: absolute;
+            top: -4px;
+            right: -2px;
+            height: $form-field-height + 8;
+            @include opacity(0);
+
+            /* Yes, there's actually a good reason for this...
+             * If the configured buttonText is set to something longer than the default,
+             * then it will quickly exceed the width of the hidden file input's "Browse..."
+             * button, so part of the custom button's clickable area will be covered by
+             * the hidden file input's text box instead. This results in a text-selection
+             * mouse cursor over that part of the button, at least in Firefox, which is
+             * confusing to a user. Giving the hidden file input a huge font-size makes
+             * the native button part very large so it will cover the whole clickable area.
+             */
+            font-size: 100px;
+        }
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_htmleditor.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_htmleditor.scss
new file mode 100755
index 0000000..ed4d798
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_htmleditor.scss
@@ -0,0 +1,124 @@
+ at mixin extjs-form-htmleditor {
+    .#{$prefix}html-editor-wrap {
+        border: 1px solid $html-editor-border-color;
+        
+        .#{$prefix}toolbar {
+            border-top-width: 0;
+            border-left-width: 0;
+            border-right-width: 0;
+        }
+        
+        textarea {
+            background-color: $html-editor-background-color;
+        }
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}btn-text {
+        background:transparent no-repeat;
+        background-image:theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-bold,
+    .#{$prefix}menu-item img.#{$prefix}edit-bold {
+        background-position:0 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');    
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-italic,
+    .#{$prefix}menu-item img.#{$prefix}edit-italic {
+        background-position:-16px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-underline,
+    .#{$prefix}menu-item img.#{$prefix}edit-underline {
+        background-position:-32px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-forecolor,
+    .#{$prefix}menu-item img.#{$prefix}edit-forecolor {
+        background-position:-160px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-backcolor,
+    .#{$prefix}menu-item img.#{$prefix}edit-backcolor {
+        background-position:-176px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-justifyleft,
+    .#{$prefix}menu-item img.#{$prefix}edit-justifyleft {
+        background-position:-112px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-justifycenter,
+    .#{$prefix}menu-item img.#{$prefix}edit-justifycenter {
+        background-position:-128px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-justifyright,
+    .#{$prefix}menu-item img.#{$prefix}edit-justifyright {
+        background-position:-144px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-insertorderedlist,
+    .#{$prefix}menu-item img.#{$prefix}edit-insertorderedlist {
+        background-position:-80px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-insertunorderedlist,
+    .#{$prefix}menu-item img.#{$prefix}edit-insertunorderedlist {
+        background-position:-96px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-increasefontsize,
+    .#{$prefix}menu-item img.#{$prefix}edit-increasefontsize {
+        background-position:-48px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-decreasefontsize,
+    .#{$prefix}menu-item img.#{$prefix}edit-decreasefontsize {
+        background-position:-64px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-sourceedit,
+    .#{$prefix}menu-item img.#{$prefix}edit-sourceedit {
+        background-position:-192px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tb .#{$prefix}edit-createlink,
+    .#{$prefix}menu-item img.#{$prefix}edit-createlink {
+        background-position: -208px 0;
+        background-image: theme-background-image($theme-name, 'editor/tb-sprite.gif');
+    }
+
+    .#{$prefix}html-editor-tip .#{$prefix}tip-bd .#{$prefix}tip-bd-inner {
+        padding: 5px;
+        padding-bottom: 1px;
+    }
+
+    .#{$prefix}html-editor-tb {
+        .#{$prefix}toolbar {
+            position: static !important;
+        }
+        .#{$prefix}font-select {
+            font-size: 11px;
+        }
+    }
+
+    .x-html-editor-wrap textarea {
+        border: 0;
+        padding: 3px 2px;
+        overflow: auto;
+    }
+}
\ No newline at end of file
diff --git a/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_triggerfield.scss b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_triggerfield.scss
new file mode 100755
index 0000000..9464ace
--- /dev/null
+++ b/interface/ext/resources/themes/stylesheets/ext4/default/widgets/form/_triggerfield.scss
@@ -0,0 +1,162 @@
+ at mixin extjs-form-triggerfield {
+	.#{$prefix}form-trigger-wrap {
+        float: left;
+    }
+    
+    .#{$prefix}form-trigger {
+        background-image: theme-background-image($theme-name, 'form/trigger.gif');
+		background-position: 0 0;
+		
+		width: $form-trigger-width;
+		height: $form-trigger-height - $form-trigger-border-bottom-width;
+		float: left;
+
+		border-bottom: $form-trigger-border-bottom;
+
+        cursor: pointer;
+        cursor: hand;
+    }
+
+    .#{$prefix}border-box .#{$prefix}form-trigger {
+        height: $form-trigger-height;
+    }
+
+    .#{$prefix}field-default-toolbar .#{$prefix}form-trigger {
+        height: $form-toolbar-trigger-height - $form-trigger-border-bottom-width;
+    }
+
+    .#{$prefix}border-box .#{$prefix}field-default-toolbar .#{$prefix}form-trigger {
+        height: $form-toolbar-trigger-height;
+    }
+
+    
+    .#{$prefix}form-trigger-over {
+		background-position: -$form-trigger-width 0;
+
+		border-bottom-color: $form-trigger-border-bottom-color-over;
+    }
+    
+    .#{$prefix}form-trigger-wrap-focus .#{$prefix}form-trigger {
+		background-position: -($form-trigger-width * 3) 0;
+
+		border-bottom-color: $form-trigger-border-bottom-color-focus;
+    }
+    
+    .#{$prefix}form-trigger-wrap-focus .#{$prefix}form-trigger-over {
+        background-position: -($form-trigger-width * 4) 0;
+        
+        @if $form-trigger-border-bottom-color-focus-over {
+            border-bottom-color: $form-trigger-border-bottom-color-focus-over;
+        }
+    }
+    
+    .#{$prefix}form-trigger-click,
+    .#{$prefix}form-trigger-wrap-focus .#{$prefix}form-trigger-click {
+		background-position: -($form-trigger-width * 2) 0;
+		
+		@if $form-trigger-border-bottom-color-pressed {
+    		border-bottom-color: $form-trigger-border-bottom-color-pressed;
+    	}
+    }
+
+    .#{$prefix}form-trigger-icon {
+        height: $form-trigger-width - $form-trigger-border-bottom-width;
+        
+        background-repeat: no-repeat;
+        background-position: $form-trigger-icon-background-position;
+    }
+    
+    .#{$prefix}pickerfield-open {
+        .#{$prefix}form-field {
+            @include border-bottom-radius(0);
+        }
+    }
+    
+    .#{$prefix}pickerfield-open-above {
+        .#{$prefix}form-field {
+            @include border-bottom-left-radius(3px);
+            @include border-top-radius(0);
+        }
+    }
+    
+    .#{$prefix}form-arrow-trigger {
+        .#{$prefix}form-trigger-icon {
+            background-image: theme-background-image($theme-name, 'boundlist/trigger-arrow.png');
+        }
+    }
+    
+    .#{$prefix}form-date-trigger {
+        background-image: theme-background-image($theme-name, 'form/date-trigger.gif');
+    }
+
+    $spinner-btn-height: $form-trigger-height / 2;
+    .#{$prefix}form-trigger-wrap {
+        .#{$prefix}form-spinner-up,
+        .#{$prefix}form-spinner-down {
+            background-image: theme-background-image($theme-name, 'form/spinner.gif');
+
+            width: $form-trigger-width !important;
+            height: $spinner-btn-height !important;
+
+            font-size: 0; /*for IE*/
+
+            border-bottom: 0;
+        }
+        .#{$prefix}form-spinner-down {
+            background-position: 0 (-$spinner-btn-height);
+        }
+    }
+    .#{$prefix}form-trigger-wrap-focus .#{$prefix}form-spinner-down {
+        background-position: -($form-trigger-width * 3) (-$spinner-btn-height);
+    }
+    .#{$prefix}form-trigger-wrap .#{$prefix}form-spinner-down-over {
+        background-position: (-$form-trigger-width) (-$spinner-btn-height);
+    }
+    .#{$prefix}form-trigger-wrap-focus .#{$prefix}form-spinner-down-over {
+        background-position: -($form-trigger-width * 4) (-$spinner-btn-height);
+    }
+    .#{$prefix}form-trigger-wrap .#{$prefix}form-spinner-down-click {
+        background-position: -($form-trigger-width * 2) (-$spinner-btn-height);
+    }
+
+
+    .#{$prefix}field-default-toolbar {
+        $spinner-btn-height: $form-toolbar-trigger-height / 2;
+        .#{$prefix}form-trigger-wrap {
+            .#{$prefix}form-spinner-up,
+            .#{$prefix}form-spinner-down {
+               background-image: theme-background-image($theme-name, 'form/spinner-small.gif');
+                height: $spinner-btn-height !important;
+            }
+            .#{$prefix}form-spinner-down {
+                background-position: 0 (-$spinner-btn-height);
+            }
+        }
+        .#{$prefix}form-trigger-wrap-focus .#{$prefix}form-spinner-down {
+            background-position: -($form-trigger-width * 3) (-$spinner-btn-height);
+        }
+        .#{$prefix}form-trigger-wrap .#{$prefix}form-spinner-down-over {
+            background-position: (-$form-trigger-width) (-$spinner-btn-height);
+        }
+        .#{$prefix}form-trigger-wrap-focus .#{$prefix}form-spinner-down-over {
+            background-position: -($form-trigger-width * 4) (-$spinner-btn-height);
+        }
+        .#{$prefix}form-trigger-wrap .#{$prefix}form-spinner-down-click {
+            background-position: -($form-trigger-width * 2) (-$spinner-btn-height);
+        }
+    }
+
+
+    .#{$prefix}trigger-noedit {
+        cursor: pointer;
+        cursor: hand;
+    }
+
+
+    .#{$prefix}form-clear-trigger {
+        background-image: theme-background-image($theme-name, 'form/clear-trigger.gif');
+    }
+    .#{$prefix}form-search-trigger {
+        background-image: theme-background-image($theme-name, 'form/search-trigger.gif');
+    }
+}
diff --git a/interface/ext/resources/themes/templates/resources/sass/config.rb b/interface/ext/resources/themes/templates/resources/sass/config.rb
new file mode 100755
index 0000000..77db7d4
--- /dev/null
+++ b/interface/ext/resources/themes/templates/resources/sass/config.rb
@@ -0,0 +1,20 @@
+# $ext_path: This should be the path of the Ext JS SDK relative to this file
+$ext_path = "../../extjs"
+
+# sass_path: the directory your Sass files are in. THIS file should also be in the Sass folder
+# Generally this will be in a resources/sass folder
+# <root>/resources/sass
+sass_path = File.dirname(__FILE__)
+
+# css_path: the directory you want your CSS files to be.
+# Generally this is a folder in the parent directory of your Sass files
+# <root>/resources/css
+css_path = File.join(sass_path, "..", "css")
+
+# output_style: The output style for your compiled CSS
+# nested, expanded, compact, compressed
+# More information can be found here http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#output_style
+output_style = :compressed
+
+# We need to load in the Ext4 themes folder, which includes all it's default styling, images, variables and mixins
+load File.join(File.dirname(__FILE__), $ext_path, 'resources', 'themes')
diff --git a/interface/ext/resources/themes/templates/resources/sass/my-ext-theme.scss b/interface/ext/resources/themes/templates/resources/sass/my-ext-theme.scss
new file mode 100755
index 0000000..ba9ab97
--- /dev/null
+++ b/interface/ext/resources/themes/templates/resources/sass/my-ext-theme.scss
@@ -0,0 +1,45 @@
+// Unless you want to include all components, you must set $include-default to false
+// IF you set this to true, you can also remove lines 10 to 38 of this file
+$include-default: false;
+
+// Insert your custom variables here.
+// $base-color: #aa0000;
+
+ at import 'ext4/default/all';
+
+// You may remove any of the following modules that you
+// do not use in order to create a smaller css file.
+ at include extjs-boundlist;
+ at include extjs-button;
+ at include extjs-btn-group;
+ at include extjs-datepicker;
+ at include extjs-colorpicker;
+ at include extjs-menu;
+ at include extjs-grid;
+ at include extjs-form;
+    @include extjs-form-field;
+    @include extjs-form-fieldset;
+    @include extjs-form-file;
+    @include extjs-form-checkboxfield;
+    @include extjs-form-checkboxgroup;
+    @include extjs-form-triggerfield;
+    @include extjs-form-htmleditor;
+ at include extjs-panel;
+ at include extjs-qtip;
+ at include extjs-slider;
+ at include extjs-progress;
+ at include extjs-toolbar;
+ at include extjs-window;
+ at include extjs-messagebox;
+ at include extjs-tabbar;
+ at include extjs-tab;
+ at include extjs-tree;
+ at include extjs-drawcomponent;
+ at include extjs-viewport;
+
+// This line changes the location of your images when creating UIs to be relative instead of within the ExtJS directory.
+// You MUST set this to true/string value if you are creating new UIs + supporting legacy browsers.
+// This only applies to new UIs. It does not apply to default component images (i.e. when changing $base-color)
+// The value can either be true, in which case the image path will be "../images/"
+// or a string, of where the path is
+$relative-image-path-for-uis: true; // defaults to "../images/" when true
\ No newline at end of file
diff --git a/interface/favicon.ico b/interface/favicon.ico
new file mode 100755
index 0000000..55b2ec6
Binary files /dev/null and b/interface/favicon.ico differ
diff --git a/interface/images/eye-grey.png b/interface/images/eye-grey.png
new file mode 100755
index 0000000..3030f79
Binary files /dev/null and b/interface/images/eye-grey.png differ
diff --git a/interface/images/eye.png b/interface/images/eye.png
new file mode 100755
index 0000000..5c93dfe
Binary files /dev/null and b/interface/images/eye.png differ
diff --git a/interface/images/eye.xcf b/interface/images/eye.xcf
new file mode 100755
index 0000000..af75caf
Binary files /dev/null and b/interface/images/eye.xcf differ
diff --git a/interface/images/forbidden.png b/interface/images/forbidden.png
new file mode 100755
index 0000000..474114f
Binary files /dev/null and b/interface/images/forbidden.png differ
diff --git a/interface/images/header.png b/interface/images/header.png
new file mode 100755
index 0000000..2f62abf
Binary files /dev/null and b/interface/images/header.png differ
diff --git a/interface/images/icon/btn_border.png b/interface/images/icon/btn_border.png
new file mode 100755
index 0000000..6d902b9
Binary files /dev/null and b/interface/images/icon/btn_border.png differ
diff --git a/interface/images/icon/btn_border_hover.png b/interface/images/icon/btn_border_hover.png
new file mode 100755
index 0000000..6daa6c7
Binary files /dev/null and b/interface/images/icon/btn_border_hover.png differ
diff --git a/interface/images/icon/chart_bar.png b/interface/images/icon/chart_bar.png
new file mode 100755
index 0000000..9051fbc
Binary files /dev/null and b/interface/images/icon/chart_bar.png differ
diff --git a/interface/images/icon/chart_curve.png b/interface/images/icon/chart_curve.png
new file mode 100755
index 0000000..01e933a
Binary files /dev/null and b/interface/images/icon/chart_curve.png differ
diff --git a/interface/images/icon/chart_pie.png b/interface/images/icon/chart_pie.png
new file mode 100755
index 0000000..fe00fa0
Binary files /dev/null and b/interface/images/icon/chart_pie.png differ
diff --git a/interface/images/icon/clock.png b/interface/images/icon/clock.png
new file mode 100755
index 0000000..e2672c2
Binary files /dev/null and b/interface/images/icon/clock.png differ
diff --git a/interface/images/icon/database.png b/interface/images/icon/database.png
new file mode 100755
index 0000000..3d09261
Binary files /dev/null and b/interface/images/icon/database.png differ
diff --git a/interface/images/icon/ko.svg b/interface/images/icon/ko.svg
new file mode 100755
index 0000000..85edb7a
--- /dev/null
+++ b/interface/images/icon/ko.svg
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="128" height="128" id="svg4252">
+    <metadata>
+    <rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <cc:Work rdf:about="">
+        <dc:title>Delete icon</dc:title>
+        <dc:description>Red round glosy Delete icon</dc:description>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>delete</rdf:li>
+            <rdf:li>no</rdf:li>
+            <rdf:li>no access</rdf:li>
+            <rdf:li>denied</rdf:li>
+            <rdf:li>red</rdf:li>
+            <rdf:li>round</rdf:li>
+            <rdf:li>glosy</rdf:li>
+            <rdf:li>button</rdf:li>
+            <rdf:li>icon</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:publisher>
+          <cc:Agent rdf:about="http://www.openclipart.org">
+            <dc:title>Open Clip Art Library</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Jankiewicz</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:rights>
+          <cc:Agent>
+            <dc:title>Jakub Jankiewicz</dc:title>
+          </cc:Agent>
+        </dc:rights>
+        <dc:date/>
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <cc:license rdf:resource="http://web.resource.org/cc/PublicDomain"/>
+        <dc:language>pl</dc:language>
+      </cc:Work>
+      <cc:License rdf:about="http://web.resource.org/cc/PublicDomain">
+        <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+      </cc:License>
+    </rdf:RDF>
+    </metadata>
+    <defs id="defs4254">
+        <linearGradient x1="302.73621" y1="377.9527" x2="311.27377" y2="390.78342" id="linearGradient4206" xlink:href="#linearGradient4554" gradientUnits="userSpaceOnUse" gradientTransform="matrix(5.2961708,0,0,4.9974862,-1603.0989,-1873.1257)"/>
+        <linearGradient id="linearGradient4554">
+            <stop id="stop4556" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+            <stop id="stop4558" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="401.93405" y1="376.13748" x2="414.38986" y2="390.49332" id="linearGradient4222" xlink:href="#linearGradient4738" gradientUnits="userSpaceOnUse" gradientTransform="matrix(2.7131949,0,0,2.7134878,-1075.9729,-978.37049)"/>
+        <linearGradient id="linearGradient4738">
+            <stop id="stop4740" style="stop-color:#ffffff;stop-opacity:0.7265625" offset="0"/>
+            <stop id="stop4742" style="stop-color:#ffffff;stop-opacity:1" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="314.56537" y1="369.97995" x2="332.02466" y2="387.43924" id="linearGradient4213" xlink:href="#linearGradient4568" gradientUnits="userSpaceOnUse"/>
+        <linearGradient id="linearGradient4568">
+            <stop id="stop4570" style="stop-color:#118909;stop-opacity:1" offset="0"/>
+            <stop id="stop4572" style="stop-color:#084c06;stop-opacity:1" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="401.93405" y1="376.13748" x2="414.38986" y2="390.49332" id="linearGradient2355" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.999946,0,0,1.00005,-219.815,-158.745)"/>
+        <linearGradient x1="302.73621" y1="377.9527" x2="311.27377" y2="390.78342" id="linearGradient2352" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.9519,0,0,1.84182,-426.217,-488.523)"/>
+        <linearGradient x1="302.73621" y1="377.9527" x2="311.27377" y2="390.78342" id="linearGradient2347" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.9519,0,0,1.84182,-341.04,-488.523)"/>
+        <linearGradient x1="786.64636" y1="302.44009" x2="818.39136" y2="338.76443" id="linearGradient2344" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.705519,0,0,0.956752,-290.58,-78.4396)"/>
+        <linearGradient x1="838.01013" y1="-320.49728" x2="909.21588" y2="-321.47269" id="linearGradient2339" xlink:href="#linearGradient4886" gradientUnits="userSpaceOnUse" gradientTransform="translate(-396.865,167.424)"/>
+        <linearGradient x1="1313.4297" y1="237.96057" x2="1333.0073" y2="258.76886" id="linearGradient2336" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.638597,0,0,1.56593,-399.067,-160.899)"/>
+        <linearGradient x1="808.12592" y1="362.58139" x2="832.68341" y2="400.04047" id="linearGradient2332" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="translate(-399.013,-162.24)"/>
+        <linearGradient x1="621.35413" y1="387.40463" x2="649.37592" y2="424.72763" id="linearGradient2328" xlink:href="#linearGradient5028" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.06143,0,0,0.942122,-312.58,-154.341)"/>
+        <linearGradient x1="714.00201" y1="328.40942" x2="745.21838" y2="359.15051" id="linearGradient2325" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.901725,0,0,1.10898,-312.58,-154.341)"/>
+        <linearGradient x1="786.64636" y1="302.44009" x2="818.39136" y2="338.76443" id="linearGradient2322" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.645848,0,0,0.875833,-151.443,-50.6101)"/>
+        <linearGradient x1="786.64636" y1="302.44009" x2="818.39136" y2="338.76443" id="linearGradient2318" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.705519,0,0,0.956752,-378.254,132.783)"/>
+        <linearGradient x1="1313.4297" y1="237.96057" x2="1333.0073" y2="258.76886" id="linearGradient2316" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.638597,0,0,1.56593,-305.377,53.8182)"/>
+        <linearGradient x1="786.64636" y1="302.44009" x2="818.39136" y2="338.76443" id="linearGradient2314" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.645848,0,0,0.875833,18.0749,154.377)"/>
+        <linearGradient x1="621.35413" y1="387.40463" x2="649.37592" y2="424.72763" id="linearGradient6125" xlink:href="#linearGradient5028" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.06143,0,0,0.942122,-143.062,50.646)"/>
+        <linearGradient id="linearGradient5028">
+            <stop id="stop5030" style="stop-color:#fffd26;stop-opacity:1" offset="0"/>
+            <stop id="stop5032" style="stop-color:#967f00;stop-opacity:1" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="714.00201" y1="328.40942" x2="745.21838" y2="359.15051" id="linearGradient6127" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.901725,0,0,1.10898,-143.062,50.646)"/>
+        <linearGradient id="linearGradient4554-6">
+            <stop id="stop4556-6" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+            <stop id="stop4558-2" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+        </linearGradient>
+        <linearGradient id="linearGradient4738-8">
+            <stop id="stop4740-5" style="stop-color:#ffffff;stop-opacity:0.72656202" offset="0"/>
+            <stop id="stop4742-1" style="stop-color:#ffffff;stop-opacity:1" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="838.01013" y1="-320.49728" x2="909.21588" y2="-321.47269" id="linearGradient3691" xlink:href="#linearGradient4886" gradientUnits="userSpaceOnUse" gradientTransform="translate(-178.788,253.002)"/>
+        <linearGradient id="linearGradient4886">
+            <stop id="stop4888" style="stop-color:#1c97e1;stop-opacity:1" offset="0"/>
+            <stop id="stop4890" style="stop-color:#006798;stop-opacity:1" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="808.12592" y1="362.58139" x2="832.68341" y2="400.04047" id="linearGradient3695" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="translate(-305.322,52.4772)"/>
+        <linearGradient x1="314.56537" y1="369.97995" x2="332.02466" y2="387.43924" id="linearGradient3709" xlink:href="#linearGradient4886" gradientUnits="userSpaceOnUse"/>
+        <linearGradient x1="302.73621" y1="377.9527" x2="311.27377" y2="390.78342" id="linearGradient3711" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.9519,0,0,1.84182,-428.714,-277.301)"/>
+        <linearGradient x1="314.56537" y1="369.97995" x2="332.02466" y2="387.43924" id="linearGradient4693" xlink:href="#linearGradient4568-0" gradientUnits="userSpaceOnUse"/>
+        <linearGradient id="linearGradient4568-0">
+            <stop id="stop4570-4" style="stop-color:#e12b1c;stop-opacity:1" offset="0"/>
+            <stop id="stop4572-0" style="stop-color:#980b00;stop-opacity:1" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="401.93405" y1="376.13748" x2="414.38986" y2="390.49332" id="linearGradient4744" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="scale(0.999946,1.00005)"/>
+        <linearGradient x1="302.73621" y1="377.9527" x2="311.27377" y2="390.78342" id="linearGradient4733" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.9519,0,0,1.84182,-206.402,-329.778)"/>
+        <linearGradient x1="786.64636" y1="302.44009" x2="818.39136" y2="338.76443" id="linearGradient3374" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.645848,0,0,0.875833,-368.71173,-205.68772)"/>
+        <linearGradient x1="714.00201" y1="328.40942" x2="745.21838" y2="359.15051" id="linearGradient3377" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.901725,0,0,1.10898,-529.84873,-309.41862)"/>
+        <linearGradient x1="621.35413" y1="387.40463" x2="649.37592" y2="424.72763" id="linearGradient3380" xlink:href="#linearGradient5028" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.06143,0,0,0.942122,-529.84873,-309.41862)"/>
+        <linearGradient x1="808.12592" y1="362.58139" x2="832.68341" y2="400.04047" id="linearGradient3384" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="translate(-616.28173,-317.31762)"/>
+        <linearGradient x1="1313.4297" y1="237.96057" x2="1333.0073" y2="258.76886" id="linearGradient3387" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.638597,0,0,1.56593,-616.33573,-315.97662)"/>
+        <linearGradient x1="838.01013" y1="-320.49728" x2="909.21588" y2="-321.47269" id="linearGradient3390" xlink:href="#linearGradient4886" gradientUnits="userSpaceOnUse" gradientTransform="translate(-660.15375,211.39981)"/>
+        <linearGradient x1="786.64636" y1="302.44009" x2="818.39136" y2="338.76443" id="linearGradient3394" xlink:href="#linearGradient4738-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.705519,0,0,0.956752,-507.84873,-233.51722)"/>
+        <linearGradient x1="302.73621" y1="377.9527" x2="311.27377" y2="390.78342" id="linearGradient3397" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.9519,0,0,1.84182,-558.30873,-643.60062)"/>
+        <linearGradient x1="302.73621" y1="377.9527" x2="311.27377" y2="390.78342" id="linearGradient3402" xlink:href="#linearGradient4554-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(4.7172872,0,0,4.4512495,-1427.8757,-1668.3879)"/>
+        <linearGradient x1="314.56537" y1="369.97995" x2="332.02466" y2="387.43924" id="linearGradient3409" xlink:href="#linearGradient4568-0" gradientUnits="userSpaceOnUse"/>
+    </defs>
+    <path d="m 339.53775,378.05789 a 13.966679,13.966679 0 1 1 -27.93335,0 13.966679,13.966679 0 1 1 27.93335,0 z" transform="matrix(4.582335,0,0,4.582335,-1427.8757,-1668.3879)" id="path4531-9" style="fill:#b4281c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.625;marker:none;visibility:visible;display:inline;overflow:visible"/>
+    <path d="m 339.53775,378.05789 a 13.966679,13.966679 0 1 1 -27.93335,0 13.966679,13.966679 0 1 1 27.93335,0 z" transform="matrix(4.1838585,0,0,4.1838585,-1298.1485,-1517.746)" id="path4533-6" style="fill:url(#linearGradient3409);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.324922;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"/>
+    <path d="m 63.960688,5.5974392 c -32.255982,0 -58.424852,26.1688238 -58.424812,58.4248068 0,15.497687 6.32454,29.346583 16.18139,39.809054 5.12077,-42.294602 40.818036,-75.178969 84.486844,-75.178969 1.17747,0 2.27081,0.23926 3.43676,0.286387 C 98.955303,15.040641 82.833921,5.5974392 63.960688,5.5974392 z" id="path4537-8" style="fill:url(#linearGradient3402);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.616072;marker:none;visibility:visible;display:inline;overflow:visible"/>
+    <path d="m 26.621866,72.59933 c -6e-5,0.76161 0.6704,1.288794 1.43196,1.28876 l 71.885412,-1.7e-5 c 0.761592,0 1.431912,-0.527251 1.431962,-1.28876 l 0,-17.183761 c 4e-5,-0.761629 -0.67035,-1.432019 -1.431978,-1.431983 l -71.885346,1.7e-5 c -0.76161,-5.3e-5 -1.43201,0.670353 -1.43196,1.431966 l 0,17.183761 -5e-5,1.7e-5 z" id="rect4574-4" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.616072;marker:none;visibility:visible;display:inline;overflow:visible"/>
+</svg>
\ No newline at end of file
diff --git a/interface/images/icon/libreoffice-extension.png b/interface/images/icon/libreoffice-extension.png
new file mode 100755
index 0000000..e960242
Binary files /dev/null and b/interface/images/icon/libreoffice-extension.png differ
diff --git a/interface/images/icon/loading_white.gif b/interface/images/icon/loading_white.gif
new file mode 100755
index 0000000..e192ca8
Binary files /dev/null and b/interface/images/icon/loading_white.gif differ
diff --git a/interface/images/icon/ok.svg b/interface/images/icon/ok.svg
new file mode 100755
index 0000000..d54faf6
--- /dev/null
+++ b/interface/images/icon/ok.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="128" height="128" id="svg4252">
+    <metadata>
+    <rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <cc:Work rdf:about="">
+        <dc:title>OK icon</dc:title>
+        <dc:description>Green round glosy OK icon</dc:description>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>ok</rdf:li>
+            <rdf:li>check</rdf:li>
+            <rdf:li>icon</rdf:li>
+            <rdf:li>green</rdf:li>
+            <rdf:li>round</rdf:li>
+            <rdf:li>glosy</rdf:li>
+            <rdf:li>button</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:publisher>
+          <cc:Agent rdf:about="http://www.openclipart.org">
+            <dc:title>Open Clip Art Library</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Jankiewicz</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:rights>
+          <cc:Agent>
+            <dc:title>Jakub Jankiewicz</dc:title>
+          </cc:Agent>
+        </dc:rights>
+        <dc:date/>
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <cc:license rdf:resource="http://web.resource.org/cc/PublicDomain"/>
+        <dc:language>pl</dc:language>
+      </cc:Work>
+      <cc:License rdf:about="http://web.resource.org/cc/PublicDomain">
+        <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+      </cc:License>
+    </rdf:RDF>
+    </metadata>
+    <defs id="defs4254">
+        <linearGradient x1="302.73621" y1="377.9527" x2="311.27377" y2="390.78342" id="linearGradient4206" xlink:href="#linearGradient4554" gradientUnits="userSpaceOnUse" gradientTransform="matrix(5.2961708,0,0,4.9974862,-1603.0989,-1873.1257)"/>
+        <linearGradient id="linearGradient4554">
+            <stop id="stop4556" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+            <stop id="stop4558" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="401.93405" y1="376.13748" x2="414.38986" y2="390.49332" id="linearGradient4222" xlink:href="#linearGradient4738" gradientUnits="userSpaceOnUse" gradientTransform="matrix(2.7131949,0,0,2.7134878,-1075.9729,-978.37049)"/>
+        <linearGradient id="linearGradient4738">
+            <stop id="stop4740" style="stop-color:#ffffff;stop-opacity:0.7265625" offset="0"/>
+            <stop id="stop4742" style="stop-color:#ffffff;stop-opacity:1" offset="1"/>
+        </linearGradient>
+        <linearGradient x1="314.56537" y1="369.97995" x2="332.02466" y2="387.43924" id="linearGradient4213" xlink:href="#linearGradient4568" gradientUnits="userSpaceOnUse"/>
+        <linearGradient id="linearGradient4568">
+            <stop id="stop4570" style="stop-color:#118909;stop-opacity:1" offset="0"/>
+            <stop id="stop4572" style="stop-color:#084c06;stop-opacity:1" offset="1"/>
+        </linearGradient>
+    </defs>
+    <g transform="matrix(0.89069721,0,0,0.89069721,3.6618346e-5,0.04842997)" id="layer1">
+        <path d="m 339.53775,378.05789 a 13.966679,13.966679 0 1 1 -27.93335,0 13.966679,13.966679 0 1 1 27.93335,0 z" transform="matrix(5.1446606,0,0,5.1446606,-1603.0989,-1873.1257)" id="path4531" style="fill:#084c06;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.625;marker:none;visibility:visible;display:inline;overflow:visible"/>
+        <path d="m 339.53775,378.05789 a 13.966679,13.966679 0 1 1 -27.93335,0 13.966679,13.966679 0 1 1 27.93335,0 z" transform="matrix(4.6972957,0,0,4.6972957,-1457.4507,-1703.9962)" id="path4533" style="fill:url(#linearGradient4213);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.32492188;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"/>
+        <path d="m 39.649739,58.140662 c -0.416752,0 -1.10107,0.251488 -1.403395,0.565849 L 24.773752,72.459332 c -0.60447,0.610757 -0.603572,1.362528 0,1.965202 l 21.176669,20.112782 13.75327,13.753724 c 0.305379,0.30537 0.705964,0.55686 1.122716,0.55686 0.308073,0 0.599979,-0.32334 0.841588,-0.55686 L 75.421265,94.818444 118.92651,51.312752 c 0.61255,-0.601775 0.61076,-1.640961 0,-2.245431 L 105.17324,35.314499 c -0.61076,-0.601776 -1.3619,-0.610757 -1.96475,0 L 60.825958,77.696577 40. [...]
+        <path d="m 71.809802,6.2837595 c -36.214325,0 -65.5944541,29.3810275 -65.5943643,65.5953525 0,17.398505 7.1005943,32.946768 18.1670703,44.693078 5.749114,-47.484599 45.82702,-84.40399 94.854592,-84.40399 1.32202,0 2.54955,0.269452 3.85855,0.323342 C 111.09875,16.887587 92.999137,6.2855559 71.809802,6.2855559 z" id="path4537" style="fill:url(#linearGradient4206);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.61607176;marker:none;visibility:visible;display:inline;overf [...]
+    </g>
+</svg>
\ No newline at end of file
diff --git a/interface/images/icon/server.png b/interface/images/icon/server.png
new file mode 100755
index 0000000..720a237
Binary files /dev/null and b/interface/images/icon/server.png differ
diff --git a/interface/images/icon/server_chart.png b/interface/images/icon/server_chart.png
new file mode 100755
index 0000000..1128d3f
Binary files /dev/null and b/interface/images/icon/server_chart.png differ
diff --git a/interface/images/icon/status_online.png b/interface/images/icon/status_online.png
new file mode 100755
index 0000000..947bd4b
Binary files /dev/null and b/interface/images/icon/status_online.png differ
diff --git a/interface/images/icon/user.png b/interface/images/icon/user.png
new file mode 100755
index 0000000..79f35cc
Binary files /dev/null and b/interface/images/icon/user.png differ
diff --git a/interface/images/icon/user_edit.png b/interface/images/icon/user_edit.png
new file mode 100755
index 0000000..c1974cd
Binary files /dev/null and b/interface/images/icon/user_edit.png differ
diff --git a/interface/images/istsos-logo.gif b/interface/images/istsos-logo.gif
new file mode 100755
index 0000000..ba2d99a
Binary files /dev/null and b/interface/images/istsos-logo.gif differ
diff --git a/interface/images/istsos-logo.png b/interface/images/istsos-logo.png
new file mode 100755
index 0000000..804ee8d
Binary files /dev/null and b/interface/images/istsos-logo.png differ
diff --git a/interface/images/istsos-logo.xcf b/interface/images/istsos-logo.xcf
new file mode 100755
index 0000000..eb057fa
Binary files /dev/null and b/interface/images/istsos-logo.xcf differ
diff --git a/interface/images/istsos.png b/interface/images/istsos.png
new file mode 100755
index 0000000..ecf436c
Binary files /dev/null and b/interface/images/istsos.png differ
diff --git a/interface/images/menu/11971055981382663610sagar_ns_database.svg b/interface/images/menu/11971055981382663610sagar_ns_database.svg
new file mode 100755
index 0000000..741bcd4
--- /dev/null
+++ b/interface/images/menu/11971055981382663610sagar_ns_database.svg
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="305.03284"
+   height="433.66"
+   id="svg1582"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   sodipodi:docbase="/Users/johnolsen/Pictures/svg"
+   sodipodi:docname="sagar_ns_database.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs1584">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8128"
+       id="linearGradient14903"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.828403,79.1897)"
+       x1="548.86957"
+       y1="173.36108"
+       x2="649.89838"
+       y2="173.36108" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8128"
+       id="linearGradient14901"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.828358,39.14951)"
+       x1="548.86957"
+       y1="173.36108"
+       x2="649.89838"
+       y2="173.36108" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient14899"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+    <linearGradient
+       id="linearGradient8128">
+      <stop
+         id="stop8130"
+         offset="0"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         style="stop-color:#a0a0a0;stop-opacity:1;"
+         offset="0.1179847"
+         id="stop8138" />
+      <stop
+         style="stop-color:#d9dada;stop-opacity:1;"
+         offset="0.23596939"
+         id="stop8132" />
+      <stop
+         style="stop-color:#838686;stop-opacity:1;"
+         offset="0.47193879"
+         id="stop8134" />
+      <stop
+         id="stop8136"
+         offset="1"
+         style="stop-color:#c8c5c8;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8128"
+       id="linearGradient14897"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.8284,-0.890625)"
+       x1="548.86957"
+       y1="173.36108"
+       x2="649.89838"
+       y2="173.36108" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient14895"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+    <linearGradient
+       id="linearGradient13043">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop13045" />
+      <stop
+         style="stop-color:#93969e;stop-opacity:1;"
+         offset="1"
+         id="stop13047" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient14893"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="375"
+     inkscape:cy="520"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="756"
+     inkscape:window-height="581"
+     inkscape:window-x="132"
+     inkscape:window-y="132" />
+  <metadata
+     id="metadata1587">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-237.26575,-218.38934)">
+    <g
+       id="g14879"
+       transform="matrix(3.019265,0,0,3.019265,-1422.418,-183.6672)"
+       inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90">
+      <path
+         transform="matrix(0.470916,0,0,0.482166,442.1191,4.595168)"
+         d="M 442.85715 306.64789 A 107.14286 40 0 1 1  228.57143,306.64789 A 107.14286 40 0 1 1  442.85715 306.64789 z"
+         sodipodi:ry="40"
+         sodipodi:rx="107.14286"
+         sodipodi:cy="306.64789"
+         sodipodi:cx="335.71429"
+         id="path14881"
+         style="fill:url(#linearGradient14893);fill-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(0.470916,0,0,0.482166,442.1191,44.63537)"
+         d="M 442.85715 306.64789 A 107.14286 40 0 1 1  228.57143,306.64789 A 107.14286 40 0 1 1  442.85715 306.64789 z"
+         sodipodi:ry="40"
+         sodipodi:rx="107.14286"
+         sodipodi:cy="306.64789"
+         sodipodi:cx="335.71429"
+         id="path14883"
+         style="fill:url(#linearGradient14895);fill-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         id="path14885"
+         d="M 650.56103,148.22655 C 650.56286,148.29397 650.56103,148.35485 650.56103,148.42244 C 650.56104,159.06867 627.96571,167.70908 600.11443,167.70908 C 573.24226,167.70908 551.24084,159.66539 549.72808,149.53744 L 549.72808,176.68942 C 549.72551,176.72771 549.73128,176.77128 549.72808,176.80996 C 549.71094,177.01632 549.69794,177.21981 549.69794,177.42774 C 549.69794,188.07396 572.32166,196.71437 600.18976,196.71437 C 627.33169,196.71438 649.48479,188.51907 650.62131,178.25645 C  [...]
+         style="fill:url(#linearGradient14897);fill-opacity:1" />
+      <path
+         transform="matrix(0.470916,0,0,0.482166,442.1191,84.67548)"
+         d="M 442.85715 306.64789 A 107.14286 40 0 1 1  228.57143,306.64789 A 107.14286 40 0 1 1  442.85715 306.64789 z"
+         sodipodi:ry="40"
+         sodipodi:rx="107.14286"
+         sodipodi:cy="306.64789"
+         sodipodi:cx="335.71429"
+         id="path14887"
+         style="fill:url(#linearGradient14899);fill-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         id="path14889"
+         d="M 650.56103,188.26669 C 650.56286,188.33411 650.56103,188.39499 650.56103,188.46257 C 650.56104,199.1088 627.96571,207.74921 600.11443,207.74921 C 573.24226,207.74921 551.24084,199.70553 549.72808,189.57758 L 549.72808,216.72955 C 549.72551,216.76785 549.73128,216.81141 549.72808,216.85009 C 549.71094,217.05646 549.69794,217.25994 549.69794,217.46787 C 549.69794,228.1141 572.32166,236.75451 600.18976,236.75451 C 627.33169,236.75452 649.48479,228.55921 650.62131,218.29659 C 65 [...]
+         style="fill:url(#linearGradient14901);fill-opacity:1" />
+      <path
+         id="path14891"
+         d="M 650.56103,228.30688 C 650.56286,228.3743 650.56103,228.43518 650.56103,228.50276 C 650.56104,239.14899 627.96571,247.7894 600.11443,247.7894 C 573.24226,247.7894 551.24084,239.74572 549.72808,229.61777 L 549.72808,256.76974 C 549.72551,256.80804 549.73128,256.8516 549.72808,256.89028 C 549.71094,257.09665 549.69794,257.30013 549.69794,257.50806 C 549.69794,268.15429 572.32166,276.7947 600.18976,276.7947 C 627.33169,276.79471 649.48479,268.5994 650.62131,258.33678 C 650.6217 [...]
+         style="fill:url(#linearGradient14903);fill-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/Icon-add.svg b/interface/images/menu/Icon-add.svg
new file mode 100755
index 0000000..a498afc
--- /dev/null
+++ b/interface/images/menu/Icon-add.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?xml-stylesheet href="List-add_files/textshadow.css" media="all" type="text/css"?><!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="48px" height="48px" id="svg6431" sodipodi:version="0.32" inkscape:version="0.43+devel" sodipodi [...]
+  <defs id="defs6433">
+    <linearGradient inkscape:collect="always" id="linearGradient2091">
+      <stop style="stop-color: rgb(0, 0, 0); stop-opacity: 1;" offset="0" id="stop2093"/>
+      <stop style="stop-color: rgb(0, 0, 0); stop-opacity: 0;" offset="1" id="stop2095"/>
+    </linearGradient>
+    <linearGradient id="linearGradient7916">
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="0" id="stop7918"/>
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 0.340206;" offset="1.0000000" id="stop7920"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" id="linearGradient8662">
+      <stop style="stop-color: rgb(0, 0, 0); stop-opacity: 1;" offset="0" id="stop8664"/>
+      <stop style="stop-color: rgb(0, 0, 0); stop-opacity: 0;" offset="1" id="stop8666"/>
+    </linearGradient>
+    <radialGradient inkscape:collect="always" xlink:href="#linearGradient8662" id="radialGradient1503" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1, 0, 0, 0.536723, -1.01899e-13, 16.8731)" cx="24.837126" cy="36.421127" fx="24.837126" fy="36.421127" r="15.644737"/>
+    <linearGradient inkscape:collect="always" id="linearGradient2847">
+      <stop style="stop-color: rgb(52, 101, 164); stop-opacity: 1;" offset="0" id="stop2849"/>
+      <stop style="stop-color: rgb(52, 101, 164); stop-opacity: 0;" offset="1" id="stop2851"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2847" id="linearGradient1488" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1, 0, 0, -1, -1.24248, 40.0817)" x1="37.128052" y1="29.729605" x2="37.065414" y2="26.194071"/>
+    <linearGradient id="linearGradient2831">
+      <stop style="stop-color: rgb(52, 101, 164); stop-opacity: 1;" offset="0" id="stop2833"/>
+      <stop id="stop2855" offset="0.33333334" style="stop-color: rgb(91, 134, 190); stop-opacity: 1;"/>
+      <stop style="stop-color: rgb(131, 168, 216); stop-opacity: 0;" offset="1" id="stop2835"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2831" id="linearGradient1486" gradientUnits="userSpaceOnUse" gradientTransform="translate(-48.305, -6.0433)" x1="13.478554" y1="10.612206" x2="15.419417" y2="19.115122"/>
+    <linearGradient id="linearGradient2380">
+      <stop style="stop-color: rgb(185, 207, 231); stop-opacity: 1;" offset="0" id="stop2382"/>
+      <stop style="stop-color: rgb(114, 159, 207); stop-opacity: 1;" offset="1" id="stop2384"/>
+    </linearGradient>
+    <linearGradient id="linearGradient2682">
+      <stop style="stop-color: rgb(57, 119, 195); stop-opacity: 1;" offset="0" id="stop2684"/>
+      <stop style="stop-color: rgb(137, 174, 220); stop-opacity: 0;" offset="1" id="stop2686"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2682" id="linearGradient2688" x1="36.713837" y1="31.455952" x2="37.124462" y2="24.842253" gradientUnits="userSpaceOnUse" gradientTransform="translate(-48.7704, -5.76571)"/>
+    <linearGradient inkscape:collect="always" id="linearGradient2690">
+      <stop style="stop-color: rgb(196, 215, 235); stop-opacity: 1;" offset="0" id="stop2692"/>
+      <stop style="stop-color: rgb(196, 215, 235); stop-opacity: 0;" offset="1" id="stop2694"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2690" id="linearGradient2696" x1="32.647972" y1="30.748846" x2="37.124462" y2="24.842253" gradientUnits="userSpaceOnUse" gradientTransform="translate(-48.7704, -5.76571)"/>
+    <linearGradient inkscape:collect="always" id="linearGradient2871">
+      <stop style="stop-color: rgb(52, 101, 164); stop-opacity: 1;" offset="0" id="stop2873"/>
+      <stop style="stop-color: rgb(52, 101, 164); stop-opacity: 1;" offset="1" id="stop2875"/>
+    </linearGradient>
+    <linearGradient id="linearGradient2402">
+      <stop style="stop-color: rgb(114, 159, 207); stop-opacity: 1;" offset="0" id="stop2404"/>
+      <stop style="stop-color: rgb(82, 138, 197); stop-opacity: 1;" offset="1" id="stop2406"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2797" id="linearGradient1493" gradientUnits="userSpaceOnUse" x1="5.9649176" y1="26.048164" x2="52.854097" y2="26.048164"/>
+    <linearGradient inkscape:collect="always" id="linearGradient2797">
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="0" id="stop2799"/>
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" offset="1" id="stop2801"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2797" id="linearGradient1491" gradientUnits="userSpaceOnUse" x1="5.9649176" y1="26.048164" x2="52.854097" y2="26.048164"/>
+    <linearGradient inkscape:collect="always" id="linearGradient7179">
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="0" id="stop7181"/>
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" offset="1" id="stop7183"/>
+    </linearGradient>
+    <linearGradient id="linearGradient2316">
+      <stop style="stop-color: rgb(0, 0, 0); stop-opacity: 1;" offset="0" id="stop2318"/>
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 0.659794;" offset="1" id="stop2320"/>
+    </linearGradient>
+    <linearGradient id="linearGradient1322">
+      <stop id="stop1324" offset="0.0000000" style="stop-color: rgb(114, 159, 207);"/>
+      <stop id="stop1326" offset="1.0000000" style="stop-color: rgb(81, 135, 214); stop-opacity: 1;"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient1322" id="linearGradient4975" x1="34.892849" y1="36.422989" x2="45.918697" y2="48.547989" gradientUnits="userSpaceOnUse" gradientTransform="translate(-18.0179, -13.5712)"/>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient7179" id="linearGradient7185" x1="13.435029" y1="13.604306" x2="22.374878" y2="23.554308" gradientUnits="userSpaceOnUse"/>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient7179" id="linearGradient7189" gradientUnits="userSpaceOnUse" x1="13.435029" y1="13.604306" x2="22.374878" y2="23.554308" gradientTransform="matrix(-1, 0, 0, -1, 47.9393, 50.0247)"/>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2380" id="linearGradient7180" gradientUnits="userSpaceOnUse" x1="62.513836" y1="36.061237" x2="15.984863" y2="20.60858"/>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2871" id="linearGradient7182" gradientUnits="userSpaceOnUse" x1="46.834816" y1="45.264122" x2="45.380436" y2="50.939667"/>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2402" id="linearGradient7184" gradientUnits="userSpaceOnUse" x1="18.935766" y1="23.667896" x2="53.588622" y2="26.649362"/>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2871" id="linearGradient7186" gradientUnits="userSpaceOnUse" x1="46.834816" y1="45.264122" x2="45.380436" y2="50.939667"/>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient7916" id="linearGradient7922" x1="16.874998" y1="22.851799" x2="27.900846" y2="34.976799" gradientUnits="userSpaceOnUse"/>
+    <radialGradient inkscape:collect="always" xlink:href="#linearGradient2091" id="radialGradient2097" cx="23.070683" cy="35.127438" fx="23.070683" fy="35.127438" r="10.319340" gradientTransform="matrix(0.914812, 0.0126502, -0.00821502, 0.213562, 2.25391, 27.1889)" gradientUnits="userSpaceOnUse"/>
+  </defs>
+  <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="0.15686275" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1" inkscape:cx="32.657411" inkscape:cy="23.876339" inkscape:current-layer="layer1" showgrid="false" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:window-width="1280" inkscape:window-height="949" inkscape:window-x="553" inkscape:window-y="117" showguides="true" inkscape:guide-bbox="true" inkscape:showpagesh [...]
+  <metadata id="metadata6436">
+    <rdf:RDF>
+      <cc:Work rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <dc:title>Add</dc:title>
+        <dc:date>2006-01-04</dc:date>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Andreas Nilsson</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://tango-project.org</dc:source>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>add</rdf:li>
+            <rdf:li>plus</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/"/>
+      </cc:Work>
+      <cc:License rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+        <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/Attribution"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer">
+    <path sodipodi:type="arc" style="opacity: 0.2; fill: url(#radialGradient2097) rgb(0, 0, 0); fill-opacity: 1; stroke: none; stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0pt; stroke-opacity: 1;" id="path1361" sodipodi:cx="22.958872" sodipodi:cy="34.940620" sodipodi:rx="10.319340" sodipodi:ry="2.3201940" d="M 33.278212 34.940620 A 10.319340 2.3201940 0 1 1  12.639532,34.940620 A 10.319340 2.3201940 0 1 1 [...]
+    <path style="font-size: 59.9011px; font-style: normal; font-variant: normal; font-weight: bold; font-stretch: normal; text-align: start; line-height: 125%; text-anchor: start; fill: rgb(117, 161, 208); fill-opacity: 1; stroke: rgb(52, 101, 164); stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; font-family: Bitstream Vera Sans;" d="M 27.514356,37.542682 L 27.514356,28.515722 L 37.492820,28.475543 L 37.492820,21.480219 L 27.523285,21.480219 L 27.51435 [...]
+    <path style="font-size: 59.9011px; font-style: normal; font-variant: normal; font-weight: bold; font-stretch: normal; text-align: start; line-height: 125%; text-anchor: start; opacity: 0.408602; fill: url(#linearGradient4975) rgb(0, 0, 0); fill-opacity: 1; stroke: url(#linearGradient7922) rgb(0, 0, 0); stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; font-family: Bitstream Vera Sans;" d="M 26.498702,36.533920 L 26.498702,27.499738 L 36.501304,27.499 [...]
+    <path style="fill: rgb(255, 255, 255); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; opacity: 0.311828;" d="M 11.000000,25.000000 C 11.000000,26.937500 36.984375,24.031250 36.984375,24.968750 L 36.984375,21.968750 L 27.000000,22.000000 L 27.000000,12.034772 L 21.000000,12.034772 L 21.000000,22.000000 L 11.000000,22.000000 L 11.000000,25.000000 z " id="path7914" sodipodi:nodetypes="ccccccccc"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/interface/images/menu/No_trash_icon.svg b/interface/images/menu/No_trash_icon.svg
new file mode 100755
index 0000000..fda7a97
--- /dev/null
+++ b/interface/images/menu/No_trash_icon.svg
@@ -0,0 +1,3797 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg:svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="300"
+   height="300"
+   id="svg1883"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   version="1.0"
+   sodipodi:docbase="C:\Documents and Settings\Alain\Bureau"
+   sodipodi:docname="no_trash_icon.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <svg:defs
+     id="defs1885"><svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg0"
+   id="lg27"
+   y2="53.657673"
+   x2="331.3334"
+   y1="61.407673"
+   x1="340.5834" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg1"
+   id="lg26"
+   y2="14.323364"
+   x2="370.25"
+   y1="84.823364"
+   x1="314" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg6"
+   id="lg25"
+   y2="55.197987"
+   x2="336.45242"
+   y1="21.080086"
+   x1="363.22885" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg6"
+   id="lg24"
+   y2="85.680908"
+   x2="319.11377"
+   y1="73.862823"
+   x1="292" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg3"
+   id="lg23"
+   y2="73.787857"
+   x2="294.73615"
+   y1="108.55505"
+   x1="335.02939" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg4"
+   id="lg22"
+   y2="61.49847"
+   x2="324.47333"
+   y1="112.21959"
+   x1="324.47333" />
+<svg:radialGradient
+   gradientTransform="matrix(1,0,0,0.298507,0,244.1194)"
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg2"
+   id="rg0"
+   fy="348"
+   fx="220"
+   r="268"
+   cy="348"
+   cx="220" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg3"
+   id="lg21"
+   y2="81.460526"
+   x2="262.12027"
+   y1="370"
+   x1="262.09396" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg4"
+   id="lg20"
+   y2="86.179321"
+   x2="297.90454"
+   y1="377"
+   x1="235.46655" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg5"
+   id="lg19"
+   y2="235.24411"
+   x2="329.51175"
+   y1="150.74486"
+   x1="170.05917" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg6"
+   id="lg18"
+   y2="226.55548"
+   x2="196.1163"
+   y1="82.801445"
+   x1="311.74066" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg6"
+   id="lg17"
+   y2="313.58194"
+   x2="313.5"
+   y1="313.58194"
+   x1="130.71852" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg7"
+   id="lg16"
+   y2="140.75"
+   x2="318.5"
+   y1="275.75"
+   x1="297.85538" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg7"
+   id="lg15"
+   y2="130"
+   x2="299"
+   y1="314.5"
+   x1="280.21573" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg7"
+   id="lg14"
+   y2="141.25"
+   x2="261"
+   y1="307.75"
+   x1="233.8793" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg7"
+   id="lg13"
+   y2="198.75"
+   x2="209.5"
+   y1="312.75"
+   x1="194.55725" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg7"
+   id="lg12"
+   y2="119.25"
+   x2="236"
+   y1="290"
+   x1="159.19325" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg7"
+   id="lg11"
+   y2="203.75"
+   x2="148"
+   y1="315.5"
+   x1="130.23703" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg8"
+   id="lg10"
+   y2="314.32535"
+   x2="105.5"
+   y1="270.32535"
+   x1="62.90543" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#lg8"
+   id="lg9"
+   y2="255.75455"
+   x2="93.495056"
+   y1="223.75455"
+   x1="28.990112" />
+<svg:linearGradient
+   id="lg8">
+  <svg:stop
+     id="stop2411"
+     style="stop-color:#96af96" />
+  <svg:stop
+     id="stop2413"
+     offset="1"
+     style="stop-color:#96af96;stop-opacity:0" />
+</svg:linearGradient>
+<svg:linearGradient
+   id="lg7">
+  <svg:stop
+     id="stop2406"
+     style="stop-color:#b77617" />
+  <svg:stop
+     id="stop2408"
+     offset="1"
+     style="stop-color:#fff;stop-opacity:0.4742268" />
+</svg:linearGradient>
+<svg:linearGradient
+   id="lg6">
+  <svg:stop
+     id="stop2401"
+     style="stop-color:#fff;stop-opacity:0.60000002" />
+  <svg:stop
+     id="stop2403"
+     offset="1"
+     style="stop-color:#fff;stop-opacity:0" />
+</svg:linearGradient>
+<svg:linearGradient
+   id="lg5">
+  <svg:stop
+     id="stop2394"
+     style="stop-color:#e3140f" />
+  <svg:stop
+     id="stop2396"
+     offset="0.25"
+     style="stop-color:#fee7e7" />
+  <svg:stop
+     id="stop2398"
+     offset="1"
+     style="stop-color:#e3140f" />
+</svg:linearGradient>
+<svg:linearGradient
+   id="lg4">
+  <svg:stop
+     id="stop2389"
+     style="stop-color:#974f05" />
+  <svg:stop
+     id="stop2391"
+     offset="1"
+     style="stop-color:#deb764" />
+</svg:linearGradient>
+<svg:linearGradient
+   id="lg3">
+  <svg:stop
+     id="stop2384"
+     style="stop-color:#fdde61" />
+  <svg:stop
+     id="stop2386"
+     offset="1"
+     style="stop-color:#cc9021" />
+</svg:linearGradient>
+<svg:linearGradient
+   id="lg2">
+  <svg:stop
+     id="stop2375"
+     style="stop-color:#474747" />
+  <svg:stop
+     id="stop2377"
+     offset="0.25"
+     style="stop-color:#595959" />
+  <svg:stop
+     id="stop2379"
+     offset="0.71875"
+     style="stop-color:#a3a3a3;stop-opacity:0.49803922" />
+  <svg:stop
+     id="stop2381"
+     offset="1"
+     style="stop-color:#fff;stop-opacity:0" />
+</svg:linearGradient>
+<svg:linearGradient
+   id="lg1">
+  <svg:stop
+     id="stop2370"
+     style="stop-color:#4a3302" />
+  <svg:stop
+     id="stop2372"
+     offset="1"
+     style="stop-color:#c99414" />
+</svg:linearGradient>
+<svg:linearGradient
+   id="lg0">
+  <svg:stop
+     id="stop2365"
+     style="stop-color:#c5942f" />
+  <svg:stop
+     id="stop2367"
+     offset="1"
+     style="stop-color:#80630e" />
+</svg:linearGradient>
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_3_"
+   id="linearGradient12477"
+   y2="135.627"
+   x2="189.6787"
+   y1="135.627"
+   x1="98.557602" />
+<svg:linearGradient
+   gradientTransform="matrix(0.9999,1.2e-2,-1.2e-2,0.9999,2.579,-2.6)"
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_2_"
+   id="linearGradient12475"
+   y2="208.0907"
+   x2="223.1826"
+   y1="220.91991"
+   x1="211.957" />
+
+        
+        
+      <svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_140_"
+   id="linearGradient11443"
+   y2="49.432598"
+   x2="122.0112"
+   y1="64.238297"
+   x1="122.0112" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_138_"
+   id="linearGradient11441"
+   y2="69.597198"
+   x2="135.6543"
+   y1="69.597198"
+   x1="69.128403" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_137_"
+   id="linearGradient11439"
+   y2="65.025398"
+   x2="147.9727"
+   y1="65.025398"
+   x1="98.694298" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_136_"
+   id="linearGradient11437"
+   y2="71.9048"
+   x2="103.4116"
+   y1="71.9048"
+   x1="78.984901" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_131_"
+   id="linearGradient11435"
+   y2="95.561501"
+   x2="146.76559"
+   y1="95.561501"
+   x1="71.667503" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_126_"
+   id="linearGradient11433"
+   y2="84.741203"
+   x2="152.7852"
+   y1="84.741203"
+   x1="89.107903" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_140_"
+   id="linearGradient11431"
+   y2="49.432598"
+   x2="122.0112"
+   y1="64.238297"
+   x1="122.0112" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_138_"
+   id="linearGradient11429"
+   y2="69.597198"
+   x2="135.6543"
+   y1="69.597198"
+   x1="69.128403" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_137_"
+   id="linearGradient11427"
+   y2="65.025398"
+   x2="147.9727"
+   y1="65.025398"
+   x1="98.694298" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_136_"
+   id="linearGradient11425"
+   y2="71.9048"
+   x2="103.4116"
+   y1="71.9048"
+   x1="78.984901" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_131_"
+   id="linearGradient11423"
+   y2="95.561501"
+   x2="146.76559"
+   y1="95.561501"
+   x1="71.667503" />
+<svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_126_"
+   id="linearGradient11421"
+   y2="84.741203"
+   x2="152.7852"
+   y1="84.741203"
+   x1="89.107903" />
+
+    
+  
+      
+    <svg:foreignObject
+   id="foreignObject126"
+   height="1"
+   width="1"
+   y="0"
+   x="0"
+   requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/">
+				<pgfRef
+   id="pgfRef128"
+   xlink:href="#adobe_illustrator_pgf">
+				</pgfRef>
+
+
+			</svg:foreignObject>
+
+    
+    <svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_1_"
+   y2="312.2099"
+   x2="312.32861"
+   y1="86.276398"
+   x1="86.394997">
+      <svg:stop
+   id="stop161"
+   offset="0"
+   style="stop-color:#ffffff;stop-opacity:1" />
+
+      <svg:stop
+   id="stop162"
+   offset="1"
+   style="stop-color:#99ccff;stop-opacity:1" />
+
+    </svg:linearGradient>
+
+    <svg:linearGradient
+   gradientTransform="matrix(0.9999,1.2e-2,-1.2e-2,0.9999,2.579,-2.6)"
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_2_"
+   y2="208.0907"
+   x2="223.1826"
+   y1="220.91991"
+   x1="211.957">
+      <svg:stop
+   id="stop173"
+   offset="0"
+   style="stop-color:#ff9900;stop-opacity:1" />
+
+      <svg:stop
+   id="stop174"
+   offset="1"
+   style="stop-color:#ffcc66;stop-opacity:1" />
+
+    </svg:linearGradient>
+
+    <svg:linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_3_"
+   y2="135.627"
+   x2="189.6787"
+   y1="135.627"
+   x1="98.557602">
+      <svg:stop
+   id="stop184"
+   offset="0"
+   style="stop-color:white;stop-opacity:1;" />
+
+      <svg:stop
+   id="stop2595"
+   offset="1"
+   style="stop-color:white;stop-opacity:0.73636365;" />
+
+    </svg:linearGradient>
+
+  <svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_126_"
+   id="linearGradient5513"
+   gradientUnits="userSpaceOnUse"
+   x1="89.107903"
+   y1="84.741203"
+   x2="152.7852"
+   y2="84.741203" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_131_"
+   id="linearGradient5515"
+   gradientUnits="userSpaceOnUse"
+   x1="71.667503"
+   y1="95.561501"
+   x2="146.76559"
+   y2="95.561501" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_136_"
+   id="linearGradient5517"
+   gradientUnits="userSpaceOnUse"
+   x1="78.984901"
+   y1="71.9048"
+   x2="103.4116"
+   y2="71.9048" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_137_"
+   id="linearGradient5519"
+   gradientUnits="userSpaceOnUse"
+   x1="98.694298"
+   y1="65.025398"
+   x2="147.9727"
+   y2="65.025398" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_138_"
+   id="linearGradient5521"
+   gradientUnits="userSpaceOnUse"
+   x1="69.128403"
+   y1="69.597198"
+   x2="135.6543"
+   y2="69.597198" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_140_"
+   id="linearGradient5523"
+   gradientUnits="userSpaceOnUse"
+   x1="122.0112"
+   y1="64.238297"
+   x2="122.0112"
+   y2="49.432598" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_126_"
+   id="linearGradient5525"
+   gradientUnits="userSpaceOnUse"
+   x1="89.107903"
+   y1="84.741203"
+   x2="152.7852"
+   y2="84.741203" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_131_"
+   id="linearGradient5527"
+   gradientUnits="userSpaceOnUse"
+   x1="71.667503"
+   y1="95.561501"
+   x2="146.76559"
+   y2="95.561501" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_136_"
+   id="linearGradient5529"
+   gradientUnits="userSpaceOnUse"
+   x1="78.984901"
+   y1="71.9048"
+   x2="103.4116"
+   y2="71.9048" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_137_"
+   id="linearGradient5531"
+   gradientUnits="userSpaceOnUse"
+   x1="98.694298"
+   y1="65.025398"
+   x2="147.9727"
+   y2="65.025398" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_138_"
+   id="linearGradient5533"
+   gradientUnits="userSpaceOnUse"
+   x1="69.128403"
+   y1="69.597198"
+   x2="135.6543"
+   y2="69.597198" />
+<svg:linearGradient
+   inkscape:collect="always"
+   xlink:href="#XMLID_140_"
+   id="linearGradient5535"
+   gradientUnits="userSpaceOnUse"
+   x1="122.0112"
+   y1="64.238297"
+   x2="122.0112"
+   y2="49.432598" />
+</svg:defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.5866667"
+     inkscape:cx="150"
+     inkscape:cy="148.76586"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     width="300px"
+     height="300px"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="952"
+     inkscape:window-x="0"
+     inkscape:window-y="0" />
+  <svg:metadata
+     id="metadata1888">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </svg:metadata>
+  <svg:g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="bordure grise"
+     style="display:inline" />
+  <svg:g
+     inkscape:label="Contour gris"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="opacity:1;display:inline" />
+  <svg:g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Contour blanc" />
+  <svg:g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Bordure Rouge" />
+  <svg:g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Centre Blanc">
+    <svg:g
+       id="g5543">
+      <svg:g
+         transform="matrix(1,0,0,1.0541907,21.016,40.297323)"
+         id="g136">
+          <svg:linearGradient
+   x1="207.6123"
+   y1="207.65041"
+   x2="48.752899"
+   y2="48.791"
+   id="XMLID_80_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#003399;stop-opacity:1"
+   offset="0"
+   id="stop140" />
+
+            <svg:stop
+   style="stop-color:#0066cc;stop-opacity:1"
+   offset="1"
+   id="stop142" />
+
+            <midPointStop
+   id="midPointStop144"
+   style="stop-color:#003399"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop146"
+   style="stop-color:#003399"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop148"
+   style="stop-color:#0066CC"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 42.822,66.314 L 42.908,68.15 L 42.822,67.801 L 42.015,192.658 L 42.059,192.997 C 45.185,216.948 82.304,235.01 128.401,235.01 C 176.391,235.01 213.984,215.101 213.984,189.686 L 213.984,66.314 C 213.984,40.898 176.391,20.989 128.401,20.989 C 80.413,20.989 42.822,40.898 42.822,66.314 z "
+   style="fill:url(#XMLID_80_)"
+   id="path151" />
+
+          <svg:linearGradient
+   x1="66.544899"
+   y1="66.130898"
+   x2="193.901"
+   y2="193.487"
+   id="XMLID_81_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#ffffff;stop-opacity:1"
+   offset="0"
+   id="stop155" />
+
+            <svg:stop
+   style="stop-color:#a3daaf;stop-opacity:1"
+   offset="1"
+   id="stop157" />
+
+            <midPointStop
+   id="midPointStop159"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop161"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop163"
+   style="stop-color:#A3DAAF"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 208.619,70.084 C 208.853,68.842 208.984,67.586 208.984,66.314 C 208.984,44.043 172.906,25.989 128.401,25.989 C 83.898,25.989 47.821,44.044 47.821,66.314 C 47.821,66.825 47.86,67.329 47.899,67.834 L 47.821,67.834 L 47.821,192.351 L 48.016,192.351 C 50.76,213.376 85.69,230.011 128.4,230.011 C 172.904,230.011 208.983,211.955 208.983,189.687 C 208.983,188.416 208.852,187.159 208.618,185.918 L 208.618,70.084 L 208.619,70.084 z M 56.398,66.314 C 56.398,51.019 85.97,33.981 128.401,33.98 [...]
+   style="fill:url(#XMLID_81_)"
+   id="path166" />
+
+          <svg:linearGradient
+   x1="47.8223"
+   y1="148.92191"
+   x2="208.98441"
+   y2="148.92191"
+   id="XMLID_82_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#ffffff;stop-opacity:1"
+   offset="0"
+   id="stop170" />
+
+            <svg:stop
+   style="stop-color:#a3daaf;stop-opacity:1"
+   offset="1"
+   id="stop172" />
+
+            <midPointStop
+   id="midPointStop174"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop176"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop178"
+   style="stop-color:#A3DAAF"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 208.619,185.918 L 208.619,67.834 L 47.822,67.834 L 47.822,192.351 L 48.017,192.351 C 50.761,213.376 85.691,230.011 128.401,230.011 C 172.905,230.011 208.984,211.955 208.984,189.687 C 208.984,188.415 208.854,187.158 208.619,185.918 z "
+   style="fill:url(#XMLID_82_)"
+   id="path181" />
+
+          <svg:linearGradient
+   x1="47.8223"
+   y1="148.92191"
+   x2="208.98441"
+   y2="148.92191"
+   id="XMLID_83_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#ffffff;stop-opacity:1"
+   offset="0"
+   id="stop185" />
+
+            <svg:stop
+   style="stop-color:#99ccff;stop-opacity:1"
+   offset="0.0562"
+   id="stop187" />
+
+            <svg:stop
+   style="stop-color:#3399ff;stop-opacity:1"
+   offset="0.69660002"
+   id="stop189" />
+
+            <svg:stop
+   style="stop-color:#0066cc;stop-opacity:1"
+   offset="1"
+   id="stop191" />
+
+            <midPointStop
+   id="midPointStop193"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop195"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop197"
+   style="stop-color:#99CCFF"
+   offset="0.0562" />
+
+            <midPointStop
+   id="midPointStop199"
+   style="stop-color:#99CCFF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop201"
+   style="stop-color:#3399FF"
+   offset="0.6966" />
+
+            <midPointStop
+   id="midPointStop203"
+   style="stop-color:#3399FF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop205"
+   style="stop-color:#0066CC"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 208.619,185.918 L 208.619,67.834 L 47.822,67.834 L 47.822,192.351 L 48.017,192.351 C 50.761,213.376 85.691,230.011 128.401,230.011 C 172.905,230.011 208.984,211.955 208.984,189.687 C 208.984,188.415 208.854,187.158 208.619,185.918 z "
+   style="fill:url(#XMLID_83_)"
+   id="path208" />
+
+          <svg:linearGradient
+   x1="153.97951"
+   y1="86.971199"
+   x2="69.907303"
+   y2="19.067101"
+   id="XMLID_84_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#003399;stop-opacity:1"
+   offset="0"
+   id="stop212" />
+
+            <svg:stop
+   style="stop-color:#3399ff;stop-opacity:1"
+   offset="1"
+   id="stop214" />
+
+            <midPointStop
+   id="midPointStop216"
+   style="stop-color:#003399"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop218"
+   style="stop-color:#003399"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop220"
+   style="stop-color:#3399FF"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 56.398,66.314 C 56.398,81.609 85.97,98.648 128.401,98.648 C 170.837,98.648 200.409,81.609 200.409,66.314 C 200.409,51.019 170.837,33.981 128.401,33.981 C 85.97,33.981 56.398,51.02 56.398,66.314 z "
+   style="fill:url(#XMLID_84_)"
+   id="path223" />
+
+          <svg:radialGradient
+   cx="160.10159"
+   cy="225.54491"
+   r="102.7621"
+   fx="160.10159"
+   fy="225.54491"
+   id="XMLID_85_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+            <svg:stop
+   style="stop-color:#428aff;stop-opacity:1"
+   offset="0"
+   id="stop227" />
+
+            <svg:stop
+   style="stop-color:#0066cc;stop-opacity:1"
+   offset="1"
+   id="stop229" />
+
+            <midPointStop
+   id="midPointStop231"
+   style="stop-color:#428AFF"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop233"
+   style="stop-color:#428AFF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop235"
+   style="stop-color:#0066CC"
+   offset="1" />
+
+          </svg:radialGradient>
+
+          <svg:path
+   d="M 56.398,193.469 C 56.398,208.762 85.97,225.803 128.401,225.803 C 170.837,225.803 200.409,208.762 200.409,193.469 C 200.409,178.174 170.837,161.135 128.401,161.135 C 85.97,161.135 56.398,178.174 56.398,193.469 z "
+   style="fill:url(#XMLID_85_)"
+   id="path238" />
+
+          <svg:linearGradient
+   x1="47.8223"
+   y1="62.4673"
+   x2="208.98441"
+   y2="62.4673"
+   id="XMLID_86_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#e6f6f9;stop-opacity:1"
+   offset="0"
+   id="stop242" />
+
+            <svg:stop
+   style="stop-color:#71a6cd;stop-opacity:1"
+   offset="1"
+   id="stop244" />
+
+            <midPointStop
+   id="midPointStop246"
+   style="stop-color:#E6F6F9"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop248"
+   style="stop-color:#E6F6F9"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop250"
+   style="stop-color:#71A6CD"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 128.402,28.987 C 172.397,28.987 208.129,45.975 208.945,67.078 C 208.953,66.824 208.984,66.57 208.984,66.314 C 208.984,44.043 172.906,25.989 128.401,25.989 C 83.898,25.989 47.821,44.044 47.821,66.314 C 47.821,66.57 47.85,66.824 47.86,67.078 C 48.677,45.976 84.412,28.987 128.402,28.987 z M 200.41,67.813 C 200.41,67.568 200.381,67.323 200.363,67.078 C 199.402,82.17 170.134,98.648 128.402,98.648 C 86.674,98.648 57.404,82.169 56.444,67.078 C 56.427,67.323 56.399,67.568 56.399,67.813 C [...]
+   style="fill:url(#XMLID_86_)"
+   id="path253" />
+
+          <svg:g
+   style="opacity:0.3"
+   id="g255">
+            <svg:linearGradient
+   x1="57.915001"
+   y1="185.7363"
+   x2="133.71049"
+   y2="109.9408"
+   id="XMLID_87_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#494949;stop-opacity:1"
+   offset="0"
+   id="stop259" />
+
+              <svg:stop
+   style="stop-color:#505050;stop-opacity:1"
+   offset="0.1654"
+   id="stop261" />
+
+              <svg:stop
+   style="stop-color:#5d5d5d;stop-opacity:1"
+   offset="0.59490001"
+   id="stop263" />
+
+              <svg:stop
+   style="stop-color:#616161;stop-opacity:1"
+   offset="1"
+   id="stop265" />
+
+              <midPointStop
+   id="midPointStop267"
+   style="stop-color:#494949"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop269"
+   style="stop-color:#494949"
+   offset="0.3051" />
+
+              <midPointStop
+   id="midPointStop271"
+   style="stop-color:#616161"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 113.27,204.767 C 113.27,204.767 118.145,201.649 118.406,201.484 C 118.689,201.335 131.885,194.454 131.885,194.454 C 132.711,194.025 133.261,193.293 133.534,192.46 C 139.998,193.584 155.293,196.24 155.293,196.24 C 157.027,196.542 158.744,195.633 159.361,194.087 C 159.455,193.848 159.521,193.604 159.556,193.358 C 159.753,192.023 159.081,190.673 157.798,189.966 C 157.798,189.966 154.788,188.315 151.782,186.662 C 151.819,186.534 151.889,186.42 151.909,186.287 L 154.534,168.343 C 154. [...]
+   style="opacity:0.5;fill:url(#XMLID_87_)"
+   id="path274" />
+
+            <svg:linearGradient
+   x1="60.370098"
+   y1="135.90919"
+   x2="116.0225"
+   y2="135.90919"
+   id="XMLID_88_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop278" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop280" />
+
+              <midPointStop
+   id="midPointStop282"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop284"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop286"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="84.843,175.25 132.056,183.357 140.633,174.849 142.125,167.15 139.32,158.27 84.843,175.25 "
+   style="fill:url(#XMLID_88_)"
+   id="polygon289" />
+
+            <svg:linearGradient
+   x1="51.419399"
+   y1="169.9082"
+   x2="92.127899"
+   y2="169.9082"
+   id="XMLID_89_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop293" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop295" />
+
+              <midPointStop
+   id="midPointStop297"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop299"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop301"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="121.765,158.05 156.248,129.97 144.873,114.294 113.955,138.769 121.765,158.05 "
+   style="fill:url(#XMLID_89_)"
+   id="polygon304" />
+
+            <svg:linearGradient
+   x1="83.349098"
+   y1="180.6895"
+   x2="128.5298"
+   y2="180.6895"
+   id="XMLID_90_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop308" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop310" />
+
+              <midPointStop
+   id="midPointStop312"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop314"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop316"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="125.395,119.923 107.677,107.498 79.484,122.165 92.939,134.046 125.395,119.923 "
+   style="fill:url(#XMLID_90_)"
+   id="polygon319" />
+
+            <svg:linearGradient
+   x1="68.799301"
+   y1="143.37891"
+   x2="146.2168"
+   y2="143.37891"
+   id="XMLID_91_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#616161;stop-opacity:1"
+   offset="0"
+   id="stop323" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop325" />
+
+              <midPointStop
+   id="midPointStop327"
+   style="stop-color:#616161"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop329"
+   style="stop-color:#616161"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop331"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="132.725,173.673 96.885,181.266 54.563,173.814 84.417,132.955 110.454,162.694 132.725,173.673 "
+   style="fill:url(#XMLID_91_)"
+   id="polygon334" />
+
+            <svg:linearGradient
+   x1="57.743198"
+   y1="160.54201"
+   x2="143.7529"
+   y2="160.54201"
+   id="XMLID_92_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#494949;stop-opacity:1"
+   offset="0"
+   id="stop338" />
+
+              <svg:stop
+   style="stop-color:#c4cbcb;stop-opacity:1"
+   offset="1"
+   id="stop340" />
+
+              <midPointStop
+   id="midPointStop342"
+   style="stop-color:#494949"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop344"
+   style="stop-color:#494949"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop346"
+   style="stop-color:#C4CBCB"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="148.336,141.143 121.806,129.619 106.512,115.473 61.651,140.193 88.272,165.945 148.336,141.143 "
+   style="fill:url(#XMLID_92_)"
+   id="polygon349" />
+
+            <svg:linearGradient
+   x1="45.084499"
+   y1="145.86909"
+   x2="110.6274"
+   y2="145.86909"
+   id="XMLID_93_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop353" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop355" />
+
+              <midPointStop
+   id="midPointStop357"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop359"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop361"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 158.486,160.336 C 157.373,162.94 100.983,175.368 100.983,175.368 L 92.37,160.044 L 115.046,138.577 L 158.486,160.336 z "
+   style="fill:url(#XMLID_93_)"
+   id="path364" />
+
+            <svg:path
+   d="M 100.272,172.952 L 92.484,159.096 L 91.279,160.24 L 99.891,175.561 C 99.891,175.561 156.279,163.131 157.392,160.528 L 154.974,159.318 C 143.426,163.441 100.272,172.952 100.272,172.952 z "
+   style="fill:#ffffff"
+   id="path366" />
+
+            <svg:linearGradient
+   x1="65.547401"
+   y1="141.1396"
+   x2="65.547401"
+   y2="176.6738"
+   id="XMLID_94_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#ffffff;stop-opacity:1"
+   offset="0"
+   id="stop370" />
+
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="1"
+   id="stop372" />
+
+              <midPointStop
+   id="midPointStop374"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop376"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop378"
+   style="stop-color:#828282"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 147.621,167.168 C 147.621,167.168 164.541,136.741 156.658,132.986 C 148.773,129.23 123.233,135.909 123.233,135.909 L 125.216,157.436 L 147.621,167.168 z "
+   style="fill:url(#XMLID_94_)"
+   id="path381" />
+
+            <svg:linearGradient
+   x1="56.244099"
+   y1="155.5547"
+   x2="83.372101"
+   y2="155.5547"
+   id="XMLID_95_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop385" />
+
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="0.75840002"
+   id="stop387" />
+
+              <midPointStop
+   id="midPointStop389"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop391"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop393"
+   style="stop-color:#828282"
+   offset="0.7584" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 140.883,166.304 C 140.883,166.304 154.033,141.438 148.041,138.434 C 142.045,135.431 122.483,141.031 122.483,141.031 L 123.839,158.533 L 140.883,166.304 z "
+   style="fill:url(#XMLID_95_)"
+   id="path396" />
+
+            <svg:linearGradient
+   x1="51.5425"
+   y1="133.41409"
+   x2="73.045403"
+   y2="133.41409"
+   id="XMLID_96_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop400" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop402" />
+
+              <midPointStop
+   id="midPointStop404"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop406"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop408"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="131.301,176.68 126.527,187.639 148.313,185.825 150.936,167.881 139.32,158.27 131.301,176.68 "
+   style="fill:url(#XMLID_96_)"
+   id="polygon411" />
+
+            <svg:linearGradient
+   x1="112.6553"
+   y1="164.3232"
+   x2="144.998"
+   y2="164.3232"
+   id="XMLID_97_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="0"
+   id="stop415" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop417" />
+
+              <midPointStop
+   id="midPointStop419"
+   style="stop-color:#828282"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop421"
+   style="stop-color:#828282"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop423"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="91.811,147.376 69.296,153.305 60.444,139.831 66.267,112.375 95.609,121.423 91.811,147.376 "
+   style="fill:url(#XMLID_97_)"
+   id="polygon426" />
+
+            <svg:linearGradient
+   x1="51.702599"
+   y1="123.7505"
+   x2="73.045403"
+   y2="123.7505"
+   id="XMLID_98_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop430" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop432" />
+
+              <midPointStop
+   id="midPointStop434"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop436"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop438"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="148.313,185.825 148.422,185.066 131.301,176.68 126.527,187.639 148.313,185.825 "
+   style="fill:url(#XMLID_98_)"
+   id="polygon441" />
+
+            <svg:linearGradient
+   x1="68.9487"
+   y1="117.1396"
+   x2="111.8184"
+   y2="117.1396"
+   id="XMLID_99_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop445" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop447" />
+
+              <midPointStop
+   id="midPointStop449"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop451"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop453"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="126.942,184.804 130.379,189.709 111.222,201.96 89.426,187.73 89.172,174.627 117.809,171.763 126.942,184.804 "
+   style="fill:url(#XMLID_99_)"
+   id="polygon456" />
+
+            <svg:linearGradient
+   x1="43.173302"
+   y1="121.7036"
+   x2="101.0723"
+   y2="121.7036"
+   id="XMLID_100_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop460" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop462" />
+
+              <midPointStop
+   id="midPointStop464"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop466"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop468"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="155.959,192.898 111.507,185.172 99.891,175.561 110.542,176.925 131.85,179.654 155.959,192.898 "
+   style="fill:url(#XMLID_100_)"
+   id="polygon471" />
+
+            <svg:linearGradient
+   x1="64.091797"
+   y1="181.83591"
+   x2="102.8101"
+   y2="181.83591"
+   id="XMLID_101_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop475" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop477" />
+
+              <midPointStop
+   id="midPointStop479"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop481"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop483"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="143.404,130.354 128.691,112.221 104.178,131.423 143.404,130.354 "
+   style="fill:url(#XMLID_101_)"
+   id="polygon486" />
+
+            <svg:linearGradient
+   x1="89.291496"
+   y1="116.5332"
+   x2="89.291496"
+   y2="102.415"
+   id="XMLID_102_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop490" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop492" />
+
+              <midPointStop
+   id="midPointStop494"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop496"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop498"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="111.32,201.286 130.354,189.884 130.152,189.613 89.576,187.807 111.32,201.286 "
+   style="fill:url(#XMLID_102_)"
+   id="polygon501" />
+
+            <svg:linearGradient
+   x1="64.091797"
+   y1="166.78999"
+   x2="103.6514"
+   y2="166.78999"
+   id="XMLID_103_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0.6124"
+   id="stop505" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop507" />
+
+              <midPointStop
+   id="midPointStop509"
+   style="stop-color:#B6B6B6"
+   offset="0.6124" />
+
+              <midPointStop
+   id="midPointStop511"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop513"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="143.404,130.354 120.378,147.894 110.242,136.989 102.93,134.337 104.178,131.423 143.404,130.354 "
+   style="fill:url(#XMLID_103_)"
+   id="polygon516" />
+
+            <svg:polygon
+   points="119.367,145.108 109.23,134.205 103.826,132.243 102.93,134.337 110.242,136.989 120.378,147.894 143.404,130.354 138.563,130.486 119.367,145.108 "
+   style="fill:#ffffff"
+   id="polygon518" />
+
+            <svg:linearGradient
+   x1="121.7998"
+   y1="186.7813"
+   x2="121.7998"
+   y2="135.68359"
+   id="XMLID_104_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop522" />
+
+              <svg:stop
+   style="stop-color:#cacaca;stop-opacity:1"
+   offset="0.1974"
+   id="stop524" />
+
+              <svg:stop
+   style="stop-color:#dfdfdf;stop-opacity:1"
+   offset="0.47440001"
+   id="stop526" />
+
+              <svg:stop
+   style="stop-color:#ececec;stop-opacity:1"
+   offset="0.74510002"
+   id="stop528" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop530" />
+
+              <midPointStop
+   id="midPointStop532"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop534"
+   style="stop-color:#B6B6B6"
+   offset="0.3051" />
+
+              <midPointStop
+   id="midPointStop536"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="106.752,115.696 106.512,115.473 69.052,136.117 63.922,142.389 86.595,164.323 106.752,115.696 "
+   style="fill:url(#XMLID_104_)"
+   id="polygon539" />
+
+            <svg:linearGradient
+   x1="140.8213"
+   y1="153.74899"
+   x2="107.8923"
+   y2="120.8201"
+   id="XMLID_105_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop543" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop545" />
+
+              <midPointStop
+   id="midPointStop547"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop549"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop551"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="84.417,132.955 55.476,172.563 109.515,161.62 84.417,132.955 "
+   style="fill:url(#XMLID_105_)"
+   id="polygon554" />
+
+            <svg:polygon
+   points="60.841,171.478 86.909,135.799 84.417,132.955 55.476,172.563 60.841,171.478 "
+   style="fill:#ffffff"
+   id="polygon556" />
+
+          </svg:g>
+
+          <svg:g
+   style="opacity:0.3"
+   id="g559">
+            <svg:linearGradient
+   x1="109.5229"
+   y1="186.5674"
+   x2="174.5889"
+   y2="121.5014"
+   id="XMLID_106_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#494949;stop-opacity:1"
+   offset="0"
+   id="stop563" />
+
+              <svg:stop
+   style="stop-color:#505050;stop-opacity:1"
+   offset="0.1654"
+   id="stop565" />
+
+              <svg:stop
+   style="stop-color:#5d5d5d;stop-opacity:1"
+   offset="0.59490001"
+   id="stop567" />
+
+              <svg:stop
+   style="stop-color:#616161;stop-opacity:1"
+   offset="1"
+   id="stop569" />
+
+              <midPointStop
+   id="midPointStop571"
+   style="stop-color:#494949"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop573"
+   style="stop-color:#494949"
+   offset="0.3051" />
+
+              <midPointStop
+   id="midPointStop575"
+   style="stop-color:#616161"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 103.573,172.271 C 103.573,172.271 106.051,176.646 106.182,176.88 C 106.294,177.131 111.488,188.777 111.488,188.777 C 111.81,189.505 112.462,190.047 113.238,190.379 C 111.42,195.505 107.115,207.635 107.115,207.635 C 106.627,209.007 107.317,210.525 108.748,211.227 C 108.969,211.334 109.199,211.42 109.434,211.481 C 110.708,211.812 112.093,211.44 112.924,210.483 C 112.924,210.483 114.867,208.244 116.81,206.004 C 116.93,206.051 117.033,206.123 117.161,206.156 L 134.287,210.606 C 135.1 [...]
+   style="opacity:0.5;fill:url(#XMLID_106_)"
+   id="path578" />
+
+            <svg:linearGradient
+   x1="112.7676"
+   y1="141.5303"
+   x2="158.6631"
+   y2="141.5303"
+   id="XMLID_107_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop582" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop584" />
+
+              <midPointStop
+   id="midPointStop586"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop588"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop590"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="135.434,152.891 122.243,190.343 129.539,198.433 136.845,200.641 145.785,199.496 135.434,152.891 "
+   style="fill:url(#XMLID_107_)"
+   id="polygon593" />
+
+            <svg:linearGradient
+   x1="106.2578"
+   y1="173.58591"
+   x2="139.75681"
+   y2="173.58591"
+   id="XMLID_108_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop597" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop599" />
+
+              <midPointStop
+   id="midPointStop601"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop603"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop605"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="147.975,185.212 171.355,216.941 187.855,209.686 167.576,181.325 147.975,185.212 "
+   style="fill:url(#XMLID_108_)"
+   id="polygon608" />
+
+            <svg:linearGradient
+   x1="132.9424"
+   y1="184.4707"
+   x2="170.3076"
+   y2="184.4707"
+   id="XMLID_109_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop612" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop614" />
+
+              <midPointStop
+   id="midPointStop616"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop618"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop620"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="184.586,193.08 198.646,180.232 187.582,155.356 174.529,164.799 184.586,193.08 "
+   style="fill:url(#XMLID_109_)"
+   id="polygon623" />
+
+            <svg:linearGradient
+   x1="119.5918"
+   y1="149.56641"
+   x2="183.70309"
+   y2="149.56641"
+   id="XMLID_110_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#616161;stop-opacity:1"
+   offset="0"
+   id="stop627" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop629" />
+
+              <midPointStop
+   id="midPointStop631"
+   style="stop-color:#616161"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop633"
+   style="stop-color:#616161"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop635"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="131.57,192.135 128.238,161.936 140.242,128.389 176.551,157.991 144.74,175.391 131.57,192.135 "
+   style="fill:url(#XMLID_110_)"
+   id="polygon638" />
+
+            <svg:linearGradient
+   x1="111.2227"
+   y1="165.5703"
+   x2="182.47749"
+   y2="165.5703"
+   id="XMLID_111_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#494949;stop-opacity:1"
+   offset="0"
+   id="stop642" />
+
+              <svg:stop
+   style="stop-color:#c4cbcb;stop-opacity:1"
+   offset="1"
+   id="stop644" />
+
+              <midPointStop
+   id="midPointStop646"
+   style="stop-color:#494949"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop648"
+   style="stop-color:#494949"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop650"
+   style="stop-color:#C4CBCB"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="161.396,209.053 175.574,188.904 191.035,178.255 172.088,138.496 144.082,156.887 161.396,209.053 "
+   style="fill:url(#XMLID_111_)"
+   id="polygon653" />
+
+            <svg:linearGradient
+   x1="100.2744"
+   y1="151.52341"
+   x2="154.5625"
+   y2="151.52341"
+   id="XMLID_112_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop657" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop659" />
+
+              <midPointStop
+   id="midPointStop661"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop663"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop665"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 141.617,214.857 C 139.217,213.614 133.503,166.036 133.503,166.036 L 149.352,160.987 L 167.639,182.24 L 141.617,214.857 z "
+   style="fill:url(#XMLID_112_)"
+   id="path668" />
+
+            <svg:path
+   d="M 135.928,165.769 L 150.258,161.203 L 149.285,160.073 L 133.439,165.123 C 133.439,165.123 139.15,212.702 141.552,213.942 L 143.001,212.129 C 140.299,202.178 135.928,165.769 135.928,165.769 z "
+   style="fill:#ffffff"
+   id="path670" />
+
+            <svg:linearGradient
+   x1="117.7603"
+   y1="146.1875"
+   x2="117.7603"
+   y2="179.5137"
+   id="XMLID_113_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#ffffff;stop-opacity:1"
+   offset="0"
+   id="stop674" />
+
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="1"
+   id="stop676" />
+
+              <midPointStop
+   id="midPointStop678"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop680"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop682"
+   style="stop-color:#828282"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 136.209,205.119 C 136.209,205.119 163.844,222.833 168.377,216.888 C 172.912,210.944 169.307,189.259 169.307,189.259 L 148.182,188.104 L 136.209,205.119 z "
+   style="fill:url(#XMLID_113_)"
+   id="path685" />
+
+            <svg:linearGradient
+   x1="109.9058"
+   y1="159.85741"
+   x2="132.4502"
+   y2="159.85741"
+   id="XMLID_114_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop689" />
+
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="0.75840002"
+   id="stop691" />
+
+              <midPointStop
+   id="midPointStop693"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop695"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop697"
+   style="stop-color:#828282"
+   offset="0.7584" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 137.806,199.736 C 137.806,199.736 160.469,213.661 164.061,209.159 C 167.653,204.659 164.42,187.988 164.42,187.988 L 147.274,186.841 L 137.806,199.736 z "
+   style="fill:url(#XMLID_114_)"
+   id="path700" />
+
+            <svg:linearGradient
+   x1="105.1421"
+   y1="139.24319"
+   x2="122.7686"
+   y2="139.24319"
+   id="XMLID_115_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop704" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop706" />
+
+              <midPointStop
+   id="midPointStop708"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop710"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop712"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="128.813,190.587 118.709,185.285 118.015,203.28 135.143,207.731 145.785,199.496 128.813,190.587 "
+   style="fill:url(#XMLID_115_)"
+   id="polygon715" />
+
+            <svg:linearGradient
+   x1="156.75"
+   y1="169.791"
+   x2="183.51759"
+   y2="169.791"
+   id="XMLID_116_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="0"
+   id="stop719" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop721" />
+
+              <midPointStop
+   id="midPointStop723"
+   style="stop-color:#828282"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop725"
+   style="stop-color:#828282"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop727"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="161.715,162.163 158.496,143.041 172.574,137.558 198.578,145.84 186.486,168.6 161.715,162.163 "
+   style="fill:url(#XMLID_116_)"
+   id="polygon730" />
+
+            <svg:linearGradient
+   x1="105.1421"
+   y1="130.2363"
+   x2="122.7686"
+   y2="130.2363"
+   id="XMLID_117_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop734" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop736" />
+
+              <midPointStop
+   id="midPointStop738"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop740"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop742"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="118.015,203.28 118.74,203.469 128.813,190.587 118.709,185.285 118.015,203.28 "
+   style="fill:url(#XMLID_117_)"
+   id="polygon745" />
+
+            <svg:linearGradient
+   x1="119.3262"
+   y1="124.335"
+   x2="155.19341"
+   y2="124.335"
+   id="XMLID_118_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop749" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop751" />
+
+              <midPointStop
+   id="midPointStop753"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop755"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop757"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="121.416,185.987 116.264,188.158 106.53,170.962 122.801,155.021 135.552,156.504 135.106,180.222 121.416,185.987 "
+   style="fill:url(#XMLID_118_)"
+   id="polygon760" />
+
+            <svg:linearGradient
+   x1="97.902802"
+   y1="128.2021"
+   x2="146.27341"
+   y2="128.2021"
+   id="XMLID_119_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop764" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop766" />
+
+              <midPointStop
+   id="midPointStop768"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop770"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop772"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="110.287,208.604 122.798,173.355 133.439,165.122 130.914,173.632 125.862,190.652 110.287,208.604 "
+   style="fill:url(#XMLID_119_)"
+   id="polygon775" />
+
+            <svg:linearGradient
+   x1="116.7427"
+   y1="185.19141"
+   x2="148.7822"
+   y2="185.19141"
+   id="XMLID_120_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop779" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop781" />
+
+              <midPointStop
+   id="midPointStop783"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop785"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop787"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="172.428,206.42 191.693,196.759 175.811,174.299 172.428,206.42 "
+   style="fill:url(#XMLID_120_)"
+   id="polygon790" />
+
+            <svg:linearGradient
+   x1="136.19341"
+   y1="123.416"
+   x2="136.19341"
+   y2="110.5449"
+   id="XMLID_121_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop794" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop796" />
+
+              <midPointStop
+   id="midPointStop798"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop800"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop802"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="107.172,171.128 116.099,188.115 116.385,187.987 122.71,155.135 107.172,171.128 "
+   style="fill:url(#XMLID_121_)"
+   id="polygon805" />
+
+            <svg:linearGradient
+   x1="116.7427"
+   y1="170.68159"
+   x2="149.4102"
+   y2="170.68159"
+   id="XMLID_122_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0.6124"
+   id="stop809" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop811" />
+
+              <midPointStop
+   id="midPointStop813"
+   style="stop-color:#B6B6B6"
+   offset="0.6124" />
+
+              <midPointStop
+   id="midPointStop815"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop817"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="172.428,206.42 157.99,185.389 169.721,178.526 173.121,172.904 175.811,174.299 172.428,206.42 "
+   style="fill:url(#XMLID_122_)"
+   id="polygon820" />
+
+            <svg:polygon
+   points="160.811,184.922 172.541,178.061 175.053,173.908 173.121,172.904 169.721,178.526 157.99,185.389 172.428,206.42 172.846,202.457 160.811,184.922 "
+   style="fill:#ffffff"
+   id="polygon822" />
+
+            <svg:linearGradient
+   x1="164.56641"
+   y1="190.0674"
+   x2="164.56641"
+   y2="142.41209"
+   id="XMLID_123_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop826" />
+
+              <svg:stop
+   style="stop-color:#cacaca;stop-opacity:1"
+   offset="0.1974"
+   id="stop828" />
+
+              <svg:stop
+   style="stop-color:#dfdfdf;stop-opacity:1"
+   offset="0.47440001"
+   id="stop830" />
+
+              <svg:stop
+   style="stop-color:#ececec;stop-opacity:1"
+   offset="0.74510002"
+   id="stop832" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop834" />
+
+              <midPointStop
+   id="midPointStop836"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop838"
+   style="stop-color:#B6B6B6"
+   offset="0.3051" />
+
+              <midPointStop
+   id="midPointStop840"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="190.789,178.422 191.035,178.255 175.211,145.055 169.699,140.064 145.848,155.728 190.789,178.422 "
+   style="fill:url(#XMLID_123_)"
+   id="polygon843" />
+
+            <svg:linearGradient
+   x1="181.9404"
+   y1="159.6348"
+   x2="152.1692"
+   y2="129.86349"
+   id="XMLID_124_"
+   gradientUnits="userSpaceOnUse"
+   gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop847" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop849" />
+
+              <midPointStop
+   id="midPointStop851"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop853"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop855"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="176.551,157.991 141.352,129.293 145.891,174.763 176.551,157.991 "
+   style="fill:url(#XMLID_124_)"
+   id="polygon858" />
+
+            <svg:polygon
+   points="141.803,133.809 173.508,159.654 176.551,157.991 141.352,129.293 141.803,133.809 "
+   style="fill:#ffffff"
+   id="polygon860" />
+
+          </svg:g>
+
+          <svg:g
+   style="opacity:0.3"
+   id="g863">
+            <svg:linearGradient
+   x1="88.327599"
+   y1="138.93359"
+   x2="171.70821"
+   y2="55.553001"
+   id="XMLID_125_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#494949;stop-opacity:1"
+   offset="0"
+   id="stop867" />
+
+              <svg:stop
+   style="stop-color:#505050;stop-opacity:1"
+   offset="0.1654"
+   id="stop869" />
+
+              <svg:stop
+   style="stop-color:#5d5d5d;stop-opacity:1"
+   offset="0.59490001"
+   id="stop871" />
+
+              <svg:stop
+   style="stop-color:#616161;stop-opacity:1"
+   offset="1"
+   id="stop873" />
+
+              <midPointStop
+   id="midPointStop875"
+   style="stop-color:#494949"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop877"
+   style="stop-color:#494949"
+   offset="0.3051" />
+
+              <midPointStop
+   id="midPointStop879"
+   style="stop-color:#616161"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 115.615,46.039 C 115.615,46.039 110.599,49.973 110.331,50.181 C 110.034,50.375 96.197,59.384 96.197,59.384 C 95.332,59.947 94.828,60.791 94.657,61.702 C 87.131,61.391 69.327,60.66 69.327,60.66 C 67.309,60.575 65.512,61.762 65.069,63.47 C 65.002,63.734 64.965,64 64.965,64.263 C 64.965,65.693 65.95,67.02 67.528,67.59 C 67.528,67.59 71.217,68.921 74.904,70.252 C 74.883,70.392 74.822,70.522 74.822,70.664 L 74.822,89.876 C 74.822,90.858 75.3,91.772 76.096,92.443 C 70.545,94.84 69.313, [...]
+   style="opacity:0.5;fill:url(#XMLID_125_)"
+   id="path882" />
+
+            <svg:linearGradient
+   x1="89.107903"
+   y1="84.741203"
+   x2="152.7852"
+   y2="84.741203"
+   id="XMLID_126_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop886" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop888" />
+
+              <midPointStop
+   id="midPointStop890"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop892"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop894"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="152.785,73.231 97.847,71.068 89.523,81.166 89.108,89.458 93.768,98.414 152.785,73.231 "
+   style="fill:url(#linearGradient5513)"
+   id="polygon897" />
+
+            <svg:linearGradient
+   x1="79.251503"
+   y1="120.8281"
+   x2="125.7993"
+   y2="120.8281"
+   id="XMLID_127_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop901" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop903" />
+
+              <midPointStop
+   id="midPointStop905"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop907"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop909"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="113.732,96.279 79.251,130.437 94.767,145.377 125.799,115.492 113.732,96.279 "
+   style="fill:url(#XMLID_127_)"
+   id="polygon912" />
+
+            <svg:linearGradient
+   x1="115.9443"
+   y1="132.56931"
+   x2="167.68359"
+   y2="132.56931"
+   id="XMLID_128_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop916" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop918" />
+
+              <midPointStop
+   id="midPointStop920"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop922"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop924"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="115.944,136.841 138.117,147.512 167.684,128.301 150.438,117.627 115.944,136.841 "
+   style="fill:url(#XMLID_128_)"
+   id="polygon927" />
+
+            <svg:linearGradient
+   x1="98.694298"
+   y1="93.078598"
+   x2="187.3965"
+   y2="93.078598"
+   id="XMLID_129_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#616161;stop-opacity:1"
+   offset="0"
+   id="stop931" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop933" />
+
+              <midPointStop
+   id="midPointStop935"
+   style="stop-color:#616161"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop937"
+   style="stop-color:#616161"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop939"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="98.694,81.337 138.117,68.53 187.396,70.664 160.293,117.627 125.799,89.876 98.694,81.337 "
+   style="fill:url(#XMLID_129_)"
+   id="polygon942" />
+
+            <svg:linearGradient
+   x1="86.376503"
+   y1="111.2231"
+   x2="184.93159"
+   y2="111.2231"
+   id="XMLID_130_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#494949;stop-opacity:1"
+   offset="0"
+   id="stop946" />
+
+              <svg:stop
+   style="stop-color:#c4cbcb;stop-opacity:1"
+   offset="1"
+   id="stop948" />
+
+              <midPointStop
+   id="midPointStop950"
+   style="stop-color:#494949"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop952"
+   style="stop-color:#494949"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop954"
+   style="stop-color:#C4CBCB"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="86.376,117.627 118.406,126.166 138.117,138.974 184.932,106.953 150.438,83.473 86.376,117.627 "
+   style="fill:url(#XMLID_130_)"
+   id="polygon957" />
+
+            <svg:linearGradient
+   x1="71.667503"
+   y1="95.561501"
+   x2="146.76559"
+   y2="95.561501"
+   id="XMLID_131_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop961" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop963" />
+
+              <midPointStop
+   id="midPointStop965"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop967"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop969"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 71.667,98.822 C 72.5,95.936 134.445,75.282 134.445,75.282 L 146.765,90.226 L 124.59,115.84 L 71.667,98.822 z "
+   style="fill:url(#linearGradient5515)"
+   id="path972" />
+
+            <svg:path
+   d="M 135.654,77.726 L 146.795,91.24 L 147.973,89.877 L 135.655,74.935 C 135.655,74.935 73.708,95.589 72.876,98.474 L 75.821,99.421 C 88.249,93.53 135.654,77.726 135.654,77.726 z "
+   style="fill:#ffffff"
+   id="path974" />
+
+            <svg:linearGradient
+   x1="95.352097"
+   y1="90.179703"
+   x2="95.352097"
+   y2="127.8228"
+   id="XMLID_132_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#ffffff;stop-opacity:1"
+   offset="0"
+   id="stop978" />
+
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="1"
+   id="stop980" />
+
+              <midPointStop
+   id="midPointStop982"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop984"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop986"
+   style="stop-color:#828282"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 82.866,90.18 C 82.866,90.18 68.713,124.435 78.284,127.32 C 87.859,130.205 115.742,119.748 115.742,119.748 L 109.917,97.392 L 82.866,90.18 z "
+   style="fill:url(#XMLID_132_)"
+   id="path989" />
+
+            <svg:linearGradient
+   x1="84.628403"
+   y1="105.5117"
+   x2="115.7422"
+   y2="105.5117"
+   id="XMLID_133_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop993" />
+
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="0.75840002"
+   id="stop995" />
+
+              <midPointStop
+   id="midPointStop997"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop999"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1001"
+   style="stop-color:#828282"
+   offset="0.7584" />
+
+            </svg:linearGradient>
+
+            <svg:path
+   d="M 90.66,90.18 C 90.66,90.18 79.861,118.084 87.164,120.434 C 94.468,122.784 115.743,114.264 115.743,114.264 L 111.296,96.054 L 90.66,90.18 z "
+   style="fill:url(#XMLID_133_)"
+   id="path1004" />
+
+            <svg:linearGradient
+   x1="78.984901"
+   y1="82.119102"
+   x2="103.4116"
+   y2="82.119102"
+   id="XMLID_134_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop1008" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1010" />
+
+              <midPointStop
+   id="midPointStop1012"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1014"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1016"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="99.813,77.985 103.412,65.824 78.985,70.664 78.985,89.876 93.768,98.414 99.813,77.985 "
+   style="fill:url(#XMLID_134_)"
+   id="polygon1019" />
+
+            <svg:linearGradient
+   x1="149.50391"
+   y1="115.5073"
+   x2="186.3633"
+   y2="115.5073"
+   id="XMLID_135_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="0"
+   id="stop1023" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1025" />
+
+              <midPointStop
+   id="midPointStop1027"
+   style="stop-color:#828282"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1029"
+   style="stop-color:#828282"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1031"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="149.504,103.466 174.08,94.203 186.363,107.171 184.316,136.812 149.504,131.253 149.504,103.466 "
+   style="fill:url(#XMLID_135_)"
+   id="polygon1034" />
+
+            <svg:linearGradient
+   x1="78.984901"
+   y1="71.9048"
+   x2="103.4116"
+   y2="71.9048"
+   id="XMLID_136_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop1038" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop1040" />
+
+              <midPointStop
+   id="midPointStop1042"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1044"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1046"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="78.985,70.664 78.985,71.477 99.813,77.985 103.412,65.824 78.985,70.664 "
+   style="fill:url(#linearGradient5517)"
+   id="polygon1049" />
+
+            <svg:linearGradient
+   x1="98.694298"
+   y1="65.025398"
+   x2="147.9727"
+   y2="65.025398"
+   id="XMLID_137_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop1053" />
+
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="1"
+   id="stop1055" />
+
+              <midPointStop
+   id="midPointStop1057"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1059"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1061"
+   style="stop-color:#B6B6B6"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="103.412,68.86 98.694,64.167 118.406,48.714 145.51,60.732 147.973,74.469 115.944,81.337 103.412,68.86 "
+   style="fill:url(#linearGradient5519)"
+   id="polygon1064" />
+
+            <svg:linearGradient
+   x1="69.128403"
+   y1="69.597198"
+   x2="135.6543"
+   y2="69.597198"
+   id="XMLID_138_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop1068" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1070" />
+
+              <midPointStop
+   id="midPointStop1072"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1074"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1076"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="69.128,64.261 120.87,66.396 135.654,74.934 123.334,74.934 98.694,74.934 69.128,64.261 "
+   style="fill:url(#linearGradient5521)"
+   id="polygon1079" />
+
+            <svg:linearGradient
+   x1="93.767601"
+   y1="133.6367"
+   x2="138.1172"
+   y2="133.6367"
+   id="XMLID_139_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop1083" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1085" />
+
+              <midPointStop
+   id="midPointStop1087"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1089"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1091"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="93.768,128.301 113.48,145.377 138.117,121.896 93.768,128.301 "
+   style="fill:url(#XMLID_139_)"
+   id="polygon1094" />
+
+            <svg:linearGradient
+   x1="122.0112"
+   y1="64.238297"
+   x2="122.0112"
+   y2="49.432598"
+   id="XMLID_140_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop1098" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1100" />
+
+              <midPointStop
+   id="midPointStop1102"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1104"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1106"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="118.406,49.433 98.694,63.979 98.968,64.238 145.328,60.674 118.406,49.433 "
+   style="fill:url(#linearGradient5523)"
+   id="polygon1109" />
+
+            <svg:linearGradient
+   x1="93.767601"
+   y1="117.5337"
+   x2="139.0508"
+   y2="117.5337"
+   id="XMLID_141_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0.6124"
+   id="stop1113" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1115" />
+
+              <midPointStop
+   id="midPointStop1117"
+   style="stop-color:#B6B6B6"
+   offset="0.6124" />
+
+              <midPointStop
+   id="midPointStop1119"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1121"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="93.768,128.301 116.991,106.767 130.31,116.862 139.051,118.665 138.117,121.896 93.768,128.301 "
+   style="fill:url(#XMLID_141_)"
+   id="polygon1124" />
+
+            <svg:polygon
+   points="118.602,109.557 131.92,119.653 138.381,120.987 139.051,118.665 130.31,116.862 116.991,106.767 93.768,128.301 99.242,127.511 118.602,109.557 "
+   style="fill:#ffffff"
+   id="polygon1126" />
+
+            <svg:linearGradient
+   x1="159.9014"
+   y1="138.9736"
+   x2="159.9014"
+   y2="84.952599"
+   id="XMLID_142_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop1130" />
+
+              <svg:stop
+   style="stop-color:#cacaca;stop-opacity:1"
+   offset="0.1974"
+   id="stop1132" />
+
+              <svg:stop
+   style="stop-color:#dfdfdf;stop-opacity:1"
+   offset="0.47440001"
+   id="stop1134" />
+
+              <svg:stop
+   style="stop-color:#ececec;stop-opacity:1"
+   offset="0.74510002"
+   id="stop1136" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1138" />
+
+              <midPointStop
+   id="midPointStop1140"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1142"
+   style="stop-color:#B6B6B6"
+   offset="0.3051" />
+
+              <midPointStop
+   id="midPointStop1144"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="137.809,138.772 138.117,138.974 177.211,112.233 181.994,104.952 152.611,84.952 137.809,138.772 "
+   style="fill:url(#XMLID_142_)"
+   id="polygon1147" />
+
+            <svg:linearGradient
+   x1="179.9238"
+   y1="104.6089"
+   x2="143.1671"
+   y2="67.852097"
+   id="XMLID_143_"
+   gradientUnits="userSpaceOnUse">
+              <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop1151" />
+
+              <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1153" />
+
+              <midPointStop
+   id="midPointStop1155"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+              <midPointStop
+   id="midPointStop1157"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+              <midPointStop
+   id="midPointStop1159"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+            </svg:linearGradient>
+
+            <svg:polygon
+   points="160.293,117.627 186.566,72.101 127.044,90.88 160.293,117.627 "
+   style="fill:url(#XMLID_143_)"
+   id="polygon1162" />
+
+            <svg:polygon
+   points="180.656,73.965 156.992,114.973 160.293,117.627 186.566,72.101 180.656,73.965 "
+   style="fill:#ffffff"
+   id="polygon1164" />
+
+          </svg:g>
+
+          <svg:linearGradient
+   x1="95.401398"
+   y1="103.3657"
+   x2="158.21181"
+   y2="40.555302"
+   id="XMLID_144_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#494949;stop-opacity:1"
+   offset="0"
+   id="stop1169" />
+
+            <svg:stop
+   style="stop-color:#505050;stop-opacity:1"
+   offset="0.1654"
+   id="stop1171" />
+
+            <svg:stop
+   style="stop-color:#5d5d5d;stop-opacity:1"
+   offset="0.59490001"
+   id="stop1173" />
+
+            <svg:stop
+   style="stop-color:#616161;stop-opacity:1"
+   offset="1"
+   id="stop1175" />
+
+            <midPointStop
+   id="midPointStop1177"
+   style="stop-color:#494949"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1179"
+   style="stop-color:#494949"
+   offset="0.3051" />
+
+            <midPointStop
+   id="midPointStop1181"
+   style="stop-color:#616161"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 187.605,67.063 C 187.605,67.063 156.25,65.706 150.57,65.46 C 150.134,63.041 149.623,60.177 149.623,60.177 C 149.592,60.003 149.519,59.842 149.459,59.675 C 149.471,59.564 149.49,59.454 149.49,59.347 C 149.49,57.917 148.511,56.602 146.955,56.029 C 146.955,56.029 130.031,49.795 129.762,49.696 C 129.504,49.583 120.305,45.504 120.305,45.504 C 118.765,44.82 116.898,45.032 115.615,46.039 C 115.615,46.039 110.599,49.973 110.331,50.181 C 110.034,50.375 96.197,59.384 96.197,59.384 C 95.332 [...]
+   style="opacity:0.5;fill:url(#XMLID_144_)"
+   id="path1184" />
+
+          <svg:polygon
+   points="152.785,73.231 97.847,71.068 89.523,81.166 89.108,89.458 93.768,98.414 152.785,73.231 "
+   style="fill:url(#linearGradient5525)"
+   id="polygon1186" />
+
+          <svg:linearGradient
+   x1="98.694298"
+   y1="83.484398"
+   x2="187.3965"
+   y2="83.484398"
+   id="XMLID_146_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#616161;stop-opacity:1"
+   offset="0"
+   id="stop1190" />
+
+            <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1192" />
+
+            <midPointStop
+   id="midPointStop1194"
+   style="stop-color:#616161"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1196"
+   style="stop-color:#616161"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop1198"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 98.694,81.337 L 125.799,89.876 L 136.441,98.439 C 152.068,97.626 165.63,94.476 176.203,90.06 L 187.396,70.664 L 138.117,68.53 L 98.694,81.337 z "
+   style="fill:url(#XMLID_146_)"
+   id="path1201" />
+
+          <svg:path
+   d="M 71.667,98.822 C 72.5,95.936 134.445,75.282 134.445,75.282 L 146.765,90.226 L 124.59,115.84 L 71.667,98.822 z "
+   style="opacity:0.5;fill:url(#linearGradient5527)"
+   id="path1203" />
+
+          <svg:linearGradient
+   x1="86.275398"
+   y1="86.965302"
+   x2="146.76559"
+   y2="86.965302"
+   id="XMLID_148_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop1207" />
+
+            <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1209" />
+
+            <midPointStop
+   id="midPointStop1211"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1213"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop1215"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 86.275,92.206 C 97.811,96.146 112.159,98.648 128.401,98.648 C 132.329,98.648 136.147,98.501 139.841,98.223 L 146.765,90.226 L 134.445,75.282 C 134.445,75.282 104.826,85.158 86.275,92.206 z "
+   style="fill:url(#XMLID_148_)"
+   id="path1218" />
+
+          <svg:path
+   d="M 86.427,92.26 C 87.732,92.703 89.073,93.127 90.448,93.532 C 109.022,86.604 135.654,77.725 135.654,77.725 L 146.795,91.239 L 147.973,89.876 L 135.655,74.934 C 135.654,74.934 104.887,85.192 86.427,92.26 z "
+   style="fill:#ffffff"
+   id="path1220" />
+
+          <svg:linearGradient
+   x1="89.539101"
+   y1="93.951698"
+   x2="111.7031"
+   y2="93.951698"
+   id="XMLID_149_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop1224" />
+
+            <svg:stop
+   style="stop-color:#828282;stop-opacity:1"
+   offset="0.75840002"
+   id="stop1226" />
+
+            <midPointStop
+   id="midPointStop1228"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1230"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop1232"
+   style="stop-color:#828282"
+   offset="0.7584" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 111.703,97.724 L 111.295,96.054 L 90.66,90.18 C 90.66,90.18 90.201,91.37 89.539,93.263 C 96.153,95.273 103.596,96.814 111.703,97.724 z "
+   style="opacity:0.5;fill:url(#XMLID_149_)"
+   id="path1235" />
+
+          <svg:linearGradient
+   x1="78.984901"
+   y1="80.275902"
+   x2="103.4116"
+   y2="80.275902"
+   id="XMLID_150_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#dadada;stop-opacity:1"
+   offset="0"
+   id="stop1239" />
+
+            <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1241" />
+
+            <midPointStop
+   id="midPointStop1243"
+   style="stop-color:#DADADA"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1245"
+   style="stop-color:#DADADA"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop1247"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 78.985,89.374 C 83.668,91.447 88.996,93.261 94.859,94.728 L 99.814,77.986 L 103.413,65.825 L 78.986,70.665 L 78.986,89.374 L 78.985,89.374 z "
+   style="fill:url(#XMLID_150_)"
+   id="path1250" />
+
+          <svg:polygon
+   points="78.985,70.664 78.985,71.477 99.813,77.985 103.412,65.824 78.985,70.664 "
+   style="fill:url(#linearGradient5529)"
+   id="polygon1252" />
+
+          <svg:polygon
+   points="103.412,68.86 98.694,64.167 118.406,48.714 145.51,60.732 147.973,74.469 115.944,81.337 103.412,68.86 "
+   style="fill:url(#linearGradient5531)"
+   id="polygon1254" />
+
+          <svg:polygon
+   points="69.128,64.261 120.87,66.396 135.654,74.934 123.334,74.934 98.694,74.934 69.128,64.261 "
+   style="fill:url(#linearGradient5533)"
+   id="polygon1256" />
+
+          <svg:polygon
+   points="118.406,49.433 98.694,63.979 98.968,64.238 145.328,60.674 118.406,49.433 "
+   style="fill:url(#linearGradient5535)"
+   id="polygon1258" />
+
+          <svg:polygon
+   points="118.602,109.557 131.92,119.653 138.381,120.987 139.051,118.665 130.31,116.862 116.991,106.767 93.768,128.301 99.242,127.511 118.602,109.557 "
+   style="opacity:0.5;fill:#ffffff"
+   id="polygon1260" />
+
+          <svg:linearGradient
+   x1="173.4521"
+   y1="98.137199"
+   x2="143.8383"
+   y2="68.5233"
+   id="XMLID_155_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#b6b6b6;stop-opacity:1"
+   offset="0"
+   id="stop1264" />
+
+            <svg:stop
+   style="stop-color:#f0f0f0;stop-opacity:1"
+   offset="1"
+   id="stop1266" />
+
+            <midPointStop
+   id="midPointStop1268"
+   style="stop-color:#B6B6B6"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1270"
+   style="stop-color:#B6B6B6"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop1272"
+   style="stop-color:#F0F0F0"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 136.441,98.438 C 152.068,97.625 165.629,94.475 176.201,90.06 L 186.566,72.1 L 127.044,90.88 L 136.441,98.438 z "
+   style="fill:url(#XMLID_155_)"
+   id="path1275" />
+
+          <svg:path
+   d="M 170.029,92.383 C 172.189,91.658 174.242,90.879 176.201,90.061 L 186.566,72.101 L 180.656,73.965 L 170.029,92.383 z "
+   style="fill:#ffffff"
+   id="path1277" />
+
+          <svg:linearGradient
+   x1="60.097198"
+   y1="159.00591"
+   x2="118.7616"
+   y2="159.00591"
+   id="XMLID_156_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#ffffff;stop-opacity:1"
+   offset="0"
+   id="stop1281" />
+
+            <svg:stop
+   style="stop-color:#94caff;stop-opacity:1"
+   offset="1"
+   id="stop1283" />
+
+            <midPointStop
+   id="midPointStop1285"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1287"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop1289"
+   style="stop-color:#94CAFF"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 130.371,99.124 L 133.176,98.662 C 133.176,98.662 132.131,98.72 130.371,99.124 z M 130.371,99.124 L 114.952,101.659 L 104.768,101.659 C 104.768,101.659 77.968,86.178 73.68,96.166 C 66.621,114.142 70.304,197.926 71.309,218.121 C 76.876,220.924 83.259,223.315 90.266,225.202 C 90.004,218.424 89.661,210.124 89.224,200.045 C 85.565,115.677 120.138,101.476 130.371,99.124 z "
+   style="fill:url(#XMLID_156_)"
+   id="path1292" />
+
+          <svg:linearGradient
+   x1="60.098598"
+   y1="147.877"
+   x2="118.7651"
+   y2="147.877"
+   id="XMLID_157_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#ffffff;stop-opacity:1"
+   offset="0"
+   id="stop1296" />
+
+            <svg:stop
+   style="stop-color:#94caff;stop-opacity:1"
+   offset="1"
+   id="stop1298" />
+
+            <midPointStop
+   id="midPointStop1300"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1302"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop1304"
+   style="stop-color:#94CAFF"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 60.281,82.182 C 60.281,82.182 56.693,186.633 57.723,209.037 C 59.452,210.614 61.378,212.132 63.5,213.573 C 63.53,195.871 63.891,87.839 68.32,89.674 C 73.144,91.67 60.281,82.182 60.281,82.182 z "
+   style="opacity:0.8;fill:url(#XMLID_157_)"
+   id="path1307" />
+
+          <svg:linearGradient
+   x1="89.522499"
+   y1="27.434099"
+   x2="171.04311"
+   y2="108.9547"
+   id="XMLID_158_"
+   gradientUnits="userSpaceOnUse">
+            <svg:stop
+   style="stop-color:#99ccff;stop-opacity:1"
+   offset="0"
+   id="stop1311" />
+
+            <svg:stop
+   style="stop-color:#428aff;stop-opacity:1"
+   offset="1"
+   id="stop1313" />
+
+            <midPointStop
+   id="midPointStop1315"
+   style="stop-color:#99CCFF"
+   offset="0" />
+
+            <midPointStop
+   id="midPointStop1317"
+   style="stop-color:#99CCFF"
+   offset="0.5" />
+
+            <midPointStop
+   id="midPointStop1319"
+   style="stop-color:#428AFF"
+   offset="1" />
+
+          </svg:linearGradient>
+
+          <svg:path
+   d="M 128.402,25.989 C 83.899,25.989 47.822,44.044 47.822,66.314 C 47.822,88.585 83.899,106.639 128.402,106.639 C 172.906,106.639 208.985,88.585 208.985,66.314 C 208.984,44.044 172.906,25.989 128.402,25.989 z M 128.402,98.648 C 85.97,98.648 56.399,81.609 56.399,66.314 C 56.399,51.019 85.971,33.981 128.402,33.981 C 170.838,33.981 200.41,51.019 200.41,66.314 C 200.41,81.609 170.838,98.648 128.402,98.648 z "
+   style="fill:url(#XMLID_158_)"
+   id="path1322" />
+
+        </svg:g>
+      <svg:g
+         id="g5537">
+        <svg:g
+           id="g3529"
+           transform="matrix(0.7412392,0,0,0.7391334,-295.19968,150.10741)">
+          <svg:path
+             transform="matrix(0.9923614,0,0,0.9920073,25.652148,-20.002373)"
+             d="M 779.80836 19.941927 A 200.39491 200.88971 0 1 1  379.01854,19.941927 A 200.39491 200.88971 0 1 1  779.80836 19.941927 z"
+             sodipodi:ry="200.88971"
+             sodipodi:rx="200.39491"
+             sodipodi:cy="19.941927"
+             sodipodi:cx="579.41345"
+             id="path2550"
+             style="opacity:1;fill:#c4c4c4;fill-opacity:0;stroke:#c4c4c4;stroke-width:5.03938627;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             sodipodi:type="arc" />
+          <svg:path
+             transform="matrix(0.8856739,0,0,0.8637239,69.737567,-0.3411565)"
+             d="M 783.76672 0.14983602 A 185.05603 190.00406 0 1 1  413.65466,0.14983602 A 185.05603 190.00406 0 1 1  783.76672 0.14983602 z"
+             sodipodi:ry="190.00406"
+             sodipodi:rx="185.05603"
+             sodipodi:cy="0.14983602"
+             sodipodi:cx="598.71069"
+             id="path3521"
+             style="opacity:1;fill:#c4c4c4;fill-opacity:0;stroke:#ff0000;stroke-width:59.68395996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             sodipodi:type="arc" />
+        </svg:g>
+        <svg:path
+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:22.20556641;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+           d="M 47.781161,54.918537 C 241.40194,248.02618 241.40194,248.02618 241.40194,248.02618"
+           id="path3523" />
+      </svg:g>
+    </svg:g>
+    <svg:polyline
+       style="fill:none"
+       points="0,256 0,0 256,0 256,256 "
+       knockout="Off"
+       id="_x3C_Slice_x3E_"
+       transform="translate(28.185567,26.252578)" />
+  </svg:g>
+  <svg:g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Bord blanc"
+     style="display:inline" />
+</svg:svg>
diff --git a/interface/images/menu/World.svg b/interface/images/menu/World.svg
new file mode 100755
index 0000000..30424a1
--- /dev/null
+++ b/interface/images/menu/World.svg
@@ -0,0 +1,520 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="256.00000px"
+   height="256.00000px"
+   id="svg1315"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   sodipodi:docbase="C:\Users\Chris\Desktop"
+   sodipodi:docname="Erioll world 2.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <linearGradient
+       id="linearGradient2236">
+      <stop
+         id="stop2238"
+         offset="0.0000000"
+         style="stop-color:#1b071d;stop-opacity:1.0000000;" />
+      <stop
+         id="stop2240"
+         offset="1.0000000"
+         style="stop-color:#270b25;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2258">
+      <stop
+         style="stop-color:#1cbdfb;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2260" />
+      <stop
+         style="stop-color:#043f74;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop2262" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2233">
+      <stop
+         style="stop-color:#1cd7fb;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2235" />
+      <stop
+         style="stop-color:#1eadeb;stop-opacity:1.0000000;"
+         offset="0.44000000"
+         id="stop2237" />
+      <stop
+         style="stop-color:#0e8adc;stop-opacity:1.0000000;"
+         offset="0.57999998"
+         id="stop2239" />
+      <stop
+         style="stop-color:#065297;stop-opacity:1.0000000;"
+         offset="0.76999998"
+         id="stop2241" />
+      <stop
+         style="stop-color:#044374;stop-opacity:0.96470588;"
+         offset="0.89499998"
+         id="stop2243" />
+      <stop
+         style="stop-color:#043f74;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop2245" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2189">
+      <stop
+         style="stop-color:#0f75d2;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop2191" />
+      <stop
+         style="stop-color:#032b51;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2195" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2312">
+      <stop
+         style="stop-color:#f7f7f7;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2314" />
+      <stop
+         style="stop-color:#9ed4e2;stop-opacity:1.0000000;"
+         offset="0.67000002"
+         id="stop2320" />
+      <stop
+         style="stop-color:#3aa5ca;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2316" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2194">
+      <stop
+         style="stop-color:#1cd7fb;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2196" />
+      <stop
+         style="stop-color:#043f74;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop2198" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4066">
+      <stop
+         id="stop4068"
+         offset="0.0000000"
+         style="stop-color:#f2fffd;stop-opacity:1.0000000;" />
+      <stop
+         id="stop4070"
+         offset="1.0000000"
+         style="stop-color:#097e82;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2194"
+       id="radialGradient2208"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.006773,0.993272)"
+       cx="353.42407"
+       cy="175.28014"
+       fx="342.10938"
+       fy="180.93758"
+       r="539.79822" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066"
+       id="radialGradient2268"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.024251,0.976323)"
+       cx="73.184441"
+       cy="46.918106"
+       fx="73.184441"
+       fy="46.918106"
+       r="211.52753" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066"
+       id="radialGradient2272"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.024251,0.976323)"
+       cx="73.184441"
+       cy="46.918106"
+       fx="73.184441"
+       fy="46.918106"
+       r="211.52753" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066"
+       id="radialGradient2276"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.024149,0.000000,0.000000,0.976323,0.524657,-0.122721)"
+       cx="73.184441"
+       cy="46.918106"
+       fx="73.184441"
+       fy="46.918106"
+       r="211.52753" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066"
+       id="radialGradient2294"
+       gradientTransform="scale(1.024251,0.976323)"
+       cx="73.184441"
+       cy="43.483139"
+       fx="73.184441"
+       fy="43.483139"
+       r="216.25491"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066"
+       id="radialGradient2298"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.024251,0.976323)"
+       cx="73.184441"
+       cy="43.483139"
+       fx="73.184441"
+       fy="43.483139"
+       r="216.25491" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066"
+       id="radialGradient2302"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.024251,0.976323)"
+       cx="73.184441"
+       cy="43.483139"
+       fx="73.184441"
+       fy="43.483139"
+       r="216.25491" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066"
+       id="radialGradient2306"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.024251,0.976323)"
+       cx="73.184441"
+       cy="43.483139"
+       fx="73.184441"
+       fy="43.483139"
+       r="216.25491" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066"
+       id="radialGradient2310"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.013655,0.986529)"
+       cx="82.707672"
+       cy="62.766144"
+       fx="82.707672"
+       fy="62.766144"
+       r="221.16626" />
+    <radialGradient
+       r="217.14053"
+       fy="53.788040"
+       fx="69.951530"
+       cy="53.788040"
+       cx="69.951530"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,0.999833,-1.366161,0.764419)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2187"
+       xlink:href="#linearGradient2189"
+       inkscape:collect="always" />
+    <radialGradient
+       r="217.14053"
+       fy="53.788040"
+       fx="69.951530"
+       cy="53.788040"
+       cx="69.951530"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,0.999833,-1.366161,0.764419)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2203"
+       xlink:href="#linearGradient2189"
+       inkscape:collect="always" />
+    <radialGradient
+       r="217.14053"
+       fy="53.788040"
+       fx="69.951530"
+       cy="53.788040"
+       cx="69.951530"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,0.999833,-1.466166,-0.831896)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2207"
+       xlink:href="#linearGradient2189"
+       inkscape:collect="always" />
+    <radialGradient
+       r="217.14053"
+       fy="53.788040"
+       fx="69.951530"
+       cy="53.788040"
+       cx="69.951530"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,0.999833,-1.466166,0.764432)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2211"
+       xlink:href="#linearGradient2189"
+       inkscape:collect="always" />
+    <radialGradient
+       r="217.14053"
+       fy="53.788040"
+       fx="69.951530"
+       cy="53.788040"
+       cx="69.951530"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,0.999833,-1.366161,-0.831909)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2215"
+       xlink:href="#linearGradient2189"
+       inkscape:collect="always" />
+    <radialGradient
+       r="217.14053"
+       fy="53.788040"
+       fx="69.951530"
+       cy="53.788040"
+       cx="69.951530"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,0.999833,-1.366161,-0.831909)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2219"
+       xlink:href="#linearGradient2189"
+       inkscape:collect="always" />
+    <radialGradient
+       r="217.14053"
+       fy="53.788040"
+       fx="69.951530"
+       cy="53.788040"
+       cx="69.951530"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,0.999833,-1.366161,-0.831909)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2223"
+       xlink:href="#linearGradient2189"
+       inkscape:collect="always" />
+    <radialGradient
+       r="217.14053"
+       fy="53.788040"
+       fx="69.951530"
+       cy="53.788040"
+       cx="69.951530"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,0.999833,-1.366161,0.764419)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2227"
+       xlink:href="#linearGradient2189"
+       inkscape:collect="always" />
+    <radialGradient
+       r="539.79822"
+       fy="180.93758"
+       fx="342.10938"
+       cy="175.28014"
+       cx="353.42407"
+       gradientTransform="scale(1.006773,0.993272)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2247"
+       xlink:href="#linearGradient2233"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       r="444.49182"
+       fy="441.17734"
+       fx="144.10077"
+       cy="441.17734"
+       cx="144.10077"
+       gradientTransform="scale(1.006773,0.993272)"
+       id="radialGradient2264"
+       xlink:href="#linearGradient2258"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2312"
+       id="radialGradient1506"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.036676,0.000000,0.000000,1.008933,-1.366157,-1.614994)"
+       cx="69.951530"
+       cy="53.788040"
+       fx="69.951530"
+       fy="53.788040"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2236"
+       id="radialGradient1487"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.870829,0.534522)"
+       cx="205.25664"
+       cy="415.32397"
+       fx="205.25664"
+       fy="415.32397"
+       r="41.158230" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2236"
+       id="radialGradient2273"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.870829,0.534522)"
+       cx="205.25664"
+       cy="415.32397"
+       fx="205.25664"
+       fy="415.32397"
+       r="41.158230" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4142136"
+     inkscape:cx="133.24101"
+     inkscape:cy="130.79657"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="930"
+     inkscape:window-height="623"
+     inkscape:window-x="350"
+     inkscape:window-y="255" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Adrien Facélina</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/LGPL/2.1/">
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Reproduction" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Distribution" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Notice" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/ShareAlike" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/SourceCode" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="globe ombre"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <path
+       transform="matrix(0.915584,0.000000,0.000000,1.000000,-224.4843,6.786830)"
+       d="M 461.00000 222.00000 A 77.000000 22.000000 0 1 1  307.00000,222.00000 A 77.000000 22.000000 0 1 1  461.00000 222.00000 z"
+       sodipodi:ry="22.000000"
+       sodipodi:rx="77.000000"
+       sodipodi:cy="222.00000"
+       sodipodi:cx="384.00000"
+       id="path1471"
+       style="fill:url(#radialGradient1487);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-opacity:1.0000000"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="globe">
+    <path
+       sodipodi:type="arc"
+       style="stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-linejoin:miter;stroke-linecap:butt;stroke-width:0.0000000;stroke:#ffffff;fill-rule:evenodd;fill-opacity:1.0000000;fill:#054a88"
+       id="path5993"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="M 737.43018 376.39664 A 364.52515 359.63687 0 1 1  8.3798828,376.39664 A 364.52515 359.63687 0 1 1  737.43018 376.39664 z"
+       transform="matrix(0.312736,0.000000,0.000000,0.316987,10.37931,2.687594)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#0d91dc;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;opacity:0.79999998"
+       id="path2216"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="M 737.43018 376.39664 A 364.52515 359.63687 0 1 1  8.3798828,376.39664 A 364.52515 359.63687 0 1 1  737.43018 376.39664 z"
+       transform="matrix(0.306481,0.000000,0.000000,0.310647,12.71173,5.073851)" />
+    <path
+       sodipodi:type="arc"
+       style="stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-linejoin:miter;stroke-linecap:butt;stroke-width:0.0000000;stroke:#ffffff;fill-rule:evenodd;fill-opacity:1.0;fill:url(#radialGradient2208)"
+       id="path2206"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="M 737.43018 376.39664 A 364.52515 359.63687 0 1 1  8.3798828,376.39664 A 364.52515 359.63687 0 1 1  737.43018 376.39664 z"
+       transform="matrix(0.312736,0.000000,0.000000,0.316987,10.37931,2.686946)" />
+    <path
+       sodipodi:type="arc"
+       style="stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-linejoin:miter;stroke-linecap:butt;stroke-width:0.0000000;stroke:#ffffff;fill-rule:evenodd;fill-opacity:1.0;fill:url(#radialGradient2247)"
+       id="path2231"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="M 737.43018 376.39664 A 364.52515 359.63687 0 1 1  8.3798828,376.39664 A 364.52515 359.63687 0 1 1  737.43018 376.39664 z"
+       transform="matrix(0.312736,0.000000,0.000000,0.316987,10.37931,2.686946)" />
+  </g>
+  <g
+     inkscape:label="carte ombre"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <path
+       style="opacity:0.099999793;fill:url(#radialGradient2227);fill-opacity:1.0000000"
+       d="M 127.00000 8.0000000 C 64.071925 8.0000000 13.000000 59.071883 13.000000 122.00000 C 13.000000 148.57807 22.171165 172.98140 37.437500 192.37500 C 40.062000 189.12154 40.940139 183.79985 38.687500 180.18750 C 37.144623 173.46627 40.010500 165.86654 35.437500 159.81250 C 29.526631 148.57970 24.336843 136.81061 23.750000 123.96875 C 23.797660 117.64099 21.373589 110.22834 22.843750 104.59375 C 30.463235 98.178316 23.876911 86.178137 31.437500 79.875000 C 35.379360 76.356573 32.7 [...]
+       id="path2213" />
+    <path
+       style="opacity:0.19999982;fill:url(#radialGradient2203);fill-opacity:1.0000000"
+       d="M 127.00000 8.0000000 C 72.501691 8.0000000 26.959419 46.330788 15.718750 97.468750 C 16.445463 99.043119 17.408660 100.51660 18.750000 101.71875 C 24.129398 99.527160 21.271495 92.417499 23.031250 87.875000 C 21.543930 81.762322 23.325968 81.141452 27.406250 78.406250 C 27.229200 74.560458 33.856336 69.464666 28.343750 66.656250 C 33.872384 67.035464 38.524795 59.105121 43.937500 64.218750 C 46.604814 67.170604 51.278621 72.449915 54.750000 67.250000 C 57.819359 61.701907 62.9 [...]
+       id="path2197" />
+    <path
+       style="opacity:0.29999986;fill:url(#radialGradient2187);fill-opacity:1.0000000"
+       d="M 127.00000 8.0000000 C 123.88946 8.0000000 120.82912 8.2239142 117.78125 8.4687500 C 116.12506 8.6155134 114.46222 8.7556093 112.81250 8.9687500 C 111.65574 9.1128069 110.52077 9.3215067 109.37500 9.5000000 C 107.11887 9.8558969 104.85833 10.207434 102.62500 10.687500 C 101.83238 10.860552 101.06763 11.091786 100.28125 11.281250 C 97.929421 11.847883 95.573871 12.383697 93.281250 13.093750 C 93.082438 13.155324 92.885846 13.218618 92.687500 13.281250 C 65.483784 21.871453 42.7 [...]
+       id="path2181" />
+    <path
+       style="opacity:0.29999990;fill:url(#radialGradient2211);fill-opacity:1.0000000"
+       d="M 127.59375 9.2187500 C 125.32305 9.2212284 123.05793 9.3029259 120.78125 9.4062500 C 91.797857 11.031531 63.607047 23.759210 43.500000 44.625000 C 41.221161 46.989832 39.154659 49.555267 37.093750 52.125000 C 34.452840 55.516631 32.031737 59.067971 29.781250 62.750000 C 29.644411 63.151546 29.430750 63.515360 29.343750 63.937500 C 31.334159 61.611965 33.891300 61.420619 36.281250 59.968750 C 39.172795 57.158780 39.690377 57.819585 41.562500 59.125000 C 45.273097 54.755291 42.8 [...]
+       id="path2205" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="carte">
+    <path
+       id="path3298"
+       d="M 118.37587,229.33304 C 117.80046,229.24138 117.30363,228.96348 117.27172,228.71610 C 117.23992,228.46872 117.19410,228.08798 117.16998,227.86983 C 117.11121,227.33941 114.44074,225.00037 112.68690,223.94274 C 111.80855,223.41305 111.09903,222.59914 110.80358,221.78303 C 110.54282,221.06199 110.19270,220.47231 110.02548,220.47231 C 109.85829,220.47231 109.72150,220.22521 109.72150,219.92385 C 109.72150,219.62177 109.36054,219.12257 108.91948,218.81371 C 108.47829,218.50487 108. [...]
+       style="fill:url(#radialGradient1506);fill-opacity:1.0000000" />
+    <path
+       style="fill:url(#radialGradient2310);fill-opacity:1.0"
+       d="M 121.03809,8.8804066 C 114.58019,9.7903960 108.06733,10.392401 101.75295,12.123555 C 94.304737,13.715375 86.950341,15.964130 80.019370,19.168820 C 72.228578,23.003704 64.712910,27.457161 57.694266,32.617044 C 55.407596,33.646240 57.347725,34.112206 57.088065,35.779153 C 56.448194,37.236217 55.099591,38.333236 53.952968,39.430103 C 52.682696,39.540582 51.604214,40.296055 50.713175,40.911438 C 50.282402,42.558610 49.351588,44.872693 47.279249,44.500187 C 46.159773,43.640756 47.7 [...]
+       id="path2284" />
+  </g>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       sodipodi:type="arc"
+       style="stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-linejoin:miter;stroke-linecap:butt;stroke-width:0.0000000;stroke:#ffffff;fill-rule:evenodd;fill-opacity:1.0000000;fill:none"
+       id="path1493"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="M 737.43018 376.39664 A 364.52515 359.63687 0 1 1  8.3798828,376.39664 A 364.52515 359.63687 0 1 1  737.43018 376.39664 z"
+       transform="matrix(0.312736,0.000000,0.000000,0.316987,10.37931,2.686946)" />
+  </g>
+</svg>
diff --git a/interface/images/menu/about.svg b/interface/images/menu/about.svg
new file mode 100755
index 0000000..723e35b
--- /dev/null
+++ b/interface/images/menu/about.svg
@@ -0,0 +1,716 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="gtk-info.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3665">
+      <stop
+         id="stop3667"
+         offset="0"
+         style="stop-color:#3e5e8e;stop-opacity:1;" />
+      <stop
+         id="stop3669"
+         offset="1"
+         style="stop-color:#89a4cb;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3739">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3742" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3744" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3731">
+      <stop
+         id="stop3733"
+         offset="0"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ebebeb;stop-opacity:1;"
+         offset="0.30654153"
+         id="stop3757" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.70706075"
+         id="stop3737" />
+      <stop
+         id="stop3759"
+         offset="0.84501493"
+         style="stop-color:#fafafa;stop-opacity:1" />
+      <stop
+         id="stop3735"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2881">
+      <stop
+         style="stop-color:#3e5e8e;stop-opacity:1;"
+         offset="0"
+         id="stop2883" />
+      <stop
+         style="stop-color:#89a4cb;stop-opacity:1;"
+         offset="1"
+         id="stop2885" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3771">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3773" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3775" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3697">
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="0"
+         id="stop3699" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop3701" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3627">
+      <stop
+         style="stop-color:#0b3879;stop-opacity:1;"
+         offset="0"
+         id="stop3629" />
+      <stop
+         style="stop-color:#1151b1;stop-opacity:1;"
+         offset="1"
+         id="stop3631" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3614">
+      <stop
+         id="stop3616"
+         offset="0"
+         style="stop-color:#65a31b;stop-opacity:1;" />
+      <stop
+         id="stop3618"
+         offset="1"
+         style="stop-color:#a0de42;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#194d93;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#5a9bf3;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3614"
+       id="linearGradient3617"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3644">
+      <path
+         style="fill:url(#linearGradient3648);fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 12,96 c -3.324,0 -6,2.676 -6,6 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-72 c 0,-3.324 -2.676,-6 -6,-6 l -72,0 z m 36,11 c 18.225397,0 33,12.08831 33,27 0,14.91169 -14.774603,27 -33,27 -2.713933,0 -5.351493,-0.27575 -7.875,-0.78125 -3.392649,3.54119 -9.783335,8.23332 -19.40625,7.1875 7.429736,-2.10018 8.999125,-8.24125 9.34375,-10.75 C 20.99976,151.84346 15,143.49844 15,134 15,119.08831 29.774603,107 48,107 z"
+         id="path3646" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3614"
+       id="linearGradient3648"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,90)"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3662">
+      <path
+         style="opacity:0.6;fill:#ff0000;fill-opacity:1;stroke:none"
+         d="m 48,97 c -18.225397,0 -33,12.08831 -33,27 0,9.49844 5.99976,17.84346 15.0625,22.65625 -0.344625,2.50875 -1.914014,8.64982 -9.34375,10.75 9.622915,1.04582 16.013601,-3.64631 19.40625,-7.1875 C 42.648507,150.72425 45.286067,151 48,151 66.225397,151 81,138.91169 81,124 81,109.08831 66.225397,97 48,97 z"
+         id="path3664" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3697"
+       id="linearGradient3703"
+       x1="46.125015"
+       y1="63.048103"
+       x2="46.125015"
+       y2="24.840103"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3697"
+       id="linearGradient3761"
+       gradientUnits="userSpaceOnUse"
+       x1="46.125015"
+       y1="63.048103"
+       x2="46.125015"
+       y2="24.840103" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3697"
+       id="linearGradient3661"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-125,0.65261)"
+       x1="71.671646"
+       y1="62.025059"
+       x2="71.671646"
+       y2="26.413651" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3731"
+       id="linearGradient3664"
+       gradientUnits="userSpaceOnUse"
+       x1="48.082497"
+       y1="75.561722"
+       x2="46.654823"
+       y2="16.972879"
+       gradientTransform="translate(0,1)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3739"
+       id="linearGradient3746"
+       x1="15"
+       y1="48.272731"
+       x2="81"
+       y2="48.272731"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2881"
+       id="linearGradient3662"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(100,0)" />
+    <inkscape:perspective
+       id="perspective2877"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3026"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2886"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2888" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2890" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2893"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2895" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2897" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2900"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2902" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2904" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2907"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2909" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2911" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2918"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8083674"
+     inkscape:cx="-158.91562"
+     inkscape:cy="32.522499"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer7"
+     showgrid="false"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1023"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer7"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99097413"
+       inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+       style="opacity:0.07999998;fill:url(#linearGradient2918);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3786"
+       d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0360184"
+       inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3778"
+       d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98962283"
+       inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3770"
+       d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+       transform="scale(1,-1)" />
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect3723"
+       width="86"
+       height="85"
+       x="5"
+       y="-92"
+       rx="7"
+       ry="7"
+       transform="scale(1,-1)" />
+    <rect
+       transform="scale(1,-1)"
+       ry="6"
+       rx="6"
+       y="-91"
+       x="6"
+       height="84"
+       width="84"
+       id="rect3716"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="fill:url(#linearGradient3617);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.4;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.2;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="106"
+       height="84"
+       width="84"
+       id="rect3659"
+       style="fill:url(#linearGradient3662);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:inline">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Bubble">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.2010354"
+       inkscape:original="M 48 14.9375 C 28.420799 14.9375 11.9375 28.085894 11.9375 45 C 11.9375 54.944956 17.913927 63.49076 26.53125 68.875 C 26.311269 69.708558 26.094771 70.562311 25.46875 71.53125 C 24.437392 73.127557 22.920756 74.606988 19.9375 75.46875 C 19.926732 75.47186 19.917056 75.465655 19.90625 75.46875 A 1.0827956 1.0827956 0 0 0 19.71875 75.53125 L 19.5625 75.59375 L 19.96875 76.59375 C 19.75792 76.095108 19.538578 75.590818 19.53125 75.59375 C 19.516595 75.599613 19.51 [...]
+       style="opacity:0.05;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3724"
+       d="m 48,13.75 c -20.116904,0 -37.25,13.555598 -37.25,31.25 0,10.082276 5.917985,18.697557 14.34375,24.28125 -0.156911,0.525325 -0.266588,1.03901 -0.625,1.59375 -0.919882,1.423768 -2.132056,2.647096 -4.84375,3.4375 -0.01115,0.0032 -0.02005,-0.0032 -0.03125,0 -0.01706,0.0041 -0.01361,-0.0051 -0.03125,0 -0.06018,0.01709 -0.127309,0.03202 -0.125,0.03125 0.0027,-9.11e-4 -0.10648,0.04343 -0.15625,0.0625 -0.01244,0.0048 -0.03191,0.03154 -0.03125,0.03125 l -0.125,0.03125 a 1.2011555,1.201 [...]
+       transform="translate(0,1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0826874"
+       inkscape:original="M 48 16.03125 C 28.903137 16.03125 13.03125 28.79275 13.03125 45 C 13.03125 54.812619 19.046483 63.310203 27.84375 68.5 C 27.615962 69.547432 27.230542 70.800814 26.375 72.125 C 25.225967 73.903442 23.427947 75.606431 20.15625 76.53125 A 0.98625776 0.98625776 0 0 0 20.125 76.53125 L 19.96875 76.59375 C 19.968851 76.593707 19.812403 76.656302 19.8125 76.65625 C 19.812597 76.656198 19.687408 76.75006 19.6875 76.75 C 19.687592 76.74994 19.531163 76.843817 19.53125  [...]
+       style="opacity:0.05;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3720"
+       d="m 48,14.9375 c -19.579201,0 -36.0625,13.148394 -36.0625,30.0625 0,9.944956 5.976427,18.49076 14.59375,23.875 -0.219981,0.833558 -0.436479,1.687311 -1.0625,2.65625 -1.031358,1.596307 -2.547994,3.075738 -5.53125,3.9375 -0.01077,0.0031 -0.02044,-0.0031 -0.03125,0 a 1.0827956,1.0827956 0 0 0 -0.1875,0.0625 l -0.15625,0.0625 0.40625,1 c -0.21083,-0.498642 -0.430172,-1.002932 -0.4375,-1 -0.01466,0.0059 -0.01172,0.02344 -0.03125,0.03125 -0.01953,0.0078 -0.0479,0.02541 -0.0625,0.03125  [...]
+       transform="translate(0,1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98615915"
+       inkscape:original="M 48 17.03125 C 29.340321 17.03125 14.03125 29.439569 14.03125 45 C 14.03125 54.666704 20.029295 63.089309 28.96875 68.09375 C 28.758232 69.286384 28.317427 70.955747 27.21875 72.65625 C 25.963676 74.59882 23.92866 76.481895 20.4375 77.46875 A 0.98224108 0.98224108 0 0 0 20.625 79.375 C 30.315483 80.428166 36.870683 75.879082 40.46875 72.25 C 42.897609 72.704466 45.403113 72.96875 48 72.96875 C 66.659679 72.96875 81.96875 60.560431 81.96875 45 C 81.96875 29.4395 [...]
+       style="opacity:0.12000002;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3716"
+       d="m 48,16.03125 c -19.096863,0 -34.96875,12.7615 -34.96875,28.96875 0,9.812619 6.015233,18.310203 14.8125,23.5 -0.227788,1.047432 -0.613208,2.300814 -1.46875,3.625 -1.149033,1.778442 -2.947053,3.481431 -6.21875,4.40625 a 0.98625776,0.98625776 0 0 0 -0.03125,0 c 1.04e-4,-3.5e-5 -0.156351,0.06254 -0.15625,0.0625 1.01e-4,-4.3e-5 -0.156347,0.06255 -0.15625,0.0625 9.7e-5,-5.2e-5 -0.125092,0.09381 -0.125,0.09375 9.2e-5,-6e-5 -0.156337,0.09382 -0.15625,0.09375 8.7e-5,-6.7e-5 -0.125081,0 [...]
+       transform="translate(0,1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98214287"
+       inkscape:original="M 48 18 C 29.774603 18 15 30.088312 15 45 C 15 54.498438 20.99976 62.843462 30.0625 67.65625 C 29.717875 70.165004 28.148486 76.306067 20.71875 78.40625 C 30.341665 79.452073 36.732351 74.759944 40.125 71.21875 C 42.648507 71.724251 45.286067 72 48 72 C 66.225397 72 81 59.911688 81 45 C 81 30.088312 66.225397 18 48 18 z M 50.78125 27 C 52.015522 27.000035 53.068914 27.427178 53.9375 28.25 C 54.821293 29.07289 55.249984 30.060687 55.25 31.21875 C 55.249984 32.376 [...]
+       style="opacity:0.23999999;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3712"
+       d="m 48,17.03125 c -18.659679,0 -33.96875,12.408319 -33.96875,27.96875 0,9.666704 5.998045,18.089309 14.9375,23.09375 -0.210518,1.192634 -0.651323,2.861997 -1.75,4.5625 -1.255074,1.94257 -3.29009,3.825645 -6.78125,4.8125 A 0.98224108,0.98224108 0 0 0 20.625,79.375 C 30.315483,80.428166 36.870683,75.879082 40.46875,72.25 42.897609,72.704466 45.403113,72.96875 48,72.96875 66.659679,72.96875 81.96875,60.560431 81.96875,45 81.96875,29.439569 66.659679,17.03125 48,17.03125 z m 2.78125, [...]
+       transform="translate(0,1)" />
+    <path
+       style="fill:url(#linearGradient3664);fill-opacity:1;stroke:none;display:inline"
+       d="m 48,18 c -18.225397,0 -33,12.088312 -33,27 0,9.498438 5.99976,17.843462 15.0625,22.65625 -0.344625,2.508754 -1.914014,8.649817 -9.34375,10.75 9.622915,1.045823 16.013601,-3.646306 19.40625,-7.1875 C 42.648507,71.724251 45.286067,72 48,72 66.225397,72 81,59.911688 81,45 81,30.088312 66.225397,18 48,18 z m 2.78125,9 c 1.234272,3.5e-5 2.287664,0.427178 3.15625,1.25 0.883793,0.82289 1.312484,1.810687 1.3125,2.96875 -1.6e-5,1.158126 -0.428707,2.145922 -1.3125,2.96875 -0.868586,0.80 [...]
+       id="path3620" />
+    <path
+       id="path3625"
+       d="m -52,18 c -18.225397,0 -33,12.088312 -33,27 0,9.498438 5.99976,17.843462 15.0625,22.65625 -0.344625,2.508754 -1.914014,8.649817 -9.34375,10.75 9.622915,1.045823 16.013601,-3.646306 19.40625,-7.1875 C -57.351493,71.724251 -54.713933,72 -52,72 -33.774603,72 -19,59.911688 -19,45 -19,30.088312 -33.774603,18 -52,18 z"
+       style="opacity:0.4;fill:#d40000;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       style="opacity:0.05;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       d="m -52,18 c -18.225397,0 -33,12.088312 -33,27 0,9.498438 5.99976,17.843462 15.0625,22.65625 -0.344625,2.508754 -1.914014,8.649817 -9.34375,10.75 9.622915,1.045823 16.013601,-3.646306 19.40625,-7.1875 C -57.351493,71.724251 -54.713933,72 -52,72 -33.774603,72 -19,59.911688 -19,45 -19,30.088312 -33.774603,18 -52,18 z m 0,2.9375 c 16.920322,0 30.0625,11.100368 30.0625,24.0625 0,12.962132 -13.142178,24.0625 -30.0625,24.0625 -2.514011,0 -4.943414,-0.281692 -7.28125,-0.75 A 2.9517629,2 [...]
+       id="path3811" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       d="m -52,18 c -18.225397,0 -33,12.088312 -33,27 0,9.498438 5.99976,17.843462 15.0625,22.65625 -0.344625,2.508754 -1.914014,8.649817 -9.34375,10.75 9.622915,1.045823 16.013601,-3.646306 19.40625,-7.1875 C -57.351493,71.724251 -54.713933,72 -52,72 -33.774603,72 -19,59.911688 -19,45 -19,30.088312 -33.774603,18 -52,18 z m 0,1.875 c 17.393221,0 31.125,11.456439 31.125,25.125 0,13.668561 -13.731779,25.125 -31.125,25.125 -2.586453,0 -5.094885,-0.268215 -7.5,-0.75 a 1.8821808,1.8821808 0  [...]
+       id="path3804" />
+    <path
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       d="m -52,18 c -18.225397,0 -33,12.088312 -33,27 0,9.498438 5.99976,17.843462 15.0625,22.65625 -0.344625,2.508754 -1.914014,8.649817 -9.34375,10.75 9.622915,1.045823 16.013601,-3.646306 19.40625,-7.1875 C -57.351493,71.724251 -54.713933,72 -52,72 -33.774603,72 -19,59.911688 -19,45 -19,30.088312 -33.774603,18 -52,18 z m 0,1.0625 c 17.7572,0 31.9375,11.725217 31.9375,25.9375 0,14.212283 -14.1803,25.9375 -31.9375,25.9375 -2.642211,0 -5.199353,-0.257842 -7.65625,-0.75 A 1.0589482,1.058 [...]
+       id="path3797" />
+    <path
+       style="fill:url(#linearGradient3746);fill-opacity:1;stroke:none;display:inline"
+       d="m 48,18 c -18.225397,0 -33,12.088312 -33,27 0,0.208408 0.0255,0.417728 0.03125,0.625 C 15.915093,31.359014 30.344147,20 48,20 65.811103,20 80.318034,31.557401 80.96875,46 80.983886,45.664059 81,45.338968 81,45 81,30.088312 66.225397,18 48,18 z m -1.59375,14.21875 c -0.07734,0.315923 -0.125002,0.653784 -0.125,1 -8e-6,1.158126 0.428682,2.145922 1.3125,2.96875 0.883799,0.807646 1.953204,1.218776 3.1875,1.21875 1.234272,2.6e-5 2.287664,-0.411104 3.15625,-1.21875 0.883793,-0.822828  [...]
+       id="path3666" />
+    <path
+       id="path3659"
+       d="m -49.214466,27 c -1.234296,3.5e-5 -2.303701,0.427178 -3.1875,1.25 -0.883818,0.82289 -1.312508,1.810687 -1.3125,2.96875 -8e-6,1.158126 0.428682,2.145922 1.3125,2.96875 0.883799,0.807646 1.953204,1.218776 3.1875,1.21875 1.234272,2.6e-5 2.287664,-0.411104 3.15625,-1.21875 0.883793,-0.822828 1.312484,-1.810624 1.3125,-2.96875 -1.6e-5,-1.158063 -0.428707,-2.14586 -1.3125,-2.96875 -0.868586,-0.822822 -1.921978,-1.249965 -3.15625,-1.25 z m -4.1875,12.1875 c -1.005722,2.3e-5 -2.059887 [...]
+       style="font-size:48px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:tb-rl;text-anchor:start;fill:url(#linearGradient3661);fill-opacity:1;stroke:none;display:inline;font-family:Georgia;-inkscape-font-specification:Georgia Bold Italic" />
+  </g>
+</svg>
diff --git a/interface/images/menu/about2.svg b/interface/images/menu/about2.svg
new file mode 100755
index 0000000..c3e000d
--- /dev/null
+++ b/interface/images/menu/about2.svg
@@ -0,0 +1,853 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="96x96 (action).svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="84.165422"
+     inkscape:cy="53.378531"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3737"
+       inkscape:collect="always">
+      <stop
+         id="stop3739"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3741"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2276c5;stop-opacity:1;" />
+      <stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#68baf4;stop-opacity:1;" />
+    </linearGradient>
+    <filter
+       id="filter3174"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843"
+       xlink:href="#linearGradient3700"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <filter
+       id="filter3657"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3"
+       inkscape:collect="always">
+      <stop
+         id="stop3739-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3741-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#c80000;stop-opacity:1;" />
+      <stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f3604d;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       gradientTransform="matrix(0.1,0,0,0.1,-79,7)"
+       r="225"
+       fy="240"
+       fx="240"
+       cy="240"
+       cx="240"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2351"
+       xlink:href="#linearGradient6896"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient6896">
+      <stop
+         id="stop6898"
+         offset="0"
+         style="stop-color:#0083ff;stop-opacity:0;" />
+      <stop
+         id="stop6900"
+         offset="1"
+         style="stop-color:#0054ff;stop-opacity:0.41237113;" />
+    </linearGradient>
+    <radialGradient
+       gradientTransform="matrix(0.1,0,0,0.1,-79,7)"
+       r="240"
+       fy="240"
+       fx="240"
+       cy="240"
+       cx="240"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2379"
+       xlink:href="#linearGradient3850"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3850">
+      <stop
+         id="stop3852"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.79381442;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0.83783782"
+         id="stop4351" />
+      <stop
+         id="stop3854"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <radialGradient
+       r="240"
+       fy="167.49931"
+       fx="196.07219"
+       cy="167.49931"
+       cx="196.07219"
+       gradientTransform="matrix(-0.05679026,-0.14348261,0.14011243,-0.05545635,-87.18774,49.01445)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2376"
+       xlink:href="#linearGradient3850"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3373">
+      <stop
+         id="stop3375"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.79381442;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0.83783782"
+         id="stop3377" />
+      <stop
+         id="stop3379"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.1,0,0,0.1,-79,7)"
+       y2="311.83057"
+       x2="452.59863"
+       y1="311.83057"
+       x1="27.401367"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2356"
+       xlink:href="#linearGradient5814"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5814">
+      <stop
+         id="stop5816"
+         offset="0"
+         style="stop-color:#0048cd;stop-opacity:1" />
+      <stop
+         id="stop5818"
+         offset="1"
+         style="stop-color:#002aa0;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.1,0,0,0.1,-79,7)"
+       y2="152.74609"
+       x2="441.11914"
+       y1="152.74609"
+       x1="38.880859"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2359"
+       xlink:href="#linearGradient5822"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5822">
+      <stop
+         id="stop5824"
+         offset="0"
+         style="stop-color:#5e99dd;stop-opacity:1" />
+      <stop
+         id="stop5826"
+         offset="1"
+         style="stop-color:#0461c9;stop-opacity:1" />
+    </linearGradient>
+    <radialGradient
+       gradientTransform="matrix(0.144,0,0,0.144,12.94,13.954924)"
+       r="225"
+       fy="240"
+       fx="240"
+       cy="240"
+       cx="240"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2351-712"
+       xlink:href="#linearGradient6896-963"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient6896-963">
+      <stop
+         id="stop3539"
+         offset="0"
+         style="stop-color:#6a6a6a;stop-opacity:0;" />
+      <stop
+         id="stop3541"
+         offset="1"
+         style="stop-color:#4e4e4e;stop-opacity:0.41237113;" />
+    </linearGradient>
+    <radialGradient
+       gradientTransform="matrix(0.1,0,0,0.1,22.566064,24.12373)"
+       r="240"
+       fy="240"
+       fx="240"
+       cy="240"
+       cx="240"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2379-709"
+       xlink:href="#linearGradient3850-705"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3850-705">
+      <stop
+         id="stop3545"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.79381442;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0.83783782"
+         id="stop3547" />
+      <stop
+         id="stop3549"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <radialGradient
+       r="240"
+       fy="167.49931"
+       fx="196.07219"
+       cy="167.49931"
+       cx="196.07219"
+       gradientTransform="matrix(-0.08177798,-0.20661496,0.20176189,-0.07985715,1.149655,74.455732)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2376-102"
+       xlink:href="#linearGradient3850-147"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3850-147">
+      <stop
+         id="stop3553"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.79381442;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0.83783782"
+         id="stop3555" />
+      <stop
+         id="stop3557"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.144,0,0,0.144,12.94,13.954924)"
+       y2="311.83057"
+       x2="452.59863"
+       y1="311.83057"
+       x1="27.401367"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2356-535"
+       xlink:href="#linearGradient5814-815"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5814-815">
+      <stop
+         id="stop3561"
+         offset="0"
+         style="stop-color:#424242;stop-opacity:1" />
+      <stop
+         id="stop3563"
+         offset="1"
+         style="stop-color:#2b2b2b;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.144,0,0,0.144,12.94,13.954924)"
+       y2="152.74609"
+       x2="441.11914"
+       y1="152.74609"
+       x1="38.880859"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2359-674"
+       xlink:href="#linearGradient5822-996"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5822-996">
+      <stop
+         id="stop3567"
+         offset="0"
+         style="stop-color:#8f8f8f;stop-opacity:1" />
+      <stop
+         id="stop3569"
+         offset="1"
+         style="stop-color:#515151;stop-opacity:1" />
+    </linearGradient>
+  </defs>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <rect
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <rect
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </g>
+  <g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       d="m 47.5,13.954924 c -19.056449,0 -34.56,15.503552 -34.56,34.56 0,19.056513 15.503551,34.56 34.56,34.56 19.056513,0 34.56,-15.503487 34.56,-34.56 0,-19.056449 -15.503487,-34.56 -34.56,-34.56 z"
+       style="fill:#3b3b3b;fill-opacity:1"
+       id="path2818" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 79.9,48.514924 c 0,17.865425 -14.534576,32.4 -32.4,32.4 -17.865425,0 -32.4,-14.534575 -32.4,-32.4 0,-17.865424 14.534575,-32.4 32.4,-32.4 17.865424,0 32.4,14.534576 32.4,32.4 z"
+       style="fill:#979797"
+       id="path2820" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 47.5,54 C 58.756184,54 68.424719,47.601352 76.461157,38.587924 72.328609,26.564911 60.907609,17.900719 47.5,17.900719 c -13.407537,0 -24.828609,8.664192 -28.961157,20.687205 C 26.575352,47.601352 36.243815,54 47.5,54 z"
+       style="fill:url(#linearGradient2359-674);fill-opacity:1;fill-rule:nonzero"
+       id="path2826" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 47.5,54 C 36.243815,54 26.575352,47.601352 18.538843,38.587924 c -1.070504,3.114489 -1.653048,6.453843 -1.653048,9.927 0,16.880768 13.733509,30.614205 30.614205,30.614205 16.880767,0 30.614205,-13.733437 30.614205,-30.614205 0,-3.473157 -0.582473,-6.812511 -1.653048,-9.927 C 68.42472,47.601352 58.756184,54 47.5,54 z"
+       style="fill:url(#linearGradient2356-535);fill-opacity:1;fill-rule:nonzero"
+       id="path2828" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3848"
+       style="fill:url(#radialGradient2376-102);fill-opacity:1;fill-rule:evenodd;display:inline"
+       d="m 79.9,48.514924 c 0,17.865425 -14.534576,32.4 -32.4,32.4 -17.865425,0 -32.4,-14.534575 -32.4,-32.4 0,-17.865424 14.534575,-32.4 32.4,-32.4 17.865424,0 32.4,14.534576 32.4,32.4 z" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 79.9,48.514924 c 0,17.865425 -14.534576,32.4 -32.4,32.4 -17.865425,0 -32.4,-14.534575 -32.4,-32.4 0,-17.865424 14.534575,-32.4 32.4,-32.4 17.865424,0 32.4,14.534576 32.4,32.4 z"
+       style="fill:url(#radialGradient2351-712);fill-opacity:1;fill-rule:evenodd;display:inline"
+       id="path6894" />
+    <g
+       transform="matrix(0.144,0,0,0.144,12.94,13.954924)"
+       id="g2831"
+       style="stroke:#535353;stroke-opacity:1;display:inline">
+      <path
+         inkscape:connector-curvature="0"
+         id="path2833"
+         style="fill:#ffffff;stroke:#535353;stroke-width:5;stroke-opacity:1"
+         d="m 203.2373,253.14062 c 0,-30.39208 -0.99707,-30.89013 -28.89794,-34.37792 l 0,-16.93995 107.11962,0 0,157.93995 c 0,28.39843 2.49122,30.89062 28.89844,33.87988 l 0,19.43066 -136.01806,0 0,-19.43066 c 26.40673,-2.98926 28.89794,-5.48145 28.89794,-33.87988 l 0,-106.62208 z M 284.44824,116.625 c 0,23.91504 -18.93164,43.34668 -43.3457,43.34668 -23.41699,0 -43.34619,-19.43164 -43.34619,-43.34668 0,-24.413086 19.9292,-43.345703 43.34619,-43.345703 24.41406,0 43.3457,18.932617 43.34 [...]
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/about_grey.svg b/interface/images/menu/about_grey.svg
new file mode 100755
index 0000000..1b089ea
--- /dev/null
+++ b/interface/images/menu/about_grey.svg
@@ -0,0 +1,837 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="about_grey.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="84.165422"
+     inkscape:cy="53.378531"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3737"
+       inkscape:collect="always">
+      <stop
+         id="stop3739"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3741"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2276c5;stop-opacity:1;" />
+      <stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#68baf4;stop-opacity:1;" />
+    </linearGradient>
+    <filter
+       id="filter3174"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843"
+       xlink:href="#linearGradient3700"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <filter
+       id="filter3657"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3"
+       inkscape:collect="always">
+      <stop
+         id="stop3739-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3741-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#c80000;stop-opacity:1;" />
+      <stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f3604d;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       gradientTransform="matrix(0.1,0,0,0.1,-79,7)"
+       r="225"
+       fy="240"
+       fx="240"
+       cy="240"
+       cx="240"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2351"
+       xlink:href="#linearGradient6896"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient6896">
+      <stop
+         id="stop6898"
+         offset="0"
+         style="stop-color:#0083ff;stop-opacity:0;" />
+      <stop
+         id="stop6900"
+         offset="1"
+         style="stop-color:#0054ff;stop-opacity:0.41237113;" />
+    </linearGradient>
+    <radialGradient
+       gradientTransform="matrix(0.1,0,0,0.1,-79,7)"
+       r="240"
+       fy="240"
+       fx="240"
+       cy="240"
+       cx="240"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2379"
+       xlink:href="#linearGradient3850"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3850">
+      <stop
+         id="stop3852"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.79381442;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0.83783782"
+         id="stop4351" />
+      <stop
+         id="stop3854"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <radialGradient
+       r="240"
+       fy="167.49931"
+       fx="196.07219"
+       cy="167.49931"
+       cx="196.07219"
+       gradientTransform="matrix(-0.05679026,-0.14348261,0.14011243,-0.05545635,-87.18774,49.01445)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2376"
+       xlink:href="#linearGradient3850"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3373">
+      <stop
+         id="stop3375"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.79381442;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0.83783782"
+         id="stop3377" />
+      <stop
+         id="stop3379"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.1,0,0,0.1,-79,7)"
+       y2="311.83057"
+       x2="452.59863"
+       y1="311.83057"
+       x1="27.401367"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2356"
+       xlink:href="#linearGradient5814"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5814">
+      <stop
+         id="stop5816"
+         offset="0"
+         style="stop-color:#0048cd;stop-opacity:1" />
+      <stop
+         id="stop5818"
+         offset="1"
+         style="stop-color:#002aa0;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.1,0,0,0.1,-79,7)"
+       y2="152.74609"
+       x2="441.11914"
+       y1="152.74609"
+       x1="38.880859"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2359"
+       xlink:href="#linearGradient5822"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5822">
+      <stop
+         id="stop5824"
+         offset="0"
+         style="stop-color:#5e99dd;stop-opacity:1" />
+      <stop
+         id="stop5826"
+         offset="1"
+         style="stop-color:#0461c9;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6896-963">
+      <stop
+         id="stop3539"
+         offset="0"
+         style="stop-color:#6a6a6a;stop-opacity:0;" />
+      <stop
+         id="stop3541"
+         offset="1"
+         style="stop-color:#4e4e4e;stop-opacity:0.41237113;" />
+    </linearGradient>
+    <radialGradient
+       gradientTransform="matrix(0.1,0,0,0.1,22.566064,24.12373)"
+       r="240"
+       fy="240"
+       fx="240"
+       cy="240"
+       cx="240"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2379-709"
+       xlink:href="#linearGradient3850-705"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3850-705">
+      <stop
+         id="stop3545"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.79381442;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0.83783782"
+         id="stop3547" />
+      <stop
+         id="stop3549"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <radialGradient
+       r="240"
+       fy="167.49931"
+       fx="196.07219"
+       cy="167.49931"
+       cx="196.07219"
+       gradientTransform="matrix(-0.08177798,-0.20661496,0.20176189,-0.07985715,1.149655,74.455732)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2376-102"
+       xlink:href="#linearGradient3850-147"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3850-147">
+      <stop
+         id="stop3553"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.79381442;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0.83783782"
+         id="stop3555" />
+      <stop
+         id="stop3557"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.144,0,0,0.144,12.94,13.954924)"
+       y2="311.83057"
+       x2="452.59863"
+       y1="311.83057"
+       x1="27.401367"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2356-535"
+       xlink:href="#linearGradient5814-815"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5814-815">
+      <stop
+         id="stop3561"
+         offset="0"
+         style="stop-color:#424242;stop-opacity:1" />
+      <stop
+         id="stop3563"
+         offset="1"
+         style="stop-color:#2b2b2b;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.144,0,0,0.144,12.94,13.954924)"
+       y2="152.74609"
+       x2="441.11914"
+       y1="152.74609"
+       x1="38.880859"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2359-674"
+       xlink:href="#linearGradient5822-996"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5822-996">
+      <stop
+         id="stop3567"
+         offset="0"
+         style="stop-color:#8f8f8f;stop-opacity:1" />
+      <stop
+         id="stop3569"
+         offset="1"
+         style="stop-color:#515151;stop-opacity:1" />
+    </linearGradient>
+  </defs>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <rect
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <rect
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </g>
+  <g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       d="m 47.5,13.954924 c -19.056449,0 -34.56,15.503552 -34.56,34.56 0,19.056513 15.503551,34.56 34.56,34.56 19.056513,0 34.56,-15.503487 34.56,-34.56 0,-19.056449 -15.503487,-34.56 -34.56,-34.56 z"
+       style="fill:#3b3b3b;fill-opacity:1"
+       id="path2818" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 79.9,48.514924 c 0,17.865425 -14.534576,32.4 -32.4,32.4 -17.865425,0 -32.4,-14.534575 -32.4,-32.4 0,-17.865424 14.534575,-32.4 32.4,-32.4 17.865424,0 32.4,14.534576 32.4,32.4 z"
+       style="fill:#979797"
+       id="path2820" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 47.5,54 C 58.756184,54 68.424719,47.601352 76.461157,38.587924 72.328609,26.564911 60.907609,17.900719 47.5,17.900719 c -13.407537,0 -24.828609,8.664192 -28.961157,20.687205 C 26.575352,47.601352 36.243815,54 47.5,54 z"
+       style="fill:url(#linearGradient2359-674);fill-opacity:1;fill-rule:nonzero"
+       id="path2826" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 47.5,54 C 36.243815,54 26.575352,47.601352 18.538843,38.587924 c -1.070504,3.114489 -1.653048,6.453843 -1.653048,9.927 0,16.880768 13.733509,30.614205 30.614205,30.614205 16.880767,0 30.614205,-13.733437 30.614205,-30.614205 0,-3.473157 -0.582473,-6.812511 -1.653048,-9.927 C 68.42472,47.601352 58.756184,54 47.5,54 z"
+       style="fill:url(#linearGradient2356-535);fill-opacity:1;fill-rule:nonzero"
+       id="path2828" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3848"
+       style="fill:url(#radialGradient2376-102);fill-opacity:1;fill-rule:evenodd;display:inline"
+       d="m 79.9,48.514924 c 0,17.865425 -14.534576,32.4 -32.4,32.4 -17.865425,0 -32.4,-14.534575 -32.4,-32.4 0,-17.865424 14.534575,-32.4 32.4,-32.4 17.865424,0 32.4,14.534576 32.4,32.4 z" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 79.9,48.514924 c 0,17.865425 -14.534576,32.4 -32.4,32.4 -17.865425,0 -32.4,-14.534575 -32.4,-32.4 0,-17.865424 14.534575,-32.4 32.4,-32.4 17.865424,0 32.4,14.534576 32.4,32.4 z"
+       style="fill:#c8c4b7;fill-opacity:1;fill-rule:evenodd;display:inline;opacity:0.64609053000000005"
+       id="path6894" />
+    <path
+       d="m 42.206171,50.407173 c 0,-4.376459 -0.143578,-4.448178 -4.161303,-4.95042 l 0,-2.439353 15.425225,0 0,22.743353 c 0,4.089374 0.358736,4.448249 4.161375,4.878703 l 0,2.798015 -19.5866,0 0,-2.798015 c 3.802569,-0.430454 4.161303,-0.789329 4.161303,-4.878703 l 0,-15.35358 z M 53.900547,30.748924 c 0,3.443766 -2.726157,6.241922 -6.241781,6.241922 -3.372047,0 -6.241852,-2.798156 -6.241852,-6.241922 0,-3.515484 2.869805,-6.241781 6.241852,-6.241781 3.515624,0 6.241781,2.726297 6.241 [...]
+       style="fill:#00ff00;stroke:#535353;stroke-width:0.72000003;stroke-opacity:1"
+       id="path2833"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/interface/images/menu/about_grey.svg-path3848-4294966697.png b/interface/images/menu/about_grey.svg-path3848-4294966697.png
new file mode 100755
index 0000000..f507f29
Binary files /dev/null and b/interface/images/menu/about_grey.svg-path3848-4294966697.png differ
diff --git a/interface/images/menu/applications-internet.svg b/interface/images/menu/applications-internet.svg
new file mode 100755
index 0000000..fdda80a
--- /dev/null
+++ b/interface/images/menu/applications-internet.svg
@@ -0,0 +1,876 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="applications-internet.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187"
+       id="linearGradient3617"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <inkscape:perspective
+       id="perspective3925"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187"
+       id="linearGradient5006"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-1.1034483,-1.1034472)"
+       x1="69"
+       y1="122"
+       x2="69"
+       y2="5.9781809" />
+    <linearGradient
+       id="linearGradient3187">
+      <stop
+         style="stop-color:#1567b3;stop-opacity:1;"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#67aeed;stop-opacity:1;"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       y2="5.9781809"
+       x2="69"
+       y1="122"
+       x1="69"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-117.42488,3.3965528)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3934"
+       xlink:href="#linearGradient3187"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective3964"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226"
+       id="radialGradient5232"
+       cx="63.98003"
+       cy="61.948856"
+       fx="63.98003"
+       fy="61.948856"
+       r="58.01997"
+       gradientTransform="matrix(1.5312074,0,0,1.1812169,-33.966694,-11.20439)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5226">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5228" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5230" />
+    </linearGradient>
+    <radialGradient
+       r="58.01997"
+       fy="61.948856"
+       fx="63.98003"
+       cy="61.948856"
+       cx="63.98003"
+       gradientTransform="matrix(1.090012,0,0,0.83885371,-21.739003,-5.4660245)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3973"
+       xlink:href="#linearGradient5226"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective4003"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226-0"
+       id="radialGradient3462"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70689703,0,0,0.26397967,2.935342,34.087887)"
+       cx="69.75"
+       cy="75.973572"
+       fx="69.75"
+       fy="75.973572"
+       r="58.5" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5226-0">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5228-7" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5230-6" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226-0"
+       id="radialGradient3465"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.51921983,-0.47906434,1.2026838,1.3000296,-72.74405,-19.887561)"
+       cx="49.233551"
+       cy="70.608253"
+       fx="49.233551"
+       fy="70.608253"
+       r="25.483549" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226-0"
+       id="radialGradient3468"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9747377,0,0,0.92610887,-14.268168,-12.6013)"
+       cx="64.230392"
+       cy="68.449158"
+       fx="64.230392"
+       fy="68.449158"
+       r="43.769611" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226-0"
+       id="radialGradient3471"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.84390682,0,0,0.33117465,-5.8161585,32.792567)"
+       cx="63.875"
+       cy="2.2173476"
+       fx="63.875"
+       fy="2.2173476"
+       r="58.375" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3451"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient3543">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3545" />
+      <stop
+         id="stop3555"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3551"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3547" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3449"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4039">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4041" />
+      <stop
+         id="stop4043"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4045"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4047" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3447"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4050">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4052" />
+      <stop
+         id="stop4054"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4056"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4058" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3445"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4061">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4063" />
+      <stop
+         id="stop4065"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4067"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4069" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3443"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4072">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4074" />
+      <stop
+         id="stop4076"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4078"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4080" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3441"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4083">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4085" />
+      <stop
+         id="stop4087"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4089"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4091" />
+    </linearGradient>
+    <radialGradient
+       r="3.125"
+       fy="67.125"
+       fx="74.375"
+       cy="67.125"
+       cx="74.375"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4103"
+       xlink:href="#linearGradient3543"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective2861"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3026"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2870"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2872" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2874" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2877"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2879" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2881" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2884"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2886" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2888" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2891"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2893" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2895" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2902"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.071028"
+     inkscape:cx="-6.2213211"
+     inkscape:cy="36.647273"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="false"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1023"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Shadow"
+     style="display:inline">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99097413"
+       inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+       style="opacity:0.07999998;fill:url(#linearGradient2902);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3786"
+       d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0360184"
+       inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3778"
+       d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98962283"
+       inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3770"
+       d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+       transform="scale(1,-1)" />
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect3723"
+       width="86"
+       height="85"
+       x="5"
+       y="-92"
+       rx="7"
+       ry="7"
+       transform="scale(1,-1)" />
+    <rect
+       transform="scale(1,-1)"
+       ry="6"
+       rx="6"
+       y="-91"
+       x="6"
+       height="84"
+       width="84"
+       id="rect3716"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true">
+    <rect
+       style="fill:url(#linearGradient3617);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.4;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.2;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="World map"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.6;fill:url(#radialGradient3973);fill-opacity:1;stroke:none;display:inline"
+       d="m 36.273886,6.0961948 c 1.650117,2.2113875 0.112582,5.9041752 2.601475,5.8675182 1.211896,1.709913 -2.415455,0.510072 0.203593,1.827957 1.506105,1.183738 -1.593389,1.860078 0.271787,2.922365 -2.149684,1.107009 0.348446,5.790098 1.945123,6.962147 2.627951,2.207864 1.162201,-4.67451 4.094495,-5.032526 1.593361,-1.815344 4.391846,-2.98066 6.379269,-4.806851 -1.942296,-0.157362 -3.076461,-1.363862 -1.237023,-2.11124 3.385455,3.462091 0.848905,-1.639594 -1.025129,-2.4473701 1.813359 [...]
+       id="path3522"
+       sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccsccccccccccccccccccccccccccccccccccccccccccccccccccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Network">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient4103);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="path3537"
+       sodipodi:cx="74.375"
+       sodipodi:cy="67.125"
+       sodipodi:rx="3.125"
+       sodipodi:ry="3.125"
+       d="m 77.5,67.125 a 3.125,3.125 0 1 1 -6.25,0 3.125,3.125 0 1 1 6.25,0 z"
+       transform="matrix(1.3572422,0,0,1.3554377,-73.268157,-53.871603)" />
+    <path
+       transform="matrix(1.0744835,0,0,1.0730548,-39.513825,-14.090919)"
+       d="m 77.5,67.125 a 3.125,3.125 0 1 1 -6.25,0 3.125,3.125 0 1 1 6.25,0 z"
+       sodipodi:ry="3.125"
+       sodipodi:rx="3.125"
+       sodipodi:cy="67.125"
+       sodipodi:cx="74.375"
+       id="path3557"
+       style="fill:url(#radialGradient3443);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient3445);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="path3561"
+       sodipodi:cx="74.375"
+       sodipodi:cy="67.125"
+       sodipodi:rx="3.125"
+       sodipodi:ry="3.125"
+       d="m 77.5,67.125 a 3.125,3.125 0 1 1 -6.25,0 3.125,3.125 0 1 1 6.25,0 z"
+       transform="matrix(1.5834493,0,0,1.581344,-53.333661,-72.388859)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.6;fill:url(#radialGradient3447);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="path3565"
+       sodipodi:cx="74.375"
+       sodipodi:cy="67.125"
+       sodipodi:rx="3.125"
+       sodipodi:ry="3.125"
+       d="m 77.5,67.125 a 3.125,3.125 0 1 1 -6.25,0 3.125,3.125 0 1 1 6.25,0 z"
+       transform="matrix(1.0219348,0,0,1.020576,-15.635673,-16.92189)" />
+    <path
+       transform="matrix(0.79408906,0,0,0.79303321,-44.284507,-21.76786)"
+       d="m 77.5,67.125 a 3.125,3.125 0 1 1 -6.25,0 3.125,3.125 0 1 1 6.25,0 z"
+       sodipodi:ry="3.125"
+       sodipodi:rx="3.125"
+       sodipodi:cy="67.125"
+       sodipodi:cx="74.375"
+       id="path3569"
+       style="opacity:0.6;fill:url(#radialGradient3449);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.6;fill:url(#radialGradient3451);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="path3573"
+       sodipodi:cx="74.375"
+       sodipodi:cy="67.125"
+       sodipodi:rx="3.125"
+       sodipodi:ry="3.125"
+       d="m 77.5,67.125 a 3.125,3.125 0 1 1 -6.25,0 3.125,3.125 0 1 1 6.25,0 z"
+       transform="matrix(0.56551763,0,0,0.5647657,38.456917,3.2615074)" />
+    <path
+       style="fill:none;stroke:url(#radialGradient3471);stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="M 7.1767242,47.701508 C 35.275882,28.287687 72.387975,27.228751 89.000056,49.289911"
+       id="path3577"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:url(#radialGradient3468);stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="M 27.676739,88.823511 C 26.616393,73.292454 56.129343,28.640665 88.823332,20.875137"
+       id="path3581"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:url(#radialGradient3465);stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="M 7,29.523112 C 58.250036,38.347576 38.633643,89 38.633643,89"
+       id="path3583"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="opacity:0.6;fill:none;stroke:url(#radialGradient3462);stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="M 7.1767242,67.821286 C 58.42676,56.349483 89.17678,37.641619 89.17678,37.641619"
+       id="path3585"
+       sodipodi:nodetypes="cc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+</svg>
diff --git a/interface/images/menu/applications-system.svg b/interface/images/menu/applications-system.svg
new file mode 100755
index 0000000..2cface9
--- /dev/null
+++ b/interface/images/menu/applications-system.svg
@@ -0,0 +1,1241 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="applications-system.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient4282">
+      <stop
+         id="stop4284"
+         offset="0"
+         style="stop-color:#e8e8e8;stop-opacity:1;" />
+      <stop
+         id="stop4286"
+         offset="1"
+         style="stop-color:#828282;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2879"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2908"
+       xlink:href="#linearGradient3737-4"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-4">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-8" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-71" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613-8">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615-3"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <radialGradient
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2874"
+       xlink:href="#linearGradient3737-7"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-7">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-7" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3273"
+       id="linearGradient3279"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0294118,0,0,-1.0294118,-1.4117647,97.411765)"
+       x1="43.17857"
+       y1="13"
+       x2="43.17857"
+       y2="83.294571" />
+    <linearGradient
+       id="linearGradient3465">
+      <stop
+         style="stop-color:#919191;stop-opacity:1;"
+         offset="0"
+         id="stop3467" />
+      <stop
+         style="stop-color:#fdfdfd;stop-opacity:1;"
+         offset="1"
+         id="stop3469" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-0"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-0">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-4" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-76" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187"
+       id="linearGradient3427"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <linearGradient
+       id="linearGradient3187">
+      <stop
+         style="stop-color:#b4b4b4;stop-opacity:1;"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2912"
+       xlink:href="#linearGradient3187-9"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective3818"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3273">
+      <stop
+         style="stop-color:#b2b2b2;stop-opacity:1;"
+         offset="0"
+         id="stop3275" />
+      <stop
+         style="stop-color:#898989;stop-opacity:1;"
+         offset="1"
+         id="stop3277" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="5.9781809"
+       x2="69"
+       y1="122"
+       x1="69"
+       id="linearGradient5194"
+       xlink:href="#linearGradient3187-9"
+       inkscape:collect="always"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-1.1034483,-1.1034483)" />
+    <linearGradient
+       id="linearGradient3187-9">
+      <stop
+         id="stop3189-7"
+         offset="0"
+         style="stop-color:#656565;stop-opacity:1;" />
+      <stop
+         id="stop3191-8"
+         offset="1"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective3871"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="8.550745"
+       x2="60.777386"
+       y1="115.27915"
+       x1="60.777386"
+       id="linearGradient3240"
+       xlink:href="#linearGradient3234"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3234">
+      <stop
+         id="stop3236"
+         offset="0"
+         style="stop-color:#232323;stop-opacity:1;" />
+      <stop
+         id="stop3238"
+         offset="1"
+         style="stop-color:#4b4b4b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.68606063,0,0,0.68375842,4.2424239,5.7272471)"
+       y2="8.550745"
+       x2="60.777386"
+       y1="115.27915"
+       x1="60.777386"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3880"
+       xlink:href="#linearGradient3234"
+       inkscape:collect="always" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3918">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         id="rect3920"
+         width="68"
+         height="68"
+         x="14"
+         y="14"
+         rx="3"
+         ry="3" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective3943"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath7848">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+         id="rect7850"
+         width="104.947"
+         height="105.30035"
+         x="11.307421"
+         y="12.098941"
+         rx="11"
+         ry="11" />
+    </clipPath>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient7825"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient7450">
+      <stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop7452" />
+      <stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop7454" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient7758"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3958">
+      <stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop3960" />
+      <stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop3962" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient3964"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3966">
+      <stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop3968" />
+      <stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop3970" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3187-1">
+      <stop
+         id="stop3189-0"
+         offset="0"
+         style="stop-color:#656565;stop-opacity:1;" />
+      <stop
+         id="stop3191-1"
+         offset="1"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+    </linearGradient>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7809">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8596875"
+         id="feGaussianBlur7811" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7813">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.4521875"
+         id="feGaussianBlur7815" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath7730">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+         id="rect7732"
+         width="104.947"
+         height="105.30035"
+         x="7.7738519"
+         y="9.6254425"
+         rx="11"
+         ry="11" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient3985">
+      <stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop3987" />
+      <stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop3989" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7442">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop7444" />
+      <stop
+         style="stop-color:#cdcdcd;stop-opacity:0;"
+         offset="1"
+         id="stop7446" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3298">
+      <stop
+         id="stop3300"
+         offset="0"
+         style="stop-color:#f9f9f9;stop-opacity:1;" />
+      <stop
+         id="stop3302"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </linearGradient>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7542">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.063379309"
+         id="feGaussianBlur7544" />
+    </filter>
+    <linearGradient
+       id="linearGradient4002">
+      <stop
+         id="stop4004"
+         offset="0"
+         style="stop-color:#f9f9f9;stop-opacity:1;" />
+      <stop
+         id="stop4006"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4202"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient4204"
+       gradientUnits="userSpaceOnUse"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905" />
+    <filter
+       inkscape:collect="always"
+       id="filter4244">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.56844"
+         id="feGaussianBlur4246" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4255"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187-1"
+       id="linearGradient4257"
+       gradientUnits="userSpaceOnUse"
+       x1="73.194839"
+       y1="34.162155"
+       x2="49.625214"
+       y2="19.183952" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4259"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient4261"
+       gradientUnits="userSpaceOnUse"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4269"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62429531,-0.62429531,0.39740012,0.39740012,57.190344,56.707013)"
+       cx="56.055019"
+       cy="55.978848"
+       fx="56.055019"
+       fy="55.978848"
+       r="52.251602" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4282"
+       id="linearGradient4271"
+       gradientUnits="userSpaceOnUse"
+       x1="50.760078"
+       y1="42.239994"
+       x2="113.84038"
+       y2="130.51231"
+       gradientTransform="matrix(0.68606059,0,0,0.68606059,75.974088,5.5532361)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient4274"
+       gradientUnits="userSpaceOnUse"
+       x1="82.312332"
+       y1="85.362457"
+       x2="81.312866"
+       y2="82.651672" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient4276"
+       gradientUnits="userSpaceOnUse"
+       x1="80.875443"
+       y1="82.61515"
+       x2="82.573708"
+       y2="84.937546" />
+    <filter
+       inkscape:collect="always"
+       id="filter4278">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8909375"
+         id="feGaussianBlur4280" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4290">
+      <path
+         id="path4292"
+         d="m 81.775868,33.016836 -1.698553,4.060937 -0.488099,2.909037 0.09754,1.112853 -4.392827,0.566188 -0.195242,-1.073807 -1.21047,-2.694274 -2.694273,-3.494749 -2.752856,0.741902 -0.585712,4.353794 0.292856,2.948084 0.370947,1.034757 -4.080463,1.698564 -0.468561,-0.995709 -1.874287,-2.284278 -3.514259,-2.674751 -2.459999,1.425232 0.566189,4.373317 1.034765,2.752847 0.624758,0.917615 -3.494751,2.694276 -0.722386,-0.839521 -2.401417,-1.737612 -4.080448,-1.659517 -2.010947,2.010945 1 [...]
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4300">
+      <path
+         id="path4302"
+         d="m 81.882329,32.767073 -1.713399,4.09643 -0.492364,2.934461 0.09839,1.12258 -4.431221,0.571136 -0.196948,-1.083191 -1.22105,-2.717823 -2.717821,-3.525293 -2.776916,0.748386 -0.590831,4.391847 0.295416,2.97385 0.374189,1.043801 -4.116126,1.71341 -0.472656,-1.004412 -1.890669,-2.304242 -3.544973,-2.698129 -2.481501,1.437688 0.571138,4.41154 1.043809,2.776907 0.630218,0.925635 -3.525294,2.717824 -0.7287,-0.846858 -2.422406,-1.752799 -4.116111,-1.674021 -2.028522,2.028521 1.693705 [...]
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter4308">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8975"
+         id="feGaussianBlur4310" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter4325">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.439999"
+         id="feGaussianBlur4327" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62429531,-0.62429531,0.39740012,0.39740012,57.190344,56.707013)"
+       cx="56.055019"
+       cy="55.978848"
+       fx="56.055019"
+       fy="55.978848"
+       r="52.251602" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4282"
+       id="linearGradient4340"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606059,0,0,0.68606059,75.974088,5.5532361)"
+       x1="50.760078"
+       y1="42.239994"
+       x2="113.84038"
+       y2="130.51231" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient4342"
+       gradientUnits="userSpaceOnUse"
+       x1="80.875443"
+       y1="82.61515"
+       x2="82.573708"
+       y2="84.937546" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       x1="82.312332"
+       y1="85.362457"
+       x2="81.312866"
+       y2="82.651672" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4350">
+      <rect
+         ry="3"
+         rx="3"
+         y="14"
+         x="84"
+         height="68"
+         width="68"
+         id="rect4352"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4354">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         id="rect4356"
+         width="68"
+         height="68"
+         x="-36"
+         y="14"
+         rx="3"
+         ry="3" />
+    </clipPath>
+    <filter
+       id="filter2981"
+       inkscape:label="Inner Shadow"
+       inkscape:menu="Shadows and Glows"
+       inkscape:menu-tooltip="Adds a colorizable drop shadow inside"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur2983"
+         stdDeviation="4"
+         result="result8" />
+      <feOffset
+         id="feOffset2985"
+         dx="0"
+         dy="2"
+         result="result11" />
+      <feComposite
+         id="feComposite2987"
+         in2="result11"
+         result="result6"
+         in="SourceGraphic"
+         operator="in" />
+      <feFlood
+         id="feFlood2989"
+         result="result10"
+         in="result6"
+         flood-opacity="1"
+         flood-color="rgb(0,0,0)" />
+      <feBlend
+         id="feBlend2991"
+         in2="result10"
+         mode="normal"
+         in="result6"
+         result="result12" />
+      <feComposite
+         id="feComposite2993"
+         in2="SourceGraphic"
+         result="result2"
+         operator="in" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter3773"
+       x="-0.168"
+       width="1.336"
+       y="-0.168"
+       height="1.336">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.04"
+         id="feGaussianBlur3775" />
+    </filter>
+    <inkscape:perspective
+       id="perspective3770"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3026"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3779"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3781" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3783" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3786"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3788" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3790" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3793"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3795" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3797" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3800"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3802" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3804" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3811"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6"
+     inkscape:cx="-30.746065"
+     inkscape:cy="40.711424"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer3"
+     showgrid="false"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1023"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99097413"
+       inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+       style="opacity:0.07999998;fill:url(#linearGradient3811);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3786"
+       d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0360184"
+       inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3778"
+       d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98962283"
+       inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3770"
+       d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+       transform="scale(1,-1)" />
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect3723"
+       width="86"
+       height="85"
+       x="5"
+       y="-92"
+       rx="7"
+       ry="7"
+       transform="scale(1,-1)" />
+    <rect
+       transform="scale(1,-1)"
+       ry="6"
+       rx="6"
+       y="-91"
+       x="6"
+       height="84"
+       width="84"
+       id="rect3716"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Background"
+     style="display:inline">
+    <rect
+       ry="7.5213428"
+       rx="7.5466671"
+       y="14"
+       x="12"
+       height="72"
+       width="72"
+       id="rect3232"
+       style="fill:url(#linearGradient3880);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
+    <g
+       id="g4329"
+       transform="translate(-69,1)"
+       clip-path="url(#clipPath4350)">
+      <path
+         id="path4312"
+         d="m 131.78125,29.59375 -0.125,0.3125 -1.15625,2.78125 -0.0312,0.0625 0,0.03125 -0.34375,2 0,0.0625 0,0.0625 0.0312,0.3125 -2.09375,0.25 -0.0312,-0.25 0,-0.0625 L 128,35.09375 127.15625,33.25 127.125,33.1875 127.09375,33.125 125.25,30.75 l -0.1875,-0.28125 -0.34375,0.09375 -1.875,0.5 -0.34375,0.09375 -0.0312,0.34375 -0.40625,2.96875 0,0.0625 0,0.0625 0.21875,2.03125 0,0.0625 0,0.0625 0.0937,0.25 -1.90625,0.78125 -0.125,-0.21875 L 120.3125,37.5 120.28125,37.4375 119,35.875 l -0.0 [...]
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4325);enable-background:acc [...]
+      <path
+         id="path6159"
+         d="m 132.12562,28.089748 -1.16672,2.789418 -0.33527,1.998189 0.067,0.764408 -3.01739,0.388909 -0.13411,-0.737587 -0.83146,-1.850671 -1.85067,-2.400509 -1.89091,0.509605 -0.40232,2.990579 0.20116,2.02501 0.2548,0.710765 -2.80283,1.166727 -0.32185,-0.683943 -1.28743,-1.569048 -2.41391,-1.837261 -1.68975,0.978978 0.38891,3.003989 0.71077,1.890904 0.42914,0.630301 -2.40051,1.850672 -0.4962,-0.576659 -1.64951,-1.193549 -2.80282,-1.139906 -1.3813,1.381299 1.15331,2.789418 1.18014,1.64 [...]
+         style="fill:url(#radialGradient4338);fill-opacity:1;stroke:url(#linearGradient4340);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         transform="matrix(2.2107174,0,0,2.2107174,-47.74347,-122.1214)"
+         d="m 83.038866,84.007065 a 1.2367492,1.2367492 0 1 1 -2.473499,0 1.2367492,1.2367492 0 1 1 2.473499,0 z"
+         sodipodi:ry="1.2367492"
+         sodipodi:rx="1.2367492"
+         sodipodi:cy="84.007065"
+         sodipodi:cx="81.802116"
+         id="path7458"
+         style="fill:#b8b8b8;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient4342);stroke-width:0.45234182;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:none;stroke:#ffffff;stroke-width:0.08989587;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter7542)"
+         id="path7536"
+         sodipodi:cx="81.802116"
+         sodipodi:cy="84.007065"
+         sodipodi:rx="1.2367492"
+         sodipodi:ry="1.2367492"
+         d="m 83.038866,84.007065 a 1.2367492,1.2367492 0 1 1 -2.473499,0 1.2367492,1.2367492 0 1 1 2.473499,0 z"
+         transform="matrix(22.247964,0,0,22.247964,-1686.8327,-1805.3916)" />
+      <path
+         sodipodi:type="arc"
+         style="fill:none;stroke:url(#linearGradient4344);stroke-width:0.34587052;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="path7546"
+         sodipodi:cx="81.802116"
+         sodipodi:cy="84.007065"
+         sodipodi:rx="1.2367492"
+         sodipodi:ry="1.2367492"
+         d="m 83.038866,84.007065 a 1.2367492,1.2367492 0 1 1 -2.473499,0 1.2367492,1.2367492 0 1 1 2.473499,0 z"
+         transform="matrix(5.7825105,0,0,5.7825105,-339.9237,-422.17725)" />
+      <path
+         clip-path="url(#clipPath4290)"
+         transform="matrix(0.68689029,0,0,0.68689029,75.95457,5.4108038)"
+         d="m 108,40.53125 -2.625,2 -0.0312,0.0625 -1.03125,1.25 -19.28125,39.96875 44.5625,11.21875 -0.0937,-0.0625 -2.3125,-1.03125 -0.0625,0 -1.03125,-0.21875 a 1.235193,1.235193 0 0 1 -0.96875,-1.375 l 0.59375,-4.375 a 1.235193,1.235193 0 0 1 1.3125,-1.0625 l 0.875,0.0625 2.78125,-0.46875 0.0312,0 3.03125,-1.28125 0,-1.25 -3.09375,-1.28125 -2.75,-0.46875 -0.0625,0 L 127,82.28125 a 1.235193,1.235193 0 0 1 -1.28125,-1.0625 l -0.59375,-4.375 a 1.235193,1.235193 0 0 1 1,-1.375 l 0.96875, [...]
+         id="path7663"
+         style="opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter4278)"
+         inkscape:original="M 107.90625 39.0625 L 104.40625 41.75 L 103.25 43.15625 L 83.28125 84.59375 L 64.25 79.78125 C 63.861716 81.324053 63.65625 82.928843 63.65625 84.59375 C 63.65625 86.188701 63.82787 87.733839 64.1875 89.21875 L 48.40625 96.46875 C 47.13527 92.741898 46.4375 88.748046 46.4375 84.59375 C 46.4375 81.476038 46.831697 78.45458 47.5625 75.5625 L 33.09375 71.90625 L 32.90625 72.5625 L 36.40625 75.28125 L 39.09375 76.5 L 40.1875 76.6875 L 39.59375 81.0625 L 38.5 81 L  [...]
+         inkscape:radius="-1.2350695"
+         sodipodi:type="inkscape:offset" />
+      <path
+         clip-path="url(#clipPath4300)"
+         transform="matrix(0.68093886,0,0,0.68093886,76.36876,5.7773746)"
+         d="m 82.5625,33.9375 -1.375,3.28125 -0.4375,2.5 0,0.0625 0.09375,1.0625 a 1.0934898,1.0934898 0 0 1 -0.96875,1.1875 l -4.40625,0.5625 A 1.0934898,1.0934898 0 0 1 74.28125,41.6875 L 74.15625,40.875 74.125,40.8125 73,38.3125 70.8125,35.5 69.5,35.84375 l -0.5,3.5625 0.28125,2.625 0.3125,0.90625 A 1.0934898,1.0934898 0 0 1 69,44.3125 l -4.0625,1.71875 A 1.0934898,1.0934898 0 0 1 63.5,45.5 L 63.0625,44.5625 63.03125,44.5 l -1.625,-1.9375 -2.875,-2.1875 -1.1875,0.6875 0.4375,3.5625 0. [...]
+         id="path7661"
+         style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter4308)"
+         inkscape:original="M 81.84375 32.84375 L 80.15625 36.90625 L 79.65625 39.8125 L 79.75 40.9375 L 75.34375 41.5 L 75.15625 40.4375 L 73.9375 37.75 L 71.25 34.25 L 68.5 34.96875 L 67.90625 39.34375 L 68.1875 42.28125 L 68.5625 43.3125 L 64.5 45.03125 L 64.03125 44.03125 L 62.15625 41.75 L 58.625 39.0625 L 56.15625 40.5 L 56.71875 44.875 L 57.75 47.625 L 58.375 48.53125 L 54.875 51.25 L 54.15625 50.40625 L 51.75 48.65625 L 47.6875 47 L 45.65625 49 L 47.34375 53.09375 L 49.0625 55.5  [...]
+         inkscape:radius="-1.0933805"
+         sodipodi:type="inkscape:offset" />
+    </g>
+    <g
+       id="g4248"
+       transform="translate(50,0)"
+       clip-path="url(#clipPath4354)">
+      <path
+         id="path4226"
+         d="m -35.40625,-27.28125 -0.3125,0.03125 -0.125,0.28125 -1.28125,3.03125 0,0.0625 -0.0312,0.0625 -0.34375,2.1875 0,0.0625 0,0.0625 0.0312,0.34375 -2.34375,0.3125 -0.0625,-0.34375 0,-0.0625 -0.0312,-0.0625 -0.9375,-2 0,-0.0625 -0.0625,-0.03125 -2,-2.59375 -0.1875,-0.28125 -0.34375,0.09375 -2.0625,0.5625 -0.3125,0.09375 -0.0625,0.3125 -0.40625,3.28125 -0.0312,0.0625 0.0312,0.0625 0.21875,2.1875 0,0.0625 0.0312,0.03125 0.125,0.375 -2.15625,0.875 -0.15625,-0.3125 -0.0312,-0.03125 -0 [...]
+         style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4244)" />
+      <g
+         inkscape:label="Gear24"
+         transform="matrix(0.33201642,0.32957802,-0.32957802,0.33201642,-34.178641,9.9231531)"
+         id="g2645"
+         style="fill:url(#radialGradient4259);fill-opacity:1;stroke:url(#linearGradient4261);stroke-width:1.45759726">
+        <path
+           id="path2647"
+           transform="matrix(1.4665021,0,0,1.4665021,-26.232091,-12.972501)"
+           d="m 16.34375,-47.5625 -1.875,4.4375 -0.5,3.1875 0.09375,1.1875 -4.78125,0.625 -0.21875,-1.1875 -1.34375,-2.9375 -2.9375,-3.78125 -3,0.78125 -0.625,4.78125 0.3125,3.1875 0.40625,1.15625 -4.46875,1.84375 -0.5,-1.09375 -2.0625,-2.5 -3.8125,-2.90625 -2.6875,1.5625 0.59375,4.75 1.15625,3.03125 0.6875,0.96875 -3.84375,2.9375 -0.78125,-0.90625 -2.625,-1.875 -4.4375,-1.84375 -2.1875,2.21875 1.8125,4.4375 1.875,2.625 0.9375,0.78125 -2.9375,3.8125 -1,-0.6875 -3.03125,-1.125 -4.75,-0.62 [...]
+           style="fill:url(#radialGradient4255);fill-opacity:1;stroke:url(#linearGradient4257);stroke-width:1.45759737" />
+      </g>
+      <path
+         sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccc"
+         id="path7797"
+         d="m 17.875,-29.21875 c 12.794439,0 24.064539,6.390407 30.96875,16.09375 L 55.375,-17.34375 52.65625,-20.875 c -0.648143,-0.846832 -0.524897,-2.051902 0.28125,-2.75 l 0.75,-0.625 1.59375,-2.21875 1.21875,-3 -0.28125,-0.28125 -2.9375,1.21875 -2.34375,1.65625 -0.5625,0.65625 c -0.698098,0.806147 -1.903168,0.929393 -2.75,0.28125 L 43.78125,-28.875 C 31.788135,-55.428895 -61.66477,-21.332002 17.875,-29.21875 z M 48.84375,30.8125 C 41.939539,40.515843 30.669439,46.90625 17.875,46.906 [...]
+         style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter7809)"
+         transform="matrix(0.48690276,0.48332687,-0.48332687,0.48690276,-38.612674,-3.0294512)" />
+      <path
+         sodipodi:nodetypes="ccsccccccccccccccccccccccccccccccccc"
+         id="path7803"
+         d="m 59.5,-9.5625 -6.5625,3.25 c 2.020989,4.6571765 3.21875,9.7663981 3.21875,15.15625 C 56.156249,14.233601 54.958489,19.342823 52.9375,24 l 6.5625,3.25 1.34375,-3.21875 c 0.446258,-1.090854 1.669216,-1.640498 2.78125,-1.25 l 0.96875,0.34375 2.53125,0.25 3.09375,-0.4375 0.0625,-0.15625 -2.40625,-1.8125 -2.5,-1.15625 -0.9375,-0.15625 c -1.169193,-0.219106 -1.955971,-1.323355 -1.78125,-2.5 L 63.3125,12.375 c 0.159005,-1.165761 1.202451,-2.003264 2.375,-1.90625 l 0.9375,0.0625 2.7 [...]
+         style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter7813)"
+         transform="matrix(0.48690276,0.48332687,-0.48332687,0.48690276,-38.612674,-3.0294512)" />
+    </g>
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3773);enable-background:accum [...]
+       d="m 17,12 c -2.735406,0 -5,2.264594 -5,5 l 0,62 c 0,2.735406 2.264594,5 5,5 l 62,0 c 2.735406,0 5,-2.264594 5,-5 l 0,-62 c 0,-2.735406 -2.264594,-5 -5,-5 l -62,0 z m 0,4 62,0 c 0.588594,0 1,0.411406 1,1 l 0,62 c 0,0.588594 -0.411406,1 -1,1 l -62,0 c -0.588594,0 -1,-0.411406 -1,-1 l 0,-62 c 0,-0.588594 0.411406,-1 1,-1 z"
+       clip-path="url(#clipPath3918)"
+       id="rect3916" />
+    <rect
+       ry="3"
+       rx="3"
+       y="114"
+       x="14"
+       height="68"
+       width="68"
+       id="rect3906"
+       style="fill:#ff0000;fill-opacity:1;stroke:none" />
+    <path
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none"
+       d="m 17,14 c -1.662,0 -3,1.338 -3,3 l 0,62 c 0,1.662 1.338,3 3,3 l 62,0 c 1.662,0 3,-1.338 3,-3 l 0,-62 c 0,-1.662 -1.338,-3 -3,-3 l -62,0 z m 0,1.78125 62,0 c 0.703602,0 1.21875,0.515148 1.21875,1.21875 l 0,62 c 0,0.703602 -0.515148,1.21875 -1.21875,1.21875 l -62,0 c -0.703602,0 -1.21875,-0.515148 -1.21875,-1.21875 l 0,-62 c 0,-0.703602 0.515148,-1.21875 1.21875,-1.21875 z"
+       id="rect3784" />
+    <path
+       style="opacity:0.2;fill:#000000;fill-opacity:1;stroke:none"
+       d="m 17,14 c -1.662,0 -3,1.338 -3,3 l 0,62 c 0,1.662 1.338,3 3,3 l 62,0 c 1.662,0 3,-1.338 3,-3 l 0,-62 c 0,-1.662 -1.338,-3 -3,-3 l -62,0 z m 0,1 62,0 c 1.119848,0 2,0.880152 2,2 l 0,62 c 0,1.119848 -0.880152,2 -2,2 l -62,0 c -1.119848,0 -2,-0.880152 -2,-2 l 0,-62 c 0,-1.119848 0.880152,-2 2,-2 z"
+       id="rect3777" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Gears"
+     sodipodi:insensitive="true" />
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true">
+    <path
+       style="fill:url(#linearGradient2912);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 5,7 62,0 c 2.216001,0 4,1.784 4,4 l 0,62 c 10e-7,2.216001 -1.784,4 -4,4 l -62,0 c -2.215999,10e-7 -4,-1.784 -4,-4 l 0,-62 c 0,-2.215999 1.784,-4 4,-4 z"
+       id="rect2419" />
+    <path
+       style="opacity:0.5;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728" />
+    <path
+       style="fill:url(#linearGradient3279);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 17,84 c -2.752703,0 -5,-2.247297 -5,-5 l 0,-62 c 0,-2.752703 2.247298,-5 5,-5 l 62,0 c 2.752703,0 5.000001,2.247297 5,5 l 0,62 c 0,2.752703 -2.247297,5 -5,5 l -62,0 z m 0,-2 62,0 c 1.679298,0 3,-1.320703 3,-3 l 0,-62 c 10e-7,-1.679297 -1.320703,-3 -3,-3 l -62,0 c -1.679296,0 -3,1.320703 -3,3 l 0,62 c 0,1.679297 1.320703,3 3,3 z"
+       id="rect3425" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.2;fill:url(#radialGradient2874);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+</svg>
diff --git a/interface/images/menu/boh.svg b/interface/images/menu/boh.svg
new file mode 100755
index 0000000..0fcca16
--- /dev/null
+++ b/interface/images/menu/boh.svg
@@ -0,0 +1,7044 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg:svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="delete2.svg"
+   version="1.0"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:version="0.32"
+   id="svg2408"
+   height="96"
+   width="96">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="15.863342"
+     inkscape:cy="46.654964"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <svg:defs
+     id="defs2410">
+    <svg:linearGradient
+       id="linearGradient3637">
+      <svg:stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <svg:stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <svg:stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       id="linearGradient3737"
+       inkscape:collect="always">
+      <svg:stop
+         id="stop3739"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <svg:stop
+         id="stop3741"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       id="linearGradient3700">
+      <svg:stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2276c5;stop-opacity:1;" />
+      <svg:stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#68baf4;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:filter
+       id="filter3174"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <svg:rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </svg:clipPath>
+    <svg:linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843"
+       xlink:href="#linearGradient3700"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <svg:path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <svg:rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       id="filter3657"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <svg:stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <svg:linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       id="linearGradient3737-3"
+       inkscape:collect="always">
+      <svg:stop
+         id="stop3739-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <svg:stop
+         id="stop3741-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <svg:linearGradient
+       id="linearGradient3183-0">
+      <svg:stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#c80000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f3604d;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       id="XMLID_80_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop140" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop142" />
+      <midPointStop
+         id="midPointStop144"
+         style="stop-color:#003399"
+         offset="0" />
+      <midPointStop
+         id="midPointStop146"
+         style="stop-color:#003399"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop148"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       id="XMLID_81_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop155" />
+      <svg:stop
+         style="stop-color:#a3daaf;stop-opacity:1"
+         offset="1"
+         id="stop157" />
+      <midPointStop
+         id="midPointStop159"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop161"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop163"
+         style="stop-color:#A3DAAF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_82_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop170" />
+      <svg:stop
+         style="stop-color:#a3daaf;stop-opacity:1"
+         offset="1"
+         id="stop172" />
+      <midPointStop
+         id="midPointStop174"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop176"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop178"
+         style="stop-color:#A3DAAF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_83_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop185" />
+      <svg:stop
+         style="stop-color:#99ccff;stop-opacity:1"
+         offset="0.0562"
+         id="stop187" />
+      <svg:stop
+         style="stop-color:#3399ff;stop-opacity:1"
+         offset="0.69660002"
+         id="stop189" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop191" />
+      <midPointStop
+         id="midPointStop193"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop195"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop197"
+         style="stop-color:#99CCFF"
+         offset="0.0562" />
+      <midPointStop
+         id="midPointStop199"
+         style="stop-color:#99CCFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop201"
+         style="stop-color:#3399FF"
+         offset="0.6966" />
+      <midPointStop
+         id="midPointStop203"
+         style="stop-color:#3399FF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop205"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       id="XMLID_84_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop212" />
+      <svg:stop
+         style="stop-color:#3399ff;stop-opacity:1"
+         offset="1"
+         id="stop214" />
+      <midPointStop
+         id="midPointStop216"
+         style="stop-color:#003399"
+         offset="0" />
+      <midPointStop
+         id="midPointStop218"
+         style="stop-color:#003399"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop220"
+         style="stop-color:#3399FF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       cx="160.10159"
+       cy="225.54491"
+       r="102.7621"
+       fx="160.10159"
+       fy="225.54491"
+       id="XMLID_85_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+      <svg:stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop227" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop229" />
+      <midPointStop
+         id="midPointStop231"
+         style="stop-color:#428AFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop233"
+         style="stop-color:#428AFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop235"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       id="XMLID_86_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#e6f6f9;stop-opacity:1"
+         offset="0"
+         id="stop242" />
+      <svg:stop
+         style="stop-color:#71a6cd;stop-opacity:1"
+         offset="1"
+         id="stop244" />
+      <midPointStop
+         id="midPointStop246"
+         style="stop-color:#E6F6F9"
+         offset="0" />
+      <midPointStop
+         id="midPointStop248"
+         style="stop-color:#E6F6F9"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop250"
+         style="stop-color:#71A6CD"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408"
+       id="XMLID_87_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop259" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop261" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop263" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop265" />
+      <midPointStop
+         id="midPointStop267"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop269"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop271"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919"
+       id="XMLID_88_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop278" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop280" />
+      <midPointStop
+         id="midPointStop282"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop284"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop286"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082"
+       id="XMLID_89_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop293" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop295" />
+      <midPointStop
+         id="midPointStop297"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop299"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop301"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895"
+       id="XMLID_90_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop308" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop310" />
+      <midPointStop
+         id="midPointStop312"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop314"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop316"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891"
+       id="XMLID_91_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop323" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop325" />
+      <midPointStop
+         id="midPointStop327"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop329"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop331"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201"
+       id="XMLID_92_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop338" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop340" />
+      <midPointStop
+         id="midPointStop342"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop344"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop346"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909"
+       id="XMLID_93_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop353" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop355" />
+      <midPointStop
+         id="midPointStop357"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop359"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop361"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738"
+       id="XMLID_94_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop370" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop372" />
+      <midPointStop
+         id="midPointStop374"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop376"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop378"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547"
+       id="XMLID_95_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop385" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop387" />
+      <midPointStop
+         id="midPointStop389"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop391"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop393"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409"
+       id="XMLID_96_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop400" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop402" />
+      <midPointStop
+         id="midPointStop404"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop406"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop408"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232"
+       id="XMLID_97_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop415" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop417" />
+      <midPointStop
+         id="midPointStop419"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop421"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop423"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505"
+       id="XMLID_98_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop430" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop432" />
+      <midPointStop
+         id="midPointStop434"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop436"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop438"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396"
+       id="XMLID_99_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop445" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop447" />
+      <midPointStop
+         id="midPointStop449"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop451"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop453"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036"
+       id="XMLID_100_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop460" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop462" />
+      <midPointStop
+         id="midPointStop464"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop466"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop468"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591"
+       id="XMLID_101_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop475" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop477" />
+      <midPointStop
+         id="midPointStop479"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop481"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop483"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415"
+       id="XMLID_102_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop490" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop492" />
+      <midPointStop
+         id="midPointStop494"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop496"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop498"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999"
+       id="XMLID_103_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop505" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop507" />
+      <midPointStop
+         id="midPointStop509"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop511"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop513"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359"
+       id="XMLID_104_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop522" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop524" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop526" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop528" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop530" />
+      <midPointStop
+         id="midPointStop532"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop534"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop536"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201"
+       id="XMLID_105_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop543" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop545" />
+      <midPointStop
+         id="midPointStop547"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop549"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop551"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014"
+       id="XMLID_106_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop563" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop565" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop567" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop569" />
+      <midPointStop
+         id="midPointStop571"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop573"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop575"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303"
+       id="XMLID_107_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop582" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop584" />
+      <midPointStop
+         id="midPointStop586"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop588"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop590"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591"
+       id="XMLID_108_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop597" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop599" />
+      <midPointStop
+         id="midPointStop601"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop603"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop605"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707"
+       id="XMLID_109_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop612" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop614" />
+      <midPointStop
+         id="midPointStop616"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop618"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop620"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641"
+       id="XMLID_110_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop627" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop629" />
+      <midPointStop
+         id="midPointStop631"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop633"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop635"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703"
+       id="XMLID_111_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop642" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop644" />
+      <midPointStop
+         id="midPointStop646"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop648"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop650"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341"
+       id="XMLID_112_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop657" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop659" />
+      <midPointStop
+         id="midPointStop661"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop663"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop665"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137"
+       id="XMLID_113_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop674" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop676" />
+      <midPointStop
+         id="midPointStop678"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop680"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop682"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741"
+       id="XMLID_114_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop689" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop691" />
+      <midPointStop
+         id="midPointStop693"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop695"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop697"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319"
+       id="XMLID_115_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop704" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop706" />
+      <midPointStop
+         id="midPointStop708"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop710"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop712"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791"
+       id="XMLID_116_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop719" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop721" />
+      <midPointStop
+         id="midPointStop723"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop725"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop727"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363"
+       id="XMLID_117_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop734" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop736" />
+      <midPointStop
+         id="midPointStop738"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop740"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop742"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335"
+       id="XMLID_118_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop749" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop751" />
+      <midPointStop
+         id="midPointStop753"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop755"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop757"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021"
+       id="XMLID_119_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop764" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop766" />
+      <midPointStop
+         id="midPointStop768"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop770"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop772"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141"
+       id="XMLID_120_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop779" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop781" />
+      <midPointStop
+         id="midPointStop783"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop785"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop787"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449"
+       id="XMLID_121_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop794" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop796" />
+      <midPointStop
+         id="midPointStop798"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop800"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop802"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159"
+       id="XMLID_122_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop809" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop811" />
+      <midPointStop
+         id="midPointStop813"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop815"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop817"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209"
+       id="XMLID_123_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop826" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop828" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop830" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop832" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop834" />
+      <midPointStop
+         id="midPointStop836"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop838"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop840"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349"
+       id="XMLID_124_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop847" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop849" />
+      <midPointStop
+         id="midPointStop851"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop853"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop855"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001"
+       id="XMLID_125_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop867" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop869" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop871" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop873" />
+      <midPointStop
+         id="midPointStop875"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop877"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop879"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop886" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop888" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281"
+       id="XMLID_127_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop901" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop903" />
+      <midPointStop
+         id="midPointStop905"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop907"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop909"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931"
+       id="XMLID_128_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop916" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop918" />
+      <midPointStop
+         id="midPointStop920"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop922"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop924"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598"
+       id="XMLID_129_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop931" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop933" />
+      <midPointStop
+         id="midPointStop935"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop937"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop939"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231"
+       id="XMLID_130_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop946" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop948" />
+      <midPointStop
+         id="midPointStop950"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop952"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop954"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop961" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop963" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228"
+       id="XMLID_132_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop978" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop980" />
+      <midPointStop
+         id="midPointStop982"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop984"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop986"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117"
+       id="XMLID_133_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop993" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop995" />
+      <midPointStop
+         id="midPointStop997"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop999"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1001"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102"
+       id="XMLID_134_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1008" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1010" />
+      <midPointStop
+         id="midPointStop1012"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1014"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1016"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073"
+       id="XMLID_135_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop1023" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1025" />
+      <midPointStop
+         id="midPointStop1027"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1029"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1031"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1038" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop1040" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1053" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop1055" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1068" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1070" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367"
+       id="XMLID_139_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1083" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1085" />
+      <midPointStop
+         id="midPointStop1087"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1089"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1091"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1098" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1100" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337"
+       id="XMLID_141_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop1113" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1115" />
+      <midPointStop
+         id="midPointStop1117"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop1119"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1121"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599"
+       id="XMLID_142_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1130" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop1132" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop1134" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop1136" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1138" />
+      <midPointStop
+         id="midPointStop1140"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1142"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1144"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097"
+       id="XMLID_143_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1151" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1153" />
+      <midPointStop
+         id="midPointStop1155"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1157"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1159"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       id="XMLID_144_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop1169" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop1171" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop1173" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop1175" />
+      <midPointStop
+         id="midPointStop1177"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1179"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1181"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="linearGradient7061"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7063" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7065" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       id="XMLID_146_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop1190" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1192" />
+      <midPointStop
+         id="midPointStop1194"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1196"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1198"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="linearGradient7072"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop7074" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7076" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       id="XMLID_148_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1207" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1209" />
+      <midPointStop
+         id="midPointStop1211"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1213"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1215"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       id="XMLID_149_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1224" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop1226" />
+      <midPointStop
+         id="midPointStop1228"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1230"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1232"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       id="XMLID_150_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1239" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1241" />
+      <midPointStop
+         id="midPointStop1243"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1245"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1247"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="linearGradient7091"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7093" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7095" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="linearGradient7098"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7100" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7102" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="linearGradient7105"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7107" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7109" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="linearGradient7112"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7114" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7116" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       id="XMLID_155_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1264" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1266" />
+      <midPointStop
+         id="midPointStop1268"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1270"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1272"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       id="XMLID_156_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop1281" />
+      <svg:stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop1283" />
+      <midPointStop
+         id="midPointStop1285"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1287"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1289"
+         style="stop-color:#94CAFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       id="XMLID_157_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop1296" />
+      <svg:stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop1298" />
+      <midPointStop
+         id="midPointStop1300"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1302"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1304"
+         style="stop-color:#94CAFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="108.9547"
+       x2="171.04311"
+       y1="27.434099"
+       x1="89.522499"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6425"
+       xlink:href="#XMLID_158_"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       id="XMLID_158_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#99ccff;stop-opacity:1"
+         offset="0"
+         id="stop1311" />
+      <svg:stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="1"
+         id="stop1313" />
+      <midPointStop
+         id="midPointStop1315"
+         style="stop-color:#99CCFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1317"
+         style="stop-color:#99CCFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1319"
+         style="stop-color:#428AFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="48.791"
+       x2="48.752899"
+       y1="207.65041"
+       x1="207.6123"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6269-12"
+       xlink:href="#XMLID_80_-300"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       id="XMLID_80_-300"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#2f2f2f;stop-opacity:1"
+         offset="0"
+         id="stop9438" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9440" />
+      <midPointStop
+         id="midPointStop144"
+         style="stop-color:#2f2f2f"
+         offset="0" />
+      <midPointStop
+         id="midPointStop146"
+         style="stop-color:#2f2f2f"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop148"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="193.487"
+       x2="193.901"
+       y1="66.130898"
+       x1="66.544899"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6271-673"
+       xlink:href="#XMLID_81_-401"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       id="XMLID_81_-401"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9444" />
+      <svg:stop
+         style="stop-color:#c5c5c5;stop-opacity:1"
+         offset="1"
+         id="stop9446" />
+      <midPointStop
+         id="midPointStop159"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop161"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop163"
+         style="stop-color:#c5c5c5"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6273-406"
+       xlink:href="#XMLID_82_-773"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_82_-773"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9450" />
+      <svg:stop
+         style="stop-color:#c5c5c5;stop-opacity:1"
+         offset="1"
+         id="stop9452" />
+      <midPointStop
+         id="midPointStop174"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop176"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop178"
+         style="stop-color:#c5c5c5"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6275-166"
+       xlink:href="#XMLID_83_-832"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_83_-832"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9456" />
+      <svg:stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="0.0562"
+         id="stop9458" />
+      <svg:stop
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0.69660002"
+         id="stop9460" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9462" />
+      <midPointStop
+         id="midPointStop193"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop195"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop197"
+         style="stop-color:#c3c3c3"
+         offset="0.0562" />
+      <midPointStop
+         id="midPointStop199"
+         style="stop-color:#c3c3c3"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop201"
+         style="stop-color:#868686"
+         offset="0.6966" />
+      <midPointStop
+         id="midPointStop203"
+         style="stop-color:#868686"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop205"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="19.067101"
+       x2="69.907303"
+       y1="86.971199"
+       x1="153.97951"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6277-610"
+       xlink:href="#XMLID_84_-677"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       id="XMLID_84_-677"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#2f2f2f;stop-opacity:1"
+         offset="0"
+         id="stop9466" />
+      <svg:stop
+         style="stop-color:#868686;stop-opacity:1"
+         offset="1"
+         id="stop9468" />
+      <midPointStop
+         id="midPointStop216"
+         style="stop-color:#2f2f2f"
+         offset="0" />
+      <midPointStop
+         id="midPointStop218"
+         style="stop-color:#2f2f2f"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop220"
+         style="stop-color:#868686"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       r="102.7621"
+       fy="225.54491"
+       fx="160.10159"
+       cy="225.54491"
+       cx="160.10159"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient6279-99"
+       xlink:href="#XMLID_85_-413"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       cx="160.10159"
+       cy="225.54491"
+       r="102.7621"
+       fx="160.10159"
+       fy="225.54491"
+       id="XMLID_85_-413"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9472" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9474" />
+      <midPointStop
+         id="midPointStop231"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop233"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop235"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       y2="62.4673"
+       x2="208.98441"
+       y1="62.4673"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6281-27"
+       xlink:href="#XMLID_86_-281"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       id="XMLID_86_-281"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#f2f2f2;stop-opacity:1"
+         offset="0"
+         id="stop9478" />
+      <svg:stop
+         style="stop-color:#9b9b9b;stop-opacity:1"
+         offset="1"
+         id="stop9480" />
+      <midPointStop
+         id="midPointStop246"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <midPointStop
+         id="midPointStop248"
+         style="stop-color:#f2f2f2"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop250"
+         style="stop-color:#9b9b9b"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="109.9408"
+       x2="133.71049"
+       y1="185.7363"
+       x1="57.915001"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6283-124"
+       xlink:href="#XMLID_87_-7"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408"
+       id="XMLID_87_-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9484" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9486" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9488" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9490" />
+      <midPointStop
+         id="midPointStop267"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop269"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop271"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="135.90919"
+       x2="116.0225"
+       y1="135.90919"
+       x1="60.370098"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6285-348"
+       xlink:href="#XMLID_88_-910"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919"
+       id="XMLID_88_-910"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9494" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9496" />
+      <midPointStop
+         id="midPointStop282"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop284"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop286"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="169.9082"
+       x2="92.127899"
+       y1="169.9082"
+       x1="51.419399"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6287-770"
+       xlink:href="#XMLID_89_-317"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082"
+       id="XMLID_89_-317"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9500" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9502" />
+      <midPointStop
+         id="midPointStop297"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop299"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop301"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="180.6895"
+       x2="128.5298"
+       y1="180.6895"
+       x1="83.349098"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6289-142"
+       xlink:href="#XMLID_90_-384"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895"
+       id="XMLID_90_-384"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9506" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9508" />
+      <midPointStop
+         id="midPointStop312"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop314"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop316"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="143.37891"
+       x2="146.2168"
+       y1="143.37891"
+       x1="68.799301"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6291-78"
+       xlink:href="#XMLID_91_-871"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891"
+       id="XMLID_91_-871"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9512" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9514" />
+      <midPointStop
+         id="midPointStop327"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop329"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop331"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="160.54201"
+       x2="143.7529"
+       y1="160.54201"
+       x1="57.743198"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6293-824"
+       xlink:href="#XMLID_92_-17"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201"
+       id="XMLID_92_-17"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9518" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9520" />
+      <midPointStop
+         id="midPointStop342"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop344"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop346"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="145.86909"
+       x2="110.6274"
+       y1="145.86909"
+       x1="45.084499"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6295-851"
+       xlink:href="#XMLID_93_-680"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909"
+       id="XMLID_93_-680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9524" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9526" />
+      <midPointStop
+         id="midPointStop357"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop359"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop361"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="176.6738"
+       x2="65.547401"
+       y1="141.1396"
+       x1="65.547401"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6297-148"
+       xlink:href="#XMLID_94_-24"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738"
+       id="XMLID_94_-24"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9530" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9532" />
+      <midPointStop
+         id="midPointStop374"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop376"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop378"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="155.5547"
+       x2="83.372101"
+       y1="155.5547"
+       x1="56.244099"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6299-516"
+       xlink:href="#XMLID_95_-472"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547"
+       id="XMLID_95_-472"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9536" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9538" />
+      <midPointStop
+         id="midPointStop389"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop391"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop393"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="133.41409"
+       x2="73.045403"
+       y1="133.41409"
+       x1="51.5425"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6301-40"
+       xlink:href="#XMLID_96_-410"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409"
+       id="XMLID_96_-410"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9542" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9544" />
+      <midPointStop
+         id="midPointStop404"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop406"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop408"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="164.3232"
+       x2="144.998"
+       y1="164.3232"
+       x1="112.6553"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6303-774"
+       xlink:href="#XMLID_97_-458"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232"
+       id="XMLID_97_-458"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9548" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9550" />
+      <midPointStop
+         id="midPointStop419"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop421"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop423"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="123.7505"
+       x2="73.045403"
+       y1="123.7505"
+       x1="51.702599"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6305-152"
+       xlink:href="#XMLID_98_-723"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505"
+       id="XMLID_98_-723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9554" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9556" />
+      <midPointStop
+         id="midPointStop434"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop436"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop438"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="117.1396"
+       x2="111.8184"
+       y1="117.1396"
+       x1="68.9487"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6307-705"
+       xlink:href="#XMLID_99_-634"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396"
+       id="XMLID_99_-634"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9560" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9562" />
+      <midPointStop
+         id="midPointStop449"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop451"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop453"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="121.7036"
+       x2="101.0723"
+       y1="121.7036"
+       x1="43.173302"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6309-493"
+       xlink:href="#XMLID_100_-34"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036"
+       id="XMLID_100_-34"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9566" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9568" />
+      <midPointStop
+         id="midPointStop464"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop466"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop468"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="181.83591"
+       x2="102.8101"
+       y1="181.83591"
+       x1="64.091797"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6311-389"
+       xlink:href="#XMLID_101_-145"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591"
+       id="XMLID_101_-145"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9572" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9574" />
+      <midPointStop
+         id="midPointStop479"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop481"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop483"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="102.415"
+       x2="89.291496"
+       y1="116.5332"
+       x1="89.291496"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6313-341"
+       xlink:href="#XMLID_102_-594"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415"
+       id="XMLID_102_-594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9578" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9580" />
+      <midPointStop
+         id="midPointStop494"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop496"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop498"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="166.78999"
+       x2="103.6514"
+       y1="166.78999"
+       x1="64.091797"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6315-70"
+       xlink:href="#XMLID_103_-322"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999"
+       id="XMLID_103_-322"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9584" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9586" />
+      <midPointStop
+         id="midPointStop509"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop511"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop513"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="135.68359"
+       x2="121.7998"
+       y1="186.7813"
+       x1="121.7998"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6317-432"
+       xlink:href="#XMLID_104_-426"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359"
+       id="XMLID_104_-426"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9590" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9592" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9594" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9596" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9598" />
+      <midPointStop
+         id="midPointStop532"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop534"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop536"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="120.8201"
+       x2="107.8923"
+       y1="153.74899"
+       x1="140.8213"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6319-99"
+       xlink:href="#XMLID_105_-588"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201"
+       id="XMLID_105_-588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9602" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9604" />
+      <midPointStop
+         id="midPointStop547"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop549"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop551"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="121.5014"
+       x2="174.5889"
+       y1="186.5674"
+       x1="109.5229"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6321-310"
+       xlink:href="#XMLID_106_-902"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014"
+       id="XMLID_106_-902"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9608" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9610" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9612" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9614" />
+      <midPointStop
+         id="midPointStop571"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop573"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop575"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="141.5303"
+       x2="158.6631"
+       y1="141.5303"
+       x1="112.7676"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6323-611"
+       xlink:href="#XMLID_107_-908"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303"
+       id="XMLID_107_-908"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9618" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9620" />
+      <midPointStop
+         id="midPointStop586"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop588"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop590"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="173.58591"
+       x2="139.75681"
+       y1="173.58591"
+       x1="106.2578"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6325-800"
+       xlink:href="#XMLID_108_-618"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591"
+       id="XMLID_108_-618"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9624" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9626" />
+      <midPointStop
+         id="midPointStop601"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop603"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop605"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="184.4707"
+       x2="170.3076"
+       y1="184.4707"
+       x1="132.9424"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6327-400"
+       xlink:href="#XMLID_109_-773"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707"
+       id="XMLID_109_-773"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9630" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9632" />
+      <midPointStop
+         id="midPointStop616"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop618"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop620"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="149.56641"
+       x2="183.70309"
+       y1="149.56641"
+       x1="119.5918"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6329-40"
+       xlink:href="#XMLID_110_-751"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641"
+       id="XMLID_110_-751"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9636" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9638" />
+      <midPointStop
+         id="midPointStop631"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop633"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop635"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="165.5703"
+       x2="182.47749"
+       y1="165.5703"
+       x1="111.2227"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6331-210"
+       xlink:href="#XMLID_111_-96"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703"
+       id="XMLID_111_-96"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9642" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9644" />
+      <midPointStop
+         id="midPointStop646"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop648"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop650"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="151.52341"
+       x2="154.5625"
+       y1="151.52341"
+       x1="100.2744"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6333-446"
+       xlink:href="#XMLID_112_-727"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341"
+       id="XMLID_112_-727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9648" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9650" />
+      <midPointStop
+         id="midPointStop661"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop663"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop665"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="179.5137"
+       x2="117.7603"
+       y1="146.1875"
+       x1="117.7603"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6335-626"
+       xlink:href="#XMLID_113_-280"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137"
+       id="XMLID_113_-280"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9654" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9656" />
+      <midPointStop
+         id="midPointStop678"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop680"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop682"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="159.85741"
+       x2="132.4502"
+       y1="159.85741"
+       x1="109.9058"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6337-884"
+       xlink:href="#XMLID_114_-97"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741"
+       id="XMLID_114_-97"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9660" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9662" />
+      <midPointStop
+         id="midPointStop693"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop695"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop697"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="139.24319"
+       x2="122.7686"
+       y1="139.24319"
+       x1="105.1421"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6339-140"
+       xlink:href="#XMLID_115_-820"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319"
+       id="XMLID_115_-820"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9666" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9668" />
+      <midPointStop
+         id="midPointStop708"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop710"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop712"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="169.791"
+       x2="183.51759"
+       y1="169.791"
+       x1="156.75"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6341-178"
+       xlink:href="#XMLID_116_-848"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791"
+       id="XMLID_116_-848"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9672" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9674" />
+      <midPointStop
+         id="midPointStop723"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop725"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop727"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="130.2363"
+       x2="122.7686"
+       y1="130.2363"
+       x1="105.1421"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6343-456"
+       xlink:href="#XMLID_117_-194"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363"
+       id="XMLID_117_-194"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9678" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9680" />
+      <midPointStop
+         id="midPointStop738"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop740"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop742"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="124.335"
+       x2="155.19341"
+       y1="124.335"
+       x1="119.3262"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6345-512"
+       xlink:href="#XMLID_118_-250"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335"
+       id="XMLID_118_-250"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9684" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9686" />
+      <midPointStop
+         id="midPointStop753"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop755"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop757"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="128.2021"
+       x2="146.27341"
+       y1="128.2021"
+       x1="97.902802"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6347-184"
+       xlink:href="#XMLID_119_-606"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021"
+       id="XMLID_119_-606"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9690" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9692" />
+      <midPointStop
+         id="midPointStop768"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop770"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop772"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="185.19141"
+       x2="148.7822"
+       y1="185.19141"
+       x1="116.7427"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6349-877"
+       xlink:href="#XMLID_120_-395"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141"
+       id="XMLID_120_-395"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9696" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9698" />
+      <midPointStop
+         id="midPointStop783"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop785"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop787"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="110.5449"
+       x2="136.19341"
+       y1="123.416"
+       x1="136.19341"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6351-447"
+       xlink:href="#XMLID_121_-770"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449"
+       id="XMLID_121_-770"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9702" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9704" />
+      <midPointStop
+         id="midPointStop798"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop800"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop802"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="170.68159"
+       x2="149.4102"
+       y1="170.68159"
+       x1="116.7427"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6353-441"
+       xlink:href="#XMLID_122_-543"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159"
+       id="XMLID_122_-543"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9708" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9710" />
+      <midPointStop
+         id="midPointStop813"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop815"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop817"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="142.41209"
+       x2="164.56641"
+       y1="190.0674"
+       x1="164.56641"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6355-488"
+       xlink:href="#XMLID_123_-726"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209"
+       id="XMLID_123_-726"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9714" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9716" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9718" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9720" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9722" />
+      <midPointStop
+         id="midPointStop836"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop838"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop840"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="129.86349"
+       x2="152.1692"
+       y1="159.6348"
+       x1="181.9404"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6357-493"
+       xlink:href="#XMLID_124_-427"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349"
+       id="XMLID_124_-427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9726" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9728" />
+      <midPointStop
+         id="midPointStop851"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop853"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop855"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="55.553001"
+       x2="171.70821"
+       y1="138.93359"
+       x1="88.327599"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6359-440"
+       xlink:href="#XMLID_125_-451"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001"
+       id="XMLID_125_-451"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9732" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9734" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9736" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9738" />
+      <midPointStop
+         id="midPointStop875"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop877"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop879"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.741203"
+       x2="152.7852"
+       y1="84.741203"
+       x1="89.107903"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6361-910"
+       xlink:href="#XMLID_126_-70"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_-70"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9742" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9744" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="120.8281"
+       x2="125.7993"
+       y1="120.8281"
+       x1="79.251503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6363-657"
+       xlink:href="#XMLID_127_-555"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281"
+       id="XMLID_127_-555"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9748" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9750" />
+      <midPointStop
+         id="midPointStop905"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop907"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop909"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="132.56931"
+       x2="167.68359"
+       y1="132.56931"
+       x1="115.9443"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6365-734"
+       xlink:href="#XMLID_128_-141"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931"
+       id="XMLID_128_-141"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9754" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9756" />
+      <midPointStop
+         id="midPointStop920"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop922"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop924"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="93.078598"
+       x2="187.3965"
+       y1="93.078598"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6367-266"
+       xlink:href="#XMLID_129_-770"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598"
+       id="XMLID_129_-770"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9760" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9762" />
+      <midPointStop
+         id="midPointStop935"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop937"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop939"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="111.2231"
+       x2="184.93159"
+       y1="111.2231"
+       x1="86.376503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6369-690"
+       xlink:href="#XMLID_130_-72"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231"
+       id="XMLID_130_-72"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9766" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9768" />
+      <midPointStop
+         id="midPointStop950"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop952"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop954"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="95.561501"
+       x2="146.76559"
+       y1="95.561501"
+       x1="71.667503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6371-381"
+       xlink:href="#XMLID_131_-413"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_-413"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9772" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9774" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="127.8228"
+       x2="95.352097"
+       y1="90.179703"
+       x1="95.352097"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6373-572"
+       xlink:href="#XMLID_132_-722"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228"
+       id="XMLID_132_-722"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9778" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9780" />
+      <midPointStop
+         id="midPointStop982"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop984"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop986"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="105.5117"
+       x2="115.7422"
+       y1="105.5117"
+       x1="84.628403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6375-640"
+       xlink:href="#XMLID_133_-214"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117"
+       id="XMLID_133_-214"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9784" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9786" />
+      <midPointStop
+         id="midPointStop997"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop999"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1001"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="82.119102"
+       x2="103.4116"
+       y1="82.119102"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6377-149"
+       xlink:href="#XMLID_134_-535"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102"
+       id="XMLID_134_-535"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9790" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9792" />
+      <midPointStop
+         id="midPointStop1012"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1014"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1016"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="115.5073"
+       x2="186.3633"
+       y1="115.5073"
+       x1="149.50391"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6379-302"
+       xlink:href="#XMLID_135_-577"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073"
+       id="XMLID_135_-577"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9796" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9798" />
+      <midPointStop
+         id="midPointStop1027"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1029"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1031"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="71.9048"
+       x2="103.4116"
+       y1="71.9048"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6381-329"
+       xlink:href="#XMLID_136_-920"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_-920"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9802" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9804" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="65.025398"
+       x2="147.9727"
+       y1="65.025398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6383-96"
+       xlink:href="#XMLID_137_-11"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_-11"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9808" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9810" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="69.597198"
+       x2="135.6543"
+       y1="69.597198"
+       x1="69.128403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6385-535"
+       xlink:href="#XMLID_138_-837"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_-837"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9814" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9816" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="133.6367"
+       x2="138.1172"
+       y1="133.6367"
+       x1="93.767601"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6387-799"
+       xlink:href="#XMLID_139_-626"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367"
+       id="XMLID_139_-626"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9820" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9822" />
+      <midPointStop
+         id="midPointStop1087"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1089"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1091"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="49.432598"
+       x2="122.0112"
+       y1="64.238297"
+       x1="122.0112"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6389-597"
+       xlink:href="#XMLID_140_-645"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_-645"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9826" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9828" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="117.5337"
+       x2="139.0508"
+       y1="117.5337"
+       x1="93.767601"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6391-867"
+       xlink:href="#XMLID_141_-860"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337"
+       id="XMLID_141_-860"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9832" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9834" />
+      <midPointStop
+         id="midPointStop1117"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop1119"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1121"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.952599"
+       x2="159.9014"
+       y1="138.9736"
+       x1="159.9014"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6393-952"
+       xlink:href="#XMLID_142_-935"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599"
+       id="XMLID_142_-935"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9838" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9840" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9842" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9844" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9846" />
+      <midPointStop
+         id="midPointStop1140"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1142"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1144"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="67.852097"
+       x2="143.1671"
+       y1="104.6089"
+       x1="179.9238"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6395-649"
+       xlink:href="#XMLID_143_-216"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097"
+       id="XMLID_143_-216"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9850" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9852" />
+      <midPointStop
+         id="midPointStop1155"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1157"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1159"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="40.555302"
+       x2="158.21181"
+       y1="103.3657"
+       x1="95.401398"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6397-611"
+       xlink:href="#XMLID_144_-323"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       id="XMLID_144_-323"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9856" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9858" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9860" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9862" />
+      <midPointStop
+         id="midPointStop1177"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1179"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1181"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.741203"
+       x2="152.7852"
+       y1="84.741203"
+       x1="89.107903"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6399-909"
+       xlink:href="#XMLID_126_-463"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_-463"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9866" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9868" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="83.484398"
+       x2="187.3965"
+       y1="83.484398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6401-54"
+       xlink:href="#XMLID_146_-485"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       id="XMLID_146_-485"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9872" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9874" />
+      <midPointStop
+         id="midPointStop1194"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1196"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1198"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="95.561501"
+       x2="146.76559"
+       y1="95.561501"
+       x1="71.667503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6403-766"
+       xlink:href="#XMLID_131_-578"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_-578"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9878" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9880" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="86.965302"
+       x2="146.76559"
+       y1="86.965302"
+       x1="86.275398"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6405-525"
+       xlink:href="#XMLID_148_-757"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       id="XMLID_148_-757"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9884" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9886" />
+      <midPointStop
+         id="midPointStop1211"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1213"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1215"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="93.951698"
+       x2="111.7031"
+       y1="93.951698"
+       x1="89.539101"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6407-181"
+       xlink:href="#XMLID_149_-599"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       id="XMLID_149_-599"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9890" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9892" />
+      <midPointStop
+         id="midPointStop1228"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1230"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1232"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="80.275902"
+       x2="103.4116"
+       y1="80.275902"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6409-208"
+       xlink:href="#XMLID_150_-191"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       id="XMLID_150_-191"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9896" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9898" />
+      <midPointStop
+         id="midPointStop1243"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1245"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1247"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="71.9048"
+       x2="103.4116"
+       y1="71.9048"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6411-385"
+       xlink:href="#XMLID_136_-980"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_-980"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9902" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9904" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="65.025398"
+       x2="147.9727"
+       y1="65.025398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6413-883"
+       xlink:href="#XMLID_137_-482"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_-482"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9908" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9910" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="69.597198"
+       x2="135.6543"
+       y1="69.597198"
+       x1="69.128403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6415-860"
+       xlink:href="#XMLID_138_-859"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_-859"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9914" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9916" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="49.432598"
+       x2="122.0112"
+       y1="64.238297"
+       x1="122.0112"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6417-680"
+       xlink:href="#XMLID_140_-471"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_-471"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9920" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9922" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="68.5233"
+       x2="143.8383"
+       y1="98.137199"
+       x1="173.4521"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6419-21"
+       xlink:href="#XMLID_155_-978"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       id="XMLID_155_-978"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9926" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9928" />
+      <midPointStop
+         id="midPointStop1268"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1270"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1272"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="159.00591"
+       x2="118.7616"
+       y1="159.00591"
+       x1="60.097198"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6421-714"
+       xlink:href="#XMLID_156_-100"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       id="XMLID_156_-100"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9932" />
+      <svg:stop
+         style="stop-color:#c0c0c0;stop-opacity:1"
+         offset="1"
+         id="stop9934" />
+      <midPointStop
+         id="midPointStop1285"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1287"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1289"
+         style="stop-color:#c0c0c0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="147.877"
+       x2="118.7651"
+       y1="147.877"
+       x1="60.098598"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6423-931"
+       xlink:href="#XMLID_157_-792"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       id="XMLID_157_-792"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9938" />
+      <svg:stop
+         style="stop-color:#c0c0c0;stop-opacity:1"
+         offset="1"
+         id="stop9940" />
+      <midPointStop
+         id="midPointStop1300"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1302"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1304"
+         style="stop-color:#c0c0c0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_158_-583"
+       id="linearGradient7705-647"
+       gradientUnits="userSpaceOnUse"
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547" />
+    <svg:linearGradient
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       id="XMLID_158_-583"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="0"
+         id="stop9944" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9946" />
+      <midPointStop
+         id="midPointStop1315"
+         style="stop-color:#c3c3c3"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1317"
+         style="stop-color:#c3c3c3"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1319"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7135"
+       y2="48.791"
+       x2="48.752899"
+       y1="207.65041"
+       x1="207.6123">
+      <svg:stop
+         id="stop7137"
+         offset="0"
+         style="stop-color:#2f2f2f;stop-opacity:1" />
+      <svg:stop
+         id="stop7139"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#2f2f2f"
+         id="midPointStop144" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#2f2f2f"
+         id="midPointStop146" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop148" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7142"
+       y2="193.487"
+       x2="193.901"
+       y1="66.130898"
+       x1="66.544899">
+      <svg:stop
+         id="stop7144"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7146"
+         offset="1"
+         style="stop-color:#c5c5c5;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop159" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop161" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c5c5c5"
+         id="midPointStop163" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7149"
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223">
+      <svg:stop
+         id="stop7151"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7153"
+         offset="1"
+         style="stop-color:#c5c5c5;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop174" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop176" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c5c5c5"
+         id="midPointStop178" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7156"
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223">
+      <svg:stop
+         id="stop7158"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7160"
+         offset="0.0562"
+         style="stop-color:#c3c3c3;stop-opacity:1" />
+      <svg:stop
+         id="stop7162"
+         offset="0.69660002"
+         style="stop-color:#868686;stop-opacity:1" />
+      <svg:stop
+         id="stop7164"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop193" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop195" />
+      <midPointStop
+         offset="0.0562"
+         style="stop-color:#c3c3c3"
+         id="midPointStop197" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#c3c3c3"
+         id="midPointStop199" />
+      <midPointStop
+         offset="0.6966"
+         style="stop-color:#868686"
+         id="midPointStop201" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#868686"
+         id="midPointStop203" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop205" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7167"
+       y2="19.067101"
+       x2="69.907303"
+       y1="86.971199"
+       x1="153.97951">
+      <svg:stop
+         id="stop7169"
+         offset="0"
+         style="stop-color:#2f2f2f;stop-opacity:1" />
+      <svg:stop
+         id="stop7171"
+         offset="1"
+         style="stop-color:#868686;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#2f2f2f"
+         id="midPointStop216" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#2f2f2f"
+         id="midPointStop218" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#868686"
+         id="midPointStop220" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient7174"
+       fy="225.54491"
+       fx="160.10159"
+       r="102.7621"
+       cy="225.54491"
+       cx="160.10159">
+      <svg:stop
+         id="stop7176"
+         offset="0"
+         style="stop-color:#828282;stop-opacity:1" />
+      <svg:stop
+         id="stop7178"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#828282"
+         id="midPointStop231" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#828282"
+         id="midPointStop233" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop235" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7181"
+       y2="62.4673"
+       x2="208.98441"
+       y1="62.4673"
+       x1="47.8223">
+      <svg:stop
+         id="stop7183"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1" />
+      <svg:stop
+         id="stop7185"
+         offset="1"
+         style="stop-color:#9b9b9b;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#f2f2f2"
+         id="midPointStop246" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#f2f2f2"
+         id="midPointStop248" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#9b9b9b"
+         id="midPointStop250" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7629"
+       y2="40.555302"
+       x2="158.21181"
+       y1="103.3657"
+       x1="95.401398">
+      <svg:stop
+         id="stop7631"
+         offset="0"
+         style="stop-color:#494949;stop-opacity:1" />
+      <svg:stop
+         id="stop7633"
+         offset="0.1654"
+         style="stop-color:#505050;stop-opacity:1" />
+      <svg:stop
+         id="stop7635"
+         offset="0.59490001"
+         style="stop-color:#5d5d5d;stop-opacity:1" />
+      <svg:stop
+         id="stop7637"
+         offset="1"
+         style="stop-color:#616161;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#494949"
+         id="midPointStop1177" />
+      <midPointStop
+         offset="0.3051"
+         style="stop-color:#494949"
+         id="midPointStop1179" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#616161"
+         id="midPointStop1181" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7641"
+       y2="83.484398"
+       x2="187.3965"
+       y1="83.484398"
+       x1="98.694298">
+      <svg:stop
+         id="stop7643"
+         offset="0"
+         style="stop-color:#616161;stop-opacity:1" />
+      <svg:stop
+         id="stop7645"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#616161"
+         id="midPointStop1194" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#616161"
+         id="midPointStop1196" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1198" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7649"
+       y2="86.965302"
+       x2="146.76559"
+       y1="86.965302"
+       x1="86.275398">
+      <svg:stop
+         id="stop7651"
+         offset="0"
+         style="stop-color:#b6b6b6;stop-opacity:1" />
+      <svg:stop
+         id="stop7653"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1211" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1213" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1215" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7657"
+       y2="93.951698"
+       x2="111.7031"
+       y1="93.951698"
+       x1="89.539101">
+      <svg:stop
+         id="stop7659"
+         offset="0"
+         style="stop-color:#dadada;stop-opacity:1" />
+      <svg:stop
+         id="stop7661"
+         offset="0.75840002"
+         style="stop-color:#828282;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#dadada"
+         id="midPointStop1228" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#dadada"
+         id="midPointStop1230" />
+      <midPointStop
+         offset="0.7584"
+         style="stop-color:#828282"
+         id="midPointStop1232" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7664"
+       y2="80.275902"
+       x2="103.4116"
+       y1="80.275902"
+       x1="78.984901">
+      <svg:stop
+         id="stop7666"
+         offset="0"
+         style="stop-color:#dadada;stop-opacity:1" />
+      <svg:stop
+         id="stop7668"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#dadada"
+         id="midPointStop1243" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#dadada"
+         id="midPointStop1245" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1247" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7676"
+       y2="68.5233"
+       x2="143.8383"
+       y1="98.137199"
+       x1="173.4521">
+      <svg:stop
+         id="stop7678"
+         offset="0"
+         style="stop-color:#b6b6b6;stop-opacity:1" />
+      <svg:stop
+         id="stop7680"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1268" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1270" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1272" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7684"
+       y2="159.00591"
+       x2="118.7616"
+       y1="159.00591"
+       x1="60.097198">
+      <svg:stop
+         id="stop7686"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7688"
+         offset="1"
+         style="stop-color:#c0c0c0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop1285" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop1287" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c0c0c0"
+         id="midPointStop1289" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7691"
+       y2="147.877"
+       x2="118.7651"
+       y1="147.877"
+       x1="60.098598">
+      <svg:stop
+         id="stop7693"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7695"
+         offset="1"
+         style="stop-color:#c0c0c0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop1300" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop1302" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c0c0c0"
+         id="midPointStop1304" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7698"
+       y2="108.9547"
+       x2="171.04311"
+       y1="27.434099"
+       x1="89.522499">
+      <svg:stop
+         id="stop7700"
+         offset="0"
+         style="stop-color:#c3c3c3;stop-opacity:1" />
+      <svg:stop
+         id="stop7702"
+         offset="1"
+         style="stop-color:#828282;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#c3c3c3"
+         id="midPointStop1315" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#c3c3c3"
+         id="midPointStop1317" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#828282"
+         id="midPointStop1319" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_80_-300"
+       id="linearGradient11771"
+       gradientUnits="userSpaceOnUse"
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       gradientTransform="matrix(0.2916,0,0,0.307402,7.6022656,8.757456)" />
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3918">
+      <svg:rect
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         id="rect3920"
+         width="68"
+         height="68"
+         x="14"
+         y="14"
+         rx="3"
+         ry="3" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter3773"
+       x="-0.168"
+       width="1.336"
+       y="-0.168"
+       height="1.336">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.04"
+         id="feGaussianBlur3775" />
+    </svg:filter>
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4354">
+      <svg:rect
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         id="rect4356"
+         width="68"
+         height="68"
+         x="-36"
+         y="14"
+         rx="3"
+         ry="3" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4244">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.56844"
+         id="feGaussianBlur4246" />
+    </svg:filter>
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4259"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       id="linearGradient7450">
+      <svg:stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop7452" />
+      <svg:stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop7454" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient4261"
+       gradientUnits="userSpaceOnUse"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905" />
+    <svg:linearGradient
+       id="linearGradient6119">
+      <svg:stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop6121" />
+      <svg:stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop6123" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4255"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       id="linearGradient6126">
+      <svg:stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop6128" />
+      <svg:stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop6130" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187-1"
+       id="linearGradient4257"
+       gradientUnits="userSpaceOnUse"
+       x1="73.194839"
+       y1="34.162155"
+       x2="49.625214"
+       y2="19.183952" />
+    <svg:linearGradient
+       id="linearGradient3187-1">
+      <svg:stop
+         id="stop3189-0"
+         offset="0"
+         style="stop-color:#656565;stop-opacity:1;" />
+      <svg:stop
+         id="stop3191-1"
+         offset="1"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7809">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8596875"
+         id="feGaussianBlur7811" />
+    </svg:filter>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7813">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.4521875"
+         id="feGaussianBlur7815" />
+    </svg:filter>
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4350">
+      <svg:rect
+         ry="3"
+         rx="3"
+         y="14"
+         x="84"
+         height="68"
+         width="68"
+         id="rect4352"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4325">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.439999"
+         id="feGaussianBlur4327" />
+    </svg:filter>
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62429531,-0.62429531,0.39740012,0.39740012,57.190344,56.707013)"
+       cx="56.055019"
+       cy="55.978848"
+       fx="56.055019"
+       fy="55.978848"
+       r="52.251602" />
+    <svg:linearGradient
+       id="linearGradient6145">
+      <svg:stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop6147" />
+      <svg:stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop6149" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4282"
+       id="linearGradient4340"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606059,0,0,0.68606059,75.974088,5.5532361)"
+       x1="50.760078"
+       y1="42.239994"
+       x2="113.84038"
+       y2="130.51231" />
+    <svg:linearGradient
+       id="linearGradient4282">
+      <svg:stop
+         id="stop4284"
+         offset="0"
+         style="stop-color:#e8e8e8;stop-opacity:1;" />
+      <svg:stop
+         id="stop4286"
+         offset="1"
+         style="stop-color:#828282;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient4342"
+       gradientUnits="userSpaceOnUse"
+       x1="80.875443"
+       y1="82.61515"
+       x2="82.573708"
+       y2="84.937546" />
+    <svg:linearGradient
+       id="linearGradient3298">
+      <svg:stop
+         id="stop3300"
+         offset="0"
+         style="stop-color:#f9f9f9;stop-opacity:1;" />
+      <svg:stop
+         id="stop3302"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7542">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.063379309"
+         id="feGaussianBlur7544" />
+    </svg:filter>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       x1="82.312332"
+       y1="85.362457"
+       x2="81.312866"
+       y2="82.651672" />
+    <svg:linearGradient
+       id="linearGradient6162">
+      <svg:stop
+         id="stop6164"
+         offset="0"
+         style="stop-color:#f9f9f9;stop-opacity:1;" />
+      <svg:stop
+         id="stop6166"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4290">
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path4292"
+         d="m 81.775868,33.016836 -1.698553,4.060937 -0.488099,2.909037 0.09754,1.112853 -4.392827,0.566188 -0.195242,-1.073807 -1.21047,-2.694274 -2.694273,-3.494749 -2.752856,0.741902 -0.585712,4.353794 0.292856,2.948084 0.370947,1.034757 -4.080463,1.698564 -0.468561,-0.995709 -1.874287,-2.284278 -3.514259,-2.674751 -2.459999,1.425232 0.566189,4.373317 1.034765,2.752847 0.624758,0.917615 -3.494751,2.694276 -0.722386,-0.839521 -2.401417,-1.737612 -4.080448,-1.659517 -2.010947,2.010945 1 [...]
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4278">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8909375"
+         id="feGaussianBlur4280" />
+    </svg:filter>
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4300">
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path4302"
+         d="m 81.882329,32.767073 -1.713399,4.09643 -0.492364,2.934461 0.09839,1.12258 -4.431221,0.571136 -0.196948,-1.083191 -1.22105,-2.717823 -2.717821,-3.525293 -2.776916,0.748386 -0.590831,4.391847 0.295416,2.97385 0.374189,1.043801 -4.116126,1.71341 -0.472656,-1.004412 -1.890669,-2.304242 -3.544973,-2.698129 -2.481501,1.437688 0.571138,4.41154 1.043809,2.776907 0.630218,0.925635 -3.525294,2.717824 -0.7287,-0.846858 -2.422406,-1.752799 -4.116111,-1.674021 -2.028522,2.028521 1.693705 [...]
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4308">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8975"
+         id="feGaussianBlur4310" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="matrix(0.68606063,0,0,0.68375842,4.2424239,5.7272471)"
+       y2="8.550745"
+       x2="60.777386"
+       y1="115.27915"
+       x1="60.777386"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3880"
+       xlink:href="#linearGradient3234"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       id="linearGradient3234">
+      <svg:stop
+         id="stop3236"
+         offset="0"
+         style="stop-color:#232323;stop-opacity:1;" />
+      <svg:stop
+         id="stop3238"
+         offset="1"
+         style="stop-color:#4b4b4b;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="8.550745"
+       x2="60.777386"
+       y1="115.27915"
+       x1="60.777386"
+       gradientTransform="matrix(0.68606063,0,0,0.68375842,2.617574,4.1334971)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6198"
+       xlink:href="#linearGradient3234"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient8128"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62429531,-0.62429531,0.39740012,0.39740012,57.190344,56.707013)"
+       cx="56.055019"
+       cy="55.978848"
+       fx="56.055019"
+       fy="55.978848"
+       r="52.251602" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4282"
+       id="linearGradient8130"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606059,0,0,0.68606059,75.974088,5.5532361)"
+       x1="50.760078"
+       y1="42.239994"
+       x2="113.84038"
+       y2="130.51231" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient8132"
+       gradientUnits="userSpaceOnUse"
+       x1="80.875443"
+       y1="82.61515"
+       x2="82.573708"
+       y2="84.937546" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient8134"
+       gradientUnits="userSpaceOnUse"
+       x1="82.312332"
+       y1="85.362457"
+       x2="81.312866"
+       y2="82.651672" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3234"
+       id="linearGradient8138"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606063,0,0,0.68375842,-104.75758,12.727247)"
+       x1="60.777386"
+       y1="115.27915"
+       x2="60.777386"
+       y2="8.550745" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient8140"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187-1"
+       id="linearGradient8142"
+       gradientUnits="userSpaceOnUse"
+       x1="73.194839"
+       y1="34.162155"
+       x2="49.625214"
+       y2="19.183952" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient8144"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient8146"
+       gradientUnits="userSpaceOnUse"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905" />
+  </svg:defs>
+  <svg:metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </svg:metadata>
+  <svg:g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <svg:rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </svg:g>
+  <svg:g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </svg:g>
+  <svg:g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <svg:rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <svg:rect
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <svg:rect
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </svg:g>
+  <svg:g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <svg:rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </svg:g>
+  <svg:g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <svg:rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </svg:g>
+  <svg:g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <svg:rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <svg:text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><svg:tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</svg:tspan></svg:text>
+    <svg:rect
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <svg:text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><svg:tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</svg:tspan></svg:text>
+    <svg:text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><svg:tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</svg:tspan></svg:text>
+    <svg:g
+       id="g8148">
+      <svg:g
+         clip-path="url(#clipPath4350)"
+         transform="translate(-70.62485,-0.59375)"
+         id="g4329"
+         style="display:inline">
+        <svg:path
+           style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4325);enable-background:a [...]
+           d="m 131.78125,29.59375 -0.125,0.3125 -1.15625,2.78125 -0.0312,0.0625 0,0.03125 -0.34375,2 0,0.0625 0,0.0625 0.0312,0.3125 -2.09375,0.25 -0.0312,-0.25 0,-0.0625 L 128,35.09375 127.15625,33.25 127.125,33.1875 127.09375,33.125 125.25,30.75 l -0.1875,-0.28125 -0.34375,0.09375 -1.875,0.5 -0.34375,0.09375 -0.0312,0.34375 -0.40625,2.96875 0,0.0625 0,0.0625 0.21875,2.03125 0,0.0625 0,0.0625 0.0937,0.25 -1.90625,0.78125 -0.125,-0.21875 L 120.3125,37.5 120.28125,37.4375 119,35.875 l -0 [...]
+           id="path4312"
+           inkscape:connector-curvature="0" />
+        <svg:path
+           style="fill:url(#radialGradient8128);fill-opacity:1;stroke:url(#linearGradient8130);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 132.12562,28.089748 -1.16672,2.789418 -0.33527,1.998189 0.067,0.764408 -3.01739,0.388909 -0.13411,-0.737587 -0.83146,-1.850671 -1.85067,-2.400509 -1.89091,0.509605 -0.40232,2.990579 0.20116,2.02501 0.2548,0.710765 -2.80283,1.166727 -0.32185,-0.683943 -1.28743,-1.569048 -2.41391,-1.837261 -1.68975,0.978978 0.38891,3.003989 0.71077,1.890904 0.42914,0.630301 -2.40051,1.850672 -0.4962,-0.576659 -1.64951,-1.193549 -2.80282,-1.139906 -1.3813,1.381299 1.15331,2.789418 1.18014,1. [...]
+           id="path6159"
+           inkscape:connector-curvature="0" />
+        <svg:path
+           sodipodi:type="arc"
+           style="fill:#b8b8b8;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient8132);stroke-width:0.45234182;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path7458"
+           sodipodi:cx="81.802116"
+           sodipodi:cy="84.007065"
+           sodipodi:rx="1.2367492"
+           sodipodi:ry="1.2367492"
+           d="m 83.038866,84.007065 c 0,0.683038 -0.553712,1.236749 -1.23675,1.236749 -0.683037,0 -1.236749,-0.553711 -1.236749,-1.236749 0,-0.683038 0.553712,-1.236749 1.236749,-1.236749 0.683038,0 1.23675,0.553711 1.23675,1.236749 z"
+           transform="matrix(2.2107174,0,0,2.2107174,-47.74347,-122.1214)" />
+        <svg:path
+           transform="matrix(22.247964,0,0,22.247964,-1686.8327,-1805.3916)"
+           d="m 83.038866,84.007065 c 0,0.683038 -0.553712,1.236749 -1.23675,1.236749 -0.683037,0 -1.236749,-0.553711 -1.236749,-1.236749 0,-0.683038 0.553712,-1.236749 1.236749,-1.236749 0.683038,0 1.23675,0.553711 1.23675,1.236749 z"
+           sodipodi:ry="1.2367492"
+           sodipodi:rx="1.2367492"
+           sodipodi:cy="84.007065"
+           sodipodi:cx="81.802116"
+           id="path7536"
+           style="fill:none;stroke:#ffffff;stroke-width:0.08989587;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter7542)"
+           sodipodi:type="arc" />
+        <svg:path
+           transform="matrix(5.7825105,0,0,5.7825105,-339.9237,-422.17725)"
+           d="m 83.038866,84.007065 c 0,0.683038 -0.553712,1.236749 -1.23675,1.236749 -0.683037,0 -1.236749,-0.553711 -1.236749,-1.236749 0,-0.683038 0.553712,-1.236749 1.236749,-1.236749 0.683038,0 1.23675,0.553711 1.23675,1.236749 z"
+           sodipodi:ry="1.2367492"
+           sodipodi:rx="1.2367492"
+           sodipodi:cy="84.007065"
+           sodipodi:cx="81.802116"
+           id="path7546"
+           style="fill:none;stroke:url(#linearGradient8134);stroke-width:0.34587052;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           sodipodi:type="arc" />
+        <svg:path
+           sodipodi:type="inkscape:offset"
+           inkscape:radius="-1.2350695"
+           inkscape:original="M 107.90625 39.0625 L 104.40625 41.75 L 103.25 43.15625 L 83.28125 84.59375 L 64.25 79.78125 C 63.861716 81.324053 63.65625 82.928843 63.65625 84.59375 C 63.65625 86.188701 63.82787 87.733839 64.1875 89.21875 L 48.40625 96.46875 C 47.13527 92.741898 46.4375 88.748046 46.4375 84.59375 C 46.4375 81.476038 46.831697 78.45458 47.5625 75.5625 L 33.09375 71.90625 L 32.90625 72.5625 L 36.40625 75.28125 L 39.09375 76.5 L 40.1875 76.6875 L 39.59375 81.0625 L 38.5 81  [...]
+           style="opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter4278)"
+           id="path7663"
+           d="m 108,40.53125 -2.625,2 -0.0312,0.0625 -1.03125,1.25 -19.28125,39.96875 44.5625,11.21875 -0.0937,-0.0625 -2.3125,-1.03125 -0.0625,0 -1.03125,-0.21875 a 1.235193,1.235193 0 0 1 -0.96875,-1.375 l 0.59375,-4.375 a 1.235193,1.235193 0 0 1 1.3125,-1.0625 l 0.875,0.0625 2.78125,-0.46875 0.0312,0 3.03125,-1.28125 0,-1.25 -3.09375,-1.28125 -2.75,-0.46875 -0.0625,0 L 127,82.28125 a 1.235193,1.235193 0 0 1 -1.28125,-1.0625 l -0.59375,-4.375 a 1.235193,1.235193 0 0 1 1,-1.375 l 0.9687 [...]
+           transform="matrix(0.68689029,0,0,0.68689029,75.95457,5.4108038)"
+           clip-path="url(#clipPath4290)" />
+        <svg:path
+           sodipodi:type="inkscape:offset"
+           inkscape:radius="-1.0933805"
+           inkscape:original="M 81.84375 32.84375 L 80.15625 36.90625 L 79.65625 39.8125 L 79.75 40.9375 L 75.34375 41.5 L 75.15625 40.4375 L 73.9375 37.75 L 71.25 34.25 L 68.5 34.96875 L 67.90625 39.34375 L 68.1875 42.28125 L 68.5625 43.3125 L 64.5 45.03125 L 64.03125 44.03125 L 62.15625 41.75 L 58.625 39.0625 L 56.15625 40.5 L 56.71875 44.875 L 57.75 47.625 L 58.375 48.53125 L 54.875 51.25 L 54.15625 50.40625 L 51.75 48.65625 L 47.6875 47 L 45.65625 49 L 47.34375 53.09375 L 49.0625 55. [...]
+           style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter4308)"
+           id="path7661"
+           d="m 82.5625,33.9375 -1.375,3.28125 -0.4375,2.5 0,0.0625 0.09375,1.0625 a 1.0934898,1.0934898 0 0 1 -0.96875,1.1875 l -4.40625,0.5625 A 1.0934898,1.0934898 0 0 1 74.28125,41.6875 L 74.15625,40.875 74.125,40.8125 73,38.3125 70.8125,35.5 69.5,35.84375 l -0.5,3.5625 0.28125,2.625 0.3125,0.90625 A 1.0934898,1.0934898 0 0 1 69,44.3125 l -4.0625,1.71875 A 1.0934898,1.0934898 0 0 1 63.5,45.5 L 63.0625,44.5625 63.03125,44.5 l -1.625,-1.9375 -2.875,-2.1875 -1.1875,0.6875 0.4375,3.5625  [...]
+           transform="matrix(0.68093886,0,0,0.68093886,76.36876,5.7773746)"
+           clip-path="url(#clipPath4300)" />
+      </svg:g>
+      <svg:g
+         clip-path="url(#clipPath4354)"
+         transform="translate(50.37515,0.40625)"
+         id="g4248"
+         style="display:inline">
+        <svg:path
+           style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4244)"
+           d="m -35.40625,-27.28125 -0.3125,0.03125 -0.125,0.28125 -1.28125,3.03125 0,0.0625 -0.0312,0.0625 -0.34375,2.1875 0,0.0625 0,0.0625 0.0312,0.34375 -2.34375,0.3125 -0.0625,-0.34375 0,-0.0625 -0.0312,-0.0625 -0.9375,-2 0,-0.0625 -0.0625,-0.03125 -2,-2.59375 -0.1875,-0.28125 -0.34375,0.09375 -2.0625,0.5625 -0.3125,0.09375 -0.0625,0.3125 -0.40625,3.28125 -0.0312,0.0625 0.0312,0.0625 0.21875,2.1875 0,0.0625 0.0312,0.03125 0.125,0.375 -2.15625,0.875 -0.15625,-0.3125 -0.0312,-0.03125  [...]
+           id="path4226"
+           inkscape:connector-curvature="0" />
+        <svg:g
+           style="fill:url(#radialGradient8144);fill-opacity:1;stroke:url(#linearGradient8146);stroke-width:1.45759726"
+           id="g2645"
+           transform="matrix(0.33201642,0.32957802,-0.32957802,0.33201642,-34.178641,9.9231531)"
+           inkscape:label="Gear24">
+          <svg:path
+             style="fill:url(#radialGradient8140);fill-opacity:1;stroke:url(#linearGradient8142);stroke-width:1.45759737"
+             d="m 16.34375,-47.5625 -1.875,4.4375 -0.5,3.1875 0.09375,1.1875 -4.78125,0.625 -0.21875,-1.1875 -1.34375,-2.9375 -2.9375,-3.78125 -3,0.78125 -0.625,4.78125 0.3125,3.1875 0.40625,1.15625 -4.46875,1.84375 -0.5,-1.09375 -2.0625,-2.5 -3.8125,-2.90625 -2.6875,1.5625 0.59375,4.75 1.15625,3.03125 0.6875,0.96875 -3.84375,2.9375 -0.78125,-0.90625 -2.625,-1.875 -4.4375,-1.84375 -2.1875,2.21875 1.8125,4.4375 1.875,2.625 0.9375,0.78125 -2.9375,3.8125 -1,-0.6875 -3.03125,-1.125 -4.75,-0. [...]
+             transform="matrix(1.4665021,0,0,1.4665021,-26.232091,-12.972501)"
+             id="path2647"
+             inkscape:connector-curvature="0" />
+        </svg:g>
+        <svg:path
+           transform="matrix(0.48690276,0.48332687,-0.48332687,0.48690276,-38.612674,-3.0294512)"
+           style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter7809)"
+           d="m 17.875,-29.21875 c 12.794439,0 24.064539,6.390407 30.96875,16.09375 L 55.375,-17.34375 52.65625,-20.875 c -0.648143,-0.846832 -0.524897,-2.051902 0.28125,-2.75 l 0.75,-0.625 1.59375,-2.21875 1.21875,-3 -0.28125,-0.28125 -2.9375,1.21875 -2.34375,1.65625 -0.5625,0.65625 c -0.698098,0.806147 -1.903168,0.929393 -2.75,0.28125 L 43.78125,-28.875 C 31.788135,-55.428895 -61.66477,-21.332002 17.875,-29.21875 z M 48.84375,30.8125 C 41.939539,40.515843 30.669439,46.90625 17.875,46.9 [...]
+           id="path7797"
+           sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccc"
+           inkscape:connector-curvature="0" />
+        <svg:path
+           transform="matrix(0.48690276,0.48332687,-0.48332687,0.48690276,-38.612674,-3.0294512)"
+           style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter7813)"
+           d="m 59.5,-9.5625 -6.5625,3.25 c 2.020989,4.6571765 3.21875,9.7663981 3.21875,15.15625 C 56.156249,14.233601 54.958489,19.342823 52.9375,24 l 6.5625,3.25 1.34375,-3.21875 c 0.446258,-1.090854 1.669216,-1.640498 2.78125,-1.25 l 0.96875,0.34375 2.53125,0.25 3.09375,-0.4375 0.0625,-0.15625 -2.40625,-1.8125 -2.5,-1.15625 -0.9375,-0.15625 c -1.169193,-0.219106 -1.955971,-1.323355 -1.78125,-2.5 L 63.3125,12.375 c 0.159005,-1.165761 1.202451,-2.003264 2.375,-1.90625 l 0.9375,0.0625 2 [...]
+           id="path7803"
+           sodipodi:nodetypes="ccsccccccccccccccccccccccccccccccccc"
+           inkscape:connector-curvature="0" />
+      </svg:g>
+    </svg:g>
+  </svg:g>
+</svg:svg>
diff --git a/interface/images/menu/call-start.svg b/interface/images/menu/call-start.svg
new file mode 100755
index 0000000..41a1865
--- /dev/null
+++ b/interface/images/menu/call-start.svg
@@ -0,0 +1,658 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="call-start.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       y2="349.2926"
+       x2="627.67029"
+       y1="347.86285"
+       x1="652.021"
+       gradientTransform="matrix(0.03851176,-0.65608659,0.65590557,0.03850112,-241.27566,417.35789)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4343"
+       xlink:href="#StandardGradient"
+       inkscape:collect="always" />
+    <linearGradient
+       id="StandardGradient"
+       gradientTransform="scale(1.1310246,0.8841541)"
+       x1="11.162445"
+       y1="5.6551228"
+       x2="11.162445"
+       y2="18.097509"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3280" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3282" />
+    </linearGradient>
+    <linearGradient
+       y2="349.2926"
+       x2="627.67029"
+       y1="347.86285"
+       x1="652.021"
+       gradientTransform="matrix(0.11586665,-1.9518366,1.9733605,0.1145396,-711.10468,1256.8145)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7313"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.154546"
+     inkscape:cx="89.413942"
+     inkscape:cy="62.132936"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98728496"
+       inkscape:original="M 62.15625 24 C 61.88334 23.990986 61.622834 23.999667 61.375 24.03125 C 61.127166 24.062833 60.86319 24.102307 60.53125 24.34375 C 60.305371 24.50805 60.258075 24.58919 60.15625 24.71875 C 60.054425 24.84831 59.952507 24.993995 59.84375 25.15625 C 59.626237 25.48076 59.377493 25.883133 59.15625 26.28125 C 58.746442 27.018449 57.474254 29.295222 56.3125 31.34375 C 55.072126 33.530898 54.44993 34.618855 54.125 35.375 C 53.962535 35.753073 53.837358 36.089218 53.8 [...]
+       style="opacity:0.1;fill:#000000;fill-opacity:1;display:inline"
+       id="path3896"
+       d="m 62.1875,23 c -0.31453,-0.01039 -0.626109,0.02282 -0.9375,0.0625 -0.262958,0.03351 -0.820597,0.110955 -1.3125,0.46875 -0.297906,0.216691 -0.492644,0.473617 -0.5625,0.5625 -0.126237,0.160622 -0.228342,0.327823 -0.34375,0.5 -0.233845,0.348875 -0.513334,0.79288 -0.75,1.21875 -0.407643,0.733305 -1.653026,2.986742 -2.8125,5.03125 -1.239791,2.186119 -1.880198,3.295683 -2.25,4.15625 -0.173646,0.404092 -0.385212,0.893663 -0.375,1.5 0.01017,0.603826 0.227535,1.037369 0.3125,1.21875 0.2 [...]
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98498666"
+       inkscape:original="M 61.125 25.125 C 60.93979 25.259718 60.447597 26.000802 60.03125 26.75 C 59.614805 27.499139 58.318643 29.794095 57.15625 31.84375 C 54.676547 36.216203 54.66798 36.264169 54.96875 36.90625 C 55.263813 37.536033 57.269666 39.56243 59.125 41.09375 C 60.703709 42.396835 60.96191 42.781368 60.90625 43.71875 C 60.867081 44.378589 59.158868 47.462351 57.5625 49.75 C 54.485178 54.160003 50.582205 57.62113 45.625 60.3125 C 43.197421 61.630312 42.890848 61.593535 41.12 [...]
+       style="opacity:0.15;fill:#000000;fill-opacity:1;display:inline"
+       id="path3892"
+       d="m 62.15625,24 c -0.27291,-0.009 -0.533416,-3.33e-4 -0.78125,0.03125 -0.247834,0.03158 -0.51181,0.07106 -0.84375,0.3125 -0.225879,0.1643 -0.273175,0.24544 -0.375,0.375 -0.101825,0.12956 -0.203743,0.275245 -0.3125,0.4375 -0.217513,0.32451 -0.466257,0.726883 -0.6875,1.125 -0.409808,0.737199 -1.681996,3.013972 -2.84375,5.0625 -1.240374,2.187148 -1.86257,3.275105 -2.1875,4.03125 -0.162465,0.378073 -0.287642,0.714218 -0.28125,1.09375 0.0064,0.379532 0.140797,0.677337 0.21875,0.84375  [...]
+    <path
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/home/matthieu/Interne/Communication/Site Web/Version 3.0/Accueil temporaire/images/phone_square.png"
+       sodipodi:nodetypes="cssssssssssssssssssssc"
+       id="path3886"
+       d="m 71.845479,38.905446 c -0.227691,1.037229 -1.773783,5.569235 -2.509801,7.355542 -1.022418,2.481463 -3.330084,6.453138 -5.008866,8.620702 -2.006213,2.590305 -3.884901,4.488075 -7.489841,7.565992 -5.533894,4.724877 -10.985191,7.908194 -16.562938,9.672079 -2.570734,0.812906 -3.581257,0.963253 -5.675132,0.844272 -4.18166,-0.236272 -8.636754,-2.727546 -10.15667,-5.676388 -0.431156,-0.83654 -0.475126,-1.17258 -0.426546,-3.259966 0.06179,-2.655561 0.226866,-3.043636 1.528721,-3.59892 [...]
+       style="fill:#000000;fill-opacity:1;display:inline;opacity:0.3"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:url(#linearGradient7313);fill-opacity:1;display:inline"
+       d="m 71.845479,37.905446 c -0.227691,1.037229 -1.773783,5.569235 -2.509801,7.355542 -1.022418,2.481463 -3.330084,6.453138 -5.008866,8.620702 -2.006213,2.590305 -3.884901,4.488075 -7.489841,7.565992 -5.533894,4.724877 -10.985191,7.908194 -16.562938,9.672079 -2.570734,0.812906 -3.581257,0.963253 -5.675132,0.844272 -4.18166,-0.236272 -8.636754,-2.727546 -10.15667,-5.676388 -0.431156,-0.83654 -0.475126,-1.17258 -0.426546,-3.259966 0.06179,-2.655561 0.226866,-3.043636 1.528721,-3.59892 [...]
+       id="path4609"
+       sodipodi:nodetypes="cssssssssssssssssssssc"
+       inkscape:export-filename="/home/matthieu/Interne/Communication/Site Web/Version 3.0/Accueil temporaire/images/phone_square.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;display:inline;opacity:0.75"
+       d="M 62.125 24 C 61.650356 23.987125 61.276022 24.015151 61.125 24.125 C 60.93979 24.259718 60.447597 25.000802 60.03125 25.75 C 59.614805 26.499139 58.318643 28.794095 57.15625 30.84375 C 54.676547 35.216203 54.66798 35.264169 54.96875 35.90625 C 55.211568 35.289894 55.817338 34.204649 57.15625 31.84375 C 58.318643 29.794095 59.614805 27.499139 60.03125 26.75 C 60.447597 26.000802 60.93979 25.259718 61.125 25.125 C 61.729088 24.685604 65.675119 25.383653 67.03125 26.15625 C 68.40 [...]
+       id="path3868" />
+    <path
+       style="fill:#000000;fill-opacity:1;display:inline;opacity:0.15"
+       d="M 54.96875 34.90625 C 54.761862 35.431403 54.83038 35.61086 54.96875 35.90625 C 55.263813 36.536033 57.269666 38.56243 59.125 40.09375 C 60.223518 41.00048 60.686148 41.459209 60.84375 41.96875 C 60.873264 41.871929 60.90271 41.778389 60.90625 41.71875 C 60.96191 40.781368 60.703709 40.396835 59.125 39.09375 C 57.269666 37.56243 55.263813 35.536033 54.96875 34.90625 z M 71.96875 35.75 C 71.946698 36.178051 71.914934 36.581596 71.84375 36.90625 C 71.616059 37.943479 70.079768 42 [...]
+       id="path3877" />
+  </g>
+</svg>
diff --git a/interface/images/menu/contacts.svg b/interface/images/menu/contacts.svg
new file mode 100755
index 0000000..db2e8c7
--- /dev/null
+++ b/interface/images/menu/contacts.svg
@@ -0,0 +1,2812 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="96x96 (action).svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective89" />
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2983"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       x1="210.6445"
+       y1="210.6416"
+       x2="43.025101"
+       y2="43.022202"
+       id="XMLID_27_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop16" />
+      <stop
+         style="stop-color:#333366;stop-opacity:1"
+         offset="1"
+         id="stop18" />
+    </linearGradient>
+    <linearGradient
+       x1="126.8467"
+       y1="197.0508"
+       x2="126.8467"
+       y2="56.633801"
+       id="XMLID_28_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#9a9ab1;stop-opacity:1"
+         offset="0"
+         id="stop23" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop25" />
+    </linearGradient>
+    <linearGradient
+       x1="126.8462"
+       y1="198.0625"
+       x2="126.8462"
+       y2="57.389599"
+       id="XMLID_29_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#7c74ff;stop-opacity:1"
+         offset="0.0056"
+         id="stop30" />
+      <stop
+         style="stop-color:#9b95ff;stop-opacity:1"
+         offset="0.69099998"
+         id="stop32" />
+      <stop
+         style="stop-color:#a3a1ff;stop-opacity:1"
+         offset="0.76300001"
+         id="stop34" />
+      <stop
+         style="stop-color:#afb2ff;stop-opacity:1"
+         offset="0.8987"
+         id="stop36" />
+      <stop
+         style="stop-color:#b3b8ff;stop-opacity:1"
+         offset="1"
+         id="stop38" />
+    </linearGradient>
+    <linearGradient
+       x1="126.8457"
+       y1="198.08501"
+       x2="126.8457"
+       y2="57.074299"
+       id="XMLID_30_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#e9e9ef;stop-opacity:1"
+         offset="0"
+         id="stop43" />
+      <stop
+         style="stop-color:#f9f9fb;stop-opacity:1"
+         offset="0.56"
+         id="stop45" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop47" />
+    </linearGradient>
+    <linearGradient
+       x1="117.8765"
+       y1="72.8638"
+       x2="211.9673"
+       y2="72.8638"
+       id="XMLID_31_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)">
+      <stop
+         style="stop-color:#7d7d99;stop-opacity:1"
+         offset="0"
+         id="stop52" />
+      <stop
+         style="stop-color:#b1b1c5;stop-opacity:1"
+         offset="1"
+         id="stop54" />
+    </linearGradient>
+    <linearGradient
+       x1="117.8711"
+       y1="102.1147"
+       x2="211.9619"
+       y2="102.1147"
+       id="XMLID_32_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)">
+      <stop
+         style="stop-color:#7d7d99;stop-opacity:1"
+         offset="0"
+         id="stop59" />
+      <stop
+         style="stop-color:#b1b1c5;stop-opacity:1"
+         offset="1"
+         id="stop61" />
+    </linearGradient>
+    <linearGradient
+       x1="117.8755"
+       y1="131.3672"
+       x2="211.9653"
+       y2="131.3672"
+       id="XMLID_33_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)">
+      <stop
+         style="stop-color:#7d7d99;stop-opacity:1"
+         offset="0"
+         id="stop66" />
+      <stop
+         style="stop-color:#b1b1c5;stop-opacity:1"
+         offset="1"
+         id="stop68" />
+    </linearGradient>
+    <linearGradient
+       x1="117.8706"
+       y1="160.6172"
+       x2="211.9615"
+       y2="160.6172"
+       id="XMLID_34_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)">
+      <stop
+         style="stop-color:#7d7d99;stop-opacity:1"
+         offset="0"
+         id="stop73" />
+      <stop
+         style="stop-color:#b1b1c5;stop-opacity:1"
+         offset="1"
+         id="stop75" />
+    </linearGradient>
+    <linearGradient
+       x1="86.347198"
+       y1="112.7109"
+       x2="86.347198"
+       y2="183.20261"
+       id="XMLID_35_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop86" />
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="1"
+         id="stop88" />
+    </linearGradient>
+    <radialGradient
+       cx="87.391602"
+       cy="90.318802"
+       r="89.119003"
+       fx="87.391602"
+       fy="90.318802"
+       id="XMLID_36_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0.34830001"
+         id="stop93" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.53930002"
+         id="stop95" />
+      <stop
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="1"
+         id="stop97" />
+    </radialGradient>
+    <linearGradient
+       x1="86.343803"
+       y1="167.0137"
+       x2="86.343803"
+       y2="114.2524"
+       id="XMLID_37_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="0"
+         id="stop102" />
+      <stop
+         style="stop-color:#00008d;stop-opacity:1"
+         offset="1"
+         id="stop104" />
+    </linearGradient>
+    <linearGradient
+       x1="105.4448"
+       y1="122.6216"
+       x2="67.244598"
+       y2="122.6222"
+       id="XMLID_38_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop115" />
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="1"
+         id="stop117" />
+    </linearGradient>
+    <linearGradient
+       x1="66.526901"
+       y1="122.1152"
+       x2="106.1616"
+       y2="122.1152"
+       id="XMLID_39_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#dcf0ff;stop-opacity:1"
+         offset="0"
+         id="stop126" />
+      <stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop128" />
+    </linearGradient>
+    <linearGradient
+       x1="66.807602"
+       y1="117.8262"
+       x2="105.8804"
+       y2="117.8262"
+       id="XMLID_40_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#0053bd;stop-opacity:1"
+         offset="0"
+         id="stop135" />
+      <stop
+         style="stop-color:#00008d;stop-opacity:1"
+         offset="1"
+         id="stop137" />
+    </linearGradient>
+    <linearGradient
+       x1="86.342796"
+       y1="69.372597"
+       x2="86.342796"
+       y2="128.8848"
+       id="XMLID_41_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#c76200;stop-opacity:1"
+         offset="0"
+         id="stop142" />
+      <stop
+         style="stop-color:#d8922a;stop-opacity:1"
+         offset="0.5"
+         id="stop144" />
+      <stop
+         style="stop-color:#996600;stop-opacity:1"
+         offset="1"
+         id="stop146" />
+    </linearGradient>
+    <radialGradient
+       cx="76.373497"
+       cy="82.791"
+       r="47.318901"
+       fx="76.373497"
+       fy="82.791"
+       id="XMLID_42_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop151" />
+      <stop
+         style="stop-color:#ffdb9d;stop-opacity:1"
+         offset="0.51679999"
+         id="stop153" />
+      <stop
+         style="stop-color:#f0cd87;stop-opacity:1"
+         offset="0.75279999"
+         id="stop155" />
+      <stop
+         style="stop-color:#ba8a2b;stop-opacity:1"
+         offset="1"
+         id="stop157" />
+    </radialGradient>
+    <linearGradient
+       x1="117.4688"
+       y1="192.0938"
+       x2="90.433403"
+       y2="165.0584"
+       id="XMLID_43_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0703,1e-4,1e-4,1.0985,-1.5319,-45.9813)">
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="0"
+         id="stop170" />
+      <stop
+         style="stop-color:#1c50f0;stop-opacity:1"
+         offset="0.0847"
+         id="stop172" />
+      <stop
+         style="stop-color:#497cf4;stop-opacity:1"
+         offset="0.23980001"
+         id="stop174" />
+      <stop
+         style="stop-color:#6fa0f8;stop-opacity:1"
+         offset="0.396"
+         id="stop176" />
+      <stop
+         style="stop-color:#8cbdfb;stop-opacity:1"
+         offset="0.55089998"
+         id="stop178" />
+      <stop
+         style="stop-color:#a0d1fd;stop-opacity:1"
+         offset="0.704"
+         id="stop180" />
+      <stop
+         style="stop-color:#adddff;stop-opacity:1"
+         offset="0.85470003"
+         id="stop182" />
+      <stop
+         style="stop-color:#b1e1ff;stop-opacity:1"
+         offset="1"
+         id="stop184" />
+    </linearGradient>
+    <linearGradient
+       x1="119.9502"
+       y1="167.94141"
+       x2="91.554802"
+       y2="139.54601"
+       id="XMLID_44_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="0"
+         id="stop189" />
+      <stop
+         style="stop-color:#1c50f0;stop-opacity:1"
+         offset="0.0847"
+         id="stop191" />
+      <stop
+         style="stop-color:#497cf4;stop-opacity:1"
+         offset="0.23980001"
+         id="stop193" />
+      <stop
+         style="stop-color:#6fa0f8;stop-opacity:1"
+         offset="0.396"
+         id="stop195" />
+      <stop
+         style="stop-color:#8cbdfb;stop-opacity:1"
+         offset="0.55089998"
+         id="stop197" />
+      <stop
+         style="stop-color:#a0d1fd;stop-opacity:1"
+         offset="0.704"
+         id="stop199" />
+      <stop
+         style="stop-color:#adddff;stop-opacity:1"
+         offset="0.85470003"
+         id="stop201" />
+      <stop
+         style="stop-color:#b1e1ff;stop-opacity:1"
+         offset="1"
+         id="stop203" />
+    </linearGradient>
+    <linearGradient
+       x1="122.7407"
+       y1="163.00591"
+       x2="96.799301"
+       y2="137.06441"
+       id="XMLID_45_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#034cfe;stop-opacity:1"
+         offset="0"
+         id="stop208" />
+      <stop
+         style="stop-color:#1359fe;stop-opacity:1"
+         offset="0.038"
+         id="stop210" />
+      <stop
+         style="stop-color:#4885fe;stop-opacity:1"
+         offset="0.17739999"
+         id="stop212" />
+      <stop
+         style="stop-color:#76aaff;stop-opacity:1"
+         offset="0.31850001"
+         id="stop214" />
+      <stop
+         style="stop-color:#9cc9ff;stop-opacity:1"
+         offset="0.4585"
+         id="stop216" />
+      <stop
+         style="stop-color:#b9e0ff;stop-opacity:1"
+         offset="0.59740001"
+         id="stop218" />
+      <stop
+         style="stop-color:#cdf1ff;stop-opacity:1"
+         offset="0.73470002"
+         id="stop220" />
+      <stop
+         style="stop-color:#dafcff;stop-opacity:1"
+         offset="0.86970001"
+         id="stop222" />
+      <stop
+         style="stop-color:#deffff;stop-opacity:1"
+         offset="1"
+         id="stop224" />
+    </linearGradient>
+    <linearGradient
+       x1="119.0371"
+       y1="166.7041"
+       x2="93.096397"
+       y2="140.7634"
+       id="XMLID_46_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#006dff;stop-opacity:1"
+         offset="0"
+         id="stop229" />
+      <stop
+         style="stop-color:#1379ff;stop-opacity:1"
+         offset="0.0447"
+         id="stop231" />
+      <stop
+         style="stop-color:#489cff;stop-opacity:1"
+         offset="0.183"
+         id="stop233" />
+      <stop
+         style="stop-color:#76bbff;stop-opacity:1"
+         offset="0.32319999"
+         id="stop235" />
+      <stop
+         style="stop-color:#9cd3ff;stop-opacity:1"
+         offset="0.4623"
+         id="stop237" />
+      <stop
+         style="stop-color:#b9e6ff;stop-opacity:1"
+         offset="0.6002"
+         id="stop239" />
+      <stop
+         style="stop-color:#cdf4ff;stop-opacity:1"
+         offset="0.73650002"
+         id="stop241" />
+      <stop
+         style="stop-color:#dafcff;stop-opacity:1"
+         offset="0.87059999"
+         id="stop243" />
+      <stop
+         style="stop-color:#deffff;stop-opacity:1"
+         offset="1"
+         id="stop245" />
+    </linearGradient>
+    <linearGradient
+       x1="108.0044"
+       y1="152.14059"
+       x2="108.0044"
+       y2="147.99429"
+       id="XMLID_47_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#006600;stop-opacity:1"
+         offset="0"
+         id="stop254" />
+      <stop
+         style="stop-color:#99ff66;stop-opacity:1"
+         offset="1"
+         id="stop256" />
+    </linearGradient>
+    <linearGradient
+       x1="110.0752"
+       y1="150.06351"
+       x2="105.9336"
+       y2="150.06351"
+       id="XMLID_48_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#009933;stop-opacity:1"
+         offset="0"
+         id="stop261" />
+      <stop
+         style="stop-color:#6fcf00;stop-opacity:1"
+         offset="1"
+         id="stop263" />
+    </linearGradient>
+    <linearGradient
+       x1="80.309097"
+       y1="127.1787"
+       x2="80.309097"
+       y2="110.0138"
+       id="XMLID_49_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop276" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop278" />
+    </linearGradient>
+    <linearGradient
+       x1="545.81152"
+       y1="127.1797"
+       x2="545.81152"
+       y2="110.014"
+       id="XMLID_50_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,638.1875,0)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop283" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop285" />
+    </linearGradient>
+    <linearGradient
+       x1="86.3452"
+       y1="130.9951"
+       x2="86.3452"
+       y2="124.2214"
+       id="XMLID_51_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop290" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop292" />
+    </linearGradient>
+    <linearGradient
+       x1="595.99017"
+       y1="136.166"
+       x2="595.99017"
+       y2="131.64909"
+       id="XMLID_52_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,-1,682.334,255)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop297" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop299" />
+    </linearGradient>
+    <foreignObject
+       requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
+       x="0"
+       y="0"
+       width="1"
+       height="1"
+       id="foreignObject8">
+      <i:pgfRef
+         xlink:href="#adobe_illustrator_pgf" />
+    </foreignObject>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_27_"
+       id="linearGradient3614"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="210.6445"
+       y1="210.6416"
+       x2="43.025101"
+       y2="43.022202" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_28_"
+       id="linearGradient3616"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="126.8467"
+       y1="197.0508"
+       x2="126.8467"
+       y2="56.633801" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_29_"
+       id="linearGradient3618"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="126.8462"
+       y1="198.0625"
+       x2="126.8462"
+       y2="57.389599" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_30_"
+       id="linearGradient3620"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="126.8457"
+       y1="198.08501"
+       x2="126.8457"
+       y2="57.074299" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_31_"
+       id="linearGradient3622"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       x1="117.8765"
+       y1="72.8638"
+       x2="211.9673"
+       y2="72.8638" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_32_"
+       id="linearGradient3624"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       x1="117.8711"
+       y1="102.1147"
+       x2="211.9619"
+       y2="102.1147" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_33_"
+       id="linearGradient3626"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       x1="117.8755"
+       y1="131.3672"
+       x2="211.9653"
+       y2="131.3672" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_34_"
+       id="linearGradient3628"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       x1="117.8706"
+       y1="160.6172"
+       x2="211.9615"
+       y2="160.6172" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_35_"
+       id="linearGradient3630"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.347198"
+       y1="112.7109"
+       x2="86.347198"
+       y2="183.20261" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_36_"
+       id="radialGradient3632"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       cx="87.391602"
+       cy="90.318802"
+       fx="87.391602"
+       fy="90.318802"
+       r="89.119003" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_37_"
+       id="linearGradient3634"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.343803"
+       y1="167.0137"
+       x2="86.343803"
+       y2="114.2524" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_38_"
+       id="linearGradient3636"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="105.4448"
+       y1="122.6216"
+       x2="67.244598"
+       y2="122.6222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_39_"
+       id="linearGradient3638"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="66.526901"
+       y1="122.1152"
+       x2="106.1616"
+       y2="122.1152" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_40_"
+       id="linearGradient3640"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="66.807602"
+       y1="117.8262"
+       x2="105.8804"
+       y2="117.8262" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_41_"
+       id="linearGradient3642"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.342796"
+       y1="69.372597"
+       x2="86.342796"
+       y2="128.8848" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_42_"
+       id="radialGradient3644"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       cx="76.373497"
+       cy="82.791"
+       fx="76.373497"
+       fy="82.791"
+       r="47.318901" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_43_"
+       id="linearGradient3646"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0703,1e-4,1e-4,1.0985,-1.5319,-45.9813)"
+       x1="117.4688"
+       y1="192.0938"
+       x2="90.433403"
+       y2="165.0584" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_44_"
+       id="linearGradient3648"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="119.9502"
+       y1="167.94141"
+       x2="91.554802"
+       y2="139.54601" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_45_"
+       id="linearGradient3650"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="122.7407"
+       y1="163.00591"
+       x2="96.799301"
+       y2="137.06441" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_46_"
+       id="linearGradient3652"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="119.0371"
+       y1="166.7041"
+       x2="93.096397"
+       y2="140.7634" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_47_"
+       id="linearGradient3654"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="108.0044"
+       y1="152.14059"
+       x2="108.0044"
+       y2="147.99429" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_48_"
+       id="linearGradient3656"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="110.0752"
+       y1="150.06351"
+       x2="105.9336"
+       y2="150.06351" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_49_"
+       id="linearGradient3658"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="80.309097"
+       y1="127.1787"
+       x2="80.309097"
+       y2="110.0138" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_50_"
+       id="linearGradient3660"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,638.1875,0)"
+       x1="545.81152"
+       y1="127.1797"
+       x2="545.81152"
+       y2="110.014" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_51_"
+       id="linearGradient3662"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.3452"
+       y1="130.9951"
+       x2="86.3452"
+       y2="124.2214" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_52_"
+       id="linearGradient3664"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,-1,682.334,255)"
+       x1="595.99017"
+       y1="136.166"
+       x2="595.99017"
+       y2="131.64909" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_27_"
+       id="linearGradient3826"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="210.6445"
+       y1="210.6416"
+       x2="43.025101"
+       y2="43.022202" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_28_"
+       id="linearGradient3828"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="126.8467"
+       y1="197.0508"
+       x2="126.8467"
+       y2="56.633801" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_29_"
+       id="linearGradient3830"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="126.8462"
+       y1="198.0625"
+       x2="126.8462"
+       y2="57.389599" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_30_"
+       id="linearGradient3832"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="126.8457"
+       y1="198.08501"
+       x2="126.8457"
+       y2="57.074299" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_31_"
+       id="linearGradient3834"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       x1="117.8765"
+       y1="72.8638"
+       x2="211.9673"
+       y2="72.8638" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_32_"
+       id="linearGradient3836"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       x1="117.8711"
+       y1="102.1147"
+       x2="211.9619"
+       y2="102.1147" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_33_"
+       id="linearGradient3838"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       x1="117.8755"
+       y1="131.3672"
+       x2="211.9653"
+       y2="131.3672" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_34_"
+       id="linearGradient3840"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       x1="117.8706"
+       y1="160.6172"
+       x2="211.9615"
+       y2="160.6172" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_35_"
+       id="linearGradient3842"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.347198"
+       y1="112.7109"
+       x2="86.347198"
+       y2="183.20261" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_36_"
+       id="radialGradient3844"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       cx="87.391602"
+       cy="90.318802"
+       fx="87.391602"
+       fy="90.318802"
+       r="89.119003" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_37_"
+       id="linearGradient3846"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.343803"
+       y1="167.0137"
+       x2="86.343803"
+       y2="114.2524" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_38_"
+       id="linearGradient3848"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="105.4448"
+       y1="122.6216"
+       x2="67.244598"
+       y2="122.6222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_39_"
+       id="linearGradient3850"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="66.526901"
+       y1="122.1152"
+       x2="106.1616"
+       y2="122.1152" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_40_"
+       id="linearGradient3852"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="66.807602"
+       y1="117.8262"
+       x2="105.8804"
+       y2="117.8262" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_41_"
+       id="linearGradient3854"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.342796"
+       y1="69.372597"
+       x2="86.342796"
+       y2="128.8848" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_42_"
+       id="radialGradient3856"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       cx="76.373497"
+       cy="82.791"
+       fx="76.373497"
+       fy="82.791"
+       r="47.318901" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_43_"
+       id="linearGradient3858"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0703,1e-4,1e-4,1.0985,-1.5319,-45.9813)"
+       x1="117.4688"
+       y1="192.0938"
+       x2="90.433403"
+       y2="165.0584" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_44_"
+       id="linearGradient3860"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="119.9502"
+       y1="167.94141"
+       x2="91.554802"
+       y2="139.54601" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_45_"
+       id="linearGradient3862"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="122.7407"
+       y1="163.00591"
+       x2="96.799301"
+       y2="137.06441" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_46_"
+       id="linearGradient3864"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="119.0371"
+       y1="166.7041"
+       x2="93.096397"
+       y2="140.7634" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_47_"
+       id="linearGradient3866"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="108.0044"
+       y1="152.14059"
+       x2="108.0044"
+       y2="147.99429" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_48_"
+       id="linearGradient3868"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="110.0752"
+       y1="150.06351"
+       x2="105.9336"
+       y2="150.06351" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_49_"
+       id="linearGradient3870"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="80.309097"
+       y1="127.1787"
+       x2="80.309097"
+       y2="110.0138" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_50_"
+       id="linearGradient3872"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,638.1875,0)"
+       x1="545.81152"
+       y1="127.1797"
+       x2="545.81152"
+       y2="110.014" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_51_"
+       id="linearGradient3874"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.3452"
+       y1="130.9951"
+       x2="86.3452"
+       y2="124.2214" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_52_"
+       id="linearGradient3876"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,-1,682.334,255)"
+       x1="595.99017"
+       y1="136.166"
+       x2="595.99017"
+       y2="131.64909" />
+    <linearGradient
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3104"
+       y2="43.022202"
+       x2="43.025101"
+       y1="210.6416"
+       x1="210.6445">
+      <stop
+         id="stop3106"
+         offset="0"
+         style="stop-color:#003399;stop-opacity:1" />
+      <stop
+         id="stop3108"
+         offset="1"
+         style="stop-color:#333366;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3111"
+       y2="56.633801"
+       x2="126.8467"
+       y1="197.0508"
+       x1="126.8467">
+      <stop
+         id="stop3113"
+         offset="0"
+         style="stop-color:#9a9ab1;stop-opacity:1" />
+      <stop
+         id="stop3115"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3118"
+       y2="57.389599"
+       x2="126.8462"
+       y1="198.0625"
+       x1="126.8462">
+      <stop
+         id="stop3120"
+         offset="0.0056"
+         style="stop-color:#7c74ff;stop-opacity:1" />
+      <stop
+         id="stop3122"
+         offset="0.69099998"
+         style="stop-color:#9b95ff;stop-opacity:1" />
+      <stop
+         id="stop3124"
+         offset="0.76300001"
+         style="stop-color:#a3a1ff;stop-opacity:1" />
+      <stop
+         id="stop3126"
+         offset="0.8987"
+         style="stop-color:#afb2ff;stop-opacity:1" />
+      <stop
+         id="stop3128"
+         offset="1"
+         style="stop-color:#b3b8ff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3131"
+       y2="57.074299"
+       x2="126.8457"
+       y1="198.08501"
+       x1="126.8457">
+      <stop
+         id="stop3133"
+         offset="0"
+         style="stop-color:#e9e9ef;stop-opacity:1" />
+      <stop
+         id="stop3135"
+         offset="0.56"
+         style="stop-color:#f9f9fb;stop-opacity:1" />
+      <stop
+         id="stop3137"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3140"
+       y2="72.8638"
+       x2="211.9673"
+       y1="72.8638"
+       x1="117.8765">
+      <stop
+         id="stop3142"
+         offset="0"
+         style="stop-color:#7d7d99;stop-opacity:1" />
+      <stop
+         id="stop3144"
+         offset="1"
+         style="stop-color:#b1b1c5;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3147"
+       y2="102.1147"
+       x2="211.9619"
+       y1="102.1147"
+       x1="117.8711">
+      <stop
+         id="stop3149"
+         offset="0"
+         style="stop-color:#7d7d99;stop-opacity:1" />
+      <stop
+         id="stop3151"
+         offset="1"
+         style="stop-color:#b1b1c5;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3154"
+       y2="131.3672"
+       x2="211.9653"
+       y1="131.3672"
+       x1="117.8755">
+      <stop
+         id="stop3156"
+         offset="0"
+         style="stop-color:#7d7d99;stop-opacity:1" />
+      <stop
+         id="stop3158"
+         offset="1"
+         style="stop-color:#b1b1c5;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3161"
+       y2="160.6172"
+       x2="211.9615"
+       y1="160.6172"
+       x1="117.8706">
+      <stop
+         id="stop3163"
+         offset="0"
+         style="stop-color:#7d7d99;stop-opacity:1" />
+      <stop
+         id="stop3165"
+         offset="1"
+         style="stop-color:#b1b1c5;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_30_"
+       id="linearGradient4041"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="126.8457"
+       y1="198.08501"
+       x2="126.8457"
+       y2="57.074299" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_29_"
+       id="linearGradient4044"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="126.8462"
+       y1="198.0625"
+       x2="126.8462"
+       y2="57.389599" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_35_"
+       id="linearGradient4053"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.347198"
+       y1="112.7109"
+       x2="86.347198"
+       y2="183.20261" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_36_"
+       id="radialGradient4055"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       cx="87.391602"
+       cy="90.318802"
+       fx="87.391602"
+       fy="90.318802"
+       r="89.119003" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_37_"
+       id="linearGradient4057"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.343803"
+       y1="167.0137"
+       x2="86.343803"
+       y2="114.2524" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_38_"
+       id="linearGradient4059"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="105.4448"
+       y1="122.6216"
+       x2="67.244598"
+       y2="122.6222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_39_"
+       id="linearGradient4061"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="66.526901"
+       y1="122.1152"
+       x2="106.1616"
+       y2="122.1152" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_40_"
+       id="linearGradient4063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="66.807602"
+       y1="117.8262"
+       x2="105.8804"
+       y2="117.8262" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_41_"
+       id="linearGradient4065"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.342796"
+       y1="69.372597"
+       x2="86.342796"
+       y2="128.8848" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_42_"
+       id="radialGradient4067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       cx="76.373497"
+       cy="82.791"
+       fx="76.373497"
+       fy="82.791"
+       r="47.318901" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_43_"
+       id="linearGradient4069"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0703,1e-4,1e-4,1.0985,-1.5319,-45.9813)"
+       x1="117.4688"
+       y1="192.0938"
+       x2="90.433403"
+       y2="165.0584" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_44_"
+       id="linearGradient4071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="119.9502"
+       y1="167.94141"
+       x2="91.554802"
+       y2="139.54601" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_45_"
+       id="linearGradient4073"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="122.7407"
+       y1="163.00591"
+       x2="96.799301"
+       y2="137.06441" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_46_"
+       id="linearGradient4075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="119.0371"
+       y1="166.7041"
+       x2="93.096397"
+       y2="140.7634" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_47_"
+       id="linearGradient4077"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="108.0044"
+       y1="152.14059"
+       x2="108.0044"
+       y2="147.99429" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_48_"
+       id="linearGradient4079"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="110.0752"
+       y1="150.06351"
+       x2="105.9336"
+       y2="150.06351" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_49_"
+       id="linearGradient4081"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="80.309097"
+       y1="127.1787"
+       x2="80.309097"
+       y2="110.0138" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_50_"
+       id="linearGradient4083"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,638.1875,0)"
+       x1="545.81152"
+       y1="127.1797"
+       x2="545.81152"
+       y2="110.014" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_51_"
+       id="linearGradient4085"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       x1="86.3452"
+       y1="130.9951"
+       x2="86.3452"
+       y2="124.2214" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_52_"
+       id="linearGradient4087"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,-1,682.334,255)"
+       x1="595.99017"
+       y1="136.166"
+       x2="595.99017"
+       y2="131.64909" />
+    <linearGradient
+       x1="86.347198"
+       y1="112.7109"
+       x2="86.347198"
+       y2="183.20261"
+       id="linearGradient3171"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop3173" />
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="1"
+         id="stop3175" />
+    </linearGradient>
+    <radialGradient
+       cx="87.391602"
+       cy="90.318802"
+       r="89.119003"
+       fx="87.391602"
+       fy="90.318802"
+       id="radialGradient3178"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0.34830001"
+         id="stop3180" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.53930002"
+         id="stop3182" />
+      <stop
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="1"
+         id="stop3184" />
+    </radialGradient>
+    <linearGradient
+       x1="86.343803"
+       y1="167.0137"
+       x2="86.343803"
+       y2="114.2524"
+       id="linearGradient3187"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#00008d;stop-opacity:1"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       x1="105.4448"
+       y1="122.6216"
+       x2="67.244598"
+       y2="122.6222"
+       id="linearGradient3197"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop3199" />
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="1"
+         id="stop3201" />
+    </linearGradient>
+    <linearGradient
+       x1="66.526901"
+       y1="122.1152"
+       x2="106.1616"
+       y2="122.1152"
+       id="linearGradient3206"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#dcf0ff;stop-opacity:1"
+         offset="0"
+         id="stop3208" />
+      <stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop3210" />
+    </linearGradient>
+    <linearGradient
+       x1="66.807602"
+       y1="117.8262"
+       x2="105.8804"
+       y2="117.8262"
+       id="linearGradient3214"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#0053bd;stop-opacity:1"
+         offset="0"
+         id="stop3216" />
+      <stop
+         style="stop-color:#00008d;stop-opacity:1"
+         offset="1"
+         id="stop3218" />
+    </linearGradient>
+    <linearGradient
+       x1="86.342796"
+       y1="69.372597"
+       x2="86.342796"
+       y2="128.8848"
+       id="linearGradient3221"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#c76200;stop-opacity:1"
+         offset="0"
+         id="stop3223" />
+      <stop
+         style="stop-color:#d8922a;stop-opacity:1"
+         offset="0.5"
+         id="stop3225" />
+      <stop
+         style="stop-color:#996600;stop-opacity:1"
+         offset="1"
+         id="stop3227" />
+    </linearGradient>
+    <radialGradient
+       cx="76.373497"
+       cy="82.791"
+       r="47.318901"
+       fx="76.373497"
+       fy="82.791"
+       id="radialGradient3230"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop3232" />
+      <stop
+         style="stop-color:#ffdb9d;stop-opacity:1"
+         offset="0.51679999"
+         id="stop3234" />
+      <stop
+         style="stop-color:#f0cd87;stop-opacity:1"
+         offset="0.75279999"
+         id="stop3236" />
+      <stop
+         style="stop-color:#ba8a2b;stop-opacity:1"
+         offset="1"
+         id="stop3238" />
+    </radialGradient>
+    <linearGradient
+       x1="117.4688"
+       y1="192.0938"
+       x2="90.433403"
+       y2="165.0584"
+       id="linearGradient3245"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0703,1e-4,1e-4,1.0985,-1.5319,-45.9813)">
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="0"
+         id="stop3247" />
+      <stop
+         style="stop-color:#1c50f0;stop-opacity:1"
+         offset="0.0847"
+         id="stop3249" />
+      <stop
+         style="stop-color:#497cf4;stop-opacity:1"
+         offset="0.23980001"
+         id="stop3251" />
+      <stop
+         style="stop-color:#6fa0f8;stop-opacity:1"
+         offset="0.396"
+         id="stop3253" />
+      <stop
+         style="stop-color:#8cbdfb;stop-opacity:1"
+         offset="0.55089998"
+         id="stop3255" />
+      <stop
+         style="stop-color:#a0d1fd;stop-opacity:1"
+         offset="0.704"
+         id="stop3257" />
+      <stop
+         style="stop-color:#adddff;stop-opacity:1"
+         offset="0.85470003"
+         id="stop3259" />
+      <stop
+         style="stop-color:#b1e1ff;stop-opacity:1"
+         offset="1"
+         id="stop3261" />
+    </linearGradient>
+    <linearGradient
+       x1="119.9502"
+       y1="167.94141"
+       x2="91.554802"
+       y2="139.54601"
+       id="linearGradient3264"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="0"
+         id="stop3266" />
+      <stop
+         style="stop-color:#1c50f0;stop-opacity:1"
+         offset="0.0847"
+         id="stop3268" />
+      <stop
+         style="stop-color:#497cf4;stop-opacity:1"
+         offset="0.23980001"
+         id="stop3270" />
+      <stop
+         style="stop-color:#6fa0f8;stop-opacity:1"
+         offset="0.396"
+         id="stop3272" />
+      <stop
+         style="stop-color:#8cbdfb;stop-opacity:1"
+         offset="0.55089998"
+         id="stop3274" />
+      <stop
+         style="stop-color:#a0d1fd;stop-opacity:1"
+         offset="0.704"
+         id="stop3276" />
+      <stop
+         style="stop-color:#adddff;stop-opacity:1"
+         offset="0.85470003"
+         id="stop3278" />
+      <stop
+         style="stop-color:#b1e1ff;stop-opacity:1"
+         offset="1"
+         id="stop3280" />
+    </linearGradient>
+    <linearGradient
+       x1="122.7407"
+       y1="163.00591"
+       x2="96.799301"
+       y2="137.06441"
+       id="linearGradient3283"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#034cfe;stop-opacity:1"
+         offset="0"
+         id="stop3285" />
+      <stop
+         style="stop-color:#1359fe;stop-opacity:1"
+         offset="0.038"
+         id="stop3287" />
+      <stop
+         style="stop-color:#4885fe;stop-opacity:1"
+         offset="0.17739999"
+         id="stop3289" />
+      <stop
+         style="stop-color:#76aaff;stop-opacity:1"
+         offset="0.31850001"
+         id="stop3291" />
+      <stop
+         style="stop-color:#9cc9ff;stop-opacity:1"
+         offset="0.4585"
+         id="stop3293" />
+      <stop
+         style="stop-color:#b9e0ff;stop-opacity:1"
+         offset="0.59740001"
+         id="stop3295" />
+      <stop
+         style="stop-color:#cdf1ff;stop-opacity:1"
+         offset="0.73470002"
+         id="stop3297" />
+      <stop
+         style="stop-color:#dafcff;stop-opacity:1"
+         offset="0.86970001"
+         id="stop3299" />
+      <stop
+         style="stop-color:#deffff;stop-opacity:1"
+         offset="1"
+         id="stop3301" />
+    </linearGradient>
+    <linearGradient
+       x1="119.0371"
+       y1="166.7041"
+       x2="93.096397"
+       y2="140.7634"
+       id="linearGradient3304"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#006dff;stop-opacity:1"
+         offset="0"
+         id="stop3306" />
+      <stop
+         style="stop-color:#1379ff;stop-opacity:1"
+         offset="0.0447"
+         id="stop3308" />
+      <stop
+         style="stop-color:#489cff;stop-opacity:1"
+         offset="0.183"
+         id="stop3310" />
+      <stop
+         style="stop-color:#76bbff;stop-opacity:1"
+         offset="0.32319999"
+         id="stop3312" />
+      <stop
+         style="stop-color:#9cd3ff;stop-opacity:1"
+         offset="0.4623"
+         id="stop3314" />
+      <stop
+         style="stop-color:#b9e6ff;stop-opacity:1"
+         offset="0.6002"
+         id="stop3316" />
+      <stop
+         style="stop-color:#cdf4ff;stop-opacity:1"
+         offset="0.73650002"
+         id="stop3318" />
+      <stop
+         style="stop-color:#dafcff;stop-opacity:1"
+         offset="0.87059999"
+         id="stop3320" />
+      <stop
+         style="stop-color:#deffff;stop-opacity:1"
+         offset="1"
+         id="stop3322" />
+    </linearGradient>
+    <linearGradient
+       x1="108.0044"
+       y1="152.14059"
+       x2="108.0044"
+       y2="147.99429"
+       id="linearGradient3327"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#006600;stop-opacity:1"
+         offset="0"
+         id="stop3329" />
+      <stop
+         style="stop-color:#99ff66;stop-opacity:1"
+         offset="1"
+         id="stop3331" />
+    </linearGradient>
+    <linearGradient
+       x1="110.0752"
+       y1="150.06351"
+       x2="105.9336"
+       y2="150.06351"
+       id="linearGradient3334"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#009933;stop-opacity:1"
+         offset="0"
+         id="stop3336" />
+      <stop
+         style="stop-color:#6fcf00;stop-opacity:1"
+         offset="1"
+         id="stop3338" />
+    </linearGradient>
+    <linearGradient
+       x1="86.3452"
+       y1="130.9951"
+       x2="86.3452"
+       y2="124.2214"
+       id="linearGradient3359"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop3361" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop3363" />
+    </linearGradient>
+    <linearGradient
+       x1="595.99017"
+       y1="136.166"
+       x2="595.99017"
+       y2="131.64909"
+       id="linearGradient3366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,-1,682.334,255)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop3368" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop3370" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_51_"
+       id="linearGradient4169"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="86.3452"
+       y1="130.9951"
+       x2="86.3452"
+       y2="124.2214" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_48_"
+       id="linearGradient4184"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="110.0752"
+       y1="150.06351"
+       x2="105.9336"
+       y2="150.06351" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_47_"
+       id="linearGradient4187"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="108.0044"
+       y1="152.14059"
+       x2="108.0044"
+       y2="147.99429" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_45_"
+       id="linearGradient4193"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="122.7407"
+       y1="163.00591"
+       x2="96.799301"
+       y2="137.06441" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_43_"
+       id="linearGradient4197"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31306275,2.925e-5,2.925e-5,0.32131125,10.051138,-2.4988652)"
+       x1="117.4688"
+       y1="192.0938"
+       x2="90.433403"
+       y2="165.0584" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_42_"
+       id="radialGradient4204"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       cx="76.373497"
+       cy="82.791"
+       fx="76.373497"
+       fy="82.791"
+       r="47.318901" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_40_"
+       id="linearGradient4208"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="66.807602"
+       y1="117.8262"
+       x2="105.8804"
+       y2="117.8262" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_39_"
+       id="linearGradient4212"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="66.526901"
+       y1="122.1152"
+       x2="106.1616"
+       y2="122.1152" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_38_"
+       id="linearGradient4217"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="105.4448"
+       y1="122.6216"
+       x2="67.244598"
+       y2="122.6222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_37_"
+       id="linearGradient4223"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2925,0,0,0.2925,10.499076,10.950951)"
+       x1="86.343803"
+       y1="167.0137"
+       x2="86.343803"
+       y2="114.2524" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.2502466"
+     inkscape:cx="82.588867"
+     inkscape:cy="48.484375"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1670"
+     inkscape:window-height="943"
+     inkscape:window-x="0"
+     inkscape:window-y="42"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <rect
+       id="rect13"
+       style="fill:none"
+       y="10.950665"
+       x="10.499219"
+       height="74.879997"
+       width="74.879997" />
+    <path
+       id="path20"
+       style="fill:#00d400"
+       d="m 17.801774,25.2896 c -1.825492,0 -3.310807,1.484145 -3.310807,3.310222 l 0,38.9025 c 0,1.8252 1.485607,3.311686 3.310807,3.311686 l 59.598045,0 c 1.8252,-5.85e-4 3.310807,-1.483561 3.310807,-3.310516 l 0,-38.90367 C 80.710334,26.773745 79.225019,25.2896 77.399526,25.2896 l -59.597752,0 z" />
+    <path
+       id="path27"
+       style="fill:#55ff55"
+       d="m 17.801774,27.51611 c -0.597577,0 -1.08459,0.485843 -1.08459,1.084005 l 0,38.904255 c 0,0.595823 0.487013,1.083712 1.08459,1.083712 l 59.598045,0 c 0.596115,-5.85e-4 1.086345,-0.485549 1.086345,-1.083712 l 2.93e-4,-38.904255 c 0,-0.59787 -0.49023,-1.083712 -1.086638,-1.084005 l -59.598045,0 z" />
+    <path
+       id="path40"
+       style="fill:url(#linearGradient4044)"
+       d="m 19.176231,29.971647 c 0,2.463435 0,33.696878 0,36.160313 2.557913,-0.0018 54.292095,-0.0012 56.850885,0 -2.92e-4,-2.463435 -2.92e-4,-33.696878 0,-36.160313 -2.559082,2.93e-4 -54.292972,0 -56.850885,0 z" />
+    <path
+       id="path49"
+       style="fill:url(#linearGradient4041)"
+       d="m 19.175939,29.884775 c 0,2.4687 0,33.777607 0,36.247185 2.558205,-0.0012 54.292095,-0.0012 56.850885,0 -2.92e-4,-2.469578 0,-33.778485 0,-36.246893 -2.55879,0 -54.29268,0 -56.850885,-2.92e-4 z" />
+    <path
+       id="path56"
+       style="fill:#aaffaa"
+       d="m 46.761321,32.93087 c 0,1.011465 0,2.55645 0,3.568207 1.671638,0 23.995823,0 25.666875,0 0,-1.011757 0,-2.55645 0,-3.568207 -1.671637,-2.93e-4 -23.995237,0 -25.666875,0 z" />
+    <path
+       id="path63"
+       style="fill:#80ff80"
+       d="m 46.761321,41.78777 c 0,1.011758 0,2.556742 0,3.5685 1.671638,0 23.99553,0 25.666583,0 0,-1.01205 0,-2.556742 2.92e-4,-3.568207 -1.672222,0 -23.995237,-2.93e-4 -25.666875,-2.93e-4 z" />
+    <path
+       id="path70"
+       style="fill:#55ff55"
+       d="m 46.761321,50.645547 c 0,1.011758 0,2.556451 0,3.568793 1.671346,0 23.99553,-5.85e-4 25.666583,-5.85e-4 0,-1.011758 0,-2.55645 2.92e-4,-3.568208 -1.672222,0 -23.995237,0 -25.666875,0 z" />
+    <path
+       id="path77"
+       style="fill:#2aff2a"
+       d="m 46.761321,59.503325 c 0,1.011757 0,2.555865 -2.92e-4,3.568207 1.67193,-5.85e-4 23.994945,0 25.666875,0 -2.93e-4,-1.011757 0,-2.55645 0,-3.568792 -1.67193,5.85e-4 -23.994945,5.85e-4 -25.666583,5.85e-4 z" />
+    <path
+       d="m 42.840944,46.27121 c 1.3572,-1.535333 2.181465,-3.550657 2.181465,-5.760495 0,-4.806945 -3.895515,-8.704215 -8.702753,-8.703923 -4.806652,0 -8.703337,3.89727 -8.703045,8.703923 0,2.209838 0.825435,4.225455 2.181758,5.76108 -3.741368,2.225925 -6.248678,6.30981 -6.248678,10.980158 0,7.051882 5.717498,7.850115 12.769673,7.84953 7.052467,5.85e-4 12.769965,-0.797648 12.769672,-7.84953 0,-4.669763 -2.506725,-8.75394 -6.248092,-10.980743 z"
+       style="opacity:0.2"
+       id="path81" />
+    <path
+       d="m 42.558681,45.990118 c 1.3572,-1.535918 2.18205,-3.551535 2.181758,-5.761666 0,-4.807237 -3.896977,-8.70363 -8.703338,-8.703337 -4.806944,0 -8.703922,3.8961 -8.703922,8.703337 0,2.209838 0.82485,4.225748 2.181757,5.761666 -3.740782,2.226217 -6.247215,6.310395 -6.247215,10.980157 0,7.052467 5.716328,7.850115 12.769088,7.8507 7.052468,-5.85e-4 12.769965,-0.798233 12.769965,-7.8507 0,-4.670348 -2.50731,-8.753647 -6.248093,-10.980158 z"
+       style="opacity:0.2"
+       id="path83" />
+    <path
+       d="m 22.986044,56.688012 c 0,7.050421 5.716912,7.84953 12.768795,7.84953 7.051883,0 12.77055,-0.79911 12.770257,-7.84953 0,-7.053052 -5.718082,-12.769087 -12.770257,-12.76938 -7.051883,5.85e-4 -12.768795,5.715743 -12.768795,12.76938 z"
+       style="fill:#002b00"
+       id="path90" />
+    <path
+       d="m 23.693894,56.422422 c 0,6.660518 5.400427,7.41546 12.060945,7.41546 6.660517,0 12.060945,-0.755235 12.060945,-7.41546 0,-6.661102 -5.400427,-12.061237 -12.060945,-12.061237 -6.660518,-2.93e-4 -12.060945,5.400135 -12.060945,12.061237 z"
+       style="fill:#00d400"
+       id="path99" />
+    <path
+       d="m 24.331544,59.80226 c 1.580962,-8.7984 5.938042,-15.17958 11.10447,-15.432592 -1.279103,0.03335 -2.50848,0.26559 -3.658883,0.665437 -3.569377,2.351993 -6.373282,7.776405 -7.519882,14.593702 0.02457,0.05674 0.04855,0.114953 0.07429,0.173453 m 22.920592,-0.173745 c -1.146015,-6.816713 -3.950212,-12.24171 -7.51959,-14.593703 -1.150402,-0.400432 -2.380072,-0.632092 -3.658005,-0.665144 5.166135,0.253012 9.52263,6.634777 11.104763,15.432007 0.02428,-0.05821 0.04914,-0.116123 0.07283 [...]
+       style="fill:url(#linearGradient4223)"
+       id="path106" />
+    <g
+       style="opacity:0.2"
+       id="g108"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)">
+      <image
+         xlink:href="data:;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAUCAYAAABmvqYOAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAE0SURB VHjaYmQweaPPwMAwgYH64ANAADGCKZM354GkAZUNbwAIICYoo4DKBj8AhQZAAEEMPyNyEEguoKar gWZ+BAggRjjX5I08kLwAxAIUGnwAaLAjiAEQQExwoTMiD6kUsQ0wBkAAMaFJTICGF7lgATSIwQAg gFANB4YTBZH7AV0vQAAxYSg5I7IRHG6kgwlQx8EBQAAxYlUGyVgXSEp6Z0QU0QUBAogJq9IzIhdJ TJpYgxIggBhxKjd5ww+NXAFikx46AAggJpxaIOFHTNJMwCUBEECMBLWavLkPJBXwRGIhLq0AA [...]
+         width="22"
+         height="19"
+         transform="translate(75.811,123.4932)"
+         id="image110" />
+    </g>
+    <path
+       d="m 35.754839,44.212595 c -3.084998,0 -5.58675,1.638877 -5.58675,3.65859 0,1.172925 0.844447,2.215102 2.154847,2.88639 -0.07722,-0.190125 -0.11817,-0.389025 -0.117877,-0.594653 -2.93e-4,-1.284367 1.589737,-1.612552 3.549487,-1.612552 1.960043,2.92e-4 3.54978,0.328477 3.549488,1.612552 2.93e-4,0.205628 -0.04007,0.404528 -0.117585,0.594653 1.310985,-0.671288 2.155432,-1.713173 2.15514,-2.885805 0,-2.020883 -2.502045,-3.659468 -5.58675,-3.659175 z"
+       style="opacity:0.2;fill:#0035ed"
+       id="path112" />
+    <path
+       d="m 35.754839,42.877918 c -3.084705,0 -5.58675,1.97262 -5.58675,4.404172 0,1.412482 0.844447,2.669355 2.154847,3.475485 -0.07722,-0.229027 -0.11817,-0.468 -0.117877,-0.715747 0,-1.546156 1.589445,-1.9422 3.54978,-1.9422 1.960042,-2.93e-4 3.549487,0.396044 3.549487,1.942785 0,0.247455 -0.04037,0.48672 -0.117877,0.715162 1.311277,-0.806715 2.15514,-2.063003 2.155432,-3.4749 0,-2.432137 -2.502337,-4.404757 -5.587042,-4.404757 z"
+       style="fill:url(#linearGradient4217)"
+       id="path119" />
+    <image
+       xlink:href="data:;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAUCAYAAABmvqYOAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKGSURB VHjaYqlhYOhnYGAwYKA+mAAQQCxA4gAQF1DZ4A8gcwECiBHEArp+P5ByoKLhBS0MDBMBAghmuDyQ ekAlgy8ADTYEMQACiBlEHGJg+GjHwCDAxMBgwUiGaYxIGAgigOY9BDEAAghuFtD1/KxA1/NBLGH4 g4T/AlX9RTboPwMDKLJYoK4DqQfJf2Fg2NDIwBAIMxMggFAcWsfAkC8FjGVpIBtoEcNvEAbq/sMG 1MwCsYQZaDATUIL5F9DwfxALfgLxEyB+y8Cg0AR1NQgABBBGKPQyMJw3BiZNGairfgNtYQd6h5U [...]
+       width="6.4349999"
+       height="5.5574999"
+       id="image121"
+       x="32.525696"
+       y="46.775333" />
+    <path
+       d="m 39.656497,50.117 c 0,0.27144 -0.04475,0.535275 -0.128701,0.786532 1.440271,-0.887152 2.368958,-2.266582 2.368958,-3.819172 0,-0.272903 -0.02983,-0.540248 -0.0857,-0.800573 -1.77021,-1.063237 -3.841402,-1.676025 -6.056212,-1.676025 -2.214225,0 -4.286003,0.612788 -6.05592,1.675733 -0.05558,0.26091 -0.0857,0.528547 -0.08541,0.801157 0,1.55259 0.928103,2.932313 2.368958,3.81888 -0.08453,-0.250672 -0.1287,-0.515385 -0.1287,-0.786532 2.92e-4,-1.70001 1.746517,-3.076808 3.901072,-3. [...]
+       style="opacity:0.5;fill:#0035ed"
+       id="path123" />
+    <path
+       d="m 35.754839,42.581615 c -3.20112,0 -5.796765,2.046915 -5.796765,4.570605 0,1.465718 0.875745,2.768512 2.234992,3.605355 -0.0781,-0.238095 -0.122265,-0.486135 -0.122265,-0.743242 -2.92e-4,-1.603485 1.6497,-2.905403 3.684038,-2.90511 2.034922,0 3.683745,1.301625 3.683745,2.90511 0,0.257107 -0.043,0.505147 -0.122265,0.743242 1.35954,-0.836842 2.234992,-2.139345 2.234992,-3.605355 0,-2.523982 -2.59506,-4.570605 -5.796472,-4.570605 z"
+       style="fill:url(#linearGradient4212)"
+       id="path130" />
+    <path
+       d="m 32.136614,50.555165 c -0.02018,-0.07781 -0.03305,-0.158827 -0.04387,-0.23868 -0.9945,-1.043055 -1.55844,-2.45817 -1.416578,-3.907215 0.07079,-0.72072 0.04972,-1.19223 -0.01229,-1.442902 -0.212062,0.304784 -0.379665,0.633262 -0.499005,0.975487 -0.02106,0.309757 -0.02486,0.675675 -0.0012,1.091025 0.08278,1.45782 0.846495,2.72025 1.972913,3.522285 z"
+       style="fill:#ffffff"
+       id="path132" />
+    <path
+       d="m 35.754839,42.581615 c -2.870303,0 -5.25213,1.64619 -5.714573,3.805132 0.791505,0.804375 1.738035,1.442025 2.79162,1.862055 0.672458,-0.693225 1.7316,-1.139579 2.922953,-1.139579 1.191645,2.92e-4 2.250787,0.446647 2.92383,1.139579 1.052707,-0.42003 1.998945,-1.057972 2.79045,-1.862347 -0.461858,-2.15865 -2.8431,-3.80484 -5.71428,-3.80484 z"
+       style="opacity:0.1;fill:url(#linearGradient4208)"
+       id="path139" />
+    <circle
+       d="m 116.099,99.130997 c 0,16.433783 -13.32221,29.756003 -29.755998,29.756003 -16.433785,0 -29.756,-13.32222 -29.756,-29.756003 0,-16.433786 13.322215,-29.756001 29.756,-29.756001 16.433788,0 29.755998,13.322215 29.755998,29.756001 z"
+       cx="86.343002"
+       cy="99.130997"
+       r="29.756001"
+       style="fill:url(#linearGradient4065)"
+       id="circle148"
+       sodipodi:cx="86.343002"
+       sodipodi:cy="99.130997"
+       sodipodi:rx="29.756001"
+       sodipodi:ry="29.756001"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)" />
+    <path
+       d="m 27.598769,40.060265 c 0,4.505378 3.651862,8.156363 8.15607,8.156655 4.504792,-2.93e-4 8.156655,-3.651278 8.156655,-8.156655 0,-4.503038 -3.651863,-8.155485 -8.156363,-8.155485 -4.5045,0 -8.156362,3.652447 -8.156362,8.155485 z"
+       style="fill:url(#radialGradient4204)"
+       id="path159" />
+    <path
+       d="m 37.527096,49.651047 c 0,0 -2.415172,-5.85e-4 -3.139987,0 -0.116415,0.924885 -1.190183,9.402705 -1.284075,10.13805 0.536738,0.28665 2.431845,1.300163 2.855385,1.527143 0.42237,-0.226688 2.315722,-1.239615 2.853045,-1.527143 -0.09302,-0.73476 -1.167367,-9.21258 -1.284368,-10.13805 z"
+       style="opacity:0.2;fill:#0035ed"
+       id="path161" />
+    <image
+       xlink:href="data:;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAaKSURB VHjaYmFAAzMZGPiZmJk3sLCxMTAxMTH8//6dgeHfP4Z/QPY/RkYGRiAGEgw//v9nePfnz4VaBoZC ZP0AAcTCgAkM2Lm4HHiEhRlYgBr/v3jB8O/HD4b/XFwM/0CWMDODDf308yfDhy9fDBj+/kUxECCA MAxkZmER4OTjYxCSlmZg+fWL4f+7dwz/gTQDDw/DP35+sKtBBjJ/+cLw9udPAaCBKPoBAogJ3UAm VlYDbiEhBgEJCQZ+oAH8QBfxAQ3g5eRk4OPlZeADWgbCAkA5NqCLaxgY9JH1AwQQhgtZ2dgUeIH [...]
+       width="5.5574999"
+       height="11.115"
+       id="image163"
+       x="32.948009"
+       y="49.650928" />
+    <g
+       style="opacity:0.2"
+       id="g165"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)">
+      <path
+         d="m 86.348,171.172 c 1.419,-0.75 7.787,-4.125 9.593,-5.084 -0.008,-0.074 -0.021,-0.184 -0.041,-0.301 l -13.095,3.512 c 1.57,0.832 2.963,1.568 3.543,1.873 m -8.883,-10.693 c -0.268,2.105 -0.486,3.799 -0.613,4.791 l 18.358,-4.92 c -0.177,-1.35 -0.371,-2.861 -0.575,-4.477 l -17.17,4.606 m 2.714,-21.225 c -0.187,1.475 -0.396,3.096 -0.61,4.791 l 13.106,-3.51 c -0.214,-1.676 -0.412,-3.199 -0.574,-4.477 l -11.922,3.196 m -1.355,10.607 c -0.208,1.629 -0.418,3.25 -0.614,4.799 l 15.732,- [...]
+         id="path167" />
+    </g>
+    <rect
+       width="5.1281099"
+       height="1.2293775"
+       x="39.427471"
+       y="53.643967"
+       style="opacity:0.95999995;fill:url(#linearGradient4197)"
+       id="rect186" />
+    <polygon
+       points="98.884,160.615 107.572,162.186 116.258,160.611 116.255,150.508 98.884,150.51 98.884,160.615 "
+       style="fill:url(#linearGradient4071)"
+       id="polygon205"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)" />
+    <rect
+       width="4.5983925"
+       height="1.072305"
+       x="39.761795"
+       y="53.754528"
+       style="opacity:0.95999995;fill:url(#linearGradient4193)"
+       id="rect226" />
+    <polygon
+       points="99.861,160.082 107.729,161.537 115.591,160.082 115.591,150.705 99.861,150.709 99.861,160.082 "
+       style="fill:url(#linearGradient4075)"
+       id="polygon247"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)" />
+    <polygon
+       points="108.854,160.148 101.633,158.811 101.633,151.105 100.184,151.105 100.187,159.369 107.41,160.658 114.631,159.365 114.631,159.078 108.854,160.148 "
+       style="fill:#dcf0ff"
+       id="polygon249"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)" />
+    <path
+       d="m 41.666556,54.87071 c 0,0.27261 0.222301,0.494617 0.49491,0.494617 0.272026,0 0.49491,-0.222885 0.494618,-0.494617 0,-0.27261 -0.222885,-0.495203 -0.494618,-0.495203 -0.272902,0 -0.49491,0.2223 -0.49491,0.495203 z"
+       style="opacity:0.2"
+       id="path251" />
+    <path
+       d="m 41.595186,54.845555 c 0,0.272025 0.224056,0.494032 0.495496,0.494032 0.272025,5.86e-4 0.494909,-0.222299 0.495202,-0.494032 -2.93e-4,-0.27261 -0.222885,-0.494618 -0.49491,-0.494618 -0.272025,5.86e-4 -0.495787,0.2223 -0.495787,0.494618 z"
+       style="fill:url(#linearGradient4187)"
+       id="path258" />
+    <path
+       d="m 41.708384,54.845555 c 0,0.210307 0.17082,0.381713 0.382297,0.381128 0.211478,0 0.381713,-0.170821 0.382005,-0.381128 0,-0.211478 -0.170527,-0.383467 -0.382005,-0.383467 -0.211184,-2.93e-4 -0.382297,0.172282 -0.382297,0.383467 z"
+       style="fill:url(#linearGradient4184)"
+       id="path265" />
+    <path
+       d="m 41.932439,54.685557 c -0.07371,0.07254 -0.111443,0.152978 -0.08395,0.180473 0.0272,0.02749 0.10764,-0.0091 0.180765,-0.08336 0.07313,-0.07254 0.109688,-0.152977 0.08336,-0.179887 -0.02779,-0.02691 -0.108225,0.0094 -0.18018,0.08278 z"
+       style="fill:#006a00"
+       id="path267" />
+    <path
+       d="m 42.151229,54.906687 c -0.07137,0.07196 -0.109395,0.152978 -0.08219,0.179303 0.0272,0.02808 0.10764,-0.0091 0.180765,-0.08161 0.07313,-0.07312 0.109688,-0.154732 0.08336,-0.181642 -0.0272,-0.0275 -0.108225,0.01024 -0.181935,0.08395 z"
+       style="fill:#006a00"
+       id="path269" />
+    <rect
+       width="36.11673"
+       height="36.116436"
+       x="17.69706"
+       y="29.761631"
+       style="opacity:0.2;fill:none"
+       id="rect271" />
+    <g
+       id="g273"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)">
+      <linearGradient
+         x1="80.309097"
+         y1="127.1787"
+         x2="80.309097"
+         y2="110.0138"
+         id="linearGradient3345"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+        <stop
+           style="stop-color:#663333;stop-opacity:1"
+           offset="0"
+           id="stop3347" />
+        <stop
+           style="stop-color:#824f26;stop-opacity:1"
+           offset="1"
+           id="stop3349" />
+      </linearGradient>
+      <path
+         d="m 80.092,125.126 -1.995,-6.283 c -0.831,-2.623 0.983,-4.903 4.108,-4.904 l 4.358,0 0,-5.396 -6.896,0 c -4.271,0 -6.56,3.314 -5.239,7.03 l 3.025,8.522 c 0.925,2.603 4.173,4.554 7.329,4.554 l 0.924,0 c -2.484,0.003 -4.978,-1.523 -5.614,-3.523 z"
+         style="fill:url(#linearGradient4081)"
+         id="path280" />
+      <linearGradient
+         x1="545.81152"
+         y1="127.1797"
+         x2="545.81152"
+         y2="110.014"
+         id="linearGradient3352"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-1,0,0,1,638.1875,0)">
+        <stop
+           style="stop-color:#663333;stop-opacity:1"
+           offset="0"
+           id="stop3354" />
+        <stop
+           style="stop-color:#824f26;stop-opacity:1"
+           offset="1"
+           id="stop3356" />
+      </linearGradient>
+      <path
+         d="m 92.589,125.125 1.997,-6.282 c 0.831,-2.623 -0.98,-4.904 -4.106,-4.903 l -4.361,-0.001 0,-5.396 6.895,0 c 4.278,0 6.567,3.314 5.245,7.029 l -3.025,8.522 c -0.924,2.602 -4.173,4.554 -7.33,4.555 l -0.924,0 c 2.482,0.003 4.98,-1.523 5.609,-3.524 z"
+         style="fill:url(#linearGradient4083)"
+         id="path287" />
+    </g>
+    <path
+       d="m 33.380324,47.862702 c 0,0.41067 1.062945,1.573943 2.374807,1.573943 1.311863,0 2.374808,-1.163273 2.3751,-1.574528 0,-0.41184 -1.06353,-0.746167 -2.3751,-0.746167 -1.312155,0 -2.374807,0.33462 -2.374807,0.746752 z"
+       style="fill:url(#linearGradient4169)"
+       id="path294" />
+    <polygon
+       points="83.292,118.449 89.398,118.447 89.398,118.447 86.345,123.738 "
+       style="fill:url(#linearGradient4087)"
+       id="polygon301"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)" />
+    <polyline
+       style="fill:none"
+       points="0,256 0,0 256,0 256,256 "
+       i:knockout="Off"
+       id="_x3C_Slice_x3E_"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)" />
+  </g>
+</svg>
diff --git a/interface/images/menu/coordinate.svg b/interface/images/menu/coordinate.svg
new file mode 100755
index 0000000..62c3d4b
--- /dev/null
+++ b/interface/images/menu/coordinate.svg
@@ -0,0 +1,1046 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="coordinate.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective5020" />
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective4739"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2236-453"
+       id="radialGradient1487-415"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.870829,0.534522)"
+       cx="205.25664"
+       cy="415.32397"
+       fx="205.25664"
+       fy="415.32397"
+       r="41.15823" />
+    <linearGradient
+       id="linearGradient2236-453">
+      <stop
+         id="stop4067"
+         offset="0.0000000"
+         style="stop-color:#0f0f0f;stop-opacity:1.0000000;" />
+      <stop
+         id="stop4069"
+         offset="1.0000000"
+         style="stop-color:#161616;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2194-648"
+       id="radialGradient2208-78"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.006773,0.993272)"
+       cx="353.42407"
+       cy="175.28014"
+       fx="342.10938"
+       fy="180.93758"
+       r="539.79822" />
+    <linearGradient
+       id="linearGradient2194-648">
+      <stop
+         style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4073" />
+      <stop
+         style="stop-color:#333333;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop4075" />
+    </linearGradient>
+    <radialGradient
+       r="539.79822"
+       fy="180.93758"
+       fx="342.10938"
+       cy="175.28014"
+       cx="353.42407"
+       gradientTransform="scale(1.006773,0.993272)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2247-36"
+       xlink:href="#linearGradient2233-597"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2233-597">
+      <stop
+         style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4079" />
+      <stop
+         style="stop-color:#898989;stop-opacity:1.0000000;"
+         offset="0.44000000"
+         id="stop4081" />
+      <stop
+         style="stop-color:#6e6e6e;stop-opacity:1.0000000;"
+         offset="0.57999998"
+         id="stop4083" />
+      <stop
+         style="stop-color:#434343;stop-opacity:1.0000000;"
+         offset="0.76999998"
+         id="stop4085" />
+      <stop
+         style="stop-color:#363636;stop-opacity:0.96470588;"
+         offset="0.89499998"
+         id="stop4087" />
+      <stop
+         style="stop-color:#333333;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop4089" />
+    </linearGradient>
+    <radialGradient
+       r="217.14053"
+       fy="53.78804"
+       fx="69.95153"
+       cy="53.78804"
+       cx="69.95153"
+       gradientTransform="matrix(1.036676,0,0,0.999833,-1.366161,0.764419)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2227-345"
+       xlink:href="#linearGradient2189-347"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2189-347">
+      <stop
+         style="stop-color:#616161;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop4093" />
+      <stop
+         style="stop-color:#232323;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4095" />
+    </linearGradient>
+    <radialGradient
+       r="217.14053"
+       fy="53.78804"
+       fx="69.95153"
+       cy="53.78804"
+       cx="69.95153"
+       gradientTransform="matrix(1.036676,0,0,0.999833,-1.366161,0.764419)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2203-356"
+       xlink:href="#linearGradient2189-559"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2189-559">
+      <stop
+         style="stop-color:#616161;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop4099" />
+      <stop
+         style="stop-color:#232323;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4101" />
+    </linearGradient>
+    <radialGradient
+       r="217.14053"
+       fy="53.78804"
+       fx="69.95153"
+       cy="53.78804"
+       cx="69.95153"
+       gradientTransform="matrix(1.036676,0,0,0.999833,-1.366161,0.764419)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2187-262"
+       xlink:href="#linearGradient2189-910"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2189-910">
+      <stop
+         style="stop-color:#616161;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop4105" />
+      <stop
+         style="stop-color:#232323;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4107" />
+    </linearGradient>
+    <radialGradient
+       r="217.14053"
+       fy="53.78804"
+       fx="69.95153"
+       cy="53.78804"
+       cx="69.95153"
+       gradientTransform="matrix(1.036676,0,0,0.999833,-1.466166,0.764432)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2211-961"
+       xlink:href="#linearGradient2189-604"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2189-604">
+      <stop
+         style="stop-color:#616161;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop4111" />
+      <stop
+         style="stop-color:#232323;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4113" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2312-661"
+       id="radialGradient1506-85"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.036676,0,0,1.008933,-1.366157,-1.614994)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <linearGradient
+       id="linearGradient2312-661">
+      <stop
+         style="stop-color:#f7f7f7;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4117" />
+      <stop
+         style="stop-color:#c5c5c5;stop-opacity:1.0000000;"
+         offset="0.67000002"
+         id="stop4119" />
+      <stop
+         style="stop-color:#898989;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4121" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066-482"
+       id="radialGradient2310-792"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.013655,0.986529)"
+       cx="82.707672"
+       cy="62.766144"
+       fx="82.707672"
+       fy="62.766144"
+       r="221.16626" />
+    <linearGradient
+       id="linearGradient4066-482">
+      <stop
+         id="stop4125"
+         offset="0.0000000"
+         style="stop-color:#fbfbfb;stop-opacity:1.0000000;" />
+      <stop
+         id="stop4127"
+         offset="1.0000000"
+         style="stop-color:#5b5b5b;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2312-661"
+       id="radialGradient3803"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.036676,0,0,1.008933,-1.366157,-1.614994)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4066-482"
+       id="radialGradient3805"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.013655,0.986529)"
+       cx="82.707672"
+       cy="62.766144"
+       fx="82.707672"
+       fy="62.766144"
+       r="221.16626" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2312-661"
+       id="radialGradient3811"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.27290951,0,0,0.26560604,14.337699,16.465528)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2189-347"
+       id="radialGradient3813"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.036676,0,0,0.999833,-1.366161,0.764419)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2189-559"
+       id="radialGradient3815"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.036676,0,0,0.999833,-1.366161,0.764419)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2189-910"
+       id="radialGradient3817"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.036676,0,0,0.999833,-1.366161,0.764419)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2189-604"
+       id="radialGradient3819"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.036676,0,0,0.999833,-1.466166,0.764432)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2189-604"
+       id="radialGradient3822"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.27290951,0,0,0.26321043,14.311371,17.091922)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2189-910"
+       id="radialGradient3825"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.27290951,0,0,0.26321043,14.337698,17.091919)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2189-559"
+       id="radialGradient3828"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.27290951,0,0,0.26321043,14.337698,17.091919)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2189-347"
+       id="radialGradient3831"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.27290951,0,0,0.26321043,14.337698,17.091919)"
+       cx="69.95153"
+       cy="53.78804"
+       fx="69.95153"
+       fy="53.78804"
+       r="217.14053" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2194-648"
+       id="radialGradient3833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.006773,0.993272)"
+       cx="353.42407"
+       cy="175.28014"
+       fx="342.10938"
+       fy="180.93758"
+       r="539.79822" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2236-453"
+       id="radialGradient3841"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.870829,0.534522)"
+       cx="205.25664"
+       cy="415.32397"
+       fx="205.25664"
+       fy="415.32397"
+       r="41.15823" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="62.018019"
+     inkscape:cy="66.825665"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       transform="matrix(0.24103151,0,0,0.26325439,-44.399131,18.677345)"
+       d="m 461,222 a 77,22 0 1 1 -154,0 77,22 0 1 1 154,0 z"
+       sodipodi:ry="22"
+       sodipodi:rx="77"
+       sodipodi:cy="222"
+       sodipodi:cx="384"
+       id="path1471"
+       style="fill:url(#radialGradient3841);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#3c3c3c;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="path5993"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="m 737.43018,376.39664 a 364.52515,359.63687 0 1 1 -729.0502972,0 364.52515,359.63687 0 1 1 729.0502972,0 z"
+       transform="matrix(0.08232912,0,0,0.08344822,17.429745,17.598203)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.79999994;fill:#727272;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="path2216"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="m 737.43018,376.39664 a 364.52515,359.63687 0 1 1 -729.0502972,0 364.52515,359.63687 0 1 1 729.0502972,0 z"
+       transform="matrix(0.08068247,0,0,0.08177919,18.043765,18.226396)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient3833);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="path2206"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="m 737.43018,376.39664 a 364.52515,359.63687 0 1 1 -729.0502972,0 364.52515,359.63687 0 1 1 729.0502972,0 z"
+       transform="matrix(0.08232912,0,0,0.08344822,17.429745,17.598032)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="path2231"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="m 737.43018,376.39664 a 364.52515,359.63687 0 1 1 -729.0502972,0 364.52515,359.63687 0 1 1 729.0502972,0 z"
+       transform="matrix(0.08232912,0,0,0.08344822,17.429745,17.598032)" />
+    <path
+       style="opacity:0.09999982;fill:url(#radialGradient3831);fill-opacity:1;stroke:none"
+       d="m 48.130654,18.996717 c -16.566092,0 -30.011001,13.444898 -30.011001,30.011001 0,6.996793 2.41435,13.421077 6.433279,18.526527 0.690911,-0.856487 0.922085,-2.257446 0.329068,-3.208413 -0.406169,-1.769393 0.348286,-3.770055 -0.855577,-5.363808 -1.556062,-2.957084 -2.922296,-6.055348 -3.076785,-9.436024 0.01255,-1.665811 -0.625601,-3.617224 -0.238575,-5.100554 2.005863,-1.688891 0.271985,-4.847991 2.262343,-6.50732 1.037712,-0.926241 0.349784,-3.107001 2.138942,-3.224866 1.294951 [...]
+       id="path2213"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.19999982;fill:url(#radialGradient3828);fill-opacity:1;stroke:none"
+       d="m 48.130654,18.996717 c -14.34692,0 -26.336123,10.090748 -29.295278,23.553041 0.19131,0.41446 0.444876,0.80236 0.79799,1.118831 1.41615,-0.576945 0.663794,-2.448595 1.127058,-3.644427 -0.391544,-1.60919 0.07758,-1.772637 1.151738,-2.49269 -0.04661,-1.012422 1.698013,-2.353912 0.246801,-3.09324 1.455437,0.09983 2.680204,-1.987867 4.105123,-0.641682 0.702182,0.777088 1.932582,2.16689 2.846438,0.79799 0.808022,-1.46056 2.157316,-2.388024 3.052105,-3.792509 0.865016,-1.01403 1.9808 [...]
+       id="path2197"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.29999988;fill:url(#radialGradient3825);fill-opacity:1;stroke:none"
+       d="m 48.130654,18.996717 c -0.818864,0 -1.624512,0.05895 -2.426877,0.123401 -0.435999,0.03864 -0.873749,0.07552 -1.308045,0.131627 -0.304522,0.03792 -0.603308,0.09286 -0.904937,0.139854 -0.593936,0.09369 -1.189033,0.186235 -1.776967,0.312614 -0.208661,0.04556 -0.409985,0.10643 -0.617003,0.156308 -0.619129,0.149168 -1.239238,0.290224 -1.84278,0.477148 -0.05234,0.01621 -0.104092,0.03287 -0.156308,0.04936 -7.161497,2.261409 -13.140909,7.15515 -16.864734,13.524695 0.724663,0.114972 1. [...]
+       id="path2181"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.29999988;fill:url(#radialGradient3822);fill-opacity:1;stroke:none"
+       d="m 48.286961,19.317558 c -0.597772,6.53e-4 -1.194075,0.02216 -1.793421,0.04936 -7.630005,0.427862 -15.05136,3.778479 -20.344628,9.27149 -0.599914,0.622553 -1.14393,1.297915 -1.686473,1.974408 -0.695232,0.892862 -1.332598,1.827768 -1.925048,2.797078 -0.03602,0.105709 -0.09227,0.201484 -0.115174,0.312615 0.523984,-0.612208 1.197163,-0.66258 1.826327,-1.044791 0.761212,-0.739737 0.897468,-0.565777 1.390313,-0.222121 0.976831,-1.150345 0.347728,-0.07287 0.460695,0.370201 0.514286,0. [...]
+       id="path2205"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3298"
+       d="m 45.860313,77.263612 c -0.151479,-0.02414 -0.282271,-0.09729 -0.290672,-0.162413 -0.0084,-0.06512 -0.02043,-0.165355 -0.02678,-0.222784 -0.01548,-0.139635 -0.718485,-0.755398 -1.180191,-1.033824 -0.231229,-0.139443 -0.418014,-0.353708 -0.495792,-0.568553 -0.06865,-0.189817 -0.160817,-0.345053 -0.204838,-0.345053 -0.04401,0 -0.08002,-0.06505 -0.08002,-0.144384 0,-0.07952 -0.09503,-0.21094 -0.211136,-0.292249 -0.116145,-0.0813 -0.181393,-0.196009 -0.145024,-0.254812 0.04061,-0.0 [...]
+       style="fill:url(#radialGradient3811);fill-opacity:1;stroke:none"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#00ff00;fill-opacity:1;stroke:none"
+       d="m 46.561155,19.228488 c -1.700071,0.239559 -3.41461,0.398039 -5.076898,0.853773 -1.960775,0.419054 -3.896852,1.011048 -5.721461,1.854697 -2.05096,1.00955 -4.029492,2.181942 -5.877181,3.540304 -0.601976,0.27094 -0.09123,0.393608 -0.159585,0.832439 -0.168449,0.383579 -0.523475,0.672374 -0.825328,0.961129 -0.334405,0.02908 -0.61832,0.227965 -0.85289,0.389968 -0.113403,0.433625 -0.358444,1.042817 -0.903996,0.944754 -0.294707,-0.226249 0.119051,-0.629682 0.359948,-0.756847 0.439434, [...]
+       id="path2284"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:none"
+       id="path1493"
+       sodipodi:cx="372.90503"
+       sodipodi:cy="376.39664"
+       sodipodi:rx="364.52515"
+       sodipodi:ry="359.63687"
+       d="m 737.43018,376.39664 a 364.52515,359.63687 0 1 1 -729.0502972,0 364.52515,359.63687 0 1 1 729.0502972,0 z"
+       transform="matrix(0.08232912,0,0,0.08344822,17.429745,17.598032)" />
+  </g>
+</svg>
diff --git a/interface/images/menu/database.svg b/interface/images/menu/database.svg
new file mode 100755
index 0000000..0ee786f
--- /dev/null
+++ b/interface/images/menu/database.svg
@@ -0,0 +1,997 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="database.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective5680" />
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective5448"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3731"
+       id="linearGradient3664"
+       gradientUnits="userSpaceOnUse"
+       x1="48.082497"
+       y1="75.561722"
+       x2="46.654823"
+       y2="16.972879"
+       gradientTransform="translate(0,1)" />
+    <linearGradient
+       id="linearGradient3731">
+      <stop
+         id="stop3733"
+         offset="0"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ebebeb;stop-opacity:1;"
+         offset="0.30654153"
+         id="stop3757" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.70706075"
+         id="stop3737" />
+      <stop
+         id="stop3759"
+         offset="0.84501493"
+         style="stop-color:#fafafa;stop-opacity:1" />
+      <stop
+         id="stop3735"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective5736"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3731-9">
+      <stop
+         id="stop3733-8"
+         offset="0"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ebebeb;stop-opacity:1;"
+         offset="0.30654153"
+         id="stop3757-4" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.70706075"
+         id="stop3737-3" />
+      <stop
+         id="stop3759-0"
+         offset="0.84501493"
+         style="stop-color:#fafafa;stop-opacity:1" />
+      <stop
+         id="stop3735-6"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective6561"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective6583"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective6723"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective6951"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient14893"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+    <linearGradient
+       id="linearGradient13043">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop13045" />
+      <stop
+         style="stop-color:#93969e;stop-opacity:1;"
+         offset="1"
+         id="stop13047" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient14895"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+    <linearGradient
+       id="linearGradient6960">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop6962" />
+      <stop
+         style="stop-color:#93969e;stop-opacity:1;"
+         offset="1"
+         id="stop6964" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8128"
+       id="linearGradient14897"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.8284,-0.890625)"
+       x1="548.86957"
+       y1="173.36108"
+       x2="649.89838"
+       y2="173.36108" />
+    <linearGradient
+       id="linearGradient8128">
+      <stop
+         id="stop8130"
+         offset="0"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         style="stop-color:#a0a0a0;stop-opacity:1;"
+         offset="0.1179847"
+         id="stop8138" />
+      <stop
+         style="stop-color:#d9dada;stop-opacity:1;"
+         offset="0.23596939"
+         id="stop8132" />
+      <stop
+         style="stop-color:#838686;stop-opacity:1;"
+         offset="0.47193879"
+         id="stop8134" />
+      <stop
+         id="stop8136"
+         offset="1"
+         style="stop-color:#c8c5c8;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient14899"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+    <linearGradient
+       id="linearGradient6974">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop6976" />
+      <stop
+         style="stop-color:#93969e;stop-opacity:1;"
+         offset="1"
+         id="stop6978" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8128"
+       id="linearGradient14901"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.828358,39.14951)"
+       x1="548.86957"
+       y1="173.36108"
+       x2="649.89838"
+       y2="173.36108" />
+    <linearGradient
+       id="linearGradient6981">
+      <stop
+         id="stop6983"
+         offset="0"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         style="stop-color:#a0a0a0;stop-opacity:1;"
+         offset="0.1179847"
+         id="stop6985" />
+      <stop
+         style="stop-color:#d9dada;stop-opacity:1;"
+         offset="0.23596939"
+         id="stop6987" />
+      <stop
+         style="stop-color:#838686;stop-opacity:1;"
+         offset="0.47193879"
+         id="stop6989" />
+      <stop
+         id="stop6991"
+         offset="1"
+         style="stop-color:#c8c5c8;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8128"
+       id="linearGradient14903"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.828403,79.1897)"
+       x1="548.86957"
+       y1="173.36108"
+       x2="649.89838"
+       y2="173.36108" />
+    <linearGradient
+       id="linearGradient6994">
+      <stop
+         id="stop6996"
+         offset="0"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         style="stop-color:#a0a0a0;stop-opacity:1;"
+         offset="0.1179847"
+         id="stop6998" />
+      <stop
+         style="stop-color:#d9dada;stop-opacity:1;"
+         offset="0.23596939"
+         id="stop7000" />
+      <stop
+         style="stop-color:#838686;stop-opacity:1;"
+         offset="0.47193879"
+         id="stop7002" />
+      <stop
+         id="stop7004"
+         offset="1"
+         style="stop-color:#c8c5c8;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="173.36108"
+       x2="649.89838"
+       y1="173.36108"
+       x1="548.86957"
+       gradientTransform="translate(0.828403,79.1897)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7013"
+       xlink:href="#linearGradient8128"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient7116"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient7118"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient13043"
+       id="linearGradient7122"
+       gradientUnits="userSpaceOnUse"
+       x1="233.93414"
+       y1="346.64789"
+       x2="313.0798"
+       y2="306.64789" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.6711608"
+     inkscape:cx="82.588867"
+     inkscape:cy="48.484375"
+     inkscape:document-units="px"
+     inkscape:current-layer="g14879"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       id="g14879"
+       transform="matrix(0.47043214,0,0,0.39086756,-235.60976,-32.449335)"
+       inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90">
+      <path
+         style="fill:#808080;stroke:#000000;stroke-width:4.94845772000000039;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         id="path2466-5"
+         d="m 596.11012,242.82969 c -0.50115,21.56495 0.80292,38.67641 2.55612,43.95414 1.75433,5.27722 7.53953,13.09847 20.44958,9.7698 10.78559,-2.78335 15.72541,-8.16892 17.42835,-20.05634 1.25422,-8.74587 2.99515,-26.80199 3.3053,-31.77866"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <path
+         style="fill:#808080;stroke:#000000;stroke-width:4.94845772000000039;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         id="path2468-0"
+         d="m 586.83122,132.27719 c 0,0 -59.46339,-28.75128 -56.74622,36.6311 0.5779,13.90965 17.58107,105.24964 36.64891,77.66015 11.53751,-12.94095 13.26974,-18.00223 13.26974,-18.00223"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:#808080;stroke:#000000;stroke-width:4.94845772000000039;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         id="path2470-7"
+         d="m 614.23767,127.02962 c -2.02315,0.76347 32.51238,-15.19487 52.13929,14.98928 6.93287,10.66326 -1.10113,54.23044 -20.31952,88.55379"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path2472-2"
+         d="m 646.05708,223.52408 c 0,0 1.25243,7.4195 19.45504,2.89753 7.9754,-1.98252 3.17569,12.61188 -4.913,17.13301 -6.63828,3.70801 -21.52122,4.6582 -21.76441,-0.46555 -0.62567,-13.22019 7.8332,-16.25243 7.22273,-19.56499 -0.55182,-2.98334 -4.33473,1.13726 -6.83698,-6.16421 -2.18455,-6.37296 -29.96056,-55.24524 7.70292,-47.98688 1.37977,-0.34365 -9.82307,-43.11732 -45.07074,-43.8128 -35.23969,-0.69554 -34.08356,52.15869 -34.08356,52.15869"
+         style="fill:#808080;stroke:#000000;stroke-width:4.94845772000000039;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccccsc" />
+      <path
+         style="fill:#808080;stroke:#000000;stroke-width:4.94845772000000039;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         id="path2474-7"
+         d="m 588.27603,235.09382 c -4.91298,6.60507 -3.46807,7.76488 -13.2886,10.19854 -9.93628,2.46491 -4.09311,4.88957 -0.28844,6.24562 8.17431,1.79904 14.63226,4.70681 22.53158,-5.42788 2.19939,-3.70583 -0.0125,-11.24847 -3.03422,-12.75576 -1.45975,-0.72775 -3.41161,-1.63977 -5.92038,1.73948 z"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc" />
+      <path
+         style="fill:#808080;stroke:#16fe07;stroke-width:4.94845772000000039;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         id="path2476-1"
+         d="m 587.95434,234.97839 c -0.49502,-3.88355 1.06022,-8.50482 2.72697,-13.91136 2.5048,-8.112 8.28404,-16.22529 3.66093,-41.95754 -3.44599,-19.17549 -26.55903,-3.99065 -26.57354,-1.39061 -0.0125,2.59915 1.04542,13.17879 -0.38599,25.49881 -1.86791,16.07634 8.49939,29.67283 20.4375,28.28176"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path2478-4"
+         d="m 582.45482,177.32906 c -0.10417,0.88803 1.35078,3.25768 3.24804,3.57435 1.89397,0.31808 3.51507,-1.5339 3.61788,-2.42108 0.10296,-0.88802 -1.35047,-1.86621 -3.24844,-2.18413 -1.89505,-0.31856 -3.51691,0.145 -3.61715,1.03086 l -2.6e-4,0 z"
+         style="fill:#808080;stroke:#16fe07;stroke-width:1.64947248000000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path2480-8"
+         d="m 640.14394,175.51863 c 0.10296,0.88803 -1.35045,3.2577 -3.24805,3.57431 -1.89543,0.31807 -3.51657,-1.5339 -3.6204,-2.42103 -0.10043,-0.88804 1.35333,-1.86621 3.24914,-2.18414 1.89575,-0.31807 3.51654,0.14499 3.61931,1.03132 l 0,-0.002 z"
+         style="fill:#808080;stroke:#16fe07;stroke-width:0.82473624000000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#808080;stroke:#16fe07;stroke-width:4.94845772000000039;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;fill-opacity:1"
+         id="path2482-4"
+         d="m 646.92338,169.37299 c 0.31222,6.96568 -1.24663,11.71029 -1.44313,19.12542 -0.29094,10.77824 4.2696,23.11477 -2.60212,35.46655"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-opacity:1"
+         d="m 576.35352,231.41656 11.31142,-0.31304 -4.97016,8.75875 -8.56927,-0.93844 z"
+         id="path11678"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path2464"
+         d="m 661.97869,230.2634 c -16.77545,4.16472 -17.92867,-2.67122 -17.92867,-2.67122 17.71224,-31.632 25.11653,-71.78417 18.72672,-81.61119 -17.43178,-26.80625 -47.60708,-14.12862 -48.11067,-13.79947 l -0.16214,0.0351 c -3.31428,-0.82803 -7.0234,-1.32135 -11.19211,-1.40322 -7.59067,-0.15001 -13.34846,2.39504 -17.71759,6.38274 0,0 -53.82976,-26.68983 -51.3262,33.56749 0.53257,12.8193 15.26603,96.99631 32.83956,71.57108 6.42313,-9.29722 12.62913,-17.15827 12.62913,-17.15827 3.08249,2 [...]
+         style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-width:4.56056785999999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <a
+         id="a4028"
+         style="fill:#808080">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 599.77218,236.38606 c -0.46189,19.87479 0.11592,39.88798 1.73186,44.75181 1.61678,4.86434 5.07679,14.3246 16.97492,11.25679 9.94011,-2.5646 13.55689,-7.52827 15.12633,-18.48405 1.15588,-8.06057 3.38431,-30.44619 3.67009,-35.0328"
+           id="path2466"
+           style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-width:4.56056785999999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+      </a>
+      <path
+         style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-width:4.56056785999999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+         id="path2468"
+         d="m 585.51129,136.75203 c 0,0 -53.86649,-26.49753 -51.36227,33.75975 0.5326,12.81934 15.2671,96.99933 32.84029,71.57267 6.42177,-9.29836 12.22957,-16.59107 12.22957,-16.59107"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-width:4.56056785999999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+         id="path2470"
+         d="m 614.60707,131.91579 c -1.86459,0.70365 29.96387,-14.00378 48.05229,13.81434 6.38947,9.82743 -1.01482,49.97954 -18.72678,81.61242"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path2472"
+         d="m 643.93226,227.34255 c 0,0 1.15426,6.83791 17.93004,2.67037 7.35025,-1.8271 2.92677,5.12725 -4.52788,9.294 -6.11793,3.41733 -19.83424,4.29315 -20.05838,-0.42895 -0.57659,-12.1839 7.21919,-8.48236 6.65654,-11.53527 -0.50856,-2.74949 -3.99493,-5.44794 -6.30102,-12.17708 -2.0133,-5.87343 -27.61205,-50.91482 7.09911,-44.22541 1.27164,-0.31658 -9.05305,-39.73753 -41.53782,-40.37853 -32.47742,-0.641 -31.41191,48.0702 -31.41191,48.0702"
+         style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-width:4.56056785999999992;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-width:4.56056785999999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+         id="path2474"
+         d="m 590.68045,231.50929 c -4.52786,6.08733 -3.1962,7.15623 -12.24693,9.3991 -9.15746,2.27184 -3.77719,6.31495 -0.26593,7.37115 4.25803,1.28281 14.10917,3.09791 20.76539,-8.11932 2.02698,-3.41535 -0.0125,-8.8649 -2.79633,-10.25408 -1.34535,-0.6707 -3.14423,-1.51118 -5.45633,1.60315 l 0,0 z"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-width:4.56056785999999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+         id="path2476"
+         d="m 590.38399,231.40291 c -0.45621,-3.57911 0.97715,-7.83816 2.51321,-12.82093 2.30844,-7.4761 7.63471,-14.95346 3.37395,-38.66864 -3.17585,-17.67239 -24.47722,-3.67785 -24.49055,-1.2816 -0.0125,2.39544 0.96348,12.14578 -0.35598,23.50005 -1.72147,14.8162 7.83316,27.34686 18.83549,26.06487"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path2478"
+         d="m 585.3155,178.27248 c -0.0958,0.81845 1.24496,3.00231 2.99345,3.29416 1.74553,0.29299 3.23959,-1.41371 3.3343,-2.23128 0.0946,-0.81842 -1.2446,-1.71994 -2.99378,-2.01292 -1.74651,-0.29348 -3.24123,0.13345 -3.33364,0.95004 l -2.6e-4,0 z"
+         style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#16fe07;stroke-width:1.52017712999999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path2480"
+         d="m 638.48266,176.60398 c 0.0946,0.81839 -1.24461,3.00232 -2.99346,3.29411 -1.74687,0.29298 -3.24092,-1.41365 -3.33663,-2.2313 -0.0926,-0.81839 1.24726,-1.71987 2.99445,-2.0129 1.74717,-0.293 3.24089,0.13345 3.33564,0.9505 l 0,-0.002 z"
+         style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#16fe07;stroke-width:0.76008856000000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#808080;fill-opacity:1;stroke:#16fe07;stroke-width:4.56056785999999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+         id="path2482"
+         d="m 644.73067,170.94005 c 0.28803,6.41972 -1.14889,10.79235 -1.33,17.62626 -0.26802,9.93339 3.93492,21.30292 -2.39812,32.68649"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/delete.svg b/interface/images/menu/delete.svg
new file mode 100755
index 0000000..2e9b87d
--- /dev/null
+++ b/interface/images/menu/delete.svg
@@ -0,0 +1,1123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="application-exit.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2848"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3697">
+      <rect
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3699"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2927"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3309"
+       id="linearGradient3804"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3309"
+       y2="122.8994"
+       x2="63.9995"
+       y1="3.1001"
+       x1="63.9995">
+      <stop
+         offset="0"
+         style="stop-color:#f6f6f6;stop-opacity:1"
+         id="stop3311" />
+      <stop
+         offset="1"
+         style="stop-color:#d2d2d2;stop-opacity:1"
+         id="stop3313" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3397"
+       id="linearGradient3806"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="37.201294"
+       y1="1"
+       x2="37.201294"
+       y2="45" />
+    <linearGradient
+       id="linearGradient3397">
+      <stop
+         offset="0"
+         style="stop-color:#aaa;stop-opacity:1"
+         id="stop3399" />
+      <stop
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1"
+         id="stop3401" />
+    </linearGradient>
+    <linearGradient
+       y2="45.017357"
+       x2="20.758585"
+       y1="1"
+       x1="20.758585"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2940"
+       xlink:href="#linearGradient3309"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.47268421,0.12665535,0.12665535,-0.47268421,44.47921,74.733655)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective2842"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3180"
+       x1="-13"
+       y1="17.008953"
+       x2="-13"
+       y2="-0.70032859"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4083" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop4085" />
+    </linearGradient>
+    <linearGradient
+       y2="-0.70032859"
+       x2="-13"
+       y1="17.008953"
+       x1="-13"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2851"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3692"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3697"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3701"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,62.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective3025"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       id="StandardGradient"
+       x1="11.347495"
+       y1="5.999567"
+       x2="11.347495"
+       y2="16.013096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-2.9995677)">
+      <stop
+         id="stop3177"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3179"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       y2="51.954468"
+       x2="65.693901"
+       y1="51.954468"
+       x1="29.826593"
+       gradientTransform="matrix(0,-1,-1,0,96,16)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3034"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3831"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,97)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3682"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3699"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3705"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,36,16)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3712"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,97)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3714"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <inkscape:perspective
+       id="perspective2941"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-8"
+       id="linearGradient3708-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       id="StandardGradient-8"
+       x1="11.347495"
+       y1="5.999567"
+       x2="11.347495"
+       y2="16.013096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-2.9995677)">
+      <stop
+         id="stop3177-6"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3179-8"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-8"
+       id="linearGradient2947"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,183,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3728"
+       x1="56"
+       y1="72"
+       x2="56"
+       y2="24"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3710"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,97)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3718"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,95)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3702"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3709"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,97)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3711"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,95)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-8"
+       id="linearGradient3188-1"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-8">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-3" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-8"
+       id="radialGradient3619-9"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3016"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3184"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3186" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3188" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3191"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3193" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3195" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3198"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3200" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3202" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3205"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3207" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3209" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3216"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.1058296"
+     inkscape:cx="-0.37007329"
+     inkscape:cy="54.054919"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer5"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Shadow"
+     style="display:inline">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3216);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725-1);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721-0);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-6"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-1);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-8"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-5"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-9);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98812705"
+       inkscape:original="M 59.5625 26.96875 A 0.99834447 0.99834447 0 0 0 58.9375 27.28125 L 48 38.21875 L 37.0625 27.28125 A 0.99834447 0.99834447 0 0 0 36.21875 27 A 0.99834447 0.99834447 0 0 0 35.625 27.28125 L 26.28125 36.625 A 0.99834447 0.99834447 0 0 0 26.28125 38.0625 L 37.21875 49 L 26.28125 59.9375 A 0.99834447 0.99834447 0 0 0 26.28125 61.375 L 35.625 70.71875 A 0.99834447 0.99834447 0 0 0 37.0625 70.71875 L 48 59.78125 L 58.9375 70.71875 A 0.99834447 0.99834447 0 0 0 60.375  [...]
+       style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none"
+       id="path3734"
+       d="m 59.46875,25.96875 a 0.98822587,0.98822587 0 0 0 0,0.03125 c -3.03e-4,3.2e-5 -0.187201,-5.9e-5 -0.1875,0 -2.99e-4,5.9e-5 -0.155958,0.06241 -0.15625,0.0625 -2.92e-4,8.6e-5 -0.187217,0.06239 -0.1875,0.0625 -2.83e-4,1.11e-4 -0.155978,0.06236 -0.15625,0.0625 -2.72e-4,1.36e-4 -0.155991,0.09359 -0.15625,0.09375 -2.59e-4,1.6e-4 -0.156006,0.09357 -0.15625,0.09375 -2.44e-4,1.82e-4 -0.124774,0.09355 -0.125,0.09375 -1.98e-4,1.78e-4 -0.06945,0.101121 -0.09375,0.125 -0.0035,0.0034 -0.03122 [...]
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99824464"
+       inkscape:original="M 36.34375 28 L 27 37.34375 L 38.65625 49 L 27 60.65625 L 36.34375 70 L 48 58.34375 L 59.65625 70 L 69 60.65625 L 57.34375 49 L 69 37.34375 L 59.65625 28 L 48 39.65625 L 36.34375 28 z "
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none"
+       id="path3730"
+       d="M 36.21875,27 A 0.99834447,0.99834447 0 0 0 35.625,27.28125 L 26.28125,36.625 a 0.99834447,0.99834447 0 0 0 0,1.4375 L 37.21875,49 26.28125,59.9375 a 0.99834447,0.99834447 0 0 0 0,1.4375 l 9.34375,9.34375 a 0.99834447,0.99834447 0 0 0 1.4375,0 L 48,59.78125 58.9375,70.71875 a 0.99834447,0.99834447 0 0 0 1.4375,0 L 69.71875,61.375 a 0.99834447,0.99834447 0 0 0 0,-1.4375 L 58.78125,49 69.71875,38.0625 a 0.99834447,0.99834447 0 0 0 0,-1.4375 L 60.375,27.28125 a 0.99834447,0.998344 [...]
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none;opacity:0.3"
+       d="M 27,60.666667 36.333333,70 48,58.333333 59.666667,70 69,60.666667 57.333333,49 69,37.333333 59.666667,28 48,39.666667 36.333333,28 27,37.333333 38.666667,49 27,60.666667 z"
+       id="path3724" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.82578319"
+       inkscape:original="M 48 29.84375 C 37.434124 29.84375 28.84375 38.434124 28.84375 49 C 28.84375 59.565874 37.434123 68.15625 48 68.15625 C 55.503532 68.15625 61.987145 63.829832 65.125 57.53125 A 1.1642597 1.1642597 0 0 0 64.09375 55.84375 L 56.875 55.84375 A 1.1642597 1.1642597 0 0 0 56 56.21875 C 54.018333 58.435677 51.203441 59.84375 48 59.84375 C 42.001733 59.84375 37.15625 54.998267 37.15625 49 C 37.15625 43.001733 42.001733 38.15625 48 38.15625 C 51.203441 38.15625 54.018333 [...]
+       style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3727"
+       d="m 48,29.03125 c -11.013467,0 -19.96875,8.955283 -19.96875,19.96875 0,11.013465 8.955282,19.96875 19.96875,19.96875 7.820954,0 14.601995,-4.492633 17.875,-11.0625 0.0032,-0.0064 0.02845,-0.118417 0.03125,-0.125 0.0028,-0.0066 0.06012,-0.118253 0.0625,-0.125 0.0024,-0.0067 0.0293,-0.08687 0.03125,-0.09375 0.0019,-0.0069 0.02974,-0.118006 0.03125,-0.125 0.0087,0.03386 0.02944,0.118959 0.03125,0.125 0.0022,0.0075 0.05975,0.117693 0.0625,0.125 0.0027,0.0073 0.028,0.1179 0.03125,0.12 [...]
+       transform="translate(-60,-80)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.1641433"
+       inkscape:original="M 48 31 C 38.063999 31 30 39.063999 30 49 C 30 58.936 38.063998 67 48 67 C 55.054325 67 61.146027 62.916931 64.09375 57 L 56.875 57 C 54.68707 59.447677 51.543436 61 48 61 C 41.372583 61 36 55.627417 36 49 C 36 42.372583 41.372583 37 48 37 C 51.543436 37 54.68707 38.552323 56.875 41 L 64.09375 41 C 61.146027 35.083069 55.054325 31 48 31 z M 67.96875 41 L 67.96875 45 L 52 45 L 52 53 L 67.96875 53 L 67.96875 57 L 77.96875 48.96875 L 67.96875 41 z "
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3723"
+       d="m 48,29.84375 c -10.565876,0 -19.15625,8.590374 -19.15625,19.15625 0,10.565874 8.590373,19.15625 19.15625,19.15625 7.503532,0 13.987145,-4.326418 17.125,-10.625 a 1.1642597,1.1642597 0 0 0 -1.03125,-1.6875 l -7.21875,0 A 1.1642597,1.1642597 0 0 0 56,56.21875 c -1.981667,2.216927 -4.796559,3.625 -8,3.625 -5.998267,0 -10.84375,-4.845483 -10.84375,-10.84375 0,-5.998267 4.845483,-10.84375 10.84375,-10.84375 3.203441,0 6.018333,1.408073 8,3.625 a 1.1642597,1.1642597 0 0 0 0.875,0.37 [...]
+       transform="translate(-60,-80)" />
+    <path
+       id="path3717"
+       d="m -12,-49 c -9.936001,0 -18,8.063999 -18,18 0,9.936 8.063998,18 18,18 7.054325,0 13.146027,-4.083069 16.09375,-10 l -7.21875,0 c -2.18793,2.447677 -5.331564,4 -8.875,4 -6.627417,0 -12,-5.372583 -12,-12 0,-6.627417 5.372583,-12 12,-12 3.543436,0 6.68707,1.552323 8.875,4 l 7.21875,0 C 1.146027,-44.916931 -4.945675,-49 -12,-49 z m 19.96875,10 0,4 L -8,-35 l 0,8 15.96875,0 0,4 10,-8.03125 -10,-7.96875 z"
+       style="opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.1813599"
+       inkscape:original="M 48 30.09375 C 37.568559 30.09375 29.09375 38.568559 29.09375 49 C 29.09375 59.43144 37.568558 67.90625 48 67.90625 C 56.216907 67.90625 63.208117 62.646273 65.8125 55.3125 A 0.9157715 0.9157715 0 0 0 64.9375 54.09375 L 60.625 54.09375 A 0.9157715 0.9157715 0 0 0 59.8125 54.59375 C 57.709346 59.008637 53.220828 62.09375 48 62.09375 C 40.762883 62.09375 34.90625 56.237116 34.90625 49 C 34.90625 41.762883 40.762883 35.90625 48 35.90625 C 53.220828 35.90625 57.709 [...]
+       style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3846"
+       d="m 48,28.90625 c -11.071289,0 -20.09375,9.022461 -20.09375,20.09375 0,11.071288 9.02246,20.09375 20.09375,20.09375 8.217356,0 15.175692,-5.032001 18.28125,-12.125 0.01159,0.0043 0.03262,4.48e-4 0.03125,0 -0.0058,-0.0019 0.162169,0.064 0.15625,0.0625 -0.0059,-0.0015 0.131008,0.03234 0.125,0.03125 -0.006,-0.0011 0.162319,6.72e-4 0.15625,0 -0.0061,-6.72e-4 0.162351,0.0315 0.15625,0.03125 -0.0061,-2.52e-4 0.131103,-1.69e-4 0.125,0 -0.0061,1.69e-4 0.162327,-0.03184 0.15625,-0.03125 - [...]
+       transform="translate(0,-80)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.91567993"
+       inkscape:original="M 48 31 C 38.063999 31 30 39.063999 30 49 C 30 58.936 38.063998 67 48 67 C 55.825188 67 62.459213 61.978695 64.9375 55 L 60.625 55 C 58.375288 59.722539 53.57942 63 48 63 C 40.268013 63 34 56.731986 34 49 C 34 41.268013 40.268013 35 48 35 C 53.57942 35 58.375288 38.277461 60.625 43 L 64.9375 43 C 62.459213 36.021305 55.825188 31 48 31 z M 66.96875 43 L 66.96875 47 L 55 47 L 55 51 L 66.96875 51 L 66.96875 55 L 74.96875 48.96875 L 66.96875 43 z "
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3842"
+       d="m 48,30.09375 c -10.431441,0 -18.90625,8.474809 -18.90625,18.90625 0,10.43144 8.474808,18.90625 18.90625,18.90625 8.216907,0 15.208117,-5.259977 17.8125,-12.59375 a 0.9157715,0.9157715 0 0 0 -0.875,-1.21875 l -4.3125,0 a 0.9157715,0.9157715 0 0 0 -0.8125,0.5 c -2.103154,4.414887 -6.591672,7.5 -11.8125,7.5 -7.237117,0 -13.09375,-5.856634 -13.09375,-13.09375 0,-7.237117 5.856633,-13.09375 13.09375,-13.09375 5.220828,0 9.709346,3.085113 11.8125,7.5 a 0.9157715,0.9157715 0 0 0 0.81 [...]
+       transform="translate(0,-80)" />
+    <path
+       sodipodi:nodetypes="cssccsssccccccccccc"
+       id="path3836"
+       d="m 48,-13 c -9.936002,0 -18,-8.064 -18,-18 0,-9.936001 8.063999,-18 18,-18 7.825188,0 14.459213,5.021305 16.9375,12 l -4.3125,0 c -2.249712,-4.722539 -7.04558,-8 -12.625,-8 -7.731987,0 -14,6.268013 -14,14 0,7.731986 6.268013,14 14,14 5.57942,0 10.375288,-3.277461 12.625,-8 l 4.3125,0 C 62.459213,-18.021305 55.825188,-13 48,-13 z m 18.963356,-12 0,-4 L 55,-29 l 0,-4 11.963356,0 0,-4 8.010153,5.968433 L 66.963356,-25 z"
+       style="opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       style="fill:url(#linearGradient3034);fill-opacity:1;stroke:none;display:inline"
+       d="m 48,-14 c -9.936002,0 -18,-8.064 -18,-18 0,-9.936001 8.063999,-18 18,-18 7.825188,0 14.459213,5.021305 16.9375,12 l -4.3125,0 c -2.249712,-4.722539 -7.04558,-8 -12.625,-8 -7.731987,0 -14,6.268013 -14,14 0,7.731986 6.268013,14 14,14 5.57942,0 10.375288,-3.277461 12.625,-8 l 4.3125,0 C 62.459213,-19.021305 55.825188,-14 48,-14 z m 18.963356,-12 0,-4 L 55,-30 l 0,-4 11.963356,0 0,-4 8.010153,5.968433 L 66.963356,-26 z"
+       id="path3771"
+       sodipodi:nodetypes="cssccsssccccccccccc" />
+    <path
+       style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+       d="m 48,-50 c -9.936001,0 -18,8.063999 -18,18 0,0.168506 0.02664,0.332601 0.03125,0.5 C 30.298378,-41.203326 38.232505,-49 48,-49 c 7.445442,0 13.827353,4.547597 16.5625,11 l 0.375,0 C 62.459213,-44.978695 55.825188,-50 48,-50 z m 18.96875,12 0,1 7.34375,5.46875 0.65625,-0.5 -8,-5.96875 z M 55,-34 l 0,1 11.96875,0 0,-1 L 55,-34 z m -20.96875,2.5 C 34.025365,-31.33321 34,-31.168225 34,-31 c 0,7.731986 6.268013,14 14,14 5.57942,0 10.375288,-3.277461 12.625,-8 l 3.9375,0 c 0.139503,- [...]
+       id="path3827" />
+    <path
+       style="fill:url(#linearGradient3705);fill-opacity:1;stroke:none;display:inline"
+       d="m -12,-50 c -9.936001,0 -18,8.063999 -18,18 0,9.936 8.063998,18 18,18 7.054325,0 13.146027,-4.083069 16.09375,-10 l -7.21875,0 c -2.18793,2.447677 -5.331564,4 -8.875,4 -6.627417,0 -12,-5.372583 -12,-12 0,-6.627417 5.372583,-12 12,-12 3.543436,0 6.68707,1.552323 8.875,4 l 7.21875,0 C 1.146027,-45.916931 -4.945675,-50 -12,-50 z m 19.96875,10 0,4 L -8,-36 l 0,8 15.96875,0 0,4 10,-8.03125 -10,-7.96875 z"
+       id="path3697" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+       d="m -12,-50 c -9.936001,0 -18,8.063999 -18,18 0,0.168506 0.02664,0.332601 0.03125,0.5 0.267128,-9.703326 8.201255,-17.5 17.96875,-17.5 6.653183,0 12.451821,3.623098 15.5625,9 l 0.53125,0 C 1.146027,-45.916931 -4.945675,-50 -12,-50 z m 19.96875,10 0,1 9.375,7.46875 0.625,-0.5 -10,-7.96875 z M -8,-36 l 0,1 15.96875,0 0,-1 L -8,-36 z m -15.96875,4.5 C -23.97575,-31.33169 -24,-31.170031 -24,-31 c 0,6.627417 5.372583,12 12,12 3.543436,0 6.68707,-1.552323 8.875,-4 l 6.6875,0 c 0.187553 [...]
+       id="path3708" />
+    <path
+       id="path2929"
+       d="M 27,59.666667 36.333333,69 48,57.333333 59.666667,69 69,59.666667 57.333333,48 69,36.333333 59.666667,27 48,38.666667 36.333333,27 27,36.333333 38.666667,48 27,59.666667 z"
+       style="fill:url(#linearGradient3702);fill-opacity:1;stroke:none" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:none;opacity:0.75"
+       d="M 36.34375 27 L 27 36.34375 L 27.5 36.84375 L 36.34375 28 L 48 39.65625 L 59.65625 28 L 68.5 36.84375 L 69 36.34375 L 59.65625 27 L 48 38.65625 L 36.34375 27 z M 38.15625 48.5 L 27 59.65625 L 27.5 60.15625 L 38.65625 49 L 38.15625 48.5 z M 57.84375 48.5 L 57.34375 49 L 68.5 60.15625 L 69 59.65625 L 57.84375 48.5 z "
+       id="path3704" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none;opacity:0.15"
+       d="M 27.5 35.84375 L 27 36.34375 L 38.15625 47.5 L 38.65625 47 L 27.5 35.84375 z M 68.5 35.84375 L 57.34375 47 L 57.84375 47.5 L 69 36.34375 L 68.5 35.84375 z M 48 56.34375 L 36.34375 68 L 27.5 59.15625 L 27 59.65625 L 36.34375 69 L 48 57.34375 L 59.65625 69 L 69 59.65625 L 68.5 59.15625 L 59.65625 68 L 48 56.34375 z "
+       id="path3714" />
+  </g>
+</svg>
diff --git a/interface/images/menu/delete2.svg b/interface/images/menu/delete2.svg
new file mode 100755
index 0000000..10b428b
--- /dev/null
+++ b/interface/images/menu/delete2.svg
@@ -0,0 +1,10273 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg:svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="delete2.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="-18.576883"
+     inkscape:cy="46.654964"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <svg:defs
+     id="defs2410">
+    <svg:linearGradient
+       id="linearGradient3637">
+      <svg:stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <svg:stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <svg:stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       id="linearGradient3737"
+       inkscape:collect="always">
+      <svg:stop
+         id="stop3739"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <svg:stop
+         id="stop3741"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       id="linearGradient3700">
+      <svg:stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2276c5;stop-opacity:1;" />
+      <svg:stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#68baf4;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:filter
+       id="filter3174"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <svg:rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </svg:clipPath>
+    <svg:linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843"
+       xlink:href="#linearGradient3700"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <svg:path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <svg:rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       id="filter3657"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <svg:stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <svg:linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       id="linearGradient3737-3"
+       inkscape:collect="always">
+      <svg:stop
+         id="stop3739-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <svg:stop
+         id="stop3741-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <svg:linearGradient
+       id="linearGradient3183-0">
+      <svg:stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#c80000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f3604d;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       id="XMLID_80_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop140" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop142" />
+      <midPointStop
+         id="midPointStop144"
+         style="stop-color:#003399"
+         offset="0" />
+      <midPointStop
+         id="midPointStop146"
+         style="stop-color:#003399"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop148"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       id="XMLID_81_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop155" />
+      <svg:stop
+         style="stop-color:#a3daaf;stop-opacity:1"
+         offset="1"
+         id="stop157" />
+      <midPointStop
+         id="midPointStop159"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop161"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop163"
+         style="stop-color:#A3DAAF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_82_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop170" />
+      <svg:stop
+         style="stop-color:#a3daaf;stop-opacity:1"
+         offset="1"
+         id="stop172" />
+      <midPointStop
+         id="midPointStop174"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop176"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop178"
+         style="stop-color:#A3DAAF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_83_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop185" />
+      <svg:stop
+         style="stop-color:#99ccff;stop-opacity:1"
+         offset="0.0562"
+         id="stop187" />
+      <svg:stop
+         style="stop-color:#3399ff;stop-opacity:1"
+         offset="0.69660002"
+         id="stop189" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop191" />
+      <midPointStop
+         id="midPointStop193"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop195"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop197"
+         style="stop-color:#99CCFF"
+         offset="0.0562" />
+      <midPointStop
+         id="midPointStop199"
+         style="stop-color:#99CCFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop201"
+         style="stop-color:#3399FF"
+         offset="0.6966" />
+      <midPointStop
+         id="midPointStop203"
+         style="stop-color:#3399FF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop205"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       id="XMLID_84_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop212" />
+      <svg:stop
+         style="stop-color:#3399ff;stop-opacity:1"
+         offset="1"
+         id="stop214" />
+      <midPointStop
+         id="midPointStop216"
+         style="stop-color:#003399"
+         offset="0" />
+      <midPointStop
+         id="midPointStop218"
+         style="stop-color:#003399"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop220"
+         style="stop-color:#3399FF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       cx="160.10159"
+       cy="225.54491"
+       r="102.7621"
+       fx="160.10159"
+       fy="225.54491"
+       id="XMLID_85_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+      <svg:stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop227" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop229" />
+      <midPointStop
+         id="midPointStop231"
+         style="stop-color:#428AFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop233"
+         style="stop-color:#428AFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop235"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       id="XMLID_86_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#e6f6f9;stop-opacity:1"
+         offset="0"
+         id="stop242" />
+      <svg:stop
+         style="stop-color:#71a6cd;stop-opacity:1"
+         offset="1"
+         id="stop244" />
+      <midPointStop
+         id="midPointStop246"
+         style="stop-color:#E6F6F9"
+         offset="0" />
+      <midPointStop
+         id="midPointStop248"
+         style="stop-color:#E6F6F9"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop250"
+         style="stop-color:#71A6CD"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408"
+       id="XMLID_87_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop259" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop261" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop263" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop265" />
+      <midPointStop
+         id="midPointStop267"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop269"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop271"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919"
+       id="XMLID_88_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop278" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop280" />
+      <midPointStop
+         id="midPointStop282"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop284"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop286"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082"
+       id="XMLID_89_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop293" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop295" />
+      <midPointStop
+         id="midPointStop297"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop299"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop301"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895"
+       id="XMLID_90_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop308" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop310" />
+      <midPointStop
+         id="midPointStop312"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop314"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop316"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891"
+       id="XMLID_91_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop323" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop325" />
+      <midPointStop
+         id="midPointStop327"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop329"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop331"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201"
+       id="XMLID_92_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop338" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop340" />
+      <midPointStop
+         id="midPointStop342"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop344"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop346"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909"
+       id="XMLID_93_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop353" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop355" />
+      <midPointStop
+         id="midPointStop357"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop359"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop361"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738"
+       id="XMLID_94_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop370" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop372" />
+      <midPointStop
+         id="midPointStop374"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop376"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop378"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547"
+       id="XMLID_95_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop385" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop387" />
+      <midPointStop
+         id="midPointStop389"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop391"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop393"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409"
+       id="XMLID_96_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop400" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop402" />
+      <midPointStop
+         id="midPointStop404"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop406"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop408"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232"
+       id="XMLID_97_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop415" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop417" />
+      <midPointStop
+         id="midPointStop419"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop421"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop423"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505"
+       id="XMLID_98_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop430" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop432" />
+      <midPointStop
+         id="midPointStop434"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop436"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop438"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396"
+       id="XMLID_99_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop445" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop447" />
+      <midPointStop
+         id="midPointStop449"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop451"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop453"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036"
+       id="XMLID_100_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop460" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop462" />
+      <midPointStop
+         id="midPointStop464"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop466"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop468"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591"
+       id="XMLID_101_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop475" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop477" />
+      <midPointStop
+         id="midPointStop479"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop481"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop483"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415"
+       id="XMLID_102_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop490" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop492" />
+      <midPointStop
+         id="midPointStop494"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop496"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop498"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999"
+       id="XMLID_103_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop505" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop507" />
+      <midPointStop
+         id="midPointStop509"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop511"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop513"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359"
+       id="XMLID_104_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop522" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop524" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop526" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop528" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop530" />
+      <midPointStop
+         id="midPointStop532"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop534"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop536"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201"
+       id="XMLID_105_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop543" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop545" />
+      <midPointStop
+         id="midPointStop547"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop549"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop551"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014"
+       id="XMLID_106_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop563" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop565" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop567" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop569" />
+      <midPointStop
+         id="midPointStop571"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop573"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop575"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303"
+       id="XMLID_107_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop582" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop584" />
+      <midPointStop
+         id="midPointStop586"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop588"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop590"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591"
+       id="XMLID_108_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop597" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop599" />
+      <midPointStop
+         id="midPointStop601"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop603"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop605"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707"
+       id="XMLID_109_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop612" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop614" />
+      <midPointStop
+         id="midPointStop616"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop618"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop620"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641"
+       id="XMLID_110_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop627" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop629" />
+      <midPointStop
+         id="midPointStop631"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop633"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop635"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703"
+       id="XMLID_111_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop642" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop644" />
+      <midPointStop
+         id="midPointStop646"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop648"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop650"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341"
+       id="XMLID_112_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop657" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop659" />
+      <midPointStop
+         id="midPointStop661"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop663"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop665"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137"
+       id="XMLID_113_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop674" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop676" />
+      <midPointStop
+         id="midPointStop678"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop680"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop682"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741"
+       id="XMLID_114_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop689" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop691" />
+      <midPointStop
+         id="midPointStop693"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop695"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop697"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319"
+       id="XMLID_115_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop704" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop706" />
+      <midPointStop
+         id="midPointStop708"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop710"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop712"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791"
+       id="XMLID_116_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop719" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop721" />
+      <midPointStop
+         id="midPointStop723"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop725"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop727"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363"
+       id="XMLID_117_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop734" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop736" />
+      <midPointStop
+         id="midPointStop738"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop740"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop742"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335"
+       id="XMLID_118_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop749" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop751" />
+      <midPointStop
+         id="midPointStop753"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop755"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop757"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021"
+       id="XMLID_119_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop764" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop766" />
+      <midPointStop
+         id="midPointStop768"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop770"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop772"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141"
+       id="XMLID_120_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop779" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop781" />
+      <midPointStop
+         id="midPointStop783"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop785"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop787"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449"
+       id="XMLID_121_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop794" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop796" />
+      <midPointStop
+         id="midPointStop798"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop800"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop802"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159"
+       id="XMLID_122_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop809" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop811" />
+      <midPointStop
+         id="midPointStop813"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop815"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop817"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209"
+       id="XMLID_123_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop826" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop828" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop830" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop832" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop834" />
+      <midPointStop
+         id="midPointStop836"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop838"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop840"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349"
+       id="XMLID_124_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop847" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop849" />
+      <midPointStop
+         id="midPointStop851"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop853"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop855"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001"
+       id="XMLID_125_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop867" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop869" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop871" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop873" />
+      <midPointStop
+         id="midPointStop875"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop877"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop879"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop886" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop888" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281"
+       id="XMLID_127_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop901" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop903" />
+      <midPointStop
+         id="midPointStop905"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop907"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop909"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931"
+       id="XMLID_128_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop916" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop918" />
+      <midPointStop
+         id="midPointStop920"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop922"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop924"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598"
+       id="XMLID_129_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop931" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop933" />
+      <midPointStop
+         id="midPointStop935"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop937"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop939"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231"
+       id="XMLID_130_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop946" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop948" />
+      <midPointStop
+         id="midPointStop950"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop952"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop954"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop961" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop963" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228"
+       id="XMLID_132_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop978" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop980" />
+      <midPointStop
+         id="midPointStop982"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop984"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop986"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117"
+       id="XMLID_133_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop993" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop995" />
+      <midPointStop
+         id="midPointStop997"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop999"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1001"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102"
+       id="XMLID_134_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1008" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1010" />
+      <midPointStop
+         id="midPointStop1012"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1014"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1016"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073"
+       id="XMLID_135_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop1023" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1025" />
+      <midPointStop
+         id="midPointStop1027"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1029"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1031"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1038" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop1040" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1053" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop1055" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1068" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1070" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367"
+       id="XMLID_139_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1083" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1085" />
+      <midPointStop
+         id="midPointStop1087"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1089"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1091"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1098" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1100" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337"
+       id="XMLID_141_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop1113" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1115" />
+      <midPointStop
+         id="midPointStop1117"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop1119"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1121"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599"
+       id="XMLID_142_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1130" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop1132" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop1134" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop1136" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1138" />
+      <midPointStop
+         id="midPointStop1140"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1142"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1144"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097"
+       id="XMLID_143_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1151" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1153" />
+      <midPointStop
+         id="midPointStop1155"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1157"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1159"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       id="XMLID_144_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop1169" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop1171" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop1173" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop1175" />
+      <midPointStop
+         id="midPointStop1177"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1179"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1181"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="linearGradient7061"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7063" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7065" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       id="XMLID_146_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop1190" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1192" />
+      <midPointStop
+         id="midPointStop1194"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1196"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1198"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="linearGradient7072"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop7074" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7076" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       id="XMLID_148_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1207" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1209" />
+      <midPointStop
+         id="midPointStop1211"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1213"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1215"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       id="XMLID_149_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1224" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop1226" />
+      <midPointStop
+         id="midPointStop1228"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1230"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1232"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       id="XMLID_150_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1239" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1241" />
+      <midPointStop
+         id="midPointStop1243"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1245"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1247"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="linearGradient7091"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7093" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7095" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="linearGradient7098"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7100" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7102" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="linearGradient7105"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7107" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7109" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="linearGradient7112"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7114" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7116" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       id="XMLID_155_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1264" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1266" />
+      <midPointStop
+         id="midPointStop1268"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1270"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1272"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       id="XMLID_156_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop1281" />
+      <svg:stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop1283" />
+      <midPointStop
+         id="midPointStop1285"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1287"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1289"
+         style="stop-color:#94CAFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       id="XMLID_157_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop1296" />
+      <svg:stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop1298" />
+      <midPointStop
+         id="midPointStop1300"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1302"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1304"
+         style="stop-color:#94CAFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="108.9547"
+       x2="171.04311"
+       y1="27.434099"
+       x1="89.522499"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6425"
+       xlink:href="#XMLID_158_"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       id="XMLID_158_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#99ccff;stop-opacity:1"
+         offset="0"
+         id="stop1311" />
+      <svg:stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="1"
+         id="stop1313" />
+      <midPointStop
+         id="midPointStop1315"
+         style="stop-color:#99CCFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1317"
+         style="stop-color:#99CCFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1319"
+         style="stop-color:#428AFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="48.791"
+       x2="48.752899"
+       y1="207.65041"
+       x1="207.6123"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6269-12"
+       xlink:href="#XMLID_80_-300"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       id="XMLID_80_-300"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#2f2f2f;stop-opacity:1"
+         offset="0"
+         id="stop9438" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9440" />
+      <midPointStop
+         id="midPointStop144"
+         style="stop-color:#2f2f2f"
+         offset="0" />
+      <midPointStop
+         id="midPointStop146"
+         style="stop-color:#2f2f2f"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop148"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="193.487"
+       x2="193.901"
+       y1="66.130898"
+       x1="66.544899"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6271-673"
+       xlink:href="#XMLID_81_-401"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       id="XMLID_81_-401"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9444" />
+      <svg:stop
+         style="stop-color:#c5c5c5;stop-opacity:1"
+         offset="1"
+         id="stop9446" />
+      <midPointStop
+         id="midPointStop159"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop161"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop163"
+         style="stop-color:#c5c5c5"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6273-406"
+       xlink:href="#XMLID_82_-773"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_82_-773"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9450" />
+      <svg:stop
+         style="stop-color:#c5c5c5;stop-opacity:1"
+         offset="1"
+         id="stop9452" />
+      <midPointStop
+         id="midPointStop174"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop176"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop178"
+         style="stop-color:#c5c5c5"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6275-166"
+       xlink:href="#XMLID_83_-832"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_83_-832"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9456" />
+      <svg:stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="0.0562"
+         id="stop9458" />
+      <svg:stop
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0.69660002"
+         id="stop9460" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9462" />
+      <midPointStop
+         id="midPointStop193"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop195"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop197"
+         style="stop-color:#c3c3c3"
+         offset="0.0562" />
+      <midPointStop
+         id="midPointStop199"
+         style="stop-color:#c3c3c3"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop201"
+         style="stop-color:#868686"
+         offset="0.6966" />
+      <midPointStop
+         id="midPointStop203"
+         style="stop-color:#868686"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop205"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="19.067101"
+       x2="69.907303"
+       y1="86.971199"
+       x1="153.97951"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6277-610"
+       xlink:href="#XMLID_84_-677"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       id="XMLID_84_-677"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#2f2f2f;stop-opacity:1"
+         offset="0"
+         id="stop9466" />
+      <svg:stop
+         style="stop-color:#868686;stop-opacity:1"
+         offset="1"
+         id="stop9468" />
+      <midPointStop
+         id="midPointStop216"
+         style="stop-color:#2f2f2f"
+         offset="0" />
+      <midPointStop
+         id="midPointStop218"
+         style="stop-color:#2f2f2f"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop220"
+         style="stop-color:#868686"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       r="102.7621"
+       fy="225.54491"
+       fx="160.10159"
+       cy="225.54491"
+       cx="160.10159"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient6279-99"
+       xlink:href="#XMLID_85_-413"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       cx="160.10159"
+       cy="225.54491"
+       r="102.7621"
+       fx="160.10159"
+       fy="225.54491"
+       id="XMLID_85_-413"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9472" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9474" />
+      <midPointStop
+         id="midPointStop231"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop233"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop235"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       y2="62.4673"
+       x2="208.98441"
+       y1="62.4673"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6281-27"
+       xlink:href="#XMLID_86_-281"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       id="XMLID_86_-281"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#f2f2f2;stop-opacity:1"
+         offset="0"
+         id="stop9478" />
+      <svg:stop
+         style="stop-color:#9b9b9b;stop-opacity:1"
+         offset="1"
+         id="stop9480" />
+      <midPointStop
+         id="midPointStop246"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <midPointStop
+         id="midPointStop248"
+         style="stop-color:#f2f2f2"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop250"
+         style="stop-color:#9b9b9b"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="109.9408"
+       x2="133.71049"
+       y1="185.7363"
+       x1="57.915001"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6283-124"
+       xlink:href="#XMLID_87_-7"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408"
+       id="XMLID_87_-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9484" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9486" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9488" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9490" />
+      <midPointStop
+         id="midPointStop267"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop269"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop271"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="135.90919"
+       x2="116.0225"
+       y1="135.90919"
+       x1="60.370098"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6285-348"
+       xlink:href="#XMLID_88_-910"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919"
+       id="XMLID_88_-910"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9494" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9496" />
+      <midPointStop
+         id="midPointStop282"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop284"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop286"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="169.9082"
+       x2="92.127899"
+       y1="169.9082"
+       x1="51.419399"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6287-770"
+       xlink:href="#XMLID_89_-317"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082"
+       id="XMLID_89_-317"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9500" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9502" />
+      <midPointStop
+         id="midPointStop297"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop299"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop301"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="180.6895"
+       x2="128.5298"
+       y1="180.6895"
+       x1="83.349098"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6289-142"
+       xlink:href="#XMLID_90_-384"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895"
+       id="XMLID_90_-384"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9506" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9508" />
+      <midPointStop
+         id="midPointStop312"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop314"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop316"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="143.37891"
+       x2="146.2168"
+       y1="143.37891"
+       x1="68.799301"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6291-78"
+       xlink:href="#XMLID_91_-871"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891"
+       id="XMLID_91_-871"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9512" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9514" />
+      <midPointStop
+         id="midPointStop327"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop329"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop331"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="160.54201"
+       x2="143.7529"
+       y1="160.54201"
+       x1="57.743198"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6293-824"
+       xlink:href="#XMLID_92_-17"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201"
+       id="XMLID_92_-17"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9518" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9520" />
+      <midPointStop
+         id="midPointStop342"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop344"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop346"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="145.86909"
+       x2="110.6274"
+       y1="145.86909"
+       x1="45.084499"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6295-851"
+       xlink:href="#XMLID_93_-680"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909"
+       id="XMLID_93_-680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9524" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9526" />
+      <midPointStop
+         id="midPointStop357"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop359"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop361"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="176.6738"
+       x2="65.547401"
+       y1="141.1396"
+       x1="65.547401"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6297-148"
+       xlink:href="#XMLID_94_-24"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738"
+       id="XMLID_94_-24"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9530" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9532" />
+      <midPointStop
+         id="midPointStop374"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop376"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop378"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="155.5547"
+       x2="83.372101"
+       y1="155.5547"
+       x1="56.244099"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6299-516"
+       xlink:href="#XMLID_95_-472"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547"
+       id="XMLID_95_-472"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9536" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9538" />
+      <midPointStop
+         id="midPointStop389"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop391"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop393"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="133.41409"
+       x2="73.045403"
+       y1="133.41409"
+       x1="51.5425"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6301-40"
+       xlink:href="#XMLID_96_-410"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409"
+       id="XMLID_96_-410"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9542" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9544" />
+      <midPointStop
+         id="midPointStop404"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop406"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop408"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="164.3232"
+       x2="144.998"
+       y1="164.3232"
+       x1="112.6553"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6303-774"
+       xlink:href="#XMLID_97_-458"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232"
+       id="XMLID_97_-458"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9548" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9550" />
+      <midPointStop
+         id="midPointStop419"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop421"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop423"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="123.7505"
+       x2="73.045403"
+       y1="123.7505"
+       x1="51.702599"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6305-152"
+       xlink:href="#XMLID_98_-723"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505"
+       id="XMLID_98_-723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9554" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9556" />
+      <midPointStop
+         id="midPointStop434"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop436"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop438"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="117.1396"
+       x2="111.8184"
+       y1="117.1396"
+       x1="68.9487"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6307-705"
+       xlink:href="#XMLID_99_-634"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396"
+       id="XMLID_99_-634"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9560" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9562" />
+      <midPointStop
+         id="midPointStop449"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop451"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop453"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="121.7036"
+       x2="101.0723"
+       y1="121.7036"
+       x1="43.173302"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6309-493"
+       xlink:href="#XMLID_100_-34"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036"
+       id="XMLID_100_-34"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9566" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9568" />
+      <midPointStop
+         id="midPointStop464"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop466"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop468"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="181.83591"
+       x2="102.8101"
+       y1="181.83591"
+       x1="64.091797"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6311-389"
+       xlink:href="#XMLID_101_-145"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591"
+       id="XMLID_101_-145"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9572" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9574" />
+      <midPointStop
+         id="midPointStop479"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop481"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop483"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="102.415"
+       x2="89.291496"
+       y1="116.5332"
+       x1="89.291496"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6313-341"
+       xlink:href="#XMLID_102_-594"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415"
+       id="XMLID_102_-594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9578" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9580" />
+      <midPointStop
+         id="midPointStop494"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop496"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop498"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="166.78999"
+       x2="103.6514"
+       y1="166.78999"
+       x1="64.091797"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6315-70"
+       xlink:href="#XMLID_103_-322"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999"
+       id="XMLID_103_-322"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9584" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9586" />
+      <midPointStop
+         id="midPointStop509"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop511"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop513"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="135.68359"
+       x2="121.7998"
+       y1="186.7813"
+       x1="121.7998"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6317-432"
+       xlink:href="#XMLID_104_-426"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359"
+       id="XMLID_104_-426"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9590" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9592" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9594" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9596" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9598" />
+      <midPointStop
+         id="midPointStop532"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop534"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop536"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="120.8201"
+       x2="107.8923"
+       y1="153.74899"
+       x1="140.8213"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6319-99"
+       xlink:href="#XMLID_105_-588"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201"
+       id="XMLID_105_-588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9602" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9604" />
+      <midPointStop
+         id="midPointStop547"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop549"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop551"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="121.5014"
+       x2="174.5889"
+       y1="186.5674"
+       x1="109.5229"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6321-310"
+       xlink:href="#XMLID_106_-902"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014"
+       id="XMLID_106_-902"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9608" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9610" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9612" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9614" />
+      <midPointStop
+         id="midPointStop571"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop573"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop575"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="141.5303"
+       x2="158.6631"
+       y1="141.5303"
+       x1="112.7676"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6323-611"
+       xlink:href="#XMLID_107_-908"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303"
+       id="XMLID_107_-908"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9618" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9620" />
+      <midPointStop
+         id="midPointStop586"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop588"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop590"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="173.58591"
+       x2="139.75681"
+       y1="173.58591"
+       x1="106.2578"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6325-800"
+       xlink:href="#XMLID_108_-618"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591"
+       id="XMLID_108_-618"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9624" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9626" />
+      <midPointStop
+         id="midPointStop601"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop603"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop605"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="184.4707"
+       x2="170.3076"
+       y1="184.4707"
+       x1="132.9424"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6327-400"
+       xlink:href="#XMLID_109_-773"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707"
+       id="XMLID_109_-773"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9630" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9632" />
+      <midPointStop
+         id="midPointStop616"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop618"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop620"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="149.56641"
+       x2="183.70309"
+       y1="149.56641"
+       x1="119.5918"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6329-40"
+       xlink:href="#XMLID_110_-751"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641"
+       id="XMLID_110_-751"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9636" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9638" />
+      <midPointStop
+         id="midPointStop631"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop633"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop635"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="165.5703"
+       x2="182.47749"
+       y1="165.5703"
+       x1="111.2227"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6331-210"
+       xlink:href="#XMLID_111_-96"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703"
+       id="XMLID_111_-96"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9642" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9644" />
+      <midPointStop
+         id="midPointStop646"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop648"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop650"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="151.52341"
+       x2="154.5625"
+       y1="151.52341"
+       x1="100.2744"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6333-446"
+       xlink:href="#XMLID_112_-727"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341"
+       id="XMLID_112_-727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9648" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9650" />
+      <midPointStop
+         id="midPointStop661"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop663"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop665"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="179.5137"
+       x2="117.7603"
+       y1="146.1875"
+       x1="117.7603"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6335-626"
+       xlink:href="#XMLID_113_-280"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137"
+       id="XMLID_113_-280"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9654" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9656" />
+      <midPointStop
+         id="midPointStop678"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop680"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop682"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="159.85741"
+       x2="132.4502"
+       y1="159.85741"
+       x1="109.9058"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6337-884"
+       xlink:href="#XMLID_114_-97"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741"
+       id="XMLID_114_-97"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9660" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9662" />
+      <midPointStop
+         id="midPointStop693"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop695"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop697"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="139.24319"
+       x2="122.7686"
+       y1="139.24319"
+       x1="105.1421"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6339-140"
+       xlink:href="#XMLID_115_-820"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319"
+       id="XMLID_115_-820"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9666" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9668" />
+      <midPointStop
+         id="midPointStop708"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop710"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop712"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="169.791"
+       x2="183.51759"
+       y1="169.791"
+       x1="156.75"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6341-178"
+       xlink:href="#XMLID_116_-848"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791"
+       id="XMLID_116_-848"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9672" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9674" />
+      <midPointStop
+         id="midPointStop723"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop725"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop727"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="130.2363"
+       x2="122.7686"
+       y1="130.2363"
+       x1="105.1421"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6343-456"
+       xlink:href="#XMLID_117_-194"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363"
+       id="XMLID_117_-194"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9678" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9680" />
+      <midPointStop
+         id="midPointStop738"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop740"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop742"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="124.335"
+       x2="155.19341"
+       y1="124.335"
+       x1="119.3262"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6345-512"
+       xlink:href="#XMLID_118_-250"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335"
+       id="XMLID_118_-250"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9684" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9686" />
+      <midPointStop
+         id="midPointStop753"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop755"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop757"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="128.2021"
+       x2="146.27341"
+       y1="128.2021"
+       x1="97.902802"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6347-184"
+       xlink:href="#XMLID_119_-606"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021"
+       id="XMLID_119_-606"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9690" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9692" />
+      <midPointStop
+         id="midPointStop768"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop770"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop772"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="185.19141"
+       x2="148.7822"
+       y1="185.19141"
+       x1="116.7427"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6349-877"
+       xlink:href="#XMLID_120_-395"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141"
+       id="XMLID_120_-395"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9696" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9698" />
+      <midPointStop
+         id="midPointStop783"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop785"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop787"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="110.5449"
+       x2="136.19341"
+       y1="123.416"
+       x1="136.19341"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6351-447"
+       xlink:href="#XMLID_121_-770"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449"
+       id="XMLID_121_-770"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9702" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9704" />
+      <midPointStop
+         id="midPointStop798"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop800"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop802"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="170.68159"
+       x2="149.4102"
+       y1="170.68159"
+       x1="116.7427"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6353-441"
+       xlink:href="#XMLID_122_-543"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159"
+       id="XMLID_122_-543"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9708" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9710" />
+      <midPointStop
+         id="midPointStop813"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop815"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop817"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="142.41209"
+       x2="164.56641"
+       y1="190.0674"
+       x1="164.56641"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6355-488"
+       xlink:href="#XMLID_123_-726"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209"
+       id="XMLID_123_-726"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9714" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9716" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9718" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9720" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9722" />
+      <midPointStop
+         id="midPointStop836"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop838"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop840"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="129.86349"
+       x2="152.1692"
+       y1="159.6348"
+       x1="181.9404"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6357-493"
+       xlink:href="#XMLID_124_-427"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349"
+       id="XMLID_124_-427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9726" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9728" />
+      <midPointStop
+         id="midPointStop851"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop853"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop855"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="55.553001"
+       x2="171.70821"
+       y1="138.93359"
+       x1="88.327599"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6359-440"
+       xlink:href="#XMLID_125_-451"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001"
+       id="XMLID_125_-451"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9732" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9734" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9736" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9738" />
+      <midPointStop
+         id="midPointStop875"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop877"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop879"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.741203"
+       x2="152.7852"
+       y1="84.741203"
+       x1="89.107903"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6361-910"
+       xlink:href="#XMLID_126_-70"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_-70"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9742" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9744" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="120.8281"
+       x2="125.7993"
+       y1="120.8281"
+       x1="79.251503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6363-657"
+       xlink:href="#XMLID_127_-555"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281"
+       id="XMLID_127_-555"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9748" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9750" />
+      <midPointStop
+         id="midPointStop905"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop907"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop909"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="132.56931"
+       x2="167.68359"
+       y1="132.56931"
+       x1="115.9443"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6365-734"
+       xlink:href="#XMLID_128_-141"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931"
+       id="XMLID_128_-141"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9754" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9756" />
+      <midPointStop
+         id="midPointStop920"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop922"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop924"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="93.078598"
+       x2="187.3965"
+       y1="93.078598"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6367-266"
+       xlink:href="#XMLID_129_-770"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598"
+       id="XMLID_129_-770"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9760" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9762" />
+      <midPointStop
+         id="midPointStop935"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop937"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop939"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="111.2231"
+       x2="184.93159"
+       y1="111.2231"
+       x1="86.376503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6369-690"
+       xlink:href="#XMLID_130_-72"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231"
+       id="XMLID_130_-72"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9766" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9768" />
+      <midPointStop
+         id="midPointStop950"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop952"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop954"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="95.561501"
+       x2="146.76559"
+       y1="95.561501"
+       x1="71.667503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6371-381"
+       xlink:href="#XMLID_131_-413"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_-413"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9772" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9774" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="127.8228"
+       x2="95.352097"
+       y1="90.179703"
+       x1="95.352097"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6373-572"
+       xlink:href="#XMLID_132_-722"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228"
+       id="XMLID_132_-722"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9778" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9780" />
+      <midPointStop
+         id="midPointStop982"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop984"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop986"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="105.5117"
+       x2="115.7422"
+       y1="105.5117"
+       x1="84.628403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6375-640"
+       xlink:href="#XMLID_133_-214"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117"
+       id="XMLID_133_-214"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9784" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9786" />
+      <midPointStop
+         id="midPointStop997"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop999"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1001"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="82.119102"
+       x2="103.4116"
+       y1="82.119102"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6377-149"
+       xlink:href="#XMLID_134_-535"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102"
+       id="XMLID_134_-535"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9790" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9792" />
+      <midPointStop
+         id="midPointStop1012"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1014"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1016"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="115.5073"
+       x2="186.3633"
+       y1="115.5073"
+       x1="149.50391"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6379-302"
+       xlink:href="#XMLID_135_-577"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073"
+       id="XMLID_135_-577"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9796" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9798" />
+      <midPointStop
+         id="midPointStop1027"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1029"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1031"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="71.9048"
+       x2="103.4116"
+       y1="71.9048"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6381-329"
+       xlink:href="#XMLID_136_-920"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_-920"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9802" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9804" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="65.025398"
+       x2="147.9727"
+       y1="65.025398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6383-96"
+       xlink:href="#XMLID_137_-11"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_-11"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9808" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9810" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="69.597198"
+       x2="135.6543"
+       y1="69.597198"
+       x1="69.128403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6385-535"
+       xlink:href="#XMLID_138_-837"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_-837"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9814" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9816" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="133.6367"
+       x2="138.1172"
+       y1="133.6367"
+       x1="93.767601"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6387-799"
+       xlink:href="#XMLID_139_-626"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367"
+       id="XMLID_139_-626"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9820" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9822" />
+      <midPointStop
+         id="midPointStop1087"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1089"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1091"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="49.432598"
+       x2="122.0112"
+       y1="64.238297"
+       x1="122.0112"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6389-597"
+       xlink:href="#XMLID_140_-645"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_-645"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9826" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9828" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="117.5337"
+       x2="139.0508"
+       y1="117.5337"
+       x1="93.767601"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6391-867"
+       xlink:href="#XMLID_141_-860"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337"
+       id="XMLID_141_-860"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9832" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9834" />
+      <midPointStop
+         id="midPointStop1117"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop1119"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1121"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.952599"
+       x2="159.9014"
+       y1="138.9736"
+       x1="159.9014"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6393-952"
+       xlink:href="#XMLID_142_-935"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599"
+       id="XMLID_142_-935"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9838" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9840" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9842" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9844" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9846" />
+      <midPointStop
+         id="midPointStop1140"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1142"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1144"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="67.852097"
+       x2="143.1671"
+       y1="104.6089"
+       x1="179.9238"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6395-649"
+       xlink:href="#XMLID_143_-216"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097"
+       id="XMLID_143_-216"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9850" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9852" />
+      <midPointStop
+         id="midPointStop1155"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1157"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1159"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="40.555302"
+       x2="158.21181"
+       y1="103.3657"
+       x1="95.401398"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6397-611"
+       xlink:href="#XMLID_144_-323"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       id="XMLID_144_-323"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9856" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9858" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9860" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9862" />
+      <midPointStop
+         id="midPointStop1177"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1179"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1181"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.741203"
+       x2="152.7852"
+       y1="84.741203"
+       x1="89.107903"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6399-909"
+       xlink:href="#XMLID_126_-463"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_-463"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9866" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9868" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="83.484398"
+       x2="187.3965"
+       y1="83.484398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6401-54"
+       xlink:href="#XMLID_146_-485"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       id="XMLID_146_-485"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9872" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9874" />
+      <midPointStop
+         id="midPointStop1194"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1196"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1198"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="95.561501"
+       x2="146.76559"
+       y1="95.561501"
+       x1="71.667503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6403-766"
+       xlink:href="#XMLID_131_-578"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_-578"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9878" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9880" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="86.965302"
+       x2="146.76559"
+       y1="86.965302"
+       x1="86.275398"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6405-525"
+       xlink:href="#XMLID_148_-757"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       id="XMLID_148_-757"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9884" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9886" />
+      <midPointStop
+         id="midPointStop1211"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1213"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1215"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="93.951698"
+       x2="111.7031"
+       y1="93.951698"
+       x1="89.539101"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6407-181"
+       xlink:href="#XMLID_149_-599"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       id="XMLID_149_-599"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9890" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9892" />
+      <midPointStop
+         id="midPointStop1228"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1230"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1232"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="80.275902"
+       x2="103.4116"
+       y1="80.275902"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6409-208"
+       xlink:href="#XMLID_150_-191"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       id="XMLID_150_-191"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9896" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9898" />
+      <midPointStop
+         id="midPointStop1243"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1245"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1247"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="71.9048"
+       x2="103.4116"
+       y1="71.9048"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6411-385"
+       xlink:href="#XMLID_136_-980"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_-980"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9902" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9904" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="65.025398"
+       x2="147.9727"
+       y1="65.025398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6413-883"
+       xlink:href="#XMLID_137_-482"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_-482"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9908" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9910" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="69.597198"
+       x2="135.6543"
+       y1="69.597198"
+       x1="69.128403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6415-860"
+       xlink:href="#XMLID_138_-859"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_-859"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9914" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9916" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="49.432598"
+       x2="122.0112"
+       y1="64.238297"
+       x1="122.0112"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6417-680"
+       xlink:href="#XMLID_140_-471"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_-471"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9920" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9922" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="68.5233"
+       x2="143.8383"
+       y1="98.137199"
+       x1="173.4521"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6419-21"
+       xlink:href="#XMLID_155_-978"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       id="XMLID_155_-978"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9926" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9928" />
+      <midPointStop
+         id="midPointStop1268"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1270"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1272"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="159.00591"
+       x2="118.7616"
+       y1="159.00591"
+       x1="60.097198"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6421-714"
+       xlink:href="#XMLID_156_-100"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       id="XMLID_156_-100"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9932" />
+      <svg:stop
+         style="stop-color:#c0c0c0;stop-opacity:1"
+         offset="1"
+         id="stop9934" />
+      <midPointStop
+         id="midPointStop1285"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1287"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1289"
+         style="stop-color:#c0c0c0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="147.877"
+       x2="118.7651"
+       y1="147.877"
+       x1="60.098598"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6423-931"
+       xlink:href="#XMLID_157_-792"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       id="XMLID_157_-792"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9938" />
+      <svg:stop
+         style="stop-color:#c0c0c0;stop-opacity:1"
+         offset="1"
+         id="stop9940" />
+      <midPointStop
+         id="midPointStop1300"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1302"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1304"
+         style="stop-color:#c0c0c0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_158_-583"
+       id="linearGradient7705-647"
+       gradientUnits="userSpaceOnUse"
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547" />
+    <svg:linearGradient
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       id="XMLID_158_-583"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="0"
+         id="stop9944" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9946" />
+      <midPointStop
+         id="midPointStop1315"
+         style="stop-color:#c3c3c3"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1317"
+         style="stop-color:#c3c3c3"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1319"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7135"
+       y2="48.791"
+       x2="48.752899"
+       y1="207.65041"
+       x1="207.6123">
+      <svg:stop
+         id="stop7137"
+         offset="0"
+         style="stop-color:#2f2f2f;stop-opacity:1" />
+      <svg:stop
+         id="stop7139"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#2f2f2f"
+         id="midPointStop144" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#2f2f2f"
+         id="midPointStop146" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop148" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7142"
+       y2="193.487"
+       x2="193.901"
+       y1="66.130898"
+       x1="66.544899">
+      <svg:stop
+         id="stop7144"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7146"
+         offset="1"
+         style="stop-color:#c5c5c5;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop159" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop161" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c5c5c5"
+         id="midPointStop163" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7149"
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223">
+      <svg:stop
+         id="stop7151"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7153"
+         offset="1"
+         style="stop-color:#c5c5c5;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop174" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop176" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c5c5c5"
+         id="midPointStop178" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7156"
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223">
+      <svg:stop
+         id="stop7158"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7160"
+         offset="0.0562"
+         style="stop-color:#c3c3c3;stop-opacity:1" />
+      <svg:stop
+         id="stop7162"
+         offset="0.69660002"
+         style="stop-color:#868686;stop-opacity:1" />
+      <svg:stop
+         id="stop7164"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop193" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop195" />
+      <midPointStop
+         offset="0.0562"
+         style="stop-color:#c3c3c3"
+         id="midPointStop197" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#c3c3c3"
+         id="midPointStop199" />
+      <midPointStop
+         offset="0.6966"
+         style="stop-color:#868686"
+         id="midPointStop201" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#868686"
+         id="midPointStop203" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop205" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7167"
+       y2="19.067101"
+       x2="69.907303"
+       y1="86.971199"
+       x1="153.97951">
+      <svg:stop
+         id="stop7169"
+         offset="0"
+         style="stop-color:#2f2f2f;stop-opacity:1" />
+      <svg:stop
+         id="stop7171"
+         offset="1"
+         style="stop-color:#868686;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#2f2f2f"
+         id="midPointStop216" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#2f2f2f"
+         id="midPointStop218" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#868686"
+         id="midPointStop220" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient7174"
+       fy="225.54491"
+       fx="160.10159"
+       r="102.7621"
+       cy="225.54491"
+       cx="160.10159">
+      <svg:stop
+         id="stop7176"
+         offset="0"
+         style="stop-color:#828282;stop-opacity:1" />
+      <svg:stop
+         id="stop7178"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#828282"
+         id="midPointStop231" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#828282"
+         id="midPointStop233" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop235" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7181"
+       y2="62.4673"
+       x2="208.98441"
+       y1="62.4673"
+       x1="47.8223">
+      <svg:stop
+         id="stop7183"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1" />
+      <svg:stop
+         id="stop7185"
+         offset="1"
+         style="stop-color:#9b9b9b;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#f2f2f2"
+         id="midPointStop246" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#f2f2f2"
+         id="midPointStop248" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#9b9b9b"
+         id="midPointStop250" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7629"
+       y2="40.555302"
+       x2="158.21181"
+       y1="103.3657"
+       x1="95.401398">
+      <svg:stop
+         id="stop7631"
+         offset="0"
+         style="stop-color:#494949;stop-opacity:1" />
+      <svg:stop
+         id="stop7633"
+         offset="0.1654"
+         style="stop-color:#505050;stop-opacity:1" />
+      <svg:stop
+         id="stop7635"
+         offset="0.59490001"
+         style="stop-color:#5d5d5d;stop-opacity:1" />
+      <svg:stop
+         id="stop7637"
+         offset="1"
+         style="stop-color:#616161;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#494949"
+         id="midPointStop1177" />
+      <midPointStop
+         offset="0.3051"
+         style="stop-color:#494949"
+         id="midPointStop1179" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#616161"
+         id="midPointStop1181" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7641"
+       y2="83.484398"
+       x2="187.3965"
+       y1="83.484398"
+       x1="98.694298">
+      <svg:stop
+         id="stop7643"
+         offset="0"
+         style="stop-color:#616161;stop-opacity:1" />
+      <svg:stop
+         id="stop7645"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#616161"
+         id="midPointStop1194" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#616161"
+         id="midPointStop1196" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1198" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7649"
+       y2="86.965302"
+       x2="146.76559"
+       y1="86.965302"
+       x1="86.275398">
+      <svg:stop
+         id="stop7651"
+         offset="0"
+         style="stop-color:#b6b6b6;stop-opacity:1" />
+      <svg:stop
+         id="stop7653"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1211" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1213" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1215" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7657"
+       y2="93.951698"
+       x2="111.7031"
+       y1="93.951698"
+       x1="89.539101">
+      <svg:stop
+         id="stop7659"
+         offset="0"
+         style="stop-color:#dadada;stop-opacity:1" />
+      <svg:stop
+         id="stop7661"
+         offset="0.75840002"
+         style="stop-color:#828282;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#dadada"
+         id="midPointStop1228" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#dadada"
+         id="midPointStop1230" />
+      <midPointStop
+         offset="0.7584"
+         style="stop-color:#828282"
+         id="midPointStop1232" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7664"
+       y2="80.275902"
+       x2="103.4116"
+       y1="80.275902"
+       x1="78.984901">
+      <svg:stop
+         id="stop7666"
+         offset="0"
+         style="stop-color:#dadada;stop-opacity:1" />
+      <svg:stop
+         id="stop7668"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#dadada"
+         id="midPointStop1243" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#dadada"
+         id="midPointStop1245" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1247" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7676"
+       y2="68.5233"
+       x2="143.8383"
+       y1="98.137199"
+       x1="173.4521">
+      <svg:stop
+         id="stop7678"
+         offset="0"
+         style="stop-color:#b6b6b6;stop-opacity:1" />
+      <svg:stop
+         id="stop7680"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1268" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1270" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1272" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7684"
+       y2="159.00591"
+       x2="118.7616"
+       y1="159.00591"
+       x1="60.097198">
+      <svg:stop
+         id="stop7686"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7688"
+         offset="1"
+         style="stop-color:#c0c0c0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop1285" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop1287" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c0c0c0"
+         id="midPointStop1289" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7691"
+       y2="147.877"
+       x2="118.7651"
+       y1="147.877"
+       x1="60.098598">
+      <svg:stop
+         id="stop7693"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7695"
+         offset="1"
+         style="stop-color:#c0c0c0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop1300" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop1302" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c0c0c0"
+         id="midPointStop1304" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7698"
+       y2="108.9547"
+       x2="171.04311"
+       y1="27.434099"
+       x1="89.522499">
+      <svg:stop
+         id="stop7700"
+         offset="0"
+         style="stop-color:#c3c3c3;stop-opacity:1" />
+      <svg:stop
+         id="stop7702"
+         offset="1"
+         style="stop-color:#828282;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#c3c3c3"
+         id="midPointStop1315" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#c3c3c3"
+         id="midPointStop1317" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#828282"
+         id="midPointStop1319" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_158_-583"
+       id="linearGradient11460"
+       gradientUnits="userSpaceOnUse"
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_157_-792"
+       id="linearGradient11463"
+       gradientUnits="userSpaceOnUse"
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_156_-100"
+       id="linearGradient11466"
+       gradientUnits="userSpaceOnUse"
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_155_-978"
+       id="linearGradient11470"
+       gradientUnits="userSpaceOnUse"
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_150_-191"
+       id="linearGradient11478"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_149_-599"
+       id="linearGradient11481"
+       gradientUnits="userSpaceOnUse"
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_148_-757"
+       id="linearGradient11485"
+       gradientUnits="userSpaceOnUse"
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_131_-578"
+       id="linearGradient11488"
+       gradientUnits="userSpaceOnUse"
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_146_-485"
+       id="linearGradient11491"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_144_-323"
+       id="linearGradient11495"
+       gradientUnits="userSpaceOnUse"
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_86_-281"
+       id="linearGradient11753"
+       gradientUnits="userSpaceOnUse"
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_85_-413"
+       id="radialGradient11756"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.31643347,3.8580342,7.7177487)"
+       cx="160.10159"
+       cy="225.54491"
+       fx="160.10159"
+       fy="225.54491"
+       r="102.7621" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_84_-677"
+       id="linearGradient11759"
+       gradientUnits="userSpaceOnUse"
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_83_-832"
+       id="linearGradient11762"
+       gradientUnits="userSpaceOnUse"
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_82_-773"
+       id="linearGradient11765"
+       gradientUnits="userSpaceOnUse"
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_81_-401"
+       id="linearGradient11768"
+       gradientUnits="userSpaceOnUse"
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_80_-300"
+       id="linearGradient11771"
+       gradientUnits="userSpaceOnUse"
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       gradientTransform="matrix(0.2916,0,0,0.307402,7.6022656,8.757456)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_140_-471"
+       id="linearGradient11773"
+       gradientUnits="userSpaceOnUse"
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_138_-859"
+       id="linearGradient11775"
+       gradientUnits="userSpaceOnUse"
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_137_-482"
+       id="linearGradient11777"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_136_-980"
+       id="linearGradient11779"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_126_-463"
+       id="linearGradient11781"
+       gradientUnits="userSpaceOnUse"
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_125_-451"
+       id="linearGradient11783"
+       gradientUnits="userSpaceOnUse"
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_126_-70"
+       id="linearGradient11785"
+       gradientUnits="userSpaceOnUse"
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_127_-555"
+       id="linearGradient11787"
+       gradientUnits="userSpaceOnUse"
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_128_-141"
+       id="linearGradient11789"
+       gradientUnits="userSpaceOnUse"
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_129_-770"
+       id="linearGradient11791"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_130_-72"
+       id="linearGradient11793"
+       gradientUnits="userSpaceOnUse"
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_131_-413"
+       id="linearGradient11795"
+       gradientUnits="userSpaceOnUse"
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_132_-722"
+       id="linearGradient11797"
+       gradientUnits="userSpaceOnUse"
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_133_-214"
+       id="linearGradient11799"
+       gradientUnits="userSpaceOnUse"
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_134_-535"
+       id="linearGradient11801"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_135_-577"
+       id="linearGradient11803"
+       gradientUnits="userSpaceOnUse"
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_136_-920"
+       id="linearGradient11805"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_137_-11"
+       id="linearGradient11807"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_138_-837"
+       id="linearGradient11809"
+       gradientUnits="userSpaceOnUse"
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_139_-626"
+       id="linearGradient11811"
+       gradientUnits="userSpaceOnUse"
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_140_-645"
+       id="linearGradient11813"
+       gradientUnits="userSpaceOnUse"
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_141_-860"
+       id="linearGradient11815"
+       gradientUnits="userSpaceOnUse"
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_142_-935"
+       id="linearGradient11817"
+       gradientUnits="userSpaceOnUse"
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_143_-216"
+       id="linearGradient11819"
+       gradientUnits="userSpaceOnUse"
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_106_-902"
+       id="linearGradient11821"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_107_-908"
+       id="linearGradient11823"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_108_-618"
+       id="linearGradient11825"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_109_-773"
+       id="linearGradient11827"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_110_-751"
+       id="linearGradient11829"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_111_-96"
+       id="linearGradient11831"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_112_-727"
+       id="linearGradient11833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_113_-280"
+       id="linearGradient11835"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_114_-97"
+       id="linearGradient11837"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_115_-820"
+       id="linearGradient11839"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_116_-848"
+       id="linearGradient11841"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_117_-194"
+       id="linearGradient11843"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_118_-250"
+       id="linearGradient11845"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_119_-606"
+       id="linearGradient11847"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_120_-395"
+       id="linearGradient11849"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_121_-770"
+       id="linearGradient11851"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_122_-543"
+       id="linearGradient11853"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_123_-726"
+       id="linearGradient11855"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_124_-427"
+       id="linearGradient11857"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_87_-7"
+       id="linearGradient11859"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_88_-910"
+       id="linearGradient11861"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_89_-317"
+       id="linearGradient11863"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_90_-384"
+       id="linearGradient11865"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_91_-871"
+       id="linearGradient11867"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_92_-17"
+       id="linearGradient11869"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_93_-680"
+       id="linearGradient11871"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_94_-24"
+       id="linearGradient11873"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_95_-472"
+       id="linearGradient11875"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_96_-410"
+       id="linearGradient11877"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_97_-458"
+       id="linearGradient11879"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_98_-723"
+       id="linearGradient11881"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_99_-634"
+       id="linearGradient11883"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_100_-34"
+       id="linearGradient11885"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_101_-145"
+       id="linearGradient11887"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_102_-594"
+       id="linearGradient11889"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_103_-322"
+       id="linearGradient11891"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_104_-426"
+       id="linearGradient11893"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_105_-588"
+       id="linearGradient11895"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_81_-401"
+       id="linearGradient5490"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_82_-773"
+       id="linearGradient5492"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_83_-832"
+       id="linearGradient5494"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_84_-677"
+       id="linearGradient5496"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_85_-413"
+       id="radialGradient5498"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.31643347,3.8580342,7.7177487)"
+       cx="160.10159"
+       cy="225.54491"
+       fx="160.10159"
+       fy="225.54491"
+       r="102.7621" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_86_-281"
+       id="linearGradient5500"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_87_-7"
+       id="linearGradient5502"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_88_-910"
+       id="linearGradient5504"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_89_-317"
+       id="linearGradient5506"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_90_-384"
+       id="linearGradient5508"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_91_-871"
+       id="linearGradient5510"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_92_-17"
+       id="linearGradient5512"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_93_-680"
+       id="linearGradient5514"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_94_-24"
+       id="linearGradient5516"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_95_-472"
+       id="linearGradient5518"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_96_-410"
+       id="linearGradient5520"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_97_-458"
+       id="linearGradient5522"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_98_-723"
+       id="linearGradient5524"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_99_-634"
+       id="linearGradient5526"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_100_-34"
+       id="linearGradient5528"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_101_-145"
+       id="linearGradient5530"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_102_-594"
+       id="linearGradient5532"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_103_-322"
+       id="linearGradient5534"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_104_-426"
+       id="linearGradient5536"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_105_-588"
+       id="linearGradient5538"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_106_-902"
+       id="linearGradient5540"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_107_-908"
+       id="linearGradient5542"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_108_-618"
+       id="linearGradient5544"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_109_-773"
+       id="linearGradient5546"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_110_-751"
+       id="linearGradient5548"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_111_-96"
+       id="linearGradient5550"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_112_-727"
+       id="linearGradient5552"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_113_-280"
+       id="linearGradient5554"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_114_-97"
+       id="linearGradient5556"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_115_-820"
+       id="linearGradient5558"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_116_-848"
+       id="linearGradient5560"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_117_-194"
+       id="linearGradient5562"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_118_-250"
+       id="linearGradient5564"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_119_-606"
+       id="linearGradient5566"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_120_-395"
+       id="linearGradient5568"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_121_-770"
+       id="linearGradient5570"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_122_-543"
+       id="linearGradient5572"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_123_-726"
+       id="linearGradient5574"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_124_-427"
+       id="linearGradient5576"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_125_-451"
+       id="linearGradient5578"
+       gradientUnits="userSpaceOnUse"
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_126_-70"
+       id="linearGradient5580"
+       gradientUnits="userSpaceOnUse"
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_127_-555"
+       id="linearGradient5582"
+       gradientUnits="userSpaceOnUse"
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_128_-141"
+       id="linearGradient5584"
+       gradientUnits="userSpaceOnUse"
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_129_-770"
+       id="linearGradient5586"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_130_-72"
+       id="linearGradient5588"
+       gradientUnits="userSpaceOnUse"
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_131_-413"
+       id="linearGradient5590"
+       gradientUnits="userSpaceOnUse"
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_132_-722"
+       id="linearGradient5592"
+       gradientUnits="userSpaceOnUse"
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_133_-214"
+       id="linearGradient5594"
+       gradientUnits="userSpaceOnUse"
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_134_-535"
+       id="linearGradient5596"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_135_-577"
+       id="linearGradient5598"
+       gradientUnits="userSpaceOnUse"
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_136_-920"
+       id="linearGradient5600"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_137_-11"
+       id="linearGradient5602"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_138_-837"
+       id="linearGradient5604"
+       gradientUnits="userSpaceOnUse"
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_139_-626"
+       id="linearGradient5606"
+       gradientUnits="userSpaceOnUse"
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_140_-645"
+       id="linearGradient5608"
+       gradientUnits="userSpaceOnUse"
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_141_-860"
+       id="linearGradient5610"
+       gradientUnits="userSpaceOnUse"
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_142_-935"
+       id="linearGradient5612"
+       gradientUnits="userSpaceOnUse"
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_143_-216"
+       id="linearGradient5614"
+       gradientUnits="userSpaceOnUse"
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_144_-323"
+       id="linearGradient5616"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_126_-463"
+       id="linearGradient5618"
+       gradientUnits="userSpaceOnUse"
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_146_-485"
+       id="linearGradient5620"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_131_-578"
+       id="linearGradient5622"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_148_-757"
+       id="linearGradient5624"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_149_-599"
+       id="linearGradient5626"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_150_-191"
+       id="linearGradient5628"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_136_-980"
+       id="linearGradient5630"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_137_-482"
+       id="linearGradient5632"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_138_-859"
+       id="linearGradient5634"
+       gradientUnits="userSpaceOnUse"
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_140_-471"
+       id="linearGradient5636"
+       gradientUnits="userSpaceOnUse"
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_155_-978"
+       id="linearGradient5638"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_156_-100"
+       id="linearGradient5640"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_157_-792"
+       id="linearGradient5642"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_158_-583"
+       id="linearGradient5644"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)"
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_158_-583"
+       id="linearGradient5977"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_157_-792"
+       id="linearGradient5980"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_156_-100"
+       id="linearGradient5983"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_149_-599"
+       id="linearGradient5998"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_131_-578"
+       id="linearGradient6005"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_146_-485"
+       id="linearGradient6008"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_144_-323"
+       id="linearGradient6012"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_86_-281"
+       id="linearGradient6270"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_85_-413"
+       id="radialGradient6273"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.28581537,11.843244,11.625611)"
+       cx="160.10159"
+       cy="225.54491"
+       fx="160.10159"
+       fy="225.54491"
+       r="102.7621" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_84_-677"
+       id="linearGradient6276"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_83_-832"
+       id="linearGradient6279"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_82_-773"
+       id="linearGradient6282"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_81_-401"
+       id="linearGradient6285"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)"
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487" />
+  </svg:defs>
+  <svg:metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </svg:metadata>
+  <svg:g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <svg:rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </svg:g>
+  <svg:g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </svg:g>
+  <svg:g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <svg:rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <svg:rect
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <svg:rect
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </svg:g>
+  <svg:g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <svg:rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </svg:g>
+  <svg:g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <svg:rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </svg:g>
+  <svg:g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <svg:rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <svg:text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><svg:tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</svg:tspan></svg:text>
+    <svg:rect
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <svg:text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><svg:tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</svg:tspan></svg:text>
+    <svg:text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><svg:tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</svg:tspan></svg:text>
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path166"
+       style="fill:url(#linearGradient6285)"
+       d="m 72.285022,30.416002 c 0.0678,-0.379338 0.105749,-0.762948 0.105749,-1.151448 0,-6.802088 -10.452636,-12.316204 -23.34677,-12.316204 -12.893555,0 -23.345901,5.514422 -23.345901,12.316204 0,0.156072 0.0113,0.310005 0.0226,0.464244 l -0.0226,0 0,38.030426 0.0565,0 c 0.795001,6.42153 10.915035,11.502251 23.289115,11.502251 12.893844,0 23.34677,-5.514728 23.34677,-12.3159 0,-0.388193 -0.03795,-0.772111 -0.10575,-1.151141 l 0,-35.378432 2.9e-4,0 z M 28.183056,29.264554 c 0,-4.67145 [...]
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path181"
+       style="fill:url(#linearGradient6282)"
+       d="m 72.285022,65.794434 0,-36.065636 -46.586632,0 0,38.030426 0.0565,0 c 0.795,6.42153 10.915034,11.502251 23.289115,11.502251 12.893844,0 23.346769,-5.514728 23.346769,-12.3159 0,-0.388499 -0.03767,-0.772415 -0.105749,-1.151141 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path208"
+       style="fill:url(#linearGradient6279)"
+       d="m 72.285022,65.794434 0,-36.065636 -46.586632,0 0,38.030426 0.0565,0 c 0.795,6.42153 10.915034,11.502251 23.289115,11.502251 12.893844,0 23.346769,-5.514728 23.346769,-12.3159 0,-0.388499 -0.03767,-0.772415 -0.105749,-1.151141 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path223"
+       style="fill:url(#linearGradient6276)"
+       d="m 28.183056,29.264554 c 0,4.671453 8.567698,9.875566 20.860945,9.875566 12.294697,0 20.862393,-5.204113 20.862393,-9.875566 0,-4.671452 -8.567696,-9.87526 -20.862393,-9.87526 -12.293247,0 -20.860945,5.204112 -20.860945,9.87526 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path238"
+       style="fill:url(#radialGradient6273)"
+       d="m 28.183056,68.100687 c 0,4.670842 8.567698,9.875566 20.860945,9.875566 12.294697,0 20.862393,-5.204724 20.862393,-9.875566 0,-4.671453 -8.567696,-9.875565 -20.862393,-9.875565 -12.293247,0 -20.860945,5.204112 -20.860945,9.875565 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path253"
+       style="fill:url(#linearGradient6270)"
+       d="m 49.044291,17.86401 c 12.746375,0 23.098766,5.188534 23.335181,11.633887 0.0023,-0.07758 0.0113,-0.155155 0.0113,-0.233343 0,-6.802088 -10.452637,-12.316204 -23.34677,-12.316204 -12.893555,0 -23.345901,5.514422 -23.345901,12.316204 0,0.07818 0.0085,0.155766 0.0113,0.233343 C 25.946104,23.05285 36.299365,17.86401 49.044291,17.86401 z m 20.862393,11.858375 c 0,-0.07483 -0.0085,-0.149658 -0.01362,-0.224488 -0.278423,4.609453 -8.758044,9.642223 -20.848775,9.642223 -12.089573,0 -20 [...]
+    <svg:g
+       id="g255"
+       style="opacity:0.3"
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)">
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7189"
+         y2="109.9408"
+         x2="133.71049"
+         y1="185.7363"
+         x1="57.915001">
+        <svg:stop
+           id="stop7191"
+           offset="0"
+           style="stop-color:#494949;stop-opacity:1" />
+        <svg:stop
+           id="stop7193"
+           offset="0.1654"
+           style="stop-color:#505050;stop-opacity:1" />
+        <svg:stop
+           id="stop7195"
+           offset="0.59490001"
+           style="stop-color:#5d5d5d;stop-opacity:1" />
+        <svg:stop
+           id="stop7197"
+           offset="1"
+           style="stop-color:#616161;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#494949"
+           id="midPointStop267" />
+        <midPointStop
+           offset="0.3051"
+           style="stop-color:#494949"
+           id="midPointStop269" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#616161"
+           id="midPointStop271" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path274"
+         style="opacity:0.5;fill:url(#linearGradient5502)"
+         d="m 113.27,204.767 c 0,0 4.875,-3.118 5.136,-3.283 0.283,-0.149 13.479,-7.03 13.479,-7.03 0.826,-0.429 1.376,-1.161 1.649,-1.994 6.464,1.124 21.759,3.78 21.759,3.78 1.734,0.302 3.451,-0.607 4.068,-2.153 0.094,-0.239 0.16,-0.483 0.195,-0.729 0.197,-1.335 -0.475,-2.685 -1.758,-3.392 0,0 -3.01,-1.651 -6.016,-3.304 0.037,-0.128 0.107,-0.242 0.127,-0.375 l 2.625,-17.944 c 0.135,-0.917 -0.154,-1.822 -0.75,-2.539 5.129,-1.624 6.344,-2.517 6.979,-4.009 0.115,-0.265 0.189,-0.533 0.229,- [...]
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7200"
+         y2="135.90919"
+         x2="116.0225"
+         y1="135.90919"
+         x1="60.370098">
+        <svg:stop
+           id="stop7202"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7204"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop282" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop284" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop286" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon289"
+         style="fill:url(#linearGradient5504)"
+         points="132.056,183.357 140.633,174.849 142.125,167.15 139.32,158.27 84.843,175.25 84.843,175.25 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7207"
+         y2="169.9082"
+         x2="92.127899"
+         y1="169.9082"
+         x1="51.419399">
+        <svg:stop
+           id="stop7209"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7211"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop297" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop299" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop301" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon304"
+         style="fill:url(#linearGradient5506)"
+         points="121.765,158.05 156.248,129.97 144.873,114.294 113.955,138.769 121.765,158.05 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7214"
+         y2="180.6895"
+         x2="128.5298"
+         y1="180.6895"
+         x1="83.349098">
+        <svg:stop
+           id="stop7216"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7218"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop312" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop314" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop316" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon319"
+         style="fill:url(#linearGradient5508)"
+         points="125.395,119.923 107.677,107.498 79.484,122.165 92.939,134.046 125.395,119.923 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7221"
+         y2="143.37891"
+         x2="146.2168"
+         y1="143.37891"
+         x1="68.799301">
+        <svg:stop
+           id="stop7223"
+           offset="0"
+           style="stop-color:#616161;stop-opacity:1" />
+        <svg:stop
+           id="stop7225"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#616161"
+           id="midPointStop327" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#616161"
+           id="midPointStop329" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop331" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon334"
+         style="fill:url(#linearGradient5510)"
+         points="96.885,181.266 54.563,173.814 84.417,132.955 110.454,162.694 132.725,173.673 132.725,173.673 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7228"
+         y2="160.54201"
+         x2="143.7529"
+         y1="160.54201"
+         x1="57.743198">
+        <svg:stop
+           id="stop7230"
+           offset="0"
+           style="stop-color:#494949;stop-opacity:1" />
+        <svg:stop
+           id="stop7232"
+           offset="1"
+           style="stop-color:#c9c9c9;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#494949"
+           id="midPointStop342" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#494949"
+           id="midPointStop344" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#c9c9c9"
+           id="midPointStop346" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon349"
+         style="fill:url(#linearGradient5512)"
+         points="121.806,129.619 106.512,115.473 61.651,140.193 88.272,165.945 148.336,141.143 148.336,141.143 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7235"
+         y2="145.86909"
+         x2="110.6274"
+         y1="145.86909"
+         x1="45.084499">
+        <svg:stop
+           id="stop7237"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7239"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop357" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop359" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop361" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path364"
+         style="fill:url(#linearGradient5514)"
+         d="m 158.486,160.336 c -1.113,2.604 -57.503,15.032 -57.503,15.032 l -8.613,-15.324 22.676,-21.467 43.44,21.759 z" />
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path366"
+         style="fill:#ffffff"
+         d="m 100.272,172.952 -7.788,-13.856 -1.205,1.144 8.612,15.321 c 0,0 56.388,-12.43 57.501,-15.033 l -2.418,-1.21 c -11.548,4.123 -54.702,13.634 -54.702,13.634 z" />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7243"
+         y2="176.6738"
+         x2="65.547401"
+         y1="141.1396"
+         x1="65.547401">
+        <svg:stop
+           id="stop7245"
+           offset="0"
+           style="stop-color:#ffffff;stop-opacity:1" />
+        <svg:stop
+           id="stop7247"
+           offset="1"
+           style="stop-color:#828282;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#ffffff"
+           id="midPointStop374" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#ffffff"
+           id="midPointStop376" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#828282"
+           id="midPointStop378" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path381"
+         style="fill:url(#linearGradient5516)"
+         d="m 147.621,167.168 c 0,0 16.92,-30.427 9.037,-34.182 -7.885,-3.756 -33.425,2.923 -33.425,2.923 l 1.983,21.527 22.405,9.732 z" />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7250"
+         y2="155.5547"
+         x2="83.372101"
+         y1="155.5547"
+         x1="56.244099">
+        <svg:stop
+           id="stop7252"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7254"
+           offset="0.75840002"
+           style="stop-color:#828282;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop389" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop391" />
+        <midPointStop
+           offset="0.7584"
+           style="stop-color:#828282"
+           id="midPointStop393" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path396"
+         style="fill:url(#linearGradient5518)"
+         d="m 140.883,166.304 c 0,0 13.15,-24.866 7.158,-27.87 -5.996,-3.003 -25.558,2.597 -25.558,2.597 l 1.356,17.502 17.044,7.771 z" />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7257"
+         y2="133.41409"
+         x2="73.045403"
+         y1="133.41409"
+         x1="51.5425">
+        <svg:stop
+           id="stop7259"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7261"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop404" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop406" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop408" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon411"
+         style="fill:url(#linearGradient5520)"
+         points="126.527,187.639 148.313,185.825 150.936,167.881 139.32,158.27 131.301,176.68 131.301,176.68 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7264"
+         y2="164.3232"
+         x2="144.998"
+         y1="164.3232"
+         x1="112.6553">
+        <svg:stop
+           id="stop7266"
+           offset="0"
+           style="stop-color:#828282;stop-opacity:1" />
+        <svg:stop
+           id="stop7268"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#828282"
+           id="midPointStop419" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#828282"
+           id="midPointStop421" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop423" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon426"
+         style="fill:url(#linearGradient5522)"
+         points="69.296,153.305 60.444,139.831 66.267,112.375 95.609,121.423 91.811,147.376 91.811,147.376 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7271"
+         y2="123.7505"
+         x2="73.045403"
+         y1="123.7505"
+         x1="51.702599">
+        <svg:stop
+           id="stop7273"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7275"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop434" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop436" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop438" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon441"
+         style="fill:url(#linearGradient5524)"
+         points="148.313,185.825 148.422,185.066 131.301,176.68 126.527,187.639 148.313,185.825 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7278"
+         y2="117.1396"
+         x2="111.8184"
+         y1="117.1396"
+         x1="68.9487">
+        <svg:stop
+           id="stop7280"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7282"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop449" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop451" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop453" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon456"
+         style="fill:url(#linearGradient5526)"
+         points="89.172,174.627 117.809,171.763 126.942,184.804 126.942,184.804 130.379,189.709 111.222,201.96 89.426,187.73 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7285"
+         y2="121.7036"
+         x2="101.0723"
+         y1="121.7036"
+         x1="43.173302">
+        <svg:stop
+           id="stop7287"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7289"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop464" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop466" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop468" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon471"
+         style="fill:url(#linearGradient5528)"
+         points="111.507,185.172 99.891,175.561 110.542,176.925 131.85,179.654 155.959,192.898 155.959,192.898 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7292"
+         y2="181.83591"
+         x2="102.8101"
+         y1="181.83591"
+         x1="64.091797">
+        <svg:stop
+           id="stop7294"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7296"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop479" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop481" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop483" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon486"
+         style="fill:url(#linearGradient5530)"
+         points="128.691,112.221 104.178,131.423 143.404,130.354 143.404,130.354 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7299"
+         y2="102.415"
+         x2="89.291496"
+         y1="116.5332"
+         x1="89.291496">
+        <svg:stop
+           id="stop7301"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7303"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop494" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop496" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop498" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon501"
+         style="fill:url(#linearGradient5532)"
+         points="111.32,201.286 130.354,189.884 130.152,189.613 89.576,187.807 111.32,201.286 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7306"
+         y2="166.78999"
+         x2="103.6514"
+         y1="166.78999"
+         x1="64.091797">
+        <svg:stop
+           id="stop7308"
+           offset="0.6124"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7310"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0.6124"
+           style="stop-color:#b6b6b6"
+           id="midPointStop509" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop511" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop513" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon516"
+         style="fill:url(#linearGradient5534)"
+         points="120.378,147.894 110.242,136.989 102.93,134.337 104.178,131.423 143.404,130.354 143.404,130.354 " />
+      <svg:polygon
+         id="polygon518"
+         style="fill:#ffffff"
+         points="138.563,130.486 119.367,145.108 119.367,145.108 109.23,134.205 103.826,132.243 102.93,134.337 110.242,136.989 120.378,147.894 143.404,130.354 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7314"
+         y2="135.68359"
+         x2="121.7998"
+         y1="186.7813"
+         x1="121.7998">
+        <svg:stop
+           id="stop7316"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7318"
+           offset="0.1974"
+           style="stop-color:#cacaca;stop-opacity:1" />
+        <svg:stop
+           id="stop7320"
+           offset="0.47440001"
+           style="stop-color:#dfdfdf;stop-opacity:1" />
+        <svg:stop
+           id="stop7322"
+           offset="0.74510002"
+           style="stop-color:#ececec;stop-opacity:1" />
+        <svg:stop
+           id="stop7324"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop532" />
+        <midPointStop
+           offset="0.3051"
+           style="stop-color:#b6b6b6"
+           id="midPointStop534" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop536" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon539"
+         style="fill:url(#linearGradient5536)"
+         points="106.512,115.473 69.052,136.117 63.922,142.389 86.595,164.323 106.752,115.696 106.752,115.696 " />
+      <svg:linearGradient
+         gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7327"
+         y2="120.8201"
+         x2="107.8923"
+         y1="153.74899"
+         x1="140.8213">
+        <svg:stop
+           id="stop7329"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7331"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop547" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop549" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop551" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon554"
+         style="fill:url(#linearGradient5538)"
+         points="55.476,172.563 109.515,161.62 84.417,132.955 84.417,132.955 " />
+      <svg:polygon
+         id="polygon556"
+         style="fill:#ffffff"
+         points="60.841,171.478 86.909,135.799 84.417,132.955 55.476,172.563 60.841,171.478 " />
+    </svg:g>
+    <svg:g
+       id="g559"
+       style="opacity:0.3"
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)">
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7336"
+         y2="121.5014"
+         x2="174.5889"
+         y1="186.5674"
+         x1="109.5229">
+        <svg:stop
+           id="stop7338"
+           offset="0"
+           style="stop-color:#494949;stop-opacity:1" />
+        <svg:stop
+           id="stop7340"
+           offset="0.1654"
+           style="stop-color:#505050;stop-opacity:1" />
+        <svg:stop
+           id="stop7342"
+           offset="0.59490001"
+           style="stop-color:#5d5d5d;stop-opacity:1" />
+        <svg:stop
+           id="stop7344"
+           offset="1"
+           style="stop-color:#616161;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#494949"
+           id="midPointStop571" />
+        <midPointStop
+           offset="0.3051"
+           style="stop-color:#494949"
+           id="midPointStop573" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#616161"
+           id="midPointStop575" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path578"
+         style="opacity:0.5;fill:url(#linearGradient5540)"
+         d="m 103.573,172.271 c 0,0 2.478,4.375 2.609,4.609 0.112,0.251 5.306,11.897 5.306,11.897 0.322,0.728 0.974,1.27 1.75,1.602 -1.818,5.126 -6.123,17.256 -6.123,17.256 -0.488,1.372 0.202,2.89 1.633,3.592 0.221,0.107 0.451,0.193 0.686,0.254 1.274,0.331 2.659,-0.041 3.49,-0.998 0,0 1.943,-2.239 3.886,-4.479 0.12,0.047 0.223,0.119 0.351,0.152 l 17.126,4.45 c 0.877,0.229 1.787,0.107 2.551,-0.284 0.998,4.39 1.729,5.495 3.104,6.206 0.246,0.128 0.498,0.224 0.758,0.291 1.316,0.342 2.75,-0.0 [...]
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7347"
+         y2="141.5303"
+         x2="158.6631"
+         y1="141.5303"
+         x1="112.7676">
+        <svg:stop
+           id="stop7349"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7351"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop586" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop588" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop590" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon593"
+         style="fill:url(#linearGradient5542)"
+         points="122.243,190.343 129.539,198.433 136.845,200.641 145.785,199.496 135.434,152.891 135.434,152.891 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7354"
+         y2="173.58591"
+         x2="139.75681"
+         y1="173.58591"
+         x1="106.2578">
+        <svg:stop
+           id="stop7356"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7358"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop601" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop603" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop605" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon608"
+         style="fill:url(#linearGradient5544)"
+         points="147.975,185.212 171.355,216.941 187.855,209.686 167.576,181.325 147.975,185.212 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7361"
+         y2="184.4707"
+         x2="170.3076"
+         y1="184.4707"
+         x1="132.9424">
+        <svg:stop
+           id="stop7363"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7365"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop616" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop618" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop620" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon623"
+         style="fill:url(#linearGradient5546)"
+         points="184.586,193.08 198.646,180.232 187.582,155.356 174.529,164.799 184.586,193.08 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7368"
+         y2="149.56641"
+         x2="183.70309"
+         y1="149.56641"
+         x1="119.5918">
+        <svg:stop
+           id="stop7370"
+           offset="0"
+           style="stop-color:#616161;stop-opacity:1" />
+        <svg:stop
+           id="stop7372"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#616161"
+           id="midPointStop631" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#616161"
+           id="midPointStop633" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop635" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon638"
+         style="fill:url(#linearGradient5548)"
+         points="128.238,161.936 140.242,128.389 176.551,157.991 144.74,175.391 131.57,192.135 131.57,192.135 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7375"
+         y2="165.5703"
+         x2="182.47749"
+         y1="165.5703"
+         x1="111.2227">
+        <svg:stop
+           id="stop7377"
+           offset="0"
+           style="stop-color:#494949;stop-opacity:1" />
+        <svg:stop
+           id="stop7379"
+           offset="1"
+           style="stop-color:#c9c9c9;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#494949"
+           id="midPointStop646" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#494949"
+           id="midPointStop648" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#c9c9c9"
+           id="midPointStop650" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon653"
+         style="fill:url(#linearGradient5550)"
+         points="175.574,188.904 191.035,178.255 172.088,138.496 144.082,156.887 161.396,209.053 161.396,209.053 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7382"
+         y2="151.52341"
+         x2="154.5625"
+         y1="151.52341"
+         x1="100.2744">
+        <svg:stop
+           id="stop7384"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7386"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop661" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop663" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop665" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path668"
+         style="fill:url(#linearGradient5552)"
+         d="m 141.617,214.857 c -2.4,-1.243 -8.114,-48.821 -8.114,-48.821 l 15.849,-5.049 18.287,21.253 -26.022,32.617 z" />
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path670"
+         style="fill:#ffffff"
+         d="m 135.928,165.769 14.33,-4.566 -0.973,-1.13 -15.846,5.05 c 0,0 5.711,47.579 8.113,48.819 l 1.449,-1.813 c -2.702,-9.951 -7.073,-46.36 -7.073,-46.36 z" />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7390"
+         y2="179.5137"
+         x2="117.7603"
+         y1="146.1875"
+         x1="117.7603">
+        <svg:stop
+           id="stop7392"
+           offset="0"
+           style="stop-color:#ffffff;stop-opacity:1" />
+        <svg:stop
+           id="stop7394"
+           offset="1"
+           style="stop-color:#828282;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#ffffff"
+           id="midPointStop678" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#ffffff"
+           id="midPointStop680" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#828282"
+           id="midPointStop682" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path685"
+         style="fill:url(#linearGradient5554)"
+         d="m 136.209,205.119 c 0,0 27.635,17.714 32.168,11.769 4.535,-5.944 0.93,-27.629 0.93,-27.629 l -21.125,-1.155 -11.973,17.015 z" />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7397"
+         y2="159.85741"
+         x2="132.4502"
+         y1="159.85741"
+         x1="109.9058">
+        <svg:stop
+           id="stop7399"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7401"
+           offset="0.75840002"
+           style="stop-color:#828282;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop693" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop695" />
+        <midPointStop
+           offset="0.7584"
+           style="stop-color:#828282"
+           id="midPointStop697" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path700"
+         style="fill:url(#linearGradient5556)"
+         d="m 137.806,199.736 c 0,0 22.663,13.925 26.255,9.423 3.592,-4.5 0.359,-21.171 0.359,-21.171 l -17.146,-1.147 -9.468,12.895 z" />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7404"
+         y2="139.24319"
+         x2="122.7686"
+         y1="139.24319"
+         x1="105.1421">
+        <svg:stop
+           id="stop7406"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7408"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop708" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop710" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop712" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon715"
+         style="fill:url(#linearGradient5558)"
+         points="118.709,185.285 118.015,203.28 135.143,207.731 145.785,199.496 128.813,190.587 128.813,190.587 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7411"
+         y2="169.791"
+         x2="183.51759"
+         y1="169.791"
+         x1="156.75">
+        <svg:stop
+           id="stop7413"
+           offset="0"
+           style="stop-color:#828282;stop-opacity:1" />
+        <svg:stop
+           id="stop7415"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#828282"
+           id="midPointStop723" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#828282"
+           id="midPointStop725" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop727" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon730"
+         style="fill:url(#linearGradient5560)"
+         points="158.496,143.041 172.574,137.558 198.578,145.84 186.486,168.6 161.715,162.163 161.715,162.163 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7418"
+         y2="130.2363"
+         x2="122.7686"
+         y1="130.2363"
+         x1="105.1421">
+        <svg:stop
+           id="stop7420"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7422"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop738" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop740" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop742" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon745"
+         style="fill:url(#linearGradient5562)"
+         points="118.015,203.28 118.74,203.469 128.813,190.587 118.709,185.285 118.015,203.28 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7425"
+         y2="124.335"
+         x2="155.19341"
+         y1="124.335"
+         x1="119.3262">
+        <svg:stop
+           id="stop7427"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7429"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop753" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop755" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop757" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon760"
+         style="fill:url(#linearGradient5564)"
+         points="135.552,156.504 135.106,180.222 121.416,185.987 121.416,185.987 116.264,188.158 106.53,170.962 122.801,155.021 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7432"
+         y2="128.2021"
+         x2="146.27341"
+         y1="128.2021"
+         x1="97.902802">
+        <svg:stop
+           id="stop7434"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7436"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop768" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop770" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop772" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon775"
+         style="fill:url(#linearGradient5566)"
+         points="122.798,173.355 133.439,165.122 130.914,173.632 125.862,190.652 110.287,208.604 110.287,208.604 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7439"
+         y2="185.19141"
+         x2="148.7822"
+         y1="185.19141"
+         x1="116.7427">
+        <svg:stop
+           id="stop7441"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7443"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop783" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop785" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop787" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon790"
+         style="fill:url(#linearGradient5568)"
+         points="191.693,196.759 175.811,174.299 172.428,206.42 172.428,206.42 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7446"
+         y2="110.5449"
+         x2="136.19341"
+         y1="123.416"
+         x1="136.19341">
+        <svg:stop
+           id="stop7448"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7450"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop798" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop800" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop802" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon805"
+         style="fill:url(#linearGradient5570)"
+         points="107.172,171.128 116.099,188.115 116.385,187.987 122.71,155.135 107.172,171.128 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7453"
+         y2="170.68159"
+         x2="149.4102"
+         y1="170.68159"
+         x1="116.7427">
+        <svg:stop
+           id="stop7455"
+           offset="0.6124"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7457"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0.6124"
+           style="stop-color:#b6b6b6"
+           id="midPointStop813" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop815" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop817" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon820"
+         style="fill:url(#linearGradient5572)"
+         points="157.99,185.389 169.721,178.526 173.121,172.904 175.811,174.299 172.428,206.42 172.428,206.42 " />
+      <svg:polygon
+         id="polygon822"
+         style="fill:#ffffff"
+         points="172.846,202.457 160.811,184.922 160.811,184.922 172.541,178.061 175.053,173.908 173.121,172.904 169.721,178.526 157.99,185.389 172.428,206.42 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7461"
+         y2="142.41209"
+         x2="164.56641"
+         y1="190.0674"
+         x1="164.56641">
+        <svg:stop
+           id="stop7463"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7465"
+           offset="0.1974"
+           style="stop-color:#cacaca;stop-opacity:1" />
+        <svg:stop
+           id="stop7467"
+           offset="0.47440001"
+           style="stop-color:#dfdfdf;stop-opacity:1" />
+        <svg:stop
+           id="stop7469"
+           offset="0.74510002"
+           style="stop-color:#ececec;stop-opacity:1" />
+        <svg:stop
+           id="stop7471"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop836" />
+        <midPointStop
+           offset="0.3051"
+           style="stop-color:#b6b6b6"
+           id="midPointStop838" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop840" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon843"
+         style="fill:url(#linearGradient5574)"
+         points="191.035,178.255 175.211,145.055 169.699,140.064 145.848,155.728 190.789,178.422 190.789,178.422 " />
+      <svg:linearGradient
+         gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7474"
+         y2="129.86349"
+         x2="152.1692"
+         y1="159.6348"
+         x1="181.9404">
+        <svg:stop
+           id="stop7476"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7478"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop851" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop853" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop855" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon858"
+         style="fill:url(#linearGradient5576)"
+         points="141.352,129.293 145.891,174.763 176.551,157.991 176.551,157.991 " />
+      <svg:polygon
+         id="polygon860"
+         style="fill:#ffffff"
+         points="141.803,133.809 173.508,159.654 176.551,157.991 141.352,129.293 141.803,133.809 " />
+    </svg:g>
+    <svg:g
+       id="g863"
+       style="opacity:0.3"
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)">
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7483"
+         y2="55.553001"
+         x2="171.70821"
+         y1="138.93359"
+         x1="88.327599">
+        <svg:stop
+           id="stop7485"
+           offset="0"
+           style="stop-color:#494949;stop-opacity:1" />
+        <svg:stop
+           id="stop7487"
+           offset="0.1654"
+           style="stop-color:#505050;stop-opacity:1" />
+        <svg:stop
+           id="stop7489"
+           offset="0.59490001"
+           style="stop-color:#5d5d5d;stop-opacity:1" />
+        <svg:stop
+           id="stop7491"
+           offset="1"
+           style="stop-color:#616161;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#494949"
+           id="midPointStop875" />
+        <midPointStop
+           offset="0.3051"
+           style="stop-color:#494949"
+           id="midPointStop877" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#616161"
+           id="midPointStop879" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path882"
+         style="opacity:0.5;fill:url(#linearGradient5578)"
+         d="m 115.615,46.039 c 0,0 -5.016,3.934 -5.284,4.142 -0.297,0.194 -14.134,9.203 -14.134,9.203 -0.865,0.563 -1.369,1.407 -1.54,2.318 -7.526,-0.311 -25.33,-1.042 -25.33,-1.042 -2.018,-0.085 -3.815,1.102 -4.258,2.81 -0.067,0.264 -0.104,0.53 -0.104,0.793 0,1.43 0.985,2.757 2.563,3.327 0,0 3.689,1.331 7.376,2.662 -0.021,0.14 -0.082,0.27 -0.082,0.412 l 0,19.212 c 0,0.982 0.478,1.896 1.274,2.567 -5.551,2.397 -6.783,3.499 -7.258,5.153 -0.085,0.294 -0.126,0.586 -0.126,0.878 0,1.476 1.051, [...]
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7494"
+         y2="84.741203"
+         x2="152.7852"
+         y1="84.741203"
+         x1="89.107903">
+        <svg:stop
+           id="stop7496"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7498"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop890" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop892" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop894" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon897"
+         style="fill:url(#linearGradient5580)"
+         points="97.847,71.068 89.523,81.166 89.108,89.458 93.768,98.414 152.785,73.231 152.785,73.231 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7501"
+         y2="120.8281"
+         x2="125.7993"
+         y1="120.8281"
+         x1="79.251503">
+        <svg:stop
+           id="stop7503"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7505"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop905" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop907" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop909" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon912"
+         style="fill:url(#linearGradient5582)"
+         points="113.732,96.279 79.251,130.437 94.767,145.377 125.799,115.492 113.732,96.279 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7508"
+         y2="132.56931"
+         x2="167.68359"
+         y1="132.56931"
+         x1="115.9443">
+        <svg:stop
+           id="stop7510"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7512"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop920" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop922" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop924" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon927"
+         style="fill:url(#linearGradient5584)"
+         points="115.944,136.841 138.117,147.512 167.684,128.301 150.438,117.627 115.944,136.841 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7515"
+         y2="93.078598"
+         x2="187.3965"
+         y1="93.078598"
+         x1="98.694298">
+        <svg:stop
+           id="stop7517"
+           offset="0"
+           style="stop-color:#616161;stop-opacity:1" />
+        <svg:stop
+           id="stop7519"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#616161"
+           id="midPointStop935" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#616161"
+           id="midPointStop937" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop939" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon942"
+         style="fill:url(#linearGradient5586)"
+         points="138.117,68.53 187.396,70.664 160.293,117.627 125.799,89.876 98.694,81.337 98.694,81.337 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7522"
+         y2="111.2231"
+         x2="184.93159"
+         y1="111.2231"
+         x1="86.376503">
+        <svg:stop
+           id="stop7524"
+           offset="0"
+           style="stop-color:#494949;stop-opacity:1" />
+        <svg:stop
+           id="stop7526"
+           offset="1"
+           style="stop-color:#c9c9c9;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#494949"
+           id="midPointStop950" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#494949"
+           id="midPointStop952" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#c9c9c9"
+           id="midPointStop954" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon957"
+         style="fill:url(#linearGradient5588)"
+         points="118.406,126.166 138.117,138.974 184.932,106.953 150.438,83.473 86.376,117.627 86.376,117.627 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7529"
+         y2="95.561501"
+         x2="146.76559"
+         y1="95.561501"
+         x1="71.667503">
+        <svg:stop
+           id="stop7531"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7533"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop965" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop967" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop969" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path972"
+         style="fill:url(#linearGradient5590)"
+         d="m 71.667,98.822 c 0.833,-2.886 62.778,-23.54 62.778,-23.54 L 146.765,90.226 124.59,115.84 71.667,98.822 z" />
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path974"
+         style="fill:#ffffff"
+         d="m 135.654,77.726 11.141,13.514 1.178,-1.363 -12.318,-14.942 c 0,0 -61.947,20.654 -62.779,23.539 l 2.945,0.947 C 88.249,93.53 135.654,77.726 135.654,77.726 z" />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7537"
+         y2="127.8228"
+         x2="95.352097"
+         y1="90.179703"
+         x1="95.352097">
+        <svg:stop
+           id="stop7539"
+           offset="0"
+           style="stop-color:#ffffff;stop-opacity:1" />
+        <svg:stop
+           id="stop7541"
+           offset="1"
+           style="stop-color:#828282;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#ffffff"
+           id="midPointStop982" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#ffffff"
+           id="midPointStop984" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#828282"
+           id="midPointStop986" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path989"
+         style="fill:url(#linearGradient5592)"
+         d="m 82.866,90.18 c 0,0 -14.153,34.255 -4.582,37.14 9.575,2.885 37.458,-7.572 37.458,-7.572 L 109.917,97.392 82.866,90.18 z" />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7544"
+         y2="105.5117"
+         x2="115.7422"
+         y1="105.5117"
+         x1="84.628403">
+        <svg:stop
+           id="stop7546"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7548"
+           offset="0.75840002"
+           style="stop-color:#828282;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop997" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop999" />
+        <midPointStop
+           offset="0.7584"
+           style="stop-color:#828282"
+           id="midPointStop1001" />
+      </svg:linearGradient>
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path1004"
+         style="fill:url(#linearGradient5594)"
+         d="m 90.66,90.18 c 0,0 -10.799,27.904 -3.496,30.254 7.304,2.35 28.579,-6.17 28.579,-6.17 L 111.296,96.054 90.66,90.18 z" />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7551"
+         y2="82.119102"
+         x2="103.4116"
+         y1="82.119102"
+         x1="78.984901">
+        <svg:stop
+           id="stop7553"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7555"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop1012" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop1014" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop1016" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1019"
+         style="fill:url(#linearGradient5596)"
+         points="103.412,65.824 78.985,70.664 78.985,89.876 93.768,98.414 99.813,77.985 99.813,77.985 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7558"
+         y2="115.5073"
+         x2="186.3633"
+         y1="115.5073"
+         x1="149.50391">
+        <svg:stop
+           id="stop7560"
+           offset="0"
+           style="stop-color:#828282;stop-opacity:1" />
+        <svg:stop
+           id="stop7562"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#828282"
+           id="midPointStop1027" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#828282"
+           id="midPointStop1029" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop1031" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1034"
+         style="fill:url(#linearGradient5598)"
+         points="174.08,94.203 186.363,107.171 184.316,136.812 149.504,131.253 149.504,103.466 149.504,103.466 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7565"
+         y2="71.9048"
+         x2="103.4116"
+         y1="71.9048"
+         x1="78.984901">
+        <svg:stop
+           id="stop7567"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7569"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop1042" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop1044" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop1046" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1049"
+         style="fill:url(#linearGradient5600)"
+         points="78.985,70.664 78.985,71.477 99.813,77.985 103.412,65.824 78.985,70.664 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7572"
+         y2="65.025398"
+         x2="147.9727"
+         y1="65.025398"
+         x1="98.694298">
+        <svg:stop
+           id="stop7574"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7576"
+           offset="1"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop1057" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop1059" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#b6b6b6"
+           id="midPointStop1061" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1064"
+         style="fill:url(#linearGradient5602)"
+         points="147.973,74.469 115.944,81.337 103.412,68.86 103.412,68.86 98.694,64.167 118.406,48.714 145.51,60.732 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7579"
+         y2="69.597198"
+         x2="135.6543"
+         y1="69.597198"
+         x1="69.128403">
+        <svg:stop
+           id="stop7581"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7583"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop1072" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop1074" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop1076" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1079"
+         style="fill:url(#linearGradient5604)"
+         points="120.87,66.396 135.654,74.934 123.334,74.934 98.694,74.934 69.128,64.261 69.128,64.261 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7586"
+         y2="133.6367"
+         x2="138.1172"
+         y1="133.6367"
+         x1="93.767601">
+        <svg:stop
+           id="stop7588"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7590"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop1087" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop1089" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop1091" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1094"
+         style="fill:url(#linearGradient5606)"
+         points="113.48,145.377 138.117,121.896 93.768,128.301 93.768,128.301 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7593"
+         y2="49.432598"
+         x2="122.0112"
+         y1="64.238297"
+         x1="122.0112">
+        <svg:stop
+           id="stop7595"
+           offset="0"
+           style="stop-color:#dadada;stop-opacity:1" />
+        <svg:stop
+           id="stop7597"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#dadada"
+           id="midPointStop1102" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#dadada"
+           id="midPointStop1104" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop1106" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1109"
+         style="fill:url(#linearGradient5608)"
+         points="118.406,49.433 98.694,63.979 98.968,64.238 145.328,60.674 118.406,49.433 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7600"
+         y2="117.5337"
+         x2="139.0508"
+         y1="117.5337"
+         x1="93.767601">
+        <svg:stop
+           id="stop7602"
+           offset="0.6124"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7604"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0.6124"
+           style="stop-color:#b6b6b6"
+           id="midPointStop1117" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop1119" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop1121" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1124"
+         style="fill:url(#linearGradient5610)"
+         points="116.991,106.767 130.31,116.862 139.051,118.665 138.117,121.896 93.768,128.301 93.768,128.301 " />
+      <svg:polygon
+         id="polygon1126"
+         style="fill:#ffffff"
+         points="99.242,127.511 118.602,109.557 118.602,109.557 131.92,119.653 138.381,120.987 139.051,118.665 130.31,116.862 116.991,106.767 93.768,128.301 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7608"
+         y2="84.952599"
+         x2="159.9014"
+         y1="138.9736"
+         x1="159.9014">
+        <svg:stop
+           id="stop7610"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7612"
+           offset="0.1974"
+           style="stop-color:#cacaca;stop-opacity:1" />
+        <svg:stop
+           id="stop7614"
+           offset="0.47440001"
+           style="stop-color:#dfdfdf;stop-opacity:1" />
+        <svg:stop
+           id="stop7616"
+           offset="0.74510002"
+           style="stop-color:#ececec;stop-opacity:1" />
+        <svg:stop
+           id="stop7618"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop1140" />
+        <midPointStop
+           offset="0.3051"
+           style="stop-color:#b6b6b6"
+           id="midPointStop1142" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop1144" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1147"
+         style="fill:url(#linearGradient5612)"
+         points="138.117,138.974 177.211,112.233 181.994,104.952 152.611,84.952 137.809,138.772 137.809,138.772 " />
+      <svg:linearGradient
+         gradientUnits="userSpaceOnUse"
+         id="linearGradient7621"
+         y2="67.852097"
+         x2="143.1671"
+         y1="104.6089"
+         x1="179.9238">
+        <svg:stop
+           id="stop7623"
+           offset="0"
+           style="stop-color:#b6b6b6;stop-opacity:1" />
+        <svg:stop
+           id="stop7625"
+           offset="1"
+           style="stop-color:#f0f0f0;stop-opacity:1" />
+        <midPointStop
+           offset="0"
+           style="stop-color:#b6b6b6"
+           id="midPointStop1155" />
+        <midPointStop
+           offset="0.5"
+           style="stop-color:#b6b6b6"
+           id="midPointStop1157" />
+        <midPointStop
+           offset="1"
+           style="stop-color:#f0f0f0"
+           id="midPointStop1159" />
+      </svg:linearGradient>
+      <svg:polygon
+         id="polygon1162"
+         style="fill:url(#linearGradient5614)"
+         points="186.566,72.101 127.044,90.88 160.293,117.627 160.293,117.627 " />
+      <svg:polygon
+         id="polygon1164"
+         style="fill:#ffffff"
+         points="180.656,73.965 156.992,114.973 160.293,117.627 186.566,72.101 180.656,73.965 " />
+    </svg:g>
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1184"
+       style="opacity:0.5;fill:url(#linearGradient6012)"
+       d="m 66.196777,29.493316 c 0,0 -9.084272,-0.414459 -10.7299,-0.489593 -0.12632,-0.738821 -0.27437,-1.613554 -0.27437,-1.613554 -0.0089,-0.05315 -0.03013,-0.102317 -0.04751,-0.153322 0.0034,-0.0339 0.0089,-0.06749 0.0089,-0.100179 0,-0.436755 -0.283639,-0.838388 -0.734448,-1.013395 0,0 -4.903277,-1.90401 -4.981212,-1.934248 -0.07474,-0.03451 -2.739913,-1.280335 -2.739913,-1.280335 -0.446174,-0.20891 -0.987088,-0.14416 -1.358802,0.163401 0,0 -1.453252,1.201536 -1.530898,1.265065 -0. [...]
+    <svg:polygon
+       id="polygon1186"
+       style="fill:url(#linearGradient5618)"
+       points="97.847,71.068 89.523,81.166 89.108,89.458 93.768,98.414 152.785,73.231 152.785,73.231 "
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1201"
+       style="fill:url(#linearGradient6008)"
+       d="m 40.437192,33.852932 7.852949,2.608012 3.083235,2.615342 c 4.527505,-0.248309 8.456732,-1.210393 11.519976,-2.559144 l 3.242873,-5.923995 -14.277273,-0.651774 -11.42176,3.911559 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1203"
+       style="opacity:0.5;fill:url(#linearGradient6005)"
+       d="m 32.606841,39.193263 c 0.241341,-0.881452 18.188248,-7.189671 18.188248,-7.189671 l 3.56939,4.564251 -6.424613,7.823119 -15.333025,-5.197699 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1218"
+       style="fill:#00ff00"
+       d="m 36.83912,37.172581 c 3.342246,1.203369 7.499196,1.967539 12.204881,1.967539 1.138033,0 2.244196,-0.0449 3.314434,-0.129805 l 2.006044,-2.442472 -3.56939,-4.564251 c 0,0 -8.581314,3.016364 -13.955969,5.168989 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1220"
+       style="fill:#00ff00"
+       d="m 36.883157,37.189074 c 0.378089,0.135303 0.766607,0.264802 1.164976,0.388499 5.381321,-2.115974 13.097231,-4.827831 13.097231,-4.827831 l 3.227807,4.127494 0.341293,-0.416292 -3.56881,-4.56364 c -2.9e-4,0 -8.914205,3.133036 -14.262497,5.29177 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1235"
+       style="opacity:0.5;fill:url(#linearGradient5998)"
+       d="m 44.206202,38.857909 -0.118207,-0.510057 -5.978439,-1.794059 c 0,0 -0.132984,0.363454 -0.32478,0.941621 1.916229,0.613901 4.072639,1.084559 6.421426,1.362495 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1250"
+       style="fill:#00ff00"
+       d="m 34.727036,36.307621 c 1.356774,0.633144 2.90042,1.187182 4.599067,1.635239 l 1.435579,-5.113402 1.042714,-3.714256 -7.07707,1.47825 0,5.714169 -2.9e-4,0 z" />
+    <svg:polygon
+       id="polygon1252"
+       style="fill:url(#linearGradient5630)"
+       points="78.985,70.664 78.985,71.477 99.813,77.985 103.412,65.824 78.985,70.664 "
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)" />
+    <svg:polygon
+       id="polygon1254"
+       style="fill:url(#linearGradient5632)"
+       points="147.973,74.469 115.944,81.337 103.412,68.86 103.412,68.86 98.694,64.167 118.406,48.714 145.51,60.732 "
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)" />
+    <svg:polygon
+       id="polygon1256"
+       style="fill:#00ff00"
+       points="120.87,66.396 135.654,74.934 123.334,74.934 98.694,74.934 69.128,64.261 69.128,64.261 "
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)" />
+    <svg:polygon
+       id="polygon1258"
+       style="fill:#00ff00"
+       points="118.406,49.433 98.694,63.979 98.968,64.238 145.328,60.674 118.406,49.433 "
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)" />
+    <svg:polygon
+       id="polygon1260"
+       style="opacity:0.5;fill:#ffffff"
+       points="99.242,127.511 118.602,109.557 118.602,109.557 131.92,119.653 138.381,120.987 139.051,118.665 130.31,116.862 116.991,106.767 93.768,128.301 "
+       transform="matrix(0.28972326,0,0,0.30542356,11.843244,9.0106962)" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1275"
+       style="fill:#00ff00"
+       d="m 51.373376,39.07598 c 4.527505,-0.248309 8.456442,-1.210393 11.519397,-2.558838 l 3.002981,-5.485407 -17.244907,5.735855 2.722529,2.30839 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1277"
+       style="fill:#ffffff"
+       d="m 61.104601,37.226641 c 0.625802,-0.221431 1.220604,-0.459357 1.788172,-0.709193 l 3.002981,-5.485407 -1.712264,0.569309 -3.078889,5.625291 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1292"
+       style="fill:url(#linearGradient5983)"
+       d="m 49.614756,39.285501 0.812674,-0.141106 c 0,0 -0.302761,0.01771 -0.812674,0.141106 z m 0,0 -4.467243,0.774249 -2.950543,0 c 0,0 -7.764583,-4.728262 -9.006916,-1.677692 -2.045156,5.490294 -0.978106,31.079901 -0.686934,37.247931 1.61289,0.856101 3.462193,1.58637 5.492284,2.162704 -0.07591,-2.070161 -0.175283,-4.605177 -0.301892,-7.68354 -1.060096,-25.767975 8.956506,-30.105296 11.921244,-30.823652 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1307"
+       style="opacity:0.8;fill:url(#linearGradient5980)"
+       d="m 29.308053,34.111016 c 0,0 -1.039528,31.901795 -0.741113,38.744506 0.500932,0.481652 1.058938,0.945285 1.673732,1.3854 0.0087,-5.406608 0.113281,-38.402126 1.396466,-37.841673 1.397625,0.609625 -2.329085,-2.288233 -2.329085,-2.288233 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path1322"
+       style="fill:url(#linearGradient5977)"
+       d="m 49.044291,16.94835 c -12.893555,0 -23.345901,5.514422 -23.345901,12.316204 0,6.802088 10.452346,12.316206 23.345901,12.316206 12.893844,0 23.34677,-5.514118 23.34677,-12.316206 C 72.390771,22.462772 61.938135,16.94835 49.044291,16.94835 z m 0,22.19177 c -12.293537,0 -20.860945,-5.204113 -20.860945,-9.875566 0,-4.671452 8.567697,-9.87526 20.860945,-9.87526 12.294696,0 20.862393,5.203808 20.862393,9.87526 0,4.671453 -8.567697,9.875566 -20.862393,9.875566 z" />
+  </svg:g>
+</svg:svg>
diff --git a/interface/images/menu/desktop-effects.svg b/interface/images/menu/desktop-effects.svg
new file mode 100755
index 0000000..96112aa
--- /dev/null
+++ b/interface/images/menu/desktop-effects.svg
@@ -0,0 +1,3910 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.1 r9760"
+   version="1.0"
+   sodipodi:docname="desktop-effects.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="enable-background:new">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.9162227"
+     inkscape:cx="50.737921"
+     inkscape:cy="57.876262"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer4"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1056"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient4223">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop4225" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop4227" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4215">
+      <stop
+         style="stop-color:#ffb800;stop-opacity:1;"
+         offset="0"
+         id="stop4217" />
+      <stop
+         style="stop-color:#ffb800;stop-opacity:0;"
+         offset="1"
+         id="stop4219" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4193">
+      <stop
+         style="stop-color:#a07ada;stop-opacity:1;"
+         offset="0"
+         id="stop4195" />
+      <stop
+         style="stop-color:#7137c8;stop-opacity:1;"
+         offset="1"
+         id="stop4197" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4185">
+      <stop
+         style="stop-color:#7137c8;stop-opacity:1;"
+         offset="0"
+         id="stop4187" />
+      <stop
+         style="stop-color:#7137c8;stop-opacity:0;"
+         offset="1"
+         id="stop4189" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4163">
+      <stop
+         style="stop-color:#f17000;stop-opacity:1;"
+         offset="0"
+         id="stop4165" />
+      <stop
+         style="stop-color:#f12d00;stop-opacity:1;"
+         offset="1"
+         id="stop4167" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4153">
+      <stop
+         style="stop-color:#ff430a;stop-opacity:1;"
+         offset="0"
+         id="stop4155" />
+      <stop
+         id="stop4161"
+         offset="0.5"
+         style="stop-color:#d44f00;stop-opacity:0.27906978;" />
+      <stop
+         style="stop-color:#d40000;stop-opacity:0;"
+         offset="1"
+         id="stop4157" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4129">
+      <stop
+         style="stop-color:#65ff65;stop-opacity:1;"
+         offset="0"
+         id="stop4131" />
+      <stop
+         style="stop-color:#47d900;stop-opacity:1;"
+         offset="1"
+         id="stop4133" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4121">
+      <stop
+         style="stop-color:#6dd500;stop-opacity:1;"
+         offset="0"
+         id="stop4123" />
+      <stop
+         id="stop4137"
+         offset="0.5"
+         style="stop-color:#67df00;stop-opacity:0.36434108;" />
+      <stop
+         style="stop-color:#62e900;stop-opacity:0;"
+         offset="1"
+         id="stop4125" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4099">
+      <stop
+         style="stop-color:#84ffff;stop-opacity:1;"
+         offset="0"
+         id="stop4101" />
+      <stop
+         style="stop-color:#00ffff;stop-opacity:1;"
+         offset="1"
+         id="stop4103" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4091">
+      <stop
+         style="stop-color:#ffacee;stop-opacity:1;"
+         offset="0"
+         id="stop4093" />
+      <stop
+         style="stop-color:#ff55dd;stop-opacity:1;"
+         offset="1"
+         id="stop4095" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4083">
+      <stop
+         style="stop-color:#ff55dd;stop-opacity:1;"
+         offset="0"
+         id="stop4085" />
+      <stop
+         style="stop-color:#ff55dd;stop-opacity:0;"
+         offset="1"
+         id="stop4087" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4033">
+      <stop
+         style="stop-color:#00ffff;stop-opacity:1;"
+         offset="0"
+         id="stop4035" />
+      <stop
+         id="stop4041"
+         offset="0.5"
+         style="stop-color:#00ffff;stop-opacity:0.27131784;" />
+      <stop
+         style="stop-color:#00ffff;stop-opacity:0;"
+         offset="1"
+         id="stop4037" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4490">
+      <stop
+         id="stop4492"
+         offset="0"
+         style="stop-color:#ececec;stop-opacity:0" />
+      <stop
+         style="stop-color:#cccccc;stop-opacity:1"
+         offset="0.23398043"
+         id="stop4498" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1"
+         offset="0.50230217"
+         id="stop4496" />
+      <stop
+         id="stop4494"
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4473">
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1"
+         offset="0"
+         id="stop4475" />
+      <stop
+         id="stop4481"
+         offset="0.2659016"
+         style="stop-color:#4d4d4d;stop-opacity:1" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1"
+         offset="0.4000625"
+         id="stop4483" />
+      <stop
+         style="stop-color:#4d4d4d;stop-opacity:1"
+         offset="1"
+         id="stop4477" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4463">
+      <stop
+         style="stop-color:#ececec;stop-opacity:1;"
+         offset="0"
+         id="stop4465" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop4467" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4316">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.7681818"
+         offset="0"
+         id="stop4318" />
+      <stop
+         id="stop4326"
+         offset="0.06176317"
+         style="stop-color:#000000;stop-opacity:0" />
+      <stop
+         id="stop4324"
+         offset="0.93853289"
+         style="stop-color:#ffffff;stop-opacity:0" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop4320" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4304">
+      <stop
+         style="stop-color:#1a1a1a;stop-opacity:1;"
+         offset="0"
+         id="stop4306" />
+      <stop
+         id="stop4312"
+         offset="0.30357143"
+         style="stop-color:#666666;stop-opacity:1" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop4308" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4294">
+      <stop
+         style="stop-color:#999999;stop-opacity:1;"
+         offset="0"
+         id="stop4296" />
+      <stop
+         id="stop4302"
+         offset="0.35267857"
+         style="stop-color:#e6e6e6;stop-opacity:1" />
+      <stop
+         style="stop-color:#1f1f1f;stop-opacity:1;"
+         offset="1"
+         id="stop4298" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4229">
+      <stop
+         style="stop-color:#cca050;stop-opacity:1;"
+         offset="0"
+         id="stop4231" />
+      <stop
+         style="stop-color:#dec18c;stop-opacity:1;"
+         offset="1"
+         id="stop4233" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="20.137329"
+       x2="11.794092"
+       y1="3.2126782"
+       x1="11.794092"
+       gradientTransform="scale(1.0598527,0.9435274)"
+       id="linearGradient3317">
+      <stop
+         id="stop3319"
+         offset="0"
+         style="stop-color:#c6953a;stop-opacity:1" />
+      <stop
+         id="stop3321"
+         offset="1"
+         style="stop-color:#ab7a1f;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3348">
+      <stop
+         style="stop-color:#e0c693;stop-opacity:1;"
+         offset="0"
+         id="stop3350" />
+      <stop
+         id="stop3356"
+         offset="0.71691591"
+         style="stop-color:#c0984f;stop-opacity:1;" />
+      <stop
+         style="stop-color:#a67315;stop-opacity:1;"
+         offset="1"
+         id="stop3352" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3687">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3689" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3691" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective296" />
+    <linearGradient
+       id="linearGradient3487">
+      <stop
+         id="stop3489"
+         offset="0"
+         style="stop-color:#7cb7f2;stop-opacity:1;" />
+      <stop
+         id="stop3491"
+         offset="1"
+         style="stop-color:#deecfc;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4368">
+      <stop
+         id="stop4370"
+         offset="0"
+         style="stop-color:#828282;stop-opacity:1;" />
+      <stop
+         id="stop4372"
+         offset="1"
+         style="stop-color:#5a5a5a;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4360">
+      <stop
+         id="stop4362"
+         offset="0"
+         style="stop-color:#6e6e6e;stop-opacity:1;" />
+      <stop
+         id="stop4364"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7097">
+      <stop
+         id="stop7099"
+         offset="0"
+         style="stop-color:#919191;stop-opacity:1;" />
+      <stop
+         id="stop7101"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7175">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop7177" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop7179" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient11084">
+      <stop
+         style="stop-color:#a0a0a0;stop-opacity:1;"
+         offset="0"
+         id="stop11086" />
+      <stop
+         id="stop11088"
+         offset="0.1362071"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         id="stop11090"
+         offset="0.3023597"
+         style="stop-color:#f5f5f5;stop-opacity:1;" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="0.61225069"
+         id="stop11092" />
+      <stop
+         style="stop-color:#b4b4b4;stop-opacity:1;"
+         offset="1"
+         id="stop11094" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7105">
+      <stop
+         id="stop7107"
+         offset="0"
+         style="stop-color:#515151;stop-opacity:1;" />
+      <stop
+         style="stop-color:#1b1b1b;stop-opacity:1;"
+         offset="1"
+         id="stop7113" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3295">
+      <stop
+         id="stop3297"
+         offset="0"
+         style="stop-color:#559829;stop-opacity:1;" />
+      <stop
+         id="stop3299"
+         offset="1"
+         style="stop-color:#86c837;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3287">
+      <stop
+         id="stop3289"
+         offset="0"
+         style="stop-color:#cd0000;stop-opacity:1;" />
+      <stop
+         id="stop3291"
+         offset="1"
+         style="stop-color:#e55300;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3279">
+      <stop
+         id="stop3281"
+         offset="0"
+         style="stop-color:#f08e00;stop-opacity:1;" />
+      <stop
+         id="stop3283"
+         offset="1"
+         style="stop-color:#ffd200;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3271">
+      <stop
+         id="stop3273"
+         offset="0"
+         style="stop-color:#395d93;stop-opacity:1;" />
+      <stop
+         id="stop3275"
+         offset="1"
+         style="stop-color:#6e92c7;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3544">
+      <stop
+         id="stop3546"
+         offset="0"
+         style="stop-color:#040404;stop-opacity:1;" />
+      <stop
+         id="stop3548"
+         offset="1"
+         style="stop-color:#4b4b4b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3495">
+      <stop
+         id="stop3497"
+         offset="0"
+         style="stop-color:#555555;stop-opacity:1;" />
+      <stop
+         style="stop-color:#797979;stop-opacity:1;"
+         offset="0.43958005"
+         id="stop3503" />
+      <stop
+         id="stop3505"
+         offset="0.57803553"
+         style="stop-color:#999999;stop-opacity:1;" />
+      <stop
+         id="stop3499"
+         offset="1"
+         style="stop-color:#d3d3d3;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3322">
+      <stop
+         id="stop3324"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3326"
+         offset="1"
+         style="stop-color:#282828;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3330">
+      <stop
+         id="stop3332"
+         offset="0"
+         style="stop-color:#c8c8c8;stop-opacity:1;" />
+      <stop
+         style="stop-color:#646464;stop-opacity:1;"
+         offset="0.56385005"
+         id="stop3338" />
+      <stop
+         id="stop3340"
+         offset="0.64175642"
+         style="stop-color:#505050;stop-opacity:1;" />
+      <stop
+         id="stop3334"
+         offset="1"
+         style="stop-color:#282828;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient9501">
+      <stop
+         style="stop-color:#95450b;stop-opacity:1;"
+         offset="0"
+         id="stop9503" />
+      <stop
+         style="stop-color:#d79869;stop-opacity:1;"
+         offset="1"
+         id="stop9505" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3620">
+      <stop
+         style="stop-color:#115da6;stop-opacity:1;"
+         offset="0"
+         id="stop3622" />
+      <stop
+         style="stop-color:#3989d4;stop-opacity:1;"
+         offset="1"
+         id="stop3624" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3424">
+      <stop
+         id="stop3426"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.67213112"
+         id="stop3432" />
+      <stop
+         id="stop3428"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2276c5;stop-opacity:1;" />
+      <stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#69a9e6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3257">
+      <stop
+         id="stop3259"
+         offset="0"
+         style="stop-color:#d76f00;stop-opacity:1;" />
+      <stop
+         id="stop3261"
+         offset="1"
+         style="stop-color:#ffb503;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3175">
+      <stop
+         id="stop3177"
+         offset="0"
+         style="stop-color:#4490e6;stop-opacity:1;" />
+      <stop
+         id="stop3179"
+         offset="1"
+         style="stop-color:#103d8f;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.00225966,0.925477,-1.3844339,0,25.901984,-30.21143)"
+       r="35.9375"
+       fy="-15.871236"
+       fx="56.065952"
+       cy="-15.871236"
+       cx="56.065952"
+       id="radialGradient3465"
+       xlink:href="#linearGradient3175"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonColor"
+       x1="58.650177"
+       y1="122"
+       x2="58.650177"
+       y2="5.4252338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-1.1034483,-1.1034483)">
+      <stop
+         style="stop-color:#2fc044;stop-opacity:1;"
+         offset="0"
+         id="stop3792" />
+      <stop
+         style="stop-color:#246d2f;stop-opacity:1;"
+         offset="1"
+         id="stop3794" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3465">
+      <stop
+         style="stop-color:#919191;stop-opacity:1;"
+         offset="0"
+         id="stop3467" />
+      <stop
+         style="stop-color:#fdfdfd;stop-opacity:1;"
+         offset="1"
+         id="stop3469" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3187">
+      <stop
+         style="stop-color:#b4b4b4;stop-opacity:1;"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3465"
+       id="linearGradient3436"
+       x1="43.17857"
+       y1="13"
+       x2="43.17857"
+       y2="83.294571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0294118,0,0,1.0294118,-1.4117647,-1.4117647)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonColor"
+       id="radialGradient3366"
+       cx="47.098362"
+       cy="80.842926"
+       fx="47.098362"
+       fy="80.842926"
+       r="38.957481"
+       gradientTransform="matrix(1.3112996,-5.281739e-8,4.5811678e-8,1.1373685,-14.661706,-10.847943)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3466"
+       xlink:href="#linearGradient3187"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3487"
+       id="linearGradient5035"
+       x1="62.14286"
+       y1="48.321426"
+       x2="8.5714312"
+       y2="16.535713"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-0.017213)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187"
+       id="linearGradient5061"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187"
+       id="linearGradient5064"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3658"
+       x1="23.256212"
+       y1="4.5964479"
+       x2="31.50753"
+       y2="58.026337"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2.1428571,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3687"
+       id="linearGradient3693"
+       x1="76.45089"
+       y1="8.0625"
+       x2="76.45089"
+       y2="72.765785"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3487"
+       id="linearGradient3701"
+       x1="65.15625"
+       y1="16.125"
+       x2="65.15625"
+       y2="69.687508"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient2675"
+       gradientUnits="userSpaceOnUse"
+       x1="65.15625"
+       y1="16.125"
+       x2="65.15625"
+       y2="69.687508" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4294"
+       id="linearGradient4300"
+       x1="-33"
+       y1="17.75"
+       x2="-25"
+       y2="17.75"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4304"
+       id="linearGradient4310"
+       x1="-32"
+       y1="56.09375"
+       x2="-26"
+       y2="56.09375"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4316"
+       id="linearGradient4322"
+       x1="-29"
+       y1="35.5"
+       x2="-29"
+       y2="0"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4336"
+       x1="-29"
+       y1="35.764431"
+       x2="-29"
+       y2="56.09375"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4304"
+       id="linearGradient4387"
+       x1="-31"
+       y1="0"
+       x2="-27"
+       y2="0"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4391"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="0"
+       x2="-29"
+       y2="-2.5" />
+    <filter
+       inkscape:collect="always"
+       id="filter4459"
+       x="-0.36000001"
+       width="1.72"
+       y="-0.025714286"
+       height="1.0514286"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.3"
+         id="feGaussianBlur4461" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4463"
+       id="linearGradient4469"
+       x1="-34"
+       y1="16"
+       x2="-32"
+       y2="16"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,-66,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4473"
+       id="linearGradient4479"
+       x1="-33"
+       y1="4"
+       x2="-25"
+       y2="4"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4490"
+       id="linearGradient4488"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,-66,0)"
+       x1="-36"
+       y1="16"
+       x2="-32"
+       y2="16" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4304"
+       id="linearGradient4531"
+       gradientUnits="userSpaceOnUse"
+       x1="-31"
+       y1="0"
+       x2="-27"
+       y2="0" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4533"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="0"
+       x2="-29"
+       y2="-2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4304"
+       id="linearGradient4535"
+       gradientUnits="userSpaceOnUse"
+       x1="-32"
+       y1="56.09375"
+       x2="-26"
+       y2="56.09375" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4537"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="35.764431"
+       x2="-29.236725"
+       y2="74.234039" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4294"
+       id="linearGradient4539"
+       gradientUnits="userSpaceOnUse"
+       x1="-33"
+       y1="17.75"
+       x2="-25"
+       y2="17.75" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4316"
+       id="linearGradient4541"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="35.5"
+       x2="-29"
+       y2="0" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4490"
+       id="linearGradient4543"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,-66,0)"
+       x1="-36"
+       y1="16"
+       x2="-32"
+       y2="16" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4304"
+       id="linearGradient4545"
+       gradientUnits="userSpaceOnUse"
+       x1="-31"
+       y1="0"
+       x2="-27"
+       y2="0" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4547"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="0"
+       x2="-29"
+       y2="-2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4304"
+       id="linearGradient4549"
+       gradientUnits="userSpaceOnUse"
+       x1="-32"
+       y1="56.09375"
+       x2="-26"
+       y2="56.09375" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4551"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="35.764431"
+       x2="-29"
+       y2="56.09375" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4294"
+       id="linearGradient4553"
+       gradientUnits="userSpaceOnUse"
+       x1="-33"
+       y1="17.75"
+       x2="-25"
+       y2="17.75" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4316"
+       id="linearGradient4555"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="35.5"
+       x2="-29"
+       y2="0" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4490"
+       id="linearGradient4557"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,-66,0)"
+       x1="-36"
+       y1="16"
+       x2="-32"
+       y2="16" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4490"
+       id="linearGradient4560"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,-66,0)"
+       x1="-36"
+       y1="16"
+       x2="-32"
+       y2="16" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4316"
+       id="linearGradient4565"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="35.5"
+       x2="-29"
+       y2="0" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4294"
+       id="linearGradient4568"
+       gradientUnits="userSpaceOnUse"
+       x1="-33"
+       y1="17.75"
+       x2="-25"
+       y2="17.75" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4571"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="35.764431"
+       x2="-29"
+       y2="56.09375" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4304"
+       id="linearGradient4574"
+       gradientUnits="userSpaceOnUse"
+       x1="-32"
+       y1="56.09375"
+       x2="-26"
+       y2="56.09375" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4577"
+       gradientUnits="userSpaceOnUse"
+       x1="-29"
+       y1="0"
+       x2="-29"
+       y2="-2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4304"
+       id="linearGradient4580"
+       gradientUnits="userSpaceOnUse"
+       x1="-31"
+       y1="0"
+       x2="-27"
+       y2="0" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4589"
+       x1="23.204918"
+       y1="51.635754"
+       x2="89.898247"
+       y2="51.635754"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,15)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4593"
+       gradientUnits="userSpaceOnUse"
+       x1="24.790335"
+       y1="64.485451"
+       x2="94.680679"
+       y2="44.223976"
+       gradientTransform="matrix(0.9800587,-0.1987084,0.1987084,0.9800587,-12.275551,20.870047)" />
+    <inkscape:perspective
+       id="perspective2884"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-1"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-1">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-7" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-2" />
+    </linearGradient>
+    <radialGradient
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2893"
+       xlink:href="#linearGradient3737-1"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective2992"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient4024">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.53125;"
+         offset="0"
+         id="stop4026" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4028" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4016">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4018" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4020" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3005">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.53125;"
+         offset="0"
+         id="stop3007" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3009" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3012">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3014" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3016" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3019">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.53125;"
+         offset="0"
+         id="stop3021" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3023" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3026">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3028" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3030" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3033">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.53125;"
+         offset="0"
+         id="stop3035" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3037" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3040">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3042" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3044" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3047">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.53125;"
+         offset="0"
+         id="stop3049" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3051" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4016"
+       id="linearGradient4243"
+       gradientUnits="userSpaceOnUse"
+       x1="135.73611"
+       y1="71.252129"
+       x2="234.53244"
+       y2="77.807335" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4016"
+       id="linearGradient4245"
+       gradientUnits="userSpaceOnUse"
+       x1="135.73611"
+       y1="71.252129"
+       x2="238.96693"
+       y2="74.529732" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2895"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-6"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-6">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-5" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.3839999"
+       y="-0.192"
+       height="1.3839999">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2908"
+       xlink:href="#linearGradient3737-6"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective3081"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3026-0"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3090"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3092" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3094" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3097"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3099" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3101" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3104"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3106" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3108" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3111"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3113" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3115" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3122"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective4054"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4099"
+       id="radialGradient4105"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4121"
+       id="radialGradient4321"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4129"
+       id="radialGradient4323"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4083"
+       id="radialGradient4325"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4091"
+       id="radialGradient4327"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4033"
+       id="radialGradient4329"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4099"
+       id="radialGradient4331"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4333"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4335"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4185"
+       id="radialGradient4337"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4193"
+       id="radialGradient4339"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4153"
+       id="radialGradient4341"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4163"
+       id="radialGradient4343"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4355"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4357"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4033"
+       id="radialGradient4369"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4099"
+       id="radialGradient4371"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4033"
+       id="radialGradient4383"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4099"
+       id="radialGradient4385"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4397"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4399"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4411"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4413"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4425"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4427"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4439"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4441"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4453"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4455"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4467"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4469"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4481"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4483"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4495"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4497"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4509"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4511"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient4524"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient4526"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient3285"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient3287"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215"
+       id="radialGradient3299"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223"
+       id="radialGradient3301"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4353"
+       id="linearGradient4367"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(24,0)"
+       x1="25"
+       y1="76"
+       x2="25"
+       y2="80" />
+    <linearGradient
+       id="linearGradient4353">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4355" />
+      <stop
+         id="stop4369"
+         offset="0.2"
+         style="stop-color:#ffffff;stop-opacity:0.49803922;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4357" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4353"
+       id="linearGradient4363"
+       gradientUnits="userSpaceOnUse"
+       x1="25"
+       y1="76"
+       x2="25"
+       y2="80"
+       gradientTransform="translate(12,0)" />
+    <linearGradient
+       id="linearGradient4458">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4460" />
+      <stop
+         id="stop4462"
+         offset="0.2"
+         style="stop-color:#ffffff;stop-opacity:0.49803922;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4464" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4353"
+       id="linearGradient4359"
+       x1="25"
+       y1="76"
+       x2="25"
+       y2="80"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4467">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4469" />
+      <stop
+         id="stop4471"
+         offset="0.2"
+         style="stop-color:#ffffff;stop-opacity:0.49803922;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4473" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4634"
+       id="linearGradient4238"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="55.077717"
+       y2="56" />
+    <linearGradient
+       id="linearGradient4634">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4636" />
+      <stop
+         id="stop4642"
+         offset="0.30000001"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         style="stop-color:#4c4c4c;stop-opacity:1;"
+         offset="0.60000002"
+         id="stop4644" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="1"
+         id="stop4638" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient4240"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="56.153542"
+       y2="56" />
+    <linearGradient
+       id="linearGradient4654">
+      <stop
+         id="stop4656"
+         offset="0"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.30000001"
+         id="stop4658" />
+      <stop
+         id="stop4660"
+         offset="0.60000002"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         id="stop4662"
+         offset="1"
+         style="stop-color:#636363;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient4242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,112)"
+       x1="48"
+       y1="56"
+       x2="55.868713"
+       y2="56" />
+    <linearGradient
+       id="linearGradient3453">
+      <stop
+         id="stop3455"
+         offset="0"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.30000001"
+         id="stop3457" />
+      <stop
+         id="stop3459"
+         offset="0.60000002"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         id="stop3461"
+         offset="1"
+         style="stop-color:#636363;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4672"
+       id="linearGradient4244"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="96"
+       x2="48"
+       y2="31.677887" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4672">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4674" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4676" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4778"
+       id="radialGradient4903"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.02521851,1.5993168,-0.98834063,0.01558446,65.834392,-34.7967)"
+       cx="39.04879"
+       cy="28.09796"
+       fx="39.04879"
+       fy="28.09796"
+       r="36.428211" />
+    <linearGradient
+       id="linearGradient4778">
+      <stop
+         style="stop-color:#fff9b9;stop-opacity:1;"
+         offset="0"
+         id="stop4780" />
+      <stop
+         style="stop-color:#fff79e;stop-opacity:0;"
+         offset="1"
+         id="stop4782" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8"
+       id="radialGradient4481-2"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4215-8">
+      <stop
+         style="stop-color:#ffb800;stop-opacity:1;"
+         offset="0"
+         id="stop4217-4" />
+      <stop
+         style="stop-color:#ffb800;stop-opacity:0;"
+         offset="1"
+         id="stop4219-3" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6"
+       id="radialGradient4483-2"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient4223-6">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop4225-4" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop4227-8" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8"
+       id="radialGradient4397-1"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6"
+       id="radialGradient4399-8"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient3487-6">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop3489-4" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop3491-4" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8"
+       id="radialGradient4355-6"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6"
+       id="radialGradient4357-5"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient3501">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop3503-5" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop3505-9" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8"
+       id="radialGradient4333-9"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       r="7.2449093"
+       fy="31.601685"
+       fx="29.094891"
+       cy="31.601685"
+       cx="29.094891"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3556"
+       xlink:href="#linearGradient4223-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3515">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop3517" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop3519" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4778"
+       id="radialGradient4323-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.02521851,1.5993168,-0.98834063,0.01558446,65.834392,-34.7967)"
+       cx="39.04879"
+       cy="28.09796"
+       fx="39.04879"
+       fy="28.09796"
+       r="36.428211" />
+    <linearGradient
+       id="linearGradient3522">
+      <stop
+         style="stop-color:#fff9b9;stop-opacity:1;"
+         offset="0"
+         id="stop3524" />
+      <stop
+         style="stop-color:#fff79e;stop-opacity:0;"
+         offset="1"
+         id="stop3526" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4296"
+       id="linearGradient4302"
+       x1="79.814896"
+       y1="106.04263"
+       x2="39.328308"
+       y2="35.917809"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.96592583,0.25881905,-0.25881905,0.96592583,30.00523,-25.91561)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4296">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4298-2" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4300" />
+    </linearGradient>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4304">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.53347418"
+         id="feGaussianBlur4306" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4296"
+       id="linearGradient4310-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.96592583,0.25881905,-0.25881905,0.96592583,30.00523,-25.91561)"
+       x1="79.814896"
+       y1="106.04263"
+       x2="39.328308"
+       y2="35.917809" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4296"
+       id="linearGradient4314"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.96592583,0.25881905,-0.25881905,0.96592583,30.00523,-25.91561)"
+       x1="79.814896"
+       y1="106.04263"
+       x2="39.328308"
+       y2="35.917809" />
+    <linearGradient
+       y2="35.917809"
+       x2="39.328308"
+       y1="106.04263"
+       x1="79.814896"
+       gradientTransform="matrix(0.96592583,0.25881905,-0.25881905,0.96592583,30.00523,-25.91561)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3588"
+       xlink:href="#linearGradient4296"
+       inkscape:collect="always" />
+  </defs>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer7"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99097413"
+       inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+       style="opacity:0.07999998;fill:url(#linearGradient3122);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3786"
+       d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0360184"
+       inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3778"
+       d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98962283"
+       inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3770"
+       d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+       transform="scale(1,-1)" />
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect3723"
+       width="86"
+       height="85"
+       x="5"
+       y="-92"
+       rx="7"
+       ry="7"
+       transform="scale(1,-1)" />
+    <rect
+       transform="scale(1,-1)"
+       ry="6"
+       rx="6"
+       y="-91"
+       x="6"
+       height="84"
+       width="84"
+       id="rect3716"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     style="display:inline"
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Screen">
+    <rect
+       style="fill:url(#radialGradient3366);fill-opacity:1;stroke:none"
+       id="rect3461"
+       width="77.914963"
+       height="78.516495"
+       x="8.1408806"
+       y="8.2544327"
+       rx="5.8527675"
+       ry="6.1732869" />
+    <path
+       transform="matrix(-1.0008688,0,0,-1.3339699,96.010447,99.965928)"
+       d="m 12.0625,12.0625 0,53.875 71.875,0 0,-53.875 -71.875,0 z"
+       id="path3215"
+       style="fill:url(#radialGradient3465);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:original="M 12.03125 12.03125 L 12.03125 65.96875 L 83.96875 65.96875 L 83.96875 12.03125 L 12.03125 12.03125 z "
+       inkscape:radius="-0.031530734"
+       sodipodi:type="inkscape:offset" />
+    <rect
+       ry="2.3829787"
+       rx="3.0290828"
+       y="74"
+       x="11.785715"
+       height="10"
+       width="72.535713"
+       id="rect4832"
+       style="opacity:0.4;fill:#c3d9f5;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <rect
+       style="opacity:0.4;fill:#c3d9f5;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect4345"
+       width="72.535713"
+       height="10"
+       x="11.785715"
+       y="12"
+       rx="3.0290828"
+       ry="2.3829787" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.07999998;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate [...]
+       d="m 19,13 c -3.289406,0 -6,2.710594 -6,6 l 0,58 c 0,3.289406 2.710594,6 6,6 l 58,0 c 3.289406,0 6,-2.710594 6,-6 l 0,-58 c 0,-3.289406 -2.710594,-6 -6,-6 l -58,0 z m 0,4 58,0 c 1.142594,0 2,0.857406 2,2 l 0,58 c 0,1.142594 -0.857406,2 -2,2 l -58,0 c -1.142594,0 -2,-0.857406 -2,-2 l 0,-58 c 0,-1.142594 0.857406,-2 2,-2 z"
+       id="rect3222"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 17,14 c -1.662,0 -3,1.338 -3,3 l 0,62 c 0,1.662 1.338,3 3,3 l 62,0 c 1.662,0 3,-1.338 3,-3 l 0,-62 c 0,-1.662 -1.338,-3 -3,-3 l -62,0 z m 0,1.9375 62,0 c 0.618163,0 1.0625,0.444337 1.0625,1.0625 l 0,62 c 0,0.618163 -0.444337,1.0625 -1.0625,1.0625 l -62,0 c -0.618163,0 -1.0625,-0.444337 -1.0625,-1.0625 l 0,-62 c 0,-0.618163 0.444337,-1.0625 1.0625,-1.0625 z"
+       id="rect3981"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.25;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 17,14 c -1.662,0 -3,1.338 -3,3 l 0,62 c 0,1.662 1.338,3 3,3 l 62,0 c 1.662,0 3,-1.338 3,-3 l 0,-62 c 0,-1.662 -1.338,-3 -3,-3 l -62,0 z m 0,0.96875 62,0 c 1.140081,0 2.03125,0.891169 2.03125,2.03125 l 0,62 c 0,1.140081 -0.891169,2.03125 -2.03125,2.03125 l -62,0 c -1.140081,0 -2.03125,-0.891169 -2.03125,-2.03125 l 0,-62 c 0,-1.140081 0.891169,-2.03125 2.03125,-2.03125 z"
+       id="rect3977"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="rect2419"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 5,8 1,0 60,0 1,0 c 1.683774,0 3,1.316227 3,3 l 0,1 0,60 0,1 c 10e-7,1.683774 -1.316227,3 -3,3 l -1,0 -60,0 -1,0 c -1.683771,10e-7 -3,-1.316227 -3,-3 l 0,-1 0,-60 0,-1 c 0,-1.683772 1.316227,-3 3,-3 z"
+       style="fill:url(#linearGradient3466);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.7;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="4"
+       rx="4"
+       y="13.000001"
+       x="13.000001"
+       height="70"
+       width="70"
+       id="rect3425"
+       style="fill:none;stroke:url(#linearGradient3436);stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.69658119;stroke-dasharray:none;stroke-dashoffset:0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.4;fill:url(#radialGradient2893);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient2908);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:label="Reflections"
+     id="layer5"
+     inkscape:groupmode="layer"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.4;fill:url(#linearGradient3693);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 44.84375,8.0625 1.34375,3.875 31.8125,0 1,0 c 2.753976,0 5.0625,2.308526 5.0625,5.0625 l 0,1 0,60 0,1 c 2e-6,2.753977 -2.308526,5.0625 -5.0625,5.0625 l -1,0 -6.875,0 1.34375,3.875 11.53125,0 c 2.221843,0 3.9375,-1.715657 3.9375,-3.9375 l 0,-72 C 87.9375,9.7781575 86.221843,8.0625 84,8.0625 l -39.15625,0 z"
+       id="path3660"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.7;fill:url(#linearGradient3701);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 47.65625,16.125 22.03125,63.75 9.3125,0 c 0.538805,0 0.875,-0.336196 0.875,-0.875 l 0,-62 c 0,-0.538805 -0.336194,-0.875 -0.875,-0.875 l -31.34375,0 z"
+       id="path3664"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.5;fill:url(#linearGradient2675);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 47.65625,16.125 22.03125,63.75 1,0 -22.03125,-63.75 -1,0 z"
+       id="path2669"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Lights"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <g
+       style="display:inline;enable-background:new"
+       id="g4065"
+       transform="translate(-71.552668,19.414812)">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4031"
+         style="color:#000000;fill:url(#radialGradient4329);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4062"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4057"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4043"
+         style="color:#000000;fill:url(#radialGradient4331);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       id="g4071"
+       transform="translate(-55,10.892942)"
+       style="fill:#ff55dd;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4325);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4073"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ff55dd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4075"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ff55dd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4079"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4327);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4077"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="fill:#00ff00;display:inline;enable-background:new"
+       transform="matrix(0.60421815,0,0,0.60421815,-38.651343,45.255609)"
+       id="g4107">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4109"
+         style="color:#000000;fill:url(#radialGradient4321);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4111"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4113"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4115"
+         style="color:#000000;fill:url(#radialGradient4323);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       style="fill:#d40000;display:inline;enable-background:new"
+       transform="matrix(0.47135942,0,0,0.47135942,-61.3303,47.597111)"
+       id="g4139">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4141"
+         style="color:#000000;fill:url(#radialGradient4341);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4143"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#f50000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4145"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4147"
+         style="color:#000000;fill:url(#radialGradient4343);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       style="fill:#7137c8;display:inline;enable-background:new"
+       transform="matrix(0.72381394,0,0,0.72381394,-77.88586,5.1141395)"
+       id="g4171">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4173"
+         style="color:#000000;fill:url(#radialGradient4337);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4175"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#7137c8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4177"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#7137c8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4179"
+         style="color:#000000;fill:url(#radialGradient4339);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       id="g4201"
+       transform="matrix(1.1298846,0,0,1.1298846,11.314466,-8.38064)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4333);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4203"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4205"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4207"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4335);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4209"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="fill:#ffcc00;display:inline;enable-background:new"
+       transform="matrix(0.74835613,0,0,0.74835613,5.0526038,18.469199)"
+       id="g4345">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4347"
+         style="color:#000000;fill:url(#radialGradient4355);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4349"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4351"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4353"
+         style="color:#000000;fill:url(#radialGradient4357);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       transform="matrix(0.64916863,0,0,0.64916863,-34.238895,12.011774)"
+       id="g4359"
+       style="display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4369);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4361"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4363"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4365"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4371);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4367"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="display:inline;enable-background:new"
+       id="g4373"
+       transform="matrix(0.64916863,0,0,0.64916863,-66.113294,-3.2132646)">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4375"
+         style="color:#000000;fill:url(#radialGradient4383);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4377"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4379"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4381"
+         style="color:#000000;fill:url(#radialGradient4385);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       style="fill:#ffcc00;display:inline;enable-background:new"
+       transform="matrix(1.8398335,0,0,1.8398335,-4.3919738,-13.874671)"
+       id="g4387">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4389"
+         style="color:#000000;fill:url(#radialGradient4397);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4391"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4393"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4395"
+         style="color:#000000;fill:url(#radialGradient4399);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       id="g4401"
+       transform="matrix(1.1630058,0,0,1.1630058,10.783815,26.783815)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4411);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4403"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4405"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4407"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4413);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4409"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="fill:#ffcc00;display:inline;enable-background:new"
+       transform="matrix(0.48001595,0,0,0.48001595,49.218564,3.1129711)"
+       id="g4415">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4417"
+         style="color:#000000;fill:url(#radialGradient4425);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4419"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4421"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4423"
+         style="color:#000000;fill:url(#radialGradient4427);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       id="g4429"
+       transform="matrix(1.1458153,0,0,1.1458153,4.3339104,13.502872)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4439);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4431"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4433"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4435"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4441);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4437"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       id="g4443"
+       transform="matrix(0.48001595,0,0,0.48001595,10.63949,11.63949)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4453);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4445"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4447"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4449"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4455);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4451"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="fill:#ffcc00;display:inline;enable-background:new"
+       transform="matrix(0.48001595,0,0,0.48001595,47.159474,51.159473)"
+       id="g4457">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4459"
+         style="color:#000000;fill:url(#radialGradient4467);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4461"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4463"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4465"
+         style="color:#000000;fill:url(#radialGradient4469);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       id="g4471"
+       transform="matrix(0.87787637,0,0,0.87787637,8.3169278,-10.458415)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4481);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4473"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4475"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4477"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4483);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4479"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       id="g4485"
+       transform="matrix(0.74835613,0,0,0.74835613,44.052604,10.052604)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4495);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4487"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4489"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4491"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4497);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4493"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="fill:#ffcc00;display:inline;enable-background:new"
+       transform="matrix(0.40156819,0,0,0.40156819,19.909963,19.909963)"
+       id="g4499">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4501"
+         style="color:#000000;fill:url(#radialGradient4509);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4503"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4505"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4507"
+         style="color:#000000;fill:url(#radialGradient4511);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       id="g4513"
+       transform="matrix(0.40156819,0,0,0.40156819,58.951929,12.144957)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4524);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4515"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4518"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4520"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4526);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4522"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       id="g3275"
+       transform="matrix(0.86259774,0,0,0.86259774,34.318807,0.73659245)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient3285);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path3277"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path3279"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path3281"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient3287);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path3283"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="fill:#ffcc00;display:inline;enable-background:new"
+       transform="matrix(0.94611679,0,0,0.94611679,22.593829,-17.246684)"
+       id="g3289">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path3291"
+         style="color:#000000;fill:url(#radialGradient3299);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path3293"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path3295"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path3297"
+         style="color:#000000;fill:url(#radialGradient3301);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       transform="matrix(0.8286091,-0.55982761,0.55982761,0.8286091,-40.811413,58.691203)"
+       style="opacity:0.1;color:#000000;fill:url(#linearGradient3588);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4304);enable-background:accumulate"
+       d="m 61.895589,17.34349 c -0.135233,-0.04214 -0.28289,-0.05044 -0.416672,-0.01459 l -5.787197,1.555153 c -0.535123,0.143386 -0.804929,0.915704 -0.58985,1.718389 l 3.238555,12.061692 6.733607,25.097978 4.37878,16.37891 5.585295,20.810946 c 0.215078,0.802687 0.824216,1.348782 1.359339,1.205396 l 5.787197,-1.555154 c 0.535123,-0.143386 0.804929,-0.915701 0.589851,-1.718388 L 77.189199,72.072876 72.810419,55.693967 66.076812,30.595988 62.838256,18.534296 C 62.676947,17.932283 62.30128 [...]
+       id="path4312"
+       inkscape:connector-curvature="0"
+       inkscape:transform-center-x="27.370382"
+       inkscape:transform-center-y="-28.885643" />
+    <path
+       inkscape:transform-center-y="-34.602819"
+       inkscape:transform-center-x="19.650078"
+       inkscape:connector-curvature="0"
+       id="path4308"
+       d="m 61.895589,17.34349 c -0.135233,-0.04214 -0.28289,-0.05044 -0.416672,-0.01459 l -5.787197,1.555153 c -0.535123,0.143386 -0.804929,0.915704 -0.58985,1.718389 l 3.238555,12.061692 6.733607,25.097978 4.37878,16.37891 5.585295,20.810946 c 0.215078,0.802687 0.824216,1.348782 1.359339,1.205396 l 5.787197,-1.555154 c 0.535123,-0.143386 0.804929,-0.915701 0.589851,-1.718388 L 77.189199,72.072876 72.810419,55.693967 66.076812,30.595988 62.838256,18.534296 C 62.676947,17.932283 62.30128 [...]
+       style="opacity:0.3;color:#000000;fill:url(#linearGradient4310-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4304);enable-background:accumulate"
+       transform="matrix(0.93863507,-0.34491188,0.34491188,0.93863507,-28.481108,31.913896)" />
+    <path
+       style="opacity:0.12000002;color:#000000;fill:url(#linearGradient4302);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4304);enable-background:accumulate"
+       d="m 61.895589,17.34349 c -0.135233,-0.04214 -0.28289,-0.05044 -0.416672,-0.01459 l -5.787197,1.555153 c -0.535123,0.143386 -0.804929,0.915704 -0.58985,1.718389 l 3.238555,12.061692 6.733607,25.097978 4.37878,16.37891 5.585295,20.810948 c 0.215078,0.80269 0.824216,1.34878 1.359339,1.20539 l 5.787197,-1.55515 c 0.535123,-0.14339 0.804929,-0.9157 0.589851,-1.71839 L 77.189199,72.072876 72.810419,55.693967 66.076812,30.595988 62.838256,18.534296 C 62.676947,17.932283 62.301288,17.469 [...]
+       id="rect4250"
+       inkscape:connector-curvature="0"
+       inkscape:transform-center-x="6.5099633"
+       inkscape:transform-center-y="-39.25509" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.4;fill:url(#radialGradient4323-7);fill-opacity:1;stroke:none"
+       d="m 73.34375,6 c -7.360276,25.499114 -22.654005,54.407743 -36,50.03125 C 23.296473,51.424788 32.225198,32.751577 36.6875,28.15625 31.433271,33.083079 18.287468,53.438221 35.0625,62.34375 47.995141,69.20943 74.795715,53.55914 90,32.375 L 90,12 C 90,8.676 87.324,6 84,6 L 73.34375,6 z"
+       id="path4776" />
+    <g
+       id="g4201-3"
+       transform="matrix(1.1298846,0,0,1.1298846,7.4474801,29.550012)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4333-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4203-0"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 c 0,4.418278 -3.581722,8 -8,8 -4.418278,0 -8,-3.581722 -8,-8 0,-4.418278 3.581722,-8 8,-8 4.418278,0 8,3.581722 8,8 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4205-5"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4207-2"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient3556);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4209-7"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="fill:#ffcc00;display:inline;enable-background:new"
+       transform="matrix(0.74835613,0,0,0.74835613,49.786131,23.15389)"
+       id="g4345-6">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 c 0,4.418278 -3.581722,8 -8,8 -4.418278,0 -8,-3.581722 -8,-8 0,-4.418278 3.581722,-8 8,-8 4.418278,0 8,3.581722 8,8 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4347-1"
+         style="color:#000000;fill:url(#radialGradient4355-6);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4349-8"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4351-2"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4353-5"
+         style="color:#000000;fill:url(#radialGradient4357-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       style="fill:#ffcc00;display:inline;enable-background:new"
+       transform="matrix(1.8398335,0,0,1.8398335,-31.184817,-10.840219)"
+       id="g4387-8">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 c 0,4.418278 -3.581722,8 -8,8 -4.418278,0 -8,-3.581722 -8,-8 0,-4.418278 3.581722,-8 8,-8 4.418278,0 8,3.581722 8,8 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4389-8"
+         style="color:#000000;fill:url(#radialGradient4397-1);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4391-8"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4393-3"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4395-4"
+         style="color:#000000;fill:url(#radialGradient4399-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       id="g4471-3"
+       transform="matrix(0.87787637,0,0,0.87787637,3.9327151,-6.34023)"
+       style="fill:#ffcc00;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4481-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4473-1"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 c 0,4.418278 -3.581722,8 -8,8 -4.418278,0 -8,-3.581722 -8,-8 0,-4.418278 3.581722,-8 8,-8 4.418278,0 8,3.581722 8,8 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4475-5"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4477-3"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient4483-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4479-7"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.4539802"
+       inkscape:original="M 76.71875 -8.375 C 72.107121 18.833613 54.409216 61.581284 38.4375 56.34375 C 23.453738 51.430191 34.597005 30.516978 38.59375 27.75 C 34.135842 30.978141 17.317756 52.92342 35.0625 62.34375 C 52.807244 71.76408 96.693283 38.8253 100.84375 7.3125 L 76.71875 -8.375 z "
+       style="opacity:0;fill:url(#radialGradient4903);fill-opacity:1;stroke:none"
+       id="path4901"
+       d="M 76.6875,-9.84375 A 1.4541256,1.4541256 0 0 0 75.28125,-8.625 C 73.00568,4.8008624 67.467265,22.213273 60.5625,35.46875 57.110118,42.096488 53.305299,47.680148 49.53125,51.1875 45.757201,54.694852 42.235925,56.070883 38.875,54.96875 35.469945,53.852145 33.796,52.00109 32.9375,49.6875 c -0.8585,-2.31359 -0.790906,-5.207445 -0.125,-8.125 0.665906,-2.917555 1.907685,-5.838542 3.21875,-8.15625 1.311065,-2.317708 2.820599,-4.084934 3.375,-4.46875 L 38.59375,27.75 37.75,26.5625 c -1 [...]
+    <g
+       id="g4224"
+       transform="matrix(0.8660254,-0.5,0.5,0.8660254,-74.655099,72.267662)">
+      <g
+         id="g4226"
+         transform="translate(70,0)">
+        <rect
+           ry="1.5"
+           rx="1"
+           y="16"
+           x="48"
+           height="80"
+           width="8"
+           id="rect4228"
+           style="color:#000000;fill:url(#linearGradient4238);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <path
+           sodipodi:nodetypes="ssccsss"
+           inkscape:connector-curvature="0"
+           id="path4230"
+           d="m 49,16 c -0.554,0 -1,0.669 -1,1.5 l 0,12.5 8,0 0,-12.5 C 56,16.669 55.554,16 55,16 z"
+           style="color:#000000;fill:url(#linearGradient4240);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <path
+           style="color:#000000;fill:url(#linearGradient4242);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           d="m 49,96 c -0.554,0 -1,-0.669 -1,-1.5 l 0,-12.5 8,0 0,12.5 c 0,0.831 -0.446,1.5 -1,1.5 z"
+           id="path4232"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ssccsss" />
+        <rect
+           style="opacity:0.3;color:#000000;fill:url(#linearGradient4244);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect4234"
+           width="8"
+           height="80"
+           x="48"
+           y="16"
+           rx="1"
+           ry="1.5" />
+        <path
+           id="path4236"
+           d="m 49,16 c -0.554,0 -1,0.669 -1,1.5 l 0,77 c 0,0.831 0.446,1.5 1,1.5 l 6,0 c 0.554,0 1,-0.669 1,-1.5 l 0,-77 C 56,16.669 55.554,16 55,16 z m 0.125,1 5.75,0 C 54.92429,17.07394 55,17.264325 55,17.5 l 0,77 c 0,0.235675 -0.07571,0.426061 -0.125,0.5 l -5.75,0 C 49.075707,94.926061 49,94.735675 49,94.5 l 0,-77 c 0,-0.235675 0.07571,-0.426061 0.125,-0.5 z"
+           style="opacity:0.2;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="sssssssssccssccssc" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/document-save.svg b/interface/images/menu/document-save.svg
new file mode 100755
index 0000000..118362e
--- /dev/null
+++ b/interface/images/menu/document-save.svg
@@ -0,0 +1,1238 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="document-save.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2848"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3697">
+      <rect
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3699"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2927"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3309"
+       id="linearGradient3804"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3309"
+       y2="122.8994"
+       x2="63.9995"
+       y1="3.1001"
+       x1="63.9995">
+      <stop
+         offset="0"
+         style="stop-color:#f6f6f6;stop-opacity:1"
+         id="stop3311" />
+      <stop
+         offset="1"
+         style="stop-color:#d2d2d2;stop-opacity:1"
+         id="stop3313" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3397"
+       id="linearGradient3806"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="37.201294"
+       y1="1"
+       x2="37.201294"
+       y2="45" />
+    <linearGradient
+       id="linearGradient3397">
+      <stop
+         offset="0"
+         style="stop-color:#aaa;stop-opacity:1"
+         id="stop3399" />
+      <stop
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1"
+         id="stop3401" />
+    </linearGradient>
+    <linearGradient
+       y2="45.017357"
+       x2="20.758585"
+       y1="1"
+       x1="20.758585"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2940"
+       xlink:href="#linearGradient3309"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.47268421,0.12665535,0.12665535,-0.47268421,44.47921,74.733655)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective2842"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3180"
+       x1="-13"
+       y1="17.008953"
+       x2="-13"
+       y2="-0.70032859"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4083" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop4085" />
+    </linearGradient>
+    <linearGradient
+       y2="-0.70032859"
+       x2="-13"
+       y1="17.008953"
+       x1="-13"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2851"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3692"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3697"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3701"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,62.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective3025"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       id="StandardGradient"
+       x1="11.347495"
+       y1="5.999567"
+       x2="11.347495"
+       y2="16.013096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-2.9995677)">
+      <stop
+         id="stop3177"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3179"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       y2="51.954468"
+       x2="65.693901"
+       y1="51.954468"
+       x1="29.826593"
+       gradientTransform="matrix(0,-1,-1,0,96,16)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3034"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3831"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,97)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3682"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3699"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3705"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,36,16)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3712"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,97)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3714"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <inkscape:perspective
+       id="perspective2941"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-8"
+       id="linearGradient3708-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       id="StandardGradient-8"
+       x1="11.347495"
+       y1="5.999567"
+       x2="11.347495"
+       y2="16.013096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-2.9995677)">
+      <stop
+         id="stop3177-6"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3179-8"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-8"
+       id="linearGradient2947"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,183,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3728"
+       x1="56"
+       y1="72"
+       x2="56"
+       y2="24"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3710"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,97)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3718"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,95)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3702"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,80,96)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3709"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,97)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3711"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,95)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <inkscape:perspective
+       id="perspective2860"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-7"
+       id="linearGradient2428"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9247229,0,0,1.0872097,-3.0600562,0.9976422)"
+       x1="11.998966"
+       y1="0.92195445"
+       x2="11.998966"
+       y2="17.478098" />
+    <linearGradient
+       id="StandardGradient-7"
+       gradientTransform="scale(0.9219544,1.0846523)"
+       x1="11.998966"
+       y1="0.92195445"
+       x2="11.998966"
+       y2="19.387045"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3283" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop2651" />
+    </linearGradient>
+    <linearGradient
+       y2="0.92195439"
+       x2="18.44883"
+       y1="17.478098"
+       x1="18.44883"
+       gradientTransform="matrix(2.4659278,0,0,2.8992258,10.506518,21.327046)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2869"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.4659278,0,0,2.8992258,10.506518,22.327046)"
+       x1="18.44883"
+       y1="17.478098"
+       x2="18.44883"
+       y2="0.92195439" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3726"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.4659278,0,0,2.8992258,10.506518,21.327046)"
+       x1="18.44883"
+       y1="17.478098"
+       x2="18.44883"
+       y2="0.92195439" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3733"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.4659278,0,0,2.8992258,10.506518,20.327046)"
+       x1="18.44883"
+       y1="17.478098"
+       x2="18.44883"
+       y2="0.92195439" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3735"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.4659278,0,0,2.8992258,10.506518,21.327046)"
+       x1="18.44883"
+       y1="17.478098"
+       x2="18.44883"
+       y2="0.92195439" />
+    <inkscape:perspective
+       id="perspective2853"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-78"
+       id="linearGradient2410"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9247229,0,0,1.0872097,-7.0600562,-1.0023578)"
+       x1="11.998966"
+       y1="1.8417401"
+       x2="11.998966"
+       y2="20.238579" />
+    <linearGradient
+       id="StandardGradient-78"
+       gradientTransform="scale(0.9219544,1.0846523)"
+       x1="11.998966"
+       y1="0.92195445"
+       x2="11.998966"
+       y2="19.387045"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3283-6" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop2651-8" />
+    </linearGradient>
+    <linearGradient
+       y2="1.8417403"
+       x2="19.530235"
+       y1="20.237455"
+       x1="19.530235"
+       gradientTransform="matrix(2.219335,0,0,2.6093033,4.655865,19.194341)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2862"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3730"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.219335,0,0,2.6093033,4.655865,20.194341)"
+       x1="19.530235"
+       y1="20.237455"
+       x2="19.530235"
+       y2="1.8417403" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3732"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.219335,0,0,2.6093033,4.655865,19.194341)"
+       x1="19.530235"
+       y1="20.237455"
+       x2="19.530235"
+       y2="1.8417403" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3739"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.219335,0,0,2.6093033,4.655865,18.194341)"
+       x1="19.530235"
+       y1="20.237455"
+       x2="19.530235"
+       y2="1.8417403" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3741"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.219335,0,0,2.6093033,4.655865,19.194341)"
+       x1="19.530235"
+       y1="20.237455"
+       x2="19.530235"
+       y2="1.8417403" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3016"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3184"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3186" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3188" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3191"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3193" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3195" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3198"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3200" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3202" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3205"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3207" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3209" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3216"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-5"
+       id="linearGradient3188-4"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-5">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-0" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-0" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-5"
+       id="radialGradient3619-2"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.7892197"
+     inkscape:cx="39.144787"
+     inkscape:cy="59.396811"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer11"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false"
+     showguides="true"
+     inkscape:guide-bbox="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3216);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725-9);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721-7);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer11"
+     inkscape:label="Button"
+     style="display:inline">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-6"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-4);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-9"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-4"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-2);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99824464"
+       inkscape:original="M 27.59375 24 C 25.065675 24 23 26.065675 23 28.59375 L 23 55.4375 C 23 57.965575 25.055247 60.0625 27.59375 60.0625 L 48.46875 60.0625 C 51.007253 60.0625 53.0625 57.965575 53.0625 55.4375 L 53.0625 28.59375 C 53.0625 26.065675 50.996825 24 48.46875 24 L 27.59375 24 z M 31.1875 31.96875 L 44.90625 31.96875 C 45.01652 31.96875 45.09375 32.045948 45.09375 32.1875 L 45.09375 51.875 C 45.09375 52.016552 45.01652 52.09375 44.90625 52.09375 L 31.1875 52.09375 C 31.07 [...]
+       style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3752"
+       d="M 27.59375,23 C 24.521902,23 22,25.521902 22,28.59375 l 0,26.84375 c 0,3.069103 2.505515,5.625 5.59375,5.625 l 20.8125,0 c 0.0016,0.0411 0,0.09375 0,0.09375 0,2e-6 0.03125,0.124998 0.03125,0.125 0,2e-6 0.03125,0.156248 0.03125,0.15625 10e-7,2e-6 0.03125,0.124998 0.03125,0.125 10e-7,2e-6 0.03125,0.156248 0.03125,0.15625 10e-7,2e-6 0.0625,0.124998 0.0625,0.125 10e-7,2e-6 0.0625,0.124998 0.0625,0.125 10e-7,2e-6 0.0625,0.124998 0.0625,0.125 10e-7,2e-6 0.09375,0.124998 0.09375,0.125 [...]
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99824464"
+       inkscape:original="M 27.59375 25 C 25.59935 25 24 26.59935 24 28.59375 L 24 55.4375 C 24 57.4319 25.59935 59.0625 27.59375 59.0625 L 48.46875 59.0625 C 50.46315 59.0625 52.0625 57.4319 52.0625 55.4375 L 52.0625 28.59375 C 52.0625 26.59935 50.46315 25 48.46875 25 L 27.59375 25 z M 31.1875 30.96875 L 44.90625 30.96875 C 45.57105 30.96875 46.09375 31.5227 46.09375 32.1875 L 46.09375 51.875 C 46.09375 52.5398 45.57105 53.09375 44.90625 53.09375 L 31.1875 53.09375 C 30.5227 53.09375 29 [...]
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3748"
+       d="M 27.59375,24 C 25.065675,24 23,26.065675 23,28.59375 l 0,26.84375 c 0,2.528075 2.055247,4.625 4.59375,4.625 l 20.875,0 c 2.538503,0 4.59375,-2.096925 4.59375,-4.625 l 0,-26.84375 C 53.0625,26.065675 50.996825,24 48.46875,24 l -20.875,0 z m 3.59375,7.96875 13.71875,0 c 0.11027,0 0.1875,0.0772 0.1875,0.21875 l 0,19.6875 c 0,0.141552 -0.07723,0.21875 -0.1875,0.21875 l -13.71875,0 c -0.11027,0 -0.21875,-0.10848 -0.21875,-0.21875 l 0,-19.6875 c 0,-0.11027 0.10848,-0.21875 0.21875,- [...]
+    <path
+       sodipodi:nodetypes="ccccccccccccsccccccccccccccccccccccc"
+       id="path3744"
+       d="M 27.6,25 C 25.6056,25 24,26.6056 24,28.6 l 0,26.849101 c 0,1.9944 1.6056,3.6 3.6,3.6 l 20.853293,0 c 1.9944,0 3.6,-1.6056 3.6,-3.6 l 0,-26.849101 c 0,-1.9944 -1.6056,-3.6 -3.6,-3.6 L 27.6,25 z m 3.57964,5.978491 13.722159,0 c 0.6648,0 1.2,0.5352 1.2,1.2 0,0 0,12.502948 0,19.702948 0,0.6648 -0.5352,1.2 -1.2,1.2 l -13.722159,0 c -0.6648,0 -1.2,-0.5352 -1.2,-1.2 l 0,-19.702948 c 0,-0.6648 0.5352,-1.2 1.2,-1.2 z m 24.906885,14.062669 0,1.893414 9.910334,0 0,-1.893414 -9.910334,0 z [...]
+       style="fill:#000000;fill-opacity:1;stroke:none;display:inline;opacity:0.3" />
+    <path
+       style="fill:url(#linearGradient2862);fill-opacity:1;stroke:none;display:inline"
+       d="M 27.6,24 C 25.6056,24 24,25.6056 24,27.6 l 0,26.849101 c 0,1.9944 1.6056,3.6 3.6,3.6 l 20.853293,0 c 1.9944,0 3.6,-1.6056 3.6,-3.6 l 0,-26.849101 c 0,-1.9944 -1.6056,-3.6 -3.6,-3.6 L 27.6,24 z m 3.57964,5.978491 13.722159,0 c 0.6648,0 1.2,0.5352 1.2,1.2 0,0 0,12.502948 0,19.702948 0,0.6648 -0.5352,1.2 -1.2,1.2 l -13.722159,0 c -0.6648,0 -1.2,-0.5352 -1.2,-1.2 l 0,-19.702948 c 0,-0.6648 0.5352,-1.2 1.2,-1.2 z m 24.906885,14.062669 0,1.893414 9.910334,0 0,-1.893414 -9.910334,0 z [...]
+       id="Symbol"
+       sodipodi:nodetypes="ccccccccccccsccccccccccccccccccccccc" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline;opacity:0.75"
+       d="M 27.59375 24 C 25.59935 24 24 25.59935 24 27.59375 L 24 28.59375 C 24 26.59935 25.59935 25 27.59375 25 L 48.46875 25 C 50.46315 25 52.0625 26.59935 52.0625 28.59375 L 52.0625 27.59375 C 52.0625 25.59935 50.46315 24 48.46875 24 L 27.59375 24 z M 56.09375 44.03125 L 56.09375 45.03125 L 66 45.03125 L 66 44.03125 L 56.09375 44.03125 z M 56.09375 48.09375 L 56.09375 49.09375 L 66 49.09375 L 66 48.09375 L 56.09375 48.09375 z M 29.96875 50.875 L 29.96875 51.875 C 29.96875 52.5398 30. [...]
+       id="path3719" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none;display:inline;opacity:0.15"
+       d="M 31.1875 28.96875 C 30.5227 28.96875 29.96875 29.5227 29.96875 30.1875 L 29.96875 31.1875 C 29.96875 30.5227 30.5227 29.96875 31.1875 29.96875 L 44.90625 29.96875 C 45.57105 29.96875 46.09375 30.5227 46.09375 31.1875 L 46.09375 30.1875 C 46.09375 29.5227 45.57105 28.96875 44.90625 28.96875 L 31.1875 28.96875 z M 56.09375 44.9375 L 56.09375 45.9375 L 66 45.9375 L 66 44.9375 L 56.09375 44.9375 z M 56.09375 50.9375 L 56.09375 51.9375 L 66 51.9375 L 66 50.9375 L 56.09375 50.9375 z [...]
+       id="path3735" />
+  </g>
+</svg>
diff --git a/interface/images/menu/editor.svg b/interface/images/menu/editor.svg
new file mode 100755
index 0000000..bf72f0b
--- /dev/null
+++ b/interface/images/menu/editor.svg
@@ -0,0 +1,1943 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="editor.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       x1="460.01428"
+       y1="585.21936"
+       x2="152.87143"
+       y2="332.36218"
+       id="linearGradient9477"
+       xlink:href="#linearGradient3989"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2149522,0,0,0.2369714,30.871779,266.01932)" />
+    <linearGradient
+       id="linearGradient3989">
+      <stop
+         id="stop3991"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3993"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="225.2822"
+       y1="451.83481"
+       x2="131.99297"
+       y2="322.8829"
+       id="linearGradient9474"
+       xlink:href="#linearGradient2190"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3505596,0,0,0.3701598,22.984703,226.27699)" />
+    <linearGradient
+       id="linearGradient2190">
+      <stop
+         id="stop2192"
+         style="stop-color:#acbbff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2194"
+         style="stop-color:#acbbff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3989"
+       id="linearGradient5036"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.20141537,0,0,0.2220479,-21.053253,-49.648356)"
+       x1="460.01428"
+       y1="585.21936"
+       x2="152.87143"
+       y2="332.36218" />
+    <linearGradient
+       x1="460.01428"
+       y1="585.21936"
+       x2="152.87143"
+       y2="332.36218"
+       id="linearGradient9477-7"
+       xlink:href="#linearGradient3989-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2149522,0,0,0.2369714,30.871779,266.01932)" />
+    <linearGradient
+       id="linearGradient3989-5">
+      <stop
+         id="stop3991-3"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3993-5"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="225.2822"
+       y1="451.83481"
+       x2="131.99297"
+       y2="322.8829"
+       id="linearGradient9474-1"
+       xlink:href="#linearGradient2190-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3505596,0,0,0.3701598,22.984703,226.27699)" />
+    <linearGradient
+       id="linearGradient2190-7">
+      <stop
+         id="stop2192-3"
+         style="stop-color:#acbbff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2194-1"
+         style="stop-color:#acbbff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3164">
+      <stop
+         id="stop3166"
+         offset="0"
+         style="stop-color:#383838;stop-opacity:1" />
+      <stop
+         style="stop-color:#3b3b3b;stop-opacity:1"
+         offset="0.05754738"
+         id="stop3172" />
+      <stop
+         id="stop3174"
+         offset="0.07978155"
+         style="stop-color:#626463;stop-opacity:1" />
+      <stop
+         style="stop-color:#bfbfbf;stop-opacity:1"
+         offset="0.12359595"
+         id="stop3176" />
+      <stop
+         id="stop3178"
+         offset="0.18899058"
+         style="stop-color:#808080;stop-opacity:1" />
+      <stop
+         style="stop-color:#e0e0e0;stop-opacity:1"
+         offset="0.25765494"
+         id="stop3180" />
+      <stop
+         id="stop3182"
+         offset="0.37405738"
+         style="stop-color:#ececec;stop-opacity:1" />
+      <stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.52577293"
+         id="stop3184" />
+      <stop
+         id="stop3186"
+         offset="0.57285708"
+         style="stop-color:#818181;stop-opacity:1" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1"
+         offset="0.67356479"
+         id="stop3188" />
+      <stop
+         id="stop3190"
+         offset="0.73765153"
+         style="stop-color:#bcbcbc;stop-opacity:1" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.86451715"
+         id="stop3192" />
+      <stop
+         id="stop3194"
+         offset="0.90767759"
+         style="stop-color:#333333;stop-opacity:1" />
+      <stop
+         style="stop-color:#7a7a7c;stop-opacity:1"
+         offset="0.96260905"
+         id="stop3196" />
+      <stop
+         id="stop3168"
+         offset="1"
+         style="stop-color:#c9c6c1;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5943">
+      <stop
+         id="stop5945"
+         offset="0"
+         style="stop-color:#383838;stop-opacity:1" />
+      <stop
+         style="stop-color:#3b3b3b;stop-opacity:1"
+         offset="0.05754738"
+         id="stop5947" />
+      <stop
+         id="stop5949"
+         offset="0.07978155"
+         style="stop-color:#626463;stop-opacity:1" />
+      <stop
+         style="stop-color:#bfbfbf;stop-opacity:1"
+         offset="0.12359595"
+         id="stop5951" />
+      <stop
+         id="stop5953"
+         offset="0.18899058"
+         style="stop-color:#808080;stop-opacity:1" />
+      <stop
+         style="stop-color:#e0e0e0;stop-opacity:1"
+         offset="0.25765494"
+         id="stop5955" />
+      <stop
+         id="stop5957"
+         offset="0.37405738"
+         style="stop-color:#ececec;stop-opacity:1" />
+      <stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.52577293"
+         id="stop5959" />
+      <stop
+         id="stop5961"
+         offset="0.57285708"
+         style="stop-color:#818181;stop-opacity:1" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1"
+         offset="0.67356479"
+         id="stop5963" />
+      <stop
+         id="stop5965"
+         offset="0.73765153"
+         style="stop-color:#bcbcbc;stop-opacity:1" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.86451715"
+         id="stop5967" />
+      <stop
+         id="stop5969"
+         offset="0.90767759"
+         style="stop-color:#333333;stop-opacity:1" />
+      <stop
+         style="stop-color:#7a7a7c;stop-opacity:1"
+         offset="0.96260905"
+         id="stop5971" />
+      <stop
+         id="stop5973"
+         offset="1"
+         style="stop-color:#c9c6c1;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4800">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop4802" />
+      <stop
+         id="stop4804"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop4806" />
+      <stop
+         id="stop4808"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop4810" />
+      <stop
+         id="stop4812"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop4814" />
+      <stop
+         id="stop4816"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop4818" />
+      <stop
+         id="stop4820"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop4822" />
+      <stop
+         id="stop4824"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop4826" />
+      <stop
+         id="stop4828"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop4830" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4850"
+       inkscape:collect="always">
+      <stop
+         id="stop4852"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4854"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6003">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6005" />
+      <stop
+         id="stop6007"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6009" />
+      <stop
+         id="stop6011"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6013" />
+      <stop
+         id="stop6015"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6017" />
+      <stop
+         id="stop6019"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6021" />
+      <stop
+         id="stop6023"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6025" />
+      <stop
+         id="stop6027"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6029" />
+      <stop
+         id="stop6031"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6033" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6047">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6049" />
+      <stop
+         id="stop6051"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6053" />
+      <stop
+         id="stop6055"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6057" />
+      <stop
+         id="stop6059"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6061" />
+      <stop
+         id="stop6063"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6065" />
+      <stop
+         id="stop6067"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6069" />
+      <stop
+         id="stop6071"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6073" />
+      <stop
+         id="stop6075"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6077" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6091">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6093" />
+      <stop
+         id="stop6095"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6097" />
+      <stop
+         id="stop6099"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6101" />
+      <stop
+         id="stop6103"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6105" />
+      <stop
+         id="stop6107"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6109" />
+      <stop
+         id="stop6111"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6113" />
+      <stop
+         id="stop6115"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6117" />
+      <stop
+         id="stop6119"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6121" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6135">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6137" />
+      <stop
+         id="stop6139"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6141" />
+      <stop
+         id="stop6143"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6145" />
+      <stop
+         id="stop6147"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6149" />
+      <stop
+         id="stop6151"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6153" />
+      <stop
+         id="stop6155"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6157" />
+      <stop
+         id="stop6159"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6161" />
+      <stop
+         id="stop6163"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6165" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6179">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6181" />
+      <stop
+         id="stop6183"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6185" />
+      <stop
+         id="stop6187"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6189" />
+      <stop
+         id="stop6191"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6193" />
+      <stop
+         id="stop6195"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6197" />
+      <stop
+         id="stop6199"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6201" />
+      <stop
+         id="stop6203"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6205" />
+      <stop
+         id="stop6207"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6209" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6223">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6225" />
+      <stop
+         id="stop6227"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6229" />
+      <stop
+         id="stop6231"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6233" />
+      <stop
+         id="stop6235"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6237" />
+      <stop
+         id="stop6239"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6241" />
+      <stop
+         id="stop6243"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6245" />
+      <stop
+         id="stop6247"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6249" />
+      <stop
+         id="stop6251"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6253" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6271">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6273" />
+      <stop
+         id="stop6275"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6277" />
+      <stop
+         id="stop6279"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6281" />
+      <stop
+         id="stop6283"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6285" />
+      <stop
+         id="stop6287"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6289" />
+      <stop
+         id="stop6291"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6293" />
+      <stop
+         id="stop6295"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6297" />
+      <stop
+         id="stop6299"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6301" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6311">
+      <stop
+         id="stop6313"
+         offset="0"
+         style="stop-color:#383838;stop-opacity:1" />
+      <stop
+         style="stop-color:#3b3b3b;stop-opacity:1"
+         offset="0.05754738"
+         id="stop6315" />
+      <stop
+         id="stop6317"
+         offset="0.07978155"
+         style="stop-color:#626463;stop-opacity:1" />
+      <stop
+         style="stop-color:#bfbfbf;stop-opacity:1"
+         offset="0.12359595"
+         id="stop6319" />
+      <stop
+         id="stop6321"
+         offset="0.18899058"
+         style="stop-color:#808080;stop-opacity:1" />
+      <stop
+         style="stop-color:#e0e0e0;stop-opacity:1"
+         offset="0.25765494"
+         id="stop6323" />
+      <stop
+         id="stop6325"
+         offset="0.37405738"
+         style="stop-color:#ececec;stop-opacity:1" />
+      <stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.52577293"
+         id="stop6327" />
+      <stop
+         id="stop6329"
+         offset="0.57285708"
+         style="stop-color:#818181;stop-opacity:1" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1"
+         offset="0.67356479"
+         id="stop6331" />
+      <stop
+         id="stop6333"
+         offset="0.73765153"
+         style="stop-color:#bcbcbc;stop-opacity:1" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.86451715"
+         id="stop6335" />
+      <stop
+         id="stop6337"
+         offset="0.90767759"
+         style="stop-color:#333333;stop-opacity:1" />
+      <stop
+         style="stop-color:#7a7a7c;stop-opacity:1"
+         offset="0.96260905"
+         id="stop6339" />
+      <stop
+         id="stop6341"
+         offset="1"
+         style="stop-color:#c9c6c1;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6344">
+      <stop
+         id="stop6346"
+         offset="0"
+         style="stop-color:#383838;stop-opacity:1" />
+      <stop
+         style="stop-color:#3b3b3b;stop-opacity:1"
+         offset="0.05754738"
+         id="stop6348" />
+      <stop
+         id="stop6350"
+         offset="0.07978155"
+         style="stop-color:#626463;stop-opacity:1" />
+      <stop
+         style="stop-color:#bfbfbf;stop-opacity:1"
+         offset="0.12359595"
+         id="stop6352" />
+      <stop
+         id="stop6354"
+         offset="0.18899058"
+         style="stop-color:#808080;stop-opacity:1" />
+      <stop
+         style="stop-color:#e0e0e0;stop-opacity:1"
+         offset="0.25765494"
+         id="stop6356" />
+      <stop
+         id="stop6358"
+         offset="0.37405738"
+         style="stop-color:#ececec;stop-opacity:1" />
+      <stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.52577293"
+         id="stop6360" />
+      <stop
+         id="stop6362"
+         offset="0.57285708"
+         style="stop-color:#818181;stop-opacity:1" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1"
+         offset="0.67356479"
+         id="stop6364" />
+      <stop
+         id="stop6366"
+         offset="0.73765153"
+         style="stop-color:#bcbcbc;stop-opacity:1" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.86451715"
+         id="stop6368" />
+      <stop
+         id="stop6370"
+         offset="0.90767759"
+         style="stop-color:#333333;stop-opacity:1" />
+      <stop
+         style="stop-color:#7a7a7c;stop-opacity:1"
+         offset="0.96260905"
+         id="stop6372" />
+      <stop
+         id="stop6374"
+         offset="1"
+         style="stop-color:#c9c6c1;stop-opacity:1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath24952">
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:url(#linearGradient24956);fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="M 75.200062,372.5 145.76888,400 c 6.86115,0 12.4375,-12.32 12.4375,-27.5 0,-15.18 -5.57635,-27.5 -12.4375,-27.5 l -70.568818,27.5 z"
+         id="path24954"
+         sodipodi:nodetypes="ccscc" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3164"
+       id="linearGradient7563"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2400412,0,0,1.0091871,-59.607089,50.7501)"
+       x1="726.91016"
+       y1="388.45044"
+       x2="726.91016"
+       y2="445.16745" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3164"
+       id="linearGradient7565"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2809327,0,0,1.0091871,-753.11664,-9.2499)"
+       x1="726.91016"
+       y1="388.45044"
+       x2="726.91016"
+       y2="445.16745" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3164"
+       id="linearGradient7567"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1680072,0,0,1.0091871,508.68297,50.7501)"
+       x1="726.91016"
+       y1="388.45044"
+       x2="726.91016"
+       y2="445.16745" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3164"
+       id="linearGradient7569"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3012701,0,0,1.0091871,209.77505,50.7501)"
+       x1="726.91016"
+       y1="388.45044"
+       x2="726.91016"
+       y2="445.16745" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4800"
+       id="linearGradient7571"
+       gradientUnits="userSpaceOnUse"
+       x1="480.07483"
+       y1="443.00705"
+       x2="480.07483"
+       y2="502.34891" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4850"
+       id="radialGradient7573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9254336,0,-1382.2662)"
+       cx="508.29752"
+       cy="471.40497"
+       fx="506.24673"
+       fy="469.36499"
+       r="7.1330748" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4800"
+       id="linearGradient7575"
+       gradientUnits="userSpaceOnUse"
+       x1="480.07483"
+       y1="443.00705"
+       x2="480.07483"
+       y2="502.34891" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4850"
+       id="radialGradient7577"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9254336,0,-1382.2662)"
+       cx="508.29752"
+       cy="471.40497"
+       fx="506.24673"
+       fy="469.36499"
+       r="7.1330748" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4800"
+       id="linearGradient7579"
+       gradientUnits="userSpaceOnUse"
+       x1="480.07483"
+       y1="443.00705"
+       x2="480.07483"
+       y2="502.34891" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4850"
+       id="radialGradient7581"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9254336,0,-1382.2662)"
+       cx="508.29752"
+       cy="471.40497"
+       fx="506.24673"
+       fy="469.36499"
+       r="7.1330748" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4800"
+       id="linearGradient7583"
+       gradientUnits="userSpaceOnUse"
+       x1="480.07483"
+       y1="443.00705"
+       x2="480.07483"
+       y2="502.34891" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4850"
+       id="radialGradient7585"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9254336,0,-1382.2662)"
+       cx="508.29752"
+       cy="471.40497"
+       fx="506.24673"
+       fy="469.36499"
+       r="7.1330748" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4800"
+       id="linearGradient7587"
+       gradientUnits="userSpaceOnUse"
+       x1="480.07483"
+       y1="443.00705"
+       x2="480.07483"
+       y2="502.34891" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4850"
+       id="radialGradient7589"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9254336,0,-1382.2662)"
+       cx="508.29752"
+       cy="471.40497"
+       fx="506.24673"
+       fy="469.36499"
+       r="7.1330748" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4800"
+       id="linearGradient7591"
+       gradientUnits="userSpaceOnUse"
+       x1="480.07483"
+       y1="443.00705"
+       x2="480.07483"
+       y2="502.34891" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4850"
+       id="radialGradient7593"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9254336,0,-1382.2662)"
+       cx="508.29752"
+       cy="471.40497"
+       fx="506.24673"
+       fy="469.36499"
+       r="7.1330748" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4800"
+       id="linearGradient7595"
+       gradientUnits="userSpaceOnUse"
+       x1="480.07483"
+       y1="443.00705"
+       x2="480.07483"
+       y2="502.34891" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4850"
+       id="radialGradient7597"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9254336,0,-1382.2662)"
+       cx="508.29752"
+       cy="471.40497"
+       fx="506.24673"
+       fy="469.36499"
+       r="7.1330748" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4800"
+       id="linearGradient7599"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(22.460937,0.5)"
+       x1="480.07483"
+       y1="443.00705"
+       x2="480.07483"
+       y2="502.34891" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4850"
+       id="radialGradient7601"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9254336,22.460937,-1381.7662)"
+       cx="508.29752"
+       cy="471.40497"
+       fx="506.24673"
+       fy="469.36499"
+       r="7.1330748" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4254"
+       id="linearGradient7819"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.3453988,2.3433546,-2.3453988,2.3433546,888.99082,-800.76954)"
+       x1="148.70325"
+       y1="318.68668"
+       x2="185.48425"
+       y2="318.68668" />
+    <linearGradient
+       id="linearGradient4254">
+      <stop
+         style="stop-color:#ff9191;stop-opacity:1;"
+         offset="0"
+         id="stop4256" />
+      <stop
+         style="stop-color:#b55858;stop-opacity:1;"
+         offset="1"
+         id="stop4258" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3707"
+       id="linearGradient7812"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.5278262,2.525623,-2.5278262,2.525623,565.91117,-1456.1414)"
+       x1="331.71732"
+       y1="437.79453"
+       x2="365.74753"
+       y2="437.79453" />
+    <linearGradient
+       id="linearGradient3707">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3687" />
+      <stop
+         style="stop-color:#ffdd7c;stop-opacity:1;"
+         offset="1"
+         id="stop3711" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3706"
+       id="linearGradient7803"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.5278262,2.525623,-2.5278262,2.525623,565.91117,-1456.1414)"
+       x1="335.71875"
+       y1="414.35938"
+       x2="353.75"
+       y2="414.35938" />
+    <linearGradient
+       id="linearGradient3706">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.82653064;"
+         offset="0"
+         id="stop3708" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3710" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.59375"
+     inkscape:cx="48"
+     inkscape:cy="48"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <rect
+       style="opacity:0.74621211;fill:url(#linearGradient5036);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect3108"
+       transform="matrix(0.99814788,-0.0608342,0.1048727,0.99448565,0,0)"
+       y="20.345436"
+       x="9.8783913"
+       height="67.883232"
+       width="69.919914" />
+    <rect
+       style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.29607227000000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect1307"
+       transform="matrix(0.99814788,-0.0608342,0.1048727,0.99448565,0,0)"
+       y="15.861851"
+       x="8.561965"
+       height="67.883232"
+       width="69.919914" />
+    <g
+       style="stroke:#000000;stroke-opacity:0.59230783"
+       id="g4884"
+       transform="matrix(0.20793162,-0.01267283,0.02328676,0.22082348,-23.130912,-47.964679)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1.13866174px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.59230783"
+         id="path4870"
+         d="m 186.47628,304.64652 c 0,294.06348 0,298.06436 0,298.06436"
+         inkscape:connector-curvature="0" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4872"
+         transform="translate(-48.94082,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4874"
+         transform="translate(146.8225,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4876"
+         transform="translate(48.94083,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4878"
+         transform="translate(97.88164,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4880"
+         transform="translate(195.7633,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4882"
+         transform="translate(244.7041,-4.83334e-5)" />
+    </g>
+    <g
+       style="stroke:#000000;stroke-opacity:0.59230783"
+       id="g4893"
+       transform="matrix(0.02408476,0.2283907,-0.20104234,0.01225295,131.69421,-21.337521)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1.13866174px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.59230783"
+         id="path4895"
+         d="m 186.47628,304.64652 c 0,294.06348 0,298.06436 0,298.06436"
+         inkscape:connector-curvature="0" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4897"
+         transform="translate(-48.94082,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4899"
+         transform="translate(146.8225,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4901"
+         transform="translate(48.94083,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4903"
+         transform="translate(97.88164,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4905"
+         transform="translate(195.7633,-4.83334e-5)" />
+      <use
+         xlink:href="#path4870"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="stroke:#000000;stroke-opacity:0.59230783"
+         id="use4907"
+         transform="translate(244.7041,-4.83334e-5)" />
+    </g>
+    <path
+       style="fill:none;stroke:#00ff00;stroke-width:1.83897913000000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3079"
+       d="M 16.218768,76.547907 C 31.101229,55.956505 30.780758,55.65855 30.780758,55.65855 l 10.49345,-1.909505 14.644046,-9.147247 7.564876,22.3982 11.173205,-14.65052 6.213125,12.32091"
+       inkscape:connector-curvature="0" />
+    <g
+       style="display:inline"
+       id="g7826"
+       transform="matrix(0.115758,0,0,0.11571841,10.873021,-12.558841)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4217"
+         d="m 567.37875,303.43872 c -23.74219,-23.72151 -49.66242,-36.32836 -57.81535,-28.18255 -0.55331,0.55283 -1.03674,1.17717 -1.40135,1.88692 l -51.6622,51.61716 7.79814,7.79135 30.3393,30.31286 9.74768,9.73918 38.13739,38.10415 53.36813,-53.32161 c -0.0295,-0.0959 -0.0306,-0.20765 -0.0608,-0.30424 l -0.0609,-0.0609 c 0.0182,-0.0196 0.0427,-0.041 0.0608,-0.0607 7.68509,-8.40037 -4.93401,-34.02535 -28.45077,-57.52159 z"
+         style="fill:url(#linearGradient7819);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4235"
+         d="m 470.45111,314.82116 -48.31151,48.26941 -5.54393,5.5391 7.79814,7.79134 78.22436,78.15619 53.85544,-53.8085 -43.01124,-42.97375 -35.21313,-35.18244 -7.79813,-7.79135 z"
+         style="fill:#e3dedb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4143"
+         d="m 538.98884,418.23823 -86.0225,-85.94753 -3.89896,3.89555 -1.94957,1.94788 86.0225,85.94754 1.94959,-1.94789 3.89894,-3.89555 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4147"
+         d="m 548.73649,408.49908 -86.0225,-85.94754 -3.89912,3.89573 -1.94959,1.94788 86.02251,85.94754 1.94958,-1.94789 3.89912,-3.89572 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4163"
+         d="m 529.24119,427.97739 -86.0225,-85.94753 -3.899,3.8956 -1.94954,1.94783 86.02251,85.94753 1.94954,-1.94784 3.89899,-3.89559 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4106"
+         d="M 429.20661,356.02971 244.3069,540.76828 209.33745,661.6548 l 10.96614,-3.16514 110.02581,-31.77385 184.89972,-184.73856 -16.69271,-16.67816 -5.84852,-5.84343 -15.59616,-15.58257 -1.94958,-1.94789 -5.84853,-5.84342 -1.94957,-1.94787 -15.596,-15.58241 -5.84871,-5.8436 -8.89459,-8.88684 -7.79814,-7.79135 z"
+         style="fill:url(#linearGradient7812);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path3990"
+         d="m 256.88237,647.92525 -16.90163,-16.88691 -16.90164,-16.8869 -13.74165,47.50336 47.54492,-13.72955 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4089"
+         d="m 595.82967,361.08194 c 0.0302,0.0966 0.0313,0.20835 0.0608,0.30424 l 0.12184,-0.12173 -0.18266,-0.18251 z"
+         style="fill:#ff9191;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccccc"
+         id="path3424"
+         d="m 429.20661,356.02971 -184.89971,184.73857 41.72824,1.2819 1.28303,41.69187 41.72821,1.28189 1.28302,41.69187 184.89972,-184.73856 -21.50563,-21.48689 -21.50561,-21.48687 -21.50563,-21.48689 -21.50564,-21.48689 z"
+         style="fill:#ffc700;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path3426"
+         d="M 429.20661,356.02971 244.3069,540.76828 286.03514,542.05018 450.71225,377.5166 429.20661,356.02971 z"
+         style="fill:#ffda00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path3428"
+         d="M 329.04638,585.02394 330.3294,626.71581 515.22912,441.97725 493.72349,420.49036 329.04638,585.02394 z"
+         style="fill:#ff8a00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path3430"
+         d="m 287.31817,583.74205 41.72821,1.28189 164.67711,-164.53358 -21.50561,-21.48687 -184.89971,184.73856 z"
+         style="fill:#ffa100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3680"
+         d="m 491.10332,336.97196 c -1.55737,-1.55595 -3.37139,-2.77366 -5.29264,-3.55165 -1.9213,-0.778 -3.961,-1.10496 -6.00358,-1.10496 -2.04264,0 -4.08234,0.32696 -6.00359,1.10496 -1.9213,0.77799 -3.73532,1.9957 -5.29264,3.55166 l -29.22798,29.20251 -173.55107,173.39981 c -0.53909,0.53862 -0.74357,1.23379 -1.18492,1.81529 l 21.48653,0.63141 1.2639,41.67278 24.64631,0.78925 172.91911,-172.7684 29.22798,-29.20251 c 1.55728,-1.55596 2.77612,-3.36843 3.55476,-5.28802 0.77861,-1.91961 1.1 [...]
+         style="fill:url(#linearGradient7803);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path4288"
+         d="m 239.98074,631.03834 -11.24479,-11.23005 -19.3985,41.84651 30.64329,-30.61646 z"
+         style="opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.16400003;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/emblem-shared.svg b/interface/images/menu/emblem-shared.svg
new file mode 100755
index 0000000..6dcec66
--- /dev/null
+++ b/interface/images/menu/emblem-shared.svg
@@ -0,0 +1,1119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.1 r9760"
+   version="1.0"
+   sodipodi:docname="emblem-shared.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline">
+  <defs
+     id="defs4">
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="16.759111"
+       x2="12.80275"
+       y1="3.7361259"
+       x1="12.80275"
+       gradientTransform="matrix(0.8458416,0,0,1.0765258,-1.4962477,-3.0220357)"
+       id="linearGradient5044">
+      <stop
+         style="stop-color:#323232;stop-opacity:1;"
+         offset="0"
+         id="stop5046" />
+      <stop
+         style="stop-color:#787878;stop-opacity:1;"
+         offset="1"
+         id="stop5048" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 11 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="22 : 11 : 1"
+       inkscape:persp3d-origin="11 : 7.3333333 : 1"
+       id="perspective2531" />
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(0.9883037,1.0118347)"
+       x1="9.3550024"
+       y1="21.742682"
+       x2="9.3550024"
+       y2="0.49362123"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         id="stop3277"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.70588237;" />
+      <stop
+         id="stop3279"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.15686275;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3232">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3234" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3236" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="-6.0004225"
+       x2="11"
+       y1="14.805666"
+       x1="11"
+       id="linearGradient3221"
+       xlink:href="#linearGradient3232"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonColor"
+       x1="10.31979"
+       y1="21"
+       x2="10.31979"
+       y2="0.99929649"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#d0d0d0;stop-opacity:1;"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow"
+       id="linearGradient38042"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.9883037,1.0118347)"
+       x1="9.3550024"
+       y1="21.742682"
+       x2="9.3550024"
+       y2="0.49362123" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2849">
+      <rect
+         ry="2"
+         rx="2"
+         y="1"
+         x="1"
+         height="20"
+         width="20"
+         id="rect2851"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2898"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3250"
+       id="linearGradient3962"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.1844416,0,0,-0.1860272,22.085665,22.521622)"
+       x1="84.35965"
+       y1="79.416924"
+       x2="84.35965"
+       y2="5.1837206" />
+    <linearGradient
+       id="linearGradient3250">
+      <stop
+         id="stop3252"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.49803922;"
+         offset="0.43290177"
+         id="stop3254" />
+      <stop
+         id="stop3256"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2838"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="XMLID_2_"
+       gradientUnits="userSpaceOnUse"
+       x1="32.328602"
+       y1="-43.420898"
+       x2="-1.0462"
+       y2="-75.051697"
+       gradientTransform="matrix(1,0,0,-1,7.916,-34.9062)">
+      <stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop22" />
+      <stop
+         id="stop3695"
+         style="stop-color:#4a4a4a;stop-opacity:1"
+         offset="0.38107949" />
+      <stop
+         offset="1"
+         style="stop-color:#1d1d1d;stop-opacity:0;"
+         id="stop26" />
+    </linearGradient>
+    <linearGradient
+       y2="-89.851723"
+       x2="16.449209"
+       y1="-42.637962"
+       x1="16.449209"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2847"
+       xlink:href="#StandardGradient"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective2849"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="StandardGradient"
+       gradientTransform="scale(1.1467263,0.8720476)"
+       x1="7.1904788"
+       y1="6.9551144"
+       x2="7.1904788"
+       y2="18.319494"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3280" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3282" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2867"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3778">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -20,6 0,16 6.15625,0 C -20.004456,18.99429 -18,15 -13,10 l -4,-3 11,0 0,11 -3,-4 c -3,3 -7.004456,4.99429 -4.84375,8 L -4,22 -4,6 -20,6 z"
+         id="path3780" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3892"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-12.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3894"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3899"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-12.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3903"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3908"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,-23.441965,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3915">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z m 4,1.90625 14,0 0,14 -3.8125,-5.09375 c -3.818182,3.818181 -8.90624,6.362051 -6.15625,10.1875 -7.840899,-3.825449 -5.301136,-8.917613 1.0625,-15.28125 L -26,1.90625 z"
+         id="path3917" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2874"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="-80.566788"
+       x2="-6.5612912"
+       y1="-43.688423"
+       x1="30.317072"
+       gradientTransform="matrix(-0.28504742,0,0,-0.28504742,15.15335,-6.2158718)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2847-2"
+       xlink:href="#XMLID_2_-7"
+       inkscape:collect="always" />
+    <linearGradient
+       id="XMLID_2_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="32.328602"
+       y1="-43.420898"
+       x2="-1.0462"
+       y2="-75.051697"
+       gradientTransform="matrix(1,0,0,-1,7.916,-34.9062)">
+      <stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop22-2" />
+      <stop
+         id="stop3695-2"
+         style="stop-color:#4a4a4a;stop-opacity:1"
+         offset="0.38107949" />
+      <stop
+         offset="1"
+         style="stop-color:#1d1d1d;stop-opacity:0;"
+         id="stop26-5" />
+    </linearGradient>
+    <linearGradient
+       y2="-84.79258"
+       x2="17.506266"
+       y1="-42.696442"
+       x1="17.506266"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-10.728242)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2884"
+       xlink:href="#StandardGradient"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3678"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3685"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3693"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3698"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,-22.990116,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3705">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z m 7.03125,6 9.09375,0.0625 0,9.0625 -2.9375,-2.9375 C -19.92878,13.501356 -21.635945,15.052995 -22,18 c -2,-3 -0.955178,-6.647168 1.96875,-9.0625 L -22.96875,6 z"
+         id="path3707" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-8.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-8.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3728"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3733"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,-23.950209,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3740">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z M -23.90625,4.96875 -13,5 l 0,10.875 -3.53125,-3.53125 c -3.741854,1.577603 -5.579694,4.615012 -6.21875,7 -2.401487,-3.602231 -1.167139,-7.974804 2.34375,-10.875 l -3.5,-3.5 z"
+         id="path3742" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2867-3"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="StandardGradient-0"
+       gradientTransform="scale(1.1338934,0.8819171)"
+       x1="8.7404661"
+       y1="4.5355735"
+       x2="8.7404661"
+       y2="20.492353"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3283" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3285" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3636">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z M -12.90625,4 -10,6.9375 -21.03125,18 -28,11 l 2.90625,-2.9375 4.0625,4.09375 L -12.90625,4 z"
+         id="path3638" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2893"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient2886"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-4)"
+       x1="11"
+       y1="6"
+       x2="11"
+       y2="24" />
+    <linearGradient
+       id="StandardGradient-5"
+       gradientTransform="matrix(0.8458416,0,0,1.0765258,-1.4962477,-3.0220357)"
+       x1="12.80275"
+       y1="3.7361259"
+       x2="12.80275"
+       y2="16.759111"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         id="stop3337"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3339"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       y2="24"
+       x2="11"
+       y1="6"
+       x1="11"
+       gradientTransform="matrix(0,-1,1,0,-4,25)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2902"
+       xlink:href="#StandardGradient-5"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient2948"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,-12,25)"
+       x1="11"
+       y1="6"
+       x2="11"
+       y2="24" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient2950"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,4,25)"
+       x1="11"
+       y1="6"
+       x2="11"
+       y2="24" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient3731"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,4,26)"
+       x1="24"
+       y1="7"
+       x2="4"
+       y2="7" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient3734"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,4,25)"
+       x1="24"
+       y1="7"
+       x2="4"
+       y2="7" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient3739"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,4,26)"
+       x1="24"
+       y1="7"
+       x2="4"
+       y2="7" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient3743"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,4,25)"
+       x1="24"
+       y1="7"
+       x2="4"
+       y2="7" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient3748"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,-26,25)"
+       x1="24"
+       y1="7"
+       x2="4"
+       y2="7" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3755">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z m 15,1 6,6 -6,6 0,-3 -6,0 0,-6 6,0 0,-3 z m -8,8 0,3 6,0 0,6 -6,0 0,3 -6,-6 6,-6 z"
+         id="path3757" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-5"
+       id="linearGradient3718"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-4,4,0,-80,30)"
+       x1="24"
+       y1="7"
+       x2="4"
+       y2="7" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3725">
+      <path
+         style="opacity:0.3;color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m -100,-74 0,96 96,0 0,-96 -96,0 z m 64,8 24,24 -24,24 0,-12 -24,0 0,-24 24,0 0,-12 z m -32,32 0,12 24,0 0,24 -24,0 0,12 -24,-24 24,-24 z"
+         id="path3728" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3730">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.2"
+         id="feGaussianBlur3732" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3052"
+       xlink:href="#ButtonColor-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonColor-6"
+       x1="10.31979"
+       y1="21"
+       x2="10.31979"
+       y2="0.99929649"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#c8c8c8;stop-opacity:1;"
+         offset="0"
+         id="stop3189-4" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3191-0" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3266">
+      <path
+         style="opacity:0.3;color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3268"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3101"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4360"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4362" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4364" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4367"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4369" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4371" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4374"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4376" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4378" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4381"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4383" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4385" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="translate(0,-97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4396"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3699"
+       id="linearGradient4419"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.20233772,0,0,0.1982564,18.677235,22.071656)"
+       x1="127.99561"
+       y1="272.01312"
+       x2="127.99561"
+       y2="39.990356" />
+    <linearGradient
+       id="linearGradient3699">
+      <stop
+         style="stop-color:#aa7932;stop-opacity:0.78431374;"
+         offset="0"
+         id="stop3701" />
+      <stop
+         style="stop-color:#aa7932;stop-opacity:0.39215687;"
+         offset="1"
+         id="stop3703" />
+    </linearGradient>
+    <linearGradient
+       y2="39.990356"
+       x2="127.99561"
+       y1="272.01312"
+       x1="127.99561"
+       gradientTransform="matrix(0.28151335,0,0,-0.275835,8.246504,17.030886)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3124"
+       xlink:href="#linearGradient5044"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5044"
+       id="linearGradient3984"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28151335,0,0,-0.275835,8.246504,18.030886)"
+       x1="127.99561"
+       y1="272.01312"
+       x2="127.99561"
+       y2="39.990356" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5044"
+       id="linearGradient3986"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28151335,0,0,-0.275835,8.246504,91.030886)"
+       x1="127.99561"
+       y1="272.01312"
+       x2="127.99561"
+       y2="39.990356" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5044"
+       id="linearGradient3991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28151335,0,0,-0.275835,8.246504,92.030886)"
+       x1="127.99561"
+       y1="272.01312"
+       x2="127.99561"
+       y2="39.990356" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5044"
+       id="linearGradient3995"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28151335,0,0,-0.275835,8.246504,17.030886)"
+       x1="127.99561"
+       y1="272.01312"
+       x2="127.99561"
+       y2="39.990356" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5044"
+       id="linearGradient4000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28151335,0,0,-0.275835,8.246504,17.030886)"
+       x1="127.99561"
+       y1="272.01312"
+       x2="127.99561"
+       y2="39.990356" />
+    <filter
+       inkscape:collect="always"
+       id="filter4005">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.83447898"
+         id="feGaussianBlur4007" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#e7e7e7"
+     borderopacity="1"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.9342091"
+     inkscape:cx="52.10475"
+     inkscape:cy="51.120619"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:showpageshadow="false"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1030"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <sodipodi:guide
+       orientation="1,0"
+       position="0,112"
+       id="guide2383" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="26.278146,128"
+       id="guide2385" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="128,54.082119"
+       id="guide2387" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="78.156291,0"
+       id="guide2389" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="60.863576,64.084768"
+       id="guide2391" />
+    <inkscape:grid
+       type="xygrid"
+       id="grid3672"
+       visible="true"
+       enabled="true"
+       empspacing="8"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Button"
+     sodipodi:insensitive="true">
+    <g
+       style="display:inline"
+       id="g3202"
+       clip-path="url(#clipPath3266)">
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+         id="path3786"
+         style="opacity:0.07999998;fill:url(#linearGradient3101);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+         inkscape:radius="0.99097413"
+         sodipodi:type="inkscape:offset" />
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+         id="path3778"
+         style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+         inkscape:radius="1.0360184"
+         sodipodi:type="inkscape:offset" />
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+         id="path3770"
+         style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+         inkscape:radius="0.98962283"
+         sodipodi:type="inkscape:offset" />
+      <rect
+         transform="scale(1,-1)"
+         ry="7"
+         rx="7"
+         y="-92"
+         x="5"
+         height="85"
+         width="86"
+         id="rect3723"
+         style="opacity:0.3;fill:url(#linearGradient3725-9);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+      <rect
+         style="opacity:0.45;fill:url(#linearGradient4396);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         id="rect3716"
+         width="84"
+         height="84"
+         x="6"
+         y="-91"
+         rx="6"
+         ry="6"
+         transform="scale(1,-1)" />
+    </g>
+    <rect
+       style="opacity:0.75;fill:url(#linearGradient3052);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.5;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.2;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:label="Emblem"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,74)">
+    <path
+       style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter4005);opacity:0.2"
+       d="m 59.79864,5.9974857 c -5.6742,0.00414 -10.933433,-4.8040888 -11.003651,-10.5715207 -0.09199,-3.2975323 -0.975179,-6.90651 -3.902173,-8.827802 -4.333422,-3.495849 -10.262945,-0.0088 -14.861385,-2.763148 -4.978974,-2.479804 -7.480273,-8.941045 -5.173463,-14.066915 1.842488,-4.488265 6.763455,-7.390008 11.598549,-6.76383 3.426934,0.420038 7.304309,0.03167 9.719042,-2.720878 3.848455,-3.686254 1.339407,-9.82422 4.733489,-13.763769 3.694832,-5.098588 11.700814,-6.05486 16.442351,-1 [...]
+       id="path3998"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:1;color:#000000;fill:url(#linearGradient3124);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 59.79864,5.9974857 c -2.523146,-0.0537 -5.047828,-0.931008 -7.108212,-2.67215 -6.626141,-5.59948 -1.479549,-11.417204 -7.257767,-16.3001257 -5.778211,-4.882929 -10.898062,0.953379 -17.524207,-4.646097 l 0,-0.0086 c -1.471703,-1.243676 -2.533653,-2.783677 -3.175822,-4.447838 -0.0043,-0.01085 -0.0046,-0.02353 -0.0088,-0.03449 -0.129321,-0.338426 -0.239828,-0.678158 -0.334295,-1.02576 -0.04193,-0.154327 -0.08812,-0.309725 -0.123172,-0.465472 -0.0039,-0.01702 -0.0051,-0.03467 -0. [...]
+       id="path3984-0-3-4-7" />
+    <path
+       style="opacity:0.1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 59.78125 16 C 57.258626 16.052457 54.747898 16.94631 52.6875 18.6875 C 46.061358 24.28698 51.215718 30.085827 45.4375 34.96875 C 39.65929 39.851679 34.532394 34.025524 27.90625 39.625 C 26.434547 40.868677 25.360917 42.429589 24.71875 44.09375 C 24.71455 44.10483 24.72305 44.11401 24.71875 44.125 C 24.589426 44.463427 24.46947 44.7774 24.375 45.125 C 24.332338 45.280461 24.31681 45.43706 24.28125 45.59375 C 24.27745 45.6109 24.2538 45.63907 24.25 45.65625 C 24.177771 45.98474 [...]
+       transform="translate(0,-74)"
+       id="path3969" />
+    <path
+       style="opacity:0.2;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 59.78125,-58 c -5.662928,0.01345 -10.914051,4.820467 -10.98567,10.578316 -0.0889,3.294597 -0.974011,6.898702 -3.897945,8.81751 -4.334974,3.49632 -10.268174,0.0172 -14.868174,2.772935 -4.868288,2.421988 -7.382017,8.642181 -5.310711,13.706239 1.68149,4.682529 6.794348,7.761291 11.738742,7.122525 3.428663,-0.416247 7.306808,-0.02666 9.722844,2.726309 3.846398,3.680402 1.334172,9.811908 4.726029,13.745641 3.654855,5.021904 11.523066,6.086214 16.278238,2.011269 4.77389,-3.616827 5 [...]
+       id="path3965"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 59.78125 16 C 57.258626 16.052457 54.747898 16.94631 52.6875 18.6875 C 46.061358 24.28698 51.215718 30.085827 45.4375 34.96875 C 39.65929 39.851679 34.532394 34.025524 27.90625 39.625 C 26.434547 40.868677 25.360917 42.429589 24.71875 44.09375 C 24.71455 44.10483 24.72305 44.11401 24.71875 44.125 C 24.589426 44.463427 24.46947 44.7774 24.375 45.125 C 24.332338 45.280461 24.31681 45.43706 24.28125 45.59375 C 24.27745 45.6109 24.2538 45.63907 24.25 45.65625 C 24.177771 45.98474 [...]
+       transform="translate(0,-74)"
+       id="path3980" />
+    <path
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.5"
+       d="M 71.28125 27.53125 C 71.145515 30.455206 69.847469 33.312024 67.40625 35.375 C 60.780106 40.974473 55.653215 35.148326 49.875 40.03125 C 46.956073 42.497916 46.832279 45.20484 46.5625 48 C 46.57864 48.167229 46.609247 48.333404 46.625 48.5 C 46.872367 45.884679 47.133329 43.348124 49.875 41.03125 C 55.653215 36.148326 60.780106 41.974473 67.40625 36.375 C 70.124793 34.077669 71.429538 30.791603 71.28125 27.53125 z M 24 48.53125 C 23.9966 48.611149 24.0015 48.70128 24 48.78125  [...]
+       transform="translate(0,-74)"
+       id="path3989" />
+  </g>
+</svg>
diff --git a/interface/images/menu/emblem-system.svg b/interface/images/menu/emblem-system.svg
new file mode 100755
index 0000000..ef7b421
--- /dev/null
+++ b/interface/images/menu/emblem-system.svg
@@ -0,0 +1,994 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.1 r9760"
+   version="1.0"
+   sodipodi:docname="emblem-system.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 11 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="22 : 11 : 1"
+       inkscape:persp3d-origin="11 : 7.3333333 : 1"
+       id="perspective2531" />
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(0.9883037,1.0118347)"
+       x1="9.3550024"
+       y1="21.742682"
+       x2="9.3550024"
+       y2="0.49362123"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         id="stop3277"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.70588237;" />
+      <stop
+         id="stop3279"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.15686275;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3232">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3234" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3236" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="-6.0004225"
+       x2="11"
+       y1="14.805666"
+       x1="11"
+       id="linearGradient3221"
+       xlink:href="#linearGradient3232"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonColor"
+       x1="10.31979"
+       y1="21"
+       x2="10.31979"
+       y2="0.99929649"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#d0d0d0;stop-opacity:1;"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow"
+       id="linearGradient38042"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.9883037,1.0118347)"
+       x1="9.3550024"
+       y1="21.742682"
+       x2="9.3550024"
+       y2="0.49362123" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2849">
+      <rect
+         ry="2"
+         rx="2"
+         y="1"
+         x="1"
+         height="20"
+         width="20"
+         id="rect2851"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2898"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3250"
+       id="linearGradient3962"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.1844416,0,0,-0.1860272,22.085665,22.521622)"
+       x1="84.35965"
+       y1="79.416924"
+       x2="84.35965"
+       y2="5.1837206" />
+    <linearGradient
+       id="linearGradient3250">
+      <stop
+         id="stop3252"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.49803922;"
+         offset="0.43290177"
+         id="stop3254" />
+      <stop
+         id="stop3256"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2838"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="XMLID_2_"
+       gradientUnits="userSpaceOnUse"
+       x1="32.328602"
+       y1="-43.420898"
+       x2="-1.0462"
+       y2="-75.051697"
+       gradientTransform="matrix(1,0,0,-1,7.916,-34.9062)">
+      <stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop22" />
+      <stop
+         id="stop3695"
+         style="stop-color:#4a4a4a;stop-opacity:1"
+         offset="0.38107949" />
+      <stop
+         offset="1"
+         style="stop-color:#1d1d1d;stop-opacity:0;"
+         id="stop26" />
+    </linearGradient>
+    <linearGradient
+       y2="-89.851723"
+       x2="16.449209"
+       y1="-42.637962"
+       x1="16.449209"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2847"
+       xlink:href="#StandardGradient"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective2849"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="StandardGradient"
+       gradientTransform="scale(1.1467263,0.8720476)"
+       x1="7.1904788"
+       y1="6.9551144"
+       x2="7.1904788"
+       y2="18.319494"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3280" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3282" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2867"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3778">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -20,6 0,16 6.15625,0 C -20.004456,18.99429 -18,15 -13,10 l -4,-3 11,0 0,11 -3,-4 c -3,3 -7.004456,4.99429 -4.84375,8 L -4,22 -4,6 -20,6 z"
+         id="path3780" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3892"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-12.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3894"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3899"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-12.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3903"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3908"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,-23.441965,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3915">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z m 4,1.90625 14,0 0,14 -3.8125,-5.09375 c -3.818182,3.818181 -8.90624,6.362051 -6.15625,10.1875 -7.840899,-3.825449 -5.301136,-8.917613 1.0625,-15.28125 L -26,1.90625 z"
+         id="path3917" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2874"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="-80.566788"
+       x2="-6.5612912"
+       y1="-43.688423"
+       x1="30.317072"
+       gradientTransform="matrix(-0.28504742,0,0,-0.28504742,15.15335,-6.2158718)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2847-2"
+       xlink:href="#XMLID_2_-7"
+       inkscape:collect="always" />
+    <linearGradient
+       id="XMLID_2_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="32.328602"
+       y1="-43.420898"
+       x2="-1.0462"
+       y2="-75.051697"
+       gradientTransform="matrix(1,0,0,-1,7.916,-34.9062)">
+      <stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop22-2" />
+      <stop
+         id="stop3695-2"
+         style="stop-color:#4a4a4a;stop-opacity:1"
+         offset="0.38107949" />
+      <stop
+         offset="1"
+         style="stop-color:#1d1d1d;stop-opacity:0;"
+         id="stop26-5" />
+    </linearGradient>
+    <linearGradient
+       y2="-84.79258"
+       x2="17.506266"
+       y1="-42.696442"
+       x1="17.506266"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-10.728242)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2884"
+       xlink:href="#StandardGradient"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3678"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3685"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3693"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3698"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,-22.990116,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3705">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z m 7.03125,6 9.09375,0.0625 0,9.0625 -2.9375,-2.9375 C -19.92878,13.501356 -21.635945,15.052995 -22,18 c -2,-3 -0.955178,-6.647168 1.96875,-9.0625 L -22.96875,6 z"
+         id="path3707" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-8.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-8.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3728"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3733"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,-23.950209,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3740">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z M -23.90625,4.96875 -13,5 l 0,10.875 -3.53125,-3.53125 c -3.741854,1.577603 -5.579694,4.615012 -6.21875,7 -2.401487,-3.602231 -1.167139,-7.974804 2.34375,-10.875 l -3.5,-3.5 z"
+         id="path3742" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2876"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="45.017357"
+       x2="20.758585"
+       y1="1"
+       x1="20.758585"
+       gradientTransform="matrix(1.4883689,0,0,1.4883689,12.279154,-60.232443)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4427"
+       xlink:href="#linearGradient3904"
+       inkscape:collect="always" />
+    <linearGradient
+       id="StandardGradient-9">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3389-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3391-3" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4461">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z m 9.75,2 2.5,0 c 0.354191,0 0.625,0.2960006 0.625,0.65625 l 0,1.28125 c 0.633321,0.1687424 1.258817,0.3967312 1.8125,0.71875 l 0.90625,-0.875 c 0.254734,-0.2547 0.624543,-0.2816994 0.875,-0.03125 L -11.75,5.53125 c 0.250482,0.250452 0.22348,0.6202678 -0.03125,0.875 l -0.875,0.90625 c 0.322016,0.5536838 0.550009,1.1791804 0.71875,1.8125 l 1.28125,0 C -10.296007,9.125 -10,9.3958086 -10,9.75 l 0,2.5 c 0,0.354193 -0.296007,0.625008 -0.65625,0.625 l [...]
+         id="path4463" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-9"
+       id="linearGradient3702"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.6744133,0,0,1.6744133,-92.185946,-64.51142)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3709">
+      <path
+         style="opacity:0.3;color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m -100,-74 0,96 96,0 0,-96 -96,0 z m 43.03125,12 9.9375,0 c 1.416764,0 2.5625,1.184002 2.5625,2.625 l 0,5.0625 c 2.533284,0.67497 4.972768,1.711925 7.1875,3 l 3.59375,-3.625 c 1.018936,-1.0188 2.623172,-1.064298 3.625,-0.0625 L -23,-47.9375 c 1.001928,1.001808 0.95642,2.606071 -0.0625,3.625 l -3.625,3.59375 c 1.288064,2.214735 2.325036,4.654221 3,7.1875 l 5.0625,0 c 1.440972,0 2.625,1.145734 2.625,2.5625 l 0,9.9375 c 0,1.416772 -1.184024,2.562532 -2.625,2.5625 l -5.0625,0 c - [...]
+         id="path3711" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3713">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0799995"
+         id="feGaussianBlur3715" />
+    </filter>
+    <inkscape:perspective
+       id="perspective3918"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3904"
+       id="linearGradient3634"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="3.9374998"
+       x2="11"
+       y2="18.083122"
+       gradientTransform="matrix(4,0,0,4,4,-70)" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="18.083122"
+       x2="11"
+       y1="3.9374998"
+       x1="11"
+       id="linearGradient3904">
+      <stop
+         id="stop3906"
+         offset="0"
+         style="stop-color:#323232;stop-opacity:1;" />
+      <stop
+         id="stop3908"
+         offset="1"
+         style="stop-color:#787878;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="18.083122"
+       x2="11"
+       y1="3.9374998"
+       x1="11"
+       gradientTransform="matrix(4,0,0,4,30,-67)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3927"
+       xlink:href="#linearGradient3904"
+       inkscape:collect="always" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3266">
+      <path
+         style="opacity:0.3;color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3268"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3101"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4205"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4207" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4212"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4214" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4216" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4219"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4221" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4223" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4226"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4228" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4230" />
+    </linearGradient>
+    <linearGradient
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3052"
+       xlink:href="#ButtonColor-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonColor-6"
+       x1="10.31979"
+       y1="21"
+       x2="10.31979"
+       y2="0.99929649"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#c8c8c8;stop-opacity:1;"
+         offset="0"
+         id="stop3189-4" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3191-0" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="translate(0,-97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4256"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3904"
+       id="linearGradient3954"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4883689,0,0,1.4883689,12.279154,-59.232443)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3904"
+       id="linearGradient3956"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4883689,0,0,1.4883689,12.279154,13.767557)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3904"
+       id="linearGradient3961"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4883689,0,0,1.4883689,12.279154,14.767557)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3904"
+       id="linearGradient3965"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4883689,0,0,1.4883689,12.279154,-60.232443)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <filter
+       inkscape:collect="always"
+       id="filter3970">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.96000046"
+         id="feGaussianBlur3972" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#e7e7e7"
+     borderopacity="1"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.9455181"
+     inkscape:cx="9.7759971"
+     inkscape:cy="57.543818"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:showpageshadow="false"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1030"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <sodipodi:guide
+       orientation="1,0"
+       position="0,112"
+       id="guide2383" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="26.278146,128"
+       id="guide2385" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="128,54.082119"
+       id="guide2387" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="78.156291,0"
+       id="guide2389" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="60.863576,64.084768"
+       id="guide2391" />
+    <inkscape:grid
+       type="xygrid"
+       id="grid3672"
+       visible="true"
+       enabled="true"
+       empspacing="8"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Button"
+     sodipodi:insensitive="true">
+    <g
+       style="display:inline"
+       id="g3202"
+       clip-path="url(#clipPath3266)">
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+         id="path3786"
+         style="opacity:0.07999998;fill:url(#linearGradient3101);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+         inkscape:radius="0.99097413"
+         sodipodi:type="inkscape:offset" />
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+         id="path3778"
+         style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+         inkscape:radius="1.0360184"
+         sodipodi:type="inkscape:offset" />
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+         id="path3770"
+         style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+         inkscape:radius="0.98962283"
+         sodipodi:type="inkscape:offset" />
+      <rect
+         transform="scale(1,-1)"
+         ry="7"
+         rx="7"
+         y="-92"
+         x="5"
+         height="85"
+         width="86"
+         id="rect3723"
+         style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+      <rect
+         style="opacity:0.45;fill:url(#linearGradient4256);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         id="rect3716"
+         width="84"
+         height="84"
+         x="6"
+         y="-91"
+         rx="6"
+         ry="6"
+         transform="scale(1,-1)" />
+    </g>
+    <rect
+       style="opacity:0.75;fill:url(#linearGradient3052);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.5;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.2;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:label="Emblem"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     transform="translate(0,74)">
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:4;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter3970);opacity:0.2"
+       id="path3968"
+       d="m 43.581415,-57.999882 c -1.259362,0 -2.279075,1.044691 -2.279075,2.325571 l 0,4.511619 c -2.251806,0.599969 -4.403417,1.506206 -6.37207,2.651157 l -3.209299,-3.209292 c -0.452869,-0.452845 -0.995342,-0.692713 -1.581391,-0.697673 -0.586047,-0.005 -1.182653,0.205942 -1.6279,0.651159 l -6.279058,6.279051 c -0.890492,0.890497 -0.859207,2.303581 0.04646,3.209301 l 3.209298,3.209288 c -1.144962,1.968651 -2.051198,4.12027 -2.65118,6.37208 l -4.511615,0 c -1.280881,0 -2.325581,1.01971 [...]
+    <path
+       d="m 43.581415,-57.999882 c -1.259362,0 -2.279075,1.044691 -2.279075,2.325571 l 0,4.511619 c -2.251806,0.599969 -4.403417,1.506206 -6.37207,2.651157 l -3.209299,-3.209292 c -0.452869,-0.452845 -0.995342,-0.692713 -1.581391,-0.697673 -0.586047,-0.005 -1.182653,0.205942 -1.6279,0.651159 l -6.279058,6.279051 c -0.890492,0.890497 -0.859207,2.303581 0.04646,3.209301 l 3.209298,3.209288 c -1.144962,1.968651 -2.051198,4.12027 -2.65118,6.37208 l -4.511615,0 c -1.280881,0 -2.325581,1.01971 [...]
+       id="rect3267"
+       style="fill:url(#linearGradient4427);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="opacity:0.3;color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3698"
+       width="96"
+       height="96"
+       x="-100"
+       y="-74" />
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate;opacity:0.1"
+       d="M 43.59375 16 C 42.334388 16 41.3125 17.03162 41.3125 18.3125 L 41.3125 22.84375 C 39.060694 23.443719 36.906153 24.355049 34.9375 25.5 L 31.71875 22.28125 C 31.265881 21.828405 30.711049 21.59871 30.125 21.59375 C 29.538953 21.58875 28.945247 21.773533 28.5 22.21875 L 22.21875 28.5 C 21.328258 29.390497 21.375583 30.81303 22.28125 31.71875 L 25.5 34.9375 C 24.355038 36.906151 23.443732 39.06069 22.84375 41.3125 L 18.3125 41.3125 C 17.031619 41.3125 16 42.334397 16 43.59375 L 1 [...]
+       transform="translate(0,-74)"
+       id="path3940" />
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate;opacity:0.2"
+       d="M 43.59375 16 C 42.334388 16 41.3125 17.03162 41.3125 18.3125 L 41.3125 22.84375 C 39.060694 23.443719 36.906153 24.355049 34.9375 25.5 L 31.71875 22.28125 C 31.265881 21.828405 30.711049 21.59871 30.125 21.59375 C 29.538953 21.58875 28.945247 21.773533 28.5 22.21875 L 22.21875 28.5 C 21.328258 29.390497 21.375583 30.81303 22.28125 31.71875 L 25.5 34.9375 C 24.355038 36.906151 23.443732 39.06069 22.84375 41.3125 L 18.3125 41.3125 C 17.031619 41.3125 16 42.334397 16 43.59375 L 1 [...]
+       transform="translate(0,-74)"
+       id="path3168" />
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate;opacity:0.3"
+       d="M 43.59375 16 C 42.334388 16 41.3125 17.03162 41.3125 18.3125 L 41.3125 19.3125 C 41.3125 18.03162 42.334388 17 43.59375 17 L 52.40625 17 C 53.665597 17 54.6875 18.03161 54.6875 19.3125 L 54.6875 18.3125 C 54.6875 17.03161 53.665597 16 52.40625 16 L 43.59375 16 z M 30.125 21.59375 C 29.538953 21.58875 28.945247 21.773533 28.5 22.21875 L 22.21875 28.5 C 21.63804 29.080713 21.466107 29.885442 21.65625 30.625 C 21.741705 30.221827 21.901617 29.817135 22.21875 29.5 L 28.5 23.21875  [...]
+       transform="translate(0,-74)"
+       id="path3950" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate;opacity:0.5"
+       d="M 21.65625 30.625 C 21.501751 31.353915 21.69812 32.135586 22.28125 32.71875 L 25.15625 35.59375 C 25.274831 35.375833 25.375706 35.151211 25.5 34.9375 L 22.28125 31.71875 C 21.966189 31.403671 21.757683 31.01952 21.65625 30.625 z M 74.34375 30.625 C 74.242314 31.019519 74.033825 31.403672 73.71875 31.71875 L 70.5 34.9375 C 70.624292 35.151211 70.725171 35.375832 70.84375 35.59375 L 73.71875 32.71875 C 74.301906 32.135589 74.498272 31.353914 74.34375 30.625 z M 48 38.3125 C 42. [...]
+       transform="translate(0,-74)"
+       id="path3959" />
+  </g>
+</svg>
diff --git a/interface/images/menu/emblem-ubuntuone-unsynchronized.svg b/interface/images/menu/emblem-ubuntuone-unsynchronized.svg
new file mode 100755
index 0000000..dd2aeff
--- /dev/null
+++ b/interface/images/menu/emblem-ubuntuone-unsynchronized.svg
@@ -0,0 +1,912 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.1 r9760"
+   version="1.0"
+   sodipodi:docname="emblem-ubuntuone-unsynchronized.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 11 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="22 : 11 : 1"
+       inkscape:persp3d-origin="11 : 7.3333333 : 1"
+       id="perspective2531" />
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(0.9883037,1.0118347)"
+       x1="9.3550024"
+       y1="21.742682"
+       x2="9.3550024"
+       y2="0.49362123"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         id="stop3277"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.70588237;" />
+      <stop
+         id="stop3279"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.15686275;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3232">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3234" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3236" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="-6.0004225"
+       x2="11"
+       y1="14.805666"
+       x1="11"
+       id="linearGradient3221"
+       xlink:href="#linearGradient3232"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonColor"
+       x1="10.31979"
+       y1="21"
+       x2="10.31979"
+       y2="0.99929649"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#d0d0d0;stop-opacity:1;"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow"
+       id="linearGradient38042"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.9883037,1.0118347)"
+       x1="9.3550024"
+       y1="21.742682"
+       x2="9.3550024"
+       y2="0.49362123" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2849">
+      <rect
+         ry="2"
+         rx="2"
+         y="1"
+         x="1"
+         height="20"
+         width="20"
+         id="rect2851"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2898"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3250"
+       id="linearGradient3962"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.1844416,0,0,-0.1860272,22.085665,22.521622)"
+       x1="84.35965"
+       y1="79.416924"
+       x2="84.35965"
+       y2="5.1837206" />
+    <linearGradient
+       id="linearGradient3250">
+      <stop
+         id="stop3252"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.49803922;"
+         offset="0.43290177"
+         id="stop3254" />
+      <stop
+         id="stop3256"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2838"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="XMLID_2_"
+       gradientUnits="userSpaceOnUse"
+       x1="32.328602"
+       y1="-43.420898"
+       x2="-1.0462"
+       y2="-75.051697"
+       gradientTransform="matrix(1,0,0,-1,7.916,-34.9062)">
+      <stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop22" />
+      <stop
+         id="stop3695"
+         style="stop-color:#4a4a4a;stop-opacity:1"
+         offset="0.38107949" />
+      <stop
+         offset="1"
+         style="stop-color:#1d1d1d;stop-opacity:0;"
+         id="stop26" />
+    </linearGradient>
+    <linearGradient
+       y2="-89.851723"
+       x2="16.449209"
+       y1="-42.637962"
+       x1="16.449209"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2847"
+       xlink:href="#StandardGradient"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective2849"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="StandardGradient"
+       gradientTransform="scale(1.1467263,0.8720476)"
+       x1="7.1904788"
+       y1="6.9551144"
+       x2="7.1904788"
+       y2="18.319494"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3280" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3282" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2867"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3778">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -20,6 0,16 6.15625,0 C -20.004456,18.99429 -18,15 -13,10 l -4,-3 11,0 0,11 -3,-4 c -3,3 -7.004456,4.99429 -4.84375,8 L -4,22 -4,6 -20,6 z"
+         id="path3780" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3892"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-12.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3894"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3899"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-12.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3903"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,6.5580347,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3908"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36278763,0,0,-0.36278763,-23.441965,-13.63994)"
+       x1="16.449209"
+       y1="-42.637962"
+       x2="16.449209"
+       y2="-89.851723" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3915">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z m 4,1.90625 14,0 0,14 -3.8125,-5.09375 c -3.818182,3.818181 -8.90624,6.362051 -6.15625,10.1875 -7.840899,-3.825449 -5.301136,-8.917613 1.0625,-15.28125 L -26,1.90625 z"
+         id="path3917" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2874"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="-80.566788"
+       x2="-6.5612912"
+       y1="-43.688423"
+       x1="30.317072"
+       gradientTransform="matrix(-0.28504742,0,0,-0.28504742,15.15335,-6.2158718)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2847-2"
+       xlink:href="#XMLID_2_-7"
+       inkscape:collect="always" />
+    <linearGradient
+       id="XMLID_2_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="32.328602"
+       y1="-43.420898"
+       x2="-1.0462"
+       y2="-75.051697"
+       gradientTransform="matrix(1,0,0,-1,7.916,-34.9062)">
+      <stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop22-2" />
+      <stop
+         id="stop3695-2"
+         style="stop-color:#4a4a4a;stop-opacity:1"
+         offset="0.38107949" />
+      <stop
+         offset="1"
+         style="stop-color:#1d1d1d;stop-opacity:0;"
+         id="stop26-5" />
+    </linearGradient>
+    <linearGradient
+       y2="-84.79258"
+       x2="17.506266"
+       y1="-42.696442"
+       x1="17.506266"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-10.728242)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2884"
+       xlink:href="#StandardGradient"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3678"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3685"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-81.445648" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-5.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3693"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,7.0098844,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3698"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.28504742,0,0,-0.28504742,-22.990116,-6.215871)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3705">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z m 7.03125,6 9.09375,0.0625 0,9.0625 -2.9375,-2.9375 C -19.92878,13.501356 -21.635945,15.052995 -22,18 c -2,-3 -0.955178,-6.647168 1.96875,-9.0625 L -22.96875,6 z"
+         id="path3707" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-8.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-8.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3728"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,6.0497912,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3733"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34226893,0,0,-0.34226893,-23.950209,-9.7282418)"
+       x1="17.506266"
+       y1="-42.696442"
+       x2="17.506266"
+       y2="-84.79258" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3740">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z M -23.90625,4.96875 -13,5 l 0,10.875 -3.53125,-3.53125 c -3.741854,1.577603 -5.579694,4.615012 -6.21875,7 -2.401487,-3.602231 -1.167139,-7.974804 2.34375,-10.875 l -3.5,-3.5 z"
+         id="path3742" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2867-3"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="StandardGradient-0"
+       gradientTransform="scale(1.1338934,0.8819171)"
+       x1="8.7404661"
+       y1="4.5355735"
+       x2="8.7404661"
+       y2="20.492353"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3283" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3285" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3636">
+      <path
+         style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
+         d="m -30,0 0,22 22,0 0,-22 -22,0 z M -12.90625,4 -10,6.9375 -21.03125,18 -28,11 l 2.90625,-2.9375 4.0625,4.09375 L -12.90625,4 z"
+         id="path3638" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2847"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="StandardGradient-9"
+       gradientTransform="scale(1.0744355,0.9307213)"
+       x1="10.458337"
+       y1="4.3967042"
+       x2="10.458337"
+       y2="19.290417"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3280-5" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3282-8" />
+    </linearGradient>
+    <linearGradient
+       y2="19.290417"
+       x2="10.458337"
+       y1="4.3967042"
+       x1="10.458337"
+       gradientTransform="scale(1.0744355,0.9307213)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2855"
+       xlink:href="#StandardGradient-9"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-9"
+       id="linearGradient2944"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.0744355,0,0,-0.9307213,24,22.044085)"
+       x1="10.458337"
+       y1="4.3967042"
+       x2="10.458337"
+       y2="19.290417" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-9"
+       id="linearGradient2949"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.0744355,0,0,-0.9307213,24,22.044085)"
+       x1="10.458337"
+       y1="4.3967042"
+       x2="10.458337"
+       y2="19.290417" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-9"
+       id="linearGradient2956"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.0744355,0,0,-0.9307213,24,21.875)"
+       x1="10.458337"
+       y1="4.3967042"
+       x2="10.458337"
+       y2="19.290417" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-9"
+       id="linearGradient2958"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.0744355,0.9307213)"
+       x1="10.458337"
+       y1="4.3967042"
+       x2="10.458337"
+       y2="19.290417" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3266">
+      <path
+         style="opacity:0.3;color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3268"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3101"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4205"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4207" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4212"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4214" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4216" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4219"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4221" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4223" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient4226"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4228" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop4230" />
+    </linearGradient>
+    <linearGradient
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3052"
+       xlink:href="#ButtonColor-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonColor-6"
+       x1="10.31979"
+       y1="21"
+       x2="10.31979"
+       y2="0.99929649"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#c8c8c8;stop-opacity:1;"
+         offset="0"
+         id="stop3189-4" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3191-0" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="translate(0,-97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4256"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#e7e7e7"
+     borderopacity="1"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.8436761"
+     inkscape:cx="29.92445"
+     inkscape:cy="43.19818"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:showpageshadow="false"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1030"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <sodipodi:guide
+       orientation="1,0"
+       position="0,112"
+       id="guide2383" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="26.278146,128"
+       id="guide2385" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="128,54.082119"
+       id="guide2387" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="78.156291,0"
+       id="guide2389" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="60.863576,64.084768"
+       id="guide2391" />
+    <inkscape:grid
+       type="xygrid"
+       id="grid3672"
+       visible="true"
+       enabled="true"
+       empspacing="8"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Button">
+    <g
+       style="display:inline"
+       id="g3202"
+       clip-path="url(#clipPath3266)">
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+         id="path3786"
+         style="opacity:0.07999998;fill:url(#linearGradient3101);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+         inkscape:radius="0.99097413"
+         sodipodi:type="inkscape:offset" />
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+         id="path3778"
+         style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+         inkscape:radius="1.0360184"
+         sodipodi:type="inkscape:offset" />
+      <path
+         transform="scale(1,-1)"
+         d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+         id="path3770"
+         style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+         inkscape:radius="0.98962283"
+         sodipodi:type="inkscape:offset" />
+      <rect
+         transform="scale(1,-1)"
+         ry="7"
+         rx="7"
+         y="-92"
+         x="5"
+         height="85"
+         width="86"
+         id="rect3723"
+         style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+      <rect
+         style="opacity:0.45;fill:url(#linearGradient4256);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+         id="rect3716"
+         width="84"
+         height="84"
+         x="6"
+         y="-91"
+         rx="6"
+         ry="6"
+         transform="scale(1,-1)" />
+    </g>
+    <rect
+       style="opacity:0.75;fill:url(#linearGradient3052);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.5;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.2;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:label="Emblem"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,74)">
+    <path
+       style="opacity:0.4;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       d="m 48.25,-53.625 c -14.72019,-3e-6 -26.730807,11.503689 -27.625,26 l -8.625,0 13.875,20.75 13.875,-20.75 -9.875,0 c 0.852258,-9.405081 8.744762,-16.75 18.375,-16.75 3.561952,10e-7 6.932756,1.007173 9.75,2.75 l 4.75,-7.875 c -4.217288,-2.592868 -9.189676,-4.125 -14.5,-4.125 z m 21.875,8 -13.875,20.75 9.875,0 c -0.85226,9.40508 -8.74476,16.75 -18.375,16.75 -3.561952,0 -6.932756,-1.007172 -9.75,-2.75 L 33.25,-3 c 4.217288,2.592868 9.189676,4.125 14.5,4.125 14.720192,4e-6 26.730808, [...]
+       id="Symbol" />
+  </g>
+</svg>
diff --git a/interface/images/menu/getobs.svg b/interface/images/menu/getobs.svg
new file mode 100755
index 0000000..4e8f4fd
--- /dev/null
+++ b/interface/images/menu/getobs.svg
@@ -0,0 +1,1491 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="getobs.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       x1="460.01428"
+       y1="585.21936"
+       x2="152.87143"
+       y2="332.36218"
+       id="linearGradient9477"
+       xlink:href="#linearGradient3989"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2149522,0,0,0.2369714,30.871779,266.01932)" />
+    <linearGradient
+       id="linearGradient3989">
+      <stop
+         id="stop3991"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3993"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="225.2822"
+       y1="451.83481"
+       x2="131.99297"
+       y2="322.8829"
+       id="linearGradient9474"
+       xlink:href="#linearGradient2190"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3505596,0,0,0.3701598,22.984703,226.27699)" />
+    <linearGradient
+       id="linearGradient2190">
+      <stop
+         id="stop2192"
+         style="stop-color:#acbbff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2194"
+         style="stop-color:#acbbff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="460.01428"
+       y1="585.21936"
+       x2="152.87143"
+       y2="332.36218"
+       id="linearGradient9477-7"
+       xlink:href="#linearGradient3989-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2149522,0,0,0.2369714,30.871779,266.01932)" />
+    <linearGradient
+       id="linearGradient3989-5">
+      <stop
+         id="stop3991-3"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3993-5"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="225.2822"
+       y1="451.83481"
+       x2="131.99297"
+       y2="322.8829"
+       id="linearGradient9474-1"
+       xlink:href="#linearGradient2190-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3505596,0,0,0.3701598,22.984703,226.27699)" />
+    <linearGradient
+       id="linearGradient2190-7">
+      <stop
+         id="stop2192-3"
+         style="stop-color:#acbbff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2194-1"
+         style="stop-color:#acbbff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3164">
+      <stop
+         id="stop3166"
+         offset="0"
+         style="stop-color:#383838;stop-opacity:1" />
+      <stop
+         style="stop-color:#3b3b3b;stop-opacity:1"
+         offset="0.05754738"
+         id="stop3172" />
+      <stop
+         id="stop3174"
+         offset="0.07978155"
+         style="stop-color:#626463;stop-opacity:1" />
+      <stop
+         style="stop-color:#bfbfbf;stop-opacity:1"
+         offset="0.12359595"
+         id="stop3176" />
+      <stop
+         id="stop3178"
+         offset="0.18899058"
+         style="stop-color:#808080;stop-opacity:1" />
+      <stop
+         style="stop-color:#e0e0e0;stop-opacity:1"
+         offset="0.25765494"
+         id="stop3180" />
+      <stop
+         id="stop3182"
+         offset="0.37405738"
+         style="stop-color:#ececec;stop-opacity:1" />
+      <stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.52577293"
+         id="stop3184" />
+      <stop
+         id="stop3186"
+         offset="0.57285708"
+         style="stop-color:#818181;stop-opacity:1" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1"
+         offset="0.67356479"
+         id="stop3188" />
+      <stop
+         id="stop3190"
+         offset="0.73765153"
+         style="stop-color:#bcbcbc;stop-opacity:1" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.86451715"
+         id="stop3192" />
+      <stop
+         id="stop3194"
+         offset="0.90767759"
+         style="stop-color:#333333;stop-opacity:1" />
+      <stop
+         style="stop-color:#7a7a7c;stop-opacity:1"
+         offset="0.96260905"
+         id="stop3196" />
+      <stop
+         id="stop3168"
+         offset="1"
+         style="stop-color:#c9c6c1;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5943">
+      <stop
+         id="stop5945"
+         offset="0"
+         style="stop-color:#383838;stop-opacity:1" />
+      <stop
+         style="stop-color:#3b3b3b;stop-opacity:1"
+         offset="0.05754738"
+         id="stop5947" />
+      <stop
+         id="stop5949"
+         offset="0.07978155"
+         style="stop-color:#626463;stop-opacity:1" />
+      <stop
+         style="stop-color:#bfbfbf;stop-opacity:1"
+         offset="0.12359595"
+         id="stop5951" />
+      <stop
+         id="stop5953"
+         offset="0.18899058"
+         style="stop-color:#808080;stop-opacity:1" />
+      <stop
+         style="stop-color:#e0e0e0;stop-opacity:1"
+         offset="0.25765494"
+         id="stop5955" />
+      <stop
+         id="stop5957"
+         offset="0.37405738"
+         style="stop-color:#ececec;stop-opacity:1" />
+      <stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.52577293"
+         id="stop5959" />
+      <stop
+         id="stop5961"
+         offset="0.57285708"
+         style="stop-color:#818181;stop-opacity:1" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1"
+         offset="0.67356479"
+         id="stop5963" />
+      <stop
+         id="stop5965"
+         offset="0.73765153"
+         style="stop-color:#bcbcbc;stop-opacity:1" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.86451715"
+         id="stop5967" />
+      <stop
+         id="stop5969"
+         offset="0.90767759"
+         style="stop-color:#333333;stop-opacity:1" />
+      <stop
+         style="stop-color:#7a7a7c;stop-opacity:1"
+         offset="0.96260905"
+         id="stop5971" />
+      <stop
+         id="stop5973"
+         offset="1"
+         style="stop-color:#c9c6c1;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4800">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop4802" />
+      <stop
+         id="stop4804"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop4806" />
+      <stop
+         id="stop4808"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop4810" />
+      <stop
+         id="stop4812"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop4814" />
+      <stop
+         id="stop4816"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop4818" />
+      <stop
+         id="stop4820"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop4822" />
+      <stop
+         id="stop4824"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop4826" />
+      <stop
+         id="stop4828"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop4830" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6003">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6005" />
+      <stop
+         id="stop6007"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6009" />
+      <stop
+         id="stop6011"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6013" />
+      <stop
+         id="stop6015"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6017" />
+      <stop
+         id="stop6019"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6021" />
+      <stop
+         id="stop6023"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6025" />
+      <stop
+         id="stop6027"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6029" />
+      <stop
+         id="stop6031"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6033" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6047">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6049" />
+      <stop
+         id="stop6051"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6053" />
+      <stop
+         id="stop6055"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6057" />
+      <stop
+         id="stop6059"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6061" />
+      <stop
+         id="stop6063"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6065" />
+      <stop
+         id="stop6067"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6069" />
+      <stop
+         id="stop6071"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6073" />
+      <stop
+         id="stop6075"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6077" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6091">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6093" />
+      <stop
+         id="stop6095"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6097" />
+      <stop
+         id="stop6099"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6101" />
+      <stop
+         id="stop6103"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6105" />
+      <stop
+         id="stop6107"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6109" />
+      <stop
+         id="stop6111"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6113" />
+      <stop
+         id="stop6115"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6117" />
+      <stop
+         id="stop6119"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6121" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6135">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6137" />
+      <stop
+         id="stop6139"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6141" />
+      <stop
+         id="stop6143"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6145" />
+      <stop
+         id="stop6147"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6149" />
+      <stop
+         id="stop6151"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6153" />
+      <stop
+         id="stop6155"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6157" />
+      <stop
+         id="stop6159"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6161" />
+      <stop
+         id="stop6163"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6165" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6179">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6181" />
+      <stop
+         id="stop6183"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6185" />
+      <stop
+         id="stop6187"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6189" />
+      <stop
+         id="stop6191"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6193" />
+      <stop
+         id="stop6195"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6197" />
+      <stop
+         id="stop6199"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6201" />
+      <stop
+         id="stop6203"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6205" />
+      <stop
+         id="stop6207"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6209" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6223">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6225" />
+      <stop
+         id="stop6227"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6229" />
+      <stop
+         id="stop6231"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6233" />
+      <stop
+         id="stop6235"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6237" />
+      <stop
+         id="stop6239"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6241" />
+      <stop
+         id="stop6243"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6245" />
+      <stop
+         id="stop6247"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6249" />
+      <stop
+         id="stop6251"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6253" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6271">
+      <stop
+         style="stop-color:#383838;stop-opacity:1"
+         offset="0"
+         id="stop6273" />
+      <stop
+         id="stop6275"
+         offset="0.05754738"
+         style="stop-color:#3b3b3b;stop-opacity:1" />
+      <stop
+         style="stop-color:#626463;stop-opacity:1"
+         offset="0.07978155"
+         id="stop6277" />
+      <stop
+         id="stop6279"
+         offset="0.12359595"
+         style="stop-color:#bfbfbf;stop-opacity:1" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="0.18899058"
+         id="stop6281" />
+      <stop
+         id="stop6283"
+         offset="0.25765494"
+         style="stop-color:#e0e0e0;stop-opacity:1" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.37405738"
+         id="stop6285" />
+      <stop
+         id="stop6287"
+         offset="0.52577293"
+         style="stop-color:#828282;stop-opacity:1" />
+      <stop
+         style="stop-color:#818181;stop-opacity:1"
+         offset="0.57285708"
+         id="stop6289" />
+      <stop
+         id="stop6291"
+         offset="0.67356479"
+         style="stop-color:#acacac;stop-opacity:1" />
+      <stop
+         style="stop-color:#bcbcbc;stop-opacity:1"
+         offset="0.73765153"
+         id="stop6293" />
+      <stop
+         id="stop6295"
+         offset="0.86451715"
+         style="stop-color:#505050;stop-opacity:1" />
+      <stop
+         style="stop-color:#333333;stop-opacity:1"
+         offset="0.90767759"
+         id="stop6297" />
+      <stop
+         id="stop6299"
+         offset="0.96260905"
+         style="stop-color:#7a7a7c;stop-opacity:1" />
+      <stop
+         style="stop-color:#c9c6c1;stop-opacity:1"
+         offset="1"
+         id="stop6301" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6311">
+      <stop
+         id="stop6313"
+         offset="0"
+         style="stop-color:#383838;stop-opacity:1" />
+      <stop
+         style="stop-color:#3b3b3b;stop-opacity:1"
+         offset="0.05754738"
+         id="stop6315" />
+      <stop
+         id="stop6317"
+         offset="0.07978155"
+         style="stop-color:#626463;stop-opacity:1" />
+      <stop
+         style="stop-color:#bfbfbf;stop-opacity:1"
+         offset="0.12359595"
+         id="stop6319" />
+      <stop
+         id="stop6321"
+         offset="0.18899058"
+         style="stop-color:#808080;stop-opacity:1" />
+      <stop
+         style="stop-color:#e0e0e0;stop-opacity:1"
+         offset="0.25765494"
+         id="stop6323" />
+      <stop
+         id="stop6325"
+         offset="0.37405738"
+         style="stop-color:#ececec;stop-opacity:1" />
+      <stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.52577293"
+         id="stop6327" />
+      <stop
+         id="stop6329"
+         offset="0.57285708"
+         style="stop-color:#818181;stop-opacity:1" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1"
+         offset="0.67356479"
+         id="stop6331" />
+      <stop
+         id="stop6333"
+         offset="0.73765153"
+         style="stop-color:#bcbcbc;stop-opacity:1" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.86451715"
+         id="stop6335" />
+      <stop
+         id="stop6337"
+         offset="0.90767759"
+         style="stop-color:#333333;stop-opacity:1" />
+      <stop
+         style="stop-color:#7a7a7c;stop-opacity:1"
+         offset="0.96260905"
+         id="stop6339" />
+      <stop
+         id="stop6341"
+         offset="1"
+         style="stop-color:#c9c6c1;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6344">
+      <stop
+         id="stop6346"
+         offset="0"
+         style="stop-color:#383838;stop-opacity:1" />
+      <stop
+         style="stop-color:#3b3b3b;stop-opacity:1"
+         offset="0.05754738"
+         id="stop6348" />
+      <stop
+         id="stop6350"
+         offset="0.07978155"
+         style="stop-color:#626463;stop-opacity:1" />
+      <stop
+         style="stop-color:#bfbfbf;stop-opacity:1"
+         offset="0.12359595"
+         id="stop6352" />
+      <stop
+         id="stop6354"
+         offset="0.18899058"
+         style="stop-color:#808080;stop-opacity:1" />
+      <stop
+         style="stop-color:#e0e0e0;stop-opacity:1"
+         offset="0.25765494"
+         id="stop6356" />
+      <stop
+         id="stop6358"
+         offset="0.37405738"
+         style="stop-color:#ececec;stop-opacity:1" />
+      <stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.52577293"
+         id="stop6360" />
+      <stop
+         id="stop6362"
+         offset="0.57285708"
+         style="stop-color:#818181;stop-opacity:1" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1"
+         offset="0.67356479"
+         id="stop6364" />
+      <stop
+         id="stop6366"
+         offset="0.73765153"
+         style="stop-color:#bcbcbc;stop-opacity:1" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.86451715"
+         id="stop6368" />
+      <stop
+         id="stop6370"
+         offset="0.90767759"
+         style="stop-color:#333333;stop-opacity:1" />
+      <stop
+         style="stop-color:#7a7a7c;stop-opacity:1"
+         offset="0.96260905"
+         id="stop6372" />
+      <stop
+         id="stop6374"
+         offset="1"
+         style="stop-color:#c9c6c1;stop-opacity:1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath24952">
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:url(#linearGradient24956);fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="M 75.200062,372.5 145.76888,400 c 6.86115,0 12.4375,-12.32 12.4375,-27.5 0,-15.18 -5.57635,-27.5 -12.4375,-27.5 l -70.568818,27.5 z"
+         id="path24954"
+         sodipodi:nodetypes="ccscc" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient4254">
+      <stop
+         style="stop-color:#ff9191;stop-opacity:1;"
+         offset="0"
+         id="stop4256" />
+      <stop
+         style="stop-color:#b55858;stop-opacity:1;"
+         offset="1"
+         id="stop4258" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3707">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3687" />
+      <stop
+         style="stop-color:#ffdd7c;stop-opacity:1;"
+         offset="1"
+         id="stop3711" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3706">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.82653064;"
+         offset="0"
+         id="stop3708" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3710" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.59375"
+     inkscape:cx="48"
+     inkscape:cy="48"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       style="fill:#cccccc;fill-opacity:1;stroke:none"
+       d="m 41.933876,15.588814 c -7.804372,1.041052 -14.656672,5.07794 -19.364164,10.92472 l 8.4625,0 c 2.728188,-4.931256 6.450016,-8.95686 10.902212,-10.5076 0.250872,-0.09045 1.558164,-0.614752 -4e-4,-0.41712 z m 8.003616,0.411036 c 4.398132,1.524844 8.084472,5.464736 10.80556,10.308896 0.122864,0.210696 0.13616,0.204788 0.397968,0.204788 l 7.800248,0 c 0.236808,0.0012 0.259896,-0.126756 0.20112,-0.218152 -4.705544,-5.733984 -11.491784,-9.685432 -19.207096,-10.70926 -1.156396,-0.1121 [...]
+       id="path3882"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccccccccscccccccccccccccccccccccccccccccccccccccccccccccccsccccccccccccccccccccccccccccsccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#4d4d4d;fill-opacity:1;stroke:none"
+       d="m 73.632212,31.851034 c 0.385928,0.848828 0.726912,1.706368 1.075,2.55 8e-4,0.0016 0.01184,-0.0016 0.01248,0 1.598312,0.168084 3.124952,0.553116 4.325,1.6 0.46988,1.469352 -1.251288,2.932848 -2.3,3.875 -11.53872,8.269796 -25.518242,12.53896 -39.4,15.1125 -7.641336,1.05272 -15.651704,2.913164 -23.175,0.3875 -1.301212,-0.02228 -2.012712,-1.295948 -1.2,-2.35 0.840368,-0.875456 1.718544,-1.683452 2.6375,-2.45 -0.259672,-0.917584 -0.363732,-1.896972 -0.4,-2.8875 -3.652832,2.673188 - [...]
+       id="path4024" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#cccccc;fill-opacity:0.67619048;stroke:none"
+       id="path2839"
+       sodipodi:cx="1385"
+       sodipodi:cy="469.36218"
+       sodipodi:rx="45"
+       sodipodi:ry="45"
+       d="m 1430,469.36218 a 45,45 0 1 1 -90,0 45,45 0 1 1 90,0 z"
+       transform="matrix(0.30310095,-0.17499541,0.17499541,0.30310095,-446.04043,139.67833)" />
+    <path
+       style="fill:#00ff00;stroke:none"
+       d="m 46.61808,23.513354 c -8.86752,5.119668 -11.909256,16.471592 -6.789592,25.339108 4.54642,7.874632 14.006456,11.152668 22.278096,8.203252 0.650812,1.256876 13.713112,26.486076 13.734384,26.522924 0.63996,1.10844 2.991224,0.9504 5.251208,-0.354396 2.25998,-1.3048 3.572472,-3.262048 2.93252,-4.37048 L 67.922364,53.69797 C 74.612452,48.009226 76.503612,38.177586 71.957188,30.30295 66.837524,21.435426 55.485604,18.393694 46.61808,23.513354 z m 1.399964,2.424808 c 7.529028,-4.34688  [...]
+       id="path2841"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#f2f2f2;fill-opacity:0.62380952;stroke:none"
+       d="m 48.018044,25.938162 c -6.855688,3.958136 -9.60558,12.2924 -6.761608,19.43774 2.678264,0.0036 5.395892,-0.665252 7.880684,-2.099848 6.855688,-3.958132 9.600112,-12.301868 6.756136,-19.447212 -2.678264,-0.0036 -5.39042,0.674728 -7.875212,2.10932 z"
+       id="path2854"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/interface/images/menu/internet-radio-new.svg b/interface/images/menu/internet-radio-new.svg
new file mode 100755
index 0000000..1379271
--- /dev/null
+++ b/interface/images/menu/internet-radio-new.svg
@@ -0,0 +1,738 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="internet-radio-new.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3693"
+       id="linearGradient3699"
+       x1="7"
+       y1="9"
+       x2="15"
+       y2="9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,2.7,-2.7,0,72.4,10.2)" />
+    <linearGradient
+       id="linearGradient3693">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3695" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3697" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3657"
+       id="linearGradient3676"
+       x1="4"
+       y1="10"
+       x2="18"
+       y2="10"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,2.7,-2.7,0,75.1,12.9)" />
+    <linearGradient
+       id="linearGradient3657">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3659" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3661" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3657"
+       id="linearGradient3663"
+       x1="1"
+       y1="11"
+       x2="21"
+       y2="11"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,22,-1)" />
+    <linearGradient
+       gradientTransform="matrix(2.7,0,0,2.7,18.4,18.3)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3856"
+       x1="10"
+       y1="7"
+       x2="10"
+       y2="21.035669"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="StandardGradient"
+       gradientTransform="scale(0.9219544,1.0846523)"
+       x1="11.998966"
+       y1="0.92195445"
+       x2="11.998966"
+       y2="19.387045"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3283" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop2651" />
+    </linearGradient>
+    <linearGradient
+       y2="11"
+       x2="21"
+       y1="11"
+       x1="1"
+       gradientTransform="matrix(0,2.7,-2.7,0,77.8,15.6)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3089"
+       xlink:href="#linearGradient3657"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3921"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.7,0,0,2.7,18.4,17.3)"
+       x1="10"
+       y1="7"
+       x2="10"
+       y2="21.035669" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3923"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.7,0,0,2.7,18.4,18.3)"
+       x1="10"
+       y1="7"
+       x2="10"
+       y2="21.035669" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.917248"
+     inkscape:cx="54.19265"
+     inkscape:cy="53.651941"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.94180477"
+       inkscape:original="M 48.09375 35.90625 C 45.351472 35.90625 43.125 38.172625 43.125 40.90625 C 43.125 41.707562 43.430164 42.453034 43.78125 43.15625 L 33.71875 75.71875 A 0.92908338 0.92908338 0 0 0 34.59375 76.9375 L 40 76.9375 A 0.92908338 0.92908338 0 0 0 40.90625 76.25 L 41.46875 74.25 L 54.71875 74.25 L 55.28125 76.25 A 0.92908338 0.92908338 0 0 0 56.1875 76.9375 L 61.59375 76.9375 A 0.92908338 0.92908338 0 0 0 62.46875 75.71875 L 52.40625 43.15625 C 52.762896 42.462186 53.0 [...]
+       style="opacity:0.1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3936"
+       d="m 48.09375,34.96875 c -3.261185,0 -5.90625,2.69249 -5.90625,5.9375 0,0.857573 0.324964,1.532071 0.625,2.1875 l -10,32.34375 c 7.8e-5,-2.37e-4 -0.03131,0.09399 -0.03125,0.09375 6.4e-5,-2.41e-4 -4.9e-5,0.09399 0,0.09375 4.9e-5,-2.44e-4 -0.03128,0.125247 -0.03125,0.125 3.5e-5,-2.47e-4 -2e-5,0.094 0,0.09375 2e-5,-2.48e-4 -0.03126,0.125249 -0.03125,0.125 6e-6,-2.49e-4 9e-6,0.094 0,0.09375 -9e-6,-2.49e-4 0.03127,0.125248 0.03125,0.125 -2.3e-5,-2.48e-4 3.8e-5,0.094 0,0.09375 -3.8e-5,- [...]
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.92899048"
+       inkscape:original="M 48.09375 36.84375 C 45.856997 36.84375 44.0625 38.669497 44.0625 40.90625 C 44.0625 41.745032 44.282062 42.541115 44.71875 43.1875 L 34.59375 76 L 40 76 L 40.75 73.3125 L 55.4375 73.3125 L 56.1875 76 L 61.59375 76 L 51.46875 43.1875 C 51.90544 42.541115 52.15625 41.745032 52.15625 40.90625 C 52.15625 38.669497 50.330503 36.84375 48.09375 36.84375 z M 45.40625 57.09375 L 50.8125 57.09375 L 52.25 62.0625 L 43.96875 62.0625 L 45.40625 57.09375 z M 43.125 65.1875  [...]
+       style="opacity:0.15;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3932"
+       d="m 48.09375,35.90625 c -2.742278,0 -4.96875,2.266375 -4.96875,5 0,0.801312 0.305164,1.546784 0.65625,2.25 l -10.0625,32.5625 a 0.92908338,0.92908338 0 0 0 0.875,1.21875 l 5.40625,0 A 0.92908338,0.92908338 0 0 0 40.90625,76.25 l 0.5625,-2 13.25,0 0.5625,2 a 0.92908338,0.92908338 0 0 0 0.90625,0.6875 l 5.40625,0 a 0.92908338,0.92908338 0 0 0 0.875,-1.21875 l -10.0625,-32.5625 c 0.356646,-0.694064 0.6875,-1.42957 0.6875,-2.25 0,-2.742278 -2.257722,-5 -5,-5 z m -1.96875,22.125 3.968 [...]
+    <path
+       id="path3926"
+       d="m 48.1,36.85 c -2.236753,0 -4.05,1.813247 -4.05,4.05 0,0.838782 0.238312,1.63174 0.675,2.278125 L 34.6,76 l 5.4,0 0.759375,-2.7 14.68125,0 L 56.2,76 61.6,76 51.475,43.178125 C 51.91169,42.53174 52.15,41.738782 52.15,40.9 c 0,-2.236753 -1.813247,-4.05 -4.05,-4.05 z m -2.7,20.25 5.4,0 1.434375,4.978125 -8.26875,0 L 45.4,57.1 z m -2.278125,8.1 9.95625,0 1.434375,4.978125 -12.825,0 L 43.121875,65.2 z"
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.3"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.3;color:#000000;fill:url(#linearGradient3089);fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 75.1,45.3 c 0,-14.911687 -12.088313,-27 -27,-27 -14.911687,0 -27,12.088313 -27,27 0,14.911687 12.088313,27 27,27 14.911687,0 27,-12.088313 27,-27 z m -2.7,0 c 0,3.595992 -0.7811,7.009548 -2.182891,10.080258 C 66.387311,63.769674 57.924527,69.6 48.1,69.6 34.67948,69.6 23.8,58.72052 23.8,45.3 23.8,31.87948 34.67948,21 48.1,21 61.52052,21 72.4,31.87948 72.4,45.3 z"
+       id="path2880"
+       sodipodi:nodetypes="csssccssssc" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.3;color:#000000;fill:url(#linearGradient3676);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 67,42.6 C 67,32.161819 58.538181,23.7 48.1,23.7 c -10.438181,0 -18.9,8.461819 -18.9,18.9 0,10.438181 8.461819,18.9 18.9,18.9 10.438181,0 18.9,-8.461819 18.9,-18.9 z m -2.7,0 c 0,8.947014 -7.252986,16.2 -16.2,16.2 -8.947014,0 -16.2,-7.252986 -16.2,-16.2 0,-8.947014 7.252986,-16.2 16.2,-16.2 8.947014,0 16.2,7.252986 16.2,16.2 z"
+       id="path3665" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.3;color:#000000;fill:url(#linearGradient3699);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 58.9,39.9 c 0,-5.964675 -4.835325,-10.8 -10.8,-10.8 -5.964675,0 -10.8,4.835325 -10.8,10.8 0,5.964675 4.835325,10.8 10.8,10.8 5.964675,0 10.8,-4.835325 10.8,-10.8 z m -2.7,0 c 0,4.473505 -3.626495,8.1 -8.1,8.1 -4.473505,0 -8.1,-3.626495 -8.1,-8.1 0,-4.473505 3.626495,-8.1 8.1,-8.1 4.473505,0 8.1,3.626495 8.1,8.1 z"
+       id="path3688" />
+    <path
+       inkscape:connector-curvature="0"
+       style="color:#000000;fill:url(#linearGradient3856);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 48.1,35.85 c -2.236753,0 -4.05,1.813247 -4.05,4.05 0,0.838782 0.238312,1.63174 0.675,2.278125 L 34.6,75 l 5.4,0 0.759375,-2.7 14.68125,0 L 56.2,75 61.6,75 51.475,42.178125 C 51.91169,41.53174 52.15,40.738782 52.15,39.9 c 0,-2.236753 -1.813247,-4.05 -4.05,-4.05 z m -2.7,20.25 5.4,0 1.434375,4.978125 -8.26875,0 L 45.4,56.1 z m -2.278125,8.1 9.95625,0 1.434375,4.978125 -12.825,0 L 43.121875,64.2 z"
+       id="path3841" />
+    <path
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.75"
+       d="M 48.09375 35.84375 C 45.856997 35.84375 44.0625 37.669497 44.0625 39.90625 C 44.0625 40.105487 44.067394 40.307284 44.09375 40.5 C 44.30115 38.457763 45.996794 36.84375 48.09375 36.84375 C 50.168869 36.84375 51.857359 38.425898 52.09375 40.4375 C 52.114962 40.264072 52.15625 40.084803 52.15625 39.90625 C 52.15625 37.669497 50.330503 35.84375 48.09375 35.84375 z M 44.53125 42.8125 L 34.59375 75 L 34.90625 75 L 44.71875 43.1875 C 44.642625 43.074819 44.595107 42.933555 44.53125  [...]
+       id="path3898" />
+    <path
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.15"
+       d="M 52.09375 39.4375 C 52.015313 40.07878 51.812481 40.678712 51.46875 41.1875 L 51.65625 41.8125 C 51.958705 41.239129 52.15625 40.598812 52.15625 39.90625 C 52.15625 39.744616 52.112163 39.594187 52.09375 39.4375 z M 44.09375 39.53125 C 44.081935 39.657267 44.0625 39.777143 44.0625 39.90625 C 44.0625 40.598812 44.228796 41.239129 44.53125 41.8125 L 44.71875 41.1875 C 44.391234 40.702711 44.181245 40.13843 44.09375 39.53125 z M 45.40625 55.09375 L 43.96875 60.0625 L 44.25 60.062 [...]
+       id="path3917" />
+  </g>
+</svg>
diff --git a/interface/images/menu/list-add.svg b/interface/images/menu/list-add.svg
new file mode 100755
index 0000000..6b41290
--- /dev/null
+++ b/interface/images/menu/list-add.svg
@@ -0,0 +1,679 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="list-add.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       id="StandardGradient"
+       x1="11.640054"
+       y1="4.0775533"
+       x2="11.640054"
+       y2="17.924156"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3283" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop3285" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(3.4669826,0,0,3.4669826,9.8631922,9.863192)"
+       y2="17.345575"
+       x2="11.640054"
+       y1="4.6544242"
+       x1="11.640054"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3017"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3870"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.4669826,0,0,3.4669826,9.8631922,10.863192)"
+       x1="11.640054"
+       y1="4.6544242"
+       x2="11.640054"
+       y2="17.345575" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3872"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.4669826,0,0,3.4669826,9.8631922,9.863192)"
+       x1="11.640054"
+       y1="4.6544242"
+       x2="11.640054"
+       y2="17.345575" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3879"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.4669826,0,0,3.4669826,9.8631922,8.863192)"
+       x1="11.640054"
+       y1="4.6544242"
+       x2="11.640054"
+       y2="17.345575" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3881"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.4669826,0,0,3.4669826,9.8631922,9.863192)"
+       x1="11.640054"
+       y1="4.6544242"
+       x2="11.640054"
+       y2="17.345575" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.917248"
+     inkscape:cx="50.713141"
+     inkscape:cy="52.410593"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       d="m 41.625,24.875 c -1.477784,0.210834 -1.972366,1.817084 -1.78125,3.111551 0,4.337817 0,8.675633 0,13.013449 -4.686756,0.02089 -9.379447,-0.04174 -14.0625,0.03125 -1.52815,0.07874 -2.104175,1.73987 -1.90625,3.049051 0.04152,3.825807 -0.08314,7.664402 0.0625,11.482199 0.202843,1.506424 1.877514,1.877326 3.154273,1.71875 4.250659,0 8.501318,0 12.751977,0 0.02087,4.645091 -0.04171,9.296112 0.03125,13.9375 0.07874,1.52815 1.73987,2.104175 3.049051,1.90625 3.805019,-0.04093 7.622674, [...]
+       id="path3894"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0386429"
+       inkscape:original="M 41.96875 27 L 41.96875 43.125 L 26 43.125 L 26 55.15625 L 41.96875 55.15625 L 41.96875 71 L 53.9375 71 L 53.9375 55.15625 L 70 55.15625 L 70 43.125 L 53.9375 43.125 L 53.9375 27 L 41.96875 27 z "
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none;display:inline"
+       id="path3890"
+       d="M 41.75,25.96875 A 1.0387467,1.0387467 0 0 0 40.9375,27 l 0,15.09375 -14.9375,0 A 1.0387467,1.0387467 0 0 0 24.96875,43.125 l 0,12.03125 A 1.0387467,1.0387467 0 0 0 26,56.1875 l 14.9375,0 0,14.8125 a 1.0387467,1.0387467 0 0 0 1.03125,1.03125 l 11.96875,0 A 1.0387467,1.0387467 0 0 0 54.96875,71 l 0,-14.8125 15.03125,0 a 1.0387467,1.0387467 0 0 0 1.03125,-1.03125 l 0,-12.03125 A 1.0387467,1.0387467 0 0 0 70,42.09375 l -15.03125,0 0,-15.09375 A 1.0387467,1.0387467 0 0 0 53.9375,25 [...]
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       id="path3884"
+       d="m 41.962323,27.000001 0,16.110793 -15.962323,0 0,12.032952 15.962323,0 0,15.856254 11.971642,0 0,-15.856254 16.066035,0 0,-12.032952 -16.066035,0 0,-16.110793 z"
+       style="fill:#000000;fill-opacity:1;stroke:none;display:inline;opacity:0.3"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:url(#linearGradient3017);fill-opacity:1.0;stroke:none;display:inline"
+       d="m 41.962323,26.000001 0,16.110793 -15.962323,0 0,12.032952 15.962323,0 0,15.856254 11.971642,0 0,-15.856254 16.066035,0 0,-12.032952 -16.066035,0 0,-16.110793 z"
+       id="Symbol"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline;opacity:0.75"
+       d="M 41.96875 26 L 41.96875 27 L 53.9375 27 L 53.9375 26 L 41.96875 26 z M 26 42.125 L 26 43.125 L 41.96875 43.125 L 41.96875 42.125 L 26 42.125 z M 53.9375 42.125 L 53.9375 43.125 L 70 43.125 L 70 42.125 L 53.9375 42.125 z "
+       id="path3866" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none;display:inline;opacity:0.15"
+       d="M 26 53.15625 L 26 54.15625 L 41.96875 54.15625 L 41.96875 53.15625 L 26 53.15625 z M 53.9375 53.15625 L 53.9375 54.15625 L 70 54.15625 L 70 53.15625 L 53.9375 53.15625 z M 41.96875 69 L 41.96875 70 L 53.9375 70 L 53.9375 69 L 41.96875 69 z "
+       id="path3875" />
+  </g>
+</svg>
diff --git a/interface/images/menu/media-eject.svg b/interface/images/menu/media-eject.svg
new file mode 100755
index 0000000..c15c38c
--- /dev/null
+++ b/interface/images/menu/media-eject.svg
@@ -0,0 +1,1298 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="media-eject.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient4281">
+      <stop
+         style="stop-color:#1e1e1e;stop-opacity:1;"
+         offset="0"
+         id="stop4283" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1;"
+         offset="1"
+         id="stop4285" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective48" />
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3617"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3026"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3722"
+       x1="55"
+       y1="72"
+       x2="55"
+       y2="23.989584"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         style="stop-color:#8c8c8c;stop-opacity:1;"
+         offset="0"
+         id="stop4083" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="1"
+         id="stop4085" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4194">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect4196"
+         style="fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       y2="26.510876"
+       x2="56.692215"
+       y1="66.530067"
+       x1="56.692215"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3038"
+       xlink:href="#linearGradient4081-7"
+       inkscape:collect="always"
+       gradientTransform="translate(0,-80)" />
+    <linearGradient
+       id="linearGradient4081-7">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4083-9" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop4085-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4287-4"
+       x1="48"
+       y1="16"
+       x2="48"
+       y2="80"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4281-6">
+      <stop
+         style="stop-color:#1e1e1e;stop-opacity:1;"
+         offset="0"
+         id="stop4283-9" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1;"
+         offset="1"
+         id="stop4285-8" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4194-1">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect4196-1"
+         style="fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4071-3"
+       id="linearGradient4077-0"
+       x1="48.233639"
+       y1="48.047016"
+       x2="126.13924"
+       y2="66.232674"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4071-3">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4073-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4075-4" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4069-9"
+       x1="48.055065"
+       y1="48.031517"
+       x2="126.67282"
+       y2="62.838562"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4047-2">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4049-0" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4051-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4061-6"
+       x1="47.997307"
+       y1="48.028725"
+       x2="127.05216"
+       y2="60.289631"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4053-2"
+       x1="47.99826"
+       y1="48.028797"
+       x2="127.41583"
+       y2="57.664623"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4145-0"
+       x1="48.233643"
+       y1="48.04702"
+       x2="126.13924"
+       y2="66.232674"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4115-2">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4117-3" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4119-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4137-7"
+       x1="48.055069"
+       y1="48.031521"
+       x2="126.67282"
+       y2="62.838566"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4129-8"
+       x1="47.997311"
+       y1="48.028728"
+       x2="127.05216"
+       y2="60.289635"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4121-6"
+       x1="47.998264"
+       y1="48.028801"
+       x2="127.41583"
+       y2="57.664627"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4071-3"
+       id="linearGradient4089-7"
+       gradientUnits="userSpaceOnUse"
+       x1="48.233639"
+       y1="48.047016"
+       x2="126.13924"
+       y2="66.232674" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4091-0"
+       gradientUnits="userSpaceOnUse"
+       x1="48.055065"
+       y1="48.031517"
+       x2="126.67282"
+       y2="62.838562" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4093-5"
+       gradientUnits="userSpaceOnUse"
+       x1="47.997307"
+       y1="48.028725"
+       x2="127.05216"
+       y2="60.289631" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4095-8"
+       gradientUnits="userSpaceOnUse"
+       x1="47.99826"
+       y1="48.028797"
+       x2="127.41583"
+       y2="57.664623" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4071-3"
+       id="linearGradient4107-8"
+       gradientUnits="userSpaceOnUse"
+       x1="48.233639"
+       y1="48.047016"
+       x2="126.13924"
+       y2="66.232674" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4109-3"
+       gradientUnits="userSpaceOnUse"
+       x1="48.055065"
+       y1="48.031517"
+       x2="126.67282"
+       y2="62.838562" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4111-3"
+       gradientUnits="userSpaceOnUse"
+       x1="47.997307"
+       y1="48.028725"
+       x2="127.05216"
+       y2="60.289631" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4113-5"
+       gradientUnits="userSpaceOnUse"
+       x1="47.99826"
+       y1="48.028797"
+       x2="127.41583"
+       y2="57.664623" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4157-8"
+       gradientUnits="userSpaceOnUse"
+       x1="48.233643"
+       y1="48.04702"
+       x2="126.13924"
+       y2="66.232674" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4159-8"
+       gradientUnits="userSpaceOnUse"
+       x1="48.055069"
+       y1="48.031521"
+       x2="126.67282"
+       y2="62.838566" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4161-2"
+       gradientUnits="userSpaceOnUse"
+       x1="47.997311"
+       y1="48.028728"
+       x2="127.05216"
+       y2="60.289635" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4163-3"
+       gradientUnits="userSpaceOnUse"
+       x1="47.998264"
+       y1="48.028801"
+       x2="127.41583"
+       y2="57.664627" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-6"
+       id="radialGradient3619-8"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-6">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-9" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-6"
+       id="linearGradient3188-1"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3047"
+       xlink:href="#linearGradient3737-6"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3796"
+       id="radialGradient3814"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.98495914,-30,0.71591078)"
+       cx="48.410488"
+       cy="47.59774"
+       fx="48.410488"
+       fy="47.59774"
+       r="30.640047" />
+    <linearGradient
+       id="linearGradient3796">
+      <stop
+         id="stop3798"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+      <stop
+         id="stop3800"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3780-6"
+       id="radialGradient3816"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.013812,-30,-0.66140908)"
+       cx="48.265148"
+       cy="47.886696"
+       fx="48.265148"
+       fy="47.886696"
+       r="28.878813" />
+    <linearGradient
+       id="linearGradient3780-6">
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="0"
+         id="stop3782" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="1"
+         id="stop3784" />
+    </linearGradient>
+    <radialGradient
+       r="28.878813"
+       fy="47.886696"
+       fx="48.265148"
+       cy="47.886696"
+       cx="48.265148"
+       gradientTransform="matrix(1,0,0,1.013812,-30,-0.66140908)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3147"
+       xlink:href="#linearGradient3780-6"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3796-9"
+       id="radialGradient3814-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.98495914,-30,0.71591078)"
+       cx="48.410488"
+       cy="47.59774"
+       fx="48.410488"
+       fy="47.59774"
+       r="30.640047" />
+    <linearGradient
+       id="linearGradient3796-9">
+      <stop
+         id="stop3798-4"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+      <stop
+         id="stop3800-9"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       r="28.878813"
+       fy="47.886696"
+       fx="48.265148"
+       cy="47.886696"
+       cx="48.265148"
+       gradientTransform="matrix(1,0,0,1.013812,-30,-0.66140908)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3147-9"
+       xlink:href="#linearGradient3780-6-5"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3780-6-5">
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="0"
+         id="stop3782-4" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="1"
+         id="stop3784-9" />
+    </linearGradient>
+    <radialGradient
+       r="28.878813"
+       fy="47.886696"
+       fx="48.265148"
+       cy="47.886696"
+       cx="48.265148"
+       gradientTransform="matrix(1,0,0,1.013812,-30,-0.66140908)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient5008"
+       xlink:href="#linearGradient3780-6-5"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3935"
+       x1="38"
+       y1="36"
+       x2="38"
+       y2="68"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4,-4)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3998"
+       gradientUnits="userSpaceOnUse"
+       x1="38"
+       y1="28"
+       x2="38"
+       y2="68"
+       gradientTransform="translate(-90,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4008"
+       gradientUnits="userSpaceOnUse"
+       x1="38"
+       y1="28"
+       x2="38"
+       y2="68"
+       gradientTransform="translate(0,1)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4010"
+       gradientUnits="userSpaceOnUse"
+       x1="38"
+       y1="28"
+       x2="38"
+       y2="68" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4015"
+       gradientUnits="userSpaceOnUse"
+       x1="38"
+       y1="28"
+       x2="38"
+       y2="68"
+       gradientTransform="translate(0,1)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4019"
+       gradientUnits="userSpaceOnUse"
+       x1="38"
+       y1="28"
+       x2="38"
+       y2="68" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3156"
+       gradientUnits="userSpaceOnUse"
+       x1="38"
+       y1="28"
+       x2="38"
+       y2="68"
+       gradientTransform="translate(-100,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3972"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4,-3)"
+       x1="38"
+       y1="36"
+       x2="38"
+       y2="68" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3976"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4,-4)"
+       x1="38"
+       y1="36"
+       x2="38"
+       y2="68" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3983"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4,-3)"
+       x1="38"
+       y1="36"
+       x2="38"
+       y2="68" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3985"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4,-4)"
+       x1="38"
+       y1="36"
+       x2="38"
+       y2="68" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.7557628"
+     inkscape:cx="35.867979"
+     inkscape:cy="47.871113"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer4"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99097413"
+       inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+       style="opacity:0.07999998;fill:url(#linearGradient3026);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3786"
+       d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0360184"
+       inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3778"
+       d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98962283"
+       inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3770"
+       d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+       transform="scale(1,-1)" />
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect3723"
+       width="86"
+       height="85"
+       x="5"
+       y="-92"
+       rx="7"
+       ry="7"
+       transform="scale(1,-1)" />
+    <rect
+       transform="scale(1,-1)"
+       ry="6"
+       rx="6"
+       y="-91"
+       x="6"
+       height="84"
+       width="84"
+       id="rect3716"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="opacity:0.9"
+     sodipodi:insensitive="true">
+    <rect
+       style="fill:url(#linearGradient3617);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer7"
+     inkscape:label="Calque"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <g
+       id="g4165"
+       clip-path="url(#clipPath4194-1)">
+      <g
+         style="opacity:0.9"
+         transform="matrix(0.1413721,0.99271966,-1.1651755,0.12044784,96.937266,-5.1946837)"
+         inkscape:transform-center-y="30.567075"
+         inkscape:transform-center-x="0.33129085"
+         id="g4011">
+        <path
+           sodipodi:end="0.46793338"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,9.541976 -2.24232,18.950422 -6.54616,27.466658 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4009"
+           style="opacity:0.05;color:#000000;fill:url(#linearGradient4077-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.208857"
+           inkscape:transform-center-y="3.2334227"
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)" />
+        <path
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)"
+           inkscape:transform-center-y="5.7561286"
+           inkscape:transform-center-x="-30.389206"
+           sodipodi:type="arc"
+           style="opacity:0.07000002;color:#000000;fill:url(#linearGradient4069-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4007"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,7.838782 -1.51343,15.60384 -4.45721,22.86887 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.38497975" />
+        <path
+           sodipodi:end="0.32200852"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,6.55049 -1.05689,13.058072 -3.12994,19.271878 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4005"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4061-6);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.447953"
+           inkscape:transform-center-y="7.6655702"
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)" />
+        <path
+           sodipodi:type="arc"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4053-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4003"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,5.321771 -0.6976,10.620584 -2.07497,15.76102 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.26179939" />
+      </g>
+      <g
+         style="display:inline"
+         id="g3802"
+         transform="matrix(1.8327427,0,0,1.8327427,14.258316,-39.234412)">
+        <path
+           id="path2875"
+           d="m 19.196345,49.867051 c -3.738265,2.562962 -5.605177,-4.899096 -1.154974,-4.811997 4.387142,-0.236076 3.979146,6.80144 -0.14484,6.614579 -3.173748,0.242635 -5.09871,-3.898691 -3.103604,-6.28528 2.027686,-2.980787 7.171211,-1.684158 7.738852,1.817453 0.968958,3.636165 -3.157198,7.038605 -6.567267,5.522909 -3.946222,-1.269714 -4.48984,-7.147021 -1.107149,-9.366244 3.569732,-2.795822 9.391656,0.237279 9.205832,4.758257 0.256767,4.350812 -4.689261,7.672183 -8.648236,5.934817 -4 [...]
+           style="opacity:0.2;fill:none;stroke:url(#radialGradient3814-9);stroke-width:0.47875074;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="opacity:0.1;fill:none;stroke:url(#radialGradient5008);stroke-width:0.47875074;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 16.908938,49.337251 c -3.885859,-1.858917 1.368699,-6.941434 3.411713,-3.237252 2.27904,3.498707 -3.707115,6.507095 -5.513003,3.024002 -1.707843,-2.496891 0.785978,-6.049192 3.698336,-5.541192 3.416899,0.252456 4.793862,5.102047 2.181575,7.233199 -2.532331,2.525401 -7.29345,0.746141 -7.666384,-2.780808 -0.830168,-3.851348 3.748869,-7.091646 7.182845,-5.362045 3.99743,1.609549 4.267549,7.842669 0.458223,9.838071 -3.458953,2.278819 -8.542946,-0.213769 -8.994268,-4.297839 -0 [...]
+           id="path3650"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="matrix(1.062807,-0.13087531,-0.74010065,3.227468,32.525111,-100.66774)"
+         inkscape:transform-center-y="16.240454"
+         inkscape:transform-center-x="-34.606346"
+         id="g4027"
+         style="opacity:0.9;fill:#ffffff">
+        <path
+           sodipodi:end="0.46793338"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,9.541976 -2.24232,18.950422 -6.54616,27.466658 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4029"
+           style="opacity:0.2;color:#000000;fill:url(#linearGradient4145-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.208857"
+           inkscape:transform-center-y="3.2334227"
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)" />
+        <path
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)"
+           inkscape:transform-center-y="5.7561286"
+           inkscape:transform-center-x="-30.389206"
+           sodipodi:type="arc"
+           style="opacity:0.4;color:#000000;fill:url(#linearGradient4137-7);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4031"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,7.838782 -1.51343,15.60384 -4.45721,22.86887 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.38497975" />
+        <path
+           sodipodi:end="0.32200852"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,6.55049 -1.05689,13.058072 -3.12994,19.271878 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4033"
+           style="opacity:0.6;color:#000000;fill:url(#linearGradient4129-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.447953"
+           inkscape:transform-center-y="7.6655702"
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)" />
+        <path
+           sodipodi:type="arc"
+           style="opacity:0.8;color:#000000;fill:url(#linearGradient4121-6);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4035"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,5.321771 -0.6976,10.620584 -2.07497,15.76102 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.26179939" />
+      </g>
+      <g
+         id="g4079"
+         inkscape:transform-center-x="26.014377"
+         inkscape:transform-center-y="25.855951"
+         transform="matrix(-0.61678932,0.78712829,-0.78712829,-0.61678932,115.00148,40.011929)"
+         style="opacity:0.5">
+        <path
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)"
+           inkscape:transform-center-y="3.2334227"
+           inkscape:transform-center-x="-30.208857"
+           sodipodi:type="arc"
+           style="opacity:0.05;color:#000000;fill:url(#linearGradient4089-7);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4081"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,9.541976 -2.24232,18.950422 -6.54616,27.466658 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.46793338" />
+        <path
+           sodipodi:end="0.38497975"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,7.838782 -1.51343,15.60384 -4.45721,22.86887 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4083"
+           style="opacity:0.07000002;color:#000000;fill:url(#linearGradient4091-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.389206"
+           inkscape:transform-center-y="5.7561286"
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)" />
+        <path
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)"
+           inkscape:transform-center-y="7.6655702"
+           inkscape:transform-center-x="-30.447953"
+           sodipodi:type="arc"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4093-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4085"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,6.55049 -1.05689,13.058072 -3.12994,19.271878 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.32200852" />
+        <path
+           sodipodi:end="0.26179939"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,5.321771 -0.6976,10.620584 -2.07497,15.76102 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4087"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4095-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc" />
+      </g>
+      <g
+         id="g4097"
+         inkscape:transform-center-x="-16.093513"
+         inkscape:transform-center-y="-33.641891"
+         transform="matrix(-0.06817198,-1.0460056,2.710673,0.60162586,-79.095447,69.080129)"
+         style="opacity:0.8">
+        <path
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)"
+           inkscape:transform-center-y="3.2334227"
+           inkscape:transform-center-x="-30.208857"
+           sodipodi:type="arc"
+           style="opacity:0.05;color:#000000;fill:url(#linearGradient4107-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4099"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,9.541976 -2.24232,18.950422 -6.54616,27.466658 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.46793338" />
+        <path
+           sodipodi:end="0.38497975"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,7.838782 -1.51343,15.60384 -4.45721,22.86887 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4101"
+           style="opacity:0.07000002;color:#000000;fill:url(#linearGradient4109-3);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.389206"
+           inkscape:transform-center-y="5.7561286"
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)" />
+        <path
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)"
+           inkscape:transform-center-y="7.6655702"
+           inkscape:transform-center-x="-30.447953"
+           sodipodi:type="arc"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4111-3);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4103"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,6.55049 -1.05689,13.058072 -3.12994,19.271878 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.32200852" />
+        <path
+           sodipodi:end="0.26179939"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,5.321771 -0.6976,10.620584 -2.07497,15.76102 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4105"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4113-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc" />
+      </g>
+      <g
+         style="opacity:0.9;fill:#ffffff"
+         id="g4147"
+         inkscape:transform-center-x="34.606347"
+         inkscape:transform-center-y="-16.240455"
+         transform="matrix(-1.062807,0.1308753,0.74010064,-3.227468,62.996694,196.66774)">
+        <path
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)"
+           inkscape:transform-center-y="3.2334227"
+           inkscape:transform-center-x="-30.208857"
+           sodipodi:type="arc"
+           style="opacity:0.2;color:#000000;fill:url(#linearGradient4157-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4149"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,9.541976 -2.24232,18.950422 -6.54616,27.466658 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.46793338" />
+        <path
+           sodipodi:end="0.38497975"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,7.838782 -1.51343,15.60384 -4.45721,22.86887 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4151"
+           style="opacity:0.4;color:#000000;fill:url(#linearGradient4159-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.389206"
+           inkscape:transform-center-y="5.7561286"
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)" />
+        <path
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)"
+           inkscape:transform-center-y="7.6655702"
+           inkscape:transform-center-x="-30.447953"
+           sodipodi:type="arc"
+           style="opacity:0.6;color:#000000;fill:url(#linearGradient4161-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4153"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 c 0,6.55049 -1.05689,13.058072 -3.12994,19.271878 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.32200852" />
+        <path
+           sodipodi:end="0.26179939"
+           sodipodi:start="0"
+           d="m 108.8959,48 c 0,5.321771 -0.6976,10.620584 -2.07497,15.76102 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4155"
+           style="opacity:0.8;color:#000000;fill:url(#linearGradient4163-3);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc" />
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Highlight borders"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.25;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none;display:none"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.5;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;display:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.0099,0.03038 0.02089,0.0636 0.03125,0.09375 0.09886,0.287771 0.23488,0.547452 0.375,0.8125 0.144592,0.273507 0.315616,0.535615 0.5,0.78125 0.184384,0.245635 0.373776,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.573473,0.246947 0.875,0.34375 -0.256202,-0.100222 -0.486711,-0.236272 -0.71875,-0.375 -0 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.5;fill:url(#linearGradient3047);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3615-9"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.2;fill:url(#radialGradient3619-8);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       style="color:#000000;fill:url(#linearGradient3935);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 47.8125 32 A 1.4014154 0.99727206 0 0 0 46.78125 32.5 L 32.1875 50.5 A 1.4014154 0.99727206 0 0 0 32 50.96875 A 1.4014154 0.99727206 0 0 0 33.40625 52 L 62.59375 52 A 1.4014154 0.99727206 0 0 0 63.8125 50.5 L 49.21875 32.5 A 1.4014154 0.99727206 0 0 0 47.8125 32 z M 34 56 C 32.892 56 32 56.892 32 58 L 32 62 C 32 63.108 32.892 64 34 64 L 62 64 C 63.108 64 64 63.108 64 62 L 64 58 C 64 56.892 63.108 56 62 56 L 34 56 z "
+       id="rect3156" />
+    <path
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.6"
+       d="M 32.1875 51.5 A 1.4014154 0.99727206 0 0 0 32 51.96875 A 1.4014154 0.99727206 0 0 0 33.40625 53 L 62.59375 53 A 1.4014154 0.99727206 0 0 0 63.8125 51.5 A 1.4014154 0.99727206 0 0 1 62.59375 52 L 33.40625 52 A 1.4014154 0.99727206 0 0 1 32.1875 51.5 z M 32 62 L 32 63 C 32 64.108 32.892 65 34 65 L 62 65 C 63.108 65 64 64.108 64 63 L 64 62 C 64 63.108 63.108 64 62 64 L 34 64 C 32.892 64 32 63.108 32 62 z "
+       id="path3970" />
+    <path
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.6"
+       d="M 47.8125 32 A 1.4014154 0.99727206 0 0 0 46.78125 32.5 L 32.1875 50.5 A 1.4014154 0.99727206 0 0 0 32 50.96875 A 1.4014154 0.99727206 0 0 0 32.1875 51.5 L 46.78125 33.5 A 1.4014154 0.99727206 0 0 1 47.8125 33 A 1.4014154 0.99727206 0 0 1 49.21875 33.5 L 63.8125 51.5 A 1.4014154 0.99727206 0 0 0 63.8125 50.5 L 49.21875 32.5 A 1.4014154 0.99727206 0 0 0 47.8125 32 z M 34 56 C 32.892 56 32 56.892 32 58 L 32 59 C 32 57.892 32.892 57 34 57 L 62 57 C 63.108 57 64 57.892 64 59 L 64 5 [...]
+       id="path3979" />
+    <path
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.2"
+       d="M 47.8125 32 A 1.4014154 0.99727206 0 0 0 46.78125 32.5 L 32.1875 50.5 A 1.4014154 0.99727206 0 0 0 32 50.96875 A 1.4014154 0.99727206 0 0 0 33.40625 52 L 62.59375 52 A 1.4014154 0.99727206 0 0 0 63.8125 50.5 L 49.21875 32.5 A 1.4014154 0.99727206 0 0 0 47.8125 32 z M 47.84375 33 C 47.923815 32.985329 47.825269 33.007926 47.90625 33 C 47.958517 32.995059 47.916297 33.002154 47.96875 33 C 48.021203 32.997846 47.947507 32.999373 48 33 C 48.052493 33.000627 48.010113 32.99659 48.0 [...]
+       id="path3988" />
+    <path
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.2"
+       d="M 47.8125 32 A 1.4014154 0.99727206 0 0 0 46.78125 32.5 L 32.1875 50.5 A 1.4014154 0.99727206 0 0 0 32 50.96875 A 1.4014154 0.99727206 0 0 0 33.40625 52 L 62.59375 52 A 1.4014154 0.99727206 0 0 0 63.8125 50.5 L 49.21875 32.5 A 1.4014154 0.99727206 0 0 0 47.8125 32 z M 48 33.875 L 61.1875 50.15625 L 34.8125 50.15625 L 48 33.875 z M 34 56 C 32.892 56 32 56.892 32 58 L 32 62 C 32 63.108 32.892 64 34 64 L 62 64 C 63.108 64 64 63.108 64 62 L 64 58 C 64 56.892 63.108 56 62 56 L 34 56 [...]
+       id="path3992" />
+  </g>
+</svg>
diff --git a/interface/images/menu/media-playback-start.svg b/interface/images/menu/media-playback-start.svg
new file mode 100755
index 0000000..962bf21
--- /dev/null
+++ b/interface/images/menu/media-playback-start.svg
@@ -0,0 +1,1305 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="media-playback-start.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient4281">
+      <stop
+         style="stop-color:#1e1e1e;stop-opacity:1;"
+         offset="0"
+         id="stop4283" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1;"
+         offset="1"
+         id="stop4285" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective48" />
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3617"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3026"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3722"
+       x1="55"
+       y1="72"
+       x2="55"
+       y2="23.989584"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         style="stop-color:#8c8c8c;stop-opacity:1;"
+         offset="0"
+         id="stop4083" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="1"
+         id="stop4085" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4194">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect4196"
+         style="fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       y2="26.510876"
+       x2="56.692215"
+       y1="66.530067"
+       x1="56.692215"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3038"
+       xlink:href="#linearGradient4081-7"
+       inkscape:collect="always"
+       gradientTransform="translate(0,-80)" />
+    <linearGradient
+       id="linearGradient4081-7">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4083-9" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop4085-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4287-4"
+       x1="48"
+       y1="16"
+       x2="48"
+       y2="80"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4281-6">
+      <stop
+         style="stop-color:#1e1e1e;stop-opacity:1;"
+         offset="0"
+         id="stop4283-9" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1;"
+         offset="1"
+         id="stop4285-8" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4194-1">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect4196-1"
+         style="fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4071-3"
+       id="linearGradient4077-0"
+       x1="48.233639"
+       y1="48.047016"
+       x2="126.13924"
+       y2="66.232674"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4071-3">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4073-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4075-4" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4069-9"
+       x1="48.055065"
+       y1="48.031517"
+       x2="126.67282"
+       y2="62.838562"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4047-2">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4049-0" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4051-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4061-6"
+       x1="47.997307"
+       y1="48.028725"
+       x2="127.05216"
+       y2="60.289631"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4053-2"
+       x1="47.99826"
+       y1="48.028797"
+       x2="127.41583"
+       y2="57.664623"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4145-0"
+       x1="48.233643"
+       y1="48.04702"
+       x2="126.13924"
+       y2="66.232674"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4115-2">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4117-3" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4119-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4137-7"
+       x1="48.055069"
+       y1="48.031521"
+       x2="126.67282"
+       y2="62.838566"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4129-8"
+       x1="47.997311"
+       y1="48.028728"
+       x2="127.05216"
+       y2="60.289635"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4121-6"
+       x1="47.998264"
+       y1="48.028801"
+       x2="127.41583"
+       y2="57.664627"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4071-3"
+       id="linearGradient4089-7"
+       gradientUnits="userSpaceOnUse"
+       x1="48.233639"
+       y1="48.047016"
+       x2="126.13924"
+       y2="66.232674" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4091-0"
+       gradientUnits="userSpaceOnUse"
+       x1="48.055065"
+       y1="48.031517"
+       x2="126.67282"
+       y2="62.838562" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4093-5"
+       gradientUnits="userSpaceOnUse"
+       x1="47.997307"
+       y1="48.028725"
+       x2="127.05216"
+       y2="60.289631" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4095-8"
+       gradientUnits="userSpaceOnUse"
+       x1="47.99826"
+       y1="48.028797"
+       x2="127.41583"
+       y2="57.664623" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4071-3"
+       id="linearGradient4107-8"
+       gradientUnits="userSpaceOnUse"
+       x1="48.233639"
+       y1="48.047016"
+       x2="126.13924"
+       y2="66.232674" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4109-3"
+       gradientUnits="userSpaceOnUse"
+       x1="48.055065"
+       y1="48.031517"
+       x2="126.67282"
+       y2="62.838562" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4111-3"
+       gradientUnits="userSpaceOnUse"
+       x1="47.997307"
+       y1="48.028725"
+       x2="127.05216"
+       y2="60.289631" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4047-2"
+       id="linearGradient4113-5"
+       gradientUnits="userSpaceOnUse"
+       x1="47.99826"
+       y1="48.028797"
+       x2="127.41583"
+       y2="57.664623" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4157-8"
+       gradientUnits="userSpaceOnUse"
+       x1="48.233643"
+       y1="48.04702"
+       x2="126.13924"
+       y2="66.232674" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4159-8"
+       gradientUnits="userSpaceOnUse"
+       x1="48.055069"
+       y1="48.031521"
+       x2="126.67282"
+       y2="62.838566" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4161-2"
+       gradientUnits="userSpaceOnUse"
+       x1="47.997311"
+       y1="48.028728"
+       x2="127.05216"
+       y2="60.289635" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4115-2"
+       id="linearGradient4163-3"
+       gradientUnits="userSpaceOnUse"
+       x1="47.998264"
+       y1="48.028801"
+       x2="127.41583"
+       y2="57.664627" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-6"
+       id="radialGradient3619-8"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-6">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-9" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-6"
+       id="linearGradient3188-1"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3047"
+       xlink:href="#linearGradient3737-6"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3796"
+       id="radialGradient3814"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.98495914,-30,0.71591078)"
+       cx="48.410488"
+       cy="47.59774"
+       fx="48.410488"
+       fy="47.59774"
+       r="30.640047" />
+    <linearGradient
+       id="linearGradient3796">
+      <stop
+         id="stop3798"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+      <stop
+         id="stop3800"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3780-6"
+       id="radialGradient3816"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.013812,-30,-0.66140908)"
+       cx="48.265148"
+       cy="47.886696"
+       fx="48.265148"
+       fy="47.886696"
+       r="28.878813" />
+    <linearGradient
+       id="linearGradient3780-6">
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="0"
+         id="stop3782" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="1"
+         id="stop3784" />
+    </linearGradient>
+    <radialGradient
+       r="28.878813"
+       fy="47.886696"
+       fx="48.265148"
+       cy="47.886696"
+       cx="48.265148"
+       gradientTransform="matrix(1,0,0,1.013812,-30,-0.66140908)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3147"
+       xlink:href="#linearGradient3780-6"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3796-9"
+       id="radialGradient3814-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.98495914,-30,0.71591078)"
+       cx="48.410488"
+       cy="47.59774"
+       fx="48.410488"
+       fy="47.59774"
+       r="30.640047" />
+    <linearGradient
+       id="linearGradient3796-9">
+      <stop
+         id="stop3798-4"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+      <stop
+         id="stop3800-9"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       r="28.878813"
+       fy="47.886696"
+       fx="48.265148"
+       cy="47.886696"
+       cx="48.265148"
+       gradientTransform="matrix(1,0,0,1.013812,-30,-0.66140908)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3147-9"
+       xlink:href="#linearGradient3780-6-5"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3780-6-5">
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="0"
+         id="stop3782-4" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="1"
+         id="stop3784-9" />
+    </linearGradient>
+    <radialGradient
+       r="28.878813"
+       fy="47.886696"
+       fx="48.265148"
+       cy="47.886696"
+       cx="48.265148"
+       gradientTransform="matrix(1,0,0,1.013812,-30,-0.66140908)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient5008"
+       xlink:href="#linearGradient3780-6-5"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3935"
+       x1="38"
+       y1="28"
+       x2="38"
+       y2="68"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient3998"
+       gradientUnits="userSpaceOnUse"
+       x1="38"
+       y1="28"
+       x2="38"
+       y2="68"
+       gradientTransform="translate(-90,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4064"
+       x1="24.508066"
+       y1="35.527863"
+       x2="55.491936"
+       y2="35.527863"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4068"
+       gradientUnits="userSpaceOnUse"
+       x1="24.508066"
+       y1="35.527863"
+       x2="55.491936"
+       y2="35.527863" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4072"
+       gradientUnits="userSpaceOnUse"
+       x1="24.508066"
+       y1="35.527863"
+       x2="55.491936"
+       y2="35.527863" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4076"
+       gradientUnits="userSpaceOnUse"
+       x1="24.508066"
+       y1="35.527863"
+       x2="55.491936"
+       y2="35.527863" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4080"
+       gradientUnits="userSpaceOnUse"
+       x1="24.508066"
+       y1="35.527863"
+       x2="55.491936"
+       y2="35.527863"
+       gradientTransform="matrix(0,1.1034482,-0.97599558,0,85.714775,4.8620711)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4084"
+       gradientUnits="userSpaceOnUse"
+       x1="24.508066"
+       y1="35.527863"
+       x2="55.491936"
+       y2="35.527863" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4092"
+       gradientUnits="userSpaceOnUse"
+       x1="24.508066"
+       y1="35.527863"
+       x2="55.491936"
+       y2="35.527863" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4281-6"
+       id="linearGradient4094"
+       gradientUnits="userSpaceOnUse"
+       x1="24.508066"
+       y1="35.527863"
+       x2="55.491936"
+       y2="35.527863"
+       gradientTransform="matrix(0,1.1034482,-0.97599558,0,85.714775,3.8620711)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.8802312"
+     inkscape:cx="54.722065"
+     inkscape:cy="42.528072"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer4"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99097413"
+       inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+       style="opacity:0.07999998;fill:url(#linearGradient3026);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3786"
+       d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0360184"
+       inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3778"
+       d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98962283"
+       inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3770"
+       d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+       transform="scale(1,-1)" />
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect3723"
+       width="86"
+       height="85"
+       x="5"
+       y="-92"
+       rx="7"
+       ry="7"
+       transform="scale(1,-1)" />
+    <rect
+       transform="scale(1,-1)"
+       ry="6"
+       rx="6"
+       y="-91"
+       x="6"
+       height="84"
+       width="84"
+       id="rect3716"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="opacity:0.9"
+     sodipodi:insensitive="true">
+    <rect
+       style="fill:url(#linearGradient3617);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer7"
+     inkscape:label="Calque"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <g
+       id="g4165"
+       clip-path="url(#clipPath4194-1)">
+      <g
+         style="opacity:0.9"
+         transform="matrix(0.1413721,0.99271966,-1.1651755,0.12044784,96.937266,-5.1946837)"
+         inkscape:transform-center-y="30.567075"
+         inkscape:transform-center-x="0.33129085"
+         id="g4011">
+        <path
+           sodipodi:end="0.46793338"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -6.54616,27.466658 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4009"
+           style="opacity:0.05;color:#000000;fill:url(#linearGradient4077-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.208857"
+           inkscape:transform-center-y="3.2334227"
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)" />
+        <path
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)"
+           inkscape:transform-center-y="5.7561286"
+           inkscape:transform-center-x="-30.389206"
+           sodipodi:type="arc"
+           style="opacity:0.07000002;color:#000000;fill:url(#linearGradient4069-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4007"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -4.45721,22.86887 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.38497975" />
+        <path
+           sodipodi:end="0.32200852"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -3.12994,19.271878 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4005"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4061-6);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.447953"
+           inkscape:transform-center-y="7.6655702"
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)" />
+        <path
+           sodipodi:type="arc"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4053-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4003"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -2.07497,15.76102 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.26179939" />
+      </g>
+      <g
+         style="display:inline"
+         id="g3802"
+         transform="matrix(1.8327427,0,0,1.8327427,14.258316,-39.234412)">
+        <path
+           id="path2875"
+           d="m 19.196345,49.867051 c -3.738265,2.562962 -5.605177,-4.899096 -1.154974,-4.811997 4.387142,-0.236076 3.979146,6.80144 -0.14484,6.614579 -3.173748,0.242635 -5.09871,-3.898691 -3.103604,-6.28528 2.027686,-2.980787 7.171211,-1.684158 7.738852,1.817453 0.968958,3.636165 -3.157198,7.038605 -6.567267,5.522909 -3.946222,-1.269714 -4.48984,-7.147021 -1.107149,-9.366244 3.569732,-2.795822 9.391656,0.237279 9.205832,4.758257 0.256767,4.350812 -4.689261,7.672183 -8.648236,5.934817 -4 [...]
+           style="opacity:0.2;fill:none;stroke:url(#radialGradient3814-9);stroke-width:0.47875074;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="opacity:0.1;fill:none;stroke:url(#radialGradient5008);stroke-width:0.47875074;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 16.908938,49.337251 c -3.885859,-1.858917 1.368699,-6.941434 3.411713,-3.237252 2.27904,3.498707 -3.707115,6.507095 -5.513003,3.024002 -1.707843,-2.496891 0.785978,-6.049192 3.698336,-5.541192 3.416899,0.252456 4.793862,5.102047 2.181575,7.233199 -2.532331,2.525401 -7.29345,0.746141 -7.666384,-2.780808 -0.830168,-3.851348 3.748869,-7.091646 7.182845,-5.362045 3.99743,1.609549 4.267549,7.842669 0.458223,9.838071 -3.458953,2.278819 -8.542946,-0.213769 -8.994268,-4.297839 -0 [...]
+           id="path3650"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="matrix(1.062807,-0.13087531,-0.74010065,3.227468,32.525111,-100.66774)"
+         inkscape:transform-center-y="16.240454"
+         inkscape:transform-center-x="-34.606346"
+         id="g4027"
+         style="opacity:0.9;fill:#ffffff">
+        <path
+           sodipodi:end="0.46793338"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -6.54616,27.466658 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4029"
+           style="opacity:0.2;color:#000000;fill:url(#linearGradient4145-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.208857"
+           inkscape:transform-center-y="3.2334227"
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)" />
+        <path
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)"
+           inkscape:transform-center-y="5.7561286"
+           inkscape:transform-center-x="-30.389206"
+           sodipodi:type="arc"
+           style="opacity:0.4;color:#000000;fill:url(#linearGradient4137-7);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4031"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -4.45721,22.86887 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.38497975" />
+        <path
+           sodipodi:end="0.32200852"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -3.12994,19.271878 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4033"
+           style="opacity:0.6;color:#000000;fill:url(#linearGradient4129-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.447953"
+           inkscape:transform-center-y="7.6655702"
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)" />
+        <path
+           sodipodi:type="arc"
+           style="opacity:0.8;color:#000000;fill:url(#linearGradient4121-6);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4035"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -2.07497,15.76102 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.26179939" />
+      </g>
+      <g
+         id="g4079"
+         inkscape:transform-center-x="26.014377"
+         inkscape:transform-center-y="25.855951"
+         transform="matrix(-0.61678932,0.78712829,-0.78712829,-0.61678932,115.00148,40.011929)"
+         style="opacity:0.5">
+        <path
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)"
+           inkscape:transform-center-y="3.2334227"
+           inkscape:transform-center-x="-30.208857"
+           sodipodi:type="arc"
+           style="opacity:0.05;color:#000000;fill:url(#linearGradient4089-7);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4081"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -6.54616,27.466658 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.46793338" />
+        <path
+           sodipodi:end="0.38497975"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -4.45721,22.86887 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4083"
+           style="opacity:0.07000002;color:#000000;fill:url(#linearGradient4091-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.389206"
+           inkscape:transform-center-y="5.7561286"
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)" />
+        <path
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)"
+           inkscape:transform-center-y="7.6655702"
+           inkscape:transform-center-x="-30.447953"
+           sodipodi:type="arc"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4093-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4085"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -3.12994,19.271878 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.32200852" />
+        <path
+           sodipodi:end="0.26179939"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -2.07497,15.76102 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4087"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4095-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc" />
+      </g>
+      <g
+         id="g4097"
+         inkscape:transform-center-x="-16.093513"
+         inkscape:transform-center-y="-33.641891"
+         transform="matrix(-0.06817198,-1.0460056,2.710673,0.60162586,-79.095447,69.080129)"
+         style="opacity:0.8">
+        <path
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)"
+           inkscape:transform-center-y="3.2334227"
+           inkscape:transform-center-x="-30.208857"
+           sodipodi:type="arc"
+           style="opacity:0.05;color:#000000;fill:url(#linearGradient4107-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4099"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -6.54616,27.466658 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.46793338" />
+        <path
+           sodipodi:end="0.38497975"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -4.45721,22.86887 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4101"
+           style="opacity:0.07000002;color:#000000;fill:url(#linearGradient4109-3);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.389206"
+           inkscape:transform-center-y="5.7561286"
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)" />
+        <path
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)"
+           inkscape:transform-center-y="7.6655702"
+           inkscape:transform-center-x="-30.447953"
+           sodipodi:type="arc"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4111-3);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4103"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -3.12994,19.271878 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.32200852" />
+        <path
+           sodipodi:end="0.26179939"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -2.07497,15.76102 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4105"
+           style="opacity:0.1;color:#000000;fill:url(#linearGradient4113-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc" />
+      </g>
+      <g
+         style="opacity:0.9;fill:#ffffff"
+         id="g4147"
+         inkscape:transform-center-x="34.606347"
+         inkscape:transform-center-y="-16.240455"
+         transform="matrix(-1.062807,0.1308753,0.74010064,-3.227468,62.996694,196.66774)">
+        <path
+           transform="matrix(0.99411049,-0.1083712,0.1083712,0.99411049,-5.1582185,5.4918915)"
+           inkscape:transform-center-y="3.2334227"
+           inkscape:transform-center-x="-30.208857"
+           sodipodi:type="arc"
+           style="opacity:0.2;color:#000000;fill:url(#linearGradient4157-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4149"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -6.54616,27.466658 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.46793338" />
+        <path
+           sodipodi:end="0.38497975"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -4.45721,22.86887 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4151"
+           style="opacity:0.4;color:#000000;fill:url(#linearGradient4159-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc"
+           inkscape:transform-center-x="-30.389206"
+           inkscape:transform-center-y="5.7561286"
+           transform="matrix(0.99786084,-0.06537382,0.06537382,0.99786084,-3.0940115,3.2415713)" />
+        <path
+           transform="matrix(0.99945136,-0.0331207,0.0331207,0.99945136,-1.5634586,1.6161281)"
+           inkscape:transform-center-y="7.6655702"
+           inkscape:transform-center-x="-30.447953"
+           sodipodi:type="arc"
+           style="opacity:0.6;color:#000000;fill:url(#linearGradient4161-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path4153"
+           sodipodi:cx="48"
+           sodipodi:cy="48"
+           sodipodi:rx="60.895905"
+           sodipodi:ry="60.895905"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -3.12994,19.271878 L 48,48 z"
+           sodipodi:start="0"
+           sodipodi:end="0.32200852" />
+        <path
+           sodipodi:end="0.26179939"
+           sodipodi:start="0"
+           d="m 108.8959,48 a 60.895905,60.895905 0 0 1 -2.07497,15.76102 L 48,48 z"
+           sodipodi:ry="60.895905"
+           sodipodi:rx="60.895905"
+           sodipodi:cy="48"
+           sodipodi:cx="48"
+           id="path4155"
+           style="opacity:0.8;color:#000000;fill:url(#linearGradient4163-3);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc" />
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Highlight borders"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.25;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none;display:none"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.5;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;display:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.0099,0.03038 0.02089,0.0636 0.03125,0.09375 0.09886,0.287771 0.23488,0.547452 0.375,0.8125 0.144592,0.273507 0.315616,0.535615 0.5,0.78125 0.184384,0.245635 0.373776,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.573473,0.246947 0.875,0.34375 -0.256202,-0.100222 -0.486711,-0.236272 -0.71875,-0.375 -0 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.5;fill:url(#linearGradient3047);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3615-9"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.2;fill:url(#radialGradient3619-8);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       inkscape:transform-center-x="-5.9999989"
+       transform="matrix(0,1.5491932,-1.3416408,0,177.66563,-13.96773)"
+       d="m 55.491934,48.944272 -30.983868,0 L 40,22.111456 z"
+       inkscape:randomized="0"
+       inkscape:rounded="0"
+       inkscape:flatsided="true"
+       sodipodi:arg2="1.5707963"
+       sodipodi:arg1="0.52359878"
+       sodipodi:r2="8.944272"
+       sodipodi:r1="17.888544"
+       sodipodi:cy="40"
+       sodipodi:cx="40"
+       sodipodi:sides="3"
+       id="path4066"
+       style="color:#000000;fill:url(#linearGradient4068);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       sodipodi:type="star" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.9892911"
+       inkscape:original="M 40 22.125 L 24.5 48.9375 L 55.5 48.9375 L 40 22.125 z "
+       style="color:#000000;fill:url(#linearGradient4076);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path4074"
+       d="m 39.90625,20.125 a 1.98949,1.98949 0 0 0 -1.625,1 l -15.5,26.8125 a 1.98949,1.98949 0 0 0 1.71875,3 l 31,0 a 1.98949,1.98949 0 0 0 1.71875,-3 l -15.5,-26.8125 a 1.98949,1.98949 0 0 0 -1.8125,-1 z"
+       transform="matrix(0,1.1034482,-0.97599558,0,85.714775,3.8620711)" />
+    <path
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.6"
+       d="M 66 48.53125 A 1.9417334 2.1952992 0 0 1 65.09375 49.90625 L 38.9375 67 A 1.9417334 2.1952992 0 0 1 36 65.3125 L 36 66.09375 A 1.9417334 2.1952992 0 0 0 38.9375 68 L 65.09375 50.90625 A 1.9417334 2.1952992 0 0 0 66.0625 48.90625 A 1.9417334 2.1952992 0 0 0 66 48.53125 z "
+       id="path4078" />
+    <path
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.1"
+       d="M 37.8125 28.6875 A 1.9417334 2.1952992 0 0 0 36 30.90625 L 36 65.09375 A 1.9417334 2.1952992 0 0 0 38.9375 67 L 65.09375 49.90625 A 1.9417334 2.1952992 0 0 0 66.0625 47.90625 A 1.9417334 2.1952992 0 0 0 65.09375 46.09375 L 38.9375 29 A 1.9417334 2.1952992 0 0 0 37.8125 28.6875 z M 37.96875 30.96875 L 64.03125 48 L 37.96875 65.03125 L 37.96875 30.96875 z "
+       id="path4102" />
+    <path
+       style="opacity:0.2;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 37.8125,28.6875 c -1.423292,0.108664 -1.972167,1.670142 -1.8125,2.90403 0.0052,11.240448 -0.01038,22.481264 0.0078,33.721482 -0.01361,1.508853 1.888489,2.641202 3.093611,1.579877 C 47.81786,61.188091 56.550276,55.50637 65.25677,49.787154 66.568156,48.741103 66.195981,46.482944 64.684005,45.825972 56.043726,40.184455 47.41259,34.528445 38.766598,28.895984 38.476389,28.73907 38.141988,28.663585 37.8125,28.6875 z m -0.0625,1.25 c 0.822791,-0.04114 1.391491,0.756476 2.099802,1.08 [...]
+       id="path4097"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.6"
+       d="M 37.8125 28.6875 A 1.9417334 2.1952992 0 0 0 36 30.90625 L 36 31.65625 A 1.9417334 2.1952992 0 0 1 38.9375 30 L 65.09375 47.09375 A 1.9417334 2.1952992 0 0 1 66 48.46875 A 1.9417334 2.1952992 0 0 0 66.0625 47.90625 A 1.9417334 2.1952992 0 0 0 65.09375 46.09375 L 38.9375 29 A 1.9417334 2.1952992 0 0 0 37.8125 28.6875 z "
+       id="path4088" />
+  </g>
+</svg>
diff --git a/interface/images/menu/network-transmit-receive.svg b/interface/images/menu/network-transmit-receive.svg
new file mode 100755
index 0000000..cc117a0
--- /dev/null
+++ b/interface/images/menu/network-transmit-receive.svg
@@ -0,0 +1,1110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="network-transmit-receive.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3807">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3809" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3811" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3799">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3801" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3803" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3783">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3785" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3787" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.3839999"
+       y="-0.192"
+       height="1.3839999"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187"
+       id="linearGradient3617"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <inkscape:perspective
+       id="perspective3925"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187"
+       id="linearGradient5006"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-1.1034483,-1.1034472)"
+       x1="69"
+       y1="122"
+       x2="69"
+       y2="5.9781809" />
+    <linearGradient
+       id="linearGradient3187">
+      <stop
+         style="stop-color:#333333;stop-opacity:1;"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#444444;stop-opacity:1;"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       y2="5.9781809"
+       x2="69"
+       y1="122"
+       x1="69"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-117.42488,3.3965528)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3934"
+       xlink:href="#linearGradient3187"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective3964"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226"
+       id="radialGradient5232"
+       cx="63.98003"
+       cy="61.948856"
+       fx="63.98003"
+       fy="61.948856"
+       r="58.01997"
+       gradientTransform="matrix(1.5312074,0,0,1.1812169,-33.966694,-11.20439)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5226">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5228" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5230" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective4003"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226-0"
+       id="radialGradient3462"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70689703,0,0,0.26397967,2.935342,34.087887)"
+       cx="69.75"
+       cy="75.973572"
+       fx="69.75"
+       fy="75.973572"
+       r="58.5" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5226-0">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5228-7" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5230-6" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226-0"
+       id="radialGradient3465"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.51921983,-0.47906434,1.2026838,1.3000296,-72.74405,-19.887561)"
+       cx="49.233551"
+       cy="70.608253"
+       fx="49.233551"
+       fy="70.608253"
+       r="25.483549" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226-0"
+       id="radialGradient3468"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9747377,0,0,0.92610887,-14.268168,-12.6013)"
+       cx="64.230392"
+       cy="68.449158"
+       fx="64.230392"
+       fy="68.449158"
+       r="43.769611" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5226-0"
+       id="radialGradient3471"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.84390682,0,0,0.33117465,-5.8161585,32.792567)"
+       cx="63.875"
+       cy="2.2173476"
+       fx="63.875"
+       fy="2.2173476"
+       r="58.375" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3451"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient3543">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3545" />
+      <stop
+         id="stop3555"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3551"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3547" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3449"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4039">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4041" />
+      <stop
+         id="stop4043"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4045"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4047" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3447"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4050">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4052" />
+      <stop
+         id="stop4054"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4056"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4058" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3445"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4061">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4063" />
+      <stop
+         id="stop4065"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4067"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4069" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3443"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4072">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4074" />
+      <stop
+         id="stop4076"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4078"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4080" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3543"
+       id="radialGradient3441"
+       gradientUnits="userSpaceOnUse"
+       cx="74.375"
+       cy="67.125"
+       fx="74.375"
+       fy="67.125"
+       r="3.125" />
+    <linearGradient
+       id="linearGradient4083">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4085" />
+      <stop
+         id="stop4087"
+         offset="0.30645162"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4089"
+         offset="0.51899064"
+         style="stop-color:#ffffff;stop-opacity:0.640625;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4091" />
+    </linearGradient>
+    <radialGradient
+       r="3.125"
+       fy="67.125"
+       fx="74.375"
+       cy="67.125"
+       cx="74.375"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4103"
+       xlink:href="#linearGradient3543"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective2930"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3689"
+       x1="96"
+       y1="-2"
+       x2="96"
+       y2="-82"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-20,16)" />
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4083" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop4085-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3691"
+       x1="72"
+       y1="-2"
+       x2="72"
+       y2="-66"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.75,0,0,0.7401316,0.6111087,79.480263)" />
+    <linearGradient
+       id="linearGradient2939">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop2941" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop2943" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3693"
+       x1="56"
+       y1="-2"
+       x2="56"
+       y2="-50"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.75,0,0,0.75657895,2.4999985,79.513158)" />
+    <linearGradient
+       id="linearGradient2946">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop2948" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop2950" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3695"
+       x1="24"
+       y1="-2"
+       x2="24"
+       y2="-34"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.75,0,0,0.78947368,4.4999994,79.578945)" />
+    <linearGradient
+       id="linearGradient2953">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop2955" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop2957" />
+    </linearGradient>
+    <linearGradient
+       y2="-82"
+       x2="96"
+       y1="-2"
+       x1="96"
+       gradientTransform="matrix(0.75,0,0,0.75,-1.5,79.5)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2963"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3783"
+       id="linearGradient3789"
+       x1="72"
+       y1="18"
+       x2="72"
+       y2="72.009262"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3783"
+       id="linearGradient3797"
+       x1="56"
+       y1="30"
+       x2="56"
+       y2="73"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3799"
+       id="linearGradient3805"
+       x1="40"
+       y1="42"
+       x2="40"
+       y2="73"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3807"
+       id="linearGradient3813"
+       x1="24"
+       y1="54"
+       x2="24"
+       y2="74"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3821"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.75,0,0,0.75,-1.5,79.5)"
+       x1="96"
+       y1="-2"
+       x2="96"
+       y2="-82" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3828"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.75,0,0,0.7401316,0.6111087,80.480263)"
+       x1="72"
+       y1="-2"
+       x2="72"
+       y2="-66" />
+    <inkscape:perspective
+       id="perspective2975"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3760"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2984"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2986" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2988" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2991"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2993" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2995" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2998"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3000" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3002" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3005"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3007" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3009" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3016"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3773"
+       x1="16"
+       y1="48"
+       x2="80"
+       y2="48"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.875,0,0,0.875,-90,-84)" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3824"
+       x1="33.945"
+       y1="11.001904"
+       x2="33.945"
+       y2="79.830856"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3832"
+       x1="31.725"
+       y1="79.814171"
+       x2="31.725"
+       y2="10.985223"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9009009,0,0,0.9009009,3.4189189,6.0953392)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3839"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9009009,0,0,0.9009009,3.4189189,7.0953392)"
+       x1="31.725"
+       y1="79.814171"
+       x2="31.725"
+       y2="10.985223" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3841"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9009009,0,0,0.9009009,3.4189189,6.0953392)"
+       x1="31.725"
+       y1="79.814171"
+       x2="31.725"
+       y2="10.985223" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3848"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9009009,0,0,0.9009009,3.4189189,5.0953392)"
+       x1="31.725"
+       y1="79.814171"
+       x2="31.725"
+       y2="10.985223" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3850"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9009009,0,0,0.9009009,3.4189189,6.0953392)"
+       x1="31.725"
+       y1="79.814171"
+       x2="31.725"
+       y2="10.985223" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.7465959"
+     inkscape:cx="27.131237"
+     inkscape:cy="43.078352"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer4"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3016);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716" />
+  </g>
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Signal">
+    <path
+       style="opacity:0.08;fill:#000000;fill-opacity:1;stroke:none"
+       d="m 72.75,16 c -3.012797,0.03323 -4.548085,2.917441 -6.610559,4.673059 -2.681897,2.681897 -5.363794,5.363794 -8.045691,8.045691 -2.739339,0.167435 -6.059996,-0.725357 -8.052782,1.738751 -2.596988,2.652658 -5.353279,5.203016 -7.853468,7.917499 -1.627173,1.413875 -0.132647,4.290641 -2.759782,3.705505 -2.552099,0.800343 -4.013236,3.271524 -5.972404,4.949947 -1.795043,1.996059 -4.11394,3.59959 -5.438992,5.953846 -0.717856,1.98609 -0.02579,4.280457 -0.460744,6.241374 -3.769883,3.83308 [...]
+       id="path3868" />
+    <path
+       style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none"
+       d="m 72.75,17 c -0.913336,0 -1.857885,0.354105 -2.5625,1.0625 -0.0063,0.0063 -0.02498,-0.0064 -0.03125,0 l -11.625,11.65625 -4.78125,0 c -0.940982,-0.0076 -1.879022,0.348878 -2.59375,1.0625 l -8.09375,8.0625 0,0.03125 c -1.428112,1.418955 -1.450836,3.76311 -0.03125,5.1875 -0.655239,-0.654697 -1.560348,-1.105906 -2.59375,-1.09375 0.01775,-2.09e-4 -0.0167,-0.0011 -0.0625,0 -0.981903,0.01934 -1.852151,0.446899 -2.5,1.09375 l -8.125,8.09375 c -0.713719,0.714825 -1.070014,1.65299 -1.06 [...]
+       id="path3863" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.011099"
+       inkscape:original="M 72.75 18.90625 C 72.291525 18.90625 71.853038 19.077582 71.53125 19.40625 L 59.3125 31.625 L 53.75 31.625 C 53.29199 31.6213 52.824123 31.801379 52.5 32.125 L 44.40625 40.21875 C 43.748914 40.862327 43.748914 42.075173 44.40625 42.71875 L 54.3125 52.625 C 54.643188 52.955415 55.095163 53.136205 55.5625 53.125 C 56.011125 53.1213 56.463769 52.941992 56.78125 52.625 L 64.90625 44.5 C 65.229871 44.175877 65.409908 43.73926 65.40625 43.28125 L 65.40625 37.6875 L 7 [...]
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none"
+       id="path3859"
+       d="m 72.75,17.90625 c -0.710373,0 -1.417375,0.250005 -1.9375,0.78125 L 58.875,30.625 l -5.125,0 c -0.728573,-0.0059 -1.433067,0.246396 -1.96875,0.78125 L 43.6875,39.5 c -1.111079,1.087823 -1.111079,2.849677 0,3.9375 l 9.90625,9.90625 c 0.518965,0.518537 1.236014,0.790675 1.96875,0.78125 0.0099,-8.2e-5 0.02138,1.82e-4 0.03125,0 0.701873,-0.01296 1.390889,-0.266682 1.90625,-0.78125 l 8.125,-8.125 c 0.511925,-0.512719 0.787065,-1.209418 0.78125,-1.9375 l 0,-5.15625 11.90625,-11.90625 [...]
+    <path
+       id="path3853"
+       d="m 72.75,18.90625 c -0.458475,0 -0.896962,0.171332 -1.21875,0.5 L 59.3125,31.625 l -5.5625,0 c -0.45801,-0.0037 -0.925877,0.176379 -1.25,0.5 l -8.09375,8.09375 c -0.657336,0.643577 -0.657336,1.856423 0,2.5 L 54.3125,52.625 c 0.330688,0.330415 0.782663,0.511205 1.25,0.5 0.448625,-0.0037 0.901269,-0.183008 1.21875,-0.5 l 8.125,-8.125 c 0.323621,-0.324123 0.503658,-0.76074 0.5,-1.21875 l 0,-5.59375 L 77.59375,25.5 c 0.657336,-0.643577 0.657336,-1.856423 0,-2.5 L 74,19.40625 c -0.32 [...]
+       style="fill:#000000;fill-opacity:1;stroke:none;opacity:0.3" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98691362"
+       inkscape:original="M -74 17.9375 C -76.773313 17.9375 -79.0625 20.226687 -79.0625 23 L -79.0625 73 C -79.0625 75.773313 -76.773313 78.0625 -74 78.0625 L -24 78.0625 C -21.226687 78.0625 -18.9375 75.773313 -18.9375 73 L -18.9375 23 C -18.9375 20.226687 -21.226687 17.9375 -24 17.9375 L -74 17.9375 z "
+       style="opacity:0.07999998;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3789"
+       d="m -74,16.9375 c -3.316401,0 -6.0625,2.746099 -6.0625,6.0625 l 0,50 c 0,3.316401 2.746099,6.0625 6.0625,6.0625 l 50,0 c 3.316401,0 6.0625,-2.746099 6.0625,-6.0625 l 0,-50 c 0,-3.316401 -2.746099,-6.0625 -6.0625,-6.0625 l -50,0 z"
+       transform="matrix(0,-1,1,0,-90,0)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0574075"
+       inkscape:original="M -74 19 C -76.191679 19 -78 20.808321 -78 23 L -78 73 C -78 75.191679 -76.191679 77 -74 77 L -24 77 C -21.808321 77 -20 75.191679 -20 73 L -20 23 C -20 20.808321 -21.808321 19 -24 19 L -74 19 z "
+       style="opacity:0.1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3785"
+       d="m -74,17.9375 c -2.773313,0 -5.0625,2.289187 -5.0625,5.0625 l 0,50 c 0,2.773313 2.289187,5.0625 5.0625,5.0625 l 50,0 c 2.773313,0 5.0625,-2.289187 5.0625,-5.0625 l 0,-50 c 0,-2.773313 -2.289187,-5.0625 -5.0625,-5.0625 l -50,0 z"
+       transform="matrix(0,-1,1,0,-90,0)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98691362"
+       inkscape:original="M -74 20 C -75.662 20 -77 21.338 -77 23 L -77 73 C -77 74.662 -75.662 76 -74 76 L -24 76 C -22.338 76 -21 74.662 -21 73 L -21 23 C -21 21.338 -22.338 20 -24 20 L -74 20 z "
+       style="opacity:0.15;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3781"
+       d="m -74,19 c -2.191679,0 -4,1.808321 -4,4 l 0,50 c 0,2.191679 1.808321,4 4,4 l 50,0 c 2.191679,0 4,-1.808321 4,-4 l 0,-50 c 0,-2.191679 -1.808321,-4 -4,-4 l -50,0 z"
+       transform="matrix(0,-1,1,0,-90,0)" />
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       ry="3"
+       rx="3"
+       y="-70"
+       x="-77"
+       height="56"
+       width="56"
+       id="rect3775"
+       style="opacity:0.3;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <rect
+       style="color:#000000;fill:url(#linearGradient3773);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3764"
+       width="56"
+       height="56"
+       x="-76"
+       y="-70"
+       rx="3"
+       ry="3"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <path
+       style="opacity:0.3;fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+       d="m -49.794671,45.02716 c -0.970839,0.137402 -1.8902,0.61226 -2.562356,1.323458 l -6.073728,6.050096 c -0.81477,0.784822 -1.302958,1.896342 -1.328631,3.025049 l 0,6.050097 c -3.43e-4,0.0315 -3.43e-4,0.06303 0,0.09453 l -11.360928,11.204887 c -1.189652,1.185024 -1.189652,3.163485 0,4.348509 1.189655,1.185021 3.175842,1.185021 4.365494,0 l 11.360927,-11.299424 6.073731,0 c 1.133116,-0.0255 2.24898,-0.51186 3.036866,-1.323457 l 6.073731,-6.050097 c 1.559152,-1.601306 1.559152,-4.448 [...]
+       id="rect2911"
+       sodipodi:nodetypes="cccccccscccccccc" />
+    <path
+       sodipodi:nodetypes="cccccccscccccccc"
+       id="path3698"
+       d="m -34.230434,50.997945 c 0.970836,-0.137402 1.890199,-0.61226 2.562353,-1.323457 l 6.073731,-6.050097 c 0.814769,-0.784822 1.302958,-1.896342 1.328628,-3.025049 l 0,-6.050096 c 3.45e-4,-0.0315 3.45e-4,-0.06303 0,-0.09453 l 11.36093,-11.204888 c 1.189652,-1.185024 1.189652,-3.163485 0,-4.348509 -1.189655,-1.185023 -3.175841,-1.185023 -4.365493,0 l -11.360931,11.299424 -6.073728,0 c -1.133119,0.0255 -2.248979,0.51186 -3.036865,1.323457 l -6.073731,6.050097 c -1.559153,1.601306 -1 [...]
+       style="opacity:0.3;fill:#ffffff;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       style="fill:url(#linearGradient3832);stroke:none;fill-opacity:1"
+       d="M 72.75 17.90625 C 72.291525 17.90625 71.853038 18.077582 71.53125 18.40625 L 59.3125 30.625 L 53.75 30.625 C 53.29199 30.621306 52.824123 30.801379 52.5 31.125 L 44.40625 39.21875 C 43.748914 39.862327 43.748914 41.075173 44.40625 41.71875 L 54.3125 51.625 C 54.643188 51.955415 55.095163 52.136205 55.5625 52.125 C 56.011125 52.121306 56.463769 51.941992 56.78125 51.625 L 64.90625 43.5 C 65.229871 43.175877 65.409908 42.73926 65.40625 42.28125 L 65.40625 36.6875 L 77.59375 24.5 [...]
+       id="path3804" />
+    <path
+       style="fill:#ffffff;stroke:none;fill-opacity:1;opacity:0.75"
+       d="M 72.75 17.90625 C 72.291525 17.90625 71.853038 18.077582 71.53125 18.40625 L 59.3125 30.625 L 53.75 30.625 C 53.29199 30.621306 52.824123 30.801379 52.5 31.125 L 44.40625 39.21875 C 43.958756 39.656877 43.806964 40.36218 43.96875 40.96875 C 44.044616 40.684313 44.196408 40.4242 44.40625 40.21875 L 52.5 32.125 C 52.824123 31.801379 53.29199 31.6213 53.75 31.625 L 59.3125 31.625 L 71.53125 19.40625 C 71.853038 19.077582 72.291525 18.90625 72.75 18.90625 C 73.208475 18.90625 73.6 [...]
+       id="path3835" />
+    <path
+       style="fill:#000000;stroke:none;fill-opacity:1;opacity:0.14"
+       d="M 78.03125 22.75 C 77.955384 23.034437 77.803592 23.29455 77.59375 23.5 L 65.40625 35.6875 L 65.40625 36.6875 L 77.59375 24.5 C 78.041244 24.061873 78.193036 23.35657 78.03125 22.75 z M 43.96875 39.96875 C 43.806964 40.57532 43.958756 41.280623 44.40625 41.71875 L 54.3125 51.625 C 54.643188 51.955415 55.095163 52.136205 55.5625 52.125 C 56.011125 52.121306 56.463769 51.941992 56.78125 51.625 L 64.90625 43.5 C 65.229871 43.175877 65.409908 42.73926 65.40625 42.28125 L 65.40625 4 [...]
+       id="path3844" />
+  </g>
+</svg>
diff --git a/interface/images/menu/new_service.svg b/interface/images/menu/new_service.svg
new file mode 100755
index 0000000..b60a144
--- /dev/null
+++ b/interface/images/menu/new_service.svg
@@ -0,0 +1,1709 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="new_service.svg"
+   version="1.0"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:version="0.32"
+   id="svg2408"
+   height="96"
+   width="96">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="85.911795"
+     inkscape:cy="86.266453"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2410">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective5020" />
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective4739"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient2236-453">
+      <stop
+         id="stop4067"
+         offset="0.0000000"
+         style="stop-color:#0f0f0f;stop-opacity:1.0000000;" />
+      <stop
+         id="stop4069"
+         offset="1.0000000"
+         style="stop-color:#161616;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2194-648">
+      <stop
+         style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4073" />
+      <stop
+         style="stop-color:#333333;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop4075" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2233-597">
+      <stop
+         style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4079" />
+      <stop
+         style="stop-color:#898989;stop-opacity:1.0000000;"
+         offset="0.44000000"
+         id="stop4081" />
+      <stop
+         style="stop-color:#6e6e6e;stop-opacity:1.0000000;"
+         offset="0.57999998"
+         id="stop4083" />
+      <stop
+         style="stop-color:#434343;stop-opacity:1.0000000;"
+         offset="0.76999998"
+         id="stop4085" />
+      <stop
+         style="stop-color:#363636;stop-opacity:0.96470588;"
+         offset="0.89499998"
+         id="stop4087" />
+      <stop
+         style="stop-color:#333333;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop4089" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2189-347">
+      <stop
+         style="stop-color:#616161;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop4093" />
+      <stop
+         style="stop-color:#232323;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4095" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2189-559">
+      <stop
+         style="stop-color:#616161;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop4099" />
+      <stop
+         style="stop-color:#232323;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4101" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2189-910">
+      <stop
+         style="stop-color:#616161;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop4105" />
+      <stop
+         style="stop-color:#232323;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4107" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2189-604">
+      <stop
+         style="stop-color:#616161;stop-opacity:0.86458331;"
+         offset="0.0000000"
+         id="stop4111" />
+      <stop
+         style="stop-color:#232323;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4113" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2312-661">
+      <stop
+         style="stop-color:#f7f7f7;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4117" />
+      <stop
+         style="stop-color:#c5c5c5;stop-opacity:1.0000000;"
+         offset="0.67000002"
+         id="stop4119" />
+      <stop
+         style="stop-color:#898989;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4121" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4066-482">
+      <stop
+         id="stop4125"
+         offset="0.0000000"
+         style="stop-color:#fbfbfb;stop-opacity:1.0000000;" />
+      <stop
+         id="stop4127"
+         offset="1.0000000"
+         style="stop-color:#5b5b5b;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective5810"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3731"
+       id="linearGradient3664"
+       gradientUnits="userSpaceOnUse"
+       x1="48.082497"
+       y1="75.561722"
+       x2="46.654823"
+       y2="16.972879"
+       gradientTransform="translate(0,1)" />
+    <linearGradient
+       id="linearGradient3731">
+      <stop
+         id="stop3733"
+         offset="0"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ebebeb;stop-opacity:1;"
+         offset="0.30654153"
+         id="stop3757" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.70706075"
+         id="stop3737" />
+      <stop
+         id="stop3759"
+         offset="0.84501493"
+         style="stop-color:#fafafa;stop-opacity:1" />
+      <stop
+         id="stop3735"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective8082"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4634"
+       id="linearGradient4238"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="55.077717"
+       y2="56" />
+    <linearGradient
+       id="linearGradient4634">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4636" />
+      <stop
+         id="stop4642"
+         offset="0.30000001"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         style="stop-color:#4c4c4c;stop-opacity:1;"
+         offset="0.60000002"
+         id="stop4644" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="1"
+         id="stop4638" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient4240"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="56.153542"
+       y2="56" />
+    <linearGradient
+       id="linearGradient4654">
+      <stop
+         id="stop4656"
+         offset="0"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.30000001"
+         id="stop4658" />
+      <stop
+         id="stop4660"
+         offset="0.60000002"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         id="stop4662"
+         offset="1"
+         style="stop-color:#636363;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient4242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,112)"
+       x1="48"
+       y1="56"
+       x2="55.868713"
+       y2="56" />
+    <linearGradient
+       id="linearGradient8099">
+      <stop
+         id="stop8101"
+         offset="0"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.30000001"
+         id="stop8103" />
+      <stop
+         id="stop8105"
+         offset="0.60000002"
+         style="stop-color:#a5a5a5;stop-opacity:1;" />
+      <stop
+         id="stop8107"
+         offset="1"
+         style="stop-color:#636363;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4672"
+       id="linearGradient4244"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="96"
+       x2="48"
+       y2="31.677887" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4672">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4674" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4676" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8"
+       id="radialGradient4481-2"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4215-8">
+      <stop
+         style="stop-color:#ffb800;stop-opacity:1;"
+         offset="0"
+         id="stop4217-4" />
+      <stop
+         style="stop-color:#ffb800;stop-opacity:0;"
+         offset="1"
+         id="stop4219-3" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6"
+       id="radialGradient4483-2"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient4223-6">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop4225-4" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop4227-8" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8"
+       id="radialGradient4397-1"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6"
+       id="radialGradient4399-8"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient8129">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop8131" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop8133" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8"
+       id="radialGradient4355-6"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6"
+       id="radialGradient4357-5"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient8143">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop8145" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop8147" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8"
+       id="radialGradient4333-9"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <radialGradient
+       r="7.2449093"
+       fy="31.601685"
+       fx="29.094891"
+       cy="31.601685"
+       cx="29.094891"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3556"
+       xlink:href="#linearGradient4223-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient8157">
+      <stop
+         style="stop-color:#ffe375;stop-opacity:1;"
+         offset="0"
+         id="stop8159" />
+      <stop
+         style="stop-color:#ffa600;stop-opacity:1;"
+         offset="1"
+         id="stop8161" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4778"
+       id="radialGradient4323-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.02521851,1.5993168,-0.98834063,0.01558446,59.14689,-26.95295)"
+       cx="39.04879"
+       cy="28.09796"
+       fx="39.04879"
+       fy="28.09796"
+       r="36.428211" />
+    <linearGradient
+       id="linearGradient4778">
+      <stop
+         style="stop-color:#fff9b9;stop-opacity:1;"
+         offset="0"
+         id="stop4780" />
+      <stop
+         style="stop-color:#fff79e;stop-opacity:0;"
+         offset="1"
+         id="stop4782" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4296"
+       id="linearGradient4302"
+       x1="79.814896"
+       y1="106.04263"
+       x2="39.328308"
+       y2="35.917809"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.96592583,0.25881905,-0.25881905,0.96592583,123.10964,-7.2591)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4296">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4298-2" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4300" />
+    </linearGradient>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4304">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.53347418"
+         id="feGaussianBlur4306" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4296"
+       id="linearGradient4310-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.96592583,0.25881905,-0.25881905,0.96592583,30.00523,-25.91561)"
+       x1="79.814896"
+       y1="106.04263"
+       x2="39.328308"
+       y2="35.917809" />
+    <linearGradient
+       y2="35.917809"
+       x2="39.328308"
+       y1="106.04263"
+       x1="79.814896"
+       gradientTransform="matrix(0.96592583,0.25881905,-0.25881905,0.96592583,30.00523,-25.91561)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3588"
+       xlink:href="#linearGradient4296"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.00225966,0.925477,-1.3844339,0,25.901984,-30.21143)"
+       r="35.9375"
+       fy="-15.871236"
+       fx="56.065952"
+       cy="-15.871236"
+       cx="56.065952"
+       id="radialGradient3465"
+       xlink:href="#linearGradient3175"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3175">
+      <stop
+         id="stop3177"
+         offset="0"
+         style="stop-color:#4490e6;stop-opacity:1;" />
+      <stop
+         id="stop3179"
+         offset="1"
+         style="stop-color:#103d8f;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonColor"
+       id="radialGradient3366"
+       cx="47.098362"
+       cy="80.842926"
+       fx="47.098362"
+       fy="80.842926"
+       r="38.957481"
+       gradientTransform="matrix(1.3112996,-5.281739e-8,4.5811678e-8,1.1373685,-14.661706,-10.847943)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="ButtonColor"
+       x1="58.650177"
+       y1="122"
+       x2="58.650177"
+       y2="5.4252338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-1.1034483,-1.1034483)">
+      <stop
+         style="stop-color:#2fc044;stop-opacity:1;"
+         offset="0"
+         id="stop3792" />
+      <stop
+         style="stop-color:#246d2f;stop-opacity:1;"
+         offset="1"
+         id="stop3794" />
+    </linearGradient>
+    <radialGradient
+       r="38.957481"
+       fy="80.842926"
+       fx="47.098362"
+       cy="80.842926"
+       cx="47.098362"
+       gradientTransform="matrix(1.3112996,-5.281739e-8,4.5811678e-8,1.1373685,78.442705,7.808567)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient8241"
+       xlink:href="#ButtonColor"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8-970"
+       id="radialGradient4355-6-402"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4215-8-970">
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:1;"
+         offset="0"
+         id="stop8657" />
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:0;"
+         offset="1"
+         id="stop8659" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6-539"
+       id="radialGradient4357-5-808"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient4223-6-539">
+      <stop
+         style="stop-color:#dfdfdf;stop-opacity:1;"
+         offset="0"
+         id="stop8663" />
+      <stop
+         style="stop-color:#aeaeae;stop-opacity:1;"
+         offset="1"
+         id="stop8665" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8-854"
+       id="radialGradient4481-2-403"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4215-8-854">
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:1;"
+         offset="0"
+         id="stop8669" />
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:0;"
+         offset="1"
+         id="stop8671" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6-615"
+       id="radialGradient4483-2-290"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient4223-6-615">
+      <stop
+         style="stop-color:#dfdfdf;stop-opacity:1;"
+         offset="0"
+         id="stop8675" />
+      <stop
+         style="stop-color:#aeaeae;stop-opacity:1;"
+         offset="1"
+         id="stop8677" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4778-982"
+       id="radialGradient4323-7-350"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.02521851,1.5993168,-0.98834063,0.01558446,59.14689,-26.95295)"
+       cx="39.04879"
+       cy="28.09796"
+       fx="39.04879"
+       fy="28.09796"
+       r="36.428211" />
+    <linearGradient
+       id="linearGradient4778-982">
+      <stop
+         style="stop-color:#f3f3f3;stop-opacity:1;"
+         offset="0"
+         id="stop8681" />
+      <stop
+         style="stop-color:#efefef;stop-opacity:0;"
+         offset="1"
+         id="stop8683" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8-590"
+       id="radialGradient4333-9-878"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4215-8-590">
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:1;"
+         offset="0"
+         id="stop8687" />
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:0;"
+         offset="1"
+         id="stop8689" />
+    </linearGradient>
+    <radialGradient
+       r="7.2449093"
+       fy="31.601685"
+       fx="29.094891"
+       cy="31.601685"
+       cx="29.094891"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3556-322"
+       xlink:href="#linearGradient4223-6-747"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4223-6-747">
+      <stop
+         style="stop-color:#dfdfdf;stop-opacity:1;"
+         offset="0"
+         id="stop8693" />
+      <stop
+         style="stop-color:#aeaeae;stop-opacity:1;"
+         offset="1"
+         id="stop8695" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.00225966,0.925477,-1.3844339,0,25.901984,-30.21143)"
+       r="35.9375"
+       fy="-15.871236"
+       fx="56.065952"
+       cy="-15.871236"
+       cx="56.065952"
+       id="radialGradient3465-430"
+       xlink:href="#linearGradient3175-588"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3175-588">
+      <stop
+         id="stop8699"
+         offset="0"
+         style="stop-color:#838383;stop-opacity:1;" />
+      <stop
+         id="stop8701"
+         offset="1"
+         style="stop-color:#393939;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4215-8-843"
+       id="radialGradient4397-1-759"
+       gradientUnits="userSpaceOnUse"
+       cx="32"
+       cy="32"
+       fx="32"
+       fy="32"
+       r="8" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4215-8-843">
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:1;"
+         offset="0"
+         id="stop9233" />
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:0;"
+         offset="1"
+         id="stop9235" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4223-6-391"
+       id="radialGradient4399-8-972"
+       gradientUnits="userSpaceOnUse"
+       cx="29.094891"
+       cy="31.601685"
+       fx="29.094891"
+       fy="31.601685"
+       r="7.2449093" />
+    <linearGradient
+       id="linearGradient4223-6-391">
+      <stop
+         style="stop-color:#dfdfdf;stop-opacity:1;"
+         offset="0"
+         id="stop9239" />
+      <stop
+         style="stop-color:#aeaeae;stop-opacity:1;"
+         offset="1"
+         id="stop9241" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4634"
+       id="linearGradient3269"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="55.077717"
+       y2="56" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient3271"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="56.153542"
+       y2="56" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient3273"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,112)"
+       x1="48"
+       y1="56"
+       x2="55.868713"
+       y2="56" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4672"
+       id="linearGradient3275"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="96"
+       x2="48"
+       y2="31.677887" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4634"
+       id="linearGradient3283"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="55.077717"
+       y2="56" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient3285"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="56.153542"
+       y2="56" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient3287"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,112)"
+       x1="48"
+       y1="56"
+       x2="55.868713"
+       y2="56" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4672"
+       id="linearGradient3289"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="96"
+       x2="48"
+       y2="31.677887" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient3296"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.86015807,-0.4966125,-0.4966125,-0.86015807,43.610788,125.64214)"
+       x1="48"
+       y1="56"
+       x2="55.868713"
+       y2="56" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4654"
+       id="linearGradient3299"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="56.153542"
+       y2="56"
+       gradientTransform="matrix(0.86015807,-0.4966125,0.4966125,0.86015807,-12.009812,29.304438)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4634"
+       id="linearGradient3302"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="56"
+       x2="55.077717"
+       y2="56"
+       gradientTransform="matrix(0.99322499,0,0,0.99322499,-25.053021,19.373482)" />
+  </defs>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <rect
+       style="fill:url(#radialGradient8241);fill-opacity:1;stroke:none;display:inline;enable-background:new"
+       id="rect3461"
+       width="77.914963"
+       height="78.516495"
+       x="101.24529"
+       y="26.910942"
+       rx="5.8527675"
+       ry="6.1732869" />
+    <path
+       transform="matrix(0.8286091,-0.55982761,0.55982761,0.8286091,52.292998,77.347713)"
+       style="opacity:0.1;color:#000000;fill:url(#linearGradient3588);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4304);enable-background:accumulate"
+       d="m 61.895589,17.34349 c -0.135233,-0.04214 -0.28289,-0.05044 -0.416672,-0.01459 l -5.787197,1.555153 c -0.535123,0.143386 -0.804929,0.915704 -0.58985,1.718389 l 3.238555,12.061692 6.733607,25.097978 4.37878,16.37891 5.585295,20.810946 c 0.215078,0.802687 0.824216,1.348782 1.359339,1.205396 l 5.787197,-1.555154 c 0.535123,-0.143386 0.804929,-0.915701 0.589851,-1.718388 L 77.189199,72.072876 72.810419,55.693967 66.076812,30.595988 62.838256,18.534296 C 62.676947,17.932283 62.30128 [...]
+       id="path4312"
+       inkscape:connector-curvature="0"
+       inkscape:transform-center-x="27.370382"
+       inkscape:transform-center-y="-28.885643" />
+    <path
+       inkscape:transform-center-y="-34.602819"
+       inkscape:transform-center-x="19.650078"
+       inkscape:connector-curvature="0"
+       id="path4308"
+       d="m 61.895589,17.34349 c -0.135233,-0.04214 -0.28289,-0.05044 -0.416672,-0.01459 l -5.787197,1.555153 c -0.535123,0.143386 -0.804929,0.915704 -0.58985,1.718389 l 3.238555,12.061692 6.733607,25.097978 4.37878,16.37891 5.585295,20.810946 c 0.215078,0.802687 0.824216,1.348782 1.359339,1.205396 l 5.787197,-1.555154 c 0.535123,-0.143386 0.804929,-0.915701 0.589851,-1.718388 L 77.189199,72.072876 72.810419,55.693967 66.076812,30.595988 62.838256,18.534296 C 62.676947,17.932283 62.30128 [...]
+       style="opacity:0.3;color:#000000;fill:url(#linearGradient4310-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4304);enable-background:accumulate"
+       transform="matrix(0.93863507,-0.34491188,0.34491188,0.93863507,64.623303,50.570406)" />
+    <path
+       style="opacity:0.12000002;color:#000000;fill:url(#linearGradient4302);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4304);enable-background:accumulate"
+       d="m 155,36 c -0.13523,-0.04214 -0.28289,-0.05044 -0.41667,-0.01459 l -5.7872,1.555153 c -0.53512,0.143386 -0.80493,0.915704 -0.58985,1.718389 l 3.23856,12.061692 6.7336,25.097978 4.37878,16.37891 5.5853,20.810948 c 0.21508,0.80269 0.82421,1.34878 1.35934,1.20539 l 5.78719,-1.55515 c 0.53513,-0.14339 0.80493,-0.9157 0.58986,-1.71839 l -5.5853,-20.810944 -4.37878,-16.378909 -6.73361,-25.097979 -3.23855,-12.061692 C 155.78136,36.588793 155.4057,36.126414 155,36 z"
+       id="rect4250"
+       inkscape:connector-curvature="0"
+       inkscape:transform-center-x="6.5099633"
+       inkscape:transform-center-y="-39.25509" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.98353909;fill:url(#radialGradient4323-7-350);fill-opacity:1;stroke:none;display:inline;enable-background:new"
+       d="m 66.65625,13.84375 c -7.36028,25.499114 -22.654,54.407743 -36,50.03125 C 16.60897,59.268538 25.5377,40.595327 30,36 24.74577,40.926829 11.59997,61.281971 28.375,70.1875 41.30764,77.05318 68.10822,61.40289 83.3125,40.21875 l 0,-20.375 c 0,-3.324 -2.676,-6 -6,-6 l -10.65625,0 z"
+       id="path4776" />
+    <g
+       id="g4201-3"
+       transform="matrix(1.1298846,0,0,1.1298846,8.1812944,30.918108)"
+       style="fill:#c4c4c4;display:inline;enable-background:new">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#radialGradient4333-9-878);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4203-0"
+         sodipodi:cx="32"
+         sodipodi:cy="32"
+         sodipodi:rx="8"
+         sodipodi:ry="8"
+         d="m 40,32 c 0,4.418278 -3.581722,8 -8,8 -4.418278,0 -8,-3.581722 -8,-8 0,-4.418278 3.581722,-8 8,-8 4.418278,0 8,3.581722 8,8 z"
+         transform="translate(-1,-1)" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.1;color:#000000;fill:#c4c4c4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         id="path4205-5"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         style="opacity:0.2;color:#000000;fill:#c4c4c4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         id="path4207-2"
+         sodipodi:nodetypes="ccccccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="star"
+         style="color:#000000;fill:url(#radialGradient3556-322);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path4209-7"
+         sodipodi:sides="4"
+         sodipodi:cx="29.094891"
+         sodipodi:cy="31.601685"
+         sodipodi:r1="8.3657007"
+         sodipodi:r2="1.3385121"
+         sodipodi:arg1="1.0471976"
+         sodipodi:arg2="1.8325958"
+         inkscape:flatsided="false"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 2.889947,6.898477 z"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:transform-center-x="4.905109"
+         inkscape:transform-center-y="-2.3983152" />
+    </g>
+    <g
+       style="fill:#c4c4c4;display:inline;enable-background:new"
+       transform="matrix(0.74835613,0,0,0.74835613,50.519944,24.521986)"
+       id="g4345-6">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 c 0,4.418278 -3.581722,8 -8,8 -4.418278,0 -8,-3.581722 -8,-8 0,-4.418278 3.581722,-8 8,-8 4.418278,0 8,3.581722 8,8 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4347-1"
+         style="color:#000000;fill:url(#radialGradient4355-6-402);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4349-8"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#c4c4c4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4351-2"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#c4c4c4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 2.889947,6.898477 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4353-5"
+         style="color:#000000;fill:url(#radialGradient4357-5-808);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <g
+       style="fill:#c4c4c4;display:inline;enable-background:new"
+       transform="matrix(1.8398335,0,0,1.8398335,-30.451005,-9.4721227)"
+       id="g4387-8">
+      <path
+         transform="translate(-1,-1)"
+         d="m 40,32 c 0,4.418278 -3.581722,8 -8,8 -4.418278,0 -8,-3.581722 -8,-8 0,-4.418278 3.581722,-8 8,-8 4.418278,0 8,3.581722 8,8 z"
+         sodipodi:ry="8"
+         sodipodi:rx="8"
+         sodipodi:cy="32"
+         sodipodi:cx="32"
+         id="path4389-8"
+         style="color:#000000;fill:url(#radialGradient4397-1-759);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4391-8"
+         d="m 23.90625,22.633975 2.383468,8.216066 -6.186993,5.931209 8.186993,-2.467107 5.991532,6.270632 -2.52743,-8.270632 6.330955,-5.907893 -8.330955,2.443791 -5.84757,-6.216066 z"
+         style="opacity:0.1;color:#000000;fill:#c4c4c4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccccccc"
+         id="path4393-3"
+         d="m 33.777741,39.712619 -5.216804,-6.034048 -7.576981,2.605964 6.074408,-5.15034 -2.646323,-7.643445 5.163457,6.064847 7.630327,-2.636762 -6.025795,5.354295 2.597711,7.439489 z"
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         style="opacity:0.2;color:#000000;fill:#c4c4c4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:transform-center-y="-2.3983152"
+         inkscape:transform-center-x="4.905109"
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,21.657457,-10.861778)"
+         d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 2.889947,6.898477 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.8325958"
+         sodipodi:arg1="1.0471976"
+         sodipodi:r2="1.3385121"
+         sodipodi:r1="8.3657007"
+         sodipodi:cy="31.601685"
+         sodipodi:cx="29.094891"
+         sodipodi:sides="4"
+         id="path4395-4"
+         style="color:#000000;fill:url(#radialGradient4399-8-972);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="star" />
+    </g>
+    <path
+       transform="matrix(0.87787637,0,0,0.87787637,3.788652,-5.8500101)"
+       d="m 40,32 a 8,8 0 1 1 -16,0 8,8 0 1 1 16,0 z"
+       sodipodi:ry="8"
+       sodipodi:rx="8"
+       sodipodi:cy="32"
+       sodipodi:cx="32"
+       id="path4473-1"
+       style="color:#000000;fill:url(#radialGradient4481-2-403);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       sodipodi:type="arc" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc"
+       id="path4475-5"
+       d="m 31.919225,13.193713 -1.794282,7.292568 -7.307178,1.793573 7.307178,1.717933 1.802721,7.397243 1.708784,-7.397243 7.406392,-1.712656 -7.406391,-1.79885 -1.717224,-7.292568 z"
+       style="opacity:0.1;color:#000000;fill:#c4c4c4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc"
+       id="path4477-3"
+       d="m 31.927687,30.510952 -1.31757,-6.877319 -6.904357,-1.344608 6.87883,-1.249324 1.343098,-6.972602 1.263493,6.877318 6.958433,1.344609 -6.931395,1.425722 -1.290532,6.796204 z"
+       inkscape:transform-center-y="-2.3983152"
+       inkscape:transform-center-x="4.905109"
+       style="opacity:0.2;color:#000000;fill:#c4c4c4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       inkscape:transform-center-y="-2.3983152"
+       inkscape:transform-center-x="4.905109"
+       transform="matrix(0.76026323,0.43893819,-0.43893819,0.76026323,23.679098,-14.507432)"
+       d="m 33.277741,38.846594 -4.529283,-5.952006 -6.898477,2.889947 5.952006,-4.529283 -2.889946,-6.898477 4.529282,5.952006 6.898477,-2.889946 -5.952006,4.529282 2.889947,6.898477 z"
+       inkscape:randomized="0"
+       inkscape:rounded="0"
+       inkscape:flatsided="false"
+       sodipodi:arg2="1.8325958"
+       sodipodi:arg1="1.0471976"
+       sodipodi:r2="1.3385121"
+       sodipodi:r1="8.3657007"
+       sodipodi:cy="31.601685"
+       sodipodi:cx="29.094891"
+       sodipodi:sides="4"
+       id="path4479-7"
+       style="color:#000000;fill:url(#radialGradient4483-2-290);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       sodipodi:type="star" />
+    <text
+       id="text9584"
+       y="86"
+       x="10"
+       style="font-size:25.44919967999999955px;font-style:normal;font-weight:normal;fill:#00ff00;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="86"
+         x="10"
+         id="tspan9586"
+         sodipodi:role="line">SOS</tspan></text>
+    <rect
+       ry="1.4898375"
+       rx="0.99322498"
+       y="35.265083"
+       x="22.621778"
+       height="79.458"
+       width="7.9457998"
+       id="rect4228"
+       style="color:#000000;fill:url(#linearGradient3302);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       transform="matrix(0.8660254,-0.50000001,0.50000001,0.8660254,0,0)" />
+    <path
+       sodipodi:nodetypes="ssccsss"
+       inkscape:connector-curvature="0"
+       id="path4230"
+       d="m 38.083733,18.732955 c -0.476527,0.275123 -0.527924,1.072058 -0.115239,1.786849 l 6.207656,10.751976 6.881265,-3.9729 -6.207656,-10.751976 c -0.412685,-0.714791 -1.12855,-1.068748 -1.605077,-0.793624 z"
+       style="color:#000000;fill:url(#linearGradient3299);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       style="color:#000000;fill:url(#linearGradient3296);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 77.812733,87.5456 c -0.476527,0.275124 -1.192391,-0.07883 -1.605076,-0.793624 L 70,76 l 6.881265,-3.9729 6.207656,10.751976 c 0.412685,0.714791 0.361288,1.511726 -0.115239,1.786849 z"
+       id="path4232"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ssccsss" />
+    <rect
+       style="opacity:0.29999999999999999;color:#000000;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect4234"
+       width="7.9457998"
+       height="79.458"
+       x="22.621778"
+       y="35.265083"
+       rx="0.99322498"
+       ry="1.4898375"
+       transform="matrix(0.8660254,-0.50000001,0.50000001,0.8660254,0,0)" />
+    <path
+       id="path4236"
+       d="m 38.083733,18.732955 c -0.476527,0.275123 -0.527924,1.072058 -0.115239,1.786849 l 38.239163,66.232172 c 0.412685,0.714791 1.128549,1.068748 1.605076,0.793624 l 5.160949,-2.979675 c 0.476527,-0.275123 0.527924,-1.072058 0.115239,-1.786849 L 44.849759,16.546904 c -0.412685,-0.714791 -1.12855,-1.068748 -1.605077,-0.793624 z m 0.604133,0.798081 4.945909,-2.855522 c 0.07912,0.03912 0.238786,0.165285 0.355826,0.368003 l 38.239162,66.232171 c 0.117039,0.202718 0.146465,0.404078 0.140 [...]
+       style="opacity:0.2;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="sssssssssccssccssc" />
+  </g>
+</svg>
diff --git a/interface/images/menu/observedProperties.svg b/interface/images/menu/observedProperties.svg
new file mode 100755
index 0000000..d58f934
--- /dev/null
+++ b/interface/images/menu/observedProperties.svg
@@ -0,0 +1,3551 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="status2.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective89" />
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2983"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       x1="210.6445"
+       y1="210.6416"
+       x2="43.025101"
+       y2="43.022202"
+       id="XMLID_27_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop16" />
+      <stop
+         style="stop-color:#333366;stop-opacity:1"
+         offset="1"
+         id="stop18" />
+    </linearGradient>
+    <linearGradient
+       x1="126.8467"
+       y1="197.0508"
+       x2="126.8467"
+       y2="56.633801"
+       id="XMLID_28_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#9a9ab1;stop-opacity:1"
+         offset="0"
+         id="stop23" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop25" />
+    </linearGradient>
+    <linearGradient
+       x1="126.8462"
+       y1="198.0625"
+       x2="126.8462"
+       y2="57.389599"
+       id="XMLID_29_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#7c74ff;stop-opacity:1"
+         offset="0.0056"
+         id="stop30" />
+      <stop
+         style="stop-color:#9b95ff;stop-opacity:1"
+         offset="0.69099998"
+         id="stop32" />
+      <stop
+         style="stop-color:#a3a1ff;stop-opacity:1"
+         offset="0.76300001"
+         id="stop34" />
+      <stop
+         style="stop-color:#afb2ff;stop-opacity:1"
+         offset="0.8987"
+         id="stop36" />
+      <stop
+         style="stop-color:#b3b8ff;stop-opacity:1"
+         offset="1"
+         id="stop38" />
+    </linearGradient>
+    <linearGradient
+       x1="126.8457"
+       y1="198.08501"
+       x2="126.8457"
+       y2="57.074299"
+       id="XMLID_30_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#e9e9ef;stop-opacity:1"
+         offset="0"
+         id="stop43" />
+      <stop
+         style="stop-color:#f9f9fb;stop-opacity:1"
+         offset="0.56"
+         id="stop45" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop47" />
+    </linearGradient>
+    <linearGradient
+       x1="117.8765"
+       y1="72.8638"
+       x2="211.9673"
+       y2="72.8638"
+       id="XMLID_31_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)">
+      <stop
+         style="stop-color:#7d7d99;stop-opacity:1"
+         offset="0"
+         id="stop52" />
+      <stop
+         style="stop-color:#b1b1c5;stop-opacity:1"
+         offset="1"
+         id="stop54" />
+    </linearGradient>
+    <linearGradient
+       x1="117.8711"
+       y1="102.1147"
+       x2="211.9619"
+       y2="102.1147"
+       id="XMLID_32_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)">
+      <stop
+         style="stop-color:#7d7d99;stop-opacity:1"
+         offset="0"
+         id="stop59" />
+      <stop
+         style="stop-color:#b1b1c5;stop-opacity:1"
+         offset="1"
+         id="stop61" />
+    </linearGradient>
+    <linearGradient
+       x1="117.8755"
+       y1="131.3672"
+       x2="211.9653"
+       y2="131.3672"
+       id="XMLID_33_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)">
+      <stop
+         style="stop-color:#7d7d99;stop-opacity:1"
+         offset="0"
+         id="stop66" />
+      <stop
+         style="stop-color:#b1b1c5;stop-opacity:1"
+         offset="1"
+         id="stop68" />
+    </linearGradient>
+    <linearGradient
+       x1="117.8706"
+       y1="160.6172"
+       x2="211.9615"
+       y2="160.6172"
+       id="XMLID_34_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)">
+      <stop
+         style="stop-color:#7d7d99;stop-opacity:1"
+         offset="0"
+         id="stop73" />
+      <stop
+         style="stop-color:#b1b1c5;stop-opacity:1"
+         offset="1"
+         id="stop75" />
+    </linearGradient>
+    <linearGradient
+       x1="86.347198"
+       y1="112.7109"
+       x2="86.347198"
+       y2="183.20261"
+       id="XMLID_35_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop86" />
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="1"
+         id="stop88" />
+    </linearGradient>
+    <radialGradient
+       cx="87.391602"
+       cy="90.318802"
+       r="89.119003"
+       fx="87.391602"
+       fy="90.318802"
+       id="XMLID_36_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0.34830001"
+         id="stop93" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.53930002"
+         id="stop95" />
+      <stop
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="1"
+         id="stop97" />
+    </radialGradient>
+    <linearGradient
+       x1="86.343803"
+       y1="167.0137"
+       x2="86.343803"
+       y2="114.2524"
+       id="XMLID_37_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="0"
+         id="stop102" />
+      <stop
+         style="stop-color:#00008d;stop-opacity:1"
+         offset="1"
+         id="stop104" />
+    </linearGradient>
+    <linearGradient
+       x1="105.4448"
+       y1="122.6216"
+       x2="67.244598"
+       y2="122.6222"
+       id="XMLID_38_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop115" />
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="1"
+         id="stop117" />
+    </linearGradient>
+    <linearGradient
+       x1="66.526901"
+       y1="122.1152"
+       x2="106.1616"
+       y2="122.1152"
+       id="XMLID_39_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#dcf0ff;stop-opacity:1"
+         offset="0"
+         id="stop126" />
+      <stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop128" />
+    </linearGradient>
+    <linearGradient
+       x1="66.807602"
+       y1="117.8262"
+       x2="105.8804"
+       y2="117.8262"
+       id="XMLID_40_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#0053bd;stop-opacity:1"
+         offset="0"
+         id="stop135" />
+      <stop
+         style="stop-color:#00008d;stop-opacity:1"
+         offset="1"
+         id="stop137" />
+    </linearGradient>
+    <linearGradient
+       x1="86.342796"
+       y1="69.372597"
+       x2="86.342796"
+       y2="128.8848"
+       id="XMLID_41_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#c76200;stop-opacity:1"
+         offset="0"
+         id="stop142" />
+      <stop
+         style="stop-color:#d8922a;stop-opacity:1"
+         offset="0.5"
+         id="stop144" />
+      <stop
+         style="stop-color:#996600;stop-opacity:1"
+         offset="1"
+         id="stop146" />
+    </linearGradient>
+    <radialGradient
+       cx="76.373497"
+       cy="82.791"
+       r="47.318901"
+       fx="76.373497"
+       fy="82.791"
+       id="XMLID_42_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop151" />
+      <stop
+         style="stop-color:#ffdb9d;stop-opacity:1"
+         offset="0.51679999"
+         id="stop153" />
+      <stop
+         style="stop-color:#f0cd87;stop-opacity:1"
+         offset="0.75279999"
+         id="stop155" />
+      <stop
+         style="stop-color:#ba8a2b;stop-opacity:1"
+         offset="1"
+         id="stop157" />
+    </radialGradient>
+    <linearGradient
+       x1="117.4688"
+       y1="192.0938"
+       x2="90.433403"
+       y2="165.0584"
+       id="XMLID_43_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0703,1e-4,1e-4,1.0985,-1.5319,-45.9813)">
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="0"
+         id="stop170" />
+      <stop
+         style="stop-color:#1c50f0;stop-opacity:1"
+         offset="0.0847"
+         id="stop172" />
+      <stop
+         style="stop-color:#497cf4;stop-opacity:1"
+         offset="0.23980001"
+         id="stop174" />
+      <stop
+         style="stop-color:#6fa0f8;stop-opacity:1"
+         offset="0.396"
+         id="stop176" />
+      <stop
+         style="stop-color:#8cbdfb;stop-opacity:1"
+         offset="0.55089998"
+         id="stop178" />
+      <stop
+         style="stop-color:#a0d1fd;stop-opacity:1"
+         offset="0.704"
+         id="stop180" />
+      <stop
+         style="stop-color:#adddff;stop-opacity:1"
+         offset="0.85470003"
+         id="stop182" />
+      <stop
+         style="stop-color:#b1e1ff;stop-opacity:1"
+         offset="1"
+         id="stop184" />
+    </linearGradient>
+    <linearGradient
+       x1="119.9502"
+       y1="167.94141"
+       x2="91.554802"
+       y2="139.54601"
+       id="XMLID_44_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="0"
+         id="stop189" />
+      <stop
+         style="stop-color:#1c50f0;stop-opacity:1"
+         offset="0.0847"
+         id="stop191" />
+      <stop
+         style="stop-color:#497cf4;stop-opacity:1"
+         offset="0.23980001"
+         id="stop193" />
+      <stop
+         style="stop-color:#6fa0f8;stop-opacity:1"
+         offset="0.396"
+         id="stop195" />
+      <stop
+         style="stop-color:#8cbdfb;stop-opacity:1"
+         offset="0.55089998"
+         id="stop197" />
+      <stop
+         style="stop-color:#a0d1fd;stop-opacity:1"
+         offset="0.704"
+         id="stop199" />
+      <stop
+         style="stop-color:#adddff;stop-opacity:1"
+         offset="0.85470003"
+         id="stop201" />
+      <stop
+         style="stop-color:#b1e1ff;stop-opacity:1"
+         offset="1"
+         id="stop203" />
+    </linearGradient>
+    <linearGradient
+       x1="122.7407"
+       y1="163.00591"
+       x2="96.799301"
+       y2="137.06441"
+       id="XMLID_45_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#034cfe;stop-opacity:1"
+         offset="0"
+         id="stop208" />
+      <stop
+         style="stop-color:#1359fe;stop-opacity:1"
+         offset="0.038"
+         id="stop210" />
+      <stop
+         style="stop-color:#4885fe;stop-opacity:1"
+         offset="0.17739999"
+         id="stop212" />
+      <stop
+         style="stop-color:#76aaff;stop-opacity:1"
+         offset="0.31850001"
+         id="stop214" />
+      <stop
+         style="stop-color:#9cc9ff;stop-opacity:1"
+         offset="0.4585"
+         id="stop216" />
+      <stop
+         style="stop-color:#b9e0ff;stop-opacity:1"
+         offset="0.59740001"
+         id="stop218" />
+      <stop
+         style="stop-color:#cdf1ff;stop-opacity:1"
+         offset="0.73470002"
+         id="stop220" />
+      <stop
+         style="stop-color:#dafcff;stop-opacity:1"
+         offset="0.86970001"
+         id="stop222" />
+      <stop
+         style="stop-color:#deffff;stop-opacity:1"
+         offset="1"
+         id="stop224" />
+    </linearGradient>
+    <linearGradient
+       x1="119.0371"
+       y1="166.7041"
+       x2="93.096397"
+       y2="140.7634"
+       id="XMLID_46_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#006dff;stop-opacity:1"
+         offset="0"
+         id="stop229" />
+      <stop
+         style="stop-color:#1379ff;stop-opacity:1"
+         offset="0.0447"
+         id="stop231" />
+      <stop
+         style="stop-color:#489cff;stop-opacity:1"
+         offset="0.183"
+         id="stop233" />
+      <stop
+         style="stop-color:#76bbff;stop-opacity:1"
+         offset="0.32319999"
+         id="stop235" />
+      <stop
+         style="stop-color:#9cd3ff;stop-opacity:1"
+         offset="0.4623"
+         id="stop237" />
+      <stop
+         style="stop-color:#b9e6ff;stop-opacity:1"
+         offset="0.6002"
+         id="stop239" />
+      <stop
+         style="stop-color:#cdf4ff;stop-opacity:1"
+         offset="0.73650002"
+         id="stop241" />
+      <stop
+         style="stop-color:#dafcff;stop-opacity:1"
+         offset="0.87059999"
+         id="stop243" />
+      <stop
+         style="stop-color:#deffff;stop-opacity:1"
+         offset="1"
+         id="stop245" />
+    </linearGradient>
+    <linearGradient
+       x1="108.0044"
+       y1="152.14059"
+       x2="108.0044"
+       y2="147.99429"
+       id="XMLID_47_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#006600;stop-opacity:1"
+         offset="0"
+         id="stop254" />
+      <stop
+         style="stop-color:#99ff66;stop-opacity:1"
+         offset="1"
+         id="stop256" />
+    </linearGradient>
+    <linearGradient
+       x1="110.0752"
+       y1="150.06351"
+       x2="105.9336"
+       y2="150.06351"
+       id="XMLID_48_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#009933;stop-opacity:1"
+         offset="0"
+         id="stop261" />
+      <stop
+         style="stop-color:#6fcf00;stop-opacity:1"
+         offset="1"
+         id="stop263" />
+    </linearGradient>
+    <linearGradient
+       x1="80.309097"
+       y1="127.1787"
+       x2="80.309097"
+       y2="110.0138"
+       id="XMLID_49_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop276" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop278" />
+    </linearGradient>
+    <linearGradient
+       x1="545.81152"
+       y1="127.1797"
+       x2="545.81152"
+       y2="110.014"
+       id="XMLID_50_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,638.1875,0)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop283" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop285" />
+    </linearGradient>
+    <linearGradient
+       x1="86.3452"
+       y1="130.9951"
+       x2="86.3452"
+       y2="124.2214"
+       id="XMLID_51_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop290" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop292" />
+    </linearGradient>
+    <linearGradient
+       x1="595.99017"
+       y1="136.166"
+       x2="595.99017"
+       y2="131.64909"
+       id="XMLID_52_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,-1,682.334,255)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop297" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop299" />
+    </linearGradient>
+    <foreignObject
+       requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
+       x="0"
+       y="0"
+       width="1"
+       height="1"
+       id="foreignObject8">
+      <i:pgfRef
+         xlink:href="#adobe_illustrator_pgf" />
+    </foreignObject>
+    <linearGradient
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3104"
+       y2="43.022202"
+       x2="43.025101"
+       y1="210.6416"
+       x1="210.6445">
+      <stop
+         id="stop3106"
+         offset="0"
+         style="stop-color:#003399;stop-opacity:1" />
+      <stop
+         id="stop3108"
+         offset="1"
+         style="stop-color:#333366;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3111"
+       y2="56.633801"
+       x2="126.8467"
+       y1="197.0508"
+       x1="126.8467">
+      <stop
+         id="stop3113"
+         offset="0"
+         style="stop-color:#9a9ab1;stop-opacity:1" />
+      <stop
+         id="stop3115"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3118"
+       y2="57.389599"
+       x2="126.8462"
+       y1="198.0625"
+       x1="126.8462">
+      <stop
+         id="stop3120"
+         offset="0.0056"
+         style="stop-color:#7c74ff;stop-opacity:1" />
+      <stop
+         id="stop3122"
+         offset="0.69099998"
+         style="stop-color:#9b95ff;stop-opacity:1" />
+      <stop
+         id="stop3124"
+         offset="0.76300001"
+         style="stop-color:#a3a1ff;stop-opacity:1" />
+      <stop
+         id="stop3126"
+         offset="0.8987"
+         style="stop-color:#afb2ff;stop-opacity:1" />
+      <stop
+         id="stop3128"
+         offset="1"
+         style="stop-color:#b3b8ff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3131"
+       y2="57.074299"
+       x2="126.8457"
+       y1="198.08501"
+       x1="126.8457">
+      <stop
+         id="stop3133"
+         offset="0"
+         style="stop-color:#e9e9ef;stop-opacity:1" />
+      <stop
+         id="stop3135"
+         offset="0.56"
+         style="stop-color:#f9f9fb;stop-opacity:1" />
+      <stop
+         id="stop3137"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3140"
+       y2="72.8638"
+       x2="211.9673"
+       y1="72.8638"
+       x1="117.8765">
+      <stop
+         id="stop3142"
+         offset="0"
+         style="stop-color:#7d7d99;stop-opacity:1" />
+      <stop
+         id="stop3144"
+         offset="1"
+         style="stop-color:#b1b1c5;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3147"
+       y2="102.1147"
+       x2="211.9619"
+       y1="102.1147"
+       x1="117.8711">
+      <stop
+         id="stop3149"
+         offset="0"
+         style="stop-color:#7d7d99;stop-opacity:1" />
+      <stop
+         id="stop3151"
+         offset="1"
+         style="stop-color:#b1b1c5;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3154"
+       y2="131.3672"
+       x2="211.9653"
+       y1="131.3672"
+       x1="117.8755">
+      <stop
+         id="stop3156"
+         offset="0"
+         style="stop-color:#7d7d99;stop-opacity:1" />
+      <stop
+         id="stop3158"
+         offset="1"
+         style="stop-color:#b1b1c5;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.9659,0.2588,-0.2588,0.9659,37.4352,-29.1286)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3161"
+       y2="160.6172"
+       x2="211.9615"
+       y1="160.6172"
+       x1="117.8706">
+      <stop
+         id="stop3163"
+         offset="0"
+         style="stop-color:#7d7d99;stop-opacity:1" />
+      <stop
+         id="stop3165"
+         offset="1"
+         style="stop-color:#b1b1c5;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       x1="86.347198"
+       y1="112.7109"
+       x2="86.347198"
+       y2="183.20261"
+       id="linearGradient3171"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop3173" />
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="1"
+         id="stop3175" />
+    </linearGradient>
+    <radialGradient
+       cx="87.391602"
+       cy="90.318802"
+       r="89.119003"
+       fx="87.391602"
+       fy="90.318802"
+       id="radialGradient3178"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0.34830001"
+         id="stop3180" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.53930002"
+         id="stop3182" />
+      <stop
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="1"
+         id="stop3184" />
+    </radialGradient>
+    <linearGradient
+       x1="86.343803"
+       y1="167.0137"
+       x2="86.343803"
+       y2="114.2524"
+       id="linearGradient3187"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#00008d;stop-opacity:1"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       x1="105.4448"
+       y1="122.6216"
+       x2="67.244598"
+       y2="122.6222"
+       id="linearGradient3197"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop3199" />
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="1"
+         id="stop3201" />
+    </linearGradient>
+    <linearGradient
+       x1="66.526901"
+       y1="122.1152"
+       x2="106.1616"
+       y2="122.1152"
+       id="linearGradient3206"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#dcf0ff;stop-opacity:1"
+         offset="0"
+         id="stop3208" />
+      <stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop3210" />
+    </linearGradient>
+    <linearGradient
+       x1="66.807602"
+       y1="117.8262"
+       x2="105.8804"
+       y2="117.8262"
+       id="linearGradient3214"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#0053bd;stop-opacity:1"
+         offset="0"
+         id="stop3216" />
+      <stop
+         style="stop-color:#00008d;stop-opacity:1"
+         offset="1"
+         id="stop3218" />
+    </linearGradient>
+    <linearGradient
+       x1="86.342796"
+       y1="69.372597"
+       x2="86.342796"
+       y2="128.8848"
+       id="linearGradient3221"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#c76200;stop-opacity:1"
+         offset="0"
+         id="stop3223" />
+      <stop
+         style="stop-color:#d8922a;stop-opacity:1"
+         offset="0.5"
+         id="stop3225" />
+      <stop
+         style="stop-color:#996600;stop-opacity:1"
+         offset="1"
+         id="stop3227" />
+    </linearGradient>
+    <radialGradient
+       cx="76.373497"
+       cy="82.791"
+       r="47.318901"
+       fx="76.373497"
+       fy="82.791"
+       id="radialGradient3230"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop3232" />
+      <stop
+         style="stop-color:#ffdb9d;stop-opacity:1"
+         offset="0.51679999"
+         id="stop3234" />
+      <stop
+         style="stop-color:#f0cd87;stop-opacity:1"
+         offset="0.75279999"
+         id="stop3236" />
+      <stop
+         style="stop-color:#ba8a2b;stop-opacity:1"
+         offset="1"
+         id="stop3238" />
+    </radialGradient>
+    <linearGradient
+       x1="117.4688"
+       y1="192.0938"
+       x2="90.433403"
+       y2="165.0584"
+       id="linearGradient3245"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0703,1e-4,1e-4,1.0985,-1.5319,-45.9813)">
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="0"
+         id="stop3247" />
+      <stop
+         style="stop-color:#1c50f0;stop-opacity:1"
+         offset="0.0847"
+         id="stop3249" />
+      <stop
+         style="stop-color:#497cf4;stop-opacity:1"
+         offset="0.23980001"
+         id="stop3251" />
+      <stop
+         style="stop-color:#6fa0f8;stop-opacity:1"
+         offset="0.396"
+         id="stop3253" />
+      <stop
+         style="stop-color:#8cbdfb;stop-opacity:1"
+         offset="0.55089998"
+         id="stop3255" />
+      <stop
+         style="stop-color:#a0d1fd;stop-opacity:1"
+         offset="0.704"
+         id="stop3257" />
+      <stop
+         style="stop-color:#adddff;stop-opacity:1"
+         offset="0.85470003"
+         id="stop3259" />
+      <stop
+         style="stop-color:#b1e1ff;stop-opacity:1"
+         offset="1"
+         id="stop3261" />
+    </linearGradient>
+    <linearGradient
+       x1="119.9502"
+       y1="167.94141"
+       x2="91.554802"
+       y2="139.54601"
+       id="linearGradient3264"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#0035ed;stop-opacity:1"
+         offset="0"
+         id="stop3266" />
+      <stop
+         style="stop-color:#1c50f0;stop-opacity:1"
+         offset="0.0847"
+         id="stop3268" />
+      <stop
+         style="stop-color:#497cf4;stop-opacity:1"
+         offset="0.23980001"
+         id="stop3270" />
+      <stop
+         style="stop-color:#6fa0f8;stop-opacity:1"
+         offset="0.396"
+         id="stop3272" />
+      <stop
+         style="stop-color:#8cbdfb;stop-opacity:1"
+         offset="0.55089998"
+         id="stop3274" />
+      <stop
+         style="stop-color:#a0d1fd;stop-opacity:1"
+         offset="0.704"
+         id="stop3276" />
+      <stop
+         style="stop-color:#adddff;stop-opacity:1"
+         offset="0.85470003"
+         id="stop3278" />
+      <stop
+         style="stop-color:#b1e1ff;stop-opacity:1"
+         offset="1"
+         id="stop3280" />
+    </linearGradient>
+    <linearGradient
+       x1="122.7407"
+       y1="163.00591"
+       x2="96.799301"
+       y2="137.06441"
+       id="linearGradient3283"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#034cfe;stop-opacity:1"
+         offset="0"
+         id="stop3285" />
+      <stop
+         style="stop-color:#1359fe;stop-opacity:1"
+         offset="0.038"
+         id="stop3287" />
+      <stop
+         style="stop-color:#4885fe;stop-opacity:1"
+         offset="0.17739999"
+         id="stop3289" />
+      <stop
+         style="stop-color:#76aaff;stop-opacity:1"
+         offset="0.31850001"
+         id="stop3291" />
+      <stop
+         style="stop-color:#9cc9ff;stop-opacity:1"
+         offset="0.4585"
+         id="stop3293" />
+      <stop
+         style="stop-color:#b9e0ff;stop-opacity:1"
+         offset="0.59740001"
+         id="stop3295" />
+      <stop
+         style="stop-color:#cdf1ff;stop-opacity:1"
+         offset="0.73470002"
+         id="stop3297" />
+      <stop
+         style="stop-color:#dafcff;stop-opacity:1"
+         offset="0.86970001"
+         id="stop3299" />
+      <stop
+         style="stop-color:#deffff;stop-opacity:1"
+         offset="1"
+         id="stop3301" />
+    </linearGradient>
+    <linearGradient
+       x1="119.0371"
+       y1="166.7041"
+       x2="93.096397"
+       y2="140.7634"
+       id="linearGradient3304"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#006dff;stop-opacity:1"
+         offset="0"
+         id="stop3306" />
+      <stop
+         style="stop-color:#1379ff;stop-opacity:1"
+         offset="0.0447"
+         id="stop3308" />
+      <stop
+         style="stop-color:#489cff;stop-opacity:1"
+         offset="0.183"
+         id="stop3310" />
+      <stop
+         style="stop-color:#76bbff;stop-opacity:1"
+         offset="0.32319999"
+         id="stop3312" />
+      <stop
+         style="stop-color:#9cd3ff;stop-opacity:1"
+         offset="0.4623"
+         id="stop3314" />
+      <stop
+         style="stop-color:#b9e6ff;stop-opacity:1"
+         offset="0.6002"
+         id="stop3316" />
+      <stop
+         style="stop-color:#cdf4ff;stop-opacity:1"
+         offset="0.73650002"
+         id="stop3318" />
+      <stop
+         style="stop-color:#dafcff;stop-opacity:1"
+         offset="0.87059999"
+         id="stop3320" />
+      <stop
+         style="stop-color:#deffff;stop-opacity:1"
+         offset="1"
+         id="stop3322" />
+    </linearGradient>
+    <linearGradient
+       x1="108.0044"
+       y1="152.14059"
+       x2="108.0044"
+       y2="147.99429"
+       id="linearGradient3327"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#006600;stop-opacity:1"
+         offset="0"
+         id="stop3329" />
+      <stop
+         style="stop-color:#99ff66;stop-opacity:1"
+         offset="1"
+         id="stop3331" />
+    </linearGradient>
+    <linearGradient
+       x1="110.0752"
+       y1="150.06351"
+       x2="105.9336"
+       y2="150.06351"
+       id="linearGradient3334"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#009933;stop-opacity:1"
+         offset="0"
+         id="stop3336" />
+      <stop
+         style="stop-color:#6fcf00;stop-opacity:1"
+         offset="1"
+         id="stop3338" />
+    </linearGradient>
+    <linearGradient
+       x1="86.3452"
+       y1="130.9951"
+       x2="86.3452"
+       y2="124.2214"
+       id="linearGradient3359"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-4.882813e-4,9.765625e-4)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop3361" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop3363" />
+    </linearGradient>
+    <linearGradient
+       x1="595.99017"
+       y1="136.166"
+       x2="595.99017"
+       y2="131.64909"
+       id="linearGradient3366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,-1,682.334,255)">
+      <stop
+         style="stop-color:#663333;stop-opacity:1"
+         offset="0"
+         id="stop3368" />
+      <stop
+         style="stop-color:#824f26;stop-opacity:1"
+         offset="1"
+         id="stop3370" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective3022"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4594"
+       id="linearGradient4763"
+       gradientUnits="userSpaceOnUse"
+       x1="18.75"
+       y1="14.171447"
+       x2="18.75"
+       y2="37.452229" />
+    <linearGradient
+       id="linearGradient4594">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop4596" />
+      <stop
+         style="stop-color:white;stop-opacity:0.3984375"
+         offset="1"
+         id="stop4598" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4711">
+      <stop
+         id="stop4713"
+         offset="0"
+         style="stop-color:#8fb3d9;stop-opacity:1" />
+      <stop
+         id="stop4715"
+         offset="1"
+         style="stop-color:#729fcf;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient158"
+       id="linearGradient5057"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.826327,0,0,0.364942,0.259612,-0.592062)"
+       x1="1.6422368"
+       y1="117.8271"
+       x2="15.343062"
+       y2="117.8271" />
+    <linearGradient
+       id="linearGradient158">
+      <stop
+         id="stop159"
+         offset="0.0000000"
+         style="stop-color:#686868;stop-opacity:0.0000000;" />
+      <stop
+         id="stop162"
+         offset="0.23762377"
+         style="stop-color:#686868;stop-opacity:1.0000000;" />
+      <stop
+         id="stop163"
+         offset="0.78109992"
+         style="stop-color:#686868;stop-opacity:1.0000000;" />
+      <stop
+         id="stop160"
+         offset="1.0000000"
+         style="stop-color:#686868;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient272"
+       id="linearGradient5059"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(8.425452,0,0,0.22121,0.259612,-37.98308)"
+       x1="0.61210024"
+       y1="372.57819"
+       x2="5.0856376"
+       y2="372.57819" />
+    <linearGradient
+       id="linearGradient272">
+      <stop
+         id="stop273"
+         offset="0.0000000"
+         style="stop-color:#474747;stop-opacity:0.0000000;" />
+      <stop
+         id="stop275"
+         offset="0.10000000"
+         style="stop-color:#474747;stop-opacity:1.0000000;" />
+      <stop
+         id="stop276-0"
+         offset="0.89999998"
+         style="stop-color:#474747;stop-opacity:1.0000000;" />
+      <stop
+         id="stop274"
+         offset="1.0000000"
+         style="stop-color:#474747;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient272"
+       id="linearGradient5061"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(8.425452,0,0,0.228621,0.259612,-36.68298)"
+       x1="0.61210024"
+       y1="372.57819"
+       x2="5.0856376"
+       y2="372.57819" />
+    <linearGradient
+       id="linearGradient3047">
+      <stop
+         id="stop3049"
+         offset="0.0000000"
+         style="stop-color:#474747;stop-opacity:0.0000000;" />
+      <stop
+         id="stop3051"
+         offset="0.10000000"
+         style="stop-color:#474747;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3053"
+         offset="0.89999998"
+         style="stop-color:#474747;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3055"
+         offset="1.0000000"
+         style="stop-color:#474747;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient178"
+       id="linearGradient5063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.826327,0,0,0.147685,0.259612,24.59382)"
+       x1="1.6422368"
+       y1="117.8271"
+       x2="15.343062"
+       y2="117.8271" />
+    <linearGradient
+       id="linearGradient178">
+      <stop
+         id="stop179"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+      <stop
+         id="stop180-5"
+         offset="0.10827128"
+         style="stop-color:#ffffff;stop-opacity:0.70658684;" />
+      <stop
+         id="stop181"
+         offset="0.92053902"
+         style="stop-color:#ffffff;stop-opacity:0.70658684;" />
+      <stop
+         id="stop182-4"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient204"
+       id="linearGradient5065"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983801,0,0,1.016466,0.416832,0.407937)"
+       x1="23.100046"
+       y1="38.296745"
+       x2="23.100046"
+       y2="43.915466" />
+    <linearGradient
+       id="linearGradient204">
+      <stop
+         id="stop205"
+         offset="0.0000000"
+         style="stop-color:#7a7a7a;stop-opacity:1.0000000;" />
+      <stop
+         id="stop207"
+         offset="0.19801980"
+         style="stop-color:#c5c5c5;stop-opacity:1.0000000;" />
+      <stop
+         id="stop208-6"
+         offset="0.59900987"
+         style="stop-color:#626262;stop-opacity:1.0000000;" />
+      <stop
+         id="stop206"
+         offset="1.0000000"
+         style="stop-color:#888888;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient218"
+       id="linearGradient5067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.138691,0,0,1.732051,-19.36456,-0.911558)"
+       x1="36.373066"
+       y1="22.227985"
+       x2="38.105118"
+       y2="22.227985" />
+    <linearGradient
+       id="linearGradient218">
+      <stop
+         id="stop219"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.44910181;" />
+      <stop
+         id="stop222-3"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient264"
+       id="linearGradient5069"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.730769,0,0,1.233324,2.992929,-1.320616)"
+       x1="28.632685"
+       y1="29.943159"
+       x2="28.783722"
+       y2="31.490198" />
+    <linearGradient
+       id="linearGradient264">
+      <stop
+         id="stop265"
+         offset="0.0000000"
+         style="stop-color:#000000;stop-opacity:0.50299400;" />
+      <stop
+         id="stop266"
+         offset="1.0000000"
+         style="stop-color:#000000;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient10997"
+       id="linearGradient11003"
+       x1="19.489662"
+       y1="6.1438289"
+       x2="19.387241"
+       y2="8.1000004"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient10997">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop10999" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop11001" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4602"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       x1="16.75"
+       y1="9.649169"
+       x2="16.75"
+       y2="14.96457" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4602">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop4604" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop4606" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4717"
+       id="linearGradient2375"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-4)"
+       x1="13.435029"
+       y1="8.2836676"
+       x2="13.435029"
+       y2="15.2117" />
+    <linearGradient
+       id="linearGradient4717">
+      <stop
+         id="stop4719"
+         offset="0"
+         style="stop-color:#90b2d9;stop-opacity:1" />
+      <stop
+         id="stop4721"
+         offset="1"
+         style="stop-color:#3465a4;stop-opacity:1" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective3068"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient7027"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient7941">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop7943" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop7945" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient7029"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient7031"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7927"
+       id="radialGradient7033"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.1420455,0,-29.443359)"
+       cx="14.5"
+       cy="25.78125"
+       fx="14.5"
+       fy="25.78125"
+       r="5.5" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient7927">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop7929" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop7931" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7927"
+       id="radialGradient7035"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.1420455,0,-29.443359)"
+       cx="14.5"
+       cy="25.78125"
+       fx="14.5"
+       fy="25.78125"
+       r="5.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6949"
+       id="linearGradient7037"
+       gradientUnits="userSpaceOnUse"
+       x1="15.910872"
+       y1="5.5152001"
+       x2="17.822588"
+       y2="4.4475551" />
+    <linearGradient
+       id="linearGradient6949">
+      <stop
+         style="stop-color:#888a85;stop-opacity:1"
+         offset="0"
+         id="stop6951" />
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="1"
+         id="stop6953" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7798"
+       id="radialGradient7039"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.0376534,0,0,2.8527147,-17.996801,-9.8700587)"
+       cx="17.34375"
+       cy="5.0044641"
+       fx="17.34375"
+       fy="5.0044641"
+       r="2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient7798">
+      <stop
+         style="stop-color:#f9f9f9;stop-opacity:1;"
+         offset="0"
+         id="stop7800" />
+      <stop
+         style="stop-color:#f9f9f9;stop-opacity:0;"
+         offset="1"
+         id="stop7802" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6949"
+       id="linearGradient7041"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.5,0.8660254,0.8660254,0.5,22.120835,-12.77147)"
+       x1="15.910872"
+       y1="5.5152001"
+       x2="17.822588"
+       y2="4.4475551" />
+    <linearGradient
+       id="linearGradient3110">
+      <stop
+         style="stop-color:#888a85;stop-opacity:1"
+         offset="0"
+         id="stop3112" />
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="1"
+         id="stop3114" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7798"
+       id="radialGradient7043"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.0188267,1.7646596,2.4705234,1.4263573,22.571514,-33.292186)"
+       cx="17.34375"
+       cy="5.0044641"
+       fx="17.34375"
+       fy="5.0044641"
+       r="2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient7045"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-56)"
+       x1="14.937631"
+       y1="68.506096"
+       x2="19.445436"
+       y2="70.892586" />
+    <linearGradient
+       id="linearGradient6985">
+      <stop
+         id="stop6987"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1;"
+         offset="0.34042552"
+         id="stop6991" />
+      <stop
+         id="stop6989"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient7047"
+       gradientUnits="userSpaceOnUse"
+       x1="15.3125"
+       y1="76.232018"
+       x2="15.3125"
+       y2="83.3125" />
+    <linearGradient
+       id="linearGradient7469">
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="0"
+         id="stop7471" />
+      <stop
+         style="stop-color:#888a85;stop-opacity:1"
+         offset="1"
+         id="stop7473" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient7049"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-56)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       id="linearGradient7428">
+      <stop
+         style="stop-color:#888a85;stop-opacity:0"
+         offset="0"
+         id="stop7430" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1"
+         offset="1"
+         id="stop7432" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient7051"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,48.0625,-56)"
+       x1="20.240931"
+       y1="70.804199"
+       x2="15.423766"
+       y2="70.229668" />
+    <linearGradient
+       id="linearGradient3137">
+      <stop
+         id="stop3139"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1;"
+         offset="0.34042552"
+         id="stop3141" />
+      <stop
+         id="stop3143"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient7053"
+       gradientUnits="userSpaceOnUse"
+       x1="15.3125"
+       y1="76.232018"
+       x2="15.3125"
+       y2="83.3125" />
+    <linearGradient
+       id="linearGradient3146">
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="0"
+         id="stop3148" />
+      <stop
+         style="stop-color:#888a85;stop-opacity:1"
+         offset="1"
+         id="stop3150" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient7055"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,48.0625,-56)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       id="linearGradient3153">
+      <stop
+         style="stop-color:#888a85;stop-opacity:0"
+         offset="0"
+         id="stop3155" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1"
+         offset="1"
+         id="stop3157" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient7057"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-3)"
+       x1="21.812019"
+       y1="16.46875"
+       x2="26"
+       y2="16.46875" />
+    <linearGradient
+       id="linearGradient3160">
+      <stop
+         id="stop3162"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1;"
+         offset="0.34042552"
+         id="stop3164" />
+      <stop
+         id="stop3166"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient7059"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-96)"
+       x1="32.432842"
+       y1="116.58936"
+       x2="42.548504"
+       y2="116.58936" />
+    <linearGradient
+       id="linearGradient3169">
+      <stop
+         id="stop3171"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1;"
+         offset="0.34042552"
+         id="stop3173-1" />
+      <stop
+         id="stop3175-0"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient7061"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-30,-96)"
+       x1="32.432842"
+       y1="116.58936"
+       x2="42.548504"
+       y2="116.58936" />
+    <linearGradient
+       id="linearGradient3178">
+      <stop
+         id="stop3180-1"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1;"
+         offset="0.34042552"
+         id="stop3182-4" />
+      <stop
+         id="stop3184-7"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient7063"
+       gradientUnits="userSpaceOnUse"
+       x1="22.15625"
+       y1="69.6875"
+       x2="22.15625"
+       y2="80.97287" />
+    <linearGradient
+       id="linearGradient3187-4">
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="0"
+         id="stop3189-7" />
+      <stop
+         style="stop-color:#888a85;stop-opacity:1"
+         offset="1"
+         id="stop3191-0" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7743"
+       id="radialGradient7065"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.881525,0,0,0.7101255,2.9647845,-1.513614)"
+       cx="22.957685"
+       cy="22.990465"
+       fx="22.957685"
+       fy="22.990465"
+       r="3.9375" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient7743">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop7745" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop7747" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7769"
+       id="linearGradient7067"
+       gradientUnits="userSpaceOnUse"
+       x1="23.909048"
+       y1="76.483147"
+       x2="21.058523"
+       y2="67.290756" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient7769">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop7771" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop7773" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient7069"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.013514,0,-0.304899)"
+       cx="16.875"
+       cy="23.672499"
+       fx="16.875"
+       fy="23.672499"
+       r="4.625" />
+    <linearGradient
+       id="linearGradient2591">
+      <stop
+         id="stop2593"
+         offset="0.0000000"
+         style="stop-color:#7a7a7a;stop-opacity:1.0000000;" />
+      <stop
+         id="stop2595"
+         offset="1.0000000"
+         style="stop-color:#000000;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2631"
+       id="linearGradient7071"
+       gradientUnits="userSpaceOnUse"
+       x1="12.835793"
+       y1="18.849401"
+       x2="18.422049"
+       y2="27.072878" />
+    <linearGradient
+       id="linearGradient2631">
+      <stop
+         style="stop-color:#010101;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2633" />
+      <stop
+         style="stop-color:#959595;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2635" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2818"
+       id="radialGradient7073"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.035714,0,-0.810268)"
+       cx="14.75"
+       cy="22.6875"
+       fx="14.75"
+       fy="22.6875"
+       r="1.75" />
+    <linearGradient
+       id="linearGradient2818"
+       inkscape:collect="always">
+      <stop
+         id="stop2820"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop2822"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient7075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.013514,0,-0.304899)"
+       cx="16.875"
+       cy="23.672499"
+       fx="16.875"
+       fy="23.672499"
+       r="4.625" />
+    <linearGradient
+       id="linearGradient3214-5">
+      <stop
+         id="stop3216-6"
+         offset="0.0000000"
+         style="stop-color:#7a7a7a;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3218-0"
+         offset="1.0000000"
+         style="stop-color:#000000;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2631"
+       id="linearGradient7077"
+       gradientUnits="userSpaceOnUse"
+       x1="12.835793"
+       y1="18.849401"
+       x2="18.422049"
+       y2="27.072878" />
+    <linearGradient
+       id="linearGradient3221-9">
+      <stop
+         style="stop-color:#010101;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop3223-2" />
+      <stop
+         style="stop-color:#959595;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop3225-8" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2818"
+       id="radialGradient7079"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.035714,0,-0.810268)"
+       cx="14.75"
+       cy="22.6875"
+       fx="14.75"
+       fy="22.6875"
+       r="1.75" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient4847"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient4849"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient4851"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7927"
+       id="radialGradient4853"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.1420455,0,-29.443359)"
+       cx="14.5"
+       cy="25.78125"
+       fx="14.5"
+       fy="25.78125"
+       r="5.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7927"
+       id="radialGradient4855"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.1420455,0,-29.443359)"
+       cx="14.5"
+       cy="25.78125"
+       fx="14.5"
+       fy="25.78125"
+       r="5.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6949"
+       id="linearGradient4857"
+       gradientUnits="userSpaceOnUse"
+       x1="15.910872"
+       y1="5.5152001"
+       x2="17.822588"
+       y2="4.4475551" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7798"
+       id="radialGradient4859"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.0376534,0,0,2.8527147,-17.996801,-9.8700587)"
+       cx="17.34375"
+       cy="5.0044641"
+       fx="17.34375"
+       fy="5.0044641"
+       r="2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6949"
+       id="linearGradient4861"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.5,0.8660254,0.8660254,0.5,22.120835,-12.77147)"
+       x1="15.910872"
+       y1="5.5152001"
+       x2="17.822588"
+       y2="4.4475551" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7798"
+       id="radialGradient4863"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.0188267,1.7646596,2.4705234,1.4263573,22.571514,-33.292186)"
+       cx="17.34375"
+       cy="5.0044641"
+       fx="17.34375"
+       fy="5.0044641"
+       r="2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient4865"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-56)"
+       x1="14.937631"
+       y1="68.506096"
+       x2="19.445436"
+       y2="70.892586" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient4867"
+       gradientUnits="userSpaceOnUse"
+       x1="15.3125"
+       y1="76.232018"
+       x2="15.3125"
+       y2="83.3125" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient4869"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-56)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient4871"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,48.0625,-56)"
+       x1="20.240931"
+       y1="70.804199"
+       x2="15.423766"
+       y2="70.229668" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient4873"
+       gradientUnits="userSpaceOnUse"
+       x1="15.3125"
+       y1="76.232018"
+       x2="15.3125"
+       y2="83.3125" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient4875"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,1,48.0625,-56)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient4877"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-3)"
+       x1="21.812019"
+       y1="16.46875"
+       x2="26"
+       y2="16.46875" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient4879"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-96)"
+       x1="32.432842"
+       y1="116.58936"
+       x2="42.548504"
+       y2="116.58936" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient4881"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-30,-96)"
+       x1="32.432842"
+       y1="116.58936"
+       x2="42.548504"
+       y2="116.58936" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient4883"
+       gradientUnits="userSpaceOnUse"
+       x1="22.15625"
+       y1="69.6875"
+       x2="22.15625"
+       y2="80.97287" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7743"
+       id="radialGradient4885"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.881525,0,0,0.7101255,2.9647845,-1.513614)"
+       cx="22.957685"
+       cy="22.990465"
+       fx="22.957685"
+       fy="22.990465"
+       r="3.9375" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7769"
+       id="linearGradient4887"
+       gradientUnits="userSpaceOnUse"
+       x1="23.909048"
+       y1="76.483147"
+       x2="21.058523"
+       y2="67.290756" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient4889"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.013514,0,-0.304899)"
+       cx="16.875"
+       cy="23.672499"
+       fx="16.875"
+       fy="23.672499"
+       r="4.625" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2631"
+       id="linearGradient4891"
+       gradientUnits="userSpaceOnUse"
+       x1="12.835793"
+       y1="18.849401"
+       x2="18.422049"
+       y2="27.072878" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2818"
+       id="radialGradient4893"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.035714,0,-0.810268)"
+       cx="14.75"
+       cy="22.6875"
+       fx="14.75"
+       fy="22.6875"
+       r="1.75" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient4895"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.013514,0,-0.304899)"
+       cx="16.875"
+       cy="23.672499"
+       fx="16.875"
+       fy="23.672499"
+       r="4.625" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2631"
+       id="linearGradient4897"
+       gradientUnits="userSpaceOnUse"
+       x1="12.835793"
+       y1="18.849401"
+       x2="18.422049"
+       y2="27.072878" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2818"
+       id="radialGradient4899"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.035714,0,-0.810268)"
+       cx="14.75"
+       cy="22.6875"
+       fx="14.75"
+       fy="22.6875"
+       r="1.75" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7743"
+       id="radialGradient4918"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.564176,0,0,0.45448032,33.639878,31.886769)"
+       cx="22.957685"
+       cy="22.990465"
+       fx="22.957685"
+       fy="22.990465"
+       r="3.9375" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient4930"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.64,0,0,0.64,31.742416,30.935482)"
+       x1="21.812019"
+       y1="16.46875"
+       x2="26"
+       y2="16.46875" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient4934"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.64,0,0,0.64,62.502416,-2.984518)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient4942"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.64,0,0,0.64,31.742416,-2.984518)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7769"
+       id="linearGradient5005"
+       gradientUnits="userSpaceOnUse"
+       x1="23.909048"
+       y1="76.483147"
+       x2="21.058523"
+       y2="67.290756" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient5007"
+       gradientUnits="userSpaceOnUse"
+       x1="22.15625"
+       y1="69.6875"
+       x2="22.15625"
+       y2="80.97287" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient5009"
+       gradientUnits="userSpaceOnUse"
+       x1="15.3125"
+       y1="76.232018"
+       x2="15.3125"
+       y2="83.3125" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7469"
+       id="linearGradient5011"
+       gradientUnits="userSpaceOnUse"
+       x1="15.3125"
+       y1="76.232018"
+       x2="15.3125"
+       y2="83.3125" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient5052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient5054"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient5056"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7927"
+       id="radialGradient5058"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.1420455,0,-29.443359)"
+       cx="14.5"
+       cy="25.78125"
+       fx="14.5"
+       fy="25.78125"
+       r="5.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7927"
+       id="radialGradient5060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.1420455,0,-29.443359)"
+       cx="14.5"
+       cy="25.78125"
+       fx="14.5"
+       fy="25.78125"
+       r="5.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6949"
+       id="linearGradient5062"
+       gradientUnits="userSpaceOnUse"
+       x1="15.910872"
+       y1="5.5152001"
+       x2="17.822588"
+       y2="4.4475551" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7798"
+       id="radialGradient5064"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.0376534,0,0,2.8527147,-17.996801,-9.8700587)"
+       cx="17.34375"
+       cy="5.0044641"
+       fx="17.34375"
+       fy="5.0044641"
+       r="2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6949"
+       id="linearGradient5066"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.5,0.8660254,0.8660254,0.5,22.120835,-12.77147)"
+       x1="15.910872"
+       y1="5.5152001"
+       x2="17.822588"
+       y2="4.4475551" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7798"
+       id="radialGradient5068"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.0188267,1.7646596,2.4705234,1.4263573,22.571514,-33.292186)"
+       cx="17.34375"
+       cy="5.0044641"
+       fx="17.34375"
+       fy="5.0044641"
+       r="2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient5070"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.64,0,0,0.64,31.742416,-2.984518)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient5072"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.64,0,0,0.64,62.502416,-2.984518)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6985"
+       id="linearGradient5074"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.64,0,0,0.64,31.742416,30.935482)"
+       x1="21.812019"
+       y1="16.46875"
+       x2="26"
+       y2="16.46875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7743"
+       id="radialGradient5076"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.564176,0,0,0.45448032,33.639878,31.886769)"
+       cx="22.957685"
+       cy="22.990465"
+       fx="22.957685"
+       fy="22.990465"
+       r="3.9375" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient5078"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.013514,0,-0.304899)"
+       cx="16.875"
+       cy="23.672499"
+       fx="16.875"
+       fy="23.672499"
+       r="4.625" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2631"
+       id="linearGradient5080"
+       gradientUnits="userSpaceOnUse"
+       x1="12.835793"
+       y1="18.849401"
+       x2="18.422049"
+       y2="27.072878" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2818"
+       id="radialGradient5082"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.035714,0,-0.810268)"
+       cx="14.75"
+       cy="22.6875"
+       fx="14.75"
+       fy="22.6875"
+       r="1.75" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient5084"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.013514,0,-0.304899)"
+       cx="16.875"
+       cy="23.672499"
+       fx="16.875"
+       fy="23.672499"
+       r="4.625" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2631"
+       id="linearGradient5086"
+       gradientUnits="userSpaceOnUse"
+       x1="12.835793"
+       y1="18.849401"
+       x2="18.422049"
+       y2="27.072878" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2818"
+       id="radialGradient5088"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.035714,0,-0.810268)"
+       cx="14.75"
+       cy="22.6875"
+       fx="14.75"
+       fy="22.6875"
+       r="1.75" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7743"
+       id="radialGradient5106"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1698754,0,0,0.94241039,19.186497,16.356262)"
+       cx="22.957685"
+       cy="22.990465"
+       fx="22.957685"
+       fy="22.990465"
+       r="3.9375" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient5116"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.327104,0,0,1.327104,79.035856,-55.952839)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7428"
+       id="linearGradient5120"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.327104,0,0,1.327104,15.25192,-55.952839)"
+       x1="14.507583"
+       y1="75.603554"
+       x2="14.287912"
+       y2="73.9664" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2631"
+       id="linearGradient5135"
+       gradientUnits="userSpaceOnUse"
+       x1="12.835793"
+       y1="18.849401"
+       x2="18.422049"
+       y2="27.072878" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2631"
+       id="linearGradient5137"
+       gradientUnits="userSpaceOnUse"
+       x1="12.835793"
+       y1="18.849401"
+       x2="18.422049"
+       y2="27.072878" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6949"
+       id="linearGradient5139"
+       gradientUnits="userSpaceOnUse"
+       x1="15.910872"
+       y1="5.5152001"
+       x2="17.822588"
+       y2="4.4475551" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7798"
+       id="radialGradient5141"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.0376534,0,0,2.8527147,-17.996801,-9.8700587)"
+       cx="17.34375"
+       cy="5.0044641"
+       fx="17.34375"
+       fy="5.0044641"
+       r="2.5" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6949"
+       id="linearGradient5143"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.5,0.8660254,0.8660254,0.5,22.120835,-12.77147)"
+       x1="15.910872"
+       y1="5.5152001"
+       x2="17.822588"
+       y2="4.4475551" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7798"
+       id="radialGradient5145"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.0188267,1.7646596,2.4705234,1.4263573,22.571514,-33.292186)"
+       cx="17.34375"
+       cy="5.0044641"
+       fx="17.34375"
+       fy="5.0044641"
+       r="2.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7927"
+       id="radialGradient5147"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.1420455,0,-29.443359)"
+       cx="14.5"
+       cy="25.78125"
+       fx="14.5"
+       fy="25.78125"
+       r="5.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7927"
+       id="radialGradient5149"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.1420455,0,-29.443359)"
+       cx="14.5"
+       cy="25.78125"
+       fx="14.5"
+       fy="25.78125"
+       r="5.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient5151"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient5153"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7941"
+       id="radialGradient5155"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5562701,0,12.188706)"
+       cx="23.78125"
+       cy="27.46875"
+       fx="23.78125"
+       fy="27.46875"
+       r="9.71875" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.2502466"
+     inkscape:cx="52.67052"
+     inkscape:cy="47.09624"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1670"
+     inkscape:window-height="943"
+     inkscape:window-x="0"
+     inkscape:window-y="42"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <rect
+       id="rect13"
+       style="fill:none"
+       y="10.950665"
+       x="10.499219"
+       height="74.879997"
+       width="74.879997" />
+    <polyline
+       style="fill:none"
+       points="0,256 0,0 256,0 256,256 "
+       i:knockout="Off"
+       id="_x3C_Slice_x3E_"
+       transform="matrix(0.2925,0,0,0.2925,10.499219,10.950665)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.2;fill:url(#radialGradient5155);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="path6941"
+       sodipodi:cx="23.78125"
+       sodipodi:cy="27.46875"
+       sodipodi:rx="9.71875"
+       sodipodi:ry="5.40625"
+       d="m 33.5,27.46875 a 9.71875,5.40625 0 1 1 -19.4375,0 9.71875,5.40625 0 1 1 19.4375,0 z"
+       transform="matrix(1.4498419,0,0,1.4498419,12.706306,8.3994795)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.2;fill:url(#radialGradient5153);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="path6943"
+       sodipodi:cx="23.78125"
+       sodipodi:cy="27.46875"
+       sodipodi:rx="9.71875"
+       sodipodi:ry="5.40625"
+       d="m 33.5,27.46875 a 9.71875,5.40625 0 1 1 -19.4375,0 9.71875,5.40625 0 1 1 19.4375,0 z"
+       transform="matrix(1.2289581,0,0,0.98190356,-2.0303086,35.187756)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.2;fill:url(#radialGradient5151);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="path6945"
+       sodipodi:cx="23.78125"
+       sodipodi:cy="27.46875"
+       sodipodi:rx="9.71875"
+       sodipodi:ry="5.40625"
+       d="m 33.5,27.46875 a 9.71875,5.40625 0 1 1 -19.4375,0 9.71875,5.40625 0 1 1 19.4375,0 z"
+       transform="matrix(1.2289581,0,0,0.98190356,37.782811,35.187756)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.4;fill:url(#radialGradient5149);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="path6947"
+       sodipodi:cx="14.5"
+       sodipodi:cy="25.78125"
+       sodipodi:rx="5.5"
+       sodipodi:ry="11.78125"
+       d="m 20,25.78125 a 5.5,11.78125 0 1 1 -11,0 5.5,11.78125 0 1 1 11,0 z"
+       transform="matrix(2.8084913,0,-0.32778115,1.3517451,-2.4224533,18.020011)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.4;fill:url(#radialGradient5147);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="path6949"
+       sodipodi:cx="14.5"
+       sodipodi:cy="25.78125"
+       sodipodi:rx="5.5"
+       sodipodi:ry="11.78125"
+       d="m 20,25.78125 a 5.5,11.78125 0 1 1 -11,0 5.5,11.78125 0 1 1 11,0 z"
+       transform="matrix(-2.8084921,0,0.32778129,1.3517451,96.627291,18.020011)" />
+    <g
+       id="g6951"
+       transform="matrix(1.327104,0,0,1.327104,15.25192,14.383673)">
+      <g
+         transform="matrix(0.8660254,0.5,-0.5,0.8660254,4.2283803,2.4870101)"
+         id="g6953">
+        <path
+           style="fill:url(#linearGradient5139);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+           d="m 18.5,2.5 c -1.656,0 -3,1.344 -3,3 l 0,2 c 0,1.656 1.344,3 3,3 1.656,0 3,-1.344 3,-3 l 0,-2 c 0,-1.656 -1.344,-3 -3,-3 z"
+           id="path6955"
+           sodipodi:nodetypes="cccsccc" />
+        <path
+           sodipodi:type="inkscape:offset"
+           inkscape:radius="-1.0054175"
+           inkscape:original="M 18.5 2.5 C 16.844 2.5 15.5 3.844 15.5 5.5 L 15.5 7.5 C 15.5 9.156 16.844 10.5 18.5 10.5 C 20.156 10.5 21.5 9.156 21.5 7.5 L 21.5 5.5 C 21.5 3.844 20.156 2.5 18.5 2.5 z "
+           style="opacity:0.25;fill:none;stroke:url(#radialGradient5141);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+           id="path6957"
+           d="m 18.5,3.5 c -1.112006,0 -2,0.887994 -2,2 l 0,2 c 0,1.112006 0.887994,2 2,2 1.112006,0 2,-0.887994 2,-2 l 0,-2 c 0,-1.112006 -0.887994,-2 -2,-2 z" />
+      </g>
+      <g
+         transform="matrix(-0.8660254,0.5,0.5,0.8660254,43.77132,2.4870101)"
+         id="g6959">
+        <path
+           style="fill:url(#linearGradient5143);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+           d="m 18.5,2.5 c -1.656,0 -3,1.344 -3,3 l 0,2 c 0,1.656 1.344,3 3,3 1.656,0 3,-1.344 3,-3 l 0,-2 c 0,-1.656 -1.344,-3 -3,-3 z"
+           id="path6961"
+           sodipodi:nodetypes="cccsccc" />
+        <path
+           sodipodi:type="inkscape:offset"
+           inkscape:radius="-1.0054175"
+           inkscape:original="M 18.5 2.5 C 16.844 2.5 15.5 3.844 15.5 5.5 L 15.5 7.5 C 15.5 9.156 16.844 10.5 18.5 10.5 C 20.156 10.5 21.5 9.156 21.5 7.5 L 21.5 5.5 C 21.5 3.844 20.156 2.5 18.5 2.5 z "
+           style="opacity:0.25;fill:none;stroke:url(#radialGradient5145);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+           id="path6963"
+           d="m 18.5,3.5 c -1.112006,0 -2,0.887994 -2,2 l 0,2 c 0,1.112006 0.887994,2 2,2 1.112006,0 2,-0.887994 2,-2 l 0,-2 c 0,-1.112006 -0.887994,-2 -2,-2 z" />
+      </g>
+    </g>
+    <path
+       style="fill:#00aa00;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.32710385;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0.69999992"
+       d="m 40.54984,34.953785 c 1.834593,-2e-6 3.31776,1.528982 3.31776,3.442176 l 0,5.059584 c 0,0.201513 -0.01016,0.389223 -0.04147,0.580608 -0.504575,2.390088 -0.995857,4.782999 -1.492992,7.174656 -0.585255,1.366343 -1.952357,2.322432 -3.52512,2.322432 l -13.68576,0 c -2.113745,0 -3.815424,-1.730545 -3.815424,-3.856896 l 0,-2.944512 c 0,-0.693272 0.18059,-1.35079 0.497664,-1.907712 l 3.981312,-5.681664 c 0.146292,-0.276408 0.328168,-0.523534 0.539136,-0.746496 0.601895,-0.636116 1.43 [...]
+       id="path6965"
+       sodipodi:nodetypes="cccccccccccscccc" />
+    <path
+       style="fill:#00aa00;stroke:url(#linearGradient5120);stroke-width:1.32710385;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0.69999992"
+       d="m 25.039312,42.912785 4.810752,0.0035 c 1.990656,0.0015 3.981314,-2.651722 5.971968,-2.654208 l 2.90304,-0.0035 c 2.113745,0 3.815424,1.711827 3.815424,3.83818 l 0,5.598307 c 0,2.126309 -1.701679,3.838136 -3.815424,3.838136 l -13.68576,0 c -2.113745,0 -3.815424,-1.711827 -3.815424,-3.838178 l 0,-2.944099 c 0,-2.126352 1.701679,-3.83818 3.815424,-3.83818 z"
+       id="path6969"
+       sodipodi:nodetypes="csscccccccc" />
+    <path
+       style="fill:#00aa00;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.32710385;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0.69999992"
+       d="m 53.737936,34.953785 c -1.834593,-2e-6 -3.31776,1.528982 -3.31776,3.442176 l 0,5.059584 c 0,0.201513 0.01016,0.389223 0.04147,0.580608 0.504575,2.390088 0.995857,4.782999 1.492992,7.174656 0.585255,1.366343 1.952356,2.322432 3.52512,2.322432 l 13.68576,0 c 2.113745,0 3.815424,-1.730545 3.815424,-3.856896 l 0,-2.944512 c 0,-0.693272 -0.18059,-1.35079 -0.497664,-1.907712 l -3.981312,-5.681664 c -0.146293,-0.276408 -0.328168,-0.523534 -0.539136,-0.746496 -0.601896,-0.636116 -1.43 [...]
+       id="path6973"
+       sodipodi:nodetypes="cccccccccccscccc" />
+    <path
+       style="fill:none;stroke:url(#linearGradient5116);stroke-width:1.32710385;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0.69999992"
+       d="m 69.248464,42.912785 -4.810752,0.0035 c -1.990656,0.0015 -3.981314,-2.651722 -5.971968,-2.654208 l -2.90304,-0.0035 c -2.113745,0 -3.815424,1.711827 -3.815424,3.83818 l 0,5.598307 c 0,2.126309 1.701679,3.838136 3.815424,3.838136 l 13.68576,0 c 2.113745,0 3.815424,-1.711827 3.815424,-3.838178 l 0,-2.944099 c 0,-2.126352 -1.701679,-3.83818 -3.815424,-3.83818 z"
+       id="path6977"
+       sodipodi:nodetypes="csscccccccc" />
+    <path
+       style="fill:#00aa00;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.32710385;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+       d="m 47.18536,33.626681 c -1.836071,7e-6 -3.393333,1.065298 -4.1472,2.612736 -0.373856,1.310721 -0.661711,2.642291 -0.912384,3.981312 1.068117,0.943121 1.741824,2.325431 1.741824,3.856896 l 0,1.617408 c 0.910561,0.73358 2.058467,1.202688 3.31776,1.202688 1.232355,3e-6 2.333561,-0.455739 3.234816,-1.161216 l 0,-1.65888 c 0,-1.552021 0.690276,-2.954465 1.783296,-3.898368 -0.264386,-1.334676 -0.557956,-2.657511 -0.870912,-3.981312 -0.760333,-1.529412 -2.324338,-2.571264 -4.1472,-2.571264 z"
+       id="path6981" />
+    <path
+       style="fill:#00aa00;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.32710397;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+       d="m 66.345424,41.630777 c -5.121653,0 -9.289728,4.126603 -9.289728,9.248256 l 0.04147,3.31776 c 0,5.487934 4.423874,9.911808 9.911808,9.911808 5.487934,0 9.95328,-4.423874 9.95328,-9.911808 0,-5.971968 -3.981182,-12.566016 -10.616832,-12.566016 z"
+       id="path6983"
+       sodipodi:nodetypes="cccscc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.8;fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:#babdb6;stroke-width:1.14686775;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+       id="path6985"
+       sodipodi:cx="14.535534"
+       sodipodi:cy="24.882097"
+       sodipodi:rx="7.4644661"
+       sodipodi:ry="7.4644661"
+       d="m 22,24.882097 a 7.4644661,7.4644661 0 1 1 -14.9289322,0 7.4644661,7.4644661 0 1 1 14.9289322,0 z"
+       transform="matrix(1.1571553,0,0,1.1571553,50.200476,25.39297)" />
+    <path
+       style="fill:#00d400;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.32710397;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+       d="m 27.859408,41.630777 c 5.121653,0 9.289728,4.126603 9.289728,9.248256 l -0.04147,3.31776 c 0,5.487934 -4.423874,9.911808 -9.911808,9.911808 -5.487934,0 -9.95328,-4.423874 -9.95328,-9.911808 0,-5.971968 3.981181,-12.566016 10.616832,-12.566016 z"
+       id="path6987"
+       sodipodi:nodetypes="cccscc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.8;fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:#babdb6;stroke-width:1.14686775;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+       id="path6989"
+       sodipodi:cx="14.535534"
+       sodipodi:cy="24.882097"
+       sodipodi:rx="7.4644661"
+       sodipodi:ry="7.4644661"
+       d="m 22,24.882097 a 7.4644661,7.4644661 0 1 1 -14.9289322,0 7.4644661,7.4644661 0 1 1 14.9289322,0 z"
+       transform="matrix(1.1571553,0,0,1.1571553,10.387356,25.39297)" />
+    <path
+       style="opacity:0.90909095;fill:none;stroke:url(#radialGradient5106);stroke-width:1.32710397;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0.69999992"
+       d="m 42.431344,42.916409 c 0,-2.930245 2.092639,-5.308416 4.671072,-5.308416 2.578432,0 4.671072,2.378171 4.671072,5.308416"
+       id="path6993"
+       sodipodi:nodetypes="csc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.57954544;fill:none;stroke:#2e3436;stroke-width:7.00000191;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992"
+       id="path6995"
+       sodipodi:cx="23.5"
+       sodipodi:cy="26.5"
+       sodipodi:rx="3.5"
+       sodipodi:ry="3.5"
+       d="m 27,26.5 a 3.5,3.5 0 1 1 -7,0 3.5,3.5 0 1 1 7,0 z"
+       transform="matrix(0.1895861,0,0,0.1895861,42.647141,37.228827)" />
+    <g
+       id="g6999"
+       transform="matrix(1.0560544,0,0,1.0423186,119.52473,-20.426034)"
+       style="fill:#00d400">
+      <path
+         transform="matrix(1.676984,0,0,1.676984,-113.8461,33.756151)"
+         d="m 19.875,22.5625 c 0,2.312692 -1.846825,4.1875 -4.125,4.1875 -2.278175,0 -4.125,-1.874808 -4.125,-4.1875 0,-2.312692 1.846825,-4.1875 4.125,-4.1875 2.278175,0 4.125,1.874808 4.125,4.1875 z"
+         sodipodi:ry="4.1875"
+         sodipodi:rx="4.125"
+         sodipodi:cy="22.5625"
+         sodipodi:cx="15.75"
+         id="path7001"
+         style="color:#000000;fill:#00d400;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5137);stroke-width:0.75428027;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(1.676984,0,0,1.676984,-111.83457,33.611503)"
+         d="M 16.5,22.6875 C 16.5,23.688516 15.716498,24.5 14.75,24.5 13.783502,24.5 13,23.688516 13,22.6875 c 0,-1.001016 0.783502,-1.8125 1.75,-1.8125 0.966498,0 1.75,0.811484 1.75,1.8125 z"
+         sodipodi:ry="1.8125"
+         sodipodi:rx="1.75"
+         sodipodi:cy="22.6875"
+         sodipodi:cx="14.75"
+         id="path7003"
+         style="opacity:0.60759499;color:#000000;fill:#00d400;fill-opacity:0.52866247;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="opacity:0.37341769;color:#000000;fill:#00d400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         id="path7005"
+         sodipodi:cx="14.75"
+         sodipodi:cy="22.6875"
+         sodipodi:rx="1.75"
+         sodipodi:ry="1.8125"
+         d="M 16.5,22.6875 C 16.5,23.688516 15.716498,24.5 14.75,24.5 13.783502,24.5 13,23.688516 13,22.6875 c 0,-1.001016 0.783502,-1.8125 1.75,-1.8125 0.966498,0 1.75,0.811484 1.75,1.8125 z"
+         transform="matrix(1.673245,0,0,1.673245,-114.00058,31.80613)" />
+      <path
+         transform="matrix(0.41273,0,0,0.41273,-89.88316,65.788647)"
+         d="M 16.5,22.6875 C 16.5,23.688516 15.716498,24.5 14.75,24.5 13.783502,24.5 13,23.688516 13,22.6875 c 0,-1.001016 0.783502,-1.8125 1.75,-1.8125 0.966498,0 1.75,0.811484 1.75,1.8125 z"
+         sodipodi:ry="1.8125"
+         sodipodi:rx="1.75"
+         sodipodi:cy="22.6875"
+         sodipodi:cx="14.75"
+         id="path7007"
+         style="color:#000000;fill:#00d400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:#00d400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         id="path7009"
+         sodipodi:cx="14.75"
+         sodipodi:cy="22.6875"
+         sodipodi:rx="1.75"
+         sodipodi:ry="1.8125"
+         d="M 16.5,22.6875 C 16.5,23.688516 15.716498,24.5 14.75,24.5 13.783502,24.5 13,23.688516 13,22.6875 c 0,-1.001016 0.783502,-1.8125 1.75,-1.8125 0.966498,0 1.75,0.811484 1.75,1.8125 z"
+         transform="matrix(0.45611,0,0,0.45611,-97.03183,58.199937)" />
+    </g>
+    <path
+       style="opacity:0.7;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+       d="m 27.527632,51.086393 c -1.710772,0 -3.068928,1.444518 -3.068928,3.193344 0,0.404564 0.07195,0.76394 0.20736,1.119744 0.176131,0.03191 0.35409,0.04147 0.539136,0.04147 1.706958,0 3.068928,-1.406945 3.068928,-3.151872 0,-0.391885 -0.0382,-0.77334 -0.165888,-1.119744 -0.189341,-0.03699 -0.380769,-0.08294 -0.580608,-0.08294 z"
+       id="path7011" />
+    <g
+       style="fill:#00d400;display:inline"
+       id="g7013"
+       transform="matrix(1.0560544,0,0,1.0423186,159.33785,-20.426034)">
+      <path
+         transform="matrix(1.676984,0,0,1.676984,-113.8461,33.756151)"
+         d="m 19.875,22.5625 c 0,2.312692 -1.846825,4.1875 -4.125,4.1875 -2.278175,0 -4.125,-1.874808 -4.125,-4.1875 0,-2.312692 1.846825,-4.1875 4.125,-4.1875 2.278175,0 4.125,1.874808 4.125,4.1875 z"
+         sodipodi:ry="4.1875"
+         sodipodi:rx="4.125"
+         sodipodi:cy="22.5625"
+         sodipodi:cx="15.75"
+         id="path7015"
+         style="color:#000000;fill:#00d400;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5135);stroke-width:0.75428027;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(1.676984,0,0,1.676984,-111.83457,33.611503)"
+         d="M 16.5,22.6875 C 16.5,23.688516 15.716498,24.5 14.75,24.5 13.783502,24.5 13,23.688516 13,22.6875 c 0,-1.001016 0.783502,-1.8125 1.75,-1.8125 0.966498,0 1.75,0.811484 1.75,1.8125 z"
+         sodipodi:ry="1.8125"
+         sodipodi:rx="1.75"
+         sodipodi:cy="22.6875"
+         sodipodi:cx="14.75"
+         id="path7017"
+         style="opacity:0.60759499;color:#000000;fill:#00d400;fill-opacity:0.52866247;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="opacity:0.37341769;color:#000000;fill:#00d400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         id="path7019"
+         sodipodi:cx="14.75"
+         sodipodi:cy="22.6875"
+         sodipodi:rx="1.75"
+         sodipodi:ry="1.8125"
+         d="M 16.5,22.6875 C 16.5,23.688516 15.716498,24.5 14.75,24.5 13.783502,24.5 13,23.688516 13,22.6875 c 0,-1.001016 0.783502,-1.8125 1.75,-1.8125 0.966498,0 1.75,0.811484 1.75,1.8125 z"
+         transform="matrix(1.673245,0,0,1.673245,-114.00058,31.80613)" />
+      <path
+         transform="matrix(0.41273,0,0,0.41273,-89.88316,65.788647)"
+         d="M 16.5,22.6875 C 16.5,23.688516 15.716498,24.5 14.75,24.5 13.783502,24.5 13,23.688516 13,22.6875 c 0,-1.001016 0.783502,-1.8125 1.75,-1.8125 0.966498,0 1.75,0.811484 1.75,1.8125 z"
+         sodipodi:ry="1.8125"
+         sodipodi:rx="1.75"
+         sodipodi:cy="22.6875"
+         sodipodi:cx="14.75"
+         id="path7021"
+         style="color:#000000;fill:#00d400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:#00d400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+         id="path7023"
+         sodipodi:cx="14.75"
+         sodipodi:cy="22.6875"
+         sodipodi:rx="1.75"
+         sodipodi:ry="1.8125"
+         d="M 16.5,22.6875 C 16.5,23.688516 15.716498,24.5 14.75,24.5 13.783502,24.5 13,23.688516 13,22.6875 c 0,-1.001016 0.783502,-1.8125 1.75,-1.8125 0.966498,0 1.75,0.811484 1.75,1.8125 z"
+         transform="matrix(0.45611,0,0,0.45611,-97.03183,58.199937)" />
+    </g>
+    <path
+       style="opacity:0.7;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+       d="m 67.340752,51.086393 c -1.710772,0 -3.068928,1.444518 -3.068928,3.193344 0,0.404564 0.07195,0.76394 0.20736,1.119744 0.176131,0.03191 0.35409,0.04147 0.539136,0.04147 1.706958,0 3.068928,-1.406945 3.068928,-3.151872 0,-0.391885 -0.0382,-0.77334 -0.165888,-1.119744 -0.189341,-0.03699 -0.380769,-0.08294 -0.580608,-0.08294 z"
+       id="path7025" />
+  </g>
+</svg>
diff --git a/interface/images/menu/offerings.svg b/interface/images/menu/offerings.svg
new file mode 100755
index 0000000..0651255
--- /dev/null
+++ b/interface/images/menu/offerings.svg
@@ -0,0 +1,9737 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg:svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="offerings.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="38.798838"
+     inkscape:cy="46.654964"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <svg:defs
+     id="defs2410">
+    <svg:linearGradient
+       id="linearGradient3637">
+      <svg:stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <svg:stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <svg:stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       id="linearGradient3737"
+       inkscape:collect="always">
+      <svg:stop
+         id="stop3739"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <svg:stop
+         id="stop3741"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       id="linearGradient3700">
+      <svg:stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2276c5;stop-opacity:1;" />
+      <svg:stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#68baf4;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:filter
+       id="filter3174"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <svg:rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </svg:clipPath>
+    <svg:linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843"
+       xlink:href="#linearGradient3700"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <svg:path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <svg:rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       id="filter3657"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <svg:stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <svg:linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       id="linearGradient3737-3"
+       inkscape:collect="always">
+      <svg:stop
+         id="stop3739-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <svg:stop
+         id="stop3741-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <svg:linearGradient
+       id="linearGradient3183-0">
+      <svg:stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#c80000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f3604d;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       id="XMLID_80_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop140" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop142" />
+      <midPointStop
+         id="midPointStop144"
+         style="stop-color:#003399"
+         offset="0" />
+      <midPointStop
+         id="midPointStop146"
+         style="stop-color:#003399"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop148"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       id="XMLID_81_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop155" />
+      <svg:stop
+         style="stop-color:#a3daaf;stop-opacity:1"
+         offset="1"
+         id="stop157" />
+      <midPointStop
+         id="midPointStop159"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop161"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop163"
+         style="stop-color:#A3DAAF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_82_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop170" />
+      <svg:stop
+         style="stop-color:#a3daaf;stop-opacity:1"
+         offset="1"
+         id="stop172" />
+      <midPointStop
+         id="midPointStop174"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop176"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop178"
+         style="stop-color:#A3DAAF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_83_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop185" />
+      <svg:stop
+         style="stop-color:#99ccff;stop-opacity:1"
+         offset="0.0562"
+         id="stop187" />
+      <svg:stop
+         style="stop-color:#3399ff;stop-opacity:1"
+         offset="0.69660002"
+         id="stop189" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop191" />
+      <midPointStop
+         id="midPointStop193"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop195"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop197"
+         style="stop-color:#99CCFF"
+         offset="0.0562" />
+      <midPointStop
+         id="midPointStop199"
+         style="stop-color:#99CCFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop201"
+         style="stop-color:#3399FF"
+         offset="0.6966" />
+      <midPointStop
+         id="midPointStop203"
+         style="stop-color:#3399FF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop205"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       id="XMLID_84_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop212" />
+      <svg:stop
+         style="stop-color:#3399ff;stop-opacity:1"
+         offset="1"
+         id="stop214" />
+      <midPointStop
+         id="midPointStop216"
+         style="stop-color:#003399"
+         offset="0" />
+      <midPointStop
+         id="midPointStop218"
+         style="stop-color:#003399"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop220"
+         style="stop-color:#3399FF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       cx="160.10159"
+       cy="225.54491"
+       r="102.7621"
+       fx="160.10159"
+       fy="225.54491"
+       id="XMLID_85_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+      <svg:stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop227" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop229" />
+      <midPointStop
+         id="midPointStop231"
+         style="stop-color:#428AFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop233"
+         style="stop-color:#428AFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop235"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       id="XMLID_86_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#e6f6f9;stop-opacity:1"
+         offset="0"
+         id="stop242" />
+      <svg:stop
+         style="stop-color:#71a6cd;stop-opacity:1"
+         offset="1"
+         id="stop244" />
+      <midPointStop
+         id="midPointStop246"
+         style="stop-color:#E6F6F9"
+         offset="0" />
+      <midPointStop
+         id="midPointStop248"
+         style="stop-color:#E6F6F9"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop250"
+         style="stop-color:#71A6CD"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408"
+       id="XMLID_87_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop259" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop261" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop263" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop265" />
+      <midPointStop
+         id="midPointStop267"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop269"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop271"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919"
+       id="XMLID_88_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop278" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop280" />
+      <midPointStop
+         id="midPointStop282"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop284"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop286"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082"
+       id="XMLID_89_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop293" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop295" />
+      <midPointStop
+         id="midPointStop297"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop299"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop301"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895"
+       id="XMLID_90_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop308" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop310" />
+      <midPointStop
+         id="midPointStop312"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop314"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop316"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891"
+       id="XMLID_91_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop323" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop325" />
+      <midPointStop
+         id="midPointStop327"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop329"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop331"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201"
+       id="XMLID_92_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop338" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop340" />
+      <midPointStop
+         id="midPointStop342"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop344"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop346"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909"
+       id="XMLID_93_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop353" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop355" />
+      <midPointStop
+         id="midPointStop357"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop359"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop361"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738"
+       id="XMLID_94_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop370" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop372" />
+      <midPointStop
+         id="midPointStop374"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop376"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop378"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547"
+       id="XMLID_95_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop385" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop387" />
+      <midPointStop
+         id="midPointStop389"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop391"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop393"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409"
+       id="XMLID_96_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop400" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop402" />
+      <midPointStop
+         id="midPointStop404"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop406"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop408"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232"
+       id="XMLID_97_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop415" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop417" />
+      <midPointStop
+         id="midPointStop419"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop421"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop423"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505"
+       id="XMLID_98_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop430" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop432" />
+      <midPointStop
+         id="midPointStop434"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop436"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop438"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396"
+       id="XMLID_99_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop445" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop447" />
+      <midPointStop
+         id="midPointStop449"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop451"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop453"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036"
+       id="XMLID_100_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop460" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop462" />
+      <midPointStop
+         id="midPointStop464"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop466"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop468"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591"
+       id="XMLID_101_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop475" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop477" />
+      <midPointStop
+         id="midPointStop479"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop481"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop483"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415"
+       id="XMLID_102_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop490" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop492" />
+      <midPointStop
+         id="midPointStop494"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop496"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop498"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999"
+       id="XMLID_103_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop505" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop507" />
+      <midPointStop
+         id="midPointStop509"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop511"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop513"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359"
+       id="XMLID_104_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop522" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop524" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop526" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop528" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop530" />
+      <midPointStop
+         id="midPointStop532"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop534"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop536"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201"
+       id="XMLID_105_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop543" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop545" />
+      <midPointStop
+         id="midPointStop547"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop549"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop551"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014"
+       id="XMLID_106_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop563" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop565" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop567" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop569" />
+      <midPointStop
+         id="midPointStop571"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop573"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop575"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303"
+       id="XMLID_107_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop582" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop584" />
+      <midPointStop
+         id="midPointStop586"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop588"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop590"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591"
+       id="XMLID_108_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop597" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop599" />
+      <midPointStop
+         id="midPointStop601"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop603"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop605"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707"
+       id="XMLID_109_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop612" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop614" />
+      <midPointStop
+         id="midPointStop616"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop618"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop620"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641"
+       id="XMLID_110_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop627" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop629" />
+      <midPointStop
+         id="midPointStop631"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop633"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop635"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703"
+       id="XMLID_111_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop642" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop644" />
+      <midPointStop
+         id="midPointStop646"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop648"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop650"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341"
+       id="XMLID_112_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop657" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop659" />
+      <midPointStop
+         id="midPointStop661"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop663"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop665"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137"
+       id="XMLID_113_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop674" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop676" />
+      <midPointStop
+         id="midPointStop678"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop680"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop682"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741"
+       id="XMLID_114_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop689" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop691" />
+      <midPointStop
+         id="midPointStop693"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop695"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop697"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319"
+       id="XMLID_115_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop704" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop706" />
+      <midPointStop
+         id="midPointStop708"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop710"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop712"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791"
+       id="XMLID_116_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop719" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop721" />
+      <midPointStop
+         id="midPointStop723"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop725"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop727"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363"
+       id="XMLID_117_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop734" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop736" />
+      <midPointStop
+         id="midPointStop738"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop740"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop742"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335"
+       id="XMLID_118_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop749" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop751" />
+      <midPointStop
+         id="midPointStop753"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop755"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop757"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021"
+       id="XMLID_119_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop764" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop766" />
+      <midPointStop
+         id="midPointStop768"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop770"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop772"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141"
+       id="XMLID_120_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop779" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop781" />
+      <midPointStop
+         id="midPointStop783"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop785"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop787"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449"
+       id="XMLID_121_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop794" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop796" />
+      <midPointStop
+         id="midPointStop798"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop800"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop802"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159"
+       id="XMLID_122_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop809" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop811" />
+      <midPointStop
+         id="midPointStop813"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop815"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop817"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209"
+       id="XMLID_123_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop826" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop828" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop830" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop832" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop834" />
+      <midPointStop
+         id="midPointStop836"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop838"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop840"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349"
+       id="XMLID_124_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop847" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop849" />
+      <midPointStop
+         id="midPointStop851"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop853"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop855"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001"
+       id="XMLID_125_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop867" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop869" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop871" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop873" />
+      <midPointStop
+         id="midPointStop875"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop877"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop879"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop886" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop888" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281"
+       id="XMLID_127_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop901" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop903" />
+      <midPointStop
+         id="midPointStop905"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop907"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop909"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931"
+       id="XMLID_128_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop916" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop918" />
+      <midPointStop
+         id="midPointStop920"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop922"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop924"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598"
+       id="XMLID_129_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop931" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop933" />
+      <midPointStop
+         id="midPointStop935"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop937"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop939"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231"
+       id="XMLID_130_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop946" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop948" />
+      <midPointStop
+         id="midPointStop950"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop952"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop954"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop961" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop963" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228"
+       id="XMLID_132_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop978" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop980" />
+      <midPointStop
+         id="midPointStop982"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop984"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop986"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117"
+       id="XMLID_133_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop993" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop995" />
+      <midPointStop
+         id="midPointStop997"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop999"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1001"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102"
+       id="XMLID_134_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1008" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1010" />
+      <midPointStop
+         id="midPointStop1012"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1014"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1016"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073"
+       id="XMLID_135_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop1023" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1025" />
+      <midPointStop
+         id="midPointStop1027"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1029"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1031"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1038" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop1040" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1053" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop1055" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1068" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1070" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367"
+       id="XMLID_139_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1083" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1085" />
+      <midPointStop
+         id="midPointStop1087"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1089"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1091"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1098" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1100" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337"
+       id="XMLID_141_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop1113" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1115" />
+      <midPointStop
+         id="midPointStop1117"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop1119"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1121"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599"
+       id="XMLID_142_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1130" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop1132" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop1134" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop1136" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1138" />
+      <midPointStop
+         id="midPointStop1140"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1142"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1144"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097"
+       id="XMLID_143_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1151" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1153" />
+      <midPointStop
+         id="midPointStop1155"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1157"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1159"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       id="XMLID_144_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop1169" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop1171" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop1173" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop1175" />
+      <midPointStop
+         id="midPointStop1177"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1179"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1181"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="linearGradient7061"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7063" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7065" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       id="XMLID_146_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop1190" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1192" />
+      <midPointStop
+         id="midPointStop1194"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1196"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1198"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="linearGradient7072"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop7074" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7076" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       id="XMLID_148_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1207" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1209" />
+      <midPointStop
+         id="midPointStop1211"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1213"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1215"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       id="XMLID_149_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1224" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop1226" />
+      <midPointStop
+         id="midPointStop1228"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1230"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1232"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       id="XMLID_150_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1239" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1241" />
+      <midPointStop
+         id="midPointStop1243"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1245"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1247"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="linearGradient7091"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7093" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7095" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="linearGradient7098"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7100" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7102" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="linearGradient7105"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7107" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7109" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="linearGradient7112"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7114" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7116" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       id="XMLID_155_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1264" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1266" />
+      <midPointStop
+         id="midPointStop1268"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1270"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1272"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       id="XMLID_156_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop1281" />
+      <svg:stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop1283" />
+      <midPointStop
+         id="midPointStop1285"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1287"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1289"
+         style="stop-color:#94CAFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       id="XMLID_157_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop1296" />
+      <svg:stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop1298" />
+      <midPointStop
+         id="midPointStop1300"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1302"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1304"
+         style="stop-color:#94CAFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="108.9547"
+       x2="171.04311"
+       y1="27.434099"
+       x1="89.522499"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6425"
+       xlink:href="#XMLID_158_"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       id="XMLID_158_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#99ccff;stop-opacity:1"
+         offset="0"
+         id="stop1311" />
+      <svg:stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="1"
+         id="stop1313" />
+      <midPointStop
+         id="midPointStop1315"
+         style="stop-color:#99CCFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1317"
+         style="stop-color:#99CCFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1319"
+         style="stop-color:#428AFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="48.791"
+       x2="48.752899"
+       y1="207.65041"
+       x1="207.6123"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6269-12"
+       xlink:href="#XMLID_80_-300"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       id="XMLID_80_-300"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#2f2f2f;stop-opacity:1"
+         offset="0"
+         id="stop9438" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9440" />
+      <midPointStop
+         id="midPointStop144"
+         style="stop-color:#2f2f2f"
+         offset="0" />
+      <midPointStop
+         id="midPointStop146"
+         style="stop-color:#2f2f2f"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop148"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="193.487"
+       x2="193.901"
+       y1="66.130898"
+       x1="66.544899"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6271-673"
+       xlink:href="#XMLID_81_-401"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       id="XMLID_81_-401"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9444" />
+      <svg:stop
+         style="stop-color:#c5c5c5;stop-opacity:1"
+         offset="1"
+         id="stop9446" />
+      <midPointStop
+         id="midPointStop159"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop161"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop163"
+         style="stop-color:#c5c5c5"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6273-406"
+       xlink:href="#XMLID_82_-773"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_82_-773"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9450" />
+      <svg:stop
+         style="stop-color:#c5c5c5;stop-opacity:1"
+         offset="1"
+         id="stop9452" />
+      <midPointStop
+         id="midPointStop174"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop176"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop178"
+         style="stop-color:#c5c5c5"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6275-166"
+       xlink:href="#XMLID_83_-832"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_83_-832"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9456" />
+      <svg:stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="0.0562"
+         id="stop9458" />
+      <svg:stop
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0.69660002"
+         id="stop9460" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9462" />
+      <midPointStop
+         id="midPointStop193"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop195"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop197"
+         style="stop-color:#c3c3c3"
+         offset="0.0562" />
+      <midPointStop
+         id="midPointStop199"
+         style="stop-color:#c3c3c3"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop201"
+         style="stop-color:#868686"
+         offset="0.6966" />
+      <midPointStop
+         id="midPointStop203"
+         style="stop-color:#868686"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop205"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="19.067101"
+       x2="69.907303"
+       y1="86.971199"
+       x1="153.97951"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6277-610"
+       xlink:href="#XMLID_84_-677"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       id="XMLID_84_-677"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#2f2f2f;stop-opacity:1"
+         offset="0"
+         id="stop9466" />
+      <svg:stop
+         style="stop-color:#868686;stop-opacity:1"
+         offset="1"
+         id="stop9468" />
+      <midPointStop
+         id="midPointStop216"
+         style="stop-color:#2f2f2f"
+         offset="0" />
+      <midPointStop
+         id="midPointStop218"
+         style="stop-color:#2f2f2f"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop220"
+         style="stop-color:#868686"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       r="102.7621"
+       fy="225.54491"
+       fx="160.10159"
+       cy="225.54491"
+       cx="160.10159"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient6279-99"
+       xlink:href="#XMLID_85_-413"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       cx="160.10159"
+       cy="225.54491"
+       r="102.7621"
+       fx="160.10159"
+       fy="225.54491"
+       id="XMLID_85_-413"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9472" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9474" />
+      <midPointStop
+         id="midPointStop231"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop233"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop235"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       y2="62.4673"
+       x2="208.98441"
+       y1="62.4673"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6281-27"
+       xlink:href="#XMLID_86_-281"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       id="XMLID_86_-281"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#f2f2f2;stop-opacity:1"
+         offset="0"
+         id="stop9478" />
+      <svg:stop
+         style="stop-color:#9b9b9b;stop-opacity:1"
+         offset="1"
+         id="stop9480" />
+      <midPointStop
+         id="midPointStop246"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <midPointStop
+         id="midPointStop248"
+         style="stop-color:#f2f2f2"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop250"
+         style="stop-color:#9b9b9b"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="109.9408"
+       x2="133.71049"
+       y1="185.7363"
+       x1="57.915001"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6283-124"
+       xlink:href="#XMLID_87_-7"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408"
+       id="XMLID_87_-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9484" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9486" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9488" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9490" />
+      <midPointStop
+         id="midPointStop267"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop269"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop271"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="135.90919"
+       x2="116.0225"
+       y1="135.90919"
+       x1="60.370098"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6285-348"
+       xlink:href="#XMLID_88_-910"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919"
+       id="XMLID_88_-910"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9494" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9496" />
+      <midPointStop
+         id="midPointStop282"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop284"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop286"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="169.9082"
+       x2="92.127899"
+       y1="169.9082"
+       x1="51.419399"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6287-770"
+       xlink:href="#XMLID_89_-317"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082"
+       id="XMLID_89_-317"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9500" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9502" />
+      <midPointStop
+         id="midPointStop297"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop299"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop301"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="180.6895"
+       x2="128.5298"
+       y1="180.6895"
+       x1="83.349098"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6289-142"
+       xlink:href="#XMLID_90_-384"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895"
+       id="XMLID_90_-384"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9506" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9508" />
+      <midPointStop
+         id="midPointStop312"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop314"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop316"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="143.37891"
+       x2="146.2168"
+       y1="143.37891"
+       x1="68.799301"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6291-78"
+       xlink:href="#XMLID_91_-871"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891"
+       id="XMLID_91_-871"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9512" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9514" />
+      <midPointStop
+         id="midPointStop327"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop329"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop331"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="160.54201"
+       x2="143.7529"
+       y1="160.54201"
+       x1="57.743198"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6293-824"
+       xlink:href="#XMLID_92_-17"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201"
+       id="XMLID_92_-17"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9518" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9520" />
+      <midPointStop
+         id="midPointStop342"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop344"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop346"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="145.86909"
+       x2="110.6274"
+       y1="145.86909"
+       x1="45.084499"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6295-851"
+       xlink:href="#XMLID_93_-680"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909"
+       id="XMLID_93_-680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9524" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9526" />
+      <midPointStop
+         id="midPointStop357"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop359"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop361"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="176.6738"
+       x2="65.547401"
+       y1="141.1396"
+       x1="65.547401"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6297-148"
+       xlink:href="#XMLID_94_-24"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738"
+       id="XMLID_94_-24"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9530" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9532" />
+      <midPointStop
+         id="midPointStop374"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop376"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop378"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="155.5547"
+       x2="83.372101"
+       y1="155.5547"
+       x1="56.244099"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6299-516"
+       xlink:href="#XMLID_95_-472"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547"
+       id="XMLID_95_-472"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9536" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9538" />
+      <midPointStop
+         id="midPointStop389"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop391"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop393"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="133.41409"
+       x2="73.045403"
+       y1="133.41409"
+       x1="51.5425"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6301-40"
+       xlink:href="#XMLID_96_-410"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409"
+       id="XMLID_96_-410"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9542" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9544" />
+      <midPointStop
+         id="midPointStop404"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop406"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop408"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="164.3232"
+       x2="144.998"
+       y1="164.3232"
+       x1="112.6553"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6303-774"
+       xlink:href="#XMLID_97_-458"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232"
+       id="XMLID_97_-458"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9548" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9550" />
+      <midPointStop
+         id="midPointStop419"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop421"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop423"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="123.7505"
+       x2="73.045403"
+       y1="123.7505"
+       x1="51.702599"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6305-152"
+       xlink:href="#XMLID_98_-723"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505"
+       id="XMLID_98_-723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9554" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9556" />
+      <midPointStop
+         id="midPointStop434"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop436"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop438"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="117.1396"
+       x2="111.8184"
+       y1="117.1396"
+       x1="68.9487"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6307-705"
+       xlink:href="#XMLID_99_-634"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396"
+       id="XMLID_99_-634"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9560" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9562" />
+      <midPointStop
+         id="midPointStop449"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop451"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop453"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="121.7036"
+       x2="101.0723"
+       y1="121.7036"
+       x1="43.173302"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6309-493"
+       xlink:href="#XMLID_100_-34"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036"
+       id="XMLID_100_-34"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9566" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9568" />
+      <midPointStop
+         id="midPointStop464"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop466"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop468"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="181.83591"
+       x2="102.8101"
+       y1="181.83591"
+       x1="64.091797"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6311-389"
+       xlink:href="#XMLID_101_-145"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591"
+       id="XMLID_101_-145"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9572" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9574" />
+      <midPointStop
+         id="midPointStop479"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop481"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop483"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="102.415"
+       x2="89.291496"
+       y1="116.5332"
+       x1="89.291496"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6313-341"
+       xlink:href="#XMLID_102_-594"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415"
+       id="XMLID_102_-594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9578" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9580" />
+      <midPointStop
+         id="midPointStop494"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop496"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop498"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="166.78999"
+       x2="103.6514"
+       y1="166.78999"
+       x1="64.091797"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6315-70"
+       xlink:href="#XMLID_103_-322"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999"
+       id="XMLID_103_-322"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9584" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9586" />
+      <midPointStop
+         id="midPointStop509"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop511"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop513"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="135.68359"
+       x2="121.7998"
+       y1="186.7813"
+       x1="121.7998"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6317-432"
+       xlink:href="#XMLID_104_-426"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359"
+       id="XMLID_104_-426"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9590" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9592" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9594" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9596" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9598" />
+      <midPointStop
+         id="midPointStop532"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop534"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop536"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="120.8201"
+       x2="107.8923"
+       y1="153.74899"
+       x1="140.8213"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6319-99"
+       xlink:href="#XMLID_105_-588"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201"
+       id="XMLID_105_-588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9602" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9604" />
+      <midPointStop
+         id="midPointStop547"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop549"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop551"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="121.5014"
+       x2="174.5889"
+       y1="186.5674"
+       x1="109.5229"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6321-310"
+       xlink:href="#XMLID_106_-902"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014"
+       id="XMLID_106_-902"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9608" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9610" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9612" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9614" />
+      <midPointStop
+         id="midPointStop571"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop573"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop575"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="141.5303"
+       x2="158.6631"
+       y1="141.5303"
+       x1="112.7676"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6323-611"
+       xlink:href="#XMLID_107_-908"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303"
+       id="XMLID_107_-908"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9618" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9620" />
+      <midPointStop
+         id="midPointStop586"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop588"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop590"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="173.58591"
+       x2="139.75681"
+       y1="173.58591"
+       x1="106.2578"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6325-800"
+       xlink:href="#XMLID_108_-618"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591"
+       id="XMLID_108_-618"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9624" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9626" />
+      <midPointStop
+         id="midPointStop601"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop603"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop605"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="184.4707"
+       x2="170.3076"
+       y1="184.4707"
+       x1="132.9424"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6327-400"
+       xlink:href="#XMLID_109_-773"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707"
+       id="XMLID_109_-773"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9630" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9632" />
+      <midPointStop
+         id="midPointStop616"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop618"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop620"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="149.56641"
+       x2="183.70309"
+       y1="149.56641"
+       x1="119.5918"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6329-40"
+       xlink:href="#XMLID_110_-751"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641"
+       id="XMLID_110_-751"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9636" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9638" />
+      <midPointStop
+         id="midPointStop631"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop633"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop635"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="165.5703"
+       x2="182.47749"
+       y1="165.5703"
+       x1="111.2227"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6331-210"
+       xlink:href="#XMLID_111_-96"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703"
+       id="XMLID_111_-96"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9642" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9644" />
+      <midPointStop
+         id="midPointStop646"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop648"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop650"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="151.52341"
+       x2="154.5625"
+       y1="151.52341"
+       x1="100.2744"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6333-446"
+       xlink:href="#XMLID_112_-727"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341"
+       id="XMLID_112_-727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9648" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9650" />
+      <midPointStop
+         id="midPointStop661"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop663"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop665"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="179.5137"
+       x2="117.7603"
+       y1="146.1875"
+       x1="117.7603"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6335-626"
+       xlink:href="#XMLID_113_-280"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137"
+       id="XMLID_113_-280"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9654" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9656" />
+      <midPointStop
+         id="midPointStop678"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop680"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop682"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="159.85741"
+       x2="132.4502"
+       y1="159.85741"
+       x1="109.9058"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6337-884"
+       xlink:href="#XMLID_114_-97"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741"
+       id="XMLID_114_-97"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9660" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9662" />
+      <midPointStop
+         id="midPointStop693"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop695"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop697"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="139.24319"
+       x2="122.7686"
+       y1="139.24319"
+       x1="105.1421"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6339-140"
+       xlink:href="#XMLID_115_-820"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319"
+       id="XMLID_115_-820"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9666" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9668" />
+      <midPointStop
+         id="midPointStop708"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop710"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop712"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="169.791"
+       x2="183.51759"
+       y1="169.791"
+       x1="156.75"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6341-178"
+       xlink:href="#XMLID_116_-848"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791"
+       id="XMLID_116_-848"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9672" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9674" />
+      <midPointStop
+         id="midPointStop723"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop725"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop727"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="130.2363"
+       x2="122.7686"
+       y1="130.2363"
+       x1="105.1421"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6343-456"
+       xlink:href="#XMLID_117_-194"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363"
+       id="XMLID_117_-194"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9678" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9680" />
+      <midPointStop
+         id="midPointStop738"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop740"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop742"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="124.335"
+       x2="155.19341"
+       y1="124.335"
+       x1="119.3262"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6345-512"
+       xlink:href="#XMLID_118_-250"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335"
+       id="XMLID_118_-250"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9684" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9686" />
+      <midPointStop
+         id="midPointStop753"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop755"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop757"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="128.2021"
+       x2="146.27341"
+       y1="128.2021"
+       x1="97.902802"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6347-184"
+       xlink:href="#XMLID_119_-606"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021"
+       id="XMLID_119_-606"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9690" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9692" />
+      <midPointStop
+         id="midPointStop768"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop770"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop772"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="185.19141"
+       x2="148.7822"
+       y1="185.19141"
+       x1="116.7427"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6349-877"
+       xlink:href="#XMLID_120_-395"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141"
+       id="XMLID_120_-395"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9696" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9698" />
+      <midPointStop
+         id="midPointStop783"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop785"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop787"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="110.5449"
+       x2="136.19341"
+       y1="123.416"
+       x1="136.19341"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6351-447"
+       xlink:href="#XMLID_121_-770"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449"
+       id="XMLID_121_-770"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9702" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9704" />
+      <midPointStop
+         id="midPointStop798"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop800"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop802"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="170.68159"
+       x2="149.4102"
+       y1="170.68159"
+       x1="116.7427"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6353-441"
+       xlink:href="#XMLID_122_-543"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159"
+       id="XMLID_122_-543"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9708" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9710" />
+      <midPointStop
+         id="midPointStop813"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop815"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop817"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="142.41209"
+       x2="164.56641"
+       y1="190.0674"
+       x1="164.56641"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6355-488"
+       xlink:href="#XMLID_123_-726"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209"
+       id="XMLID_123_-726"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9714" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9716" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9718" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9720" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9722" />
+      <midPointStop
+         id="midPointStop836"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop838"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop840"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="129.86349"
+       x2="152.1692"
+       y1="159.6348"
+       x1="181.9404"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6357-493"
+       xlink:href="#XMLID_124_-427"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349"
+       id="XMLID_124_-427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9726" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9728" />
+      <midPointStop
+         id="midPointStop851"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop853"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop855"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="55.553001"
+       x2="171.70821"
+       y1="138.93359"
+       x1="88.327599"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6359-440"
+       xlink:href="#XMLID_125_-451"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001"
+       id="XMLID_125_-451"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9732" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9734" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9736" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9738" />
+      <midPointStop
+         id="midPointStop875"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop877"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop879"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.741203"
+       x2="152.7852"
+       y1="84.741203"
+       x1="89.107903"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6361-910"
+       xlink:href="#XMLID_126_-70"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_-70"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9742" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9744" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="120.8281"
+       x2="125.7993"
+       y1="120.8281"
+       x1="79.251503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6363-657"
+       xlink:href="#XMLID_127_-555"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281"
+       id="XMLID_127_-555"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9748" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9750" />
+      <midPointStop
+         id="midPointStop905"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop907"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop909"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="132.56931"
+       x2="167.68359"
+       y1="132.56931"
+       x1="115.9443"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6365-734"
+       xlink:href="#XMLID_128_-141"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931"
+       id="XMLID_128_-141"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9754" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9756" />
+      <midPointStop
+         id="midPointStop920"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop922"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop924"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="93.078598"
+       x2="187.3965"
+       y1="93.078598"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6367-266"
+       xlink:href="#XMLID_129_-770"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598"
+       id="XMLID_129_-770"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9760" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9762" />
+      <midPointStop
+         id="midPointStop935"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop937"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop939"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="111.2231"
+       x2="184.93159"
+       y1="111.2231"
+       x1="86.376503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6369-690"
+       xlink:href="#XMLID_130_-72"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231"
+       id="XMLID_130_-72"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9766" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9768" />
+      <midPointStop
+         id="midPointStop950"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop952"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop954"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="95.561501"
+       x2="146.76559"
+       y1="95.561501"
+       x1="71.667503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6371-381"
+       xlink:href="#XMLID_131_-413"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_-413"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9772" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9774" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="127.8228"
+       x2="95.352097"
+       y1="90.179703"
+       x1="95.352097"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6373-572"
+       xlink:href="#XMLID_132_-722"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228"
+       id="XMLID_132_-722"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9778" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9780" />
+      <midPointStop
+         id="midPointStop982"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop984"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop986"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="105.5117"
+       x2="115.7422"
+       y1="105.5117"
+       x1="84.628403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6375-640"
+       xlink:href="#XMLID_133_-214"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117"
+       id="XMLID_133_-214"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9784" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9786" />
+      <midPointStop
+         id="midPointStop997"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop999"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1001"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="82.119102"
+       x2="103.4116"
+       y1="82.119102"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6377-149"
+       xlink:href="#XMLID_134_-535"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102"
+       id="XMLID_134_-535"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9790" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9792" />
+      <midPointStop
+         id="midPointStop1012"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1014"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1016"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="115.5073"
+       x2="186.3633"
+       y1="115.5073"
+       x1="149.50391"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6379-302"
+       xlink:href="#XMLID_135_-577"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073"
+       id="XMLID_135_-577"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9796" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9798" />
+      <midPointStop
+         id="midPointStop1027"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1029"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1031"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="71.9048"
+       x2="103.4116"
+       y1="71.9048"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6381-329"
+       xlink:href="#XMLID_136_-920"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_-920"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9802" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9804" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="65.025398"
+       x2="147.9727"
+       y1="65.025398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6383-96"
+       xlink:href="#XMLID_137_-11"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_-11"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9808" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9810" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="69.597198"
+       x2="135.6543"
+       y1="69.597198"
+       x1="69.128403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6385-535"
+       xlink:href="#XMLID_138_-837"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_-837"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9814" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9816" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="133.6367"
+       x2="138.1172"
+       y1="133.6367"
+       x1="93.767601"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6387-799"
+       xlink:href="#XMLID_139_-626"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367"
+       id="XMLID_139_-626"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9820" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9822" />
+      <midPointStop
+         id="midPointStop1087"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1089"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1091"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="49.432598"
+       x2="122.0112"
+       y1="64.238297"
+       x1="122.0112"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6389-597"
+       xlink:href="#XMLID_140_-645"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_-645"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9826" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9828" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="117.5337"
+       x2="139.0508"
+       y1="117.5337"
+       x1="93.767601"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6391-867"
+       xlink:href="#XMLID_141_-860"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337"
+       id="XMLID_141_-860"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9832" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9834" />
+      <midPointStop
+         id="midPointStop1117"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop1119"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1121"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.952599"
+       x2="159.9014"
+       y1="138.9736"
+       x1="159.9014"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6393-952"
+       xlink:href="#XMLID_142_-935"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599"
+       id="XMLID_142_-935"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9838" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9840" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9842" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9844" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9846" />
+      <midPointStop
+         id="midPointStop1140"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1142"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1144"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="67.852097"
+       x2="143.1671"
+       y1="104.6089"
+       x1="179.9238"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6395-649"
+       xlink:href="#XMLID_143_-216"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097"
+       id="XMLID_143_-216"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9850" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9852" />
+      <midPointStop
+         id="midPointStop1155"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1157"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1159"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="40.555302"
+       x2="158.21181"
+       y1="103.3657"
+       x1="95.401398"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6397-611"
+       xlink:href="#XMLID_144_-323"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       id="XMLID_144_-323"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9856" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9858" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9860" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9862" />
+      <midPointStop
+         id="midPointStop1177"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1179"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1181"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.741203"
+       x2="152.7852"
+       y1="84.741203"
+       x1="89.107903"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6399-909"
+       xlink:href="#XMLID_126_-463"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_-463"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9866" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9868" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="83.484398"
+       x2="187.3965"
+       y1="83.484398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6401-54"
+       xlink:href="#XMLID_146_-485"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       id="XMLID_146_-485"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9872" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9874" />
+      <midPointStop
+         id="midPointStop1194"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1196"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1198"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="95.561501"
+       x2="146.76559"
+       y1="95.561501"
+       x1="71.667503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6403-766"
+       xlink:href="#XMLID_131_-578"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_-578"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9878" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9880" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="86.965302"
+       x2="146.76559"
+       y1="86.965302"
+       x1="86.275398"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6405-525"
+       xlink:href="#XMLID_148_-757"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       id="XMLID_148_-757"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9884" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9886" />
+      <midPointStop
+         id="midPointStop1211"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1213"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1215"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="93.951698"
+       x2="111.7031"
+       y1="93.951698"
+       x1="89.539101"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6407-181"
+       xlink:href="#XMLID_149_-599"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       id="XMLID_149_-599"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9890" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9892" />
+      <midPointStop
+         id="midPointStop1228"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1230"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1232"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="80.275902"
+       x2="103.4116"
+       y1="80.275902"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6409-208"
+       xlink:href="#XMLID_150_-191"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       id="XMLID_150_-191"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9896" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9898" />
+      <midPointStop
+         id="midPointStop1243"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1245"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1247"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="71.9048"
+       x2="103.4116"
+       y1="71.9048"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6411-385"
+       xlink:href="#XMLID_136_-980"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_-980"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9902" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9904" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="65.025398"
+       x2="147.9727"
+       y1="65.025398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6413-883"
+       xlink:href="#XMLID_137_-482"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_-482"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9908" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9910" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="69.597198"
+       x2="135.6543"
+       y1="69.597198"
+       x1="69.128403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6415-860"
+       xlink:href="#XMLID_138_-859"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_-859"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9914" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9916" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="49.432598"
+       x2="122.0112"
+       y1="64.238297"
+       x1="122.0112"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6417-680"
+       xlink:href="#XMLID_140_-471"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_-471"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9920" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9922" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="68.5233"
+       x2="143.8383"
+       y1="98.137199"
+       x1="173.4521"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6419-21"
+       xlink:href="#XMLID_155_-978"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       id="XMLID_155_-978"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9926" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9928" />
+      <midPointStop
+         id="midPointStop1268"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1270"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1272"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="159.00591"
+       x2="118.7616"
+       y1="159.00591"
+       x1="60.097198"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6421-714"
+       xlink:href="#XMLID_156_-100"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       id="XMLID_156_-100"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9932" />
+      <svg:stop
+         style="stop-color:#c0c0c0;stop-opacity:1"
+         offset="1"
+         id="stop9934" />
+      <midPointStop
+         id="midPointStop1285"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1287"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1289"
+         style="stop-color:#c0c0c0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="147.877"
+       x2="118.7651"
+       y1="147.877"
+       x1="60.098598"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6423-931"
+       xlink:href="#XMLID_157_-792"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       id="XMLID_157_-792"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9938" />
+      <svg:stop
+         style="stop-color:#c0c0c0;stop-opacity:1"
+         offset="1"
+         id="stop9940" />
+      <midPointStop
+         id="midPointStop1300"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1302"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1304"
+         style="stop-color:#c0c0c0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_158_-583"
+       id="linearGradient7705-647"
+       gradientUnits="userSpaceOnUse"
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547" />
+    <svg:linearGradient
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       id="XMLID_158_-583"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="0"
+         id="stop9944" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9946" />
+      <midPointStop
+         id="midPointStop1315"
+         style="stop-color:#c3c3c3"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1317"
+         style="stop-color:#c3c3c3"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1319"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7135"
+       y2="48.791"
+       x2="48.752899"
+       y1="207.65041"
+       x1="207.6123">
+      <svg:stop
+         id="stop7137"
+         offset="0"
+         style="stop-color:#2f2f2f;stop-opacity:1" />
+      <svg:stop
+         id="stop7139"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#2f2f2f"
+         id="midPointStop144" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#2f2f2f"
+         id="midPointStop146" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop148" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7142"
+       y2="193.487"
+       x2="193.901"
+       y1="66.130898"
+       x1="66.544899">
+      <svg:stop
+         id="stop7144"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7146"
+         offset="1"
+         style="stop-color:#c5c5c5;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop159" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop161" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c5c5c5"
+         id="midPointStop163" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7149"
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223">
+      <svg:stop
+         id="stop7151"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7153"
+         offset="1"
+         style="stop-color:#c5c5c5;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop174" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop176" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c5c5c5"
+         id="midPointStop178" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7156"
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223">
+      <svg:stop
+         id="stop7158"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7160"
+         offset="0.0562"
+         style="stop-color:#c3c3c3;stop-opacity:1" />
+      <svg:stop
+         id="stop7162"
+         offset="0.69660002"
+         style="stop-color:#868686;stop-opacity:1" />
+      <svg:stop
+         id="stop7164"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop193" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop195" />
+      <midPointStop
+         offset="0.0562"
+         style="stop-color:#c3c3c3"
+         id="midPointStop197" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#c3c3c3"
+         id="midPointStop199" />
+      <midPointStop
+         offset="0.6966"
+         style="stop-color:#868686"
+         id="midPointStop201" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#868686"
+         id="midPointStop203" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop205" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7167"
+       y2="19.067101"
+       x2="69.907303"
+       y1="86.971199"
+       x1="153.97951">
+      <svg:stop
+         id="stop7169"
+         offset="0"
+         style="stop-color:#2f2f2f;stop-opacity:1" />
+      <svg:stop
+         id="stop7171"
+         offset="1"
+         style="stop-color:#868686;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#2f2f2f"
+         id="midPointStop216" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#2f2f2f"
+         id="midPointStop218" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#868686"
+         id="midPointStop220" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient7174"
+       fy="225.54491"
+       fx="160.10159"
+       r="102.7621"
+       cy="225.54491"
+       cx="160.10159">
+      <svg:stop
+         id="stop7176"
+         offset="0"
+         style="stop-color:#828282;stop-opacity:1" />
+      <svg:stop
+         id="stop7178"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#828282"
+         id="midPointStop231" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#828282"
+         id="midPointStop233" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop235" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7181"
+       y2="62.4673"
+       x2="208.98441"
+       y1="62.4673"
+       x1="47.8223">
+      <svg:stop
+         id="stop7183"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1" />
+      <svg:stop
+         id="stop7185"
+         offset="1"
+         style="stop-color:#9b9b9b;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#f2f2f2"
+         id="midPointStop246" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#f2f2f2"
+         id="midPointStop248" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#9b9b9b"
+         id="midPointStop250" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7629"
+       y2="40.555302"
+       x2="158.21181"
+       y1="103.3657"
+       x1="95.401398">
+      <svg:stop
+         id="stop7631"
+         offset="0"
+         style="stop-color:#494949;stop-opacity:1" />
+      <svg:stop
+         id="stop7633"
+         offset="0.1654"
+         style="stop-color:#505050;stop-opacity:1" />
+      <svg:stop
+         id="stop7635"
+         offset="0.59490001"
+         style="stop-color:#5d5d5d;stop-opacity:1" />
+      <svg:stop
+         id="stop7637"
+         offset="1"
+         style="stop-color:#616161;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#494949"
+         id="midPointStop1177" />
+      <midPointStop
+         offset="0.3051"
+         style="stop-color:#494949"
+         id="midPointStop1179" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#616161"
+         id="midPointStop1181" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7641"
+       y2="83.484398"
+       x2="187.3965"
+       y1="83.484398"
+       x1="98.694298">
+      <svg:stop
+         id="stop7643"
+         offset="0"
+         style="stop-color:#616161;stop-opacity:1" />
+      <svg:stop
+         id="stop7645"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#616161"
+         id="midPointStop1194" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#616161"
+         id="midPointStop1196" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1198" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7649"
+       y2="86.965302"
+       x2="146.76559"
+       y1="86.965302"
+       x1="86.275398">
+      <svg:stop
+         id="stop7651"
+         offset="0"
+         style="stop-color:#b6b6b6;stop-opacity:1" />
+      <svg:stop
+         id="stop7653"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1211" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1213" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1215" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7657"
+       y2="93.951698"
+       x2="111.7031"
+       y1="93.951698"
+       x1="89.539101">
+      <svg:stop
+         id="stop7659"
+         offset="0"
+         style="stop-color:#dadada;stop-opacity:1" />
+      <svg:stop
+         id="stop7661"
+         offset="0.75840002"
+         style="stop-color:#828282;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#dadada"
+         id="midPointStop1228" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#dadada"
+         id="midPointStop1230" />
+      <midPointStop
+         offset="0.7584"
+         style="stop-color:#828282"
+         id="midPointStop1232" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7664"
+       y2="80.275902"
+       x2="103.4116"
+       y1="80.275902"
+       x1="78.984901">
+      <svg:stop
+         id="stop7666"
+         offset="0"
+         style="stop-color:#dadada;stop-opacity:1" />
+      <svg:stop
+         id="stop7668"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#dadada"
+         id="midPointStop1243" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#dadada"
+         id="midPointStop1245" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1247" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7676"
+       y2="68.5233"
+       x2="143.8383"
+       y1="98.137199"
+       x1="173.4521">
+      <svg:stop
+         id="stop7678"
+         offset="0"
+         style="stop-color:#b6b6b6;stop-opacity:1" />
+      <svg:stop
+         id="stop7680"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1268" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1270" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1272" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7684"
+       y2="159.00591"
+       x2="118.7616"
+       y1="159.00591"
+       x1="60.097198">
+      <svg:stop
+         id="stop7686"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7688"
+         offset="1"
+         style="stop-color:#c0c0c0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop1285" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop1287" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c0c0c0"
+         id="midPointStop1289" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7691"
+       y2="147.877"
+       x2="118.7651"
+       y1="147.877"
+       x1="60.098598">
+      <svg:stop
+         id="stop7693"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7695"
+         offset="1"
+         style="stop-color:#c0c0c0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop1300" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop1302" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c0c0c0"
+         id="midPointStop1304" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7698"
+       y2="108.9547"
+       x2="171.04311"
+       y1="27.434099"
+       x1="89.522499">
+      <svg:stop
+         id="stop7700"
+         offset="0"
+         style="stop-color:#c3c3c3;stop-opacity:1" />
+      <svg:stop
+         id="stop7702"
+         offset="1"
+         style="stop-color:#828282;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#c3c3c3"
+         id="midPointStop1315" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#c3c3c3"
+         id="midPointStop1317" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#828282"
+         id="midPointStop1319" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_158_-583"
+       id="linearGradient11460"
+       gradientUnits="userSpaceOnUse"
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_157_-792"
+       id="linearGradient11463"
+       gradientUnits="userSpaceOnUse"
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_156_-100"
+       id="linearGradient11466"
+       gradientUnits="userSpaceOnUse"
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_155_-978"
+       id="linearGradient11470"
+       gradientUnits="userSpaceOnUse"
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_150_-191"
+       id="linearGradient11478"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_149_-599"
+       id="linearGradient11481"
+       gradientUnits="userSpaceOnUse"
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_148_-757"
+       id="linearGradient11485"
+       gradientUnits="userSpaceOnUse"
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_131_-578"
+       id="linearGradient11488"
+       gradientUnits="userSpaceOnUse"
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_146_-485"
+       id="linearGradient11491"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_144_-323"
+       id="linearGradient11495"
+       gradientUnits="userSpaceOnUse"
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_86_-281"
+       id="linearGradient11753"
+       gradientUnits="userSpaceOnUse"
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_85_-413"
+       id="radialGradient11756"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.32076,0,0,0.31643347,3.8580342,7.7177487)"
+       cx="160.10159"
+       cy="225.54491"
+       fx="160.10159"
+       fy="225.54491"
+       r="102.7621" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_84_-677"
+       id="linearGradient11759"
+       gradientUnits="userSpaceOnUse"
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_83_-832"
+       id="linearGradient11762"
+       gradientUnits="userSpaceOnUse"
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_82_-773"
+       id="linearGradient11765"
+       gradientUnits="userSpaceOnUse"
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_81_-401"
+       id="linearGradient11768"
+       gradientUnits="userSpaceOnUse"
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       gradientTransform="matrix(0.32076,0,0,0.3381422,3.8580342,4.8227104)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_80_-300"
+       id="linearGradient11771"
+       gradientUnits="userSpaceOnUse"
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       gradientTransform="matrix(0.2916,0,0,0.307402,7.6022656,8.757456)" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_140_-471"
+       id="linearGradient11773"
+       gradientUnits="userSpaceOnUse"
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_138_-859"
+       id="linearGradient11775"
+       gradientUnits="userSpaceOnUse"
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_137_-482"
+       id="linearGradient11777"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_136_-980"
+       id="linearGradient11779"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_126_-463"
+       id="linearGradient11781"
+       gradientUnits="userSpaceOnUse"
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_125_-451"
+       id="linearGradient11783"
+       gradientUnits="userSpaceOnUse"
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_126_-70"
+       id="linearGradient11785"
+       gradientUnits="userSpaceOnUse"
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_127_-555"
+       id="linearGradient11787"
+       gradientUnits="userSpaceOnUse"
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_128_-141"
+       id="linearGradient11789"
+       gradientUnits="userSpaceOnUse"
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_129_-770"
+       id="linearGradient11791"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_130_-72"
+       id="linearGradient11793"
+       gradientUnits="userSpaceOnUse"
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_131_-413"
+       id="linearGradient11795"
+       gradientUnits="userSpaceOnUse"
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_132_-722"
+       id="linearGradient11797"
+       gradientUnits="userSpaceOnUse"
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_133_-214"
+       id="linearGradient11799"
+       gradientUnits="userSpaceOnUse"
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_134_-535"
+       id="linearGradient11801"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_135_-577"
+       id="linearGradient11803"
+       gradientUnits="userSpaceOnUse"
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_136_-920"
+       id="linearGradient11805"
+       gradientUnits="userSpaceOnUse"
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_137_-11"
+       id="linearGradient11807"
+       gradientUnits="userSpaceOnUse"
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_138_-837"
+       id="linearGradient11809"
+       gradientUnits="userSpaceOnUse"
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_139_-626"
+       id="linearGradient11811"
+       gradientUnits="userSpaceOnUse"
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_140_-645"
+       id="linearGradient11813"
+       gradientUnits="userSpaceOnUse"
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_141_-860"
+       id="linearGradient11815"
+       gradientUnits="userSpaceOnUse"
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_142_-935"
+       id="linearGradient11817"
+       gradientUnits="userSpaceOnUse"
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_143_-216"
+       id="linearGradient11819"
+       gradientUnits="userSpaceOnUse"
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_106_-902"
+       id="linearGradient11821"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_107_-908"
+       id="linearGradient11823"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_108_-618"
+       id="linearGradient11825"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_109_-773"
+       id="linearGradient11827"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_110_-751"
+       id="linearGradient11829"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_111_-96"
+       id="linearGradient11831"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_112_-727"
+       id="linearGradient11833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_113_-280"
+       id="linearGradient11835"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_114_-97"
+       id="linearGradient11837"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_115_-820"
+       id="linearGradient11839"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_116_-848"
+       id="linearGradient11841"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_117_-194"
+       id="linearGradient11843"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_118_-250"
+       id="linearGradient11845"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_119_-606"
+       id="linearGradient11847"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_120_-395"
+       id="linearGradient11849"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_121_-770"
+       id="linearGradient11851"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_122_-543"
+       id="linearGradient11853"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_123_-726"
+       id="linearGradient11855"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_124_-427"
+       id="linearGradient11857"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_87_-7"
+       id="linearGradient11859"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_88_-910"
+       id="linearGradient11861"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_89_-317"
+       id="linearGradient11863"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_90_-384"
+       id="linearGradient11865"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_91_-871"
+       id="linearGradient11867"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_92_-17"
+       id="linearGradient11869"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_93_-680"
+       id="linearGradient11871"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_94_-24"
+       id="linearGradient11873"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_95_-472"
+       id="linearGradient11875"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_96_-410"
+       id="linearGradient11877"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_97_-458"
+       id="linearGradient11879"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_98_-723"
+       id="linearGradient11881"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_99_-634"
+       id="linearGradient11883"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_100_-34"
+       id="linearGradient11885"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_101_-145"
+       id="linearGradient11887"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_102_-594"
+       id="linearGradient11889"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_103_-322"
+       id="linearGradient11891"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_104_-426"
+       id="linearGradient11893"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_105_-588"
+       id="linearGradient11895"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201" />
+    <svg:linearGradient
+       gradientTransform="matrix(0.3059451,-0.02958628,0.04222916,0.3111526,-530.12905,-128.33652)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient11478-290"
+       id="linearGradient12791-120"
+       y2="77.315956"
+       x2="274.42526"
+       y1="352.40601"
+       x1="218.05919" />
+    <svg:linearGradient
+       id="linearGradient11478-290">
+      <svg:stop
+         offset="0"
+         style="stop-color:#6b6b6b;stop-opacity:1"
+         id="stop24992" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#dbdbdb;stop-opacity:1"
+         id="stop24994" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient11472-439"
+       id="linearGradient12793-326"
+       y2="167.01372"
+       x2="115.25708"
+       y1="40.43428"
+       x1="46.210991" />
+    <svg:linearGradient
+       id="linearGradient11472-439">
+      <svg:stop
+         offset="0"
+         style="stop-color:#505050;stop-opacity:1"
+         id="stop24998" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#5f5f5f;stop-opacity:1"
+         id="stop25000" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1,0,0,0.6634183,-549.10198,-146.13056)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3445-324"
+       id="linearGradient12795-442"
+       y2="166.59012"
+       x2="140.07268"
+       y1="-126.40256"
+       x1="79.24601" />
+    <svg:linearGradient
+       id="linearGradient3445-324">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25004" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25006" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3368-750"
+       id="linearGradient12797-661"
+       y2="-160.22696"
+       x2="-89.16851"
+       y1="111.33359"
+       x1="-52.615292" />
+    <svg:linearGradient
+       id="linearGradient3368-750">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25010" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25012" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter3384"
+       x="-0.11909245"
+       width="1.2381849"
+       y="-0.021204988"
+       height="1.04241">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.81591018"
+         id="feGaussianBlur3386" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3354-99"
+       id="linearGradient12799-198"
+       y2="94.389671"
+       x2="50.208416"
+       y1="38.274925"
+       x1="122.18343" />
+    <svg:linearGradient
+       id="linearGradient3354-99">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25016" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25018" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter3342"
+       x="-0.012873816"
+       width="1.0257477"
+       y="-0.17679441"
+       height="1.3535888">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.73981434"
+         id="feGaussianBlur3344" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-529.08226,-219.5891)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3548-299"
+       id="linearGradient12801-916"
+       y2="35.082928"
+       x2="26.839462"
+       y1="77.995888"
+       x1="78.742409" />
+    <svg:linearGradient
+       id="linearGradient3548-299">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25022" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25024" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(0.3145759,0.03309979,-0.03170279,0.284888,-530.57037,-223.10227)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient11484-714"
+       id="linearGradient12803-7"
+       y2="778.66467"
+       x2="255.13704"
+       y1="393.5126"
+       x1="664.31964" />
+    <svg:linearGradient
+       id="linearGradient11484-714">
+      <svg:stop
+         offset="0"
+         style="stop-color:#3b3b3b;stop-opacity:0.80000001"
+         id="stop25028" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#b2b2b2;stop-opacity:0.71764708"
+         id="stop25030" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient11490-191"
+       id="linearGradient12805-824"
+       y2="56.955963"
+       x2="227.46077"
+       y1="184.17795"
+       x1="-4.7339954" />
+    <svg:linearGradient
+       id="linearGradient11490-191">
+      <svg:stop
+         offset="0"
+         style="stop-color:#505050;stop-opacity:1"
+         id="stop25034" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#5f5f5f;stop-opacity:1"
+         id="stop25036" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3468-93"
+       id="linearGradient12807-829"
+       y2="147.25517"
+       x2="58.94891"
+       y1="97.137428"
+       x1="198.59323" />
+    <svg:linearGradient
+       id="linearGradient3468-93">
+      <svg:stop
+         offset="0"
+         style="stop-color:#d8d8d8;stop-opacity:1"
+         id="stop25040" />
+      <svg:stop
+         offset="0.22455101"
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         id="stop25042" />
+      <svg:stop
+         offset="0.46812087"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25044" />
+      <svg:stop
+         offset="0.76308393"
+         style="stop-color:#f3f3f3;stop-opacity:1"
+         id="stop25046" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1"
+         id="stop25048" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3413-704"
+       id="linearGradient12809-552"
+       y2="102.69514"
+       x2="127.22198"
+       y1="321.58548"
+       x1="-75.3908" />
+    <svg:linearGradient
+       id="linearGradient3413-704">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25052" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25054" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3428-819"
+       id="linearGradient12811-697"
+       y2="103.83543"
+       x2="153.63531"
+       y1="69.702202"
+       x1="150.07268" />
+    <svg:linearGradient
+       id="linearGradient3428-819">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25058" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25060" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3488-129"
+       id="linearGradient12813-439"
+       y2="78.337875"
+       x2="150.18037"
+       y1="216.26877"
+       x1="75.485207" />
+    <svg:linearGradient
+       id="linearGradient3488-129">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25064" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25066" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter3500">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0208063"
+         id="feGaussianBlur3502" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3534-828"
+       id="linearGradient12815-363"
+       y2="140.30176"
+       x2="114.70522"
+       y1="55.91547"
+       x1="81.348701" />
+    <svg:linearGradient
+       id="linearGradient3534-828">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25070" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25072" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter3530">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0172855"
+         id="feGaussianBlur3532" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="matrix(0.3059451,-0.02958628,0.04222916,0.3111526,-530.12905,-128.33652)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient2395-508"
+       id="linearGradient12765-348"
+       y2="77.315956"
+       x2="274.42526"
+       y1="352.40601"
+       x1="218.05919" />
+    <svg:linearGradient
+       id="linearGradient2395-508">
+      <svg:stop
+         offset="0"
+         style="stop-color:#909090;stop-opacity:1"
+         id="stop25244" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#d8d8d8;stop-opacity:1"
+         id="stop25246" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3314-901"
+       id="linearGradient12767-264"
+       y2="167.01372"
+       x2="115.25708"
+       y1="40.43428"
+       x1="46.210991" />
+    <svg:linearGradient
+       id="linearGradient3314-901">
+      <svg:stop
+         offset="0"
+         style="stop-color:#414141;stop-opacity:1"
+         id="stop25250" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#6b6b6b;stop-opacity:1"
+         id="stop25252" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1,0,0,0.6634183,-549.10198,-146.13056)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3445-188"
+       id="linearGradient12769-517"
+       y2="166.59012"
+       x2="140.07268"
+       y1="-126.40256"
+       x1="79.24601" />
+    <svg:linearGradient
+       id="linearGradient3445-188">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25256" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25258" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3368-577"
+       id="linearGradient12771-770"
+       y2="-160.22696"
+       x2="-89.16851"
+       y1="111.33359"
+       x1="-52.615292" />
+    <svg:linearGradient
+       id="linearGradient3368-577">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25262" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25264" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter25901"
+       x="-0.11909245"
+       width="1.2381849"
+       y="-0.021204988"
+       height="1.04241">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.81591018"
+         id="feGaussianBlur25903" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3354-711"
+       id="linearGradient12773-111"
+       y2="94.389671"
+       x2="50.208416"
+       y1="38.274925"
+       x1="122.18343" />
+    <svg:linearGradient
+       id="linearGradient3354-711">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25268" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25270" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter25909"
+       x="-0.012873816"
+       width="1.0257477"
+       y="-0.17679441"
+       height="1.3535888">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.73981434"
+         id="feGaussianBlur25911" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-529.08226,-219.5891)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3548-18"
+       id="linearGradient12775-812"
+       y2="35.082928"
+       x2="26.839462"
+       y1="77.995888"
+       x1="78.742409" />
+    <svg:linearGradient
+       id="linearGradient3548-18">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25274" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25276" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(0.3145759,0.0330998,-0.03170279,0.284888,-530.57037,-223.10227)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient2407-427"
+       id="linearGradient12777-498"
+       y2="778.66467"
+       x2="255.13704"
+       y1="393.5126"
+       x1="664.31964" />
+    <svg:linearGradient
+       id="linearGradient2407-427">
+      <svg:stop
+         offset="0"
+         style="stop-color:#333333;stop-opacity:0.79865772"
+         id="stop25280" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:0.71812081"
+         id="stop25282" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3314-553"
+       id="linearGradient12779-263"
+       y2="56.955963"
+       x2="227.46077"
+       y1="184.17795"
+       x1="-4.7339954" />
+    <svg:linearGradient
+       id="linearGradient3314-553">
+      <svg:stop
+         offset="0"
+         style="stop-color:#414141;stop-opacity:1"
+         id="stop25286" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#6b6b6b;stop-opacity:1"
+         id="stop25288" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3468-786"
+       id="linearGradient12781-589"
+       y2="147.25517"
+       x2="58.94891"
+       y1="97.137428"
+       x1="198.59323" />
+    <svg:linearGradient
+       id="linearGradient3468-786">
+      <svg:stop
+         offset="0"
+         style="stop-color:#d8d8d8;stop-opacity:1"
+         id="stop25292" />
+      <svg:stop
+         offset="0.22455101"
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         id="stop25294" />
+      <svg:stop
+         offset="0.46812087"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25296" />
+      <svg:stop
+         offset="0.76308393"
+         style="stop-color:#f3f3f3;stop-opacity:1"
+         id="stop25298" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1"
+         id="stop25300" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3413-458"
+       id="linearGradient12783-776"
+       y2="102.69514"
+       x2="127.22198"
+       y1="321.58548"
+       x1="-75.3908" />
+    <svg:linearGradient
+       id="linearGradient3413-458">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25304" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25306" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3428-472"
+       id="linearGradient12785-242"
+       y2="103.83543"
+       x2="153.63531"
+       y1="69.702202"
+       x1="150.07268" />
+    <svg:linearGradient
+       id="linearGradient3428-472">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25310" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25312" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3488-487"
+       id="linearGradient12787-407"
+       y2="78.337875"
+       x2="150.18037"
+       y1="216.26877"
+       x1="75.485207" />
+    <svg:linearGradient
+       id="linearGradient3488-487">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25316" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25318" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter25944">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0208063"
+         id="feGaussianBlur25946" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3534-932"
+       id="linearGradient12789-482"
+       y2="140.30176"
+       x2="114.70522"
+       y1="55.91547"
+       x1="81.348701" />
+    <svg:linearGradient
+       id="linearGradient3534-932">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25322" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25324" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter25952">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0172855"
+         id="feGaussianBlur25954" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="matrix(0.3059451,-0.02958628,0.04222916,0.3111526,-530.12905,-128.33652)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3657-198"
+       id="linearGradient12739-593"
+       y2="77.315956"
+       x2="274.42526"
+       y1="352.40601"
+       x1="218.05919" />
+    <svg:linearGradient
+       id="linearGradient3657-198">
+      <svg:stop
+         offset="0"
+         style="stop-color:#cecece;stop-opacity:1"
+         id="stop25076" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ececec;stop-opacity:1"
+         id="stop25078" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3663-72"
+       id="linearGradient12741-226"
+       y2="167.01372"
+       x2="115.25708"
+       y1="40.43428"
+       x1="46.210991" />
+    <svg:linearGradient
+       id="linearGradient3663-72">
+      <svg:stop
+         offset="0"
+         style="stop-color:#6d6d6d;stop-opacity:1"
+         id="stop25082" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#9d9d9d;stop-opacity:1"
+         id="stop25084" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1,0,0,0.6634183,-549.10198,-146.13056)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3445-578"
+       id="linearGradient12743-431"
+       y2="166.59012"
+       x2="140.07268"
+       y1="-126.40256"
+       x1="79.24601" />
+    <svg:linearGradient
+       id="linearGradient3445-578">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25088" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25090" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3368-339"
+       id="linearGradient12745-587"
+       y2="-160.22696"
+       x2="-89.16851"
+       y1="111.33359"
+       x1="-52.615292" />
+    <svg:linearGradient
+       id="linearGradient3368-339">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25094" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25096" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter25972"
+       x="-0.11909245"
+       width="1.2381849"
+       y="-0.021204988"
+       height="1.04241">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.81591018"
+         id="feGaussianBlur25974" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3354-12"
+       id="linearGradient12747-971"
+       y2="94.389671"
+       x2="50.208416"
+       y1="38.274925"
+       x1="122.18343" />
+    <svg:linearGradient
+       id="linearGradient3354-12">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25100" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25102" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter25980"
+       x="-0.012873816"
+       width="1.0257477"
+       y="-0.17679441"
+       height="1.3535888">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.73981434"
+         id="feGaussianBlur25982" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-529.08226,-219.5891)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3548-575"
+       id="linearGradient12749-685"
+       y2="35.082928"
+       x2="26.839462"
+       y1="77.995888"
+       x1="78.742409" />
+    <svg:linearGradient
+       id="linearGradient3548-575">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25106" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25108" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(0.3145759,0.0330998,-0.03170279,0.284888,-530.57037,-223.10227)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3675-240"
+       id="linearGradient12751-417"
+       y2="778.66467"
+       x2="255.13704"
+       y1="393.5126"
+       x1="664.31964" />
+    <svg:linearGradient
+       id="linearGradient3675-240">
+      <svg:stop
+         offset="0"
+         style="stop-color:#656565;stop-opacity:0.80000001"
+         id="stop25112" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#d3d3d3;stop-opacity:0.71764708"
+         id="stop25114" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3669-629"
+       id="linearGradient12753-131"
+       y2="56.955963"
+       x2="227.46077"
+       y1="184.17795"
+       x1="-4.7339954" />
+    <svg:linearGradient
+       id="linearGradient3669-629">
+      <svg:stop
+         offset="0"
+         style="stop-color:#6d6d6d;stop-opacity:1"
+         id="stop25118" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#9d9d9d;stop-opacity:1"
+         id="stop25120" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3468-307"
+       id="linearGradient12755-290"
+       y2="147.25517"
+       x2="58.94891"
+       y1="97.137428"
+       x1="198.59323" />
+    <svg:linearGradient
+       id="linearGradient3468-307">
+      <svg:stop
+         offset="0"
+         style="stop-color:#d8d8d8;stop-opacity:1"
+         id="stop25124" />
+      <svg:stop
+         offset="0.22455101"
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         id="stop25126" />
+      <svg:stop
+         offset="0.46812087"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25128" />
+      <svg:stop
+         offset="0.76308393"
+         style="stop-color:#f3f3f3;stop-opacity:1"
+         id="stop25130" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1"
+         id="stop25132" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3413-539"
+       id="linearGradient12757-2"
+       y2="102.69514"
+       x2="127.22198"
+       y1="321.58548"
+       x1="-75.3908" />
+    <svg:linearGradient
+       id="linearGradient3413-539">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25136" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25138" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3428-823"
+       id="linearGradient12759-42"
+       y2="100.83543"
+       x2="153.63531"
+       y1="69.702202"
+       x1="148.07268" />
+    <svg:linearGradient
+       id="linearGradient3428-823">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25142" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25144" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3488-309"
+       id="linearGradient12761-145"
+       y2="78.337875"
+       x2="150.18037"
+       y1="216.26877"
+       x1="75.485207" />
+    <svg:linearGradient
+       id="linearGradient3488-309">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25148" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25150" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter26015">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0208063"
+         id="feGaussianBlur26017" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3534-534"
+       id="linearGradient12763-439"
+       y2="140.30176"
+       x2="114.70522"
+       y1="55.91547"
+       x1="81.348701" />
+    <svg:linearGradient
+       id="linearGradient3534-534">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25154" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25156" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter26023">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0172855"
+         id="feGaussianBlur26025" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="matrix(0.3059451,-0.02958628,0.04222916,0.3111526,-530.12905,-128.33652)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3793-935"
+       id="linearGradient12713-966"
+       y2="77.315956"
+       x2="274.42526"
+       y1="352.40601"
+       x1="218.05919" />
+    <svg:linearGradient
+       id="linearGradient3793-935">
+      <svg:stop
+         offset="0"
+         style="stop-color:#8b8b8b;stop-opacity:1"
+         id="stop25160" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#e6e6e6;stop-opacity:1"
+         id="stop25162" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3811-283"
+       id="linearGradient12715-867"
+       y2="167.01372"
+       x2="115.25708"
+       y1="40.43428"
+       x1="46.210991" />
+    <svg:linearGradient
+       id="linearGradient3811-283">
+      <svg:stop
+         offset="0"
+         style="stop-color:#626262;stop-opacity:1"
+         id="stop25166" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#8b8b8b;stop-opacity:1"
+         id="stop25168" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1,0,0,0.6634183,-549.10198,-146.13056)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3445-535"
+       id="linearGradient12717-496"
+       y2="166.59012"
+       x2="140.07268"
+       y1="-126.40256"
+       x1="79.24601" />
+    <svg:linearGradient
+       id="linearGradient3445-535">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25172" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25174" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3368-381"
+       id="linearGradient12719-650"
+       y2="-160.22696"
+       x2="-89.16851"
+       y1="111.33359"
+       x1="-52.615292" />
+    <svg:linearGradient
+       id="linearGradient3368-381">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25178" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25180" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter26043"
+       x="-0.11909245"
+       width="1.2381849"
+       y="-0.021204988"
+       height="1.04241">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.81591018"
+         id="feGaussianBlur26045" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3354-298"
+       id="linearGradient12721-760"
+       y2="94.389671"
+       x2="50.208416"
+       y1="38.274925"
+       x1="122.18343" />
+    <svg:linearGradient
+       id="linearGradient3354-298">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25184" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25186" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter26051"
+       x="-0.012873816"
+       width="1.0257477"
+       y="-0.17679441"
+       height="1.3535888">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.73981434"
+         id="feGaussianBlur26053" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-529.08226,-219.5891)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3548-598"
+       id="linearGradient12723-193"
+       y2="35.082928"
+       x2="26.839462"
+       y1="77.995888"
+       x1="78.742409" />
+    <svg:linearGradient
+       id="linearGradient3548-598">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25190" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25192" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(0.3145759,0.03309979,-0.03170279,0.284888,-530.57037,-223.10227)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3799-850"
+       id="linearGradient12725-103"
+       y2="778.66467"
+       x2="255.13704"
+       y1="393.5126"
+       x1="664.31964" />
+    <svg:linearGradient
+       id="linearGradient3799-850">
+      <svg:stop
+         offset="0"
+         style="stop-color:#575757;stop-opacity:0.80000001"
+         id="stop25196" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#cacaca;stop-opacity:0.71764708"
+         id="stop25198" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3805-594"
+       id="linearGradient12727-64"
+       y2="56.955963"
+       x2="227.46077"
+       y1="184.17795"
+       x1="-4.7339954" />
+    <svg:linearGradient
+       id="linearGradient3805-594">
+      <svg:stop
+         offset="0"
+         style="stop-color:#626262;stop-opacity:1"
+         id="stop25202" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1"
+         id="stop25204" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3468-300"
+       id="linearGradient12729-961"
+       y2="147.25517"
+       x2="58.94891"
+       y1="97.137428"
+       x1="198.59323" />
+    <svg:linearGradient
+       id="linearGradient3468-300">
+      <svg:stop
+         offset="0"
+         style="stop-color:#d8d8d8;stop-opacity:1"
+         id="stop25208" />
+      <svg:stop
+         offset="0.22455101"
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         id="stop25210" />
+      <svg:stop
+         offset="0.46812087"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25212" />
+      <svg:stop
+         offset="0.76308393"
+         style="stop-color:#f3f3f3;stop-opacity:1"
+         id="stop25214" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1"
+         id="stop25216" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3413-228"
+       id="linearGradient12731-592"
+       y2="102.69514"
+       x2="127.22198"
+       y1="321.58548"
+       x1="-75.3908" />
+    <svg:linearGradient
+       id="linearGradient3413-228">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25220" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25222" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3428-729"
+       id="linearGradient12733-615"
+       y2="103.83543"
+       x2="153.63531"
+       y1="69.702202"
+       x1="150.07268" />
+    <svg:linearGradient
+       id="linearGradient3428-729">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25226" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25228" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3488-507"
+       id="linearGradient12735-434"
+       y2="78.337875"
+       x2="150.18037"
+       y1="216.26877"
+       x1="75.485207" />
+    <svg:linearGradient
+       id="linearGradient3488-507">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25232" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25234" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter26086">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0208063"
+         id="feGaussianBlur26088" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3534-930"
+       id="linearGradient12737-285"
+       y2="140.30176"
+       x2="114.70522"
+       y1="55.91547"
+       x1="81.348701" />
+    <svg:linearGradient
+       id="linearGradient3534-930">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25238" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25240" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter26094">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0172855"
+         id="feGaussianBlur26096" />
+    </svg:filter>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3314-553"
+       id="linearGradient26843"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3488-487"
+       id="linearGradient26851"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="75.485207"
+       y1="216.26877"
+       x2="150.18037"
+       y2="78.337875" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3534-932"
+       id="linearGradient26853"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="81.348701"
+       y1="55.91547"
+       x2="114.70522"
+       y2="140.30176" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3368-577"
+       id="linearGradient26874"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       x1="-52.615292"
+       y1="111.33359"
+       x2="-89.16851"
+       y2="-160.22696" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3354-711"
+       id="linearGradient26876"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="122.18343"
+       y1="38.274925"
+       x2="50.208416"
+       y2="94.389671" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3445-188"
+       id="linearGradient26886"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.18994435,0,0,0.16452554,31.594971,31.888277)"
+       x1="79.24601"
+       y1="-126.40256"
+       x2="140.07268"
+       y2="166.59012" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2395-508"
+       id="linearGradient26889"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.05811254,-0.0073373,0.00802119,0.07716481,35.198772,36.30114)"
+       x1="218.05919"
+       y1="352.40601"
+       x2="274.42526"
+       y2="77.315956" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3314-901"
+       id="linearGradient26891"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.18994435,0,0,0.24799668,31.594971,27.654967)"
+       x1="46.210991"
+       y1="40.43428"
+       x2="115.25708"
+       y2="167.01372" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3805-594"
+       id="linearGradient26922"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3488-507"
+       id="linearGradient26930"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="75.485207"
+       y1="216.26877"
+       x2="150.18037"
+       y2="78.337875" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3534-930"
+       id="linearGradient26932"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="81.348701"
+       y1="55.91547"
+       x2="114.70522"
+       y2="140.30176" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3368-381"
+       id="linearGradient26953"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       x1="-52.615292"
+       y1="111.33359"
+       x2="-89.16851"
+       y2="-160.22696" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3354-298"
+       id="linearGradient26955"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="122.18343"
+       y1="38.274925"
+       x2="50.208416"
+       y2="94.389671" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3445-535"
+       id="linearGradient26965"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1900317,0,0,0.16452554,2.9420173,11.476195)"
+       x1="79.24601"
+       y1="-126.40256"
+       x2="140.07268"
+       y2="166.59012" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3793-935"
+       id="linearGradient26968"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.05813927,-0.0073373,0.00802488,0.07716481,6.5474754,15.889058)"
+       x1="218.05919"
+       y1="352.40601"
+       x2="274.42526"
+       y2="77.315956" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3811-283"
+       id="linearGradient26970"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1900317,0,0,0.24799668,2.9420173,7.2428845)"
+       x1="46.210991"
+       y1="40.43428"
+       x2="115.25708"
+       y2="167.01372" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3368-381"
+       id="linearGradient27871"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       x1="-52.615292"
+       y1="111.33359"
+       x2="-89.16851"
+       y2="-160.22696" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3793-935"
+       id="linearGradient27873"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.05813927,-0.0073373,0.00802488,0.07716481,6.5474754,15.889058)"
+       x1="218.05919"
+       y1="352.40601"
+       x2="274.42526"
+       y2="77.315956" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3811-283"
+       id="linearGradient27875"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1900317,0,0,0.24799668,2.9420173,7.2428845)"
+       x1="46.210991"
+       y1="40.43428"
+       x2="115.25708"
+       y2="167.01372" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3445-535"
+       id="linearGradient27877"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1900317,0,0,0.16452554,2.9420173,11.476195)"
+       x1="79.24601"
+       y1="-126.40256"
+       x2="140.07268"
+       y2="166.59012" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3354-298"
+       id="linearGradient27879"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="122.18343"
+       y1="38.274925"
+       x2="50.208416"
+       y2="94.389671" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3805-594"
+       id="linearGradient27881"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3488-507"
+       id="linearGradient27883"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="75.485207"
+       y1="216.26877"
+       x2="150.18037"
+       y2="78.337875" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3534-930"
+       id="linearGradient27885"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="81.348701"
+       y1="55.91547"
+       x2="114.70522"
+       y2="140.30176" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3805-594"
+       id="linearGradient28668"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3488-507"
+       id="linearGradient28670"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="75.485207"
+       y1="216.26877"
+       x2="150.18037"
+       y2="78.337875" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3534-930"
+       id="linearGradient28672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="81.348701"
+       y1="55.91547"
+       x2="114.70522"
+       y2="140.30176" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3805-594"
+       id="linearGradient28680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.27364565,0,0,0.35711522,-1.6488282,-0.9837456)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3793-935"
+       id="linearGradient28682"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.05813927,-0.0073373,0.00802488,0.07716481,6.5474754,15.889058)"
+       x1="218.05919"
+       y1="352.40601"
+       x2="274.42526"
+       y2="77.315956" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3811-283"
+       id="linearGradient28684"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1900317,0,0,0.24799668,2.9420173,7.2428845)"
+       x1="46.210991"
+       y1="40.43428"
+       x2="115.25708"
+       y2="167.01372" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3445-535"
+       id="linearGradient28686"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1900317,0,0,0.16452554,2.9420173,11.476195)"
+       x1="79.24601"
+       y1="-126.40256"
+       x2="140.07268"
+       y2="166.59012" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3354-298"
+       id="linearGradient28688"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="122.18343"
+       y1="38.274925"
+       x2="50.208416"
+       y2="94.389671" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3445-535"
+       id="linearGradient28693"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.27364565,0,0,0.23691678,-1.6488294,5.1122218)"
+       x1="79.24601"
+       y1="-126.40256"
+       x2="140.07268"
+       y2="166.59012" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3793-935"
+       id="linearGradient28696"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08372055,-0.01056571,0.01155583,0.11111733,3.5430303,11.466745)"
+       x1="218.05919"
+       y1="352.40601"
+       x2="274.42526"
+       y2="77.315956" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3811-283"
+       id="linearGradient28698"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.27364565,0,0,0.35711522,-1.6488294,-0.98374532)"
+       x1="46.210991"
+       y1="40.43428"
+       x2="115.25708"
+       y2="167.01372" />
+    <svg:linearGradient
+       gradientTransform="matrix(0.3059451,-0.02958628,0.04222916,0.3111526,-530.12905,-128.33652)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3657-198-7"
+       id="linearGradient12739-593-9"
+       y2="77.315956"
+       x2="274.42526"
+       y1="352.40601"
+       x1="218.05919" />
+    <svg:linearGradient
+       id="linearGradient3657-198-7">
+      <svg:stop
+         offset="0"
+         style="stop-color:#cecece;stop-opacity:1"
+         id="stop25076-2" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ececec;stop-opacity:1"
+         id="stop25078-1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3663-72-4"
+       id="linearGradient12741-226-3"
+       y2="167.01372"
+       x2="115.25708"
+       y1="40.43428"
+       x1="46.210991" />
+    <svg:linearGradient
+       id="linearGradient3663-72-4">
+      <svg:stop
+         offset="0"
+         style="stop-color:#6d6d6d;stop-opacity:1"
+         id="stop25082-6" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#9d9d9d;stop-opacity:1"
+         id="stop25084-2" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1,0,0,0.6634183,-549.10198,-146.13056)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3445-578-8"
+       id="linearGradient12743-431-4"
+       y2="166.59012"
+       x2="140.07268"
+       y1="-126.40256"
+       x1="79.24601" />
+    <svg:linearGradient
+       id="linearGradient3445-578-8">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25088-2" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25090-7" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3368-339-0"
+       id="linearGradient12745-587-1"
+       y2="-160.22696"
+       x2="-89.16851"
+       y1="111.33359"
+       x1="-52.615292" />
+    <svg:linearGradient
+       id="linearGradient3368-339-0">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25094-6" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25096-2" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter3384-8"
+       x="-0.11909245"
+       width="1.2381849"
+       y="-0.021204988"
+       height="1.04241">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.81591018"
+         id="feGaussianBlur3386-2" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3354-12-2"
+       id="linearGradient12747-971-3"
+       y2="94.389671"
+       x2="50.208416"
+       y1="38.274925"
+       x1="122.18343" />
+    <svg:linearGradient
+       id="linearGradient3354-12-2">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25100-2" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25102-8" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter3342-6"
+       x="-0.012873816"
+       width="1.0257477"
+       y="-0.17679441"
+       height="1.3535888">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.73981434"
+         id="feGaussianBlur3344-8" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-529.08226,-219.5891)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3548-575-3"
+       id="linearGradient12749-685-1"
+       y2="35.082928"
+       x2="26.839462"
+       y1="77.995888"
+       x1="78.742409" />
+    <svg:linearGradient
+       id="linearGradient3548-575-3">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25106-0" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25108-8" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="matrix(0.3145759,0.0330998,-0.03170279,0.284888,-530.57037,-223.10227)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3675-240-8"
+       id="linearGradient12751-417-4"
+       y2="778.66467"
+       x2="255.13704"
+       y1="393.5126"
+       x1="664.31964" />
+    <svg:linearGradient
+       id="linearGradient3675-240-8">
+      <svg:stop
+         offset="0"
+         style="stop-color:#656565;stop-opacity:0.80000001"
+         id="stop25112-6" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#d3d3d3;stop-opacity:0.71764708"
+         id="stop25114-3" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3669-629-8"
+       id="linearGradient12753-131-5"
+       y2="56.955963"
+       x2="227.46077"
+       y1="184.17795"
+       x1="-4.7339954" />
+    <svg:linearGradient
+       id="linearGradient3669-629-8">
+      <svg:stop
+         offset="0"
+         style="stop-color:#6d6d6d;stop-opacity:1"
+         id="stop25118-7" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#9d9d9d;stop-opacity:1"
+         id="stop25120-8" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3468-307-3"
+       id="linearGradient12755-290-3"
+       y2="147.25517"
+       x2="58.94891"
+       y1="97.137428"
+       x1="198.59323" />
+    <svg:linearGradient
+       id="linearGradient3468-307-3">
+      <svg:stop
+         offset="0"
+         style="stop-color:#d8d8d8;stop-opacity:1"
+         id="stop25124-0" />
+      <svg:stop
+         offset="0.22455101"
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         id="stop25126-7" />
+      <svg:stop
+         offset="0.46812087"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25128-3" />
+      <svg:stop
+         offset="0.76308393"
+         style="stop-color:#f3f3f3;stop-opacity:1"
+         id="stop25130-2" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1"
+         id="stop25132-6" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3413-539-5"
+       id="linearGradient12757-2-4"
+       y2="102.69514"
+       x2="127.22198"
+       y1="321.58548"
+       x1="-75.3908" />
+    <svg:linearGradient
+       id="linearGradient3413-539-5">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25136-2" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25138-7" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3428-823-6"
+       id="linearGradient12759-42-5"
+       y2="100.83543"
+       x2="153.63531"
+       y1="69.702202"
+       x1="148.07268" />
+    <svg:linearGradient
+       id="linearGradient3428-823-6">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25142-0" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25144-7" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3488-309-1"
+       id="linearGradient12761-145-8"
+       y2="78.337875"
+       x2="150.18037"
+       y1="216.26877"
+       x1="75.485207" />
+    <svg:linearGradient
+       id="linearGradient3488-309-1">
+      <svg:stop
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop25148-5" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0"
+         id="stop25150-7" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter3500-2">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0208063"
+         id="feGaussianBlur3502-8" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="translate(-549.10198,-163.20059)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient3534-534-2"
+       id="linearGradient12763-439-9"
+       y2="140.30176"
+       x2="114.70522"
+       y1="55.91547"
+       x1="81.348701" />
+    <svg:linearGradient
+       id="linearGradient3534-534-2">
+      <svg:stop
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1"
+         id="stop25154-5" />
+      <svg:stop
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0"
+         id="stop25156-7" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       id="filter3530-8">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0172855"
+         id="feGaussianBlur3532-0" />
+    </svg:filter>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3657-198-7"
+       id="linearGradient28968"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3059451,-0.02958628,0.04222916,0.3111526,-530.12905,-128.33652)"
+       x1="218.05919"
+       y1="352.40601"
+       x2="274.42526"
+       y2="77.315956" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3663-72-4"
+       id="linearGradient28970"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="46.210991"
+       y1="40.43428"
+       x2="115.25708"
+       y2="167.01372" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3445-578-8"
+       id="linearGradient28972"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.6634183,-549.10198,-146.13056)"
+       x1="79.24601"
+       y1="-126.40256"
+       x2="140.07268"
+       y2="166.59012" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3368-339-0"
+       id="linearGradient28974"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       x1="-52.615292"
+       y1="111.33359"
+       x2="-89.16851"
+       y2="-160.22696" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3354-12-2"
+       id="linearGradient28976"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="122.18343"
+       y1="38.274925"
+       x2="50.208416"
+       y2="94.389671" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3548-575-3"
+       id="linearGradient28978"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-529.08226,-219.5891)"
+       x1="78.742409"
+       y1="77.995888"
+       x2="26.839462"
+       y2="35.082928" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3675-240-8"
+       id="linearGradient28980"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3145759,0.0330998,-0.03170279,0.284888,-530.57037,-223.10227)"
+       x1="664.31964"
+       y1="393.5126"
+       x2="255.13704"
+       y2="778.66467" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3669-629-8"
+       id="linearGradient28982"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3468-307-3"
+       id="linearGradient28984"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="198.59323"
+       y1="97.137428"
+       x2="58.94891"
+       y2="147.25517" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3413-539-5"
+       id="linearGradient28986"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-75.3908"
+       y1="321.58548"
+       x2="127.22198"
+       y2="102.69514" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3428-823-6"
+       id="linearGradient28988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="148.07268"
+       y1="69.702202"
+       x2="153.63531"
+       y2="100.83543" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3488-309-1"
+       id="linearGradient28990"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="75.485207"
+       y1="216.26877"
+       x2="150.18037"
+       y2="78.337875" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3534-534-2"
+       id="linearGradient28992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="81.348701"
+       y1="55.91547"
+       x2="114.70522"
+       y2="140.30176" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3657-198-7"
+       id="linearGradient29009"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3059451,-0.02958628,0.04222916,0.3111526,-530.12905,-128.33652)"
+       x1="218.05919"
+       y1="352.40601"
+       x2="274.42526"
+       y2="77.315956" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3663-72-4"
+       id="linearGradient29011"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="46.210991"
+       y1="40.43428"
+       x2="115.25708"
+       y2="167.01372" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3445-578-8"
+       id="linearGradient29013"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.6634183,-549.10198,-146.13056)"
+       x1="79.24601"
+       y1="-126.40256"
+       x2="140.07268"
+       y2="166.59012" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3368-339-0"
+       id="linearGradient29015"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0010993,0,0,0.9771436,-428.22672,-61.489698)"
+       x1="-52.615292"
+       y1="111.33359"
+       x2="-89.16851"
+       y2="-160.22696" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3354-12-2"
+       id="linearGradient29017"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="122.18343"
+       y1="38.274925"
+       x2="50.208416"
+       y2="94.389671" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3548-575-3"
+       id="linearGradient29019"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-529.08226,-219.5891)"
+       x1="78.742409"
+       y1="77.995888"
+       x2="26.839462"
+       y2="35.082928" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3675-240-8"
+       id="linearGradient29021"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3145759,0.0330998,-0.03170279,0.284888,-530.57037,-223.10227)"
+       x1="664.31964"
+       y1="393.5126"
+       x2="255.13704"
+       y2="778.66467" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3669-629-8"
+       id="linearGradient29023"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3468-307-3"
+       id="linearGradient29025"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="198.59323"
+       y1="97.137428"
+       x2="58.94891"
+       y2="147.25517" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3413-539-5"
+       id="linearGradient29027"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-75.3908"
+       y1="321.58548"
+       x2="127.22198"
+       y2="102.69514" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3428-823-6"
+       id="linearGradient29029"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="148.07268"
+       y1="69.702202"
+       x2="153.63531"
+       y2="100.83543" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3488-309-1"
+       id="linearGradient29031"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="75.485207"
+       y1="216.26877"
+       x2="150.18037"
+       y2="78.337875" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3534-534-2"
+       id="linearGradient29033"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="81.348701"
+       y1="55.91547"
+       x2="114.70522"
+       y2="140.30176" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3675-240-8"
+       id="linearGradient29048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3145759,0.0330998,-0.03170279,0.284888,-530.57037,-223.10227)"
+       x1="664.31964"
+       y1="393.5126"
+       x2="255.13704"
+       y2="778.66467" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3669-629-8"
+       id="linearGradient29050"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3468-307-3"
+       id="linearGradient29052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="198.59323"
+       y1="97.137428"
+       x2="58.94891"
+       y2="147.25517" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3413-539-5"
+       id="linearGradient29054"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="-75.3908"
+       y1="321.58548"
+       x2="127.22198"
+       y2="102.69514" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3428-823-6"
+       id="linearGradient29056"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="148.07268"
+       y1="69.702202"
+       x2="153.63531"
+       y2="100.83543" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3488-309-1"
+       id="linearGradient29058"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="75.485207"
+       y1="216.26877"
+       x2="150.18037"
+       y2="78.337875" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3534-534-2"
+       id="linearGradient29060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-549.10198,-163.20059)"
+       x1="81.348701"
+       y1="55.91547"
+       x2="114.70522"
+       y2="140.30176" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3428-823-6"
+       id="linearGradient29065"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.26261524,0,0,0.34283061,4.6269017,0.49560418)"
+       x1="148.07268"
+       y1="69.702202"
+       x2="153.63531"
+       y2="100.83543" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3468-307-3"
+       id="linearGradient29071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.26261524,0,0,0.34283061,4.6269017,0.49560418)"
+       x1="198.59323"
+       y1="97.137428"
+       x2="58.94891"
+       y2="147.25517" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3675-240-8"
+       id="linearGradient29074"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08261243,0.01134762,-0.00832564,0.09766833,9.4935849,-20.040525)"
+       x1="664.31964"
+       y1="393.5126"
+       x2="255.13704"
+       y2="778.66467" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3669-629-8"
+       id="linearGradient29076"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.26261524,0,0,0.34283061,4.6269017,0.49560418)"
+       x1="-4.7339954"
+       y1="184.17795"
+       x2="227.46077"
+       y2="56.955963" />
+  </svg:defs>
+  <svg:metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </svg:metadata>
+  <svg:g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <svg:rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </svg:g>
+  <svg:g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </svg:g>
+  <svg:g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <svg:rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <svg:rect
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <svg:rect
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </svg:g>
+  <svg:g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <svg:rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </svg:g>
+  <svg:g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <svg:rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </svg:g>
+  <svg:g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <svg:rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <svg:text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><svg:tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</svg:tspan></svg:text>
+    <svg:rect
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <svg:text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><svg:tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</svg:tspan></svg:text>
+    <svg:text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><svg:tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</svg:tspan></svg:text>
+    <svg:rect
+       style="fill:none;stroke:none"
+       id="rect12363"
+       y="13.430106"
+       x="8.172884"
+       ry="0.38278621"
+       height="36.864002"
+       width="36.864002" />
+    <svg:g
+       transform="matrix(0.26261524,0,0,0.34283061,148.82945,56.445762)"
+       id="g12369-7">
+      <svg:path
+         d="m -506.24217,-108.72388 42.28113,-4.08877 c 2.88869,-0.26972 4.25075,0.75289 4.69767,3.33523 l 0.74041,5.1659 85.6662,-8.28431 c 1.47718,-0.14285 2.83053,0.95159 3.03441,2.45391 l 10.67306,78.641102 c 0.20389,1.50232 -0.82117,2.82676 -2.29834,2.96961 l -132.17616,12.78204 c -1.47717,0.14285 -2.83052,-0.9516 -3.03441,-2.45392 l -11.88231,-87.551182 c -0.2039,-1.50231 0.82116,-2.82676 2.29834,-2.96961 z"
+         id="path12371-0"
+         style="fill:url(#linearGradient29009);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient29011);stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         inkscape:connector-curvature="0" />
+      <svg:path
+         d="m -462.97698,-112.48281 c -0.31457,-0.005 -0.63891,-0.002 -1,0.0207 l -42.28125,2.71587 c -1.47718,0.0948 -2.5164,0.97286 -2.3125,1.96952 l 7.58461,38.829795 c 10.61832,-6.465689 25.43361,-17.117156 46.54039,-19.010174 41.25487,-3.661636 62.90075,-10.743224 84.70197,-15.202531 l -0.10822,-7.51954 c -0.20388,-0.99667 -1.55408,-1.73258 -3.03125,-1.63782 l -85.65625,5.49394 -0.75,-3.42076 c -0.39105,-1.49902 -1.48548,-2.20563 -3.6875,-2.23903 z"
+         id="path12373-2"
+         style="opacity:0.32113821;fill:url(#linearGradient29013);fill-opacity:1;fill-rule:nonzero;stroke:none"
+         inkscape:connector-curvature="0" />
+      <svg:path
+         d="m -492.3596,-17.090788 c -1.47879,0.13958 -2.83364,-0.92985 -3.03775,-2.39784 l -11.89537,-85.550072 c -0.20413,-1.46797 0.82206,-2.76215 2.30087,-2.90173"
+         id="path12375-1"
+         style="fill:none;stroke:url(#linearGradient29015);stroke-width:1.48357332;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3384-8)"
+         inkscape:connector-curvature="0" />
+      <svg:path
+         d="m -507.12798,-107.50386 42.28113,-4.08878 c 2.88869,-0.26971 4.25075,0.7529 4.69767,3.33524 l 0.74041,5.16589 85.6662,-8.28431 c 1.47718,-0.14285 2.83053,0.9516 3.03441,2.45392"
+         id="path12377-3"
+         style="fill:none;stroke:url(#linearGradient29017);stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3342-6)"
+         inkscape:connector-curvature="0" />
+      <svg:rect
+         width="41.653458"
+         height="6.7793374"
+         ry="1.332105"
+         x="-490.92169"
+         y="-157.32867"
+         transform="matrix(0.9945444,-0.1043137,0.1043137,0.9945444,0,0)"
+         id="rect12379-1"
+         style="opacity:0.85772358;fill:url(#linearGradient29019);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </svg:g>
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="fill:url(#linearGradient29074);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient29076);stroke-width:0.45008135;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path12383-7"
+       d="m 23.45685,28.725779 35.437934,-4.587207 c 0.392055,-0.05048 0.587877,0.236191 0.439064,0.642753 l -4.133047,21.173742 c -0.148821,0.406566 -0.584251,0.774509 -0.976309,0.824988 L 19.143574,51.29691 c -0.392059,0.05048 -0.587878,-0.236193 -0.439062,-0.64276 l 3.776029,-21.103384 c 0.148819,-0.406562 0.584256,-0.774509 0.976309,-0.824987 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.8048782;fill:url(#linearGradient29071);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="path12385-7"
+       d="m 56.78051,37.003167 c -11.570643,1.526745 -26.774708,3.52266 -36.052145,4.692494 l -1.551072,8.645759 c -0.146405,0.399974 0.04926,0.681753 0.434957,0.632094 L 54.121531,46.52743 c 0.385701,-0.04966 0.813779,-0.414246 0.960187,-0.814223 l 1.698792,-8.71004 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.82113820999999998;fill:#2aff2a;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="path12387-1"
+       d="m 23.634557,28.985867 34.863307,-4.512825 c 0.385696,-0.04966 0.578342,0.232361 0.431942,0.63233 L 54.863779,45.93578 c -0.146411,0.399977 -0.574778,0.761954 -0.960478,0.811613 L 19.39122,51.191006 c -0.385698,0.04966 -0.578342,-0.232364 -0.431939,-0.632337 l 3.714797,-20.761193 c 0.146408,-0.399969 0.574784,-0.76195 0.960479,-0.811609 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.51626012;fill:url(#linearGradient29065);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="path12389-2"
+       d="m 58.717434,24.397326 -34.862173,4.510366 c -0.385695,0.04966 -0.813779,0.414253 -0.960187,0.814222 l -2.125542,11.87051 C 25.358366,38.844596 30.535739,36.640301 34.999996,36 44.98282,34.568186 51.913213,33.759361 58.60254,27.814919 l 0.541644,-2.785499 c 0.1464,-0.399969 -0.04105,-0.681756 -0.42675,-0.632094 z" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:url(#linearGradient29058);stroke-width:1.46685326;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3500-2)"
+       id="path12391-2"
+       d="m -357.24772,-31.250098 c -0.55985,1.14794 -2.19787,2.18683 -3.67274,2.32935 l -131.97004,12.75331 c -1.47487,0.14253 -2.21152,-0.66689 -1.65169,-1.81483 l 14.20495,-59.585281 c 0.55984,-1.147928 2.19789,-2.186823 3.67275,-2.329349"
+       transform="matrix(0.26261524,0,0,0.34283061,148.82945,56.445762)" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:url(#linearGradient29060);stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3530-8)"
+       id="path12393-0"
+       d="m -478.56891,-79.880323 134.9424,-13.380389 c 1.49289,-0.147243 2.23855,0.688943 1.67189,1.874841 l -15.73803,61.761523"
+       transform="matrix(0.26261524,0,0,0.34283061,148.82945,56.445762)" />
+    <svg:rect
+       style="fill:none;stroke:none"
+       id="rect12395-0"
+       y="9.0488176"
+       x="11.847516"
+       ry="0.52916366"
+       height="50.960796"
+       width="50.960796" />
+    <svg:rect
+       style="fill:none;stroke:none"
+       id="rect12427"
+       y="32.710079"
+       x="36.814957"
+       ry="0.38278621"
+       height="36.864002"
+       width="36.864002" />
+    <svg:rect
+       style="fill:none;stroke:none"
+       id="rect12459"
+       y="44.135998"
+       x="54.136002"
+       ry="0.38278621"
+       height="36.864002"
+       width="36.864002" />
+    <svg:g
+       transform="matrix(0.34283061,0,0,0.34283061,277.97579,182.18329)"
+       id="g12365">
+      <svg:g
+         transform="matrix(0.7660204,0,0,1,-480.60782,-248.8974)"
+         id="g12367">
+        <svg:g
+           transform="translate(232.79553,-16.624131)"
+           id="g12369">
+          <svg:path
+             d="m -506.24217,-108.72388 42.28113,-4.08877 c 2.88869,-0.26972 4.25075,0.75289 4.69767,3.33523 l 0.74041,5.1659 85.6662,-8.28431 c 1.47718,-0.14285 2.83053,0.95159 3.03441,2.45391 l 10.67306,78.641102 c 0.20389,1.50232 -0.82117,2.82676 -2.29834,2.96961 l -132.17616,12.78204 c -1.47717,0.14285 -2.83052,-0.9516 -3.03441,-2.45392 l -11.88231,-87.551182 c -0.2039,-1.50231 0.82116,-2.82676 2.29834,-2.96961 z"
+             id="path12371"
+             style="fill:url(#linearGradient12739-593);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient12741-226);stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+             inkscape:connector-curvature="0" />
+          <svg:path
+             d="m -462.97698,-112.48281 c -0.31457,-0.005 -0.63891,-0.002 -1,0.0207 l -42.28125,2.71587 c -1.47718,0.0948 -2.5164,0.97286 -2.3125,1.96952 l 7.58461,38.829795 c 10.61832,-6.465689 25.43361,-17.117156 46.54039,-19.010174 41.25487,-3.661636 62.90075,-10.743224 84.70197,-15.202531 l -0.10822,-7.51954 c -0.20388,-0.99667 -1.55408,-1.73258 -3.03125,-1.63782 l -85.65625,5.49394 -0.75,-3.42076 c -0.39105,-1.49902 -1.48548,-2.20563 -3.6875,-2.23903 z"
+             id="path12373"
+             style="opacity:0.32113821;fill:url(#linearGradient12743-431);fill-opacity:1;fill-rule:nonzero;stroke:none"
+             inkscape:connector-curvature="0" />
+          <svg:path
+             d="m -492.3596,-17.090788 c -1.47879,0.13958 -2.83364,-0.92985 -3.03775,-2.39784 l -11.89537,-85.550072 c -0.20413,-1.46797 0.82206,-2.76215 2.30087,-2.90173"
+             id="path12375"
+             style="fill:none;stroke:url(#linearGradient12745-587);stroke-width:1.48357332;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3384)"
+             inkscape:connector-curvature="0" />
+          <svg:path
+             d="m -507.12798,-107.50386 42.28113,-4.08878 c 2.88869,-0.26971 4.25075,0.7529 4.69767,3.33524 l 0.74041,5.16589 85.6662,-8.28431 c 1.47718,-0.14285 2.83053,0.9516 3.03441,2.45392"
+             id="path12377"
+             style="fill:none;stroke:url(#linearGradient12747-971);stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3342)"
+             inkscape:connector-curvature="0" />
+          <svg:rect
+             width="41.653458"
+             height="6.7793374"
+             ry="1.332105"
+             x="-490.92169"
+             y="-157.32867"
+             transform="matrix(0.9945444,-0.1043137,0.1043137,0.9945444,0,0)"
+             id="rect12379"
+             style="opacity:0.85772358;fill:url(#linearGradient12749-685);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+        </svg:g>
+        <svg:g
+           transform="translate(232.79553,-16.624131)"
+           id="g12381">
+          <svg:path
+             d="m -477.40032,-80.856207 134.94241,-13.380389 c 1.49289,-0.147243 2.23855,0.688943 1.67189,1.874841 l -15.73803,61.761527 c -0.56669,1.18591 -2.22474,2.25916 -3.71764,2.4064 l -133.58295,13.17518 c -1.4929,0.14724 -2.23855,-0.68895 -1.67188,-1.87486 l 14.37856,-61.556302 c 0.56668,-1.185897 2.22476,-2.259159 3.71764,-2.406397 z"
+             id="path12383"
+             style="fill:url(#linearGradient12751-417);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient12753-131);stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+             inkscape:connector-curvature="0" />
+          <svg:path
+             d="m -350.50875,-56.711958 c -44.0593,4.45335 -101.95413,10.27522 -137.28124,13.6875 l -5.90625,25.21875 c -0.55749,1.16668 0.18756,1.9886 1.65625,1.84375 l 131.40624,-12.96875 c 1.46869,-0.14485 3.09875,-1.20831 3.65625,-2.375 l 6.46875,-25.40625 z"
+             id="path12385"
+             style="opacity:0.8048782;fill:url(#linearGradient12755-290);fill-opacity:1;fill-rule:nonzero;stroke:none"
+             inkscape:connector-curvature="0" />
+          <svg:path
+             d="m -476.72364,-80.09756 132.75432,-13.163424 c 1.46867,-0.144856 2.20224,0.677771 1.64477,1.84444 l -15.48283,60.760056 c -0.55751,1.16669 -2.18867,2.22254 -3.65736,2.36739 l -131.4169,12.96154 c -1.46868,0.14485 -2.20224,-0.67778 -1.64476,-1.84446 l 14.1454,-60.558164 c 0.5575,-1.166668 2.18869,-2.222527 3.65736,-2.367378 z"
+             id="path12387"
+             style="opacity:0.82113821;fill:url(#linearGradient12757-2);fill-opacity:1;fill-rule:nonzero;stroke:none"
+             inkscape:connector-curvature="0" />
+          <svg:path
+             d="m -343.13323,-93.481838 -132.75,13.15625 c -1.46867,0.144851 -3.09875,1.208331 -3.65625,2.375 l -8.09375,34.625 c 17.4736,-8.01512 37.18827,-14.44481 54.1875,-16.3125 38.01312,-4.176448 64.40303,-6.535702 89.875,-23.875 l 2.0625,-8.125 c 0.55747,-1.166669 -0.15633,-1.988609 -1.625,-1.84375 z"
+             id="path12389"
+             style="opacity:0.51626012;fill:url(#linearGradient12759-42);fill-opacity:1;fill-rule:nonzero;stroke:none"
+             inkscape:connector-curvature="0" />
+          <svg:path
+             d="m -357.24772,-31.250098 c -0.55985,1.14794 -2.19787,2.18683 -3.67274,2.32935 l -131.97004,12.75331 c -1.47487,0.14253 -2.21152,-0.66689 -1.65169,-1.81483 l 14.20495,-59.585281 c 0.55984,-1.147928 2.19789,-2.186823 3.67275,-2.329349"
+             id="path12391"
+             style="fill:none;stroke:url(#linearGradient12761-145);stroke-width:1.46685326;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3500)"
+             inkscape:connector-curvature="0" />
+          <svg:path
+             d="m -478.56891,-79.880323 134.9424,-13.380389 c 1.49289,-0.147243 2.23855,0.688943 1.67189,1.874841 l -15.73803,61.761523"
+             id="path12393"
+             style="fill:none;stroke:url(#linearGradient12763-439);stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3530)"
+             inkscape:connector-curvature="0" />
+        </svg:g>
+      </svg:g>
+      <svg:rect
+         width="148.64716"
+         height="148.64716"
+         ry="1.5435134"
+         x="-701.84326"
+         y="-403.77332"
+         id="rect12395"
+         style="fill:none;stroke:none" />
+    </svg:g>
+  </svg:g>
+</svg:svg>
diff --git a/interface/images/menu/provider.svg b/interface/images/menu/provider.svg
new file mode 100755
index 0000000..00a55a8
--- /dev/null
+++ b/interface/images/menu/provider.svg
@@ -0,0 +1,2182 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="provider.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="15.863342"
+     inkscape:cy="53.378531"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#efefef;stop-opacity:1;" />
+      <stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#a9a9a9;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3737"
+       inkscape:collect="always">
+      <stop
+         id="stop3739"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop3741"
+         offset="1"
+         style="stop-color:#f2f2f2;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2275c3;stop-opacity:1;" />
+      <stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#67b9f3;stop-opacity:1;" />
+    </linearGradient>
+    <filter
+       id="filter3174"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         style="fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843"
+       xlink:href="#linearGradient3700"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <filter
+       id="filter3657"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3"
+       inkscape:collect="always">
+      <stop
+         id="stop3739-6"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop3741-1"
+         offset="1"
+         style="stop-color:#f2f2f2;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#c70000;stop-opacity:1;" />
+      <stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f25f4c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4891"
+       xlink:href="#XMLID_102_"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientUnits="userSpaceOnUse"
+       id="XMLID_102_">
+      <stop
+         id="stop395"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop397"
+         style="stop-color:#000000"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       id="XMLID_103_">
+      <use
+         height="17875.275"
+         width="18121.891"
+         y="0"
+         x="0"
+         id="use411"
+         xlink:href="#XMLID_25_" />
+    </clipPath>
+    <radialGradient
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4893"
+       xlink:href="#XMLID_105_"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       id="XMLID_105_">
+      <stop
+         id="stop436"
+         style="stop-color:#c4c6c7"
+         offset="0" />
+      <stop
+         id="stop438"
+         style="stop-color:#f2f2f2"
+         offset="0.7581" />
+      <stop
+         id="stop440"
+         style="stop-color:#9b9c9e"
+         offset="1" />
+    </radialGradient>
+    <clipPath
+       id="XMLID_104_">
+      <use
+         height="17875.275"
+         width="18121.891"
+         y="0"
+         x="0"
+         id="use433"
+         xlink:href="#XMLID_27_" />
+    </clipPath>
+    <clipPath
+       id="clipPath3807">
+      <use
+         height="17875.275"
+         width="18121.891"
+         y="0"
+         x="0"
+         id="use3809"
+         xlink:href="#XMLID_27_" />
+    </clipPath>
+    <radialGradient
+       r="0.91219997"
+       cy="8721.0361"
+       cx="9320.2285"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4895"
+       xlink:href="#XMLID_106_"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       r="0.91219997"
+       cy="8721.0361"
+       cx="9320.2285"
+       id="XMLID_106_">
+      <stop
+         id="stop491"
+         style="stop-color:#81b725"
+         offset="0.0056" />
+      <stop
+         id="stop493"
+         style="stop-color:#6da01b"
+         offset="1" />
+    </radialGradient>
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4897"
+       xlink:href="#XMLID_107_"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       id="XMLID_107_">
+      <stop
+         id="stop516"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop518"
+         style="stop-color:#000000"
+         offset="1" />
+    </radialGradient>
+    <linearGradient
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4173"
+       xlink:href="#XMLID_102_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4175"
+       xlink:href="#XMLID_105_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="0.91219997"
+       cy="8721.0361"
+       cx="9320.2285"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4177"
+       xlink:href="#XMLID_106_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4179"
+       xlink:href="#XMLID_107_"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4252"
+       xlink:href="#XMLID_102_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4254"
+       xlink:href="#XMLID_105_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="0.91219997"
+       cy="8721.0361"
+       cx="9320.2285"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4256"
+       xlink:href="#XMLID_106_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4258"
+       xlink:href="#XMLID_107_"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4330"
+       xlink:href="#XMLID_102_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4332"
+       xlink:href="#XMLID_105_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="0.91219997"
+       cy="8721.0361"
+       cx="9320.2285"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4334"
+       xlink:href="#XMLID_106_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4336"
+       xlink:href="#XMLID_107_"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3821">
+      <stop
+         id="stop3823"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop3825"
+         style="stop-color:#000000"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       id="radialGradient3899">
+      <stop
+         id="stop3901"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop3903"
+         style="stop-color:#000000"
+         offset="1" />
+    </radialGradient>
+    <linearGradient
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientTransform="matrix(0.79926053,6.571167e-4,-6.3940842e-4,0.82139588,-7383.6983,-7111.2216)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4406"
+       xlink:href="#XMLID_102_"
+       inkscape:collect="always" />
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4336-651"
+       xlink:href="#XMLID_107_-193"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       id="XMLID_107_-193">
+      <stop
+         id="stop4502"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop4504"
+         style="stop-color:#0b0b0b"
+         offset="1" />
+    </radialGradient>
+    <linearGradient
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientTransform="matrix(0.79926053,6.571167e-4,-6.3940842e-4,0.82139588,-7383.6983,-7111.2216)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4406-130"
+       xlink:href="#XMLID_102_-605"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientUnits="userSpaceOnUse"
+       id="XMLID_102_-605">
+      <stop
+         id="stop4900"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop4902"
+         style="stop-color:#0b0b0b"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow-263">
+      <stop
+         id="stop5303"
+         offset="0"
+         style="stop-color:#0b0b0b;stop-opacity:1;" />
+      <stop
+         id="stop5305"
+         offset="1"
+         style="stop-color:#0b0b0b;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0-790"
+       id="linearGradient3199-367"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-790">
+      <stop
+         id="stop5309"
+         offset="0"
+         style="stop-color:#0b0b0b;stop-opacity:1;" />
+      <stop
+         id="stop5311"
+         offset="1"
+         style="stop-color:#0b0b0b;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780-430"
+       xlink:href="#ButtonShadow-0-107"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-107">
+      <stop
+         id="stop5315"
+         offset="0"
+         style="stop-color:#0b0b0b;stop-opacity:1;" />
+      <stop
+         id="stop5317"
+         offset="1"
+         style="stop-color:#0b0b0b;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772-65"
+       xlink:href="#ButtonShadow-0-650"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-650">
+      <stop
+         id="stop5321"
+         offset="0"
+         style="stop-color:#0b0b0b;stop-opacity:1;" />
+      <stop
+         id="stop5323"
+         offset="1"
+         style="stop-color:#0b0b0b;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725-529"
+       xlink:href="#ButtonShadow-0-413"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-413">
+      <stop
+         id="stop5327"
+         offset="0"
+         style="stop-color:#0b0b0b;stop-opacity:1;" />
+      <stop
+         id="stop5329"
+         offset="1"
+         style="stop-color:#0b0b0b;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721-935"
+       xlink:href="#ButtonShadow-0-306"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-306">
+      <stop
+         id="stop5333"
+         offset="0"
+         style="stop-color:#0b0b0b;stop-opacity:1;" />
+      <stop
+         id="stop5335"
+         offset="1"
+         style="stop-color:#0b0b0b;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643-131"
+       xlink:href="#linearGradient3637-138"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3637-138">
+      <stop
+         id="stop5339"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop5341"
+         offset="1"
+         style="stop-color:#b5b5b5;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-407"
+       xlink:href="#linearGradient3737-228"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-228"
+       inkscape:collect="always">
+      <stop
+         id="stop5345"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop5347"
+         offset="1"
+         style="stop-color:#f2f2f2;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-656"
+       xlink:href="#linearGradient3737-15"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-15"
+       inkscape:collect="always">
+      <stop
+         id="stop5351"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop5353"
+         offset="1"
+         style="stop-color:#f2f2f2;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843-763"
+       xlink:href="#linearGradient3700-932"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3700-932">
+      <stop
+         id="stop5357"
+         offset="0"
+         style="stop-color:#2681d7;stop-opacity:1;" />
+      <stop
+         id="stop5359"
+         offset="1"
+         style="stop-color:#7ec3f3;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8-910"
+       xlink:href="#linearGradient3737-3-606"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3-606"
+       inkscape:collect="always">
+      <stop
+         id="stop5363"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop5365"
+         offset="1"
+         style="stop-color:#f2f2f2;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3-126"
+       xlink:href="#linearGradient3737-3-455"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3-455"
+       inkscape:collect="always">
+      <stop
+         id="stop5369"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop5371"
+         offset="1"
+         style="stop-color:#f2f2f2;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613-488"
+       xlink:href="#linearGradient3737-419"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-419"
+       inkscape:collect="always">
+      <stop
+         id="stop5375"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop5377"
+         offset="1"
+         style="stop-color:#f2f2f2;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905-384"
+       xlink:href="#linearGradient3637-104"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3637-104">
+      <stop
+         id="stop5381"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1;" />
+      <stop
+         id="stop5383"
+         offset="1"
+         style="stop-color:#b5b5b5;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913-207"
+       xlink:href="#linearGradient3183-0-183"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0-183">
+      <stop
+         id="stop5387"
+         offset="0"
+         style="stop-color:#e00000;stop-opacity:1;" />
+      <stop
+         id="stop5389"
+         offset="1"
+         style="stop-color:#f37463;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientTransform="matrix(0.79926053,6.571167e-4,-6.3940842e-4,0.82139588,-7383.6983,-7111.2216)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4406-130-382"
+       xlink:href="#XMLID_102_-605-101"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       y2="8705.7422"
+       x2="9268.5195"
+       y1="8760.5312"
+       x1="9339.1689"
+       gradientUnits="userSpaceOnUse"
+       id="XMLID_102_-605-101">
+      <stop
+         id="stop5393"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop5395"
+         style="stop-color:#171717"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4332-957"
+       xlink:href="#XMLID_105_-984"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       id="XMLID_105_-984">
+      <stop
+         id="stop5399"
+         style="stop-color:#d2d2d3"
+         offset="0" />
+      <stop
+         id="stop5401"
+         style="stop-color:#f2f2f2"
+         offset="0.7581" />
+      <stop
+         id="stop5403"
+         style="stop-color:#a6a8aa"
+         offset="1" />
+    </radialGradient>
+    <radialGradient
+       r="0.91219997"
+       cy="8721.0361"
+       cx="9320.2285"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4334-408"
+       xlink:href="#XMLID_106_-63"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       r="0.91219997"
+       cy="8721.0361"
+       cx="9320.2285"
+       id="XMLID_106_-63">
+      <stop
+         id="stop5407"
+         style="stop-color:#8ecb2a"
+         offset="0.0056" />
+      <stop
+         id="stop5409"
+         style="stop-color:#7bb51e"
+         offset="1" />
+    </radialGradient>
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4336-651-576"
+       xlink:href="#XMLID_107_-193-891"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       id="XMLID_107_-193-891">
+      <stop
+         id="stop5413"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop5415"
+         style="stop-color:#171717"
+         offset="1" />
+    </radialGradient>
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4336-651-576-293"
+       xlink:href="#XMLID_107_-193-891-912"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       id="XMLID_107_-193-891-912">
+      <stop
+         id="stop5969"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop5971"
+         style="stop-color:#171717"
+         offset="1" />
+    </radialGradient>
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4336-651-576-293-260"
+       xlink:href="#linearGradient3637-138"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       id="XMLID_107_-193-891-912-287">
+      <stop
+         id="stop6533"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <stop
+         id="stop6535"
+         style="stop-color:#232323"
+         offset="1" />
+    </radialGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_105_-984"
+       id="linearGradient7685"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.79926053,6.571167e-4,-6.3940842e-4,0.82139588,-7383.6983,-7111.2216)"
+       x1="9339.1689"
+       y1="8760.5312"
+       x2="9268.5195"
+       y2="8705.7422" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_105_-984"
+       id="radialGradient7687"
+       gradientUnits="userSpaceOnUse"
+       cx="9301.207"
+       cy="8724.8711"
+       r="23.112" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_106_-63"
+       id="radialGradient7689"
+       gradientUnits="userSpaceOnUse"
+       cx="9320.2285"
+       cy="8721.0361"
+       r="0.91219997" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_105_-984"
+       id="radialGradient7738"
+       gradientUnits="userSpaceOnUse"
+       cx="9301.207"
+       cy="8724.8711"
+       r="23.112" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_106_-63"
+       id="radialGradient7740"
+       gradientUnits="userSpaceOnUse"
+       cx="9320.2285"
+       cy="8721.0361"
+       r="0.91219997" />
+    <defs
+       id="defs429">
+      <ellipse
+         sodipodi:ry="17.142"
+         sodipodi:rx="17.962"
+         sodipodi:cy="8728.9951"
+         sodipodi:cx="9303.8223"
+         ry="17.142"
+         rx="17.962"
+         cy="8728.9951"
+         cx="9303.8223"
+         id="XMLID_27_" />
+    </defs>
+    <clipPath
+       id="clipPath3847">
+      <use
+         height="17875.275"
+         width="18121.891"
+         y="0"
+         x="0"
+         id="use3849"
+         xlink:href="#XMLID_27_" />
+    </clipPath>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       id="radialGradient3851">
+      <stop
+         id="stop3853"
+         style="stop-color:#c4c6c7"
+         offset="0" />
+      <stop
+         id="stop3855"
+         style="stop-color:#f2f2f2"
+         offset="0.7581" />
+      <stop
+         id="stop3857"
+         style="stop-color:#9b9c9e"
+         offset="1" />
+    </radialGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow-263-914">
+      <stop
+         id="stop9779"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop9781"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0-790-514"
+       id="linearGradient3199-367-819"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-790-514">
+      <stop
+         id="stop9785"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop9787"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780-430-915"
+       xlink:href="#ButtonShadow-0-107-68"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-107-68">
+      <stop
+         id="stop9791"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop9793"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772-65-680"
+       xlink:href="#ButtonShadow-0-650-146"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-650-146">
+      <stop
+         id="stop9797"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop9799"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725-529-8"
+       xlink:href="#ButtonShadow-0-413-913"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-413-913">
+      <stop
+         id="stop9803"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop9805"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721-935-824"
+       xlink:href="#ButtonShadow-0-306-751"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-306-751">
+      <stop
+         id="stop9809"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop9811"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643-131-552"
+       xlink:href="#linearGradient3637-138-415"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3637-138-415">
+      <stop
+         id="stop9815"
+         offset="0"
+         style="stop-color:#e5e5e5;stop-opacity:1;" />
+      <stop
+         id="stop9817"
+         offset="1"
+         style="stop-color:#a8a8a8;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-407-964"
+       xlink:href="#linearGradient3737-228-630"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-228-630"
+       inkscape:collect="always">
+      <stop
+         id="stop9821"
+         offset="0"
+         style="stop-color:#e5e5e5;stop-opacity:1;" />
+      <stop
+         id="stop9823"
+         offset="1"
+         style="stop-color:#e5e5e5;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-656-139"
+       xlink:href="#linearGradient3737-15-725"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-15-725"
+       inkscape:collect="always">
+      <stop
+         id="stop9827"
+         offset="0"
+         style="stop-color:#e5e5e5;stop-opacity:1;" />
+      <stop
+         id="stop9829"
+         offset="1"
+         style="stop-color:#e5e5e5;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843-763-236"
+       xlink:href="#linearGradient3700-932-798"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3700-932-798">
+      <stop
+         id="stop9833"
+         offset="0"
+         style="stop-color:#2273c1;stop-opacity:1;" />
+      <stop
+         id="stop9835"
+         offset="1"
+         style="stop-color:#66b8f0;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8-910-270"
+       xlink:href="#linearGradient3737-3-606-379"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3-606-379"
+       inkscape:collect="always">
+      <stop
+         id="stop9839"
+         offset="0"
+         style="stop-color:#e5e5e5;stop-opacity:1;" />
+      <stop
+         id="stop9841"
+         offset="1"
+         style="stop-color:#e5e5e5;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3-126-462"
+       xlink:href="#linearGradient3737-3-455-360"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3-455-360"
+       inkscape:collect="always">
+      <stop
+         id="stop9845"
+         offset="0"
+         style="stop-color:#e5e5e5;stop-opacity:1;" />
+      <stop
+         id="stop9847"
+         offset="1"
+         style="stop-color:#e5e5e5;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613-488-613"
+       xlink:href="#linearGradient3737-419-854"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-419-854"
+       inkscape:collect="always">
+      <stop
+         id="stop9851"
+         offset="0"
+         style="stop-color:#e5e5e5;stop-opacity:1;" />
+      <stop
+         id="stop9853"
+         offset="1"
+         style="stop-color:#e5e5e5;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905-384-674"
+       xlink:href="#linearGradient3637-104-783"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3637-104-783">
+      <stop
+         id="stop9857"
+         offset="0"
+         style="stop-color:#e5e5e5;stop-opacity:1;" />
+      <stop
+         id="stop9859"
+         offset="1"
+         style="stop-color:#a8a8a8;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913-207-361"
+       xlink:href="#linearGradient3183-0-183-861"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0-183-861">
+      <stop
+         id="stop9863"
+         offset="0"
+         style="stop-color:#c60000;stop-opacity:1;" />
+      <stop
+         id="stop9865"
+         offset="1"
+         style="stop-color:#f15e4b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_105_-984-754"
+       id="linearGradient7685-990"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.79926053,6.571167e-4,-6.3940842e-4,0.82139588,-7383.6983,-7111.2216)"
+       x1="9339.1689"
+       y1="8760.5312"
+       x2="9268.5195"
+       y2="8705.7422" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       id="XMLID_105_-984-754">
+      <stop
+         id="stop9869"
+         style="stop-color:#c5c5c6"
+         offset="0" />
+      <stop
+         id="stop9871"
+         style="stop-color:#e5e5e5"
+         offset="0.7581" />
+      <stop
+         id="stop9873"
+         style="stop-color:#989b9d"
+         offset="1" />
+    </radialGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_105_-984-887"
+       id="radialGradient7738-54"
+       gradientUnits="userSpaceOnUse"
+       cx="9301.207"
+       cy="8724.8711"
+       r="23.112" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       r="23.112"
+       cy="8724.8711"
+       cx="9301.207"
+       id="XMLID_105_-984-887">
+      <stop
+         id="stop9877"
+         style="stop-color:#c5c5c6"
+         offset="0" />
+      <stop
+         id="stop9879"
+         style="stop-color:#e5e5e5"
+         offset="0.7581" />
+      <stop
+         id="stop9881"
+         style="stop-color:#989b9d"
+         offset="1" />
+    </radialGradient>
+    <radialGradient
+       r="35.905602"
+       cy="8684.7832"
+       cx="9309.9775"
+       gradientTransform="matrix(1,8e-4,-8e-4,1,7.1357,-7.2051)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4336-651-576-293-260-717"
+       xlink:href="#linearGradient3637-138-727"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3637-138-727">
+      <stop
+         id="stop9885"
+         offset="0"
+         style="stop-color:#e5e5e5;stop-opacity:1;" />
+      <stop
+         id="stop9887"
+         offset="1"
+         style="stop-color:#a8a8a8;stop-opacity:1;" />
+    </linearGradient>
+  </defs>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow-263-914);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199-367-819);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780-430-915);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772-65-680);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725-529-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721-935-824);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643-131-552);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188-407-964);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619-656-139);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <rect
+       style="fill:url(#linearGradient2843-763-236);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <rect
+       style="fill:#fe0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8-910-270);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3-126-462);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613-488-613);fill-opacity:1;fill-rule:nonzero;stroke:#f2f2f2;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </g>
+  <g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905-384-674);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       style="color:#000000;fill:url(#linearGradient3913-207-361);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       style="fill:url(#linearGradient7685-990);fill-opacity:1"
+       id="path399"
+       d="m 46.637031,38.4891 c -12.382144,-0.009 -22.655039,18.749182 -24.482948,43.240743 l 48.899558,0.04025 C 69.264097,57.275245 59.022373,38.499778 46.637031,38.4891 z"
+       inkscape:connector-curvature="0" />
+    <g
+       style="fill:#00e400"
+       transform="matrix(0.79926053,0,0,0.82139588,-7389.4016,-7105.3034)"
+       id="g401">
+      <g
+         style="fill:#00e400"
+         id="g403">
+        <g
+           style="fill:#00e400"
+           id="g405"
+           enable-background="new    ">
+          <defs
+             id="defs407">
+            <polygon
+               points="9255.96,8733.103 9255.307,8675.399 9356.058,8709.45 9356.711,8767.153 9255.96,8733.103 "
+               enable-background="new    "
+               id="XMLID_25_" />
+          </defs>
+          <clipPath
+             id="clipPath3833">
+            <use
+               height="17875.275"
+               width="18121.891"
+               y="0"
+               x="0"
+               id="use3835"
+               xlink:href="#XMLID_25_" />
+          </clipPath>
+          <g
+             style="fill:#00e400"
+             id="g413"
+             clip-path="url(#XMLID_103_)">
+            <g
+               style="fill:#00e400"
+               id="g415">
+              <g
+                 style="fill:#00e400"
+                 id="g417">
+                <g
+                   style="fill:#00e400"
+                   id="g419">
+                  <path
+                     style="fill:#00e400"
+                     id="path421"
+                     d="m 9306.289,8746.059 c -23.898,-8.077 -43.4,-25.72 -43.556,-39.408 -0.155,-13.688 19.096,-18.234 42.995,-10.156 23.899,8.077 43.4,25.72 43.556,39.408 0.155,13.687 -19.096,18.234 -42.995,10.156 m -0.607,-53.634 c -27.819,-9.402 -50.229,-4.108 -50.048,11.826 0.181,15.934 22.882,36.475 50.702,45.877 27.82,9.402 50.229,4.108 50.048,-11.826 -0.181,-15.934 -22.882,-36.475 -50.702,-45.877"
+                     inkscape:connector-curvature="0" />
+                </g>
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+    <ellipse
+       cx="9303.8301"
+       cy="8728.9219"
+       rx="18.225"
+       ry="17.334"
+       id="ellipse425"
+       sodipodi:cx="9303.8301"
+       sodipodi:cy="8728.9219"
+       sodipodi:rx="18.225"
+       sodipodi:ry="17.334"
+       style="fill:#6f7072"
+       d="m 9322.0551,8728.9219 c 0,9.5733 -8.1596,17.334 -18.225,17.334 -10.0654,0 -18.225,-7.7607 -18.225,-17.334 0,-9.5733 8.1596,-17.334 18.225,-17.334 10.0654,0 18.225,7.7607 18.225,17.334 z"
+       transform="matrix(0.79926053,0,0,0.82139588,-7389.4016,-7105.3034)" />
+    <ellipse
+       d="m 9324.852,8724.8721 c 0,12.4623 -10.5862,22.565 -23.645,22.565 -13.0587,0 -23.645,-10.1027 -23.645,-22.565 0,-12.4623 10.5863,-22.565 23.645,-22.565 13.0588,0 23.645,10.1027 23.645,22.565 z"
+       style="fill:url(#radialGradient7738-54)"
+       sodipodi:ry="22.565001"
+       sodipodi:rx="23.645"
+       sodipodi:cy="8724.8721"
+       sodipodi:cx="9301.207"
+       id="ellipse442"
+       ry="22.565001"
+       rx="23.645"
+       cy="8724.8721"
+       cx="9301.207"
+       clip-path="url(#XMLID_104_)"
+       transform="matrix(0.79926053,0,0,0.82139588,-7389.4016,-7105.3034)" />
+    <g
+       id="g444"
+       clip-path="url(#XMLID_104_)"
+       transform="matrix(0.79926053,0,0,0.82139588,-7389.4016,-7105.3034)"
+       style="fill:#00e500">
+      <g
+         id="g446"
+         style="fill:#00e500">
+        <g
+           id="g448"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path450"
+             d="m 9308.487,8709.701 c -0.067,0.023 -0.109,0.09 -0.109,0.169 0,0 0,0 0,0.01 0,0.056 0.022,0.108 0.056,0.151 -0.061,0.025 -0.131,0.049 -0.195,0.063 0,0 -0.015,0 -0.025,0 0,-0.01 0,-0.016 0,-0.016 -0.038,-0.074 -0.097,-0.07 -0.31,0.022 -0.091,0.042 -0.338,0.307 -0.36,0.423 0.021,-0.035 -0.091,-0.047 -0.091,-0.047 -0.068,-0.021 -0.136,-0.041 -0.204,-0.062 -0.019,-0.01 -0.036,-0.012 -0.055,-0.018 -0.01,0.019 -0.01,0.037 -0.015,0.056 -0.015,0.02 -0.054,0.071 0.01,0.471 0,0.016  [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g452"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path454"
+             d="m 9313.491,8710.166 c -0.308,-0.02 -0.616,-0.038 -0.924,-0.054 0,-10e-4 -0.376,-0.055 -0.444,0.019 -0.01,0.01 -0.02,0.019 -0.028,0.028 0,0.015 0,0.03 0,0.046 0,0.038 0.013,0.075 0.111,0.121 -0.069,0.031 -0.141,0.063 -0.142,0.063 -0.021,-0.01 -0.579,0.284 -0.871,0.539 -0.348,0.304 -0.555,1.135 -0.528,1.377 0.034,0.289 0.497,0.491 0.676,0.497 0.069,0.01 0.286,0.321 0.332,0.491 0.028,0.102 0.091,0.168 0.17,0.186 0.023,0.01 0.039,-0.01 0.061,-0.01 0.01,0.065 0.011,0.153 0.017 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g456"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path458"
+             d="m 9295.25,8711.972 c -0.033,0.037 -0.072,0.096 -0.075,0.177 -0.03,0.053 -0.279,0.13 -0.421,0.11 -0.226,-0.032 -0.617,0.47 -0.705,0.641 -0.085,0.103 -0.787,0.376 -1.117,0.45 -0.101,0.022 -0.213,0.094 -0.321,0.208 -0.195,0.205 -0.366,0.534 -0.405,0.721 0,0.013 -0.01,0.052 -0.011,0.062 -0.058,0.021 -0.138,0.063 -0.285,0.145 -0.2,0.111 -0.475,0.264 -0.617,0.293 -0.01,0 -0.524,0.115 -0.615,0.201 -0.011,0.01 -0.022,0.021 -0.033,0.031 0,0.014 -0.01,0.025 -0.01,0.038 -0.017,0.073 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g460"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path462"
+             d="m 9303.764,8710.675 c -0.055,0.048 -0.071,0.131 -0.075,0.192 0,0.063 0,0.146 0.053,0.184 -0.018,-0.012 -0.021,-0.036 -0.02,-0.047 -0.019,0.074 -0.01,0.121 0.029,0.15 -0.01,-0.022 -0.02,-0.044 -0.029,-0.065 -0.01,0.063 -0.108,0.339 -0.163,0.402 -0.025,0 -0.052,0.015 -0.077,0.033 -0.095,0.078 -0.152,0.272 -0.157,0.359 0,0.014 0,0.028 0,0.042 0.01,0.012 0.02,0.023 0.03,0.034 0.052,0.055 0.166,0.069 1.306,-0.063 0.063,-0.01 0.125,-0.013 0.188,-0.02 0.134,-0.032 0.268,-0.064 0 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g464"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path466"
+             d="m 9299.564,8712.768 0,0 c -0.048,0.076 -0.096,0.152 -0.144,0.229 -0.165,0.253 -0.236,0.371 -0.229,0.456 0,0.017 0,0.033 0,0.05 0.019,0.01 0.036,0.017 0.054,0.025 0.165,0.049 0.881,-0.494 0.887,-0.5 0.107,-0.084 0.163,-0.191 0.157,-0.303 -0.01,-0.148 -0.116,-0.262 -0.22,-0.286 -0.167,-0.041 -0.39,0.105 -0.51,0.329 z m 0.436,-0.139 c 0.048,0.011 0.108,0.078 0.111,0.144 0,0.01 0,0.01 0,0.015 0,0.023 -0.015,0.057 -0.062,0.094 -0.171,0.135 -0.45,0.316 -0.613,0.406 0.042,-0.068 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g468"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path470"
+             d="m 9306.677,8712.288 c -0.032,0.033 -0.079,0.106 -0.026,0.241 0.048,0.143 0.097,0.287 0.145,0.43 0.26,0.803 0.285,0.834 0.373,0.832 0.155,0 0.327,-0.456 0.327,-0.461 0,0.01 0.029,0.031 0.039,0.047 0.043,0.07 0.085,0.143 0.128,0.213 0.016,-0.084 0.031,-0.169 0.047,-0.254 0.015,-0.083 -0.117,-0.689 -0.462,-0.912 -0.285,-0.184 -0.477,-0.228 -0.571,-0.136 z m 0.133,0.12 c 0,0.027 0.112,0.043 0.339,0.188 0.179,0.115 0.284,0.371 0.336,0.549 -0.01,0 -0.015,0 -0.022,0 -0.063,0.01  [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g472"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path474"
+             d="m 9302.729,8712.574 c 0,0 0,0 0,0.01 0,0.02 -0.01,0.039 -0.013,0.059 -0.02,0.043 -0.04,0.084 -0.06,0.127 -0.114,0.23 -0.2,0.414 -0.177,0.526 0,0.013 0,0.026 0.01,0.04 0.019,0.014 0.038,0.027 0.057,0.042 0.101,0.046 0.309,-0.016 0.77,-0.226 0.018,-0.01 0.035,-0.017 0.053,-0.025 0.128,-0.056 0.142,-0.143 0.143,-0.18 0,-0.07 -0.048,-0.131 -0.121,-0.145 0.012,0 -0.108,-0.1 -0.108,-0.101 -0.162,-0.147 -0.246,-0.217 -0.322,-0.216 -0.077,0 -0.176,0.019 -0.225,0.093 z m 0.2,0.106 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g476"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path478"
+             d="m 9300.639,8713.563 c 0,0 0,-0.01 0,-0.01 -0.04,0.057 -0.306,0.214 -0.468,0.309 -0.336,0.198 -0.412,0.251 -0.433,0.329 0,0.018 -0.01,0.034 -0.012,0.052 0.012,0.013 0.022,0.026 0.033,0.04 0.055,0.055 0.646,0.488 0.991,0.484 0.116,0 0.598,-0.052 0.662,-0.153 -0.018,0 -0.034,0 -0.052,0.01 0.13,-0.072 0.26,-0.146 0.389,-0.219 0.016,-0.025 0.031,-0.051 0.048,-0.077 0.035,-0.107 -0.045,-0.224 -0.186,-0.415 -0.05,-0.078 -0.1,-0.158 -0.149,-0.236 0.033,-0.206 -0.296,-0.383 -0.416 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g480"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path482"
+             d="m 9304.434,8713.035 c -0.017,0.021 -0.032,0.041 -0.049,0.062 -0.142,0.067 -0.283,0.136 -0.425,0.204 -0.375,0.165 -0.475,0.215 -0.516,0.27 -0.03,0.045 -0.189,0.111 -0.232,0.115 -0.028,0 -0.058,0 -0.086,0.01 -0.01,0.031 -0.012,0.063 -0.019,0.093 0,0.01 0,0.01 0,0.014 0,0.089 0.066,0.097 0.354,0.116 0,0.01 0,0.018 0,0.032 0,0.094 -0.052,0.265 -0.084,0.305 -0.01,0.01 -0.017,0.02 -0.024,0.029 -0.011,0.02 -0.021,0.038 -0.031,0.057 -0.012,0.201 1.243,0.283 1.256,0.287 0.236,0.01 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g484"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path486"
+             d="m 9315.809,8717.184 c -10e-4,0 0,0 0,0 0,0.015 -0.01,0.03 -0.01,0.044 -0.073,0.084 -0.146,0.167 -0.219,0.251 -0.222,0.236 -0.395,0.429 -0.444,0.537 -0.028,0.058 -0.021,0.124 0.017,0.185 0.138,0.218 0.712,0.341 0.905,0.352 0.188,0.01 1.138,-0.145 1.166,-0.336 0,-0.023 0,-0.043 0,-0.062 -0.01,-0.062 -0.035,-0.084 -0.065,-0.104 -0.01,-0.072 -0.037,-0.297 -0.038,-0.297 0,-0.049 -0.03,-0.096 -0.074,-0.133 -0.127,-0.107 -0.429,-0.13 -0.547,-0.109 -0.082,0.014 -0.371,-0.143 -0.4 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g488"
+           style="fill:#00e500">
+          <radialGradient
+             gradientUnits="userSpaceOnUse"
+             r="0.91219997"
+             cy="8721.0361"
+             cx="9320.2285"
+             id="radialGradient3883">
+            <stop
+               id="stop3885"
+               style="stop-color:#81b725"
+               offset="0.0056" />
+            <stop
+               id="stop3887"
+               style="stop-color:#6da01b"
+               offset="1" />
+          </radialGradient>
+          <path
+             style="fill:#00e500"
+             id="path495"
+             d="m 9319.869,8720.103 c 0.26,-0.136 0.557,-0.169 0.662,-0.073 0.104,0.096 0.404,0.722 0.429,1.181 0.025,0.459 -0.382,0.89 -0.402,0.888 -0.019,0 -0.169,-0.031 -0.29,-0.068 -0.121,-0.035 -0.396,-0.26 -0.346,-0.418 0.051,-0.158 0.133,-0.59 0.072,-0.607 -0.061,-0.02 -0.326,-0.045 -0.458,-0.018 -0.13,0.028 0.073,-0.752 0.333,-0.885 z"
+             enable-background="new    "
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:#00e500"
+             id="path497"
+             d="m 9319.813,8720.016 c -0.231,0.123 -0.425,0.672 -0.412,0.911 0,0.03 0.01,0.056 0.016,0.074 0.013,0.026 0.025,0.054 0.038,0.08 0.038,0 0.076,0 0.114,0 0.092,-0.02 0.258,-0.01 0.345,0.01 0,0.104 -0.04,0.344 -0.086,0.486 0,0 0.041,0.233 0.041,0.233 0.083,0.144 0.268,0.28 0.38,0.313 0.104,0.023 0.209,0.049 0.314,0.072 0.126,0.01 0.52,-0.529 0.494,-0.977 -0.024,-0.471 -0.331,-1.128 -0.467,-1.252 -0.16,-0.146 -0.511,-0.085 -0.777,0.053 z m 0.11,0.173 c 0,0 0,0 0,0 0.258,-0.135  [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g499"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path501"
+             d="m 9322.198,8720.694 c 0.154,0.252 0.615,0.327 0.818,0.311 0.032,0 0.136,-0.011 0.145,-0.095 -0.01,0.014 -0.015,0.027 -0.021,0.04 0.04,-0.021 0.253,-0.017 0.362,0 0.01,0.018 0.073,0.174 0.124,0.288 0.083,0.194 0.179,0.414 0.295,0.536 -0.01,0 -0.159,-0.016 -0.194,-0.047 0.022,-0.03 -0.01,-0.102 -0.067,-0.168 -0.077,-0.085 -0.199,-0.154 -0.286,-0.161 -0.063,-0.01 -0.096,0.023 -0.34,0.249 -0.321,0.297 -0.867,0.803 -1.283,0.939 -0.329,0.105 -0.689,0.25 -0.811,0.386 -0.081,-0.0 [...]
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:#00e500"
+             id="path503"
+             d="m 9325.466,8719.012 c -0.374,-0.029 -0.408,0.031 -0.414,0.09 0,0.021 0,0.041 0,0.061 0.035,0.026 0.07,0.053 0.105,0.078 0,0 0,0 -0.01,0 0.061,0.054 0.26,0.483 0.199,0.884 -0.04,0.262 -0.389,0.756 -0.622,1.09 -0.249,0.352 -0.27,0.385 -0.246,0.449 0.04,0.107 0.287,0.352 0.512,0.385 0.18,0.029 0.803,0.01 0.96,-0.149 0.063,-0.062 0.311,-0.152 0.459,-0.206 0.157,-0.056 0.206,-0.082 0.226,-0.118 0.047,0 0.243,-0.015 0.243,-0.015 0.227,0.01 0.336,-0.249 0.306,-0.496 0,0 0,-0.01  [...]
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:#00e500"
+             id="path505"
+             d="m 9322.19,8724.434 c -0.222,0.057 -1.021,0.365 -1.223,0.559 -0.269,0.256 -0.464,0.453 -0.48,0.6 -0.01,0.052 0.017,0.107 0.066,0.166 0.162,0.182 0.677,0.438 1.318,0.453 1.449,0.031 2.082,0.04 2.37,0.023 -0.01,0.05 -0.018,0.099 -0.017,0.162 0,0.222 0.076,0.49 0.292,0.554 0.158,0.081 0.315,0.162 0.473,0.243 0.428,0.243 0.675,0.373 0.815,0.29 0.154,-0.093 0.809,-0.287 1.097,-0.243 0,0 0,-0.146 0,-0.179 -0.36,-0.042 -1.035,0.165 -1.208,0.269 -0.073,0.01 -0.401,-0.178 -0.6,-0.2 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g507"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path509"
+             d="m 9301.573,8728.484 c 0,0 -0.01,0.01 -0.012,0.012 -0.012,0.023 -0.023,0.047 -0.034,0.07 -0.021,0.041 -0.153,0.137 -0.198,0.145 -0.048,0.01 -0.096,0.015 -0.145,0.021 0.021,0.042 0.04,0.084 0.06,0.125 0.01,0.012 0.048,0.029 0.09,0.045 0,0 0,0 0,0 0,0 0,0 0,0 0.4,0.157 2.143,0.505 2.346,0.504 0.233,0 0.261,-0.124 0.264,-0.179 0,0 0,0 0,-0.01 0,-0.211 -0.401,-0.473 -0.619,-0.484 0,0 -0.021,0 -0.03,0 -0.01,-0.082 -0.067,-0.111 -0.815,-0.154 0,0 0,0 0,0 0,-0.068 0,-0.127 -0.523 [...]
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g511"
+           style="fill:#00e500">
+          <path
+             style="fill:#00e500"
+             id="path513"
+             d="m 9304.814,8729.206 0,0 c 0,0 -0.095,0.177 -0.094,0.304 0,0.036 0.012,0.066 0.031,0.089 -0.064,0.027 -0.13,0.057 -0.13,0.058 0,0 -0.255,0.081 -0.254,0.205 0,0.115 0,0.127 1.119,0.131 0.292,0 0.749,-0.119 0.853,-0.178 0.11,-0.053 0.221,-0.106 0.332,-0.159 0,-0.023 0,-0.047 0.01,-0.07 0,-0.067 0,-0.118 -1.091,-0.454 -0.3,-0.093 -0.671,-0.108 -0.773,0.074 z m 0.715,0.116 c 0.224,0.068 0.588,0.191 0.81,0.271 -0.045,0.021 -0.102,0.049 -0.102,0.049 -0.063,0.035 -0.487,0.152 -0. [...]
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+    <circle
+       transform="matrix(0.79926053,0,0,0.82139588,-7389.4016,-7105.3034)"
+       d="m 9319.97,8679 c 0,9.5114 -7.7105,17.222 -17.222,17.222 -9.5114,0 -17.222,-7.7106 -17.222,-17.222 0,-9.5114 7.7106,-17.222 17.222,-17.222 9.5115,0 17.222,7.7106 17.222,17.222 z"
+       style="fill:url(#radialGradient4336-651-576-293-260-717);fill-opacity:1.0"
+       sodipodi:ry="17.222"
+       sodipodi:rx="17.222"
+       sodipodi:cy="8679"
+       sodipodi:cx="9302.748"
+       id="circle520"
+       r="17.222"
+       cy="8679"
+       cx="9302.748" />
+    <path
+       inkscape:connector-curvature="0"
+       id="text614"
+       d="m 32.141794,69.32739 -2.156204,-7.240957 1.234006,0 1.121246,4.179573 0.417969,1.554557 c 0.01769,-0.07727 0.139314,-0.575001 0.364888,-1.493192 l 1.121218,-4.240938 1.227381,0 1.054887,4.200029 0.351639,1.3841 0.404692,-1.397736 1.207478,-4.186393 1.16105,0 -2.20266,7.240957 -1.240658,0 -1.121218,-4.336393 -0.272003,-1.234097 -1.426428,5.57049 -1.247283,0 z m 10.61831,0 -2.156204,-7.240957 1.234006,0 1.121218,4.179573 0.417969,1.554557 c 0.01769,-0.07727 0.139342,-0.575001 0.3 [...]
+       style="font-size:486.09533691000001454px;letter-spacing:28.59384345999999866;fill:#00b100;font-family:ArialMT" />
+  </g>
+</svg>
diff --git a/interface/images/menu/proxy.svg b/interface/images/menu/proxy.svg
new file mode 100755
index 0000000..e311972
--- /dev/null
+++ b/interface/images/menu/proxy.svg
@@ -0,0 +1,3643 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="96x96 (action).svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <radialGradient
+       r="29.993349"
+       fy="15.716079"
+       fx="18.247644"
+       cy="15.716079"
+       cx="18.247644"
+       gradientTransform="scale(0.999989,1.000011)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13377-440"
+       xlink:href="#linearGradient3962-4-207"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3962-4-207">
+      <stop
+         id="stop24037"
+         offset="0.0000000"
+         style="stop-color:#e5e5e5;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24039"
+         offset="0.15517241"
+         style="stop-color:#e5e5e5;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24041"
+         offset="0.75000000"
+         style="stop-color:#6b6b6b;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24043"
+         offset="1.0000000"
+         style="stop-color:#474747;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="32.664848"
+       fy="10.476453"
+       fx="11.826907"
+       cy="10.476453"
+       cx="11.826907"
+       gradientTransform="scale(1.179536,0.847791)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13379-808"
+       xlink:href="#linearGradient4350-7-590"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4350-7-590"
+       inkscape:collect="always">
+      <stop
+         id="stop24047"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24049"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13461-886"
+       xlink:href="#linearGradient4750-3-923"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-923">
+      <stop
+         id="stop24053"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24055"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24057"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13385-887"
+       xlink:href="#linearGradient4750-3-862"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-862">
+      <stop
+         id="stop24061"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24063"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24065"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13383-728"
+       xlink:href="#linearGradient4750-3-32"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-32">
+      <stop
+         id="stop24069"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24071"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24073"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13381-379"
+       xlink:href="#linearGradient4750-3-318"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-318">
+      <stop
+         id="stop24077"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24079"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24081"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13391-4"
+       xlink:href="#linearGradient4750-3-212"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-212">
+      <stop
+         id="stop24085"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24087"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24089"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13389-558"
+       xlink:href="#linearGradient4750-3-664"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-664">
+      <stop
+         id="stop24093"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24095"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24097"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13387-105"
+       xlink:href="#linearGradient4750-3-613"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-613">
+      <stop
+         id="stop24101"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24103"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24105"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13397-572"
+       xlink:href="#linearGradient4750-3-390"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-390">
+      <stop
+         id="stop24109"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24111"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24113"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13395-769"
+       xlink:href="#linearGradient4750-3-604"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-604">
+      <stop
+         id="stop24117"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24119"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24121"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13393-461"
+       xlink:href="#linearGradient4750-3-715"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-715">
+      <stop
+         id="stop24125"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24127"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24129"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13403-197"
+       xlink:href="#linearGradient4750-3-901"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-901">
+      <stop
+         id="stop24133"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24135"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24137"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13401-669"
+       xlink:href="#linearGradient4750-3-38"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-38">
+      <stop
+         id="stop24141"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24143"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24145"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13399-961"
+       xlink:href="#linearGradient4750-3-527"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-527">
+      <stop
+         id="stop24149"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24151"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24153"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13409-12"
+       xlink:href="#linearGradient4750-3-286"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-286">
+      <stop
+         id="stop24157"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24159"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24161"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13407-372"
+       xlink:href="#linearGradient4750-3-906"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-906">
+      <stop
+         id="stop24165"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24167"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24169"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13405-287"
+       xlink:href="#linearGradient4750-3-124"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-124">
+      <stop
+         id="stop24173"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24175"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24177"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13415-364"
+       xlink:href="#linearGradient4750-3-528"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-528">
+      <stop
+         id="stop24181"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24183"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24185"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13413-299"
+       xlink:href="#linearGradient4750-3-110"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-110">
+      <stop
+         id="stop24189"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24191"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24193"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13411-331"
+       xlink:href="#linearGradient4750-3-678"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-678">
+      <stop
+         id="stop24197"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24199"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24201"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13421-458"
+       xlink:href="#linearGradient4750-3-514"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-514">
+      <stop
+         id="stop24205"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24207"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24209"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13419-796"
+       xlink:href="#linearGradient4750-3-515"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-515">
+      <stop
+         id="stop24213"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24215"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24217"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13417-361"
+       xlink:href="#linearGradient4750-3-190"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-190">
+      <stop
+         id="stop24221"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24223"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24225"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13427-581"
+       xlink:href="#linearGradient4750-3-452"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-452">
+      <stop
+         id="stop24229"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24231"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24233"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13425-116"
+       xlink:href="#linearGradient4750-3-339"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-339">
+      <stop
+         id="stop24237"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24239"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24241"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13423-60"
+       xlink:href="#linearGradient4750-3-647"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-647">
+      <stop
+         id="stop24245"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24247"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24249"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13437-465"
+       xlink:href="#linearGradient4750-3-969"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-969">
+      <stop
+         id="stop24253"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24255"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24257"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13431-603"
+       xlink:href="#linearGradient4750-3-293"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-293">
+      <stop
+         id="stop24261"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24263"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24265"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13429-710"
+       xlink:href="#linearGradient4750-3-586"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-586">
+      <stop
+         id="stop24269"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24271"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24273"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13435-788"
+       xlink:href="#linearGradient4750-3-298"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-298">
+      <stop
+         id="stop24277"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24279"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24281"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13433-836"
+       xlink:href="#linearGradient4750-3-988"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-988">
+      <stop
+         id="stop24285"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24287"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24289"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13447-905"
+       xlink:href="#linearGradient4750-3-459"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-459">
+      <stop
+         id="stop24293"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24295"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24297"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13441-303"
+       xlink:href="#linearGradient4750-3-681"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-681">
+      <stop
+         id="stop24301"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24303"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24305"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13439-88"
+       xlink:href="#linearGradient4750-3-861"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-861">
+      <stop
+         id="stop24309"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24311"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24313"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13445-285"
+       xlink:href="#linearGradient4750-3-37"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-37">
+      <stop
+         id="stop24317"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24319"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24321"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13443-303"
+       xlink:href="#linearGradient4750-3-497"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-497">
+      <stop
+         id="stop24325"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24327"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24329"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13453-434"
+       xlink:href="#linearGradient4750-3-497"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient25709">
+      <stop
+         id="stop25711"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop25713"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop25715"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13451-468"
+       xlink:href="#linearGradient4750-3-853"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-853">
+      <stop
+         id="stop24342"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24344"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24346"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13449-145"
+       xlink:href="#linearGradient4750-3-912"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-912">
+      <stop
+         id="stop24350"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24352"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24354"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13459-943"
+       xlink:href="#linearGradient4750-3-564"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-564">
+      <stop
+         id="stop24358"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24360"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24362"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13457-87"
+       xlink:href="#linearGradient4750-3-185"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-185">
+      <stop
+         id="stop24366"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24368"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24370"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="40.692665"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.63378"
+       gradientTransform="scale(1.036822,0.964486)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13455-42"
+       xlink:href="#linearGradient4750-3-916"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4750-3-916">
+      <stop
+         id="stop24374"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop24376"
+         offset="0.37931034"
+         style="stop-color:#fefefe;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24378"
+         offset="1.0000000"
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       r="43.526714"
+       fy="12.142302"
+       fx="15.601279"
+       cy="12.142302"
+       cx="15.601279"
+       gradientTransform="scale(0.999989,1.000011)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13463-324"
+       xlink:href="#linearGradient4126-45-647"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4126-45-647">
+      <stop
+         id="stop24382"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24384"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.16494845;" />
+    </linearGradient>
+    <radialGradient
+       r="16.321514"
+       fy="40.545052"
+       fx="93.780037"
+       cy="40.545052"
+       cx="93.780037"
+       gradientTransform="matrix(1.008999,0,0,1.318829,-111.5197,-18.76722)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13465-876"
+       xlink:href="#linearGradient9830-7-943"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient9830-7-943">
+      <stop
+         style="stop-color:#505050;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop24388" />
+      <stop
+         style="stop-color:#181818;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop24390" />
+    </linearGradient>
+    <linearGradient
+       y2="28.112619"
+       x2="30.935921"
+       y1="43.757359"
+       x1="30.935921"
+       gradientTransform="matrix(0.496216,0,0,0.326467,-39.19298,19.71465)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient13467-982"
+       xlink:href="#linearGradient9842-9-516"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient9842-9-516">
+      <stop
+         style="stop-color:#6d6d6d;stop-opacity:1;"
+         offset="0"
+         id="stop24394" />
+      <stop
+         style="stop-color:#6d6d6d;stop-opacity:0;"
+         offset="1"
+         id="stop24396" />
+    </linearGradient>
+    <linearGradient
+       y2="27.759069"
+       x2="18.031221"
+       y1="19.804117"
+       x1="46.845825"
+       gradientTransform="matrix(-0.495075,0,0,0.491366,39.02329,12.49911)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient13469-69"
+       xlink:href="#linearGradient9854-25-15"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient9854-25-15">
+      <stop
+         style="stop-color:#4e4e4e;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop24400" />
+      <stop
+         style="stop-color:#ababab;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop24402" />
+    </linearGradient>
+    <radialGradient
+       r="9.7227182"
+       fy="7.139607"
+       fx="27.883883"
+       cy="7.139607"
+       cx="27.883883"
+       gradientTransform="matrix(-1.258615,0,0,0.666552,57.40125,8.044513)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient13471-408"
+       xlink:href="#linearGradient9868-2-682"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient9868-2-682">
+      <stop
+         id="stop24406"
+         offset="0.0000000"
+         style="stop-color:#4e4e4e;stop-opacity:1.0000000;" />
+      <stop
+         id="stop24408"
+         offset="1.0000000"
+         style="stop-color:#616161;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       y2="24.764584"
+       x2="34.007416"
+       y1="19.107729"
+       x1="31.852951"
+       gradientTransform="matrix(-0.458294,0,0,0.458294,38.28479,11.28017)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient13473-226"
+       xlink:href="#linearGradient9880-6-51"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient9880-6-51">
+      <stop
+         style="stop-color:#525252;stop-opacity:1;"
+         offset="0"
+         id="stop24412" />
+      <stop
+         style="stop-color:#525252;stop-opacity:0;"
+         offset="1"
+         id="stop24414" />
+    </linearGradient>
+    <linearGradient
+       y2="18.064039"
+       x2="33.710651"
+       y1="21.511185"
+       x1="31.078955"
+       gradientTransform="matrix(-0.458294,0,0,0.458294,37.77328,11.28017)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient13475-217"
+       xlink:href="#linearGradient9896-0-273"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient9896-0-273">
+      <stop
+         style="stop-color:#cecece;stop-opacity:1;"
+         offset="0"
+         id="stop24418" />
+      <stop
+         style="stop-color:#9e9e9e;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop24420" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3962-4-207"
+       id="radialGradient11178"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.999989,1.000011)"
+       cx="18.247644"
+       cy="15.716079"
+       fx="18.247644"
+       fy="15.716079"
+       r="29.993349" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4350-7-590"
+       id="radialGradient11180"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.179536,0.847791)"
+       cx="11.826907"
+       cy="10.476453"
+       fx="11.826907"
+       fy="10.476453"
+       r="32.664848" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-318"
+       id="radialGradient11182"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-32"
+       id="radialGradient11184"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-862"
+       id="radialGradient11186"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-613"
+       id="radialGradient11188"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-664"
+       id="radialGradient11190"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-212"
+       id="radialGradient11192"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-715"
+       id="radialGradient11194"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-604"
+       id="radialGradient11196"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-390"
+       id="radialGradient11198"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-527"
+       id="radialGradient11200"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-38"
+       id="radialGradient11202"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-901"
+       id="radialGradient11204"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-124"
+       id="radialGradient11206"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-906"
+       id="radialGradient11208"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-286"
+       id="radialGradient11210"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-678"
+       id="radialGradient11212"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-110"
+       id="radialGradient11214"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-528"
+       id="radialGradient11216"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-190"
+       id="radialGradient11218"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-515"
+       id="radialGradient11220"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-514"
+       id="radialGradient11222"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-647"
+       id="radialGradient11224"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-339"
+       id="radialGradient11226"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-452"
+       id="radialGradient11228"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-586"
+       id="radialGradient11230"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-293"
+       id="radialGradient11232"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-988"
+       id="radialGradient11234"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-298"
+       id="radialGradient11236"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-969"
+       id="radialGradient11238"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-861"
+       id="radialGradient11240"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-681"
+       id="radialGradient11242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-497"
+       id="radialGradient11244"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-37"
+       id="radialGradient11246"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-459"
+       id="radialGradient11248"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-912"
+       id="radialGradient11250"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-853"
+       id="radialGradient11252"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-497"
+       id="radialGradient11254"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-916"
+       id="radialGradient11256"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-185"
+       id="radialGradient11258"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-564"
+       id="radialGradient11260"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-923"
+       id="radialGradient11262"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4126-45-647"
+       id="radialGradient11264"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.999989,1.000011)"
+       cx="15.601279"
+       cy="12.142302"
+       fx="15.601279"
+       fy="12.142302"
+       r="43.526714" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9830-7-943"
+       id="radialGradient11266"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.008999,0,0,1.318829,-111.5197,-18.76722)"
+       cx="93.780037"
+       cy="40.545052"
+       fx="93.780037"
+       fy="40.545052"
+       r="16.321514" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9842-9-516"
+       id="linearGradient11268"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.496216,0,0,0.326467,-39.19298,19.71465)"
+       x1="30.935921"
+       y1="43.757359"
+       x2="30.935921"
+       y2="28.112619" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9854-25-15"
+       id="linearGradient11270"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.495075,0,0,0.491366,39.02329,12.49911)"
+       x1="46.845825"
+       y1="19.804117"
+       x2="18.031221"
+       y2="27.759069" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9868-2-682"
+       id="radialGradient11272"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.258615,0,0,0.666552,57.40125,8.044513)"
+       cx="27.883883"
+       cy="7.139607"
+       fx="27.883883"
+       fy="7.139607"
+       r="9.7227182" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9880-6-51"
+       id="linearGradient11274"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.458294,0,0,0.458294,38.28479,11.28017)"
+       x1="31.852951"
+       y1="19.107729"
+       x2="34.007416"
+       y2="24.764584" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9896-0-273"
+       id="linearGradient11276"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.458294,0,0,0.458294,37.77328,11.28017)"
+       x1="31.078955"
+       y1="21.511185"
+       x2="33.710651"
+       y2="18.064039" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3962-4-207"
+       id="radialGradient11430"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.999989,1.000011)"
+       cx="18.247644"
+       cy="15.716079"
+       fx="18.247644"
+       fy="15.716079"
+       r="29.993349" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4350-7-590"
+       id="radialGradient11432"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.179536,0.847791)"
+       cx="11.826907"
+       cy="10.476453"
+       fx="11.826907"
+       fy="10.476453"
+       r="32.664848" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-318"
+       id="radialGradient11434"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-32"
+       id="radialGradient11436"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-862"
+       id="radialGradient11438"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-613"
+       id="radialGradient11440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-664"
+       id="radialGradient11442"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-212"
+       id="radialGradient11444"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-715"
+       id="radialGradient11446"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-604"
+       id="radialGradient11448"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-390"
+       id="radialGradient11450"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-527"
+       id="radialGradient11452"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-38"
+       id="radialGradient11454"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-901"
+       id="radialGradient11456"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-124"
+       id="radialGradient11458"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-906"
+       id="radialGradient11460"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-286"
+       id="radialGradient11462"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-678"
+       id="radialGradient11464"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-110"
+       id="radialGradient11466"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-528"
+       id="radialGradient11468"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-190"
+       id="radialGradient11470"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-515"
+       id="radialGradient11472"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-514"
+       id="radialGradient11474"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-647"
+       id="radialGradient11476"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-339"
+       id="radialGradient11478"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-452"
+       id="radialGradient11480"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-586"
+       id="radialGradient11482"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-293"
+       id="radialGradient11484"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-988"
+       id="radialGradient11486"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-298"
+       id="radialGradient11488"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-969"
+       id="radialGradient11490"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-861"
+       id="radialGradient11492"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-681"
+       id="radialGradient11494"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-497"
+       id="radialGradient11496"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-37"
+       id="radialGradient11498"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-459"
+       id="radialGradient11500"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-912"
+       id="radialGradient11502"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-853"
+       id="radialGradient11504"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-497"
+       id="radialGradient11506"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-916"
+       id="radialGradient11508"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-185"
+       id="radialGradient11510"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-564"
+       id="radialGradient11512"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4750-3-923"
+       id="radialGradient11514"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       cx="18.63378"
+       cy="17.486208"
+       fx="18.934305"
+       fy="17.810213"
+       r="40.692665" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4126-45-647"
+       id="radialGradient11516"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.999989,1.000011)"
+       cx="15.601279"
+       cy="12.142302"
+       fx="15.601279"
+       fy="12.142302"
+       r="43.526714" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9830-7-943"
+       id="radialGradient11518"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.008999,0,0,1.318829,-111.5197,-18.76722)"
+       cx="93.780037"
+       cy="40.545052"
+       fx="93.780037"
+       fy="40.545052"
+       r="16.321514" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9842-9-516"
+       id="linearGradient11520"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.496216,0,0,0.326467,-39.19298,19.71465)"
+       x1="30.935921"
+       y1="43.757359"
+       x2="30.935921"
+       y2="28.112619" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9854-25-15"
+       id="linearGradient11522"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.495075,0,0,0.491366,39.02329,12.49911)"
+       x1="46.845825"
+       y1="19.804117"
+       x2="18.031221"
+       y2="27.759069" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9868-2-682"
+       id="radialGradient11524"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.258615,0,0,0.666552,57.40125,8.044513)"
+       cx="27.883883"
+       cy="7.139607"
+       fx="27.883883"
+       fy="7.139607"
+       r="9.7227182" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9880-6-51"
+       id="linearGradient11526"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.458294,0,0,0.458294,38.28479,11.28017)"
+       x1="31.852951"
+       y1="19.107729"
+       x2="34.007416"
+       y2="24.764584" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9896-0-273"
+       id="linearGradient11528"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.458294,0,0,0.458294,37.77328,11.28017)"
+       x1="31.078955"
+       y1="21.511185"
+       x2="33.710651"
+       y2="18.064039" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9896-0-273"
+       id="linearGradient11531"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.45710035,0,0,0.45710035,71.024913,42.323761)"
+       x1="31.078955"
+       y1="21.511185"
+       x2="33.710651"
+       y2="18.064039" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9880-6-51"
+       id="linearGradient11534"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.45710035,0,0,0.45710035,71.53509,42.323761)"
+       x1="31.852951"
+       y1="19.107729"
+       x2="34.007416"
+       y2="24.764584" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9854-25-15"
+       id="linearGradient11541"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.49378555,0,0,0.49008621,72.271667,43.539526)"
+       x1="46.845825"
+       y1="19.804117"
+       x2="18.031221"
+       y2="27.759069" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9842-9-516"
+       id="linearGradient11544"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.49492358,0,0,0.3256167,-72.440915,50.736273)"
+       x1="30.935921"
+       y1="43.757359"
+       x2="30.935921"
+       y2="28.112619" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9830-7-943"
+       id="radialGradient11547"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.006371,0,0,1.315394,-144.57926,12.354631)"
+       cx="93.780037"
+       cy="40.545052"
+       fx="93.780037"
+       fy="40.545052"
+       r="16.321514" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4126-45-647"
+       id="radialGradient11550"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99738448,0,0,0.99740642,33.350015,31.072971)"
+       cx="15.601279"
+       cy="12.142302"
+       fx="15.601279"
+       fy="12.142302"
+       r="43.526714" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3962-4-207"
+       id="radialGradient11636"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99738448,0,0,0.99740642,33.350015,31.072971)"
+       cx="18.247644"
+       cy="15.716079"
+       fx="18.247644"
+       fy="15.716079"
+       r="29.993349" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="18.468724"
+     inkscape:cy="39.931397"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       transform="matrix(0.01146055,0,0,0.01146055,-3.3981012,-10.433467)"
+       style="visibility:visible"
+       id="g10-3-4"
+       class="Graphic">
+      <g
+         id="g12-9-7">
+        <g
+           id="g14-6-4"
+           style="fill:#c7c7c7;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path16-2-8"
+             d="m 5903,2361 c 50,82 34,3995 -31,4149 -51,122 -1703,1495 -1789,1531 -1117,-7 -1870,-414 -1995,-629 -48,-270 -7,-4433 38,-4520 40,-76 2153,-833 2227,-851 67,-15 1493,229 1550,320 z" />
+        </g>
+        <g
+           id="g18-0-5"
+           style="fill:#000000;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path20-2-8"
+             d="m 5881,2374 2,-1 -2,2 c 0,-1 -1,-1 -1,-1 0,-1 0,-1 0,-2 0,0 0,0 0,0 l 7,-3 -2,2 -5,1 5,-1 -2,2 -2,1 z m 2,-1 0,0 0,0 2,-2 0,0 0,0 2,-2 5,-2 -5,4 5,-4 1,0 -6,3 0,1 0,-1 -4,3 0,0 z m 10,-6 -1,0 1,0 -1,0 11,-6 -10,5 0,1 z m 11,-4 -11,4 0,-1 11,-3 z m 20,-15 c -2,-3 -4,-6 -7,-9 -2,-3 -5,-5 -8,-7 -5,-4 -12,-8 -20,-12 -7,-4 -15,-7 -24,-11 -9,-4 -19,-7 -30,-11 -21,-8 -47,-16 -75,-24 -29,-8 -61,-16 -95,-25 -136,-34 -313,-72 -494,-106 -181,-35 -364,-66 -511,-90 -73,-11 -138,-21 -1 [...]
+        </g>
+        <g
+           id="g22-3-2"
+           style="fill:#ffffff;fill-opacity:0.54117647;stroke:#ffffff;stroke-opacity:0.54117647">
+          <path
+             inkscape:connector-curvature="0"
+             id="path24-8-6"
+             d="m 5822,2442 -52,22 -52,23 -52,23 -53,25 -53,25 -53,26 -53,26 -54,27 -54,27 -54,28 -55,28 -54,29 -55,29 -55,29 -111,60 -112,60 -112,60 -113,61 -114,60 -114,60 -114,59 -57,29 -57,29 -58,28 -57,28 -27,-6 -28,-7 -56,-13 -58,-14 -59,-13 -60,-14 -61,-14 -61,-14 -63,-14 -62,-14 -63,-15 -127,-28 -127,-28 -64,-14 -63,-14 -62,-13 -62,-13 -61,-13 -60,-13 -60,-13 -58,-12 -57,-12 -28,-5 -28,-6 -27,-5 -27,-6 -27,-5 -26,-5 -26,-5 -25,-6 -25,-4 -24,-5 -24,-5 -24,-4 -23,-4 -22,-5 -22,-4 - [...]
+        </g>
+        <g
+           id="g26-0-0"
+           style="fill:#ffffff;stroke:none" />
+        <g
+           id="g28-8-6"
+           style="fill:none;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path30-3-6"
+             d="m 5822,2442 c -549,232 -1156,606 -1768,901 -580,-138 -1417,-322 -1839,-396 543,169 1257,327 1800,496 32,1271 16,3196 48,4467 16,-1282 59,-3238 75,-4519 586,-317 1161,-601 1684,-949 z" />
+        </g>
+        <g
+           id="g32-2-46"
+           style="fill:#000000;fill-opacity:0.16078431;stroke:#ffffff;stroke-opacity:0.16078431">
+          <path
+             inkscape:connector-curvature="0"
+             id="path34-2-2"
+             d="m 2420,6628 10,14 10,13 11,13 12,13 12,12 12,12 14,12 13,12 14,12 15,11 15,11 16,11 15,11 17,10 16,10 17,11 18,9 18,10 18,9 18,8 19,9 19,8 19,8 19,8 40,15 40,14 41,12 41,11 42,10 41,9 42,8 41,6 41,6 41,3 21,2 20,1 19,1 20,0 20,0 19,0 19,-1 19,-1 18,-1 19,-1 17,-2 18,-3 17,-2 17,-3 17,-4 16,-4 15,-4 15,-4 15,-5 15,-5 -2,-1 -1,0 -5,-2 -6,-1 -7,-2 -8,-2 -10,-3 -10,-3 -12,-3 -13,-4 -14,-3 -15,-4 -16,-5 -16,-4 -18,-5 -18,-5 -19,-5 -20,-6 -20,-5 -21,-6 -22,-6 -22,-6 -22,-6 -23, [...]
+        </g>
+        <g
+           id="g36-6-8"
+           style="fill:#000000;stroke:none" />
+        <g
+           id="g38-3-9"
+           style="fill:none;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path40-1-6"
+             d="m 2420,6628 c 201,289 833,431 1133,315 -53,-14 -1066,-293 -1133,-315 z" />
+        </g>
+        <g
+           id="g42-7-0"
+           style="fill:#ffffff;fill-opacity:0.38823529;stroke:#ffffff;stroke-opacity:0.38823529">
+          <path
+             inkscape:connector-curvature="0"
+             id="path44-1-7"
+             d="m 3454,6093 -936,-361 -9,4 -8,4 -8,4 -6,5 -6,6 -6,6 -5,7 -5,6 -4,7 -4,7 -3,7 -3,8 -3,8 -2,7 -3,15 -2,15 -2,14 0,6 0,7 0,5 0,6 0,5 0,4 0,4 1,4 0,2 0,2 0,1 0,1 146,51 0,0 1,1 1,1 1,1 1,2 2,2 1,3 3,3 2,3 3,4 3,4 3,4 4,5 4,4 4,6 5,4 10,12 10,11 13,12 13,12 14,13 15,12 17,13 17,12 19,12 19,11 21,11 22,10 11,4 11,5 12,4 12,4 13,3 12,3 13,3 13,3 13,2 13,1 14,2 14,1 14,0 15,0 15,0 15,-1 15,-2 15,-2 16,-2 16,-3 16,-4 16,-4 17,-5 17,-6 0,0 1,0 0,0 2,1 3,0 6,1 6,1 7,1 8,1 9,1 10,1 1 [...]
+        </g>
+        <g
+           id="g46-2-01"
+           style="fill:#ffffff;stroke:none" />
+        <g
+           id="g48-5-0"
+           style="fill:none;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path50-4-1"
+             d="m 3454,6093 -936,-361 c -97,34 -78,177 -78,177 l 146,51 c 0,0 204,319 566,194 0,0 269,48 302,-61 z" />
+        </g>
+        <g
+           id="g52-9-3"
+           style="fill:#606060;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path54-6-7"
+             d="m 3446,5971 c -311,-81 -622,-161 -933,-242 -12,44 -13,107 6,140 47,23 142,41 189,64 136,131 255,142 472,124 84,17 168,31 251,48 26,-51 33,-72 15,-134 z" />
+        </g>
+        <g
+           id="g56-2-7"
+           style="fill:none;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path58-9-2"
+             d="m 3446,5971 c -311,-81 -622,-161 -933,-242 -12,44 -13,107 6,140 47,23 142,41 189,64 136,131 255,142 472,124 84,17 168,31 251,48 26,-51 33,-72 15,-134 z" />
+        </g>
+        <g
+           id="g60-7-6"
+           style="fill:#ffffff;fill-opacity:0.4;stroke:#ffffff;stroke-opacity:0.4">
+          <path
+             inkscape:connector-curvature="0"
+             id="path62-5-45"
+             d="m 5856,2414 -1813,1017 7,4549 1775,-1494 31,-4072 z" />
+        </g>
+        <g
+           id="g64-9-20"
+           style="fill:#ffffff;stroke:none" />
+        <g
+           id="g66-0-2"
+           style="fill:none;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path68-2-9"
+             d="m 5856,2414 -1813,1017 7,4549 1775,-1494 31,-4072 z" />
+        </g>
+        <g
+           id="g70-2-09"
+           style="fill:#000000;fill-opacity:0.16078431;stroke:#ffffff;stroke-opacity:0.16078431">
+          <path
+             inkscape:connector-curvature="0"
+             id="path72-3-9"
+             d="m 2525,6916 10,13 11,12 10,13 11,11 11,12 11,11 12,11 12,10 12,10 12,10 13,10 12,9 13,9 13,8 27,17 28,15 28,14 28,13 29,11 29,11 30,9 30,8 29,8 30,6 30,5 30,4 30,3 30,2 29,2 29,0 29,-1 27,-2 28,-2 27,-3 26,-5 25,-5 24,-6 24,-6 22,-8 -2,-1 -4,0 -4,-2 -5,-1 -6,-2 -8,-2 -8,-2 -9,-2 -10,-3 -10,-3 -11,-3 -12,-3 -13,-4 -13,-3 -14,-4 -15,-4 -15,-4 -15,-5 -16,-4 -16,-5 -17,-4 -18,-5 -35,-10 -36,-10 -38,-10 -38,-10 -38,-11 -76,-21 -37,-10 -37,-11 -36,-10 -17,-4 -17,-5 -17,-5 -16,- [...]
+        </g>
+        <g
+           id="g74-2-4"
+           style="fill:#000000;stroke:none" />
+        <g
+           id="g76-0-51"
+           style="fill:none;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path78-5-0"
+             d="m 2525,6916 c 209,276 627,323 861,239 -39,-10 -810,-222 -861,-239 z" />
+        </g>
+        <g
+           id="g80-4-3"
+           style="fill:#000000;fill-opacity:0.16078431;stroke:#ffffff;stroke-opacity:0.16078431">
+          <path
+             inkscape:connector-curvature="0"
+             id="path82-5-7"
+             d="m 2680,7199 12,15 12,14 13,14 14,12 14,13 14,11 15,11 16,11 15,9 17,9 16,9 17,7 18,7 17,7 18,5 18,5 18,5 19,3 18,4 19,2 18,2 19,1 19,0 19,0 18,-1 19,-2 18,-2 19,-3 18,-4 18,-4 18,-5 17,-6 -1,0 -2,-1 -3,0 -4,-1 -3,-1 -5,-2 -5,-1 -6,-2 -6,-1 -6,-2 -7,-2 -8,-2 -8,-2 -8,-3 -9,-2 -9,-2 -19,-6 -20,-5 -22,-6 -22,-6 -23,-6 -23,-7 -48,-13 -48,-13 -23,-7 -23,-6 -23,-6 -21,-6 -21,-6 -19,-6 -9,-2 -9,-3 -9,-2 -8,-2 -8,-2 -7,-2 -7,-2 -6,-2 -6,-2 -5,-2 -5,-1 -5,-1 -3,-1 -3,-1 -3,-1 -2,0 z" />
+        </g>
+        <g
+           id="g84-0-8"
+           style="fill:#000000;stroke:none" />
+        <g
+           id="g86-2-8"
+           style="fill:none;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path88-7-6"
+             d="m 2680,7199 c 121,163 355,213 540,149 -25,-6 -507,-139 -540,-149 z" />
+        </g>
+        <g
+           id="g90-0-0"
+           style="fill:#fcfcfc;fill-opacity:0.43921569;stroke:#ffffff;stroke-opacity:0.43921569">
+          <path
+             inkscape:connector-curvature="0"
+             id="path92-8-4"
+             d="m 2356,3259 -92,13 -17,2173 1425,399 35,-116 -1369,-365 18,-2104 z" />
+        </g>
+        <g
+           id="g94-9-6"
+           style="fill:#fcfcfc;stroke:none" />
+        <g
+           id="g96-3-7"
+           style="fill:none;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path98-4-6"
+             d="m 2356,3259 -92,13 -17,2173 1425,399 35,-116 -1369,-365 18,-2104 z" />
+        </g>
+        <g
+           id="g100-4-0"
+           style="fill:#000000;fill-opacity:0.23137255;stroke:#ffffff;stroke-opacity:0.23137255">
+          <path
+             inkscape:connector-curvature="0"
+             id="path102-6-9"
+             d="m 3700,4065 -2,61 -1340,-386 1342,325 z" />
+        </g>
+        <g
+           id="g104-1-7"
+           style="fill:#000000;stroke:none" />
+        <g
+           id="g106-8-5"
+           style="fill:#000000;fill-opacity:0.23137255;stroke:#ffffff;stroke-opacity:0.23137255">
+          <path
+             inkscape:connector-curvature="0"
+             id="path108-9-9"
+             d="m 3720,4507 -3,61 -1339,-386 1342,325 z" />
+        </g>
+        <g
+           id="g110-8-7"
+           style="fill:#000000;stroke:none" />
+        <g
+           id="g112-2-8"
+           style="fill:#000000;fill-opacity:0.23137255;stroke:#ffffff;stroke-opacity:0.23137255">
+          <path
+             inkscape:connector-curvature="0"
+             id="path114-0-5"
+             d="m 3700,4916 -2,61 -1340,-386 1342,325 z" />
+        </g>
+        <g
+           id="g116-5-3"
+           style="fill:#000000;stroke:none" />
+        <g
+           id="g118-6-3"
+           style="fill:#000000;fill-opacity:0.23137255;stroke:#ffffff;stroke-opacity:0.23137255">
+          <path
+             inkscape:connector-curvature="0"
+             id="path120-1-83"
+             d="m 3700,5318 -2,61 -1340,-387 1342,326 z" />
+        </g>
+        <g
+           id="g122-4-7"
+           style="fill:#000000;stroke:none" />
+        <g
+           id="g124-1-93"
+           style="fill:#9e9e9e;stroke:none">
+          <path
+             inkscape:connector-curvature="0"
+             id="path126-0-7"
+             d="m 2361,3309 1332,333 -11,2197 11,0 11,0 11,-2205 0,-9 -8,-2 -1341,-335 -2,11 -3,10 z m 1340,335 -8,-2 0,-8 11,0 -3,10 z" />
+        </g>
+      </g>
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:url(#radialGradient11636);fill-opacity:1;fill-rule:nonzero;stroke:#3f3f3f;stroke-width:0.99739546;stroke-miterlimit:4;stroke-opacity:1"
+       d="m 77.195372,54.497301 c 0,10.681824 -8.65949,19.341216 -19.339845,19.341216 -10.681333,0 -19.340334,-8.65949 -19.340334,-19.341216 0,-10.681334 8.659001,-19.339844 19.340334,-19.339844 10.680355,0 19.339845,8.65851 19.339845,19.339844 l 0,0 z"
+       id="path3214-4" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.42159382;fill:url(#radialGradient11432);fill-opacity:1;stroke:none"
+       id="path4348-1"
+       sodipodi:cx="17.778685"
+       sodipodi:cy="15.271057"
+       sodipodi:rx="12.929953"
+       sodipodi:ry="9.2934036"
+       d="m 30.708637,15.271057 a 12.929953,9.2934036 0 1 1 -25.859905,0 12.929953,9.2934036 0 1 1 25.859905,0 z"
+       transform="matrix(0.83376076,0,0,0.99739545,43.211132,31.072971)" />
+    <g
+       id="g4136-9"
+       style="fill:#000000;fill-opacity:0.71345029;fill-rule:nonzero;stroke:none"
+       transform="matrix(0.97981237,0,0,0.97981237,33.470779,31.305278)">
+      <g
+         id="g4138-0">
+        <g
+           id="g4142-9">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 44.0713,20.7144 c 0,0.2627 0,0 0,0 l -0.5449,0.6172 c -0.334,-0.3936 -0.709,-0.7246 -1.0898,-1.0703 l -0.8359,0.123 -0.7637,-0.8633 0,1.0684 0.6543,0.4951 0.4355,0.4932 0.582,-0.6582 c 0.1465,0.2744 0.291,0.5488 0.4365,0.8232 l 0,0.8223 -0.6553,0.7402 -1.1992,0.8232 -0.9082,0.9063 -0.582,-0.6602 0.291,-0.7402 -0.5811,-0.6582 -0.9814,-2.0977 -0.8359,-0.9453 -0.2188,0.2461 0.3281,1.1934 0.6172,0.6992 c 0.3525,1.0176 0.7012,1.9902 1.1641,2.9629 0.7178,0 1.3945,-0.0762 2.10 [...]
+             id="path4144-8" />
+        </g>
+      </g>
+      <g
+         id="g4146-8">
+        <g
+           id="g4150-58">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 26.0703,9.2363 -0.0732,0.4932 0.5098,0.3291 0.8711,-0.5757 -0.4355,-0.4937 -0.582,0.3296 -0.29,-0.0825"
+             id="path4152-4" />
+        </g>
+      </g>
+      <g
+         id="g4154-3">
+        <g
+           id="g4158-7">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 26.8701,5.8633 -1.8906,-0.7407 -2.1797,0.2466 -2.6904,0.7402 -0.5088,0.4941 1.6719,1.1514 0,0.6582 -0.6543,0.6582 0.873,1.729 0.5801,-0.3301 0.7285,-1.1514 c 1.123,-0.3472 2.1299,-0.7407 3.1973,-1.2344 l 0.873,-2.2212"
+             id="path4160-1" />
+        </g>
+      </g>
+      <g
+         id="g4162-3">
+        <g
+           id="g4166-8">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 28.833,12.7749 -0.291,-0.7412 -0.5098,0.165 0.1465,0.9043 0.6543,-0.3281"
+             id="path4168-0" />
+        </g>
+      </g>
+      <g
+         id="g4170-9">
+        <g
+           id="g4174-7">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 29.123,12.6089 -0.1455,0.9883 0.7998,-0.165 0.5811,-0.5752 -0.5088,-0.4941 C 29.6787,11.9078 29.4824,11.483 29.2685,11.0465 l -0.4355,0 0,0.4932 0.29,0.3291 0,0.7402"
+             id="path4176-9" />
+        </g>
+      </g>
+      <g
+         id="g4178-9">
+        <g
+           id="g4182-3">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 18.3652,28.2422 -0.582,-1.1523 -1.0903,-0.2466 -0.5815,-1.5625 -1.4536,0.1641 -1.2354,-0.9043 -1.3091,1.1514 0,0.1816 c -0.396,-0.1143 -0.8828,-0.1299 -1.2354,-0.3467 l -0.291,-0.8223 0,-0.9053 -0.8721,0.082 c 0.0728,-0.5762 0.145,-1.1514 0.2183,-1.7275 l -0.5093,0 -0.5083,0.6582 -0.5093,0.2461 -0.7271,-0.4102 -0.0728,-0.9053 0.1455,-0.9873 1.0908,-0.8223 0.8721,0 0.145,-0.4941 1.0903,0.2461 0.7998,0.9883 0.1455,-1.6465 1.3813,-1.1514 0.5088,-1.2344 1.0176,-0.4111 0.581 [...]
+             id="path4184-2" />
+        </g>
+      </g>
+      <g
+         id="g4186-4">
+        <g
+           id="g4190-3">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 16.7656,9.5649 0.7266,0.4937 0.582,0 0,-0.5757 -0.7266,-0.3291 -0.582,0.4111"
+             id="path4192-71" />
+        </g>
+      </g>
+      <g
+         id="g4194-2">
+        <g
+           id="g4198-2">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 14.876,8.9072 -0.3638,0.9048 0.7271,0 0.3638,-0.8228 C 15.9166,8.7675 16.2286,8.5444 16.5479,8.331 l 0.7271,0.2471 c 0.4844,0.3291 0.9688,0.6582 1.4536,0.9868 L 19.4561,8.9072 18.6558,8.5781 18.292,7.8374 16.9111,7.6728 16.8383,7.2612 16.184,7.4262 15.8936,8.002 15.5298,7.2613 l -0.145,0.3291 0.0728,0.8228 -0.5816,0.494"
+             id="path4200-02" />
+        </g>
+      </g>
+      <g
+         id="g4202-1">
+        <g
+           style="opacity:0.75"
+           id="g4204-7">
+          <path
+             inkscape:connector-curvature="0"
+             id="path4206-5"
+             d="" />
+        </g>
+        <g
+           id="g4208-1">
+          <path
+             inkscape:connector-curvature="0"
+             id="path4210-7"
+             d="" />
+        </g>
+      </g>
+      <g
+         id="g4212-4">
+        <g
+           style="opacity:0.75"
+           id="g4214-1">
+          <path
+             inkscape:connector-curvature="0"
+             id="path4216-7"
+             d="" />
+        </g>
+        <g
+           id="g4218-1">
+          <path
+             inkscape:connector-curvature="0"
+             id="path4220-11"
+             d="" />
+        </g>
+      </g>
+      <g
+         id="g4222-7">
+        <g
+           id="g4226-0">
+          <path
+             inkscape:connector-curvature="0"
+             d="M 17.4922,6.8496 17.856,6.521 18.5831,6.3564 c 0.498,-0.2422 0.998,-0.4053 1.5264,-0.5762 l -0.29,-0.4937 -0.9385,0.1348 -0.4434,0.4419 -0.731,0.106 -0.6499,0.3052 -0.3159,0.1528 -0.1929,0.2583 0.9443,0.1641"
+             id="path4228-4" />
+        </g>
+      </g>
+      <g
+         id="g4230-08">
+        <g
+           id="g4234-5">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 18.7285,14.6665 0.4365,-0.6582 -0.6548,-0.4932 0.2183,1.1514"
+             id="path4236-1" />
+        </g>
+      </g>
+    </g>
+    <g
+       id="g3216-6"
+       style="color:#000000;fill:url(#radialGradient11514);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.01794541;marker:none;visibility:visible;display:inline;overflow:visible"
+       transform="matrix(0.97981237,0,0,0.97981237,33.269274,31.103774)">
+      <g
+         id="g3218-6"
+         style="color:#000000;fill:url(#radialGradient11438);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3222-21"
+           style="color:#000000;fill:url(#radialGradient11436);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 44.0713,20.7144 c 0,0.2627 0,0 0,0 l -0.5449,0.6172 c -0.334,-0.3936 -0.709,-0.7246 -1.0898,-1.0703 l -0.8359,0.123 -0.7637,-0.8633 0,1.0684 0.6543,0.4951 0.4355,0.4932 0.582,-0.6582 c 0.1465,0.2744 0.291,0.5488 0.4365,0.8232 l 0,0.8223 -0.6553,0.7402 -1.1992,0.8232 -0.9082,0.9063 -0.582,-0.6602 0.291,-0.7402 -0.5811,-0.6582 -0.9814,-2.0977 -0.8359,-0.9453 -0.2188,0.2461 0.3281,1.1934 0.6172,0.6992 c 0.3525,1.0176 0.7012,1.9902 1.1641,2.9629 0.7178,0 1.3945,-0.0762 2.10 [...]
+             id="path3224-96"
+             style="color:#000000;fill:url(#radialGradient11434);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3226-4"
+         style="color:#000000;fill:url(#radialGradient11444);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3230-80"
+           style="color:#000000;fill:url(#radialGradient11442);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 26.0703,9.2363 -0.0732,0.4932 0.5098,0.3291 0.8711,-0.5757 -0.4355,-0.4937 -0.582,0.3296 -0.29,-0.0825"
+             id="path3232-8"
+             style="color:#000000;fill:url(#radialGradient11440);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3234-1"
+         style="color:#000000;fill:url(#radialGradient11450);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3238-0"
+           style="color:#000000;fill:url(#radialGradient11448);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 26.8701,5.8633 -1.8906,-0.7407 -2.1797,0.2466 -2.6904,0.7402 -0.5088,0.4941 1.6719,1.1514 0,0.6582 -0.6543,0.6582 0.873,1.729 0.5801,-0.3301 0.7285,-1.1514 c 1.123,-0.3472 2.1299,-0.7407 3.1973,-1.2344 l 0.873,-2.2212"
+             id="path3240-2"
+             style="color:#000000;fill:url(#radialGradient11446);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3242-2"
+         style="color:#000000;fill:url(#radialGradient11456);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3246-97"
+           style="color:#000000;fill:url(#radialGradient11454);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 28.833,12.7749 -0.291,-0.7412 -0.5098,0.165 0.1465,0.9043 0.6543,-0.3281"
+             id="path3248-5"
+             style="color:#000000;fill:url(#radialGradient11452);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3250-64"
+         style="color:#000000;fill:url(#radialGradient11462);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3254-63"
+           style="color:#000000;fill:url(#radialGradient11460);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 29.123,12.6089 -0.1455,0.9883 0.7998,-0.165 0.5811,-0.5752 -0.5088,-0.4941 C 29.6787,11.9078 29.4824,11.483 29.2685,11.0465 l -0.4355,0 0,0.4932 0.29,0.3291 0,0.7402"
+             id="path3256-7"
+             style="color:#000000;fill:url(#radialGradient11458);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3258-9"
+         style="color:#000000;fill:url(#radialGradient11468);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3262-7"
+           style="color:#000000;fill:url(#radialGradient11466);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 18.3652,28.2422 -0.582,-1.1523 -1.0903,-0.2466 -0.5815,-1.5625 -1.4536,0.1641 -1.2354,-0.9043 -1.3091,1.1514 0,0.1816 c -0.396,-0.1143 -0.8828,-0.1299 -1.2354,-0.3467 l -0.291,-0.8223 0,-0.9053 -0.8721,0.082 c 0.0728,-0.5762 0.145,-1.1514 0.2183,-1.7275 l -0.5093,0 -0.5083,0.6582 -0.5093,0.2461 -0.7271,-0.4102 -0.0728,-0.9053 0.1455,-0.9873 1.0908,-0.8223 0.8721,0 0.145,-0.4941 1.0903,0.2461 0.7998,0.9883 0.1455,-1.6465 1.3813,-1.1514 0.5088,-1.2344 1.0176,-0.4111 0.581 [...]
+             id="path3264-4"
+             style="color:#000000;fill:url(#radialGradient11464);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3266-9"
+         style="color:#000000;fill:url(#radialGradient11474);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3270-1"
+           style="color:#000000;fill:url(#radialGradient11472);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 16.7656,9.5649 0.7266,0.4937 0.582,0 0,-0.5757 -0.7266,-0.3291 -0.582,0.4111"
+             id="path3272-7"
+             style="color:#000000;fill:url(#radialGradient11470);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3274-0"
+         style="color:#000000;fill:url(#radialGradient11480);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3278-6"
+           style="color:#000000;fill:url(#radialGradient11478);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 14.876,8.9072 -0.3638,0.9048 0.7271,0 0.3638,-0.8228 C 15.9166,8.7675 16.2286,8.5444 16.5479,8.331 l 0.7271,0.2471 c 0.4844,0.3291 0.9688,0.6582 1.4536,0.9868 L 19.4561,8.9072 18.6558,8.5781 18.292,7.8374 16.9111,7.6728 16.8383,7.2612 16.184,7.4262 15.8936,8.002 15.5298,7.2613 l -0.145,0.3291 0.0728,0.8228 -0.5816,0.494"
+             id="path3280-0"
+             style="color:#000000;fill:url(#radialGradient11476);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3282-8"
+         style="color:#000000;fill:url(#radialGradient11490);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           style="opacity:0.75;color:#000000;fill:url(#radialGradient11484);marker:none;visibility:visible;display:inline;overflow:visible"
+           id="g3284-5">
+          <path
+             inkscape:connector-curvature="0"
+             d=""
+             style="color:#000000;fill:url(#radialGradient11482);marker:none;visibility:visible;display:inline;overflow:visible"
+             id="path3286-39" />
+        </g>
+        <g
+           id="g3288-4"
+           style="color:#000000;fill:url(#radialGradient11488);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d=""
+             id="path3290-1"
+             style="color:#000000;fill:url(#radialGradient11486);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3292-5"
+         style="color:#000000;fill:url(#radialGradient11500);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           style="opacity:0.75;color:#000000;fill:url(#radialGradient11494);marker:none;visibility:visible;display:inline;overflow:visible"
+           id="g3294-4">
+          <path
+             inkscape:connector-curvature="0"
+             d=""
+             style="color:#000000;fill:url(#radialGradient11492);marker:none;visibility:visible;display:inline;overflow:visible"
+             id="path3296-1" />
+        </g>
+        <g
+           id="g3298-5"
+           style="color:#000000;fill:url(#radialGradient11498);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d=""
+             id="path3300-5"
+             style="color:#000000;fill:url(#radialGradient11496);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3302-4"
+         style="color:#000000;fill:url(#radialGradient11506);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3306-9"
+           style="color:#000000;fill:url(#radialGradient11504);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="M 17.4922,6.8496 17.856,6.521 18.5831,6.3564 c 0.498,-0.2422 0.998,-0.4053 1.5264,-0.5762 l -0.29,-0.4937 -0.9385,0.1348 -0.4434,0.4419 -0.731,0.106 -0.6499,0.3052 -0.3159,0.1528 -0.1929,0.2583 0.9443,0.1641"
+             id="path3308-83"
+             style="color:#000000;fill:url(#radialGradient11502);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+      <g
+         id="g3310-8"
+         style="color:#000000;fill:url(#radialGradient11512);marker:none;visibility:visible;display:inline;overflow:visible">
+        <g
+           id="g3314-5"
+           style="color:#000000;fill:url(#radialGradient11510);marker:none;visibility:visible;display:inline;overflow:visible">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 18.7285,14.6665 0.4365,-0.6582 -0.6548,-0.4932 0.2183,1.1514"
+             id="path3316-2"
+             style="color:#000000;fill:url(#radialGradient11508);marker:none;visibility:visible;display:inline;overflow:visible" />
+        </g>
+      </g>
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:url(#radialGradient11550);stroke-width:0.99739546;stroke-miterlimit:4;stroke-opacity:1"
+       d="m 76.213177,54.497336 c 0,10.139342 -8.219713,18.358964 -18.357661,18.358964 -10.138878,0 -18.358128,-8.219714 -18.358128,-18.358964 0,-10.138878 8.21925,-18.357662 18.358128,-18.357662 10.137948,0 18.357661,8.218784 18.357661,18.357662 l 0,0 z"
+       id="path4122-2" />
+    <rect
+       ry="0.70526326"
+       rx="0.70526338"
+       y="44.541401"
+       x="-65.758995"
+       height="20.896566"
+       width="15.956172"
+       id="rect9828-2"
+       style="color:#000000;fill:url(#radialGradient11547);fill-opacity:1;fill-rule:evenodd;stroke:#3f3f3f;stroke-width:0.99739593;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true"
+       transform="scale(-1,1)" />
+    <rect
+       y="58.825336"
+       x="-65.26667"
+       height="6.1590796"
+       width="14.960932"
+       id="rect9840-70"
+       style="color:#000000;fill:url(#linearGradient11544);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true"
+       transform="scale(-1,1)" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       id="path9852-3"
+       d="m 65.325876,65.109091 -0.05921,-20.072584 -10.752025,0.146333 -0.02182,13.852737 10.833055,6.073514 z"
+       style="color:#000000;fill:url(#linearGradient11541);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.33689838;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99739558;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+       d="m 64.769376,45.475141 -9.797676,0.06234 0,13.195041 9.92235,5.423338 -0.124674,-18.680716 z"
+       id="rect9838-4"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       inkscape:connector-curvature="0"
+       style="color:#000000;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+       d="m 65.244746,64.320057 0.02192,-19.28355 -10.69131,0 -0.03697,13.824063 10.706364,5.459487 z"
+       id="path9866-6"
+       sodipodi:nodetypes="ccccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccsscc"
+       id="path9878-3"
+       d="m 57.47508,50.760095 -0.878751,1.121164 0.666639,2.201928 c 0,0 -0.121208,0.686841 -0.474727,0.222213 C 56.43472,53.840773 55.42953,52.668043 55.606472,51.810555 55.73778,51.174219 56.1014,50.871201 56.1014,50.871201 l 1.37368,-0.111106 z"
+       style="color:#000000;fill:url(#linearGradient11534);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csccscs"
+       id="path9862-6"
+       d="m 56.636731,50.255065 c 0,0 -0.988832,0.457886 -1.020159,0.85855 -0.04652,0.595018 1.939313,2.484744 1.939313,2.484744 0.232313,0.282817 0.616136,0.0303 0.404023,-0.242414 0,0 -1.584585,-1.882326 -1.484786,-2.030218 0.125068,-0.185334 0.898952,-0.474727 0.898952,-0.474727 0.464627,-0.34342 -0.12233,-1.053828 -0.737343,-0.595935 z"
+       style="color:#000000;fill:url(#linearGradient11531);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+  </g>
+</svg>
diff --git a/interface/images/menu/quality.svg b/interface/images/menu/quality.svg
new file mode 100755
index 0000000..22e5825
--- /dev/null
+++ b/interface/images/menu/quality.svg
@@ -0,0 +1,1638 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="96x96 (action).svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="80.136658"
+     inkscape:cy="53.378531"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3737"
+       inkscape:collect="always">
+      <stop
+         id="stop3739"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3741"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2276c5;stop-opacity:1;" />
+      <stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#68baf4;stop-opacity:1;" />
+    </linearGradient>
+    <filter
+       id="filter3174"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843"
+       xlink:href="#linearGradient3700"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <filter
+       id="filter3657"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3"
+       inkscape:collect="always">
+      <stop
+         id="stop3739-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3741-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#c80000;stop-opacity:1;" />
+      <stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f3604d;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient22071"
+       id="linearGradient36226"
+       y2="882.38538"
+       x2="723.41833"
+       y1="845.57513"
+       x1="580.76904" />
+    <linearGradient
+       id="linearGradient22071">
+      <stop
+         id="stop22073"
+         offset="0"
+         style="stop-color:#86867c;stop-opacity:1" />
+      <stop
+         id="stop22075"
+         offset="1"
+         style="stop-color:#b6aea8;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient21172"
+       id="linearGradient36228"
+       y2="943.7016"
+       x2="624.88544"
+       y1="917.3114"
+       x1="459.52634" />
+    <linearGradient
+       id="linearGradient21172">
+      <stop
+         id="stop21174"
+         offset="0"
+         style="stop-color:#bbbbb3;stop-opacity:1" />
+      <stop
+         id="stop21176"
+         offset="1"
+         style="stop-color:#dde2d8;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1,0,0,0.959566,0,18.91242)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36230"
+       y2="581.33203"
+       x2="435.35544"
+       y1="581.33203"
+       x1="267.88959" />
+    <linearGradient
+       id="linearGradient4511">
+      <stop
+         id="stop4513"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop4515"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36232"
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993" />
+    <linearGradient
+       id="linearGradient10867">
+      <stop
+         id="stop10869"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop10871"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36234"
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993" />
+    <linearGradient
+       id="linearGradient10874">
+      <stop
+         id="stop10876"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop10878"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36236"
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993" />
+    <linearGradient
+       id="linearGradient10881">
+      <stop
+         id="stop10883"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop10885"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36238"
+       y2="239.50504"
+       x2="363.35715"
+       y1="259.50504"
+       x1="313.78574" />
+    <linearGradient
+       id="linearGradient10888">
+      <stop
+         id="stop10890"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop10892"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36240"
+       y2="309.505"
+       x2="395.71429"
+       y1="340.93359"
+       x1="336.64285" />
+    <linearGradient
+       id="linearGradient10895">
+      <stop
+         id="stop10897"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop10899"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.005937,0,0,1,-4.017598,0)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36242"
+       y2="821.13818"
+       x2="379.8815"
+       y1="781.185"
+       x1="390.95264" />
+    <linearGradient
+       id="linearGradient10902">
+      <stop
+         id="stop10904"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop10906"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient21172"
+       id="linearGradient36244"
+       y2="672.78888"
+       x2="463.0274"
+       y1="806.07935"
+       x1="477.25916" />
+    <linearGradient
+       id="linearGradient10909">
+      <stop
+         id="stop10911"
+         offset="0"
+         style="stop-color:#bbbbb3;stop-opacity:1" />
+      <stop
+         id="stop10913"
+         offset="1"
+         style="stop-color:#dde2d8;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       spreadMethod="reflect"
+       gradientTransform="matrix(0.593028,0,0,0.533431,-73.44042,-192.4064)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36246"
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993" />
+    <linearGradient
+       id="linearGradient10916">
+      <stop
+         id="stop10918"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop10920"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       spreadMethod="reflect"
+       gradientTransform="matrix(0.593028,0,0,0.533431,-79.75629,-188.9785)"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient4511"
+       id="linearGradient36248"
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993" />
+    <linearGradient
+       id="linearGradient10923">
+      <stop
+         id="stop10925"
+         offset="0"
+         style="stop-color:#cdd0cd;stop-opacity:1" />
+      <stop
+         id="stop10927"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="882.38538"
+       x2="723.41833"
+       y1="845.57513"
+       x1="580.76904"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11177"
+       xlink:href="#linearGradient22071"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="943.7016"
+       x2="624.88544"
+       y1="917.3114"
+       x1="459.52634"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11179"
+       xlink:href="#linearGradient21172"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="581.33203"
+       x2="435.35544"
+       y1="581.33203"
+       x1="267.88959"
+       gradientTransform="matrix(1,0,0,0.959566,0,18.91242)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11181"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11183"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11185"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11187"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="239.50504"
+       x2="363.35715"
+       y1="259.50504"
+       x1="313.78574"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11189"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="309.505"
+       x2="395.71429"
+       y1="340.93359"
+       x1="336.64285"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11191"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="821.13818"
+       x2="379.8815"
+       y1="781.185"
+       x1="390.95264"
+       gradientTransform="matrix(1.005937,0,0,1,-4.017598,0)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11193"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="672.78888"
+       x2="463.0274"
+       y1="806.07935"
+       x1="477.25916"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11195"
+       xlink:href="#linearGradient21172"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientTransform="matrix(0.593028,0,0,0.533431,-73.44042,-192.4064)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11197"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientTransform="matrix(0.593028,0,0,0.533431,-79.75629,-188.9785)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11199"
+       xlink:href="#linearGradient4511"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="882.38538"
+       x2="723.41833"
+       y1="845.57513"
+       x1="580.76904"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11177-205"
+       xlink:href="#linearGradient22071-680"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient22071-680">
+      <stop
+         id="stop11313"
+         offset="0"
+         style="stop-color:#858585;stop-opacity:1" />
+      <stop
+         id="stop11315"
+         offset="1"
+         style="stop-color:#b0b0b0;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="943.7016"
+       x2="624.88544"
+       y1="917.3114"
+       x1="459.52634"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11179-67"
+       xlink:href="#linearGradient21172-452"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient21172-452">
+      <stop
+         id="stop11319"
+         offset="0"
+         style="stop-color:#bababa;stop-opacity:1" />
+      <stop
+         id="stop11321"
+         offset="1"
+         style="stop-color:#dfdfdf;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="581.33203"
+       x2="435.35544"
+       y1="581.33203"
+       x1="267.88959"
+       gradientTransform="matrix(1,0,0,0.959566,0,18.91242)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11181-595"
+       xlink:href="#linearGradient4511-346"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4511-346">
+      <stop
+         id="stop11325"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11327"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11187-880"
+       xlink:href="#linearGradient4511-359"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4511-359">
+      <stop
+         id="stop11331"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11333"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11183-494"
+       xlink:href="#linearGradient4511-370"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4511-370">
+      <stop
+         id="stop11337"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11339"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11185-603"
+       xlink:href="#linearGradient4511-711"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4511-711">
+      <stop
+         id="stop11343"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11345"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="239.50504"
+       x2="363.35715"
+       y1="259.50504"
+       x1="313.78574"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11189-154"
+       xlink:href="#linearGradient4511-359"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient11348">
+      <stop
+         id="stop11350"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11352"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="309.505"
+       x2="395.71429"
+       y1="340.93359"
+       x1="336.64285"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11191-472"
+       xlink:href="#linearGradient4511-306"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4511-306">
+      <stop
+         id="stop11356"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11358"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="821.13818"
+       x2="379.8815"
+       y1="781.185"
+       x1="390.95264"
+       gradientTransform="matrix(1.005937,0,0,1,-4.017598,0)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11193-240"
+       xlink:href="#linearGradient4511-87"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4511-87">
+      <stop
+         id="stop11362"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11364"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="672.78888"
+       x2="463.0274"
+       y1="806.07935"
+       x1="477.25916"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11195-741"
+       xlink:href="#linearGradient21172-993"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient21172-993">
+      <stop
+         id="stop11368"
+         offset="0"
+         style="stop-color:#bababa;stop-opacity:1" />
+      <stop
+         id="stop11370"
+         offset="1"
+         style="stop-color:#dfdfdf;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientTransform="matrix(0.593028,0,0,0.533431,-73.44042,-192.4064)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11197-385"
+       xlink:href="#linearGradient4511-837"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4511-837">
+      <stop
+         id="stop11374"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11376"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="1747.3987"
+       x2="806.98022"
+       y1="1769.6221"
+       x1="791.17993"
+       spreadMethod="reflect"
+       gradientTransform="matrix(0.593028,0,0,0.533431,-79.75629,-188.9785)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11199-858"
+       xlink:href="#linearGradient4511-244"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4511-244">
+      <stop
+         id="stop11380"
+         offset="0"
+         style="stop-color:#cfcfcf;stop-opacity:1" />
+      <stop
+         id="stop11382"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient22071-680"
+       id="linearGradient11760"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="580.76904"
+       y1="845.57513"
+       x2="723.41833"
+       y2="882.38538" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient21172-452"
+       id="linearGradient11762"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="459.52634"
+       y1="917.3114"
+       x2="624.88544"
+       y2="943.7016" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-346"
+       id="linearGradient11764"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.959566,0,18.91242)"
+       x1="267.88959"
+       y1="581.33203"
+       x2="435.35544"
+       y2="581.33203" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-370"
+       id="linearGradient11766"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-711"
+       id="linearGradient11768"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-359"
+       id="linearGradient11770"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-359"
+       id="linearGradient11772"
+       gradientUnits="userSpaceOnUse"
+       x1="313.78574"
+       y1="259.50504"
+       x2="363.35715"
+       y2="239.50504" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-306"
+       id="linearGradient11774"
+       gradientUnits="userSpaceOnUse"
+       x1="336.64285"
+       y1="340.93359"
+       x2="395.71429"
+       y2="309.505" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-87"
+       id="linearGradient11776"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.005937,0,0,1,-4.017598,0)"
+       x1="390.95264"
+       y1="781.185"
+       x2="379.8815"
+       y2="821.13818" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient21172-993"
+       id="linearGradient11778"
+       gradientUnits="userSpaceOnUse"
+       x1="477.25916"
+       y1="806.07935"
+       x2="463.0274"
+       y2="672.78888" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-837"
+       id="linearGradient11780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.593028,0,0,0.533431,-73.44042,-192.4064)"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-244"
+       id="linearGradient11782"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.593028,0,0,0.533431,-79.75629,-188.9785)"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-244"
+       id="linearGradient11797"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.05194661,0,0,0.04133238,-1.7416699,-5.5755863)"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-837"
+       id="linearGradient11800"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.05194661,0,0,0.04133238,-1.1884278,-5.8411937)"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-306"
+       id="linearGradient11820"
+       gradientUnits="userSpaceOnUse"
+       x1="336.64285"
+       y1="340.93359"
+       x2="395.71429"
+       y2="309.505"
+       gradientTransform="matrix(0.08759553,0,0,0.07748403,5.2446246,9.0672291)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-346"
+       id="linearGradient11836"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08759553,0,0,0.07435105,5.2446246,10.53264)"
+       x1="267.88959"
+       y1="581.33203"
+       x2="435.35544"
+       y2="581.33203" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient21172-452"
+       id="linearGradient11841"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="459.52634"
+       y1="917.3114"
+       x2="624.88544"
+       y2="943.7016"
+       gradientTransform="matrix(0.08759553,0,0,0.07748403,5.2446246,9.0672291)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient22071-680"
+       id="linearGradient11845"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="580.76904"
+       y1="845.57513"
+       x2="723.41833"
+       y2="882.38538"
+       gradientTransform="matrix(0.08759553,0,0,0.07748403,5.2446246,9.0672291)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-370"
+       id="linearGradient11849"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-711"
+       id="linearGradient11851"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4511-359"
+       id="linearGradient11853"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="791.17993"
+       y1="1769.6221"
+       x2="806.98022"
+       y2="1747.3987" />
+  </defs>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <rect
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <rect
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </g>
+  <g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       id="path22955"
+       style="fill:#c6c6c6;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.31408241;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 70.379994,71.723043 -1.224685,1.414839 0.01871,4.781404 1.392832,-1.474932 -0.186864,-4.721311 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path22080"
+       style="fill:#c6c6c6;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.32785773;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 64.274515,77.607727 -1.15583,1.590289 0.247678,5.204576 1.320948,-1.662571 -0.412796,-5.132294 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path21180"
+       style="fill:url(#linearGradient11845);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.37073162;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 45.739476,71.314149 c 0,0 20.484515,1.509992 21.2432,1.59388 0.758686,0.08389 1.991551,0.08389 1.991551,0.08389 0,0 0.189672,0 0.189672,0.419441 0,0.419442 0,4.194423 0,4.194423 0,0 0.09483,0.335553 -0.284508,0.335553 -0.379343,0 -5.974651,-0.503329 -5.974651,-0.503329 0,0 -0.09484,-0.587221 -0.66385,-0.587221 -0.569013,0 -16.975592,-1.426104 -16.975592,-1.426104 0,0 -1.99155,-1.50999 -2.086386,-2.013322 -0.09483,-0.50333 -0.758685,-1.59388 -0.284507,-1.845545 0.474178,-0.251 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path18548"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.37073162;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 34.101024,70.037038 -3.776342,4.258979 -2.414122,-1.423634 c 0,0 1.609416,-1.364316 2.011769,-1.601588 0.402353,-0.237273 1.072944,-0.771136 1.810593,-0.771136 0.804707,0 16.96592,-0.415225 17.569452,-0.415225 0.603531,0 18.441219,1.423633 19.111809,1.423633 0.670589,0 1.609415,0.118636 1.609415,0.118636 0,0 0.268236,-0.05932 0.134118,0.177954 -0.134118,0.237273 -1.005884,1.24568 -1.005884,1.24568 L 48.095313,71.686022 34.101024,70.037038 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path16799"
+       style="fill:url(#linearGradient11841);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.37073162;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 27.958121,73.022331 c 0,0 1.089377,0.674538 1.470657,0.915444 0.381283,0.240907 0.817034,0.433633 0.817034,0.433633 l 0.381282,-1.011807 c 0,0 0.7783,0.367483 1.416188,0.819081 0.596704,0.422441 4.070942,1.951222 7.135415,2.457244 3.064474,0.506022 11.874202,1.830888 15.959364,2.071794 4.08516,0.240906 8.006916,0.433632 8.006916,0.433632 l 0.272344,5.203575 -5.719227,-0.385449 c 0,0 0.108944,0.09636 -0.490218,-0.04819 -0.599157,-0.144543 -1.089377,-0.674537 -1.089377,-0.67453 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path1727"
+       style="fill:#000000"
+       d="m 39.49811,49.586609 c -0.231637,-0.405899 -0.256498,-0.503723 -0.173229,-0.681541 0.08483,-0.181174 0.04712,-0.303079 -0.296055,-0.957145 -0.317718,-0.605515 -0.436733,-0.759173 -0.61945,-0.799736 -0.124393,-0.02762 -0.283923,-0.149002 -0.354508,-0.269737 -0.15648,-0.267684 -0.158731,-0.304226 -0.01884,-0.306427 0.06022,-9.53e-4 0.206139,-0.06742 0.324253,-0.147715 l 0.214754,-0.145995 -0.324243,-0.611194 c -0.294453,-0.555026 -0.414826,-0.903968 -0.266616,-0.772865 0.0317,0.0 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path9785"
+       style="fill:#e3e3e3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.41771293;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 32.987829,33.849517 -5.857193,2.104431 c 0,0 -1.410065,2.678364 -1.843931,5.643695 -0.433865,2.965333 -0.867732,10.23518 1.518531,14.444038 2.386264,4.20886 9.328122,12.243953 14.968382,14.348382 5.640259,2.10443 6.507991,2.200086 6.507991,2.200086 0,0 1.70564,-0.398875 1.301599,-1.14787 -1.603573,-2.97264 -5.532263,-11.484358 -5.532263,-11.484358 l -2.38815,0.860901 -3.575625,0.385451 c 0,0 -3.038478,-2.579882 -4.014676,-4.110377 -0.976199,-1.530493 -4.230194,-7.461158 -3.03 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path26460"
+       style="fill:url(#linearGradient11836);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.32280812;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 34.71008,46.342024 c 0,0 -1.333592,-1.152268 -3.096969,-0.826164 -2.154849,0.398497 -3.331212,3.075816 -2.411999,5.910393 0.898796,2.771624 5.292586,9.833197 7.035936,10.700899 1.809088,0.900422 3.36991,-0.02262 4.578488,-0.388424 0.745453,-0.225632 2.389091,-1.126588 2.389091,-1.126588 l -1.061819,-0.826165 -3.981817,0.225318 c 0,0 -0.176971,0.300423 -1.238789,-0.525741 -1.061817,-0.826166 -4.430541,-4.680506 -5.697392,-8.375641 -0.671655,-1.959074 -0.224519,-3.599006 0.5833 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path6275"
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.9000001;marker:none;visibility:visible;display:inline;overflow:visible"
+       d="m 41.134124,27.446761 c 0.223155,0.420323 -1.594477,1.582935 -4.104812,2.625563 -2.510336,1.042629 -4.805464,1.588186 -5.183157,1.23205 -0.377696,-0.356136 1.298642,-1.485162 3.785727,-2.549716 2.487083,-1.064553 4.88541,-1.679615 5.416215,-1.389016" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3139"
+       style="fill:#000000"
+       d="m 56.27528,56.227329 c 0,-0.03103 0.08161,-0.101486 0.181357,-0.156603 0.09975,-0.0551 1.242867,-0.919983 2.540271,-1.92196 2.476758,-1.912794 2.498174,-1.935427 2.227519,-2.354236 -0.151618,-0.234613 -0.161005,-0.309936 -0.03862,-0.309936 0.05102,0 0.0684,0.03487 0.03862,0.07748 -0.02978,0.04261 -0.0058,0.07747 0.05322,0.07747 0.05906,0 0.08248,0.02202 0.05205,0.04894 -0.03043,0.02691 -0.0092,0.122796 0.04705,0.213081 0.0563,0.09029 0.104181,0.210176 0.106414,0.266429 0.0049,0 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path1707"
+       style="fill:#000000"
+       d="m 28.940228,43.014517 c -1.175187,-0.2008 -2.416672,-1.227765 -3.060886,-2.532001 -0.443633,-0.898146 -0.346284,-2.60223 0.201997,-3.535928 0.263773,-0.449191 0.856235,-0.9669 1.371273,-1.198244 1.463091,-0.657204 1.757691,-0.747776 2.407309,-0.74009 0.751518,0.0089 1.386145,0.196532 2.193053,0.64841 1.064281,0.596016 1.755722,1.537578 2.032229,2.767351 0.246787,1.097592 0.135946,1.786703 -0.411193,2.556461 -0.206846,0.291014 -0.452415,0.593132 -0.54571,0.671392 -0.0933,0.07827 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path1705"
+       style="fill:#3d3d3d;fill-opacity:1"
+       d="m 30.342934,42.584249 c 0.705623,-0.124727 1.606069,-0.548813 1.787135,-0.841679 0.418778,-0.677365 0.982637,-1.378061 1.109002,-1.378131 0.100023,-6.2e-5 0.181753,-0.120852 0.271696,-0.401568 0.167392,-0.522445 0.160544,-0.909221 -0.02789,-1.57436 -0.350935,-1.238807 -1.0671,-2.204034 -1.972609,-2.658601 -0.566802,-0.284545 -1.820458,-0.649495 -2.06973,-0.602523 -0.568567,0.10714 -0.649856,0.132404 -0.649856,0.201986 0,0.0418 0.17414,0.076 0.386978,0.076 0.3644,0 1.26179,0.251 [...]
+    <g
+       id="g2838"
+       style="fill:url(#linearGradient11853);fill-opacity:1"
+       transform="matrix(0.08359846,0,0,0.07748403,-36.904805,-97.41791)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1703"
+         style="fill:url(#linearGradient11849);fill-opacity:1"
+         d="m 784.84574,1801.1244 c -8.34203,-2.5467 -16.76177,-9.7573 -20.92678,-17.9214 -2.99007,-5.861 -4.23774,-16.0734 -2.69183,-22.033 2.90905,-11.2147 11.30822,-21.1169 19.59857,-23.1057 6.99365,-1.6777 17.45625,-0.8477 22.63261,1.7956 5.023,2.5649 12.98956,11.2156 14.30208,15.5302 0.53028,1.7432 1.64666,4.9694 2.48085,7.1694 4.93924,13.0262 -2.37359,31.3213 -14.83989,37.1263 -5.22456,2.4328 -15.04709,3.1203 -20.55561,1.4386 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path1701"
+         style="fill:url(#linearGradient11851);fill-opacity:1"
+         d="m 798.77072,1795.5065 c 7.06104,-2.9496 11.51014,-8.8036 14.17947,-18.6571 1.47774,-5.4548 0.80409,-10.3778 -2.09166,-15.2858 -1.11576,-1.891 -1.74832,-3.8919 -1.40569,-4.4462 0.90769,-1.4687 -7.21912,-9.8922 -11.7969,-12.2276 -4.996,-2.5488 -12.96726,-3.3749 -18.39917,-1.9067 -3.35562,0.9069 -5.2774,2.4308 -9.28166,7.3601 -10.58538,13.0306 -10.18148,25.9636 1.21734,38.9803 5.84031,6.6693 19.22852,9.6708 27.57827,6.183 z" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path1681"
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.40368551;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 29.61078,23.708023 c -0.117754,-0.223735 -0.214487,-0.48271 -0.214959,-0.575505 -7.89e-4,-0.149808 0.300978,-0.43684 0.530303,-0.50446 0.04641,-0.01368 -0.254526,-0.722081 -0.668757,-1.574213 -1.663115,-3.421299 -2.753052,-5.758186 -2.753052,-5.902685 0,-0.236041 0.305047,-0.423746 1.469313,-0.904091 1.69175,-0.697978 3.51831,-1.311798 4.018646,-1.350478 0.400829,-0.03099 0.466157,-0.0144 0.584937,0.148421 0.07353,0.100815 0.632309,1.264198 1.241711,2.5853 0.609393,1.321103 1 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path33543"
+       style="opacity:0.18539327;fill:#313131;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 30.733385,13.407887 c -0.126757,0.07254 0.431711,0.01687 0.724749,0.113224 0.927265,0.632052 1.207593,1.610256 1.58936,2.499675 0.228466,1.087189 1.520054,3.14197 1.926033,4.170413 0.367169,0.785668 0.277804,0.503087 1.268969,0.777095 0.308526,0.06311 0.125672,0.522819 0.595648,0.404758 0.289811,-0.103389 -0.08859,-0.648218 -0.531381,-0.695128 -0.610254,0.193285 -0.63488,0.03297 -0.960262,-0.466745 -0.684569,-1.133812 -1.171771,-2.352139 -1.477409,-3.149627 -0.305641,-0.79748 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3636"
+       style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.38720855;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 30.271921,24.19361 3.003275,6.86287 7.758462,-3.099361 -3.503821,-6.420105 -7.257916,2.656596 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path2953"
+       style="fill:#333333"
+       d="m 30.551523,13.614573 c -1.253137,0.170481 -2.335564,0.82325 -3.512034,1.181632 -0.154281,0.01462 -0.378764,-0.274989 -0.454401,-0.02906 -0.08226,0.110441 -0.392047,0.226269 -0.303848,0.462483 0.476188,0.719515 0.824487,1.558597 1.108631,2.35842 0.0031,0.263225 0.311642,0.426623 0.372111,0.709595 0.698997,1.431853 1.460615,2.857732 2.036766,4.326867 0.115235,0.362288 -0.699287,0.36317 -0.48725,0.769998 0.10681,0.311032 0.387697,0.829369 0.849322,0.604428 1.555562,-0.628919 3.18 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path5392"
+       style="fill:url(#linearGradient11820);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.47783187;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 31.810774,31.06471 c 0,0 2.778356,-0.752414 5.343654,-1.748637 2.565297,-0.996224 3.904582,-1.934837 3.904582,-1.934837 l 7.482837,15.851307 c 0,0 -1.779823,1.00219 -3.969711,1.832376 -2.189888,0.830187 -4.789842,1.488366 -4.789842,1.488366 l -0.500546,-1.549679 -1.001092,0 -6.469882,-13.938896 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8029"
+       style="fill:#484848;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 41.261492,46.149304 0.646848,1.398662 1.006209,-0.06357 0.718719,1.843692 0.431233,0.190726 1.653056,3.560231 3.881091,-1.462238 -1.940545,-3.687383 0.215617,-0.508604 -0.862465,-1.780114 0.431233,-0.127153 -0.574978,-1.462237 c 0,0 -1.329631,0.683437 -2.731137,1.207935 -1.401503,0.524499 -2.874881,0.890058 -2.874881,0.890058 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3127"
+       style="fill:#1a1a1a"
+       d="m 45.75513,52.73319 c -0.235169,-0.372576 -0.425954,-0.770771 -0.567004,-1.178816 7.01e-4,-0.268124 0.812072,-0.263608 0.48441,-0.641378 -0.263882,-0.300432 -0.791512,-0.194252 -1.048918,-0.486544 -0.28444,-0.413702 -0.403662,-0.920112 -0.779691,-1.281398 -0.253252,-0.07456 -0.385599,-0.389887 -0.342301,-0.230075 0.01562,-0.287482 -0.262688,-0.61684 -0.39218,-0.907284 -0.134304,-0.239251 -0.268611,-0.478503 -0.402916,-0.717754 -0.258615,-3.88e-4 -0.780788,0.09321 -0.89617,-0.22 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path15907"
+       style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34704179;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 63.938476,77.457744 c 0.197913,0.01045 0.43806,0.148172 0.387439,0.272554 -0.03589,0.08821 -1.162318,1.567188 -1.162318,1.567188 0,0 -20.301828,-1.839742 -21.464146,-2.044159 -1.162319,-0.204415 -6.896422,-1.499048 -7.903765,-1.976018 -0.947824,-0.44879 -3.215748,-1.328703 -3.177005,-1.976019 0.04281,-0.715277 4.791813,-5.911285 7.051399,-8.312909 2.227776,-2.367815 4.284574,-1.312533 4.959226,-0.136278 0.490511,0.855208 0.55048,4.223826 0.69739,5.451089 0.154976,1.294632 0.7 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path29977"
+       style="opacity:0.21348314;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 40.533539,63.510599 c 0.751073,0.133275 1.771691,0.462573 2.075876,1.107615 0.432204,0.72455 0.344661,1.374994 0.501728,2.149709 0.133847,0.786392 0.09948,1.560482 0.222622,2.349211 0.278471,1.288306 0.344783,2.699914 0.792443,3.903268 0.18602,0.588608 0.190555,1.345144 0.851519,1.686242 0.614431,0.369145 1.2521,0.742915 2.018587,0.766865 0.523548,0.136546 1.221377,0.02548 1.654492,0.220977 -0.464653,0.407811 -1.040438,0.521125 -1.676843,0.383624 -0.840395,-0.107393 -1.802413 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path22957"
+       style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.32953918;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 43.937598,59.821431 5.358217,10.947442 c 0,0 0.12496,0.297261 0.189671,0.503332 0.237091,0.754996 -0.853521,1.132493 -0.853521,1.132493 l -0.758685,0.08389 c 0,0 0.189672,-0.251666 0.142254,-0.419443 C 47.968113,71.901366 42.088302,60.32476 42.088302,60.32476 l 1.849296,-0.503331 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path1793"
+       style="fill:#424242;fill-opacity:1;stroke:#000000;stroke-width:0.37073162;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 38.134802,62.412468 c -0.09236,-0.08854 -0.234012,-0.103191 -0.617287,-0.06383 -0.661249,0.06788 -0.774501,-0.02954 -1.170092,-1.006533 -0.293341,-0.724469 -0.360043,-0.979817 -0.336148,-1.286831 0.0053,-0.06852 0.701973,-0.586453 1.548076,-1.150979 0.846112,-0.564526 1.516585,-1.045686 1.489948,-1.069242 -0.02663,-0.02356 -0.477616,0.154419 -1.00219,0.395511 -0.816258,0.375146 -1.022223,0.438342 -1.42863,0.438342 -0.53117,0 -0.685102,-0.08864 -0.685102,-0.394502 0,-0.171038  [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3239"
+       style="fill:#1a1a1a"
+       d="m 38.42762,61.538145 c -0.169353,-0.213531 -0.660027,-1.323699 -0.660027,-1.493334 0,-0.107701 0.818961,-0.50188 1.042745,-0.50188 0.04081,0 0.305757,-0.09316 0.588773,-0.207037 0.594353,-0.239139 0.459345,-0.329897 -0.223802,-0.150444 -0.71067,0.186683 -0.516142,0.01067 0.45369,-0.41065 0.92056,-0.399856 1.263438,-0.470901 1.63679,-0.339132 0.174951,0.06173 0.281398,0.03468 0.59127,-0.150303 0.207849,-0.124091 0.377907,-0.258007 0.377907,-0.297602 0,-0.0396 0.07981,-0.07201 0. [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path14158"
+       style="fill:#000000;display:inline"
+       d="m 42.20193,56.011102 c 0.167289,-0.176116 0.418716,-0.293248 0.618096,-0.421273 0.191515,-0.162062 0.401034,-0.272485 0.579646,-0.432112 0.144402,-0.06888 0.380234,-0.249284 0.272117,-0.375548 -0.275859,-0.154939 -0.515439,0.07718 -0.715903,0.146988 -0.230661,0.08218 -0.409487,0.184625 -0.622824,0.270505 -0.219582,0.08452 -0.395349,0.189631 -0.629318,0.272522 -0.244391,0.100166 -0.619082,0.140935 -0.913794,0.09115 -0.252283,-0.08012 -0.30109,-0.454748 -0.02882,-0.467908 0.08734 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3229"
+       style="fill:#000000"
+       d="m 37.47177,59.265433 c 0.114864,-0.186519 0.380306,-0.195173 0.50257,-0.384636 0.232658,-0.03077 0.298661,-0.270426 0.536756,-0.309761 0.08515,-0.208345 0.379797,-0.177919 0.395483,-0.389127 0.311821,-0.128876 -0.311532,-0.314547 -0.376148,-0.11073 -0.13841,-0.0629 -0.137051,0.126337 -0.289885,0.07323 -0.02164,0.132024 -0.198656,0.02104 -0.235688,0.157841 -0.139182,-0.05945 -0.136918,0.126886 -0.289886,0.07461 -0.02164,0.132024 -0.198656,0.02104 -0.235687,0.157843 -0.139182,-0. [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path1845"
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.37073162;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 49.192727,68.769834 c -0.415007,-0.114461 -0.506352,-0.673477 -0.759911,-0.80533 -0.29484,0.375223 -1.089181,0.575644 -1.559205,0.299203 -0.706547,-0.410518 -0.811763,-1.233151 -0.690549,-1.912537 0.05921,-0.271598 0.458093,-0.08023 0.332623,-0.460813 0.263292,-0.528356 0.878894,-0.154837 1.288582,0.03957 0.301813,0.09046 0.440924,-0.514261 0.620234,-0.721787 0.09463,-0.856787 -0.01481,-1.803129 0.578212,-2.546898 0.576217,-0.683118 1.523028,-1.073754 2.458083,-1.205005 1.315 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path1843"
+       style="fill:#2a2a2a;fill-opacity:1"
+       d="m 52.600961,61.889546 c -1.273996,0.06121 -2.822016,0.225398 -3.580467,1.266378 -0.419487,0.651194 0.07262,1.419889 -0.19709,2.099335 0.01613,0.741778 0.657761,1.39636 1.439851,1.632006 0.384274,0.148573 0.699536,0.499931 0.583058,0.886224 -0.664921,0.222155 -1.621075,0.318714 -2.102293,-0.242138 -0.172413,-0.233206 0.166656,-0.57133 -0.02738,-0.75547 -0.392874,-0.06747 -1.086639,-0.186579 -1.283822,0.217924 -0.12159,0.369424 0.264011,0.675971 0.670654,0.610187 0.730889,-0.1576 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path28228"
+       style="fill:#0f0f0f;fill-opacity:0.27374297;fill-rule:nonzero;stroke:none"
+       d="m 32.987209,46.008329 c -0.659187,-0.09902 -1.333298,-0.06218 -1.997934,-0.05491 -0.171878,0.0019 -0.708482,0.239428 -0.315063,0.06387 0.450982,-0.238405 -0.20817,0.14842 -0.307864,0.289815 -0.362528,0.362559 -0.38616,0.887438 -0.701541,1.278829 -0.170939,0.199848 -0.285427,0.429151 -0.300136,0.681854 -0.03109,0.334303 -0.04546,0.670063 -0.13066,0.998565 -0.01466,0.312203 0.106722,0.612981 0.138814,0.922413 0.06559,0.380611 0.213909,0.742883 0.303998,1.117971 0.08423,0.34484 0. [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path12407"
+       style="fill:#2a2a2a;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 60.525668,50.442466 -4.176845,3.359341 0.788084,1.67967 3.625186,-3.067222 c 0,0 0.0788,0 0.472851,-0.292118 0.394043,-0.292116 -0.551659,-1.533612 -0.709276,-1.679671 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path30858"
+       style="fill:url(#linearGradient11800);fill-opacity:1;stroke:#000000;stroke-width:0.35425463;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 40.304969,68.371359 c 0.366796,-0.121916 0.597911,-0.363874 0.736575,-0.771143 0.07676,-0.22546 0.04177,-0.42894 -0.108647,-0.631799 -0.05796,-0.07815 -0.09082,-0.16086 -0.07302,-0.183771 0.04715,-0.06071 -0.375008,-0.408869 -0.612808,-0.505396 -0.259525,-0.105347 -0.673605,-0.139494 -0.955774,-0.0788 -0.174313,0.03748 -0.274143,0.100474 -0.48215,0.30421 -0.549874,0.538585 -0.528893,1.073137 0.06324,1.611149 0.303383,0.275657 0.998855,0.399716 1.432596,0.255558 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path31735"
+       style="fill:url(#linearGradient11797);fill-opacity:1;stroke:#000000;stroke-width:0.35425463;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 39.751726,68.636966 c 0.366797,-0.121914 0.597913,-0.363874 0.736575,-0.771142 0.07676,-0.225461 0.04177,-0.42894 -0.108647,-0.631799 -0.05796,-0.07816 -0.09082,-0.160861 -0.07302,-0.183772 0.04715,-0.06071 -0.375007,-0.408869 -0.612806,-0.505396 -0.259526,-0.105347 -0.673605,-0.139492 -0.955775,-0.0788 -0.174313,0.03748 -0.274142,0.100474 -0.48215,0.30421 -0.549874,0.538585 -0.528894,1.073137 0.06324,1.61115 0.303385,0.275657 0.998856,0.399716 1.432597,0.255557 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3309"
+       style="opacity:0.06179774;fill:#808080"
+       d="m 34.495571,65.983681 c -2.082403,-1.712613 -3.766637,-3.76902 -5.391766,-5.820624 -1.199786,-1.933164 -2.32216,-3.922225 -3.2147,-5.982551 -0.531934,-1.780358 -0.967672,-3.5945 -1.25423,-5.411275 0.355719,-0.452679 -0.260349,-1.207447 0.243283,-1.852294 0.11237,-0.592838 0.285999,-1.282035 0.961373,-1.216834 -0.404292,-0.489239 0.424851,-0.931442 -0.442236,-0.858192 0.259757,-0.617352 0.392082,-0.883945 1.135083,-1.316509 1.509937,-1.045637 -0.953973,-1.924085 -1.050518,-3.027 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path31740"
+       style="opacity:0.05617981;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 31.462764,23.652727 c 0.311438,0.178459 0.60707,0.376339 0.894493,0.583414 0.328228,0.224275 0.522813,0.515491 0.672446,0.849136 0.09262,0.371427 0.05431,0.751647 0.120816,1.127125 0.01718,0.369647 0.204389,0.680323 0.382612,1.004859 0.204641,0.379657 0.504827,0.687827 0.680846,1.077095 0.104346,0.35833 0.268533,0.697243 0.445535,1.031356 0.299903,0.761799 0.909265,0.242495 -0.287859,0.845146 0.207095,-0.34149 0.0231,-0.647047 -0.122266,-0.980922 -0.13461,-0.311662 -0.294428, [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path32621"
+       style="fill:#868686;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 55.161196,51.814241 c -0.233452,0.312938 -0.729729,0.294533 -1.027946,0.543696 0.04104,0.0068 0.635118,-0.332376 0.880615,-0.461223 0.145137,-0.08238 0.700533,-0.377104 0.630659,-0.356129 -0.47759,0.250471 -0.953288,0.504184 -1.425582,0.762192 0.21304,-0.107228 0.696477,-0.360349 0.756948,-0.384664 -0.21081,0.108889 -0.922219,0.470368 -0.842014,0.430527 0.174459,-0.08687 0.679399,-0.34865 0.663079,-0.332377 -0.637517,0.326939 -0.222946,0.460255 -1.929753,0.867565 -1.765059,0. [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path33498"
+       style="fill:#868686;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 51.407101,54.360145 c -0.233451,0.312939 -0.729729,0.294533 -1.027945,0.543695 0.04104,0.0068 0.635119,-0.332374 0.880615,-0.461223 0.145137,-0.08238 0.700533,-0.377104 0.630658,-0.356129 -0.477589,0.250472 -0.953287,0.504185 -1.425581,0.762193 0.213039,-0.107239 0.696477,-0.36035 0.756947,-0.384665 -0.210809,0.1089 -0.922219,0.470367 -0.842013,0.430529 0.174459,-0.08687 0.679399,-0.348651 0.663079,-0.332379 -0.637517,0.326939 -0.222946,0.460256 -1.929753,0.867565 -1.765059,0 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path33500"
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 53.635683,52.220991 c -1.389744,0.346583 -2.705396,0.89933 -4.10604,1.198581 -1.159277,0.214639 -2.237281,-0.572336 -3.377904,-0.220345 -0.244694,0.111388 -0.715446,0.277718 -0.875676,0.464043 0.11311,0.184015 0.40807,-0.291267 0.590991,-0.253383 0.756766,-0.211436 1.506615,0.01509 2.230949,0.186445 0.746663,0.148891 1.513411,0.02252 2.195845,-0.250976 1.072088,-0.314188 2.146953,-0.645974 3.196756,-0.988768 0.03672,-0.02044 0.318038,-0.147909 0.145079,-0.135597 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path33509"
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 45.85063,56.038893 c -1.159277,0.267393 -2.23728,-0.71301 -3.377902,-0.274504 -0.244695,0.138769 -0.715447,0.345978 -0.875676,0.578098 0.113108,0.229244 0.408069,-0.362856 0.59099,-0.315661 0.756765,-0.263401 1.506614,0.0188 2.230949,0.232272 0.746662,0.185485 1.513409,0.02804 2.195844,-0.312663 1.072088,-0.391411 2.621133,-0.846689 3.670935,-1.273737 0.08413,0.268148 -3.034497,0.993391 -4.43514,1.366195 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path33514"
+       style="fill:#f9f9f9;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 46.150154,56.254144 c -0.39422,0.126285 -0.798281,0.269784 -1.217338,0.162444 -0.234106,-0.09941 -0.635914,-0.0732 -0.722925,0.116881 0.659365,0.162625 1.409487,0.156773 1.940263,-0.279325 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path33522"
+       style="fill:#f9f9f9;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 49.587611,53.913201 c -0.460582,0.04801 -0.510703,0.132812 -0.929762,0.02546 -0.234106,-0.09941 -0.414702,-0.151479 -0.501713,0.03861 0.659367,0.162625 0.745852,0.274179 1.431475,-0.06408 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path33524"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 44.027984,53.045936 c 0.123011,-0.0096 0.183374,0.01441 0.245755,0.104929 0.04234,0.113548 -0.151106,0.269565 -0.191401,0.376913 0.03015,0.08786 0.224468,0.110221 0.24046,0.205675 0.0038,0.0953 0.0813,0.161417 0.13073,0.241265 0.01508,0.106502 0.01976,0.207801 0.05967,0.30997 0.02419,0.08896 -0.0066,0.261431 0.05103,0.334805 0.05553,0.09266 0.21088,0.03458 0.319383,0.06813 0.08896,0.01773 0.180457,0.01132 0.270039,0.0081 l -0.25972,0.144586 c -0.09297,0.0014 -0.187552,0.0051  [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path33527"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 39.473014,55.989937 c 0.123013,-0.0076 0.183376,0.01155 0.245758,0.08383 0.04234,0.09072 -0.151107,0.215354 -0.191402,0.301114 0.03015,0.07019 0.224468,0.08805 0.24046,0.164311 0.0039,0.07612 0.0813,0.128953 0.13073,0.192744 0.01508,0.08508 0.01976,0.16601 0.05967,0.247632 0.02419,0.07107 -0.0066,0.208854 0.05103,0.267472 0.05553,0.07403 0.210881,0.02763 0.319384,0.05444 0.08895,0.01417 0.180458,0.009 0.270039,0.0065 l -0.259721,0.115507 c -0.09297,0.0011 -0.187551,0.0041 -0. [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path33531"
+       style="fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 38.911557,28.70972 c 0.692486,0.826107 1.186209,1.859955 1.089471,2.944292 0.01078,1.293192 0.179193,2.606784 0.842474,3.753592 0.976156,2.314109 2.049249,4.598338 3.42507,6.717918 0.388549,0.786464 0.632135,1.635963 1.023772,2.422554 0.604045,-0.26655 1.208089,-0.533102 1.812133,-0.799652 -0.644332,-1.378971 -1.113139,-2.855754 -2.044809,-4.095268 -1.230076,-2.145509 -2.176771,-4.438901 -3.095954,-6.722322 -0.394438,-1.483213 0.143289,-3.170214 -0.84037,-4.496405 -0.163555,- [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path33539"
+       style="opacity:0.14606742;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 44.566393,60.807522 c -0.03733,0.280986 0.0076,0.542926 0.09199,0.811375 0.129295,0.323541 0.360292,0.601607 0.531811,0.907355 0.190047,0.321574 0.189205,0.635524 0.129633,0.981493 -0.04503,0.281048 0.164315,0.483219 0.279575,0.729136 0.26302,0.632881 -0.683631,1.117994 -1.2039,0.646459 -0.224399,-0.26348 -0.259758,-0.583491 -0.314776,-0.900145 -0.0848,-0.30735 -0.244992,-0.586614 -0.426198,-0.856103 -0.202137,-0.210868 -0.295276,-0.477027 -0.422708,-0.725076 -0.133282,-0.270 [...]
+  </g>
+</svg>
diff --git a/interface/images/menu/quality_index.svg b/interface/images/menu/quality_index.svg
new file mode 100755
index 0000000..2f013e3
--- /dev/null
+++ b/interface/images/menu/quality_index.svg
@@ -0,0 +1,841 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="quality_index.svg"
+   version="1.0"
+   inkscape:version="0.47 r22583"
+   sodipodi:version="0.32"
+   id="svg2408"
+   height="96"
+   width="96">
+  <defs
+     id="defs2410">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective3435" />
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2903"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       id="aigrd1"
+       cx="28.789101"
+       cy="20.971201"
+       r="13.2807"
+       fx="28.789101"
+       fy="20.971201"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#E41E08"
+         id="stop12" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop14" />
+    </radialGradient>
+    <radialGradient
+       id="aigrd2"
+       cx="19.292"
+       cy="13.5444"
+       r="14.6944"
+       fx="19.292"
+       fy="13.5444"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#E41E08"
+         id="stop19" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop21" />
+    </radialGradient>
+    <linearGradient
+       id="aigrd3"
+       gradientUnits="userSpaceOnUse"
+       x1="18.229"
+       y1="11.5991"
+       x2="23.412001"
+       y2="16.723101">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop34" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop36" />
+    </linearGradient>
+    <radialGradient
+       id="radialGradient2920"
+       cx="28.789101"
+       cy="20.971201"
+       r="13.2807"
+       fx="28.789101"
+       fy="20.971201"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#E41E08"
+         id="stop2922" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop2924" />
+    </radialGradient>
+    <radialGradient
+       id="radialGradient2927"
+       cx="19.292"
+       cy="13.5444"
+       r="14.6944"
+       fx="19.292"
+       fy="13.5444"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#E41E08"
+         id="stop2929" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop2931" />
+    </radialGradient>
+    <linearGradient
+       id="linearGradient2938"
+       gradientUnits="userSpaceOnUse"
+       x1="18.229"
+       y1="11.5991"
+       x2="23.412001"
+       y2="16.723101">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop2940" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop2942" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#aigrd3"
+       id="linearGradient5716"
+       gradientUnits="userSpaceOnUse"
+       x1="18.229"
+       y1="11.5991"
+       x2="23.412001"
+       y2="16.723101"
+       gradientTransform="matrix(1.25,0,0,1.25,16.5,15.75)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#aigrd3"
+       id="linearGradient2967"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.25,0,0,1.25,17.875,23)"
+       x1="18.229"
+       y1="11.5991"
+       x2="23.412001"
+       y2="16.723101" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.2502466"
+     inkscape:cx="82.588867"
+     inkscape:cy="48.484375"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1670"
+     inkscape:window-height="943"
+     inkscape:window-x="0"
+     inkscape:window-y="42"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       style="fill:#000000;fill-rule:nonzero;stroke:none"
+       d="M 48,28.125 C 47.25,28 45.25,27.5 42.625,27.5 c -2.875,0 -4,2.5 -5,4.5 C 37,33.25 36.5,34.5 35.5,35.5 c -3,3 -6.375,6.375 -6.375,10.25 0,3 2.625,4.625 4.5,5.75 0.75,0.5 1.5,0.875 1.875,1.25 0.5,0.5 0.875,2.25 1.25,3.5 0.5,2.125 1,4.25 2.25,5.5 1.625,1.625 3.75,0.625 5.125,0 1,0.375 2,0.5 3.25,0.625 1.875,0.25 3.75,0.5 4.625,1.5 0,0 0.125,0.125 0.125,0.25 0,0 0,0 0,0 C 52,66 45.5,72.5 42.75,74.625 L 44,75 c 0,0 10.125,-2.125 11.625,-2.5 1,1 6.125,6.375 6.125,6.375 v -4 c 0,-1.87 [...]
+       id="path7" />
+    <path
+       style="fill:#0f1226;fill-rule:nonzero;stroke:none"
+       d="m 48.875,44.625 c 0,0 -6.5,9 -6.5,13.125 0,4.125 7.5,1.875 10.5,4.875 3,3 -7,10.75 -7,10.75 l 10,-2.75 4,4.25 c 0,-5.125 5.875,-9.25 2.875,-12.375 -3.125,-3.125 -12,-2.75 -12.5,-6.875 C 49.75,51.5 49,44.75 49,44.75 z"
+       id="path9" />
+    <path
+       style="fill:#00ff00;fill-rule:nonzero;stroke:none"
+       d="m 55.75,29 c 3.75,0 4.375,4.375 6.5,6.5 2.125,2.125 -1.125,5.375 0,7.125 1.125,1.75 2.5,3.75 2.5,5.875 0,2.125 -4,4 -5.25,5.25 -1.25,1.25 0,2.5 -3.375,3.5 -3.375,0.875 -5,-0.375 -7.125,-0.375 -2.125,0 -7.375,5.5 -9.25,3.625 -1.875,-1.875 -1.75,-7.375 -3.375,-9 -1.75,-1.75 -6,-2.875 -6,-6 0,-3.125 3.125,-6.25 5.875,-9 C 39,33.75 39,29 42.125,29 c 3.125,0 5.25,0.625 5.25,0.625 0,0 4.375,-0.625 8.125,-0.625 z"
+       id="path16" />
+    <path
+       style="fill:#00aa00;fill-rule:nonzero;stroke:none"
+       d="m 61.375,44.625 c 0,6.875 -5.625,12.5 -12.5,12.5 -6.875,0 -12.5,-5.625 -12.5,-12.5 0,-6.875 5.625,-12.5 12.5,-12.5 6.875,0 12.5,5.625 12.5,12.5 z"
+       id="path23" />
+    <path
+       style="opacity:0.51999996;fill:#ffffff;fill-rule:nonzero;stroke:none"
+       d="m 36.375,38.25 c 0,0 -4.25,4.25 -4.875,6 -0.5,1.75 1.375,3.125 1.375,3.125 0,0 -1.5,-4.375 3.375,-9.25 z"
+       id="path25" />
+    <path
+       style="opacity:0.51999996;fill:#ffffff;fill-rule:nonzero;stroke:none"
+       d="m 38.625,54.5 c 0,0 0.875,6.625 3,5.375 -1.5,-0.5 -3,-5.375 -3,-5.375 z"
+       id="path27" />
+    <path
+       style="opacity:0.51999996;fill:#ffffff;fill-rule:nonzero;stroke:none"
+       d="m 39.375,33.25 c 0,0 0.875,-4.625 5.125,-3.625 -2.75,0 -5.125,3.625 -5.125,3.625 z"
+       id="path29" />
+    <path
+       style="opacity:0.51999996;fill:#ffffff;fill-rule:nonzero;stroke:none"
+       d="m 58.25,30.5 c 0,0 -0.75,-2 -7.25,-0.875 4.25,0 7.25,0.875 7.25,0.875 z"
+       id="path31" />
+    <path
+       style="opacity:0.51999996;fill:url(#linearGradient2967);fill-rule:nonzero;stroke:none"
+       d="M 49.625,33.25 C 40.625,33 36.25,41.5 38,48 43.375,45.125 49.625,40 49.625,33.25 z"
+       id="path38" />
+    <g
+       style="fill:#8dd35f;fill-rule:nonzero;stroke:none"
+       id="g40"
+       transform="matrix(1.25,0,0,1.25,17.875,23)">
+      <g
+         id="g42"
+         style="fill:#8dd35f">
+        <path
+           style="opacity:0;fill:#8dd35f"
+           d="m 32,23 c -2.7,3.6 -7,4.9 -9.7,2.9 -2.7,-2 -2.7,-6.5 0,-10.1 2.7,-3.6 7,-4.9 9.7,-2.9 2.7,2 2.7,6.5 0,10.1 z"
+           id="path44" />
+        <path
+           d="m 32,23 c -2.6,3.4 -6.7,4.7 -9.3,2.8 -2.6,-1.9 -2.5,-6.3 0,-9.7 2.6,-3.4 6.7,-4.7 9.3,-2.8 2.6,1.9 2.5,6.3 0,9.7 z"
+           id="path46"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.9,22.9 c -2.5,3.3 -6.5,4.5 -8.9,2.7 -2.5,-1.8 -2.4,-6 0,-9.3 2.4,-3.3 6.5,-4.5 8.9,-2.7 2.5,1.8 2.4,6 0,9.3 z"
+           id="path48"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.9,22.9 c -2.4,3.2 -6.2,4.3 -8.5,2.6 -2.3,-1.8 -2.3,-5.7 0,-8.9 2.4,-3.2 6.2,-4.3 8.5,-2.6 2.3,1.7 2.3,5.7 0,8.9 z"
+           id="path50"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.8,22.9 c -2.3,3 -5.9,4.1 -8.1,2.5 -2.2,-1.7 -2.2,-5.5 0.1,-8.5 2.3,-3 5.9,-4.1 8.1,-2.5 2.2,1.7 2.2,5.5 -0.1,8.5 z"
+           id="path52"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.8,22.9 c -2.2,2.9 -5.6,3.9 -7.7,2.4 -2.1,-1.6 -2.1,-5.2 0.1,-8.1 2.2,-2.9 5.6,-3.9 7.7,-2.4 2.1,1.6 2.1,5.2 -0.1,8.1 z"
+           id="path54"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.8,22.8 c -2.1,2.7 -5.3,3.8 -7.4,2.3 -2,-1.5 -2,-4.9 0.1,-7.7 2.1,-2.8 5.3,-3.8 7.4,-2.3 2,1.5 2,4.9 -0.1,7.7 z"
+           id="path56"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.7,22.8 c -2,2.6 -5.1,3.6 -7,2.2 -1.9,-1.4 -1.9,-4.7 0.1,-7.3 2,-2.6 5.1,-3.6 7,-2.2 1.9,1.4 1.9,4.7 -0.1,7.3 z"
+           id="path58"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.7,22.8 c -1.8,2.5 -4.8,3.4 -6.6,2.1 -1.8,-1.3 -1.7,-4.4 0.1,-6.9 1.8,-2.5 4.8,-3.4 6.6,-2.1 1.8,1.3 1.7,4.4 -0.1,6.9 z"
+           id="path60"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.7,22.8 c -1.7,2.3 -4.5,3.2 -6.2,2 -1.7,-1.3 -1.6,-4.2 0.1,-6.5 1.7,-2.3 4.5,-3.2 6.2,-2 1.7,1.3 1.6,4.2 -0.1,6.5 z"
+           id="path62"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.6,22.8 c -1.6,2.2 -4.2,3 -5.8,1.8 -1.6,-1.2 -1.5,-3.9 0.1,-6.1 1.6,-2.2 4.2,-3 5.8,-1.9 1.6,1.2 1.5,3.9 -0.1,6.1 z"
+           id="path64"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.6,22.7 c -1.5,2.1 -4,2.8 -5.4,1.7 -1.5,-1.1 -1.4,-3.6 0.1,-5.7 1.5,-2.1 4,-2.8 5.4,-1.7 1.5,1.1 1.4,3.6 -0.1,5.7 z"
+           id="path66"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.5,22.7 c -1.4,1.9 -3.7,2.7 -5,1.6 -1.3,-1 -1.3,-3.4 0.2,-5.3 1.4,-1.9 3.7,-2.7 5,-1.6 1.3,1 1.3,3.4 -0.2,5.3 z"
+           id="path68"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.5,22.7 c -1.3,1.8 -3.4,2.5 -4.6,1.5 -1.2,-0.9 -1.2,-3.1 0.2,-4.9 1.3,-1.8 3.4,-2.5 4.6,-1.5 1.2,0.9 1.2,3.1 -0.2,4.9 z"
+           id="path70"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.5,22.7 c -1.2,1.6 -3.1,2.3 -4.3,1.4 -1.1,-0.8 -1,-2.9 0.2,-4.5 1.2,-1.6 3.1,-2.3 4.3,-1.4 1.1,0.8 1,2.9 -0.2,4.5 z"
+           id="path72"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.4,22.7 c -1.1,1.5 -2.9,2.1 -3.9,1.3 -1,-0.8 -0.9,-2.6 0.2,-4.1 1.1,-1.5 2.9,-2.1 3.9,-1.3 1,0.8 0.9,2.6 -0.2,4.1 z"
+           id="path74"
+           style="fill:#8dd35f" />
+        <path
+           d="m 31.4,22.6 c -1,1.4 -2.6,1.9 -3.5,1.2 -0.9,-0.7 -0.8,-2.3 0.2,-3.7 1,-1.4 2.6,-1.9 3.5,-1.2 0.9,0.7 0.8,2.3 -0.2,3.7 z"
+           id="path76"
+           style="fill:#8dd35f" />
+      </g>
+    </g>
+    <path
+       style="opacity:0.26000001;fill:#ffffff;fill-rule:nonzero;stroke:none"
+       d="m 53.75,62.5 c 1,1.375 0,3.125 0,3.125 1.625,0.875 5.625,-1.875 8.875,0 C 63.5,63.75 62.375,62.625 61,62 l -7.125,0.5 z"
+       id="path78" />
+    <g
+       transform="matrix(1.25,0,0,1.25,90,31)"
+       id="Layer_x0020_2"
+       style="fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4">
+      <path
+         style="fill:none;stroke:none"
+         d="M 48,48 H 0 V 0 h 48 v 48 z"
+         id="path81" />
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/service_provider.svg b/interface/images/menu/service_provider.svg
new file mode 100755
index 0000000..01c4010
--- /dev/null
+++ b/interface/images/menu/service_provider.svg
@@ -0,0 +1,4024 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="96x96 (action).svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3750"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop3755" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop3757" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3752"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4523">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4525" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4527" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3754"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4530">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4532" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4534" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3756"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4537">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4539" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4541" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3758"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4544">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4546" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4548" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3760"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4551">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4553" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4555" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3762"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4558">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4560" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4562" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3764"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4565">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4567" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4569" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3766"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4572">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4574" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4576" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3768"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4579">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4581" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4583" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3770"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4586">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4588" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4590" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3772-3"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4593">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4595" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4597" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3774"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4600">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4602" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4604" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3776"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4607">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4609" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4611" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3778"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4614">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4616" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4618" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3780-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4621">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4623" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4625" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3782"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4628">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4630" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4632" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3784"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4635">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4637" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4639" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3750-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop3755-5" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop3757-4" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3752-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5051">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5053" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5055" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3754-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5058">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5060" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5062" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3756-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5065">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5067" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5069" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3758-0"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5072">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5074" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5076" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3760-7"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5079">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5081" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5083" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3762-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5086">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5088" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5090" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3764-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5093">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5095" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5097" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3766-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5100">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5102" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5104" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3768-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5107">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5109" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5111" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3770-3"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5114">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5116" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5118" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3772-3-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5121">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5123" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5125" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3774-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5128">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5130" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5132" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3776-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5135">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5137" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5139" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3778-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5142">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5144" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5146" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3780-8-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5149">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5151" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5153" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3782-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5156">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5158" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5160" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3784-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5163">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5165" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5167" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3750-4-2"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop3755-5-0" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop3757-4-0" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3752-4-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5579">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5581" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5583" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3754-4-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5586">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5588" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5590" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3756-6-7"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5593">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5595" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5597" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3758-0-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5600">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5602" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5604" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3760-7-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5607">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5609" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5611" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3762-9-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5614">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5616" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5618" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3764-1-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5621">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5623" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5625" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3766-5-7"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5628">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5630" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5632" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3768-8-0"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5635">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5637" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5639" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3770-3-0"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5642">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5644" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5646" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3772-3-9-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5649">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5651" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5653" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3774-6-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5656">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5658" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5660" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3776-6-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5663">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5665" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5667" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3778-6-0"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5670">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5672" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5674" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3780-8-9-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5677">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5679" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5681" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3782-6-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5684">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5686" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5688" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3784-9-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5691">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5693" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5695" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3750-4-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop3755-5-5" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop3757-4-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3752-4-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5579-7">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5581-0" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5583-4" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3754-4-92"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5586-6">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5588-1" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5590-7" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3756-6-2"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5593-1">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5595-4" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5597-0" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3758-0-7"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5600-5">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5602-0" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5604-3" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3760-7-93"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5607-2">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5609-5" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5611-4" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3762-9-3"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5614-9">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5616-6" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5618-8" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3764-1-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5621-3">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5623-5" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5625-3" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3766-5-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5628-5">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5630-2" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5632-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3768-8-2"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5635-1">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5637-4" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5639-8" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3770-3-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5642-1">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5644-2" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5646-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3772-3-9-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5649-4">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5651-6" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5653-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3774-6-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5656-9">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5658-2" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5660-0" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3776-6-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5663-9">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5665-4" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5667-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3778-6-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5670-2">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5672-6" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5674-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3780-8-9-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5677-1">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5679-9" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5681-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3782-6-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5684-4">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5686-1" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5688-1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3784-9-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5691-7">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5693-9" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5695-2" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="15.863342"
+     inkscape:cy="53.378531"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-75.151773,-8.8252661)"
+       id="g4320">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4322"
+         d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4324"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+         style="fill:#808388;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4326" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4328" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330"
+         d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4332"
+         d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4334" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3750);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4336"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4338"
+         style="fill:url(#linearGradient3752);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3754);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4340"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4342"
+         d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+         style="fill:#808388;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4344"
+         d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4346"
+         d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4348" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4350" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4352"
+         d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4354"
+         style="fill:url(#linearGradient3756);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3758);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4356"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4358"
+         style="fill:url(#linearGradient3760);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4360"
+         d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+         style="fill:#3e4447;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4362"
+         d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4364" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4366" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4368"
+         d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4370"
+         d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4372" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3762);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4374"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4376"
+         style="fill:url(#linearGradient3764);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3766);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4378"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4380" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4382"
+         d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4384"
+         d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4386" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4388" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4390"
+         d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4392"
+         style="fill:url(#linearGradient3768);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3770);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4394"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4396"
+         style="fill:url(#linearGradient3772-3);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4398"
+         d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400"
+         d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4402" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4404" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4406"
+         d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4408"
+         style="fill:url(#linearGradient3774);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3776);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4410"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4412"
+         style="fill:url(#linearGradient3778);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4414"
+         d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4416" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4418" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4420" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4422"
+         d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4424"
+         d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4426" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3780-8);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4428"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4430"
+         style="fill:url(#linearGradient3782);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3784);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4432"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4434"
+         d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4436" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4438"
+         d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         id="path4440" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path4442"
+         d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+         style="fill:none;stroke:#ababab;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4444"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+         style="fill:none;stroke:#6c6c6c;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4446"
+         d="m 383.57424,175.39368 30.68594,-17.71654"
+         style="fill:none;stroke:#757575;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4448"
+         d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         style="fill:#262626;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#262626;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         id="path4450" />
+      <g
+         id="g4452">
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           id="path4454" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4456"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           id="path4458" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4460"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           id="path4462" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4464"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           id="path4466" />
+      </g>
+      <g
+         transform="translate(0.05649565,35.458423)"
+         id="g4468">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4470"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           id="path4472" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4474"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           id="path4476" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4478"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           id="path4480" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4482"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      </g>
+    </g>
+    <g
+       style="display:inline"
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-109.24333,-8.825266)"
+       id="g4320-3">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4322-1"
+         d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4324-5"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+         style="fill:#808388;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4326-7" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4328-4" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330-4"
+         d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4332-8"
+         d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4334-6" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3750-4);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4336-6"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4338-5"
+         style="fill:url(#linearGradient3752-4);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3754-4);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4340-1"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4342-0"
+         d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+         style="fill:#808388;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4344-0"
+         d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4346-5"
+         d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4348-6" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4350-7" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4352-3"
+         d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4354-6"
+         style="fill:url(#linearGradient3756-6);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3758-0);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4356-4"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4358-2"
+         style="fill:url(#linearGradient3760-7);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4360-0"
+         d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+         style="fill:#3e4447;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4362-1"
+         d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4364-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4366-3" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4368-0"
+         d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4370-9"
+         d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4372-1" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3762-9);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4374-7"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4376-0"
+         style="fill:url(#linearGradient3764-1);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3766-5);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4378-9"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4380-6" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4382-5"
+         d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4384-0"
+         d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4386-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4388-2" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4390-4"
+         d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4392-9"
+         style="fill:url(#linearGradient3768-8);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3770-3);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4394-2"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4396-1"
+         style="fill:url(#linearGradient3772-3-9);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4398-6"
+         d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400-0"
+         d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4402-2" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4404-8" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4406-0"
+         d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4408-9"
+         style="fill:url(#linearGradient3774-6);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3776-6);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4410-5"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4412-9"
+         style="fill:url(#linearGradient3778-6);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4414-5"
+         d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4416-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4418-6" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4420-9" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4422-5"
+         d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4424-7"
+         d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4426-2" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3780-8-9);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4428-0"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4430-8"
+         style="fill:url(#linearGradient3782-6);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3784-9);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4432-3"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4434-1"
+         d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4436-7" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4438-5"
+         d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         id="path4440-3" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path4442-5"
+         d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+         style="fill:none;stroke:#ababab;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4444-0"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+         style="fill:none;stroke:#6c6c6c;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4446-3"
+         d="m 383.57424,175.39368 30.68594,-17.71654"
+         style="fill:none;stroke:#757575;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4448-8"
+         d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         style="fill:#262626;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#262626;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         id="path4450-2" />
+      <g
+         id="g4452-0">
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           id="path4454-9" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4456-7"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           id="path4458-1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4460-5"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           id="path4462-7" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4464-5"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           id="path4466-6" />
+      </g>
+      <g
+         transform="translate(0.05649565,35.458423)"
+         id="g4468-9">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4470-6"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           id="path4472-3" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4474-9"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           id="path4476-1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4478-8"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           id="path4480-5" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4482-1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      </g>
+    </g>
+    <g
+       style="display:inline"
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-109.24333,-35.64572)"
+       id="g4320-3-1">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4322-1-3"
+         d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4324-5-7"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+         style="fill:#808388;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4326-7-2" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4328-4-9" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330-4-1"
+         d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4332-8-1"
+         d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4334-6-6" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3750-4-2);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4336-6-7"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4338-5-0"
+         style="fill:url(#linearGradient3752-4-6);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3754-4-9);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4340-1-0"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4342-0-5"
+         d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+         style="fill:#808388;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4344-0-2"
+         d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4346-5-0"
+         d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4348-6-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4350-7-1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4352-3-9"
+         d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4354-6-5"
+         style="fill:url(#linearGradient3756-6-7);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3758-0-1);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4356-4-3"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4358-2-6"
+         style="fill:url(#linearGradient3760-7-9);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4360-0-1"
+         d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+         style="fill:#3e4447;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4362-1-0"
+         d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4364-3-6" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4366-3-2" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4368-0-3"
+         d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4370-9-0"
+         d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4372-1-7" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3762-9-4);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4374-7-3"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4376-0-6"
+         style="fill:url(#linearGradient3764-1-4);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3766-5-7);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4378-9-0"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4380-6-4" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4382-5-8"
+         d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4384-0-6"
+         d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4386-3-4" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4388-2-2" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4390-4-5"
+         d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4392-9-5"
+         style="fill:url(#linearGradient3768-8-0);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3770-3-0);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4394-2-5"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4396-1-3"
+         style="fill:url(#linearGradient3772-3-9-1);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4398-6-4"
+         d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400-0-5"
+         d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4402-2-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4404-8-1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4406-0-9"
+         d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4408-9-6"
+         style="fill:url(#linearGradient3774-6-1);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3776-6-5);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4410-5-4"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4412-9-0"
+         style="fill:url(#linearGradient3778-6-0);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4414-5-7"
+         d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4416-3-9" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4418-6-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4420-9-3" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4422-5-3"
+         d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4424-7-5"
+         d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4426-2-2" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3780-8-9-6);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4428-0-5"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4430-8-8"
+         style="fill:url(#linearGradient3782-6-1);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3784-9-1);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4432-3-2"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4434-1-4"
+         d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4436-7-4" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4438-5-0"
+         d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         id="path4440-3-6" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path4442-5-0"
+         d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+         style="fill:none;stroke:#ababab;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4444-0-0"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+         style="fill:none;stroke:#6c6c6c;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4446-3-2"
+         d="m 383.57424,175.39368 30.68594,-17.71654"
+         style="fill:none;stroke:#757575;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4448-8-4"
+         d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         style="fill:#262626;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#262626;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         id="path4450-2-4" />
+      <g
+         id="g4452-0-9">
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           id="path4454-9-9" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4456-7-9"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           id="path4458-1-2" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4460-5-3"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           id="path4462-7-6" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4464-5-8"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           id="path4466-6-6" />
+      </g>
+      <g
+         transform="translate(0.05649565,35.458423)"
+         id="g4468-9-5">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4470-6-6"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           id="path4472-3-1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4474-9-8"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           id="path4476-1-3" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4478-8-2"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           id="path4480-5-3" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4482-1-7"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      </g>
+    </g>
+    <g
+       style="display:inline"
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-75.063332,-35.555266)"
+       id="g4320-3-9">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4322-1-31"
+         d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4324-5-6"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+         style="fill:#808388;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4326-7-8" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4328-4-7" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330-4-12"
+         d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4332-8-8"
+         d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4334-6-5" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3750-4-5);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4336-6-2"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4338-5-1"
+         style="fill:url(#linearGradient3752-4-8);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3754-4-92);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4340-1-4"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4342-0-9"
+         d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+         style="fill:#808388;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4344-0-7"
+         d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4346-5-4"
+         d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4348-6-35" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4350-7-11" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4352-3-6"
+         d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4354-6-2"
+         style="fill:url(#linearGradient3756-6-2);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3758-0-7);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4356-4-1"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4358-2-7"
+         style="fill:url(#linearGradient3760-7-93);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4360-0-8"
+         d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+         style="fill:#3e4447;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4362-1-4"
+         d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4364-3-8" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4366-3-4" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4368-0-2"
+         d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4370-9-9"
+         d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4372-1-6" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3762-9-3);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4374-7-33"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4376-0-7"
+         style="fill:url(#linearGradient3764-1-8);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3766-5-9);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4378-9-1"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4380-6-3" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4382-5-6"
+         d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4384-0-2"
+         d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4386-3-5" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4388-2-6" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4390-4-7"
+         d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4392-9-0"
+         style="fill:url(#linearGradient3768-8-2);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3770-3-5);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4394-2-7"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4396-1-39"
+         style="fill:url(#linearGradient3772-3-9-5);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4398-6-6"
+         d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400-0-8"
+         d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4402-2-4" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4404-8-11" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4406-0-6"
+         d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4408-9-0"
+         style="fill:url(#linearGradient3774-6-4);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3776-6-1);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4410-5-5"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4412-9-9"
+         style="fill:url(#linearGradient3778-6-8);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4414-5-9"
+         d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4416-3-4" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#7e7e82;fill-opacity:1;stroke:none"
+         d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4418-6-5" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4420-9-0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4422-5-0"
+         d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4424-7-7"
+         d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6c6c6c;fill-opacity:1;stroke:none"
+         d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4426-2-9" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3780-8-9-8);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4428-0-8"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4430-8-2"
+         style="fill:url(#linearGradient3782-6-9);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3784-9-5);fill-opacity:1;stroke:#4c4c4c;stroke-opacity:1"
+         id="path4432-3-4"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4434-1-8"
+         d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4436-7-47" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4438-5-6"
+         d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         id="path4440-3-65" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path4442-5-3"
+         d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+         style="fill:none;stroke:#ababab;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4444-0-6"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+         style="fill:none;stroke:#6c6c6c;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4446-3-5"
+         d="m 383.57424,175.39368 30.68594,-17.71654"
+         style="fill:none;stroke:#757575;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4448-8-2"
+         d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         style="fill:#262626;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#262626;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         id="path4450-2-1" />
+      <g
+         id="g4452-0-6">
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           id="path4454-9-91" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4456-7-0"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           id="path4458-1-22" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4460-5-6"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           id="path4462-7-4" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4464-5-0"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           id="path4466-6-7" />
+      </g>
+      <g
+         transform="translate(0.05649565,35.458423)"
+         id="g4468-9-4">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4470-6-63"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           id="path4472-3-4" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4474-9-82"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           id="path4476-1-36" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4478-8-5"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           id="path4480-5-0" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4482-1-6"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/service_provider_light.svg b/interface/images/menu/service_provider_light.svg
new file mode 100755
index 0000000..b317b03
--- /dev/null
+++ b/interface/images/menu/service_provider_light.svg
@@ -0,0 +1,5463 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="service_provider.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3750"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop3755" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop3757" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3752"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4523">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4525" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4527" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3754"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4530">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4532" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4534" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3756"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4537">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4539" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4541" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3758"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4544">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4546" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4548" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3760"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4551">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4553" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4555" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3762"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4558">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4560" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4562" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3764"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4565">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4567" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4569" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3766"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4572">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4574" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4576" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3768"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4579">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4581" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4583" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3770"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4586">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4588" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4590" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3772-3"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4593">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4595" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4597" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3774"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4600">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4602" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4604" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3776"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4607">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4609" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4611" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3778"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4614">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4616" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4618" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3780-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4621">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4623" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4625" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3782"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4628">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4630" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4632" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753"
+       id="linearGradient3784"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient4635">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop4637" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4639" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3750-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop3755-5" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop3757-4" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3752-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5051">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5053" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5055" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3754-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5058">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5060" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5062" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3756-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5065">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5067" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5069" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3758-0"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5072">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5074" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5076" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3760-7"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5079">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5081" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5083" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3762-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5086">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5088" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5090" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3764-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5093">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5095" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5097" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3766-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5100">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5102" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5104" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3768-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5107">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5109" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5111" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3770-3"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5114">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5116" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5118" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3772-3-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5121">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5123" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5125" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3774-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5128">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5130" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5132" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3776-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5135">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5137" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5139" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3778-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5142">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5144" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5146" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3780-8-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5149">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5151" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5153" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3782-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5156">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5158" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5160" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4"
+       id="linearGradient3784-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5163">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5165" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5167" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3750-4-2"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop3755-5-0" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop3757-4-0" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3752-4-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5579">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5581" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5583" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3754-4-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5586">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5588" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5590" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3756-6-7"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5593">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5595" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5597" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3758-0-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5600">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5602" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5604" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3760-7-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5607">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5609" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5611" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3762-9-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5614">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5616" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5618" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3764-1-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5621">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5623" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5625" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3766-5-7"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5628">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5630" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5632" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3768-8-0"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5635">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5637" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5639" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3770-3-0"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5642">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5644" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5646" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3772-3-9-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5649">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5651" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5653" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3774-6-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5656">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5658" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5660" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3776-6-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5663">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5665" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5667" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3778-6-0"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5670">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5672" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5674" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3780-8-9-6"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5677">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5679" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5681" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3782-6-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5684">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5686" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5688" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8"
+       id="linearGradient3784-9-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5691">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5693" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5695" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3750-4-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop3755-5-5" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop3757-4-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3752-4-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5579-7">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5581-0" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5583-4" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3754-4-92"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5586-6">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5588-1" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5590-7" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3756-6-2"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5593-1">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5595-4" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5597-0" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3758-0-7"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5600-5">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5602-0" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5604-3" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3760-7-93"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5607-2">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5609-5" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5611-4" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3762-9-3"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5614-9">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5616-6" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5618-8" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3764-1-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5621-3">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5623-5" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5625-3" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3766-5-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5628-5">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5630-2" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5632-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3768-8-2"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5635-1">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5637-4" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5639-8" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3770-3-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5642-1">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5644-2" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5646-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3772-3-9-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5649-4">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5651-6" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5653-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3774-6-4"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5656-9">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5658-2" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5660-0" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3776-6-1"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5663-9">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5665-4" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5667-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3778-6-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5670-2">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5672-6" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5674-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3780-8-9-8"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5677-1">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5679-9" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5681-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3782-6-9"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5684-4">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5686-1" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5688-1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7"
+       id="linearGradient3784-9-5"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient5691-7">
+      <stop
+         style="stop-color:#ededed;stop-opacity:1;"
+         offset="0"
+         id="stop5693-9" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop5695-2" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3750-4-5-849-589-645"
+       xlink:href="#linearGradient3753-4-7-515-221-873"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-515-221-873">
+      <stop
+         id="stop18776"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18778"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3752-4-8-865-39-998"
+       xlink:href="#linearGradient3753-4-7-996-438-838"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-996-438-838">
+      <stop
+         id="stop18782"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18784"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3754-4-92-693-616-221"
+       xlink:href="#linearGradient3753-4-7-812-538-441"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-812-538-441">
+      <stop
+         id="stop18788"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18790"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3756-6-2-675-787-609"
+       xlink:href="#linearGradient3753-4-7-266-502-508"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-266-502-508">
+      <stop
+         id="stop18794"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18796"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3758-0-7-290-295-303"
+       xlink:href="#linearGradient3753-4-7-124-672-81"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-124-672-81">
+      <stop
+         id="stop18800"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18802"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3760-7-93-194-399-87"
+       xlink:href="#linearGradient3753-4-7-920-567-651"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-920-567-651">
+      <stop
+         id="stop18806"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18808"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3762-9-3-351-164-870"
+       xlink:href="#linearGradient3753-4-7-897-988-214"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-897-988-214">
+      <stop
+         id="stop18812"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18814"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3764-1-8-935-985-670"
+       xlink:href="#linearGradient3753-4-7-277-355-173"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-277-355-173">
+      <stop
+         id="stop18818"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18820"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3766-5-9-365-489-130"
+       xlink:href="#linearGradient3753-4-7-674-628-444"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-674-628-444">
+      <stop
+         id="stop18824"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18826"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3768-8-2-726-788-821"
+       xlink:href="#linearGradient3753-4-7-415-900-979"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-415-900-979">
+      <stop
+         id="stop18830"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18832"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3770-3-5-203-431-151"
+       xlink:href="#linearGradient3753-4-7-982-430-938"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-982-430-938">
+      <stop
+         id="stop18836"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18838"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772-3-9-5-394-317-439"
+       xlink:href="#linearGradient3753-4-7-77-367-511"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-77-367-511">
+      <stop
+         id="stop18842"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18844"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3774-6-4-557-623-911"
+       xlink:href="#linearGradient3753-4-7-617-188-822"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-617-188-822">
+      <stop
+         id="stop18848"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18850"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3776-6-1-137-725-52"
+       xlink:href="#linearGradient3753-4-7-232-91-291"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-232-91-291">
+      <stop
+         id="stop18854"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18856"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3778-6-8-260-398-646"
+       xlink:href="#linearGradient3753-4-7-912-821-258"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-912-821-258">
+      <stop
+         id="stop18860"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18862"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780-8-9-8-299-608-766"
+       xlink:href="#linearGradient3753-4-7-245-826-791"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-245-826-791">
+      <stop
+         id="stop18866"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18868"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3782-6-9-728-817-595"
+       xlink:href="#linearGradient3753-4-7-156-822-746"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-156-822-746">
+      <stop
+         id="stop18872"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18874"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3784-9-5-501-261-748"
+       xlink:href="#linearGradient3753-4-7-109-925-206"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-7-109-925-206">
+      <stop
+         id="stop18878"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18880"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3784-9-1-378-478-855"
+       xlink:href="#linearGradient3753-4-8-636-36-424"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-636-36-424">
+      <stop
+         id="stop18770"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18772"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3782-6-1-319-304-790"
+       xlink:href="#linearGradient3753-4-8-276-892-437"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-276-892-437">
+      <stop
+         id="stop18764"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18766"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780-8-9-6-207-63-309"
+       xlink:href="#linearGradient3753-4-8-382-68-691"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-382-68-691">
+      <stop
+         id="stop18758"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18760"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3778-6-0-777-655-174"
+       xlink:href="#linearGradient3753-4-8-991-816-811"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-991-816-811">
+      <stop
+         id="stop18752"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18754"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3776-6-5-313-669-575"
+       xlink:href="#linearGradient3753-4-8-198-79-509"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-198-79-509">
+      <stop
+         id="stop18746"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18748"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3774-6-1-103-775-452"
+       xlink:href="#linearGradient3753-4-8-949-583-562"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-949-583-562">
+      <stop
+         id="stop18740"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18742"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772-3-9-1-563-498-691"
+       xlink:href="#linearGradient3753-4-8-781-934-505"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-781-934-505">
+      <stop
+         id="stop18734"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18736"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3770-3-0-718-46-188"
+       xlink:href="#linearGradient3753-4-8-686-749-445"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-686-749-445">
+      <stop
+         id="stop18728"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18730"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3768-8-0-92-581-721"
+       xlink:href="#linearGradient3753-4-8-495-595-147"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-495-595-147">
+      <stop
+         id="stop18722"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18724"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3766-5-7-701-111-177"
+       xlink:href="#linearGradient3753-4-8-532-54-603"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-532-54-603">
+      <stop
+         id="stop18716"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18718"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3764-1-4-154-120-715"
+       xlink:href="#linearGradient3753-4-8-687-667-506"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-687-667-506">
+      <stop
+         id="stop18710"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18712"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3762-9-4-330-987-902"
+       xlink:href="#linearGradient3753-4-8-933-680-964"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-933-680-964">
+      <stop
+         id="stop18704"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18706"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3760-7-9-230-479-624"
+       xlink:href="#linearGradient3753-4-8-169-263-752"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-169-263-752">
+      <stop
+         id="stop18698"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18700"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3758-0-1-318-576-397"
+       xlink:href="#linearGradient3753-4-8-36-25-362"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-36-25-362">
+      <stop
+         id="stop18692"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18694"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3756-6-7-313-188-728"
+       xlink:href="#linearGradient3753-4-8-283-653-851"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-283-653-851">
+      <stop
+         id="stop18686"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18688"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3754-4-9-893-334-52"
+       xlink:href="#linearGradient3753-4-8-78-410-774"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-78-410-774">
+      <stop
+         id="stop18680"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18682"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3752-4-6-470-734-635"
+       xlink:href="#linearGradient3753-4-8-94-877-914"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-94-877-914">
+      <stop
+         id="stop18674"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18676"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3750-4-2-761-250-763"
+       xlink:href="#linearGradient3753-4-8-778-452-732"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-8-778-452-732">
+      <stop
+         id="stop18668"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18670"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3750-4-833-666-676"
+       xlink:href="#linearGradient3753-4-113-810-463"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-113-810-463">
+      <stop
+         id="stop18560"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18562"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3752-4-536-344-370"
+       xlink:href="#linearGradient3753-4-447-384-75"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-447-384-75">
+      <stop
+         id="stop18566"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18568"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3754-4-841-467-913"
+       xlink:href="#linearGradient3753-4-47-223-887"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-47-223-887">
+      <stop
+         id="stop18572"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18574"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3756-6-569-946-855"
+       xlink:href="#linearGradient3753-4-620-461-462"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-620-461-462">
+      <stop
+         id="stop18578"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18580"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3758-0-653-254-740"
+       xlink:href="#linearGradient3753-4-411-717-260"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-411-717-260">
+      <stop
+         id="stop18584"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18586"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3760-7-275-24-378"
+       xlink:href="#linearGradient3753-4-716-880-594"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-716-880-594">
+      <stop
+         id="stop18590"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18592"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3762-9-457-509-115"
+       xlink:href="#linearGradient3753-4-968-577-32"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-968-577-32">
+      <stop
+         id="stop18596"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18598"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3764-1-877-814-523"
+       xlink:href="#linearGradient3753-4-753-522-863"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-753-522-863">
+      <stop
+         id="stop18602"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18604"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3766-5-633-592-472"
+       xlink:href="#linearGradient3753-4-975-333-327"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-975-333-327">
+      <stop
+         id="stop18608"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18610"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3768-8-371-892-601"
+       xlink:href="#linearGradient3753-4-749-38-779"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-749-38-779">
+      <stop
+         id="stop18614"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18616"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3770-3-782-501-320"
+       xlink:href="#linearGradient3753-4-809-518-681"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-809-518-681">
+      <stop
+         id="stop18620"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18622"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772-3-9-654-243-397"
+       xlink:href="#linearGradient3753-4-878-957-290"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-878-957-290">
+      <stop
+         id="stop18626"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18628"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3774-6-397-740-457"
+       xlink:href="#linearGradient3753-4-271-484-974"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-271-484-974">
+      <stop
+         id="stop18632"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18634"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3776-6-493-264-701"
+       xlink:href="#linearGradient3753-4-632-256-676"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-632-256-676">
+      <stop
+         id="stop18638"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18640"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3778-6-512-494-174"
+       xlink:href="#linearGradient3753-4-314-219-619"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-314-219-619">
+      <stop
+         id="stop18644"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18646"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780-8-9-534-250-842"
+       xlink:href="#linearGradient3753-4-930-471-229"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-930-471-229">
+      <stop
+         id="stop18650"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18652"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3782-6-972-359-809"
+       xlink:href="#linearGradient3753-4-23-304-937"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-23-304-937">
+      <stop
+         id="stop18656"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18658"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3784-9-584-597-93"
+       xlink:href="#linearGradient3753-4-599-488-254"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-4-599-488-254">
+      <stop
+         id="stop18662"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18664"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3750-521-298-434"
+       xlink:href="#linearGradient3753-824-109-510"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-824-109-510">
+      <stop
+         id="stop18452"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18454"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3752-38-427-856"
+       xlink:href="#linearGradient3753-64-61-298"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-64-61-298">
+      <stop
+         id="stop18458"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18460"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3754-137-444-280"
+       xlink:href="#linearGradient3753-736-714-797"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-736-714-797">
+      <stop
+         id="stop18464"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18466"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3756-371-173-672"
+       xlink:href="#linearGradient3753-953-842-723"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-953-842-723">
+      <stop
+         id="stop18470"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18472"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3758-290-47-836"
+       xlink:href="#linearGradient3753-332-984-467"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-332-984-467">
+      <stop
+         id="stop18476"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18478"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3760-401-383-230"
+       xlink:href="#linearGradient3753-668-558-371"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-668-558-371">
+      <stop
+         id="stop18482"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18484"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3762-60-537-219"
+       xlink:href="#linearGradient3753-31-599-973"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-31-599-973">
+      <stop
+         id="stop18488"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18490"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3764-477-32-15"
+       xlink:href="#linearGradient3753-830-281-876"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-830-281-876">
+      <stop
+         id="stop18494"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18496"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3766-230-875-993"
+       xlink:href="#linearGradient3753-449-142-616"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-449-142-616">
+      <stop
+         id="stop18500"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18502"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3768-511-816-562"
+       xlink:href="#linearGradient3753-747-100-688"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-747-100-688">
+      <stop
+         id="stop18506"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18508"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3770-896-385-798"
+       xlink:href="#linearGradient3753-99-515-524"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-99-515-524">
+      <stop
+         id="stop18512"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18514"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772-3-390-951-110"
+       xlink:href="#linearGradient3753-67-963-648"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-67-963-648">
+      <stop
+         id="stop18518"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18520"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3774-906-878-27"
+       xlink:href="#linearGradient3753-260-323-327"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-260-323-327">
+      <stop
+         id="stop18524"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18526"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3776-434-754-461"
+       xlink:href="#linearGradient3753-109-431-410"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-109-431-410">
+      <stop
+         id="stop18530"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18532"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3778-947-106-266"
+       xlink:href="#linearGradient3753-782-230-872"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-782-230-872">
+      <stop
+         id="stop18536"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18538"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780-8-695-136-154"
+       xlink:href="#linearGradient3753-193-359-140"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-193-359-140">
+      <stop
+         id="stop18542"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18544"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3782-112-379-976"
+       xlink:href="#linearGradient3753-808-941-401"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-808-941-401">
+      <stop
+         id="stop18548"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18550"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="167.29497"
+       x2="319.65189"
+       y1="163.13255"
+       x1="316.61093"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3784-476-598-481"
+       xlink:href="#linearGradient3753-815-702-232"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3753-815-702-232">
+      <stop
+         id="stop18554"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop18556"
+         offset="1"
+         style="stop-color:#eeeeee;stop-opacity:1;" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="15.863342"
+     inkscape:cy="53.378531"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       style="display:inline"
+       id="g4320"
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-75.217102,-9.685866)">
+      <path
+         style="fill:#242424;fill-opacity:1;stroke:#242424;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+         id="path4322"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a7a8ac;fill-opacity:1;stroke:none"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+         id="path4324"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4326"
+         d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4328"
+         d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4330"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4332"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4334"
+         d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4336"
+         style="fill:url(#linearGradient3750-521-298-434);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3752-38-427-856);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4338"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4340"
+         style="fill:url(#linearGradient3754-137-444-280);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         style="fill:#a7a8ac;fill-opacity:1;stroke:none"
+         d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+         id="path4342"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4344"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4346"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4348"
+         d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4350"
+         d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4352"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3756-371-173-672);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4354"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4356"
+         style="fill:url(#linearGradient3758-290-47-836);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3760-401-383-230);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4358"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)" />
+      <path
+         style="fill:#5f6b6e;fill-opacity:1;stroke:none"
+         d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+         id="path4360"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4362"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4364"
+         d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4366"
+         d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4368"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4370"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4372"
+         d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4374"
+         style="fill:url(#linearGradient3762-60-537-219);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3764-477-32-15);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4376"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4378"
+         style="fill:url(#linearGradient3766-230-875-993);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         id="path4380"
+         d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4382"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4384"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4386"
+         d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4388"
+         d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4390"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3768-511-816-562);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4392"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4394"
+         style="fill:url(#linearGradient3770-896-385-798);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3772-3-390-951-110);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4396"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4398"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4400"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4402"
+         d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4404"
+         d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4406"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3774-906-878-27);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4408"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4410"
+         style="fill:url(#linearGradient3776-434-754-461);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3778-947-106-266);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4412"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4414"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4416"
+         d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4418"
+         d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4420"
+         d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4422"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4424"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4426"
+         d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4428"
+         style="fill:url(#linearGradient3780-8-695-136-154);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3782-112-379-976);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4430"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4432"
+         style="fill:url(#linearGradient3784-476-598-481);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4434"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4436"
+         d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         id="path4438"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4440"
+         d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         style="fill:none;stroke:#242424;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#cfcfcf;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+         id="path4442"
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#909090;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+         id="path4444"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#999999;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 383.57424,175.39368 30.68594,-17.71654"
+         id="path4446"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#4a4a4a;fill-opacity:1;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         id="path4448"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4450"
+         d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         style="fill:#4a4a4a;fill-opacity:1;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g4452">
+        <path
+           id="path4454"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           id="path4456"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4458"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           id="path4460"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4462"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           id="path4464"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4466"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4468"
+         transform="translate(0.05649565,35.458423)">
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           id="path4470"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4472"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           id="path4474"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4476"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           id="path4478"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4480"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           id="path4482"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g4320-3"
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-109.30866,-9.685865)"
+       style="display:inline">
+      <path
+         style="fill:#242424;fill-opacity:1;stroke:#242424;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+         id="path4322-1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a7a8ac;fill-opacity:1;stroke:none"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+         id="path4324-5"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4326-7"
+         d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4328-4"
+         d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4330-4"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4332-8"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4334-6"
+         d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4336-6"
+         style="fill:url(#linearGradient3750-4-833-666-676);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3752-4-536-344-370);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4338-5"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4340-1"
+         style="fill:url(#linearGradient3754-4-841-467-913);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         style="fill:#a7a8ac;fill-opacity:1;stroke:none"
+         d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+         id="path4342-0"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4344-0"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4346-5"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4348-6"
+         d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4350-7"
+         d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4352-3"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3756-6-569-946-855);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4354-6"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4356-4"
+         style="fill:url(#linearGradient3758-0-653-254-740);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3760-7-275-24-378);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4358-2"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)" />
+      <path
+         style="fill:#5f6b6e;fill-opacity:1;stroke:none"
+         d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+         id="path4360-0"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4362-1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4364-3"
+         d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4366-3"
+         d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4368-0"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4370-9"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4372-1"
+         d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4374-7"
+         style="fill:url(#linearGradient3762-9-457-509-115);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3764-1-877-814-523);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4376-0"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4378-9"
+         style="fill:url(#linearGradient3766-5-633-592-472);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         id="path4380-6"
+         d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4382-5"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4384-0"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4386-3"
+         d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4388-2"
+         d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4390-4"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3768-8-371-892-601);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4392-9"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4394-2"
+         style="fill:url(#linearGradient3770-3-782-501-320);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3772-3-9-654-243-397);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4396-1"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4398-6"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4400-0"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4402-2"
+         d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4404-8"
+         d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4406-0"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3774-6-397-740-457);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4408-9"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4410-5"
+         style="fill:url(#linearGradient3776-6-493-264-701);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3778-6-512-494-174);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4412-9"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4414-5"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4416-3"
+         d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4418-6"
+         d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4420-9"
+         d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4422-5"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4424-7"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4426-2"
+         d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4428-0"
+         style="fill:url(#linearGradient3780-8-9-534-250-842);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3782-6-972-359-809);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4430-8"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4432-3"
+         style="fill:url(#linearGradient3784-9-584-597-93);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4434-1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4436-7"
+         d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         id="path4438-5"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4440-3"
+         d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         style="fill:none;stroke:#242424;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#cfcfcf;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+         id="path4442-5"
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#909090;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+         id="path4444-0"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#999999;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 383.57424,175.39368 30.68594,-17.71654"
+         id="path4446-3"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#4a4a4a;fill-opacity:1;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         id="path4448-8"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4450-2"
+         d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         style="fill:#4a4a4a;fill-opacity:1;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g4452-0">
+        <path
+           id="path4454-9"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           id="path4456-7"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4458-1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           id="path4460-5"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4462-7"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           id="path4464-5"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4466-6"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4468-9"
+         transform="translate(0.05649565,35.458423)">
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           id="path4470-6"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4472-3"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           id="path4474-9"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4476-1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           id="path4478-8"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4480-5"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           id="path4482-1"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path4322-1-3"
+       d="M 31.523905,16.002967 20.182067,22.446509 20.000004,48.524631 31.250771,55.125902 42.592608,48.68236 42.774671,22.604238 31.523905,16.002967 z"
+       style="fill:#242424;fill-opacity:1;stroke:#242424;stroke-width:0.73623312;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       id="path4324-5-7"
+       d="M 20.18699,22.442729 20.004869,48.529094 31.255067,55.129547 31.437187,29.043183 20.18699,22.442729 z"
+       style="fill:#a7a8ac;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#a2a2a6;fill-opacity:1;stroke:none;display:inline"
+       d="m 21.208143,44.019652 8.95833,5.232578 -0.02732,3.912954 -9.000158,-5.280358 0.06915,-3.865174 z"
+       id="path4326-7-2" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 22.264015,48.54487 0.02732,-3.912955 -1.125019,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+       id="path4328-4-9" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4330-4-1"
+       d="m 30.139155,53.165184 0.02732,-3.91295 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.66004 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4332-8-1"
+       d="m 26.764096,51.185049 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.660044 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 25.639074,50.525005 0.02732,-3.912951 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.66004 z"
+       id="path4334-6-6" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3750-4-2-761-250-763);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4336-6-7"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,2.9119167,21.494795)" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-1.0806493,19.11954)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4338-5-0"
+       style="fill:url(#linearGradient3752-4-6-470-734-635);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3754-4-9-893-334-52);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4340-1-0"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.8354077,23.776606)" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       id="path4342-0-5"
+       d="M 31.528247,16 20.18699,22.442729 31.437187,29.043183 42.778445,22.60045 31.528247,16 z"
+       style="fill:#a7a8ac;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4344-0-2"
+       d="m 21.344733,24.454876 8.95833,5.232579 -0.02732,3.912954 -9.000158,-5.280358 0.06915,-3.865175 z"
+       style="fill:#a2a2a6;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4346-5-0"
+       d="m 22.400606,28.980094 0.02732,-3.912954 -1.125018,-0.660047 -0.02732,3.912958 1.125019,0.660043 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 30.275745,33.600409 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.660044 z"
+       id="path4348-6-3" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 26.900686,31.620274 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+       id="path4350-7-1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4352-3-9"
+       d="m 25.775664,30.96023 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,3.0485067,1.93002)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4354-6-5"
+       style="fill:url(#linearGradient3756-6-7-313-188-728);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3758-0-1-318-576-397);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4356-4-3"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-0.94405932,-0.445239)" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.9719977,4.21183)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4358-2-6"
+       style="fill:url(#linearGradient3760-7-9-230-479-624);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       id="path4360-0-1"
+       d="m 31.437187,29.043183 11.341258,-6.442733 -0.18212,26.086365 -11.341258,6.442732 0.18212,-26.086364 z"
+       style="fill:#5f6b6e;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4362-1-0"
+       d="m 21.302906,24.407093 9.000157,5.280362 -0.02732,3.912954 -9.000158,-5.280358 0.02732,-3.912958 z"
+       style="fill:none;stroke:#242424;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#a2a2a6;fill-opacity:1;stroke:none;display:inline"
+       d="m 21.317415,28.367834 8.95833,5.232579 -0.02732,3.912954 -9.000158,-5.280358 0.06915,-3.865175 z"
+       id="path4364-3-6" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 22.373288,32.893052 0.02732,-3.912954 -1.125019,-0.660047 -0.02732,3.912958 1.125019,0.660043 z"
+       id="path4366-3-2" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4368-0-3"
+       d="m 30.248427,37.513367 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125019,0.660044 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4370-9-0"
+       d="m 26.873368,35.533232 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 25.748346,34.873188 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+       id="path4372-1-7" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3762-9-4-330-987-902);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4374-7-3"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,3.0211887,5.842978)" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-0.97137732,3.467718)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4376-0-6"
+       style="fill:url(#linearGradient3764-1-4-154-120-715);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3766-5-7-701-111-177);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4378-9-0"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.9446797,8.124788)" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#242424;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m 21.275587,28.320047 9.000158,5.280362 -0.02732,3.912954 -9.000158,-5.280358 0.02732,-3.912958 z"
+       id="path4380-6-4" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4382-5-8"
+       d="m 21.290097,32.280785 8.95833,5.232578 -0.02732,3.912955 -9.000158,-5.280359 0.06915,-3.865174 z"
+       style="fill:#a2a2a6;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4384-0-6"
+       d="m 22.34597,36.806003 0.02732,-3.912954 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.660044 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 30.221109,41.426318 0.02732,-3.912951 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.660041 z"
+       id="path4386-3-4" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 26.84605,39.446182 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.660044 z"
+       id="path4388-2-2" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4390-4-5"
+       d="m 25.721028,38.786138 0.02732,-3.91295 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.66004 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,2.9938707,9.755929)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4392-9-5"
+       style="fill:url(#linearGradient3768-8-0-92-581-721);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3770-3-0-718-46-188);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4394-2-5"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-0.99869532,7.380672)" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.9173617,12.03774)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4396-1-3"
+       style="fill:url(#linearGradient3772-3-9-1-563-498-691);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4398-6-4"
+       d="m 21.235461,40.106697 8.95833,5.232579 -0.02732,3.912954 -9.000158,-5.280358 0.06915,-3.865175 z"
+       style="fill:#a2a2a6;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4400-0-5"
+       d="m 22.291334,44.631915 0.02732,-3.912954 -1.125019,-0.660047 -0.02732,3.912958 1.125019,0.660043 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 30.166473,49.25223 0.02732,-3.912954 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.660044 z"
+       id="path4402-2-3" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 26.791414,47.272095 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+       id="path4404-8-1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4406-0-9"
+       d="m 25.666392,46.612051 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,2.9392347,17.581841)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4408-9-6"
+       style="fill:url(#linearGradient3774-6-1-103-775-452);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3776-6-5-313-669-575);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4410-5-4"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-1.0533313,15.206582)" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.8627257,19.863652)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4412-9-0"
+       style="fill:url(#linearGradient3778-6-0-777-655-174);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4414-5-7"
+       d="m 21.248269,32.233001 9.000158,5.280362 -0.02732,3.912955 -9.000158,-5.280359 0.02732,-3.912958 z"
+       style="fill:none;stroke:#242424;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#242424;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m 21.220951,36.145959 9.000158,5.280362 -0.02732,3.912955 -9.000158,-5.280359 0.02732,-3.912958 z"
+       id="path4416-3-9" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#a2a2a6;fill-opacity:1;stroke:none;display:inline"
+       d="m 21.262779,36.193743 8.95833,5.232578 -0.02732,3.912955 -9.000158,-5.280359 0.06915,-3.865174 z"
+       id="path4418-6-3" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 22.318652,40.718961 0.02732,-3.912954 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.660044 z"
+       id="path4420-9-3" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4422-5-3"
+       d="m 30.193791,45.339276 0.02732,-3.912955 -1.125019,-0.660047 -0.02732,3.912958 1.125019,0.660044 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4424-7-5"
+       d="m 26.818732,43.35914 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.660044 z"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#909090;fill-opacity:1;stroke:none;display:inline"
+       d="m 25.69371,42.699096 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912959 1.125018,0.660043 z"
+       id="path4426-2-2" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3780-8-9-6-207-63-309);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4428-0-5"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,2.9665527,13.668887)" />
+    <path
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-1.0260133,11.293627)"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       sodipodi:ry="5.9796319"
+       sodipodi:rx="5.9796319"
+       sodipodi:cy="163.34666"
+       sodipodi:cx="316.22275"
+       id="path4430-8-8"
+       style="fill:url(#linearGradient3782-6-1-319-304-790);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3784-9-1-378-478-855);fill-opacity:1;stroke:#707070;stroke-opacity:1;display:inline"
+       id="path4432-3-2"
+       sodipodi:cx="316.22275"
+       sodipodi:cy="163.34666"
+       sodipodi:rx="5.9796319"
+       sodipodi:ry="5.9796319"
+       d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+       transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.8900437,15.950698)" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4434-1-4"
+       d="m 21.193633,40.058914 9.000158,5.280362 -0.02732,3.912954 -9.000158,-5.280358 0.02732,-3.912958 z"
+       style="fill:none;stroke:#242424;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#242424;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m 21.166315,43.971868 9.000158,5.280362 -0.02732,3.912954 -9.000158,-5.280358 0.02732,-3.912958 z"
+       id="path4436-7-4" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4438-5-0"
+       d="m 21.302906,24.407093 -0.08196,11.738866 9.000158,5.280362 0.08195,-11.738866 -9.000157,-5.280362 z"
+       style="fill:none;stroke:#242424;stroke-width:0.66260982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#242424;stroke-width:0.66260982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       d="m 21.220951,36.145956 -0.08195,11.738866 9.000158,5.280362 0.08195,-11.738866 -9.000158,-5.280362 z"
+       id="path4440-3-6" />
+    <path
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       id="path4442-5-0"
+       d="m 20.18699,22.442729 11.250197,6.600454 -0.18212,26.086364 0,0"
+       style="fill:none;stroke:#cfcfcf;stroke-width:0.14724663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4444-0-0"
+       d="m 20.18699,22.442729 -0.182121,26.086365 11.250198,6.600453 0,0"
+       style="fill:none;stroke:#909090;stroke-width:0.14724663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4446-3-2"
+       d="M 31.437187,29.043183 42.778445,22.60045"
+       style="fill:none;stroke:#999999;stroke-width:0.14724663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4448-8-4"
+       d="m 41.635215,24.549041 -9.073006,5.154186 -0.07285,10.434547 9.073006,-5.154185 0.07285,-10.434548 0,0 z"
+       style="fill:#4a4a4a;fill-opacity:1;stroke:#242424;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#4a4a4a;fill-opacity:1;stroke:#242424;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m 41.544155,37.592224 -9.073006,5.154185 -0.07285,10.434547 9.073005,-5.154185 0.07285,-10.434547 0,0 z"
+       id="path4450-2-4" />
+    <g
+       style="display:inline"
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-109.30866,-36.506319)"
+       id="g4452-0-9">
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 389.76795,175.41904 -0.0565,28.3211"
+         id="path4454-9-9" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4456-7-9"
+         d="m 392.78003,173.62203 -0.0565,28.3211"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 395.84862,171.85037 -0.0565,28.3211"
+         id="path4458-1-2" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-5-3"
+         d="m 398.91721,170.07872 -0.0565,28.3211"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 401.98581,168.30706 -0.0565,28.3211"
+         id="path4462-7-6" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4464-5-8"
+         d="m 405.0544,166.53541 -0.0565,28.3211"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 408.123,164.76376 -0.0565,28.3211"
+         id="path4466-6-6" />
+    </g>
+    <g
+       style="display:inline"
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-109.37899,-23.453659)"
+       id="g4468-9-5">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4470-6-6"
+         d="m 389.76795,175.41904 -0.0565,28.3211"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 392.78003,173.62203 -0.0565,28.3211"
+         id="path4472-3-1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4474-9-8"
+         d="m 395.84862,171.85037 -0.0565,28.3211"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 398.91721,170.07872 -0.0565,28.3211"
+         id="path4476-1-3" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4478-8-2"
+         d="m 401.98581,168.30706 -0.0565,28.3211"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 405.0544,166.53541 -0.0565,28.3211"
+         id="path4480-5-3" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4482-1-7"
+         d="m 408.123,164.76376 -0.0565,28.3211"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       id="g4320-3-9"
+       transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-75.128662,-36.415865)"
+       style="display:inline">
+      <path
+         style="fill:#242424;fill-opacity:1;stroke:#242424;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+         id="path4322-1-31"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a7a8ac;fill-opacity:1;stroke:none"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+         id="path4324-5-6"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4326-7-8"
+         d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4328-4-7"
+         d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4330-4-12"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4332-8-8"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4334-6-5"
+         d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4336-6-2"
+         style="fill:url(#linearGradient3750-4-5-849-589-645);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3752-4-8-865-39-998);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4338-5-1"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4340-1-4"
+         style="fill:url(#linearGradient3754-4-92-693-616-221);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         style="fill:#a7a8ac;fill-opacity:1;stroke:none"
+         d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+         id="path4342-0-9"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4344-0-7"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4346-5-4"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4348-6-35"
+         d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4350-7-11"
+         d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4352-3-6"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3756-6-2-675-787-609);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4354-6-2"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4356-4-1"
+         style="fill:url(#linearGradient3758-0-7-290-295-303);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3760-7-93-194-399-87);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4358-2-7"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)" />
+      <path
+         style="fill:#5f6b6e;fill-opacity:1;stroke:none"
+         d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+         id="path4360-0-8"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4362-1-4"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4364-3-8"
+         d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4366-3-4"
+         d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4368-0-2"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4370-9-9"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4372-1-6"
+         d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4374-7-33"
+         style="fill:url(#linearGradient3762-9-3-351-164-870);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3764-1-8-935-985-670);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4376-0-7"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4378-9-1"
+         style="fill:url(#linearGradient3766-5-9-365-489-130);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         id="path4380-6-3"
+         d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4382-5-6"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4384-0-2"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4386-3-5"
+         d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4388-2-6"
+         d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+         id="path4390-4-7"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3768-8-2-726-788-821);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4392-9-0"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4394-2-7"
+         style="fill:url(#linearGradient3770-3-5-203-431-151);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3772-3-9-5-394-317-439);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4396-1-39"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)" />
+      <path
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         id="path4398-6-6"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4400-0-8"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4402-2-4"
+         d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4404-8-11"
+         d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4406-0-6"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3774-6-4-557-623-911);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4408-9-0"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4410-5-5"
+         style="fill:url(#linearGradient3776-6-1-137-725-52);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3778-6-8-260-398-646);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4412-9-9"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4414-5-9"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4416-3-4"
+         d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4418-6-5"
+         d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+         style="fill:#a2a2a6;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4420-9-0"
+         d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4422-5-0"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         id="path4424-7-7"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4426-2-9"
+         d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+         style="fill:#909090;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4428-0-8"
+         style="fill:url(#linearGradient3780-8-9-8-299-608-766);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3782-6-9-728-817-595);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         id="path4430-8-2"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)" />
+      <path
+         transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)"
+         d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4432-3-4"
+         style="fill:url(#linearGradient3784-9-5-501-261-748);fill-opacity:1;stroke:#707070;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         id="path4434-1-8"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4436-7-47"
+         d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+         style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#242424;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         id="path4438-5-6"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4440-3-65"
+         d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+         style="fill:none;stroke:#242424;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#cfcfcf;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+         id="path4442-5-3"
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#909090;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+         id="path4444-0-6"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#999999;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 383.57424,175.39368 30.68594,-17.71654"
+         id="path4446-3-5"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#4a4a4a;fill-opacity:1;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         id="path4448-8-2"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4450-2-1"
+         d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+         style="fill:#4a4a4a;fill-opacity:1;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g4452-0-6">
+        <path
+           id="path4454-9-91"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           id="path4456-7-0"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4458-1-22"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           id="path4460-5-6"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4462-7-4"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           id="path4464-5-0"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4466-6-7"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4468-9-4"
+         transform="translate(0.05649565,35.458423)">
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           id="path4470-6-63"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4472-3-4"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           id="path4474-9-82"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4476-1-36"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           id="path4478-8-5"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4480-5-0"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#242424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           id="path4482-1-6"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/service_provider_light2.svg b/interface/images/menu/service_provider_light2.svg
new file mode 100755
index 0000000..131d985
--- /dev/null
+++ b/interface/images/menu/service_provider_light2.svg
@@ -0,0 +1,7522 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="service_provider_light.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="15.863342"
+     inkscape:cy="53.378531"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#c2c2c2;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#181818;stop-opacity:1;" />
+      <stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#181818;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#3b8edc;stop-opacity:1;" />
+      <stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#96cef6;stop-opacity:1;" />
+    </linearGradient>
+    <filter
+       id="filter3174"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </filter>
+    <filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </filter>
+    <clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </clipPath>
+    <clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </clipPath>
+    <clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <filter
+       id="filter3657"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#181818;stop-opacity:1;" />
+      <stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#181818;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#fa0000;stop-opacity:1;" />
+      <stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f58a7b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753">
+      <stop
+         id="stop3755"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3757"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4523">
+      <stop
+         id="stop4525"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4527"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4530">
+      <stop
+         id="stop4532"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4534"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4537">
+      <stop
+         id="stop4539"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4541"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4544">
+      <stop
+         id="stop4546"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4548"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4551">
+      <stop
+         id="stop4553"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4555"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4558">
+      <stop
+         id="stop4560"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4562"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4565">
+      <stop
+         id="stop4567"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4569"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4572">
+      <stop
+         id="stop4574"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4576"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4579">
+      <stop
+         id="stop4581"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4583"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4586">
+      <stop
+         id="stop4588"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4590"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4593">
+      <stop
+         id="stop4595"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4597"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4600">
+      <stop
+         id="stop4602"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4604"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4607">
+      <stop
+         id="stop4609"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4611"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4614">
+      <stop
+         id="stop4616"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4618"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4621">
+      <stop
+         id="stop4623"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4625"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4628">
+      <stop
+         id="stop4630"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4632"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4635">
+      <stop
+         id="stop4637"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop4639"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4">
+      <stop
+         id="stop3755-5"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3757-4"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5051">
+      <stop
+         id="stop5053"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5055"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5058">
+      <stop
+         id="stop5060"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5062"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5065">
+      <stop
+         id="stop5067"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5069"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5072">
+      <stop
+         id="stop5074"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5076"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5079">
+      <stop
+         id="stop5081"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5083"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5086">
+      <stop
+         id="stop5088"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5090"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5093">
+      <stop
+         id="stop5095"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5097"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5100">
+      <stop
+         id="stop5102"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5104"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5107">
+      <stop
+         id="stop5109"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5111"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5114">
+      <stop
+         id="stop5116"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5118"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5121">
+      <stop
+         id="stop5123"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5125"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5128">
+      <stop
+         id="stop5130"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5132"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5135">
+      <stop
+         id="stop5137"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5139"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5142">
+      <stop
+         id="stop5144"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5146"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5149">
+      <stop
+         id="stop5151"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5153"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5156">
+      <stop
+         id="stop5158"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5160"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5163">
+      <stop
+         id="stop5165"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5167"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8">
+      <stop
+         id="stop3755-5-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3757-4-0"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5579">
+      <stop
+         id="stop5581"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5583"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5586">
+      <stop
+         id="stop5588"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5590"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5593">
+      <stop
+         id="stop5595"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5597"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5600">
+      <stop
+         id="stop5602"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5604"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5607">
+      <stop
+         id="stop5609"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5611"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5614">
+      <stop
+         id="stop5616"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5618"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5621">
+      <stop
+         id="stop5623"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5625"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5628">
+      <stop
+         id="stop5630"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5632"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5635">
+      <stop
+         id="stop5637"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5639"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5642">
+      <stop
+         id="stop5644"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5646"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5649">
+      <stop
+         id="stop5651"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5653"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5656">
+      <stop
+         id="stop5658"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5660"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5663">
+      <stop
+         id="stop5665"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5667"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5670">
+      <stop
+         id="stop5672"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5674"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5677">
+      <stop
+         id="stop5679"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5681"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5684">
+      <stop
+         id="stop5686"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5688"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5691">
+      <stop
+         id="stop5693"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5695"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7">
+      <stop
+         id="stop3755-5-5"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop3757-4-6"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5579-7">
+      <stop
+         id="stop5581-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5583-4"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5586-6">
+      <stop
+         id="stop5588-1"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5590-7"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5593-1">
+      <stop
+         id="stop5595-4"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5597-0"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5600-5">
+      <stop
+         id="stop5602-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5604-3"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5607-2">
+      <stop
+         id="stop5609-5"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5611-4"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5614-9">
+      <stop
+         id="stop5616-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5618-8"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5621-3">
+      <stop
+         id="stop5623-5"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5625-3"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5628-5">
+      <stop
+         id="stop5630-2"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5632-2"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5635-1">
+      <stop
+         id="stop5637-4"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5639-8"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5642-1">
+      <stop
+         id="stop5644-2"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5646-6"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5649-4">
+      <stop
+         id="stop5651-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5653-2"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5656-9">
+      <stop
+         id="stop5658-2"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5660-0"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5663-9">
+      <stop
+         id="stop5665-4"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5667-6"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5670-2">
+      <stop
+         id="stop5672-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5674-6"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5677-1">
+      <stop
+         id="stop5679-9"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5681-9"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5684-4">
+      <stop
+         id="stop5686-1"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5688-1"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5691-7">
+      <stop
+         id="stop5693-9"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop5695-2"
+         offset="1"
+         style="stop-color:#d6d6d6;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-515-221-873">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18776" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18778" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-996-438-838">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18782" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18784" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-812-538-441">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18788" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18790" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-266-502-508">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18794" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18796" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-124-672-81">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18800" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18802" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-920-567-651">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18806" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18808" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-897-988-214">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18812" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18814" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-277-355-173">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18818" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18820" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-674-628-444">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18824" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18826" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-415-900-979">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18830" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18832" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-982-430-938">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18836" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18838" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-77-367-511">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18842" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18844" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-617-188-822">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18848" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18850" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-232-91-291">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18854" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18856" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-912-821-258">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18860" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18862" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-245-826-791">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18866" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18868" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-156-822-746">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18872" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18874" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-109-925-206">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18878" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18880" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-636-36-424">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18770" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18772" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-276-892-437">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18764" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18766" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-382-68-691">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18758" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18760" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-991-816-811">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18752" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18754" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-198-79-509">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18746" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18748" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-949-583-562">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18740" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18742" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-781-934-505">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18734" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18736" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-686-749-445">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18728" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18730" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-495-595-147">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18722" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18724" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-532-54-603">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18716" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18718" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-687-667-506">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18710" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18712" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-933-680-964">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18704" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18706" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-169-263-752">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18698" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18700" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-36-25-362">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18692" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18694" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-283-653-851">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18686" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18688" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-78-410-774">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18680" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18682" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-94-877-914">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18674" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18676" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-778-452-732">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18668" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18670" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-113-810-463">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18560" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18562" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-447-384-75">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18566" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18568" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-47-223-887">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18572" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18574" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-620-461-462">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18578" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18580" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-411-717-260">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18584" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18586" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-716-880-594">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18590" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18592" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-968-577-32">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18596" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18598" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-753-522-863">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18602" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18604" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-975-333-327">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18608" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18610" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-749-38-779">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18614" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18616" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-809-518-681">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18620" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18622" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-878-957-290">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18626" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18628" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-271-484-974">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18632" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18634" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-632-256-676">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18638" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18640" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-314-219-619">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18644" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18646" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-930-471-229">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18650" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18652" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-23-304-937">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18656" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18658" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-599-488-254">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18662" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18664" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-824-109-510">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18452" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18454" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-64-61-298">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18458" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18460" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-736-714-797">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18464" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18466" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-953-842-723">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18470" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18472" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-332-984-467">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18476" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18478" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-668-558-371">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18482" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18484" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-31-599-973">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18488" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18490" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-830-281-876">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18494" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18496" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-449-142-616">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18500" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18502" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-747-100-688">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18506" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18508" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-99-515-524">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18512" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18514" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-67-963-648">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18518" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18520" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-260-323-327">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18524" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18526" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-109-431-410">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18530" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18532" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-782-230-872">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18536" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18538" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-193-359-140">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18542" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18544" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-808-941-401">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18548" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18550" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-815-702-232">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop18554" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop18556" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-824-109-510-586">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13057" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13059" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-64-61-298-799">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13065" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-736-714-797-322">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13069" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13071" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-953-842-723-794">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13075" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13077" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-332-984-467-200">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13081" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13083" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-668-558-371-622">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13087" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13089" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-31-599-973-600">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13093" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13095" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-830-281-876-82">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13099" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13101" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-449-142-616-100">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13105" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13107" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-747-100-688-688">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13111" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13113" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-99-515-524-792">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13117" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13119" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-67-963-648-806">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13123" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13125" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-260-323-327-809">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13129" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13131" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-109-431-410-442">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13135" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13137" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-782-230-872-514">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13141" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13143" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-193-359-140-821">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13147" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13149" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-808-941-401-86">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13153" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13155" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-815-702-232-182">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13159" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13161" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-113-810-463-478">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13165" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13167" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-447-384-75-864">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13171" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13173" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-47-223-887-462">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13177" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13179" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-620-461-462-253">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13183" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13185" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-411-717-260-35">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13189" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13191" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-716-880-594-901">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13195" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13197" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-968-577-32-76">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13201" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13203" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-753-522-863-789">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13207" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13209" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-975-333-327-499">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13213" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13215" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-749-38-779-550">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13219" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13221" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-809-518-681-512">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13225" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13227" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-878-957-290-923">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13231" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13233" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-271-484-974-663">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13237" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13239" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-632-256-676-272">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13243" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13245" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-314-219-619-76">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13249" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13251" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-930-471-229-357">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13255" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-23-304-937-940">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13261" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13263" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-599-488-254-158">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13267" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13269" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-778-452-732-760">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13273" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13275" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-94-877-914-584">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13279" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13281" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-78-410-774-293">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13285" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13287" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-283-653-851-261">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13291" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13293" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-36-25-362-112">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13297" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13299" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-169-263-752-315">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13303" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13305" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-933-680-964-22">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13309" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13311" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-687-667-506-459">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13315" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13317" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-532-54-603-482">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13321" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13323" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-495-595-147-75">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13327" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13329" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-686-749-445-362">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13333" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13335" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-781-934-505-944">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13339" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13341" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-949-583-562-499">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13345" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13347" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-198-79-509-74">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13351" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13353" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-991-816-811-537">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13357" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13359" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-382-68-691-234">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13363" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13365" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-276-892-437-784">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13369" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13371" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-636-36-424-52">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13375" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13377" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-515-221-873-965">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13381" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13383" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-996-438-838-962">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13387" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13389" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-812-538-441-240">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13393" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13395" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-266-502-508-467">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13399" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13401" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-124-672-81-32">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13405" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13407" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-920-567-651-155">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13411" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13413" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-897-988-214-576">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13417" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13419" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-277-355-173-501">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13423" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13425" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-674-628-444-760">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13429" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13431" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-415-900-979-993">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13435" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13437" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-982-430-938-189">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13441" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13443" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-77-367-511-5">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13447" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13449" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-617-188-822-661">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13453" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13455" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-232-91-291-577">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13459" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13461" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-912-821-258-40">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13465" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13467" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-245-826-791-181">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13471" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13473" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-156-822-746-830">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13477" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13479" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-109-925-206-183">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop13483" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop13485" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow-300">
+      <stop
+         id="stop15902"
+         offset="0"
+         style="stop-color:#242424;stop-opacity:1;" />
+      <stop
+         id="stop15904"
+         offset="1"
+         style="stop-color:#242424;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-791">
+      <stop
+         id="stop15908"
+         offset="0"
+         style="stop-color:#242424;stop-opacity:1;" />
+      <stop
+         id="stop15910"
+         offset="1"
+         style="stop-color:#242424;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-161">
+      <stop
+         id="stop15914"
+         offset="0"
+         style="stop-color:#242424;stop-opacity:1;" />
+      <stop
+         id="stop15916"
+         offset="1"
+         style="stop-color:#242424;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-200">
+      <stop
+         id="stop15920"
+         offset="0"
+         style="stop-color:#242424;stop-opacity:1;" />
+      <stop
+         id="stop15922"
+         offset="1"
+         style="stop-color:#242424;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-369">
+      <stop
+         id="stop15926"
+         offset="0"
+         style="stop-color:#242424;stop-opacity:1;" />
+      <stop
+         id="stop15928"
+         offset="1"
+         style="stop-color:#242424;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-512">
+      <stop
+         id="stop15932"
+         offset="0"
+         style="stop-color:#242424;stop-opacity:1;" />
+      <stop
+         id="stop15934"
+         offset="1"
+         style="stop-color:#242424;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3637-757">
+      <stop
+         id="stop15938"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop15940"
+         offset="1"
+         style="stop-color:#cecece;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700-332">
+      <stop
+         id="stop15956"
+         offset="0"
+         style="stop-color:#509adf;stop-opacity:1;" />
+      <stop
+         id="stop15958"
+         offset="1"
+         style="stop-color:#add8f8;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3637-308">
+      <stop
+         id="stop15980"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop15982"
+         offset="1"
+         style="stop-color:#cecece;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3183-0-304">
+      <stop
+         id="stop15986"
+         offset="0"
+         style="stop-color:#fe1414;stop-opacity:1;" />
+      <stop
+         id="stop15988"
+         offset="1"
+         style="stop-color:#f69f92;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-824-109-510-586-87">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop15992" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop15994" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-64-61-298-799-382">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop15998" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16000" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-736-714-797-322-729">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16004" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16006" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-953-842-723-794-561">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16010" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16012" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-332-984-467-200-761">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16016" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16018" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-668-558-371-622-85">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16022" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16024" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-31-599-973-600-993">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16028" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16030" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-830-281-876-82-920">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16034" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16036" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-449-142-616-100-626">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16040" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16042" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-747-100-688-688-348">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16046" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16048" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-99-515-524-792-334">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16052" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16054" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-67-963-648-806-990">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16058" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16060" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-260-323-327-809-821">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16064" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16066" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-109-431-410-442-461">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16072" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-782-230-872-514-161">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16076" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16078" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-193-359-140-821-668">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16082" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16084" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-808-941-401-86-403">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16088" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16090" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-815-702-232-182-766">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16094" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16096" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-113-810-463-478-497">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16100" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16102" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-447-384-75-864-417">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16106" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16108" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-47-223-887-462-197">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16112" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16114" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-620-461-462-253-136">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16118" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16120" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-411-717-260-35-124">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16124" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16126" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-716-880-594-901-562">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16130" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16132" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-968-577-32-76-913">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16136" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16138" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-753-522-863-789-706">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16142" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16144" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-975-333-327-499-219">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16148" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16150" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-749-38-779-550-947">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16154" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16156" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-809-518-681-512-946">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16160" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16162" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-878-957-290-923-616">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16166" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16168" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-271-484-974-663-274">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16172" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16174" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-632-256-676-272-391">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16178" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16180" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-314-219-619-76-379">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16184" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16186" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-930-471-229-357-405">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16190" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16192" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-23-304-937-940-537">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16196" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16198" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-599-488-254-158-195">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16202" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16204" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-778-452-732-760-313">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16208" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16210" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-94-877-914-584-121">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16214" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16216" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-78-410-774-293-595">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16220" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16222" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-283-653-851-261-428">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16226" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16228" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-36-25-362-112-217">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16232" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16234" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-169-263-752-315-498">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16238" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16240" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-933-680-964-22-63">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16244" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16246" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-687-667-506-459-98">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16250" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16252" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-532-54-603-482-954">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16256" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16258" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-495-595-147-75-563">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16262" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16264" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-686-749-445-362-146">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16268" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16270" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-781-934-505-944-666">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16274" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16276" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-949-583-562-499-927">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16280" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16282" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-198-79-509-74-641">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16286" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16288" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-991-816-811-537-355">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16292" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16294" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-382-68-691-234-997">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16298" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16300" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-276-892-437-784-169">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16304" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16306" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-8-636-36-424-52-653">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16310" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16312" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-515-221-873-965-320">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16316" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16318" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-996-438-838-962-183">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16322" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16324" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-812-538-441-240-596">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16328" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16330" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-266-502-508-467-988">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16334" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16336" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-124-672-81-32-906">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16340" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16342" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-920-567-651-155-972">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16346" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16348" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-897-988-214-576-849">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16352" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16354" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-277-355-173-501-242">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16358" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16360" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-674-628-444-760-815">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16364" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16366" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-415-900-979-993-278">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16370" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16372" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-982-430-938-189-380">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16376" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16378" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-77-367-511-5-25">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16382" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16384" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-617-188-822-661-275">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16388" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16390" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-232-91-291-577-280">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16394" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16396" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-912-821-258-40-191">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16400" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16402" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-245-826-791-181-459">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16406" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16408" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-156-822-746-830-814">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16412" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16414" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3753-4-7-109-925-206-183-975">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop16418" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop16420" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow-300-636">
+      <stop
+         id="stop19529"
+         offset="0"
+         style="stop-color:#303030;stop-opacity:1;" />
+      <stop
+         id="stop19531"
+         offset="1"
+         style="stop-color:#303030;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0-791-207"
+       id="linearGradient3199-771-26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-791-207">
+      <stop
+         id="stop19535"
+         offset="0"
+         style="stop-color:#303030;stop-opacity:1;" />
+      <stop
+         id="stop19537"
+         offset="1"
+         style="stop-color:#303030;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780-474-387"
+       xlink:href="#ButtonShadow-0-161-268"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-161-268">
+      <stop
+         id="stop19541"
+         offset="0"
+         style="stop-color:#303030;stop-opacity:1;" />
+      <stop
+         id="stop19543"
+         offset="1"
+         style="stop-color:#303030;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772-645-688"
+       xlink:href="#ButtonShadow-0-200-362"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-200-362">
+      <stop
+         id="stop19547"
+         offset="0"
+         style="stop-color:#303030;stop-opacity:1;" />
+      <stop
+         id="stop19549"
+         offset="1"
+         style="stop-color:#303030;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725-386-741"
+       xlink:href="#ButtonShadow-0-369-910"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-369-910">
+      <stop
+         id="stop19553"
+         offset="0"
+         style="stop-color:#303030;stop-opacity:1;" />
+      <stop
+         id="stop19555"
+         offset="1"
+         style="stop-color:#303030;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721-907-182"
+       xlink:href="#ButtonShadow-0-512-126"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0-512-126">
+      <stop
+         id="stop19559"
+         offset="0"
+         style="stop-color:#303030;stop-opacity:1;" />
+      <stop
+         id="stop19561"
+         offset="1"
+         style="stop-color:#303030;stop-opacity:0.58823532;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643-19-290"
+       xlink:href="#linearGradient3637-757-710"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3637-757-710">
+      <stop
+         id="stop19565"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop19567"
+         offset="1"
+         style="stop-color:#dadada;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-869-722"
+       xlink:href="#linearGradient3737-546-21"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-546-21"
+       inkscape:collect="always">
+      <stop
+         id="stop19571"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop19573"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-920-947"
+       xlink:href="#linearGradient3737-116-639"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-116-639"
+       inkscape:collect="always">
+      <stop
+         id="stop19577"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop19579"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843-44-302"
+       xlink:href="#linearGradient3700-332-50"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3700-332-50">
+      <stop
+         id="stop19583"
+         offset="0"
+         style="stop-color:#65a6e2;stop-opacity:1;" />
+      <stop
+         id="stop19585"
+         offset="1"
+         style="stop-color:#c4e3fa;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8-433-886"
+       xlink:href="#linearGradient3737-3-984-351"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3-984-351"
+       inkscape:collect="always">
+      <stop
+         id="stop19589"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop19591"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3-511-271"
+       xlink:href="#linearGradient3737-3-730-409"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-3-730-409"
+       inkscape:collect="always">
+      <stop
+         id="stop19595"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop19597"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613-9-118"
+       xlink:href="#linearGradient3737-77-46"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3737-77-46"
+       inkscape:collect="always">
+      <stop
+         id="stop19601"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop19603"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905-242-171"
+       xlink:href="#linearGradient3637-308-471"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3637-308-471">
+      <stop
+         id="stop19607"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop19609"
+         offset="1"
+         style="stop-color:#dadada;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913-624-322"
+       xlink:href="#linearGradient3183-0-304-249"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0-304-249">
+      <stop
+         id="stop19613"
+         offset="0"
+         style="stop-color:#fe2d2d;stop-opacity:1;" />
+      <stop
+         id="stop19615"
+         offset="1"
+         style="stop-color:#f7b3a9;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-824-109-510-586-87-976"
+       id="linearGradient3750-521-298-434-843-755-369"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-824-109-510-586-87-976">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19619" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19621" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-64-61-298-799-382-633"
+       id="linearGradient3752-38-427-856-243-179-272"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-64-61-298-799-382-633">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19625" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19627" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-736-714-797-322-729-513"
+       id="linearGradient3754-137-444-280-509-710-438"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-736-714-797-322-729-513">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19631" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19633" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-953-842-723-794-561-760"
+       id="linearGradient3756-371-173-672-797-532-494"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-953-842-723-794-561-760">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19637" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19639" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-332-984-467-200-761-381"
+       id="linearGradient3758-290-47-836-612-78-549"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-332-984-467-200-761-381">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19643" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19645" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-668-558-371-622-85-462"
+       id="linearGradient3760-401-383-230-668-204-54"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-668-558-371-622-85-462">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19649" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19651" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-31-599-973-600-993-483"
+       id="linearGradient3762-60-537-219-819-410-440"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-31-599-973-600-993-483">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19655" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19657" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-830-281-876-82-920-557"
+       id="linearGradient3764-477-32-15-121-796-438"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-830-281-876-82-920-557">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19661" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19663" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-449-142-616-100-626-811"
+       id="linearGradient3766-230-875-993-247-847-843"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-449-142-616-100-626-811">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19667" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19669" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-747-100-688-688-348-984"
+       id="linearGradient3768-511-816-562-151-245-978"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-747-100-688-688-348-984">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19673" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19675" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-99-515-524-792-334-922"
+       id="linearGradient3770-896-385-798-727-796-27"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-99-515-524-792-334-922">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19679" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19681" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-67-963-648-806-990-510"
+       id="linearGradient3772-3-390-951-110-673-425-634"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-67-963-648-806-990-510">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19685" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19687" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-260-323-327-809-821-979"
+       id="linearGradient3774-906-878-27-750-79-771"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-260-323-327-809-821-979">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19691" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19693" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-109-431-410-442-461-399"
+       id="linearGradient3776-434-754-461-440-796-336"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-109-431-410-442-461-399">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19697" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19699" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-782-230-872-514-161-595"
+       id="linearGradient3778-947-106-266-820-702-475"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-782-230-872-514-161-595">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19703" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19705" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-193-359-140-821-668-870"
+       id="linearGradient3780-8-695-136-154-125-831-579"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-193-359-140-821-668-870">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19709" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19711" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-808-941-401-86-403-761"
+       id="linearGradient3782-112-379-976-492-380-3"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-808-941-401-86-403-761">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19715" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19717" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-815-702-232-182-766-106"
+       id="linearGradient3784-476-598-481-815-24-217"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-815-702-232-182-766-106">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19721" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19723" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-113-810-463-478-497-28"
+       id="linearGradient3750-4-833-666-676-694-703-921"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-113-810-463-478-497-28">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19727" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19729" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-447-384-75-864-417-664"
+       id="linearGradient3752-4-536-344-370-74-923-568"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-447-384-75-864-417-664">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19733" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19735" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-47-223-887-462-197-557"
+       id="linearGradient3754-4-841-467-913-124-402-439"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-47-223-887-462-197-557">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19741" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-620-461-462-253-136-84"
+       id="linearGradient3756-6-569-946-855-351-503-385"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-620-461-462-253-136-84">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19745" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19747" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-411-717-260-35-124-910"
+       id="linearGradient3758-0-653-254-740-917-84-208"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-411-717-260-35-124-910">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19751" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19753" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-716-880-594-901-562-740"
+       id="linearGradient3760-7-275-24-378-323-379-453"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-716-880-594-901-562-740">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19757" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19759" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-968-577-32-76-913-10"
+       id="linearGradient3762-9-457-509-115-416-529-539"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-968-577-32-76-913-10">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19763" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19765" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-753-522-863-789-706-69"
+       id="linearGradient3764-1-877-814-523-662-731-714"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-753-522-863-789-706-69">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19769" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19771" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-975-333-327-499-219-758"
+       id="linearGradient3766-5-633-592-472-466-129-534"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-975-333-327-499-219-758">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19775" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19777" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-749-38-779-550-947-130"
+       id="linearGradient3768-8-371-892-601-770-9-724"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-749-38-779-550-947-130">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19781" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19783" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-809-518-681-512-946-24"
+       id="linearGradient3770-3-782-501-320-595-112-529"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-809-518-681-512-946-24">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19787" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19789" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-878-957-290-923-616-438"
+       id="linearGradient3772-3-9-654-243-397-757-163-895"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-878-957-290-923-616-438">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19793" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19795" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-271-484-974-663-274-795"
+       id="linearGradient3774-6-397-740-457-483-33-944"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-271-484-974-663-274-795">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19799" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19801" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-632-256-676-272-391-636"
+       id="linearGradient3776-6-493-264-701-690-123-312"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-632-256-676-272-391-636">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19805" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19807" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-314-219-619-76-379-263"
+       id="linearGradient3778-6-512-494-174-161-42-508"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-314-219-619-76-379-263">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19811" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19813" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-930-471-229-357-405-980"
+       id="linearGradient3780-8-9-534-250-842-132-553-432"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-930-471-229-357-405-980">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19817" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19819" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-23-304-937-940-537-882"
+       id="linearGradient3782-6-972-359-809-114-471-871"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-23-304-937-940-537-882">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19823" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19825" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-599-488-254-158-195-544"
+       id="linearGradient3784-9-584-597-93-718-675-602"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-599-488-254-158-195-544">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19829" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19831" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-778-452-732-760-313-633"
+       id="linearGradient3750-4-2-761-250-763-942-610-952"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-778-452-732-760-313-633">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19835" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19837" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-94-877-914-584-121-339"
+       id="linearGradient3752-4-6-470-734-635-93-938-516"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-94-877-914-584-121-339">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19841" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19843" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-78-410-774-293-595-536"
+       id="linearGradient3754-4-9-893-334-52-224-884-895"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-78-410-774-293-595-536">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19847" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19849" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-283-653-851-261-428-100"
+       id="linearGradient3756-6-7-313-188-728-500-353-847"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-283-653-851-261-428-100">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19853" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19855" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-36-25-362-112-217-565"
+       id="linearGradient3758-0-1-318-576-397-700-348-620"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-36-25-362-112-217-565">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19859" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19861" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-169-263-752-315-498-996"
+       id="linearGradient3760-7-9-230-479-624-175-316-168"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-169-263-752-315-498-996">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19865" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19867" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-933-680-964-22-63-111"
+       id="linearGradient3762-9-4-330-987-902-550-58-625"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-933-680-964-22-63-111">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19871" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19873" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-687-667-506-459-98-381"
+       id="linearGradient3764-1-4-154-120-715-981-596-741"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-687-667-506-459-98-381">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19877" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19879" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-532-54-603-482-954-205"
+       id="linearGradient3766-5-7-701-111-177-556-942-28"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-532-54-603-482-954-205">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19883" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19885" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-495-595-147-75-563-516"
+       id="linearGradient3768-8-0-92-581-721-391-457-128"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-495-595-147-75-563-516">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19889" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19891" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-686-749-445-362-146-269"
+       id="linearGradient3770-3-0-718-46-188-815-256-300"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-686-749-445-362-146-269">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19895" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19897" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-781-934-505-944-666-573"
+       id="linearGradient3772-3-9-1-563-498-691-824-27-636"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-781-934-505-944-666-573">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19901" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19903" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-949-583-562-499-927-852"
+       id="linearGradient3774-6-1-103-775-452-391-3-502"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-949-583-562-499-927-852">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19907" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19909" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-198-79-509-74-641-630"
+       id="linearGradient3776-6-5-313-669-575-502-988-184"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-198-79-509-74-641-630">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19913" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19915" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-991-816-811-537-355-465"
+       id="linearGradient3778-6-0-777-655-174-165-925-947"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-991-816-811-537-355-465">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19919" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19921" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-382-68-691-234-997-736"
+       id="linearGradient3780-8-9-6-207-63-309-358-323-323"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-382-68-691-234-997-736">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19925" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19927" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-276-892-437-784-169-381"
+       id="linearGradient3782-6-1-319-304-790-720-727-264"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-276-892-437-784-169-381">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19931" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19933" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-8-636-36-424-52-653-41"
+       id="linearGradient3784-9-1-378-478-855-577-346-724"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-8-636-36-424-52-653-41">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19937" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19939" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-515-221-873-965-320-104"
+       id="linearGradient3750-4-5-849-589-645-380-989-442"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-515-221-873-965-320-104">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19943" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19945" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-996-438-838-962-183-745"
+       id="linearGradient3752-4-8-865-39-998-929-426-852"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-996-438-838-962-183-745">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19949" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19951" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-812-538-441-240-596-389"
+       id="linearGradient3754-4-92-693-616-221-503-670-733"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-812-538-441-240-596-389">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19955" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19957" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-266-502-508-467-988-696"
+       id="linearGradient3756-6-2-675-787-609-935-349-351"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-266-502-508-467-988-696">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19961" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19963" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-124-672-81-32-906-475"
+       id="linearGradient3758-0-7-290-295-303-806-714-641"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-124-672-81-32-906-475">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19967" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19969" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-920-567-651-155-972-519"
+       id="linearGradient3760-7-93-194-399-87-803-417-851"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-920-567-651-155-972-519">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19973" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19975" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-897-988-214-576-849-711"
+       id="linearGradient3762-9-3-351-164-870-227-778-703"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-897-988-214-576-849-711">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19979" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19981" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-277-355-173-501-242-383"
+       id="linearGradient3764-1-8-935-985-670-561-330-371"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-277-355-173-501-242-383">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19985" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19987" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-674-628-444-760-815-162"
+       id="linearGradient3766-5-9-365-489-130-741-479-70"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-674-628-444-760-815-162">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19991" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19993" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-415-900-979-993-278-189"
+       id="linearGradient3768-8-2-726-788-821-542-378-724"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-415-900-979-993-278-189">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop19997" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop19999" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-982-430-938-189-380-415"
+       id="linearGradient3770-3-5-203-431-151-903-147-876"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-982-430-938-189-380-415">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop20003" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop20005" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-77-367-511-5-25-843"
+       id="linearGradient3772-3-9-5-394-317-439-301-686-162"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-77-367-511-5-25-843">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop20009" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop20011" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-617-188-822-661-275-55"
+       id="linearGradient3774-6-4-557-623-911-945-864-749"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-617-188-822-661-275-55">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop20015" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop20017" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-232-91-291-577-280-562"
+       id="linearGradient3776-6-1-137-725-52-492-31-280"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-232-91-291-577-280-562">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop20021" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop20023" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-912-821-258-40-191-812"
+       id="linearGradient3778-6-8-260-398-646-757-679-752"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-912-821-258-40-191-812">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop20027" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop20029" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-245-826-791-181-459-325"
+       id="linearGradient3780-8-9-8-299-608-766-29-850-181"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-245-826-791-181-459-325">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop20033" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop20035" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-156-822-746-830-814-94"
+       id="linearGradient3782-6-9-728-817-595-688-255-395"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-156-822-746-830-814-94">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop20039" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop20041" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3753-4-7-109-925-206-183-975-198"
+       id="linearGradient3784-9-5-501-261-748-997-809-64"
+       gradientUnits="userSpaceOnUse"
+       x1="316.61093"
+       y1="163.13255"
+       x2="319.65189"
+       y2="167.29497" />
+    <linearGradient
+       id="linearGradient3753-4-7-109-925-206-183-975-198">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop20045" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop20047" />
+    </linearGradient>
+  </defs>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow-300-636);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199-771-26);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780-474-387);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772-645-688);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725-386-741);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721-907-182);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#181818;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#181818;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643-19-290);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188-869-722);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619-920-947);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <rect
+       style="fill:url(#linearGradient2843-44-302);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <rect
+       style="fill:#ff3232;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#181818;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#181818;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#181818;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#181818;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8-433-886);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3-511-271);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </g>
+  <g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613-9-118);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </g>
+  <g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905-242-171);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#181818;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       style="color:#000000;fill:url(#linearGradient3913-624-322);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#181818;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#181818;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       id="g12172">
+      <g
+         style="display:inline"
+         id="g4320"
+         transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-75.217102,-9.685866)">
+        <path
+           style="fill:#484848;fill-opacity:1;stroke:#484848;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+           id="path4322"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#ceced0;fill-opacity:1;stroke:none"
+           d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+           id="path4324"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4326"
+           d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4328"
+           d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           id="path4330"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4332"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4334"
+           d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4336"
+           style="fill:url(#linearGradient3750-521-298-434-843-755-369);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3752-38-427-856-243-179-272);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4338"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4340"
+           style="fill:url(#linearGradient3754-137-444-280-509-710-438);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           style="fill:#ceced0;fill-opacity:1;stroke:none"
+           d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+           id="path4342"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4344"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4346"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4348"
+           d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4350"
+           d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4352"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3756-371-173-672-797-532-494);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4354"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4356"
+           style="fill:url(#linearGradient3758-290-47-836-612-78-549);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3760-401-383-230-668-204-54);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4358"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)" />
+        <path
+           style="fill:#829193;fill-opacity:1;stroke:none"
+           d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+           id="path4360"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4362"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4364"
+           d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4366"
+           d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4368"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4370"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4372"
+           d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4374"
+           style="fill:url(#linearGradient3762-60-537-219-819-410-440);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3764-477-32-15-121-796-438);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4376"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4378"
+           style="fill:url(#linearGradient3766-230-875-993-247-847-843);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           id="path4380"
+           d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4382"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4384"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4386"
+           d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4388"
+           d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           id="path4390"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3768-511-816-562-151-245-978);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4392"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4394"
+           style="fill:url(#linearGradient3770-896-385-798-727-796-27);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3772-3-390-951-110-673-425-634);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4396"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4398"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4400"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4402"
+           d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4404"
+           d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4406"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3774-906-878-27-750-79-771);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4408"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4410"
+           style="fill:url(#linearGradient3776-434-754-461-440-796-336);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3778-947-106-266-820-702-475);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4412"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4414"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4416"
+           d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4418"
+           d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4420"
+           d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4422"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4424"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4426"
+           d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4428"
+           style="fill:url(#linearGradient3780-8-695-136-154-125-831-579);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3782-112-379-976-492-380-3);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4430"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4432"
+           style="fill:url(#linearGradient3784-476-598-481-815-24-217);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4434"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4436"
+           d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+           id="path4438"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4440"
+           d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+           style="fill:none;stroke:#484848;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#f3f3f3;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+           id="path4442"
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#b4b4b4;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+           id="path4444"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#bdbdbd;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 383.57424,175.39368 30.68594,-17.71654"
+           id="path4446"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#6e6e6e;fill-opacity:1;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+           id="path4448"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4450"
+           d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+           style="fill:#6e6e6e;fill-opacity:1;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g4452">
+          <path
+             id="path4454"
+             d="m 389.76795,175.41904 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 392.78003,173.62203 -0.0565,28.3211"
+             id="path4456"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4458"
+             d="m 395.84862,171.85037 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 398.91721,170.07872 -0.0565,28.3211"
+             id="path4460"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4462"
+             d="m 401.98581,168.30706 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 405.0544,166.53541 -0.0565,28.3211"
+             id="path4464"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4466"
+             d="m 408.123,164.76376 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g4468"
+           transform="translate(0.05649565,35.458423)">
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 389.76795,175.41904 -0.0565,28.3211"
+             id="path4470"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4472"
+             d="m 392.78003,173.62203 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 395.84862,171.85037 -0.0565,28.3211"
+             id="path4474"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4476"
+             d="m 398.91721,170.07872 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 401.98581,168.30706 -0.0565,28.3211"
+             id="path4478"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4480"
+             d="m 405.0544,166.53541 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 408.123,164.76376 -0.0565,28.3211"
+             id="path4482"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+      <g
+         id="g4320-3"
+         transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-109.30866,-9.685865)"
+         style="display:inline">
+        <path
+           style="fill:#484848;fill-opacity:1;stroke:#484848;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+           id="path4322-1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#ceced0;fill-opacity:1;stroke:none"
+           d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+           id="path4324-5"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4326-7"
+           d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4328-4"
+           d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           id="path4330-4"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4332-8"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4334-6"
+           d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4336-6"
+           style="fill:url(#linearGradient3750-4-833-666-676-694-703-921);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3752-4-536-344-370-74-923-568);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4338-5"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4340-1"
+           style="fill:url(#linearGradient3754-4-841-467-913-124-402-439);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           style="fill:#ceced0;fill-opacity:1;stroke:none"
+           d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+           id="path4342-0"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4344-0"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4346-5"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4348-6"
+           d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4350-7"
+           d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4352-3"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3756-6-569-946-855-351-503-385);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4354-6"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4356-4"
+           style="fill:url(#linearGradient3758-0-653-254-740-917-84-208);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3760-7-275-24-378-323-379-453);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4358-2"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)" />
+        <path
+           style="fill:#829193;fill-opacity:1;stroke:none"
+           d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+           id="path4360-0"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4362-1"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4364-3"
+           d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4366-3"
+           d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4368-0"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4370-9"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4372-1"
+           d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4374-7"
+           style="fill:url(#linearGradient3762-9-457-509-115-416-529-539);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3764-1-877-814-523-662-731-714);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4376-0"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4378-9"
+           style="fill:url(#linearGradient3766-5-633-592-472-466-129-534);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           id="path4380-6"
+           d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4382-5"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4384-0"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4386-3"
+           d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4388-2"
+           d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           id="path4390-4"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3768-8-371-892-601-770-9-724);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4392-9"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4394-2"
+           style="fill:url(#linearGradient3770-3-782-501-320-595-112-529);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3772-3-9-654-243-397-757-163-895);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4396-1"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4398-6"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4400-0"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4402-2"
+           d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4404-8"
+           d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4406-0"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3774-6-397-740-457-483-33-944);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4408-9"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4410-5"
+           style="fill:url(#linearGradient3776-6-493-264-701-690-123-312);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3778-6-512-494-174-161-42-508);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4412-9"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4414-5"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4416-3"
+           d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4418-6"
+           d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4420-9"
+           d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4422-5"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4424-7"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4426-2"
+           d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4428-0"
+           style="fill:url(#linearGradient3780-8-9-534-250-842-132-553-432);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3782-6-972-359-809-114-471-871);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4430-8"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4432-3"
+           style="fill:url(#linearGradient3784-9-584-597-93-718-675-602);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4434-1"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4436-7"
+           d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+           id="path4438-5"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4440-3"
+           d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+           style="fill:none;stroke:#484848;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#f3f3f3;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+           id="path4442-5"
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#b4b4b4;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+           id="path4444-0"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#bdbdbd;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 383.57424,175.39368 30.68594,-17.71654"
+           id="path4446-3"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#6e6e6e;fill-opacity:1;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+           id="path4448-8"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4450-2"
+           d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+           style="fill:#6e6e6e;fill-opacity:1;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g4452-0">
+          <path
+             id="path4454-9"
+             d="m 389.76795,175.41904 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 392.78003,173.62203 -0.0565,28.3211"
+             id="path4456-7"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4458-1"
+             d="m 395.84862,171.85037 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 398.91721,170.07872 -0.0565,28.3211"
+             id="path4460-5"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4462-7"
+             d="m 401.98581,168.30706 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 405.0544,166.53541 -0.0565,28.3211"
+             id="path4464-5"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4466-6"
+             d="m 408.123,164.76376 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g4468-9"
+           transform="translate(0.05649565,35.458423)">
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 389.76795,175.41904 -0.0565,28.3211"
+             id="path4470-6"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4472-3"
+             d="m 392.78003,173.62203 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 395.84862,171.85037 -0.0565,28.3211"
+             id="path4474-9"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4476-1"
+             d="m 398.91721,170.07872 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 401.98581,168.30706 -0.0565,28.3211"
+             id="path4478-8"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4480-5"
+             d="m 405.0544,166.53541 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 408.123,164.76376 -0.0565,28.3211"
+             id="path4482-1"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path4322-1-3"
+         d="M 31.523905,16.002967 20.182067,22.446509 20.000004,48.524631 31.250771,55.125902 42.592608,48.68236 42.774671,22.604238 31.523905,16.002967 z"
+         style="fill:#484848;fill-opacity:1;stroke:#484848;stroke-width:0.73623312;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4324-5-7"
+         d="M 20.18699,22.442729 20.004869,48.529094 31.255067,55.129547 31.437187,29.043183 20.18699,22.442729 z"
+         style="fill:#ceced0;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#c8c8ca;fill-opacity:1;stroke:none;display:inline"
+         d="m 21.208143,44.019652 8.95833,5.232578 -0.02732,3.912954 -9.000158,-5.280358 0.06915,-3.865174 z"
+         id="path4326-7-2" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 22.264015,48.54487 0.02732,-3.912955 -1.125019,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+         id="path4328-4-9" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330-4-1"
+         d="m 30.139155,53.165184 0.02732,-3.91295 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.66004 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4332-8-1"
+         d="m 26.764096,51.185049 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.660044 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 25.639074,50.525005 0.02732,-3.912951 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.66004 z"
+         id="path4334-6-6" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3750-4-2-761-250-763-942-610-952);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4336-6-7"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,2.9119167,21.494795)" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-1.0806493,19.11954)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4338-5-0"
+         style="fill:url(#linearGradient3752-4-6-470-734-635-93-938-516);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3754-4-9-893-334-52-224-884-895);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4340-1-0"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.8354077,23.776606)" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4342-0-5"
+         d="M 31.528247,16 20.18699,22.442729 31.437187,29.043183 42.778445,22.60045 31.528247,16 z"
+         style="fill:#ceced0;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4344-0-2"
+         d="m 21.344733,24.454876 8.95833,5.232579 -0.02732,3.912954 -9.000158,-5.280358 0.06915,-3.865175 z"
+         style="fill:#c8c8ca;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4346-5-0"
+         d="m 22.400606,28.980094 0.02732,-3.912954 -1.125018,-0.660047 -0.02732,3.912958 1.125019,0.660043 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 30.275745,33.600409 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.660044 z"
+         id="path4348-6-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 26.900686,31.620274 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+         id="path4350-7-1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4352-3-9"
+         d="m 25.775664,30.96023 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,3.0485067,1.93002)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4354-6-5"
+         style="fill:url(#linearGradient3756-6-7-313-188-728-500-353-847);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3758-0-1-318-576-397-700-348-620);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4356-4-3"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-0.94405932,-0.445239)" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.9719977,4.21183)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4358-2-6"
+         style="fill:url(#linearGradient3760-7-9-230-479-624-175-316-168);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path4360-0-1"
+         d="m 31.437187,29.043183 11.341258,-6.442733 -0.18212,26.086365 -11.341258,6.442732 0.18212,-26.086364 z"
+         style="fill:#829193;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4362-1-0"
+         d="m 21.302906,24.407093 9.000157,5.280362 -0.02732,3.912954 -9.000158,-5.280358 0.02732,-3.912958 z"
+         style="fill:none;stroke:#484848;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#c8c8ca;fill-opacity:1;stroke:none;display:inline"
+         d="m 21.317415,28.367834 8.95833,5.232579 -0.02732,3.912954 -9.000158,-5.280358 0.06915,-3.865175 z"
+         id="path4364-3-6" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 22.373288,32.893052 0.02732,-3.912954 -1.125019,-0.660047 -0.02732,3.912958 1.125019,0.660043 z"
+         id="path4366-3-2" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4368-0-3"
+         d="m 30.248427,37.513367 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125019,0.660044 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4370-9-0"
+         d="m 26.873368,35.533232 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 25.748346,34.873188 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+         id="path4372-1-7" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3762-9-4-330-987-902-550-58-625);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4374-7-3"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,3.0211887,5.842978)" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-0.97137732,3.467718)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4376-0-6"
+         style="fill:url(#linearGradient3764-1-4-154-120-715-981-596-741);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3766-5-7-701-111-177-556-942-28);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4378-9-0"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.9446797,8.124788)" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#484848;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+         d="m 21.275587,28.320047 9.000158,5.280362 -0.02732,3.912954 -9.000158,-5.280358 0.02732,-3.912958 z"
+         id="path4380-6-4" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4382-5-8"
+         d="m 21.290097,32.280785 8.95833,5.232578 -0.02732,3.912955 -9.000158,-5.280359 0.06915,-3.865174 z"
+         style="fill:#c8c8ca;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4384-0-6"
+         d="m 22.34597,36.806003 0.02732,-3.912954 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.660044 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 30.221109,41.426318 0.02732,-3.912951 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.660041 z"
+         id="path4386-3-4" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 26.84605,39.446182 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.660044 z"
+         id="path4388-2-2" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4390-4-5"
+         d="m 25.721028,38.786138 0.02732,-3.91295 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.66004 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,2.9938707,9.755929)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4392-9-5"
+         style="fill:url(#linearGradient3768-8-0-92-581-721-391-457-128);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3770-3-0-718-46-188-815-256-300);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4394-2-5"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-0.99869532,7.380672)" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.9173617,12.03774)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4396-1-3"
+         style="fill:url(#linearGradient3772-3-9-1-563-498-691-824-27-636);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4398-6-4"
+         d="m 21.235461,40.106697 8.95833,5.232579 -0.02732,3.912954 -9.000158,-5.280358 0.06915,-3.865175 z"
+         style="fill:#c8c8ca;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400-0-5"
+         d="m 22.291334,44.631915 0.02732,-3.912954 -1.125019,-0.660047 -0.02732,3.912958 1.125019,0.660043 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 30.166473,49.25223 0.02732,-3.912954 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.660044 z"
+         id="path4402-2-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 26.791414,47.272095 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+         id="path4404-8-1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4406-0-9"
+         d="m 25.666392,46.612051 0.02732,-3.912955 -1.125018,-0.660047 -0.02732,3.912958 1.125018,0.660044 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,2.9392347,17.581841)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4408-9-6"
+         style="fill:url(#linearGradient3774-6-1-103-775-452-391-3-502);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3776-6-5-313-669-575-502-988-184);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4410-5-4"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-1.0533313,15.206582)" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.8627257,19.863652)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4412-9-0"
+         style="fill:url(#linearGradient3778-6-0-777-655-174-165-925-947);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4414-5-7"
+         d="m 21.248269,32.233001 9.000158,5.280362 -0.02732,3.912955 -9.000158,-5.280359 0.02732,-3.912958 z"
+         style="fill:none;stroke:#484848;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#484848;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+         d="m 21.220951,36.145959 9.000158,5.280362 -0.02732,3.912955 -9.000158,-5.280359 0.02732,-3.912958 z"
+         id="path4416-3-9" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#c8c8ca;fill-opacity:1;stroke:none;display:inline"
+         d="m 21.262779,36.193743 8.95833,5.232578 -0.02732,3.912955 -9.000158,-5.280359 0.06915,-3.865174 z"
+         id="path4418-6-3" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 22.318652,40.718961 0.02732,-3.912954 -1.125019,-0.660048 -0.02732,3.912958 1.125019,0.660044 z"
+         id="path4420-9-3" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4422-5-3"
+         d="m 30.193791,45.339276 0.02732,-3.912955 -1.125019,-0.660047 -0.02732,3.912958 1.125019,0.660044 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4424-7-5"
+         d="m 26.818732,43.35914 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912958 1.125018,0.660044 z"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#b4b4b4;fill-opacity:1;stroke:none;display:inline"
+         d="m 25.69371,42.699096 0.02732,-3.912954 -1.125018,-0.660048 -0.02732,3.912959 1.125018,0.660043 z"
+         id="path4426-2-2" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3780-8-9-6-207-63-309-358-323-323);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4428-0-5"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,2.9665527,13.668887)" />
+      <path
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,-1.0260133,11.293627)"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         sodipodi:ry="5.9796319"
+         sodipodi:rx="5.9796319"
+         sodipodi:cy="163.34666"
+         sodipodi:cx="316.22275"
+         id="path4430-8-8"
+         style="fill:url(#linearGradient3782-6-1-319-304-790-720-727-264);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:url(#linearGradient3784-9-1-378-478-855-577-346-724);fill-opacity:1;stroke:#949494;stroke-opacity:1;display:inline"
+         id="path4432-3-2"
+         sodipodi:cx="316.22275"
+         sodipodi:cy="163.34666"
+         sodipodi:rx="5.9796319"
+         sodipodi:ry="5.9796319"
+         d="m 322.20238,163.34666 a 5.9796319,5.9796319 0 1 1 -11.95926,0 5.9796319,5.9796319 0 1 1 11.95926,0 z"
+         transform="matrix(0.07231111,0.04242468,-5.8528982e-4,0.08383515,6.8900437,15.950698)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4434-1-4"
+         d="m 21.193633,40.058914 9.000158,5.280362 -0.02732,3.912954 -9.000158,-5.280358 0.02732,-3.912958 z"
+         style="fill:none;stroke:#484848;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#484848;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+         d="m 21.166315,43.971868 9.000158,5.280362 -0.02732,3.912954 -9.000158,-5.280358 0.02732,-3.912958 z"
+         id="path4436-7-4" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4438-5-0"
+         d="m 21.302906,24.407093 -0.08196,11.738866 9.000158,5.280362 0.08195,-11.738866 -9.000157,-5.280362 z"
+         style="fill:none;stroke:#484848;stroke-width:0.66260982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#484848;stroke-width:0.66260982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         d="m 21.220951,36.145956 -0.08195,11.738866 9.000158,5.280362 0.08195,-11.738866 -9.000158,-5.280362 z"
+         id="path4440-3-6" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path4442-5-0"
+         d="m 20.18699,22.442729 11.250197,6.600454 -0.18212,26.086364 0,0"
+         style="fill:none;stroke:#f3f3f3;stroke-width:0.14724663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4444-0-0"
+         d="m 20.18699,22.442729 -0.182121,26.086365 11.250198,6.600453 0,0"
+         style="fill:none;stroke:#b4b4b4;stroke-width:0.14724663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4446-3-2"
+         d="M 31.437187,29.043183 42.778445,22.60045"
+         style="fill:none;stroke:#bdbdbd;stroke-width:0.14724663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4448-8-4"
+         d="m 41.635215,24.549041 -9.073006,5.154186 -0.07285,10.434547 9.073006,-5.154185 0.07285,-10.434548 0,0 z"
+         style="fill:#6e6e6e;fill-opacity:1;stroke:#484848;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#6e6e6e;fill-opacity:1;stroke:#484848;stroke-width:0.36811656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+         d="m 41.544155,37.592224 -9.073006,5.154185 -0.07285,10.434547 9.073005,-5.154185 0.07285,-10.434547 0,0 z"
+         id="path4450-2-4" />
+      <g
+         style="display:inline"
+         transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-109.30866,-36.506319)"
+         id="g4452-0-9">
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           id="path4454-9-9" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4456-7-9"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           id="path4458-1-2" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4460-5-3"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           id="path4462-7-6" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4464-5-8"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           id="path4466-6-6" />
+      </g>
+      <g
+         style="display:inline"
+         transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-109.37899,-23.453659)"
+         id="g4468-9-5">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4470-6-6"
+           d="m 389.76795,175.41904 -0.0565,28.3211"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 392.78003,173.62203 -0.0565,28.3211"
+           id="path4472-3-1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4474-9-8"
+           d="m 395.84862,171.85037 -0.0565,28.3211"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 398.91721,170.07872 -0.0565,28.3211"
+           id="path4476-1-3" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4478-8-2"
+           d="m 401.98581,168.30706 -0.0565,28.3211"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 405.0544,166.53541 -0.0565,28.3211"
+           id="path4480-5-3" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4482-1-7"
+           d="m 408.123,164.76376 -0.0565,28.3211"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      </g>
+      <g
+         id="g4320-3-9"
+         transform="matrix(0.3681076,0.00256992,-0.00256992,0.3681076,-75.128662,-36.415865)"
+         style="display:inline">
+        <path
+           style="fill:#484848;fill-opacity:1;stroke:#484848;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 383.5625,139.96875 -30.6875,17.71875 0,70.84375 30.6875,17.71875 30.6875,-17.71875 0,-70.84375 -30.6875,-17.71875 z"
+           id="path4322-1-31"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#ceced0;fill-opacity:1;stroke:none"
+           d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,-70.86614 -30.68594,-17.71654 z"
+           id="path4324-5-6"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4326-7-8"
+           d="m 356.07143,216.27072 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4328-4-7"
+           d="m 359.02549,228.54329 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,240.94486 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           id="path4330-4-12"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,235.6299 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4332-8-8"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4334-6-5"
+           d="m 368.23127,233.85825 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,155.42973)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4336-6-2"
+           style="fill:url(#linearGradient3750-4-5-849-589-645-380-989-442);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3752-4-8-865-39-998-929-426-852);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4338-5-1"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,149.05315)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,161.55378)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4340-1-4"
+           style="fill:url(#linearGradient3754-4-92-693-616-221-503-670-733);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           style="fill:#ceced0;fill-opacity:1;stroke:none"
+           d="m 383.57424,139.96061 -30.68594,17.71653 30.68594,17.71654 30.68594,-17.71654 -30.68594,-17.71653 z"
+           id="path4342-0-9"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,163.12111 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4344-0-7"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,175.39368 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4346-5-4"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4348-6-35"
+           d="m 380.50565,187.79525 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4350-7-11"
+           d="m 371.29987,182.48029 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,180.70864 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4352-3-6"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3756-6-2-675-787-609-935-349-351);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4354-6-2"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,102.28012)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,95.903532)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4356-4-1"
+           style="fill:url(#linearGradient3758-0-7-290-295-303-806-714-641);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3760-7-93-194-399-87-803-417-851);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4358-2-7"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,108.40417)" />
+        <path
+           style="fill:#829193;fill-opacity:1;stroke:none"
+           d="m 383.57424,175.39368 30.68594,-17.71654 0,70.86614 -30.68594,17.71654 0,-70.86614 z"
+           id="path4360-0-8"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,162.9921 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4362-1-4"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4364-3-8"
+           d="m 356.07143,173.75104 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4366-3-4"
+           d="m 359.02549,186.02361 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,198.42518 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4368-0-2"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,193.11022 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4370-9-9"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4372-1-6"
+           d="m 368.23127,191.33857 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,112.91005)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4374-7-33"
+           style="fill:url(#linearGradient3762-9-3-351-164-870-227-778-703);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3764-1-8-935-985-670-561-330-371);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4376-0-7"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,106.53346)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,119.0341)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4378-9-1"
+           style="fill:url(#linearGradient3766-5-9-365-489-130-741-479-70);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           id="path4380-6-3"
+           d="m 355.9569,173.62202 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,184.38095 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4382-5-6"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,196.65352 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4384-0-2"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4386-3-5"
+           d="m 380.50565,209.05509 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4388-2-6"
+           d="m 371.29987,203.74013 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,201.96848 0,-10.62991 -3.06859,-1.77166 0,10.62993 3.06859,1.77164 z"
+           id="path4390-4-7"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3768-8-2-726-788-821-542-378-724);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4392-9-0"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,123.53996)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,117.16338)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4394-2-7"
+           style="fill:url(#linearGradient3770-3-5-203-431-151-903-147-876);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3772-3-9-5-394-317-439-301-686-162);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4396-1-39"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,129.66401)" />
+        <path
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           d="m 356.07143,205.6408 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           id="path4398-6-6"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 359.02549,217.91337 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4400-0-8"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4402-2-4"
+           d="m 380.50565,230.31494 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4404-8-11"
+           d="m 371.29987,224.99998 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 368.23127,223.22833 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4406-0-6"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3774-6-4-557-623-911-945-864-749);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4408-9-0"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,144.79981)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,138.42322)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4410-5-5"
+           style="fill:url(#linearGradient3776-6-1-137-725-52-492-31-280);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3778-6-8-260-398-646-757-679-752);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4412-9-9"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,150.92386)" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,184.25194 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4414-5-9"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4416-3-4"
+           d="m 355.9569,194.88187 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4418-6-5"
+           d="m 356.07143,195.01088 24.43422,14.04422 0,10.62992 -24.54875,-14.17322 0.11453,-10.50092 z"
+           style="fill:#c8c8ca;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4420-9-0"
+           d="m 359.02549,207.28345 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 380.50565,219.68502 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4422-5-0"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           d="m 371.29987,214.37006 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           id="path4424-7-7"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4426-2-9"
+           d="m 368.23127,212.59841 0,-10.62992 -3.06859,-1.77166 0,10.62993 3.06859,1.77165 z"
+           style="fill:#b4b4b4;fill-opacity:1;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,305.9432,134.16989)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4428-0-8"
+           style="fill:url(#linearGradient3780-8-9-8-299-608-766-29-850-181);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#linearGradient3782-6-9-728-817-595-688-255-395);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           id="path4430-8-2"
+           sodipodi:cx="316.22275"
+           sodipodi:cy="163.34666"
+           sodipodi:rx="5.9796319"
+           sodipodi:ry="5.9796319"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,295.05249,127.7933)" />
+        <path
+           transform="matrix(0.19723515,0.11387376,0,0.22774632,316.6445,140.29394)"
+           d="m 322.20238,163.34666 c 0,3.30246 -2.67717,5.97964 -5.97963,5.97964 -3.30246,0 -5.97963,-2.67718 -5.97963,-5.97964 0,-3.30246 2.67717,-5.97963 5.97963,-5.97963 3.30246,0 5.97963,2.67717 5.97963,5.97963 z"
+           sodipodi:ry="5.9796319"
+           sodipodi:rx="5.9796319"
+           sodipodi:cy="163.34666"
+           sodipodi:cx="316.22275"
+           id="path4432-3-4"
+           style="fill:url(#linearGradient3784-9-5-501-261-748-997-809-64);fill-opacity:1;stroke:#949494;stroke-opacity:1"
+           sodipodi:type="arc" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 355.9569,205.51179 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           id="path4434-1-8"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4436-7-47"
+           d="m 355.9569,216.14171 24.54875,14.17323 0,10.62992 -24.54875,-14.17322 0,-10.62993 z"
+           style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#484848;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 355.9569,162.9921 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+           id="path4438-5-6"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4440-3-65"
+           d="m 355.9569,194.88186 0,31.88977 24.54875,14.17323 0,-31.88977 -24.54875,-14.17323 z"
+           style="fill:none;stroke:#484848;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#f3f3f3;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 352.8883,157.67714 30.68594,17.71654 0,70.86614 0,0"
+           id="path4442-5-3"
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#b4b4b4;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 352.8883,157.67714 0,70.86614 30.68594,17.71654 0,0"
+           id="path4444-0-6"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#bdbdbd;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 383.57424,175.39368 30.68594,-17.71654"
+           id="path4446-3-5"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#6e6e6e;fill-opacity:1;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 411.19159,162.9921 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+           id="path4448-8-2"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path4450-2-1"
+           d="m 411.19159,198.42517 -24.54875,14.17323 0,28.34646 24.54875,-14.17323 0,-28.34646 0,0 z"
+           style="fill:#6e6e6e;fill-opacity:1;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g4452-0-6">
+          <path
+             id="path4454-9-91"
+             d="m 389.76795,175.41904 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 392.78003,173.62203 -0.0565,28.3211"
+             id="path4456-7-0"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4458-1-22"
+             d="m 395.84862,171.85037 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 398.91721,170.07872 -0.0565,28.3211"
+             id="path4460-5-6"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4462-7-4"
+             d="m 401.98581,168.30706 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 405.0544,166.53541 -0.0565,28.3211"
+             id="path4464-5-0"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4466-6-7"
+             d="m 408.123,164.76376 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g4468-9-4"
+           transform="translate(0.05649565,35.458423)">
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 389.76795,175.41904 -0.0565,28.3211"
+             id="path4470-6-63"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4472-3-4"
+             d="m 392.78003,173.62203 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 395.84862,171.85037 -0.0565,28.3211"
+             id="path4474-9-82"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4476-1-36"
+             d="m 398.91721,170.07872 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 401.98581,168.30706 -0.0565,28.3211"
+             id="path4478-8-5"
+             inkscape:connector-curvature="0" />
+          <path
+             id="path4480-5-0"
+             d="m 405.0544,166.53541 -0.0565,28.3211"
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#484848;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 408.123,164.76376 -0.0565,28.3211"
+             id="path4482-1-6"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/srvc_id.svg b/interface/images/menu/srvc_id.svg
new file mode 100755
index 0000000..c30099f
--- /dev/null
+++ b/interface/images/menu/srvc_id.svg
@@ -0,0 +1,1232 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="srvc_id4.svg"
+   version="1.0"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:version="0.32"
+   id="svg2408"
+   height="96"
+   width="96">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="32.440505"
+     inkscape:cy="45.267775"
+     inkscape:document-units="px"
+     inkscape:current-layer="g31454"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1590"
+     inkscape:window-height="876"
+     inkscape:window-x="4"
+     inkscape:window-y="24"
+     inkscape:window-maximized="0"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#e9e9e9;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0c0c0c;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#0c0c0c;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2fa2ff;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#8fffff;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0c0c0c;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#0c0c0c;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#ff0000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#ff846b;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-310"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:1;"
+         offset="0"
+         id="stop29373" />
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29375" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-701"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:1;"
+         offset="0"
+         id="stop29379" />
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29381" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-719"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:1;"
+         offset="0"
+         id="stop29385" />
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29387" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-107"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:1;"
+         offset="0"
+         id="stop29391" />
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29393" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-258"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:1;"
+         offset="0"
+         id="stop29397" />
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29399" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-677"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:1;"
+         offset="0"
+         id="stop29403" />
+      <stop
+         style="stop-color:#0d0d0d;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29405" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3637-397">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop29409" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop29411" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700-87">
+      <stop
+         style="stop-color:#34b4ff;stop-opacity:1;"
+         offset="0"
+         id="stop29427" />
+      <stop
+         style="stop-color:#9fffff;stop-opacity:1;"
+         offset="1"
+         id="stop29429" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3637-845">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop29451" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop29453" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3183-0-42">
+      <stop
+         style="stop-color:#ff0000;stop-opacity:1;"
+         offset="0"
+         id="stop29457" />
+      <stop
+         style="stop-color:#ff9377;stop-opacity:1;"
+         offset="1"
+         id="stop29459" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-310-838"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:1;"
+         offset="0"
+         id="stop29790" />
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29792" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-701-131"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:1;"
+         offset="0"
+         id="stop29796" />
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29798" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-719-817"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:1;"
+         offset="0"
+         id="stop29802" />
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29804" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-107-800"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:1;"
+         offset="0"
+         id="stop29808" />
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29810" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-258-317"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:1;"
+         offset="0"
+         id="stop29814" />
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29816" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-0-677-134"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:1;"
+         offset="0"
+         id="stop29820" />
+      <stop
+         style="stop-color:#0e0e0e;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop29822" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3637-397-470">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop29826" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop29828" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700-87-898">
+      <stop
+         style="stop-color:#3ac8ff;stop-opacity:1;"
+         offset="0"
+         id="stop29844" />
+      <stop
+         style="stop-color:#b1ffff;stop-opacity:1;"
+         offset="1"
+         id="stop29846" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3637-845-352">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop29868" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop29870" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3183-0-42-125">
+      <stop
+         style="stop-color:#ff0000;stop-opacity:1;"
+         offset="0"
+         id="stop29874" />
+      <stop
+         style="stop-color:#ffa384;stop-opacity:1;"
+         offset="1"
+         id="stop29876" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow-310-838-417"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#101010;stop-opacity:1;"
+         offset="0"
+         id="stop30325" />
+      <stop
+         style="stop-color:#101010;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop30327" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199-529-442-3"
+       xlink:href="#ButtonShadow-0-701-131-378"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0-701-131-378"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#101010;stop-opacity:1;"
+         offset="0"
+         id="stop30331" />
+      <stop
+         style="stop-color:#101010;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop30333" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0-719-817-473"
+       id="linearGradient3780-581-126-27"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="ButtonShadow-0-719-817-473"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#101010;stop-opacity:1;"
+         offset="0"
+         id="stop30337" />
+      <stop
+         style="stop-color:#101010;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop30339" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0-107-800-845"
+       id="linearGradient3772-572-687-648"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="ButtonShadow-0-107-800-845"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#101010;stop-opacity:1;"
+         offset="0"
+         id="stop30343" />
+      <stop
+         style="stop-color:#101010;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop30345" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0-258-317-984"
+       id="linearGradient3725-316-854-990"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="ButtonShadow-0-258-317-984"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#101010;stop-opacity:1;"
+         offset="0"
+         id="stop30349" />
+      <stop
+         style="stop-color:#101010;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop30351" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0-677-134-965"
+       id="linearGradient3721-435-71-437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="ButtonShadow-0-677-134-965"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#101010;stop-opacity:1;"
+         offset="0"
+         id="stop30355" />
+      <stop
+         style="stop-color:#101010;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop30357" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637-397-470-920"
+       id="linearGradient3643-482-465-267"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3637-397-470-920">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop30361" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop30363" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-327-296-681"
+       id="linearGradient3188-63-607-894"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-327-296-681">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop30367" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop30369" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-823-415-616"
+       id="radialGradient3619-367-244-655"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-823-415-616">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop30373" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop30375" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700-87-898-941"
+       id="linearGradient2843-222-5-402"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <linearGradient
+       id="linearGradient3700-87-898-941">
+      <stop
+         style="stop-color:#40deff;stop-opacity:1;"
+         offset="0"
+         id="stop30379" />
+      <stop
+         style="stop-color:#c5ffff;stop-opacity:1;"
+         offset="1"
+         id="stop30381" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3-96-778-430"
+       id="linearGradient3188-8-142-827-704"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3-96-778-430">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop30385" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop30387" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3-822-372-656"
+       id="radialGradient3619-3-995-786-610"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3-822-372-656">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop30391" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop30393" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-632-963-659"
+       id="linearGradient3613-281-980-553"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-632-963-659">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop30397" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop30399" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637-845-352-437"
+       id="linearGradient3905-654-40-548"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       id="linearGradient3637-845-352-437">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop30403" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop30405" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0-42-125-596"
+       id="linearGradient3913-176-477-37"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       id="linearGradient3183-0-42-125-596">
+      <stop
+         style="stop-color:#ff0000;stop-opacity:1;"
+         offset="0"
+         id="stop30409" />
+      <stop
+         style="stop-color:#ffb593;stop-opacity:1;"
+         offset="1"
+         id="stop30411" />
+    </linearGradient>
+    <filter
+       id="filter32448"
+       inkscape:label="Lightness-Contrast"
+       inkscape:menu="Color"
+       inkscape:menu-tooltip="Increase or decrease lightness and contrast"
+       x="0"
+       y="0"
+       width="1"
+       height="1"
+       color-interpolation-filters="sRGB">
+      <feColorMatrix
+         id="feColorMatrix32450"
+         type="hueRotate"
+         values="0" />
+      <feColorMatrix
+         id="feColorMatrix32452"
+         type="saturate"
+         values="1" />
+      <feColorMatrix
+         id="feColorMatrix32454"
+         type="matrix"
+         values="2 -1 0 0 0 0 2 -1 0 0 -1 0 2 0 0 0 0 0 1 0 "
+         result="fbSourceGraphic" />
+      <feColorMatrix
+         result="fbSourceGraphicAlpha"
+         in="fbSourceGraphic"
+         values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+         id="feColorMatrix32456" />
+      <feFlood
+         id="feFlood32458"
+         result="result1"
+         flood-opacity="0"
+         flood-color="rgb(128,128,128)"
+         in="fbSourceGraphic" />
+      <feBlend
+         id="feBlend32460"
+         in2="fbSourceGraphic"
+         mode="normal"
+         result="result2" />
+      <feComposite
+         id="feComposite32462"
+         in2="fbSourceGraphic"
+         k2="1"
+         operator="arithmetic"
+         result="result3" />
+      <feComposite
+         id="feComposite32464"
+         in2="fbSourceGraphic"
+         operator="in" />
+    </filter>
+  </defs>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow-310-838-417);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199-529-442-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780-581-126-27);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772-572-687-648);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725-316-854-990);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721-435-71-437);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#0c0c0c;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#0c0c0c;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643-482-465-267);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188-63-607-894);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619-367-244-655);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843-222-5-402);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#0c0c0c;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#0c0c0c;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#0c0c0c;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#0c0c0c;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8-142-827-704);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3-995-786-610);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613-281-980-553);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905-654-40-548);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#0c0c0c;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913-176-477-37);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#0c0c0c;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#0c0c0c;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       id="g31454"
+       style="filter:url(#filter32448)">
+      <path
+         style="fill:none;stroke:#00f000;stroke-width:0.53522998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none"
+         sodipodi:nodetypes="czzzzz"
+         id="path1293"
+         d="M 48.820283,80.692848 C 66.773831,69.067578 74.656514,36.469164 72.081173,28.975084 69.479549,21.404523 65.941297,18.010328 59.033163,17.122692 52.040946,16.22425 46.903271,15.767115 37.54373,25.845526 28.105048,36.009158 21.92222,51.577837 20.910716,57.746422 19.89921,63.915009 19.808017,68.334169 20.600096,69.942091"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g31434"
+         transform="matrix(1.2518055,0,0,1.2518055,-9.679008,-12.27034)">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 22.01917,70.911908 c 3.920046,0.285881 11.656652,0.662634 17.303238,0.49416 3.681203,2.929172 6.817182,5.676605 11.407093,7.424457"
+           id="path2055"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 22.070237,68.452369 c 17.138785,0.539189 19.303197,0.363483 19.939292,0 2.885881,2.431259 5.680895,4.499039 9.748097,6.203334"
+           id="path2057"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 22.12211,63.953058 c 7.96086,0.902673 21.677092,-1.102514 24.403207,-3.55602 0.580077,4.91908 6.703261,7.657265 10.372937,10.940674"
+           id="path2059"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 21.479982,65.884667 c 12.231777,0.63006 18.604783,0.607547 22.421347,-0.937254 2.482596,2.471068 7.600435,6.941286 11.355218,8.776259"
+           id="path2061"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 21.820948,62.095031 c 14.891091,-0.520252 31.030197,-9.062584 33.467221,-11.80077 2.562973,-2.879698 0.963346,-7.575609 -1.030583,-9.569538 -1.993929,-1.99393 -8.081528,-4.378048 -10.518553,-2.38412 -2.437026,1.993931 -5.547326,9.428692 -6.64336,11.785629 -1.130659,2.431396 -3.798854,10.151803 -9.870703,11.441286"
+           id="path4365"
+           sodipodi:nodetypes="czzzzc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 35.556095,57.085081 c 7.532623,-1.107739 18.208689,-6.440234 18.754397,-8.587452 1.097819,-4.319628 -2.802963,-8.370314 -5.683082,-8.370314 -2.880119,0 -4.782564,0.756129 -6.111851,3.636249 -1.878195,5.716147 -6.959464,13.321517 -6.959464,13.321517 z"
+           id="path5883"
+           sodipodi:nodetypes="csccc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 40.208598,54.204961 c 6.867978,-1.10774 10.556593,-4.534024 11.298931,-6.203335 1.723883,-3.876531 -1.343615,-5.73599 -4.002186,-5.514444 -3.481937,0.404519 -4.460718,9.156204 -7.296745,11.717779 z"
+           id="path5885"
+           sodipodi:nodetypes="cscc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 44.418004,51.103293 c 5.538692,-2.215477 6.828096,-5.579314 5.00411,-6.309148 -3.170206,-1.268503 -3.814807,4.936877 -5.00411,6.309148 z"
+           id="path5887"
+           sodipodi:nodetypes="csc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 33.131949,61.924548 c 2.259037,-0.226442 13.60513,-2.906388 15.500685,-5.222851 -0.567741,5.080913 8.86794,12.460345 9.776647,12.732958"
+           id="path2847"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 52.012945,54.153895 c -1.511026,3.726507 5.845888,12.526093 8.026783,13.162186"
+           id="path6649"
+           sodipodi:nodetypes="cc"
+           style="fill:none;stroke:#00ff00;stroke-width:0.64420402;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 21.132981,58.709495 c 3.323214,0.221546 7.857664,-1.017739 9.918583,-3.022057 1.355398,-1.318174 3.959309,-6.436139 5.067047,-9.316259 1.107739,-2.88012 4.976177,-10.776223 8.299393,-11.219318 3.323215,-0.443096 8.861907,1.107737 11.520479,4.430953 2.658574,3.323215 2.931551,9.259529 2.88012,9.748097 -0.391665,3.720837 -3.323214,2.88012 -3.987858,5.095596 -0.664642,2.215478 5.538691,10.412742 5.538691,10.412742"
+           id="path6651"
+           sodipodi:nodetypes="csssssss"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 22.484782,54.869604 c 6.867978,-0.443097 9.083455,-4.652502 11.077382,-9.083454 1.993931,-4.430955 4.127847,-11.164463 8.558799,-12.272201 4.430955,-1.10774 9.435066,-1.199221 14.087566,2.123993 4.652503,3.323215 5.408632,7.239431 5.658833,10.875676 0.247575,3.598027 -1.054829,7.026701 -2.384116,8.134439 -1.329287,1.107738 2.215477,8.197262 2.215477,8.197262"
+           id="path7416"
+           sodipodi:nodetypes="csssssc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           d="m 22.927878,52.090038 c 5.760239,0 9.618036,-10.369754 10.634286,-13.735956 0.659239,-2.183631 6.745259,-9.191798 10.86576,-10.42707 7.228404,-2.166978 15.368355,-0.664642 18.002678,2.186819 2.891832,3.1302 4.14217,9.791085 3.255979,14.886681 -0.88619,5.095598 -3.987858,9.083455 -3.766309,10.634289 0.221546,1.550834 1.550833,3.323215 1.550833,3.323215"
+           id="path7418"
+           sodipodi:nodetypes="csssssc"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           inkscape:connector-curvature="0" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 24.883229,47.115435 c 1.99393,0 7.330999,-11.552695 10.489898,-15.388198 3.444992,-4.182872 11.352712,-7.434872 15.339696,-7.518292 8.745067,-0.18297 14.711935,3.831555 16.235811,6.853649 1.509047,2.99269 2.612101,7.122016 2.176899,11.01015 -0.475178,4.245275 -3.189969,9.318211 -3.255983,10.802931 -0.06723,1.512256 -0.380267,2.55276 0.443098,3.101667"
+           id="path8178"
+           sodipodi:nodetypes="cssssss"
+           style="fill:none;stroke:#38ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 40.873242,22.966736 c 5.538692,-4.874048 10.322817,-4.866459 14.843693,-4.209406 4.000066,0.581361 10.623033,2.760702 12.406672,5.095599 1.925606,2.52074 3.283409,5.811302 3.544764,8.640359 0.288216,3.119872 0.07955,7.06701 -0.193001,7.975716"
+           id="path8180"
+           sodipodi:nodetypes="cssss"
+           style="fill:none;stroke:#00ff00;stroke-width:0.64420402;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 39.318,33.030061 c 5.538694,-4.87405 9.228678,-4.342357 13.745878,-3.660498 4.457489,0.672846 7.512549,2.303279 9.296187,4.638175 1.925606,2.520742 1.270745,8.921785 1.532099,11.750841"
+           id="path2075"
+           sodipodi:nodetypes="csss"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+           d="m 52.902492,21.102358 c -4.507282,0.0066 -10.433183,1.410488 -15.350176,5.737442 l 0.42276,0.483153 c 5.457965,-4.803009 12.239354,-5.90038 16.709041,-5.500899 2.187229,0.195486 4.751258,0.858659 6.975522,1.756463 2.224263,0.897802 4.108604,2.053858 4.927155,3.125395 1.906448,2.495664 2.672192,4.229665 2.929113,7.010751 l 0.644204,-0.06039 c -0.265783,-2.87703 -1.115206,-4.797098 -3.059969,-7.342919 -0.965085,-1.263357 -2.91736,-2.41081 -5.198926,-3.331741 -2.281564,-0.9209 [...]
+           id="path2077"
+           inkscape:connector-curvature="0" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 44.624115,31.383338 c 3.52603,-1.031689 6.323436,-0.394174 10.726885,0.822255 4.091546,1.130269 6.323245,5.322275 6.826098,7.931625"
+           id="path2079"
+           sodipodi:nodetypes="css"
+           style="fill:none;stroke:#00ff00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         d="M 51.834541,88.887215 C 74.355232,74.304639 84.243174,33.413627 81.012699,24.013149 77.749249,14.51674 73.310916,10.259106 64.645443,9.1456681 55.874502,8.0186736 49.429873,7.4452536 37.689393,20.087474 25.849638,32.836597 18.09398,52.365738 16.82516,60.103526 15.55634,67.841323 15.441951,73.384659 16.435518,75.401613"
+         id="path1293-2"
+         sodipodi:nodetypes="czzzzz"
+         style="fill:none;stroke:#00fe00;stroke-width:2.28000021;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/status.svg b/interface/images/menu/status.svg
new file mode 100755
index 0000000..1379271
--- /dev/null
+++ b/interface/images/menu/status.svg
@@ -0,0 +1,738 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="internet-radio-new.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3693"
+       id="linearGradient3699"
+       x1="7"
+       y1="9"
+       x2="15"
+       y2="9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,2.7,-2.7,0,72.4,10.2)" />
+    <linearGradient
+       id="linearGradient3693">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3695" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3697" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3657"
+       id="linearGradient3676"
+       x1="4"
+       y1="10"
+       x2="18"
+       y2="10"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,2.7,-2.7,0,75.1,12.9)" />
+    <linearGradient
+       id="linearGradient3657">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3659" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3661" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3657"
+       id="linearGradient3663"
+       x1="1"
+       y1="11"
+       x2="21"
+       y2="11"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,22,-1)" />
+    <linearGradient
+       gradientTransform="matrix(2.7,0,0,2.7,18.4,18.3)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3856"
+       x1="10"
+       y1="7"
+       x2="10"
+       y2="21.035669"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="StandardGradient"
+       gradientTransform="scale(0.9219544,1.0846523)"
+       x1="11.998966"
+       y1="0.92195445"
+       x2="11.998966"
+       y2="19.387045"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.86274511;"
+         offset="0"
+         id="stop3283" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.47058824;"
+         offset="1"
+         id="stop2651" />
+    </linearGradient>
+    <linearGradient
+       y2="11"
+       x2="21"
+       y1="11"
+       x1="1"
+       gradientTransform="matrix(0,2.7,-2.7,0,77.8,15.6)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3089"
+       xlink:href="#linearGradient3657"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3921"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.7,0,0,2.7,18.4,17.3)"
+       x1="10"
+       y1="7"
+       x2="10"
+       y2="21.035669" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3923"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.7,0,0,2.7,18.4,18.3)"
+       x1="10"
+       y1="7"
+       x2="10"
+       y2="21.035669" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.917248"
+     inkscape:cx="54.19265"
+     inkscape:cy="53.651941"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.94180477"
+       inkscape:original="M 48.09375 35.90625 C 45.351472 35.90625 43.125 38.172625 43.125 40.90625 C 43.125 41.707562 43.430164 42.453034 43.78125 43.15625 L 33.71875 75.71875 A 0.92908338 0.92908338 0 0 0 34.59375 76.9375 L 40 76.9375 A 0.92908338 0.92908338 0 0 0 40.90625 76.25 L 41.46875 74.25 L 54.71875 74.25 L 55.28125 76.25 A 0.92908338 0.92908338 0 0 0 56.1875 76.9375 L 61.59375 76.9375 A 0.92908338 0.92908338 0 0 0 62.46875 75.71875 L 52.40625 43.15625 C 52.762896 42.462186 53.0 [...]
+       style="opacity:0.1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3936"
+       d="m 48.09375,34.96875 c -3.261185,0 -5.90625,2.69249 -5.90625,5.9375 0,0.857573 0.324964,1.532071 0.625,2.1875 l -10,32.34375 c 7.8e-5,-2.37e-4 -0.03131,0.09399 -0.03125,0.09375 6.4e-5,-2.41e-4 -4.9e-5,0.09399 0,0.09375 4.9e-5,-2.44e-4 -0.03128,0.125247 -0.03125,0.125 3.5e-5,-2.47e-4 -2e-5,0.094 0,0.09375 2e-5,-2.48e-4 -0.03126,0.125249 -0.03125,0.125 6e-6,-2.49e-4 9e-6,0.094 0,0.09375 -9e-6,-2.49e-4 0.03127,0.125248 0.03125,0.125 -2.3e-5,-2.48e-4 3.8e-5,0.094 0,0.09375 -3.8e-5,- [...]
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.92899048"
+       inkscape:original="M 48.09375 36.84375 C 45.856997 36.84375 44.0625 38.669497 44.0625 40.90625 C 44.0625 41.745032 44.282062 42.541115 44.71875 43.1875 L 34.59375 76 L 40 76 L 40.75 73.3125 L 55.4375 73.3125 L 56.1875 76 L 61.59375 76 L 51.46875 43.1875 C 51.90544 42.541115 52.15625 41.745032 52.15625 40.90625 C 52.15625 38.669497 50.330503 36.84375 48.09375 36.84375 z M 45.40625 57.09375 L 50.8125 57.09375 L 52.25 62.0625 L 43.96875 62.0625 L 45.40625 57.09375 z M 43.125 65.1875  [...]
+       style="opacity:0.15;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3932"
+       d="m 48.09375,35.90625 c -2.742278,0 -4.96875,2.266375 -4.96875,5 0,0.801312 0.305164,1.546784 0.65625,2.25 l -10.0625,32.5625 a 0.92908338,0.92908338 0 0 0 0.875,1.21875 l 5.40625,0 A 0.92908338,0.92908338 0 0 0 40.90625,76.25 l 0.5625,-2 13.25,0 0.5625,2 a 0.92908338,0.92908338 0 0 0 0.90625,0.6875 l 5.40625,0 a 0.92908338,0.92908338 0 0 0 0.875,-1.21875 l -10.0625,-32.5625 c 0.356646,-0.694064 0.6875,-1.42957 0.6875,-2.25 0,-2.742278 -2.257722,-5 -5,-5 z m -1.96875,22.125 3.968 [...]
+    <path
+       id="path3926"
+       d="m 48.1,36.85 c -2.236753,0 -4.05,1.813247 -4.05,4.05 0,0.838782 0.238312,1.63174 0.675,2.278125 L 34.6,76 l 5.4,0 0.759375,-2.7 14.68125,0 L 56.2,76 61.6,76 51.475,43.178125 C 51.91169,42.53174 52.15,41.738782 52.15,40.9 c 0,-2.236753 -1.813247,-4.05 -4.05,-4.05 z m -2.7,20.25 5.4,0 1.434375,4.978125 -8.26875,0 L 45.4,57.1 z m -2.278125,8.1 9.95625,0 1.434375,4.978125 -12.825,0 L 43.121875,65.2 z"
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.3"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.3;color:#000000;fill:url(#linearGradient3089);fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 75.1,45.3 c 0,-14.911687 -12.088313,-27 -27,-27 -14.911687,0 -27,12.088313 -27,27 0,14.911687 12.088313,27 27,27 14.911687,0 27,-12.088313 27,-27 z m -2.7,0 c 0,3.595992 -0.7811,7.009548 -2.182891,10.080258 C 66.387311,63.769674 57.924527,69.6 48.1,69.6 34.67948,69.6 23.8,58.72052 23.8,45.3 23.8,31.87948 34.67948,21 48.1,21 61.52052,21 72.4,31.87948 72.4,45.3 z"
+       id="path2880"
+       sodipodi:nodetypes="csssccssssc" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.3;color:#000000;fill:url(#linearGradient3676);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 67,42.6 C 67,32.161819 58.538181,23.7 48.1,23.7 c -10.438181,0 -18.9,8.461819 -18.9,18.9 0,10.438181 8.461819,18.9 18.9,18.9 10.438181,0 18.9,-8.461819 18.9,-18.9 z m -2.7,0 c 0,8.947014 -7.252986,16.2 -16.2,16.2 -8.947014,0 -16.2,-7.252986 -16.2,-16.2 0,-8.947014 7.252986,-16.2 16.2,-16.2 8.947014,0 16.2,7.252986 16.2,16.2 z"
+       id="path3665" />
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:0.3;color:#000000;fill:url(#linearGradient3699);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 58.9,39.9 c 0,-5.964675 -4.835325,-10.8 -10.8,-10.8 -5.964675,0 -10.8,4.835325 -10.8,10.8 0,5.964675 4.835325,10.8 10.8,10.8 5.964675,0 10.8,-4.835325 10.8,-10.8 z m -2.7,0 c 0,4.473505 -3.626495,8.1 -8.1,8.1 -4.473505,0 -8.1,-3.626495 -8.1,-8.1 0,-4.473505 3.626495,-8.1 8.1,-8.1 4.473505,0 8.1,3.626495 8.1,8.1 z"
+       id="path3688" />
+    <path
+       inkscape:connector-curvature="0"
+       style="color:#000000;fill:url(#linearGradient3856);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 48.1,35.85 c -2.236753,0 -4.05,1.813247 -4.05,4.05 0,0.838782 0.238312,1.63174 0.675,2.278125 L 34.6,75 l 5.4,0 0.759375,-2.7 14.68125,0 L 56.2,75 61.6,75 51.475,42.178125 C 51.91169,41.53174 52.15,40.738782 52.15,39.9 c 0,-2.236753 -1.813247,-4.05 -4.05,-4.05 z m -2.7,20.25 5.4,0 1.434375,4.978125 -8.26875,0 L 45.4,56.1 z m -2.278125,8.1 9.95625,0 1.434375,4.978125 -12.825,0 L 43.121875,64.2 z"
+       id="path3841" />
+    <path
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.75"
+       d="M 48.09375 35.84375 C 45.856997 35.84375 44.0625 37.669497 44.0625 39.90625 C 44.0625 40.105487 44.067394 40.307284 44.09375 40.5 C 44.30115 38.457763 45.996794 36.84375 48.09375 36.84375 C 50.168869 36.84375 51.857359 38.425898 52.09375 40.4375 C 52.114962 40.264072 52.15625 40.084803 52.15625 39.90625 C 52.15625 37.669497 50.330503 35.84375 48.09375 35.84375 z M 44.53125 42.8125 L 34.59375 75 L 34.90625 75 L 44.71875 43.1875 C 44.642625 43.074819 44.595107 42.933555 44.53125  [...]
+       id="path3898" />
+    <path
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.15"
+       d="M 52.09375 39.4375 C 52.015313 40.07878 51.812481 40.678712 51.46875 41.1875 L 51.65625 41.8125 C 51.958705 41.239129 52.15625 40.598812 52.15625 39.90625 C 52.15625 39.744616 52.112163 39.594187 52.09375 39.4375 z M 44.09375 39.53125 C 44.081935 39.657267 44.0625 39.777143 44.0625 39.90625 C 44.0625 40.598812 44.228796 41.239129 44.53125 41.8125 L 44.71875 41.1875 C 44.391234 40.702711 44.181245 40.13843 44.09375 39.53125 z M 45.40625 55.09375 L 43.96875 60.0625 L 44.25 60.062 [...]
+       id="path3917" />
+  </g>
+</svg>
diff --git a/interface/images/menu/status_1.svg b/interface/images/menu/status_1.svg
new file mode 100755
index 0000000..3a9a72c
--- /dev/null
+++ b/interface/images/menu/status_1.svg
@@ -0,0 +1,694 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="status_1.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="15.863342"
+     inkscape:cy="53.378531"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       transform="matrix(0.1771561,0,0,0.1771561,17.343584,9.1869176)"
+       id="g3649">
+      <rect
+         width="278.11084"
+         height="346.66846"
+         x="-29.078054"
+         y="108.52094"
+         transform="matrix(0.96592584,-0.25881901,0.25881901,0.96592584,0,0)"
+         id="rect4350"
+         style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+      <rect
+         width="235.76143"
+         height="310.62408"
+         x="-7.9031482"
+         y="124.81621"
+         transform="matrix(0.96592584,-0.25881901,0.25881901,0.96592584,0,0)"
+         id="rect5146"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+      <g
+         transform="matrix(7.8539483,-2.1044588,2.1044588,7.8539483,-4599.7824,-2493.6008)"
+         id="g5695">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.1762,465.90003 13.43733,0"
+           id="path5155"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.1762,469.16493 13.43733,0"
+           id="path5157"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.1762,472.42983 13.43733,1e-5"
+           id="path5159"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.1762,475.69474 8.90752,0"
+           id="path5161"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.17621,480.04794 13.43733,0"
+           id="path5163"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.17621,483.31285 13.43733,0"
+           id="path5165"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.17621,486.57775 13.43733,0"
+           id="path5167"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.17621,489.84265 13.43733,0"
+           id="path5169"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           d="m 468.17621,493.10756 9.46602,0"
+           id="path5171"
+           style="fill:none;stroke:#000000;stroke-width:1.63245177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         d="M 114.2734,1.6632228 C 88.409562,8.5933604 73.048791,35.198987 79.978929,61.062822 c 1.700193,6.34503 4.629632,12.001202 8.397459,16.908427 L 41.693356,90.479907 54.743946,139.18553 234.64318,90.981752 221.59259,42.276133 174.90948,54.784791 c 0.80903,-6.132648 0.46347,-12.483452 -1.2364,-18.827181 C 166.74286,10.093694 140.13731,-5.266996 114.2734,1.6632228 z"
+         id="rect4345"
+         style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+      <rect
+         width="50.15197"
+         height="50.15197"
+         x="142.43733"
+         y="188.7258"
+         transform="matrix(0.96592584,-0.25881901,0.25881901,0.96592584,0,0)"
+         id="rect5634"
+         style="fill:none;stroke:#000000;stroke-width:11.08622456;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         inkscape:connector-curvature="0"
+         d="m 204.65473,146.12949 c 3.11409,3.11775 6.3952,6.06304 9.55401,9.1338 0.82302,0.80009 1.70158,1.55221 2.43004,2.43906 0.88644,1.07947 1.58953,2.29725 2.3962,3.43754 1.05606,1.49277 2.12781,2.97441 3.19175,4.46157 0.32605,0.43419 5.39492,7.25074 6.12216,7.97497 3.40299,3.38851 13.46242,1.06979 -8.36144,7.69177 -1.20128,0.36427 0.87506,-2.36328 1.12948,-3.59253 0.39598,-1.91322 0.54315,-3.86954 0.81505,-5.80431 0.94816,-9.87885 1.25892,-19.84104 3.121,-29.61215 1.18453,-6.21624 [...]
+         id="path5638"
+         style="fill:#00ff00;fill-opacity:1;stroke:none" />
+      <rect
+         width="50.15197"
+         height="50.15197"
+         x="142.43733"
+         y="270.02493"
+         transform="matrix(0.96592584,-0.25881901,0.25881901,0.96592584,0,0)"
+         id="rect5640"
+         style="fill:none;stroke:#000000;stroke-width:11.08622456;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         inkscape:connector-curvature="0"
+         d="m 268.15431,205.864 -9.94585,7.58094 c -6.09923,10.79359 -2.99139,5.20149 -9.3061,16.97348 -1.78654,3.53032 -3.54512,7.07137 -5.28735,10.623 -6.8463,-3.55187 -13.97232,-6.60889 -21.44398,-8.64448 l -9.07436,10.83326 c 1.77573,0.27239 3.56455,0.39517 5.31214,0.81148 6.92445,1.6488 13.39307,4.94975 19.61972,8.50771 -4.45246,9.35789 -8.7484,18.78279 -12.99099,28.23963 l 11.42894,-9.05086 c 1.91526,-5.54949 4.09502,-11.06695 6.40365,-16.46391 1.39878,0.84075 2.78934,1.71434 4.168 [...]
+         id="path5642"
+         style="fill:#cccccc;fill-opacity:1;stroke:none" />
+      <rect
+         width="50.15197"
+         height="50.15197"
+         x="142.43733"
+         y="351.32407"
+         transform="matrix(0.96592584,-0.25881901,0.25881901,0.96592584,0,0)"
+         id="rect5647"
+         style="fill:none;stroke:#000000;stroke-width:11.08622456;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         inkscape:connector-curvature="0"
+         d="m 246.15091,300.05365 c 2.63664,3.53073 5.46331,6.91453 8.15101,10.40517 0.70008,0.90937 1.46236,1.77939 2.05658,2.76121 0.72284,1.19501 1.24502,2.50085 1.88053,3.74465 0.83189,1.62832 1.68101,3.24785 2.52151,4.87186 0.26101,0.47647 4.30358,7.94708 4.91999,8.76782 2.88391,3.83987 13.17142,2.98229 -9.37472,6.41813 -1.24096,0.18945 1.20371,-2.21391 1.63116,-3.39421 0.66511,-1.83703 1.09061,-3.75221 1.63604,-5.62836 2.34986,-9.64207 4.08079,-19.45758 7.31985,-28.86247 2.06056,-5 [...]
+         id="path5649"
+         style="fill:#00ff00;fill-opacity:1;stroke:none" />
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/system-run.svg b/interface/images/menu/system-run.svg
new file mode 100755
index 0000000..1ea5c88
--- /dev/null
+++ b/interface/images/menu/system-run.svg
@@ -0,0 +1,7186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg:svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="boh.svg"
+   version="1.0"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:version="0.32"
+   id="svg2408"
+   height="96"
+   width="96">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="15.863342"
+     inkscape:cy="46.654964"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       enabled="true"
+       visible="true"
+       id="grid3732"
+       type="xygrid" />
+  </sodipodi:namedview>
+  <svg:defs
+     id="defs2410">
+    <svg:linearGradient
+       id="linearGradient3637">
+      <svg:stop
+         id="stop3639"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <svg:stop
+         id="stop3641"
+         offset="1"
+         style="stop-color:#aaaaaa;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="scale(1.0058652,0.994169)"
+       id="ButtonShadow">
+      <svg:stop
+         id="stop3750"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3752"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       id="linearGradient3737"
+       inkscape:collect="always">
+      <svg:stop
+         id="stop3739"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <svg:stop
+         id="stop3741"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       id="linearGradient3700">
+      <svg:stop
+         id="stop3702"
+         offset="0"
+         style="stop-color:#2276c5;stop-opacity:1;" />
+      <svg:stop
+         id="stop3704"
+         offset="1"
+         style="stop-color:#68baf4;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:filter
+       id="filter3174"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3176"
+         stdDeviation="1.71"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:filter
+       height="1.384"
+       y="-0.192"
+       width="1.384"
+       x="-0.192"
+       id="filter3794"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3796"
+         stdDeviation="5.28"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="138.66119"
+       x2="48"
+       y1="20.220806"
+       x1="48"
+       id="linearGradient3613"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619"
+       xlink:href="#linearGradient3737"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3613"
+       clipPathUnits="userSpaceOnUse">
+      <svg:rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3615"
+         width="84"
+         height="84"
+         x="6"
+         y="6"
+         rx="6"
+         ry="6" />
+    </svg:clipPath>
+    <svg:linearGradient
+       gradientTransform="translate(0,100)"
+       y2="5.9877172"
+       x2="48"
+       y1="90"
+       x1="48"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2843"
+       xlink:href="#linearGradient3700"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3625"
+       clipPathUnits="userSpaceOnUse">
+      <svg:path
+         id="path3627"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="90.015434"
+       x2="44.512066"
+       y1="6"
+       x1="44.512066"
+       id="linearGradient3643"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <svg:clipPath
+       id="clipPath3649"
+       clipPathUnits="userSpaceOnUse">
+      <svg:rect
+         ry="4"
+         rx="4"
+         y="10"
+         x="10"
+         height="76"
+         width="76"
+         id="rect3651"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       id="filter3657"
+       inkscape:collect="always">
+      <svg:feGaussianBlur
+         id="feGaussianBlur3659"
+         stdDeviation="1.14"
+         inkscape:collect="always" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="7.0165396"
+       x2="45.447727"
+       y1="92.539597"
+       x1="45.447727"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       id="ButtonShadow-0">
+      <svg:stop
+         id="stop3750-8"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3752-5"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.58823532;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3780"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3772"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3725"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3721"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <svg:linearGradient
+       y2="63.893143"
+       x2="36.357143"
+       y1="6"
+       x1="36.357143"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3188-8"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       id="linearGradient3737-3"
+       inkscape:collect="always">
+      <svg:stop
+         id="stop3739-6"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <svg:stop
+         id="stop3741-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       id="radialGradient3619-3"
+       xlink:href="#linearGradient3737-3"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       gradientTransform="translate(-104,104)"
+       gradientUnits="userSpaceOnUse"
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       id="linearGradient3905"
+       xlink:href="#linearGradient3637"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       y2="8"
+       x2="120"
+       y1="8"
+       x1="104"
+       gradientTransform="translate(-144,104)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3913"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient2927-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       x1="11"
+       y1="11.015625"
+       x2="19"
+       y2="11.015625" />
+    <svg:linearGradient
+       id="linearGradient3183-0">
+      <svg:stop
+         id="stop3185-9"
+         offset="0"
+         style="stop-color:#c80000;stop-opacity:1;" />
+      <svg:stop
+         id="stop3187-6"
+         offset="1"
+         style="stop-color:#f3604d;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       id="XMLID_80_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop140" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop142" />
+      <midPointStop
+         id="midPointStop144"
+         style="stop-color:#003399"
+         offset="0" />
+      <midPointStop
+         id="midPointStop146"
+         style="stop-color:#003399"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop148"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       id="XMLID_81_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop155" />
+      <svg:stop
+         style="stop-color:#a3daaf;stop-opacity:1"
+         offset="1"
+         id="stop157" />
+      <midPointStop
+         id="midPointStop159"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop161"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop163"
+         style="stop-color:#A3DAAF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_82_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop170" />
+      <svg:stop
+         style="stop-color:#a3daaf;stop-opacity:1"
+         offset="1"
+         id="stop172" />
+      <midPointStop
+         id="midPointStop174"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop176"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop178"
+         style="stop-color:#A3DAAF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_83_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop185" />
+      <svg:stop
+         style="stop-color:#99ccff;stop-opacity:1"
+         offset="0.0562"
+         id="stop187" />
+      <svg:stop
+         style="stop-color:#3399ff;stop-opacity:1"
+         offset="0.69660002"
+         id="stop189" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop191" />
+      <midPointStop
+         id="midPointStop193"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop195"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop197"
+         style="stop-color:#99CCFF"
+         offset="0.0562" />
+      <midPointStop
+         id="midPointStop199"
+         style="stop-color:#99CCFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop201"
+         style="stop-color:#3399FF"
+         offset="0.6966" />
+      <midPointStop
+         id="midPointStop203"
+         style="stop-color:#3399FF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop205"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       id="XMLID_84_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#003399;stop-opacity:1"
+         offset="0"
+         id="stop212" />
+      <svg:stop
+         style="stop-color:#3399ff;stop-opacity:1"
+         offset="1"
+         id="stop214" />
+      <midPointStop
+         id="midPointStop216"
+         style="stop-color:#003399"
+         offset="0" />
+      <midPointStop
+         id="midPointStop218"
+         style="stop-color:#003399"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop220"
+         style="stop-color:#3399FF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       cx="160.10159"
+       cy="225.54491"
+       r="102.7621"
+       fx="160.10159"
+       fy="225.54491"
+       id="XMLID_85_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+      <svg:stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="0"
+         id="stop227" />
+      <svg:stop
+         style="stop-color:#0066cc;stop-opacity:1"
+         offset="1"
+         id="stop229" />
+      <midPointStop
+         id="midPointStop231"
+         style="stop-color:#428AFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop233"
+         style="stop-color:#428AFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop235"
+         style="stop-color:#0066CC"
+         offset="1" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       id="XMLID_86_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#e6f6f9;stop-opacity:1"
+         offset="0"
+         id="stop242" />
+      <svg:stop
+         style="stop-color:#71a6cd;stop-opacity:1"
+         offset="1"
+         id="stop244" />
+      <midPointStop
+         id="midPointStop246"
+         style="stop-color:#E6F6F9"
+         offset="0" />
+      <midPointStop
+         id="midPointStop248"
+         style="stop-color:#E6F6F9"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop250"
+         style="stop-color:#71A6CD"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408"
+       id="XMLID_87_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop259" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop261" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop263" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop265" />
+      <midPointStop
+         id="midPointStop267"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop269"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop271"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919"
+       id="XMLID_88_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop278" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop280" />
+      <midPointStop
+         id="midPointStop282"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop284"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop286"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082"
+       id="XMLID_89_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop293" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop295" />
+      <midPointStop
+         id="midPointStop297"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop299"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop301"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895"
+       id="XMLID_90_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop308" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop310" />
+      <midPointStop
+         id="midPointStop312"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop314"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop316"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891"
+       id="XMLID_91_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop323" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop325" />
+      <midPointStop
+         id="midPointStop327"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop329"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop331"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201"
+       id="XMLID_92_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop338" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop340" />
+      <midPointStop
+         id="midPointStop342"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop344"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop346"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909"
+       id="XMLID_93_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop353" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop355" />
+      <midPointStop
+         id="midPointStop357"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop359"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop361"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738"
+       id="XMLID_94_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop370" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop372" />
+      <midPointStop
+         id="midPointStop374"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop376"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop378"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547"
+       id="XMLID_95_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop385" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop387" />
+      <midPointStop
+         id="midPointStop389"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop391"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop393"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409"
+       id="XMLID_96_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop400" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop402" />
+      <midPointStop
+         id="midPointStop404"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop406"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop408"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232"
+       id="XMLID_97_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop415" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop417" />
+      <midPointStop
+         id="midPointStop419"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop421"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop423"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505"
+       id="XMLID_98_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop430" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop432" />
+      <midPointStop
+         id="midPointStop434"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop436"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop438"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396"
+       id="XMLID_99_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop445" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop447" />
+      <midPointStop
+         id="midPointStop449"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop451"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop453"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036"
+       id="XMLID_100_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop460" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop462" />
+      <midPointStop
+         id="midPointStop464"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop466"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop468"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591"
+       id="XMLID_101_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop475" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop477" />
+      <midPointStop
+         id="midPointStop479"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop481"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop483"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415"
+       id="XMLID_102_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop490" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop492" />
+      <midPointStop
+         id="midPointStop494"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop496"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop498"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999"
+       id="XMLID_103_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop505" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop507" />
+      <midPointStop
+         id="midPointStop509"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop511"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop513"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359"
+       id="XMLID_104_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop522" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop524" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop526" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop528" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop530" />
+      <midPointStop
+         id="midPointStop532"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop534"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop536"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201"
+       id="XMLID_105_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop543" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop545" />
+      <midPointStop
+         id="midPointStop547"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop549"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop551"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014"
+       id="XMLID_106_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop563" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop565" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop567" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop569" />
+      <midPointStop
+         id="midPointStop571"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop573"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop575"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303"
+       id="XMLID_107_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop582" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop584" />
+      <midPointStop
+         id="midPointStop586"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop588"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop590"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591"
+       id="XMLID_108_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop597" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop599" />
+      <midPointStop
+         id="midPointStop601"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop603"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop605"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707"
+       id="XMLID_109_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop612" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop614" />
+      <midPointStop
+         id="midPointStop616"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop618"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop620"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641"
+       id="XMLID_110_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop627" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop629" />
+      <midPointStop
+         id="midPointStop631"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop633"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop635"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703"
+       id="XMLID_111_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop642" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop644" />
+      <midPointStop
+         id="midPointStop646"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop648"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop650"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341"
+       id="XMLID_112_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop657" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop659" />
+      <midPointStop
+         id="midPointStop661"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop663"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop665"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137"
+       id="XMLID_113_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop674" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop676" />
+      <midPointStop
+         id="midPointStop678"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop680"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop682"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741"
+       id="XMLID_114_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop689" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop691" />
+      <midPointStop
+         id="midPointStop693"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop695"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop697"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319"
+       id="XMLID_115_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop704" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop706" />
+      <midPointStop
+         id="midPointStop708"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop710"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop712"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791"
+       id="XMLID_116_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop719" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop721" />
+      <midPointStop
+         id="midPointStop723"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop725"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop727"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363"
+       id="XMLID_117_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop734" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop736" />
+      <midPointStop
+         id="midPointStop738"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop740"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop742"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335"
+       id="XMLID_118_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop749" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop751" />
+      <midPointStop
+         id="midPointStop753"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop755"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop757"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021"
+       id="XMLID_119_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop764" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop766" />
+      <midPointStop
+         id="midPointStop768"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop770"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop772"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141"
+       id="XMLID_120_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop779" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop781" />
+      <midPointStop
+         id="midPointStop783"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop785"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop787"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449"
+       id="XMLID_121_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop794" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop796" />
+      <midPointStop
+         id="midPointStop798"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop800"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop802"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159"
+       id="XMLID_122_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop809" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop811" />
+      <midPointStop
+         id="midPointStop813"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop815"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop817"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209"
+       id="XMLID_123_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop826" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop828" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop830" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop832" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop834" />
+      <midPointStop
+         id="midPointStop836"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop838"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop840"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349"
+       id="XMLID_124_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop847" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop849" />
+      <midPointStop
+         id="midPointStop851"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop853"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop855"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001"
+       id="XMLID_125_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop867" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop869" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop871" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop873" />
+      <midPointStop
+         id="midPointStop875"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop877"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop879"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop886" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop888" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281"
+       id="XMLID_127_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop901" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop903" />
+      <midPointStop
+         id="midPointStop905"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop907"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop909"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931"
+       id="XMLID_128_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop916" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop918" />
+      <midPointStop
+         id="midPointStop920"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop922"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop924"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598"
+       id="XMLID_129_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop931" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop933" />
+      <midPointStop
+         id="midPointStop935"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop937"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop939"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231"
+       id="XMLID_130_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop946" />
+      <svg:stop
+         style="stop-color:#c4cbcb;stop-opacity:1"
+         offset="1"
+         id="stop948" />
+      <midPointStop
+         id="midPointStop950"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop952"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop954"
+         style="stop-color:#C4CBCB"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop961" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop963" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228"
+       id="XMLID_132_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop978" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop980" />
+      <midPointStop
+         id="midPointStop982"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop984"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop986"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117"
+       id="XMLID_133_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop993" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop995" />
+      <midPointStop
+         id="midPointStop997"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop999"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1001"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102"
+       id="XMLID_134_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1008" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1010" />
+      <midPointStop
+         id="midPointStop1012"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1014"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1016"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073"
+       id="XMLID_135_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop1023" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1025" />
+      <midPointStop
+         id="midPointStop1027"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1029"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1031"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1038" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop1040" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1053" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop1055" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1068" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1070" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367"
+       id="XMLID_139_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1083" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1085" />
+      <midPointStop
+         id="midPointStop1087"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1089"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1091"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1098" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1100" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337"
+       id="XMLID_141_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop1113" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1115" />
+      <midPointStop
+         id="midPointStop1117"
+         style="stop-color:#B6B6B6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop1119"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1121"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599"
+       id="XMLID_142_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1130" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop1132" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop1134" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop1136" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1138" />
+      <midPointStop
+         id="midPointStop1140"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1142"
+         style="stop-color:#B6B6B6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1144"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097"
+       id="XMLID_143_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1151" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1153" />
+      <midPointStop
+         id="midPointStop1155"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1157"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1159"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       id="XMLID_144_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop1169" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop1171" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop1173" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop1175" />
+      <midPointStop
+         id="midPointStop1177"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1179"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1181"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="linearGradient7061"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7063" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7065" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       id="XMLID_146_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop1190" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1192" />
+      <midPointStop
+         id="midPointStop1194"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1196"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1198"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="linearGradient7072"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop7074" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7076" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       id="XMLID_148_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1207" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1209" />
+      <midPointStop
+         id="midPointStop1211"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1213"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1215"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       id="XMLID_149_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1224" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop1226" />
+      <midPointStop
+         id="midPointStop1228"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1230"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1232"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       id="XMLID_150_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop1239" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1241" />
+      <midPointStop
+         id="midPointStop1243"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1245"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1247"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="linearGradient7091"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7093" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7095" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="linearGradient7098"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7100" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop7102" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#B6B6B6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="linearGradient7105"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7107" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7109" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="linearGradient7112"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop7114" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop7116" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#DADADA"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#DADADA"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       id="XMLID_155_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop1264" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop1266" />
+      <midPointStop
+         id="midPointStop1268"
+         style="stop-color:#B6B6B6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1270"
+         style="stop-color:#B6B6B6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1272"
+         style="stop-color:#F0F0F0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       id="XMLID_156_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop1281" />
+      <svg:stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop1283" />
+      <midPointStop
+         id="midPointStop1285"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1287"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1289"
+         style="stop-color:#94CAFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       id="XMLID_157_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop1296" />
+      <svg:stop
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1"
+         id="stop1298" />
+      <midPointStop
+         id="midPointStop1300"
+         style="stop-color:#FFFFFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1302"
+         style="stop-color:#FFFFFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1304"
+         style="stop-color:#94CAFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="108.9547"
+       x2="171.04311"
+       y1="27.434099"
+       x1="89.522499"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6425"
+       xlink:href="#XMLID_158_"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       id="XMLID_158_"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#99ccff;stop-opacity:1"
+         offset="0"
+         id="stop1311" />
+      <svg:stop
+         style="stop-color:#428aff;stop-opacity:1"
+         offset="1"
+         id="stop1313" />
+      <midPointStop
+         id="midPointStop1315"
+         style="stop-color:#99CCFF"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1317"
+         style="stop-color:#99CCFF"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1319"
+         style="stop-color:#428AFF"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="48.791"
+       x2="48.752899"
+       y1="207.65041"
+       x1="207.6123"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6269-12"
+       xlink:href="#XMLID_80_-300"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       id="XMLID_80_-300"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#2f2f2f;stop-opacity:1"
+         offset="0"
+         id="stop9438" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9440" />
+      <midPointStop
+         id="midPointStop144"
+         style="stop-color:#2f2f2f"
+         offset="0" />
+      <midPointStop
+         id="midPointStop146"
+         style="stop-color:#2f2f2f"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop148"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="193.487"
+       x2="193.901"
+       y1="66.130898"
+       x1="66.544899"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6271-673"
+       xlink:href="#XMLID_81_-401"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="66.544899"
+       y1="66.130898"
+       x2="193.901"
+       y2="193.487"
+       id="XMLID_81_-401"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9444" />
+      <svg:stop
+         style="stop-color:#c5c5c5;stop-opacity:1"
+         offset="1"
+         id="stop9446" />
+      <midPointStop
+         id="midPointStop159"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop161"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop163"
+         style="stop-color:#c5c5c5"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6273-406"
+       xlink:href="#XMLID_82_-773"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_82_-773"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9450" />
+      <svg:stop
+         style="stop-color:#c5c5c5;stop-opacity:1"
+         offset="1"
+         id="stop9452" />
+      <midPointStop
+         id="midPointStop174"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop176"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop178"
+         style="stop-color:#c5c5c5"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6275-166"
+       xlink:href="#XMLID_83_-832"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="148.92191"
+       x2="208.98441"
+       y2="148.92191"
+       id="XMLID_83_-832"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9456" />
+      <svg:stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="0.0562"
+         id="stop9458" />
+      <svg:stop
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0.69660002"
+         id="stop9460" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9462" />
+      <midPointStop
+         id="midPointStop193"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop195"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop197"
+         style="stop-color:#c3c3c3"
+         offset="0.0562" />
+      <midPointStop
+         id="midPointStop199"
+         style="stop-color:#c3c3c3"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop201"
+         style="stop-color:#868686"
+         offset="0.6966" />
+      <midPointStop
+         id="midPointStop203"
+         style="stop-color:#868686"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop205"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="19.067101"
+       x2="69.907303"
+       y1="86.971199"
+       x1="153.97951"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6277-610"
+       xlink:href="#XMLID_84_-677"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="153.97951"
+       y1="86.971199"
+       x2="69.907303"
+       y2="19.067101"
+       id="XMLID_84_-677"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#2f2f2f;stop-opacity:1"
+         offset="0"
+         id="stop9466" />
+      <svg:stop
+         style="stop-color:#868686;stop-opacity:1"
+         offset="1"
+         id="stop9468" />
+      <midPointStop
+         id="midPointStop216"
+         style="stop-color:#2f2f2f"
+         offset="0" />
+      <midPointStop
+         id="midPointStop218"
+         style="stop-color:#2f2f2f"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop220"
+         style="stop-color:#868686"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       r="102.7621"
+       fy="225.54491"
+       fx="160.10159"
+       cy="225.54491"
+       cx="160.10159"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient6279-99"
+       xlink:href="#XMLID_85_-413"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       cx="160.10159"
+       cy="225.54491"
+       r="102.7621"
+       fx="160.10159"
+       fy="225.54491"
+       id="XMLID_85_-413"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9472" />
+      <svg:stop
+         style="stop-color:#535353;stop-opacity:1"
+         offset="1"
+         id="stop9474" />
+      <midPointStop
+         id="midPointStop231"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop233"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop235"
+         style="stop-color:#535353"
+         offset="1" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       y2="62.4673"
+       x2="208.98441"
+       y1="62.4673"
+       x1="47.8223"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6281-27"
+       xlink:href="#XMLID_86_-281"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="47.8223"
+       y1="62.4673"
+       x2="208.98441"
+       y2="62.4673"
+       id="XMLID_86_-281"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#f2f2f2;stop-opacity:1"
+         offset="0"
+         id="stop9478" />
+      <svg:stop
+         style="stop-color:#9b9b9b;stop-opacity:1"
+         offset="1"
+         id="stop9480" />
+      <midPointStop
+         id="midPointStop246"
+         style="stop-color:#f2f2f2"
+         offset="0" />
+      <midPointStop
+         id="midPointStop248"
+         style="stop-color:#f2f2f2"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop250"
+         style="stop-color:#9b9b9b"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="109.9408"
+       x2="133.71049"
+       y1="185.7363"
+       x1="57.915001"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6283-124"
+       xlink:href="#XMLID_87_-7"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="57.915001"
+       y1="185.7363"
+       x2="133.71049"
+       y2="109.9408"
+       id="XMLID_87_-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9484" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9486" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9488" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9490" />
+      <midPointStop
+         id="midPointStop267"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop269"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop271"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="135.90919"
+       x2="116.0225"
+       y1="135.90919"
+       x1="60.370098"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6285-348"
+       xlink:href="#XMLID_88_-910"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.370098"
+       y1="135.90919"
+       x2="116.0225"
+       y2="135.90919"
+       id="XMLID_88_-910"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9494" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9496" />
+      <midPointStop
+         id="midPointStop282"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop284"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop286"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="169.9082"
+       x2="92.127899"
+       y1="169.9082"
+       x1="51.419399"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6287-770"
+       xlink:href="#XMLID_89_-317"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.419399"
+       y1="169.9082"
+       x2="92.127899"
+       y2="169.9082"
+       id="XMLID_89_-317"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9500" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9502" />
+      <midPointStop
+         id="midPointStop297"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop299"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop301"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="180.6895"
+       x2="128.5298"
+       y1="180.6895"
+       x1="83.349098"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6289-142"
+       xlink:href="#XMLID_90_-384"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="83.349098"
+       y1="180.6895"
+       x2="128.5298"
+       y2="180.6895"
+       id="XMLID_90_-384"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9506" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9508" />
+      <midPointStop
+         id="midPointStop312"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop314"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop316"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="143.37891"
+       x2="146.2168"
+       y1="143.37891"
+       x1="68.799301"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6291-78"
+       xlink:href="#XMLID_91_-871"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="68.799301"
+       y1="143.37891"
+       x2="146.2168"
+       y2="143.37891"
+       id="XMLID_91_-871"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9512" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9514" />
+      <midPointStop
+         id="midPointStop327"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop329"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop331"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="160.54201"
+       x2="143.7529"
+       y1="160.54201"
+       x1="57.743198"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6293-824"
+       xlink:href="#XMLID_92_-17"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="57.743198"
+       y1="160.54201"
+       x2="143.7529"
+       y2="160.54201"
+       id="XMLID_92_-17"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9518" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9520" />
+      <midPointStop
+         id="midPointStop342"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop344"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop346"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="145.86909"
+       x2="110.6274"
+       y1="145.86909"
+       x1="45.084499"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6295-851"
+       xlink:href="#XMLID_93_-680"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="45.084499"
+       y1="145.86909"
+       x2="110.6274"
+       y2="145.86909"
+       id="XMLID_93_-680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9524" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9526" />
+      <midPointStop
+         id="midPointStop357"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop359"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop361"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="176.6738"
+       x2="65.547401"
+       y1="141.1396"
+       x1="65.547401"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6297-148"
+       xlink:href="#XMLID_94_-24"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="65.547401"
+       y1="141.1396"
+       x2="65.547401"
+       y2="176.6738"
+       id="XMLID_94_-24"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9530" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9532" />
+      <midPointStop
+         id="midPointStop374"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop376"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop378"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="155.5547"
+       x2="83.372101"
+       y1="155.5547"
+       x1="56.244099"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6299-516"
+       xlink:href="#XMLID_95_-472"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="56.244099"
+       y1="155.5547"
+       x2="83.372101"
+       y2="155.5547"
+       id="XMLID_95_-472"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9536" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9538" />
+      <midPointStop
+         id="midPointStop389"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop391"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop393"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="133.41409"
+       x2="73.045403"
+       y1="133.41409"
+       x1="51.5425"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6301-40"
+       xlink:href="#XMLID_96_-410"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.5425"
+       y1="133.41409"
+       x2="73.045403"
+       y2="133.41409"
+       id="XMLID_96_-410"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9542" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9544" />
+      <midPointStop
+         id="midPointStop404"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop406"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop408"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="164.3232"
+       x2="144.998"
+       y1="164.3232"
+       x1="112.6553"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6303-774"
+       xlink:href="#XMLID_97_-458"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="112.6553"
+       y1="164.3232"
+       x2="144.998"
+       y2="164.3232"
+       id="XMLID_97_-458"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9548" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9550" />
+      <midPointStop
+         id="midPointStop419"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop421"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop423"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="123.7505"
+       x2="73.045403"
+       y1="123.7505"
+       x1="51.702599"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6305-152"
+       xlink:href="#XMLID_98_-723"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="51.702599"
+       y1="123.7505"
+       x2="73.045403"
+       y2="123.7505"
+       id="XMLID_98_-723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9554" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9556" />
+      <midPointStop
+         id="midPointStop434"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop436"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop438"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="117.1396"
+       x2="111.8184"
+       y1="117.1396"
+       x1="68.9487"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6307-705"
+       xlink:href="#XMLID_99_-634"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="68.9487"
+       y1="117.1396"
+       x2="111.8184"
+       y2="117.1396"
+       id="XMLID_99_-634"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9560" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9562" />
+      <midPointStop
+         id="midPointStop449"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop451"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop453"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="121.7036"
+       x2="101.0723"
+       y1="121.7036"
+       x1="43.173302"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6309-493"
+       xlink:href="#XMLID_100_-34"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="43.173302"
+       y1="121.7036"
+       x2="101.0723"
+       y2="121.7036"
+       id="XMLID_100_-34"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9566" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9568" />
+      <midPointStop
+         id="midPointStop464"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop466"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop468"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="181.83591"
+       x2="102.8101"
+       y1="181.83591"
+       x1="64.091797"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6311-389"
+       xlink:href="#XMLID_101_-145"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="64.091797"
+       y1="181.83591"
+       x2="102.8101"
+       y2="181.83591"
+       id="XMLID_101_-145"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9572" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9574" />
+      <midPointStop
+         id="midPointStop479"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop481"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop483"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="102.415"
+       x2="89.291496"
+       y1="116.5332"
+       x1="89.291496"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6313-341"
+       xlink:href="#XMLID_102_-594"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.291496"
+       y1="116.5332"
+       x2="89.291496"
+       y2="102.415"
+       id="XMLID_102_-594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9578" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9580" />
+      <midPointStop
+         id="midPointStop494"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop496"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop498"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="166.78999"
+       x2="103.6514"
+       y1="166.78999"
+       x1="64.091797"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6315-70"
+       xlink:href="#XMLID_103_-322"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="64.091797"
+       y1="166.78999"
+       x2="103.6514"
+       y2="166.78999"
+       id="XMLID_103_-322"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9584" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9586" />
+      <midPointStop
+         id="midPointStop509"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop511"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop513"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="135.68359"
+       x2="121.7998"
+       y1="186.7813"
+       x1="121.7998"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6317-432"
+       xlink:href="#XMLID_104_-426"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="121.7998"
+       y1="186.7813"
+       x2="121.7998"
+       y2="135.68359"
+       id="XMLID_104_-426"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9590" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9592" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9594" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9596" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9598" />
+      <midPointStop
+         id="midPointStop532"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop534"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop536"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="120.8201"
+       x2="107.8923"
+       y1="153.74899"
+       x1="140.8213"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6319-99"
+       xlink:href="#XMLID_105_-588"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="140.8213"
+       y1="153.74899"
+       x2="107.8923"
+       y2="120.8201"
+       id="XMLID_105_-588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9908,-0.1356,0.1356,-0.9908,182.9006,314.4562)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9602" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9604" />
+      <midPointStop
+         id="midPointStop547"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop549"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop551"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="121.5014"
+       x2="174.5889"
+       y1="186.5674"
+       x1="109.5229"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6321-310"
+       xlink:href="#XMLID_106_-902"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="109.5229"
+       y1="186.5674"
+       x2="174.5889"
+       y2="121.5014"
+       id="XMLID_106_-902"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9608" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9610" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9612" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9614" />
+      <midPointStop
+         id="midPointStop571"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop573"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop575"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="141.5303"
+       x2="158.6631"
+       y1="141.5303"
+       x1="112.7676"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6323-611"
+       xlink:href="#XMLID_107_-908"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="112.7676"
+       y1="141.5303"
+       x2="158.6631"
+       y2="141.5303"
+       id="XMLID_107_-908"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9618" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9620" />
+      <midPointStop
+         id="midPointStop586"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop588"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop590"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="173.58591"
+       x2="139.75681"
+       y1="173.58591"
+       x1="106.2578"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6325-800"
+       xlink:href="#XMLID_108_-618"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="106.2578"
+       y1="173.58591"
+       x2="139.75681"
+       y2="173.58591"
+       id="XMLID_108_-618"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9624" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9626" />
+      <midPointStop
+         id="midPointStop601"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop603"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop605"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="184.4707"
+       x2="170.3076"
+       y1="184.4707"
+       x1="132.9424"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6327-400"
+       xlink:href="#XMLID_109_-773"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="132.9424"
+       y1="184.4707"
+       x2="170.3076"
+       y2="184.4707"
+       id="XMLID_109_-773"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9630" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9632" />
+      <midPointStop
+         id="midPointStop616"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop618"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop620"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="149.56641"
+       x2="183.70309"
+       y1="149.56641"
+       x1="119.5918"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6329-40"
+       xlink:href="#XMLID_110_-751"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="119.5918"
+       y1="149.56641"
+       x2="183.70309"
+       y2="149.56641"
+       id="XMLID_110_-751"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9636" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9638" />
+      <midPointStop
+         id="midPointStop631"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop633"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop635"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="165.5703"
+       x2="182.47749"
+       y1="165.5703"
+       x1="111.2227"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6331-210"
+       xlink:href="#XMLID_111_-96"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="111.2227"
+       y1="165.5703"
+       x2="182.47749"
+       y2="165.5703"
+       id="XMLID_111_-96"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9642" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9644" />
+      <midPointStop
+         id="midPointStop646"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop648"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop650"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="151.52341"
+       x2="154.5625"
+       y1="151.52341"
+       x1="100.2744"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6333-446"
+       xlink:href="#XMLID_112_-727"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="100.2744"
+       y1="151.52341"
+       x2="154.5625"
+       y2="151.52341"
+       id="XMLID_112_-727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9648" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9650" />
+      <midPointStop
+         id="midPointStop661"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop663"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop665"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="179.5137"
+       x2="117.7603"
+       y1="146.1875"
+       x1="117.7603"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6335-626"
+       xlink:href="#XMLID_113_-280"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="117.7603"
+       y1="146.1875"
+       x2="117.7603"
+       y2="179.5137"
+       id="XMLID_113_-280"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9654" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9656" />
+      <midPointStop
+         id="midPointStop678"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop680"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop682"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="159.85741"
+       x2="132.4502"
+       y1="159.85741"
+       x1="109.9058"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6337-884"
+       xlink:href="#XMLID_114_-97"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="109.9058"
+       y1="159.85741"
+       x2="132.4502"
+       y2="159.85741"
+       id="XMLID_114_-97"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9660" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9662" />
+      <midPointStop
+         id="midPointStop693"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop695"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop697"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="139.24319"
+       x2="122.7686"
+       y1="139.24319"
+       x1="105.1421"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6339-140"
+       xlink:href="#XMLID_115_-820"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="105.1421"
+       y1="139.24319"
+       x2="122.7686"
+       y2="139.24319"
+       id="XMLID_115_-820"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9666" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9668" />
+      <midPointStop
+         id="midPointStop708"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop710"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop712"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="169.791"
+       x2="183.51759"
+       y1="169.791"
+       x1="156.75"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6341-178"
+       xlink:href="#XMLID_116_-848"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="156.75"
+       y1="169.791"
+       x2="183.51759"
+       y2="169.791"
+       id="XMLID_116_-848"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9672" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9674" />
+      <midPointStop
+         id="midPointStop723"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop725"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop727"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="130.2363"
+       x2="122.7686"
+       y1="130.2363"
+       x1="105.1421"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6343-456"
+       xlink:href="#XMLID_117_-194"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="105.1421"
+       y1="130.2363"
+       x2="122.7686"
+       y2="130.2363"
+       id="XMLID_117_-194"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9678" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9680" />
+      <midPointStop
+         id="midPointStop738"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop740"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop742"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="124.335"
+       x2="155.19341"
+       y1="124.335"
+       x1="119.3262"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6345-512"
+       xlink:href="#XMLID_118_-250"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="119.3262"
+       y1="124.335"
+       x2="155.19341"
+       y2="124.335"
+       id="XMLID_118_-250"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9684" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9686" />
+      <midPointStop
+         id="midPointStop753"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop755"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop757"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="128.2021"
+       x2="146.27341"
+       y1="128.2021"
+       x1="97.902802"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6347-184"
+       xlink:href="#XMLID_119_-606"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="97.902802"
+       y1="128.2021"
+       x2="146.27341"
+       y2="128.2021"
+       id="XMLID_119_-606"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9690" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9692" />
+      <midPointStop
+         id="midPointStop768"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop770"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop772"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="185.19141"
+       x2="148.7822"
+       y1="185.19141"
+       x1="116.7427"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6349-877"
+       xlink:href="#XMLID_120_-395"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="116.7427"
+       y1="185.19141"
+       x2="148.7822"
+       y2="185.19141"
+       id="XMLID_120_-395"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9696" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9698" />
+      <midPointStop
+         id="midPointStop783"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop785"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop787"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="110.5449"
+       x2="136.19341"
+       y1="123.416"
+       x1="136.19341"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6351-447"
+       xlink:href="#XMLID_121_-770"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="136.19341"
+       y1="123.416"
+       x2="136.19341"
+       y2="110.5449"
+       id="XMLID_121_-770"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9702" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9704" />
+      <midPointStop
+         id="midPointStop798"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop800"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop802"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="170.68159"
+       x2="149.4102"
+       y1="170.68159"
+       x1="116.7427"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6353-441"
+       xlink:href="#XMLID_122_-543"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="116.7427"
+       y1="170.68159"
+       x2="149.4102"
+       y2="170.68159"
+       id="XMLID_122_-543"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9708" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9710" />
+      <midPointStop
+         id="midPointStop813"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop815"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop817"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="142.41209"
+       x2="164.56641"
+       y1="190.0674"
+       x1="164.56641"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6355-488"
+       xlink:href="#XMLID_123_-726"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="164.56641"
+       y1="190.0674"
+       x2="164.56641"
+       y2="142.41209"
+       id="XMLID_123_-726"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9714" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9716" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9718" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9720" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9722" />
+      <midPointStop
+         id="midPointStop836"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop838"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop840"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="129.86349"
+       x2="152.1692"
+       y1="159.6348"
+       x1="181.9404"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6357-493"
+       xlink:href="#XMLID_124_-427"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="181.9404"
+       y1="159.6348"
+       x2="152.1692"
+       y2="129.86349"
+       id="XMLID_124_-427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.266,-0.958,1.0022,0.2783,-39.0971,268.1447)">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9726" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9728" />
+      <midPointStop
+         id="midPointStop851"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop853"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop855"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="55.553001"
+       x2="171.70821"
+       y1="138.93359"
+       x1="88.327599"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6359-440"
+       xlink:href="#XMLID_125_-451"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="88.327599"
+       y1="138.93359"
+       x2="171.70821"
+       y2="55.553001"
+       id="XMLID_125_-451"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9732" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9734" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9736" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9738" />
+      <midPointStop
+         id="midPointStop875"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop877"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop879"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.741203"
+       x2="152.7852"
+       y1="84.741203"
+       x1="89.107903"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6361-910"
+       xlink:href="#XMLID_126_-70"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_-70"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9742" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9744" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="120.8281"
+       x2="125.7993"
+       y1="120.8281"
+       x1="79.251503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6363-657"
+       xlink:href="#XMLID_127_-555"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="79.251503"
+       y1="120.8281"
+       x2="125.7993"
+       y2="120.8281"
+       id="XMLID_127_-555"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9748" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9750" />
+      <midPointStop
+         id="midPointStop905"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop907"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop909"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="132.56931"
+       x2="167.68359"
+       y1="132.56931"
+       x1="115.9443"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6365-734"
+       xlink:href="#XMLID_128_-141"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="115.9443"
+       y1="132.56931"
+       x2="167.68359"
+       y2="132.56931"
+       id="XMLID_128_-141"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9754" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9756" />
+      <midPointStop
+         id="midPointStop920"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop922"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop924"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="93.078598"
+       x2="187.3965"
+       y1="93.078598"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6367-266"
+       xlink:href="#XMLID_129_-770"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="93.078598"
+       x2="187.3965"
+       y2="93.078598"
+       id="XMLID_129_-770"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9760" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9762" />
+      <midPointStop
+         id="midPointStop935"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop937"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop939"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="111.2231"
+       x2="184.93159"
+       y1="111.2231"
+       x1="86.376503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6369-690"
+       xlink:href="#XMLID_130_-72"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="86.376503"
+       y1="111.2231"
+       x2="184.93159"
+       y2="111.2231"
+       id="XMLID_130_-72"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9766" />
+      <svg:stop
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1"
+         id="stop9768" />
+      <midPointStop
+         id="midPointStop950"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop952"
+         style="stop-color:#494949"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop954"
+         style="stop-color:#c9c9c9"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="95.561501"
+       x2="146.76559"
+       y1="95.561501"
+       x1="71.667503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6371-381"
+       xlink:href="#XMLID_131_-413"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_-413"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9772" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9774" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="127.8228"
+       x2="95.352097"
+       y1="90.179703"
+       x1="95.352097"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6373-572"
+       xlink:href="#XMLID_132_-722"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="95.352097"
+       y1="90.179703"
+       x2="95.352097"
+       y2="127.8228"
+       id="XMLID_132_-722"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9778" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9780" />
+      <midPointStop
+         id="midPointStop982"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop984"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop986"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="105.5117"
+       x2="115.7422"
+       y1="105.5117"
+       x1="84.628403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6375-640"
+       xlink:href="#XMLID_133_-214"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="84.628403"
+       y1="105.5117"
+       x2="115.7422"
+       y2="105.5117"
+       id="XMLID_133_-214"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9784" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9786" />
+      <midPointStop
+         id="midPointStop997"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop999"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1001"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="82.119102"
+       x2="103.4116"
+       y1="82.119102"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6377-149"
+       xlink:href="#XMLID_134_-535"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="82.119102"
+       x2="103.4116"
+       y2="82.119102"
+       id="XMLID_134_-535"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9790" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9792" />
+      <midPointStop
+         id="midPointStop1012"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1014"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1016"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="115.5073"
+       x2="186.3633"
+       y1="115.5073"
+       x1="149.50391"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6379-302"
+       xlink:href="#XMLID_135_-577"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="149.50391"
+       y1="115.5073"
+       x2="186.3633"
+       y2="115.5073"
+       id="XMLID_135_-577"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0"
+         id="stop9796" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9798" />
+      <midPointStop
+         id="midPointStop1027"
+         style="stop-color:#828282"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1029"
+         style="stop-color:#828282"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1031"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="71.9048"
+       x2="103.4116"
+       y1="71.9048"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6381-329"
+       xlink:href="#XMLID_136_-920"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_-920"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9802" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9804" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="65.025398"
+       x2="147.9727"
+       y1="65.025398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6383-96"
+       xlink:href="#XMLID_137_-11"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_-11"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9808" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9810" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="69.597198"
+       x2="135.6543"
+       y1="69.597198"
+       x1="69.128403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6385-535"
+       xlink:href="#XMLID_138_-837"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_-837"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9814" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9816" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="133.6367"
+       x2="138.1172"
+       y1="133.6367"
+       x1="93.767601"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6387-799"
+       xlink:href="#XMLID_139_-626"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="93.767601"
+       y1="133.6367"
+       x2="138.1172"
+       y2="133.6367"
+       id="XMLID_139_-626"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9820" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9822" />
+      <midPointStop
+         id="midPointStop1087"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1089"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1091"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="49.432598"
+       x2="122.0112"
+       y1="64.238297"
+       x1="122.0112"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6389-597"
+       xlink:href="#XMLID_140_-645"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_-645"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9826" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9828" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="117.5337"
+       x2="139.0508"
+       y1="117.5337"
+       x1="93.767601"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6391-867"
+       xlink:href="#XMLID_141_-860"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="93.767601"
+       y1="117.5337"
+       x2="139.0508"
+       y2="117.5337"
+       id="XMLID_141_-860"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0.6124"
+         id="stop9832" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9834" />
+      <midPointStop
+         id="midPointStop1117"
+         style="stop-color:#b6b6b6"
+         offset="0.6124" />
+      <midPointStop
+         id="midPointStop1119"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1121"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.952599"
+       x2="159.9014"
+       y1="138.9736"
+       x1="159.9014"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6393-952"
+       xlink:href="#XMLID_142_-935"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="159.9014"
+       y1="138.9736"
+       x2="159.9014"
+       y2="84.952599"
+       id="XMLID_142_-935"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9838" />
+      <svg:stop
+         style="stop-color:#cacaca;stop-opacity:1"
+         offset="0.1974"
+         id="stop9840" />
+      <svg:stop
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="0.47440001"
+         id="stop9842" />
+      <svg:stop
+         style="stop-color:#ececec;stop-opacity:1"
+         offset="0.74510002"
+         id="stop9844" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9846" />
+      <midPointStop
+         id="midPointStop1140"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1142"
+         style="stop-color:#b6b6b6"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1144"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="67.852097"
+       x2="143.1671"
+       y1="104.6089"
+       x1="179.9238"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6395-649"
+       xlink:href="#XMLID_143_-216"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="179.9238"
+       y1="104.6089"
+       x2="143.1671"
+       y2="67.852097"
+       id="XMLID_143_-216"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9850" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9852" />
+      <midPointStop
+         id="midPointStop1155"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1157"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1159"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="40.555302"
+       x2="158.21181"
+       y1="103.3657"
+       x1="95.401398"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6397-611"
+       xlink:href="#XMLID_144_-323"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="95.401398"
+       y1="103.3657"
+       x2="158.21181"
+       y2="40.555302"
+       id="XMLID_144_-323"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0"
+         id="stop9856" />
+      <svg:stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0.1654"
+         id="stop9858" />
+      <svg:stop
+         style="stop-color:#5d5d5d;stop-opacity:1"
+         offset="0.59490001"
+         id="stop9860" />
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="1"
+         id="stop9862" />
+      <midPointStop
+         id="midPointStop1177"
+         style="stop-color:#494949"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1179"
+         style="stop-color:#494949"
+         offset="0.3051" />
+      <midPointStop
+         id="midPointStop1181"
+         style="stop-color:#616161"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="84.741203"
+       x2="152.7852"
+       y1="84.741203"
+       x1="89.107903"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6399-909"
+       xlink:href="#XMLID_126_-463"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.107903"
+       y1="84.741203"
+       x2="152.7852"
+       y2="84.741203"
+       id="XMLID_126_-463"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9866" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9868" />
+      <midPointStop
+         id="midPointStop890"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop892"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop894"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="83.484398"
+       x2="187.3965"
+       y1="83.484398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6401-54"
+       xlink:href="#XMLID_146_-485"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="83.484398"
+       x2="187.3965"
+       y2="83.484398"
+       id="XMLID_146_-485"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#616161;stop-opacity:1"
+         offset="0"
+         id="stop9872" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9874" />
+      <midPointStop
+         id="midPointStop1194"
+         style="stop-color:#616161"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1196"
+         style="stop-color:#616161"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1198"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="95.561501"
+       x2="146.76559"
+       y1="95.561501"
+       x1="71.667503"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6403-766"
+       xlink:href="#XMLID_131_-578"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="71.667503"
+       y1="95.561501"
+       x2="146.76559"
+       y2="95.561501"
+       id="XMLID_131_-578"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9878" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9880" />
+      <midPointStop
+         id="midPointStop965"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop967"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop969"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="86.965302"
+       x2="146.76559"
+       y1="86.965302"
+       x1="86.275398"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6405-525"
+       xlink:href="#XMLID_148_-757"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="86.275398"
+       y1="86.965302"
+       x2="146.76559"
+       y2="86.965302"
+       id="XMLID_148_-757"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9884" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9886" />
+      <midPointStop
+         id="midPointStop1211"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1213"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1215"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="93.951698"
+       x2="111.7031"
+       y1="93.951698"
+       x1="89.539101"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6407-181"
+       xlink:href="#XMLID_149_-599"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="89.539101"
+       y1="93.951698"
+       x2="111.7031"
+       y2="93.951698"
+       id="XMLID_149_-599"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9890" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="0.75840002"
+         id="stop9892" />
+      <midPointStop
+         id="midPointStop1228"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1230"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1232"
+         style="stop-color:#828282"
+         offset="0.7584" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="80.275902"
+       x2="103.4116"
+       y1="80.275902"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6409-208"
+       xlink:href="#XMLID_150_-191"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="80.275902"
+       x2="103.4116"
+       y2="80.275902"
+       id="XMLID_150_-191"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9896" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9898" />
+      <midPointStop
+         id="midPointStop1243"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1245"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1247"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="71.9048"
+       x2="103.4116"
+       y1="71.9048"
+       x1="78.984901"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6411-385"
+       xlink:href="#XMLID_136_-980"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="78.984901"
+       y1="71.9048"
+       x2="103.4116"
+       y2="71.9048"
+       id="XMLID_136_-980"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9902" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9904" />
+      <midPointStop
+         id="midPointStop1042"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1044"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1046"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="65.025398"
+       x2="147.9727"
+       y1="65.025398"
+       x1="98.694298"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6413-883"
+       xlink:href="#XMLID_137_-482"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="98.694298"
+       y1="65.025398"
+       x2="147.9727"
+       y2="65.025398"
+       id="XMLID_137_-482"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9908" />
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="1"
+         id="stop9910" />
+      <midPointStop
+         id="midPointStop1057"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1059"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1061"
+         style="stop-color:#b6b6b6"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="69.597198"
+       x2="135.6543"
+       y1="69.597198"
+       x1="69.128403"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6415-860"
+       xlink:href="#XMLID_138_-859"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="69.128403"
+       y1="69.597198"
+       x2="135.6543"
+       y2="69.597198"
+       id="XMLID_138_-859"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9914" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9916" />
+      <midPointStop
+         id="midPointStop1072"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1074"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1076"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="49.432598"
+       x2="122.0112"
+       y1="64.238297"
+       x1="122.0112"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6417-680"
+       xlink:href="#XMLID_140_-471"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="122.0112"
+       y1="64.238297"
+       x2="122.0112"
+       y2="49.432598"
+       id="XMLID_140_-471"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0"
+         id="stop9920" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9922" />
+      <midPointStop
+         id="midPointStop1102"
+         style="stop-color:#dadada"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1104"
+         style="stop-color:#dadada"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1106"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="68.5233"
+       x2="143.8383"
+       y1="98.137199"
+       x1="173.4521"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6419-21"
+       xlink:href="#XMLID_155_-978"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="173.4521"
+       y1="98.137199"
+       x2="143.8383"
+       y2="68.5233"
+       id="XMLID_155_-978"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#b6b6b6;stop-opacity:1"
+         offset="0"
+         id="stop9926" />
+      <svg:stop
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1"
+         id="stop9928" />
+      <midPointStop
+         id="midPointStop1268"
+         style="stop-color:#b6b6b6"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1270"
+         style="stop-color:#b6b6b6"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1272"
+         style="stop-color:#f0f0f0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="159.00591"
+       x2="118.7616"
+       y1="159.00591"
+       x1="60.097198"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6421-714"
+       xlink:href="#XMLID_156_-100"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.097198"
+       y1="159.00591"
+       x2="118.7616"
+       y2="159.00591"
+       id="XMLID_156_-100"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9932" />
+      <svg:stop
+         style="stop-color:#c0c0c0;stop-opacity:1"
+         offset="1"
+         id="stop9934" />
+      <midPointStop
+         id="midPointStop1285"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1287"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1289"
+         style="stop-color:#c0c0c0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="147.877"
+       x2="118.7651"
+       y1="147.877"
+       x1="60.098598"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6423-931"
+       xlink:href="#XMLID_157_-792"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       x1="60.098598"
+       y1="147.877"
+       x2="118.7651"
+       y2="147.877"
+       id="XMLID_157_-792"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop9938" />
+      <svg:stop
+         style="stop-color:#c0c0c0;stop-opacity:1"
+         offset="1"
+         id="stop9940" />
+      <midPointStop
+         id="midPointStop1300"
+         style="stop-color:#ffffff"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1302"
+         style="stop-color:#ffffff"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1304"
+         style="stop-color:#c0c0c0"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_158_-583"
+       id="linearGradient7705-647"
+       gradientUnits="userSpaceOnUse"
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547" />
+    <svg:linearGradient
+       x1="89.522499"
+       y1="27.434099"
+       x2="171.04311"
+       y2="108.9547"
+       id="XMLID_158_-583"
+       gradientUnits="userSpaceOnUse">
+      <svg:stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="0"
+         id="stop9944" />
+      <svg:stop
+         style="stop-color:#828282;stop-opacity:1"
+         offset="1"
+         id="stop9946" />
+      <midPointStop
+         id="midPointStop1315"
+         style="stop-color:#c3c3c3"
+         offset="0" />
+      <midPointStop
+         id="midPointStop1317"
+         style="stop-color:#c3c3c3"
+         offset="0.5" />
+      <midPointStop
+         id="midPointStop1319"
+         style="stop-color:#828282"
+         offset="1" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7135"
+       y2="48.791"
+       x2="48.752899"
+       y1="207.65041"
+       x1="207.6123">
+      <svg:stop
+         id="stop7137"
+         offset="0"
+         style="stop-color:#2f2f2f;stop-opacity:1" />
+      <svg:stop
+         id="stop7139"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#2f2f2f"
+         id="midPointStop144" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#2f2f2f"
+         id="midPointStop146" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop148" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7142"
+       y2="193.487"
+       x2="193.901"
+       y1="66.130898"
+       x1="66.544899">
+      <svg:stop
+         id="stop7144"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7146"
+         offset="1"
+         style="stop-color:#c5c5c5;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop159" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop161" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c5c5c5"
+         id="midPointStop163" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7149"
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223">
+      <svg:stop
+         id="stop7151"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7153"
+         offset="1"
+         style="stop-color:#c5c5c5;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop174" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop176" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c5c5c5"
+         id="midPointStop178" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7156"
+       y2="148.92191"
+       x2="208.98441"
+       y1="148.92191"
+       x1="47.8223">
+      <svg:stop
+         id="stop7158"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7160"
+         offset="0.0562"
+         style="stop-color:#c3c3c3;stop-opacity:1" />
+      <svg:stop
+         id="stop7162"
+         offset="0.69660002"
+         style="stop-color:#868686;stop-opacity:1" />
+      <svg:stop
+         id="stop7164"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop193" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop195" />
+      <midPointStop
+         offset="0.0562"
+         style="stop-color:#c3c3c3"
+         id="midPointStop197" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#c3c3c3"
+         id="midPointStop199" />
+      <midPointStop
+         offset="0.6966"
+         style="stop-color:#868686"
+         id="midPointStop201" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#868686"
+         id="midPointStop203" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop205" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7167"
+       y2="19.067101"
+       x2="69.907303"
+       y1="86.971199"
+       x1="153.97951">
+      <svg:stop
+         id="stop7169"
+         offset="0"
+         style="stop-color:#2f2f2f;stop-opacity:1" />
+      <svg:stop
+         id="stop7171"
+         offset="1"
+         style="stop-color:#868686;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#2f2f2f"
+         id="midPointStop216" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#2f2f2f"
+         id="midPointStop218" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#868686"
+         id="midPointStop220" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       gradientTransform="matrix(1,0,0,0.9358,0,8.5616)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient7174"
+       fy="225.54491"
+       fx="160.10159"
+       r="102.7621"
+       cy="225.54491"
+       cx="160.10159">
+      <svg:stop
+         id="stop7176"
+         offset="0"
+         style="stop-color:#828282;stop-opacity:1" />
+      <svg:stop
+         id="stop7178"
+         offset="1"
+         style="stop-color:#535353;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#828282"
+         id="midPointStop231" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#828282"
+         id="midPointStop233" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#535353"
+         id="midPointStop235" />
+    </svg:radialGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7181"
+       y2="62.4673"
+       x2="208.98441"
+       y1="62.4673"
+       x1="47.8223">
+      <svg:stop
+         id="stop7183"
+         offset="0"
+         style="stop-color:#f2f2f2;stop-opacity:1" />
+      <svg:stop
+         id="stop7185"
+         offset="1"
+         style="stop-color:#9b9b9b;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#f2f2f2"
+         id="midPointStop246" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#f2f2f2"
+         id="midPointStop248" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#9b9b9b"
+         id="midPointStop250" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7629"
+       y2="40.555302"
+       x2="158.21181"
+       y1="103.3657"
+       x1="95.401398">
+      <svg:stop
+         id="stop7631"
+         offset="0"
+         style="stop-color:#494949;stop-opacity:1" />
+      <svg:stop
+         id="stop7633"
+         offset="0.1654"
+         style="stop-color:#505050;stop-opacity:1" />
+      <svg:stop
+         id="stop7635"
+         offset="0.59490001"
+         style="stop-color:#5d5d5d;stop-opacity:1" />
+      <svg:stop
+         id="stop7637"
+         offset="1"
+         style="stop-color:#616161;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#494949"
+         id="midPointStop1177" />
+      <midPointStop
+         offset="0.3051"
+         style="stop-color:#494949"
+         id="midPointStop1179" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#616161"
+         id="midPointStop1181" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7641"
+       y2="83.484398"
+       x2="187.3965"
+       y1="83.484398"
+       x1="98.694298">
+      <svg:stop
+         id="stop7643"
+         offset="0"
+         style="stop-color:#616161;stop-opacity:1" />
+      <svg:stop
+         id="stop7645"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#616161"
+         id="midPointStop1194" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#616161"
+         id="midPointStop1196" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1198" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7649"
+       y2="86.965302"
+       x2="146.76559"
+       y1="86.965302"
+       x1="86.275398">
+      <svg:stop
+         id="stop7651"
+         offset="0"
+         style="stop-color:#b6b6b6;stop-opacity:1" />
+      <svg:stop
+         id="stop7653"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1211" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1213" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1215" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7657"
+       y2="93.951698"
+       x2="111.7031"
+       y1="93.951698"
+       x1="89.539101">
+      <svg:stop
+         id="stop7659"
+         offset="0"
+         style="stop-color:#dadada;stop-opacity:1" />
+      <svg:stop
+         id="stop7661"
+         offset="0.75840002"
+         style="stop-color:#828282;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#dadada"
+         id="midPointStop1228" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#dadada"
+         id="midPointStop1230" />
+      <midPointStop
+         offset="0.7584"
+         style="stop-color:#828282"
+         id="midPointStop1232" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7664"
+       y2="80.275902"
+       x2="103.4116"
+       y1="80.275902"
+       x1="78.984901">
+      <svg:stop
+         id="stop7666"
+         offset="0"
+         style="stop-color:#dadada;stop-opacity:1" />
+      <svg:stop
+         id="stop7668"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#dadada"
+         id="midPointStop1243" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#dadada"
+         id="midPointStop1245" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1247" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7676"
+       y2="68.5233"
+       x2="143.8383"
+       y1="98.137199"
+       x1="173.4521">
+      <svg:stop
+         id="stop7678"
+         offset="0"
+         style="stop-color:#b6b6b6;stop-opacity:1" />
+      <svg:stop
+         id="stop7680"
+         offset="1"
+         style="stop-color:#f0f0f0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1268" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#b6b6b6"
+         id="midPointStop1270" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#f0f0f0"
+         id="midPointStop1272" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7684"
+       y2="159.00591"
+       x2="118.7616"
+       y1="159.00591"
+       x1="60.097198">
+      <svg:stop
+         id="stop7686"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7688"
+         offset="1"
+         style="stop-color:#c0c0c0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop1285" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop1287" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c0c0c0"
+         id="midPointStop1289" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7691"
+       y2="147.877"
+       x2="118.7651"
+       y1="147.877"
+       x1="60.098598">
+      <svg:stop
+         id="stop7693"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <svg:stop
+         id="stop7695"
+         offset="1"
+         style="stop-color:#c0c0c0;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#ffffff"
+         id="midPointStop1300" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#ffffff"
+         id="midPointStop1302" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#c0c0c0"
+         id="midPointStop1304" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7698"
+       y2="108.9547"
+       x2="171.04311"
+       y1="27.434099"
+       x1="89.522499">
+      <svg:stop
+         id="stop7700"
+         offset="0"
+         style="stop-color:#c3c3c3;stop-opacity:1" />
+      <svg:stop
+         id="stop7702"
+         offset="1"
+         style="stop-color:#828282;stop-opacity:1" />
+      <midPointStop
+         offset="0"
+         style="stop-color:#c3c3c3"
+         id="midPointStop1315" />
+      <midPointStop
+         offset="0.5"
+         style="stop-color:#c3c3c3"
+         id="midPointStop1317" />
+      <midPointStop
+         offset="1"
+         style="stop-color:#828282"
+         id="midPointStop1319" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_80_-300"
+       id="linearGradient11771"
+       gradientUnits="userSpaceOnUse"
+       x1="207.6123"
+       y1="207.65041"
+       x2="48.752899"
+       y2="48.791"
+       gradientTransform="matrix(0.2916,0,0,0.307402,7.6022656,8.757456)" />
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3918">
+      <svg:rect
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         id="rect3920"
+         width="68"
+         height="68"
+         x="14"
+         y="14"
+         rx="3"
+         ry="3" />
+    </svg:clipPath>
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4354">
+      <svg:rect
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         id="rect4356"
+         width="68"
+         height="68"
+         x="-36"
+         y="14"
+         rx="3"
+         ry="3" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4244">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.56844"
+         id="feGaussianBlur4246" />
+    </svg:filter>
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4259"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       id="linearGradient7450">
+      <svg:stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop7452" />
+      <svg:stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop7454" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient4261"
+       gradientUnits="userSpaceOnUse"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905" />
+    <svg:linearGradient
+       id="linearGradient6119">
+      <svg:stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop6121" />
+      <svg:stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop6123" />
+    </svg:linearGradient>
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4255"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       id="linearGradient6126">
+      <svg:stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop6128" />
+      <svg:stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop6130" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187-1"
+       id="linearGradient4257"
+       gradientUnits="userSpaceOnUse"
+       x1="73.194839"
+       y1="34.162155"
+       x2="49.625214"
+       y2="19.183952" />
+    <svg:linearGradient
+       id="linearGradient3187-1">
+      <svg:stop
+         id="stop3189-0"
+         offset="0"
+         style="stop-color:#656565;stop-opacity:1;" />
+      <svg:stop
+         id="stop3191-1"
+         offset="1"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7809">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8596875"
+         id="feGaussianBlur7811" />
+    </svg:filter>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7813">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.4521875"
+         id="feGaussianBlur7815" />
+    </svg:filter>
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4350">
+      <svg:rect
+         ry="3"
+         rx="3"
+         y="14"
+         x="84"
+         height="68"
+         width="68"
+         id="rect4352"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4325">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.439999"
+         id="feGaussianBlur4327" />
+    </svg:filter>
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient4338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62429531,-0.62429531,0.39740012,0.39740012,57.190344,56.707013)"
+       cx="56.055019"
+       cy="55.978848"
+       fx="56.055019"
+       fy="55.978848"
+       r="52.251602" />
+    <svg:linearGradient
+       id="linearGradient6145">
+      <svg:stop
+         style="stop-color:#e3e3e3;stop-opacity:1;"
+         offset="0"
+         id="stop6147" />
+      <svg:stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop6149" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4282"
+       id="linearGradient4340"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606059,0,0,0.68606059,75.974088,5.5532361)"
+       x1="50.760078"
+       y1="42.239994"
+       x2="113.84038"
+       y2="130.51231" />
+    <svg:linearGradient
+       id="linearGradient4282">
+      <svg:stop
+         id="stop4284"
+         offset="0"
+         style="stop-color:#e8e8e8;stop-opacity:1;" />
+      <svg:stop
+         id="stop4286"
+         offset="1"
+         style="stop-color:#828282;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient4342"
+       gradientUnits="userSpaceOnUse"
+       x1="80.875443"
+       y1="82.61515"
+       x2="82.573708"
+       y2="84.937546" />
+    <svg:linearGradient
+       id="linearGradient3298">
+      <svg:stop
+         id="stop3300"
+         offset="0"
+         style="stop-color:#f9f9f9;stop-opacity:1;" />
+      <svg:stop
+         id="stop3302"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter7542">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.063379309"
+         id="feGaussianBlur7544" />
+    </svg:filter>
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       x1="82.312332"
+       y1="85.362457"
+       x2="81.312866"
+       y2="82.651672" />
+    <svg:linearGradient
+       id="linearGradient6162">
+      <svg:stop
+         id="stop6164"
+         offset="0"
+         style="stop-color:#f9f9f9;stop-opacity:1;" />
+      <svg:stop
+         id="stop6166"
+         offset="1"
+         style="stop-color:#3c3c3c;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4290">
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path4292"
+         d="m 81.775868,33.016836 -1.698553,4.060937 -0.488099,2.909037 0.09754,1.112853 -4.392827,0.566188 -0.195242,-1.073807 -1.21047,-2.694274 -2.694273,-3.494749 -2.752856,0.741902 -0.585712,4.353794 0.292856,2.948084 0.370947,1.034757 -4.080463,1.698564 -0.468561,-0.995709 -1.874287,-2.284278 -3.514259,-2.674751 -2.459999,1.425232 0.566189,4.373317 1.034765,2.752847 0.624758,0.917615 -3.494751,2.694276 -0.722386,-0.839521 -2.401417,-1.737612 -4.080448,-1.659517 -2.010947,2.010945 1 [...]
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4278">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8909375"
+         id="feGaussianBlur4280" />
+    </svg:filter>
+    <svg:clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4300">
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path4302"
+         d="m 81.882329,32.767073 -1.713399,4.09643 -0.492364,2.934461 0.09839,1.12258 -4.431221,0.571136 -0.196948,-1.083191 -1.22105,-2.717823 -2.717821,-3.525293 -2.776916,0.748386 -0.590831,4.391847 0.295416,2.97385 0.374189,1.043801 -4.116126,1.71341 -0.472656,-1.004412 -1.890669,-2.304242 -3.544973,-2.698129 -2.481501,1.437688 0.571138,4.41154 1.043809,2.776907 0.630218,0.925635 -3.525294,2.717824 -0.7287,-0.846858 -2.422406,-1.752799 -4.116111,-1.674021 -2.028522,2.028521 1.693705 [...]
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </svg:clipPath>
+    <svg:filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4308">
+      <svg:feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.8975"
+         id="feGaussianBlur4310" />
+    </svg:filter>
+    <svg:linearGradient
+       gradientTransform="matrix(0.68606063,0,0,0.68375842,4.2424239,5.7272471)"
+       y2="8.550745"
+       x2="60.777386"
+       y1="115.27915"
+       x1="60.777386"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3880"
+       xlink:href="#linearGradient3234"
+       inkscape:collect="always" />
+    <svg:linearGradient
+       id="linearGradient3234">
+      <svg:stop
+         id="stop3236"
+         offset="0"
+         style="stop-color:#232323;stop-opacity:1;" />
+      <svg:stop
+         id="stop3238"
+         offset="1"
+         style="stop-color:#4b4b4b;stop-opacity:1;" />
+    </svg:linearGradient>
+    <svg:linearGradient
+       y2="8.550745"
+       x2="60.777386"
+       y1="115.27915"
+       x1="60.777386"
+       gradientTransform="matrix(0.68606063,0,0,0.68375842,2.617574,4.1334971)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6198"
+       xlink:href="#linearGradient3234"
+       inkscape:collect="always" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient8128"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62429531,-0.62429531,0.39740012,0.39740012,57.190344,56.707013)"
+       cx="56.055019"
+       cy="55.978848"
+       fx="56.055019"
+       fy="55.978848"
+       r="52.251602" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4282"
+       id="linearGradient8130"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606059,0,0,0.68606059,75.974088,5.5532361)"
+       x1="50.760078"
+       y1="42.239994"
+       x2="113.84038"
+       y2="130.51231" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient8132"
+       gradientUnits="userSpaceOnUse"
+       x1="80.875443"
+       y1="82.61515"
+       x2="82.573708"
+       y2="84.937546" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient8134"
+       gradientUnits="userSpaceOnUse"
+       x1="82.312332"
+       y1="85.362457"
+       x2="81.312866"
+       y2="82.651672" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3234"
+       id="linearGradient8138"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606063,0,0,0.68375842,-104.75758,12.727247)"
+       x1="60.777386"
+       y1="115.27915"
+       x2="60.777386"
+       y2="8.550745" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient8140"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187-1"
+       id="linearGradient8142"
+       gradientUnits="userSpaceOnUse"
+       x1="73.194839"
+       y1="34.162155"
+       x2="49.625214"
+       y2="19.183952" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient8144"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient8146"
+       gradientUnits="userSpaceOnUse"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient6597"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62429531,-0.62429531,0.39740012,0.39740012,57.190344,56.707013)"
+       cx="56.055019"
+       cy="55.978848"
+       fx="56.055019"
+       fy="55.978848"
+       r="52.251602" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4282"
+       id="linearGradient6599"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606059,0,0,0.68606059,75.974088,5.5532361)"
+       x1="50.760078"
+       y1="42.239994"
+       x2="113.84038"
+       y2="130.51231" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient6601"
+       gradientUnits="userSpaceOnUse"
+       x1="80.875443"
+       y1="82.61515"
+       x2="82.573708"
+       y2="84.937546" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient6603"
+       gradientUnits="userSpaceOnUse"
+       x1="82.312332"
+       y1="85.362457"
+       x2="81.312866"
+       y2="82.651672" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient6605"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187-1"
+       id="linearGradient6607"
+       gradientUnits="userSpaceOnUse"
+       x1="73.194839"
+       y1="34.162155"
+       x2="49.625214"
+       y2="19.183952" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient6609"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient6611"
+       gradientUnits="userSpaceOnUse"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient6628"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62429531,-0.62429531,0.39740012,0.39740012,57.190344,56.707013)"
+       cx="56.055019"
+       cy="55.978848"
+       fx="56.055019"
+       fy="55.978848"
+       r="52.251602" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4282"
+       id="linearGradient6630"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68606059,0,0,0.68606059,75.974088,5.5532361)"
+       x1="50.760078"
+       y1="42.239994"
+       x2="113.84038"
+       y2="130.51231" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient6632"
+       gradientUnits="userSpaceOnUse"
+       x1="80.875443"
+       y1="82.61515"
+       x2="82.573708"
+       y2="84.937546" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3298"
+       id="linearGradient6634"
+       gradientUnits="userSpaceOnUse"
+       x1="82.312332"
+       y1="85.362457"
+       x2="81.312866"
+       y2="82.651672" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient6636"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3187-1"
+       id="linearGradient6638"
+       gradientUnits="userSpaceOnUse"
+       x1="73.194839"
+       y1="34.162155"
+       x2="49.625214"
+       y2="19.183952" />
+    <svg:radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="radialGradient6640"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9999932,0.00368562,-0.00209882,0.5694577,0.00342469,0.4534116)"
+       cx="48.969208"
+       cy="1.4732536"
+       fx="48.969208"
+       fy="1.4732536"
+       r="83.476051" />
+    <svg:linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7450"
+       id="linearGradient6642"
+       gradientUnits="userSpaceOnUse"
+       x1="39.291836"
+       y1="18.784508"
+       x2="77.519737"
+       y2="37.810905" />
+  </svg:defs>
+  <svg:metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </svg:metadata>
+  <svg:g
+     sodipodi:insensitive="true"
+     style="display:none"
+     inkscape:label="Blur Shadow"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <svg:rect
+       clip-path="url(#clipPath3625)"
+       ry="6"
+       rx="6"
+       y="7"
+       x="5"
+       height="85"
+       width="86"
+       id="rect3745"
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+  </svg:g>
+  <svg:g
+     sodipodi:insensitive="true"
+     inkscape:label="Shadow"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3786"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3778"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3770"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3723"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3716"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </svg:g>
+  <svg:g
+     style="display:none"
+     sodipodi:insensitive="true"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Button with border">
+    <svg:rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419"
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3726"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3629"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3728"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615" />
+    <svg:rect
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2841"
+       width="84"
+       height="84"
+       x="6"
+       y="106"
+       rx="6"
+       ry="6" />
+    <svg:rect
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect3634"
+       width="76"
+       height="76"
+       x="10"
+       y="110"
+       rx="4"
+       ry="4" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       transform="translate(-110,0)"
+       id="rect3647"
+       clip-path="url(#clipPath3649)"
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3709"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="path3707"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </svg:g>
+  <svg:g
+     sodipodi:insensitive="true"
+     style="display:inline"
+     inkscape:label="Button"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <svg:rect
+       ry="6"
+       rx="6"
+       y="6"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2419-9"
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       id="rect3728-4"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+    <svg:path
+       inkscape:connector-curvature="0"
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       id="path3615-6" />
+  </svg:g>
+  <svg:g
+     style="display:none"
+     sodipodi:insensitive="true"
+     inkscape:label="Highlight"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <svg:rect
+       clip-path="url(#clipPath3613)"
+       ry="12"
+       rx="12"
+       y="15"
+       x="15"
+       height="66"
+       width="66"
+       id="rect3171"
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+  </svg:g>
+  <svg:g
+     style="display:inline"
+     inkscape:label="Symbol"
+     id="layer6"
+     inkscape:groupmode="layer">
+    <svg:rect
+       transform="matrix(0,1,1,0,0,0)"
+       y="104"
+       x="0"
+       height="16"
+       width="16"
+       id="rect3897"
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <svg:text
+       sodipodi:linespacing="125%"
+       id="text3907"
+       y="48"
+       x="104"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><svg:tspan
+         y="48"
+         x="104"
+         id="tspan3909"
+         sodipodi:role="line">Shadow opacity : 30, 15, 10, (8)</svg:tspan></svg:text>
+    <svg:rect
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3911"
+       width="16"
+       height="16"
+       x="-40"
+       y="104"
+       transform="matrix(0,-1,1,0,0,0)" />
+    <svg:text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="32"
+       id="text3951"
+       sodipodi:linespacing="125%"><svg:tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="124"
+         y="32">Bevel opacity : 30 / 10</svg:tspan></svg:text>
+    <svg:text
+       sodipodi:linespacing="125%"
+       id="text3955"
+       y="8"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><svg:tspan
+         y="8"
+         x="124"
+         id="tspan3957"
+         sodipodi:role="line">Bevel opacity : 75 / 15</svg:tspan></svg:text>
+    <svg:g
+       style="display:inline"
+       id="g4329"
+       transform="translate(-70.62485,-0.59375)"
+       clip-path="url(#clipPath4350)">
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path4312"
+         d="m 131.78125,29.59375 -0.125,0.3125 -1.15625,2.78125 -0.0312,0.0625 0,0.03125 -0.34375,2 0,0.0625 0,0.0625 0.0312,0.3125 -2.09375,0.25 -0.0312,-0.25 0,-0.0625 L 128,35.09375 127.15625,33.25 127.125,33.1875 127.09375,33.125 125.25,30.75 l -0.1875,-0.28125 -0.34375,0.09375 -1.875,0.5 -0.34375,0.09375 -0.0312,0.34375 -0.40625,2.96875 0,0.0625 0,0.0625 0.21875,2.03125 0,0.0625 0,0.0625 0.0937,0.25 -1.90625,0.78125 -0.125,-0.21875 L 120.3125,37.5 120.28125,37.4375 119,35.875 l -0.0 [...]
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4325);enable-background:acc [...]
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path6159"
+         d="m 132.12562,28.089748 -1.16672,2.789418 -0.33527,1.998189 0.067,0.764408 -3.01739,0.388909 -0.13411,-0.737587 -0.83146,-1.850671 -1.85067,-2.400509 -1.89091,0.509605 -0.40232,2.990579 0.20116,2.02501 0.2548,0.710765 -2.80283,1.166727 -0.32185,-0.683943 -1.28743,-1.569048 -2.41391,-1.837261 -1.68975,0.978978 0.38891,3.003989 0.71077,1.890904 0.42914,0.630301 -2.40051,1.850672 -0.4962,-0.576659 -1.64951,-1.193549 -2.80282,-1.139906 -1.3813,1.381299 1.15331,2.789418 1.18014,1.64 [...]
+         style="fill:url(#radialGradient6628);fill-opacity:1;stroke:url(#linearGradient6630);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <svg:path
+         transform="matrix(2.2107174,0,0,2.2107174,-47.74347,-122.1214)"
+         d="m 83.038866,84.007065 c 0,0.683038 -0.553712,1.236749 -1.23675,1.236749 -0.683037,0 -1.236749,-0.553711 -1.236749,-1.236749 0,-0.683038 0.553712,-1.236749 1.236749,-1.236749 0.683038,0 1.23675,0.553711 1.23675,1.236749 z"
+         sodipodi:ry="1.2367492"
+         sodipodi:rx="1.2367492"
+         sodipodi:cy="84.007065"
+         sodipodi:cx="81.802116"
+         id="path7458"
+         style="fill:#b8b8b8;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient6632);stroke-width:0.45234182;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <svg:path
+         sodipodi:type="arc"
+         style="fill:none;stroke:#ffffff;stroke-width:0.08989587;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter7542)"
+         id="path7536"
+         sodipodi:cx="81.802116"
+         sodipodi:cy="84.007065"
+         sodipodi:rx="1.2367492"
+         sodipodi:ry="1.2367492"
+         d="m 83.038866,84.007065 c 0,0.683038 -0.553712,1.236749 -1.23675,1.236749 -0.683037,0 -1.236749,-0.553711 -1.236749,-1.236749 0,-0.683038 0.553712,-1.236749 1.236749,-1.236749 0.683038,0 1.23675,0.553711 1.23675,1.236749 z"
+         transform="matrix(22.247964,0,0,22.247964,-1686.8327,-1805.3916)" />
+      <svg:path
+         sodipodi:type="arc"
+         style="fill:none;stroke:url(#linearGradient6634);stroke-width:0.34587052;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="path7546"
+         sodipodi:cx="81.802116"
+         sodipodi:cy="84.007065"
+         sodipodi:rx="1.2367492"
+         sodipodi:ry="1.2367492"
+         d="m 83.038866,84.007065 c 0,0.683038 -0.553712,1.236749 -1.23675,1.236749 -0.683037,0 -1.236749,-0.553711 -1.236749,-1.236749 0,-0.683038 0.553712,-1.236749 1.236749,-1.236749 0.683038,0 1.23675,0.553711 1.23675,1.236749 z"
+         transform="matrix(5.7825105,0,0,5.7825105,-339.9237,-422.17725)" />
+      <svg:path
+         clip-path="url(#clipPath4290)"
+         transform="matrix(0.68689029,0,0,0.68689029,75.95457,5.4108038)"
+         d="m 108,40.53125 -2.625,2 -0.0312,0.0625 -1.03125,1.25 -19.28125,39.96875 44.5625,11.21875 -0.0937,-0.0625 -2.3125,-1.03125 -0.0625,0 -1.03125,-0.21875 a 1.235193,1.235193 0 0 1 -0.96875,-1.375 l 0.59375,-4.375 a 1.235193,1.235193 0 0 1 1.3125,-1.0625 l 0.875,0.0625 2.78125,-0.46875 0.0312,0 3.03125,-1.28125 0,-1.25 -3.09375,-1.28125 -2.75,-0.46875 -0.0625,0 L 127,82.28125 a 1.235193,1.235193 0 0 1 -1.28125,-1.0625 l -0.59375,-4.375 a 1.235193,1.235193 0 0 1 1,-1.375 l 0.96875, [...]
+         id="path7663"
+         style="opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter4278)"
+         inkscape:original="M 107.90625 39.0625 L 104.40625 41.75 L 103.25 43.15625 L 83.28125 84.59375 L 64.25 79.78125 C 63.861716 81.324053 63.65625 82.928843 63.65625 84.59375 C 63.65625 86.188701 63.82787 87.733839 64.1875 89.21875 L 48.40625 96.46875 C 47.13527 92.741898 46.4375 88.748046 46.4375 84.59375 C 46.4375 81.476038 46.831697 78.45458 47.5625 75.5625 L 33.09375 71.90625 L 32.90625 72.5625 L 36.40625 75.28125 L 39.09375 76.5 L 40.1875 76.6875 L 39.59375 81.0625 L 38.5 81 L  [...]
+         inkscape:radius="-1.2350695"
+         sodipodi:type="inkscape:offset" />
+      <svg:path
+         clip-path="url(#clipPath4300)"
+         transform="matrix(0.68093886,0,0,0.68093886,76.36876,5.7773746)"
+         d="m 82.5625,33.9375 -1.375,3.28125 -0.4375,2.5 0,0.0625 0.09375,1.0625 a 1.0934898,1.0934898 0 0 1 -0.96875,1.1875 l -4.40625,0.5625 A 1.0934898,1.0934898 0 0 1 74.28125,41.6875 L 74.15625,40.875 74.125,40.8125 73,38.3125 70.8125,35.5 69.5,35.84375 l -0.5,3.5625 0.28125,2.625 0.3125,0.90625 A 1.0934898,1.0934898 0 0 1 69,44.3125 l -4.0625,1.71875 A 1.0934898,1.0934898 0 0 1 63.5,45.5 L 63.0625,44.5625 63.03125,44.5 l -1.625,-1.9375 -2.875,-2.1875 -1.1875,0.6875 0.4375,3.5625 0. [...]
+         id="path7661"
+         style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter4308)"
+         inkscape:original="M 81.84375 32.84375 L 80.15625 36.90625 L 79.65625 39.8125 L 79.75 40.9375 L 75.34375 41.5 L 75.15625 40.4375 L 73.9375 37.75 L 71.25 34.25 L 68.5 34.96875 L 67.90625 39.34375 L 68.1875 42.28125 L 68.5625 43.3125 L 64.5 45.03125 L 64.03125 44.03125 L 62.15625 41.75 L 58.625 39.0625 L 56.15625 40.5 L 56.71875 44.875 L 57.75 47.625 L 58.375 48.53125 L 54.875 51.25 L 54.15625 50.40625 L 51.75 48.65625 L 47.6875 47 L 45.65625 49 L 47.34375 53.09375 L 49.0625 55.5  [...]
+         inkscape:radius="-1.0933805"
+         sodipodi:type="inkscape:offset" />
+    </svg:g>
+    <svg:g
+       style="display:inline;fill:#00ff00"
+       id="g4248"
+       transform="translate(50.37515,0.40625)"
+       clip-path="url(#clipPath4354)">
+      <svg:path
+         inkscape:connector-curvature="0"
+         id="path4226"
+         d="m -35.40625,-27.28125 -0.3125,0.03125 -0.125,0.28125 -1.28125,3.03125 0,0.0625 -0.0312,0.0625 -0.34375,2.1875 0,0.0625 0,0.0625 0.0312,0.34375 -2.34375,0.3125 -0.0625,-0.34375 0,-0.0625 -0.0312,-0.0625 -0.9375,-2 0,-0.0625 -0.0625,-0.03125 -2,-2.59375 -0.1875,-0.28125 -0.34375,0.09375 -2.0625,0.5625 -0.3125,0.09375 -0.0625,0.3125 -0.40625,3.28125 -0.0312,0.0625 0.0312,0.0625 0.21875,2.1875 0,0.0625 0.0312,0.03125 0.125,0.375 -2.15625,0.875 -0.15625,-0.3125 -0.0312,-0.03125 -0 [...]
+         style="fill:#00ff00;fill-opacity:1;stroke:none;filter:url(#filter4244)" />
+      <svg:g
+         inkscape:label="Gear24"
+         transform="matrix(0.33201642,0.32957802,-0.32957802,0.33201642,-34.178641,9.9231531)"
+         id="g2645"
+         style="fill:#00ff00;fill-opacity:1;stroke:url(#linearGradient6642);stroke-width:1.45759726000000001">
+        <svg:path
+           inkscape:connector-curvature="0"
+           id="path2647"
+           transform="matrix(1.4665021,0,0,1.4665021,-26.232091,-12.972501)"
+           d="m 16.34375,-47.5625 -1.875,4.4375 -0.5,3.1875 0.09375,1.1875 -4.78125,0.625 -0.21875,-1.1875 -1.34375,-2.9375 -2.9375,-3.78125 -3,0.78125 -0.625,4.78125 0.3125,3.1875 0.40625,1.15625 -4.46875,1.84375 -0.5,-1.09375 -2.0625,-2.5 -3.8125,-2.90625 -2.6875,1.5625 0.59375,4.75 1.15625,3.03125 0.6875,0.96875 -3.84375,2.9375 -0.78125,-0.90625 -2.625,-1.875 -4.4375,-1.84375 -2.1875,2.21875 1.8125,4.4375 1.875,2.625 0.9375,0.78125 -2.9375,3.8125 -1,-0.6875 -3.03125,-1.125 -4.75,-0.62 [...]
+           style="fill:#00ff00;fill-opacity:1;stroke:url(#linearGradient6638);stroke-width:1.45759737000000000" />
+      </svg:g>
+      <svg:path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccc"
+         id="path7797"
+         d="m 17.875,-29.21875 c 12.794439,0 24.064539,6.390407 30.96875,16.09375 L 55.375,-17.34375 52.65625,-20.875 c -0.648143,-0.846832 -0.524897,-2.051902 0.28125,-2.75 l 0.75,-0.625 1.59375,-2.21875 1.21875,-3 -0.28125,-0.28125 -2.9375,1.21875 -2.34375,1.65625 -0.5625,0.65625 c -0.698098,0.806147 -1.903168,0.929393 -2.75,0.28125 L 43.78125,-28.875 C 31.788135,-55.428895 -61.66477,-21.332002 17.875,-29.21875 z M 48.84375,30.8125 C 41.939539,40.515843 30.669439,46.90625 17.875,46.906 [...]
+         style="opacity:0.20000000000000001;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter7809)"
+         transform="matrix(0.48690276,0.48332687,-0.48332687,0.48690276,-38.612674,-3.0294512)" />
+      <svg:path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccsccccccccccccccccccccccccccccccccc"
+         id="path7803"
+         d="m 59.5,-9.5625 -6.5625,3.25 c 2.020989,4.6571765 3.21875,9.7663981 3.21875,15.15625 C 56.156249,14.233601 54.958489,19.342823 52.9375,24 l 6.5625,3.25 1.34375,-3.21875 c 0.446258,-1.090854 1.669216,-1.640498 2.78125,-1.25 l 0.96875,0.34375 2.53125,0.25 3.09375,-0.4375 0.0625,-0.15625 -2.40625,-1.8125 -2.5,-1.15625 -0.9375,-0.15625 c -1.169193,-0.219106 -1.955971,-1.323355 -1.78125,-2.5 L 63.3125,12.375 c 0.159005,-1.165761 1.202451,-2.003264 2.375,-1.90625 l 0.9375,0.0625 2.7 [...]
+         style="opacity:0.50000000000000000;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter7813)"
+         transform="matrix(0.48690276,0.48332687,-0.48332687,0.48690276,-38.612674,-3.0294512)" />
+    </svg:g>
+  </svg:g>
+</svg:svg>
diff --git a/interface/images/menu/system-run_old.svg b/interface/images/menu/system-run_old.svg
new file mode 100755
index 0000000..90c8783
--- /dev/null
+++ b/interface/images/menu/system-run_old.svg
@@ -0,0 +1,805 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="system-run.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2848"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3697">
+      <rect
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3699"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2927"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3309"
+       id="linearGradient3804"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3309"
+       y2="122.8994"
+       x2="63.9995"
+       y1="3.1001"
+       x1="63.9995">
+      <stop
+         offset="0"
+         style="stop-color:#f6f6f6;stop-opacity:1"
+         id="stop3311" />
+      <stop
+         offset="1"
+         style="stop-color:#d2d2d2;stop-opacity:1"
+         id="stop3313" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3397"
+       id="linearGradient3806"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="37.201294"
+       y1="1"
+       x2="37.201294"
+       y2="45" />
+    <linearGradient
+       id="linearGradient3397">
+      <stop
+         offset="0"
+         style="stop-color:#aaa;stop-opacity:1"
+         id="stop3399" />
+      <stop
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1"
+         id="stop3401" />
+    </linearGradient>
+    <linearGradient
+       y2="45.017357"
+       x2="20.758585"
+       y1="1"
+       x1="20.758585"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2940"
+       xlink:href="#linearGradient3309"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.47268421,0.12665535,0.12665535,-0.47268421,44.47921,74.733655)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective2842"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3180"
+       x1="-13"
+       y1="17.008953"
+       x2="-13"
+       y2="-0.70032859"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4083" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop4085" />
+    </linearGradient>
+    <linearGradient
+       y2="-0.70032859"
+       x2="-13"
+       y1="17.008953"
+       x1="-13"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2851"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3692"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3697"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3701"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,62.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3016"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3257"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3259" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3261" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3264"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3266" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3268" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3271"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3273" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3275" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3278"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3280" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3282" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3289"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-2"
+       id="linearGradient3188-2"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-2">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-0" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-2"
+       id="radialGradient3619-5"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.7892197"
+     inkscape:cx="-23.597347"
+     inkscape:cy="67.61635"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer10"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1029"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3289);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725-6);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer10"
+     inkscape:label="Button"
+     style="display:inline">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-3"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-2);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-3"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-2"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-5);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Symbol"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.84703869"
+       inkscape:original="M 43.25 18.90625 C 41.837851 18.90625 40.71875 20.070026 40.71875 21.46875 L 40.71875 23.5625 C 39.811005 23.856925 38.927077 24.193566 38.09375 24.625 L 36.59375 23.15625 C 35.634211 22.196713 34.008333 22.147908 33.03125 23.125 L 29.125 27.03125 C 28.147836 28.008337 28.196737 29.634235 29.15625 30.59375 L 30.625 32.09375 C 30.193568 32.927075 29.856927 33.811006 29.5625 34.71875 L 27.46875 34.71875 C 26.070022 34.71875 24.90625 35.837852 24.90625 37.25 L 24.9 [...]
+       style="opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate"
+       id="path3714"
+       d="m 43.25,18.0625 c -1.877522,0 -3.375,1.555723 -3.375,3.40625 l 0,1.53125 c -0.539589,0.189719 -1.069021,0.413062 -1.59375,0.65625 L 37.1875,22.5625 c -1.287677,-1.287674 -3.430728,-1.350534 -4.75,-0.03125 l -3.90625,3.90625 c -1.31939,1.319286 -1.256393,3.462355 0.03125,4.75 l 1.09375,1.09375 C 29.413063,32.805979 29.189719,33.335412 29,33.875 l -1.53125,0 c -1.85053,0 -3.40625,1.497481 -3.40625,3.375 l 0,5.5 c 0,1.877519 1.55572,3.375 3.40625,3.375 l 1.53125,0 c 0.189719,0.539 [...]
+       transform="translate(0,1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.1044033"
+       inkscape:original="M 43.25 20 C 42.462899 20 41.8125 20.668201 41.8125 21.46875 L 41.8125 24.28125 C 40.40512 24.656231 39.074157 25.221906 37.84375 25.9375 L 35.8125 23.9375 C 35.246428 23.371429 34.369055 23.34969 33.8125 23.90625 L 29.90625 27.8125 C 29.349644 28.369062 29.371428 29.246427 29.9375 29.8125 L 31.9375 31.84375 C 31.22191 33.074153 30.656239 34.405116 30.28125 35.8125 L 27.46875 35.8125 C 26.668202 35.8125 26 36.462904 26 37.25 L 26 42.75 C 26 43.537096 26.668202 4 [...]
+       style="opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate"
+       id="path3710"
+       d="m 43.25,18.90625 c -1.412149,0 -2.53125,1.163776 -2.53125,2.5625 l 0,2.09375 c -0.907745,0.294425 -1.791673,0.631066 -2.625,1.0625 l -1.5,-1.46875 C 35.634211,22.196713 34.008333,22.147908 33.03125,23.125 L 29.125,27.03125 c -0.977164,0.977087 -0.928263,2.602985 0.03125,3.5625 l 1.46875,1.5 c -0.431432,0.833325 -0.768073,1.717256 -1.0625,2.625 l -2.09375,0 c -1.398728,0 -2.5625,1.119102 -2.5625,2.53125 l 0,5.5 c 0,1.412148 1.163772,2.53125 2.5625,2.53125 l 2.09375,0 c 0.294427, [...]
+       transform="translate(0,1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0"
+       inkscape:original="M 43.25 20 C 42.462899 20 41.8125 20.668201 41.8125 21.46875 L 41.8125 24.28125 C 40.40512 24.656231 39.074157 25.221906 37.84375 25.9375 L 35.8125 23.9375 C 35.246428 23.371429 34.369055 23.34969 33.8125 23.90625 L 29.90625 27.8125 C 29.349644 28.369062 29.371428 29.246427 29.9375 29.8125 L 31.9375 31.84375 C 31.22191 33.074153 30.656239 34.405116 30.28125 35.8125 L 27.46875 35.8125 C 26.668202 35.8125 26 36.462904 26 37.25 L 26 42.75 C 26 43.537096 26.668202 4 [...]
+       style="opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate"
+       id="path3703"
+       d="m 43.25,20 c -0.787101,0 -1.4375,0.668201 -1.4375,1.46875 l 0,2.8125 c -1.40738,0.374981 -2.738343,0.940656 -3.96875,1.65625 l -2.03125,-2 c -0.566072,-0.566071 -1.443445,-0.58781 -2,-0.03125 l -3.90625,3.90625 c -0.556606,0.556562 -0.534822,1.433927 0.03125,2 l 2,2.03125 c -0.71559,1.230403 -1.281261,2.561366 -1.65625,3.96875 l -2.8125,0 C 26.668202,35.8125 26,36.462904 26,37.25 l 0,5.5 c 0,0.787096 0.668202,1.4375 1.46875,1.4375 l 2.8125,0 c 0.374989,1.407383 0.94066,2.738347 [...]
+       transform="translate(0,1)" />
+    <path
+       d="m 43.238378,59.999996 c -0.787101,0 -1.424421,-0.652935 -1.424421,-1.453484 l 0,-2.819759 c -1.40738,-0.37498 -2.752137,-0.941381 -3.982544,-1.656972 l -2.005812,2.005807 c -0.28304,0.283037 -0.622087,0.432943 -0.988367,0.436047 -0.366278,0.0032 -0.739159,-0.128697 -1.017437,-0.406976 l -3.92441,-3.924408 c -0.556555,-0.55656 -0.537002,-1.439735 0.02902,-2.005809 l 2.005811,-2.005808 c -0.71559,-1.230403 -1.281987,-2.575163 -1.656976,-3.982546 l -2.819756,0 C 26.652938,44.18608 [...]
+       id="rect3267"
+       style="fill:url(#linearGradient3665);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
+    <path
+       style="fill:url(#linearGradient3669);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate"
+       id="path3667"
+       d="m 54.610333,76.688349 c -0.399955,-0.107167 -0.6349,-0.525721 -0.525901,-0.932511 l 0.383924,-1.432823 c -0.664087,-0.382164 -1.270289,-0.853068 -1.798074,-1.384211 l -1.292326,0.746122 c -0.18236,0.105287 -0.375055,0.135292 -0.561599,0.087 -0.186559,-0.04823 -0.35807,-0.166033 -0.461584,-0.345329 l -1.45981,-2.528464 c -0.207029,-0.358586 -0.07684,-0.804699 0.28785,-1.015273 l 1.292328,-0.746125 C 50.279025,68.414095 50.17433,67.653651 50.175409,66.887451 L 48.742586,66.503528 [...]
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate"
+       d="m 43.25,20 c -0.787101,0 -1.4375,0.668201 -1.4375,1.46875 l 0,1 C 41.8125,21.668201 42.462899,21 43.25,21 l 5.5,0 c 0.787093,0 1.4375,0.668201 1.4375,1.46875 l 0,-1 C 50.1875,20.668201 49.537093,20 48.75,20 l -5.5,0 z m -8.4375,3.5 c -0.359672,-0.0066 -0.721722,0.12797 -1,0.40625 l -3.90625,3.90625 c -0.40122,0.401188 -0.499571,0.970931 -0.3125,1.46875 0.06739,-0.169364 0.173348,-0.32961 0.3125,-0.46875 l 3.90625,-3.90625 c 0.556555,-0.55656 1.433928,-0.534821 2,0.03125 l 2.031 [...]
+       id="path3716" />
+  </g>
+</svg>
diff --git a/interface/images/menu/unit.svg b/interface/images/menu/unit.svg
new file mode 100755
index 0000000..a6ef04a
--- /dev/null
+++ b/interface/images/menu/unit.svg
@@ -0,0 +1,708 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   version="1.0"
+   sodipodi:docname="unit2.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9492233"
+     inkscape:cx="15.863342"
+     inkscape:cy="51.597005"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="876"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       id="g11193"
+       transform="matrix(0.77781746,0.77781746,-0.77781746,0.77781746,48.320487,-25.8849)">
+      <rect
+         style="fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97200274;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="rect2953"
+         width="69.841393"
+         height="13.865276"
+         x="12.254339"
+         y="41.715046" />
+      <g
+         id="g3915"
+         transform="matrix(0.79363694,0,0,0.40441347,-50.185568,-76.208435)">
+        <rect
+           y="291.13647"
+           x="81.923424"
+           height="19.539055"
+           width="1.8688529"
+           id="rect3725"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26172054;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3727"
+           width="1.9424537"
+           height="9.7122679"
+           x="92.504929"
+           y="291.0997" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3729"
+           width="1.9424537"
+           height="9.7122679"
+           x="87.195778"
+           y="291.0997" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3731"
+           width="1.9424537"
+           height="9.7122679"
+           x="97.814087"
+           y="291.0997" />
+        <rect
+           y="291.0997"
+           x="103.12324"
+           height="9.7122679"
+           width="1.9424537"
+           id="rect3733"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26172054;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3765"
+           width="1.8688529"
+           height="19.539055"
+           x="108.46919"
+           y="291.13647" />
+        <rect
+           y="291.0997"
+           x="119.0507"
+           height="9.7122679"
+           width="1.9424537"
+           id="rect3767"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <rect
+           y="291.0997"
+           x="113.74155"
+           height="9.7122679"
+           width="1.9424537"
+           id="rect3769"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <rect
+           y="291.0997"
+           x="124.35986"
+           height="9.7122679"
+           width="1.9424537"
+           id="rect3771"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3773"
+           width="1.9424537"
+           height="9.7122679"
+           x="129.66901"
+           y="291.0997" />
+        <rect
+           y="291.13647"
+           x="135.01497"
+           height="19.539055"
+           width="1.8688529"
+           id="rect3779"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26172054;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3781"
+           width="1.9424537"
+           height="9.7122679"
+           x="145.59648"
+           y="291.0997" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3783"
+           width="1.9424537"
+           height="9.7122679"
+           x="140.28732"
+           y="291.0997" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3785"
+           width="1.9424537"
+           height="9.7122679"
+           x="150.90564"
+           y="291.0997" />
+        <rect
+           y="291.0997"
+           x="156.21478"
+           height="9.7122679"
+           width="1.9424537"
+           id="rect3787"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.18811963;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+        <rect
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26172054;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="rect3907"
+           width="1.8688529"
+           height="19.539055"
+           x="161.56073"
+           y="291.13651" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/user-trash.svg b/interface/images/menu/user-trash.svg
new file mode 100755
index 0000000..9877aef
--- /dev/null
+++ b/interface/images/menu/user-trash.svg
@@ -0,0 +1,1323 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="user-trash.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2410">
+    <filter
+       inkscape:collect="always"
+       id="filter3276">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.56241694"
+         id="feGaussianBlur3278" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3348"
+       x1="60.413662"
+       y1="106.16137"
+       x2="46.921165"
+       y2="110.65887"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3316"
+       x1="43.245415"
+       y1="104.21532"
+       x2="48.193569"
+       y2="93.471298"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3300"
+       x1="66.740204"
+       y1="63.588692"
+       x2="75.281227"
+       y2="80.814972"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3324"
+       x1="52.105541"
+       y1="76.541229"
+       x2="61.130371"
+       y2="68.295815"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4368">
+      <stop
+         style="stop-color:#828282;stop-opacity:1;"
+         offset="0"
+         id="stop4370" />
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="1"
+         id="stop4372" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3340"
+       x1="82.855774"
+       y1="87.433334"
+       x2="86.748848"
+       y2="97.972473"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4360">
+      <stop
+         style="stop-color:#6e6e6e;stop-opacity:1;"
+         offset="0"
+         id="stop4362" />
+      <stop
+         style="stop-color:#8c8c8c;stop-opacity:1;"
+         offset="1"
+         id="stop4364" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3308"
+       x1="87.228699"
+       y1="103.55167"
+       x2="69.920662"
+       y2="103.55167"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient7105">
+      <stop
+         style="stop-color:#515151;stop-opacity:1;"
+         offset="0"
+         id="stop7107" />
+      <stop
+         id="stop7113"
+         offset="1"
+         style="stop-color:#272727;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7105"
+       id="radialGradient3354"
+       cx="65.547707"
+       cy="32.811893"
+       fx="65.547707"
+       fy="32.811893"
+       r="51.413425"
+       gradientTransform="matrix(0.4586549,-2.5902411e-8,1.2820624e-8,0.2816917,17.665932,21.191203)"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3279"
+       x="-0.050590749"
+       width="1.1011815"
+       y="-0.12198729"
+       height="1.2439746">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.7481104"
+         id="feGaussianBlur3281" />
+    </filter>
+    <linearGradient
+       id="linearGradient7097">
+      <stop
+         style="stop-color:#919191;stop-opacity:1;"
+         offset="0"
+         id="stop7099" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop7101" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7097"
+       id="linearGradient7103"
+       x1="48.22263"
+       y1="13.313221"
+       x2="48.22263"
+       y2="47.795158"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient7199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1254206,0,0,1,11.126779,0)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="110.67213" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient7195"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.395672,0,0,1,93.069348,0.3533661)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="176.64893" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient7191"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1998529,0,0,1,104.41153,0)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="68.695473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient7187"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0930404,0,0,1,41.128914,-128.35336)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="120.63893" />
+    <linearGradient
+       id="linearGradient7175">
+      <stop
+         id="stop7177"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop7179"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient7173"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3535534,0,0,1,3.710354,-128)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="70.167" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient7169"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.497582,0,0,1,9.4515996,-128)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="68.695473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient7165"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.4045417,0,0,1,45.750253,-128)"
+       x1="26.98472"
+       y1="54.295403"
+       x2="26.98472"
+       y2="96.039551"
+       spreadMethod="reflect" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient7155">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop7157" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop7159" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient7161"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="110.74494"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(63.60424,0)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3296">
+      <path
+         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="M -9.75,-12.1875 L -9.75,137.75 L 154.65625,137.75 L 154.65625,-12.1875 L -9.75,-12.1875 z M 64,14.09375 C 87.183698,14.09375 106,22.111403 106,32 C 106,41.888596 87.183695,49.90625 64,49.90625 C 40.816309,49.906249 22,41.888597 22,32 C 22,22.111403 40.816305,14.09375 64,14.09375 z"
+         id="path3298" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient3172">
+      <stop
+         style="stop-color:#a0a0a0;stop-opacity:1;"
+         offset="0"
+         id="stop3174" />
+      <stop
+         id="stop3188"
+         offset="0.1362071"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+      <stop
+         id="stop3180"
+         offset="0.3023597"
+         style="stop-color:#f5f5f5;stop-opacity:1;" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="0.61225069"
+         id="stop3190" />
+      <stop
+         style="stop-color:#b4b4b4;stop-opacity:1;"
+         offset="1"
+         id="stop3176" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3172"
+       id="linearGradient2501"
+       gradientUnits="userSpaceOnUse"
+       x1="5"
+       y1="64"
+       x2="123"
+       y2="64"
+       gradientTransform="translate(-107.78807,47.404826)" />
+    <linearGradient
+       id="ButtonColor"
+       x1="58.650177"
+       y1="122"
+       x2="58.650177"
+       y2="5.4252338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-1.1034483,-1.1034483)">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.15625;"
+         offset="0"
+         id="stop3189" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3191" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonColor"
+       id="linearGradient7085"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0172414,0,0,1.0172414,-28.89152,46.301378)"
+       x1="58.650177"
+       y1="122"
+       x2="58.650177"
+       y2="5.4252338" />
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#69a9e6;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3172"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3179"
+       x="-0.29508197"
+       width="1.5901639"
+       y="-0.46153845"
+       height="1.9230769">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="6.6964288"
+         id="feGaussianBlur3181" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonColor"
+       id="linearGradient3482"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7097"
+       id="linearGradient3515"
+       gradientUnits="userSpaceOnUse"
+       x1="48.22263"
+       y1="13.313221"
+       x2="48.22263"
+       y2="47.795158" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonColor"
+       id="linearGradient3531"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonColor"
+       id="linearGradient3536"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3592"
+       gradientUnits="userSpaceOnUse"
+       x1="87.228699"
+       y1="103.55167"
+       x2="69.920662"
+       y2="103.55167" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3594"
+       gradientUnits="userSpaceOnUse"
+       x1="82.855774"
+       y1="87.433334"
+       x2="86.748848"
+       y2="97.972473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3596"
+       gradientUnits="userSpaceOnUse"
+       x1="52.105541"
+       y1="76.541229"
+       x2="61.130371"
+       y2="68.295815" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3598"
+       gradientUnits="userSpaceOnUse"
+       x1="66.740204"
+       y1="63.588692"
+       x2="75.281227"
+       y2="80.814972" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3600"
+       gradientUnits="userSpaceOnUse"
+       x1="43.245415"
+       y1="104.21532"
+       x2="48.193569"
+       y2="93.471298" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3602"
+       gradientUnits="userSpaceOnUse"
+       x1="60.413662"
+       y1="106.16137"
+       x2="46.921165"
+       y2="110.65887" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3613"
+       gradientUnits="userSpaceOnUse"
+       x1="87.228699"
+       y1="103.55167"
+       x2="69.920662"
+       y2="103.55167" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3615"
+       gradientUnits="userSpaceOnUse"
+       x1="82.855774"
+       y1="87.433334"
+       x2="86.748848"
+       y2="97.972473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3617"
+       gradientUnits="userSpaceOnUse"
+       x1="52.105541"
+       y1="76.541229"
+       x2="61.130371"
+       y2="68.295815" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3619"
+       gradientUnits="userSpaceOnUse"
+       x1="66.740204"
+       y1="63.588692"
+       x2="75.281227"
+       y2="80.814972" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3621"
+       gradientUnits="userSpaceOnUse"
+       x1="43.245415"
+       y1="104.21532"
+       x2="48.193569"
+       y2="93.471298" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3623"
+       gradientUnits="userSpaceOnUse"
+       x1="60.413662"
+       y1="106.16137"
+       x2="46.921165"
+       y2="110.65887" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3659"
+       gradientUnits="userSpaceOnUse"
+       x1="87.228699"
+       y1="103.55167"
+       x2="69.920662"
+       y2="103.55167" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3661"
+       gradientUnits="userSpaceOnUse"
+       x1="82.855774"
+       y1="87.433334"
+       x2="86.748848"
+       y2="97.972473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3663"
+       gradientUnits="userSpaceOnUse"
+       x1="52.105541"
+       y1="76.541229"
+       x2="61.130371"
+       y2="68.295815" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3665"
+       gradientUnits="userSpaceOnUse"
+       x1="66.740204"
+       y1="63.588692"
+       x2="75.281227"
+       y2="80.814972" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4360"
+       id="linearGradient3667"
+       gradientUnits="userSpaceOnUse"
+       x1="43.245415"
+       y1="104.21532"
+       x2="48.193569"
+       y2="93.471298" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4368"
+       id="linearGradient3669"
+       gradientUnits="userSpaceOnUse"
+       x1="60.413662"
+       y1="106.16137"
+       x2="46.921165"
+       y2="110.65887" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7097"
+       id="linearGradient3273"
+       gradientUnits="userSpaceOnUse"
+       x1="48.22263"
+       y1="13.313221"
+       x2="48.22263"
+       y2="47.795158" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4388"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(8.9015891e-2,0,0,0.709739,11.943011,2.4513075)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="110.67213" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4391"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2808238,0,0,0.709739,70.100848,2.7021052)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="176.64893" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4394"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1418434,0,0,0.709739,78.150836,2.4513075)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="68.695473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4397"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7757734,0,0,0.709739,33.236696,-93.548693)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="120.63893" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4400"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9606696,0,0,0.709739,6.6792845,-93.297899)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="70.167" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4403"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3531534,0,0,-0.709739,10.75407,93.297899)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="68.695473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4406"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.287119,0,0,-0.709739,36.51664,93.297899)"
+       spreadMethod="reflect"
+       x1="26.98472"
+       y1="54.295403"
+       x2="26.98472"
+       y2="96.039551" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4412"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.709739,0,0,0.709739,49.188311,2.4513075)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="110.74494" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4478"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.287119,0,0,-0.709739,36.51664,93.297899)"
+       spreadMethod="reflect"
+       x1="26.98472"
+       y1="54.295403"
+       x2="26.98472"
+       y2="96.039551" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4480"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3531534,0,0,-0.709739,10.75407,93.297899)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="68.695473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4482"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9606696,0,0,0.709739,6.6792845,-93.297899)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="70.167" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4484"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7757734,0,0,0.709739,33.236696,-93.548693)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="120.63893" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4486"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1418434,0,0,0.709739,78.150836,2.4513075)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="68.695473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4488"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2808238,0,0,0.709739,70.100848,2.7021052)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="176.64893" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4490"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(8.9015891e-2,0,0,0.709739,11.943011,2.4513075)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="110.67213" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4493"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(8.9015891e-2,0,0,0.709739,11.943011,2.4513075)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="110.67213" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4496"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2808238,0,0,0.709739,70.100848,2.7021052)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="176.64893" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4499"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1418434,0,0,0.709739,78.150836,2.4513075)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="68.695473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4502"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7757734,0,0,-0.709739,33.236696,93.548693)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="120.63893" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7175"
+       id="linearGradient4505"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9606696,0,0,0.709739,6.6792845,-93.297899)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="70.167" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4508"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3531534,0,0,-0.709739,10.75407,93.297899)"
+       x1="26.98472"
+       y1="5"
+       x2="26.98472"
+       y2="68.695473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7155"
+       id="linearGradient4511"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.287119,0,0,-0.709739,36.51664,93.297899)"
+       spreadMethod="reflect"
+       x1="26.98472"
+       y1="54.295403"
+       x2="26.98472"
+       y2="96.039551" />
+    <inkscape:perspective
+       id="perspective2884"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-6"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-6">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-4" />
+    </linearGradient>
+    <radialGradient
+       r="42"
+       fy="90.171875"
+       fx="48"
+       cy="90.171875"
+       cx="48"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2893"
+       xlink:href="#linearGradient3737-6"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective2877"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3026"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2886"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2888" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2890" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2893"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2895" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2897" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2900"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2902" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2904" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient2907"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2909" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop2911" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2918"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6"
+     inkscape:cx="-43.076603"
+     inkscape:cy="30.991606"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer5"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1023"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.99097413"
+       inkscape:original="M 12 -94.03125 C 7.028367 -94.03125 2.96875 -89.971633 2.96875 -85 L 2.96875 -14 C 2.96875 -9.0283671 7.0283671 -4.96875 12 -4.96875 L 84 -4.96875 C 88.971633 -4.96875 93.03125 -9.028367 93.03125 -14 L 93.03125 -85 C 93.03125 -89.971633 88.971633 -94.03125 84 -94.03125 L 12 -94.03125 z "
+       style="opacity:0.07999998;fill:url(#linearGradient2918);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3786"
+       d="m 12,-95.03125 c -5.5110903,0 -10.03125,4.52016 -10.03125,10.03125 l 0,71 c 0,5.5110902 4.5201598,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.5201597 10.03125,-10.03125 l 0,-71 c 0,-5.51109 -4.52016,-10.03125 -10.03125,-10.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0360184"
+       inkscape:original="M 12 -93 C 7.5908667 -93 4 -89.409133 4 -85 L 4 -14 C 4 -9.5908667 7.5908667 -6 12 -6 L 84 -6 C 88.409133 -6 92 -9.5908667 92 -14 L 92 -85 C 92 -89.409133 88.409133 -93 84 -93 L 12 -93 z "
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3778"
+       d="m 12,-94.03125 c -4.971633,0 -9.03125,4.059617 -9.03125,9.03125 l 0,71 c 0,4.9716329 4.0596171,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 c 0,-4.971633 -4.059617,-9.03125 -9.03125,-9.03125 l -72,0 z"
+       transform="scale(1,-1)" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.98962283"
+       inkscape:original="M 12 -92 C 8.122 -92 5 -88.878 5 -85 L 5 -14 C 5 -10.122 8.122 -7 12 -7 L 84 -7 C 87.878 -7 91 -10.122 91 -14 L 91 -85 C 91 -88.878 87.878 -92 84 -92 L 12 -92 z "
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="path3770"
+       d="m 12,-93 c -4.4091333,0 -8,3.590867 -8,8 l 0,71 c 0,4.4091333 3.5908667,8 8,8 l 72,0 c 4.409133,0 8,-3.5908667 8,-8 l 0,-71 c 0,-4.409133 -3.590867,-8 -8,-8 l -72,0 z"
+       transform="scale(1,-1)" />
+    <rect
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect3723"
+       width="86"
+       height="85"
+       x="5"
+       y="-92"
+       rx="7"
+       ry="7"
+       transform="scale(1,-1)" />
+    <rect
+       transform="scale(1,-1)"
+       ry="6"
+       rx="6"
+       y="-91"
+       x="6"
+       height="84"
+       width="84"
+       id="rect3716"
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Interior"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:1;fill:url(#radialGradient3354);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
+       id="rect3344"
+       width="74.184616"
+       height="51.115532"
+       x="10.6374"
+       y="8" />
+    <path
+       transform="matrix(0.7658578,0,0,0.8004449,-0.2222237,2.0430542)"
+       d="M 103.44247,30.55419 A 40.477489,16.240969 0 1 1 22.487495,30.55419 A 40.477489,16.240969 0 1 1 103.44247,30.55419 z"
+       sodipodi:ry="16.240969"
+       sodipodi:rx="40.477489"
+       sodipodi:cy="30.55419"
+       sodipodi:cx="62.964985"
+       id="path3301"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.83161139;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline;filter:url(#filter3279)"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline">
+    <path
+       style="opacity:1;fill:url(#linearGradient3706);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.69658119"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 L 6,84 C 6,87.324 8.676,90 12,90 L 84,90 C 87.324,90 90,87.324 90,84 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z M 48,13 C 65.112,13 79,18.824 79,26 C 79.000001,33.176 65.112001,39 48,39 C 30.887999,39 17,33.176 17,26 C 17.000001,18.823999 30.887999,13 48,13 z"
+       id="rect2419" />
+    <path
+       style="opacity:1;fill:url(#linearGradient3536);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.69658119"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 L 6,84 C 6,87.324 8.676,90 12,90 L 84,90 C 87.324,90 90,87.324 90,84 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z M 48,13 C 65.112,13 79,18.824 79,26 C 79.000001,33.176 65.112001,39 48,39 C 30.887999,39 17,33.176 17,26 C 17.000001,18.824 30.887999,13 48,13 z"
+       id="rect3480" />
+    <g
+       style="display:inline"
+       id="g3368"
+       transform="matrix(0.7118644,0,0,0.7118644,2.440678,5.2997885)">
+      <path
+         id="path3358"
+         d="M 123,42.75 C 109.48996,50.356013 87.9119,55.28125 63.59375,55.28125 C 39.759917,55.28125 18.554464,50.536617 5,43.1875 L 5,45.1875 C 18.554464,52.536617 39.759917,57.28125 63.59375,57.28125 C 87.9119,57.28125 109.48996,52.356013 123,44.75 L 123,42.75 z"
+         style="opacity:1;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         style="opacity:1;fill:#e8e8e8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="M 123,44.75 C 109.48996,52.356013 87.9119,57.28125 63.59375,57.28125 C 39.759917,57.28125 18.554464,52.536617 5,45.1875 L 5,47.1875 C 18.554464,54.536617 39.759917,59.28125 63.59375,59.28125 C 87.9119,59.28125 109.48996,54.356013 123,46.75 L 123,44.75 z"
+         id="path3366" />
+    </g>
+    <path
+       style="opacity:0.15;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.69658119;filter:url(#filter3179)"
+       d="M 23.09375,13.875 C 17.668491,13.875 13.3125,18.320256 13.3125,23.8125 L 13.3125,42.34375 C 13.3125,47.835995 17.668491,52.249999 23.09375,52.25 L 62.78125,52.25 C 68.206509,52.25 72.562497,47.835994 72.5625,42.34375 L 72.5625,33.90625 C 66.894038,37.000058 58.01596,39 48,39 C 30.887999,39 17,33.176 17,26 C 17.000001,20.460228 25.290285,15.745836 36.9375,13.875 L 23.09375,13.875 z M 59.0625,13.875 C 63.046939,14.515001 66.625864,15.490969 69.625,16.71875 C 67.861384,14.973043 6 [...]
+       id="rect2399" />
+    <g
+       id="g4516">
+      <path
+         id="rect7153"
+         d="M 61.59375,6 L 61.59375,13.96875 C 64.72975,14.607576 67.58172,15.440432 70.03125,16.46875 C 71.98903,17.290629 73.69469,18.226295 75.09375,19.25 L 75.09375,6 L 61.59375,6 z M 75.09375,32.71875 C 73.69408,33.744041 71.99055,34.679666 70.03125,35.5 C 67.58173,36.525584 64.72977,37.360713 61.59375,38 L 61.59375,89.75 L 75.09375,89.75 L 75.09375,32.71875 z"
+         style="opacity:0.6;fill:url(#linearGradient4412);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         id="rect7163"
+         d="M 41.53125,6 L 41.53125,12.9375 C 43.300398,12.781572 45.134826,12.712186 47,12.6875 L 47,6 L 41.53125,6 z M 41.53125,39.03125 L 41.53125,89.75 L 47,89.75 L 47,39.3125 C 45.134855,39.287711 43.300393,39.187616 41.53125,39.03125 z"
+         style="opacity:0.3;fill:url(#linearGradient4511);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         id="rect7167"
+         d="M 16.9375,6 L 16.9375,24.3125 C 17.311458,23.024752 18.091284,21.805663 19.21875,20.6875 C 20.358614,19.557042 21.853794,18.524233 23.625,17.59375 L 23.625,6 L 16.9375,6 z M 16.9375,27.6875 L 16.9375,89.75 L 23.625,89.75 L 23.625,34.40625 C 21.853813,33.475413 20.358672,32.441312 19.21875,31.3125 C 18.091226,30.195965 17.311439,28.968426 16.9375,27.6875 z"
+         style="opacity:0.4;fill:url(#linearGradient4508);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <rect
+         y="-89.749207"
+         x="23.481384"
+         height="83.749199"
+         width="18.242579"
+         id="rect7171"
+         style="opacity:0.15;fill:url(#linearGradient4505);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         transform="scale(1,-1)" />
+      <path
+         id="rect7185"
+         d="M 46.8125 6.25 L 46.8125 13.03125 C 47.211233 13.024866 47.597562 13 48 13 C 52.85535 13 57.438617 13.476897 61.53125 14.3125 L 61.53125 6.25 L 46.8125 6.25 z M 61.53125 37.6875 C 57.438617 38.523103 52.855351 39 48 39 C 47.597562 39 47.211233 38.975134 46.8125 38.96875 L 46.8125 90 L 61.53125 90 L 61.53125 37.6875 z "
+         style="opacity:0.10000000000000001;fill:url(#linearGradient4502);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <rect
+         y="6.0000024"
+         x="80.631676"
+         height="83.749199"
+         width="2.6935267"
+         id="rect7189"
+         style="opacity:0.4;fill:url(#linearGradient4499);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         id="rect7193"
+         d="M 75,6.25 L 75,19.625 C 77.53668,21.509546 79,23.683039 79,26 C 79,28.316961 77.53668,30.490454 75,32.375 L 75,90 L 80.34375,90 L 80.34375,6.25 L 75,6.25 z"
+         style="opacity:0.1;fill:url(#linearGradient4496);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <rect
+         style="opacity:0.4;fill:url(#linearGradient4493);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="rect7197"
+         width="1.6903621"
+         height="83.749199"
+         x="13.4999"
+         y="6.0000024" />
+    </g>
+    <path
+       style="opacity:0.5;fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.69658119"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 L 6,14 L 6,82 L 6,84 C 6,84.334721 6.0413502,84.6507 6.09375,84.96875 C 6.1424503,85.264346 6.1907895,85.565665 6.28125,85.84375 C 6.291132,85.874128 6.302142,85.907351 6.3125,85.9375 C 6.4113654,86.225271 6.5473802,86.484952 6.6875,86.75 C 6.8320918,87.023507 7.0031161,87.285615 7.1875,87.53125 C 7.3718839,87.776885 7.5612765,88.004722 7.78125,88.21875 C 8.221197,88.646806 8.72416,89.033276 9.28125,89.3125 C 9.559795,89.452112 9.8547231,89.559447  [...]
+       id="rect3728" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3273);stroke-width:1.9158057;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
+       id="path7095"
+       sodipodi:cx="62.964985"
+       sodipodi:cy="30.55419"
+       sodipodi:rx="40.477489"
+       sodipodi:ry="16.240969"
+       d="M 103.44247,30.55419 A 40.477489,16.240969 0 1 1 22.487495,30.55419 A 40.477489,16.240969 0 1 1 103.44247,30.55419 z"
+       transform="matrix(0.7658578,0,0,0.8004449,-0.222225,1.543054)" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.3;fill:url(#radialGradient2893);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Logo"
+     sodipodi:insensitive="true"
+     style="display:inline">
+    <g
+       id="g3648"
+       transform="translate(0,-1)">
+      <path
+         transform="matrix(0.6207391,0,0,0.6207391,2.6638757,22.254842)"
+         id="path3270"
+         style="opacity:0.8;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-opacity:1;display:inline;filter:url(#filter3276)"
+         d="M 75.778112,90.690282 L 82.10984,79.33318 L 82.139941,83.486751 L 95.465661,83.456659 C 97.84677,83.204314 99.934376,82.236582 101.44618,80.416719 C 96.621191,90.285022 95.231462,97.267572 85.220513,97.271792 L 82.139941,97.271792 L 82.10984,101.88686 L 75.778112,90.690282 z M 90.278142,81.731581 L 84.397965,70.896185 L 96.278734,63.702691 L 102.02845,75.220305 C 102.20254,77.976649 97.751529,81.812298 94.98889,81.78246 L 90.278142,81.731581 z M 54.147459,57.72989 L 60.217483 [...]
+      <path
+         transform="matrix(0.6207391,0,0,0.6207391,2.6638757,22.013364)"
+         d="M 75.778112,92.690282 L 82.10984,81.33318 L 82.139941,85.486752 L 95.465661,85.456662 C 97.84677,85.204312 99.934376,84.236582 101.44618,82.416719 C 96.621191,92.285022 95.231462,99.267572 85.220513,99.271792 L 82.139941,99.271792 L 82.10984,103.88686 L 75.778112,92.690282 z M 90.278142,83.731581 L 84.397965,72.896185 L 96.278734,65.702691 L 102.02845,77.220305 C 102.20254,79.976649 97.751529,83.812298 94.98889,83.78246 L 90.278142,83.731581 z M 54.147459,59.72989 L 60.217483 [...]
+         style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-opacity:1;display:inline;filter:url(#filter3276)"
+         id="path3280" />
+      <g
+         transform="matrix(0.6207391,0,0,0.6207391,8.2741309,12.705176)"
+         id="g3350"
+         style="display:inline">
+        <path
+           style="fill:url(#linearGradient3659);fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-opacity:1;display:inline"
+           d="M 66.740086,106.88012 L 73.071814,95.523018 L 73.101915,99.676589 L 86.427635,99.646497 C 88.808744,99.394152 90.89635,98.42642 92.408155,96.606557 C 87.583165,106.47486 86.193436,113.45741 76.182487,113.46163 L 73.101915,113.46163 L 73.071814,118.0767 L 66.740086,106.88012 z"
+           id="path3292" />
+        <path
+           style="fill:url(#linearGradient3661);fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-opacity:1;display:inline"
+           d="M 81.240116,97.921419 L 75.359939,87.086023 L 87.240708,79.892529 L 92.99042,91.410143 C 93.164509,94.166487 88.713503,98.002136 85.950864,97.972298 L 81.240116,97.921419 z"
+           id="path3290" />
+        <path
+           style="fill:url(#linearGradient3663);fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-opacity:1;display:inline"
+           d="M 45.109433,73.919728 L 51.179457,64.824076 C 57.066824,62.631747 60.477162,67.364655 62.629537,70.348059 L 56.90992,81.323911 L 45.109433,73.919728 z"
+           id="path3288" />
+        <path
+           style="fill:url(#linearGradient3665);fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-opacity:1;display:inline"
+           d="M 69.091143,78.447225 C 67.870278,75.569484 66.239058,72.277738 64.199221,69.415642 C 62.37298,66.853249 60.166412,64.617611 58.494792,63.618783 L 73.84747,63.588691 C 76.604624,63.836176 77.944304,65.443291 79.406529,67.641929 L 81.614094,71.524613 L 85.025807,69.347505 L 78.603783,80.784879 L 64.756273,80.814973 L 69.091143,78.447225 z"
+           id="path3286" />
+        <path
+           style="fill:url(#linearGradient3667);fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-opacity:1;display:inline"
+           d="M 47.846903,82.693623 L 55.189677,93.425017 L 51.458047,91.599488 L 45.541795,103.53795 C 44.705728,105.78131 44.640966,108.08109 45.595821,110.24564 C 38.913802,101.52661 33.282944,97.168778 37.743998,88.208213 L 39.117915,85.451445 L 34.999999,83.36621 L 47.846903,82.693623 z"
+           id="path3284" />
+        <path
+           style="fill:url(#linearGradient3669);fill-opacity:1;stroke:none;stroke-width:0.99999982;stroke-opacity:1;display:inline"
+           d="M 49.529355,99.666566 L 63.067708,99.236984 L 62.992286,113.0772 L 50.117576,113.08576 C 47.572499,112.01224 46.124014,106.31842 47.382843,103.85948 L 49.529355,99.666566 z"
+           id="path4068" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/interface/images/menu/view-list-details-symbolic.svg b/interface/images/menu/view-list-details-symbolic.svg
new file mode 100755
index 0000000..f3123ef
--- /dev/null
+++ b/interface/images/menu/view-list-details-symbolic.svg
@@ -0,0 +1,1196 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="view-list-details-symbolic.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2848"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3697">
+      <rect
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3699"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2927"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3309"
+       id="linearGradient3804"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3309"
+       y2="122.8994"
+       x2="63.9995"
+       y1="3.1001"
+       x1="63.9995">
+      <stop
+         offset="0"
+         style="stop-color:#f6f6f6;stop-opacity:1"
+         id="stop3311" />
+      <stop
+         offset="1"
+         style="stop-color:#d2d2d2;stop-opacity:1"
+         id="stop3313" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3397"
+       id="linearGradient3806"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="37.201294"
+       y1="1"
+       x2="37.201294"
+       y2="45" />
+    <linearGradient
+       id="linearGradient3397">
+      <stop
+         offset="0"
+         style="stop-color:#aaa;stop-opacity:1"
+         id="stop3399" />
+      <stop
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1"
+         id="stop3401" />
+    </linearGradient>
+    <linearGradient
+       y2="45.017357"
+       x2="20.758585"
+       y1="1"
+       x1="20.758585"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2940"
+       xlink:href="#linearGradient3309"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.47268421,0.12665535,0.12665535,-0.47268421,44.47921,74.733655)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective2842"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3180"
+       x1="-13"
+       y1="17.008953"
+       x2="-13"
+       y2="-0.70032859"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4083" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop4085" />
+    </linearGradient>
+    <linearGradient
+       y2="-0.70032859"
+       x2="-13"
+       y1="17.008953"
+       x1="-13"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2851"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3692"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3697"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3701"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,62.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective3025"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       id="StandardGradient"
+       x1="11.347495"
+       y1="5.999567"
+       x2="11.347495"
+       y2="16.013096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-2.9995677)">
+      <stop
+         id="stop3177"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3179"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3831"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,97)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3682"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3699"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3712"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,97)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3714"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <inkscape:perspective
+       id="perspective2941"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-8"
+       id="linearGradient3708-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       id="StandardGradient-8"
+       x1="11.347495"
+       y1="5.999567"
+       x2="11.347495"
+       y2="16.013096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-2.9995677)">
+      <stop
+         id="stop3177-6"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3179-8"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-8"
+       id="linearGradient2947"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,183,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3728"
+       x1="56"
+       y1="72"
+       x2="56"
+       y2="24"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3710"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,97)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3718"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,95)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3709"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,97)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3711"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,95)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3750"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3800"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3803"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3808"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059"
+       gradientTransform="translate(0,-10)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3812"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-30)"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3816"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-40)"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3825"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059"
+       gradientTransform="translate(0,1)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3827"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3834"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059"
+       gradientTransform="translate(0,-1)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3836"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3016"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3184"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3186" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3188" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3191"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3193" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3195" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725-2"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3198"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3200" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3202" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3205"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3207" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3209" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3216"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-0"
+       id="linearGradient3188-6"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-0">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-7" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-0"
+       id="radialGradient3619-6"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3984"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,-34.666667,-10)"
+       x1="49"
+       y1="56.999996"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4047"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,-34.666667,2)"
+       x1="49"
+       y1="56.999996"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4049"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,-34.666667,-10)"
+       x1="49"
+       y1="56.999996"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,-34.666667,-12)"
+       x1="49"
+       y1="64.5"
+       x2="49"
+       y2="25.499998" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4058"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,-34.666667,-11)"
+       x1="49"
+       y1="64.5"
+       x2="49"
+       y2="25.499998" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,-34.666667,-12)"
+       x1="49"
+       y1="64.5"
+       x2="49"
+       y2="25.499998" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.1627998"
+     inkscape:cx="71.497389"
+     inkscape:cy="42.889501"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer3"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1026"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3216);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725-2);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721-5);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer10"
+     inkscape:label="Button"
+     style="display:inline">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-7"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-6);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-2"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-6);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0263573"
+       inkscape:original="M 23.8125 22.0625 A 0.93307872 0.93307872 0 0 0 23.0625 23 L 23.0625 27 A 0.93307872 0.93307872 0 0 0 24 27.9375 L 72 27.9375 A 0.93307872 0.93307872 0 0 0 72.9375 27 L 72.9375 23 A 0.93307872 0.93307872 0 0 0 72 22.0625 L 24 22.0625 A 0.93307872 0.93307872 0 0 0 23.90625 22.0625 A 0.93307872 0.93307872 0 0 0 23.8125 22.0625 z M 23.8125 34.0625 A 0.93307872 0.93307872 0 0 0 23.0625 35 L 23.0625 39 A 0.93307872 0.93307872 0 0 0 24 39.9375 L 72 39.9375 A 0.9330787 [...]
+       style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none"
+       id="path4077"
+       d="m 23.75,21.03125 a 1.0264599,1.0264599 0 0 0 -0.125,0.03125 c 0.0027,-5.32e-4 -0.190107,0.03201 -0.1875,0.03125 0.0026,-7.63e-4 -0.158781,0.06349 -0.15625,0.0625 0.0025,-9.87e-4 -0.158685,0.0637 -0.15625,0.0625 0.0024,-0.0012 -0.15857,0.09516 -0.15625,0.09375 0.0023,-0.0014 -0.127188,0.09536 -0.125,0.09375 0.0022,-0.0016 -0.15829,0.09554 -0.15625,0.09375 0.002,-0.0018 -0.126875,0.126965 -0.125,0.125 0.0019,-0.002 -0.09545,0.127121 -0.09375,0.125 0.0017,-0.0021 -0.09526,0.158511 [...]
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0.93298542"
+       inkscape:original="M 24 23 L 24 27 L 72 27 L 72 23 L 24 23 z M 24 35 L 24 39 L 72 39 L 72 35 L 24 35 z M 24 47 L 24 51 L 72 51 L 72 47 L 24 47 z M 24 59 L 24 63 L 72 63 L 72 59 L 24 59 z M 24 71 L 24 75 L 72 75 L 72 71 L 24 71 z "
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none"
+       id="path4073"
+       d="M 23.90625,22.0625 A 0.93307872,0.93307872 0 0 0 23.0625,23 l 0,4 A 0.93307872,0.93307872 0 0 0 24,27.9375 l 48,0 A 0.93307872,0.93307872 0 0 0 72.9375,27 l 0,-4 A 0.93307872,0.93307872 0 0 0 72,22.0625 l -48,0 a 0.93307872,0.93307872 0 0 0 -0.09375,0 z m 0,12 A 0.93307872,0.93307872 0 0 0 23.0625,35 l 0,4 A 0.93307872,0.93307872 0 0 0 24,39.9375 l 48,0 A 0.93307872,0.93307872 0 0 0 72.9375,39 l 0,-4 A 0.93307872,0.93307872 0 0 0 72,34.0625 l -48,0 a 0.93307872,0.93307872 0 0 0 [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path4067"
+       d="m 24,23 0,4 48,0 0,-4 -48,0 z m 0,12 0,4 48,0 0,-4 -48,0 z m 0,12 0,4 48,0 0,-4 -48,0 z m 0,12 0,4 48,0 0,-4 -48,0 z m 0,12 0,4 48,0 0,-4 -48,0 z"
+       style="fill:#000000;fill-opacity:1;stroke:none;opacity:0.3" />
+    <path
+       style="fill:url(#linearGradient4052);fill-opacity:1;stroke:none"
+       d="m 24,22 0,4 48,0 0,-4 -48,0 z m 0,12 0,4 48,0 0,-4 -48,0 z m 0,12 0,4 48,0 0,-4 -48,0 z m 0,12 0,4 48,0 0,-4 -48,0 z m 0,12 0,4 48,0 0,-4 -48,0 z"
+       id="path4043"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-opacity:1;stroke:none"
+       d="m 24,22 0,1 48,0 0,-1 -48,0 z m 0,12 0,1 48,0 0,-1 -48,0 z m 0,12 0,1 48,0 0,-1 -48,0 z m 0,12 0,1 48,0 0,-1 -48,0 z m 0,12 0,1 48,0 0,-1 -48,0 z"
+       id="path4054"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path4063"
+       d="m 24,25 0,1 48,0 0,-1 -48,0 z m 0,12 0,1 48,0 0,-1 -48,0 z m 0,12 0,1 48,0 0,-1 -48,0 z m 0,12 0,1 48,0 0,-1 -48,0 z m 0,12 0,1 48,0 0,-1 -48,0 z"
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/interface/images/menu/view-list-icons-symbolic.svg b/interface/images/menu/view-list-icons-symbolic.svg
new file mode 100755
index 0000000..3edfbc7
--- /dev/null
+++ b/interface/images/menu/view-list-icons-symbolic.svg
@@ -0,0 +1,1194 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg2408"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="view-list-icons-symbolic.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline">
+  <defs
+     id="defs2410">
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2416" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient3706"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3743"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter3174"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2848"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3697">
+      <rect
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3699"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <inkscape:perspective
+       id="perspective2927"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3309"
+       id="linearGradient3804"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3309"
+       y2="122.8994"
+       x2="63.9995"
+       y1="3.1001"
+       x1="63.9995">
+      <stop
+         offset="0"
+         style="stop-color:#f6f6f6;stop-opacity:1"
+         id="stop3311" />
+      <stop
+         offset="1"
+         style="stop-color:#d2d2d2;stop-opacity:1"
+         id="stop3313" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3397"
+       id="linearGradient3806"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       x1="37.201294"
+       y1="1"
+       x2="37.201294"
+       y2="45" />
+    <linearGradient
+       id="linearGradient3397">
+      <stop
+         offset="0"
+         style="stop-color:#aaa;stop-opacity:1"
+         id="stop3399" />
+      <stop
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:1"
+         id="stop3401" />
+    </linearGradient>
+    <linearGradient
+       y2="45.017357"
+       x2="20.758585"
+       y1="1"
+       x1="20.758585"
+       gradientTransform="matrix(1.2790652,0,0,1.2790652,17.302433,18.5815)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2940"
+       xlink:href="#linearGradient3309"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.47268421,0.12665535,0.12665535,-0.47268421,44.47921,74.733655)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective2842"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3180"
+       x1="-13"
+       y1="17.008953"
+       x2="-13"
+       y2="-0.70032859"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4083" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="1"
+         id="stop4085" />
+    </linearGradient>
+    <linearGradient
+       y2="-0.70032859"
+       x2="-13"
+       y1="17.008953"
+       x1="-13"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2851"
+       xlink:href="#linearGradient4081"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3692"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3697"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3701"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,62.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)"
+       x1="20.758585"
+       y1="1"
+       x2="20.758585"
+       y2="45.017357" />
+    <inkscape:perspective
+       id="perspective3025"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient"
+       id="linearGradient3708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       id="StandardGradient"
+       x1="11.347495"
+       y1="5.999567"
+       x2="11.347495"
+       y2="16.013096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-2.9995677)">
+      <stop
+         id="stop3177"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3179"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3831"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,97)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3682"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3699"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3712"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,97)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3714"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,-1,0,96,96)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <inkscape:perspective
+       id="perspective2941"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-8"
+       id="linearGradient3708-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,96,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       id="StandardGradient-8"
+       x1="11.347495"
+       y1="5.999567"
+       x2="11.347495"
+       y2="16.013096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3,-2.9995677)">
+      <stop
+         id="stop3177-6"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.86274511;" />
+      <stop
+         id="stop3179-8"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.47058824;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#StandardGradient-8"
+       id="linearGradient2947"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,183,0)"
+       x1="29.826593"
+       y1="51.954468"
+       x2="65.693901"
+       y2="51.954468" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3728"
+       x1="56"
+       y1="72"
+       x2="56"
+       y2="24"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3710"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,97)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3718"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,95)"
+       x1="24"
+       y1="48"
+       x2="72"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3709"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,97)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3711"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,95)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1,1,0,0,96)"
+       x1="27"
+       y1="48"
+       x2="69"
+       y2="48" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3750"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3800"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3803"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3808"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059"
+       gradientTransform="translate(0,-10)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3812"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-30)"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3816"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-40)"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3825"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059"
+       gradientTransform="translate(0,1)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3827"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3834"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059"
+       gradientTransform="translate(0,-1)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient3836"
+       gradientUnits="userSpaceOnUse"
+       x1="49"
+       y1="70"
+       x2="49"
+       y2="23.729059" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3016"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3184"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3186" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3188" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3191"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3193" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3195" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725-2"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3198"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3200" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3202" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       id="linearGradient3205"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3207" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3209" />
+    </linearGradient>
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3216"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-0"
+       id="linearGradient3188-6"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-0">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-7" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-0"
+       id="radialGradient3619-6"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,25.333333,-12)"
+       x1="49"
+       y1="64.5"
+       x2="49"
+       y2="25.499998" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4122"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,25.333333,-12)"
+       x1="18.374998"
+       y1="62.999996"
+       x2="18.374998"
+       y2="26.999998" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4128"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,25.333333,-11)"
+       x1="18.374998"
+       y1="62.999996"
+       x2="18.374998"
+       y2="26.999998" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4130"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,25.333333,-12)"
+       x1="18.374998"
+       y1="62.999996"
+       x2="18.374998"
+       y2="26.999998" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4137"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,25.333333,-13)"
+       x1="18.374998"
+       y1="62.999996"
+       x2="18.374998"
+       y2="26.999998" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient4139"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7777779,0,0,1.3333334,25.333333,-12)"
+       x1="18.374998"
+       y1="62.999996"
+       x2="18.374998"
+       y2="26.999998" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16.228462"
+     inkscape:cx="47.40738"
+     inkscape:cy="60.786314"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer3"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1026"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Shadow"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3216);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725-2);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721-5);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer10"
+     inkscape:label="Button"
+     style="display:inline">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-7"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-6);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-2"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-6);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <path
+       style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none"
+       d="m 23.8125,22.90625 c -1.569067,0.09715 -2.12956,1.788939 -1.90625,3.127011 0.02086,6.456921 -0.04171,12.919771 0.03125,19.372989 0.247494,1.550922 1.943985,1.843372 3.24337,1.6875 6.407717,-0.02086 12.821365,0.04171 19.22538,-0.03125 1.550922,-0.247494 1.843372,-1.943985 1.6875,-3.24337 -0.02086,-6.407717 0.04171,-12.821365 -0.03125,-19.22538 -0.247494,-1.550922 -1.943985,-1.843372 -3.24337,-1.6875 -6.335543,0 -12.671087,0 -19.00663,0 z m 28,0 c -1.569067,0.09715 -2.12956,1.788 [...]
+       id="path4152"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="1.0199947"
+       inkscape:original="M 24 25 L 24 45 L 44 45 L 44 25 L 24 25 z M 52 25 L 52 45 L 72 45 L 72 25 L 52 25 z M 30 31 L 38 31 L 38 39 L 30 39 L 30 31 z M 58 31 L 66 31 L 66 39 L 58 39 L 58 31 z M 24 53 L 24 73 L 44 73 L 44 53 L 24 53 z M 52 53 L 52 73 L 72 73 L 72 53 L 52 53 z M 30 59 L 38 59 L 38 67 L 30 67 L 30 59 z M 58 59 L 66 59 L 66 67 L 58 67 L 58 59 z "
+       style="opacity:0.15;fill:#000000;fill-opacity:1;stroke:none"
+       id="path4148"
+       d="M 24,23.96875 A 1.0200967,1.0200967 0 0 0 22.96875,25 l 0,20 A 1.0200967,1.0200967 0 0 0 24,46.03125 l 20,0 A 1.0200967,1.0200967 0 0 0 45.03125,45 l 0,-20 A 1.0200967,1.0200967 0 0 0 44,23.96875 l -20,0 z m 28,0 A 1.0200967,1.0200967 0 0 0 50.96875,25 l 0,20 A 1.0200967,1.0200967 0 0 0 52,46.03125 l 20,0 A 1.0200967,1.0200967 0 0 0 73.03125,45 l 0,-20 A 1.0200967,1.0200967 0 0 0 72,23.96875 l -20,0 z m -20.96875,8.0625 5.9375,0 0,5.9375 -5.9375,0 0,-5.9375 z m 28,0 5.9375,0 0, [...]
+    <path
+       sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4142"
+       d="m 24,25 0,20 20,0 0,-20 z m 28,0 0,20 20,0 0,-20 z m -22,6 8,0 0,8 -8,0 z m 28,0 8,0 0,8 -8,0 z m -34,22 0,20 20,0 0,-20 z m 28,0 0,20 20,0 0,-20 z m -22,6 8,0 0,8 -8,0 z m 28,0 8,0 0,8 -8,0 z"
+       style="fill:#000000;fill-opacity:1;stroke:none;opacity:0.3" />
+    <path
+       style="fill:url(#linearGradient4122);fill-opacity:1;stroke:none"
+       d="m 24,24 0,20 20,0 0,-20 z m 28,0 0,20 20,0 0,-20 z m -22,6 8,0 0,8 -8,0 z m 28,0 8,0 0,8 -8,0 z m -34,22 0,20 20,0 0,-20 z m 28,0 0,20 20,0 0,-20 z m -22,6 8,0 0,8 -8,0 z m 28,0 8,0 0,8 -8,0 z"
+       id="path4043"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:none;opacity:0.75"
+       d="M 24 24 L 24 25 L 44 25 L 44 24 L 24 24 z M 52 24 L 52 25 L 72 25 L 72 24 L 52 24 z M 30 38 L 30 39 L 38 39 L 38 38 L 30 38 z M 58 38 L 58 39 L 66 39 L 66 38 L 58 38 z M 24 52 L 24 53 L 44 53 L 44 52 L 24 52 z M 52 52 L 52 53 L 72 53 L 72 52 L 52 52 z M 30 66 L 30 67 L 38 67 L 38 66 L 30 66 z M 58 66 L 58 67 L 66 67 L 66 66 L 58 66 z "
+       id="path4124" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none;opacity:0.15"
+       d="M 30 29 L 30 30 L 38 30 L 38 29 L 30 29 z M 58 29 L 58 30 L 66 30 L 66 29 L 58 29 z M 24 43 L 24 44 L 44 44 L 44 43 L 24 43 z M 52 43 L 52 44 L 72 44 L 72 43 L 52 43 z M 30 57 L 30 58 L 38 58 L 38 57 L 30 57 z M 58 57 L 58 58 L 66 58 L 66 57 L 58 57 z M 24 71 L 24 72 L 44 72 L 44 71 L 24 71 z M 52 71 L 52 72 L 72 72 L 72 71 L 52 71 z "
+       id="path4133" />
+  </g>
+</svg>
diff --git a/interface/images/menu/virtual.svg b/interface/images/menu/virtual.svg
new file mode 100755
index 0000000..859f001
--- /dev/null
+++ b/interface/images/menu/virtual.svg
@@ -0,0 +1,929 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="virtual.svg"
+   version="1.0"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:version="0.32"
+   id="svg2408"
+   height="96"
+   width="96">
+  <defs
+     id="defs2410">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 48 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="96 : 48 : 1"
+       inkscape:persp3d-origin="48 : 32 : 1"
+       id="perspective3435" />
+    <linearGradient
+       id="linearGradient3637">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop3639" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop3641" />
+    </linearGradient>
+    <linearGradient
+       id="ButtonShadow"
+       gradientTransform="scale(1.0058652,0.994169)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3700">
+      <stop
+         style="stop-color:#2276c5;stop-opacity:1;"
+         offset="0"
+         id="stop3702" />
+      <stop
+         style="stop-color:#68baf4;stop-opacity:1;"
+         offset="1"
+         id="stop3704" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3174">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.71"
+         id="feGaussianBlur3176" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3188"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <filter
+       inkscape:collect="always"
+       id="filter3794"
+       x="-0.192"
+       width="1.384"
+       y="-0.192"
+       height="1.384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="5.28"
+         id="feGaussianBlur3796" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="linearGradient3613"
+       x1="48"
+       y1="20.220806"
+       x2="48"
+       y2="138.66119"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737"
+       id="radialGradient3619"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3613">
+      <rect
+         ry="6"
+         rx="6"
+         y="6"
+         x="6"
+         height="84"
+         width="84"
+         id="rect3615"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3700"
+       id="linearGradient2843"
+       gradientUnits="userSpaceOnUse"
+       x1="48"
+       y1="90"
+       x2="48"
+       y2="5.9877172"
+       gradientTransform="translate(0,100)" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3625">
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+         id="path3627" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3643"
+       x1="44.512066"
+       y1="6"
+       x2="44.512066"
+       y2="90.015434"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3649">
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="rect3651"
+         width="76"
+         height="76"
+         x="10"
+         y="10"
+         rx="4"
+         ry="4" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter3657">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.14"
+         id="feGaussianBlur3659" />
+    </filter>
+    <linearGradient
+       id="ButtonShadow-0"
+       gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)"
+       x1="45.447727"
+       y1="92.539597"
+       x2="45.447727"
+       y2="7.0165396"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3750-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0.58823532;"
+         offset="1"
+         id="stop3752-5" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3780"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#ButtonShadow-0"
+       id="linearGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,0,97)"
+       x1="32.251034"
+       y1="6.1317081"
+       x2="32.251034"
+       y2="90.238609" />
+    <linearGradient
+       y2="90.238609"
+       x2="32.251034"
+       y1="6.1317081"
+       x1="32.251034"
+       gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3199"
+       xlink:href="#ButtonShadow-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="linearGradient3188-8"
+       gradientUnits="userSpaceOnUse"
+       x1="36.357143"
+       y1="6"
+       x2="36.357143"
+       y2="63.893143" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3737-3">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3739-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3741-1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3737-3"
+       id="radialGradient3619-3"
+       cx="48"
+       cy="90.171875"
+       fx="48"
+       fy="90.171875"
+       r="42"
+       gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3637"
+       id="linearGradient3905"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-104,104)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3183-0"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-144,104)"
+       x1="104"
+       y1="8"
+       x2="120"
+       y2="8" />
+    <linearGradient
+       y2="11.015625"
+       x2="19"
+       y1="11.015625"
+       x1="11"
+       gradientTransform="matrix(0,-3.0000004,2.9652505,0,33.335916,111.00001)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2927-4"
+       xlink:href="#linearGradient3183-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3183-0">
+      <stop
+         style="stop-color:#c80000;stop-opacity:1;"
+         offset="0"
+         id="stop3185-9" />
+      <stop
+         style="stop-color:#f3604d;stop-opacity:1;"
+         offset="1"
+         id="stop3187-6" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective2903"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       id="aigrd1"
+       cx="28.789101"
+       cy="20.971201"
+       r="13.2807"
+       fx="28.789101"
+       fy="20.971201"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#E41E08"
+         id="stop12" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop14" />
+    </radialGradient>
+    <radialGradient
+       id="aigrd2"
+       cx="19.292"
+       cy="13.5444"
+       r="14.6944"
+       fx="19.292"
+       fy="13.5444"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#E41E08"
+         id="stop19" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop21" />
+    </radialGradient>
+    <linearGradient
+       id="aigrd3"
+       gradientUnits="userSpaceOnUse"
+       x1="18.229"
+       y1="11.5991"
+       x2="23.412001"
+       y2="16.723101">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop34" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop36" />
+    </linearGradient>
+    <radialGradient
+       id="radialGradient2920"
+       cx="28.789101"
+       cy="20.971201"
+       r="13.2807"
+       fx="28.789101"
+       fy="20.971201"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#E41E08"
+         id="stop2922" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop2924" />
+    </radialGradient>
+    <radialGradient
+       id="radialGradient2927"
+       cx="19.292"
+       cy="13.5444"
+       r="14.6944"
+       fx="19.292"
+       fy="13.5444"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#E41E08"
+         id="stop2929" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop2931" />
+    </radialGradient>
+    <linearGradient
+       id="linearGradient2938"
+       gradientUnits="userSpaceOnUse"
+       x1="18.229"
+       y1="11.5991"
+       x2="23.412001"
+       y2="16.723101">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop2940" />
+      <stop
+         offset="1"
+         style="stop-color:#901505"
+         id="stop2942" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#aigrd3"
+       id="linearGradient5716"
+       gradientUnits="userSpaceOnUse"
+       x1="18.229"
+       y1="11.5991"
+       x2="23.412001"
+       y2="16.723101"
+       gradientTransform="matrix(1.25,0,0,1.25,16.5,15.75)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3018"
+       id="linearGradient4072"
+       gradientUnits="userSpaceOnUse"
+       x1="304.05591"
+       y1="100.79848"
+       x2="408.10162"
+       y2="142.21474"
+       gradientTransform="matrix(3.1743288,0,0,3.1563103,-962.86966,-178.75667)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3018">
+      <stop
+         style="stop-color:#00ff00;stop-opacity:1;"
+         offset="0"
+         id="stop3020" />
+      <stop
+         style="stop-color:#00c000;stop-opacity:1"
+         offset="1"
+         id="stop3022" />
+    </linearGradient>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4918">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="3.571792"
+         id="feGaussianBlur4920" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3018-7"
+       id="linearGradient4072-3"
+       gradientUnits="userSpaceOnUse"
+       x1="304.05591"
+       y1="100.79848"
+       x2="408.10162"
+       y2="142.21474"
+       gradientTransform="matrix(0.33429786,0,0,0.29792165,-78.911607,16.563129)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3018-7">
+      <stop
+         style="stop-color:#00ff00;stop-opacity:1;"
+         offset="0"
+         id="stop3020-9" />
+      <stop
+         style="stop-color:#00c000;stop-opacity:1"
+         offset="1"
+         id="stop3022-9" />
+    </linearGradient>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter3808">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.64941674"
+         id="feGaussianBlur3810" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3814"
+       id="linearGradient4064"
+       gradientUnits="userSpaceOnUse"
+       x1="343.49619"
+       y1="61.605064"
+       x2="352.88724"
+       y2="86.286705"
+       gradientTransform="matrix(0.41148273,0,0,0.40843067,-105.41438,9.1331144)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3814">
+      <stop
+         style="stop-color:#00ff00;stop-opacity:1;"
+         offset="0"
+         id="stop3816" />
+      <stop
+         style="stop-color:#00ff00;stop-opacity:0;"
+         offset="1"
+         id="stop3818" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3814"
+       id="linearGradient4061"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.41139173,0.0085898,-0.00865398,0.40834033,-87.669036,6.6207836)"
+       x1="343.49619"
+       y1="61.605064"
+       x2="352.88724"
+       y2="86.286705" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4078"
+       id="radialGradient4084"
+       cx="68.050774"
+       cy="241.2865"
+       fx="68.050774"
+       fy="241.2865"
+       r="77.98423"
+       gradientTransform="matrix(-2.5537177,-0.66247176,1.2008387,-4.6290235,165.22048,1148.0166)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4078">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.84232365"
+         offset="0"
+         id="stop4080" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4082" />
+    </linearGradient>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter4610"
+       x="-0.20595311"
+       width="1.4119062"
+       y="-0.064262427"
+       height="1.1285249">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="13.384246"
+         id="feGaussianBlur4612" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.21875"
+     inkscape:cx="48"
+     inkscape:cy="48"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer6"
+     showgrid="true"
+     showborder="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1314"
+     inkscape:window-height="744"
+     inkscape:window-x="52"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3732"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2413">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Blur Shadow"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)"
+       id="rect3745"
+       width="86"
+       height="85"
+       x="5"
+       y="7"
+       rx="6"
+       ry="6"
+       clip-path="url(#clipPath3625)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Shadow"
+     sodipodi:insensitive="true">
+    <path
+       style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3786"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+       id="path3778"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+       id="path3770"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+       id="rect3723"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+       id="rect3716"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:label="Button with border"
+     inkscape:groupmode="layer"
+     id="layer1"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2419"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+       id="rect3726"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+       id="rect3629"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       inkscape:connector-curvature="0" />
+    <rect
+       ry="6"
+       rx="6"
+       y="106"
+       x="6"
+       height="84"
+       width="84"
+       id="rect2841"
+       style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <rect
+       ry="4"
+       rx="4"
+       y="110"
+       x="10"
+       height="76"
+       width="76"
+       id="rect3634"
+       style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accum [...]
+       d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+       clip-path="url(#clipPath3649)"
+       id="rect3647"
+       transform="translate(-110,0)"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+       id="path3709"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+       id="path3707"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Button"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       id="rect2419-9"
+       width="84"
+       height="84"
+       x="6"
+       y="6"
+       rx="6"
+       ry="6" />
+    <path
+       style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.718 [...]
+       id="rect3728-4"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3615-6"
+       d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.669 [...]
+       style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Highlight"
+     sodipodi:insensitive="true"
+     style="display:none">
+    <rect
+       style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)"
+       id="rect3171"
+       width="66"
+       height="66"
+       x="15"
+       y="15"
+       rx="12"
+       ry="12"
+       clip-path="url(#clipPath3613)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Symbol"
+     style="display:inline">
+    <rect
+       style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3897"
+       width="16"
+       height="16"
+       x="0"
+       y="104"
+       transform="matrix(0,1,1,0,0,0)" />
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="104"
+       y="48"
+       id="text3907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3909"
+         x="104"
+         y="48">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+    <rect
+       transform="matrix(0,-1,1,0,0,0)"
+       y="104"
+       x="-40"
+       height="16"
+       width="16"
+       id="rect3911"
+       style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3951"
+       y="32"
+       x="124"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       xml:space="preserve"><tspan
+         y="32"
+         x="124"
+         id="tspan3953"
+         sodipodi:role="line">Bevel opacity : 30 / 10</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+       x="124"
+       y="8"
+       id="text3955"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3957"
+         x="124"
+         y="8">Bevel opacity : 75 / 15</tspan></text>
+    <g
+       transform="matrix(1.25,0,0,1.25,90,31)"
+       id="Layer_x0020_2"
+       style="fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4">
+      <path
+         style="fill:none;stroke:none"
+         d="M 48,48 H 0 V 0 h 48 v 48 z"
+         id="path81" />
+    </g>
+    <path
+       sodipodi:nodetypes="sscccccccccs"
+       inkscape:connector-curvature="0"
+       id="path4908"
+       d="m 325.71429,53.520529 c 19.54167,-32.797225 103.10782,-31.21763 125.71429,0 26.74802,36.93675 0,145.984511 0,145.984511 l -15.71429,-18.95903 -15.71428,18.95903 -15.71429,-18.95903 -15.71429,18.95903 -15.71428,-18.95903 -15.71429,18.95903 -15.71428,-18.95903 -15.71429,18.95903 c 0,0 -23.89087,-105.887923 0,-145.984511 z"
+       style="fill:#666666;fill-opacity:1;stroke:none;filter:url(#filter4918)"
+       transform="matrix(0.33429786,0,0,0.29792165,-80.911607,16.563129)" />
+    <path
+       style="fill:#00ff00;fill-opacity:1;stroke:none"
+       d="m 27.108573,31.656847 c 6.532739,-9.771004 34.468728,-9.300407 42.026023,0 8.941803,11.004261 0,43.491944 0,43.491944 l -5.253255,-5.648303 -5.253255,5.648303 -5.253256,-5.648303 -5.253246,5.648303 -5.253255,-5.648303 -5.253255,5.648303 -5.253246,-5.648303 -5.253255,5.648303 c 0,0 -7.986663,-31.546305 0,-43.491944 z"
+       id="rect4897"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="sscccccccccs" />
+    <path
+       sodipodi:nodetypes="sscccccccccs"
+       inkscape:connector-curvature="0"
+       id="path3008"
+       d="m 27.108573,31.656847 c 6.532739,-9.771004 34.468728,-9.300407 42.026023,0 8.941803,11.004261 0,43.491944 0,43.491944 l -5.253255,-5.648303 -5.253255,5.648303 -5.253256,-5.648303 -5.253246,5.648303 -5.253255,-5.648303 -5.253255,5.648303 -5.253246,-5.648303 -5.253255,5.648303 c 0,0 -7.986663,-31.546305 0,-43.491944 z"
+       style="fill:url(#linearGradient4072-3);fill-opacity:1;stroke:none" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.31592515"
+       id="path4900"
+       sodipodi:cx="364.28571"
+       sodipodi:cy="81.290756"
+       sodipodi:rx="13.571428"
+       sodipodi:ry="14.642858"
+       d="m 377.85713,81.290756 a 13.571428,14.642858 0 1 1 -27.14285,0 13.571428,14.642858 0 1 1 27.14285,0 z"
+       transform="matrix(0.41148273,0,0,0.40843067,-108.35355,9.4248473)" />
+    <path
+       d="m 377.85713,81.290756 a 13.571428,14.642858 0 1 1 -27.14285,0 13.571428,14.642858 0 1 1 27.14285,0 z"
+       sodipodi:ry="14.642858"
+       sodipodi:rx="13.571428"
+       sodipodi:cy="81.290756"
+       sodipodi:cx="364.28571"
+       id="path4902"
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       sodipodi:type="arc"
+       transform="matrix(0.28129512,0,0,0.24545881,-60.399766,23.682445)" />
+    <path
+       d="m 377.85713,81.290756 a 13.571428,14.642858 0 1 1 -27.14285,0 13.571428,14.642858 0 1 1 27.14285,0 z"
+       sodipodi:ry="14.642858"
+       sodipodi:rx="13.571428"
+       sodipodi:cy="81.290756"
+       sodipodi:cx="364.28571"
+       id="path4904"
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.31592515"
+       sodipodi:type="arc"
+       transform="matrix(0.41148273,0,0,0.40843067,-91.32899,9.8685601)" />
+    <path
+       transform="matrix(0.28129512,0,0,0.25553356,-43.573378,23.651397)"
+       sodipodi:type="arc"
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       id="path4906"
+       sodipodi:cx="364.28571"
+       sodipodi:cy="81.290756"
+       sodipodi:rx="13.571428"
+       sodipodi:ry="14.642858"
+       d="m 377.85713,81.290756 a 13.571428,14.642858 0 1 1 -27.14285,0 13.571428,14.642858 0 1 1 27.14285,0 z" />
+    <path
+       style="fill:none;stroke:#000000;filter:url(#filter3808)"
+       d="m 317.14286,50.663386 c 19.54167,-32.797225 103.10782,-31.21763 125.71429,0 26.74802,36.93675 0,145.984514 0,145.984514 L 427.14286,177.68887 411.42858,196.6479 395.71429,177.68887 380,196.6479 364.28572,177.68887 348.57143,196.6479 332.85715,177.68887 317.14286,196.6479 c 0,0 -23.89087,-105.887926 0,-145.984514 z"
+       id="path3794"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="sscccccccccs"
+       transform="matrix(0.33429786,0,0,0.29792165,-78.911607,16.563129)" />
+    <path
+       style="fill:url(#linearGradient4064);fill-opacity:1;stroke:none"
+       d="m 36.572414,44.424426 c 0,0 4.904635,-3.93395 10.106525,-3.245509 0.198169,-0.934316 -1.882592,-5.310825 -6.390889,-4.278167 -3.498386,0.801327 -5.053267,5.556701 -3.715636,7.523676 z"
+       id="path3812"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsc" />
+    <path
+       sodipodi:nodetypes="ccsc"
+       inkscape:connector-curvature="0"
+       id="path3822"
+       d="m 53.538583,44.868292 c 0,0 4.986906,-3.830685 10.173057,-3.033805 0.217922,-0.929975 -1.769649,-5.34896 -6.298836,-4.410632 -3.514583,0.728117 -5.169874,5.449981 -3.874221,7.444437 z"
+       style="fill:url(#linearGradient4061);fill-opacity:1;stroke:none" />
+    <path
+       style="fill:url(#radialGradient4084);fill-opacity:1;stroke:none;filter:url(#filter4610)"
+       d="m 268.30331,299.98548 c 0,0 -54.64394,-371.16447 6.44044,-429.89946 41.86287,-40.25275 64.40441,-62.7943 109.4875,-69.23474 69.05591,-9.86513 -88.55606,82.11562 -78.8954,201.2637903 C 314.99651,121.26323 268.30331,299.98548 268.30331,299.98548 z"
+       id="path4076"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csssc"
+       transform="matrix(0.10531293,0,0,0.09438922,-0.677826,44.762533)" />
+  </g>
+</svg>
diff --git a/interface/index.html b/interface/index.html
new file mode 100755
index 0000000..8bda3d1
--- /dev/null
+++ b/interface/index.html
@@ -0,0 +1,468 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>istSOS webadmin developer page</title>
+	<link rel="icon" href="favicon.ico" />
+	<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css"/>
+        <!--[if gte IE 9]>
+            <style type="text/css">
+                .gradient {
+                filter: none;
+                }
+            </style>
+        <![endif]-->
+        <link rel="stylesheet" type="text/css" href="css/main.css"/>
+
+        <link href='https://fonts.googleapis.com/css?family=Electrolize' rel='stylesheet' type='text/css'>
+        <!--
+        <link href='http://fonts.googleapis.com/css?family=Karla:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Exo' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Patrick+Hand' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Nova+Square' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Mate+SC' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Imprima' rel='stylesheet' type='text/css'>
+        -->
+
+        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
+
+        <script type="text/javascript" src="dygraphs/dygraph-combined.js"></script>
+        <!--<script type="text/javascript" src="http://dygraphs.com/dygraph-dev.js"></script>-->
+
+        <script type="text/javascript" src="codemirror/lib/codemirror.js"></script>
+        <link   rel="stylesheet" href="codemirror/lib/codemirror.css">
+        <script type="text/javascript" src="codemirror/mode/javascript/javascript.js"></script>
+        <script type="text/javascript" src="codemirror/mode/python/python.js"></script>
+        <script type="text/javascript" src="ext/codemirror.js"></script>
+
+
+        <script type="text/javascript" src="app/engine/wa.js"></script>
+        <script type="text/javascript" src="app/engine/pageConfig.js"></script>
+        <script type="text/javascript" src="app/engine/pageManager.js"></script>
+
+        <script type="text/javascript">
+            
+            function pad(n){return n<10 ? '0'+n : n}
+            
+            function ISO8601FromDate(isodate) {
+                alert("ISO8601FromDate is deprecated!!");
+                function pad(n){return n<10 ? '0'+n : n}
+                var offset = isodate.getTimezoneOffset()/-60;
+                var tz = ((offset > 0) ? "+"+pad(offset) : pad(offset))
+                return isodate.getFullYear()+'-'
+                    + pad(isodate.getMonth()+1)+'-'
+                    + pad(isodate.getDate())+'T'
+                    + pad(isodate.getHours())+':'
+                    + pad(isodate.getMinutes())+':'
+                    + pad(isodate.getSeconds())+'.'
+                    + isodate.getMilliseconds() + tz;
+            }
+            String.prototype.capitalize = function(){
+                return this.toLowerCase().replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
+            };
+            Ext.override(Ext.layout.Layout, {
+                renderItem: function(item, target, position) {
+                    if (item && !item.rendered && item.isFieldLabelable && item.fieldLabel && item.allowBlank == false) {
+                        item.fieldLabel = '<span title="This is a mandatory parameter">' + item.fieldLabel + '<span style="color:red">*</span></span>';
+                    }
+                    this.callOverridden(arguments);
+                }
+            });
+            Function.prototype.defer =
+                function(n,o) {
+                // Get arguments as array
+                var a = [];
+                for(var i=2; i<arguments.length; i++)
+                    a.push(arguments[i]);
+                var that = this;
+                window.setTimeout(function(){return that.apply(o,a);},n);
+            };
+            Ext.override(Ext.chart.Chart, {  
+                onMouseUp: function(e) {
+                    var me = this,
+                    position = me.getEventXY(e),
+                    item;
+                    if (me.mask) {
+                        me.mixins.mask.onMouseUp.call(me, e);
+                    }
+                    me.series.each(function(series) {
+                        if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
+                            if (series.getItemForPoint) {
+                                item = series.getItemForPoint(position[0], position[1]);
+                                if (item) {
+                                    series.fireEvent('itemmouseup', item, e);
+                                }
+                            }
+                        }
+                    }, me);
+                }
+            });
+            Ext.override(Ext.view.DropZone, {  
+                onNodeDrop: function (node, dragZone, e, data) {
+                    var me = this,
+                    dropHandled = false,
+                    dropHandlers = {
+                        wait : false,
+                        processDrop : function () {
+                            me.invalidateDrop();
+                            me.handleNodeDrop(data, me.overRecord, me.currentPosition);
+                            dropHandled = true;
+                            me.fireViewEvent('drop', node, data, me.overRecord, me.currentPosition);
+                        },
+                        cancelDrop : function () {
+                            me.invalidateDrop();
+                            dropHandled = true;
+                        }
+                    },
+                    performOperation = false;
+                    if (me.valid) {
+                        performOperation = me.fireViewEvent('beforedrop', node, data, me.overRecord, me.currentPosition, dropHandlers);
+                        if (dropHandlers.wait) {
+                            return;
+                        }
+                        if (performOperation !== false) {
+                            if (!dropHandled) {
+                                dropHandlers.processDrop();
+                            }
+                        }
+                    }
+                    return performOperation;
+                }
+            });
+            
+            
+            Ext.override(Ext.form.FieldSet, {
+                setExpanded: function(expanded) {
+                    var me = this,
+                    checkboxCmp = me.checkboxCmp,
+                    toggleCmp = me.toggleCmp,
+                    event;
+
+                    expanded = !!expanded;
+        
+                    if (checkboxCmp) {
+                        checkboxCmp.setValue(expanded);
+                    }
+        
+                    if (toggleCmp) {
+                        toggleCmp.setType(expanded ? 'up' : 'down');
+                    }
+        
+                    if (expanded) {
+                        event = "expand";
+                        me.removeCls(me.baseCls + '-collapsed');
+                    } else {
+                        event = "collapse";
+                        me.addCls(me.baseCls + '-collapsed');
+                    }
+                    me.collapsed = !expanded;
+                    if (expanded) {
+                        // ensure subitems will get rendered and layed out when expanding
+                        me.getComponentLayout().childrenChanged = true;
+                    }
+                    me.doComponentLayout();
+                    me.fireEvent(event, me);
+                    return me;
+                }
+            });
+
+            /* 
+            This reusable script is copyrighted.
+            Copyright (c) 2004,2005,2006 Claude Ostyn
+            This script is free for use with attribution
+            under the Creative Commons Attribution-ShareAlike 2.5 License.
+            To view a copy of this license, visit
+            http://creativecommons.org/licenses/by-sa/2.5/
+            or send a letter to
+            Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+
+            For any other use, contact Claude Ostyn via tools at Ostyn.com.
+
+            USE AT YOUR OWN RISK!
+            THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+            OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER
+            BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+            ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+            CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+            SOFTWARE.
+             */
+
+            function centisecsToISODuration(n, bPrecise)
+            {
+                // Note: SCORM and IEEE 1484.11.1 require centisec precision
+                // Parameters:
+                // n = number of centiseconds
+                // bPrecise = optional parameter; if true, duration will
+                // be expressed without using year and/or month fields.
+                // If bPrecise is not true, and the duration is long,
+                // months are calculated by approximation based on average number
+                // of days over 4 years (365*4+1), not counting the extra days
+                // for leap years. If a reference date was available,
+                // the calculation could be more precise, but becomes complex,
+                // since the exact result depends on where the reference date
+                // falls within the period (e.g. beginning, end or ???)
+                // 1 year ~ (365*4+1)/4*60*60*24*100 = 3155760000 centiseconds
+                // 1 month ~ (365*4+1)/48*60*60*24*100 = 262980000 centiseconds
+                // 1 day = 8640000 centiseconds
+                // 1 hour = 360000 centiseconds
+                // 1 minute = 6000 centiseconds
+                var str = "P";
+                var nCs=n;
+                var nY=0, nM=0, nD=0, nH=0, nMin=0, nS=0;
+                n = Math.max(n,0); // there is no such thing as a negative duration
+                var nCs = n;
+                // Next set of operations uses whole seconds
+                with (Math)
+                {
+                    nCs = round(nCs);
+                    if (bPrecise == true)
+                    {
+                        nD = floor(nCs / 8640000);
+                    }
+                    else
+                    {
+                        nY = floor(nCs / 3155760000);
+                        nCs -= nY * 3155760000;
+                        nM = floor(nCs / 262980000);
+                        nCs -= nM * 262980000;
+                        nD = floor(nCs / 8640000);
+                    }
+                    nCs -= nD * 8640000;
+                    nH = floor(nCs / 360000);
+                    nCs -= nH * 360000;
+                    var nMin = floor(nCs /6000);
+                    nCs -= nMin * 6000
+                }
+                // Now we can construct string
+                if (nY > 0) str += nY + "Y";
+                if (nM > 0) str += nM + "M";
+                if (nD > 0) str += nD + "D";
+                if ((nH > 0) || (nMin > 0) || (nCs > 0))
+                {
+                    str += "T";
+                    if (nH > 0) str += nH + "H";
+                    if (nMin > 0) str += nMin + "M";
+                    if (nCs > 0) str += (nCs / 100) + "S";
+                }
+                if (str == "P") str = "PT0H0M0S";
+                // technically PT0S should do but SCORM test suite assumes longer form.
+                return str;
+            }
+        </script>
+        <script type="text/javascript" src="app/view/ui/BasePage.js"></script>
+        <script type="text/javascript" src="app/view/BasePage.js"></script>
+        <script type="text/javascript" src="app/view/ui/CenterPage.js"></script>
+        <script type="text/javascript" src="app/view/ui/WizardPage.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/contactinfo.js"></script>
+        <script type="text/javascript" src="app/view/contactinfo.js"></script>
+        <script type="text/javascript" src="app/view/ui/paths.js"></script>
+        <script type="text/javascript" src="app/view/paths.js"></script>
+        <script type="text/javascript" src="app/view/ui/about.js"></script>
+        <script type="text/javascript" src="app/view/about.js"></script>
+        <script type="text/javascript" src="app/view/ui/contacts.js"></script>
+        <script type="text/javascript" src="app/view/contacts.js"></script>
+        <script type="text/javascript" src="app/view/ui/config.js"></script>
+        <script type="text/javascript" src="app/view/config.js"></script>
+        <script type="text/javascript" src="app/view/ui/database.js"></script>
+        <script type="text/javascript" src="app/view/database.js"></script>
+        <script type="text/javascript" src="app/view/ui/newservice.js"></script>
+        <script type="text/javascript" src="app/view/newservice.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/identification.js"></script>
+        <script type="text/javascript" src="app/view/identification.js"></script>
+        <script type="text/javascript" src="app/view/ui/provider.js"></script>
+        <script type="text/javascript" src="app/view/provider.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/FormDataQuality.js"></script>
+        <script type="text/javascript" src="app/view/FormDataQuality.js"></script>
+        <script type="text/javascript" src="app/store/DataQualityStore.js"></script>
+
+
+        <script type="text/javascript" src="app/store/DataQualityStore.js"></script>
+        <script type="text/javascript" src="app/store/Offerings.js"></script>
+        <script type="text/javascript" src="app/store/Procedures.js"></script>
+        <script type="text/javascript" src="app/store/ObservedProperties.js"></script>
+        <!--<script type="text/javascript" src="app/store/Observations.js"></script>-->
+
+        <script type="text/javascript" src="app/store/Services.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/ObservationEditorColumn.js"></script>
+        <script type="text/javascript" src="app/view/ObservationEditorColumn.js"></script>
+        <script type="text/javascript" src="app/view/ui/ObservationEditor.js"></script>
+        <script type="text/javascript" src="app/view/ObservationEditor.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/serviceconfig.js"></script>
+        <script type="text/javascript" src="app/view/serviceconfig.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/geo.js"></script>
+        <script type="text/javascript" src="app/view/geo.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/getobservation.js"></script>
+        <script type="text/javascript" src="app/view/getobservation.js"></script>
+
+        <script type="text/javascript" src="app/store/serverstatus.js"></script>
+
+
+        <script type="text/javascript" src="app/view/ui/status.js"></script>
+        <script type="text/javascript" src="app/view/status.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/serviceurl.js"></script>
+        <script type="text/javascript" src="app/view/serviceurl.js"></script>
+
+        <script type="text/javascript" src="app/store/cmbIdentification.js"></script>
+        <script type="text/javascript" src="app/store/cmbSystemType.js"></script>
+        <script type="text/javascript" src="app/store/cmbSml.js"></script>
+        <script type="text/javascript" src="app/store/cmbName.js"></script>
+        <script type="text/javascript" src="app/store/cmbDocumentFormat.js"></script>
+        <script type="text/javascript" src="app/store/gridDocumentation.js"></script>
+        <script type="text/javascript" src="app/store/gridOutputs.js"></script>
+        <script type="text/javascript" src="app/store/Constraint.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/procedure.js"></script>
+        <script type="text/javascript" src="app/view/procedure.js"></script>
+
+        <script type="text/javascript" src="app/store/gridProceduresList.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/proceduresList.js"></script>
+        <script type="text/javascript" src="app/view/proceduresList.js"></script>
+
+        <script type="text/javascript" src="app/store/gridObservedProperties.js"></script>
+        <script type="text/javascript" src="app/store/gridUoms.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/obsPropEditor.js"></script>
+        <script type="text/javascript" src="app/view/obsPropEditor.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/uomsEditor.js"></script>
+        <script type="text/javascript" src="app/view/uomsEditor.js"></script>
+
+        <script type="text/javascript" src="app/store/gridOfferings.js"></script>
+        <script type="text/javascript" src="app/view/ui/offeringsEditor.js"></script>
+        <script type="text/javascript" src="app/view/offeringsEditor.js"></script>
+
+        <script type="text/javascript" src="app/store/cmbNameDescription.js"></script>
+        <script type="text/javascript" src="app/view/ui/qualityindexEditor.js"></script>
+        <script type="text/javascript" src="app/view/qualityindexEditor.js"></script>
+
+        <!-- DEVELOPERS INCLUDE -->
+        <script type="text/javascript" src="app/view/ui/MainMenu.js"></script>
+        <script type="text/javascript" src="app/view/MainMenu.js"></script>
+        <script type="text/javascript" src="app/view/ui/MainMenu2.js"></script>
+        <script type="text/javascript" src="app/view/MainMenu2.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/ObservationEditorAdvancedOperations.js"></script>
+        <script type="text/javascript" src="app/view/ObservationEditorAdvancedOperations.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/serviceEditor.js"></script>
+        <script type="text/javascript" src="app/view/serviceEditor.js"></script>
+
+
+        <script type="text/javascript" src="app/Procedure.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/ProcedureChooser.js"></script>
+        <script type="text/javascript" src="app/view/ProcedureChooser.js"></script>
+        
+        <script type="text/javascript" src="app/view/ui/ProcedurePlotter.js"></script>
+        <script type="text/javascript" src="app/view/ProcedurePlotter.js"></script>
+        
+        <script type="text/javascript" src="app/view/ui/CheckColumn.js"></script>
+        <script type="text/javascript" src="app/view/CheckColumn.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/Calc.js"></script>
+        <script type="text/javascript" src="app/view/Calc.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/Chart.js"></script>
+        <script type="text/javascript" src="app/view/Chart.js"></script>
+        
+        
+        <script type="text/javascript" src="app/view/ui/ProcedureChart.js"></script>
+        <script type="text/javascript" src="app/view/ProcedureChart.js"></script>
+        <script type="text/javascript" src="app/view/ui/ProcedureGrid.js"></script>
+        <script type="text/javascript" src="app/view/ProcedureGrid.js"></script>
+        <script type="text/javascript" src="app/view/ui/ProcedureGridEditor.js"></script>
+        <script type="text/javascript" src="app/view/ProcedureGridEditor.js"></script>
+        
+        
+        <script type="text/javascript" src="app/view/ui/Editor1.js"></script>
+        <script type="text/javascript" src="app/view/Editor1.js"></script>
+        
+        
+        <script type="text/javascript" src="app/store/RatingCurve.js"></script>
+        <script type="text/javascript" src="app/store/vplist.js"></script>
+        <script type="text/javascript" src="app/view/ui/VirtualProcedureEditor.js"></script>
+        <script type="text/javascript" src="app/view/VirtualProcedureEditor.js"></script>
+
+
+
+        <style type="text/css">
+            .x-btn-default-toolbar-small .x-btn-inner {
+                color: white !important;
+            }
+            .x-btn-arrow {
+                background-image: url('ext/resources/themes/images/default/button/arrow.gif');
+                display: block;
+            }
+        </style>
+
+        <script type="text/javascript">
+            
+            Ext.ns("wa");
+            wa.isodef = "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601";
+            wa.url = "../wa";
+
+            Ext.Loader.setConfig({
+                enabled: false
+            });
+            
+            Ext.application({
+                
+                name: 'istsos',
+
+                launch: function() {
+                    
+                    Ext.QuickTips.init();
+                    
+                    Ext.Ajax.on("requestexception",function(conn, response, options, eOpts ){
+                        try{
+                            var json = Ext.decode(response.responseText);
+                            if(!json.success && !Ext.isEmpty(json.message)){
+                                Ext.Msg.alert(response.statusText, json.message);
+                            }
+                        }catch(e){
+                            console.error(response);
+                        }
+                    });
+                    
+                    Ext.Ajax.on("requestcomplete",function(conn, response, options, eOpts ){
+                        try{
+                            var json = Ext.decode(response.responseText);
+                            if(!json.success && !Ext.isEmpty(json.message)){
+                                Ext.Msg.alert("Server message",json.message + "<br/><br/>" + 
+                                    "<small>Status response: " + response.statusText + "</small><br/>" + 
+                                    "<small>Resource: " + json.resource + "</small><br/>" + 
+                                    "<small>Method: " + json.method + "</small><br/>" + 
+                                    "<small>Path " + json.path + "</small>");
+                                console.error(json.message);
+                            }else if (json.success && !Ext.isEmpty(json.message)){
+                                console.log(json.message);
+                            }
+                        }catch(e){
+                            console.error(response);
+                        }
+                    });
+                    
+                    
+                    
+                    Ext.create('Ext.Viewport', {
+                        layout: "fit",
+                        items: Ext.create('istsos.view.MainMenu2')
+                    }).show();
+                    
+                }
+            });
+        </script>
+    </head>
+    <body></body>
+</html>
diff --git a/interface/istsos-old.xds b/interface/istsos-old.xds
new file mode 100755
index 0000000..083d514
--- /dev/null
+++ b/interface/istsos-old.xds
@@ -0,0 +1,10998 @@
+{
+    "name": "istsos.xds",
+    "settings": {
+        "urlPrefix": "http://localhost/",
+        "directAPI": "",
+        "spacesToIndent": "4",
+        "codeGenFormat": "Class",
+        "exportPath": ".",
+        "extPath": "ext/",
+        "lineEnding": "LF",
+        "instantiateStore": true,
+        "exportXDSFiles": true,
+        "genTimestamps": true,
+        "appName": "istsos"
+    },
+    "xdsVersion": "1.2.3",
+    "components": [
+        {
+            "id": "ExtBox1-ext-gen1666",
+            "type": "viewport",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "id": "mainPanel",
+                "itemId": "",
+                "layout": "border",
+                "designer|userClassName": "MainPanel"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen1754",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "mainCenter",
+                        "layout": "fit",
+                        "bodyPadding": "8px",
+                        "title": "",
+                        "designer|userClassName": "MyPanel",
+                        "layout|region": "center"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen2198",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "cls": null,
+                        "height": 70,
+                        "html": "<div class='mainHeaderTitle'>istSOS manager</div>\n<div class='mainHeaderSubtitle'> > Control Panel for Sensor Observation Service</div>",
+                        "id": "mainHead",
+                        "padding": null,
+                        "bodyCls": "mainHeader",
+                        "bodyPadding": "15 0 0 8",
+                        "bodyStyle": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel2",
+                        "layout|region": "north"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen2515",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 25,
+                        "html": "Open Source Software by Institute of Earth Science - SUPSI",
+                        "id": "mainFoot",
+                        "bodyCls": "mainFooter",
+                        "bodyPadding": 8,
+                        "title": "",
+                        "designer|userClassName": "MyPanel3",
+                        "layout|region": "south"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen5563",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "panelMenu",
+                        "width": 210,
+                        "layout": "border",
+                        "title": "",
+                        "designer|userClassName": "MyPanel13",
+                        "layout|region": "west"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen12379",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 30,
+                                "style": "background-color: white !important;",
+                                "ui": null,
+                                "designer|userClassName": "MyToolbar5",
+                                "container|align": "stretch",
+                                "container|padding": 2,
+                                "layout|region": "north",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen12556",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnMainMenu",
+                                        "enableToggle": true,
+                                        "pressed": true,
+                                        "text": "Server",
+                                        "toggleGroup": "menugroup",
+                                        "designer|userClassName": "MyButton7",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen12776",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnServicesMenu",
+                                        "enableToggle": true,
+                                        "text": "Services",
+                                        "toggleGroup": "menugroup",
+                                        "designer|userClassName": "MyButton8",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen12998",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnDataMenu",
+                                        "enableToggle": true,
+                                        "text": "Data",
+                                        "toggleGroup": "menugroup",
+                                        "designer|userClassName": "MyButton9",
+                                        "layout|flex": 1
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen6842",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "menuCard",
+                                "activeItem": 0,
+                                "layout": "card",
+                                "title": "",
+                                "designer|userClassName": "MyPanel15",
+                                "layout|region": "center"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen2221",
+                                    "type": "component",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "baseCls": null,
+                                        "id": "mainMenu",
+                                        "padding": "10px",
+                                        "style": "background: #fff;",
+                                        "styleHtmlContent": true,
+                                        "width": 150,
+                                        "designer|userClassName": "MyComponent"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen16528",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "servicesMenu",
+                                        "layout": "accordion",
+                                        "bodyPadding": "10px",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel16"
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen2664",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "style": null,
+                "width": null,
+                "layout": "border",
+                "bodyStyle": null,
+                "designer|userClassName": "BasePage"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen2804",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "cls": null,
+                        "componentCls": null,
+                        "height": null,
+                        "hidden": true,
+                        "padding": null,
+                        "layout": "fit",
+                        "bodyBorder": true,
+                        "bodyCls": "centerTitle",
+                        "bodyPadding": "8px",
+                        "designer|userClassName": "MyContainer1",
+                        "layout|region": "north"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen2986",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": null,
+                        "margin": null,
+                        "style": null,
+                        "styleHtmlContent": true,
+                        "autoScroll": true,
+                        "layout": "anchor",
+                        "bodyBorder": true,
+                        "bodyCls": "centerBody",
+                        "bodyPadding": "8 8 8 16",
+                        "bodyStyle": null,
+                        "designer|userClassName": "MyContainer2",
+                        "layout|region": "center"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen3196",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 20,
+                        "hidden": true,
+                        "bodyPadding": "8px",
+                        "designer|userClassName": "MyContainer3",
+                        "layout|region": "south"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen9226",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "id": "contactinfo",
+                "width": null,
+                "bodyPadding": 10,
+                "bodyStyle": "centerBody",
+                "title": "",
+                "designer|userClassName": "contactinfo"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen6578",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen9554",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "contact",
+                        "fieldLabel": "Contact",
+                        "designer|userClassName": "MyTextField",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen9777",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "organization",
+                        "fieldLabel": "Organization",
+                        "designer|userClassName": "MyTextField1",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10003",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "position",
+                        "fieldLabel": "Position",
+                        "designer|userClassName": "MyTextField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10271",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "addressType",
+                        "fieldLabel": "Address type",
+                        "designer|userClassName": "MyTextField3",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10503",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "address",
+                        "fieldLabel": "Address",
+                        "designer|userClassName": "MyTextField4",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10738",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "city",
+                        "fieldLabel": "City",
+                        "designer|userClassName": "MyTextField5",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10976",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "state",
+                        "fieldLabel": "State",
+                        "designer|userClassName": "MyTextField6",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen11217",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "zipCode",
+                        "fieldLabel": "ZIP code",
+                        "designer|userClassName": "MyTextField7",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen11461",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "country",
+                        "fieldLabel": "Coutry",
+                        "designer|userClassName": "MyTextField8",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen11708",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "telephone",
+                        "fieldLabel": "Telephone",
+                        "designer|userClassName": "MyTextField9",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen12079",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "fax",
+                        "fieldLabel": "Fax",
+                        "designer|userClassName": "MyTextField10",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen12332",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "email",
+                        "fieldLabel": "Email",
+                        "designer|userClassName": "MyTextField11",
+                        "layout|anchor": "100%"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen7237",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "id": null,
+                "width": null,
+                "bodyPadding": 10,
+                "bodyStyle": "centerBody",
+                "title": "",
+                "designer|userClassName": "paths",
+                "designer|userAlias": "paths"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen7247",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "istsos",
+                        "fieldLabel": "istSOS lib",
+                        "designer|userClassName": "MyTextField",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen7254",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "services",
+                        "fieldLabel": "istSOS config",
+                        "designer|userClassName": "MyTextField1",
+                        "layout|anchor": "100%"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen16479",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "defaults": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "about"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen8701",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "istSOS",
+                        "designer|userClassName": "MyFieldSet20"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen9791",
+                            "type": "displayfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "istsos_version",
+                                "fieldLabel": "Version",
+                                "designer|userClassName": "MyTextField92",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen10368",
+                            "type": "displayfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "updates",
+                                "name": "istsos_message",
+                                "fieldLabel": "Updates",
+                                "designer|userClassName": "MyTextField94",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11473",
+                            "type": "displayfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "hidden": true,
+                                "id": "download",
+                                "name": "download_url",
+                                "fieldLabel": "Download",
+                                "designer|userClassName": "MyDisplayField3",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen10976",
+                            "type": "textareafield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "hidden": true,
+                                "id": "changelog",
+                                "name": "latest_istsos_changelog",
+                                "readOnly": true,
+                                "fieldLabel": "Change log",
+                                "designer|userClassName": "MyTextArea",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen12714",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<p>istSOS (Istituto Scienze della Terra Sensor Observation Service) is an implementation of the Sensor Observation Service standard from Open Geospatial Consortium.\n</p>\n<p>\nThe developement of istSOS has started in 2009 in order to provide a simple implementation of the SOS standard for the management, provision and integration of hydro-meteorological data collected in Canton Ticino (Switzerland).\n</p>\n<p>\nistSOS is entirely written in <a href=\"ht [...]
+                        "padding": "10 0 0 0",
+                        "styleHtmlContent": true,
+                        "designer|userClassName": "MyContainer8",
+                        "layout|anchor": "100%"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen19556",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "contacts"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen19251",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen26395",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Authority",
+                        "designer|userClassName": "MyFieldSet2"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen26579",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "name",
+                                "fieldLabel": "Name",
+                                "designer|userClassName": "MyTextField19",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen27009",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "version",
+                                "fieldLabel": "Version",
+                                "designer|userClassName": "MyTextField20",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen27520",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Service Identification:",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen27853",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "title",
+                                "fieldLabel": "Title",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen28163",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "abstract",
+                                "fieldLabel": "Abstract",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen28476",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "keywords",
+                                "fieldLabel": "Keywords",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen28792",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "fees",
+                                "fieldLabel": "Fees",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29111",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "accessconstrains",
+                                "fieldLabel": "Access constrains",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen19777",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "identification"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen19780",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen19804",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Service Identification:",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19810",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "title",
+                                "fieldLabel": "Title",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19815",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "abstract",
+                                "fieldLabel": "Abstract",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19820",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "keywords",
+                                "fieldLabel": "Keywords",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19825",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "fees",
+                                "fieldLabel": "Fees",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19830",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "accessconstrains",
+                                "fieldLabel": "Access constrains",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen20513",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "provider"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen20516",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen20523",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Service Provider:",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen20529",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "providername",
+                                "fieldLabel": "Name",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20534",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "providersite",
+                                "fieldLabel": "Web site",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20539",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactname",
+                                "fieldLabel": "Contact name",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20544",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactposition",
+                                "fieldLabel": "Contact position",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20549",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactvoice",
+                                "fieldLabel": "Voice",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21279",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactfax",
+                                "fieldLabel": "Fax",
+                                "designer|userClassName": "MyTextField53",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21501",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactemail",
+                                "fieldLabel": "Email",
+                                "designer|userClassName": "MyTextField54",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21726",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactdeliverypoint",
+                                "fieldLabel": "Address",
+                                "designer|userClassName": "MyTextField55",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21954",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactpostalcode",
+                                "fieldLabel": "Postal code",
+                                "designer|userClassName": "MyTextField56",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen22232",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactcity",
+                                "fieldLabel": "City",
+                                "designer|userClassName": "MyTextField57",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen22466",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactadminarea",
+                                "fieldLabel": "State",
+                                "designer|userClassName": "MyTextField58",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen22703",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactcountry",
+                                "fieldLabel": "Country",
+                                "designer|userClassName": "MyTextField59",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen29943",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "config"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen21157",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen30217",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Proxy URL (optional)",
+                        "designer|userClassName": "MyFieldSet1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen30414",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "fieldLabel": "Url",
+                                "designer|userClassName": "MyTextField14",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen30618",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "hidden": true,
+                                "fieldLabel": "POST",
+                                "designer|userClassName": "MyTextField15",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen30845",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "SensorML folder",
+                        "designer|userClassName": "MyFieldSet3"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen31051",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "smlpath",
+                                "fieldLabel": "Path",
+                                "designer|userClassName": "MyTextField16",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen31284",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Virtual procedures",
+                        "designer|userClassName": "MyFieldSet4"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen31496",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "vppath",
+                                "fieldLabel": "Path",
+                                "designer|userClassName": "MyTextField17",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen31735",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Coordinate system",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen31953",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "defaultepsg",
+                                "fieldLabel": "Default EPSG",
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen33631",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "permittedepsg",
+                                "fieldLabel": "Permitted EPSG",
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen32198",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "xaxisname",
+                                "fieldLabel": "X axis name",
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen33137",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "yaxisname",
+                                "fieldLabel": "Y axis name",
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen33423",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "zaxisname",
+                                "fieldLabel": "Z axis name",
+                                "designer|userClassName": "MyTextField26",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen11516",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "geo"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen11519",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen11567",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Coordinate system",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen11573",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "istsosepsg",
+                                "fieldLabel": "Default EPSG",
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11578",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "allowedepsg",
+                                "fieldLabel": "Permitted EPSG",
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11583",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "xaxisname",
+                                "fieldLabel": "X axis name",
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11588",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "yaxisname",
+                                "fieldLabel": "Y axis name",
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11593",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "zaxisname",
+                                "fieldLabel": "Z axis name",
+                                "designer|userClassName": "MyTextField26",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen24013",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "getobservation",
+                "designer|userAlias": "getobservation"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen24023",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "GetObservation configuration:",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen24034",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "maxgoperiod",
+                                "fieldLabel": "Max request interval (hours)",
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen24044",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "defaultqi",
+                                "fieldLabel": "Default quality index",
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen24039",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "aggregatenodataqi",
+                                "fieldLabel": "Aggregation no-data quality index",
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen24029",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "aggregatenodata",
+                                "fieldLabel": "Aggregation no-data value",
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen35508",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "database",
+                "designer|userAlias": "database"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen22215",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen35762",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "PostGIS database",
+                        "designer|userClassName": "MyFieldSet6"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen35959",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "user",
+                                "fieldLabel": "User",
+                                "designer|userClassName": "MyTextField28",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36163",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "password",
+                                "fieldLabel": "Password",
+                                "designer|userClassName": "MyTextField29",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36370",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "host",
+                                "fieldLabel": "Host",
+                                "designer|userClassName": "MyTextField30",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36793",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "port",
+                                "fieldLabel": "Port",
+                                "designer|userClassName": "MyTextField32",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36580",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "dbname",
+                                "fieldLabel": "DB name",
+                                "designer|userClassName": "MyTextField31",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen7192",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "MyContainer5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen7344",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar3",
+                                "container|pack": "center"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen7555",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnTestConnection",
+                                        "text": "Test connection",
+                                        "designer|userClassName": "MyButton7",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen17457",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "serviceurl"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen9215",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": null,
+                        "padding": 10,
+                        "checkboxName": "cbproxy",
+                        "title": "Proxy url",
+                        "designer|userClassName": "MyFieldSet1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen11353",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "url",
+                                "fieldLabel": "Url",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField14",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen88263",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "id": "newprocpanel",
+                "width": null,
+                "autoScroll": true,
+                "defaults": "defaults: {\nanchor: '100%',\npadding: '10px',\n }",
+                "layout": "anchor",
+                "bodyPadding": null,
+                "title": "",
+                "designer|userClassName": "procedure"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen88266",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "padding": 8,
+                        "width": null,
+                        "layout": "anchor",
+                        "designer|userClassName": "MyForm17"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen88272",
+                            "type": "container",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 60,
+                                "html": "<h3>Procedure</h3>\nBla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla ",
+                                "padding": "0 0 16 0",
+                                "designer|userClassName": "MyContainer13"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen97361",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 10,
+                                "id": "generalInfo",
+                                "padding": null,
+                                "bodyPadding": null,
+                                "title": "",
+                                "designer|userClassName": "MyForm11"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen88279",
+                                    "type": "fieldset",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": null,
+                                        "margin": 0,
+                                        "padding": 10,
+                                        "checkboxName": "cbproxy",
+                                        "title": "General info",
+                                        "designer|userClassName": "MyFieldSet1"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen88285",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "system",
+                                                "fieldLabel": "Name",
+                                                "labelSeparator": null,
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField14",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88290",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "description",
+                                                "fieldLabel": "Description",
+                                                "designer|userClassName": "MyTextField93",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88295",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "keywords",
+                                                "fieldLabel": "Keywords",
+                                                "designer|userClassName": "MyTextField94",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen123882",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "classification",
+                                "bodyPadding": null,
+                                "title": "",
+                                "designer|userClassName": "MyForm24"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen88362",
+                                    "type": "fieldset",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "margin": 0,
+                                        "title": "Classification",
+                                        "designer|userClassName": "MyFieldSet39"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen121259",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "systemtype",
+                                                "fieldLabel": "System type",
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "forceSelection": true,
+                                                "store": "systemtype",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox5",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88373",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "sensortype",
+                                                "fieldLabel": "Sensor Type",
+                                                "allowBlank": false,
+                                                "emptyText": "tipping-bucket gauge, ...",
+                                                "designer|userClassName": "MyTextField174",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen23632",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "margin": 0,
+                                "title": "Location",
+                                "designer|userClassName": "MyFieldSet48"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen30448",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmLocation",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm23"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen30540",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "name",
+                                                "fieldLabel": "FOI name",
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField193",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen31516",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cbepsg",
+                                                "name": "epsg",
+                                                "fieldLabel": "EPSG",
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "forceSelection": true,
+                                                "store": "locationEPSG",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox7",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen32488",
+                                            "type": "fieldcontainer",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 30,
+                                                "layout": "column",
+                                                "fieldLabel": "Coordinates",
+                                                "designer|userClassName": "MyFieldContainer2"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen34690",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "x",
+                                                        "fieldLabel": "X",
+                                                        "labelWidth": 20,
+                                                        "allowBlank": false,
+                                                        "designer|userClassName": "MyTextField188",
+                                                        "layout|columnWidth": 0.5
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen35049",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "y",
+                                                        "fieldLabel": "Y",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 20,
+                                                        "allowBlank": false,
+                                                        "designer|userClassName": "MyTextField189",
+                                                        "layout|columnWidth": 0.5
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen49282",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "smlOutputs",
+                                "margin": 0,
+                                "padding": 8,
+                                "title": "Outputs",
+                                "designer|userClassName": "MyFieldSet36"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen51833",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmSmlOutputs",
+                                        "itemId": "frmSml",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm30"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen52528",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbObservedProperty",
+                                                "itemId": "cmbSml",
+                                                "name": "name",
+                                                "fieldLabel": "<span class='softLink' onclick='Ext.getCmp(\"newprocpanel\").openObsPropEditorWin();'>Observed property</span>",
+                                                "labelWidth": 120,
+                                                "allowBlank": false,
+                                                "displayField": "definition",
+                                                "forceSelection": true,
+                                                "store": "cmbobservedproperties",
+                                                "valueField": "definition",
+                                                "designer|userClassName": "MyComboBox10",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56600",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbUom",
+                                                "name": "uom",
+                                                "fieldLabel": "<span class='softLink' onclick='Ext.getCmp(\"newprocpanel\").openUomsEditorWin();'>Unit of measure</span>",
+                                                "labelWidth": 120,
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "forceSelection": true,
+                                                "store": "cmbuom",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox9",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen53233",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "description",
+                                                "fieldLabel": "Description",
+                                                "labelWidth": 120,
+                                                "designer|userClassName": "MyTextField192",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen63834",
+                                            "type": "fieldset",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "collapsed": true,
+                                                "collapsible": true,
+                                                "title": "Quality index check: level 0 (optional)",
+                                                "designer|userClassName": "MyFieldSet52",
+                                                "layout|anchor": "100%"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen58081",
+                                                    "type": "fieldcontainer",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "height": 30,
+                                                        "layout": "column",
+                                                        "fieldLabel": "Constraint",
+                                                        "designer|userClassName": "MyFieldContainer2"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen58087",
+                                                            "type": "textfield",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "name": "from",
+                                                                "fieldLabel": "From",
+                                                                "labelWidth": 50,
+                                                                "designer|userClassName": "MyTextField188",
+                                                                "layout|columnWidth": 0.5
+                                                            }
+                                                        },
+                                                        {
+                                                            "id": "ExtBox1-ext-gen58092",
+                                                            "type": "textfield",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "name": "to",
+                                                                "fieldLabel": "To",
+                                                                "labelAlign": "right",
+                                                                "labelWidth": 40,
+                                                                "designer|userClassName": "MyTextField189",
+                                                                "layout|columnWidth": 0.5
+                                                            }
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen70705",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "btnAddSml",
+                                                "margin": "0 0 10 0",
+                                                "padding": null,
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton28",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen49314",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 120,
+                                        "id": null,
+                                        "itemId": "gridSml",
+                                        "margin": null,
+                                        "minHeight": 120,
+                                        "title": "",
+                                        "forceFit": true,
+                                        "store": "gridoutputs",
+                                        "designer|userClassName": "MyGridPanel3"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen49318",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView3"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen49321",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "gridToolbar",
+                                                "designer|userClassName": "MyToolbar7",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen49326",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": null,
+                                                        "itemId": "btnRemoveSml",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton11",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66797",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn26"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66806",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn27"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66815",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "definition",
+                                                "text": "Definition",
+                                                "designer|userClassName": "MyColumn28"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66824",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "uom",
+                                                "text": "Uom",
+                                                "designer|userClassName": "MyColumn29"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66842",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "hidden": true,
+                                                "dataIndex": "role",
+                                                "text": "Role",
+                                                "designer|userClassName": "MyColumn31"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66851",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "from",
+                                                "text": "From",
+                                                "designer|userClassName": "MyColumn32"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66860",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "to",
+                                                "text": "To",
+                                                "designer|userClassName": "MyColumn33"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen88755",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "padding": 8,
+                        "layout": "anchor",
+                        "designer|userClassName": "MyForm17"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen16079",
+                            "type": "container",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 60,
+                                "html": "<h4>Optional parameters:</h4>\nasdf lékasdf klajd flk jadlé fjf éladj fléa.",
+                                "margin": null,
+                                "padding": null,
+                                "layout": "fit",
+                                "designer|userClassName": "MyContainer13"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen88526",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Contacts (optional)",
+                                "designer|userClassName": "MyFieldSet38"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen136009",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MyContainer48",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen136556",
+                                            "type": "form",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "border": 0,
+                                                "id": "frmOwner",
+                                                "bodyPadding": null,
+                                                "title": "",
+                                                "designer|userClassName": "MyForm27"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen137033",
+                                                    "type": "hiddenfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "role",
+                                                        "value": "urn:x-ogc:def:classifiers:x-ist:1.0:contactType:owner",
+                                                        "fieldLabel": "Label",
+                                                        "designer|userClassName": "MyHiddenField",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen141855",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "organizationName",
+                                                        "fieldLabel": "Owner",
+                                                        "labelWidth": 130,
+                                                        "allowBlank": false,
+                                                        "emptyText": "Organization name...",
+                                                        "designer|userClassName": "MyTextField82",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen88532",
+                                                    "type": "fieldset",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "collapsed": true,
+                                                        "collapsible": true,
+                                                        "title": "Details (optional)",
+                                                        "designer|userClassName": "MyFieldSet32",
+                                                        "layout|anchor": "100%"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen88536",
+                                                            "type": "container",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "layout": "column",
+                                                                "designer|userClassName": "MyContainer18",
+                                                                "layout|anchor": "100%"
+                                                            },
+                                                            "cn": [
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88540",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer19",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88544",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "individualName",
+                                                                                "fieldLabel": "Person",
+                                                                                "designer|userClassName": "MyTextField152",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88549",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "voice",
+                                                                                "fieldLabel": "Telephone",
+                                                                                "designer|userClassName": "MyTextField154",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88554",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "fax",
+                                                                                "fieldLabel": "Fax",
+                                                                                "designer|userClassName": "MyTextField190",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88559",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "email",
+                                                                                "fieldLabel": "email",
+                                                                                "designer|userClassName": "MyTextField192",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88565",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer22",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88574",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "web",
+                                                                                "fieldLabel": "Web",
+                                                                                "designer|userClassName": "MyTextField193",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88579",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "deliveryPoint",
+                                                                                "fieldLabel": "Address",
+                                                                                "designer|userClassName": "MyTextField188",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88584",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "city",
+                                                                                "fieldLabel": "City",
+                                                                                "designer|userClassName": "MyTextField189",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen152718",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "administrativeArea",
+                                                                                "fieldLabel": "Admin area",
+                                                                                "designer|userClassName": "MyTextField121",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88589",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "postalcode",
+                                                                                "fieldLabel": "Postal code",
+                                                                                "designer|userClassName": "MyTextField191",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen145039",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MyContainer48",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen145043",
+                                            "type": "form",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "border": 0,
+                                                "id": "frmManufacturer",
+                                                "bodyPadding": null,
+                                                "title": "",
+                                                "designer|userClassName": "MyForm27"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen145046",
+                                                    "type": "hiddenfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "role",
+                                                        "value": "urn:x-ogc:def:classifiers:x-ist:1.0:contactType:manufacturer",
+                                                        "fieldLabel": "Label",
+                                                        "designer|userClassName": "MyHiddenField",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen145053",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "organizationName",
+                                                        "fieldLabel": "Manufacturer",
+                                                        "labelWidth": 130,
+                                                        "allowBlank": false,
+                                                        "emptyText": "Organization name...",
+                                                        "designer|userClassName": "MyTextField82",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen88597",
+                                                    "type": "fieldset",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "collapsed": true,
+                                                        "collapsible": true,
+                                                        "title": "Details (optional)",
+                                                        "designer|userClassName": "MyFieldSet32"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen88601",
+                                                            "type": "container",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "layout": "column",
+                                                                "designer|userClassName": "MyContainer18",
+                                                                "layout|anchor": "100%"
+                                                            },
+                                                            "cn": [
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88605",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer19",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88609",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "individualName",
+                                                                                "fieldLabel": "Person",
+                                                                                "designer|userClassName": "MyTextField152",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88614",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "voice",
+                                                                                "fieldLabel": "Telephone",
+                                                                                "designer|userClassName": "MyTextField154",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88619",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "fax",
+                                                                                "fieldLabel": "Fax",
+                                                                                "designer|userClassName": "MyTextField190",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88624",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "email",
+                                                                                "fieldLabel": "email",
+                                                                                "designer|userClassName": "MyTextField192",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88630",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer22",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88639",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "web",
+                                                                                "fieldLabel": "Web",
+                                                                                "designer|userClassName": "MyTextField193",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88644",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "deliveryPoint",
+                                                                                "fieldLabel": "Address",
+                                                                                "designer|userClassName": "MyTextField188",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88649",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "city",
+                                                                                "fieldLabel": "City",
+                                                                                "designer|userClassName": "MyTextField189",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen153278",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "administrativeArea",
+                                                                                "fieldLabel": "Admin area",
+                                                                                "designer|userClassName": "MyTextField121",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88654",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "postalcode",
+                                                                                "fieldLabel": "Postal code",
+                                                                                "designer|userClassName": "MyTextField191",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen146508",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MyContainer48",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen146512",
+                                            "type": "form",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "border": 0,
+                                                "id": "frmOperator",
+                                                "bodyPadding": null,
+                                                "title": "",
+                                                "designer|userClassName": "MyForm27"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen146515",
+                                                    "type": "hiddenfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "role",
+                                                        "value": "urn:x-ogc:def:classifiers:x-ist:1.0:contactType:operator",
+                                                        "fieldLabel": "Label",
+                                                        "designer|userClassName": "MyHiddenField",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen146522",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "organizationName",
+                                                        "fieldLabel": "Operator",
+                                                        "labelWidth": 130,
+                                                        "allowBlank": false,
+                                                        "emptyText": "Organization name...",
+                                                        "designer|userClassName": "MyTextField82",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen88662",
+                                                    "type": "fieldset",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "collapsed": true,
+                                                        "collapsible": true,
+                                                        "title": "Details (optional)",
+                                                        "designer|userClassName": "MyFieldSet32"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen88666",
+                                                            "type": "container",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "layout": "column",
+                                                                "designer|userClassName": "MyContainer18",
+                                                                "layout|anchor": "100%"
+                                                            },
+                                                            "cn": [
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88670",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer19",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88674",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "individualName",
+                                                                                "fieldLabel": "Person",
+                                                                                "designer|userClassName": "MyTextField152",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88679",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "voice",
+                                                                                "fieldLabel": "Telephone",
+                                                                                "designer|userClassName": "MyTextField154",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88684",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "fax",
+                                                                                "fieldLabel": "Fax",
+                                                                                "designer|userClassName": "MyTextField190",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88689",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "email",
+                                                                                "fieldLabel": "email",
+                                                                                "designer|userClassName": "MyTextField192",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88695",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer22",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88704",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "web",
+                                                                                "fieldLabel": "Web",
+                                                                                "designer|userClassName": "MyTextField193",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88709",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "deliveryPoint",
+                                                                                "fieldLabel": "Address",
+                                                                                "designer|userClassName": "MyTextField188",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88714",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "city",
+                                                                                "fieldLabel": "City",
+                                                                                "designer|userClassName": "MyTextField189",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen153841",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "administrativeArea",
+                                                                                "fieldLabel": "Admin area",
+                                                                                "designer|userClassName": "MyTextField121",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88719",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "postalcode",
+                                                                                "fieldLabel": "Postal code",
+                                                                                "designer|userClassName": "MyTextField191",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen155986",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "smlDocumentation",
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Documents (optional)",
+                                "designer|userClassName": "MyFieldSet61"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen156435",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 150,
+                                        "itemId": "frmSml",
+                                        "layout": "vbox",
+                                        "bodyPadding": "10 0 5 0",
+                                        "title": "",
+                                        "designer|userClassName": "MyForm30",
+                                        "container|align": "stretch"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen161584",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "description",
+                                                "fieldLabel": "Description",
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField276",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen161970",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "applicationType",
+                                                "itemId": "cmbSml",
+                                                "name": "format",
+                                                "fieldLabel": "Format",
+                                                "displayField": "format",
+                                                "forceSelection": true,
+                                                "queryMode": "local",
+                                                "store": "cmbdocumentformat",
+                                                "typeAhead": true,
+                                                "valueField": "format",
+                                                "designer|userClassName": "MyComboBox6",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen161200",
+                                            "type": "datefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "date",
+                                                "fieldLabel": "Date",
+                                                "designer|userClassName": "MyDateField2",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen162358",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "link",
+                                                "fieldLabel": "Link",
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField277",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen164519",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "btnAddSml",
+                                                "width": 30,
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton30",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen167273",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 120,
+                                        "itemId": "gridSml",
+                                        "margin": 8,
+                                        "minHeight": 120,
+                                        "title": "",
+                                        "forceFit": true,
+                                        "store": "griddocumentation",
+                                        "designer|userClassName": "MyGridPanel13"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen167309",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView13"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen168542",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "gridToolbar",
+                                                "designer|userClassName": "MyToolbar25",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen168902",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "itemId": "btnRemoveSml",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton31",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen173222",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn21"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen173231",
+                                            "type": "datecolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "date",
+                                                "text": "Date",
+                                                "designer|userClassName": "MyDateColumn2"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen173240",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "format",
+                                                "text": "Format",
+                                                "designer|userClassName": "MyColumn22"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen173249",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "link",
+                                                "text": "Link",
+                                                "designer|userClassName": "MyColumn23"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen40729",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Interfaces (optional)",
+                                "designer|userClassName": "MyFieldSet49"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen41301",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmInterfaces",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm22"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen41714",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "interfaces",
+                                                "fieldLabel": "Name list (csv)",
+                                                "emptyText": "RS-232,RS-485,BLUETOOTH,WIFI,IR ...",
+                                                "designer|userClassName": "MyTextField187",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen43626",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "smlInputs",
+                                "padding": 8,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Inputs (optional)",
+                                "designer|userClassName": "MyFieldSet36"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen43630",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "id": null,
+                                        "itemId": "frmSml",
+                                        "padding": null,
+                                        "layout": "hbox",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm23",
+                                        "container|align": "stretch",
+                                        "container|padding": null,
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen43634",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "cmbSml",
+                                                "margin": "0 6 0 0",
+                                                "padding": null,
+                                                "name": "name",
+                                                "fieldLabel": "<span class='softLink' onclick='alert(\\\"to do\\\");'>Name</span>",
+                                                "labelWidth": 40,
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "store": "cmbphenomenon",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyTextField169",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43642",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "padding": null,
+                                                "name": "description",
+                                                "fieldLabel": "Description",
+                                                "labelAlign": "right",
+                                                "labelWidth": 80,
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField170",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43650",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": null,
+                                                "itemId": "btnAddSml",
+                                                "margin": "0 0 0 6",
+                                                "width": 50,
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton7",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen43658",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 120,
+                                        "id": null,
+                                        "itemId": "gridSml",
+                                        "margin": 8,
+                                        "minHeight": 120,
+                                        "title": "",
+                                        "store": "gridinput",
+                                        "designer|userClassName": "MyGridPanel3"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen43662",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView3"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43665",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "gridToolbar",
+                                                "designer|userClassName": "MyToolbar7",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen43670",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": null,
+                                                        "itemId": "btnRemoveSml",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton11",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43675",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "flex": null,
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn16"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43678",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "flex": 0.5,
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn17"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43681",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "definition",
+                                                "flex": 1,
+                                                "text": "Definition",
+                                                "designer|userClassName": "MyColumn18"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen88301",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "smlIdentification",
+                                "padding": 8,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Identification (optional)",
+                                "designer|userClassName": "MyFieldSet36"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen102814",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "id": "frmIdentification",
+                                        "itemId": "frmSml",
+                                        "padding": null,
+                                        "layout": "hbox",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm23",
+                                        "container|align": "stretch",
+                                        "container|padding": null,
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen88307",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "cmbSml",
+                                                "margin": "0 6 0 0",
+                                                "padding": null,
+                                                "name": "name",
+                                                "fieldLabel": "Name",
+                                                "labelWidth": 40,
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "store": "cmbidentification",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyTextField169",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88312",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "padding": null,
+                                                "name": "value",
+                                                "fieldLabel": "Value",
+                                                "labelAlign": "right",
+                                                "labelWidth": 40,
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField170",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88324",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "btnAddIdentification",
+                                                "itemId": "btnAddSml",
+                                                "margin": "0 0 0 6",
+                                                "width": 50,
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton7",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen88336",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 120,
+                                        "id": "gridIdentification",
+                                        "itemId": "gridSml",
+                                        "margin": 8,
+                                        "minHeight": 120,
+                                        "title": "",
+                                        "store": "grididentification",
+                                        "designer|userClassName": "MyGridPanel3"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen88339",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView3"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88343",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "gridToolbar",
+                                                "designer|userClassName": "MyToolbar7",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen88348",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "btnRemoveIdentification",
+                                                        "itemId": "btnRemoveSml",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton11",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen113184",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "flex": null,
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn16"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen113193",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "value",
+                                                "flex": 0.5,
+                                                "text": "Value",
+                                                "designer|userClassName": "MyColumn17"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen113202",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "definition",
+                                                "flex": 1,
+                                                "text": "Definition",
+                                                "designer|userClassName": "MyColumn18"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen125719",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "characteristics",
+                                "bodyPadding": null,
+                                "title": "",
+                                "designer|userClassName": "MyForm25"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen88438",
+                                    "type": "fieldset",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "collapsed": true,
+                                        "collapsible": true,
+                                        "title": "Characteristics (optional)",
+                                        "designer|userClassName": "MyFieldSet39"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen88444",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "characteristics",
+                                                "fieldLabel": "Technical specification sheet URL",
+                                                "labelWidth": 210,
+                                                "designer|userClassName": "MyTextField173",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen88450",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Capabilities",
+                                "designer|userClassName": "MyFieldSet39"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen27593",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmCapabilities",
+                                        "bodyPadding": null,
+                                        "collapsed": false,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm30"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen88456",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "tfSamplingResolution",
+                                                "name": "systemType",
+                                                "fieldLabel": "Sampling time resolution",
+                                                "labelWidth": 180,
+                                                "emptyText": "P1DT12H (ISO8601 Duration)",
+                                                "designer|userClassName": "MyTextField173",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88461",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "tfAcquisitionResolution",
+                                                "name": "systemType",
+                                                "fieldLabel": "Acquisition time resolution",
+                                                "labelWidth": 180,
+                                                "emptyText": "P1DT12H (ISO8601 Duration)",
+                                                "designer|userClassName": "MyTextField173",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen127835",
+                                    "type": "fieldset",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "smlCapabilities",
+                                        "padding": 8,
+                                        "collapsed": true,
+                                        "collapsible": true,
+                                        "title": "Additional Capabilities (optional)",
+                                        "designer|userClassName": "MyFieldSet36"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen127839",
+                                            "type": "form",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "border": 0,
+                                                "height": 30,
+                                                "id": null,
+                                                "itemId": "frmSml",
+                                                "padding": null,
+                                                "layout": "hbox",
+                                                "bodyPadding": null,
+                                                "title": "",
+                                                "designer|userClassName": "MyForm23",
+                                                "container|align": "stretch",
+                                                "container|padding": null,
+                                                "layout|anchor": "100%"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen127843",
+                                                    "type": "combobox",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "itemId": "cmbSml",
+                                                        "margin": "0 6 0 0",
+                                                        "padding": null,
+                                                        "name": "name",
+                                                        "fieldLabel": "Name",
+                                                        "labelWidth": 60,
+                                                        "allowBlank": false,
+                                                        "displayField": "name",
+                                                        "store": "cmbCapabilities",
+                                                        "valueField": "name",
+                                                        "designer|userClassName": "MyTextField169",
+                                                        "layout|flex": 1
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127851",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "padding": null,
+                                                        "name": "value",
+                                                        "fieldLabel": "Value",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 60,
+                                                        "allowBlank": false,
+                                                        "designer|userClassName": "MyTextField170",
+                                                        "layout|flex": 1
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127859",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": null,
+                                                        "itemId": "btnAddSml",
+                                                        "margin": "0 0 0 6",
+                                                        "width": 50,
+                                                        "text": "Add",
+                                                        "designer|userClassName": "MyButton7",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen127867",
+                                            "type": "gridpanel",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 120,
+                                                "id": null,
+                                                "itemId": "gridSml",
+                                                "margin": 8,
+                                                "minHeight": 120,
+                                                "title": "",
+                                                "store": "gridCapabilities",
+                                                "designer|userClassName": "MyGridPanel3"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen127871",
+                                                    "type": "gridview",
+                                                    "reference": {
+                                                        "name": "viewConfig",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "designer|userClassName": "MyGridView3"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127874",
+                                                    "type": "toolbar",
+                                                    "reference": {
+                                                        "name": "dockedItems",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "itemId": "gridToolbar",
+                                                        "designer|userClassName": "MyToolbar7",
+                                                        "dock": "top"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen127879",
+                                                            "type": "button",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": null,
+                                                                "itemId": "btnRemoveSml",
+                                                                "text": "Remove selected",
+                                                                "designer|userClassName": "MyButton11",
+                                                                "layout|flex": null
+                                                            }
+                                                        }
+                                                    ]
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127884",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "name",
+                                                        "flex": null,
+                                                        "text": "Name",
+                                                        "designer|userClassName": "MyColumn16"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127887",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "value",
+                                                        "flex": 0.5,
+                                                        "text": "Value",
+                                                        "designer|userClassName": "MyColumn17"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen131383",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "uom",
+                                                        "text": "Unit of measure",
+                                                        "designer|userClassName": "MyColumn19"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127890",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "definition",
+                                                        "flex": 1,
+                                                        "text": "Definition",
+                                                        "designer|userClassName": "MyColumn18"
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen15774",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "newservice"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen16504",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Sensor Observation Service",
+                        "designer|userClassName": "MyFieldSet10"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen16682",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "nsservice",
+                                "invalidText": "The serivice name must be a single lower case word",
+                                "name": "service",
+                                "fieldLabel": "Service name",
+                                "allowBlank": false,
+                                "regex": "/^[a-z]+$/",
+                                "designer|userClassName": "MyTextField35",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen11293",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "Piccola descrizione",
+                        "padding": 10,
+                        "designer|userClassName": "MyContainer3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15777",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15784",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "fscustomdb",
+                        "checkboxName": "customdb",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "Customize database",
+                        "designer|userClassName": "MyFieldSet6"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen15790",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "user",
+                                "fieldLabel": "User",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField28",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen15795",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "password",
+                                "fieldLabel": "Password",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField29",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen15800",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "host",
+                                "fieldLabel": "Host",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField30",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen15805",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "port",
+                                "fieldLabel": "Port",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField32",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen15810",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "dbname",
+                                "fieldLabel": "DB name",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField31",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen16882",
+                            "type": "container",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyContainer5"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen16888",
+                                    "type": "toolbar",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": null,
+                                        "margin": "0 0 5 0",
+                                        "ui": "footer",
+                                        "designer|userClassName": "MyToolbar3",
+                                        "container|pack": "end"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen16891",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "btnTestConnection",
+                                                "text": "Test connection",
+                                                "designer|userClassName": "MyButton7",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen38532",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "layout": "anchor",
+                "title": "",
+                "designer|userClassName": "FormDataQuality"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen38760",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "bodyPadding": 10,
+                        "title": "",
+                        "designer|userClassName": "MyForm5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen38998",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Add new index",
+                                "designer|userClassName": "MyFieldSet7"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen39198",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "fieldLabel": "Code",
+                                        "designer|userClassName": "MyTextField34",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen39366",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "fieldLabel": "Description",
+                                        "designer|userClassName": "MyTextField35",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen39737",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar2",
+                                "container|pack": "end",
+                                "layout|anchor": "100%",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen39743",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "text": "Cancel",
+                                        "designer|userClassName": "MyButton4",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen39749",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "text": "Add",
+                                        "designer|userClassName": "MyButton5",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen40349",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "padding": "16 8 0 8",
+                        "title": "Quality indexes",
+                        "store": "dataQualityStore",
+                        "designer|userClassName": "MyGridPanel"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen40387",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 120,
+                                "designer|userClassName": "MyGridView"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen42656",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "code",
+                                "text": "Code",
+                                "designer|userClassName": "MyColumn1"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen42665",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "description",
+                                "text": "Description",
+                                "designer|userClassName": "MyColumn2"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen6291",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": 600,
+                "width": 900,
+                "layout": "border",
+                "bodyStyle": "background-color: transparent;",
+                "title": "",
+                "designer|userClassName": "ObservationEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen6935",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 140,
+                        "id": "oeSettings",
+                        "bodyPadding": 10,
+                        "bodyStyle": null,
+                        "title": "",
+                        "designer|userClassName": "MyForm6",
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen15261",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Choose the procedure",
+                                "designer|userClassName": "MyFieldSet8"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen24324",
+                                    "type": "fieldcontainer",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 30,
+                                        "layout": "hbox",
+                                        "fieldLabel": "Label",
+                                        "hideLabel": true,
+                                        "designer|userClassName": "MyFieldContainer1",
+                                        "container|align": "stretch",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen18373",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbServices",
+                                                "fieldLabel": "Service",
+                                                "displayField": "service",
+                                                "store": "storeServices",
+                                                "valueField": "service",
+                                                "designer|userClassName": "MyComboBox12",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25132",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeCbOffering",
+                                                "itemId": null,
+                                                "name": "offering",
+                                                "fieldLabel": "Offering",
+                                                "labelAlign": "right",
+                                                "labelWidth": 60,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "offerings",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25356",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeCbProcedure",
+                                                "itemId": null,
+                                                "name": "procedure",
+                                                "fieldLabel": "Procedure",
+                                                "labelAlign": "right",
+                                                "labelWidth": 80,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "procedurelist",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox3",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25531",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeCbObservedProperty",
+                                                "name": "observedproperty",
+                                                "fieldLabel": "Property",
+                                                "labelAlign": "right",
+                                                "labelWidth": 80,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "observedproperties",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox4",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen10074",
+                                    "type": "fieldcontainer",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 25,
+                                        "defaults": "{\n                    flex: 1,\n                    hideLabel: true\n                }",
+                                        "layout": "hbox",
+                                        "fieldLabel": "Time period",
+                                        "designer|userClassName": "MyFieldContainer",
+                                        "container|align": "stretch",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen10377",
+                                            "type": "datefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeBegin",
+                                                "name": "begin",
+                                                "fieldLabel": null,
+                                                "designer|userClassName": "MyDateField",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen24915",
+                                            "type": "timefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeBeginTime",
+                                                "name": "begintime",
+                                                "value": "00:00",
+                                                "fieldLabel": "Label",
+                                                "format": "G:i",
+                                                "increment": 10,
+                                                "designer|userClassName": "MyTimeField",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25323",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "html": "<div style='text-align: center; width: 100%;'>-</div>",
+                                                "padding": "5 0 0 0 ",
+                                                "width": 20,
+                                                "layout": "fit",
+                                                "designer|userClassName": "MyContainer26",
+                                                "layout|flex": 0
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen10564",
+                                            "type": "datefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeEnd",
+                                                "name": "end",
+                                                "fieldLabel": "Label",
+                                                "designer|userClassName": "MyDateField1",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25118",
+                                            "type": "timefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeEndTime",
+                                                "name": "endtime",
+                                                "value": "00:00",
+                                                "fieldLabel": "Label",
+                                                "format": "G:i",
+                                                "increment": 10,
+                                                "designer|userClassName": "MyTimeField1",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20337",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar5",
+                                "container|align": "middle",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen20551",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "oeBtnReset",
+                                        "text": "Reset",
+                                        "designer|userClassName": "MyButton10",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen20772",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "oeBtnLoad",
+                                        "text": "Load",
+                                        "designer|userClassName": "MyButton11",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen7217",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "html": null,
+                        "id": "oeEditor",
+                        "layout": "fit",
+                        "title": "",
+                        "designer|userClassName": "MyPanel9",
+                        "layout|region": "center"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen30261",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "layout": "hbox",
+                "title": "",
+                "designer|userClassName": "ObservationEditorColumn",
+                "container|align": "stretch"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen33639",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "id": "chartContainer",
+                        "padding": "16px",
+                        "maintainFlex": true,
+                        "layout": "fit",
+                        "bodyPadding": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel11",
+                        "layout|flex": 0.9
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen33799",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "gridContainer",
+                        "width": 300,
+                        "maintainFlex": true,
+                        "layout": "fit",
+                        "bodyPadding": "16px",
+                        "title": "",
+                        "designer|userClassName": "MyPanel12"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen14802",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": null,
+                "title": "",
+                "designer|userClassName": "serviceconfig"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen18952",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>Service Provider:</h3>Here you can personalize the service provider information. It will be displayed in the getCapabilities document.",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen19232",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "provider",
+                        "padding": 10,
+                        "checkboxName": "cbprovider",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19238",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "providername",
+                                "fieldLabel": "Name",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19243",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "providersite",
+                                "fieldLabel": "Web site",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19248",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactname",
+                                "fieldLabel": "Contact name",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19253",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactposition",
+                                "fieldLabel": "Contact position",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19258",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactvoice",
+                                "fieldLabel": "Voice",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19263",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactfax",
+                                "fieldLabel": "Fax",
+                                "designer|userClassName": "MyTextField53",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19268",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactemail",
+                                "fieldLabel": "Email",
+                                "designer|userClassName": "MyTextField54",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19273",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactdeliverypoint",
+                                "fieldLabel": "Address",
+                                "designer|userClassName": "MyTextField55",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19278",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactpostalcode",
+                                "fieldLabel": "Postal code",
+                                "designer|userClassName": "MyTextField56",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19283",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactcity",
+                                "fieldLabel": "City",
+                                "designer|userClassName": "MyTextField57",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19288",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactadminarea",
+                                "fieldLabel": "State",
+                                "designer|userClassName": "MyTextField58",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19293",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactcountry",
+                                "fieldLabel": "Country",
+                                "designer|userClassName": "MyTextField59",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen19562",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>Service Identification:</h3>Here you can personalize..",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen7453",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "identification",
+                        "padding": 10,
+                        "checkboxName": "cbidentification",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen7459",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "title",
+                                "fieldLabel": "Title",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen7464",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "abstract",
+                                "fieldLabel": "Abstract",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen7469",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "keywords",
+                                "fieldLabel": "Keywords",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen7474",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "fees",
+                                "fieldLabel": "Fees",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen7479",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "accessconstrains",
+                                "fieldLabel": "Access constrains",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen20011",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>Coordinate system:</h3>Here you can personalize..",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen13057",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "geo",
+                        "padding": 10,
+                        "checkboxName": "cbcoordinates",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen13063",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "istsosepsg",
+                                "fieldLabel": "Default EPSG",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen13068",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "allowedepsg",
+                                "fieldLabel": "Permitted EPSG",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen13073",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "xaxisname",
+                                "fieldLabel": "X axis name",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen13078",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "yaxisname",
+                                "fieldLabel": "Y axis name",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen13083",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "zaxisname",
+                                "fieldLabel": "Z axis name",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField26",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen28721",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>GetObservation configuration:</h3>Here you can personalize..",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen29667",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "getobservation",
+                        "padding": 10,
+                        "checkboxName": "cbgetobservation",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen29673",
+                            "type": "numberfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "maxgoperiod",
+                                "fieldLabel": "Max request interval (hours)",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29678",
+                            "type": "numberfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "defaultqi",
+                                "fieldLabel": "Default quality index",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29683",
+                            "type": "numberfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "aggregatenodataqi",
+                                "fieldLabel": "Aggregation no-data quality index",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29688",
+                            "type": "numberfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "aggregatenodata",
+                                "fieldLabel": "Aggregation no-data value",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen8383",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>Proxy URL:</h3>Here you can personalize..",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen39973",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "proxyurl",
+                        "padding": 10,
+                        "checkboxName": "cbgetobservation",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen40694",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "url",
+                                "fieldLabel": "Url",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField14",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen14182",
+            "type": "gridpanel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": null,
+                "width": null,
+                "title": "",
+                "forceFit": true,
+                "store": "serverstatus",
+                "designer|userClassName": "status"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen14217",
+                    "type": "gridview",
+                    "reference": {
+                        "name": "viewConfig",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "MyGridView2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8675",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "service",
+                        "text": "Service",
+                        "designer|userClassName": "MyColumn3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8648",
+                    "type": "numbercolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "featuresOfInterest",
+                        "text": "Features Of Interest",
+                        "format": 0,
+                        "designer|userClassName": "MyNumberColumn2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8702",
+                    "type": "numbercolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "offerings",
+                        "text": "Offerings",
+                        "format": 0,
+                        "designer|userClassName": "MyNumberColumn3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8729",
+                    "type": "numbercolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "procedures",
+                        "text": "Procedures",
+                        "format": 0,
+                        "designer|userClassName": "MyNumberColumn4"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8738",
+                    "type": "numbercolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "observedProperties",
+                        "text": "Observed Properties",
+                        "format": 0,
+                        "designer|userClassName": "MyNumberColumn5"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8693",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colAvailability",
+                        "dataIndex": "availability",
+                        "text": "Availability",
+                        "designer|userClassName": "MyColumn5"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8684",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colDatabase",
+                        "dataIndex": "database",
+                        "text": "Database",
+                        "designer|userClassName": "MyColumn4"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8639",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colGetcapabilities",
+                        "dataIndex": "getcapabilities",
+                        "text": "GetCapabilities",
+                        "designer|userClassName": "MyBooleanColumn1"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8657",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colDescribesensor",
+                        "dataIndex": "describesensor",
+                        "text": "DescribeSensor",
+                        "designer|userClassName": "MyBooleanColumn2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8666",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colGetobservation",
+                        "dataIndex": "getobservation",
+                        "text": "GetObservation",
+                        "designer|userClassName": "MyBooleanColumn3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8711",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colGetfeatureofinterest",
+                        "dataIndex": "getfeatureofinterest",
+                        "text": "GetFeatureOfInterest",
+                        "designer|userClassName": "MyBooleanColumn4"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8747",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colInsertobservation",
+                        "dataIndex": "insertobservation",
+                        "text": "InsertObservation",
+                        "designer|userClassName": "MyBooleanColumn6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8720",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colRegistersensor",
+                        "dataIndex": "registersensor",
+                        "text": "RegisterSensor",
+                        "designer|userClassName": "MyBooleanColumn5"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen22864",
+            "type": "gridpanel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": 400,
+                "maxHeight": null,
+                "width": null,
+                "autoScroll": true,
+                "title": null,
+                "forceFit": true,
+                "store": "procedurelist",
+                "designer|userClassName": "proceduresList"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen22899",
+                    "type": "gridview",
+                    "reference": {
+                        "name": "viewConfig",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "MyGridView13"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24898",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "name",
+                        "text": "Name",
+                        "designer|userClassName": "MyColumn31"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24907",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "offerings",
+                        "text": "Offerings",
+                        "designer|userClassName": "MyColumn32"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24916",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "observedproperties",
+                        "text": "Observedproperties",
+                        "designer|userClassName": "MyColumn33"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen31862",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "title": "",
+                "designer|userClassName": "obsPropEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen32116",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "frmObservedProperties",
+                        "bodyPadding": 10,
+                        "title": "",
+                        "trackResetOnLoad": true,
+                        "designer|userClassName": "MyForm33"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen32343",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Observed property",
+                                "designer|userClassName": "MyFieldSet54"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen32505",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opName",
+                                        "name": "name",
+                                        "fieldLabel": "Name",
+                                        "designer|userClassName": "MyTimeField",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen32673",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opDefinition",
+                                        "name": "definition",
+                                        "fieldLabel": "Definition URN",
+                                        "designer|userClassName": "MyTimeField1",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen63309",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "name": "description",
+                                        "fieldLabel": "Description",
+                                        "designer|userClassName": "MyTimeField1",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen37991",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar27",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen38253",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnForm",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen32843",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "gridop",
+                        "margin": 8,
+                        "title": "",
+                        "forceFit": true,
+                        "store": "gridobservedproperties",
+                        "designer|userClassName": "MyGridPanel16"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen32880",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "designer|userClassName": "MyGridView16"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen37413",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyToolbar26",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen37569",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnNew",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton37",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen37779",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "disabled": true,
+                                        "id": "btnRemove",
+                                        "text": "Remove",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen64210",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "name",
+                                "text": "Name",
+                                "designer|userClassName": "MyColumn42"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen64219",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "definition",
+                                "text": "Definition",
+                                "designer|userClassName": "MyColumn43"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen64228",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "description",
+                                "text": "Description",
+                                "designer|userClassName": "MyColumn44"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen64237",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "procedures",
+                                "text": "Procedures",
+                                "designer|userClassName": "MyColumn45"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen60721",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "title": "",
+                "designer|userClassName": "qualityindexEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen60724",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "frmObservedProperties",
+                        "bodyPadding": 10,
+                        "title": "",
+                        "trackResetOnLoad": true,
+                        "designer|userClassName": "MyForm33"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen60729",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Quality index",
+                                "designer|userClassName": "MyFieldSet54"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen60735",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opName",
+                                        "name": "name",
+                                        "fieldLabel": "Name",
+                                        "designer|userClassName": "MyTimeField",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen60740",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "name": "description",
+                                        "fieldLabel": "Description",
+                                        "designer|userClassName": "MyTimeField1",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen60746",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar27",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen60752",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnForm",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen60759",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "gridop",
+                        "margin": 8,
+                        "title": "",
+                        "forceFit": true,
+                        "store": "namedescription",
+                        "designer|userClassName": "MyGridPanel16"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen60764",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "designer|userClassName": "MyGridView16"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen60767",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "name",
+                                "text": "Name",
+                                "designer|userClassName": "MyColumn39"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen60770",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "description",
+                                "text": "Description",
+                                "designer|userClassName": "MyColumn40"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen60776",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyToolbar26",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen60781",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnNew",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton37",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen60786",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "disabled": true,
+                                        "id": "btnRemove",
+                                        "text": "Remove",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen16414",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "title": "",
+                "designer|userClassName": "serviceEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen16417",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "frmServices",
+                        "bodyPadding": 10,
+                        "title": "",
+                        "trackResetOnLoad": true,
+                        "designer|userClassName": "MyForm33"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen16422",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Quality index",
+                                "designer|userClassName": "MyFieldSet54"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen16428",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opService",
+                                        "name": "service",
+                                        "fieldLabel": "Name",
+                                        "designer|userClassName": "MyTimeField",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen16439",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar27",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen16445",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnForm",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen16452",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "gridop",
+                        "margin": 8,
+                        "title": "",
+                        "forceFit": true,
+                        "store": "storeServices",
+                        "designer|userClassName": "MyGridPanel16"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen16457",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "designer|userClassName": "MyGridView16"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen16466",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyToolbar26",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen16471",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnNew",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton37",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen16476",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "disabled": true,
+                                        "id": "btnRemove",
+                                        "text": "Remove",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen17592",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "service",
+                                "text": "Service",
+                                "designer|userClassName": "MyColumn42"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen17601",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "path",
+                                "text": "Path",
+                                "designer|userClassName": "MyColumn43"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen40828",
+            "type": "tabpanel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": null,
+                "minHeight": 400,
+                "width": null,
+                "title": "",
+                "activeTab": 0,
+                "designer|userClassName": "offeringsEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen41238",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "height": 400,
+                        "minHeight": 400,
+                        "title": "Offerings",
+                        "designer|userClassName": "MyPanel19"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen41841",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": null,
+                                "width": null,
+                                "title": "",
+                                "designer|userClassName": "MyPanel21"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen41844",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmOfferings",
+                                        "bodyPadding": 10,
+                                        "title": "",
+                                        "trackResetOnLoad": true,
+                                        "designer|userClassName": "MyForm33"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen41849",
+                                            "type": "fieldset",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "title": "Offerings",
+                                                "designer|userClassName": "MyFieldSet54"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen41855",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "offName",
+                                                        "name": "name",
+                                                        "fieldLabel": "Name",
+                                                        "designer|userClassName": "MyTimeField",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen41860",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "description",
+                                                        "fieldLabel": "Description",
+                                                        "designer|userClassName": "MyTimeField1",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen42436",
+                                                    "type": "datefield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "expiration",
+                                                        "fieldLabel": "Expiration",
+                                                        "format": "c",
+                                                        "designer|userClassName": "MyDateField6",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen42688",
+                                                    "type": "checkboxfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "active",
+                                                        "fieldLabel": "Visibility",
+                                                        "boxLabel": "enabled",
+                                                        "designer|userClassName": "MyCheckbox",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen41866",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "ui": "footer",
+                                                "designer|userClassName": "MyToolbar27",
+                                                "container|pack": "center",
+                                                "dock": "bottom"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen41872",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "btnForm",
+                                                        "text": "New",
+                                                        "designer|userClassName": "MyButton39",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen41879",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 150,
+                                        "id": "gridoff",
+                                        "margin": 8,
+                                        "minHeight": 150,
+                                        "title": "",
+                                        "forceFit": true,
+                                        "store": "gridofferings",
+                                        "designer|userClassName": "MyGridPanel16"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen41884",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": null,
+                                                "designer|userClassName": "MyGridView16"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen41896",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyToolbar26",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen41901",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "btnNew",
+                                                        "text": "New",
+                                                        "designer|userClassName": "MyButton37",
+                                                        "layout|flex": null
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen41906",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "disabled": true,
+                                                        "id": "btnRemove",
+                                                        "text": "Remove",
+                                                        "designer|userClassName": "MyButton38",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44893",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn36"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44902",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn37"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44911",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "procedures",
+                                                "text": "Procedures",
+                                                "designer|userClassName": "MyColumn38"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44920",
+                                            "type": "datecolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "expiration",
+                                                "text": "Expiration",
+                                                "format": "c",
+                                                "designer|userClassName": "MyDateColumn2"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44929",
+                                            "type": "booleancolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "active",
+                                                "text": "Active",
+                                                "designer|userClassName": "MyBooleanColumn6"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen41402",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "autoRender": true,
+                        "height": 400,
+                        "minHeight": 400,
+                        "layout": "hbox",
+                        "title": "Offering-Procedure memberships",
+                        "designer|userClassName": "MyPanel20",
+                        "container|align": "stretch"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen48062",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 350,
+                                "html": null,
+                                "minHeight": 350,
+                                "layout": "fit",
+                                "bodyPadding": 8,
+                                "title": "",
+                                "designer|userClassName": "MyPanel23",
+                                "layout|flex": 0.5
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen49863",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "gridMembers",
+                                        "maxHeight": null,
+                                        "minHeight": null,
+                                        "autoScroll": true,
+                                        "title": "",
+                                        "forceFit": true,
+                                        "store": "proceduresMembers",
+                                        "designer|userClassName": "MyGridPanel15"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen49900",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "multiSelect": true,
+                                                "designer|userClassName": "MyGridView15"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen61828",
+                                                    "type": "griddragdropplugin",
+                                                    "reference": {
+                                                        "name": "plugins",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": "Ext.grid.plugin.DragDrop",
+                                                    "userConfig": {
+                                                        "ddGroup": "offeringsprocedures",
+                                                        "dragGroup": "gridMembers",
+                                                        "dropGroup": "gridNonMembers",
+                                                        "designer|userClassName": "MyGridDragDropPlugin"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen57050",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyToolbar24",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen57258",
+                                                    "type": "combobox",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "cbOfferings",
+                                                        "fieldLabel": "Choose an offering",
+                                                        "labelStyle": "color: white;",
+                                                        "labelWidth": 140,
+                                                        "displayField": "name",
+                                                        "store": "cmbname",
+                                                        "valueField": "name",
+                                                        "designer|userClassName": "MyComboBox12",
+                                                        "layout|flex": 1
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen21151",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn44"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen21160",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn45"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen48290",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 350,
+                                "html": null,
+                                "minHeight": 350,
+                                "layout": "fit",
+                                "bodyPadding": 8,
+                                "title": "",
+                                "designer|userClassName": "MyPanel24",
+                                "layout|flex": 0.5
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen55117",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "gridNonMembers",
+                                        "maxHeight": null,
+                                        "minHeight": null,
+                                        "title": "Not members",
+                                        "forceFit": true,
+                                        "store": "proceduresNonmembers",
+                                        "designer|userClassName": "MyGridPanel17"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen55154",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "multiSelect": true,
+                                                "designer|userClassName": "MyGridView17"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen62050",
+                                                    "type": "griddragdropplugin",
+                                                    "reference": {
+                                                        "name": "plugins",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": "Ext.grid.plugin.DragDrop",
+                                                    "userConfig": {
+                                                        "ddGroup": "offeringsprocedures",
+                                                        "dragGroup": "gridNonMembers",
+                                                        "dropGroup": "gridMembers",
+                                                        "designer|userClassName": "MyGridDragDropPlugin1"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen20601",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn47"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen20610",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn48"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen52391",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": null,
+                "id": "webadmincmp",
+                "maxWidth": null,
+                "minWidth": null,
+                "width": null,
+                "layout": "border",
+                "designer|userClassName": "MainMenu2"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen61717",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "mainCenter",
+                        "layout": "fit",
+                        "title": "",
+                        "designer|userClassName": "MyPanel32",
+                        "layout|region": "center"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen62005",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "height": 150,
+                        "id": "submenu",
+                        "margin": "0px 0px 1px 0px ",
+                        "layout": "hbox",
+                        "collapsed": true,
+                        "hideCollapseTool": true,
+                        "title": "",
+                        "designer|userClassName": "MyPanel33",
+                        "container|align": "stretch",
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen58083",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": null,
+                                "designer|userClassName": "MyToolbar3",
+                                "container|padding": "4 0 4 0",
+                                "layout|flex": 1,
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen58221",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "cls": null,
+                                        "componentCls": "test",
+                                        "id": "menuServer",
+                                        "style": null,
+                                        "enableToggle": true,
+                                        "pressed": true,
+                                        "text": "Server",
+                                        "toggleGroup": "mainmenu",
+                                        "designer|userClassName": "MyButton48",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen58413",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnService",
+                                        "enableToggle": true,
+                                        "text": "Services",
+                                        "toggleGroup": "mainmenu",
+                                        "designer|userClassName": "MyButton49",
+                                        "layout|flex": null
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen59073",
+                                            "type": "menu",
+                                            "reference": {
+                                                "name": "menu",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "menuServices",
+                                                "designer|userClassName": "MyMenu1"
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen58607",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnObservations",
+                                        "enableToggle": true,
+                                        "text": "Data viewer",
+                                        "toggleGroup": "mainmenu",
+                                        "designer|userClassName": "MyButton50",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen59915",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "componentCls": null,
+                                        "html": "\n        <div class='mainHeaderTitle'>\n            istSOS manager [BETA]\n        </div>",
+                                        "designer|userClassName": "MyContainer2",
+                                        "layout|flex": 1
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen63938",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 25,
+                        "html": "Open Source Software by Institute of Earth Science - SUPSI",
+                        "id": "mainFoot",
+                        "bodyCls": "mainFooter",
+                        "bodyPadding": 8,
+                        "title": "",
+                        "designer|userClassName": "MyPanel3",
+                        "layout|region": "south"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen27791",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 1,
+                "height": 45,
+                "width": 300,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "ObservationEditorAdvancedOperations"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen28609",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "oeaTf",
+                        "name": "val",
+                        "fieldLabel": "New value",
+                        "enableKeyEvents": true,
+                        "designer|userClassName": "MyTextField147",
+                        "layout|anchor": "100%"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen16552",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": 600,
+                "id": "chartpanel",
+                "minHeight": 400,
+                "padding": null,
+                "width": null,
+                "layout": "border",
+                "bodyStyle": "background-color: white;",
+                "title": "",
+                "designer|userClassName": "Chart",
+                "designer|userAlias": "chart"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen27604",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "width": 280,
+                        "layout": "border",
+                        "title": "",
+                        "designer|userClassName": "MyPanel25",
+                        "layout|region": "west"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19598",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 150,
+                                "id": "oeSettings",
+                                "padding": null,
+                                "bodyPadding": "0 10 0 10",
+                                "bodyStyle": null,
+                                "title": "",
+                                "designer|userClassName": "MyForm6",
+                                "layout|region": "north"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen19609",
+                                    "type": "fieldset",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "padding": 5,
+                                        "title": "1. Choose procedure",
+                                        "designer|userClassName": "MyFieldSet8"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen19619",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbServices",
+                                                "fieldLabel": "Service",
+                                                "labelWidth": 70,
+                                                "displayField": "service",
+                                                "store": "storeServices",
+                                                "valueField": "service",
+                                                "designer|userClassName": "MyComboBox12",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen19625",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeCbOffering",
+                                                "itemId": null,
+                                                "name": "offering",
+                                                "fieldLabel": "Offering",
+                                                "labelWidth": 70,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "offerings",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen19631",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeCbProcedure",
+                                                "itemId": null,
+                                                "name": "procedure",
+                                                "fieldLabel": "Procedure",
+                                                "labelWidth": 70,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "procedurelist",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox3",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen19692",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "btnAdd",
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton11",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29107",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "proceduresTree",
+                                "autoScroll": true,
+                                "title": "",
+                                "designer|userClassName": "MyPanel26",
+                                "layout|region": "center"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen16832",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "html": null,
+                        "id": null,
+                        "layout": "vbox",
+                        "bodyPadding": null,
+                        "bodyStyle": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel37",
+                        "container|align": "stretch",
+                        "layout|region": "center"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen38046",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 150,
+                                "id": "plotcalc",
+                                "activeItem": 0,
+                                "layout": "card",
+                                "title": "",
+                                "designer|userClassName": "MyPanel32",
+                                "layout|flex": null
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen22938",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 130,
+                                        "id": "plotdatafrm",
+                                        "padding": "0 10 0 10",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel38"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen24163",
+                                            "type": "fieldset",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "padding": null,
+                                                "title": "2. Plot data",
+                                                "designer|userClassName": "MyFieldSet43"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen24169",
+                                                    "type": "fieldcontainer",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "border": 0,
+                                                        "height": null,
+                                                        "defaults": "{\n                    flex: 1,\n                    hideLabel: true\n                }",
+                                                        "layout": "hbox",
+                                                        "fieldLabel": "From",
+                                                        "designer|userClassName": "MyFieldContainer",
+                                                        "container|padding": null,
+                                                        "layout|anchor": "100%"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen24173",
+                                                            "type": "datefield",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": "oeBegin",
+                                                                "name": "begin",
+                                                                "fieldLabel": null,
+                                                                "format": "Y-m-d",
+                                                                "designer|userClassName": "MyDateField",
+                                                                "layout|flex": 0.6
+                                                            }
+                                                        },
+                                                        {
+                                                            "id": "ExtBox1-ext-gen24179",
+                                                            "type": "timefield",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": "oeBeginTime",
+                                                                "minWidth": null,
+                                                                "width": null,
+                                                                "name": "begintime",
+                                                                "fieldLabel": "Label",
+                                                                "format": "H:i ",
+                                                                "increment": 10,
+                                                                "designer|userClassName": "MyTimeField",
+                                                                "layout|flex": 0.4
+                                                            }
+                                                        }
+                                                    ]
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen24186",
+                                                    "type": "fieldcontainer",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "height": null,
+                                                        "defaults": "{\n                    flex: 1,\n                    hideLabel: true\n                }",
+                                                        "layout": "hbox",
+                                                        "fieldLabel": "To",
+                                                        "designer|userClassName": "MyFieldContainer",
+                                                        "layout|anchor": "100%"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen24190",
+                                                            "type": "datefield",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": "oeEnd",
+                                                                "name": "end",
+                                                                "fieldLabel": "Label",
+                                                                "format": "Y-m-d",
+                                                                "designer|userClassName": "MyDateField1",
+                                                                "layout|flex": 0.6
+                                                            }
+                                                        },
+                                                        {
+                                                            "id": "ExtBox1-ext-gen24196",
+                                                            "type": "timefield",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": "oeEndTime",
+                                                                "name": "endtime",
+                                                                "value": null,
+                                                                "fieldLabel": "Label",
+                                                                "format": "H:i ",
+                                                                "increment": 10,
+                                                                "designer|userClassName": "MyTimeField1",
+                                                                "layout|flex": 0.4
+                                                            }
+                                                        }
+                                                    ]
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen25642",
+                                                    "type": "fieldcontainer",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "height": null,
+                                                        "defaults": "{\n                    flex: 1,\n                    hideLabel: true\n                }",
+                                                        "layout": "hbox",
+                                                        "fieldLabel": "Property",
+                                                        "designer|userClassName": "MyFieldContainer",
+                                                        "layout|anchor": "100%"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen24203",
+                                                            "type": "combobox",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": "oeCbObservedProperty",
+                                                                "name": "observedproperty",
+                                                                "fieldLabel": "Property",
+                                                                "labelWidth": 70,
+                                                                "displayField": "name",
+                                                                "queryMode": "local",
+                                                                "store": "observedproperties",
+                                                                "valueField": "definition",
+                                                                "designer|userClassName": "MyComboBox4",
+                                                                "layout|flex": 0.6
+                                                            }
+                                                        },
+                                                        {
+                                                            "id": "ExtBox1-ext-gen26741",
+                                                            "type": "button",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "disabled": true,
+                                                                "id": "btnPlot",
+                                                                "margin": null,
+                                                                "padding": null,
+                                                                "text": "Plot",
+                                                                "designer|userClassName": "MyButton31",
+                                                                "layout|flex": 0.4,
+                                                                "layout|margins": null
+                                                            }
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen23260",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "calccnt",
+                                        "padding": "9 10 0 10",
+                                        "layout": "fit",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel40"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen18479",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "html": "<div style='border-radius: 3px 3px 3px 3px !important; background-color: white; border: thin solid green; width: 100%; height: 100%;' id='chartCnt'></div>",
+                                "margin": null,
+                                "title": "",
+                                "designer|userClassName": "MyPanel36",
+                                "layout|flex": 0.7,
+                                "layout|margins": "0 10 5 10"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen38938",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 30,
+                                "padding": "0 10 5 10",
+                                "layout": "hbox",
+                                "title": "",
+                                "designer|userClassName": "MyPanel39",
+                                "container|align": "middle",
+                                "container|padding": "0 10 5 10",
+                                "layout|flex": null
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen39663",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeDay",
+                                        "enableToggle": true,
+                                        "text": "Day",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton35",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen39909",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeWeek",
+                                        "enableToggle": true,
+                                        "text": "Week",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen40157",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeAll",
+                                        "enableToggle": true,
+                                        "pressed": true,
+                                        "text": "All",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": 1
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen46485",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": null,
+                        "width": 350,
+                        "layout": "vbox",
+                        "title": null,
+                        "designer|userClassName": "MyPanel28",
+                        "container|align": "stretch",
+                        "layout|region": "east"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen54346",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 105,
+                                "layout": "fit",
+                                "title": "",
+                                "designer|userClassName": "MyPanel29",
+                                "layout|flex": null
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen34866",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": null,
+                                        "id": "chartfilterFrm",
+                                        "padding": null,
+                                        "bodyPadding": "0 10 5 0",
+                                        "collapseFirst": false,
+                                        "collapsed": false,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm35",
+                                        "weight": null
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen56987",
+                                            "type": "fieldset",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "margin": null,
+                                                "padding": 5,
+                                                "title": "3. Start editing",
+                                                "designer|userClassName": "MyFieldSet44"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen19637",
+                                                    "type": "combobox",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "oeCbEditableProcedures",
+                                                        "name": "procedure",
+                                                        "fieldLabel": "Procedure",
+                                                        "labelWidth": 70,
+                                                        "displayField": "name",
+                                                        "queryMode": "local",
+                                                        "store": "editableProcedure",
+                                                        "valueField": "name",
+                                                        "designer|userClassName": "MyComboBox4",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen19398",
+                                                    "type": "container",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "height": 25,
+                                                        "layout": "hbox",
+                                                        "designer|userClassName": "MyContainer27",
+                                                        "container|align": "stretch"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen18753",
+                                                            "type": "button",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "hidden": true,
+                                                                "id": "btnCancelEditor",
+                                                                "text": "Cancel",
+                                                                "designer|userClassName": "MyButton31",
+                                                                "layout|flex": 1
+                                                            }
+                                                        },
+                                                        {
+                                                            "id": "ExtBox1-ext-gen57550",
+                                                            "type": "button",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": "btnStartEditor",
+                                                                "text": "Start editing",
+                                                                "designer|userClassName": "MyButton31",
+                                                                "layout|flex": 1
+                                                            }
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen53959",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "chartgridcnt",
+                                "layout": "fit",
+                                "title": "",
+                                "designer|userClassName": "MyPanel27",
+                                "layout|flex": 1,
+                                "layout|margins": "0 10 5 0"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen42461",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": 150,
+                "minWidth": 450,
+                "width": 450,
+                "layout": "border",
+                "title": "",
+                "designer|userClassName": "Calc",
+                "designer|userAlias": "calculator"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen43229",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "height": 100,
+                        "layout": "hbox",
+                        "title": "",
+                        "designer|userClassName": "MyPanel43",
+                        "container|align": "stretch",
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen18207",
+                            "type": "gridpanel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "editableProcedureGrid",
+                                "width": 180,
+                                "title": "",
+                                "store": "editableProcedure",
+                                "designer|userClassName": "MyGridPanel14",
+                                "layout|flex": 0.4
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen18219",
+                                    "type": "gridcolumn",
+                                    "reference": {
+                                        "name": "columns",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "dataIndex": "name",
+                                        "flex": 1,
+                                        "text": "Procedures",
+                                        "designer|userClassName": "MyColumn43"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen42741",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "layout": "vbox",
+                                "title": "",
+                                "designer|userClassName": "MyPanel41",
+                                "container|align": "stretch",
+                                "layout|flex": 0.6
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen49480",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel44",
+                                        "container|align": "stretch",
+                                        "layout|flex": 1
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen46403",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "plus",
+                                                "text": "+",
+                                                "designer|userClassName": "MyButton53",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen46191",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "moltiply",
+                                                "text": "*",
+                                                "designer|userClassName": "MyButton52",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45981",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "sqrt",
+                                                "text": "sqrt",
+                                                "designer|userClassName": "MyButton51",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45773",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "sin",
+                                                "text": "sin",
+                                                "designer|userClassName": "MyButton50",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45567",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "exp",
+                                                "text": "^",
+                                                "designer|userClassName": "MyButton49",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45363",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "acos",
+                                                "text": "acos",
+                                                "designer|userClassName": "MyButton48",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45161",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "openparentesis",
+                                                "text": "(",
+                                                "designer|userClassName": "MyButton47",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen54519",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel44",
+                                        "container|align": "stretch",
+                                        "layout|flex": 1
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen54526",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "minus",
+                                                "text": "-",
+                                                "designer|userClassName": "MyButton53",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54533",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "divide",
+                                                "text": "/",
+                                                "designer|userClassName": "MyButton52",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54540",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cos",
+                                                "text": "cos",
+                                                "designer|userClassName": "MyButton51",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54547",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "asin",
+                                                "text": "asin",
+                                                "designer|userClassName": "MyButton50",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54554",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "tan",
+                                                "text": "tan",
+                                                "designer|userClassName": "MyButton49",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54561",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "atan",
+                                                "text": "atan",
+                                                "designer|userClassName": "MyButton48",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54568",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "closedparentesis",
+                                                "text": ")",
+                                                "designer|userClassName": "MyButton47",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen56491",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel44",
+                                        "container|align": "stretch",
+                                        "layout|flex": 1
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen56498",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "less",
+                                                "text": "<",
+                                                "designer|userClassName": "MyButton53",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56505",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "grater",
+                                                "text": ">",
+                                                "designer|userClassName": "MyButton52",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56512",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "equal",
+                                                "text": "=",
+                                                "designer|userClassName": "MyButton51",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56519",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "lesseq",
+                                                "text": "≤",
+                                                "designer|userClassName": "MyButton50",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56526",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "gretereq",
+                                                "text": "≥",
+                                                "designer|userClassName": "MyButton49",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56533",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "andop",
+                                                "text": "AND",
+                                                "designer|userClassName": "MyButton48",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56540",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "orop",
+                                                "text": "OR",
+                                                "designer|userClassName": "MyButton47",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen60359",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": null,
+                        "layout": "border",
+                        "title": "",
+                        "designer|userClassName": "MyPanel48",
+                        "layout|region": "center"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen40754",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "width": 120,
+                                "bodyPadding": 10,
+                                "title": "",
+                                "designer|userClassName": "MyForm38",
+                                "layout|region": "west"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen41254",
+                                    "type": "displayfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "pEditing",
+                                        "fieldLabel": null,
+                                        "hideLabel": true,
+                                        "designer|userClassName": "MyDisplayField11",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36206",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": null,
+                                "padding": null,
+                                "layout": "hbox",
+                                "bodyPadding": null,
+                                "title": "",
+                                "designer|userClassName": "MyPanel47",
+                                "container|align": "stretch",
+                                "container|padding": null,
+                                "layout|region": "center"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen25312",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "codePanel",
+                                        "padding": null,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel50",
+                                        "container|align": "stretch",
+                                        "container|padding": "6 0 0 0",
+                                        "layout|flex": 0.5
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen26476",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "bodyPadding": 10,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm39",
+                                        "layout|flex": 0.5
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen28131",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "calcQiCombo",
+                                                "fieldLabel": "QI",
+                                                "labelSeparator": "=",
+                                                "labelWidth": 40,
+                                                "emptyText": "choosing a qi will update the selectded values..",
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "calcQiStore",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox18",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36566",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "width": 40,
+                                "layout": "vbox",
+                                "title": "",
+                                "designer|userClassName": "MyPanel48",
+                                "container|align": "stretch",
+                                "container|padding": "5px",
+                                "layout|region": "east"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen34163",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnExecute",
+                                        "text": "↵",
+                                        "designer|userClassName": "MyButton61",
+                                        "layout|flex": 1
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen22330",
+            "type": "gridcolumn",
+            "reference": {
+                "name": "columns",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "text": "Interpolation",
+                "designer|userClassName": "CheckColumn",
+                "designer|userAlias": "checkcolumn"
+            }
+        },
+        {
+            "id": "ExtBox1-ext-gen20039",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "layout": "fit",
+                "designer|userClassName": "ChartContainer"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen20456",
+                    "type": "linkedinstance",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {},
+                    "iconCls": "icon-linkedinstance",
+                    "masterInstanceId": "ExtBox1-ext-gen16552"
+                }
+            ]
+        }
+    ],
+    "stores": [
+        {
+            "id": "ExtBox1-ext-gen41866",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "dataQualityStore",
+                "designer|userClassName": "DataQualityStore"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen41870",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": null,
+                        "designer|userClassName": "Ajax Proxy"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen41876",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "root": "data",
+                                "designer|userClassName": "Json Reader"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen22818",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": null,
+                        "designer|userClassName": "MyField67"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen42110",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "code",
+                        "designer|userClassName": "MyField"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen42117",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "designer|userClassName": "MyField1"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen12255",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "offerings",
+                "designer|userClassName": "Offerings"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen12259",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "data/offerings.json",
+                        "designer|userClassName": "Ajax Proxy1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen12265",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader1"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen12620",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen13263",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField3"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen13495",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "procedures",
+                "designer|userClassName": "Procedures"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen13498",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen13501",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader1"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen13504",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen13507",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField3"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen13909",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "observedproperties",
+                "designer|userClassName": "ObservedProperties"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen13912",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen13915",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader1"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen13918",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen13921",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen21787",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "uom",
+                        "type": "string",
+                        "designer|userClassName": "MyField64"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen17477",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField66"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen35869",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "observations",
+                "designer|userClassName": "Observations"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen35873",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "data/observations.json",
+                        "designer|userClassName": "Ajax Proxy4"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen35879",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "isodate",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader4"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen36169",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dateFormat": "c",
+                        "name": "isodate",
+                        "type": "date",
+                        "designer|userClassName": "MyField8"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen36176",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "type": "float",
+                        "designer|userClassName": "MyField9"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen14899",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "serverstatus",
+                "designer|userClassName": "serverstatus"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen14903",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen14909",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "service",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader5"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen15282",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "getcapabilities",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField10"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15289",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "featuresOfInterest",
+                        "type": "int",
+                        "designer|userClassName": "MyField11"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15296",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "describesensor",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField12"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15303",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "getobservation",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField13"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15310",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "service",
+                        "type": "string",
+                        "designer|userClassName": "MyField14"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15737",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "database",
+                        "type": "string",
+                        "designer|userClassName": "MyField15"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15744",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "availability",
+                        "type": "string",
+                        "designer|userClassName": "MyField16"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15751",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "offerings",
+                        "type": "int",
+                        "designer|userClassName": "MyField17"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15758",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "getfeatureofinterest",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField18"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15765",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "registersensor",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField19"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen16217",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "procedures",
+                        "type": "int",
+                        "designer|userClassName": "MyField20"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen16224",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "observedProperties",
+                        "type": "int",
+                        "designer|userClassName": "MyField21"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen16231",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "insertobservation",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField22"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen36913",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "fake",
+                "designer|userClassName": "Fake",
+                "designer|userAlias": null
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen36917",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy6"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen36923",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "root": "data",
+                                "designer|userClassName": "Json Reader6"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen37157",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "designer|userClassName": "MyField23"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen112522",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "designer|userClassName": "MyField26"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen112702",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField27"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen100883",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "identification",
+                "designer|userClassName": "cmbIdentification"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen100887",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbIdentification.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen100893",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen101155",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen101162",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField25"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen130149",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "cmbsml",
+                "designer|userClassName": "cmbSml"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen130152",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbIdentification.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen130155",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen130158",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen47109",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField40"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen130161",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField25"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen130327",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "uom",
+                        "type": "string",
+                        "designer|userClassName": "MyField31"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen132456",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "type": "string",
+                        "designer|userClassName": "MyField33"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen65651",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "gridoutputs",
+                "designer|userClassName": "gridOutputs"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen65654",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": null,
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen65657",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen65660",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen65663",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField40"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen65666",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField25"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen65669",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "uom",
+                        "type": "string",
+                        "designer|userClassName": "MyField31"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen65672",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "type": "string",
+                        "designer|userClassName": "MyField33"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen66079",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "role",
+                        "designer|userClassName": "MyField46"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen66086",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "from",
+                        "designer|userClassName": "MyField47"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen66093",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "to",
+                        "designer|userClassName": "MyField48"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen122830",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "systemtype",
+                "designer|userClassName": "cmbSystemType"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen122833",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbsystemtype.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen122836",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen122839",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen170536",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "cmbname",
+                "designer|userClassName": "cmbName"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen170539",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbsystemtype.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen170542",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen170545",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen27957",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "namedescription",
+                "designer|userClassName": "cmbNameDescription"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen27960",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbsystemtype.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen27963",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen27966",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen28228",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField53"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen19975",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "storeServices",
+                "designer|userClassName": "Services"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen19978",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "/wa/istsos/services",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19981",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "service",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen19984",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "service",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen19987",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "path",
+                        "type": "string",
+                        "designer|userClassName": "MyField53"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen172001",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "griddocumentation",
+                "designer|userClassName": "gridDocumentation"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen172005",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy11"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen172011",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "root": "data",
+                                "designer|userClassName": "Json Reader11"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen172273",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField34"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen172280",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dateFormat": "Y-m-d",
+                        "name": "date",
+                        "type": "date",
+                        "designer|userClassName": "MyField35"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen172287",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "format",
+                        "type": "string",
+                        "designer|userClassName": "MyField36"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen172294",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "link",
+                        "type": "string",
+                        "designer|userClassName": "MyField37"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen175055",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "cmbdocumentformat",
+                "designer|userClassName": "cmbDocumentFormat"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen175059",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbdocumentformat.json",
+                        "designer|userClassName": "Ajax Proxy12"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen175065",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": null,
+                                "messageProperty": null,
+                                "root": "data",
+                                "designer|userClassName": "Json Reader12"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen175420",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "extension",
+                        "type": "string",
+                        "designer|userClassName": "MyField38"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen175427",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "format",
+                        "type": "string",
+                        "designer|userClassName": "MyField39"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen23769",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "procedurelist",
+                "designer|userClassName": "gridProceduresList"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen23773",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy14"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen23779",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader14"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen24076",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "sortType": "asText",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24083",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "offerings",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24090",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "observedproperties",
+                        "designer|userClassName": "MyField51"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen24877",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "gridobservedproperties",
+                "designer|userClassName": "gridObservedProperties"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen24880",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "",
+                        "designer|userClassName": "Ajax Proxy14"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen24883",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader14"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen24886",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen63840",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24889",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24892",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "procedures",
+                        "designer|userClassName": "MyField51"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen43477",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "gridofferings",
+                "designer|userClassName": "gridOfferings"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen43480",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "",
+                        "designer|userClassName": "Ajax Proxy14"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen43483",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader14"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen43486",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen43489",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen43492",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "procedures",
+                        "designer|userClassName": "MyField51"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen44059",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dateFormat": "c",
+                        "name": "expiration",
+                        "type": "date",
+                        "designer|userClassName": "MyField60"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen44066",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "active",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField61"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen18026",
+            "type": "arraystore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "MyArrayStore",
+                "designer|userClassName": "MyArrayStore"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen18030",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy19"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen18036",
+                            "type": "arrayreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "xx",
+                                "designer|userClassName": "Array Reader"
+                            }
+                        }
+                    ]
+                }
+            ]
+        }
+    ],
+    "framework": "ext40"
+}
\ No newline at end of file
diff --git a/interface/istsos.xds b/interface/istsos.xds
new file mode 100755
index 0000000..01da2d1
--- /dev/null
+++ b/interface/istsos.xds
@@ -0,0 +1,14185 @@
+{
+    "name": "istsos.xds",
+    "settings": {
+        "urlPrefix": "http://localhost/",
+        "directAPI": "",
+        "spacesToIndent": "4",
+        "codeGenFormat": "Class",
+        "exportPath": "/home/milan/workspace/istsos/google-svn/trunk/interface",
+        "extPath": "ext/",
+        "lineEnding": "LF",
+        "instantiateStore": true,
+        "exportXDSFiles": true,
+        "genTimestamps": true,
+        "appName": "istsos",
+        "cacheBust": false,
+        "buildShouldOverwriteIndex": true
+    },
+    "xdsVersion": "1.2.3",
+    "components": [
+        {
+            "id": "ExtBox1-ext-gen1666",
+            "type": "viewport",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "id": "mainPanel",
+                "itemId": "",
+                "layout": "border",
+                "designer|userClassName": "MainPanel"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen1754",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "mainCenter",
+                        "layout": "fit",
+                        "bodyPadding": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel",
+                        "layout|region": "center"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen2198",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "cls": null,
+                        "height": 70,
+                        "html": "<div class='mainHeaderTitle'>istSOS manager</div>\n<div class='mainHeaderSubtitle'> > Control Panel for Sensor Observation Service</div>",
+                        "id": "mainHead",
+                        "padding": null,
+                        "bodyCls": "mainHeader",
+                        "bodyPadding": "15 0 0 8",
+                        "bodyStyle": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel2",
+                        "layout|region": "north"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen2515",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 25,
+                        "html": "Open Source Software by Institute of Earth Science - SUPSI",
+                        "id": "mainFoot",
+                        "bodyCls": "mainFooter",
+                        "bodyPadding": 8,
+                        "title": "",
+                        "designer|userClassName": "MyPanel3",
+                        "layout|region": "south"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen5563",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "panelMenu",
+                        "width": 210,
+                        "layout": "border",
+                        "title": "",
+                        "designer|userClassName": "MyPanel13",
+                        "layout|region": "west"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen12379",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 30,
+                                "style": "background-color: white !important;",
+                                "ui": null,
+                                "designer|userClassName": "MyToolbar5",
+                                "container|align": "stretch",
+                                "container|padding": 2,
+                                "layout|region": "north",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen12556",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnMainMenu",
+                                        "enableToggle": true,
+                                        "pressed": true,
+                                        "text": "Server",
+                                        "toggleGroup": "menugroup",
+                                        "designer|userClassName": "MyButton7",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen12776",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnServicesMenu",
+                                        "enableToggle": true,
+                                        "text": "Services",
+                                        "toggleGroup": "menugroup",
+                                        "designer|userClassName": "MyButton8",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen12998",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnDataMenu",
+                                        "enableToggle": true,
+                                        "text": "Data",
+                                        "toggleGroup": "menugroup",
+                                        "designer|userClassName": "MyButton9",
+                                        "layout|flex": 1
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen6842",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "menuCard",
+                                "activeItem": 0,
+                                "layout": "card",
+                                "title": "",
+                                "designer|userClassName": "MyPanel15",
+                                "layout|region": "center"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen2221",
+                                    "type": "component",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "baseCls": null,
+                                        "id": "mainMenu",
+                                        "padding": "10px",
+                                        "style": "background: #fff;",
+                                        "styleHtmlContent": true,
+                                        "width": 150,
+                                        "designer|userClassName": "MyComponent"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen16528",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "servicesMenu",
+                                        "layout": "accordion",
+                                        "bodyPadding": "10px",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel16"
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen2664",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "style": null,
+                "width": null,
+                "layout": "border",
+                "bodyStyle": null,
+                "designer|userClassName": "BasePage"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen2804",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "cls": null,
+                        "componentCls": null,
+                        "height": null,
+                        "hidden": true,
+                        "padding": null,
+                        "layout": "fit",
+                        "bodyBorder": true,
+                        "bodyCls": "centerTitle",
+                        "bodyPadding": "8px",
+                        "designer|userClassName": "MyContainer1",
+                        "layout|region": "north"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen2986",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": null,
+                        "margin": null,
+                        "style": null,
+                        "styleHtmlContent": true,
+                        "autoScroll": true,
+                        "layout": "anchor",
+                        "bodyBorder": true,
+                        "bodyCls": "centerBody",
+                        "bodyPadding": null,
+                        "bodyStyle": null,
+                        "designer|userClassName": "MyContainer2",
+                        "layout|region": "center"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen3196",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 20,
+                        "hidden": true,
+                        "bodyPadding": "8px",
+                        "designer|userClassName": "MyContainer3",
+                        "layout|region": "south"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen9226",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "id": "contactinfo",
+                "width": null,
+                "bodyPadding": 10,
+                "bodyStyle": "centerBody",
+                "title": "",
+                "designer|userClassName": "contactinfo"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen6578",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen9554",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "contact",
+                        "fieldLabel": "Contact",
+                        "designer|userClassName": "MyTextField",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen9777",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "organization",
+                        "fieldLabel": "Organization",
+                        "designer|userClassName": "MyTextField1",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10003",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "position",
+                        "fieldLabel": "Position",
+                        "designer|userClassName": "MyTextField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10271",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "addressType",
+                        "fieldLabel": "Address type",
+                        "designer|userClassName": "MyTextField3",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10503",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "address",
+                        "fieldLabel": "Address",
+                        "designer|userClassName": "MyTextField4",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10738",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "city",
+                        "fieldLabel": "City",
+                        "designer|userClassName": "MyTextField5",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen10976",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "state",
+                        "fieldLabel": "State",
+                        "designer|userClassName": "MyTextField6",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen11217",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "zipCode",
+                        "fieldLabel": "ZIP code",
+                        "designer|userClassName": "MyTextField7",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen11461",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "country",
+                        "fieldLabel": "Coutry",
+                        "designer|userClassName": "MyTextField8",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen11708",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "telephone",
+                        "fieldLabel": "Telephone",
+                        "designer|userClassName": "MyTextField9",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen12079",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "fax",
+                        "fieldLabel": "Fax",
+                        "designer|userClassName": "MyTextField10",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen12332",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "email",
+                        "fieldLabel": "Email",
+                        "designer|userClassName": "MyTextField11",
+                        "layout|anchor": "100%"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen7237",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "id": null,
+                "width": null,
+                "bodyPadding": 10,
+                "bodyStyle": "centerBody",
+                "title": "",
+                "designer|userClassName": "paths",
+                "designer|userAlias": "paths"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen7247",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "istsos",
+                        "fieldLabel": "istSOS lib",
+                        "designer|userClassName": "MyTextField",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen7254",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "services",
+                        "fieldLabel": "istSOS config",
+                        "designer|userClassName": "MyTextField1",
+                        "layout|anchor": "100%"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen16479",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "defaults": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "about"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen8701",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "istSOS",
+                        "designer|userClassName": "MyFieldSet20"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen9791",
+                            "type": "displayfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "istsos_version",
+                                "fieldLabel": "Version",
+                                "designer|userClassName": "MyTextField92",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen10368",
+                            "type": "displayfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "updates",
+                                "name": "istsos_message",
+                                "fieldLabel": "Updates",
+                                "designer|userClassName": "MyTextField94",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11473",
+                            "type": "displayfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "hidden": true,
+                                "id": "download",
+                                "name": "download_url",
+                                "fieldLabel": "Download",
+                                "designer|userClassName": "MyDisplayField3",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen10976",
+                            "type": "textareafield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "hidden": true,
+                                "id": "changelog",
+                                "name": "latest_istsos_changelog",
+                                "readOnly": true,
+                                "fieldLabel": "Change log",
+                                "designer|userClassName": "MyTextArea",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen12714",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<p>istSOS (Istituto Scienze della Terra Sensor Observation Service) is an implementation of the Sensor Observation Service standard from Open Geospatial Consortium.\n</p>\n<p>\nThe developement of istSOS has started in 2009 in order to provide a simple implementation of the SOS standard for the management, provision and integration of hydro-meteorological data collected in Canton Ticino (Switzerland).\n</p>\n<p>\nistSOS is entirely written in <a href=\"ht [...]
+                        "padding": "10 0 0 0",
+                        "styleHtmlContent": true,
+                        "designer|userClassName": "MyContainer8",
+                        "layout|anchor": "100%"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen19556",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "contacts"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen19251",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen26395",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Authority",
+                        "designer|userClassName": "MyFieldSet2"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen26579",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "name",
+                                "fieldLabel": "Name",
+                                "designer|userClassName": "MyTextField19",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen27009",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "version",
+                                "fieldLabel": "Version",
+                                "designer|userClassName": "MyTextField20",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen27520",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Service Identification:",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen27853",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "title",
+                                "fieldLabel": "Title",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen28163",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "abstract",
+                                "fieldLabel": "Abstract",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen28476",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "keywords",
+                                "fieldLabel": "Keywords",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen28792",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "fees",
+                                "fieldLabel": "Fees",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29111",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "accessconstrains",
+                                "fieldLabel": "Access constrains",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen19777",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "identification"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen19780",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen19804",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Service Identification:",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19810",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "title",
+                                "fieldLabel": "Title",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19815",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "abstract",
+                                "fieldLabel": "Abstract",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19820",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "keywords",
+                                "fieldLabel": "Keywords",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19825",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "fees",
+                                "fieldLabel": "Fees",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19830",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "accessconstrains",
+                                "fieldLabel": "Access constrains",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21298",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "authority",
+                                "fieldLabel": "URN authority",
+                                "designer|userClassName": "MyTextField158",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21520",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "urnversion",
+                                "fieldLabel": "URN version",
+                                "designer|userClassName": "MyTextField159",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen20513",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "provider"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen20516",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen20523",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Service Provider:",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen20529",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "providername",
+                                "fieldLabel": "Name",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20534",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "providersite",
+                                "fieldLabel": "Web site",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20539",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactname",
+                                "fieldLabel": "Contact name",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20544",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactposition",
+                                "fieldLabel": "Contact position",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20549",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactvoice",
+                                "fieldLabel": "Voice",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21279",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactfax",
+                                "fieldLabel": "Fax",
+                                "designer|userClassName": "MyTextField53",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21501",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactemail",
+                                "fieldLabel": "Email",
+                                "designer|userClassName": "MyTextField54",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21726",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactdeliverypoint",
+                                "fieldLabel": "Address",
+                                "designer|userClassName": "MyTextField55",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21954",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactpostalcode",
+                                "fieldLabel": "Postal code",
+                                "designer|userClassName": "MyTextField56",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen22232",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactcity",
+                                "fieldLabel": "City",
+                                "designer|userClassName": "MyTextField57",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen22466",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactadminarea",
+                                "fieldLabel": "State",
+                                "designer|userClassName": "MyTextField58",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen22703",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactcountry",
+                                "fieldLabel": "Country",
+                                "designer|userClassName": "MyTextField59",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen29943",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "config"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen21157",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen30217",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Proxy URL (optional)",
+                        "designer|userClassName": "MyFieldSet1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen30414",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "fieldLabel": "Url",
+                                "designer|userClassName": "MyTextField14",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen30618",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "hidden": true,
+                                "fieldLabel": "POST",
+                                "designer|userClassName": "MyTextField15",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen30845",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "SensorML folder",
+                        "designer|userClassName": "MyFieldSet3"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen31051",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "smlpath",
+                                "fieldLabel": "Path",
+                                "designer|userClassName": "MyTextField16",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen31284",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Virtual procedures",
+                        "designer|userClassName": "MyFieldSet4"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen31496",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "vppath",
+                                "fieldLabel": "Path",
+                                "designer|userClassName": "MyTextField17",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen31735",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Coordinate system",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen31953",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "defaultepsg",
+                                "fieldLabel": "Default EPSG",
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen33631",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "permittedepsg",
+                                "fieldLabel": "Permitted EPSG",
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen32198",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "xaxisname",
+                                "fieldLabel": "X axis name",
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen33137",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "yaxisname",
+                                "fieldLabel": "Y axis name",
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen33423",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "zaxisname",
+                                "fieldLabel": "Z axis name",
+                                "designer|userClassName": "MyTextField26",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen11516",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "geo"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen11519",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen11567",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Coordinate system",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen11573",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "defaultepsg",
+                                "name": "istsosepsg",
+                                "fieldLabel": "Default EPSG",
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11578",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "allowedepsg",
+                                "fieldLabel": "Permitted EPSG",
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11583",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "xaxisname",
+                                "fieldLabel": "X axis name",
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11588",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "yaxisname",
+                                "fieldLabel": "Y axis name",
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen11593",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "zaxisname",
+                                "fieldLabel": "Z axis name",
+                                "designer|userClassName": "MyTextField26",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen24013",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "getobservation",
+                "designer|userAlias": "getobservation"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen24023",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "getobsconfig",
+                        "title": "GetObservation configuration:",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen24034",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "maxgoperiod",
+                                "fieldLabel": "Max request interval (hours)",
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen35508",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "database",
+                "designer|userAlias": "database"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen22215",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen35762",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "PostGIS database",
+                        "designer|userClassName": "MyFieldSet6"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen35959",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "user",
+                                "fieldLabel": "User",
+                                "designer|userClassName": "MyTextField28",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36163",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "inputType": "password",
+                                "name": "password",
+                                "fieldLabel": "Password",
+                                "designer|userClassName": "MyTextField29",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36370",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "host",
+                                "fieldLabel": "Host",
+                                "designer|userClassName": "MyTextField30",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36793",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "port",
+                                "fieldLabel": "Port",
+                                "designer|userClassName": "MyTextField32",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36580",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "dbname",
+                                "fieldLabel": "DB name",
+                                "designer|userClassName": "MyTextField31",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen7192",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "MyContainer5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen7344",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar3",
+                                "container|pack": "center"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen7555",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnTestConnection",
+                                        "text": "Test connection",
+                                        "designer|userClassName": "MyButton7",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen17457",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "serviceurl"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen9215",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": null,
+                        "padding": 10,
+                        "checkboxName": "cbproxy",
+                        "title": "Proxy url",
+                        "designer|userClassName": "MyFieldSet1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen11353",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "url",
+                                "fieldLabel": "Url",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField14",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen88263",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "id": "newprocpanel",
+                "width": null,
+                "autoScroll": true,
+                "defaults": "defaults: {\nanchor: '100%',\npadding: '10px',\n }",
+                "layout": "anchor",
+                "bodyPadding": null,
+                "title": "",
+                "designer|userClassName": "procedure"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen88266",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "padding": 8,
+                        "width": null,
+                        "layout": "anchor",
+                        "designer|userClassName": "MyForm17"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen26371",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "toolspanel",
+                                "title": "Tools",
+                                "designer|userClassName": "MyFieldSet46"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen34998",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "html": "<H4>Copy configuration from an existing procedure:</H4>",
+                                        "padding": null,
+                                        "designer|userClassName": "MyContainer31"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen28326",
+                                    "type": "fieldcontainer",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": null,
+                                        "id": "oeSettings",
+                                        "layout": "hbox",
+                                        "fieldLabel": "",
+                                        "designer|userClassName": "MyFieldContainer6"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen27093",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbServices",
+                                                "fieldLabel": "Service",
+                                                "labelWidth": 60,
+                                                "displayField": "service",
+                                                "store": "storeServices",
+                                                "valueField": "service",
+                                                "designer|userClassName": "MyComboBox12",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen32218",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 15,
+                                                "designer|userClassName": "MyContainer28",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen27100",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeCbOffering",
+                                                "itemId": null,
+                                                "name": "offering",
+                                                "fieldLabel": "Offering",
+                                                "labelWidth": 60,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "offerings",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen33134",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 15,
+                                                "designer|userClassName": "MyContainer28",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen27107",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeCbProcedure",
+                                                "itemId": null,
+                                                "name": "procedure",
+                                                "fieldLabel": "Procedure",
+                                                "labelWidth": 70,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "procedurelist",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox3",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen33795",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 15,
+                                                "designer|userClassName": "MyContainer28",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen27114",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "btnTemplateFill",
+                                                "text": "Fill form",
+                                                "designer|userClassName": "MyButton11",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen88272",
+                            "type": "container",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 30,
+                                "html": "<h2>Procedure:</h2>",
+                                "padding": "0 0 16 0",
+                                "designer|userClassName": "MyContainer13"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen97361",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 10,
+                                "id": "generalInfo",
+                                "padding": null,
+                                "bodyPadding": null,
+                                "title": "",
+                                "designer|userClassName": "MyForm11"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen88279",
+                                    "type": "fieldset",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": null,
+                                        "margin": 0,
+                                        "padding": 10,
+                                        "checkboxName": "cbproxy",
+                                        "title": "General info",
+                                        "designer|userClassName": "MyFieldSet1"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen32235",
+                                            "type": "displayfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "hidden": true,
+                                                "id": "asid",
+                                                "name": "assignedSensorId",
+                                                "value": null,
+                                                "fieldLabel": "Sensor ID",
+                                                "designer|userClassName": "MyDisplayField12",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88285",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "procedurename",
+                                                "name": "system",
+                                                "fieldLabel": "Name",
+                                                "labelSeparator": null,
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField14",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88290",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "description",
+                                                "fieldLabel": "Description",
+                                                "designer|userClassName": "MyTextField93",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88295",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "keywords",
+                                                "fieldLabel": "Keywords",
+                                                "designer|userClassName": "MyTextField94",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen123882",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "classification",
+                                "bodyPadding": null,
+                                "title": "",
+                                "designer|userClassName": "MyForm24"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen88362",
+                                    "type": "fieldset",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "margin": 0,
+                                        "title": "Classification",
+                                        "designer|userClassName": "MyFieldSet39"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen121259",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbsystemtype",
+                                                "name": "systemtype",
+                                                "fieldLabel": "System type",
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "forceSelection": true,
+                                                "store": "systemtype",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox5",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88373",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "sensortype",
+                                                "fieldLabel": "Sensor Type",
+                                                "allowBlank": false,
+                                                "emptyText": "tipping-bucket gauge, ...",
+                                                "designer|userClassName": "MyTextField174",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen23632",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "margin": 0,
+                                "title": "Location",
+                                "designer|userClassName": "MyFieldSet48"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen30448",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmLocation",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm23"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen30540",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "name",
+                                                "fieldLabel": "FOI name",
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField193",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen31516",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cbepsg",
+                                                "name": "epsg",
+                                                "fieldLabel": "EPSG",
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "forceSelection": true,
+                                                "store": "locationEPSG",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox7",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen32488",
+                                            "type": "fieldcontainer",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 30,
+                                                "layout": "column",
+                                                "fieldLabel": "Coordinates",
+                                                "designer|userClassName": "MyFieldContainer2"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen34690",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "x",
+                                                        "fieldLabel": "X",
+                                                        "labelWidth": 20,
+                                                        "allowBlank": false,
+                                                        "designer|userClassName": "MyTextField188",
+                                                        "layout|columnWidth": 0.33
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen35049",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "y",
+                                                        "fieldLabel": "Y",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 20,
+                                                        "allowBlank": false,
+                                                        "designer|userClassName": "MyTextField189",
+                                                        "layout|columnWidth": 0.33
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen25333",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "z",
+                                                        "fieldLabel": "Z",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 20,
+                                                        "allowBlank": false,
+                                                        "designer|userClassName": "MyTextField189",
+                                                        "layout|columnWidth": 0.34
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen49282",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "smlOutputs",
+                                "margin": 0,
+                                "padding": 8,
+                                "title": "Outputs",
+                                "designer|userClassName": "MyFieldSet36"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen51833",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmSmlOutputs",
+                                        "itemId": "frmSml",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm30"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen52528",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbObservedProperty",
+                                                "itemId": "cmbSml",
+                                                "name": "name",
+                                                "fieldLabel": "<span class='softLink' onclick='Ext.getCmp(\"newprocpanel\").openObsPropEditorWin();'>Observed property</span>",
+                                                "labelWidth": 120,
+                                                "allowBlank": false,
+                                                "displayField": "definition",
+                                                "forceSelection": true,
+                                                "store": "cmbobservedproperties",
+                                                "valueField": "definition",
+                                                "designer|userClassName": "MyComboBox10",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56600",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbUom",
+                                                "name": "uom",
+                                                "fieldLabel": "<span class='softLink' onclick='Ext.getCmp(\"newprocpanel\").openUomsEditorWin();'>Unit of measure</span>",
+                                                "labelWidth": 120,
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "forceSelection": true,
+                                                "store": "cmbuom",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox9",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen53233",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "description",
+                                                "fieldLabel": "Description",
+                                                "labelWidth": 120,
+                                                "designer|userClassName": "MyTextField192",
+                                                "layout|anchor": "100%"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen31276",
+                                            "type": "fieldcontainer",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 28,
+                                                "layout": "hbox",
+                                                "fieldLabel": "Statistical Quality Index Constraints",
+                                                "labelWidth": 230,
+                                                "designer|userClassName": "MyFieldContainer2",
+                                                "container|align": "stretch"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen31590",
+                                                    "type": "combobox",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "constrChoose",
+                                                        "width": 150,
+                                                        "name": "ctype",
+                                                        "fieldLabel": "",
+                                                        "labelWidth": 50,
+                                                        "emptyText": "Choose...",
+                                                        "displayField": "name",
+                                                        "queryMode": "local",
+                                                        "store": "constraint",
+                                                        "valueField": "value",
+                                                        "designer|userClassName": "MyComboBox29"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen31280",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "hidden": true,
+                                                        "id": "constrFrom",
+                                                        "name": "from",
+                                                        "fieldLabel": "From",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 50,
+                                                        "designer|userClassName": "MyTextField188",
+                                                        "layout|flex": 1
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen31285",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "hidden": true,
+                                                        "id": "constrTo",
+                                                        "name": "to",
+                                                        "fieldLabel": "To",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 40,
+                                                        "designer|userClassName": "MyTextField189",
+                                                        "layout|flex": 1
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen34923",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "hidden": true,
+                                                        "id": "constrList",
+                                                        "name": "list",
+                                                        "fieldLabel": "List",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 40,
+                                                        "designer|userClassName": "MyTextField189",
+                                                        "layout|flex": 1
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen70705",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "btnAddSml",
+                                                "margin": "0 0 10 0",
+                                                "padding": null,
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton28",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen49314",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 120,
+                                        "id": null,
+                                        "itemId": "gridSml",
+                                        "margin": null,
+                                        "minHeight": 120,
+                                        "title": "",
+                                        "forceFit": true,
+                                        "store": "gridoutputs",
+                                        "designer|userClassName": "MyGridPanel3"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen49318",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView3"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen49321",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "gridToolbar",
+                                                "designer|userClassName": "MyToolbar7",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen49326",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": null,
+                                                        "itemId": "btnRemoveSml",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton11",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66797",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn26"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66806",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn27"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66815",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "definition",
+                                                "text": "Definition",
+                                                "designer|userClassName": "MyColumn28"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66824",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "uom",
+                                                "text": "Uom",
+                                                "designer|userClassName": "MyColumn29"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66842",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "hidden": true,
+                                                "dataIndex": "role",
+                                                "text": "Role",
+                                                "designer|userClassName": "MyColumn31"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66851",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "from",
+                                                "text": "From",
+                                                "designer|userClassName": "MyColumn32"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen66860",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "to",
+                                                "text": "To",
+                                                "designer|userClassName": "MyColumn33"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45466",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "list",
+                                                "text": "List",
+                                                "designer|userClassName": "MyColumn49"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen88755",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "padding": 8,
+                        "layout": "anchor",
+                        "designer|userClassName": "MyForm17"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen16079",
+                            "type": "container",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 30,
+                                "html": "<h4>Optional parameters:</h4>",
+                                "margin": null,
+                                "padding": null,
+                                "layout": "fit",
+                                "designer|userClassName": "MyContainer13"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen88526",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "checkboxToggle": true,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Contacts (optional)",
+                                "designer|userClassName": "MyFieldSet38"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen136009",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MyContainer48",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen136556",
+                                            "type": "form",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "border": 0,
+                                                "id": "frmOwner",
+                                                "bodyPadding": null,
+                                                "title": "",
+                                                "designer|userClassName": "MyForm27"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen137033",
+                                                    "type": "hiddenfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "role",
+                                                        "value": "urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:owner",
+                                                        "fieldLabel": "Label",
+                                                        "designer|userClassName": "MyHiddenField",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen141855",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "organizationName",
+                                                        "fieldLabel": "Owner",
+                                                        "labelWidth": 130,
+                                                        "allowBlank": false,
+                                                        "emptyText": "Organization name...",
+                                                        "designer|userClassName": "MyTextField82",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen88532",
+                                                    "type": "fieldset",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "collapsed": true,
+                                                        "collapsible": true,
+                                                        "title": "Details (optional)",
+                                                        "designer|userClassName": "MyFieldSet32",
+                                                        "layout|anchor": "100%"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen88536",
+                                                            "type": "container",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "layout": "column",
+                                                                "designer|userClassName": "MyContainer18",
+                                                                "layout|anchor": "100%"
+                                                            },
+                                                            "cn": [
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88540",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer19",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88544",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "individualName",
+                                                                                "fieldLabel": "Person",
+                                                                                "designer|userClassName": "MyTextField152",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88549",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "voice",
+                                                                                "fieldLabel": "Telephone",
+                                                                                "designer|userClassName": "MyTextField154",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88554",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "fax",
+                                                                                "fieldLabel": "Fax",
+                                                                                "designer|userClassName": "MyTextField190",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88559",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "email",
+                                                                                "fieldLabel": "email",
+                                                                                "designer|userClassName": "MyTextField192",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88565",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer22",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88574",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "web",
+                                                                                "fieldLabel": "Web",
+                                                                                "designer|userClassName": "MyTextField193",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88579",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "deliveryPoint",
+                                                                                "fieldLabel": "Address",
+                                                                                "designer|userClassName": "MyTextField188",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88584",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "city",
+                                                                                "fieldLabel": "City",
+                                                                                "designer|userClassName": "MyTextField189",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen152718",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "administrativeArea",
+                                                                                "fieldLabel": "Admin area",
+                                                                                "designer|userClassName": "MyTextField121",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88589",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "postalcode",
+                                                                                "fieldLabel": "Postal code",
+                                                                                "designer|userClassName": "MyTextField191",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen22817",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "country",
+                                                                                "fieldLabel": "Country",
+                                                                                "designer|userClassName": "MyTextField153",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen145039",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MyContainer48",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen145043",
+                                            "type": "form",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "border": 0,
+                                                "id": "frmManufacturer",
+                                                "bodyPadding": null,
+                                                "title": "",
+                                                "designer|userClassName": "MyForm27"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen145046",
+                                                    "type": "hiddenfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "role",
+                                                        "value": "urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:manufacturer",
+                                                        "fieldLabel": "Label",
+                                                        "designer|userClassName": "MyHiddenField",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen145053",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "organizationName",
+                                                        "fieldLabel": "Manufacturer",
+                                                        "labelWidth": 130,
+                                                        "allowBlank": false,
+                                                        "emptyText": "Organization name...",
+                                                        "designer|userClassName": "MyTextField82",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen88597",
+                                                    "type": "fieldset",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "collapsed": true,
+                                                        "collapsible": true,
+                                                        "title": "Details (optional)",
+                                                        "designer|userClassName": "MyFieldSet32"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen88601",
+                                                            "type": "container",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "layout": "column",
+                                                                "designer|userClassName": "MyContainer18",
+                                                                "layout|anchor": "100%"
+                                                            },
+                                                            "cn": [
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88605",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer19",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88609",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "individualName",
+                                                                                "fieldLabel": "Person",
+                                                                                "designer|userClassName": "MyTextField152",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88614",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "voice",
+                                                                                "fieldLabel": "Telephone",
+                                                                                "designer|userClassName": "MyTextField154",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88619",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "fax",
+                                                                                "fieldLabel": "Fax",
+                                                                                "designer|userClassName": "MyTextField190",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88624",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "email",
+                                                                                "fieldLabel": "email",
+                                                                                "designer|userClassName": "MyTextField192",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88630",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer22",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88639",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "web",
+                                                                                "fieldLabel": "Web",
+                                                                                "designer|userClassName": "MyTextField193",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88644",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "deliveryPoint",
+                                                                                "fieldLabel": "Address",
+                                                                                "designer|userClassName": "MyTextField188",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88649",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "city",
+                                                                                "fieldLabel": "City",
+                                                                                "designer|userClassName": "MyTextField189",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen153278",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "administrativeArea",
+                                                                                "fieldLabel": "Admin area",
+                                                                                "designer|userClassName": "MyTextField121",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88654",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "postalcode",
+                                                                                "fieldLabel": "Postal code",
+                                                                                "designer|userClassName": "MyTextField191",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen23655",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "country",
+                                                                                "fieldLabel": "Country",
+                                                                                "designer|userClassName": "MyTextField153",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen146508",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MyContainer48",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen146512",
+                                            "type": "form",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "border": 0,
+                                                "id": "frmOperator",
+                                                "bodyPadding": null,
+                                                "title": "",
+                                                "designer|userClassName": "MyForm27"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen146515",
+                                                    "type": "hiddenfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "role",
+                                                        "value": "urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:operator",
+                                                        "fieldLabel": "Label",
+                                                        "designer|userClassName": "MyHiddenField",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen146522",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "organizationName",
+                                                        "fieldLabel": "Operator",
+                                                        "labelWidth": 130,
+                                                        "allowBlank": false,
+                                                        "emptyText": "Organization name...",
+                                                        "designer|userClassName": "MyTextField82",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen88662",
+                                                    "type": "fieldset",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "collapsed": true,
+                                                        "collapsible": true,
+                                                        "title": "Details (optional)",
+                                                        "designer|userClassName": "MyFieldSet32"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen88666",
+                                                            "type": "container",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "layout": "column",
+                                                                "designer|userClassName": "MyContainer18",
+                                                                "layout|anchor": "100%"
+                                                            },
+                                                            "cn": [
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88670",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer19",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88674",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "individualName",
+                                                                                "fieldLabel": "Person",
+                                                                                "designer|userClassName": "MyTextField152",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88679",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "voice",
+                                                                                "fieldLabel": "Telephone",
+                                                                                "designer|userClassName": "MyTextField154",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88684",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "fax",
+                                                                                "fieldLabel": "Fax",
+                                                                                "designer|userClassName": "MyTextField190",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88689",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "email",
+                                                                                "fieldLabel": "email",
+                                                                                "designer|userClassName": "MyTextField192",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    "id": "ExtBox1-ext-gen88695",
+                                                                    "type": "container",
+                                                                    "reference": {
+                                                                        "name": "items",
+                                                                        "type": "array"
+                                                                    },
+                                                                    "codeClass": null,
+                                                                    "userConfig": {
+                                                                        "padding": 6,
+                                                                        "layout": "anchor",
+                                                                        "designer|userClassName": "MyContainer22",
+                                                                        "layout|columnWidth": 0.5
+                                                                    },
+                                                                    "cn": [
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88704",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "web",
+                                                                                "fieldLabel": "Web",
+                                                                                "designer|userClassName": "MyTextField193",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88709",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "deliveryPoint",
+                                                                                "fieldLabel": "Address",
+                                                                                "designer|userClassName": "MyTextField188",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88714",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "city",
+                                                                                "fieldLabel": "City",
+                                                                                "designer|userClassName": "MyTextField189",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen153841",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "administrativeArea",
+                                                                                "fieldLabel": "Admin area",
+                                                                                "designer|userClassName": "MyTextField121",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen88719",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "postalcode",
+                                                                                "fieldLabel": "Postal code",
+                                                                                "designer|userClassName": "MyTextField191",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        },
+                                                                        {
+                                                                            "id": "ExtBox1-ext-gen24462",
+                                                                            "type": "textfield",
+                                                                            "reference": {
+                                                                                "name": "items",
+                                                                                "type": "array"
+                                                                            },
+                                                                            "codeClass": null,
+                                                                            "userConfig": {
+                                                                                "name": "country",
+                                                                                "fieldLabel": "Country",
+                                                                                "designer|userClassName": "MyTextField153",
+                                                                                "layout|anchor": "100%"
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                }
+                                                            ]
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen155986",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "smlDocumentation",
+                                "checkboxToggle": true,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Documents (optional)",
+                                "designer|userClassName": "MyFieldSet61"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen156435",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 150,
+                                        "itemId": "frmSml",
+                                        "layout": "vbox",
+                                        "bodyPadding": "10 0 5 0",
+                                        "title": "",
+                                        "designer|userClassName": "MyForm30",
+                                        "container|align": "stretch"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen161584",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "description",
+                                                "fieldLabel": "Description",
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField276",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen161970",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "applicationType",
+                                                "itemId": "cmbSml",
+                                                "name": "format",
+                                                "fieldLabel": "Format",
+                                                "displayField": "format",
+                                                "forceSelection": true,
+                                                "queryMode": "local",
+                                                "store": "cmbdocumentformat",
+                                                "typeAhead": true,
+                                                "valueField": "format",
+                                                "designer|userClassName": "MyComboBox6",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen161200",
+                                            "type": "datefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "date",
+                                                "fieldLabel": "Date",
+                                                "format": "Y-m-d",
+                                                "designer|userClassName": "MyDateField2",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen162358",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "link",
+                                                "fieldLabel": "Link",
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField277",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen164519",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "btnAddSml",
+                                                "width": 30,
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton30",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen167273",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 120,
+                                        "itemId": "gridSml",
+                                        "margin": null,
+                                        "minHeight": 120,
+                                        "title": "",
+                                        "forceFit": true,
+                                        "store": "griddocumentation",
+                                        "designer|userClassName": "MyGridPanel13"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen167309",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView13"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen168542",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "gridToolbar",
+                                                "designer|userClassName": "MyToolbar25",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen168902",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "itemId": "btnRemoveSml",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton31",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen173222",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn21"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen173231",
+                                            "type": "datecolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "date",
+                                                "text": "Date",
+                                                "format": "Y-m-d",
+                                                "designer|userClassName": "MyDateColumn2"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen173240",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "format",
+                                                "text": "Format",
+                                                "designer|userClassName": "MyColumn22"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen173249",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "link",
+                                                "text": "Link",
+                                                "designer|userClassName": "MyColumn23"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen40729",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "checkboxToggle": true,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Interfaces (optional)",
+                                "designer|userClassName": "MyFieldSet49"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen41301",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmInterfaces",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm22"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen41714",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "interfaces",
+                                                "fieldLabel": "Name list (csv)",
+                                                "emptyText": "RS-232,RS-485,BLUETOOTH,WIFI,IR ...",
+                                                "designer|userClassName": "MyTextField187",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen43626",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "hidden": true,
+                                "hideMode": null,
+                                "id": "smlInputs",
+                                "padding": 8,
+                                "checkboxToggle": true,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Inputs (optional)",
+                                "designer|userClassName": "MyFieldSet36"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen43630",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "id": null,
+                                        "itemId": "frmSml",
+                                        "padding": null,
+                                        "layout": "hbox",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm23",
+                                        "container|align": "stretch",
+                                        "container|padding": null,
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen43634",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "cmbSml",
+                                                "margin": "0 6 0 0",
+                                                "padding": null,
+                                                "name": "name",
+                                                "fieldLabel": "<span class='softLink' onclick='alert(\\\"to do\\\");'>Name</span>",
+                                                "labelWidth": 40,
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "store": "cmbphenomenon",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyTextField169",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43642",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "padding": null,
+                                                "name": "description",
+                                                "fieldLabel": "Description",
+                                                "labelAlign": "right",
+                                                "labelWidth": 80,
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField170",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43650",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": null,
+                                                "itemId": "btnAddSml",
+                                                "margin": "0 0 0 6",
+                                                "width": 50,
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton7",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen43658",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 120,
+                                        "id": null,
+                                        "itemId": "gridSml",
+                                        "margin": 8,
+                                        "minHeight": 120,
+                                        "title": "",
+                                        "store": "gridinput",
+                                        "designer|userClassName": "MyGridPanel3"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen43662",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView3"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43665",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "gridToolbar",
+                                                "designer|userClassName": "MyToolbar7",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen43670",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": null,
+                                                        "itemId": "btnRemoveSml",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton11",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43675",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "flex": null,
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn16"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43678",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "flex": 0.5,
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn17"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen43681",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "definition",
+                                                "flex": 1,
+                                                "text": "Definition",
+                                                "designer|userClassName": "MyColumn18"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen88301",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "smlIdentification",
+                                "padding": null,
+                                "checkboxToggle": true,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Identification (optional)",
+                                "designer|userClassName": "MyFieldSet36"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen102814",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "id": "frmIdentification",
+                                        "itemId": "frmSml",
+                                        "padding": null,
+                                        "layout": "hbox",
+                                        "bodyPadding": null,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm23",
+                                        "container|align": "stretch",
+                                        "container|padding": null,
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen88307",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "cmbSml",
+                                                "margin": "0 6 0 0",
+                                                "padding": null,
+                                                "name": "name",
+                                                "fieldLabel": "Name",
+                                                "labelWidth": 40,
+                                                "allowBlank": false,
+                                                "displayField": "name",
+                                                "store": "cmbidentification",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyTextField169",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88312",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "padding": null,
+                                                "name": "value",
+                                                "fieldLabel": "Value",
+                                                "labelAlign": "right",
+                                                "labelWidth": 40,
+                                                "allowBlank": false,
+                                                "designer|userClassName": "MyTextField170",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88324",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "btnAddIdentification",
+                                                "itemId": "btnAddSml",
+                                                "margin": "0 0 0 6",
+                                                "width": 50,
+                                                "text": "Add",
+                                                "designer|userClassName": "MyButton7",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen88336",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 120,
+                                        "id": "gridIdentification",
+                                        "itemId": "gridSml",
+                                        "margin": 8,
+                                        "minHeight": 120,
+                                        "title": "",
+                                        "store": "grididentification",
+                                        "designer|userClassName": "MyGridPanel3"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen88339",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView3"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen88343",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "itemId": "gridToolbar",
+                                                "designer|userClassName": "MyToolbar7",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen88348",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "btnRemoveIdentification",
+                                                        "itemId": "btnRemoveSml",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton11",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen113184",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "flex": null,
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn16"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen113193",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "value",
+                                                "flex": 0.5,
+                                                "text": "Value",
+                                                "designer|userClassName": "MyColumn17"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen113202",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "definition",
+                                                "flex": 1,
+                                                "text": "Definition",
+                                                "designer|userClassName": "MyColumn18"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen88438",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "checkboxToggle": true,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Characteristics (optional)",
+                                "designer|userClassName": "MyFieldSet39"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen125719",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "characteristics",
+                                        "margin": 0,
+                                        "padding": 0,
+                                        "bodyPadding": null,
+                                        "collapsed": false,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm25"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen88444",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "name": "characteristics",
+                                                "fieldLabel": "Technical specification sheet URL",
+                                                "labelWidth": 210,
+                                                "designer|userClassName": "MyTextField173",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen88450",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "checkboxToggle": true,
+                                "collapsed": true,
+                                "collapsible": true,
+                                "title": "Capabilities",
+                                "designer|userClassName": "MyFieldSet39"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen27593",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "frmCapabilities",
+                                        "bodyPadding": null,
+                                        "collapsed": false,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm30"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen36148",
+                                            "type": "fieldcontainer",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 30,
+                                                "layout": "column",
+                                                "fieldLabel": "Sampling time resolution",
+                                                "labelWidth": 180,
+                                                "designer|userClassName": "MyFieldContainer7"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen37006",
+                                                    "type": "combobox",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "strCombo",
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "displayField": "combo",
+                                                        "store": "cmbcapabilitiesuom",
+                                                        "valueField": "uom",
+                                                        "designer|userClassName": "MyComboBox29",
+                                                        "layout|columnWidth": 0.5
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen37523",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "strValue",
+                                                        "fieldLabel": "Value",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 60,
+                                                        "designer|userClassName": "MyTextField159",
+                                                        "layout|columnWidth": 0.5
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen40621",
+                                            "type": "fieldcontainer",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 30,
+                                                "id": "MyFieldContainer8",
+                                                "layout": "column",
+                                                "fieldLabel": "Acquisition time resolution",
+                                                "labelWidth": 180,
+                                                "designer|userClassName": "MyFieldContainer7"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen40627",
+                                                    "type": "combobox",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "atrCombo",
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "displayField": "combo",
+                                                        "store": "cmbcapabilitiesuom2",
+                                                        "valueField": "uom",
+                                                        "designer|userClassName": "MyComboBox29",
+                                                        "layout|columnWidth": 0.5
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen40632",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "atrValue",
+                                                        "fieldLabel": "Value",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 60,
+                                                        "designer|userClassName": "MyTextField159",
+                                                        "layout|columnWidth": 0.5
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen42759",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "storeTypeValue",
+                                                "fieldLabel": "Storage type",
+                                                "labelWidth": 180,
+                                                "designer|userClassName": "MyTextField161",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen127835",
+                                    "type": "fieldset",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "smlCapabilities",
+                                        "padding": 8,
+                                        "collapsed": true,
+                                        "collapsible": true,
+                                        "title": "Additional Capabilities (optional)",
+                                        "designer|userClassName": "MyFieldSet36"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen127839",
+                                            "type": "form",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "border": 0,
+                                                "height": 30,
+                                                "id": null,
+                                                "itemId": "frmSml",
+                                                "padding": null,
+                                                "layout": "hbox",
+                                                "bodyPadding": null,
+                                                "title": "",
+                                                "designer|userClassName": "MyForm23",
+                                                "container|align": "stretch",
+                                                "container|padding": null,
+                                                "layout|anchor": "100%"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen127843",
+                                                    "type": "combobox",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "itemId": "cmbSml",
+                                                        "margin": "0 6 0 0",
+                                                        "padding": null,
+                                                        "name": "name",
+                                                        "fieldLabel": "Name",
+                                                        "labelWidth": 60,
+                                                        "allowBlank": false,
+                                                        "displayField": "combo",
+                                                        "store": "cmbCapabilities",
+                                                        "valueField": "name",
+                                                        "designer|userClassName": "MyTextField169",
+                                                        "layout|flex": 1
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127851",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "padding": null,
+                                                        "name": "value",
+                                                        "fieldLabel": "Value",
+                                                        "labelAlign": "right",
+                                                        "labelWidth": 60,
+                                                        "allowBlank": false,
+                                                        "designer|userClassName": "MyTextField170",
+                                                        "layout|flex": 1
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127859",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": null,
+                                                        "itemId": "btnAddSml",
+                                                        "margin": "0 0 0 6",
+                                                        "width": 50,
+                                                        "text": "Add",
+                                                        "designer|userClassName": "MyButton7",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen127867",
+                                            "type": "gridpanel",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 120,
+                                                "id": null,
+                                                "itemId": "gridSml",
+                                                "margin": 8,
+                                                "minHeight": 120,
+                                                "title": "",
+                                                "store": "gridCapabilities",
+                                                "designer|userClassName": "MyGridPanel3"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen127871",
+                                                    "type": "gridview",
+                                                    "reference": {
+                                                        "name": "viewConfig",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "designer|userClassName": "MyGridView3"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127874",
+                                                    "type": "toolbar",
+                                                    "reference": {
+                                                        "name": "dockedItems",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "itemId": "gridToolbar",
+                                                        "designer|userClassName": "MyToolbar7",
+                                                        "dock": "top"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen127879",
+                                                            "type": "button",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": null,
+                                                                "itemId": "btnRemoveSml",
+                                                                "text": "Remove selected",
+                                                                "designer|userClassName": "MyButton11",
+                                                                "layout|flex": null
+                                                            }
+                                                        }
+                                                    ]
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127884",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "name",
+                                                        "flex": null,
+                                                        "text": "Name",
+                                                        "designer|userClassName": "MyColumn16"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127887",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "value",
+                                                        "flex": 0.5,
+                                                        "text": "Value",
+                                                        "designer|userClassName": "MyColumn17"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen131383",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "uom",
+                                                        "text": "Unit of measure",
+                                                        "designer|userClassName": "MyColumn19"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen127890",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "definition",
+                                                        "flex": 1,
+                                                        "text": "Definition",
+                                                        "designer|userClassName": "MyColumn18"
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen15774",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "newservice"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen16504",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "title": "Sensor Observation Service",
+                        "designer|userClassName": "MyFieldSet10"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen16682",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "nsservice",
+                                "invalidText": "The serivice name must be a single lower case word",
+                                "name": "service",
+                                "fieldLabel": "Service name",
+                                "allowBlank": false,
+                                "regex": "/^[a-z]+$/",
+                                "designer|userClassName": "MyTextField35",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20413",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "inputType": null,
+                                "name": "epsg",
+                                "fieldLabel": "EPSG",
+                                "emptyText": "if empty, the default EPSG will be used",
+                                "designer|userClassName": "MyTextField157",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen11293",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": null,
+                        "padding": 10,
+                        "designer|userClassName": "MyContainer3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15777",
+                    "type": "displayfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "hidden": true,
+                        "id": "messageField",
+                        "fieldStyle": "color: red;",
+                        "name": "message",
+                        "fieldLabel": "Message",
+                        "labelStyle": "color: red;",
+                        "designer|userClassName": "MyDisplayField2",
+                        "layout|anchor": "100%"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15784",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "fscustomdb",
+                        "checkboxName": "customdb",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "Customize database",
+                        "designer|userClassName": "MyFieldSet6"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen15790",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "user",
+                                "fieldLabel": "User",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField28",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen15795",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "password",
+                                "fieldLabel": "Password",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField29",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen15800",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "host",
+                                "fieldLabel": "Host",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField30",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen15805",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "port",
+                                "fieldLabel": "Port",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField32",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen15810",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "dbname",
+                                "fieldLabel": "DB name",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField31",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen16882",
+                            "type": "container",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyContainer5"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen16888",
+                                    "type": "toolbar",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": null,
+                                        "margin": "0 0 5 0",
+                                        "ui": "footer",
+                                        "designer|userClassName": "MyToolbar3",
+                                        "container|pack": "end"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen16891",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "btnTestConnection",
+                                                "text": "Test connection",
+                                                "designer|userClassName": "MyButton7",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen38532",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "layout": "anchor",
+                "title": "",
+                "designer|userClassName": "FormDataQuality"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen38760",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "bodyPadding": 10,
+                        "title": "",
+                        "designer|userClassName": "MyForm5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen38998",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Add new index",
+                                "designer|userClassName": "MyFieldSet7"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen39198",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "fieldLabel": "Code",
+                                        "designer|userClassName": "MyTextField34",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen39366",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "fieldLabel": "Description",
+                                        "designer|userClassName": "MyTextField35",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen39737",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar2",
+                                "container|pack": "end",
+                                "layout|anchor": "100%",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen39743",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "text": "Cancel",
+                                        "designer|userClassName": "MyButton4",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen39749",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "text": "Add",
+                                        "designer|userClassName": "MyButton5",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen40349",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "padding": "16 8 0 8",
+                        "title": "Quality indexes",
+                        "store": "dataQualityStore",
+                        "designer|userClassName": "MyGridPanel"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen40387",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 120,
+                                "designer|userClassName": "MyGridView"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen42656",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "code",
+                                "text": "Code",
+                                "designer|userClassName": "MyColumn1"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen42665",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "description",
+                                "text": "Description",
+                                "designer|userClassName": "MyColumn2"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen6291",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": 600,
+                "width": 900,
+                "layout": "border",
+                "bodyStyle": "background-color: transparent;",
+                "title": "",
+                "designer|userClassName": "ObservationEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen6935",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 140,
+                        "id": "oeSettings",
+                        "bodyPadding": 10,
+                        "bodyStyle": null,
+                        "title": "",
+                        "designer|userClassName": "MyForm6",
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen15261",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Choose the procedure",
+                                "designer|userClassName": "MyFieldSet8"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen24324",
+                                    "type": "fieldcontainer",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 30,
+                                        "layout": "hbox",
+                                        "fieldLabel": "Label",
+                                        "hideLabel": true,
+                                        "designer|userClassName": "MyFieldContainer1",
+                                        "container|align": "stretch",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen18373",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cmbServices",
+                                                "fieldLabel": "Service",
+                                                "displayField": "service",
+                                                "store": "storeServices",
+                                                "valueField": "service",
+                                                "designer|userClassName": "MyComboBox12",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25132",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeCbOffering",
+                                                "itemId": null,
+                                                "name": "offering",
+                                                "fieldLabel": "Offering",
+                                                "labelAlign": "right",
+                                                "labelWidth": 60,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "offerings",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25356",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeCbProcedure",
+                                                "itemId": null,
+                                                "name": "procedure",
+                                                "fieldLabel": "Procedure",
+                                                "labelAlign": "right",
+                                                "labelWidth": 80,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "procedurelist",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox3",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25531",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeCbObservedProperty",
+                                                "name": "observedproperty",
+                                                "fieldLabel": "Property",
+                                                "labelAlign": "right",
+                                                "labelWidth": 80,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "observedproperties",
+                                                "valueField": "name",
+                                                "designer|userClassName": "MyComboBox4",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen10074",
+                                    "type": "fieldcontainer",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 25,
+                                        "defaults": "{\n                    flex: 1,\n                    hideLabel: true\n                }",
+                                        "layout": "hbox",
+                                        "fieldLabel": "Time period",
+                                        "designer|userClassName": "MyFieldContainer",
+                                        "container|align": "stretch",
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen10377",
+                                            "type": "datefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeBegin",
+                                                "name": "begin",
+                                                "fieldLabel": null,
+                                                "designer|userClassName": "MyDateField",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen24915",
+                                            "type": "timefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeBeginTime",
+                                                "name": "begintime",
+                                                "value": "00:00",
+                                                "fieldLabel": "Label",
+                                                "format": "G:i",
+                                                "increment": 10,
+                                                "designer|userClassName": "MyTimeField",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25323",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "html": "<div style='text-align: center; width: 100%;'>-</div>",
+                                                "padding": "5 0 0 0 ",
+                                                "width": 20,
+                                                "layout": "fit",
+                                                "designer|userClassName": "MyContainer26",
+                                                "layout|flex": 0
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen10564",
+                                            "type": "datefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeEnd",
+                                                "name": "end",
+                                                "fieldLabel": "Label",
+                                                "designer|userClassName": "MyDateField1",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen25118",
+                                            "type": "timefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "oeEndTime",
+                                                "name": "endtime",
+                                                "value": "00:00",
+                                                "fieldLabel": "Label",
+                                                "format": "G:i",
+                                                "increment": 10,
+                                                "designer|userClassName": "MyTimeField1",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20337",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar5",
+                                "container|align": "middle",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen20551",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "oeBtnReset",
+                                        "text": "Reset",
+                                        "designer|userClassName": "MyButton10",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen20772",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "oeBtnLoad",
+                                        "text": "Load",
+                                        "designer|userClassName": "MyButton11",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen7217",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "html": null,
+                        "id": "oeEditor",
+                        "layout": "fit",
+                        "title": "",
+                        "designer|userClassName": "MyPanel9",
+                        "layout|region": "center"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen30261",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "layout": "hbox",
+                "title": "",
+                "designer|userClassName": "ObservationEditorColumn",
+                "container|align": "stretch"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen33639",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "id": "chartContainer",
+                        "padding": "16px",
+                        "maintainFlex": true,
+                        "layout": "fit",
+                        "bodyPadding": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel11",
+                        "layout|flex": 0.9
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen33799",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "gridContainer",
+                        "width": 300,
+                        "maintainFlex": true,
+                        "layout": "fit",
+                        "bodyPadding": "16px",
+                        "title": "",
+                        "designer|userClassName": "MyPanel12"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen14802",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "bodyPadding": null,
+                "title": "",
+                "designer|userClassName": "serviceconfig"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen18952",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>Service Provider:</h3>Here you can personalize the service provider information. It will be displayed in the getCapabilities document.",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen19232",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "provider",
+                        "padding": 10,
+                        "checkboxName": "cbprovider",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19238",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "providername",
+                                "fieldLabel": "Name",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19243",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "providersite",
+                                "fieldLabel": "Web site",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19248",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactname",
+                                "fieldLabel": "Contact name",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19253",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactposition",
+                                "fieldLabel": "Contact position",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19258",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactvoice",
+                                "fieldLabel": "Voice",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19263",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactfax",
+                                "fieldLabel": "Fax",
+                                "designer|userClassName": "MyTextField53",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19268",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactemail",
+                                "fieldLabel": "Email",
+                                "designer|userClassName": "MyTextField54",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19273",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactdeliverypoint",
+                                "fieldLabel": "Address",
+                                "designer|userClassName": "MyTextField55",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19278",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactpostalcode",
+                                "fieldLabel": "Postal code",
+                                "designer|userClassName": "MyTextField56",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19283",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactcity",
+                                "fieldLabel": "City",
+                                "designer|userClassName": "MyTextField57",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19288",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactadminarea",
+                                "fieldLabel": "State",
+                                "designer|userClassName": "MyTextField58",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19293",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "contactcountry",
+                                "fieldLabel": "Country",
+                                "designer|userClassName": "MyTextField59",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen19562",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>Service Identification:</h3>Here you can personalize..",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen7453",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "identification",
+                        "padding": 10,
+                        "checkboxName": "cbidentification",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen7459",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "title",
+                                "fieldLabel": "Title",
+                                "designer|userClassName": "MyTextField12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen7464",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "abstract",
+                                "fieldLabel": "Abstract",
+                                "designer|userClassName": "MyTextField13",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen7469",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "keywords",
+                                "fieldLabel": "Keywords",
+                                "designer|userClassName": "MyTextField21",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen7474",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "fees",
+                                "fieldLabel": "Fees",
+                                "designer|userClassName": "MyTextField22",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen7479",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "accessconstrains",
+                                "fieldLabel": "Access constrains",
+                                "designer|userClassName": "MyTextField23",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen20011",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>Coordinate system:</h3>Here you can personalize..",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen13057",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "geo",
+                        "padding": 10,
+                        "checkboxName": "cbcoordinates",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen13063",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "istsosepsg",
+                                "fieldLabel": "Default EPSG",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen13068",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "allowedepsg",
+                                "fieldLabel": "Permitted EPSG",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen13073",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "xaxisname",
+                                "fieldLabel": "X axis name",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen13078",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "yaxisname",
+                                "fieldLabel": "Y axis name",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen13083",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "zaxisname",
+                                "fieldLabel": "Z axis name",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField26",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen28721",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>GetObservation configuration:</h3>Here you can personalize..",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen29667",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "getobservation",
+                        "padding": 10,
+                        "checkboxName": "cbgetobservation",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen29673",
+                            "type": "numberfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "maxgoperiod",
+                                "fieldLabel": "Max request interval (hours)",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField27",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29678",
+                            "type": "numberfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "defaultqi",
+                                "fieldLabel": "Default quality index",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField25",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29683",
+                            "type": "numberfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "aggregatenodataqi",
+                                "fieldLabel": "Aggregation no-data quality index",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField24",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen29688",
+                            "type": "numberfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "aggregatenodata",
+                                "fieldLabel": "Aggregation no-data value",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField18",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen8383",
+                    "type": "container",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "html": "<h3>Proxy URL:</h3>Here you can personalize..",
+                        "padding": "10 0 10 0",
+                        "designer|userClassName": "MyContainer6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen39973",
+                    "type": "fieldset",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "proxyurl",
+                        "padding": 10,
+                        "checkboxName": "cbgetobservation",
+                        "checkboxToggle": true,
+                        "collapsed": true,
+                        "collapsible": true,
+                        "title": "check to apply customizations",
+                        "designer|userClassName": "MyFieldSet5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen40694",
+                            "type": "textfield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "name": "url",
+                                "fieldLabel": "Url",
+                                "allowBlank": false,
+                                "designer|userClassName": "MyTextField14",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen14182",
+            "type": "gridpanel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": null,
+                "width": null,
+                "title": "",
+                "forceFit": true,
+                "store": "serverstatus",
+                "designer|userClassName": "status"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen14217",
+                    "type": "gridview",
+                    "reference": {
+                        "name": "viewConfig",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "MyGridView2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8675",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "service",
+                        "text": "Service",
+                        "designer|userClassName": "MyColumn3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8648",
+                    "type": "numbercolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "featuresOfInterest",
+                        "text": "Features Of Interest",
+                        "format": 0,
+                        "designer|userClassName": "MyNumberColumn2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8702",
+                    "type": "numbercolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "offerings",
+                        "text": "Offerings",
+                        "format": 0,
+                        "designer|userClassName": "MyNumberColumn3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8729",
+                    "type": "numbercolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "procedures",
+                        "text": "Procedures",
+                        "format": 0,
+                        "designer|userClassName": "MyNumberColumn4"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8738",
+                    "type": "numbercolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "observedProperties",
+                        "text": "Observed Properties",
+                        "format": 0,
+                        "designer|userClassName": "MyNumberColumn5"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8693",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colAvailability",
+                        "dataIndex": "availability",
+                        "text": "Availability",
+                        "designer|userClassName": "MyColumn5"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8684",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colDatabase",
+                        "dataIndex": "database",
+                        "text": "Database",
+                        "designer|userClassName": "MyColumn4"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8639",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colGetcapabilities",
+                        "dataIndex": "getcapabilities",
+                        "text": "GetCapabilities",
+                        "designer|userClassName": "MyBooleanColumn1"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8657",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colDescribesensor",
+                        "dataIndex": "describesensor",
+                        "text": "DescribeSensor",
+                        "designer|userClassName": "MyBooleanColumn2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8666",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colGetobservation",
+                        "dataIndex": "getobservation",
+                        "text": "GetObservation",
+                        "designer|userClassName": "MyBooleanColumn3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8711",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colGetfeatureofinterest",
+                        "dataIndex": "getfeatureofinterest",
+                        "text": "GetFeatureOfInterest",
+                        "designer|userClassName": "MyBooleanColumn4"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8747",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colInsertobservation",
+                        "dataIndex": "insertobservation",
+                        "text": "InsertObservation",
+                        "designer|userClassName": "MyBooleanColumn6"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen8720",
+                    "type": "booleancolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "colRegistersensor",
+                        "dataIndex": "registersensor",
+                        "text": "RegisterSensor",
+                        "designer|userClassName": "MyBooleanColumn5"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen22864",
+            "type": "gridpanel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": 400,
+                "maxHeight": null,
+                "width": null,
+                "autoScroll": true,
+                "title": null,
+                "forceFit": true,
+                "store": "procedurelist",
+                "designer|userClassName": "proceduresList"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen21178",
+                    "type": "toolbar",
+                    "reference": {
+                        "name": "dockedItems",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "MyToolbar23",
+                        "dock": "top"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen21545",
+                            "type": "button",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "btnRemove",
+                                "text": "Delete selected",
+                                "designer|userClassName": "MyButton67",
+                                "layout|flex": null
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen22899",
+                    "type": "gridview",
+                    "reference": {
+                        "name": "viewConfig",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "MyGridView13"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24898",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "name",
+                        "text": "Name",
+                        "designer|userClassName": "MyColumn31"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen32540",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "description",
+                        "text": "Description",
+                        "designer|userClassName": "MyColumn31"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen32950",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "sensortype",
+                        "text": "Sensor Type",
+                        "designer|userClassName": "MyColumn31"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24907",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "offerings",
+                        "text": "Offerings",
+                        "designer|userClassName": "MyColumn32"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24916",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "observedproperties",
+                        "text": "Observedproperties",
+                        "designer|userClassName": "MyColumn33"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen32388",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "samplingTime",
+                        "text": "BeginPosition",
+                        "designer|userClassName": "MyColumn53"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen33294",
+                    "type": "gridcolumn",
+                    "reference": {
+                        "name": "columns",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dataIndex": "samplingTime",
+                        "text": "EndPosition",
+                        "designer|userClassName": "MyColumn53"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen31862",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "title": "",
+                "designer|userClassName": "obsPropEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen32843",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "height": null,
+                        "id": "gridop",
+                        "margin": 8,
+                        "maxHeight": 250,
+                        "title": "",
+                        "forceFit": true,
+                        "store": "gridobservedproperties",
+                        "designer|userClassName": "MyGridPanel16"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen32880",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "designer|userClassName": "MyGridView16"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen37413",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyToolbar26",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen37569",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnNew",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton37",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen37779",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "disabled": true,
+                                        "id": "btnRemove",
+                                        "text": "Remove selected",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen64210",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "name",
+                                "flex": 1,
+                                "text": "Name",
+                                "designer|userClassName": "MyColumn42"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen64219",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "definition",
+                                "flex": 1,
+                                "text": "Definition",
+                                "designer|userClassName": "MyColumn43"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen64228",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "description",
+                                "flex": 1,
+                                "text": "Description",
+                                "designer|userClassName": "MyColumn44"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen64237",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "procedures",
+                                "flex": 1,
+                                "text": "Procedures",
+                                "designer|userClassName": "MyColumn45"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen54636",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "constraint2str",
+                                "flex": 1,
+                                "text": "Constraint",
+                                "designer|userClassName": "MyColumn50"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen32116",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "hidden": true,
+                        "id": "frmObservedProperties",
+                        "maxWidth": null,
+                        "width": null,
+                        "bodyPadding": 10,
+                        "animCollapse": null,
+                        "collapseFirst": null,
+                        "collapsed": null,
+                        "title": "",
+                        "trackResetOnLoad": true,
+                        "designer|userClassName": "MyForm33"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen32343",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Observed property",
+                                "designer|userClassName": "MyFieldSet54"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen32505",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opName",
+                                        "name": "name",
+                                        "fieldLabel": "Name",
+                                        "designer|userClassName": "MyTimeField",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen27021",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opDefinition",
+                                        "name": "definition",
+                                        "fieldLabel": "Definition URN",
+                                        "designer|userClassName": "MyTimeField",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen63309",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "name": "description",
+                                        "fieldLabel": "Description",
+                                        "designer|userClassName": "MyTimeField1",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen48594",
+                                    "type": "fieldcontainer",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 28,
+                                        "layout": "hbox",
+                                        "fieldLabel": "Correct Quality Index Constraints",
+                                        "designer|userClassName": "MyFieldContainer2",
+                                        "container|align": "stretch"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen48598",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "sqiChoose",
+                                                "width": 110,
+                                                "name": "ctype",
+                                                "fieldLabel": "",
+                                                "labelWidth": 50,
+                                                "emptyText": "Choose...",
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "constraint",
+                                                "valueField": "value",
+                                                "designer|userClassName": "MyComboBox29"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen48604",
+                                            "type": "numberfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "hidden": true,
+                                                "id": "sqiFrom",
+                                                "name": "from",
+                                                "fieldLabel": "From",
+                                                "labelAlign": "right",
+                                                "labelWidth": 50,
+                                                "designer|userClassName": "MyTextField188",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen48610",
+                                            "type": "numberfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "hidden": true,
+                                                "id": "sqiTo",
+                                                "name": "to",
+                                                "fieldLabel": "To",
+                                                "labelAlign": "right",
+                                                "labelWidth": 40,
+                                                "designer|userClassName": "MyTextField189",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen48616",
+                                            "type": "textfield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "hidden": true,
+                                                "id": "sqiList",
+                                                "name": "list",
+                                                "fieldLabel": "List",
+                                                "labelAlign": "right",
+                                                "labelWidth": 40,
+                                                "designer|userClassName": "MyTextField189",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen37991",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar27",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen38253",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnForm",
+                                        "text": "Insert",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen21789",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "title": "",
+                "designer|userClassName": "uomsEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen21792",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "height": null,
+                        "id": "gridop",
+                        "margin": 8,
+                        "maxHeight": 250,
+                        "title": "",
+                        "forceFit": true,
+                        "store": "griduoms",
+                        "designer|userClassName": "MyGridPanel16"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen21797",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "designer|userClassName": "MyGridView16"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21800",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyToolbar26",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen21805",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnNew",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton37",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen21810",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "disabled": true,
+                                        "id": "btnRemove",
+                                        "text": "Remove selected",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21815",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "name",
+                                "text": "Code",
+                                "designer|userClassName": "MyColumn42"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21821",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "description",
+                                "text": "Description",
+                                "designer|userClassName": "MyColumn44"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21824",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "procedures",
+                                "text": "Procedures",
+                                "designer|userClassName": "MyColumn45"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen21827",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "hidden": true,
+                        "id": "frmUoms",
+                        "bodyPadding": 10,
+                        "title": "",
+                        "trackResetOnLoad": true,
+                        "designer|userClassName": "MyForm33"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen21832",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Observed property",
+                                "designer|userClassName": "MyFieldSet54"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen21838",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opName",
+                                        "name": "name",
+                                        "fieldLabel": "Code",
+                                        "designer|userClassName": "MyTimeField",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen21848",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "name": "description",
+                                        "fieldLabel": "Description",
+                                        "designer|userClassName": "MyTimeField1",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen21854",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar27",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen21860",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnForm",
+                                        "text": "Insert",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen60721",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "title": "",
+                "designer|userClassName": "qualityindexEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen60759",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "gridop",
+                        "margin": 8,
+                        "maxHeight": 250,
+                        "title": "",
+                        "forceFit": true,
+                        "store": "qistore",
+                        "designer|userClassName": "MyGridPanel16"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen60764",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "designer|userClassName": "MyGridView16"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen60767",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "code",
+                                "text": "Code",
+                                "designer|userClassName": "MyColumn39"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen46290",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "name",
+                                "text": "Name",
+                                "designer|userClassName": "MyColumn39"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen60770",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "description",
+                                "text": "Description",
+                                "designer|userClassName": "MyColumn40"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen60776",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyToolbar26",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen60781",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnNew",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton37",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen60786",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "disabled": true,
+                                        "id": "btnRemove",
+                                        "text": "Remove selected",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen60724",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "hidden": true,
+                        "id": "frmQuality",
+                        "bodyPadding": 10,
+                        "title": "",
+                        "trackResetOnLoad": true,
+                        "designer|userClassName": "MyForm33"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen60729",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Quality index",
+                                "designer|userClassName": "MyFieldSet54"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen46576",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opCode",
+                                        "name": "code",
+                                        "fieldLabel": "Code",
+                                        "designer|userClassName": "MyTextField55",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen60735",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opName",
+                                        "name": "name",
+                                        "fieldLabel": "Name",
+                                        "designer|userClassName": "MyTimeField",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen60740",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "name": "description",
+                                        "fieldLabel": "Description",
+                                        "designer|userClassName": "MyTimeField1",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen60746",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar27",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen60752",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnForm",
+                                        "text": "Insert",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen16414",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "title": "",
+                "designer|userClassName": "serviceEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen16417",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "frmServices",
+                        "bodyPadding": 10,
+                        "title": "",
+                        "trackResetOnLoad": true,
+                        "designer|userClassName": "MyForm33"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen16422",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "title": "Quality index",
+                                "designer|userClassName": "MyFieldSet54"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen16428",
+                                    "type": "textfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "opService",
+                                        "name": "service",
+                                        "fieldLabel": "Name",
+                                        "designer|userClassName": "MyTimeField",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen16439",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": "footer",
+                                "designer|userClassName": "MyToolbar27",
+                                "container|pack": "center",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen16445",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnForm",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen16452",
+                    "type": "gridpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "gridop",
+                        "margin": 8,
+                        "title": "",
+                        "forceFit": true,
+                        "store": "storeServices",
+                        "designer|userClassName": "MyGridPanel16"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen16457",
+                            "type": "gridview",
+                            "reference": {
+                                "name": "viewConfig",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": null,
+                                "designer|userClassName": "MyGridView16"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen16466",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyToolbar26",
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen16471",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnNew",
+                                        "text": "New",
+                                        "designer|userClassName": "MyButton37",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen16476",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "disabled": true,
+                                        "id": "btnRemove",
+                                        "text": "Remove",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen17592",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "service",
+                                "text": "Service",
+                                "designer|userClassName": "MyColumn42"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen17601",
+                            "type": "gridcolumn",
+                            "reference": {
+                                "name": "columns",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "dataIndex": "path",
+                                "text": "Path",
+                                "designer|userClassName": "MyColumn43"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen40828",
+            "type": "tabpanel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": null,
+                "minHeight": 400,
+                "width": null,
+                "title": "",
+                "activeTab": 0,
+                "designer|userClassName": "offeringsEditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen41238",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "height": 450,
+                        "minHeight": 400,
+                        "title": "Offerings",
+                        "designer|userClassName": "MyPanel19"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen41841",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": null,
+                                "width": null,
+                                "title": "",
+                                "designer|userClassName": "MyPanel21"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen41879",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": null,
+                                        "id": "gridoff",
+                                        "margin": 8,
+                                        "maxHeight": 250,
+                                        "minHeight": 150,
+                                        "title": "",
+                                        "forceFit": true,
+                                        "store": "gridofferings",
+                                        "designer|userClassName": "MyGridPanel16"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen41884",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": null,
+                                                "designer|userClassName": "MyGridView16"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen41896",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyToolbar26",
+                                                "dock": "top"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen41901",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "btnNew",
+                                                        "text": "New",
+                                                        "designer|userClassName": "MyButton37",
+                                                        "layout|flex": null
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen41906",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "disabled": true,
+                                                        "id": "btnRemove",
+                                                        "text": "Remove selected",
+                                                        "designer|userClassName": "MyButton38",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44893",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "name",
+                                                "text": "Name",
+                                                "designer|userClassName": "MyColumn36"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44902",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "description",
+                                                "text": "Description",
+                                                "designer|userClassName": "MyColumn37"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44911",
+                                            "type": "gridcolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "procedures",
+                                                "text": "Procedures",
+                                                "designer|userClassName": "MyColumn38"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44920",
+                                            "type": "datecolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "expiration",
+                                                "text": "Expiration",
+                                                "format": "c",
+                                                "designer|userClassName": "MyDateColumn2"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44929",
+                                            "type": "booleancolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "dataIndex": "active",
+                                                "text": "Active",
+                                                "designer|userClassName": "MyBooleanColumn6"
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen41844",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "hidden": true,
+                                        "id": "frmOfferings",
+                                        "bodyPadding": 10,
+                                        "title": "",
+                                        "trackResetOnLoad": true,
+                                        "designer|userClassName": "MyForm33"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen41849",
+                                            "type": "fieldset",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "title": "Offerings",
+                                                "designer|userClassName": "MyFieldSet54"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen41855",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "offName",
+                                                        "name": "name",
+                                                        "fieldLabel": "Name",
+                                                        "designer|userClassName": "MyTimeField",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen41860",
+                                                    "type": "textfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "description",
+                                                        "fieldLabel": "Description",
+                                                        "designer|userClassName": "MyTimeField1",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen42436",
+                                                    "type": "datefield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "expiration",
+                                                        "fieldLabel": "Expiration",
+                                                        "format": "c",
+                                                        "designer|userClassName": "MyDateField6",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen42688",
+                                                    "type": "checkboxfield",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "active",
+                                                        "fieldLabel": "Visibility",
+                                                        "boxLabel": "enabled",
+                                                        "designer|userClassName": "MyCheckbox",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen41866",
+                                            "type": "toolbar",
+                                            "reference": {
+                                                "name": "dockedItems",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "ui": "footer",
+                                                "designer|userClassName": "MyToolbar27",
+                                                "container|pack": "center",
+                                                "dock": "bottom"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen41872",
+                                                    "type": "button",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "btnForm",
+                                                        "text": "Insert",
+                                                        "designer|userClassName": "MyButton39",
+                                                        "layout|flex": null
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen19906",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "height": 450,
+                        "layout": "vbox",
+                        "title": "Offering-Procedure memberships",
+                        "designer|userClassName": "MyPanel51",
+                        "container|align": "stretch"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen23416",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 40,
+                                "html": "Click & Drag procedures to add or remove membership",
+                                "padding": "16 16 8 16",
+                                "title": "",
+                                "designer|userClassName": "MyPanel52",
+                                "layout|flex": null
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen41402",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "autoRender": true,
+                                "border": 0,
+                                "height": null,
+                                "minHeight": 400,
+                                "layout": "hbox",
+                                "title": null,
+                                "designer|userClassName": "MyPanel20",
+                                "container|align": "stretch",
+                                "layout|flex": 1
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen48062",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 300,
+                                        "html": null,
+                                        "minHeight": 350,
+                                        "layout": "fit",
+                                        "bodyPadding": 8,
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel23",
+                                        "layout|flex": 0.5
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen49863",
+                                            "type": "gridpanel",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "gridMembers",
+                                                "maxHeight": null,
+                                                "minHeight": null,
+                                                "autoScroll": true,
+                                                "title": "",
+                                                "forceFit": true,
+                                                "store": "proceduresMembers",
+                                                "designer|userClassName": "MyGridPanel15"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen49900",
+                                                    "type": "gridview",
+                                                    "reference": {
+                                                        "name": "viewConfig",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "multiSelect": true,
+                                                        "designer|userClassName": "MyGridView15"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen61828",
+                                                            "type": "griddragdropplugin",
+                                                            "reference": {
+                                                                "name": "plugins",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": "Ext.grid.plugin.DragDrop",
+                                                            "userConfig": {
+                                                                "ddGroup": "offeringsprocedures",
+                                                                "dragGroup": "gridMembers",
+                                                                "dropGroup": "gridNonMembers",
+                                                                "designer|userClassName": "MyGridDragDropPlugin"
+                                                            }
+                                                        }
+                                                    ]
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen57050",
+                                                    "type": "toolbar",
+                                                    "reference": {
+                                                        "name": "dockedItems",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "designer|userClassName": "MyToolbar24",
+                                                        "dock": "top"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen57258",
+                                                            "type": "combobox",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": "cbOfferings",
+                                                                "fieldLabel": "Choose an offering",
+                                                                "labelStyle": "color: white;",
+                                                                "labelWidth": 140,
+                                                                "displayField": "name",
+                                                                "store": "cmbname",
+                                                                "valueField": "name",
+                                                                "designer|userClassName": "MyComboBox12",
+                                                                "layout|flex": 1
+                                                            }
+                                                        }
+                                                    ]
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen21151",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "name",
+                                                        "text": "Name",
+                                                        "designer|userClassName": "MyColumn44"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen21160",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "description",
+                                                        "text": "Description",
+                                                        "designer|userClassName": "MyColumn45"
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen48290",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 300,
+                                        "html": null,
+                                        "minHeight": 350,
+                                        "layout": "fit",
+                                        "bodyPadding": 8,
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel24",
+                                        "layout|flex": 0.5
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen55117",
+                                            "type": "gridpanel",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "gridNonMembers",
+                                                "maxHeight": null,
+                                                "minHeight": null,
+                                                "title": "Not members",
+                                                "forceFit": true,
+                                                "store": "proceduresNonmembers",
+                                                "designer|userClassName": "MyGridPanel17"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen55154",
+                                                    "type": "gridview",
+                                                    "reference": {
+                                                        "name": "viewConfig",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "multiSelect": true,
+                                                        "designer|userClassName": "MyGridView17"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen62050",
+                                                            "type": "griddragdropplugin",
+                                                            "reference": {
+                                                                "name": "plugins",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": "Ext.grid.plugin.DragDrop",
+                                                            "userConfig": {
+                                                                "ddGroup": "offeringsprocedures",
+                                                                "dragGroup": "gridNonMembers",
+                                                                "dropGroup": "gridMembers",
+                                                                "designer|userClassName": "MyGridDragDropPlugin1"
+                                                            }
+                                                        }
+                                                    ]
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen20601",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "name",
+                                                        "text": "Name",
+                                                        "designer|userClassName": "MyColumn47"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen20610",
+                                                    "type": "gridcolumn",
+                                                    "reference": {
+                                                        "name": "columns",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "dataIndex": "description",
+                                                        "text": "Description",
+                                                        "designer|userClassName": "MyColumn48"
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen52391",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": null,
+                "id": "webadmincmp",
+                "maxWidth": null,
+                "minWidth": null,
+                "width": null,
+                "layout": "border",
+                "designer|userClassName": "MainMenu2"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen61717",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "mainCenter",
+                        "autoScroll": true,
+                        "layout": "fit",
+                        "title": "",
+                        "designer|userClassName": "MyPanel32",
+                        "layout|region": "center"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen62005",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "height": 150,
+                        "id": "submenu",
+                        "margin": "0px 0px 1px 0px ",
+                        "layout": "hbox",
+                        "collapsed": true,
+                        "hideCollapseTool": true,
+                        "title": "",
+                        "designer|userClassName": "MyPanel33",
+                        "container|align": "stretch",
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen58083",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "ui": null,
+                                "designer|userClassName": "MyToolbar3",
+                                "container|padding": "4 0 4 0",
+                                "layout|flex": 1,
+                                "dock": "top"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen58221",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "cls": null,
+                                        "componentCls": "test",
+                                        "id": "menuServer",
+                                        "style": null,
+                                        "enableToggle": true,
+                                        "pressed": true,
+                                        "text": "Server",
+                                        "toggleGroup": "mainmenu",
+                                        "designer|userClassName": "MyButton48",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen58413",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnService",
+                                        "enableToggle": true,
+                                        "text": "Services",
+                                        "toggleGroup": "mainmenu",
+                                        "designer|userClassName": "MyButton49",
+                                        "layout|flex": null
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen59073",
+                                            "type": "menu",
+                                            "reference": {
+                                                "name": "menu",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "menuServices",
+                                                "designer|userClassName": "MyMenu1"
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen58607",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnObservations",
+                                        "enableToggle": true,
+                                        "text": "Data viewer",
+                                        "toggleGroup": "mainmenu",
+                                        "designer|userClassName": "MyButton50",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen59915",
+                                    "type": "container",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "componentCls": null,
+                                        "html": " <div class='mainHeaderTitle'><a href='http://istgeo.ist.supsi.ch/software/istsos/' target='_BLANK'><img height=28 src='images/istsos-logo.png'/></a></div>",
+                                        "designer|userClassName": "MyContainer2",
+                                        "layout|flex": 1
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen63938",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 25,
+                        "html": "<a style='color: white; text-decoration: none;' href='http://www.supsi.ch/ist' target='_BLANK'>Open Source Software by Institute of Earth Science - SUPSI</a>",
+                        "id": "mainFoot",
+                        "bodyCls": "mainFooter",
+                        "bodyPadding": 8,
+                        "title": "",
+                        "designer|userClassName": "MyPanel3",
+                        "layout|region": "south"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen27791",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 1,
+                "height": 45,
+                "width": 300,
+                "bodyPadding": 10,
+                "title": "",
+                "designer|userClassName": "ObservationEditorAdvancedOperations"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen28609",
+                    "type": "textfield",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "oeaTf",
+                        "name": "val",
+                        "fieldLabel": "New value",
+                        "enableKeyEvents": true,
+                        "designer|userClassName": "MyTextField147",
+                        "layout|anchor": "100%"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen16552",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": 600,
+                "id": "chartpanel",
+                "minHeight": 400,
+                "minWidth": 1130,
+                "padding": null,
+                "width": null,
+                "autoScroll": true,
+                "layout": "border",
+                "bodyStyle": "background-color: white;",
+                "title": "",
+                "designer|userClassName": "Chart",
+                "designer|userAlias": "chart"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen16832",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "html": null,
+                        "id": "charttwo",
+                        "minWidth": 500,
+                        "layout": "vbox",
+                        "bodyPadding": null,
+                        "bodyStyle": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel37",
+                        "container|align": "stretch",
+                        "layout|region": "center"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen38046",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 150,
+                                "id": "plotcalc",
+                                "activeItem": 0,
+                                "layout": "card",
+                                "title": "",
+                                "designer|userClassName": "MyPanel32",
+                                "layout|flex": null
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen55251",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "padding": "0px 5px 5px 5px ",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel63"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen24163",
+                                            "type": "fieldset",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "padding": null,
+                                                "title": "2. Plot data",
+                                                "designer|userClassName": "MyFieldSet43"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen48190",
+                                                    "type": "linkedinstance",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "plotdatafrm",
+                                                        "designer|userClassName": "ProcedurePlotter",
+                                                        "designer|userAlias": "procedureplotter"
+                                                    },
+                                                    "iconCls": "icon-linkedinstance",
+                                                    "masterInstanceId": "ExtBox1-ext-gen22938"
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen23260",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "calccnt",
+                                        "padding": "9 10 0 10",
+                                        "layout": "fit",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel40"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen18479",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "html": "<div style='border-radius: 3px 3px 3px 3px !important; background-color: white; border: thin solid green; width: 100%; height: 100%;' id='chartCnt'></div>",
+                                "margin": null,
+                                "title": "",
+                                "designer|userClassName": "MyPanel36",
+                                "layout|flex": 0.7,
+                                "layout|margins": "0 10 5 10"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen38938",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 30,
+                                "padding": "0 10 5 10",
+                                "layout": "hbox",
+                                "title": "",
+                                "designer|userClassName": "MyPanel39",
+                                "container|align": "middle",
+                                "container|padding": "0 10 5 10",
+                                "layout|flex": null
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen39663",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeDay",
+                                        "enableToggle": true,
+                                        "text": "Day",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton35",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen39909",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeWeek",
+                                        "enableToggle": true,
+                                        "text": "Week",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen40157",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeAll",
+                                        "enableToggle": true,
+                                        "pressed": true,
+                                        "text": "All",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": 1
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen46485",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "chartthree",
+                        "minWidth": 350,
+                        "width": 350,
+                        "layout": "vbox",
+                        "collapsed": false,
+                        "title": null,
+                        "designer|userClassName": "MyPanel28",
+                        "container|align": "stretch",
+                        "layout|region": "east"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen54346",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": 105,
+                                "layout": "fit",
+                                "title": "",
+                                "designer|userClassName": "MyPanel29",
+                                "layout|flex": null
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen34866",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": null,
+                                        "id": "chartfilterFrm",
+                                        "padding": null,
+                                        "bodyPadding": "0 10 5 0",
+                                        "collapseFirst": false,
+                                        "collapsed": false,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm35",
+                                        "weight": null
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen56987",
+                                            "type": "fieldset",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "margin": null,
+                                                "padding": 5,
+                                                "title": "3. Start editing",
+                                                "designer|userClassName": "MyFieldSet44"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen19637",
+                                                    "type": "combobox",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "id": "oeCbEditableProcedures",
+                                                        "name": "procedure",
+                                                        "fieldLabel": "Procedure",
+                                                        "labelWidth": 70,
+                                                        "displayField": "name",
+                                                        "queryMode": "local",
+                                                        "store": "editableProcedure",
+                                                        "valueField": "name",
+                                                        "designer|userClassName": "MyComboBox4",
+                                                        "layout|anchor": "100%"
+                                                    }
+                                                },
+                                                {
+                                                    "id": "ExtBox1-ext-gen19398",
+                                                    "type": "container",
+                                                    "reference": {
+                                                        "name": "items",
+                                                        "type": "array"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "height": 25,
+                                                        "layout": "hbox",
+                                                        "designer|userClassName": "MyContainer27",
+                                                        "container|align": "stretch"
+                                                    },
+                                                    "cn": [
+                                                        {
+                                                            "id": "ExtBox1-ext-gen18753",
+                                                            "type": "button",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "hidden": true,
+                                                                "id": "btnCancelEditor",
+                                                                "text": "Cancel",
+                                                                "designer|userClassName": "MyButton31",
+                                                                "layout|flex": 1
+                                                            }
+                                                        },
+                                                        {
+                                                            "id": "ExtBox1-ext-gen57550",
+                                                            "type": "button",
+                                                            "reference": {
+                                                                "name": "items",
+                                                                "type": "array"
+                                                            },
+                                                            "codeClass": null,
+                                                            "userConfig": {
+                                                                "id": "btnStartEditor",
+                                                                "text": "Start editing",
+                                                                "designer|userClassName": "MyButton31",
+                                                                "layout|flex": 1
+                                                            }
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen53959",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "chartgridcnt",
+                                "layout": "fit",
+                                "title": "",
+                                "designer|userClassName": "MyPanel27",
+                                "layout|flex": 1,
+                                "layout|margins": "0 10 5 0"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen33626",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "padding": null,
+                        "width": 300,
+                        "layout": "fit",
+                        "title": "",
+                        "designer|userClassName": "MyPanel57",
+                        "layout|region": "west"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19609",
+                            "type": "fieldset",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": null,
+                                "padding": 5,
+                                "layout": "fit",
+                                "title": "1. Choose procedure",
+                                "designer|userClassName": "MyFieldSet8"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen38983",
+                                    "type": "linkedinstance",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "pchoose"
+                                    },
+                                    "iconCls": "icon-linkedinstance",
+                                    "masterInstanceId": "ExtBox1-ext-gen27604"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen42461",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": 150,
+                "minWidth": 450,
+                "width": 450,
+                "layout": "border",
+                "title": "",
+                "designer|userClassName": "Calc",
+                "designer|userAlias": "calculator"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen43229",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "height": 100,
+                        "layout": "hbox",
+                        "title": "",
+                        "designer|userClassName": "MyPanel43",
+                        "container|align": "stretch",
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen18207",
+                            "type": "gridpanel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "editableProcedureGrid",
+                                "width": 180,
+                                "title": "",
+                                "store": "editableProcedure",
+                                "designer|userClassName": "MyGridPanel14",
+                                "layout|flex": 0.3
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen18219",
+                                    "type": "gridcolumn",
+                                    "reference": {
+                                        "name": "columns",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "dataIndex": "name",
+                                        "flex": 1,
+                                        "text": "Procedures",
+                                        "designer|userClassName": "MyColumn43"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen42741",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "layout": "vbox",
+                                "title": "",
+                                "designer|userClassName": "MyPanel41",
+                                "container|align": "stretch",
+                                "layout|flex": 0.7
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen49480",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel44",
+                                        "container|align": "stretch",
+                                        "layout|flex": 1
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen46403",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "plus",
+                                                "text": "+",
+                                                "designer|userClassName": "MyButton53",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen46191",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "moltiply",
+                                                "text": "*",
+                                                "designer|userClassName": "MyButton52",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45981",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "sqrt",
+                                                "text": "sqrt",
+                                                "designer|userClassName": "MyButton51",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45773",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "sin",
+                                                "text": "sin",
+                                                "designer|userClassName": "MyButton50",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45567",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "exp",
+                                                "text": "^",
+                                                "designer|userClassName": "MyButton49",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45363",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "acos",
+                                                "text": "acos",
+                                                "designer|userClassName": "MyButton48",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45161",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "openparentesis",
+                                                "text": "(",
+                                                "designer|userClassName": "MyButton47",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen54519",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel44",
+                                        "container|align": "stretch",
+                                        "layout|flex": 1
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen54526",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "minus",
+                                                "text": "-",
+                                                "designer|userClassName": "MyButton53",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54533",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "divide",
+                                                "text": "/",
+                                                "designer|userClassName": "MyButton52",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54540",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "cos",
+                                                "text": "cos",
+                                                "designer|userClassName": "MyButton51",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54547",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "asin",
+                                                "text": "asin",
+                                                "designer|userClassName": "MyButton50",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54554",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "tan",
+                                                "text": "tan",
+                                                "designer|userClassName": "MyButton49",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54561",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "atan",
+                                                "text": "atan",
+                                                "designer|userClassName": "MyButton48",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen54568",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "closedparentesis",
+                                                "text": ")",
+                                                "designer|userClassName": "MyButton47",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen56491",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 30,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel44",
+                                        "container|align": "stretch",
+                                        "layout|flex": 1
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen56498",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "less",
+                                                "text": "<",
+                                                "designer|userClassName": "MyButton53",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56505",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "grater",
+                                                "text": ">",
+                                                "designer|userClassName": "MyButton52",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56512",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "equal",
+                                                "text": "=",
+                                                "designer|userClassName": "MyButton51",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56519",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "lesseq",
+                                                "text": "≤",
+                                                "designer|userClassName": "MyButton50",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56526",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "gretereq",
+                                                "text": "≥",
+                                                "designer|userClassName": "MyButton49",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56533",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "andop",
+                                                "text": "AND",
+                                                "designer|userClassName": "MyButton48",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen56540",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "orop",
+                                                "text": "OR",
+                                                "designer|userClassName": "MyButton47",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen60359",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": null,
+                        "layout": "border",
+                        "title": "",
+                        "designer|userClassName": "MyPanel48",
+                        "layout|region": "center"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen40754",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "width": 120,
+                                "bodyPadding": 10,
+                                "title": "",
+                                "designer|userClassName": "MyForm38",
+                                "layout|region": "west"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen41254",
+                                    "type": "displayfield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "pEditing",
+                                        "fieldLabel": null,
+                                        "hideLabel": true,
+                                        "designer|userClassName": "MyDisplayField11",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36206",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": null,
+                                "padding": null,
+                                "layout": "hbox",
+                                "bodyPadding": null,
+                                "title": "",
+                                "designer|userClassName": "MyPanel47",
+                                "container|align": "stretch",
+                                "container|padding": null,
+                                "layout|region": "center"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen25312",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "codePanel",
+                                        "padding": null,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel50",
+                                        "container|align": "stretch",
+                                        "container|padding": "6 0 0 0",
+                                        "layout|flex": 0.5
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen26476",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "bodyPadding": 10,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm39",
+                                        "layout|flex": 0.5
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen28131",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "calcQiCombo",
+                                                "fieldLabel": "QI",
+                                                "labelSeparator": "=",
+                                                "labelWidth": 40,
+                                                "emptyText": "choosing a qi will update the selectded values..",
+                                                "displayField": "combo",
+                                                "queryMode": "local",
+                                                "store": "calcQiStore",
+                                                "valueField": "code",
+                                                "designer|userClassName": "MyComboBox18",
+                                                "layout|anchor": "100%"
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen36566",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "width": 40,
+                                "layout": "vbox",
+                                "title": "",
+                                "designer|userClassName": "MyPanel48",
+                                "container|align": "stretch",
+                                "container|padding": "5px",
+                                "layout|region": "east"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen34163",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnExecute",
+                                        "text": "↵",
+                                        "designer|userClassName": "MyButton61",
+                                        "layout|flex": 1
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen22330",
+            "type": "gridcolumn",
+            "reference": {
+                "name": "columns",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "text": "Interpolation",
+                "designer|userClassName": "CheckColumn",
+                "designer|userAlias": "checkcolumn"
+            }
+        },
+        {
+            "id": "ExtBox1-ext-gen20039",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "layout": "fit",
+                "designer|userClassName": "ChartContainer"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen20456",
+                    "type": "linkedinstance",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {},
+                    "iconCls": "icon-linkedinstance",
+                    "masterInstanceId": "ExtBox1-ext-gen16552"
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen21655",
+            "type": "viewport",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "layout": "fit",
+                "designer|userClassName": "TestCsv"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen19880",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "height": null,
+                        "width": null,
+                        "layout": "border",
+                        "title": "",
+                        "designer|userClassName": "TestCSV"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen20124",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "width": 300,
+                                "bodyPadding": 16,
+                                "title": "FILE",
+                                "designer|userClassName": "MyForm41",
+                                "layout|region": "west"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen20977",
+                                    "type": "combobox",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "cmbServices",
+                                        "fieldLabel": "Service",
+                                        "labelWidth": 70,
+                                        "displayField": "service",
+                                        "store": "storeServices",
+                                        "valueField": "service",
+                                        "designer|userClassName": "MyComboBox12",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen20982",
+                                    "type": "combobox",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "oeCbOffering",
+                                        "itemId": null,
+                                        "name": "offering",
+                                        "fieldLabel": "Offering",
+                                        "labelWidth": 70,
+                                        "displayField": "name",
+                                        "queryMode": "local",
+                                        "store": "offerings",
+                                        "valueField": "name",
+                                        "designer|userClassName": "MyComboBox",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen20987",
+                                    "type": "combobox",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "oeCbProcedure",
+                                        "itemId": null,
+                                        "name": "procedure",
+                                        "fieldLabel": "Procedure",
+                                        "labelWidth": 70,
+                                        "displayField": "name",
+                                        "queryMode": "local",
+                                        "store": "procedurelist",
+                                        "valueField": "name",
+                                        "designer|userClassName": "MyComboBox3",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen21008",
+                                    "type": "filefield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btncsv",
+                                        "fieldLabel": "CSV",
+                                        "labelWidth": 70,
+                                        "designer|userClassName": "MyFileUpload",
+                                        "layout|anchor": "100%"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen23716",
+                                    "type": "toolbar",
+                                    "reference": {
+                                        "name": "dockedItems",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MyToolbar22",
+                                        "container|align": "middle",
+                                        "dock": "top"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen23540",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "text": "Action!",
+                                                "designer|userClassName": "MyButton66",
+                                                "layout|flex": 1
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen20406",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "padding": null,
+                                "bodyPadding": 16,
+                                "title": "",
+                                "designer|userClassName": "MyPanel55",
+                                "layout|region": "center"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen22534",
+                                    "type": "textareafield",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "height": 155,
+                                        "id": "logger",
+                                        "readOnly": true,
+                                        "fieldLabel": "Log",
+                                        "hideLabel": true,
+                                        "designer|userClassName": "MyTextArea1",
+                                        "layout|anchor": "100%"
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen20474",
+            "type": "viewport",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "layout": "border",
+                "designer|userClassName": "Viewer"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen44227",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "layout": "border",
+                        "title": "",
+                        "designer|userClassName": "MyPanel55",
+                        "layout|region": "center"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen69897",
+                            "type": "linkedinstance",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "layout|region": "center",
+                                "id": "chartpanel"
+                            },
+                            "iconCls": "icon-linkedinstance",
+                            "masterInstanceId": "ExtBox1-ext-gen66433"
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen31930",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 250,
+                                "layout": "fit",
+                                "collapsible": true,
+                                "title": "Grid",
+                                "designer|userClassName": "MyPanel60",
+                                "layout|region": "south",
+                                "layout|split": true
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen28324",
+                                    "type": "linkedinstance",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "gridpanel"
+                                    },
+                                    "iconCls": "icon-linkedinstance",
+                                    "masterInstanceId": "ExtBox1-ext-gen27799"
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen29581",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 25,
+                        "html": "<a style='color: white; text-decoration: none;' href='http://www.supsi.ch/ist' target='_BLANK'>Open Source Software by Institute of Earth Science - SUPSI</a>",
+                        "id": "mainFoot",
+                        "bodyCls": "mainFooter",
+                        "bodyPadding": 8,
+                        "title": "",
+                        "designer|userClassName": "MyPanel3",
+                        "layout|region": "south"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen32436",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "width": 300,
+                        "layout": "fit",
+                        "title": "",
+                        "designer|userClassName": "MyPanel58",
+                        "layout|region": "west"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen32757",
+                            "type": "linkedinstance",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "pchoose"
+                            },
+                            "iconCls": "icon-linkedinstance",
+                            "masterInstanceId": "ExtBox1-ext-gen27604"
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen32966",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "padding": 0,
+                "layout": "border",
+                "designer|userClassName": "Editor1",
+                "designer|userAlias": "editor1"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen32969",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "layout": "border",
+                        "title": "",
+                        "designer|userClassName": "MyPanel55",
+                        "layout|region": "center"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen39719",
+                            "type": "linkedinstance",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "layout|region": "center"
+                            },
+                            "iconCls": "icon-linkedinstance",
+                            "masterInstanceId": "ExtBox1-ext-gen66433"
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen33170",
+                    "type": "tabpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": null,
+                        "width": 450,
+                        "layout": "fit",
+                        "title": "",
+                        "activeTab": 0,
+                        "designer|userClassName": "MyPanel58",
+                        "layout|region": "west"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen33179",
+                            "type": "linkedinstance",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "id": "pchoose",
+                                "title": "Choose procedure"
+                            },
+                            "iconCls": "icon-linkedinstance",
+                            "masterInstanceId": "ExtBox1-ext-gen27604"
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen45291",
+                            "type": "linkedinstance",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": null,
+                                "id": "proceduregrideditor",
+                                "title": "Editor",
+                                "designer|userClassName": "ProcedureGridEditor",
+                                "designer|userAlias": "proceduregrideditor"
+                            },
+                            "iconCls": "icon-linkedinstance",
+                            "masterInstanceId": "ExtBox1-ext-gen42142"
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen27604",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "itemId": "chartone",
+                "minWidth": 280,
+                "padding": "10px 0px 0px 0px",
+                "layout": "border",
+                "bodyPadding": "",
+                "title": "",
+                "designer|userClassName": "ProcedureChooser",
+                "designer|userAlias": "procedurechooser"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen19598",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 120,
+                        "id": "oeSettings",
+                        "padding": null,
+                        "bodyPadding": "0 10 0 10",
+                        "bodyStyle": null,
+                        "title": "",
+                        "designer|userClassName": "MyForm6",
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19619",
+                            "type": "combobox",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "cmbServices",
+                                "fieldLabel": "Service",
+                                "labelWidth": 70,
+                                "displayField": "service",
+                                "store": "storeServices",
+                                "valueField": "service",
+                                "designer|userClassName": "MyComboBox12",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19625",
+                            "type": "combobox",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "disabled": true,
+                                "id": "oeCbOffering",
+                                "itemId": null,
+                                "name": "offering",
+                                "fieldLabel": "Offering",
+                                "labelWidth": 70,
+                                "displayField": "name",
+                                "queryMode": "local",
+                                "store": "offerings",
+                                "valueField": "name",
+                                "designer|userClassName": "MyComboBox",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19631",
+                            "type": "combobox",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "disabled": true,
+                                "id": "oeCbProcedure",
+                                "itemId": null,
+                                "name": "procedure",
+                                "fieldLabel": "Procedure",
+                                "labelWidth": 70,
+                                "displayField": "name",
+                                "queryMode": "local",
+                                "store": "procedurelist",
+                                "valueField": "name",
+                                "designer|userClassName": "MyComboBox3",
+                                "layout|anchor": "100%"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen19692",
+                            "type": "button",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "btnAdd",
+                                "text": "Add",
+                                "designer|userClassName": "MyButton11",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen29107",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": "proceduresTree",
+                        "autoScroll": true,
+                        "bodyPadding": "0 10 0 10",
+                        "title": "",
+                        "designer|userClassName": "MyPanel26",
+                        "layout|region": "center"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen22938",
+            "type": "form",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "id": "plotdatafrm",
+                "padding": "5 10 0 10",
+                "title": "",
+                "designer|userClassName": "ProcedurePlotter",
+                "designer|userAlias": "procedureplotter"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen24169",
+                    "type": "fieldcontainer",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": null,
+                        "defaults": "{\n                    flex: 1,\n                    hideLabel: true\n                }",
+                        "layout": "hbox",
+                        "fieldLabel": "From",
+                        "labelWidth": 35,
+                        "designer|userClassName": "MyFieldContainer",
+                        "container|padding": null,
+                        "layout|anchor": "100%"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen24173",
+                            "type": "datefield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "oeBegin",
+                                "name": "begin",
+                                "fieldLabel": null,
+                                "format": "Y-m-d",
+                                "designer|userClassName": "MyDateField",
+                                "layout|flex": 0.3
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen24179",
+                            "type": "timefield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "oeBeginTime",
+                                "minWidth": null,
+                                "width": null,
+                                "name": "begintime",
+                                "fieldLabel": "Label",
+                                "format": "H:i ",
+                                "increment": 10,
+                                "designer|userClassName": "MyTimeField",
+                                "layout|flex": 0.2
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen50979",
+                            "type": "label",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 22,
+                                "padding": "2px 0px 0px 10px",
+                                "width": 30,
+                                "text": "To:",
+                                "designer|userClassName": "MyLabel",
+                                "layout|flex": 0
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen24190",
+                            "type": "datefield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "oeEnd",
+                                "name": "end",
+                                "fieldLabel": "Label",
+                                "format": "Y-m-d",
+                                "designer|userClassName": "MyDateField1",
+                                "layout|flex": 0.3
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen24196",
+                            "type": "timefield",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "oeEndTime",
+                                "name": "endtime",
+                                "value": null,
+                                "fieldLabel": "Label",
+                                "format": "H:i ",
+                                "increment": 10,
+                                "designer|userClassName": "MyTimeField1",
+                                "layout|flex": 0.2
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen53946",
+                            "type": "label",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "height": 22,
+                                "padding": "2px 0px 0px 10px",
+                                "width": 70,
+                                "text": "Property:",
+                                "designer|userClassName": "MyLabel",
+                                "layout|flex": 0
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen24203",
+                            "type": "combobox",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "oeCbObservedProperty",
+                                "name": "observedproperty",
+                                "fieldLabel": "Property",
+                                "labelWidth": 70,
+                                "displayField": "name",
+                                "queryMode": "local",
+                                "store": "observedproperties",
+                                "valueField": "definition",
+                                "designer|userClassName": "MyComboBox4",
+                                "layout|flex": 0.6
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen26741",
+                            "type": "button",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "disabled": true,
+                                "id": "btnPlot",
+                                "margin": null,
+                                "padding": null,
+                                "text": "Plot",
+                                "designer|userClassName": "MyButton31",
+                                "layout|flex": 0.4,
+                                "layout|margins": null
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen66433",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "id": "chartpanel",
+                "width": null,
+                "layout": "border",
+                "title": "",
+                "designer|userClassName": "ProcedureChart",
+                "designer|userAlias": "procedurechart"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen67998",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel68",
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen68374",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": null,
+                                "id": "plotdatafrm",
+                                "padding": "5 10 0 10",
+                                "title": "",
+                                "designer|userClassName": "ProcedurePlotter",
+                                "designer|userAlias": "procedureplotter"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen68379",
+                                    "type": "fieldcontainer",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": null,
+                                        "defaults": "{\n                    flex: 1,\n                    hideLabel: true\n                }",
+                                        "layout": "hbox",
+                                        "fieldLabel": "From",
+                                        "labelWidth": 35,
+                                        "designer|userClassName": "MyFieldContainer",
+                                        "container|padding": null,
+                                        "layout|anchor": "100%"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen68385",
+                                            "type": "datefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeBegin",
+                                                "name": "begin",
+                                                "fieldLabel": null,
+                                                "format": "Y-m-d",
+                                                "designer|userClassName": "MyDateField",
+                                                "layout|flex": 0.3
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen68391",
+                                            "type": "timefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeBeginTime",
+                                                "minWidth": null,
+                                                "width": null,
+                                                "name": "begintime",
+                                                "fieldLabel": "Label",
+                                                "format": "H:i ",
+                                                "increment": 10,
+                                                "designer|userClassName": "MyTimeField",
+                                                "layout|flex": 0.2
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen68397",
+                                            "type": "label",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 22,
+                                                "padding": "2px 0px 0px 10px",
+                                                "width": 30,
+                                                "text": "To:",
+                                                "designer|userClassName": "MyLabel",
+                                                "layout|flex": 0
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen68403",
+                                            "type": "datefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeEnd",
+                                                "name": "end",
+                                                "fieldLabel": "Label",
+                                                "format": "Y-m-d",
+                                                "designer|userClassName": "MyDateField1",
+                                                "layout|flex": 0.3
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen68409",
+                                            "type": "timefield",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeEndTime",
+                                                "name": "endtime",
+                                                "value": null,
+                                                "fieldLabel": "Label",
+                                                "format": "H:i ",
+                                                "increment": 10,
+                                                "designer|userClassName": "MyTimeField1",
+                                                "layout|flex": 0.2
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen68415",
+                                            "type": "label",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "height": 22,
+                                                "padding": "2px 0px 0px 10px",
+                                                "width": 70,
+                                                "text": "Property:",
+                                                "designer|userClassName": "MyLabel",
+                                                "layout|flex": 0
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen68421",
+                                            "type": "combobox",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "oeCbObservedProperty",
+                                                "name": "observedproperty",
+                                                "fieldLabel": "Property",
+                                                "labelWidth": 70,
+                                                "displayField": "name",
+                                                "queryMode": "local",
+                                                "store": "observedproperties",
+                                                "valueField": "definition",
+                                                "designer|userClassName": "MyComboBox4",
+                                                "layout|flex": 0.6
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen68427",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "btnPlot",
+                                                "margin": null,
+                                                "padding": null,
+                                                "text": "Plot",
+                                                "designer|userClassName": "MyButton31",
+                                                "layout|flex": 0.4,
+                                                "layout|margins": null
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen67261",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "id": null,
+                        "style": "background-color: white;",
+                        "layout": "fit",
+                        "bodyCls": null,
+                        "title": "",
+                        "designer|userClassName": "MyPanel67",
+                        "layout|region": "center"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen75866",
+                            "type": "toolbar",
+                            "reference": {
+                                "name": "dockedItems",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "MyToolbar24",
+                                "container|align": "middle",
+                                "dock": "bottom"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen77565",
+                                    "type": "tbspacer",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MySpacer",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen74245",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeDay",
+                                        "width": 60,
+                                        "enableToggle": true,
+                                        "text": "Day",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton35"
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen74252",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeWeek",
+                                        "width": 60,
+                                        "enableToggle": true,
+                                        "text": "Week",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton38",
+                                        "layout|flex": null
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen74259",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnRangeAll",
+                                        "width": 60,
+                                        "enableToggle": true,
+                                        "pressed": true,
+                                        "text": "All",
+                                        "toggleGroup": "timeline",
+                                        "designer|userClassName": "MyButton39",
+                                        "layout|flex": null
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen26949",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "html": null,
+                                "id": "chartCnt",
+                                "layout": "fit",
+                                "bodyCls": "viewerChart",
+                                "title": "",
+                                "designer|userClassName": "MyPanel66"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen27799",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": 0,
+                "height": null,
+                "width": null,
+                "layout": "fit",
+                "title": null,
+                "designer|userClassName": "ProcedureGrid",
+                "designer|userAlias": "proceduregrid"
+            }
+        },
+        {
+            "id": "ExtBox1-ext-gen42142",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "border": null,
+                "id": "proceduregrideditor",
+                "minWidth": 350,
+                "width": 350,
+                "layout": "border",
+                "collapsed": false,
+                "title": null,
+                "designer|userClassName": "ProcedureGridEditor",
+                "designer|userAlias": "proceduregrideditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen42153",
+                    "type": "panel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "border": 0,
+                        "height": 30,
+                        "id": null,
+                        "itemId": "buttonspanel",
+                        "layout": "fit",
+                        "title": "",
+                        "designer|userClassName": "MyPanel29",
+                        "layout|flex": null,
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen42160",
+                            "type": "form",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "border": 0,
+                                "height": null,
+                                "id": "chartfilterFrm",
+                                "padding": null,
+                                "layout": "hbox",
+                                "bodyPadding": "0 10 0 10",
+                                "collapseFirst": false,
+                                "collapsed": false,
+                                "title": "",
+                                "designer|userClassName": "MyForm35",
+                                "container|align": "middle",
+                                "container|padding": null,
+                                "weight": null
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen42171",
+                                    "type": "combobox",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "oeCbEditableProcedures",
+                                        "name": "procedure",
+                                        "fieldLabel": "Procedure",
+                                        "labelWidth": 70,
+                                        "allowBlank": false,
+                                        "displayField": "name",
+                                        "queryMode": "local",
+                                        "store": "editableProcedure",
+                                        "valueField": "name",
+                                        "designer|userClassName": "MyComboBox4",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen42180",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "hidden": true,
+                                        "id": "btnCancelEditor",
+                                        "minWidth": 60,
+                                        "text": "Cancel",
+                                        "designer|userClassName": "MyButton31",
+                                        "layout|flex": 0.5
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen42186",
+                                    "type": "button",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "btnStartEditor",
+                                        "minWidth": 60,
+                                        "text": "Start editing",
+                                        "designer|userClassName": "MyButton31",
+                                        "layout|flex": 0.5
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen30813",
+                    "type": "linkedinstance",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "layout|region": "center",
+                        "id": "proceduregrid",
+                        "itemId": null
+                    },
+                    "iconCls": "icon-linkedinstance",
+                    "masterInstanceId": "ExtBox1-ext-gen27799"
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen32036",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": null,
+                "width": null,
+                "layout": "border",
+                "title": "",
+                "designer|userClassName": "VirtualProcedureEditor",
+                "designer|userAlias": "virtualprocedureeditor"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen32417",
+                    "type": "form",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "height": 50,
+                        "bodyPadding": 10,
+                        "title": "",
+                        "designer|userClassName": "MyForm46",
+                        "layout|flex": null,
+                        "layout|region": "north"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen32929",
+                            "type": "combobox",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "id": "vpcmbplist",
+                                "fieldLabel": "Virtual procedure",
+                                "labelWidth": 150,
+                                "allowBlank": false,
+                                "displayField": "name",
+                                "forceSelection": true,
+                                "store": "vplist",
+                                "valueField": "name",
+                                "designer|userClassName": "MyComboBox31",
+                                "layout|anchor": "100%"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen32655",
+                    "type": "tabpanel",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "id": "vppanel",
+                        "activeItem": 0,
+                        "title": "",
+                        "activeTab": 1,
+                        "designer|userClassName": "MyPanel79",
+                        "layout|flex": 1,
+                        "layout|region": "center"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen33712",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "layout": "vbox",
+                                "title": "Rating curve",
+                                "designer|userClassName": "MyPanel81",
+                                "container|align": "stretch"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen40251",
+                                    "type": "toolbar",
+                                    "reference": {
+                                        "name": "dockedItems",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "designer|userClassName": "MyToolbar25",
+                                        "layout|flex": 1,
+                                        "dock": "top"
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen48175",
+                                            "type": "tbtext",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "style": null,
+                                                "text": "ADD",
+                                                "designer|userClassName": "MyTextItem",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen40471",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "vpbtnaddrc",
+                                                "text": "> at end",
+                                                "designer|userClassName": "MyButton77",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen46515",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "vpbtnaddaboverc",
+                                                "text": "> above selected",
+                                                "designer|userClassName": "MyButton77",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen46844",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "vpbtnaddbelowrc",
+                                                "text": "> below selected",
+                                                "designer|userClassName": "MyButton77",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen47502",
+                                            "type": "tbseparator",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "margin": "0px 8px 0px 8px",
+                                                "padding": null,
+                                                "designer|userClassName": "MySeparator1",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen40697",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "disabled": true,
+                                                "id": "vpbtnremoverc",
+                                                "text": "Remove selected",
+                                                "designer|userClassName": "MyButton78",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen37123",
+                                    "type": "gridpanel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "id": "vpgridratingcurve",
+                                        "title": "",
+                                        "store": "ratingcurve",
+                                        "designer|userClassName": "MyGridPanel16",
+                                        "layout|flex": 1
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen37146",
+                                            "type": "datecolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "sortable": false,
+                                                "dataIndex": "from",
+                                                "flex": 0.13,
+                                                "text": "From",
+                                                "format": "Y-m-d",
+                                                "designer|userClassName": "MyDateColumn2"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen40882",
+                                                    "type": "datefield",
+                                                    "reference": {
+                                                        "name": "field",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "from",
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "format": "Y-m-d",
+                                                        "designer|userClassName": "MyDateField8"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen32244",
+                                            "type": "datecolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "sortable": false,
+                                                "dataIndex": "to",
+                                                "flex": 0.13,
+                                                "text": "To",
+                                                "format": "Y-m-d",
+                                                "designer|userClassName": "MyDateColumn3"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen42591",
+                                                    "type": "datefield",
+                                                    "reference": {
+                                                        "name": "field",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "name": "to",
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "format": "Y-m-d",
+                                                        "designer|userClassName": "MyDateField9"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen37139",
+                                            "type": "numbercolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "sortable": false,
+                                                "dataIndex": "low_val",
+                                                "flex": 0.13,
+                                                "text": "Low",
+                                                "format": "0,000.0000",
+                                                "designer|userClassName": "MyNumberColumn4"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen42933",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "field",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "decimalPrecision": 4,
+                                                        "designer|userClassName": "MyNumberField10"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen32714",
+                                            "type": "numbercolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "sortable": false,
+                                                "dataIndex": "up_val",
+                                                "flex": 0.13,
+                                                "text": "Up",
+                                                "format": "0,000.0000",
+                                                "designer|userClassName": "MyNumberColumn5"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen43226",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "field",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "decimalPrecision": 4,
+                                                        "designer|userClassName": "MyNumberField11"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen33185",
+                                            "type": "numbercolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "sortable": false,
+                                                "dataIndex": "A",
+                                                "flex": 0.13,
+                                                "text": "A",
+                                                "format": "0,000.0000",
+                                                "designer|userClassName": "MyNumberColumn6"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen43404",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "field",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "decimalPrecision": 4,
+                                                        "designer|userClassName": "MyNumberField12"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen33557",
+                                            "type": "numbercolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "sortable": false,
+                                                "dataIndex": "B",
+                                                "flex": 0.13,
+                                                "text": "B",
+                                                "format": "0,000.0000",
+                                                "designer|userClassName": "MyNumberColumn7"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen43643",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "field",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "decimalPrecision": 4,
+                                                        "designer|userClassName": "MyNumberField13"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen33721",
+                                            "type": "numbercolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "sortable": false,
+                                                "dataIndex": "C",
+                                                "flex": 0.13,
+                                                "text": "C",
+                                                "format": "0,000.0000",
+                                                "designer|userClassName": "MyNumberColumn8"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen43885",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "field",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "decimalPrecision": 4,
+                                                        "designer|userClassName": "MyNumberField14"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen33887",
+                                            "type": "numbercolumn",
+                                            "reference": {
+                                                "name": "columns",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "sortable": false,
+                                                "dataIndex": "K",
+                                                "flex": 0.13,
+                                                "text": "K",
+                                                "format": "0,000.0000",
+                                                "designer|userClassName": "MyNumberColumn9"
+                                            },
+                                            "cn": [
+                                                {
+                                                    "id": "ExtBox1-ext-gen44130",
+                                                    "type": "numberfield",
+                                                    "reference": {
+                                                        "name": "field",
+                                                        "type": "object"
+                                                    },
+                                                    "codeClass": null,
+                                                    "userConfig": {
+                                                        "fieldLabel": "Label",
+                                                        "hideLabel": true,
+                                                        "decimalPrecision": 4,
+                                                        "designer|userClassName": "MyNumberField15"
+                                                    }
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen37160",
+                                            "type": "gridview",
+                                            "reference": {
+                                                "name": "viewConfig",
+                                                "type": "object"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "designer|userClassName": "MyGridView15"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen34510",
+                                            "type": "gridcelleditingplugin",
+                                            "reference": {
+                                                "name": "plugins",
+                                                "type": "array"
+                                            },
+                                            "codeClass": "Ext.grid.plugin.CellEditing",
+                                            "userConfig": {
+                                                "designer|userClassName": "MyCellEditingPlugin"
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen50406",
+                                            "type": "rowselectionmodel",
+                                            "reference": {
+                                                "name": "selModel",
+                                                "type": "object"
+                                            },
+                                            "codeClass": "Ext.selection.RowModel",
+                                            "userConfig": {
+                                                "allowDeselect": true,
+                                                "designer|userClassName": "MyRowSelectionModel"
+                                            }
+                                        }
+                                    ]
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen38481",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 60,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel83",
+                                        "container|align": "stretch",
+                                        "container|padding": "8px 0px 8px 0px",
+                                        "layout|flex": null
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen39412",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 40,
+                                                "designer|userClassName": "MyContainer32",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen38823",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "vpbtndeleterc",
+                                                "text": "Delete Rating Curve File",
+                                                "designer|userClassName": "MyButton75",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44408",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 40,
+                                                "designer|userClassName": "MyContainer32",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen39196",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "vpbtnsaverc",
+                                                "text": "Store the File",
+                                                "designer|userClassName": "MyButton76",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen44551",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 40,
+                                                "designer|userClassName": "MyContainer32",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen33858",
+                            "type": "panel",
+                            "reference": {
+                                "name": "items",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "layout": "vbox",
+                                "title": "Code",
+                                "designer|userClassName": "MyPanel82",
+                                "container|align": "stretch"
+                            },
+                            "cn": [
+                                {
+                                    "id": "ExtBox1-ext-gen33633",
+                                    "type": "form",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "id": "vpcodingform",
+                                        "layout": "fit",
+                                        "bodyPadding": 10,
+                                        "title": "",
+                                        "designer|userClassName": "MyForm47",
+                                        "layout|flex": 1
+                                    }
+                                },
+                                {
+                                    "id": "ExtBox1-ext-gen41982",
+                                    "type": "panel",
+                                    "reference": {
+                                        "name": "items",
+                                        "type": "array"
+                                    },
+                                    "codeClass": null,
+                                    "userConfig": {
+                                        "border": 0,
+                                        "height": 60,
+                                        "layout": "hbox",
+                                        "title": "",
+                                        "designer|userClassName": "MyPanel83",
+                                        "container|align": "stretch",
+                                        "container|padding": "8px 0px 8px 0px",
+                                        "layout|flex": null
+                                    },
+                                    "cn": [
+                                        {
+                                            "id": "ExtBox1-ext-gen41996",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 40,
+                                                "designer|userClassName": "MyContainer32",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen41989",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "vpbtndeletecode",
+                                                "text": "Delete Code File",
+                                                "designer|userClassName": "MyButton75",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45462",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 40,
+                                                "designer|userClassName": "MyContainer32",
+                                                "layout|flex": null
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen42003",
+                                            "type": "button",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "id": "vpbtnsavecode",
+                                                "text": "Save the Python Code",
+                                                "designer|userClassName": "MyButton76",
+                                                "layout|flex": 1
+                                            }
+                                        },
+                                        {
+                                            "id": "ExtBox1-ext-gen45637",
+                                            "type": "container",
+                                            "reference": {
+                                                "name": "items",
+                                                "type": "array"
+                                            },
+                                            "codeClass": null,
+                                            "userConfig": {
+                                                "width": 40,
+                                                "designer|userClassName": "MyContainer32",
+                                                "layout|flex": null
+                                            }
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        }
+    ],
+    "stores": [
+        {
+            "id": "ExtBox1-ext-gen41866",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "dataQualityStore",
+                "designer|userClassName": "DataQualityStore"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen41870",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": null,
+                        "designer|userClassName": "Ajax Proxy"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen41876",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "root": "data",
+                                "designer|userClassName": "Json Reader"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen22818",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": null,
+                        "designer|userClassName": "MyField67"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen42110",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "code",
+                        "designer|userClassName": "MyField"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen42117",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "designer|userClassName": "MyField1"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen12255",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "offerings",
+                "designer|userClassName": "Offerings"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen12259",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "data/offerings.json",
+                        "designer|userClassName": "Ajax Proxy1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen12265",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader1"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen12620",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen13263",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField3"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen13495",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "procedures",
+                "designer|userClassName": "Procedures"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen13498",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen13501",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader1"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen13504",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen13507",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField3"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen13909",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "observedproperties",
+                "designer|userClassName": "ObservedProperties"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen13912",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy1"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen13915",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader1"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen13918",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField2"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen13921",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField3"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen21787",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "uom",
+                        "type": "string",
+                        "designer|userClassName": "MyField64"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen17477",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField66"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen35869",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "observations",
+                "designer|userClassName": "Observations"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen35873",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "data/observations.json",
+                        "designer|userClassName": "Ajax Proxy4"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen35879",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "isodate",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader4"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen36169",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dateFormat": "c",
+                        "name": "isodate",
+                        "type": "date",
+                        "designer|userClassName": "MyField8"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen36176",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "type": "float",
+                        "designer|userClassName": "MyField9"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen14899",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "serverstatus",
+                "designer|userClassName": "serverstatus"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen14903",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": null,
+                        "designer|userClassName": "Ajax Proxy5"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen14909",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "service",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader5"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen15282",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "getcapabilities",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField10"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15289",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "featuresOfInterest",
+                        "type": "int",
+                        "designer|userClassName": "MyField11"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15296",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "describesensor",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField12"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15303",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "getobservation",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField13"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15310",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "service",
+                        "type": "string",
+                        "designer|userClassName": "MyField14"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15737",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "database",
+                        "type": "string",
+                        "designer|userClassName": "MyField15"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15744",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "availability",
+                        "type": "string",
+                        "designer|userClassName": "MyField16"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15751",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "offerings",
+                        "type": "int",
+                        "designer|userClassName": "MyField17"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15758",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "getfeatureofinterest",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField18"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen15765",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "registersensor",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField19"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen16217",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "procedures",
+                        "type": "int",
+                        "designer|userClassName": "MyField20"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen16224",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "observedProperties",
+                        "type": "int",
+                        "designer|userClassName": "MyField21"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen16231",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "insertobservation",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField22"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen36913",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "fake",
+                "designer|userClassName": "Fake",
+                "designer|userAlias": null
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen36917",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy6"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen36923",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "root": "data",
+                                "designer|userClassName": "Json Reader6"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen37157",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "designer|userClassName": "MyField23"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen112522",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "designer|userClassName": "MyField26"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen112702",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField27"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen32395",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "constraint",
+                "data": "[\n{\n  \"name\": \" -- \",\n  \"value\": 0\n},\n{\n  \"name\": \"Greater then\",\n  \"value\": 1\n},\n{\n  \"name\": \"Less then\",\n  \"value\": 2\n},\n{\n  \"name\": \"Between\",\n  \"value\": 3\n},\n{\n  \"name\": \"Value list\",\n  \"value\": 4\n},\n]",
+                "designer|userClassName": "Constraint"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen32398",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy6"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen32401",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "root": "data",
+                                "designer|userClassName": "Json Reader6"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen32404",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "designer|userClassName": "MyField23"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen32407",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "designer|userClassName": "MyField26"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen100883",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "identification",
+                "designer|userClassName": "cmbIdentification"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen100887",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbIdentification.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen100893",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen101155",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen101162",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField25"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen130149",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "cmbsml",
+                "designer|userClassName": "cmbSml"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen130152",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbIdentification.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen130155",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen130158",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen47109",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField40"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen130161",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField25"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen130327",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "uom",
+                        "type": "string",
+                        "designer|userClassName": "MyField31"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen132456",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "type": "string",
+                        "designer|userClassName": "MyField33"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen65651",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "gridoutputs",
+                "designer|userClassName": "gridOutputs"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen65654",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": null,
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen65657",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen65660",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen65663",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField40"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen65666",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField25"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen65669",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "uom",
+                        "type": "string",
+                        "designer|userClassName": "MyField31"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen65672",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "type": "string",
+                        "designer|userClassName": "MyField33"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen66079",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "role",
+                        "designer|userClassName": "MyField46"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen66086",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "from",
+                        "type": "string",
+                        "designer|userClassName": "MyField47"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen66093",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "to",
+                        "type": "string",
+                        "designer|userClassName": "MyField48"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen45104",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "list",
+                        "type": "string",
+                        "designer|userClassName": "MyField73"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen45111",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "ctype",
+                        "designer|userClassName": "MyField74"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen122830",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "autoLoad": true,
+                "storeId": "systemtype",
+                "designer|userClassName": "cmbSystemType"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen122833",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbsystemtype.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen122836",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen122839",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen170536",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "cmbname",
+                "designer|userClassName": "cmbName"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen170539",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbsystemtype.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen170542",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen170545",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen27957",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "namedescription",
+                "designer|userClassName": "cmbNameDescription"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen27960",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbsystemtype.json",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen27963",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen27966",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen28228",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField53"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen19975",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "storeServices",
+                "designer|userClassName": "Services"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen19978",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "/istsos/wa/istsos/services",
+                        "designer|userClassName": "Ajax Proxy7"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen19981",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "service",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader7"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen19984",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "service",
+                        "type": "string",
+                        "designer|userClassName": "MyField24"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen19987",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "path",
+                        "type": "string",
+                        "designer|userClassName": "MyField53"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen172001",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "griddocumentation",
+                "designer|userClassName": "gridDocumentation"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen172005",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy11"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen172011",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "root": "data",
+                                "designer|userClassName": "Json Reader11"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen172273",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField34"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen172280",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dateFormat": "Y-m-d",
+                        "name": "date",
+                        "type": "date",
+                        "designer|userClassName": "MyField35"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen172287",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "format",
+                        "type": "string",
+                        "designer|userClassName": "MyField36"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen172294",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "link",
+                        "type": "string",
+                        "designer|userClassName": "MyField37"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen175055",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "cmbdocumentformat",
+                "designer|userClassName": "cmbDocumentFormat"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen175059",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/data/cmbdocumentformat.json",
+                        "designer|userClassName": "Ajax Proxy12"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen175065",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": null,
+                                "messageProperty": null,
+                                "root": "data",
+                                "designer|userClassName": "Json Reader12"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen175420",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "extension",
+                        "type": "string",
+                        "designer|userClassName": "MyField38"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen175427",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "format",
+                        "sortType": "asText",
+                        "type": "string",
+                        "designer|userClassName": "MyField39"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen23769",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "procedurelist",
+                "designer|userClassName": "gridProceduresList"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen23773",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy14"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen23779",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader14"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen24076",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "sortType": "asText",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen32742",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "sortType": "asText",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen32831",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "sensortype",
+                        "sortType": "asText",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24083",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "offerings",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24090",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "observedproperties",
+                        "designer|userClassName": "MyField51"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen32778",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "samplingTime",
+                        "designer|userClassName": "MyField89"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen35785",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "vplist",
+                "designer|userClassName": "vplist"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen35788",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy14"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen35791",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader14"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen35794",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "sortType": "asText",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen35797",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "offerings",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen35800",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "observedproperties",
+                        "designer|userClassName": "MyField51"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen24877",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "gridobservedproperties",
+                "designer|userClassName": "gridObservedProperties"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen24880",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "",
+                        "designer|userClassName": "Ajax Proxy14"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen24883",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader14"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen24886",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen63840",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "definition",
+                        "type": "string",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24889",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen24892",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "procedures",
+                        "type": "string",
+                        "designer|userClassName": "MyField51"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen54035",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "constraint",
+                        "designer|userClassName": "MyField75"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen23329",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "griduoms",
+                "designer|userClassName": "gridUoms"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen23332",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "",
+                        "designer|userClassName": "Ajax Proxy14"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen23335",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "definition",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader14"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen23338",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen23344",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen23347",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "procedures",
+                        "designer|userClassName": "MyField51"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen43477",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "gridofferings",
+                "designer|userClassName": "gridOfferings"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen43480",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "",
+                        "designer|userClassName": "Ajax Proxy14"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen43483",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "name",
+                                "messageProperty": "message",
+                                "root": "data",
+                                "designer|userClassName": "Json Reader14"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen43486",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "name",
+                        "type": "string",
+                        "designer|userClassName": "MyField49"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen43489",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "description",
+                        "type": "string",
+                        "designer|userClassName": "MyField50"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen43492",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "procedures",
+                        "designer|userClassName": "MyField51"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen44059",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "dateFormat": "c",
+                        "name": "expiration",
+                        "type": "date",
+                        "designer|userClassName": "MyField60"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen44066",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "active",
+                        "type": "boolean",
+                        "designer|userClassName": "MyField61"
+                    }
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen18026",
+            "type": "arraystore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "MyArrayStore",
+                "designer|userClassName": "MyArrayStore"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen18030",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy19"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen18036",
+                            "type": "arrayreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "idProperty": "xx",
+                                "designer|userClassName": "Array Reader"
+                            }
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "id": "ExtBox1-ext-gen35230",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "ratingcurve",
+                "designer|userClassName": "RatingCurve",
+                "designer|userAlias": "ratingcurve"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen35234",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "designer|userClassName": "Ajax Proxy22"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen35240",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "Json Reader21"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen35565",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "from",
+                        "type": "date",
+                        "designer|userClassName": "MyField76"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen35572",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "to",
+                        "type": "date",
+                        "designer|userClassName": "MyField77"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen35579",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "low_val",
+                        "type": "float",
+                        "designer|userClassName": "MyField78"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen35586",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "up_val",
+                        "type": "float",
+                        "designer|userClassName": "MyField79"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen35593",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "A",
+                        "type": "float",
+                        "designer|userClassName": "MyField80"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen36020",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "B",
+                        "type": "float",
+                        "designer|userClassName": "MyField81"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen36027",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "C",
+                        "type": "float",
+                        "designer|userClassName": "MyField82"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen36034",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "K",
+                        "type": "float",
+                        "designer|userClassName": "MyField83"
+                    }
+                }
+            ]
+        }
+    ],
+    "framework": "ext40"
+}
\ No newline at end of file
diff --git a/interface/nbproject/private/private.properties b/interface/nbproject/private/private.properties
new file mode 100755
index 0000000..92887b0
--- /dev/null
+++ b/interface/nbproject/private/private.properties
@@ -0,0 +1,5 @@
+copy.src.files=false
+copy.src.target=/var/www/webAdmin
+index.file=index.html
+run.as=LOCAL
+url=http://localhost/istsosadmin
diff --git a/interface/nbproject/private/private.xml b/interface/nbproject/private/private.xml
new file mode 100755
index 0000000..92aa1db
--- /dev/null
+++ b/interface/nbproject/private/private.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+    <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1">
+        <file>
+            <url>app/view/ProcedureGrid.js</url>
+            <line>283</line>
+        </file>
+        <file>
+            <url>app/view/Chart.js</url>
+            <line>126</line>
+            <line>148</line>
+            <line>672</line>
+        </file>
+        <file>
+            <url>app/view/Calc.js</url>
+            <line>191</line>
+        </file>
+    </editor-bookmarks>
+    <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/1">
+        <file>file:/home/milan/workspace/istsos/svn/interface/app/view/getobservation.js</file>
+        <file>file:/home/milan/workspace/istsos/svn/interface/app/view/geo.js</file>
+    </open-files>
+</project-private>
diff --git a/interface/nbproject/private/retriever/catalog.xml b/interface/nbproject/private/retriever/catalog.xml
new file mode 100755
index 0000000..b06a655
--- /dev/null
+++ b/interface/nbproject/private/retriever/catalog.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="system">
+    <system systemId="http://www.opengis.net/gml" uri="schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+    <system systemId="http://www.opengis.net/sos/1.0" uri="schemas.opengis.net/sos/1.0.0/sosAll.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosCommon.xsd" uri="schemas.opengis.net/sos/1.0.0/sosCommon.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosGetCapabilities.xsd" uri="schemas.opengis.net/sos/1.0.0/sosGetCapabilities.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosDescribeFeatureType.xsd" uri="schemas.opengis.net/sos/1.0.0/sosDescribeFeatureType.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosDescribeSensor.xsd" uri="schemas.opengis.net/sos/1.0.0/sosDescribeSensor.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosDescribeObservationType.xsd" uri="schemas.opengis.net/sos/1.0.0/sosDescribeObservationType.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosDescribeResultModel.xsd" uri="schemas.opengis.net/sos/1.0.0/sosDescribeResultModel.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd" uri="schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosGetResult.xsd" uri="schemas.opengis.net/sos/1.0.0/sosGetResult.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterest.xsd" uri="schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterest.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterestTime.xsd" uri="schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterestTime.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosInsert.xsd" uri="schemas.opengis.net/sos/1.0.0/sosInsert.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosRegisterSensor.xsd" uri="schemas.opengis.net/sos/1.0.0/sosRegisterSensor.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosGetObservationById.xsd" uri="schemas.opengis.net/sos/1.0.0/sosGetObservationById.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsAll.xsd" uri="schemas.opengis.net/ows/1.1.0/owsAll.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/ogc4sos.xsd" uri="schemas.opengis.net/sos/1.0.0/ogc4sos.xsd"/>
+    <system systemId="http://schemas.opengis.net/sos/1.0.0/sosContents.xsd" uri="schemas.opengis.net/sos/1.0.0/sosContents.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsGetResourceByID.xsd" uri="schemas.opengis.net/ows/1.1.0/owsGetResourceByID.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd" uri="schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsDomainType.xsd" uri="schemas.opengis.net/ows/1.1.0/owsDomainType.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsContents.xsd" uri="schemas.opengis.net/ows/1.1.0/owsContents.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsInputOutputData.xsd" uri="schemas.opengis.net/ows/1.1.0/owsInputOutputData.xsd"/>
+    <system systemId="http://schemas.opengis.net/filter/1.1.0/filter.xsd" uri="schemas.opengis.net/filter/1.1.0/filter.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsDataIdentification.xsd" uri="schemas.opengis.net/ows/1.1.0/owsDataIdentification.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsGetCapabilities.xsd" uri="schemas.opengis.net/ows/1.1.0/owsGetCapabilities.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsCommon.xsd" uri="schemas.opengis.net/ows/1.1.0/owsCommon.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsManifest.xsd" uri="schemas.opengis.net/ows/1.1.0/owsManifest.xsd"/>
+    <system systemId="http://schemas.opengis.net/filter/1.1.0/filterAll.xsd" uri="schemas.opengis.net/filter/1.1.0/filterAll.xsd"/>
+    <system systemId="http://schemas.opengis.net/filter/1.1.0/expr.xsd" uri="schemas.opengis.net/filter/1.1.0/expr.xsd"/>
+    <system systemId="http://schemas.opengis.net/filter/1.1.0/sort.xsd" uri="schemas.opengis.net/filter/1.1.0/sort.xsd"/>
+    <system systemId="http://schemas.opengis.net/filter/1.1.0/filterCapabilities.xsd" uri="schemas.opengis.net/filter/1.1.0/filterCapabilities.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/ows19115subset.xsd" uri="schemas.opengis.net/ows/1.1.0/ows19115subset.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsServiceIdentification.xsd" uri="schemas.opengis.net/ows/1.1.0/owsServiceIdentification.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsServiceProvider.xsd" uri="schemas.opengis.net/ows/1.1.0/owsServiceProvider.xsd"/>
+    <system systemId="http://schemas.opengis.net/ows/1.1.0/owsOperationsMetadata.xsd" uri="schemas.opengis.net/ows/1.1.0/owsOperationsMetadata.xsd"/>
+    <system systemId="http://www.w3.org/1999/xlink" uri="www.w3.org/1999/xlink"/>
+    <system systemId="http://www.opengis.net/om/1.0" uri="schemas.opengis.net/om/1.0.0/om.xsd"/>
+    <system systemId="http://www.opengis.net/gml/3.2" uri="schemas.opengis.net/gml/3.2.1/gml.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/dynamicFeature.xsd" uri="schemas.opengis.net/gml/3.2.1/dynamicFeature.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/topology.xsd" uri="schemas.opengis.net/gml/3.2.1/topology.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/coverage.xsd" uri="schemas.opengis.net/gml/3.2.1/coverage.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/coordinateReferenceSystems.xsd" uri="schemas.opengis.net/gml/3.2.1/coordinateReferenceSystems.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/observation.xsd" uri="schemas.opengis.net/gml/3.2.1/observation.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/temporalReferenceSystems.xsd" uri="schemas.opengis.net/gml/3.2.1/temporalReferenceSystems.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/deprecatedTypes.xsd" uri="schemas.opengis.net/gml/3.2.1/deprecatedTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/feature.xsd" uri="schemas.opengis.net/gml/3.2.1/feature.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/direction.xsd" uri="schemas.opengis.net/gml/3.2.1/direction.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/geometryComplexes.xsd" uri="schemas.opengis.net/gml/3.2.1/geometryComplexes.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/valueObjects.xsd" uri="schemas.opengis.net/gml/3.2.1/valueObjects.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/grids.xsd" uri="schemas.opengis.net/gml/3.2.1/grids.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/geometryAggregates.xsd" uri="schemas.opengis.net/gml/3.2.1/geometryAggregates.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/coordinateSystems.xsd" uri="schemas.opengis.net/gml/3.2.1/coordinateSystems.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/datums.xsd" uri="schemas.opengis.net/gml/3.2.1/datums.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/coordinateOperations.xsd" uri="schemas.opengis.net/gml/3.2.1/coordinateOperations.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/temporalTopology.xsd" uri="schemas.opengis.net/gml/3.2.1/temporalTopology.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/dictionary.xsd" uri="schemas.opengis.net/gml/3.2.1/dictionary.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/temporal.xsd" uri="schemas.opengis.net/gml/3.2.1/temporal.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/geometryBasic0d1d.xsd" uri="schemas.opengis.net/gml/3.2.1/geometryBasic0d1d.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/geometryPrimitives.xsd" uri="schemas.opengis.net/gml/3.2.1/geometryPrimitives.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/referenceSystems.xsd" uri="schemas.opengis.net/gml/3.2.1/referenceSystems.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/measures.xsd" uri="schemas.opengis.net/gml/3.2.1/measures.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/gmlBase.xsd" uri="schemas.opengis.net/gml/3.2.1/gmlBase.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/geometryBasic2d.xsd" uri="schemas.opengis.net/gml/3.2.1/geometryBasic2d.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/units.xsd" uri="schemas.opengis.net/gml/3.2.1/units.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/metadataApplication.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/metadataApplication.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.2.1/basicTypes.xsd" uri="schemas.opengis.net/gml/3.2.1/basicTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd" uri="schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/metadataEntity.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/metadataEntity.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gco/basicTypes.xsd" uri="schemas.opengis.net/iso/19139/20070417/gco/basicTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/spatialRepresentation.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/spatialRepresentation.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/metadataExtension.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/metadataExtension.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/content.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/content.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/applicationSchema.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/applicationSchema.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/portrayalCatalogue.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/portrayalCatalogue.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/dataQuality.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/dataQuality.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/freeText.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/freeText.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gco/gcoBase.xsd" uri="schemas.opengis.net/iso/19139/20070417/gco/gcoBase.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gss/gss.xsd" uri="schemas.opengis.net/iso/19139/20070417/gss/gss.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/citation.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/citation.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/identification.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/identification.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gss/geometry.xsd" uri="schemas.opengis.net/iso/19139/20070417/gss/geometry.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/referenceSystem.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/referenceSystem.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/constraints.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/constraints.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/distribution.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/distribution.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/maintenance.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/maintenance.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gmd/extent.xsd" uri="schemas.opengis.net/iso/19139/20070417/gmd/extent.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gts/gts.xsd" uri="schemas.opengis.net/iso/19139/20070417/gts/gts.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gsr/gsr.xsd" uri="schemas.opengis.net/iso/19139/20070417/gsr/gsr.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gts/temporalObjects.xsd" uri="schemas.opengis.net/iso/19139/20070417/gts/temporalObjects.xsd"/>
+    <system systemId="http://schemas.opengis.net/iso/19139/20070417/gsr/spatialReferencing.xsd" uri="schemas.opengis.net/iso/19139/20070417/gsr/spatialReferencing.xsd"/>
+    <system systemId="http://www.opengis.net/sampling/1.0" uri="schemas.opengis.net/sampling/1.0.0/sampling.xsd"/>
+    <system systemId="http://schemas.opengis.net/sampling/1.0.0/samplingManifold.xsd" uri="schemas.opengis.net/sampling/1.0.0/samplingManifold.xsd"/>
+    <system systemId="http://schemas.opengis.net/sampling/1.0.0/specimen.xsd" uri="schemas.opengis.net/sampling/1.0.0/specimen.xsd"/>
+    <system systemId="http://schemas.opengis.net/sampling/1.0.0/samplingBase.xsd" uri="schemas.opengis.net/sampling/1.0.0/samplingBase.xsd"/>
+    <system systemId="http://schemas.opengis.net/sampling/1.0.0/surveyProcedure.xsd" uri="schemas.opengis.net/sampling/1.0.0/surveyProcedure.xsd"/>
+    <system systemId="http://schemas.opengis.net/sampling/1.0.0/LUTgeodesy.xsd" uri="schemas.opengis.net/sampling/1.0.0/LUTgeodesy.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd" uri="schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+    <system systemId="http://schemas.opengis.net/om/1.0.0/om.xsd" uri="schemas.opengis.net/om/1.0.0/om.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/dynamicFeature.xsd" uri="schemas.opengis.net/gml/3.1.1/base/dynamicFeature.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/topology.xsd" uri="schemas.opengis.net/gml/3.1.1/base/topology.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/coverage.xsd" uri="schemas.opengis.net/gml/3.1.1/base/coverage.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/coordinateReferenceSystems.xsd" uri="schemas.opengis.net/gml/3.1.1/base/coordinateReferenceSystems.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/observation.xsd" uri="schemas.opengis.net/gml/3.1.1/base/observation.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd" uri="schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/temporalReferenceSystems.xsd" uri="schemas.opengis.net/gml/3.1.1/base/temporalReferenceSystems.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/positionTypes.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/positionTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/curveTypes.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/curveTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/data.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/data.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/temporalAggregates.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/temporalAggregates.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/phenomenon.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/phenomenon.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/xmlData.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/xmlData.xsd"/>
+    <system systemId="http://schemas.opengis.net/om/1.0.0/observation.xsd" uri="schemas.opengis.net/om/1.0.0/observation.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/feature.xsd" uri="schemas.opengis.net/gml/3.1.1/base/feature.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/direction.xsd" uri="schemas.opengis.net/gml/3.1.1/base/direction.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/geometryComplexes.xsd" uri="schemas.opengis.net/gml/3.1.1/base/geometryComplexes.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/valueObjects.xsd" uri="schemas.opengis.net/gml/3.1.1/base/valueObjects.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/grids.xsd" uri="schemas.opengis.net/gml/3.1.1/base/grids.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/geometryAggregates.xsd" uri="schemas.opengis.net/gml/3.1.1/base/geometryAggregates.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/coordinateSystems.xsd" uri="schemas.opengis.net/gml/3.1.1/base/coordinateSystems.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/datums.xsd" uri="schemas.opengis.net/gml/3.1.1/base/datums.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/coordinateOperations.xsd" uri="schemas.opengis.net/gml/3.1.1/base/coordinateOperations.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/smil/smil20.xsd" uri="schemas.opengis.net/gml/3.1.1/smil/smil20.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/measures.xsd" uri="schemas.opengis.net/gml/3.1.1/base/measures.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/temporalTopology.xsd" uri="schemas.opengis.net/gml/3.1.1/base/temporalTopology.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/dictionary.xsd" uri="schemas.opengis.net/gml/3.1.1/base/dictionary.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/aggregateTypes.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/aggregateTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/sensorML/1.0.1/sensorML.xsd" uri="schemas.opengis.net/sensorML/1.0.1/sensorML.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/geometryBasic2d.xsd" uri="schemas.opengis.net/gml/3.1.1/base/geometryBasic2d.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/temporal.xsd" uri="schemas.opengis.net/gml/3.1.1/base/temporal.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/geometryBasic0d1d.xsd" uri="schemas.opengis.net/gml/3.1.1/base/geometryBasic0d1d.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd" uri="schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/referenceSystems.xsd" uri="schemas.opengis.net/gml/3.1.1/base/referenceSystems.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/dataQuality.xsd" uri="schemas.opengis.net/gml/3.1.1/base/dataQuality.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/smil/smil20-language.xsd" uri="schemas.opengis.net/gml/3.1.1/smil/smil20-language.xsd"/>
+    <system systemId="http://www.w3.org/2001/xml.xsd" uri="www.w3.org/2001/xml.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/units.xsd" uri="schemas.opengis.net/gml/3.1.1/base/units.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/gmlBase.xsd" uri="schemas.opengis.net/gml/3.1.1/base/gmlBase.xsd"/>
+    <system systemId="http://www.w3.org/1999/xlink.xsd" uri="www.w3.org/1999/xlink.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/simpleTypes.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/simpleTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/encoding.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/encoding.xsd"/>
+    <system systemId="http://schemas.opengis.net/sensorML/1.0.1/system.xsd" uri="schemas.opengis.net/sensorML/1.0.1/system.xsd"/>
+    <system systemId="http://schemas.opengis.net/gml/3.1.1/base/basicTypes.xsd" uri="schemas.opengis.net/gml/3.1.1/base/basicTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/sweCommon/1.0.1/basicTypes.xsd" uri="schemas.opengis.net/sweCommon/1.0.1/basicTypes.xsd"/>
+    <system systemId="http://schemas.opengis.net/sensorML/1.0.1/process.xsd" uri="schemas.opengis.net/sensorML/1.0.1/process.xsd"/>
+    <system systemId="http://schemas.opengis.net/sensorML/1.0.1/method.xsd" uri="schemas.opengis.net/sensorML/1.0.1/method.xsd"/>
+    <system systemId="http://schemas.opengis.net/sensorML/1.0.1/base.xsd" uri="schemas.opengis.net/sensorML/1.0.1/base.xsd"/>
+    <system systemId="http://schemas.opengis.net/ic/2.0/IC-ISM-v2.xsd" uri="schemas.opengis.net/ic/2.0/IC-ISM-v2.xsd"/>
+</catalog>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/expr.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/expr.xsd
new file mode 100755
index 0000000..bcf2e4f
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/expr.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.3">
+   <!-- 
+      filter is an OGC Standard.
+      Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium.
+      To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      
+      Updated: 2012-07-21
+   -->
+   <xsd:element name="Add" type="ogc:BinaryOperatorType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Sub" type="ogc:BinaryOperatorType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Mul" type="ogc:BinaryOperatorType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Div" type="ogc:BinaryOperatorType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="PropertyName" type="ogc:PropertyNameType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Function" type="ogc:FunctionType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Literal" type="ogc:LiteralType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="expression" type="ogc:ExpressionType" abstract="true"/>
+   <!-- <xsd:complexType name="ExpressionType" abstract="true" mixed="true"/>
+     -->
+   <xsd:complexType name="ExpressionType" abstract="true"/>
+   <xsd:complexType name="BinaryOperatorType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ExpressionType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="FunctionType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ExpressionType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:expression" minOccurs="0"
+                  maxOccurs="unbounded"/>
+            </xsd:sequence>
+            <xsd:attribute name="name" type="xsd:string" use="required"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="LiteralType">
+      <xsd:complexContent mixed="true">
+         <xsd:extension base="ogc:ExpressionType">
+            <xsd:sequence>
+               <xsd:any minOccurs="0"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="PropertyNameType">
+      <xsd:complexContent mixed="true">
+         <xsd:extension base="ogc:ExpressionType"/>
+      </xsd:complexContent>
+   </xsd:complexType>
+</xsd:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filter.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filter.xsd
new file mode 100755
index 0000000..0eb97d2
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filter.xsd
@@ -0,0 +1,265 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.3">
+
+   <xsd:annotation>
+      <xsd:documentation>
+         This XML Schema defines OGC query filter capabilities documents.
+         filter is an OGC Standard.
+
+         Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium.
+
+         To obtain additional rights of use, visit:
+         http://www.opengeospatial.org/legal/ .
+
+         Updated: 2012-07-21
+      </xsd:documentation>
+   </xsd:annotation>
+
+   <xsd:include schemaLocation="filterAll.xsd"/>
+   <xsd:include schemaLocation="expr.xsd"/>
+   <xsd:include schemaLocation="sort.xsd"/>
+   <xsd:include schemaLocation="filterCapabilities.xsd"/>
+
+   <xsd:import namespace="http://www.opengis.net/gml"
+               schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/geometryAggregates.xsd"/>
+
+   <xsd:element name="_Id" type="ogc:AbstractIdType" abstract="true"/>
+   <xsd:element name="FeatureId"
+                type="ogc:FeatureIdType"
+                substitutionGroup="ogc:_Id"/>
+   <xsd:element name="GmlObjectId"
+                type="ogc:GmlObjectIdType"
+                substitutionGroup="ogc:_Id"/>
+
+   <xsd:element name="Filter" type="ogc:FilterType"/>
+   <xsd:complexType name="FilterType">
+      <xsd:choice>
+         <xsd:element ref="ogc:spatialOps"/>
+         <xsd:element ref="ogc:comparisonOps"/>
+         <xsd:element ref="ogc:logicOps"/>
+         <xsd:element ref="ogc:_Id" maxOccurs="unbounded"/>
+      </xsd:choice>
+   </xsd:complexType>
+
+   <xsd:element name="comparisonOps"
+                type="ogc:ComparisonOpsType"
+                abstract="true"/>
+   <xsd:element name="PropertyIsEqualTo"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsNotEqualTo"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsLessThan"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsGreaterThan"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsLessThanOrEqualTo"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsGreaterThanOrEqualTo"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsLike"
+                type="ogc:PropertyIsLikeType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsNull"
+                type="ogc:PropertyIsNullType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsBetween"
+                type="ogc:PropertyIsBetweenType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:complexType name="ComparisonOpsType" abstract="true"/>
+   <xsd:element name="spatialOps" type="ogc:SpatialOpsType" abstract="true"/>
+   <xsd:element name="Equals"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Disjoint"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Touches"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Within"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Overlaps"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Crosses"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Intersects"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Contains"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="DWithin"
+                type="ogc:DistanceBufferType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Beyond"
+                type="ogc:DistanceBufferType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="BBOX"
+                type="ogc:BBOXType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:complexType name="SpatialOpsType" abstract="true"/>
+   <xsd:element name="logicOps" type="ogc:LogicOpsType" abstract="true"/>
+   <xsd:element name="And"
+                type="ogc:BinaryLogicOpType"
+                substitutionGroup="ogc:logicOps"/>
+   <xsd:element name="Or"
+                type="ogc:BinaryLogicOpType"
+                substitutionGroup="ogc:logicOps"/>
+   <xsd:element name="Not"
+                type="ogc:UnaryLogicOpType"
+                substitutionGroup="ogc:logicOps"/>
+   <xsd:complexType name="LogicOpsType" abstract="true"/>
+   <xsd:complexType name="AbstractIdType" abstract="true"/>
+   <xsd:complexType name="FeatureIdType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:AbstractIdType">
+            <xsd:attribute name="fid" type="xsd:ID" use="required"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="GmlObjectIdType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:AbstractIdType">
+            <xsd:attribute ref="gml:id" use="required"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="BinaryComparisonOpType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ComparisonOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
+            </xsd:sequence>
+            <xsd:attribute name="matchCase" type="xsd:boolean" use="optional"
+                           default="true"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="PropertyIsLikeType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ComparisonOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName"/>
+               <xsd:element ref="ogc:Literal"/>
+            </xsd:sequence>
+            <xsd:attribute name="wildCard" type="xsd:string" use="required"/>
+            <xsd:attribute name="singleChar" type="xsd:string" use="required"/>
+            <xsd:attribute name="escapeChar" type="xsd:string" use="required"/>
+            <xsd:attribute name="matchCase" type="xsd:boolean" use="optional"
+                           default="true"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="PropertyIsNullType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ComparisonOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="PropertyIsBetweenType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ComparisonOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:expression"/>
+               <xsd:element name="LowerBoundary" type="ogc:LowerBoundaryType"/>
+               <xsd:element name="UpperBoundary" type="ogc:UpperBoundaryType"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="LowerBoundaryType">
+      <xsd:choice>
+         <xsd:element ref="ogc:expression"/>
+      </xsd:choice>
+   </xsd:complexType>
+   <xsd:complexType name="UpperBoundaryType">
+      <xsd:sequence>
+         <xsd:element ref="ogc:expression"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="BinarySpatialOpType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:SpatialOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName"/>
+               <xsd:choice>
+                  <xsd:element ref="ogc:PropertyName"/>
+                  <xsd:element ref="gml:_Geometry"/>
+                  <xsd:element ref="gml:Envelope"/>
+               </xsd:choice>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="BBOXType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:SpatialOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName" minOccurs="0"/>
+               <xsd:element ref="gml:Envelope"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="DistanceBufferType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:SpatialOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName"/>
+               <xsd:element ref="gml:_Geometry"/>
+               <xsd:element name="Distance" type="ogc:DistanceType"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="DistanceType">
+      <xsd:simpleContent>
+         <xsd:extension base="xsd:double">
+            <xsd:attribute name="units" type="xsd:anyURI" use="required"/>
+         </xsd:extension>
+      </xsd:simpleContent>
+   </xsd:complexType>
+   <xsd:complexType name="BinaryLogicOpType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:LogicOpsType">
+            <xsd:choice minOccurs="2" maxOccurs="unbounded">
+               <xsd:element ref="ogc:comparisonOps"/>
+               <xsd:element ref="ogc:spatialOps"/>
+               <xsd:element ref="ogc:logicOps"/>
+               <xsd:element ref="ogc:Function"/>
+            </xsd:choice>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="UnaryLogicOpType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:LogicOpsType">
+            <xsd:sequence>
+               <xsd:choice>
+                  <xsd:element ref="ogc:comparisonOps"/>
+                  <xsd:element ref="ogc:spatialOps"/>
+                  <xsd:element ref="ogc:logicOps"/>
+                  <xsd:element ref="ogc:Function"/>
+               </xsd:choice>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+</xsd:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filterAll.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filterAll.xsd
new file mode 100755
index 0000000..5054245
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filterAll.xsd
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema 
+   targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.3">
+   <!-- This version of filter/1.1.0 was previously versioned as '1.1.2' . -->
+
+   <xsd:annotation>
+      <xsd:documentation>
+         This XML Schema document includes and imports, directly or indirectly,
+         all the XML Schema defined by the Filter Encoding Standard.
+
+         Filter Encoding is an OGC Standard.
+         Copyright (c) 2010 Open Geospatial Consortium.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </xsd:documentation>
+   </xsd:annotation>
+
+   <xsd:include schemaLocation="filter.xsd"/>
+   <xsd:include schemaLocation="expr.xsd"/>
+   <xsd:include schemaLocation="sort.xsd"/>
+   <xsd:include schemaLocation="filterCapabilities.xsd"/>
+</xsd:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filterCapabilities.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filterCapabilities.xsd
new file mode 100755
index 0000000..51f6d2d
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/filterCapabilities.xsd
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema
+   targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.3">
+   <xsd:annotation>
+      <xsd:documentation>
+         This XML Schema defines OGC query filter capabilities documents.
+         
+         filter is an OGC Standard.
+         Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+         
+         Updated: 2012-07-21
+      </xsd:documentation>
+   </xsd:annotation>
+   <xsd:element name="Filter_Capabilities">
+      <xsd:complexType>
+         <xsd:sequence>
+            <xsd:element name="Spatial_Capabilities"
+                         type="ogc:Spatial_CapabilitiesType"/>
+            <xsd:element name="Scalar_Capabilities"
+                         type="ogc:Scalar_CapabilitiesType"/>
+            <xsd:element name="Id_Capabilities"
+                         type="ogc:Id_CapabilitiesType"/>
+         </xsd:sequence>
+      </xsd:complexType>
+   </xsd:element>
+   <xsd:complexType name="Spatial_CapabilitiesType">
+      <xsd:sequence>
+         <xsd:element name="GeometryOperands"
+                      type="ogc:GeometryOperandsType"/>
+         <xsd:element name="SpatialOperators"
+                      type="ogc:SpatialOperatorsType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="GeometryOperandsType">
+      <xsd:sequence>
+         <xsd:element name="GeometryOperand"
+                      type="ogc:GeometryOperandType" maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:simpleType name="GeometryOperandType">
+      <xsd:restriction base="xsd:QName">
+         <xsd:enumeration value="gml:Envelope"/>
+         <xsd:enumeration value="gml:Point"/>
+         <xsd:enumeration value="gml:LineString"/>
+         <xsd:enumeration value="gml:Polygon"/>
+         <xsd:enumeration value="gml:ArcByCenterPoint"/>
+         <xsd:enumeration value="gml:CircleByCenterPoint"/>
+         <xsd:enumeration value="gml:Arc"/>
+         <xsd:enumeration value="gml:Circle"/>
+         <xsd:enumeration value="gml:ArcByBulge"/>
+         <xsd:enumeration value="gml:Bezier"/>
+         <xsd:enumeration value="gml:Clothoid"/>
+         <xsd:enumeration value="gml:CubicSpline"/>
+         <xsd:enumeration value="gml:Geodesic"/>
+         <xsd:enumeration value="gml:OffsetCurve"/>
+         <xsd:enumeration value="gml:Triangle"/>
+         <xsd:enumeration value="gml:PolyhedralSurface"/>
+         <xsd:enumeration value="gml:TriangulatedSurface"/>
+         <xsd:enumeration value="gml:Tin"/>
+         <xsd:enumeration value="gml:Solid"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+   <xsd:complexType name="SpatialOperatorsType">
+      <xsd:sequence>
+         <xsd:element name="SpatialOperator"
+                      type="ogc:SpatialOperatorType"
+                      maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="SpatialOperatorType">
+      <xsd:sequence>
+         <xsd:element name="GeometryOperands"
+                      type="ogc:GeometryOperandsType"
+                      minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:attribute name="name" type="ogc:SpatialOperatorNameType"/>
+   </xsd:complexType>
+   <xsd:simpleType name="SpatialOperatorNameType">
+      <xsd:restriction base="xsd:string">
+         <xsd:enumeration value="BBOX"/>
+         <xsd:enumeration value="Equals"/>
+         <xsd:enumeration value="Disjoint"/>
+         <xsd:enumeration value="Intersects"/>
+         <xsd:enumeration value="Touches"/>
+         <xsd:enumeration value="Crosses"/>
+         <xsd:enumeration value="Within"/>
+         <xsd:enumeration value="Contains"/>
+         <xsd:enumeration value="Overlaps"/>
+         <xsd:enumeration value="Beyond"/>
+         <xsd:enumeration value="DWithin"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+   <xsd:complexType name="Scalar_CapabilitiesType">
+      <xsd:sequence>
+         <xsd:element ref="ogc:LogicalOperators"
+                      minOccurs="0" maxOccurs="1"/>
+         <xsd:element name="ComparisonOperators"
+                      type="ogc:ComparisonOperatorsType"
+                      minOccurs="0" maxOccurs="1"/>
+         <xsd:element name="ArithmeticOperators"
+                      type="ogc:ArithmeticOperatorsType"
+                      minOccurs="0" maxOccurs="1"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:element name="LogicalOperators">
+      <xsd:complexType/>
+   </xsd:element>
+   <xsd:complexType name="ComparisonOperatorsType">
+      <xsd:sequence maxOccurs="unbounded">
+         <xsd:element name="ComparisonOperator"
+                      type="ogc:ComparisonOperatorType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:simpleType name="ComparisonOperatorType">
+      <xsd:restriction base="xsd:string">
+         <xsd:enumeration value="LessThan"/>
+         <xsd:enumeration value="GreaterThan"/>
+         <xsd:enumeration value="LessThanEqualTo"/>
+         <xsd:enumeration value="GreaterThanEqualTo"/>
+         <xsd:enumeration value="EqualTo"/>
+         <xsd:enumeration value="NotEqualTo"/>
+         <xsd:enumeration value="Like"/>
+         <xsd:enumeration value="Between"/>
+         <xsd:enumeration value="NullCheck"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+   <xsd:complexType name="ArithmeticOperatorsType">
+      <xsd:choice maxOccurs="unbounded">
+         <xsd:element ref="ogc:SimpleArithmetic"/>
+         <xsd:element name="Functions" type="ogc:FunctionsType"/>
+      </xsd:choice>
+   </xsd:complexType>
+   <xsd:element name="SimpleArithmetic">
+      <xsd:complexType/>
+   </xsd:element>
+   <xsd:complexType name="FunctionsType">
+      <xsd:sequence>
+         <xsd:element name="FunctionNames" type="ogc:FunctionNamesType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="FunctionNamesType">
+      <xsd:sequence maxOccurs="unbounded">
+         <xsd:element name="FunctionName" type="ogc:FunctionNameType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="FunctionNameType">
+      <xsd:simpleContent>
+         <xsd:extension base="xsd:string">
+            <xsd:attribute name="nArgs" type="xsd:string" use="required"/>
+         </xsd:extension>
+      </xsd:simpleContent>
+   </xsd:complexType>
+   <xsd:complexType name="Id_CapabilitiesType">
+      <xsd:choice maxOccurs="unbounded">
+         <xsd:element ref="ogc:EID"/>
+         <xsd:element ref="ogc:FID"/>
+      </xsd:choice>
+   </xsd:complexType>
+   <xsd:element name="EID">
+      <xsd:complexType/>
+   </xsd:element>
+   <xsd:element name="FID">
+      <xsd:complexType/>
+   </xsd:element>
+</xsd:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/sort.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/sort.xsd
new file mode 100755
index 0000000..60d70b8
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/filter/1.1.0/sort.xsd
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema
+   targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.3">
+   <!-- 
+      filter is an OGC Standard.
+      Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium.
+      To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      
+      Updated: 2012-07-21
+   -->
+   <xsd:include schemaLocation="filterAll.xsd"/>
+   <xsd:include schemaLocation="expr.xsd"/>
+
+   <!-- ============================================= -->
+   <!-- SORTBY EXPRESSION                             -->
+   <!-- ============================================= -->
+   <xsd:element name="SortBy" type="ogc:SortByType"/>
+
+   <!-- ============================================= -->
+   <!-- COMPLEX TYPES                                 -->
+   <!-- ============================================= -->
+   <xsd:complexType name="SortByType">
+      <xsd:sequence>
+         <xsd:element name="SortProperty"
+                      type="ogc:SortPropertyType"
+                      maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="SortPropertyType">
+      <xsd:sequence>
+         <xsd:element ref="ogc:PropertyName"/>
+         <xsd:element name="SortOrder"
+                      type="ogc:SortOrderType"
+                      minOccurs="0"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:simpleType name="SortOrderType">
+      <xsd:restriction base="xsd:string">
+         <xsd:enumeration value="DESC"/>
+         <xsd:enumeration value="ASC"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+</xsd:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/basicTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/basicTypes.xsd
new file mode 100755
index 0000000..6aadb79
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/basicTypes.xsd
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2">
+  <annotation>
+    <appinfo source="urn:opengis:specification:gml:schema-xsd:basicTypes:3.1.1">basicTypes.xsd</appinfo>
+    <documentation>
+    Generic simpleContent components for use in GML
+    
+    GML is an OGC Standard.
+    Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+    </documentation>
+  </annotation>
+  <include schemaLocation="gml.xsd"/>
+  <!-- =========================================================== -->
+  <simpleType name="NullEnumeration">
+    <annotation>
+      <documentation> Some common reasons for a null value:   
+			
+        innapplicable - the object does not have a value
+        missing - The correct value is not readily available to the sender of this data.  
+                           Furthermore, a correct value may not exist.
+        template - the value will be available later
+        unknown - The correct value is not known to, and not computable by, the sender of this data. 
+                           However, a correct value probably exists.
+        withheld - the value is not divulged 
+        
+        other:reason - as indicated by "reason" string
+        
+        Specific communities may agree to assign more strict semantics when these terms are used in a particular context.  
+      </documentation>
+    </annotation>
+    <union>
+      <simpleType>
+        <restriction base="string">
+          <enumeration value="inapplicable"/>
+          <enumeration value="missing"/>
+          <enumeration value="template"/>
+          <enumeration value="unknown"/>
+          <enumeration value="withheld"/>
+        </restriction>
+      </simpleType>
+      <simpleType>
+        <restriction base="string">
+          <pattern value="other:\w{2,}"/>
+        </restriction>
+      </simpleType>
+    </union>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="NullType">
+    <annotation>
+      <documentation>Utility type for null elements.  The value may be selected from one of the enumerated tokens, or may be a URI in which case this should identify a resource which describes the reason for the null. </documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <element name="Null" type="gml:NullType"/>
+  <!-- ===================================================== -->
+  <simpleType name="SignType">
+    <annotation>
+      <documentation>Utility type used in various places 
+      - e.g. to indicate the direction of topological objects;
+      "+" for forwards, or "-" for backwards.</documentation>
+    </annotation>
+    <restriction base="string">
+      <enumeration value="-"/>
+      <enumeration value="+"/>
+    </restriction>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="booleanOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema boolean type and the GML Nulltype.  An element which uses this type may have content which is either a boolean {0,1,true,false} or a value from Nulltype</documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration boolean anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="booleanOrNullList">
+    <annotation>
+      <documentation>XML List based on the union type defined above.  An element declared with this type contains a space-separated list of boolean values {0,1,true,false} with null values interspersed as needed</documentation>
+    </annotation>
+    <list itemType="gml:booleanOrNull"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="booleanList">
+    <annotation>
+      <documentation>XML List based on XML Schema boolean type.  An element of this type contains a space-separated list of boolean values {0,1,true,false}</documentation>
+    </annotation>
+    <list itemType="boolean"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="stringOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema string type and the GML Nulltype.  An element which uses this type may have content which is either a string or a value from Nulltype.  Note that a "string" may contain whitespace.  </documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration string anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="NameOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema Name type and the GML Nulltype.  An element which uses this type may have content which is either a Name or a value from Nulltype.  Note that a "Name" may not contain whitespace.  </documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration Name anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="NameOrNullList">
+    <annotation>
+      <documentation>XML List based on the union type defined above.  An element declared with this type contains a space-separated list of Name values with null values interspersed as needed</documentation>
+    </annotation>
+    <list itemType="gml:NameOrNull"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="NameList">
+    <annotation>
+      <documentation>XML List based on XML Schema Name type.  An element of this type contains a space-separated list of Name values</documentation>
+    </annotation>
+    <list itemType="Name"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="doubleOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema double type and the GML Nulltype.  An element which uses this type may have content which is either a double or a value from Nulltype</documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration double anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="doubleOrNullList">
+    <annotation>
+      <documentation>XML List based on the union type defined above.  An element declared with this type contains a space-separated list of double values with null values interspersed as needed</documentation>
+    </annotation>
+    <list itemType="gml:doubleOrNull"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="doubleList">
+    <annotation>
+      <documentation>XML List based on XML Schema double type.  An element of this type contains a space-separated list of double values</documentation>
+    </annotation>
+    <list itemType="double"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="integerOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema integer type and the GML Nulltype.  An element which uses this type may have content which is either an integer or a value from Nulltype</documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration integer anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="integerOrNullList">
+    <annotation>
+      <documentation>XML List based on the union type defined above.  An element declared with this type contains a space-separated list of integer values with null values interspersed as needed</documentation>
+    </annotation>
+    <list itemType="gml:integerOrNull"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="integerList">
+    <annotation>
+      <documentation>XML List based on XML Schema integer type.  An element of this type contains a space-separated list of integer values</documentation>
+    </annotation>
+    <list itemType="integer"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <complexType name="CodeType">
+    <annotation>
+      <documentation>Name or code with an (optional) authority.  Text token.  
+      If the codeSpace attribute is present, then its value should identify a dictionary, thesaurus 
+      or authority for the term, such as the organisation who assigned the value, 
+      or the dictionary from which it is taken.  
+      A text string with an optional codeSpace attribute. </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="string">
+        <attribute name="codeSpace" type="anyURI" use="optional"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="CodeListType">
+    <annotation>
+      <documentation>List of values on a uniform nominal scale.  List of text tokens.   
+      In a list context a token should not include any spaces, so xsd:Name is used instead of xsd:string.   
+      If a codeSpace attribute is present, then its value is a reference to 
+      a Reference System for the value, a dictionary or code list.</documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="gml:NameList">
+        <attribute name="codeSpace" type="anyURI" use="optional"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="CodeOrNullListType">
+    <annotation>
+      <documentation>List of values on a uniform nominal scale.  List of text tokens.   
+      In a list context a token should not include any spaces, so xsd:Name is used instead of xsd:string.  
+      A member of the list may be a typed null.  
+      If a codeSpace attribute is present, then its value is a reference to 
+      a Reference System for the value, a dictionary or code list.</documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="gml:NameOrNullList">
+        <attribute name="codeSpace" type="anyURI" use="optional"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="MeasureType">
+    <annotation>
+      <documentation>Number with a scale.  
+      The value of uom (Units Of Measure) attribute is a reference to a Reference System for the amount, either a ratio or position scale. </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="double">
+        <attribute name="uom" type="anyURI" use="required"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="MeasureListType">
+    <annotation>
+      <documentation>List of numbers with a uniform scale.  
+      The value of uom (Units Of Measure) attribute is a reference to 
+      a Reference System for the amount, either a ratio or position scale. </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="gml:doubleList">
+        <attribute name="uom" type="anyURI" use="required"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="MeasureOrNullListType">
+    <annotation>
+      <documentation>List of numbers with a uniform scale.  
+      A member of the list may be a typed null. 
+      The value of uom (Units Of Measure) attribute is a reference to 
+      a Reference System for the amount, either a ratio or position scale. </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="gml:doubleOrNullList">
+        <attribute name="uom" type="anyURI" use="required"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="CoordinatesType">
+    <annotation>
+      <documentation>Tables or arrays of tuples.  
+        May be used for text-encoding of values from a table.  
+        Actually just a string, but allows the user to indicate which characters are used as separators.  
+        The value of the 'cs' attribute is the separator for coordinate values, 
+        and the value of the 'ts' attribute gives the tuple separator (a single space by default); 
+        the default values may be changed to reflect local usage.
+        Defaults to CSV within a tuple, space between tuples.  
+        However, any string content will be schema-valid.  </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="string">
+        <attribute name="decimal" type="string" default="."/>
+        <attribute name="cs" type="string" default=","/>
+        <attribute name="ts" type="string" default="&#x20;"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <simpleType name="NCNameList">
+    <annotation>
+      <documentation>A set of values, representing a list of token with the lexical value space of NCName. The tokens are seperated by whitespace.</documentation>
+    </annotation>
+    <list itemType="NCName"/>
+  </simpleType>
+  <!-- ============================================================== -->
+  <simpleType name="QNameList">
+    <annotation>
+      <documentation>A set of values, representing a list of token with the lexical value space of QName. The tokens are seperated by whitespace.</documentation>
+    </annotation>
+    <list itemType="QName"/>
+  </simpleType>
+  <!-- ============================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateOperations.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateOperations.xsd
new file mode 100755
index 0000000..d7b00fc
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateOperations.xsd
@@ -0,0 +1,790 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1.2" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:coordinateOperations:3.1.1"/>
+		<documentation>How to encode coordinate operation definitions. Builds on referenceSystems.xsd to encode the data needed to define coordinate operations, including Transformations, Conversions, and other specific subtypes of operations. 
+		
+		This schema encodes the Coordinate Operation (CC_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<include schemaLocation="dataQuality.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_CoordinateOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractCoordinateOperationBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for coordinate operation objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:coordinateOperationName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="coordinateOperationName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this coordinate operation is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="AbstractCoordinateOperationType" abstract="true">
+		<annotation>
+			<documentation>A mathematical operation on coordinates that transforms or converts coordinates to another coordinate reference system. Many but not all coordinate operations (from CRS A to CRS B) also uniquely define the inverse operation (from CRS B to CRS A). In some cases, the operation method algorithm for the inverse operation is the same as for the forward algorithm, but the signs of some operation parameter values must be reversed. In other cases, different algorithms are requi [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationBaseType">
+				<sequence>
+					<element ref="gml:coordinateOperationID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this coordinate operation. The first coordinateOperationID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this coordinate operation, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:operationVersion" minOccurs="0"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+					<element ref="gml:_positionalAccuracy" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered set of estimates of the impact of this coordinate operation on point position accuracy. Gives position error estimates for target coordinates of this coordinate operation, assuming no errors in source coordinates. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:sourceCRS" minOccurs="0"/>
+					<element ref="gml:targetCRS" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="coordinateOperationID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationVersion" type="string">
+		<annotation>
+			<documentation>Version of the coordinate transformation (i.e., instantiation due to the stochastic nature of the parameters). Mandatory when describing a transformation, and should not be supplied for a conversion. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="sourceCRS" type="gml:CRSRefType">
+		<annotation>
+			<documentation>Association to the source CRS (coordinate reference system) of this coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="targetCRS" type="gml:CRSRefType">
+		<annotation>
+			<documentation>Association to the target CRS (coordinate reference system) of this coordinate operation. For constraints on multiplicity of "sourceCRS" and "targetCRS", see UML model of Coordinate Operation package in OGC Abstract Specification topic 2. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="coordinateOperationRef" type="gml:CoordinateOperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateOperationRefType">
+		<annotation>
+			<documentation>Association to a coordinate operation, either referencing or containing the definition of that coordinate operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_CoordinateOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ConcatenatedOperation" type="gml:ConcatenatedOperationType" substitutionGroup="gml:_CoordinateOperation"/>
+	<!-- =================================================== -->
+	<complexType name="ConcatenatedOperationType">
+		<annotation>
+			<documentation>An ordered sequence of two or more single coordinate operations. The sequence of operations is constrained by the requirement that the source coordinate reference system of step (n+1) must be the same as the target coordinate reference system of step (n). The source coordinate reference system of the first step and the target coordinate reference system of the last step are the source and target coordinate reference system associated with the concatenated operation. Ins [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:usesSingleOperation" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of associations to the two or more single operations used by this concatenated operation. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesSingleOperation" type="gml:SingleOperationRefType">
+		<annotation>
+			<documentation>Association to a single operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="concatenatedOperationRef" type="gml:ConcatenatedOperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ConcatenatedOperationRefType">
+		<annotation>
+			<documentation>Association to a concatenated operation, either referencing or containing the definition of that concatenated operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ConcatenatedOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_SingleOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:_CoordinateOperation">
+		<annotation>
+			<documentation>A single (not concatenated) coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="singleOperationRef" type="gml:SingleOperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="SingleOperationRefType">
+		<annotation>
+			<documentation>Association to a single operation, either referencing or containing the definition of that single operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_SingleOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="PassThroughOperation" type="gml:PassThroughOperationType" substitutionGroup="gml:_SingleOperation"/>
+	<!-- =================================================== -->
+	<complexType name="PassThroughOperationType">
+		<annotation>
+			<documentation>A pass-through operation specifies that a subset of a coordinate tuple is subject to a specific coordinate operation. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:modifiedCoordinate" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of positive integers defining the positions in a coordinate tuple of the coordinates affected by this pass-through operation. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:usesOperation"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="modifiedCoordinate" type="positiveInteger">
+		<annotation>
+			<documentation>A positive integer defining a position in a coordinate tuple. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesOperation" type="gml:OperationRefType">
+		<annotation>
+			<documentation>Association to the operation applied to the specified ordinates. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="passThroughOperationRef" type="gml:PassThroughOperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="PassThroughOperationRefType">
+		<annotation>
+			<documentation>Association to a pass through operation, either referencing or containing the definition of that pass through operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PassThroughOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_Operation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:_SingleOperation">
+		<annotation>
+			<documentation>A parameterized mathematical operation on coordinates that transforms or converts coordinates to another coordinate reference system. This coordinate operation uses an operation method, usually with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type.
+
+This abstract complexType shall not be directly used, extended, or restricted in a compliant Application Schema. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationRef" type="gml:OperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="OperationRefType">
+		<annotation>
+			<documentation>Association to an abstract operation, either referencing or containing the definition of that operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Operation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="_GeneralConversion" type="gml:AbstractGeneralConversionType" abstract="true" substitutionGroup="gml:_Operation"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralConversionType" abstract="true">
+		<annotation>
+			<documentation>An abstract operation on coordinates that does not include any change of datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters.
+
+This abstract complexType is expected to be extended for well-known operation methods with many Conversion instances, in Application Schemas that define operation-method-specialized element names and contents. This conversion uses an operation method, usually with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to inclu [...]
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:coordinateOperationName"/>
+					<element ref="gml:coordinateOperationID" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+					<element ref="gml:_positionalAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="generalConversionRef" type="gml:GeneralConversionRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeneralConversionRefType">
+		<annotation>
+			<documentation>Association to a general conversion, either referencing or containing the definition of that conversion. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeneralConversion"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="Conversion" type="gml:ConversionType" substitutionGroup="gml:_GeneralConversion"/>
+	<!-- =================================================== -->
+	<complexType name="ConversionType">
+		<annotation>
+			<documentation>A concrete operation on coordinates that does not include any change of Datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters.
+
+This concrete complexType can be used with all operation methods, without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Conversion instance. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralConversionType">
+				<sequence>
+					<element ref="gml:usesMethod"/>
+					<element ref="gml:usesValue" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of composition associations to the set of parameter values used by this conversion operation. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesMethod" type="gml:OperationMethodRefType">
+		<annotation>
+			<documentation>Association to the operation method used by this coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesValue" type="gml:ParameterValueType">
+		<annotation>
+			<documentation>Composition association to a parameter value used by this coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="conversionRef" type="gml:ConversionRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ConversionRefType">
+		<annotation>
+			<documentation>Association to a concrete general-purpose conversion, either referencing or containing the definition of that conversion. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Conversion"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_GeneralTransformation" type="gml:AbstractGeneralTransformationType" abstract="true" substitutionGroup="gml:_Operation"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralTransformationType" abstract="true">
+		<annotation>
+			<documentation>An abstract operation on coordinates that usually includes a change of Datum. The parameters of a coordinate transformation are empirically derived from data containing the coordinates of a series of points in both coordinate reference systems. This computational process is usually "over-determined", allowing derivation of error (or accuracy) estimates for the transformation. Also, the stochastic nature of the parameters may result in multiple (different) versions of th [...]
+
+This abstract complexType is expected to be extended for well-known operation methods with many Transformation instances, in Application Schemas that define operation-method-specialized value element names and contents. This transformation uses an operation method with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to  [...]
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:coordinateOperationName"/>
+					<element ref="gml:coordinateOperationID" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:operationVersion"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+					<element ref="gml:_positionalAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:sourceCRS"/>
+					<element ref="gml:targetCRS"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="generalTransformationRef" type="gml:GeneralTransformationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeneralTransformationRefType">
+		<annotation>
+			<documentation>Association to a general transformation, either referencing or containing the definition of that transformation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeneralTransformation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="Transformation" type="gml:TransformationType" substitutionGroup="gml:_GeneralTransformation"/>
+	<!-- =================================================== -->
+	<complexType name="TransformationType">
+		<annotation>
+			<documentation>A concrete operation on coordinates that usually includes a change of datum. The parameters of a coordinate transformation are empirically derived from data containing the coordinates of a series of points in both coordinate reference systems. This computational process is usually "over-determined", allowing derivation of error (or accuracy) estimates for the transformation. Also, the stochastic nature of the parameters may result in multiple (different) versions of the [...]
+
+This concrete complexType can be used for all operation methods, without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Transformation instance. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralTransformationType">
+				<sequence>
+					<element ref="gml:usesMethod"/>
+					<element ref="gml:usesValue" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered set of composition associations to the set of parameter values used by this transformation operation. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="transformationRef" type="gml:TransformationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="TransformationRefType">
+		<annotation>
+			<documentation>Association to a transformation, either referencing or containing the definition of that transformation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Transformation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="_generalParameterValue" type="gml:AbstractGeneralParameterValueType" abstract="true"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralParameterValueType" abstract="true">
+		<annotation>
+			<documentation>Abstract parameter value or group of parameter values.
+			
+This abstract complexType is expected to be extended and restricted for well-known operation methods with many instances, in Application Schemas that define operation-method-specialized element names and contents. Specific parameter value elements are directly contained in concrete subtypes, not in this abstract type. All concrete types derived from this type shall extend this type to include one "...Value" element with an appropriate type, which should be one of the element types allowe [...]
+		</annotation>
+		<sequence/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="parameterValue" type="gml:ParameterValueType" substitutionGroup="gml:_generalParameterValue"/>
+	<!-- =================================================== -->
+	<complexType name="ParameterValueType">
+		<annotation>
+			<documentation>A parameter value, ordered sequence of values, or reference to a file of parameter values. This concrete complexType can be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one instance. This complexType can be used, extended, or restricted for well-known operation methods, especially for methods with many instances. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralParameterValueType">
+				<sequence>
+					<choice>
+						<element ref="gml:value"/>
+						<element ref="gml:dmsAngleValue"/>
+						<element ref="gml:stringValue"/>
+						<element ref="gml:integerValue"/>
+						<element ref="gml:booleanValue"/>
+						<element ref="gml:valueList"/>
+						<element ref="gml:integerValueList"/>
+						<element ref="gml:valueFile"/>
+					</choice>
+					<element ref="gml:valueOfParameter"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="value" type="gml:MeasureType">
+		<annotation>
+			<documentation>Numeric value of an operation parameter, with its associated unit of measure. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="dmsAngleValue" type="gml:DMSAngleType">
+		<annotation>
+			<documentation>Value of an angle operation parameter, in either degree-minute-second format or single value format. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="stringValue" type="string">
+		<annotation>
+			<documentation>String value of an operation parameter. A string value does not have an associated unit of measure. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="integerValue" type="positiveInteger">
+		<annotation>
+			<documentation>Positive integer value of an operation parameter, usually used for a count. An integer value does not have an associated unit of measure. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="booleanValue" type="boolean">
+		<annotation>
+			<documentation>Boolean value of an operation parameter. A Boolean value does not have an associated unit of measure. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="valueList" type="gml:MeasureListType">
+		<annotation>
+			<documentation>Ordered sequence of two or more numeric values of an operation parameter list, where each value has the same associated unit of measure. An element of this type contains a space-separated sequence of double values. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="integerValueList" type="gml:integerList">
+		<annotation>
+			<documentation>Ordered sequence of two or more integer values of an operation parameter list, usually used for counts. These integer values do not have an associated unit of measure. An element of this type contains a space-separated sequence of integer values. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="valueFile" type="anyURI">
+		<annotation>
+			<documentation>Reference to a file or a part of a file containing one or more parameter values, each numeric value with its associated unit of measure. When referencing a part of a file, that file must contain multiple identified parts, such as an XML encoded document. Furthermore, the referenced file or part of a file can reference another part of the same or different files, as allowed in XML documents. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="valueOfParameter" type="gml:OperationParameterRefType">
+		<annotation>
+			<documentation>Association to the operation parameter that this is a value of. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="parameterValueGroup" type="gml:ParameterValueGroupType" substitutionGroup="gml:_generalParameterValue"/>
+	<!-- =================================================== -->
+	<complexType name="ParameterValueGroupType">
+		<annotation>
+			<documentation>A group of related parameter values. The same group can be repeated more than once in a Conversion, Transformation, or higher level parameterValueGroup, if those instances contain different values of one or more parameterValues which suitably distinquish among those groups. This concrete complexType can be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only  [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralParameterValueType">
+				<sequence>
+					<element ref="gml:includesValue" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered set of composition associations to the parameter values and groups of values included in this group. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:valuesOfGroup"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="includesValue" type="gml:AbstractGeneralParameterValueType" substitutionGroup="gml:_generalParameterValue">
+		<annotation>
+			<documentation>A composition association to a parameter value or group of values included in this group. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="valuesOfGroup" type="gml:OperationParameterGroupRefType">
+		<annotation>
+			<documentation>Association to the operation parameter group for which this element provides parameter values. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="OperationMethod" type="gml:OperationMethodType" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="OperationMethodBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for operation method objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:methodName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="methodName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this operation method is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="OperationMethodType">
+		<annotation>
+			<documentation>Definition of an algorithm used to perform a coordinate operation. Most operation methods use a number of operation parameters, although some coordinate conversions use none. Each coordinate operation using the method assigns values to these parameters. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:OperationMethodBaseType">
+				<sequence>
+					<element ref="gml:methodID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this operation method. The first methodID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this operation method, including source information.</documentation>
+						</annotation>
+					</element>
+					<element ref="gml:methodFormula"/>
+					<element ref="gml:sourceDimensions"/>
+					<element ref="gml:targetDimensions"/>
+					<element ref="gml:usesParameter" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of associations to the set of operation parameters and parameter groups used by this operation method. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="methodID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of an operation method. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="methodFormula" type="gml:CodeType">
+		<annotation>
+			<documentation>Formula(s) used by this operation method. The value may be a reference to a publication. Note that the operation method may not be analytic, in which case this element references or contains the procedure, not an analytic formula.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="sourceDimensions" type="positiveInteger">
+		<annotation>
+			<documentation>Number of dimensions in the source CRS of this operation method. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="targetDimensions" type="positiveInteger">
+		<annotation>
+			<documentation>Number of dimensions in the target CRS of this operation method. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesParameter" type="gml:AbstractGeneralOperationParameterRefType">
+		<annotation>
+			<documentation>Association to an operation parameter or parameter group used by this operation method. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationMethodRef" type="gml:OperationMethodRefType"/>
+	<!-- =================================================== -->
+	<complexType name="OperationMethodRefType">
+		<annotation>
+			<documentation>Association to a concrete general-purpose operation method, either referencing or containing the definition of that method. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationMethod"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="_GeneralOperationParameter" type="gml:AbstractGeneralOperationParameterType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralOperationParameterType" abstract="true">
+		<annotation>
+			<documentation>Abstract definition of a parameter or group of parameters used by an operation method. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:minimumOccurs" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="minimumOccurs" type="nonNegativeInteger">
+		<annotation>
+			<documentation>The minimum number of times that values for this parameter group or parameter are required. If this attribute is omitted, the minimum number is one. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="abstractGeneralOperationParameterRef" type="gml:AbstractGeneralOperationParameterRefType"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralOperationParameterRefType">
+		<annotation>
+			<documentation>Association to an operation parameter or group, either referencing or containing the definition of that parameter or group. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeneralOperationParameter"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="OperationParameter" type="gml:OperationParameterType" substitutionGroup="gml:_GeneralOperationParameter"/>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for operation parameter objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractGeneralOperationParameterType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:parameterName"/>
+					<element ref="gml:minimumOccurs" minOccurs="0"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="parameterName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this operation parameter is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterType">
+		<annotation>
+			<documentation>The definition of a parameter used by an operation method. Most parameter values are numeric, but other types of parameter values are possible. This complexType is expected to be used or extended for all operation methods, without defining operation-method-specialized element names.  </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:OperationParameterBaseType">
+				<sequence>
+					<element ref="gml:parameterID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this operation parameter. The first parameterID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this operation parameter, including source information. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="parameterID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of an operation parameter. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationParameterRef" type="gml:OperationParameterRefType"/>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterRefType">
+		<annotation>
+			<documentation>Association to an operation parameter, either referencing or containing the definition of that parameter. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationParameter"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="OperationParameterGroup" type="gml:OperationParameterGroupType" substitutionGroup="gml:_GeneralOperationParameter"/>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterGroupBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for operation parameter group objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractGeneralOperationParameterType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:groupName"/>
+					<element ref="gml:minimumOccurs" minOccurs="0"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="groupName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this operation parameter group is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterGroupType">
+		<annotation>
+			<documentation>The definition of a group of parameters used by an operation method. This complexType is expected to be used or extended for all applicable operation methods, without defining operation-method-specialized element names.  </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:OperationParameterGroupBaseType">
+				<sequence>
+					<element ref="gml:groupID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this operation parameter group. The first groupID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this operation parameter group, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:maximumOccurs" minOccurs="0"/>
+					<element ref="gml:includesParameter" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of associations to the set of operation parameters that are members of this group. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="groupID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of an operation parameter group. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="maximumOccurs" type="positiveInteger">
+		<annotation>
+			<documentation>The maximum number of times that values for this parameter group can be included. If this attribute is omitted, the maximum number is one. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="includesParameter" type="gml:AbstractGeneralOperationParameterRefType">
+		<annotation>
+			<documentation>Association to an operation parameter that is a member of a group. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationParameterGroupRef" type="gml:OperationParameterRefType"/>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterGroupRefType">
+		<annotation>
+			<documentation>Association to an operation parameter, either referencing or containing the definition of that parameter. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationParameterGroup"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateReferenceSystems.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateReferenceSystems.xsd
new file mode 100755
index 0000000..1e0abc5
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateReferenceSystems.xsd
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:coordinateReferenceSystems:3.1.1"/>
+		<documentation>How to encode coordinate reference system definitions. Builds on referenceSystems.xsd to encode the data needed to define coordinate reference systems, including the specific subtypes of coordinate reference systems. 
+		This schema encodes the Coordinate Reference System (SC_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates, with the exception of the abstract "SC_CRS" class. The "SC_CRS" class is encoded in referenceSystems.xsd, to eliminate the (circular) references from coordinateOperations.xsd to coordinateReferenceSystems.xsd. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111. 
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="coordinateSystems.xsd"/>
+	<include schemaLocation="datums.xsd"/>
+	<include schemaLocation="coordinateOperations.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_CoordinateReferenceSystem" type="gml:AbstractReferenceSystemType" abstract="true" substitutionGroup="gml:_CRS">
+		<annotation>
+			<documentation>A coordinate reference system consists of an ordered sequence of coordinate system axes that are related to the earth through a datum. A coordinate reference system is defined by one datum and by one coordinate system. Most coordinate reference system do not move relative to the earth, except for engineering coordinate reference systems defined on moving platforms such as cars, ships, aircraft, and spacecraft. For further information, see OGC Abstract Specification Topic 2.
+
+Coordinate reference systems are commonly divided into sub-types. The common classification criterion for sub-typing of coordinate reference systems is the way in which they deal with earth curvature. This has a direct effect on the portion of the earth's surface that can be covered by that type of CRS with an acceptable degree of error. The exception to the rule is the subtype "Temporal" which has been added by analogy. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="coordinateReferenceSystemRef" type="gml:CoordinateReferenceSystemRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateReferenceSystemRefType">
+		<annotation>
+			<documentation>Association to a coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_CoordinateReferenceSystem"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="CompoundCRS" type="gml:CompoundCRSType" substitutionGroup="gml:_CRS"/>
+	<!-- =================================================== -->
+	<complexType name="CompoundCRSType">
+		<annotation>
+			<documentation>A coordinate reference system describing the position of points through two or more independent coordinate reference systems. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:includesCRS" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of associations to all the component coordinate reference systems included in this compound coordinate reference system. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="includesCRS" type="gml:CoordinateReferenceSystemRefType">
+		<annotation>
+			<documentation>An association to a component coordinate reference system included in this compound coordinate reference system. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="compoundCRSRef" type="gml:CompoundCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CompoundCRSRefType">
+		<annotation>
+			<documentation>Association to a compound coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CompoundCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="GeographicCRS" type="gml:GeographicCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="GeographicCRSType">
+		<annotation>
+			<documentation>A coordinate reference system based on an ellipsoidal approximation of the geoid; this provides an accurate representation of the geometry of geographic features for a large portion of the earth's surface.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:usesEllipsoidalCS"/>
+					<element ref="gml:usesGeodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesEllipsoidalCS" type="gml:EllipsoidalCSRefType">
+		<annotation>
+			<documentation>Association to the ellipsoidal coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesGeodeticDatum" type="gml:GeodeticDatumRefType">
+		<annotation>
+			<documentation>Association to the geodetic datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="geographicCRSRef" type="gml:GeographicCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeographicCRSRefType">
+		<annotation>
+			<documentation>Association to a geographic coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeographicCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="VerticalCRS" type="gml:VerticalCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalCRSType">
+		<annotation>
+			<documentation>A 1D coordinate reference system used for recording heights or depths. Vertical CRSs make use of the direction of gravity to define the concept of height or depth, but the relationship with gravity may not be straightforward. By implication, ellipsoidal heights (h) cannot be captured in a vertical coordinate reference system. Ellipsoidal heights cannot exist independently, but only as an inseparable part of a 3D coordinate tuple defined in a geographic 3D coordinate ref [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:usesVerticalCS"/>
+					<element ref="gml:usesVerticalDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesVerticalCS" type="gml:VerticalCSRefType">
+		<annotation>
+			<documentation>Association to the vertical coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesVerticalDatum" type="gml:VerticalDatumRefType">
+		<annotation>
+			<documentation>Association to the vertical datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="verticalCRSRef" type="gml:VerticalCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalCRSRefType">
+		<annotation>
+			<documentation>Association to a vertical coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="GeocentricCRS" type="gml:GeocentricCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="GeocentricCRSType">
+		<annotation>
+			<documentation>A 3D coordinate reference system with the origin at the approximate centre of mass of the earth. A geocentric CRS deals with the earth's curvature by taking a 3D spatial view, which obviates the need to model the earth's curvature. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<choice>
+						<element ref="gml:usesCartesianCS"/>
+						<element ref="gml:usesSphericalCS"/>
+					</choice>
+					<element ref="gml:usesGeodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesCartesianCS" type="gml:CartesianCSRefType">
+		<annotation>
+			<documentation>Association to the Cartesian coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesSphericalCS" type="gml:SphericalCSRefType">
+		<annotation>
+			<documentation>Association to the spherical coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="geocentricCRSRef" type="gml:GeocentricCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeocentricCRSRefType">
+		<annotation>
+			<documentation>Association to a geocentric coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeocentricCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_GeneralDerivedCRS" type="gml:AbstractGeneralDerivedCRSType" abstract="true" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralDerivedCRSType" abstract="true">
+		<annotation>
+			<documentation>A coordinate reference system that is defined by its coordinate conversion from another coordinate reference system (not by a datum). This abstract complexType shall not be used, extended, or restricted, in an Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:baseCRS"/>
+					<element ref="gml:definedByConversion"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="baseCRS" type="gml:CoordinateReferenceSystemRefType">
+		<annotation>
+			<documentation>Association to the coordinate reference system used by this derived CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="definedByConversion" type="gml:GeneralConversionRefType">
+		<annotation>
+			<documentation>Association to the coordinate conversion used to define this derived CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="ProjectedCRS" type="gml:ProjectedCRSType" substitutionGroup="gml:_GeneralDerivedCRS"/>
+	<!-- =================================================== -->
+	<complexType name="ProjectedCRSType">
+		<annotation>
+			<documentation>A 2D coordinate reference system used to approximate the shape of the earth on a planar surface, but in such a way that the distortion that is inherent to the approximation is carefully controlled and known. Distortion correction is commonly applied to calculated bearings and distances to produce values that are a close match to actual field values. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralDerivedCRSType">
+				<sequence>
+					<element ref="gml:usesCartesianCS"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="projectedCRSRef" type="gml:ProjectedCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ProjectedCRSRefType">
+		<annotation>
+			<documentation>Association to a projected coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ProjectedCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="DerivedCRS" type="gml:DerivedCRSType" substitutionGroup="gml:_GeneralDerivedCRS"/>
+	<!-- =================================================== -->
+	<complexType name="DerivedCRSType">
+		<annotation>
+			<documentation>A coordinate reference system that is defined by its coordinate conversion from another coordinate reference system but is not a projected coordinate reference system. This category includes coordinate reference systems derived from a projected coordinate reference system. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralDerivedCRSType">
+				<sequence>
+					<element ref="gml:derivedCRSType"/>
+					<element ref="gml:usesCS"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="derivedCRSType" type="gml:DerivedCRSTypeType"/>
+	<!-- =================================================== -->
+	<complexType name="DerivedCRSTypeType">
+		<annotation>
+			<documentation>Type of a derived coordinate reference system. </documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeType">
+				<attribute name="codeSpace" type="anyURI" use="required">
+					<annotation>
+						<documentation>Reference to a source of information specifying the values and meanings of all the allowed string values for this DerivedCRSTypeType. </documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesCS" type="gml:CoordinateSystemRefType">
+		<annotation>
+			<documentation>Association to the coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="derivedCRSRef" type="gml:DerivedCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="DerivedCRSRefType">
+		<annotation>
+			<documentation>Association to a non-projected derived coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:DerivedCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="EngineeringCRS" type="gml:EngineeringCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="EngineeringCRSType">
+		<annotation>
+			<documentation>A contextually local coordinate reference system; which can be divided into two broad categories:
+- earth-fixed systems applied to engineering activities on or near the surface of the earth;
+- CRSs on moving platforms such as road vehicles, vessels, aircraft, or spacecraft.
+For further information, see OGC Abstract Specification Topic 2. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:usesCS"/>
+					<element ref="gml:usesEngineeringDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesEngineeringDatum" type="gml:EngineeringDatumRefType">
+		<annotation>
+			<documentation>Association to the engineering datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="engineeringCRSRef" type="gml:EngineeringCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="EngineeringCRSRefType">
+		<annotation>
+			<documentation>Association to an engineering coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EngineeringCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ImageCRS" type="gml:ImageCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="ImageCRSType">
+		<annotation>
+			<documentation>An engineering coordinate reference system applied to locations in images. Image coordinate reference systems are treated as a separate sub-type because a separate user community exists for images with its own terms of reference. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<choice>
+						<element ref="gml:usesCartesianCS"/>
+						<element ref="gml:usesObliqueCartesianCS"/>
+					</choice>
+					<element ref="gml:usesImageDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesObliqueCartesianCS" type="gml:ObliqueCartesianCSRefType">
+		<annotation>
+			<documentation>Association to the oblique Cartesian coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesImageDatum" type="gml:ImageDatumRefType">
+		<annotation>
+			<documentation>Association to the image datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="imageCRSRef" type="gml:ImageCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ImageCRSRefType">
+		<annotation>
+			<documentation>Association to an image coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ImageCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="TemporalCRS" type="gml:TemporalCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalCRSType">
+		<annotation>
+			<documentation>A 1D coordinate reference system used for the recording of time. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:usesTemporalCS"/>
+					<element ref="gml:usesTemporalDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesTemporalCS" type="gml:TemporalCSRefType">
+		<annotation>
+			<documentation>Association to the temporal coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesTemporalDatum" type="gml:TemporalDatumRefType">
+		<annotation>
+			<documentation>Association to the temporal datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="temporalCRSRef" type="gml:TemporalCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalCRSRefType">
+		<annotation>
+			<documentation>Association to a temporal coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateSystems.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateSystems.xsd
new file mode 100755
index 0000000..12fc670
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coordinateSystems.xsd
@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1.2" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:coordinateSystems:3.1.1"/>
+		<documentation>How to encode coordinate system definitions. Builds on referenceSystems.xsd to encode the data needed to define coordinate systems, including the specific subtypes of coordinate systems. 
+		This schema encodes the Coordinate System (CS_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="CoordinateSystemAxis" type="gml:CoordinateSystemAxisType" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateSystemAxisBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for coordinate system axis objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:name">
+						<annotation>
+							<documentation>The name by which this coordinate system axis is identified. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<complexType name="CoordinateSystemAxisType">
+		<annotation>
+			<documentation>Definition of a coordinate system axis. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:CoordinateSystemAxisBaseType">
+				<sequence>
+					<element ref="gml:axisID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this coordinate system axis. The first axisID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this coordinate system axis, including data source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:axisAbbrev"/>
+					<element ref="gml:axisDirection"/>
+				</sequence>
+				<attribute ref="gml:uom" use="required"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="axisID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a coordinate system axis. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="axisAbbrev" type="gml:CodeType">
+		<annotation>
+			<documentation>The abbreviation used for this coordinate system axis. This abbreviation can be used to identify the ordinates in a coordinate tuple. Examples are X and Y. The codeSpace attribute can reference a source of more information on a set of standardized abbreviations, or on this abbreviation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="axisDirection" type="gml:CodeType">
+		<annotation>
+			<documentation>Direction of this coordinate system axis (or in the case of Cartesian projected coordinates, the direction of this coordinate system axis at the origin). Examples: north or south, east or west, up or down. Within any set of coordinate system axes, only one of each pair of terms can be used. For earth-fixed CRSs, this direction is often approximate and intended to provide a human interpretable meaning to the axis. When a geodetic datum is used, the precise directions of  [...]
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<attribute name="uom" type="anyURI">
+		<annotation>
+			<documentation>Identifier of the unit of measure used for this coordinate system axis. The value of this coordinate in a coordinate tuple shall be recorded using this unit of measure, whenever those coordinates use a coordinate reference system that uses a coordinate system that uses this axis.</documentation>
+		</annotation>
+	</attribute>
+	<!-- =================================================== -->
+	<element name="coordinateSystemAxisRef" type="gml:CoordinateSystemAxisRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateSystemAxisRefType">
+		<annotation>
+			<documentation>Association to a coordinate system axis, either referencing or containing the definition of that axis. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CoordinateSystemAxis"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="_CoordinateSystem" type="gml:AbstractCoordinateSystemType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractCoordinateSystemBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for coordinate system objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:csName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="csName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this coordinate system is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="AbstractCoordinateSystemType" abstract="true">
+		<annotation>
+			<documentation>A coordinate system (CS) is the set of coordinate system axes that spans a given coordinate space. A CS is derived from a set of (mathematical) rules for specifying how coordinates in a given space are to be assigned to points. The coordinate values in a coordinate tuple shall be recorded in the order in which the coordinate system axes associations are recorded, whenever those coordinates use a coordinate reference system that uses this coordinate system. This abstract [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemBaseType">
+				<sequence>
+					<element ref="gml:csID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this coordinate system. The first csID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this coordinate system, including data source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:usesAxis" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of associations to the coordinate system axes included in this coordinate system. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="csID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a coordinate system. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesAxis" type="gml:CoordinateSystemAxisRefType">
+		<annotation>
+			<documentation>Association to a coordinate system axis. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="coordinateSystemRef" type="gml:CoordinateSystemRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateSystemRefType">
+		<annotation>
+			<documentation>Association to a coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_CoordinateSystem"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="EllipsoidalCS" type="gml:EllipsoidalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidalCSType">
+		<annotation>
+			<documentation>A two- or three-dimensional coordinate system in which position is specified by geodetic latitude, geodetic longitude, and (in the three-dimensional case) ellipsoidal height. An EllipsoidalCS shall have two or three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ellipsoidalCSRef" type="gml:EllipsoidalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidalCSRefType">
+		<annotation>
+			<documentation>Association to an ellipsoidal coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EllipsoidalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="CartesianCS" type="gml:CartesianCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="CartesianCSType">
+		<annotation>
+			<documentation>A 1-, 2-, or 3-dimensional coordinate system. Gives the position of points relative to orthogonal straight axes in the 2- and 3-dimensional cases. In the 1-dimensional case, it contains a single straight coordinate axis. In the multi-dimensional case, all axes shall have the same length unit of measure. A CartesianCS shall have one, two, or three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="cartesianCSRef" type="gml:CartesianCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CartesianCSRefType">
+		<annotation>
+			<documentation>Association to a Cartesian coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CartesianCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="VerticalCS" type="gml:VerticalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalCSType">
+		<annotation>
+			<documentation>A one-dimensional coordinate system used to record the heights (or depths) of points. Such a coordinate system is usually dependent on the Earth's gravity field, perhaps loosely as when atmospheric pressure is the basis for the vertical coordinate system axis. A VerticalCS shall have one usesAxis association. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="verticalCSRef" type="gml:VerticalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalCSRefType">
+		<annotation>
+			<documentation>Association to a vertical coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="TemporalCS" type="gml:TemporalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalCSType">
+		<annotation>
+			<documentation>A one-dimensional coordinate system containing a single time axis, used to describe the temporal position of a point in the specified time units from a specified time origin. A TemporalCS shall have one usesAxis association. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="temporalCSRef" type="gml:TemporalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalCSRefType">
+		<annotation>
+			<documentation>Association to a temporal coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="LinearCS" type="gml:LinearCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="LinearCSType">
+		<annotation>
+			<documentation>A one-dimensional coordinate system that consists of the points that lie on the single axis described. The associated ordinate is the distance from the specified origin to the point along the axis. Example: usage of the line feature representing a road to describe points on or along that road. A LinearCS shall have one usesAxis association. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="linearCSRef" type="gml:LinearCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="LinearCSRefType">
+		<annotation>
+			<documentation>Association to a linear coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:LinearCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="UserDefinedCS" type="gml:UserDefinedCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="UserDefinedCSType">
+		<annotation>
+			<documentation>A two- or three-dimensional coordinate system that consists of any combination of coordinate axes not covered by any other coordinate system type. An example is a multilinear coordinate system which contains one coordinate axis that may have any 1-D shape which has no intersections with itself. This non-straight axis is supplemented by one or two straight axes to complete a 2 or 3 dimensional coordinate system. The non-straight axis is typically incrementally straight o [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="userDefinedCSRef" type="gml:UserDefinedCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="UserDefinedCSRefType">
+		<annotation>
+			<documentation>Association to a user-defined coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:UserDefinedCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="SphericalCS" type="gml:SphericalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="SphericalCSType">
+		<annotation>
+			<documentation>A three-dimensional coordinate system with one distance measured from the origin and two angular coordinates. Not to be confused with an ellipsoidal coordinate system based on an ellipsoid "degenerated" into a sphere. A SphericalCS shall have three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="sphericalCSRef" type="gml:SphericalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="SphericalCSRefType">
+		<annotation>
+			<documentation>Association to a spherical coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:SphericalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="PolarCS" type="gml:PolarCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="PolarCSType">
+		<annotation>
+			<documentation>A two-dimensional coordinate system in which position is specified by the distance from the origin and the angle between the line from the origin to a point and a reference direction. A PolarCS shall have two usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="polarCSRef" type="gml:PolarCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="PolarCSRefType">
+		<annotation>
+			<documentation>Association to a polar coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PolarCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="CylindricalCS" type="gml:CylindricalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="CylindricalCSType">
+		<annotation>
+			<documentation>A three-dimensional coordinate system consisting of a polar coordinate system extended by a straight coordinate axis perpendicular to the plane spanned by the polar coordinate system. A CylindricalCS shall have three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="cylindricalCSRef" type="gml:CylindricalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CylindricalCSRefType">
+		<annotation>
+			<documentation>Association to a cylindrical coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CylindricalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ObliqueCartesianCS" type="gml:ObliqueCartesianCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="ObliqueCartesianCSType">
+		<annotation>
+			<documentation>A two- or three-dimensional coordinate system with straight axes that are not necessarily orthogonal. An ObliqueCartesianCS shall have two or three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="obliqueCartesianCSRef" type="gml:ObliqueCartesianCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ObliqueCartesianCSRefType">
+		<annotation>
+			<documentation>Association to an oblique-Cartesian coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ObliqueCartesianCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coverage.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coverage.xsd
new file mode 100755
index 0000000..4590432
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/coverage.xsd
@@ -0,0 +1,452 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:coverage:3.1.1">coverage.xsd</appinfo>
+		<documentation xml:lang="en">GML Coverage schema.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="valueObjects.xsd"/>
+	<include schemaLocation="grids.xsd"/>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<!-- ==============================================================
+       global types and elements
+	============================================================== -->
+	<!-- ================= Abstract coverage definition ================== -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_Coverage" type="gml:AbstractCoverageType" abstract="true" substitutionGroup="gml:_Feature"/>
+	<!-- =========================================================== -->
+	<complexType name="AbstractCoverageType" abstract="true">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group for coverages. Note that a coverage is a GML feature.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:domainSet"/>
+					<element ref="gml:rangeSet"/>
+				</sequence>
+				<attribute name="dimension" type="positiveInteger" use="optional"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="_ContinuousCoverage" type="gml:AbstractContinuousCoverageType" abstract="true" substitutionGroup="gml:_Coverage"/>
+	<!-- =========================================================== -->
+	<complexType name="AbstractContinuousCoverageType" abstract="true">
+		<annotation>
+			<documentation>A continuous coverage as defined in ISO 19123 is a coverage that can return different values for the same feature attribute at different direct positions within a single spatiotemporal object in its spatiotemporal domain</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoverageType">
+				<sequence>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="_DiscreteCoverage" type="gml:AbstractDiscreteCoverageType" abstract="true" substitutionGroup="gml:_Coverage"/>
+	<!-- =========================================================== -->
+	<complexType name="AbstractDiscreteCoverageType" abstract="true">
+		<annotation>
+			<documentation>A discrete coverage consists of a domain set, range set and optionally a coverage function. The domain set consists of either geometry or temporal objects, finite in number. The range set is comprised of a finite number of attribute values each of which is associated to every direct position within any single spatiotemporal object in the domain. In other words, the range values are constant on each spatiotemporal object in the domain. This coverage function maps each el [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoverageType">
+				<sequence>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="domainSet" type="gml:DomainSetType"/>
+	<!-- =========================================================== -->
+	<complexType name="DomainSetType">
+		<annotation>
+			<documentation>The spatiotemporal domain of a coverage.  
+  Typically 
+  * a geometry collection, 
+  * an implicit geometry (e.g. a grid), 
+  * an explicit or implicit collection of time instances or periods, or
+
+N.B. Temporal geometric complexes and temporal grids are not yet implemented in GML.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:_Geometry"/>
+				<element ref="gml:_TimeObject"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="rangeSet" type="gml:RangeSetType"/>
+	<!-- =========================================================== -->
+	<complexType name="RangeSetType">
+		<choice>
+			<element ref="gml:ValueArray" maxOccurs="unbounded">
+				<annotation>
+					<documentation>each member _Value holds a tuple or "row" from the equivalent table</documentation>
+				</annotation>
+			</element>
+			<group ref="gml:ScalarValueList" maxOccurs="unbounded">
+				<annotation>
+					<documentation>each list holds the complete set of one scalar component from the values - i.e. a "column" from the equivalent table</documentation>
+				</annotation>
+			</group>
+			<element ref="gml:DataBlock">
+				<annotation>
+					<documentation>Its tuple list holds the values as space-separated tuples each of which contains comma-separated components, and the tuple structure is specified using the rangeParameters property.</documentation>
+				</annotation>
+			</element>
+			<element ref="gml:File">
+				<annotation>
+					<documentation>a reference to an external source for the data, together with a description of how that external source is structured</documentation>
+				</annotation>
+			</element>
+		</choice>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="coverageFunction" type="gml:CoverageFunctionType"/>
+	<!-- =========================================================== -->
+	<complexType name="CoverageFunctionType">
+		<annotation>
+			<documentation>The function or rule which defines the map from members of the domainSet to the range.  
+      More functions will be added to this list</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:MappingRule"/>
+			<element ref="gml:GridFunction"/>
+		</choice>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- ============== Components for encoding the rangeSet ============= -->
+	<!-- =========================================================== -->
+	<element name="DataBlock" type="gml:DataBlockType"/>
+	<!-- =========================================================== -->
+	<complexType name="DataBlockType">
+		<sequence>
+			<element ref="gml:rangeParameters"/>
+			<choice>
+				<element ref="gml:tupleList"/>
+				<element ref="gml:doubleOrNullTupleList"/>
+			</choice>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="tupleList" type="gml:CoordinatesType"/>
+	<!-- =========================================================== -->
+	<element name="doubleOrNullTupleList" type="gml:doubleOrNullList"/>
+	<!-- =========================================================== -->
+	<element name="File" type="gml:FileType"/>
+	<!-- =========================================================== -->
+	<complexType name="FileType">
+		<sequence>
+			<element ref="gml:rangeParameters"/>
+			<element name="fileName" type="anyURI"/>
+			<element name="fileStructure" type="gml:FileValueModelType"/>
+			<element name="mimeType" type="anyURI" minOccurs="0"/>
+			<element name="compression" type="anyURI" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="FileValueModelType">
+		<annotation>
+			<documentation>List of codes that identifies the file structure model for records stored in files.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="Record Interleaved"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="rangeParameters" type="gml:RangeParametersType"/>
+	<!-- =========================================================== -->
+	<complexType name="RangeParametersType">
+		<annotation>
+			<documentation>Metadata about the rangeSet.  Definition of record structure.   
+      This is required if the rangeSet is encoded in a DataBlock.  
+      We use a gml:_Value with empty values as a map of the composite value structure.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<group ref="gml:ValueObject"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- ============= Components for coverageFunctions ================ -->
+	<!-- =========================================================== -->
+	<element name="MappingRule" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Description of a rule for associating members from the domainSet with members of the rangeSet.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="GridFunction" type="gml:GridFunctionType"/>
+	<!-- =========================================================== -->
+	<complexType name="GridFunctionType">
+		<annotation>
+			<documentation>Defines how values in the domain are mapped to the range set. The start point and the sequencing rule are specified here.</documentation>
+		</annotation>
+		<sequence>
+			<element name="sequenceRule" type="gml:SequenceRuleType" minOccurs="0">
+				<annotation>
+					<documentation>If absent, the implied value is "Linear".</documentation>
+				</annotation>
+			</element>
+			<element name="startPoint" type="gml:integerList" minOccurs="0">
+				<annotation>
+					<documentation>Index position of the first grid post, which must lie somwhere in the GridEnvelope.  If absent, the startPoint is equal to the value of gridEnvelope::low from the grid definition.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="IndexMap" type="gml:IndexMapType" substitutionGroup="gml:GridFunction"/>
+	<!-- =========================================================== -->
+	<complexType name="IndexMapType">
+		<annotation>
+			<documentation>Exends GridFunctionType with a lookUpTable.  This contains a list of indexes of members within the rangeSet corresponding with the members of the domainSet.  The domainSet is traversed in list order if it is enumerated explicitly, or in the order specified by a SequenceRule if the domain is an implicit set.    The length of the lookUpTable corresponds with the length of the subset of the domainSet for which the coverage is defined.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:GridFunctionType">
+				<sequence>
+					<element name="lookUpTable" type="gml:integerList"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="SequenceRuleType">
+		<simpleContent>
+			<extension base="gml:SequenceRuleNames">
+				<attribute name="order" type="gml:IncrementOrder" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="SequenceRuleNames">
+		<annotation>
+			<documentation>List of codes (adopted from ISO 19123 Annex C) that identifies the rule for traversing a grid to correspond with the sequence of members of the rangeSet.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="Linear"/>
+			<enumeration value="Boustrophedonic"/>
+			<enumeration value="Cantor-diagonal"/>
+			<enumeration value="Spiral"/>
+			<enumeration value="Morton"/>
+			<enumeration value="Hilbert"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="IncrementOrder">
+		<annotation>
+			<documentation>The enumeration value here indicates the incrementation order  to be used on the first 2 axes, i.e. "+x-y" means that the points on the first axis are to be traversed from lowest to highest and  the points on the second axis are to be traversed from highest to lowest. The points on all other axes (if any) beyond the first 2 are assumed to increment from lowest to highest.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="+x+y"/>
+			<enumeration value="+y+x"/>
+			<enumeration value="+x-y"/>
+			<enumeration value="-x-y"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<!-- == Specialised Coverage types - typed by the structure of the domain set == -->
+	<!-- =========================================================== -->
+	<element name="MultiPointCoverage" type="gml:MultiPointCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiPointCoverageType">
+		<annotation>
+			<documentation>A discrete coverage type whose domain is defined by a collection of point</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiPointDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiPointDomain" type="gml:MultiPointDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiPointDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiPoint"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiCurveCoverage" type="gml:MultiCurveCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiCurveCoverageType">
+		<annotation>
+			<documentation>A discrete coverage type whose domain is defined by a collection of curves.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiCurveDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiCurveDomain" type="gml:MultiCurveDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiCurveDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiCurve"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiSurfaceCoverage" type="gml:MultiSurfaceCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiSurfaceCoverageType">
+		<annotation>
+			<documentation>A discrete coverage type whose domain is defined by a collection of surface patches (includes polygons, triangles, rectangles, etc).</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiSurfaceDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiSurfaceDomain" type="gml:MultiSurfaceDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiSurfaceDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiSurface"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiSolidCoverage" type="gml:MultiSolidCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiSolidCoverageType">
+		<annotation>
+			<documentation>A discrete coverage type whose domain is defined by a collection of Solids.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiSolidDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiSolidDomain" type="gml:MultiSolidDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiSolidDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiSolid"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="GridCoverage" type="gml:GridCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="GridCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:gridDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="gridDomain" type="gml:GridDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="GridDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:Grid"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="RectifiedGridCoverage" type="gml:RectifiedGridCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="RectifiedGridCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:rectifiedGridDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="rectifiedGridDomain" type="gml:RectifiedGridDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="RectifiedGridDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:RectifiedGrid"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dataQuality.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dataQuality.xsd
new file mode 100755
index 0000000..6b56f73
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dataQuality.xsd
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1.2" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:dataQuality:3.1.1"/>
+		<documentation>How to encode positional data quality information. Builds on units.xsd to encode the data needed to describe the positional accuracy of coordinate operations. 
+		This schema encodes the Data Quality (DQ) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111. 
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="units.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_positionalAccuracy" type="gml:AbstractPositionalAccuracyType" abstract="true"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractPositionalAccuracyType" abstract="true">
+		<annotation>
+			<documentation>Position error estimate (or accuracy) data. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:measureDescription" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="measureDescription" type="gml:CodeType">
+		<annotation>
+			<documentation>A description of the position accuracy parameter(s) provided. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="absoluteExternalPositionalAccuracy" type="gml:AbsoluteExternalPositionalAccuracyType" substitutionGroup="gml:_positionalAccuracy"/>
+	<!-- =================================================== -->
+	<complexType name="AbsoluteExternalPositionalAccuracyType">
+		<annotation>
+			<documentation>Closeness of reported coordinate values to values accepted as or being true. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractPositionalAccuracyType">
+				<sequence>
+					<element ref="gml:result"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="relativeInternalPositionalAccuracy" type="gml:RelativeInternalPositionalAccuracyType" substitutionGroup="gml:_positionalAccuracy"/>
+	<!-- =================================================== -->
+	<complexType name="RelativeInternalPositionalAccuracyType">
+		<annotation>
+			<documentation>Closeness of the relative positions of two or more positions to their respective relative positions accepted as or being true. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractPositionalAccuracyType">
+				<sequence>
+					<element ref="gml:result"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="result" type="gml:MeasureType">
+		<annotation>
+			<documentation>A quantitative result defined by the evaluation procedure used, and identified by the measureDescription. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="covarianceMatrix" type="gml:CovarianceMatrixType" substitutionGroup="gml:_positionalAccuracy"/>
+	<!-- =================================================== -->
+	<complexType name="CovarianceMatrixType">
+		<annotation>
+			<documentation>Error estimate covariance matrix. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractPositionalAccuracyType">
+				<sequence>
+					<element ref="gml:unitOfMeasure" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of units of measure, corresponding to the row and column index numbers of the covariance matrix, starting with row and column 1 and ending with row/column N. Each unit of measure is for the ordinate reflected in the relevant row and column of the covariance matrix. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:includesElement" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered set of elements in this covariance matrix. Because the covariance matrix is symmetrical, only the elements in the upper or lower diagonal part (including the main diagonal) of the matrix need to be specified. Any zero valued covariance elements can be omitted. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="includesElement" type="gml:CovarianceElementType"/>
+	<!-- =================================================== -->
+	<complexType name="CovarianceElementType">
+		<annotation>
+			<documentation>An element of a covariance matrix.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:rowIndex"/>
+			<element ref="gml:columnIndex"/>
+			<element ref="gml:covariance"/>
+		</sequence>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="rowIndex" type="positiveInteger">
+		<annotation>
+			<documentation>Row number of this covariance element value. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="columnIndex" type="positiveInteger">
+		<annotation>
+			<documentation>Column number of this covariance element value. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="covariance" type="double">
+		<annotation>
+			<documentation>Value of covariance matrix element. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/datums.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/datums.xsd
new file mode 100755
index 0000000..f3e0e75
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/datums.xsd
@@ -0,0 +1,485 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1.2" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:datums:3.1.1"/>
+		<documentation>How to encode datum definitions. Builds on referenceSystems.xsd to encode the data needed to define datums, including the specific subtypes of datums. 
+		This schema encodes the Datum (CD_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_Datum" type="gml:AbstractDatumType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractDatumBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for datum objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:datumName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="datumName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this datum is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="AbstractDatumType" abstract="true">
+		<annotation>
+			<documentation>A datum specifies the relationship of a coordinate system to the earth, thus creating a coordinate reference system. A datum uses a parameter or set of parameters that determine the location of the origin of the coordinate reference system. Each datum subtype can be associated with only specific types of coordinate systems. This abstract complexType shall not be used, extended, or restricted, in an Application Schema, to define a concrete subtype with a meaning equivale [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumBaseType">
+				<sequence>
+					<element ref="gml:datumID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this datum. The first datumID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on this reference system, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:anchorPoint" minOccurs="0"/>
+					<element ref="gml:realizationEpoch" minOccurs="0"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="datumID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a datum. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="anchorPoint" type="gml:CodeType">
+		<annotation>
+			<documentation>Description, possibly including coordinates, of the point or points used to anchor the datum to the Earth. Also known as the "origin", especially for engineering and image datums. The codeSpace attribute can be used to reference a source of more detailed on this point or surface, or on a set of such descriptions. 
+- For a geodetic datum, this point is also known as the fundamental point, which is traditionally the point where the relationship between geoid and ellipsoid is defined. In some cases, the "fundamental point" may consist of a number of points. In those cases, the parameters defining the geoid/ellipsoid relationship have been averaged for these points, and the averages adopted as the datum definition.
+- For an engineering datum, the anchor point may be a physical point, or it may be a point with defined coordinates in another CRS. When appropriate, the coordinates of this anchor point can be referenced in another document, such as referencing a GML feature that references or includes a point position.
+- For an image datum, the anchor point is usually either the centre of the image or the corner of the image.
+- For a temporal datum, this attribute is not defined. Instead of the anchor point, a temporal datum carries a separate time origin of type DateTime. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="realizationEpoch" type="date">
+		<annotation>
+			<documentation>The time after which this datum definition is valid. This time may be precise (e.g. 1997.0 for IRTF97) or merely a year (e.g. 1983 for NAD83). In the latter case, the epoch usually refers to the year in which a major recalculation of the geodetic control network, underlying the datum, was executed or initiated. An old datum can remain valid after a new datum is defined. Alternatively, a datum may be superseded by a later datum, in which case the realization epoch for th [...]
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="datumRef" type="gml:DatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="DatumRefType">
+		<annotation>
+			<documentation>Association to a datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Datum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="EngineeringDatum" type="gml:EngineeringDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="EngineeringDatumType">
+		<annotation>
+			<documentation>An engineering datum defines the origin of an engineering coordinate reference system, and is used in a region around that origin. This origin can be fixed with respect to the earth (such as a defined point at a construction site), or be a defined point on a moving vehicle (such as on a ship or satellite). </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="engineeringDatumRef" type="gml:EngineeringDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="EngineeringDatumRefType">
+		<annotation>
+			<documentation>Association to an engineering datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EngineeringDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ImageDatum" type="gml:ImageDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="ImageDatumType">
+		<annotation>
+			<documentation>An image datum defines the origin of an image coordinate reference system, and is used in a local context only. For more information, see OGC Abstract Specification Topic 2. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:pixelInCell"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="pixelInCell" type="gml:PixelInCellType"/>
+	<!-- =================================================== -->
+	<complexType name="PixelInCellType">
+		<annotation>
+			<documentation>Specification of the way an image grid is associated with the image data attributes. </documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeType">
+				<attribute name="codeSpace" type="anyURI" use="required">
+					<annotation>
+						<documentation>Reference to a source of information specifying the values and meanings of all the allowed string values for this PixelInCellType. </documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="imageDatumRef" type="gml:ImageDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ImageDatumRefType">
+		<annotation>
+			<documentation>Association to an image datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ImageDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="VerticalDatum" type="gml:VerticalDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalDatumType">
+		<annotation>
+			<documentation>A textual description and/or a set of parameters identifying a particular reference level surface used as a zero-height surface, including its position with respect to the Earth for any of the height types recognized by this standard. There are several types of Vertical Datums, and each may place constraints on the Coordinate Axis with which it is combined to create a Vertical CRS. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:verticalDatumType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="verticalDatumType" type="gml:VerticalDatumTypeType"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalDatumTypeType">
+		<annotation>
+			<documentation>Type of a vertical datum. </documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeType">
+				<attribute name="codeSpace" type="anyURI" use="required">
+					<annotation>
+						<documentation>Reference to a source of information specifying the values and meanings of all the allowed string values for this VerticalDatumTypeType. </documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="verticalDatumRef" type="gml:VerticalDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalDatumRefType">
+		<annotation>
+			<documentation>Association to a vertical datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="TemporalDatum" type="gml:TemporalDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalDatumBaseType" abstract="true">
+		<annotation>
+			<documentation>Partially defines the origin of a temporal coordinate reference system. This type restricts the AbstractDatumType to remove the "anchorPoint" and "realizationEpoch" elements. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:datumName"/>
+					<element ref="gml:datumID" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<complexType name="TemporalDatumType">
+		<annotation>
+			<documentation>Defines the origin of a temporal coordinate reference system. This type extends the TemporalDatumRestrictionType to add the "origin" element with the dateTime type. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:TemporalDatumBaseType">
+				<sequence>
+					<element ref="gml:origin"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="origin" type="dateTime">
+		<annotation>
+			<documentation>The date and time origin of this temporal datum. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="temporalDatumRef" type="gml:TemporalDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalDatumRefType">
+		<annotation>
+			<documentation>Association to a temporal datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="GeodeticDatum" type="gml:GeodeticDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="GeodeticDatumType">
+		<annotation>
+			<documentation>A geodetic datum defines the precise location and orientation in 3-dimensional space of a defined ellipsoid (or sphere) that approximates the shape of the earth, or of a Cartesian coordinate system centered in this ellipsoid (or sphere). </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:usesPrimeMeridian"/>
+					<element ref="gml:usesEllipsoid"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesPrimeMeridian" type="gml:PrimeMeridianRefType">
+		<annotation>
+			<documentation>Association to the prime meridian used by this geodetic datum. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesEllipsoid" type="gml:EllipsoidRefType">
+		<annotation>
+			<documentation>Association to the ellipsoid used by this geodetic datum. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="geodeticDatumRef" type="gml:GeodeticDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeodeticDatumRefType">
+		<annotation>
+			<documentation>Association to a geodetic datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeodeticDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="PrimeMeridian" type="gml:PrimeMeridianType" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="PrimeMeridianBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for prime meridian objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:meridianName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="meridianName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this prime meridian is identified. The meridianName most common value is Greenwich, and that value shall be used when the greenwichLongitude value is zero. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="PrimeMeridianType">
+		<annotation>
+			<documentation>A prime meridian defines the origin from which longitude values are determined.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:PrimeMeridianBaseType">
+				<sequence>
+					<element ref="gml:meridianID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this prime meridian. The first meridianID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this prime meridian, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:greenwichLongitude"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="meridianID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a prime meridian. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="greenwichLongitude" type="gml:AngleChoiceType">
+		<annotation>
+			<documentation>Longitude of the prime meridian measured from the Greenwich meridian, positive eastward. The greenwichLongitude most common value is zero, and that value shall be used when the meridianName value is Greenwich. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="primeMeridianRef" type="gml:PrimeMeridianRefType"/>
+	<!-- =================================================== -->
+	<complexType name="PrimeMeridianRefType">
+		<annotation>
+			<documentation>Association to a prime meridian, either referencing or containing the definition of that meridian. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PrimeMeridian"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="Ellipsoid" type="gml:EllipsoidType" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for ellipsoid objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:ellipsoidName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ellipsoidName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this ellipsoid is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidType">
+		<annotation>
+			<documentation>An ellipsoid is a geometric figure that can be used to describe the approximate shape of the earth. In mathematical terms, it is a surface formed by the rotation of an ellipse about its minor axis.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:EllipsoidBaseType">
+				<sequence>
+					<element ref="gml:ellipsoidID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this ellipsoid. The first ellipsoidID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this ellipsoid, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:semiMajorAxis"/>
+					<element ref="gml:secondDefiningParameter"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ellipsoidID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of an ellipsoid. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="semiMajorAxis" type="gml:MeasureType">
+		<annotation>
+			<documentation>Length of the semi-major axis of the ellipsoid, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="ellipsoidRef" type="gml:EllipsoidRefType"/>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidRefType">
+		<annotation>
+			<documentation>Association to an ellipsoid, either referencing or containing the definition of that ellipsoid. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Ellipsoid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="secondDefiningParameter" type="gml:SecondDefiningParameterType"/>
+	<!-- =================================================== -->
+	<complexType name="SecondDefiningParameterType">
+		<annotation>
+			<documentation>Definition of the second parameter that defines the shape of an ellipsoid. An ellipsoid requires two defining parameters: semi-major axis and inverse flattening or semi-major axis and semi-minor axis. When the reference body is a sphere rather than an ellipsoid, only a single defining parameter is required, namely the radius of the sphere; in that case, the semi-major axis "degenerates" into the radius of the sphere.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:inverseFlattening"/>
+			<element ref="gml:semiMinorAxis"/>
+			<element ref="gml:isSphere"/>
+		</choice>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="inverseFlattening" type="gml:MeasureType">
+		<annotation>
+			<documentation>Inverse flattening value of the ellipsoid. Value is a scale factor (or ratio) that has no physical unit. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a scale factor, such as percent, permil, or parts-per-million. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="semiMinorAxis" type="gml:MeasureType">
+		<annotation>
+			<documentation>Length of the semi-minor axis of the ellipsoid. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="isSphere">
+		<annotation>
+			<documentation>The ellipsoid is degenerate and is actually a sphere. The sphere is completely defined by the semi-major axis, which is the radius of the sphere. </documentation>
+		</annotation>
+		<simpleType>
+			<restriction base="string">
+				<enumeration value="sphere"/>
+			</restriction>
+		</simpleType>
+	</element>
+	<!-- =================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd
new file mode 100755
index 0000000..a5ebeb7
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:smil20="http://www.w3.org/2001/SMIL20/" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-defaultStyle:v3.1.0">defaultStyle.xsd</appinfo>
+		<documentation>
+			Default Style schema for GML 3.1.1
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="measures.xsd"/>
+	<import namespace="http://www.w3.org/2001/SMIL20/" schemaLocation="http://schemas.opengis.net/gml/3.1.1/smil/smil20.xsd"/>
+	<!-- ==============================================================
+      the Style property
+	============================================================== -->
+	<element name="defaultStyle" type="gml:DefaultStylePropertyType">
+		<annotation>
+			<documentation>Top-level property. Used in application schemas to "attach" the styling information to GML data. The link between the data and the style should be established through this property only.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="DefaultStylePropertyType">
+		<annotation>
+			<documentation>[complexType of] Top-level property. Used in application schemas to "attach" the styling information to GML data. The link between the data and the style should be established through this property only.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Style" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+       the Style
+	============================================================== -->
+	<element name="_Style" type="gml:AbstractStyleType" abstract="true" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The value of the top-level property. It is an abstract element. Used as the head element of the substitution group for extensibility purposes.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractStyleType" abstract="true">
+		<annotation>
+			<documentation>[complexType of] The value of the top-level property. It is an abstract element. Used as the head element of the substitution group for extensibility purposes.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Style" type="gml:StyleType" substitutionGroup="gml:_Style">
+		<annotation>
+			<documentation>Predefined concrete value of the top-level property. Encapsulates all other styling information.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="StyleType">
+		<annotation>
+			<documentation>[complexType of] Predefined concrete value of the top-level property. Encapsulates all other styling information.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractStyleType">
+				<sequence>
+					<element ref="gml:featureStyle" maxOccurs="unbounded"/>
+					<element ref="gml:graphStyle" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+      Feature Style Property
+	============================================================== -->
+	<element name="featureStyle" type="gml:FeatureStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="FeatureStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:FeatureStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+      Feature Style
+	============================================================== -->
+	<element name="FeatureStyle" type="gml:FeatureStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for features.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="FeatureStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for features.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element name="featureConstraint" type="string" minOccurs="0"/>
+					<element ref="gml:geometryStyle" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:topologyStyle" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:labelStyle" minOccurs="0"/>
+				</sequence>
+				<attribute name="featureType" type="string" use="optional"/>
+				<attribute name="baseType" type="string" use="optional"/>
+				<attribute name="queryGrammar" type="gml:QueryGrammarEnumeration"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="QueryGrammarEnumeration">
+		<annotation>
+			<documentation>Used to specify the grammar of the feature query mechanism.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="xpath"/>
+			<enumeration value="xquery"/>
+			<enumeration value="other"/>
+		</restriction>
+	</simpleType>
+	<!-- ==============================================================
+       Base style descriptor type (for geometry, topology, label, graph)
+	============================================================== -->
+	<complexType name="BaseStyleDescriptorType">
+		<annotation>
+			<documentation>Base complex type for geometry, topology, label and graph styles.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element name="spatialResolution" type="gml:ScaleType" minOccurs="0"/>
+					<element name="styleVariation" type="gml:StyleVariationType" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="smil20:animate" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="smil20:animateMotion" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="smil20:animateColor" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="smil20:set" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+       Geometry Style Property
+	============================================================== -->
+	<element name="geometryStyle" type="gml:GeometryStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GeometryStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:GeometryStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+       Geometry Style
+	============================================================== -->
+	<element name="GeometryStyle" type="gml:GeometryStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for geometries of a feature.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GeometryStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for geometries of a feature.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:BaseStyleDescriptorType">
+				<sequence>
+					<choice>
+						<element ref="gml:symbol"/>
+						<element name="style" type="string">
+							<annotation>
+								<appinfo>deprecated</appinfo>
+								<documentation>Deprecated in GML version 3.1.0. Use symbol with inline content instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element ref="gml:labelStyle" minOccurs="0"/>
+				</sequence>
+				<attribute name="geometryProperty" type="string"/>
+				<attribute name="geometryType" type="string"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+       Topology Style Property
+	============================================================== -->
+	<element name="topologyStyle" type="gml:TopologyStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="TopologyStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:TopologyStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+       Topology Style
+	============================================================== -->
+	<element name="TopologyStyle" type="gml:TopologyStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for topologies of a feature. Describes individual topology elements styles.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="TopologyStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for topologies of a feature. Describes individual topology elements styles.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:BaseStyleDescriptorType">
+				<sequence>
+					<choice>
+						<element ref="gml:symbol"/>
+						<element name="style" type="string">
+							<annotation>
+								<appinfo>deprecated</appinfo>
+								<documentation>Deprecated in GML version 3.1.0. Use symbol with inline content instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element ref="gml:labelStyle" minOccurs="0"/>
+				</sequence>
+				<attribute name="topologyProperty" type="string"/>
+				<attribute name="topologyType" type="string"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+       Label Style Property
+	============================================================== -->
+	<element name="labelStyle" type="gml:LabelStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="LabelStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:LabelStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+       Label Style
+	============================================================== -->
+	<element name="LabelStyle" type="gml:LabelStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for labels of a feature, geometry or topology.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="LabelStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for labels of a feature, geometry or topology.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:BaseStyleDescriptorType">
+				<sequence>
+					<element name="style" type="string"/>
+					<element name="label" type="gml:LabelType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+      Graph Style Property
+	============================================================== -->
+	<element name="graphStyle" type="gml:GraphStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GraphStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:GraphStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+      Graph Style
+	============================================================== -->
+	<element name="GraphStyle" type="gml:GraphStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for a graph consisting of a number of features. Describes graph-specific style attributes.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GraphStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for a graph consisting of a number of features. Describes graph-specific style attributes.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:BaseStyleDescriptorType">
+				<sequence>
+					<element name="planar" type="boolean" minOccurs="0"/>
+					<element name="directed" type="boolean" minOccurs="0"/>
+					<element name="grid" type="boolean" minOccurs="0"/>
+					<element name="minDistance" type="double" minOccurs="0"/>
+					<element name="minAngle" type="double" minOccurs="0"/>
+					<element name="graphType" type="gml:GraphTypeType" minOccurs="0"/>
+					<element name="drawingType" type="gml:DrawingTypeType" minOccurs="0"/>
+					<element name="lineType" type="gml:LineTypeType" minOccurs="0"/>
+					<element name="aestheticCriteria" type="gml:AesheticCriteriaType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+      Common elements
+	============================================================== -->
+	<element name="symbol" type="gml:SymbolType">
+		<annotation>
+			<documentation>The symbol property. Extends the gml:AssociationType to allow for remote referencing of symbols.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="SymbolType">
+		<annotation>
+			<documentation>[complexType of] The symbol property. Allows for remote referencing of symbols.</documentation>
+		</annotation>
+		<sequence>
+			<any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+		<attribute name="symbolType" type="gml:SymbolTypeEnumeration" use="required"/>
+		<attribute ref="gml:transform" use="optional"/>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="SymbolTypeEnumeration">
+		<annotation>
+			<documentation>Used to specify the type of the symbol used.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="svg"/>
+			<enumeration value="xpath"/>
+			<enumeration value="other"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<complexType name="LabelType" mixed="true">
+		<annotation>
+			<documentation>Label is mixed -- composed of text and XPath expressions used to extract the useful information from the feature.</documentation>
+		</annotation>
+		<sequence>
+			<element name="LabelExpression" type="string" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+		<attribute ref="gml:transform" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<attribute name="transform" type="string">
+		<annotation>
+			<documentation>Defines the geometric transformation of entities. There is no particular grammar defined for this value.</documentation>
+		</annotation>
+	</attribute>
+	<!-- =========================================================== -->
+	<complexType name="StyleVariationType">
+		<annotation>
+			<documentation>Used to vary individual graphic parameters and attributes of the style, symbol or text.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute name="styleProperty" type="string" use="required"/>
+				<attribute name="featurePropertyRange" type="string" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ==============================================================
+       Graph parameters types
+	============================================================== -->
+	<simpleType name="GraphTypeType">
+		<annotation>
+			<documentation>Graph-specific styling property.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="TREE"/>
+			<enumeration value="BICONNECTED"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="DrawingTypeType">
+		<annotation>
+			<documentation>Graph-specific styling property.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="POLYLINE"/>
+			<enumeration value="ORTHOGONAL"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="LineTypeType">
+		<annotation>
+			<documentation>Graph-specific styling property.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="STRAIGHT"/>
+			<enumeration value="BENT"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="AesheticCriteriaType">
+		<annotation>
+			<documentation>Graph-specific styling property.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="MIN_CROSSINGS"/>
+			<enumeration value="MIN_AREA"/>
+			<enumeration value="MIN_BENDS"/>
+			<enumeration value="MAX_BENDS"/>
+			<enumeration value="UNIFORM_BENDS"/>
+			<enumeration value="MIN_SLOPES"/>
+			<enumeration value="MIN_EDGE_LENGTH"/>
+			<enumeration value="MAX_EDGE_LENGTH"/>
+			<enumeration value="UNIFORM_EDGE_LENGTH"/>
+			<enumeration value="MAX_ANGULAR_RESOLUTION"/>
+			<enumeration value="MIN_ASPECT_RATIO"/>
+			<enumeration value="MAX_SYMMETRIES"/>
+		</restriction>
+	</simpleType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dictionary.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dictionary.xsd
new file mode 100755
index 0000000..5d27037
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dictionary.xsd
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:dictionary:3.1.1"/>
+		<documentation>
+			Dictionary schema for GML 3.1.1 
+			Components to support the lists of definitions.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ========================================================
+       includes and imports
+	======================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="gmlBase.xsd"/>
+	<!-- ===================================================== -->
+	<!-- ===================================================== -->
+	<!-- === Dictionary and Definition components === -->
+	<!-- ===================================================== -->
+	<group name="StandardDefinitionProperties">
+		<annotation>
+			<documentation>This content model group makes it easier to construct types that 
+      derive from DefinitionType and its descendents "by restriction".  
+      A reference to the group saves having to enumerate the standard definition properties. 
+      See definition of StandardObjectProperties for more documentation</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+			<element ref="gml:description" minOccurs="0"/>
+			<element ref="gml:name" maxOccurs="unbounded"/>
+		</sequence>
+	</group>
+	<!-- ===================================================== -->
+	<element name="Definition" type="gml:DefinitionType" substitutionGroup="gml:_GML"/>
+	<!-- ===================================================== -->
+	<complexType name="DefinitionType">
+		<annotation>
+			<documentation>A definition, which can be included in or referenced by a dictionary. In this extended type, the inherited "description" optional element can hold the definition whenever only text is needed. The inherited "name" elements can provide one or more brief terms for which this is the definition. The inherited "metaDataProperty" elements can be used to reference or include more information about this definition.  
+The gml:id attribute is required - it must be possible to reference this definition using this handle.  </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:name" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="Dictionary" type="gml:DictionaryType" substitutionGroup="gml:Definition"/>
+	<element name="DefinitionCollection" type="gml:DictionaryType" substitutionGroup="gml:Definition"/>
+	<!-- ===================================================== -->
+	<complexType name="DictionaryType">
+		<annotation>
+			<documentation>A non-abstract bag that is specialized for use as a dictionary which contains a set of definitions. These definitions are referenced from other places, in the same and different XML documents. In this restricted type, the inherited optional "description" element can be used for a description of this dictionary. The inherited optional "name" element can be used for the name(s) of this dictionary. The inherited "metaDataProperty" elements can be used to reference or conta [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence minOccurs="0" maxOccurs="unbounded">
+					<choice>
+						<element ref="gml:dictionaryEntry">
+							<annotation>
+								<documentation>An entry in this dictionary. The content of an entry can itself be a lower level dictionary or definition collection. This element follows the standard GML property model, so the value may be provided directly or by reference. Note that if the value is provided by reference, this definition does not carry a handle (gml:id) in this context, so does not allow external references to this specific entry in this context. When used in this way the referenced definition w [...]
+							</annotation>
+						</element>
+						<element ref="gml:indirectEntry">
+							<annotation>
+								<documentation>An identified reference to a remote entry in this dictionary, to be used when this entry should be identified to allow external references to this specific entry. </documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="dictionaryEntry" type="gml:DictionaryEntryType"/>
+	<element name="definitionMember" type="gml:DictionaryEntryType" substitutionGroup="gml:dictionaryEntry"/>
+	<!-- ===================================================== -->
+	<complexType name="DictionaryEntryType">
+		<annotation>
+			<documentation>An entry in a dictionary of definitions. An instance of this type contains or refers to a definition object.  
+
+The number of definitions contained in this dictionaryEntry is restricted to one, but a DefinitionCollection or Dictionary that contains multiple definitions can be substituted if needed. Specialized descendents of this dictionaryEntry might be restricted in an application schema to allow only including specified types of definitions as valid entries in a dictionary. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Definition">
+				<annotation>
+					<documentation>This element in a dictionary entry contains the actual definition. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>A non-identified reference to a remote entry in this dictionary, to be used when this entry need not be identified to allow external references to this specific entry. The remote entry referenced will usually be in a dictionary in the same XML document. This element will usually be used in dictionaries that are inside of another dictionary. </documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="indirectEntry" type="gml:IndirectEntryType"/>
+	<!-- ===================================================== -->
+	<complexType name="IndirectEntryType">
+		<annotation>
+			<documentation>An entry in a dictionary of definitions that contains a GML object which references a remote definition object. This entry is expected to be convenient in allowing multiple elements in one XML document to contain short (abbreviated XPointer) references, which are resolved to an external definition provided in a Dictionary element in the same XML document. Specialized descendents of this dictionaryEntry might be restricted in an application schema to allow only including [...]
+		</annotation>
+		<sequence>
+			<element ref="gml:DefinitionProxy"/>
+		</sequence>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="DefinitionProxy" type="gml:DefinitionProxyType" substitutionGroup="gml:Definition"/>
+	<!-- ===================================================== -->
+	<complexType name="DefinitionProxyType">
+		<annotation>
+			<documentation>A proxy entry in a dictionary of definitions. An element of this type contains a reference to a remote definition object. This entry is expected to be convenient in allowing multiple elements in one XML document to contain short (abbreviated XPointer) references, which are resolved to an external definition provided in a Dictionary element in the same XML document. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:definitionRef">
+						<annotation>
+							<documentation>A reference to a remote entry in this dictionary, used when this dictionary entry is identified to allow external references to this specific entry. The remote entry referenced can be in a dictionary in the same or different XML document. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="definitionRef" type="gml:ReferenceType"/>
+	<!-- =========================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/direction.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/direction.xsd
new file mode 100755
index 0000000..e336b3d
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/direction.xsd
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified"
+        version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:direction:3.1.1">direction.xsd</appinfo>
+		<documentation>This schema defines "direction" element and type.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<!-- ============================================================== -->
+	<!--===================================================================  -->
+	<element name="direction" type="gml:DirectionPropertyType"/>
+	<!--===================================================================  -->
+	<complexType name="DirectionPropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<choice>
+			<element ref="gml:DirectionVector"/>
+			<element ref="gml:CompassPoint"/>
+			<element name="DirectionKeyword" type="gml:CodeType"/>
+			<element name="DirectionString" type="gml:StringOrRefType"/>
+		</choice>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!--===================================================================  -->
+	<element name="DirectionVector" type="gml:DirectionVectorType"/>
+	<!--===================================================================  -->
+	<complexType name="DirectionVectorType">
+		<annotation>
+			<documentation>Direction expressed as a vector, either using components, or using angles.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:vector"/>
+			<sequence>
+				<element name="horizontalAngle" type="gml:AngleType"/>
+				<element name="verticalAngle" type="gml:AngleType"/>
+			</sequence>
+		</choice>
+	</complexType>
+	<!--===================================================================  -->
+	<element name="CompassPoint" type="gml:CompassPointEnumeration"/>
+	<!--===================================================================  -->
+	<simpleType name="CompassPointEnumeration">
+		<restriction base="string">
+			<enumeration value="N"/>
+			<enumeration value="NNE"/>
+			<enumeration value="NE"/>
+			<enumeration value="ENE"/>
+			<enumeration value="E"/>
+			<enumeration value="ESE"/>
+			<enumeration value="SE"/>
+			<enumeration value="SSE"/>
+			<enumeration value="S"/>
+			<enumeration value="SSW"/>
+			<enumeration value="SW"/>
+			<enumeration value="WSW"/>
+			<enumeration value="W"/>
+			<enumeration value="WNW"/>
+			<enumeration value="NW"/>
+			<enumeration value="NNW"/>
+		</restriction>
+	</simpleType>
+	<!--===================================================================  -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dynamicFeature.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dynamicFeature.xsd
new file mode 100755
index 0000000..8f9ed55
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/dynamicFeature.xsd
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:dynamicFeature:3.1.1"/>
+		<documentation xml:lang="en">Basic support for tracking moving objects and objects with changing state.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ================================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="direction.xsd"/>
+	<!-- ================================================================== -->
+	<element name="dataSource" type="gml:StringOrRefType"/>
+	<element name="status" type="gml:StringOrRefType"/>
+	<!-- ================================================================== -->
+	<element name="_TimeSlice" type="gml:AbstractTimeSliceType" abstract="true" substitutionGroup="gml:_GML"/>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimeSliceType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">A timeslice encapsulates the time-varying properties of a dynamic feature--it 
+        must be extended to represent a timestamped projection of a feature. The dataSource 
+        property describes how the temporal data was acquired.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:validTime"/>
+					<element ref="gml:dataSource" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="MovingObjectStatus" type="gml:MovingObjectStatusType" substitutionGroup="gml:_TimeSlice"/>
+	<!-- ===================================== -->
+	<complexType name="MovingObjectStatusType">
+		<annotation>
+			<documentation xml:lang="en">This type encapsulates various dynamic properties of moving objects        
+             (points, lines, regions). It is useful for dealing with features whose        
+             geometry or topology changes over time.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeSliceType">
+				<sequence>
+					<element ref="gml:location"/>
+					<element name="speed" type="gml:MeasureType" minOccurs="0"/>
+					<element name="bearing" type="gml:DirectionPropertyType" minOccurs="0"/>
+					<element name="acceleration" type="gml:MeasureType" minOccurs="0"/>
+					<element name="elevation" type="gml:MeasureType" minOccurs="0"/>
+					<element ref="gml:status" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="history" type="gml:HistoryPropertyType"/>
+	<!-- ===================================== -->
+	<complexType name="HistoryPropertyType">
+		<annotation>
+			<documentation xml:lang="en">The history relationship associates a feature with a sequence of TimeSlice instances.</documentation>
+		</annotation>
+		<sequence maxOccurs="unbounded">
+			<element ref="gml:_TimeSlice"/>
+		</sequence>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="track" type="gml:TrackType" substitutionGroup="gml:history"/>
+	<!-- ===================================== -->
+	<complexType name="TrackType">
+		<annotation>
+			<documentation xml:lang="en">The track of a moving object is a sequence of specialized timeslices        that indicate the status of the object.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:HistoryPropertyType">
+				<sequence maxOccurs="unbounded">
+					<element ref="gml:MovingObjectStatus"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<group name="dynamicProperties">
+		<sequence>
+			<element ref="gml:validTime" minOccurs="0"/>
+			<element ref="gml:history" minOccurs="0"/>
+			<element ref="gml:dataSource" minOccurs="0"/>
+		</sequence>
+	</group>
+	<!-- ================================================================== -->
+	<complexType name="DynamicFeatureType">
+		<annotation>
+			<documentation>A dynamic feature may possess a history and/or a timestamp.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<group ref="gml:dynamicProperties"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===================================== -->
+	<complexType name="DynamicFeatureCollectionType">
+		<annotation>
+			<documentation>A dynamic feature collection may possess a history and/or a timestamp.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:FeatureCollectionType">
+				<group ref="gml:dynamicProperties"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/feature.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/feature.xsd
new file mode 100755
index 0000000..8a553f3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/feature.xsd
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:feature:v3.1.1"/>
+		<documentation>GML Feature schema.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ============================================================== -->
+	<!-- ==================        includes and imports  ======================= -->
+	<!-- ============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic2d.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<!-- ============================================================== -->
+	<element name="_Feature" type="gml:AbstractFeatureType" abstract="true" substitutionGroup="gml:_GML"/>
+	<!-- =========================================================== -->
+	<complexType name="AbstractFeatureType" abstract="true">
+		<annotation>
+			<documentation>An abstract feature provides a set of common properties, including id, metaDataProperty, name and description inherited from AbstractGMLType, plus boundedBy.    A concrete feature type must derive from this type and specify additional  properties in an application schema. A feature must possess an identifying attribute ('id' - 'fid' has been deprecated).</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:location" minOccurs="0">
+						<annotation>
+							<appinfo>deprecated</appinfo>
+							<documentation>deprecated in GML version 3.1</documentation>
+						</annotation>
+					</element>
+					<!-- additional properties must be specified in an application schema -->
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- =========================================================== -->
+	<element name="boundedBy" type="gml:BoundingShapeType"/>
+	<!-- ====================================================================== -->
+	<complexType name="BoundingShapeType">
+		<annotation>
+			<documentation>Bounding shape.</documentation>
+		</annotation>
+		<sequence>
+			<choice>
+				<element ref="gml:Envelope"/>
+				<element ref="gml:Null"/>
+			</choice>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="EnvelopeWithTimePeriod" type="gml:EnvelopeWithTimePeriodType" substitutionGroup="gml:Envelope"/>
+	<!-- ====================================================================== -->
+	<complexType name="EnvelopeWithTimePeriodType">
+		<annotation>
+			<documentation>Envelope that includes also a temporal extent.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:EnvelopeType">
+				<sequence>
+					<element ref="gml:timePosition" minOccurs="2" maxOccurs="2"/>
+				</sequence>
+				<attribute name="frame" type="anyURI" use="optional" default="#ISO-8601"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ===== property for feature association ==== -->
+	<element name="featureMember" type="gml:FeaturePropertyType"/>
+	<element name="featureProperty" type="gml:FeaturePropertyType"/>
+	<!-- ============================================================== -->
+	<complexType name="FeaturePropertyType">
+		<annotation>
+			<documentation>Container for a feature - follow gml:AssociationType pattern.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Feature"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- ===== property for association of an array of features ===== -->
+	<element name="featureMembers" type="gml:FeatureArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="FeatureArrayPropertyType">
+		<annotation>
+			<documentation>Container for features - follow gml:ArrayAssociationType pattern.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Feature" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- =========================================================== -->
+	<element name="_FeatureCollection" type="gml:AbstractFeatureCollectionType" abstract="true" substitutionGroup="gml:_Feature"/>
+	<!-- ===========================================================   -->
+	<complexType name="AbstractFeatureCollectionType" abstract="true">
+		<annotation>
+			<documentation>A feature collection contains zero or more features.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:featureMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:featureMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="FeatureCollection" type="gml:FeatureCollectionType" substitutionGroup="gml:_Feature"/>
+	<!-- =========================================================== -->
+	<complexType name="FeatureCollectionType">
+		<annotation>
+			<documentation>Concrete generic feature collection.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureCollectionType"/>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- ============================================================== -->
+	<element name="LocationKeyWord" type="gml:CodeType"/>
+	<element name="LocationString" type="gml:StringOrRefType"/>
+	<!-- =========================================================== -->
+	<!-- ============= common aliases for geometry properties =============== -->
+	<element name="centerOf" type="gml:PointPropertyType"/>
+	<element name="position" type="gml:PointPropertyType"/>
+	<element name="edgeOf" type="gml:CurvePropertyType"/>
+	<element name="centerLineOf" type="gml:CurvePropertyType"/>
+	<element name="extentOf" type="gml:SurfacePropertyType"/>
+	<!-- =========================================================== -->
+	<!-- ================= deprecated components  =========================== -->
+	<complexType name="BoundedFeatureType" abstract="true">
+		<annotation>
+			<documentation>Makes boundedBy mandatory</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractFeatureType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy"/>
+					<element ref="gml:location" minOccurs="0">
+						<annotation>
+							<appinfo>deprecated</appinfo>
+							<documentation>deprecated in GML version 3.1</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="location" type="gml:LocationPropertyType">
+		<annotation>
+			<documentation>Deprecated in GML 3.1.0</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="LocationPropertyType">
+		<annotation>
+			<documentation>Convenience property for generalised location.  
+      A representative location for plotting or analysis.  
+      Often augmented by one or more additional geometry properties with more specific semantics.</documentation>
+			<documentation>Deprecated in GML 3.1.0</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:_Geometry"/>
+				<element ref="gml:LocationKeyWord"/>
+				<element ref="gml:LocationString"/>
+				<element ref="gml:Null"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="priorityLocation" type="gml:PriorityLocationPropertyType" substitutionGroup="gml:location">
+		<annotation>
+			<documentation>Deprecated in GML 3.1.0</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="PriorityLocationPropertyType">
+		<annotation>
+			<documentation>G-XML component</documentation>
+			<documentation>Deprecated in GML 3.1.0</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:LocationPropertyType">
+				<attribute name="priority" type="string" use="optional"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryAggregates.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryAggregates.xsd
new file mode 100755
index 0000000..c83a39d
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryAggregates.xsd
@@ -0,0 +1,431 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified"
+        version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryAggregates:3.1.1">geometryAggregates.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryPrimitives.xsd"/>
+	<!-- =========================================================== -->
+	<!-- aggregate geometry objects -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_GeometricAggregate" type="gml:AbstractGeometricAggregateType" abstract="true" substitutionGroup="gml:_Geometry">
+		<annotation>
+			<documentation>The "_GeometricAggregate" element is the abstract head of the substituition group for all geometric aggremates.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractGeometricAggregateType" abstract="true">
+		<annotation>
+			<documentation>This is the abstract root type of the geometric aggregates.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiGeometry" type="gml:MultiGeometryType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiGeometryType">
+		<annotation>
+			<documentation>A geometry collection must include one or more geometries, referenced through geometryMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:geometryMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:geometryMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiGeometryProperty" type="gml:MultiGeometryPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiGeometryProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a geometric aggregate via the XLink-attributes or contains the "multi geometry" element. multiGeometryProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for _GeometricAggregate.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiGeometryPropertyType">
+		<annotation>
+			<documentation>A property that has a geometric aggregate as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeometricAggregate"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiPoint" type="gml:MultiPointType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiPointType">
+		<annotation>
+			<documentation>A MultiPoint is defined by one or more Points, referenced through pointMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:pointMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:pointMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiPointProperty" type="gml:MultiPointPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiPointProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a point aggregate via the XLink-attributes or contains the "multi point" element. multiPointProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for MultiPoint.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiPointPropertyType">
+		<annotation>
+			<documentation>A property that has a collection of points as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiPoint"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiCurve" type="gml:MultiCurveType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiCurveType">
+		<annotation>
+			<documentation>A MultiCurve is defined by one or more Curves, referenced through curveMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:curveMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:curveMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiCurveProperty" type="gml:MultiCurvePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiCurveProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a curve aggregate via the XLink-attributes or contains the "multi curve" element. multiCurveProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for MultiCurve.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiCurvePropertyType">
+		<annotation>
+			<documentation>A property that has a collection of curves as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiSurface" type="gml:MultiSurfaceType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiSurfaceType">
+		<annotation>
+			<documentation>A MultiSurface is defined by one or more Surfaces, referenced through surfaceMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:surfaceMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:surfaceMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiSurfaceProperty" type="gml:MultiSurfacePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiSurfaceProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a surface aggregate via the XLink-attributes or contains the "multi surface" element. multiSurfaceProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for MultiSurface.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiSurfacePropertyType">
+		<annotation>
+			<documentation>A property that has a collection of surfaces as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ============================================================ -->
+	<element name="MultiSolid" type="gml:MultiSolidType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiSolidType">
+		<annotation>
+			<documentation>A MultiSolid is defined by one or more Solids, referenced through solidMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:solidMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:solidMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiSolidProperty" type="gml:MultiSolidPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiSolidProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a solid aggregate via the XLink-attributes or contains the "multi solid" element. multiSolidProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for MultiSolid.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiSolidPropertyType">
+		<annotation>
+			<documentation>A property that has a collection of solids as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- 
+	
+	The following types and elements are deprecated and should not be used !
+	For backward compatibility with GML2 only
+	
+	-->
+	<!-- =========================================================== -->
+	<element name="MultiPolygon" type="gml:MultiPolygonType" substitutionGroup="gml:_GeometricAggregate">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included for backwards compatibility with GML 2. Use the "MultiSurface" element instead.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="MultiLineString" type="gml:MultiLineStringType" substitutionGroup="gml:_GeometricAggregate">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included for backwards compatibility with GML 2. Use the "MultiCurve" element instead.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiLineStringType">
+		<annotation>
+			<documentation>A MultiLineString is defined by one or more LineStrings, referenced through lineStringMember elements. Deprecated with GML version 3.0. Use MultiCurveType instead.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:lineStringMember" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="MultiLineStringPropertyType">
+		<annotation>
+			<documentation>This type is deprecated with GML 3 and shall not be used. It is included for backwards compatibility with GML 2. Use MultiCurvePropertyType instead.
+A property that has a collection of line strings as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiLineString"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="MultiPolygonType">
+		<annotation>
+			<documentation>A MultiPolygon is defined by one or more Polygons, referenced through polygonMember elements. Deprecated with GML version 3.0. Use MultiSurfaceType instead.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:polygonMember" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="MultiPolygonPropertyType">
+		<annotation>
+			<documentation>This type is deprecated with GML 3 and shall not be used. It is included for backwards compatibility with GML 2. Use MultiSurfacePropertyType instead.
+
+A property that has a collection of polygons as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiPolygon"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="geometryMember" type="gml:GeometryPropertyType">
+		<annotation>
+			<documentation>This property element either references a geometry element via the XLink-attributes or contains the geometry element.</documentation>
+		</annotation>
+	</element>
+	<element name="geometryMembers" type="gml:GeometryArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of geometry elements. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<element name="pointMember" type="gml:PointPropertyType">
+		<annotation>
+			<documentation>This property element either references a Point via the XLink-attributes or contains the Point element.</documentation>
+		</annotation>
+	</element>
+	<element name="pointMembers" type="gml:PointArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of points. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<element name="curveMembers" type="gml:CurveArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curves. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<element name="surfaceMember" type="gml:SurfacePropertyType">
+		<annotation>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. A surface element is any element which is substitutable for "_Surface".</documentation>
+		</annotation>
+	</element>
+	<element name="surfaceMembers" type="gml:SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of surfaces. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<element name="solidMember" type="gml:SolidPropertyType">
+		<annotation>
+			<documentation>This property element either references a solid via the XLink-attributes or contains the solid element. A solid element is any element which is substitutable for "_Solid".</documentation>
+		</annotation>
+	</element>
+	<element name="solidMembers" type="gml:SolidArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of solids. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<!-- some named geometry properties - for backward compatibility with GML2 -->
+	<element name="multiCenterOf" type="gml:MultiPointPropertyType"/>
+	<element name="multiPosition" type="gml:MultiPointPropertyType"/>
+	<element name="multiCenterLineOf" type="gml:MultiCurvePropertyType"/>
+	<element name="multiEdgeOf" type="gml:MultiCurvePropertyType"/>
+	<element name="multiCoverage" type="gml:MultiSurfacePropertyType"/>
+	<element name="multiExtentOf" type="gml:MultiSurfacePropertyType"/>
+	<!-- 
+	
+	The following types and elements are deprecated and should not be used !
+	
+	-->
+	<element name="multiLocation" type="gml:MultiPointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "curveMember" instead.
+This property element either references a line string via the XLink-attributes or contains the line string element.</documentation>
+		</annotation>
+	</element>
+	<element name="lineStringMember" type="gml:LineStringPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "curveMember" instead.
+This property element either references a line string via the XLink-attributes or contains the line string element.</documentation>
+		</annotation>
+	</element>
+	<element name="polygonMember" type="gml:PolygonPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "surfaceMember" instead.
+This property element either references a polygon via the XLink-attributes or contains the polygon element.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryBasic0d1d.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryBasic0d1d.xsd
new file mode 100755
index 0000000..9403e24
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryBasic0d1d.xsd
@@ -0,0 +1,603 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by David Burggraf (Galdos Systems Inc) -->
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron"
+        xmlns="http://www.w3.org/2001/XMLSchema">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryBasic0d1d:v3.1.1">geometryBasic0d1d.xsd</appinfo>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryBasic0d1d:v3.1.1">
+			<sch:title>Schematron validation</sch:title>
+			<sch:pattern name="Check SRS tags">
+				<sch:rule abstract="true" id="CRSLabels">
+					<sch:report test="not(@srsDimension) or @srsName">The presence of a dimension attribute implies the presence of the srsName attribute.</sch:report>
+					<sch:report test="not(@axisLabels) or @srsName">The presence of an axisLabels attribute implies the presence of the srsName attribute.</sch:report>
+					<sch:report test="not(@uomLabels) or @srsName">The presence of an uomLabels attribute implies the presence of the srsName attribute.</sch:report>
+					<sch:report test="(not(@uomLabels) and not(@axisLabels)) or (@uomLabels and @axisLabels)">The presence of an uomLabels attribute implies the presence of the axisLabels attribute and vice versa.</sch:report>
+				</sch:rule>
+			</sch:pattern>
+			<sch:pattern name="Check Dimension">
+				<sch:rule abstract="true" id="Count">
+					<sch:report test="not(@count) or @srsDimension">The presence of a count attribute implies the presence of the dimension attribute.</sch:report>
+				</sch:rule>
+			</sch:pattern>
+		</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="measures.xsd">
+		<annotation>
+			<documentation>This includes not only measures.xsd, but also units.xsd, gmlBase.xsd and basicTypes.xsd.</documentation>
+		</annotation>
+	</include>
+	<!-- ============================================================== -->
+	<!-- ===========  abstract supertype for geometry objects =================== -->
+	<!-- ============================================================== -->
+	<element name="_Geometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The "_Geometry" element is the abstract head of the substituition group for all geometry elements of GML 3. This 
+			includes pre-defined and user-defined geometry elements. Any geometry element must be a direct or indirect extension/restriction 
+			of AbstractGeometryType and must be directly or indirectly in the substitution group of "_Geometry".</documentation>
+			<appinfo>
+				<sch:pattern name="Check SRS tags">
+					<sch:rule context="gml:_Geometry">
+						<sch:extends rule="CRSLabels"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="GeometryPropertyType">
+		<annotation>
+			<documentation>A geometric property can either be any geometry element encapsulated in an element of this type or an XLink reference 
+			to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Note that either 
+			the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Geometry"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference 
+				remote resources (including those elsewhere in the same document). A simple link element can be constructed by 
+				including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation 
+				of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create 
+				sophisticated links between resources; such links can be used to reference remote properties. A simple link element 
+				can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by 
+				including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="GeometryArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of geometry elements. The elements are always contained in the array property, 
+			referencing geometry elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Geometry" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="AbstractGeometryType" abstract="true">
+		<annotation>
+			<documentation>All geometry elements are derived directly or indirectly from this abstract supertype. A geometry element may 
+			have an identifying attribute ("gml:id"), a name (attribute "name") and a description (attribute "description"). It may be associated 
+			with a spatial reference system (attribute "srsName"). The following rules shall be adhered: - Every geometry type shall derive 
+			from this abstract type. - Every geometry element (i.e. an element of a geometry type) shall be directly or indirectly in the 
+			substitution group of _Geometry.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<attribute name="gid" type="string" use="optional">
+					<annotation>
+						<documentation>This attribute is included for backward compatibility with GML 2 and is deprecated with GML 3. 
+						This identifer is superceded by "gml:id" inherited from AbstractGMLType. The attribute "gid" should not be used 
+						anymore and may be deleted in future versions of GML without further notice.</documentation>
+					</annotation>
+				</attribute>
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<attributeGroup name="SRSReferenceGroup">
+		<annotation>
+			<documentation>Optional reference to the CRS used by this geometry, with optional additional information to simplify use when 
+			a more complete definition of the CRS is not needed.</documentation>
+		</annotation>
+		<attribute name="srsName" type="anyURI" use="optional">
+			<annotation>
+				<documentation>In general this reference points to a CRS instance of gml:CoordinateReferenceSystemType 
+				(see coordinateReferenceSystems.xsd). For well known references it is not required that the CRS description exists at the 
+				location the URI points to. If no srsName attribute is given, the CRS must be specified as part of the larger context this 
+				geometry element is part of, e.g. a geometric element like point, curve, etc. It is expected that this attribute will be specified 
+				at the direct position level only in rare cases.</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="srsDimension" type="positiveInteger" use="optional">
+			<annotation>
+				<documentation>The "srsDimension" is the length of coordinate sequence (the number of entries in the list). This dimension is 
+				specified by the coordinate reference system. When the srsName attribute is omitted, this attribute shall be omitted.</documentation>
+			</annotation>
+		</attribute>
+		<attributeGroup ref="gml:SRSInformationGroup"/>
+	</attributeGroup>
+	<!-- =================================================== -->
+	<attributeGroup name="SRSInformationGroup">
+		<annotation>
+			<documentation>Optional additional and redundant information for a CRS to simplify use when a more complete definition of the 
+			CRS is not needed. This information shall be the same as included in the more complete definition of the CRS, referenced by the 
+			srsName attribute. When the srsName attribute is included, either both or neither of the axisLabels and uomLabels attributes 
+			shall be included. When the srsName attribute is omitted, both of these attributes shall be omitted.</documentation>
+		</annotation>
+		<attribute name="axisLabels" type="gml:NCNameList" use="optional">
+			<annotation>
+				<documentation>Ordered list of labels for all the axes of this CRS. The gml:axisAbbrev value should be used for these axis 
+				labels, after spaces and forbiddden characters are removed. When the srsName attribute is included, this attribute is optional. 
+				When the srsName attribute is omitted, this attribute shall also be omitted.</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="uomLabels" type="gml:NCNameList" use="optional">
+			<annotation>
+				<documentation>Ordered list of unit of measure (uom) labels for all the axes of this CRS. The value of the string in the 
+				gml:catalogSymbol should be used for this uom labels, after spaces and forbiddden characters are removed. When the 
+				axisLabels attribute is included, this attribute shall also be included. When the axisLabels attribute is omitted, this attribute 
+				shall also be omitted.</documentation>
+			</annotation>
+		</attribute>
+	</attributeGroup>
+	<!-- ============================================================== -->
+	<element name="_GeometricPrimitive" type="gml:AbstractGeometricPrimitiveType" abstract="true" substitutionGroup="gml:_Geometry">
+		<annotation>
+			<documentation>The "_GeometricPrimitive" element is the abstract head of the substituition group for all (pre- and user-defined) 
+			geometric primitives.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="AbstractGeometricPrimitiveType" abstract="true">
+		<annotation>
+			<documentation>This is the abstract root type of the geometric primitives. A geometric primitive is a geometric object that is not 
+			decomposed further into other primitives in the system. All primitives are oriented in the direction implied by the sequence of their 
+			coordinate tuples.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType"/>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="GeometricPrimitivePropertyType">
+		<annotation>
+			<documentation>A property that has a geometric primitive as its value domain can either be an appropriate geometry element 
+			encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry 
+			elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither 
+			both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeometricPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote 
+				resources (including those elsewhere in the same document). A simple link element can be constructed by including a 
+				specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide 
+				Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between 
+				resources; such links can be used to reference remote properties. A simple link element can be used to implement pointer 
+				functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- primitive geometry objects (0-dimensional) -->
+	<!-- ============================================================== -->
+	<element name="Point" type="gml:PointType" substitutionGroup="gml:_GeometricPrimitive"/>
+	<!-- ============================================================== -->
+	<complexType name="PointType">
+		<annotation>
+			<documentation>A Point is defined by a single coordinate tuple.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the direct poisiton of a point. 1. The "pos" element is of type 
+							DirectPositionType.</documentation>
+						</annotation>
+						<element ref="gml:pos"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0 for coordinates with ordinate values that are numbers. Use "pos" 
+								instead. The "coordinates" element shall only be used for coordinates with ordinates that require a string 
+								representation, e.g. DMS representations.</documentation>
+							</annotation>
+						</element>
+						<element ref="gml:coord">
+							<annotation>
+								<documentation>Deprecated with GML version 3.0. Use "pos" instead. The "coord" element is included for 
+								backwards compatibility with GML 2.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="pointProperty" type="gml:PointPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:pointProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a point via the XLink-attributes or contains the point element. pointProperty 
+			is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that 
+			is substitutable for Point.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<element name="pointRep" type="gml:PointPropertyType">
+		<annotation>
+			<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="PointPropertyType">
+		<annotation>
+			<documentation>A property that has a point as its value domain can either be an appropriate geometry element encapsulated in an 
+			element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located 
+			elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Point"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote 
+				resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific 
+				set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. 
+				XLink allows elements to be inserted into XML documents so as to create sophisticated links between resources; such links can be 
+				used to reference remote properties. A simple link element can be used to implement pointer functionality, and this functionality has 
+				been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="pointArrayProperty" type="gml:PointArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="PointArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of points. The elements are always contained in the array property, referencing geometry 
+			elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:Point" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- primitive geometry objects (1-dimensional) -->
+	<!-- ============================================================== -->
+	<element name="_Curve" type="gml:AbstractCurveType" abstract="true" substitutionGroup="gml:_GeometricPrimitive">
+		<annotation>
+			<documentation>The "_Curve" element is the abstract head of the substituition group for all (continuous) curve elements.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="AbstractCurveType" abstract="true">
+		<annotation>
+			<documentation>An abstraction of a curve to support the different levels of complexity. The curve can always be viewed as a geometric 
+			primitive, i.e. is continuous.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="curveProperty" type="gml:CurvePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:curveProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a curve via the XLink-attributes or contains the curve element. curveProperty is the 
+			predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is 
+			substitutable for _Curve.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="CurvePropertyType">
+		<annotation>
+			<documentation>A property that has a curve as its value domain can either be an appropriate geometry element encapsulated in an 
+			element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere 
+			in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Curve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote 
+				resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific 
+				set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. 
+				XLink allows elements to be inserted into XML documents so as to create sophisticated links between resources; such links can be used 
+				to reference remote properties. A simple link element can be used to implement pointer functionality, and this functionality has been built 
+				into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="curveArrayProperty" type="gml:CurveArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="CurveArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of curves. The elements are always contained in the array property, referencing geometry elements 
+			or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Curve" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="LineString" type="gml:LineStringType" substitutionGroup="gml:_Curve"/>
+	<!-- =========================================================== -->
+	<complexType name="LineStringType">
+		<annotation>
+			<documentation>A LineString is a special curve that consists of a single segment with linear interpolation. It is defined by two or more coordinate 
+			tuples, with linear interpolation between them. It is backwards compatible with the LineString of GML 2, GM_LineString of ISO 19107 is 
+			implemented by LineStringSegment.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a line string. 1. A sequence of "pos" 
+							(DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part 
+							of this curve, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference 
+							another point defined outside of this curve (reuse of existing points). 2. The "posList" element allows for a compact way to 
+							specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong 
+							to this curve only. The number of direct positions in the list must be at least two.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility 
+									with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+							<element ref="gml:coord">
+								<annotation>
+									<documentation>Deprecated with GML version 3.0. Use "pos" instead. The "coord" element is included for backwards 
+									compatibility with GML 2.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- positions -->
+	<!-- =========================================================== -->
+	<element name="pos" type="gml:DirectPositionType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check SRS tags">
+					<sch:rule context="gml:pos">
+						<sch:extends rule="CRSLabels"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="DirectPositionType">
+		<annotation>
+			<documentation>DirectPosition instances hold the coordinates for a position within some coordinate reference system (CRS). Since 
+			DirectPositions, as data types, will often be included in larger objects (such as geometry elements) that have references to CRS, the 
+			"srsName" attribute will in general be missing, if this particular DirectPosition is included in a larger element with such a reference to a 
+			CRS. In this case, the CRS is implicitly assumed to take on the value of the containing object's CRS.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="posList" type="gml:DirectPositionListType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check SRS tags">
+					<sch:rule context="gml:posList">
+						<sch:extends rule="CRSLabels"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<appinfo>
+				<sch:pattern name="Check Dimension">
+					<sch:rule context="gml:posList">
+						<sch:extends rule="Count"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="DirectPositionListType">
+		<annotation>
+			<documentation>DirectPositionList instances hold the coordinates for a sequence of direct positions within the same coordinate 
+			reference system (CRS).</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+				<attribute name="count" type="positiveInteger" use="optional">
+					<annotation>
+						<documentation>"count" allows to specify the number of direct positions in the list. If the attribute count is present then 
+						the attribute srsDimension shall be present, too.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="vector" type="gml:VectorType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check SRS tags">
+					<sch:rule context="gml:vector">
+						<sch:extends rule="CRSLabels"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="VectorType">
+		<annotation>
+			<documentation>Vector instances hold the compoents for a (usually spatial) vector within some coordinate reference system (CRS). 
+			Since Vectors will often be included in larger objects that have references to CRS, the "srsName" attribute may be missing. 
+			In this case, the CRS is implicitly assumed to take on the value of the containing object's CRS.
+
+			Note that this content model is the same as DirectPositionType, but is defined separately to reflect the distinct semantics, and to avoid validation problems. SJDC 2004-12-02</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<group name="geometricPositionGroup">
+		<annotation>
+			<documentation>A geometric position represented either by a DirectPosition or a Point.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:pos"/>
+			<element ref="gml:pointProperty"/>
+		</choice>
+	</group>
+	<!-- ============================================================== -->
+	<group name="geometricPositionListGroup">
+		<annotation>
+			<documentation>A list of geometric positions represented either by a DirectPosition or a Point.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:posList"/>
+			<group ref="gml:geometricPositionGroup" maxOccurs="unbounded"/>
+		</choice>
+	</group>
+	<!-- ============================================================== -->
+	<element name="coordinates" type="gml:CoordinatesType">
+		<annotation>
+			<documentation>Deprecated with GML version 3.1.0.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<!-- Envelope -->
+	<!-- =========================================================== -->
+	<element name="Envelope" type="gml:EnvelopeType"/>
+	<!-- =========================================================== -->
+	<complexType name="EnvelopeType">
+		<annotation>
+			<documentation>Envelope defines an extent using a pair of positions defining opposite corners in arbitrary dimensions. The first direct 
+			position is the "lower corner" (a coordinate position consisting of all the minimal ordinates for each dimension for all points within the envelope), 
+			the second one the "upper corner" (a coordinate position consisting of all the maximal ordinates for each dimension for all points within the 
+			envelope).</documentation>
+		</annotation>
+		<choice>
+			<sequence>
+				<element name="lowerCorner" type="gml:DirectPositionType"/>
+				<element name="upperCorner" type="gml:DirectPositionType"/>
+			</sequence>
+			<element ref="gml:coord" minOccurs="2" maxOccurs="2">
+				<annotation>
+					<appinfo>deprecated</appinfo>
+					<documentation>deprecated with GML version 3.0</documentation>
+				</annotation>
+			</element>
+			<element ref="gml:pos" minOccurs="2" maxOccurs="2">
+				<annotation>
+					<appinfo>deprecated</appinfo>
+					<documentation>Deprecated with GML version 3.1. Use the explicit properties "lowerCorner" and "upperCorner" instead.</documentation>
+				</annotation>
+			</element>
+			<element ref="gml:coordinates">
+				<annotation>
+					<documentation>Deprecated with GML version 3.1.0. Use the explicit properties "lowerCorner" and "upperCorner" instead.</documentation>
+				</annotation>
+			</element>
+		</choice>
+		<attributeGroup ref="gml:SRSReferenceGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<!--  	 	The following types and elements are deprecated and should not be used ! 	 	-->
+	<element name="coord" type="gml:CoordType">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included for backwards compatibility with GML 2. Use the "pos" element instead.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoordType">
+		<annotation>
+			<documentation>Represents a coordinate tuple in one, two, or three dimensions. Deprecated with GML 3.0 and replaced by 
+			DirectPositionType.</documentation>
+		</annotation>
+		<sequence>
+			<element name="X" type="decimal"/>
+			<element name="Y" type="decimal" minOccurs="0"/>
+			<element name="Z" type="decimal" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="lineStringProperty" type="gml:LineStringPropertyType">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "curveProperty" instead. This 
+			property element either references a line string via the XLink-attributes or contains the line string element.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="LineStringPropertyType">
+		<annotation>
+			<documentation>This type is deprecated with GML 3 and shall not be used. It is included for backwards compatibility with GML 2. Use 
+			CurvePropertyType instead. A property that has a line string as its value domain can either be an appropriate geometry element encapsulated 
+			in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere 
+			in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:LineString"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources 
+				(including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. 
+				The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to 
+				be inserted into XML documents so as to create sophisticated links between resources; such links can be used to reference remote properties. 
+				A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by 
+				including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryBasic2d.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryBasic2d.xsd
new file mode 100755
index 0000000..05d58c0
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryBasic2d.xsd
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Clemens Portele (interactive instruments) -->
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+        version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryBasic2d:3.1.1">geometryBasic2d.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<!-- =========================================================== -->
+	<!-- primitive geometry objects (2-dimensional) -->
+	<!-- =========================================================== -->
+	<element name="_Surface" type="gml:AbstractSurfaceType" abstract="true" substitutionGroup="gml:_GeometricPrimitive">
+		<annotation>
+			<documentation>The "_Surface" element is the abstract head of the substituition group for all (continuous) surface elements.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractSurfaceType">
+		<annotation>
+			<documentation>An abstraction of a surface to support the different levels of complexity. A surface is always a continuous region of a plane.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="surfaceProperty" type="gml:SurfacePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:surfaceProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. surfaceProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for _Surface.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="SurfacePropertyType">
+		<annotation>
+			<documentation>A property that has a surface as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Surface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="surfaceArrayProperty" type="gml:SurfaceArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of surfaces. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Surface" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:_Surface"/>
+	<!-- =========================================================== -->
+	<complexType name="PolygonType">
+		<annotation>
+			<documentation>A Polygon is a special surface that is defined by a single surface patch. The boundary of this patch is coplanar and the polygon uses planar interpolation in its interior. It is backwards compatible with the Polygon of GML 2, GM_Polygon of ISO 19107 is implemented by PolygonPatch.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:exterior" minOccurs="0"/>
+					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- rings (closed curves for surface boundaries) -->
+	<!-- =========================================================== -->
+	<element name="_Ring" type="gml:AbstractRingType" abstract="true" substitutionGroup="gml:_Geometry">
+		<annotation>
+			<documentation>The "_Ring" element is the abstract head of the substituition group for all closed boundaries of a surface patch.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractRingType" abstract="true">
+		<annotation>
+			<documentation>An abstraction of a ring to support surface boundaries of different complexity.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="exterior" type="gml:AbstractRingPropertyType">
+		<annotation>
+			<documentation>A boundary of a surface consists of a number of rings. In the normal 2D case, one of these rings is distinguished as being the exterior boundary. In a general manifold this is not always possible, in which case all boundaries shall be listed as interior boundaries, and the exterior will be empty.</documentation>
+		</annotation>
+	</element>
+	<element name="interior" type="gml:AbstractRingPropertyType">
+		<annotation>
+			<documentation>A boundary of a surface consists of a number of rings. The "interior" rings seperate the surface / surface patch from the area enclosed by the rings.</documentation>
+		</annotation>
+	</element>
+	<element name="outerBoundaryIs" type="gml:AbstractRingPropertyType" substitutionGroup="gml:exterior">
+		<annotation>
+			<documentation>Deprecated with GML 3.0, included only for backwards compatibility with GML 2. Use "exterior" instead.</documentation>
+		</annotation>
+	</element>
+	<element name="innerBoundaryIs" type="gml:AbstractRingPropertyType" substitutionGroup="gml:interior">
+		<annotation>
+			<documentation>Deprecated with GML 3.0, included only for backwards compatibility with GML 2. Use "interior" instead.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractRingPropertyType">
+		<annotation>
+			<documentation>Encapsulates a ring to represent the surface boundary property of a surface.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Ring"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:_Ring"/>
+	<!-- =========================================================== -->
+	<complexType name="LinearRingType">
+		<annotation>
+			<documentation>A LinearRing is defined by four or more coordinate tuples, with linear interpolation between them; the first and last coordinates must be coincident.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractRingType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a linear ring.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this ring, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this ring (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this ring only. The number of direct positions in the list must be at least four.</documentation>
+						</annotation>
+						<choice minOccurs="4" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+						<element ref="gml:coord" minOccurs="4" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Deprecated with GML version 3.0 and included for backwards compatibility with GML 2. Use "pos" elements instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="LinearRingPropertyType">
+		<annotation>
+			<documentation>Encapsulates a ring to represent properties in features or geometry collections.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:LinearRing"/>
+		</choice>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- 
+	
+	The following types and elements are deprecated and should not be used !
+	
+	-->
+	<!-- =========================================================== -->
+	<element name="polygonProperty" type="gml:PolygonPropertyType">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "surfaceProperty" instead.
+This property element either references a polygon via the XLink-attributes or contains the polygon element.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="PolygonPropertyType">
+		<annotation>
+			<documentation>This type is deprecated with GML 3 and shall not be used. It is included for backwards compatibility with GML 2. Use SurfacePropertyType instead.
+A property that has a polygon as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Polygon"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryComplexes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryComplexes.xsd
new file mode 100755
index 0000000..388d619
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryComplexes.xsd
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+        version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryComplexes:v3.1.1">geometryComplexes.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<!-- =========================================================== -->
+	<element name="CompositeCurve" type="gml:CompositeCurveType" substitutionGroup="gml:_Curve"/>
+	<!-- =========================================================== -->
+	<complexType name="CompositeCurveType">
+		<annotation>
+			<documentation>A CompositeCurve is defined by a sequence of (orientable) curves such that the each curve in the sequence terminates at the start point of the subsequent curve in the list.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:curveMember" maxOccurs="unbounded">
+						<annotation>
+							<documentation>This element references or contains one curve in the composite curve. The curves are contiguous, the collection of curves is ordered.
+NOTE: This definition allows for a nested structure, i.e. a CompositeCurve may use, for example, another CompositeCurve as a curve member.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="CompositeCurvePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:CompositeCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="CompositeSurface" type="gml:CompositeSurfaceType" substitutionGroup="gml:_Surface"/>
+	<!-- =========================================================== -->
+	<complexType name="CompositeSurfaceType">
+		<annotation>
+			<documentation>A CompositeSurface is defined by a set of orientable surfaces. A composite surface is geometry type with all the geometric properties of a (primitive) surface. Essentially, a composite surface is a collection of surfaces that join in pairs on common boundary curves and which, when considered as a whole, form a single surface.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:surfaceMember" maxOccurs="unbounded">
+						<annotation>
+							<documentation>This element references or contains one surface in the composite surface. The surfaces are contiguous.
+NOTE: This definition allows for a nested structure, i.e. a CompositeSurface may use, for example, another CompositeSurface as a member.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="CompositeSurfacePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:CompositeSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="CompositeSolid" type="gml:CompositeSolidType" substitutionGroup="gml:_Solid"/>
+	<!-- =========================================================== -->
+	<complexType name="CompositeSolidType">
+		<annotation>
+			<documentation>A composite solid is a geometry type with all the geometric properties of a (primitive) solid. 
+				Essentially, a composite solid is a collection of solids that join in pairs on common boundary surfaces and which, when considered as a whole, form a single solid.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSolidType">
+				<sequence>
+					<element ref="gml:solidMember" maxOccurs="unbounded">
+						<annotation>
+							<appinfo>
+								<sch:pattern name="Check either href or content not both">
+									<sch:rule context="gml:solidMember">
+										<sch:extends rule="hrefOrContent"/>
+									</sch:rule>
+								</sch:pattern>
+							</appinfo>
+							<documentation>This element references or contains one solid in the composite solid. The solids are contiguous.
+NOTE: This definition allows for a nested structure, i.e. a CompositeSolid may use, for example, another CompositeSolid as a member.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="CompositeSolidPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:CompositeSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- complex/composite geometry objects -->
+	<!-- =========================================================== -->
+	<element name="GeometricComplex" type="gml:GeometricComplexType" substitutionGroup="gml:_Geometry"/>
+	<!-- =========================================================== -->
+	<complexType name="GeometricComplexType">
+		<annotation>
+			<documentation>A geometric complex.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<sequence>
+					<element name="element" type="gml:GeometricPrimitivePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="GeometricComplexPropertyType">
+		<annotation>
+			<documentation>A property that has a geometric complex as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.
+NOTE: The allowed geometry elements contained in such a property (or referenced by it) have to be modelled by an XML Schema choice element since the composites inherit both from geometric complex *and* geometric primitive and are already part of the _GeometricPrimitive substitution group.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:GeometricComplex"/>
+				<element ref="gml:CompositeCurve"/>
+				<element ref="gml:CompositeSurface"/>
+				<element ref="gml:CompositeSolid"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd
new file mode 100755
index 0000000..9bdce43
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd
@@ -0,0 +1,1610 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Clemens Portele (interactive instruments) -->
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified"
+        version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryPrimitives:3.1.1">geometryPrimitives.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- =========================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic2d.xsd"/>
+	<!-- =========================================================== -->
+	<element name="Curve" type="gml:CurveType" substitutionGroup="gml:_Curve"/>
+	<!-- =========================================================== -->
+	<complexType name="CurveType">
+		<annotation>
+			<documentation>Curve is a 1-dimensional primitive. Curves are continuous, connected, and have a measurable length in terms of the coordinate system. 
+				A curve is composed of one or more curve segments. Each curve segment within a curve may be defined using a different interpolation method. The curve segments are connected to one another, with the end point of each segment except the last being the start point of the next segment in the segment list.
+				The orientation of the curve is positive.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:segments">
+						<annotation>
+							<documentation>This element encapsulates the segments of the curve.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="baseCurve" type="gml:CurvePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:baseCurve">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a curve via the XLink-attributes or contains the curve element. A curve element is any element which is substitutable for "_Curve".</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="OrientableCurve" type="gml:OrientableCurveType" substitutionGroup="gml:_Curve"/>
+	<!-- =========================================================== -->
+	<complexType name="OrientableCurveType">
+		<annotation>
+			<documentation>OrientableCurve consists of a curve and an orientation. If the orientation is "+", then the OrientableCurve is identical to the baseCurve. If the orientation is "-", then the OrientableCurve is related to another _Curve with a parameterization that reverses the sense of the curve traversal.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:baseCurve">
+						<annotation>
+							<documentation>References or contains the base curve (positive orientation).
+NOTE: This definition allows for a nested structure, i.e. an OrientableCurve may use another OrientableCurve as its base curve.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="orientation" type="gml:SignType" default="+">
+					<annotation>
+						<documentation>If the orientation is "+", then the OrientableCurve is identical to the baseCurve. If the orientation is "-", then the OrientableCurve is related to another _Curve with a parameterization that reverses the sense of the curve traversal. "+" is the default value.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- curve segments (1-dimensional) -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_CurveSegment" type="gml:AbstractCurveSegmentType" abstract="true">
+		<annotation>
+			<documentation>The "_CurveSegment" element is the abstract head of the substituition group for all curve segment elements, i.e. continuous segments of the same interpolation mechanism.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractCurveSegmentType" abstract="true">
+		<annotation>
+			<documentation>Curve segment defines a homogeneous segment of a curve.</documentation>
+		</annotation>
+		<sequence/>
+		<attribute name="numDerivativesAtStart" type="integer" use="optional" default="0">
+			<annotation>
+				<documentation>The attribute "numDerivativesAtStart" specifies the type of continuity between this curve segment and its predecessor. If this is the first curve segment in the curve, one of these values, as appropriate, is ignored. The default value of "0" means simple continuity, which is a mandatory minimum level of continuity. This level is referred to as "C 0 " in mathematical texts. A value of 1 means that the function and its first derivative are continuous at the appropriate e [...]
+NOTE: Use of these values is only appropriate when the basic curve definition is an underdetermined system. For example, line string segments cannot support continuity above C 0 , since there is no spare control parameter to adjust the incoming angle at the end points of the segment. Spline functions on the other hand often have extra degrees of freedom on end segments that allow them to adjust the values of the derivatives to support C 1 or higher continuity.</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="numDerivativesAtEnd" type="integer" use="optional" default="0">
+			<annotation>
+				<documentation>The attribute "numDerivativesAtEnd" specifies the type of continuity between this curve segment and its successor. If this is the last curve segment in the curve, one of these values, as appropriate, is ignored. The default value of "0" means simple continuity, which is a mandatory minimum level of continuity. This level is referred to as "C 0 " in mathematical texts. A value of 1 means that the function and its first derivative are continuous at the appropriate end po [...]
+NOTE: Use of these values is only appropriate when the basic curve definition is an underdetermined system. For example, line string segments cannot support continuity above C 0 , since there is no spare control parameter to adjust the incoming angle at the end points of the segment. Spline functions on the other hand often have extra degrees of freedom on end segments that allow them to adjust the values of the derivatives to support C 1 or higher continuity.</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="numDerivativeInterior" type="integer" use="optional" default="0">
+			<annotation>
+				<documentation>The attribute "numDerivativesInterior" specifies the type of continuity that is guaranteed interior to the curve. The default value of "0" means simple continuity, which is a mandatory minimum level of continuity. This level is referred to as "C 0 " in mathematical texts. A value of 1 means that the function and its first derivative are continuous at the appropriate end point: "C 1 " continuity. A value of "n" for any integer means the function and its first n derivati [...]
+NOTE: Use of these values is only appropriate when the basic curve definition is an underdetermined system. For example, line string segments cannot support continuity above C 0 , since there is no spare control parameter to adjust the incoming angle at the end points of the segment. Spline functions on the other hand often have extra degrees of freedom on end segments that allow them to adjust the values of the derivatives to support C 1 or higher continuity.</documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="segments" type="gml:CurveSegmentArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curve segments. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="CurveSegmentArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of curve segments.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_CurveSegment" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="LineStringSegment" type="gml:LineStringSegmentType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="LineStringSegmentType">
+		<annotation>
+			<documentation>A LineStringSegment is a curve segment that is defined by two or more coordinate tuples, with linear interpolation between them.
+				Note: LineStringSegment implements GM_LineString of ISO 19107.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be at least two.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="linear">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For a LineStringSegment the interpolation is fixed as "linear".</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="ArcString" type="gml:ArcStringType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcStringType">
+		<annotation>
+			<documentation>An ArcString is a curve segment that uses three-point circular arc interpolation.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be at least three.</documentation>
+						</annotation>
+						<choice minOccurs="3" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc3Points">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For an ArcString the interpolation is fixed as "circularArc3Points".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="numArc" type="integer" use="optional">
+					<annotation>
+						<documentation>The number of arcs in the arc string can be explicitly stated in this attribute. The number of control points in the arc string must be 2 * numArc + 1.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="Arc" type="gml:ArcType" substitutionGroup="gml:ArcString"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcType">
+		<annotation>
+			<documentation>An Arc is an arc string with only one arc unit, i.e. three control points.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ArcStringType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be three.</documentation>
+						</annotation>
+						<choice minOccurs="3" maxOccurs="3">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+				<attribute name="numArc" type="integer" use="optional" fixed="1">
+					<annotation>
+						<documentation>An arc is an arc string consiting of a single arc, the attribute is fixed to "1".</documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="Circle" type="gml:CircleType" substitutionGroup="gml:Arc"/>
+	<!-- =========================================================== -->
+	<complexType name="CircleType">
+		<annotation>
+			<documentation>A Circle is an arc whose ends coincide to form a simple closed loop. The "start" and "end" bearing are equal and shall be the bearing for the first controlPoint listed. The three control points must be distinct non-co-linear points for the Circle to be unambiguously defined. The arc is simply extended past the third control point until the first control point is encountered.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:ArcType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="ArcStringByBulge" type="gml:ArcStringByBulgeType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcStringByBulgeType">
+		<annotation>
+			<documentation>This variant of the arc computes the mid points of the arcs instead of storing the coordinates directly. The control point sequence consists of the start and end points of each arc plus the bulge.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be at least two.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="bulge" type="double" maxOccurs="unbounded">
+						<annotation>
+							<documentation>The bulge controls the offset of each arc's midpoint. The "bulge" is the real number multiplier for the normal that determines the offset direction of the midpoint of each arc. The length of the bulge sequence is exactly 1 less than the length of the control point array, since a bulge is needed for each pair of adjacent points in the control point array. The bulge is not given by a distance, since it is simply a multiplier for the normal.
+The midpoint of the resulting arc is given by: midPoint = ((startPoint + endPoint)/2.0) + bulge*normal</documentation>
+						</annotation>
+					</element>
+					<element name="normal" type="gml:VectorType" maxOccurs="unbounded">
+						<annotation>
+							<documentation>The attribute "normal" is a vector normal (perpendicular) to the chord of the arc, the line joining the first and last
+point of the arc. In a 2D coordinate system, there are only two possible directions for the normal, and it is often given as a signed real, indicating its length, with a positive sign indicating a left turn angle from the chord line, and a negative sign indicating a right turn from the chord. In 3D, the normal determines the plane of the arc, along with the start and endPoint of the arc.
+The normal is usually a unit vector, but this is not absolutely necessary. If the normal is a zero vector, the geometric object becomes equivalent to the straight line between the two end points. The length of the normal sequence is exactly the same as for the bulge sequence, 1 less than the control point sequence length.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc2PointWithBulge">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For an ArcStringByBulge the interpolation is fixed as "circularArc2PointWithBulge".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="numArc" type="integer" use="optional">
+					<annotation>
+						<documentation>The number of arcs in the arc string can be explicitly stated in this attribute. The number of control points in the arc string must be numArc + 1.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="ArcByBulge" type="gml:ArcByBulgeType" substitutionGroup="gml:ArcStringByBulge"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcByBulgeType">
+		<annotation>
+			<documentation>An ArcByBulge is an arc string with only one arc unit, i.e. two control points and one bulge.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ArcStringByBulgeType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be two.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="2">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="bulge" type="double">
+						<annotation>
+							<documentation>The bulge controls the offset of each arc's midpoint. The "bulge" is the real number multiplier for the normal that determines the offset direction of the midpoint of each arc. The length of the bulge sequence is exactly 1 less than the length of the control point array, since a bulge is needed for each pair of adjacent points in the control point array. The bulge is not given by a distance, since it is simply a multiplier for the normal.
+The midpoint of the resulting arc is given by: midPoint = ((startPoint + endPoint)/2.0) + bulge*normal</documentation>
+						</annotation>
+					</element>
+					<element name="normal" type="gml:VectorType">
+						<annotation>
+							<documentation>The attribute "normal" is a vector normal (perpendicular) to the chord of the arc, the line joining the first and last
+point of the arc. In a 2D coordinate system, there are only two possible directions for the normal, and it is often given as a signed real, indicating its length, with a positive sign indicating a left turn angle from the chord line, and a negative sign indicating a right turn from the chord. In 3D, the normal determines the plane of the arc, along with the start and endPoint of the arc.
+The normal is usually a unit vector, but this is not absolutely necessary. If the normal is a zero vector, the geometric object becomes equivalent to the straight line between the two end points. The length of the normal sequence is exactly the same as for the bulge sequence, 1 less than the control point sequence length.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="numArc" type="integer" use="optional" fixed="1">
+					<annotation>
+						<documentation>An arc is an arc string consiting of a single arc, the attribute is fixed to "1".</documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="ArcByCenterPoint" type="gml:ArcByCenterPointType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcByCenterPointType">
+		<annotation>
+			<documentation>This variant of the arc requires that the points on the arc have to be computed instead of storing the coordinates directly. The control point is the center point of the arc plus the radius and the bearing at start and end. This represenation can be used only in 2D.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) element. The "pos" element contains a center point that is only part of this curve segment, a "pointProperty" element contains a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element can be used to specifiy the coordinates of the center point, too. The number of direct positions in the list must be one.</documentation>
+						</annotation>
+						<choice>
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="radius" type="gml:LengthType">
+						<annotation>
+							<documentation>The radius of the arc.</documentation>
+						</annotation>
+					</element>
+					<element name="startAngle" type="gml:AngleType" minOccurs="0">
+						<annotation>
+							<documentation>The bearing of the arc at the start.</documentation>
+						</annotation>
+					</element>
+					<element name="endAngle" type="gml:AngleType" minOccurs="0">
+						<annotation>
+							<documentation>The bearing of the arc at the end.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArcCenterPointWithRadius">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For an ArcByCenterPoint the interpolation is fixed as "circularArcCenterPointWithRadius".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="numArc" type="integer" use="required" fixed="1">
+					<annotation>
+						<documentation>Since this type describes always a single arc, the attribute is fixed to "1".</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="CircleByCenterPoint" type="gml:CircleByCenterPointType" substitutionGroup="gml:ArcByCenterPoint"/>
+	<!-- =========================================================== -->
+	<complexType name="CircleByCenterPointType">
+		<annotation>
+			<documentation>A CircleByCenterPoint is an ArcByCenterPoint with identical start and end angle to form a full circle. Again, this represenation can be used only in 2D.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:ArcByCenterPointType"/>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================================ -->
+	<element name="OffsetCurve" type="gml:OffsetCurveType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- ================================================================================ -->
+	<complexType name="OffsetCurveType">
+		<annotation>
+			<documentation>An offset curve is a curve at a constant
+		 distance from the basis curve. They can be useful as a cheap
+		 and simple alternative to constructing curves that are offsets	
+		 by definition.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<element name="offsetBase" type="gml:CurvePropertyType">
+						<annotation>
+							<documentation>offsetBase is a reference to thecurve from which this
+							 curve is define	as an offset.</documentation>
+						</annotation>
+					</element>
+					<element name="distance" type="gml:LengthType">
+						<annotation>
+							<documentation>distance is the distance at which the
+							 offset curve is generated from the basis curve. In 2D systems, positive distances
+							 are to be to the left of the basis curve, and the negative distances are to be to the 
+							 right of the basis curve.</documentation>
+						</annotation>
+					</element>
+					<element name="refDirection" type="gml:VectorType" minOccurs="0">
+						<annotation>
+							<documentation>refDistance is used to define the vector
+       direction of the offset curve from the basis curve. It can
+       be omitted in the 2D case, where the distance can be 
+       positive or negative. In that case, distance defines left
+       side (positive distance) or right side (negative distance)
+       with respect to the tangent to the basis curve.
+
+       In 3D the basis curve shall have a well defined tangent 
+       direction for every point. The offset curve at any point 
+       in 3D, the basis curve shall have a well-defined tangent
+       direction for every point. The offset curve at any point
+       (parameter) on the basis curve c is in the direction
+       -   -   -         -               
+       s = v x t  where  v = c.refDirection()  
+       and
+       -
+       t = c.tangent()
+                                                    -
+       For the offset direction to be well-defined, v shall not
+       on any point of the curve be in the same, or opposite, 
+       direction as
+       - 
+       t.
+
+       The default value of the refDirection shall be the local
+       co-ordinate axis vector for elevation, which indicates up for
+       the curve in a geographic sense.
+
+       NOTE! If the refDirection is the positive tangent to the
+       local elevation axis ("points upward"), then the offset
+       vector points to the left of the curve when viewed from
+       above.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ====================================================== -->
+	<element name="AffinePlacement" type="gml:AffinePlacementType"/>
+	<!-- ====================================================== -->
+	<complexType name="AffinePlacementType">
+		<annotation>
+			<documentation>A placement takes a standard geometric
+   construction and places it in geographic space. It defines a
+   transformation from a constructive parameter space to the 
+   co-ordinate space of the co-ordinate reference system being used.  
+   Parameter spaces in formulae in this International Standard are 
+   given as (u, v) in 2D and(u, v, w) in 3D. Co-ordinate reference 
+   systems positions are given in formulae, in this International 
+   Standard, by either (x, y) in 2D, or (x, y, z) in 3D.
+
+   Affine placements are defined by linear transformations from 
+   parameter space to the target co-ordiante space. 2-dimensional 
+   Cartesian parameter space,(u,v) transforms into 3-dimensional co-
+   ordinate reference systems,(x,y,z) by using an affine 
+   transformation,(u,v)->(x,y,z) which is defined :
+
+	x	ux vx  	x0
+			 u	  
+	y =	uy vy   + y0
+			 v		
+	x	uz vz	z0
+	
+   Then, given this equation, the location element of the 
+   AffinePlacement is the direct position (x0, y0, z0), which is the
+   target position of the origin in (u, v). The two reference
+   directions (ux, uy, uz) and (vx, vy, vz) are the target     
+   directions of the unit vectors at the origin in (u, v).</documentation>
+		</annotation>
+		<sequence>
+			<element name="location" type="gml:DirectPositionType">
+				<annotation>
+					<documentation>The location property gives 
+     the target of the parameter space origin. This is the vector  
+    (x0, y0, z0) in the formulae above.</documentation>
+				</annotation>
+			</element>
+			<element name="refDirection" type="gml:VectorType" maxOccurs="unbounded">
+				<annotation>
+					<documentation>The attribute refDirection gives the    
+target directions for the co-ordinate basis vectors of the  
+parameter space. These are the columns of the matrix in the 
+formulae given above. The number of directions given shall be 
+inDimension. The dimension of the directions shall be 
+outDimension.</documentation>
+				</annotation>
+			</element>
+			<element name="inDimension" type="positiveInteger">
+				<annotation>
+					<documentation>Dimension of the constructive parameter 
+     space.</documentation>
+				</annotation>
+			</element>
+			<element name="outDimension" type="positiveInteger">
+				<annotation>
+					<documentation>Dimension of the co-ordinate space.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- = global element in "_CurveSegment" substitution group ========================== -->
+	<element name="Clothoid" type="gml:ClothoidType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- ======================================================================= -->
+	<complexType name="ClothoidType">
+		<annotation>
+			<documentation>A clothoid, or Cornu's spiral, is plane
+   curve whose curvature is a fixed function of its length.
+   In suitably chosen co-ordinates it is given by Fresnel's
+   integrals.
+
+    x(t) = 0-integral-t cos(AT*T/2)dT    
+    
+    y(t) = 0-integral-t sin(AT*T/2)dT
+   
+   This geometry is mainly used as a transition curve between
+   curves of type straight line to circular arc or circular arc
+   to circular arc. With this curve type it is possible to 
+   achieve a C2-continous transition between the above mentioned
+   curve types. One formula for the Clothoid is A*A = R*t where
+   A is constant, R is the varying radius of curvature along the
+   the curve and t is the length along and given in the Fresnel 
+   integrals.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<element name="refLocation">
+						<complexType>
+							<sequence>
+								<element ref="gml:AffinePlacement">
+									<annotation>
+										<documentation>The "refLocation" is an affine mapping 
+          that places  the curve defined by the Fresnel Integrals  
+          into the co-ordinate reference system of this object.</documentation>
+									</annotation>
+								</element>
+							</sequence>
+						</complexType>
+					</element>
+					<element name="scaleFactor" type="decimal">
+						<annotation>
+							<documentation>The element gives the value for the
+       constant in the Fresnel's integrals.</documentation>
+						</annotation>
+					</element>
+					<element name="startParameter" type="double">
+						<annotation>
+							<documentation>The startParameter is the arc length
+       distance from the inflection point that will be the start
+       point for this curve segment. This shall be lower limit
+       used in the Fresnel integral and is the value of the
+       constructive parameter of this curve segment at its start
+       point. The startParameter can either be positive or
+       negative. 
+       NOTE! If 0.0 (zero), lies between the startParameter and
+       the endParameter of the clothoid, then the curve goes
+       through the clothoid's inflection point, and the direction
+       of its radius of curvature, given by the second
+       derivative vector, changes sides with respect to the
+       tangent vector. The term length distance for the</documentation>
+						</annotation>
+					</element>
+					<element name="endParameter" type="double">
+						<annotation>
+							<documentation>The endParameter is the arc length
+       distance from the inflection point that will be the end
+       point for this curve segment. This shall be upper limit
+       used in the Fresnel integral and is the value of the
+       constructive parameter of this curve segment at its
+       start point. The startParameter can either be positive
+       or negative.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- = global element in "_CurveSegment" substitution group = -->
+	<element name="GeodesicString" type="gml:GeodesicStringType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- ======================================================== -->
+	<complexType name="GeodesicStringType">
+		<annotation>
+			<documentation>A GeodesicString consists of sequence of
+   geodesic segments. The type essentially combines a sequence of
+   Geodesic into a single object.
+   The GeodesicString is computed from two or more positions and an
+   interpolation using geodesics defined from the geoid (or 
+   ellipsoid) of the co-ordinate reference system being used.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<choice>
+					<element ref="gml:posList"/>
+					<group ref="gml:geometricPositionGroup" minOccurs="2" maxOccurs="unbounded"/>
+				</choice>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="geodesic">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the
+     curve interpolation mechanism used for this segment. This
+     mechanism uses the control points and control parameters to
+     determine the position of this curve segment. For an 
+     GeodesicString the interpolation is fixed as "geodesic".</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- = global element in "_CurveSegment" substitution group = -->
+	<element name="Geodesic" type="gml:GeodesicType" substitutionGroup="gml:GeodesicString"/>
+	<!-- ======================================================== -->
+	<complexType name="GeodesicType">
+		<annotation>
+			<documentation>A Geodesic consists of two distinct
+   positions joined by a geodesic curve. The control points of
+   a Geodesic shall lie on the geodesic between its start
+   point and end points. Between these two points, a geodesic
+   curve defined from ellipsoid or geoid model used by the
+   co-ordinate reference systems may be used to interpolate
+   other positions. Any other point in the controlPoint array
+   must fall on this geodesic.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:GeodesicStringType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="CubicSpline" type="gml:CubicSplineType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="CubicSplineType">
+		<annotation>
+			<documentation>Cubic splines are similar to line strings in that they are a sequence of segments each with its own defining function. A cubic spline uses the control points and a set of derivative parameters to define a piecewise 3rd degree polynomial interpolation. Unlike line-strings, the parameterization by arc length is not necessarily still a polynomial. 
+				The function describing the curve must be C2, that is, have a continuous 1st and 2nd derivative at all points, and pass through the controlPoints in the order given. Between the control points, the curve segment is defined by a cubic polynomial. At each control point, the polynomial changes in such a manner that the 1st and 2nd derivative vectors are the same from either side. The control parameters record must contain vectorAtStart, and vectorAtEnd which are the unit tangent vectors [...]
+				Note: only the direction of the vectors is relevant, not their length.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be at least three.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="vectorAtStart" type="gml:VectorType">
+						<annotation>
+							<documentation>"vectorAtStart" is the unit tangent vector at the start point of the spline.</documentation>
+						</annotation>
+					</element>
+					<element name="vectorAtEnd" type="gml:VectorType">
+						<annotation>
+							<documentation>"vectorAtEnd" is the unit tangent vector at the end point of the spline.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="cubicSpline">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For a CubicSpline the interpolation is fixed as "cubicSpline".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="degree" type="integer" fixed="3">
+					<annotation>
+						<documentation>The degree for a cubic spline is "3".</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="KnotType">
+		<annotation>
+			<documentation>A knot is a breakpoint on a piecewise spline curve.</documentation>
+		</annotation>
+		<sequence>
+			<element name="value" type="double">
+				<annotation>
+					<documentation>The property "value" is the value of the parameter at the knot of the spline. The sequence of knots shall be a non-decreasing sequence. That is, each knot's value in the sequence shall be equal to or greater than the previous knot's value. The use of equal consecutive knots is normally handled using the multiplicity.</documentation>
+				</annotation>
+			</element>
+			<element name="multiplicity" type="nonNegativeInteger">
+				<annotation>
+					<documentation>The property "multiplicity" is the multiplicity of this knot used in the definition of the spline (with the same weight).</documentation>
+				</annotation>
+			</element>
+			<element name="weight" type="double">
+				<annotation>
+					<documentation>The property "weight" is the value of the averaging weight used for this knot of the spline.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="KnotPropertyType">
+		<annotation>
+			<documentation>Encapsulates a knot to use it in a geometric type.</documentation>
+		</annotation>
+		<sequence>
+			<element name="Knot" type="gml:KnotType"/>
+		</sequence>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="BSpline" type="gml:BSplineType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="BSplineType">
+		<annotation>
+			<documentation>A B-Spline is a piecewise parametric polynomial or rational curve described in terms of control points and basis functions. Knots are breakpoints on the curve that connect its pieces. They are given as a non-decreasing sequence of real numbers. If the weights in the knots are equal then it is a polynomial spline. The degree is the algebraic degree of the basis functions.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only.</documentation>
+						</annotation>
+						<choice minOccurs="0" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="degree" type="nonNegativeInteger">
+						<annotation>
+							<documentation>The attribute "degree" shall be the degree of the polynomial used for interpolation in this spline.</documentation>
+						</annotation>
+					</element>
+					<element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>The property "knot" shall be the sequence of distinct knots used to define the spline basis functions.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" default="polynomialSpline">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For a BSpline the interpolation can be either "polynomialSpline" or "rationalSpline", default is "polynomialSpline".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="isPolynomial" type="boolean" use="optional">
+					<annotation>
+						<documentation>The attribute isPolynomial is set to true if this is a polynomial spline.</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="knotType" type="gml:KnotTypesType" use="optional">
+					<annotation>
+						<documentation>The attribute "knotType" gives the type of knot distribution used in defining this spline. This is for information only
+and is set according to the different construction-functions.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="Bezier" type="gml:BezierType" substitutionGroup="gml:BSpline"/>
+	<!-- =========================================================== -->
+	<complexType name="BezierType">
+		<annotation>
+			<documentation>Bezier curves are polynomial splines that use Bezier or Bernstein polynomials for interpolation purposes. It is a special case of the B-Spline curve with two knots.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:BSplineType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only.</documentation>
+						</annotation>
+						<choice minOccurs="0" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="degree" type="nonNegativeInteger">
+						<annotation>
+							<documentation>The attribute "degree" shall be the degree of the polynomial used for interpolation in this spline.</documentation>
+						</annotation>
+					</element>
+					<element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="2">
+						<annotation>
+							<documentation>The property "knot" shall be the sequence of distinct knots used to define the spline basis functions.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="polynomialSpline">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For a Bezier the interpolation is fixed as "polynomialSpline".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="isPolynomial" type="boolean" fixed="true">
+					<annotation>
+						<documentation>The attribute isPolynomial is set to true as this is a polynomial spline.</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="knotType" type="gml:KnotTypesType" use="prohibited">
+					<annotation>
+						<documentation>The property "knotType" is not relevant for Bezier curve segments.</documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Surface" type="gml:SurfaceType" substitutionGroup="gml:_Surface"/>
+	<!-- =========================================================== -->
+	<complexType name="SurfaceType">
+		<annotation>
+			<documentation>A Surface is a 2-dimensional primitive and is composed of one or more surface patches. The surface patches are connected to one another.
+				The orientation of the surface is positive ("up"). The orientation of a surface chooses an "up" direction through the choice of the upward normal, which, if the surface is not a cycle, is the side of the surface from which the exterior boundary appears counterclockwise. Reversal of the surface orientation reverses the curve orientation of each boundary component, and interchanges the conceptual "up" and "down" direction of the surface. If the surface is the boundary of a solid, the " [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:patches">
+						<annotation>
+							<documentation>This element encapsulates the patches of the surface.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="baseSurface" type="gml:SurfacePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:baseSurface">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. A surface element is any element which is substitutable for "_Surface".</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="OrientableSurface" type="gml:OrientableSurfaceType" substitutionGroup="gml:_Surface"/>
+	<!-- =========================================================== -->
+	<complexType name="OrientableSurfaceType">
+		<annotation>
+			<documentation>OrientableSurface consists of a surface and an orientation. If the orientation is "+", then the OrientableSurface is identical to the baseSurface. If the orientation is "-", then the OrientableSurface is a reference to a Surface with an up-normal that reverses the direction for this OrientableSurface, the sense of "the top of the surface".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:baseSurface">
+						<annotation>
+							<documentation>References or contains the base surface (positive orientation).</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="orientation" type="gml:SignType" default="+">
+					<annotation>
+						<documentation>If the orientation is "+", then the OrientableSurface is identical to the baseSurface. If the orientation is "-", then the OrientableSurface is a reference to a Surface with an up-normal that reverses the direction for this OrientableSurface, the sense of "the top of the surface". "+" is the default value.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- surface patches (2-dimensional) -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_SurfacePatch" type="gml:AbstractSurfacePatchType" abstract="true">
+		<annotation>
+			<documentation>The "_SurfacePatch" element is the abstract head of the substituition group for all surface pach elements describing a continuous portion of a surface.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractSurfacePatchType" abstract="true">
+		<annotation>
+			<documentation>A surface patch defines a homogenuous portion of a surface.</documentation>
+		</annotation>
+		<sequence/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="patches" type="gml:SurfacePatchArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of surface patches. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="SurfacePatchArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of surface patches.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:_SurfacePatch"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="PolygonPatch" type="gml:PolygonPatchType" substitutionGroup="gml:_SurfacePatch"/>
+	<!-- =========================================================== -->
+	<complexType name="PolygonPatchType">
+		<annotation>
+			<documentation>A PolygonPatch is a surface patch that is defined by a set of boundary curves and an underlying surface to which these curves adhere. The curves are coplanar and the polygon uses planar interpolation in its interior. Implements GM_Polygon of ISO 19107.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior" minOccurs="0"/>
+					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the interpolation mechanism used for this surface patch. Currently only planar surface patches are defined in GML 3, the attribute is fixed to "planar", i.e. the interpolation method shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Triangle" type="gml:TriangleType" substitutionGroup="gml:_SurfacePatch"/>
+	<!-- =========================================================== -->
+	<complexType name="TriangleType">
+		<annotation>
+			<documentation>Represents a triangle as a surface with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring must be four.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior">
+						<annotation>
+							<documentation>Constraint: The Ring shall be a LinearRing and must form a triangle, the first and the last position must be co-incident.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the interpolation mechanism used for this surface patch. Currently only planar surface patches are defined in GML 3, the attribute is fixed to "planar", i.e. the interpolation method shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Rectangle" type="gml:RectangleType" substitutionGroup="gml:_SurfacePatch"/>
+	<!-- =========================================================== -->
+	<complexType name="RectangleType">
+		<annotation>
+			<documentation>Represents a rectangle as a surface with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring must be five.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior">
+						<annotation>
+							<documentation>Constraint: The Ring shall be a LinearRing and must form a rectangle; the first and the last position must be co-incident.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the interpolation mechanism used for this surface patch. Currently only planar surface patches are defined in GML 3, the attribute is fixed to "planar", i.e. the interpolation method shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="curveMember" type="gml:CurvePropertyType">
+		<annotation>
+			<documentation>This property element either references a curve via the XLink-attributes or contains the curve element. A curve element is any element which is substitutable for "_Curve".</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Ring" type="gml:RingType" substitutionGroup="gml:_Ring"/>
+	<!-- =========================================================== -->
+	<complexType name="RingType">
+		<annotation>
+			<documentation>A Ring is used to represent a single connected component of a surface boundary. It consists of a sequence of curves connected in a cycle (an object whose boundary is empty).
+A Ring is structurally similar to a composite curve in that the endPoint of each curve in the sequence is the startPoint of the next curve in the Sequence. Since the sequence is circular, there is no exception to this rule. Each ring, like all boundaries, is a cycle and each ring is simple.
+NOTE: Even though each Ring is simple, the boundary need not be simple. The easiest case of this is where one of the interior rings of a surface is tangent to its exterior ring.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractRingType">
+				<sequence>
+					<element ref="gml:curveMember" maxOccurs="unbounded">
+						<annotation>
+							<documentation>This element references or contains one curve in the composite curve. The curves are contiguous, the collection of curves is ordered.
+NOTE: This definition allows for a nested structure, i.e. a CompositeCurve may use, for example, another CompositeCurve as a curve member.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="RingPropertyType">
+		<annotation>
+			<documentation>Encapsulates a ring to represent properties in features or geometry collections.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:Ring"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<group name="PointGrid">
+		<annotation>
+			<documentation>Reference points which are organised
+   into sequences or grids(sequences of equal length sequences).</documentation>
+		</annotation>
+		<sequence>
+			<element name="row" maxOccurs="unbounded">
+				<complexType>
+					<sequence>
+						<group ref="gml:geometricPositionListGroup"/>
+					</sequence>
+				</complexType>
+			</element>
+		</sequence>
+	</group>
+	<!-- ====================================================== -->
+	<element name="_ParametricCurveSurface" type="gml:AbstractParametricCurveSurfaceType" abstract="true" substitutionGroup="gml:_SurfacePatch"/>
+	<!-- ====================================================== -->
+	<complexType name="AbstractParametricCurveSurfaceType">
+		<annotation>
+			<documentation>
+			</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType"/>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="_GriddedSurface" type="gml:AbstractGriddedSurfaceType" abstract="true" substitutionGroup="gml:_ParametricCurveSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="AbstractGriddedSurfaceType">
+		<annotation>
+			<documentation>A gridded surface is a parametric curve
+   surface derived from a rectangular grid in the parameter
+   space. The rows from this grid are control points for
+   horizontal surface curves; the columns are control points
+   for vertical surface curves. The working assumption is that
+   for a pair of parametric co-ordinates (s, t) that the
+   horizontal curves for each integer offset are calculated
+   and evaluated at "s". The defines a sequence of control
+   points:
+   
+   cn(s) : s  1 .....columns 
+
+   From this sequence a vertical curve is calculated for "s",
+   and evaluated at "t". In most cases, the order of
+   calculation (horizontal-vertical vs. vertical-horizontal)
+   does not make a difference. Where it does, the horizontal-   
+   vertical order shall be the one used.
+
+   Logically, any pair of curve interpolation types can lead
+   to a subtype of GriddedSurface. The following clauses
+   define some most commonly encountered surfaces that can
+   be represented in this manner.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractParametricCurveSurfaceType">
+				<sequence>
+					<group ref="gml:PointGrid">
+						<annotation>
+							<documentation>This is the double indexed sequence
+       of control points, given in row major form. 
+       NOTE! There in no assumption made about the shape
+       of the grid. 
+       For example, the positions need not effect a "21/2D"
+       surface, consecutive points may be equal in any or all
+       of the ordinates. Further, the curves in either or both
+       directions may close.</documentation>
+						</annotation>
+					</group>
+					<element name="rows" type="integer" minOccurs="0">
+						<annotation>
+							<documentation>The attribute rows gives the number
+         of rows in the parameter grid.</documentation>
+						</annotation>
+					</element>
+					<element name="columns" type="integer" minOccurs="0">
+						<annotation>
+							<documentation>The attribute columns gives the number
+        of columns in the parameter grid.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="Cone" type="gml:ConeType" substitutionGroup="gml:_GriddedSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="ConeType">
+		<annotation>
+			<documentation>A cone is a gridded surface given as a
+   family of conic sections whose control points vary linearly.
+   NOTE! A 5-point ellipse with all defining positions identical
+   is a point. Thus, a truncated elliptical cone can be given as a
+   2x5 set of control points
+   ((P1, P1, P1, P1, P1), (P2, P3, P4, P5, P6)). P1 is the apex 
+   of the cone. P2, P3,P4, P5 and P6 are any five distinct points
+   around the base ellipse of the cone. If the horizontal curves
+   are circles as opposed to ellipses, the a circular cone can
+   be constructed using ((P1, P1, P1),(P2, P3, P4)). The apex most     
+   not coinside with the other plane.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="Cylinder" type="gml:CylinderType" substitutionGroup="gml:_GriddedSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="CylinderType">
+		<annotation>
+			<documentation>A cylinder is a gridded surface given as a
+   family of circles whose positions vary along a set of parallel
+   lines, keeping the cross sectional horizontal curves of a
+   constant shape.
+   NOTE! Given the same working assumptions as in the previous
+   note, a Cylinder can be given by two circles, giving us the
+   control points of the form ((P1, P2, P3),(P4, P5, P6)).</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="Sphere" type="gml:SphereType" substitutionGroup="gml:_GriddedSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="SphereType">
+		<annotation>
+			<documentation>A sphere is a gridded surface given as a
+   family of circles whose positions vary linearly along the
+   axis of the sphere, and whise radius varies in proportions to
+   the cosine function of the central angle. The horizontal 
+   circles resemble lines of constant latitude, and the vertical
+   arcs resemble lines of constant longitude. 
+   NOTE! If the control points are sorted in terms of increasing
+   longitude, and increasing latitude, the upNormal of a sphere
+   is the outward normal.
+   EXAMPLE If we take a gridded set of latitudes and longitudes
+   in degrees,(u,v) such as
+
+	(-90,-180)  (-90,-90)  (-90,0)  (-90,  90) (-90, 180) 
+	(-45,-180)  (-45,-90)  (-45,0)  (-45,  90) (-45, 180) 
+	(  0,-180)  (  0,-90)  (  0,0)  (  0,  90) (  0, 180)
+	( 45,-180)  ( 45,-90)  ( 45,0)  ( 45, -90) ( 45, 180)
+	( 90,-180)  ( 90,-90)  ( 90,0)  ( 90, -90) ( 90, 180)
+   
+   And map these points to 3D using the usual equations (where R
+   is the radius of the required sphere).
+
+    z = R sin u
+    x = (R cos u)(sin v)
+    y = (R cos u)(cos v)
+
+   We have a sphere of Radius R, centred at (0,0), as a gridded
+   surface. Notice that the entire first row and the entire last
+   row of the control points map to a single point in each 3D
+   Euclidean space, North and South poles respectively, and that
+   each horizontal curve closes back on itself forming a 
+   geometric cycle. This gives us a metrically bounded (of finite
+   size), topologically unbounded (not having a boundary, a
+   cycle) surface.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="PolyhedralSurface" type="gml:PolyhedralSurfaceType" substitutionGroup="gml:Surface"/>
+	<!-- ======================================================== -->
+	<complexType name="PolyhedralSurfaceType">
+		<annotation>
+			<documentation>A polyhedral surface is a surface composed
+   of polygon surfaces connected along their common boundary 
+   curves. This differs from the surface type only in the
+   restriction on the types of surface patches acceptable.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfaceType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:polygonPatches">
+						<annotation>
+							<documentation>This property encapsulates the patches of 
+      the polyhedral surface.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="polygonPatches" type="gml:PolygonPatchArrayPropertyType" substitutionGroup="gml:patches">
+		<annotation>
+			<documentation>This property element contains a list of
+   polygon patches. The order of the patches is significant and 
+   shall be preserved when processing the list.</documentation>
+		</annotation>
+	</element>
+	<!-- ======================================================== -->
+	<complexType name="PolygonPatchArrayPropertyType">
+		<annotation>
+			<documentation>This type defines a container for an array of 
+   polygon patches.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfacePatchArrayPropertyType">
+				<sequence minOccurs="0" maxOccurs="unbounded">
+					<element ref="gml:PolygonPatch"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="trianglePatches" type="gml:TrianglePatchArrayPropertyType" substitutionGroup="gml:patches">
+		<annotation>
+			<documentation>This property element contains a list of
+   triangle patches. The order of the patches is significant and 
+   shall be preserved when processing the list.</documentation>
+		</annotation>
+	</element>
+	<!-- ======================================================== -->
+	<complexType name="TrianglePatchArrayPropertyType">
+		<annotation>
+			<documentation>This type defines a container for an array of 
+     triangle patches.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfacePatchArrayPropertyType">
+				<sequence minOccurs="0" maxOccurs="unbounded">
+					<element ref="gml:Triangle"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="TriangulatedSurface" type="gml:TriangulatedSurfaceType" substitutionGroup="gml:Surface"/>
+	<!-- ======================================================== -->
+	<complexType name="TriangulatedSurfaceType">
+		<annotation>
+			<documentation>A triangulated surface is a polyhedral 
+   surface that is composed only of triangles. There is no
+   restriction on how the triangulation is derived.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfaceType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:trianglePatches">
+						<annotation>
+							<documentation>This property encapsulates the patches of 
+      the triangulated surface.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="Tin" type="gml:TinType" substitutionGroup="gml:TriangulatedSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="TinType">
+		<annotation>
+			<documentation>A tin is a triangulated surface that uses
+   the Delauny algorithm or a similar algorithm complemented with
+   consideration of breaklines, stoplines, and maximum length of 
+   triangle sides. These networks satisfy the Delauny's criterion
+   away from the modifications: Fore each triangle in the 
+   network, the circle passing through its vertices does not
+   contain, in its interior, the vertex of any other triangle.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:TriangulatedSurfaceType">
+				<sequence>
+					<element name="stopLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Stoplines are lines where the local
+       continuity or regularity of the surface is questionable.
+       In the area of these pathologies, triangles intersecting
+       a stopline shall be removed from the tin surface, leaving
+       holes in the surface. If coincidence occurs on surface
+       boundary triangles, the result shall be a change of the 
+       surface boundary. Stoplines contains all these
+       pathological segments as a set of line strings.</documentation>
+						</annotation>
+					</element>
+					<element name="breakLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Breaklines are lines of a critical
+       nature to the shape of the surface, representing local
+       ridges, or depressions (such as drainage lines) in the
+       surface. As such their constituent segments must be
+       included in the tin eve if doing so
+       violates the Delauny criterion. Break lines contains these
+       critical segments as a set of line strings.</documentation>
+						</annotation>
+					</element>
+					<element name="maxLength" type="gml:LengthType">
+						<annotation>
+							<documentation>Areas of the surface where data is not 
+       sufficiently dense to assure reasonable calculation shall be    
+       removed by adding a retention criterion for triangles based 
+       on the length of their sides. For many triangle sides  
+       exceeding maximum length, the adjacent triangles to that 
+       triangle side shall be removed from the surface.</documentation>
+						</annotation>
+					</element>
+					<element name="controlPoint">
+						<annotation>
+							<documentation>The corners of the triangles in the TIN 
+  are often referred to as pots. ControlPoint shall contain a 
+  set of the GM_Position used as posts for this TIN. Since each  
+  TIN contains triangles, there must be at least 3 posts. The 
+       order in which these points are given does not affect the 
+       surface that is represented. Application schemas may add 
+       information based on ordering of control points to facilitate 
+       the reconstruction of the TIN from the control points.</documentation>
+						</annotation>
+						<complexType>
+							<choice>
+								<element ref="gml:posList"/>
+								<group ref="gml:geometricPositionGroup" minOccurs="3" maxOccurs="unbounded"/>
+							</choice>
+						</complexType>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="LineStringSegmentArrayPropertyType">
+		<sequence>
+			<element ref="gml:LineStringSegment" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- primitive geometry objects (3-dimensional) -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_Solid" type="gml:AbstractSolidType" abstract="true" substitutionGroup="gml:_GeometricPrimitive">
+		<annotation>
+			<documentation>The "_Solid" element is the abstract head of the substituition group for all (continuous) solid elements.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractSolidType">
+		<annotation>
+			<documentation>An abstraction of a solid to support the different levels of complexity. A solid is always contiguous.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="solidProperty" type="gml:SolidPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:solidProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a solid via the XLink-attributes or contains the solid element. solidProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for _Solid.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="SolidPropertyType">
+		<annotation>
+			<documentation>A property that has a solid as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Solid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="solidArrayProperty" type="gml:SolidArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="SolidArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of solids. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:_Solid"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Solid" type="gml:SolidType" substitutionGroup="gml:_Solid"/>
+	<!-- =========================================================== -->
+	<complexType name="SolidType">
+		<annotation>
+			<documentation>A solid is the basis for 3-dimensional geometry. The extent of a solid is defined by the boundary surfaces (shells). A shell is represented by a composite surface, where every  shell is used to represent a single connected component of the boundary of a solid. It consists of a composite surface (a list of orientable surfaces) connected in a topological cycle (an object whose boundary is empty). Unlike a Ring, a Shell's elements have no natural sort order. Like Rings, Sh [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSolidType">
+				<sequence>
+					<element name="exterior" type="gml:SurfacePropertyType" minOccurs="0">
+						<annotation>
+							<appinfo>
+								<sch:pattern name="Check either href or content not both">
+									<sch:rule context="gml:exterior">
+										<sch:extends rule="hrefOrContent"/>
+									</sch:rule>
+								</sch:pattern>
+							</appinfo>
+							<documentation>Boundaries of solids are similar to surface boundaries. In normal 3-dimensional Euclidean space, one (composite) surface is distinguished as the exterior. In the more general case, this is not always possible.</documentation>
+						</annotation>
+					</element>
+					<element name="interior" type="gml:SurfacePropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<appinfo>
+								<sch:pattern name="Check either href or content not both">
+									<sch:rule context="gml:interior">
+										<sch:extends rule="hrefOrContent"/>
+									</sch:rule>
+								</sch:pattern>
+							</appinfo>
+							<documentation>Boundaries of solids are similar to surface boundaries.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- predefined simple types (enumerations, simple typed arrays) -->
+	<!-- =========================================================== -->
+	<simpleType name="CurveInterpolationType">
+		<annotation>
+			<documentation>CurveInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an
+application schema.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="linear"/>
+			<enumeration value="geodesic"/>
+			<enumeration value="circularArc3Points"/>
+			<enumeration value="circularArc2PointWithBulge"/>
+			<enumeration value="circularArcCenterPointWithRadius"/>
+			<enumeration value="elliptical"/>
+			<enumeration value="clothoid"/>
+			<enumeration value="conic"/>
+			<enumeration value="polynomialSpline"/>
+			<enumeration value="cubicSpline"/>
+			<enumeration value="rationalSpline"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="SurfaceInterpolationType">
+		<annotation>
+			<documentation>SurfaceInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an
+application schema.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="none"/>
+			<enumeration value="planar"/>
+			<enumeration value="spherical"/>
+			<enumeration value="elliptical"/>
+			<enumeration value="conic"/>
+			<enumeration value="tin"/>
+			<enumeration value="parametricCurve"/>
+			<enumeration value="polynomialSpline"/>
+			<enumeration value="rationalSpline"/>
+			<enumeration value="triangulatedSpline"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="KnotTypesType">
+		<annotation>
+			<documentation>Defines allowed values for the knots` type. Uniform knots implies that all knots are of multiplicity 1 and they differ by a positive constant from the preceding knot. Knots are quasi-uniform iff they are of multiplicity (degree + 1) at the ends, of multiplicity 1 elsewhere, and they differ by a positive constant from the preceding knot.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="uniform"/>
+			<enumeration value="quasiUniform"/>
+			<enumeration value="piecewiseBezier"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/gml.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/gml.xsd
new file mode 100755
index 0000000..dc97c00
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/gml.xsd
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml"
+        xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:gml:3.1.1">gml.xsd</appinfo>
+		<documentation>Top level GML schema
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<include schemaLocation="dynamicFeature.xsd"/>
+	<include schemaLocation="topology.xsd"/>
+	<include schemaLocation="coverage.xsd"/>
+	<include schemaLocation="coordinateReferenceSystems.xsd"/>
+	<include schemaLocation="observation.xsd"/>
+	<include schemaLocation="defaultStyle.xsd"/>
+	<include schemaLocation="temporalReferenceSystems.xsd"/>
+	<!-- ====================================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/gmlBase.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/gmlBase.xsd
new file mode 100755
index 0000000..ae0713b
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/gmlBase.xsd
@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:gmlBase:3.1.1">
+			<sch:title>Schematron validation</sch:title>
+			<sch:ns prefix="gml" uri="http://www.opengis.net/gml"/>
+			<sch:ns prefix="xlink" uri="http://www.w3.org/1999/xlink"/>
+			<sch:pattern name="Check either href or content not both">
+				<sch:rule abstract="true" id="hrefOrContent">
+					<sch:report test="@xlink:href and (*|text())">Property element may not carry both a reference to an object and contain an object.</sch:report>
+					<sch:assert test="@xlink:href | (*|text())">Property element must either carry a reference to an object or contain an object.</sch:assert>
+				</sch:rule>
+			</sch:pattern>
+		</appinfo>
+		<documentation>GML base schema for GML 3
+			Components to support the GML encoding model.
+			The abstract Schematron rules can be used by any schema that includes gmlBase.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="basicTypes.xsd"/>
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<!-- =========================================================== -->
+	<!-- ==================== Objects ================================ -->
+	<!-- =========================================================== -->
+	<!-- =========== Abstract "Object" is "anyType" ============= -->
+	<!-- ===== Global element at the head of the "Object" substitution group ======== -->
+	<element name="_Object" abstract="true">
+		<annotation>
+			<documentation>This abstract element is the head of a substitutionGroup hierararchy which may contain either simpleContent or complexContent elements.  It is used to assert the model position of "class" elements declared in other GML schemas.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================= -->
+	<!-- =========== Abstract "GMLobject" supertype ========================= -->
+	<element name="_GML" type="gml:AbstractGMLType" abstract="true" substitutionGroup="gml:_Object">
+		<annotation>
+			<documentation>Global element which acts as the head of a substitution group that may include any element which is a GML feature, object, geometry or complex value</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<group name="StandardObjectProperties">
+		<annotation>
+			<documentation>This content model group makes it easier to construct types that 
+      derive from AbstractGMLType and its descendents "by restriction".  
+      A reference to the group saves having to enumerate the standard object properties.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+			<element ref="gml:description" minOccurs="0"/>
+			<element ref="gml:name" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Multiple names may be provided.  These will often be distinguished by being assigned by different authorities, as indicated by the value of the codeSpace attribute.  In an instance document there will usually only be one name per authority.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</group>
+	<!-- =========================================================== -->
+	<complexType name="AbstractGMLType" abstract="true">
+		<annotation>
+			<documentation>All complexContent GML elements are directly or indirectly derived from this abstract supertype 
+	to establish a hierarchy of GML types that may be distinguished from other XML types by their ancestry. 
+	Elements in this hierarchy may have an ID and are thus referenceable.</documentation>
+		</annotation>
+		<sequence>
+			<group ref="gml:StandardObjectProperties"/>
+		</sequence>
+		<attribute ref="gml:id" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Concrete "Collection" supertype ========================= -->
+	<element name="Bag" type="gml:BagType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>Generic GML element to contain a heterogeneous collection of GML _Objects</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="BagType">
+		<annotation>
+			<documentation>A non-abstract generic collection type that can be used as a document element for a collection of any GML types - Geometries, Topologies, Features ...
+
+FeatureCollections may only contain Features.  GeometryCollections may only contain Geometrys.  Bags are less constrained  they must contain objects that are substitutable for gml:_Object.  This may mix several levels, including Features, Definitions, Dictionaries, Geometries etc.  
+
+The content model would ideally be 
+   member 0..*
+   members 0..1
+   member 0..*
+for maximum flexibility in building a collection from both homogeneous and distinct components: 
+included "member" elements each contain a single Object
+an included "members" element contains a set of Objects 
+
+However, this is non-deterministic, thus prohibited by XSD.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:member" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:members" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Concrete "Array" supertype ========================= -->
+	<element name="Array" type="gml:ArrayType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>Generic GML element to contain a homogeneous array of GML _Objects</documentation>
+		</annotation>
+	</element>
+	<!-- ======================================================================= -->
+	<complexType name="ArrayType">
+		<annotation>
+			<documentation>A non-abstract generic collection type that can be used as a document element for a homogeneous collection of any GML types - Geometries, Topologies, Features ...</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:members" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Abstract Metadata supertype ========================= -->
+	<element name="_MetaData" type="gml:AbstractMetaDataType" abstract="true" substitutionGroup="gml:_Object">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group for packages of MetaData properties.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractMetaDataType" abstract="true" mixed="true">
+		<annotation>
+			<documentation>An abstract base type for complex metadata types.</documentation>
+		</annotation>
+		<attribute ref="gml:id" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Container for Generic Metadata ========================= -->
+	<element name="GenericMetaData" type="gml:GenericMetaDataType" substitutionGroup="gml:_MetaData">
+		<annotation>
+			<documentation>Concrete element in the _MetaData substitution group, which permits any well-formed XML content.  Intended to act as a container for metadata defined in external schemas, for which it is not possible to add the concrete components to the GML _MetaData substitution group directly. Deprecated with GML version 3.1.0.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GenericMetaDataType" mixed="true">
+		<annotation>
+			<documentation>Deprecated with GML version 3.1.0.</documentation>
+		</annotation>
+		<complexContent mixed="true">
+			<extension base="gml:AbstractMetaDataType">
+				<sequence>
+					<any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ================== Base Property Types ============================== -->
+	<!-- ================================================================== -->
+	<!-- ==== property types for unspecified association - by Value or by Reference ==== -->
+	<!-- ====== single Objects - by Value or by Reference ======== -->
+	<element name="_association" type="gml:AssociationType" abstract="true"/>
+	<!-- =========================================================== -->
+	<element name="_strictAssociation" type="gml:AssociationType" abstract="true">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:_strictAssociation">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>must carry a reference to an object or contain an object but not both</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="member" type="gml:AssociationType"/>
+	<!-- =========================================================== -->
+	<complexType name="AssociationType">
+		<annotation>
+			<documentation>A pattern or base for derived types used to specify complex types corresponding to an  unspecified UML association - either composition or aggregation.  Restricts the cardinality of Objects contained in the association to a maximum of one.  An instance of this type can contain an element representing an Object, or serve as a pointer to a remote Object.  
+
+Descendents of this type can be restricted in an application schema to 
+* allow only specified classes as valid participants in the aggregation
+* allow only association by reference (i.e. empty the content model) or by value (i.e. remove the xlinks).    
+
+When used for association by reference, the value of the gml:remoteSchema attribute can be used to locate a schema fragment that constrains the target instance.   
+
+In many cases it is desirable to impose the constraint prohibiting the occurence of both reference and value in the same instance, as that would be ambiguous.  This is accomplished by adding a directive in the annotation element of the element declaration.  This directive can be in the form of normative prose, or can use a Schematron pattern to automatically constrain co-occurrence - see the declaration for _strictAssociation below.   
+
+If co-occurence is not prohibited, then both a link and content may be present.  If this occurs in an instance, then the rule for interpretation is that the instance found by traversing the href provides the normative value of the property, and should be used when possible.  The value(s) included as content may be used if the remote instance cannot be resolved.  This may be considered to be a "cached" version of the value(s).</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Object"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="_reference" type="gml:ReferenceType" abstract="true"/>
+	<!-- =========================================================== -->
+	<complexType name="ReferenceType">
+		<annotation>
+			<documentation>A pattern or base for derived types used to specify complex types corresponding to a UML aggregation association.  An instance of this type serves as a pointer to a remote Object.</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- ========= multiple objects  - by Value or by Reference ================== -->
+	<element name="members" type="gml:ArrayAssociationType"/>
+	<!-- =========================================================== -->
+	<complexType name="ArrayAssociationType">
+		<annotation>
+			<documentation>A base for derived types used to specify complex types containing an array of objects, by unspecified UML association - either composition or aggregation.  An instance of this type contains elements representing Objects.
+
+Ideally this type would be derived by extension of AssociationType.  
+However, this leads to a non-deterministic content model, since both the base and the extension have minOccurs="0", and is thus prohibited in XML Schema.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Object" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Abstract "property" supertype ========================= -->
+	<element name="metaDataProperty" type="gml:MetaDataPropertyType">
+		<annotation>
+			<documentation>Contains or refers to a metadata package that contains metadata properties.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MetaDataPropertyType">
+		<annotation>
+			<documentation>Base type for complex metadata property types.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<any processContents="lax"/>
+			<!-- <element ref="gml:_MetaData"/> -->
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attribute name="about" type="anyURI" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- ==========================================================
+	global attribute, attribute group and element declarations 
+	============================================================  -->
+	<attribute name="id" type="ID">
+		<annotation>
+			<documentation>Database handle for the object.  It is of XML type ID, so is constrained to be unique in the XML document within which it occurs.  An external identifier for the object in the form of a URI may be constructed using standard XML and XPointer methods.  This is done by concatenating the URI for the document, a fragment separator, and the value of the id attribute.</documentation>
+		</annotation>
+	</attribute>
+	<!-- =========================================================== -->
+	<attribute name="remoteSchema" type="anyURI">
+		<annotation>
+			<documentation>Reference to an XML Schema fragment that specifies the content model of the propertys value. This is in conformance with the XML Schema Section 4.14 Referencing Schemas from Elsewhere.</documentation>
+		</annotation>
+	</attribute>
+	<!-- =========================================================== -->
+	<attributeGroup name="AssociationAttributeGroup">
+		<annotation>
+			<documentation>Attribute group used to enable property elements to refer to their value remotely. It contains the simple link components from xlinks.xsd, with all members optional, and the remoteSchema attribute, which is also optional.  These attributes can be attached to any element, thus allowing it to act as a pointer. The 'remoteSchema' attribute allows an element  that carries link attributes to indicate that the element is declared  in a remote schema rather than by the schema  [...]
+		</annotation>
+		<attributeGroup ref="xlink:simpleAttrs"/>
+		<attribute ref="gml:remoteSchema" use="optional"/>
+	</attributeGroup>
+	<!-- =========================================================== -->
+	<element name="name" type="gml:CodeType">
+		<annotation>
+			<documentation>Label for the object, normally a descriptive name. An object may have several names, typically assigned by different authorities.  The authority for a name is indicated by the value of its (optional) codeSpace attribute.  The name may or may not be unique, as determined by the rules of the organization responsible for the codeSpace.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="description" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Contains a simple text description of the object, or refers to an external description.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================================== -->
+	<complexType name="StringOrRefType">
+		<annotation>
+			<documentation>This type is available wherever there is a need for a "text" type property. It is of string type, so the text can be included inline, but the value can also be referenced remotely via xlinks from the AssociationAttributeGroup. If the remote reference is present, then the value obtained by traversing the link should be used, and the string content of the element can be used for an annotation.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ===================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/grids.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/grids.xsd
new file mode 100755
index 0000000..eabaad7
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/grids.xsd
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:grids:3.1.1">grids.xsd</appinfo>
+		<documentation xml:lang="en">Grid geometries
+    A subset of implicit geometries
+    Designed for use with GML Coverage schema, but maybe useful elsewhere as well.
+    
+    GML is an OGC Standard.
+    Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<!-- ==============================================================
+       global elements
+	============================================================== -->
+	<element name="_ImplicitGeometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:_Geometry"/>
+	<!-- =========================================================== -->
+	<element name="Grid" type="gml:GridType" substitutionGroup="gml:_ImplicitGeometry"/>
+	<!-- =========================================================== -->
+	<complexType name="GridType">
+		<annotation>
+			<documentation>An unrectified grid, which is a network composed of two or more sets of equally spaced parallel lines in which the members of each set intersect the members of the other sets at right angles.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<sequence>
+					<element name="limits" type="gml:GridLimitsType"/>
+					<element name="axisName" type="string" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="dimension" type="positiveInteger" use="required"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="GridLimitsType">
+		<sequence>
+			<element name="GridEnvelope" type="gml:GridEnvelopeType"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="GridEnvelopeType">
+		<annotation>
+			<documentation>Provides grid coordinate values for the diametrically opposed corners of an envelope that bounds a section of grid. The value of a single coordinate is the number of offsets from the origin of the grid in the direction of a specific axis.</documentation>
+		</annotation>
+		<sequence>
+			<element name="low" type="gml:integerList"/>
+			<element name="high" type="gml:integerList"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="RectifiedGrid" type="gml:RectifiedGridType" substitutionGroup="gml:_ImplicitGeometry">
+		<annotation>
+			<documentation>Should be substitutionGroup="gml:Grid" but changed in order to accomplish Xerces-J schema validation</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="RectifiedGridType">
+		<annotation>
+			<documentation>A rectified grid has an origin and vectors that define its post locations.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:GridType">
+				<sequence>
+					<element name="origin" type="gml:PointPropertyType"/>
+					<element name="offsetVector" type="gml:VectorType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/measures.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/measures.xsd
new file mode 100755
index 0000000..833313e
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/measures.xsd
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.1.1.2" xml:lang="en" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-measures:3.1.1"/>
+		<documentation>Extends the units.xsd and basicTypes.xsd schemas with types for recording measures using specific types of units, especially the measures and units needed for coordinate reference systems and coordinate operations. The specific unit types encoded are length, angle, scale factor, time, area, volume, speed, and grid length. This schema allows angle values to be recorded as single numbers or in degree-minute-second format. 
+		Parts of this schema are based on Subclause 6.5.7 of ISO/CD 19103 Geographic information - Conceptual schema language, on Subclause A.5.2.2.3 of ISO/CD 19118 Geographic information - Encoding, and on Subclause 4.7 of OpenGIS Recommendation Paper OGC 02-007r4 Units of Measure Use and Definition Recommendations.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="units.xsd"/>
+	<!-- ==============================================================
+       elements and types
+	============================================================== -->
+	<!-- This schema uses the gml:MeasureType defined in basicTypes.xsd with the modified meaning:
+			<documentation>Value of a quantity, with its units. This element uses the XML Schema primitive data type "double" because it supports both decimal and scientific notation, and thus offers flexibility and precision. However, there is no requirement to store values using any particular format, and applications receiving elements of this type may choose to coerce the data to any other type as convenient. The XML attribute uom references the units or scale by which the amount should be mu [...]
+	<!-- =========================================================== -->
+	<element name="measure" type="gml:MeasureType"/>
+	<!-- =========================================================== -->
+	<complexType name="LengthType">
+		<annotation>
+			<documentation>Value of a length (or distance) quantity, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="ScaleType">
+		<annotation>
+			<documentation>Value of a scale factor (or ratio) that has no physical unit. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a scale factor, such as percent, permil, or parts-per-million.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="TimeType">
+		<annotation>
+			<documentation>Value of a time or temporal quantity, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a time value, such as seconds or weeks.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="GridLengthType">
+		<annotation>
+			<documentation>Value of a length (or distance) quantity in a grid, where the grid spacing does not have any associated physical units, or does not have a constant physical spacing. This grid length will often be used in a digital image grid, where the base units are likely to be pixel spacings. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for length along the axes of a grid, such as pixel spacings or grid spacings.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="AreaType">
+		<annotation>
+			<documentation>Value of a spatial area quantity, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for an area, such as square metres or square miles.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="VolumeType">
+		<annotation>
+			<documentation>Value of a spatial volume quantity, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a volume, such as cubic metres or cubic feet.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="SpeedType">
+		<annotation>
+			<documentation>Value of a speed, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a velocity, such as metres per second or miles per hour.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="AngleChoiceType">
+		<annotation>
+			<documentation>Value of an angle quantity provided in either degree-minute-second format or single value format.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:angle"/>
+			<element ref="gml:dmsAngle"/>
+		</choice>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="angle" type="gml:MeasureType"/>
+	<!-- =========================================================== -->
+	<complexType name="AngleType">
+		<annotation>
+			<documentation>Value of an angle quantity recorded as a single number, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for an angle, such as degrees or radians.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="dmsAngle" type="gml:DMSAngleType"/>
+	<!-- =========================================================== -->
+	<complexType name="DMSAngleType">
+		<annotation>
+			<documentation>Angle value provided in degree-minute-second or degree-minute format.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:degrees"/>
+			<choice minOccurs="0">
+				<element ref="gml:decimalMinutes"/>
+				<sequence>
+					<element ref="gml:minutes"/>
+					<element ref="gml:seconds" minOccurs="0"/>
+				</sequence>
+			</choice>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="degrees" type="gml:DegreesType"/>
+	<!-- =========================================================== -->
+	<complexType name="DegreesType">
+		<annotation>
+			<documentation>Integer number of degrees, plus the angle direction. This element can be used for geographic Latitude and Longitude. For Latitude, the XML attribute direction can take the values "N" or "S", meaning North or South of the equator. For Longitude, direction can take the values "E" or "W", meaning East or West of the prime meridian. This element can also be used for other angles. In that case, the direction can take the values "+" or "-" (of SignType), in the specified rota [...]
+		</annotation>
+		<simpleContent>
+			<extension base="gml:DegreeValueType">
+				<attribute name="direction">
+					<simpleType>
+						<union>
+							<simpleType>
+								<restriction base="string">
+									<enumeration value="N"/>
+									<enumeration value="E"/>
+									<enumeration value="S"/>
+									<enumeration value="W"/>
+								</restriction>
+							</simpleType>
+							<simpleType>
+								<restriction base="gml:SignType"/>
+							</simpleType>
+						</union>
+					</simpleType>
+				</attribute>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="DegreeValueType">
+		<annotation>
+			<documentation>Integer number of degrees in a degree-minute-second or degree-minute angular value, without indication of direction.</documentation>
+		</annotation>
+		<restriction base="nonNegativeInteger">
+			<maxInclusive value="359"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="decimalMinutes" type="gml:DecimalMinutesType"/>
+	<!-- =========================================================== -->
+	<simpleType name="DecimalMinutesType">
+		<annotation>
+			<documentation>Decimal number of arc-minutes in a degree-minute angular value.</documentation>
+		</annotation>
+		<restriction base="decimal">
+			<minInclusive value="0.00"/>
+			<maxExclusive value="60.00"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="minutes" type="gml:ArcMinutesType"/>
+	<!-- =========================================================== -->
+	<simpleType name="ArcMinutesType">
+		<annotation>
+			<documentation>Integer number of arc-minutes in a degree-minute-second angular value.</documentation>
+		</annotation>
+		<restriction base="nonNegativeInteger">
+			<maxInclusive value="59"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="seconds" type="gml:ArcSecondsType"/>
+	<!-- =========================================================== -->
+	<simpleType name="ArcSecondsType">
+		<annotation>
+			<documentation>Number of arc-seconds in a degree-minute-second angular value.</documentation>
+		</annotation>
+		<restriction base="decimal">
+			<minInclusive value="0.00"/>
+			<maxExclusive value="60.00"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/observation.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/observation.xsd
new file mode 100755
index 0000000..b90a8b3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/observation.xsd
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:observation:3.1.1">observation.xsd</appinfo>
+		<documentation>Observation schema for GML 3.1
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- =================================================================== -->
+	<!-- === includes and imports ============================================ -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="direction.xsd"/>
+	<include schemaLocation="valueObjects.xsd"/>
+	<!-- =================================================================== -->
+	<!-- =================== properties =================================== -->
+	<element name="using" type="gml:FeaturePropertyType">
+		<annotation>
+			<documentation>This element contains or points to a description of a sensor, instrument or procedure used for the observation</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================================== -->
+	<element name="target" type="gml:TargetPropertyType">
+		<annotation>
+			<documentation>This element contains or points to the specimen, region or station which is the object of the observation</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================================== -->
+	<element name="subject" type="gml:TargetPropertyType" substitutionGroup="gml:target">
+		<annotation>
+			<documentation>Synonym for target - common word used for photographs</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================================== -->
+	<complexType name="TargetPropertyType">
+		<annotation>
+			<documentation>Container for an object representing the target or subject of an observation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:_Feature"/>
+				<element ref="gml:_Geometry"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================================== -->
+	<element name="resultOf" type="gml:AssociationType">
+		<annotation>
+			<documentation>The result of the observation: an image, external object, etc</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================================== -->
+	<!-- ===================== Features =========================== -->
+	<element name="Observation" type="gml:ObservationType" substitutionGroup="gml:_Feature"/>
+	<!-- =========================================================== -->
+	<complexType name="ObservationType">
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:validTime"/>
+					<element ref="gml:using" minOccurs="0"/>
+					<element ref="gml:target" minOccurs="0"/>
+					<element ref="gml:resultOf"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="DirectedObservation" type="gml:DirectedObservationType" substitutionGroup="gml:Observation"/>
+	<!-- =========================================================== -->
+	<complexType name="DirectedObservationType">
+		<complexContent>
+			<extension base="gml:ObservationType">
+				<sequence>
+					<element ref="gml:direction"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="DirectedObservationAtDistance" type="gml:DirectedObservationAtDistanceType" substitutionGroup="gml:DirectedObservation"/>
+	<!-- =========================================================== -->
+	<complexType name="DirectedObservationAtDistanceType">
+		<complexContent>
+			<extension base="gml:DirectedObservationType">
+				<sequence>
+					<element name="distance" type="gml:MeasureType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/referenceSystems.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/referenceSystems.xsd
new file mode 100755
index 0000000..8bee91d
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/referenceSystems.xsd
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:referenceSystems:3.1.1"/>
+		<documentation>How to encode reference system definitions. Builds on several other parts of GML 3 to encode the data needed to define reference systems.
+		This schema encodes the Reference System (RS_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. The SC_CRS class is also encoded here, to eliminate the (circular) references from coordinateOperations.xsd to coordinateReferenceSystems.xsd. The RS_SpatialReferenceSystemUsingGeographicIdentifier class is not encoded [...]
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic2d.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_ReferenceSystem" type="gml:AbstractReferenceSystemType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractReferenceSystemBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for reference system objects, simplifying and restricting the DefinitionType as needed.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:srsName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="srsName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this reference system is identified.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="AbstractReferenceSystemType" abstract="true">
+		<annotation>
+			<documentation>Description of a spatial and/or temporal reference system used by a dataset.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemBaseType">
+				<sequence>
+					<element ref="gml:srsID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alterative identifications of this reference system. The first srsID, if any, is normally the primary identification code, and any others are aliases.</documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this reference system, including source information.</documentation>
+						</annotation>
+					</element>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="srsID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a reference system.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="referenceSystemRef" type="gml:ReferenceSystemRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ReferenceSystemRefType">
+		<annotation>
+			<documentation>Association to a reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_ReferenceSystem"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_CRS" type="gml:AbstractReferenceSystemType" abstract="true" substitutionGroup="gml:_ReferenceSystem">
+		<annotation>
+			<documentation>Abstract coordinate reference system, usually defined by a coordinate system and a datum. This abstract complexType shall not be used, extended, or restricted, in an Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="crsRef" type="gml:CRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CRSRefType">
+		<annotation>
+			<documentation>Association to a CRS abstract coordinate reference system, either referencing or containing the definition of that CRS.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_CRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<complexType name="IdentifierType">
+		<annotation>
+			<documentation>An identification of a CRS object. The first use of the IdentifierType for an object, if any, is normally the primary identification code, and any others are aliases.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:name">
+				<annotation>
+					<documentation>The code or name for this Identifier, often from a controlled list or pattern defined by a code space. The optional codeSpace attribute is normally included to identify or reference a code space within which one or more codes are defined. This code space is often defined by some authority organization, where one organization may define multiple code spaces. The range and format of each Code Space identifier is defined by that code space authority. Information about th [...]
+				</annotation>
+			</element>
+			<element ref="gml:version" minOccurs="0"/>
+			<element ref="gml:remarks" minOccurs="0">
+				<annotation>
+					<documentation>Remarks about this code or alias.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="version" type="string">
+		<annotation>
+			<documentation>Identifier of the version of the associated codeSpace or code, as specified by the codeSpace or code authority. This version is included only when the "code" or "codeSpace" uses versions. When appropriate, the version is identified by the effective date, coded using ISO 8601 date format.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="remarks" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Information about this object or code. Contains text or refers to external text.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="scope" type="string">
+		<annotation>
+			<documentation>Description of domain of usage, or limitations of usage, for which this CRS object is valid.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="validArea" type="gml:ExtentType">
+		<annotation>
+			<documentation>Area or region in which this CRS object is valid.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="ExtentType">
+		<annotation>
+			<documentation>Information about the spatial, vertical, and/or temporal extent of a reference system object. Constraints: At least one of the elements "description", "boundingBox", "boundingPolygon", "verticalExtent", and temporalExtent" must be included, but more that one can be included when appropriate. Furthermore, more than one "boundingBox", "boundingPolygon", "verticalExtent", and/or temporalExtent" element can be included, with more than one meaning the union of the individual [...]
+		</annotation>
+		<sequence>
+			<element ref="gml:description" minOccurs="0">
+				<annotation>
+					<documentation>Description of spatial and/or temporal extent of this object.</documentation>
+				</annotation>
+			</element>
+			<choice>
+				<annotation>
+					<documentation>Geographic domain of this reference system object.</documentation>
+				</annotation>
+				<element ref="gml:boundingBox" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Unordered list of bounding boxes (or envelopes) whose union describes the spatial domain of this object.</documentation>
+					</annotation>
+				</element>
+				<element ref="gml:boundingPolygon" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Unordered list of bounding polygons whose union describes the spatial domain of this object.</documentation>
+					</annotation>
+				</element>
+			</choice>
+			<element ref="gml:verticalExtent" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Unordered list of vertical intervals whose union describes the spatial domain of this object.</documentation>
+				</annotation>
+			</element>
+			<element ref="gml:temporalExtent" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Unordered list of time periods whose union describes the spatial domain of this object.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="boundingBox" type="gml:EnvelopeType">
+		<annotation>
+			<documentation>A bounding box (or envelope) defining the spatial domain of this object.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="boundingPolygon" type="gml:PolygonType">
+		<annotation>
+			<documentation>A bounding polygon defining the horizontal spatial domain of this object.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="verticalExtent" type="gml:EnvelopeType">
+		<annotation>
+			<documentation>An interval defining the vertical spatial domain of this object.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="temporalExtent" type="gml:TimePeriodType">
+		<annotation>
+			<documentation>A time period defining the temporal domain of this object.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporal.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporal.xsd
new file mode 100755
index 0000000..96be3f7
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporal.xsd
@@ -0,0 +1,333 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:temporal:3.1.1"/>
+		<documentation xml:lang="en">The temporal schema for GML 3.1 provides constructs for handling time-varying spatial data. 
+    This schema reflects a partial implementation of the model described in ISO 19108:2002.
+    
+    GML is an OGC Standard.
+    Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ================================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="gmlBase.xsd"/>
+	<!-- ================================================================== -->
+	<!-- ==== Time Object ===== -->
+	<!-- ================================================================== -->
+	<element name="_TimeObject" type="gml:AbstractTimeObjectType" abstract="true" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal primitives and complexes.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimeObjectType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The abstract supertype for temporal objects.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Primitive ===== -->
+	<!-- ================================================================== -->
+	<element name="_TimePrimitive" type="gml:AbstractTimePrimitiveType" abstract="true" substitutionGroup="gml:_TimeObject">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal primitives.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimePrimitiveType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The abstract supertype for temporal primitives.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType">
+				<sequence>
+					<element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimePrimitivePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:_TimePrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="RelatedTimeType">
+		<complexContent>
+			<extension base="gml:TimePrimitivePropertyType">
+				<attribute name="relativePosition">
+					<simpleType>
+						<restriction base="string">
+							<enumeration value="Before"/>
+							<enumeration value="After"/>
+							<enumeration value="Begins"/>
+							<enumeration value="Ends"/>
+							<enumeration value="During"/>
+							<enumeration value="Equals"/>
+							<enumeration value="Contains"/>
+							<enumeration value="Overlaps"/>
+							<enumeration value="Meets"/>
+							<enumeration value="OverlappedBy"/>
+							<enumeration value="MetBy"/>
+							<enumeration value="BegunBy"/>
+							<enumeration value="EndedBy"/>
+						</restriction>
+					</simpleType>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Complex ===== -->
+	<!-- ================================================================== -->
+	<element name="_TimeComplex" type="gml:AbstractTimeComplexType" abstract="true" substitutionGroup="gml:_TimeObject">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal complexes. 
+			Temporal complex is an aggregation of temporal primitives as its components, 
+			represents a temporal geometric complex and a temporal topology complex. 
+			N.B. Temporal geometric complex is not defined in this schema.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="AbstractTimeComplexType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The abstract supertype for temporal complexes.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType"/>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Geometric Primitive ===== -->
+	<!-- ================================================================== -->
+	<element name="_TimeGeometricPrimitive" type="gml:AbstractTimeGeometricPrimitiveType" abstract="true" substitutionGroup="gml:_TimePrimitive">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal geometric primitives.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimeGeometricPrimitiveType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The abstract supertype for temporal geometric primitives.
+       A temporal geometry must be associated with a temporal reference system via URI. 
+       The Gregorian calendar with UTC is the default reference system, following ISO 
+       8601. Other reference systems in common use include the GPS calendar and the 
+       Julian calendar.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimePrimitiveType">
+				<attribute name="frame" type="anyURI" use="optional" default="#ISO-8601"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeGeometricPrimitivePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:_TimeGeometricPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Instant ===== -->
+	<!-- ================================================================== -->
+	<element name="TimeInstant" type="gml:TimeInstantType" substitutionGroup="gml:_TimeGeometricPrimitive"/>
+	<!-- ===================================== -->
+	<complexType name="TimeInstantType">
+		<annotation>
+			<documentation>Omit back-pointers begunBy, endedBy.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeGeometricPrimitiveType">
+				<sequence>
+					<element ref="gml:timePosition"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeInstantPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeInstant"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Period ===== -->
+	<!-- ================================================================== -->
+	<element name="TimePeriod" type="gml:TimePeriodType" substitutionGroup="gml:_TimeGeometricPrimitive"/>
+	<!-- ===================================== -->
+	<complexType name="TimePeriodType">
+		<complexContent>
+			<extension base="gml:AbstractTimeGeometricPrimitiveType">
+				<sequence>
+					<choice>
+						<element name="beginPosition" type="gml:TimePositionType"/>
+						<element name="begin" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<choice>
+						<element name="endPosition" type="gml:TimePositionType"/>
+						<element name="end" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<group ref="gml:timeLength" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimePeriodPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimePeriod"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== duration & interval ===== -->
+	<!-- ================================================================== -->
+	<group name="timeLength">
+		<annotation>
+			<documentation>This model group is provided as an alternative to the abstract susbstitutionGroup head _timeLength.
+		ISO 19136 comment 411</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:duration"/>
+			<element ref="gml:timeInterval"/>
+		</choice>
+	</group>
+	<!-- ================================================================== -->
+	<element name="duration" type="duration">
+		<annotation>
+			<documentation xml:lang="en">This element is an instance of the primitive xsd:duration simple type to 
+      enable use of the ISO 8601 syntax for temporal length (e.g. P5DT4H30M). 
+      It is a valid subtype of TimeDurationType according to section 3.14.6, 
+      rule 2.2.4 in XML Schema, Part 1.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<element name="timeInterval" type="gml:TimeIntervalLengthType">
+		<annotation>
+			<documentation>This element is a valid subtype of TimeDurationType 
+			according to section 3.14.6, rule 2.2.4 in XML Schema, Part 1.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="TimeIntervalLengthType" final="#all">
+		<annotation>
+			<documentation xml:lang="en">This type extends the built-in xsd:decimal simple type to allow floating-point 
+      values for temporal length. According to  the ISO 11404 model you have to use 
+      positiveInteger together with appropriate values for radix and factor. The 
+      resolution of the time interval is to one radix ^(-factor) of the specified 
+      time unit (e.g. unit="second", radix="10", factor="3" specifies a resolution 
+      of milliseconds). It is a subtype of TimeDurationType.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="decimal">
+				<attribute name="unit" type="gml:TimeUnitType" use="required"/>
+				<attribute name="radix" type="positiveInteger" use="optional"/>
+				<attribute name="factor" type="integer" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<simpleType name="TimeUnitType">
+		<annotation>
+			<documentation xml:lang="en">Standard units for measuring time intervals (see ISO 31-1).</documentation>
+		</annotation>
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="year"/>
+					<enumeration value="day"/>
+					<enumeration value="hour"/>
+					<enumeration value="minute"/>
+					<enumeration value="second"/>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Position ===== -->
+	<!-- ================================================================== -->
+	<element name="timePosition" type="gml:TimePositionType">
+		<annotation>
+			<documentation>Direct representation of a temporal position</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="TimePositionType" final="#all">
+		<annotation>
+			<documentation xml:lang="en">Direct representation of a temporal position. 
+      Indeterminate time values are also allowed, as described in ISO 19108. The indeterminatePosition 
+      attribute can be used alone or it can qualify a specific value for temporal position (e.g. before 
+      2002-12, after 1019624400). 
+      For time values that identify position within a calendar, the calendarEraName attribute provides 
+      the name of the calendar era to which the date is referenced (e.g. the Meiji era of the Japanese calendar).</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:TimePositionUnion">
+				<attribute name="frame" type="anyURI" use="optional" default="#ISO-8601"/>
+				<attribute name="calendarEraName" type="string" use="optional"/>
+				<attribute name="indeterminatePosition" type="gml:TimeIndeterminateValueType" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<simpleType name="TimePositionUnion">
+		<annotation>
+			<documentation xml:lang="en">The ISO 19108:2002 hierarchy of subtypes for temporal position are collapsed 
+      by defining a union of XML Schema simple types for indicating temporal position relative 
+      to a specific reference system. 
+      
+      Dates and dateTime may be indicated with varying degrees of precision.  
+      dateTime by itself does not allow right-truncation, except for fractions of seconds. 
+      When used with non-Gregorian calendars based on years, months, days, 
+      the same lexical representation should still be used, with leading zeros added if the 
+      year value would otherwise have fewer than four digits.  
+      
+      An ordinal position may be referenced via URI identifying the definition of an ordinal era.  
+      
+      A time coordinate value is indicated as a decimal (e.g. UNIX time, GPS calendar).</documentation>
+		</annotation>
+		<union memberTypes="gml:CalDate time dateTime anyURI decimal"/>
+	</simpleType>
+	<!-- ================================================================== -->
+	<simpleType name="CalDate">
+		<annotation>
+			<documentation xml:lang="en">Calendar dates may be indicated with varying degrees of precision, 
+      using year, year-month, date. 
+      When used with non-Gregorian calendars based on years, months, days, 
+      the same lexical representation should still be used, with leading zeros added if the 
+      year value would otherwise have fewer than four digits.  
+      time is used for a position that recurs daily (see clause 5.4.4.2 of ISO 19108:2002).</documentation>
+		</annotation>
+		<union memberTypes="date gYearMonth gYear"/>
+	</simpleType>
+	<!-- ================================================================== -->
+	<simpleType name="TimeIndeterminateValueType">
+		<annotation>
+			<documentation xml:lang="en">This enumerated data type specifies values for indeterminate positions.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="after"/>
+			<enumeration value="before"/>
+			<enumeration value="now"/>
+			<enumeration value="unknown"/>
+		</restriction>
+	</simpleType>
+	<!-- ================================================================== -->
+	<!-- ==== Convenience properties ==== -->
+	<!-- ================================================================== -->
+	<element name="validTime" type="gml:TimePrimitivePropertyType"/>
+	<!-- ===================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporalReferenceSystems.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporalReferenceSystems.xsd
new file mode 100755
index 0000000..d9a8f88
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporalReferenceSystems.xsd
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:temporalReferenceSystems:3.1.1"/>
+		<documentation xml:lang="en">The Temporal Reference Systems schema for GML 3.1 provides constructs for handling various styles of temporal reference system. 
+    This schema reflects a partial implementation of the model described in ISO 19108:2002.
+    
+    GML is an OGC Standard.
+    Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ================================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="temporalTopology.xsd"/>
+	<include schemaLocation="dictionary.xsd"/>
+	<!-- ================================================================== -->
+	<!-- == Time Reference System == -->
+	<!-- ================================================================== -->
+	<element name="_TimeReferenceSystem" type="gml:AbstractTimeReferenceSystemType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>Abstract element serves primarily as the head of a substitution group for temporal reference systems.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimeReferenceSystemType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">A value in the time domain is measured relative to a temporal reference system. Common 
+        types of reference systems include calendars, ordinal temporal reference systems, and 
+        temporal coordinate systems (time elapsed since some epoch, e.g. UNIX time).</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="domainOfValidity" type="string" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- == Time Coordinate System == -->
+	<!-- ================================================================== -->
+	<element name="TimeCoordinateSystem" type="gml:TimeCoordinateSystemType" substitutionGroup="gml:_TimeReferenceSystem"/>
+	<!-- ===================================== -->
+	<complexType name="TimeCoordinateSystemType">
+		<annotation>
+			<documentation xml:lang="en">A temporal coordinate system is based on a continuous interval scale defined in terms of a single time interval.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeReferenceSystemType">
+				<sequence>
+					<choice>
+						<element name="originPosition" type="gml:TimePositionType"/>
+						<element name="origin" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<element name="interval" type="gml:TimeIntervalLengthType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- == Time Ordinal System == -->
+	<!-- ================================================================== -->
+	<element name="TimeOrdinalReferenceSystem" type="gml:TimeOrdinalReferenceSystemType" substitutionGroup="gml:_TimeReferenceSystem"/>
+	<!-- ===================================== -->
+	<complexType name="TimeOrdinalReferenceSystemType">
+		<annotation>
+			<documentation xml:lang="en">In an ordinal reference system the order of events in time can be well 
+      established, but the magnitude of the intervals between them can not be 
+      accurately determined (e.g. a stratigraphic sequence).</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeReferenceSystemType">
+				<sequence>
+					<element name="component" type="gml:TimeOrdinalEraPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="TimeOrdinalEra" type="gml:TimeOrdinalEraType"/>
+	<!-- ===================================== -->
+	<complexType name="TimeOrdinalEraType">
+		<annotation>
+			<documentation xml:lang="en">Ordinal temporal reference systems are often hierarchically structured 
+      such that an ordinal era at a given level of the hierarchy includes a 
+      sequence of shorter, coterminous ordinal eras. This captured using the member/group properties.  
+      
+      Note that in this schema, TIme Ordinal Era is patterned on TimeEdge, which is a variation from ISO 19108.  
+      This is in order to fulfill the requirements of ordinal reference systems based on eras delimited by 
+      named points or nodes, which are common in geology, archeology, etc.  
+      
+      This change is subject of a change proposal to ISO</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="start" type="gml:TimeNodePropertyType"/>
+					<element name="end" type="gml:TimeNodePropertyType"/>
+					<element name="extent" type="gml:TimePeriodPropertyType" minOccurs="0"/>
+					<element name="member" type="gml:TimeOrdinalEraPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>An Era may be composed of several member Eras. The "member" element implements the association to the Era at the next level down the hierarchy.  "member" follows the standard GML property pattern whereby its (complex) value may be either described fully inline, or may be the target of a link carried on the member element and described fully elsewhere, either in the same document or from another service.</documentation>
+						</annotation>
+					</element>
+					<element name="group" type="gml:ReferenceType" minOccurs="0">
+						<annotation>
+							<documentation>In a particular Time System, an Era may be a member of a group.  The "group" element implements the back-pointer to the Era at the next level up in the hierarchy. 
+
+If the hierarchy is represented by describing the nested components fully in the their nested position inside "member" elements, then the parent can be easily inferred, so the group property is unnecessary.  
+
+However, if the hierarchy is represented by links carried on the "member" property elements, pointing to Eras described fully elsewhere, then it may be useful for a child (member) era to carry an explicit pointer back to its parent (group) Era.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeOrdinalEraPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeOrdinalEra"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- == Calendar == -->
+	<!-- ================================================================== -->
+	<element name="TimeCalendar" type="gml:TimeCalendarType" substitutionGroup="gml:_TimeReferenceSystem"/>
+	<!-- ===================================== -->
+	<complexType name="TimeCalendarType">
+		<annotation>
+			<documentation xml:lang="en">A calendar is a discrete temporal reference system 
+      that provides a basis for defining temporal position to a resolution of one day. 
+      A single calendar may reference more than one calendar era.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeReferenceSystemType">
+				<sequence>
+					<element name="referenceFrame" type="gml:TimeCalendarEraPropertyType" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Link to the CalendarEras that it uses as a reference for dating.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeCalendarPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCalendar"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="TimeCalendarEra" type="gml:TimeCalendarEraType" substitutionGroup="gml:Definition"/>
+	<!-- ===================================== -->
+	<complexType name="TimeCalendarEraType">
+		<annotation>
+			<documentation xml:lang="en">In every calendar, years are numbered relative to the date of a 
+      reference event that defines a calendar era. 
+      In this implementation, we omit the back-pointer "datingSystem".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="referenceEvent" type="gml:StringOrRefType">
+						<annotation>
+							<documentation>Name or description of a mythical or historic event which fixes the position of the base scale of the calendar era.</documentation>
+						</annotation>
+					</element>
+					<element name="referenceDate" type="date" default="0001-01-01" minOccurs="0">
+						<annotation>
+							<documentation>Date of the referenceEvent expressed as a date in the given calendar. 
+              In most calendars, this date is the origin (i.e., the first day) of the scale, but this is not always true.</documentation>
+						</annotation>
+					</element>
+					<element name="julianReference" type="decimal">
+						<annotation>
+							<documentation>Julian date that corresponds to the reference date.  
+              The Julian day numbering system is a temporal coordinate system that has an 
+              origin earlier than any known calendar, 
+              at noon on 1 January 4713 BC in the Julian proleptic calendar.  
+              The Julian day number is an integer value; 
+              the Julian date is a decimal value that allows greater resolution. 
+              Transforming calendar dates to and from Julian dates provides a 
+              relatively simple basis for transforming dates from one calendar to another.</documentation>
+						</annotation>
+					</element>
+					<element name="epochOfUse" type="gml:TimePeriodPropertyType">
+						<annotation>
+							<documentation>Period for which the calendar era was used as a basis for dating.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeCalendarEraPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCalendarEra"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- == Clock == -->
+	<!-- ================================================================== -->
+	<element name="TimeClock" type="gml:TimeClockType" substitutionGroup="gml:_TimeReferenceSystem"/>
+	<!-- ===================================== -->
+	<complexType name="TimeClockType" final="#all">
+		<annotation>
+			<documentation xml:lang="en">A clock provides a basis for defining temporal position within a day. 
+      A clock must be used with a calendar in order to provide a complete description of a temporal position 
+      within a specific day.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeReferenceSystemType">
+				<sequence>
+					<element name="referenceEvent" type="gml:StringOrRefType">
+						<annotation>
+							<documentation>Name or description of an event, such as solar noon or sunrise, 
+              which fixes the position of the base scale of the clock.</documentation>
+						</annotation>
+					</element>
+					<element name="referenceTime" type="time">
+						<annotation>
+							<documentation>time of day associated with the reference event expressed as 
+              a time of day in the given clock. The reference time is usually the origin of the clock scale.</documentation>
+						</annotation>
+					</element>
+					<element name="utcReference" type="time">
+						<annotation>
+							<documentation>24 hour local or UTC time that corresponds to the reference time.</documentation>
+						</annotation>
+					</element>
+					<element name="dateBasis" type="gml:TimeCalendarPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeClockPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeClock"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporalTopology.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporalTopology.xsd
new file mode 100755
index 0000000..8049faa
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/temporalTopology.xsd
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:temporalTopology:3.1.1"/>
+		<documentation xml:lang="en">The temporal topology schema for ISO19136 provides constructs for handling topological complexes and 
+		temporal feature relationships. 
+		Temporal geometric characteristics of features are represented as instants and periods. 
+		While, temporal context of features that does not relate to the position of time is described as connectivity relationships 
+		among instants and periods. These relationships are called temporal topology as they do not change in time, 
+		as long as the direction of time does not change. 
+		It is used effectively in the case of describing a family tree expressing evolution of species, an ecological cycle, 
+		a lineage of lands or buildings, or a history of separation and merger of administrative boundaries.
+		This schema reflects a partial yet consistent implementation of the model described in ISO 19108:2002.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ===================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<!-- ===================================== -->
+	<!-- ================================================================== -->
+	<!-- == TimeTopologyComplex == -->
+	<!-- ================================================================== -->
+	<element name="TimeTopologyComplex" type="gml:TimeTopologyComplexType" substitutionGroup="gml:_TimeComplex">
+		<annotation>
+			<documentation xml:lang="en">This element represents temporal topology complex. It shall be the connected acyclic directed graph composed of time nodes and time edges.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="TimeTopologyComplexType">
+		<annotation>
+			<documentation xml:lang="en">A temporal topology complex.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeComplexType">
+				<sequence>
+					<element name="primitive" type="gml:TimeTopologyPrimitivePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeTopologyComplexPropertyType">
+		<annotation>
+			<documentation>A time topology complex property can either be any time topology complex element
+			 encapsulated in an element of this type or an XLink reference to a remote time topology complex element 
+			 (where remote includes elements located elsewhere in the same document). 
+			 Note that either the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeTopologyComplex"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!--  == TimeTopologyPrimitive == -->
+	<!-- ================================================================== -->
+	<element name="_TimeTopologyPrimitive" type="gml:AbstractTimeTopologyPrimitiveType" abstract="true" substitutionGroup="gml:_TimePrimitive">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal topology primitives.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="AbstractTimeTopologyPrimitiveType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The element "complex" carries a reference to the complex containing this primitive.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimePrimitiveType">
+				<sequence>
+					<element name="complex" type="gml:ReferenceType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeTopologyPrimitivePropertyType">
+		<annotation>
+			<documentation>A time topology primitive property can either hold any time topology complex element
+			 eor carry an XLink reference to a remote time topology complex element 
+			 (where remote includes elements located elsewhere in the same document). 
+			 Note that either the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_TimeTopologyPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!--  ======= TimeNode ======= -->
+	<!-- ================================================================== -->
+	<element name="TimeNode" type="gml:TimeNodeType" substitutionGroup="gml:_TimeTopologyPrimitive">
+		<annotation>
+			<documentation xml:lang="en">"TimeNode" is a zero dimensional temporal topology primitive, 
+			expresses a position in topological time, and is a start and an end of time edge, which represents states of time.
+			Time node may be isolated. However, it cannot describe the ordering relationships with other primitives. 
+			An isolated node may not be an element of any temporal topology complex.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="TimeNodeType">
+		<annotation>
+			<documentation xml:lang="en">Type declaration of the element "TimeNode".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeTopologyPrimitiveType">
+				<sequence>
+					<element name="previousEdge" type="gml:TimeEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="nextEdge" type="gml:TimeEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="position" type="gml:TimeInstantPropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeNodePropertyType">
+		<annotation>
+			<documentation>A time node property can either be any time node element encapsulated in an element of this type 
+			or an XLink reference to a remote time node element (where remote includes elements located elsewhere in the same document). 
+			Note that either the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeNode"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!--  ======= TimeEdge ======= -->
+	<!-- ================================================================== -->
+	<element name="TimeEdge" type="gml:TimeEdgeType" substitutionGroup="gml:_TimeTopologyPrimitive">
+		<annotation>
+			<documentation xml:lang="en">TimeEdge is one dimensional temporal topology primitive,
+			 expresses a state in topological time. It has an orientation from its start toward the end, 
+			 and its boundaries shall associate with two different time nodes.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="TimeEdgeType">
+		<annotation>
+			<documentation xml:lang="en">Type declaration of the element "TimeEdge".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeTopologyPrimitiveType">
+				<sequence>
+					<element name="start" type="gml:TimeNodePropertyType"/>
+					<element name="end" type="gml:TimeNodePropertyType"/>
+					<element name="extent" type="gml:TimePeriodPropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeEdgePropertyType">
+		<annotation>
+			<documentation>A time edge property can either be any time edge element encapsulated in an element of this type 
+			or an XLink reference to a remote time edge element (where remote includes elements located elsewhere in the same document). 
+			Note that either the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeEdge"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ===       Succession        === -->
+	<!-- ================================================================== -->
+	<simpleType name="SuccessionType">
+		<annotation>
+			<documentation>Feature succession is a semantic relationship derived from evaluation of observer, and 
+			Feature Substitution, Feature Division and Feature Fusion are defined as associations between 
+			previous features and next features in the temporal context. 
+			Successions shall be represented in either following two ways. 
+			* define a temporal topological complex element as a feature element 
+			* define an association same as temporal topological complex between features.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="substitution"/>
+			<enumeration value="division"/>
+			<enumeration value="fusion"/>
+			<enumeration value="initiation"/>
+		</restriction>
+	</simpleType>
+	<!-- ================================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/topology.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/topology.xsd
new file mode 100755
index 0000000..2f3caec
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/topology.xsd
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:topology:3.1.1">topology.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryComplexes.xsd"/>
+	<!-- ==============================================================
+       abstract supertype for topology objects
+        =============================================================== -->
+	<!-- ========================================================== -->
+	<element name="_Topology" type="gml:AbstractTopologyType" abstract="true" substitutionGroup="gml:_GML"/>
+	<!-- ========================================================== -->
+	<complexType name="AbstractTopologyType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="_TopoPrimitive" type="gml:AbstractTopoPrimitiveType" abstract="true" substitutionGroup="gml:_Topology">
+		<annotation>
+			<documentation>Substitution group branch for Topo Primitives, used by TopoPrimitiveArrayAssociationType</documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="AbstractTopoPrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:isolated" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:container" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="isolated" type="gml:IsolatedPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:isolated">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="IsolatedPropertyType">
+		<choice minOccurs="0">
+			<element ref="gml:Node"/>
+			<element ref="gml:Edge"/>
+		</choice>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="container" type="gml:ContainerPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:containerProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="ContainerPropertyType">
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:Face"/>
+				<element ref="gml:TopoSolid"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- primitive topology objects -->
+	<!-- ========================================================== -->
+	<element name="Node" type="gml:NodeType" substitutionGroup="gml:_TopoPrimitive"/>
+	<!-- =========================================================== -->
+	<complexType name="NodeType">
+		<annotation>
+			<documentation>Its optional co-boundary is a set of connected directedEdges.  The orientation of one of these dirEdges is "+" if the Node is the "to" node of the Edge, and "-" if it is the "from" node.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedEdge" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:pointProperty" minOccurs="0"/>
+					<!-- <element name="geometry" type="gml:PointPropertyType" minOccurs="0"/> -->
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===== Property for topology association - by Value or by Reference ===== -->
+	<element name="directedNode" type="gml:DirectedNodePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:directedNode">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="DirectedNodePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Node"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- primitive topology objects (1-dimensional) -->
+	<!-- ========================================================== -->
+	<element name="Edge" type="gml:EdgeType" substitutionGroup="gml:_TopoPrimitive"/>
+	<!-- ========================================================== -->
+	<complexType name="EdgeType">
+		<annotation>
+			<documentation>There is precisely one positively directed and one negatively directed node in the boundary of every edge. The negatively and positively directed nodes correspond to the start and end nodes respectively. The optional coboundary of an edge is a circular sequence of directed faces which are incident on this edge in document order. Faces which use a particular boundary edge in its positive orientation appear with positive orientation on the coboundary of the same edge. In  [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedNode" minOccurs="2" maxOccurs="2"/>
+					<element ref="gml:directedFace" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:curveProperty" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===== Property for topology association - by Value or by Reference ===== -->
+	<element name="directedEdge" type="gml:DirectedEdgePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:directedEdge">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="DirectedEdgePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Edge"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- primitive topology objects (2-dimensional) -->
+	<!-- ========================================================== -->
+	<element name="Face" type="gml:FaceType" substitutionGroup="gml:_TopoPrimitive"/>
+	<!-- ========================================================== -->
+	<complexType name="FaceType">
+		<annotation>
+			<documentation>. The topological boundary of a face consists of a set of directed edges. Note that all edges associated with a Face, including dangling and interior edges, appear in the boundary.  Dangling and interior edges are each referenced by pairs of directedEdges with opposing orientations.  The optional coboundary of a face is a pair of directed solids which are bounded by this face. If present, there is precisely one positively directed and one negatively directed solid in th [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedEdge" maxOccurs="unbounded"/>
+					<element ref="gml:directedTopoSolid" minOccurs="0" maxOccurs="2"/>
+					<element ref="gml:surfaceProperty" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===== Property for topology association - by Value or by Reference ===== -->
+	<element name="directedFace" type="gml:DirectedFacePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:directedFace">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="DirectedFacePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Face"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- primitive topology objects (3-dimensional) -->
+	<!-- ========================================================== -->
+	<element name="TopoSolid" type="gml:TopoSolidType" substitutionGroup="gml:_TopoPrimitive"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoSolidType">
+		<annotation>
+			<documentation>The topological boundary of a TopoSolid consists of a set of directed faces. Note that all faces associated with the TopoSolid, including dangling faces, appear in the boundary. The coboundary of a TopoSolid is empty and hence requires no representation.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedFace" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value or by Reference ===== -->
+	<element name="directedTopoSolid" type="gml:DirectedTopoSolidPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:directedTopoSolid">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================= -->
+	<complexType name="DirectedTopoSolidPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TopoSolid"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="TopoPoint" type="gml:TopoPointType"/>
+	<!-- ========================================================== -->
+	<complexType name="TopoPointType">
+		<annotation>
+			<documentation>The intended use of TopoPoint is to appear within a point feature to express the structural and possibly geometric relationships of this point to other features via shared node definitions. Note the orientation assigned to the directedNode has no meaning in this context. It is preserved for symmetry with the types and elements which follow.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedNode"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ============================================================= -->
+	<!-- ===== Property for topology association - by Value  ===== -->
+	<element name="topoPointProperty" type="gml:TopoPointPropertyType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoPointPropertyType">
+		<sequence>
+			<element ref="gml:TopoPoint"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="TopoCurve" type="gml:TopoCurveType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoCurveType">
+		<annotation>
+			<documentation>The end Node of each directedEdge of a TopoCurveType
+is the start Node of the next directedEdge of the TopoCurveType in document order.  The TopoCurve type and element represent a homogeneous topological expression, a list of directed edges, which if realised are isomorphic to a geometric curve primitive. The intended use of TopoCurve is to appear within a line feature instance to express the structural and geometric relationships of this line to other features via the shared edge definitions.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedEdge" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value ===== -->
+	<element name="topoCurveProperty" type="gml:TopoCurvePropertyType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoCurvePropertyType">
+		<sequence>
+			<element ref="gml:TopoCurve"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="TopoSurface" type="gml:TopoSurfaceType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoSurfaceType">
+		<annotation>
+			<documentation>The TopoSurface type and element represent a homogeneous topological expression, a set of directed faces, which if realised are isomorphic to a geometric surface primitive. The intended use of TopoSurface is to appear within a surface feature instance to express the structural and possibly geometric relationships of this surface to other features via the shared face definitions.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedFace" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value ===== -->
+	<element name="topoSurfaceProperty" type="gml:TopoSurfacePropertyType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoSurfacePropertyType">
+		<sequence>
+			<element ref="gml:TopoSurface"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="TopoVolume" type="gml:TopoVolumeType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoVolumeType">
+		<annotation>
+			<documentation>The TopoVolume type and element represent a homogeneous topological expression, a set of directed TopoSolids, which if realised are isomorphic to a geometric solid primitive. The intended use of TopoVolume is to appear within a 3D solid feature instance to express the structural and geometric relationships of this solid to other features via the shared TopoSolid definitions.  . Note the orientation assigned to the directedSolid has no meaning in three dimensions. It is  [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedTopoSolid" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value  ===== -->
+	<element name="topoVolumeProperty" type="gml:TopoVolumePropertyType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoVolumePropertyType">
+		<sequence>
+			<element ref="gml:TopoVolume"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="TopoComplex" type="gml:TopoComplexType" substitutionGroup="gml:_Topology"/>
+	<!-- ========================================================== -->
+	<complexType name="TopoComplexType">
+		<annotation>
+			<documentation>This type represents a TP_Complex capable of holding topological primitives.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:maximalComplex"/>
+					<element ref="gml:superComplex" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:subComplex" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:topoPrimitiveMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:topoPrimitiveMembers" minOccurs="0"/>
+				</sequence>
+				<attribute name="isMaximal" type="boolean" default="false"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===== Property for topology association - by Value or Reference ===== -->
+	<element name="topoComplexProperty" type="gml:TopoComplexMemberType"/>
+	<!-- ========================================================== -->
+	<element name="subComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:subComplex">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="superComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:superComplex">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="maximalComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:subComplex">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>Need schamatron test here that isMaximal attribute value is true</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================= -->
+	<complexType name="TopoComplexMemberType">
+		<annotation>
+			<documentation>This Property can be used to embed a TopoComplex in a feature collection.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:TopoComplex" minOccurs="0"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value or Reference ===== -->
+	<element name="topoPrimitiveMember" type="gml:TopoPrimitiveMemberType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:topoPrimitiveMember">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================= -->
+	<complexType name="TopoPrimitiveMemberType">
+		<annotation>
+			<documentation>This type supports embedding topological primitives in a TopoComplex.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_TopoPrimitive" minOccurs="0"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value ===== -->
+	<element name="topoPrimitiveMembers" type="gml:TopoPrimitiveArrayAssociationType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:topoPrimitiveMember">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="TopoPrimitiveArrayAssociationType">
+		<annotation>
+			<documentation>This type supports embedding an array of topological primitives in a TopoComplex</documentation>
+		</annotation>
+		<!--		<complexContent>
+			<restriction base="gml:ArrayAssociationType">  -->
+		<sequence>
+			<choice minOccurs="0" maxOccurs="unbounded">
+				<element ref="gml:_TopoPrimitive"/>
+			</choice>
+		</sequence>
+		<!-- 			</restriction>
+		</complexContent> -->
+	</complexType>
+	<!-- ========================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/units.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/units.xsd
new file mode 100755
index 0000000..c676a7d
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/units.xsd
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1.2" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-units:3.1.1"/>
+		<documentation>Builds on gmlBase.xsd to encode units of measure (or uom), including definitions of units of measure and dictionaries of such definitions. GML 3.0 candidate schema, primary editor: Arliss Whiteside.			
+	Parts of this schema are based on Subclause 6.5.7 of ISO/CD 19103 Geographic information - Conceptual schema language, on Subclause A.5.2.2.3 of ISO/CD 19118 Geographic information - Encoding, and on most of OpenGIS Recommendation Paper OGC 02-007r4 Units of Measure Use and Definition Recommendations.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="dictionary.xsd"/>
+	<!-- ==============================================================
+       elements and types
+	============================================================== -->
+	<element name="unitOfMeasure" type="gml:UnitOfMeasureType"/>
+	<!-- =========================================================== -->
+	<complexType name="UnitOfMeasureType">
+		<annotation>
+			<documentation>Reference to a unit of measure definition that applies to all the numerical values described by the element containing this element. Notice that a complexType which needs to include the uom attribute can do so by extending this complexType. Alternately, this complexType can be used as a pattern for a new complexType.</documentation>
+		</annotation>
+		<sequence/>
+		<attribute name="uom" type="anyURI" use="required">
+			<annotation>
+				<documentation>Reference to a unit of measure definition, usually within the same XML document but possibly outside the XML document which contains this reference. For a reference within the same XML document, the "#" symbol should be used, followed by a text abbreviation of the unit name. However, the "#" symbol may be optional, and still may be interpreted as a reference.</documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="UnitDefinition" type="gml:UnitDefinitionType" substitutionGroup="gml:Definition"/>
+	<!-- =========================================================== -->
+	<complexType name="UnitDefinitionType">
+		<annotation>
+			<documentation>Definition of a unit of measure (or uom). The definition includes a quantityType property, which indicates the phenomenon to which the units apply, and a catalogSymbol, which gives the short symbol used for this unit. This element is used when the relationship of this unit to other units or units systems is unknown.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:quantityType"/>
+					<element ref="gml:catalogSymbol" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="BaseUnit" type="gml:BaseUnitType" substitutionGroup="gml:UnitDefinition"/>
+	<!-- =========================================================== -->
+	<complexType name="BaseUnitType">
+		<annotation>
+			<documentation>Definition of a unit of measure which is a base unit from the system of units.  A base unit cannot be derived by combination of other base units within this system.  Sometimes known as "fundamental unit".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<element name="unitsSystem" type="gml:ReferenceType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="DerivedUnit" type="gml:DerivedUnitType" substitutionGroup="gml:UnitDefinition"/>
+	<!-- ============================================================ -->
+	<complexType name="DerivedUnitType">
+		<annotation>
+			<documentation>Definition of a unit of measure which is defined through algebraic combination of more primitive units, which are usually base units from a particular system of units. Derived units based directly on base units are usually preferred for quantities other than the base units or fundamental quantities within a system.  If a derived unit is not the preferred unit, the ConventionalUnit element should be used instead.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<element ref="gml:derivationUnitTerm" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="ConventionalUnit" type="gml:ConventionalUnitType" substitutionGroup="gml:UnitDefinition"/>
+	<!-- =========================================================== -->
+	<complexType name="ConventionalUnitType">
+		<annotation>
+			<documentation>Definition of a unit of measure which is related to a preferred unit for this quantity type through a conversion formula.  A method for deriving this unit by algebraic combination of more primitive units, may also be provided.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<choice>
+						<element ref="gml:conversionToPreferredUnit"/>
+						<element ref="gml:roughConversionToPreferredUnit"/>
+					</choice>
+					<element ref="gml:derivationUnitTerm" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="quantityType" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Informal description of the phenomenon or type of quantity that is measured or observed. For example, "length", "angle", "time", "pressure", or "temperature". When the quantity is the result of an observation or measurement, this term is known as Observable Type or Measurand.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="catalogSymbol" type="gml:CodeType">
+		<annotation>
+			<documentation>For global understanding of a unit of measure, it is often possible to reference an item in a catalog of units, using a symbol in that catalog. The "codeSpace" attribute in "CodeType" identifies a namespace for the catalog symbol value, and might reference the catalog. The "string" value in "CodeType" contains the value of a symbol that is unique within this catalog namespace. This symbol often appears explicitly in the catalog, but it could be a combination of symbols  [...]
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="derivationUnitTerm" type="gml:DerivationUnitTermType"/>
+	<!-- =========================================================== -->
+	<complexType name="DerivationUnitTermType">
+		<annotation>
+			<documentation>Definition of one unit term for a derived unit of measure. This unit term references another unit of measure (uom) and provides an integer exponent applied to that unit in defining the compound unit. The exponent can be positive or negative, but not zero.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitOfMeasureType">
+				<attribute name="exponent" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="conversionToPreferredUnit" type="gml:ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>This element is included when this unit has an accurate conversion to the preferred unit for this quantity type.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="roughConversionToPreferredUnit" type="gml:ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>This element is included when the correct definition of this unit is unknown, but this unit has a rough or inaccurate conversion to the preferred unit for this quantity type.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>Relation of a unit to the preferred unit for this quantity type, specified by an arithmetic conversion (scaling and/or offset). A preferred unit is either a base unit or a derived unit selected for all units of one quantity type. The mandatory attribute "uom" shall reference the preferred unit that this conversion applies to. The conversion is specified by one of two alternative elements: "factor" or "formula".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitOfMeasureType">
+				<choice>
+					<element name="factor" type="double">
+						<annotation>
+							<documentation>Specification of the scale factor by which a value using this unit of measure can be multiplied to obtain the corresponding value using the preferred unit of measure.</documentation>
+						</annotation>
+					</element>
+					<element name="formula" type="gml:FormulaType">
+						<annotation>
+							<documentation>Specification of the formula by which a value using this unit of measure can be converted to obtain the corresponding value using the preferred unit of measure.</documentation>
+						</annotation>
+					</element>
+				</choice>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="FormulaType">
+		<annotation>
+			<documentation>Paremeters of a simple formula by which a value using this unit of measure can be converted to the corresponding value using the preferred unit of measure. The formula element contains elements a, b, c and d, whose values use the XML Schema type "double". These values are used in the formula y = (a + bx) / (c + dx), where x is a value using this unit, and y is the corresponding value using the preferred unit. The elements a and d are optional, and if values are not prov [...]
+		</annotation>
+		<sequence>
+			<element name="a" type="double" minOccurs="0"/>
+			<element name="b" type="double"/>
+			<element name="c" type="double"/>
+			<element name="d" type="double" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/valueObjects.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/valueObjects.xsd
new file mode 100755
index 0000000..4ec0e72
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/base/valueObjects.xsd
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+        attributeFormDefault="unqualified" version="3.1.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:valueObjects:3.1.1">valueObjects.xsd</appinfo>
+		<documentation>GML conformant schema for Values in which the  
+		    * scalar Value types and lists have their values recorded in simpleContent elements 
+		    * complex Value types are built recursively
+		    
+		    GML is an OGC Standard.
+		    Copyright (c) 2001,2005,2010 Open Geospatial Consortium.
+		    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<!-- geometry and temporal included so that _Geometry and _TimeObject can be added to Value choice group -->
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<!-- ====================================================================== -->
+	<group name="Value">
+		<annotation>
+			<documentation>Utility choice group which unifies generic Values defined in this schema document with 
+			Geometry and Temporal objects and the Measures described above, 
+			so that any of these may be used within aggregate Values.</documentation>
+		</annotation>
+		<choice>
+			<!-- <element ref="gml:_Value"/> -->
+			<group ref="gml:ValueObject"/>
+			<element ref="gml:_Object"/>
+			<!--			<element ref="gml:_Geometry"/>
+			<element ref="gml:_TimeObject"/> -->
+			<element ref="gml:Null"/>
+		</choice>
+	</group>
+	<!-- ====================================================================== -->
+	<group name="ValueObject">
+		<choice>
+			<group ref="gml:ScalarValue"/>
+			<group ref="gml:ScalarValueList"/>
+			<group ref="gml:ValueExtent"/>
+			<element ref="gml:CompositeValue"/>
+		</choice>
+	</group>
+	<!-- ======================================================================
+	<element name="_Value" abstract="true" substitutionGroup="gml:_Object">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group which contains _ScalarValue, _ScalarValueList and CompositeValue and (transitively) the elements in their substitution groups.  This element may be used in an application schema as a variable, so that in an XML instance document any member of its substitution group may occur.</documentation>
+		</annotation>
+	</element> -->
+	<!-- ====================================================================== -->
+	<!-- ================== Scalar Values =========================
+	<element name="_ScalarValue" abstract="true" substitutionGroup="gml:_Value">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group which contains Boolean, Category, Count and Quantity, and (transitively) the elements in their substitution groups.  This element may be used in an application schema as a variable, so that in an XML instance document any member of its substitution group may occur.</documentation>
+		</annotation>
+	</element> -->
+	<group name="ScalarValue">
+		<choice>
+			<element ref="gml:Boolean"/>
+			<element ref="gml:Category"/>
+			<element ref="gml:Quantity"/>
+			<element ref="gml:Count"/>
+		</choice>
+	</group>
+	<!-- ======================================================================
+	<element name="_ScalarValueList" abstract="true" substitutionGroup="gml:_Value">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group which contains the compact encodings BooleanList, CategoryList, CountList and QuantityList, and (transitively) the elements in their substitution groups.  This element may be used in an application schema as a variable, so that in an XML instance document any member of its substitution group may occur.</documentation>
+		</annotation>
+	</element> -->
+	<group name="ScalarValueList">
+		<choice>
+			<element ref="gml:BooleanList"/>
+			<element ref="gml:CategoryList"/>
+			<element ref="gml:QuantityList"/>
+			<element ref="gml:CountList"/>
+		</choice>
+	</group>
+	<!-- ====================================================================== -->
+	<!-- ======================= Boolean ========================
+	<element name="Boolean" type="boolean" substitutionGroup="gml:_ScalarValue"> -->
+	<element name="Boolean" type="boolean">
+		<annotation>
+			<documentation>A value from two-valued logic, using the XML Schema boolean type.  An instance may take the values {true, false, 1, 0}.</documentation>
+		</annotation>
+	</element>
+	<!--
+	<element name="BooleanList" type="gml:booleanOrNullList" substitutionGroup="gml:_ScalarValueList"> -->
+	<element name="BooleanList" type="gml:booleanOrNullList">
+		<annotation>
+			<documentation>XML List based on XML Schema boolean type.  An element of this type contains a space-separated list of boolean values {0,1,true,false}</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ======================= Category ==========================
+	<element name="Category" type="gml:CodeType" substitutionGroup="gml:_ScalarValue"> -->
+	<element name="Category" type="gml:CodeType">
+		<annotation>
+			<documentation>A term representing a classification.  It has an optional XML attribute codeSpace, whose value is a URI which identifies a dictionary, codelist or authority for the term.</documentation>
+		</annotation>
+	</element>
+	<!--
+	<element name="CategoryList" type="gml:CodeOrNullListType" substitutionGroup="gml:_ScalarValueList"> -->
+	<element name="CategoryList" type="gml:CodeOrNullListType">
+		<annotation>
+			<documentation>A space-separated list of terms or nulls.  A single XML attribute codeSpace may be provided, which authorises all the terms in the list.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- =========================== Quantity ============================
+	<element name="Quantity" type="gml:MeasureType" substitutionGroup="gml:_ScalarValue"> -->
+	<element name="Quantity" type="gml:MeasureType">
+		<annotation>
+			<documentation>A numeric value with a scale.  The content of the element is an amount using the XML Schema type double which permits decimal or scientific notation.  An XML attribute uom (unit of measure) is required, whose value is a URI which identifies the definition of the scale or units by which the numeric value must be multiplied.</documentation>
+		</annotation>
+	</element>
+	<!--
+	<element name="QuantityList" type="gml:MeasureOrNullListType" substitutionGroup="gml:_ScalarValueList"> -->
+	<element name="QuantityList" type="gml:MeasureOrNullListType">
+		<annotation>
+			<documentation>A space separated list of amounts or nulls.  The amounts use the XML Schema type double.  A single XML attribute uom (unit of measure) is required, whose value is a URI which identifies the definition of the scale or units by which all the amounts in the list must be multiplied.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ========================== Count ==========================
+	<element name="Count" type="integer" substitutionGroup="gml:_ScalarValue"> -->
+	<element name="Count" type="integer">
+		<annotation>
+			<documentation>An integer representing a frequency of occurrence.</documentation>
+		</annotation>
+	</element>
+	<!--
+	<element name="CountList" type="gml:integerOrNullList" substitutionGroup="gml:_ScalarValueList"> -->
+	<element name="CountList" type="gml:integerOrNullList">
+		<annotation>
+			<documentation>A space-separated list of integers or nulls.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!--                    aggregate Value types                      -->
+	<!-- ====================================================================== -->
+	<!-- ===================== ValueCollection ========================== -->
+	<complexType name="CompositeValueType">
+		<annotation>
+			<documentation>Aggregate value built from other Values using the Composite pattern. It contains zero or an arbitrary number of valueComponent elements, and zero or one valueComponents elements.  It may be used for strongly coupled aggregates (vectors, tensors) or for arbitrary collections of values.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:valueComponent" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:valueComponents" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- <element name="CompositeValue" type="gml:CompositeValueType" substitutionGroup="gml:_Value"> -->
+	<element name="CompositeValue" type="gml:CompositeValueType">
+		<annotation>
+			<documentation>Aggregate value built using the Composite pattern.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ========================= ValueArray ========================== -->
+	<complexType name="ValueArrayType">
+		<annotation>
+			<documentation>A Value Array is used for homogeneous arrays of primitive and aggregate values.  The member values may be scalars, composites, arrays or lists.  ValueArray has the same content model as CompositeValue, but the member values must be homogeneous.  The element declaration contains a Schematron constraint which expresses this restriction precisely.            Since the members are homogeneous, the referenceSystem (uom, codeSpace) may be specified on the ValueArray itself an [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:CompositeValueType">
+				<attributeGroup ref="gml:referenceSystem"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- -->
+	<element name="ValueArray" type="gml:ValueArrayType" substitutionGroup="gml:CompositeValue">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either codeSpace or uom not both">
+					<sch:rule context="gml:ValueArray">
+						<sch:report test="@codeSpace and @uom">ValueArray may not carry both a reference to a codeSpace and a uom</sch:report>
+					</sch:rule>
+				</sch:pattern>
+				<sch:pattern name="Check components are homogeneous">
+					<sch:rule context="gml:ValueArray">
+						<sch:assert test="count(gml:valueComponent/*) = count(gml:valueComponent/*[name() = name(../../gml:valueComponent[1]/*[1])])">All components of <sch:name/> must be of the same type</sch:assert>
+						<sch:assert test="count(gml:valueComponents/*) = count(gml:valueComponents/*[name() = name(../*[1])])">All components of <sch:name/> must be of the same type</sch:assert>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>A Value Array is used for homogeneous arrays of primitive and aggregate values.   _ScalarValueList is preferred for arrays of Scalar Values since this is more efficient.  Since "choice" is not available for attribute groups, an external constraint (e.g. Schematron) would be required to enforce the selection of only one of these through schema validation</documentation>
+		</annotation>
+	</element>
+	<!-- attribute group required for ValueArray -->
+	<attributeGroup name="referenceSystem">
+		<attribute name="codeSpace" type="anyURI" use="optional"/>
+		<attribute name="uom" type="anyURI" use="optional"/>
+	</attributeGroup>
+	<!-- ====================================================================== -->
+	<!-- ====================== Typed ValueExtents ============================ -->
+	<group name="ValueExtent">
+		<choice>
+			<element ref="gml:CategoryExtent"/>
+			<element ref="gml:QuantityExtent"/>
+			<element ref="gml:CountExtent"/>
+		</choice>
+	</group>
+	<!-- ======================================================================
+	<element name="QuantityExtent" type="gml:QuantityExtentType" substitutionGroup="gml:_Value"> -->
+	<element name="QuantityExtent" type="gml:QuantityExtentType">
+		<annotation>
+			<documentation>Utility element to store a 2-point range of numeric values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+	</element>
+	<!-- -->
+	<complexType name="QuantityExtentType">
+		<annotation>
+			<documentation>Restriction of list type to store a 2-point range of numeric values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureOrNullListType">
+				<length value="2"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- ======================================================================
+	<element name="CategoryExtent" type="gml:CategoryExtentType" substitutionGroup="gml:_Value"> -->
+	<element name="CategoryExtent" type="gml:CategoryExtentType">
+		<annotation>
+			<documentation>Utility element to store a 2-point range of ordinal values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+	</element>
+	<!-- -->
+	<complexType name="CategoryExtentType">
+		<annotation>
+			<documentation>Restriction of list type to store a 2-point range of ordinal values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeOrNullListType">
+				<length value="2"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- ======================================================================
+	<element name="CountExtent" type="gml:CountExtentType" substitutionGroup="gml:_Value"> -->
+	<element name="CountExtent" type="gml:CountExtentType">
+		<annotation>
+			<documentation>Utility element to store a 2-point range of frequency values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+	</element>
+	<!-- -->
+	<simpleType name="CountExtentType">
+		<annotation>
+			<documentation>Restriction of list type to store a 2-point range of frequency values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+		<restriction base="gml:integerOrNullList">
+			<length value="2"/>
+		</restriction>
+	</simpleType>
+	<!-- ====================================================================== -->
+	<!-- ===================== pieces needed for compositing ==================== -->
+	<element name="valueProperty" type="gml:ValuePropertyType">
+		<annotation>
+			<documentation>Element which refers to, or contains, a Value</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<element name="valueComponent" type="gml:ValuePropertyType">
+		<annotation>
+			<documentation>Element which refers to, or contains, a Value.  This version is used in CompositeValues.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<complexType name="ValuePropertyType">
+		<annotation>
+			<documentation>GML property which refers to, or contains, a Value</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<group ref="gml:Value"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<element name="valueComponents" type="gml:ValueArrayPropertyType">
+		<annotation>
+			<documentation>Element which refers to, or contains, a set of homogeneously typed Values.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<complexType name="ValueArrayPropertyType">
+		<annotation>
+			<documentation>GML property which refers to, or contains, a set of homogeneously typed Values.</documentation>
+		</annotation>
+		<sequence>
+			<group ref="gml:Value" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- ====================== utility typed valueProperty types ===================  -->
+	<complexType name="ScalarValuePropertyType">
+		<annotation>
+			<documentation>Property whose content is a scalar value.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<!-- <element ref="gml:_ScalarValue"/> -->
+					<group ref="gml:ScalarValue"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="BooleanPropertyType">
+		<annotation>
+			<documentation>Property whose content is a Boolean value.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<element ref="gml:Boolean"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="CategoryPropertyType">
+		<annotation>
+			<documentation>Property whose content is a Category.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<element ref="gml:Category"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="QuantityPropertyType">
+		<annotation>
+			<documentation>Property whose content is a Quantity.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<element ref="gml:Quantity"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="CountPropertyType">
+		<annotation>
+			<documentation>Property whose content is a Count.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<element ref="gml:Count"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ====================================================================== -->
+</schema>
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/smil/smil20-language.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/smil/smil20-language.xsd
new file mode 100755
index 0000000..6608c90
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/smil/smil20-language.xsd
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+=================== OpenGIS ============================  
+	This schema is here because there are errors in publicly available smil schemas at w3c site.
+	One is acknowledged by w3c - it is typographical error described in SMIL errata document at:
+ 	http://www.w3.org/2001/07/REC-SMIL20-20010731-errata
+ 	under:
+	E30: Correction in the SMIL 2.0 utility Schema, section B.3.48 (revised 29 03 2002)
+	Others (at least one) are assumed after failed validation using Visual Studio .NET.
+	These smil schemas are reorganized to include in minimum number of files all and only definitions required by
+	defaultStyle.xsd. It was done to enable the validation of GML3.0 schemas.
+	When w3c fixes the public schemas these will be discarded 
+	comment: Milan Trninic, Galdos Systems Inc., May 2002
+=================== OpenGIS ============================ 
+-->
+<!--
+XML Schema for the SMIL 2.0 Language
+
+This is SMIL 2.0
+Copyright: 1998-2001 W3C (MIT, INRIA, Keio), All Rights Reserved.
+See http://www.w3.org/Consortium/Legal/.
+
+Public URI: http://www.w3.org/2001/SMIL20/smil20-language.xsd
+Author: Aaron Michael Cohen (Intel)
+
+Revision: 2001/07/15
+
+Note: <any> wildcard element content is missing from most of the SMIL 2.0 elements because of a conflict 
+between substitutionGroups and wildcard content.
+-->
+<schema targetNamespace="http://www.w3.org/2001/SMIL20/Language" xmlns:smil20lang="http://www.w3.org/2001/SMIL20/Language" xmlns:smil20="http://www.w3.org/2001/SMIL20/" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+	<!-- import the smil20 namespaces -->
+	<import namespace="http://www.w3.org/2001/SMIL20/" schemaLocation="smil20.xsd"/>
+	<element name="animate" type="smil20lang:animateType"/>
+	<complexType name="animateType">
+		<complexContent>
+			<extension base="smil20:animatePrototype">
+				<choice minOccurs="0" maxOccurs="unbounded">
+					<any namespace="##other" processContents="lax"/>
+				</choice>
+				<attributeGroup ref="smil20lang:CoreAttrs"/>
+				<attributeGroup ref="smil20lang:TimingAttrs"/>
+				<attributeGroup ref="smil20:animTargetAttrs"/>
+				<attributeGroup ref="smil20:animModeAttrs"/>
+				<attributeGroup ref="smil20:skipContentAttrs"/>
+				<anyAttribute namespace="##any" processContents="strict"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<attributeGroup name="CoreAttrs">
+		<attributeGroup ref="smil20:structureModuleAttrs"/>
+		<attributeGroup ref="smil20:alternateContentAttrs"/>
+	</attributeGroup>
+	<attributeGroup name="TimingAttrs">
+		<attributeGroup ref="smil20lang:BasicTimingAttrs"/>
+		<attributeGroup ref="smil20:syncBehaviorAttrs"/>
+		<attributeGroup ref="smil20:syncBehaviorDefaultAttrs"/>
+		<attributeGroup ref="smil20:restartTimingAttrs"/>
+		<attributeGroup ref="smil20:restartDefaultAttrs"/>
+		<attributeGroup ref="smil20:fillTimingAttrs"/>
+		<attributeGroup ref="smil20:fillDefaultAttrs"/>
+	</attributeGroup>
+	<attributeGroup name="BasicTimingAttrs">
+		<attributeGroup ref="smil20:beginEndTimingAttrs"/>
+		<attributeGroup ref="smil20:durTimingAttrs"/>
+		<attributeGroup ref="smil20:repeatTimingAttrs"/>
+		<attributeGroup ref="smil20:deprecatedRepeatTiming"/>
+		<attributeGroup ref="smil20:minMaxTimingAttrs"/>
+	</attributeGroup>
+	<element name="animateMotion" type="smil20lang:animateMotionType"/>
+	<complexType name="animateMotionType">
+		<complexContent>
+			<extension base="smil20:animateMotionPrototype">
+				<choice minOccurs="0" maxOccurs="unbounded">
+					<any namespace="##other" processContents="lax"/>
+				</choice>
+				<attributeGroup ref="smil20lang:CoreAttrs"/>
+				<attributeGroup ref="smil20lang:TimingAttrs"/>
+				<attributeGroup ref="smil20:animTargetAttrs"/>
+				<attributeGroup ref="smil20:animModeAttrs"/>
+				<attributeGroup ref="smil20:skipContentAttrs"/>
+				<anyAttribute namespace="##any" processContents="strict"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="animateColor" type="smil20lang:animateColorType"/>
+	<complexType name="animateColorType">
+		<complexContent>
+			<extension base="smil20:animateColorPrototype">
+				<choice minOccurs="0" maxOccurs="unbounded">
+					<any namespace="##other" processContents="lax"/>
+				</choice>
+				<attributeGroup ref="smil20lang:CoreAttrs"/>
+				<attributeGroup ref="smil20lang:TimingAttrs"/>
+				<attributeGroup ref="smil20:animTargetAttrs"/>
+				<attributeGroup ref="smil20:animModeAttrs"/>
+				<attributeGroup ref="smil20:skipContentAttrs"/>
+				<anyAttribute namespace="##any" processContents="strict"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="set" type="smil20lang:setType"/>
+	<complexType name="setType">
+		<complexContent>
+			<extension base="smil20:setPrototype">
+				<choice minOccurs="0" maxOccurs="unbounded">
+					<any namespace="##other" processContents="lax"/>
+				</choice>
+				<attributeGroup ref="smil20lang:CoreAttrs"/>
+				<attributeGroup ref="smil20lang:TimingAttrs"/>
+				<attributeGroup ref="smil20:animTargetAttrs"/>
+				<attributeGroup ref="smil20:skipContentAttrs"/>
+				<anyAttribute namespace="##any" processContents="strict"/>
+			</extension>
+		</complexContent>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/smil/smil20.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/smil/smil20.xsd
new file mode 100755
index 0000000..293f89a
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.1.1/smil/smil20.xsd
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+=================== OpenGIS ============================  
+	This schema is here because there are errors in publicly available smil schemas at w3c site.
+	One is acknowledged by w3c - it is typographical error described in SMIL errata document at:
+ 	http://www.w3.org/2001/07/REC-SMIL20-20010731-errata
+ 	under:
+	E30: Correction in the SMIL 2.0 utility Schema, section B.3.48 (revised 29 03 2002)
+	Others (at least one) are assumed after failed validation using Visual Studio .NET.
+	These smil schemas are reorganized to include in minimum number of files all and only definitions required by
+	defaultStyle.xsd. It was done to enable the validation of GML3.0 schemas.
+	When w3c fixes the public schemas these will be discarded 
+	comment: Milan Trninic, Galdos Systems Inc., May 2002
+	
+	comment#2: Milan Trninic, Galdos Systems Inc., Dec 2002
+	In order to validate with xerces, changed the "x:" prefix to "xml:" in the namespace declaration and reference to "lang" attribute
+=================== OpenGIS ============================ 
+-->
+<!--
+XML Schema for the SMIL 2.0 modules
+
+This is SMIL 2.0
+Copyright: 1998-2001 W3C (MIT, INRIA, Keio), All Rights Reserved.
+See http://www.w3.org/Consortium/Legal/.
+
+Public URI: http://www.w3.org/2001/SMIL20/smil20.xsd
+Author: Aaron Michael Cohen (Intel)
+Revision: 2001/07/31
+-->
+<schema targetNamespace="http://www.w3.org/2001/SMIL20/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:smil20="http://www.w3.org/2001/SMIL20/" xmlns:smil20lang="http://www.w3.org/2001/SMIL20/Language" elementFormDefault="qualified">
+	<import namespace="http://www.w3.org/2001/SMIL20/Language" schemaLocation="smil20-language.xsd"/>
+	<!-- ============================================================= 
+	struct.xsd
+	============================================================== -->
+	<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+	<attributeGroup name="structureModuleAttrs">
+		<attribute name="id" type="ID" use="optional"/>
+		<attribute name="class" type="string" use="optional"/>
+		<attribute ref="xml:lang" use="optional"/>
+	</attributeGroup>
+	<!-- ============================================================= 
+	content.xsd
+	============================================================== -->
+	<attributeGroup name="skipContentAttrs">
+		<attribute name="skip-content" type="boolean" use="optional" default="true"/>
+	</attributeGroup>
+	<!-- ============================================================= 
+	media.xsd
+	============================================================== -->
+	<attributeGroup name="alternateContentAttrs">
+		<attribute name="alt" type="string" use="optional"/>
+		<attribute name="longdesc" type="anyURI" use="optional"/>
+	</attributeGroup>
+	<!-- ============================================================= 
+	utility.xsd
+	============================================================== -->
+	<simpleType name="nonNegativeDecimalType">
+		<restriction base="decimal">
+			<minInclusive value="0.0"/>
+		</restriction>
+	</simpleType>
+	<!-- ============================================================= 
+	animate.xsd
+	============================================================== -->
+	<element name="animate" type="smil20lang:animateType" substitutionGroup="smil20lang:animate"/>
+	<complexType name="animatePrototype">
+		<attributeGroup ref="smil20:animNamedTargetAttrs"/>
+		<attributeGroup ref="smil20:animAddAccumAttrs"/>
+		<attributeGroup ref="smil20:animValuesAttrs"/>
+	</complexType>
+	<attributeGroup name="animNamedTargetAttrs">
+		<attribute name="attributeName" type="string" use="required"/>
+		<attribute name="attributeType" use="optional" default="auto">
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="XML"/>
+					<enumeration value="CSS"/>
+					<enumeration value="auto"/>
+				</restriction>
+			</simpleType>
+		</attribute>
+	</attributeGroup>
+	<attributeGroup name="animAddAccumAttrs">
+		<attribute name="additive" use="optional" default="replace">
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="replace"/>
+					<enumeration value="sum"/>
+				</restriction>
+			</simpleType>
+		</attribute>
+		<attribute name="accumulate" use="optional" default="none">
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="none"/>
+					<enumeration value="sum"/>
+				</restriction>
+			</simpleType>
+		</attribute>
+	</attributeGroup>
+	<attributeGroup name="animValuesAttrs">
+		<attributeGroup ref="smil20:animSetValuesAttrs"/>
+		<attribute name="from" type="string" use="optional"/>
+		<attribute name="by" type="string" use="optional"/>
+		<attribute name="values" type="string" use="optional"/>
+	</attributeGroup>
+	<attributeGroup name="animSetValuesAttrs">
+		<attribute name="to" type="string" use="optional"/>
+	</attributeGroup>
+	<attributeGroup name="animTargetAttrs">
+		<attribute name="targetElement" type="IDREF" use="optional"/>
+	</attributeGroup>
+	<attributeGroup name="animModeAttrs">
+		<attribute name="calcMode" use="optional" default="linear">
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="discrete"/>
+					<enumeration value="linear"/>
+					<enumeration value="paced"/>
+				</restriction>
+			</simpleType>
+		</attribute>
+	</attributeGroup>
+	<element name="animateMotion" type="smil20lang:animateMotionType" substitutionGroup="smil20lang:animateMotion"/>
+	<complexType name="animateMotionPrototype">
+		<attributeGroup ref="smil20:animAddAccumAttrs"/>
+		<attributeGroup ref="smil20:animValuesAttrs"/>
+		<attribute name="origin" type="string" use="optional"/>
+	</complexType>
+	<element name="animateColor" type="smil20lang:animateColorType" substitutionGroup="smil20lang:animateColor"/>
+	<complexType name="animateColorPrototype">
+		<attributeGroup ref="smil20:animNamedTargetAttrs"/>
+		<attributeGroup ref="smil20:animAddAccumAttrs"/>
+		<attributeGroup ref="smil20:animValuesAttrs"/>
+	</complexType>
+	<element name="set" type="smil20lang:setType" substitutionGroup="smil20lang:set"/>
+	<complexType name="setPrototype">
+		<attributeGroup ref="smil20:animNamedTargetAttrs"/>
+		<attributeGroup ref="smil20:animSetValuesAttrs"/>
+	</complexType>
+	<!-- ============================================================= 
+	timing.xsd
+	============================================================== -->
+	<attributeGroup name="syncBehaviorAttrs">
+		<attribute name="syncBehavior" type="smil20:syncBehaviorType" default="default"/>
+		<attribute name="syncTolerance" type="string" use="optional"/>
+	</attributeGroup>
+	<simpleType name="syncBehaviorType">
+		<restriction base="string">
+			<enumeration value="canSlip"/>
+			<enumeration value="locked"/>
+			<enumeration value="independent"/>
+			<enumeration value="default"/>
+		</restriction>
+	</simpleType>
+	<attributeGroup name="syncBehaviorDefaultAttrs">
+		<attribute name="syncBehaviorDefault" type="smil20:syncBehaviorDefaultType" default="inherit"/>
+		<attribute name="syncToleranceDefault" type="string" default="inherit"/>
+	</attributeGroup>
+	<simpleType name="syncBehaviorDefaultType">
+		<restriction base="string">
+			<enumeration value="canSlip"/>
+			<enumeration value="locked"/>
+			<enumeration value="independent"/>
+			<enumeration value="inherit"/>
+		</restriction>
+	</simpleType>
+	<attributeGroup name="restartTimingAttrs">
+		<attribute name="restart" type="smil20:restartTimingType" default="default"/>
+	</attributeGroup>
+	<simpleType name="restartTimingType">
+		<restriction base="string">
+			<enumeration value="never"/>
+			<enumeration value="always"/>
+			<enumeration value="whenNotActive"/>
+			<enumeration value="default"/>
+		</restriction>
+	</simpleType>
+	<attributeGroup name="restartDefaultAttrs">
+		<attribute name="restartDefault" type="smil20:restartDefaultType" default="inherit"/>
+	</attributeGroup>
+	<simpleType name="restartDefaultType">
+		<restriction base="string">
+			<enumeration value="never"/>
+			<enumeration value="always"/>
+			<enumeration value="whenNotActive"/>
+			<enumeration value="inherit"/>
+		</restriction>
+	</simpleType>
+	<attributeGroup name="fillTimingAttrs">
+		<attribute name="fill" type="smil20:fillTimingAttrsType" default="default"/>
+	</attributeGroup>
+	<simpleType name="fillTimingAttrsType">
+		<restriction base="string">
+			<enumeration value="remove"/>
+			<enumeration value="freeze"/>
+			<enumeration value="hold"/>
+			<enumeration value="auto"/>
+			<enumeration value="default"/>
+			<enumeration value="transition"/>
+		</restriction>
+	</simpleType>
+	<attributeGroup name="fillDefaultAttrs">
+		<attribute name="fillDefault" type="smil20:fillDefaultType" default="inherit"/>
+	</attributeGroup>
+	<simpleType name="fillDefaultType">
+		<restriction base="string">
+			<enumeration value="remove"/>
+			<enumeration value="freeze"/>
+			<enumeration value="hold"/>
+			<enumeration value="auto"/>
+			<enumeration value="inherit"/>
+			<enumeration value="transition"/>
+		</restriction>
+	</simpleType>
+	<attributeGroup name="beginEndTimingAttrs">
+		<attribute name="begin" type="string"/>
+		<attribute name="end" type="string"/>
+	</attributeGroup>
+	<attributeGroup name="durTimingAttrs">
+		<attribute name="dur" type="string"/>
+	</attributeGroup>
+	<attributeGroup name="repeatTimingAttrs">
+		<attribute name="repeatDur" type="string"/>
+		<attribute name="repeatCount" type="smil20:nonNegativeDecimalType"/>
+	</attributeGroup>
+	<attributeGroup name="deprecatedRepeatTiming">
+		<attribute name="repeat" type="nonNegativeInteger"/>
+	</attributeGroup>
+	<attributeGroup name="minMaxTimingAttrs">
+		<attribute name="min" type="string"/>
+		<attribute name="max" type="string"/>
+	</attributeGroup>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/basicTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/basicTypes.xsd
new file mode 100755
index 0000000..d6ffd5f
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/basicTypes.xsd
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:basicTypes:3.2.1">basicTypes.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 8.2.
+W3C XML Schema provides a set of built-in "simple" types which define methods for representing values as literals without internal markup.  These are described in W3C XML Schema Part 2:2001.  Because GML is an XML encoding in which instances are described using XML Schema, these simple types shall be used as far as possible and practical for the representation of data types.  W3C XML Schema also provides methods for defining 
+-	new simple types by restriction and combination of the built-in types, and 
+-	complex types, with simple content, but which also have XML attributes.  
+In many places where a suitable built-in simple type is not available, simple content types derived using the XML Schema mechanisms are used for the representation of data types in GML.  
+A set of these simple content types that are required by several GML components are defined in the basicTypes schema, as well as some elements based on them. These are primarily based around components needed to record amounts, counts, flags and terms, together with support for exceptions or null values.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<simpleType name="NilReasonType">
+		<annotation>
+			<documentation>gml:NilReasonType defines a content model that allows recording of an explanation for a void value or other exception.
+gml:NilReasonType is a union of the following enumerated values:
+-	inapplicable there is no value
+-	missing the correct value is not readily available to the sender of this data. Furthermore, a correct value may not exist
+-	template the value will be available later
+-	unknown the correct value is not known to, and not computable by, the sender of this data. However, a correct value probably exists
+-	withheld the value is not divulged
+-	other:text other brief explanation, where text is a string of two or more characters with no included spaces
+and
+-	anyURI which should refer to a resource which describes the reason for the exception
+A particular community may choose to assign more detailed semantics to the standard values provided. Alternatively, the URI method enables a specific or more complete explanation for the absence of a value to be provided elsewhere and indicated by-reference in an instance document.
+gml:NilReasonType is used as a member of a union in a number of simple content types where it is necessary to permit a value from the NilReasonType union as an alternative to the primary type.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration anyURI"/>
+	</simpleType>
+	<simpleType name="NilReasonEnumeration">
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="inapplicable"/>
+					<enumeration value="missing"/>
+					<enumeration value="template"/>
+					<enumeration value="unknown"/>
+					<enumeration value="withheld"/>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<simpleType name="SignType">
+		<annotation>
+			<documentation>gml:SignType is a convenience type with values "+" (plus) and "-" (minus).</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="-"/>
+			<enumeration value="+"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="booleanOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration boolean anyURI"/>
+	</simpleType>
+	<simpleType name="doubleOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration double anyURI"/>
+	</simpleType>
+	<simpleType name="integerOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration integer anyURI"/>
+	</simpleType>
+	<simpleType name="NameOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration Name anyURI"/>
+	</simpleType>
+	<simpleType name="stringOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration string anyURI"/>
+	</simpleType>
+	<complexType name="CodeType">
+		<annotation>
+			<documentation>gml:CodeType is a generalized type to be used for a term, keyword or name.
+It adds a XML attribute codeSpace to a term, where the value of the codeSpace attribute (if present) shall indicate a dictionary, thesaurus, classification scheme, authority, or pattern for the term.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute name="codeSpace" type="anyURI"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<complexType name="CodeWithAuthorityType">
+		<annotation>
+			<documentation>gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeType">
+				<attribute name="codeSpace" type="anyURI" use="required"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<complexType name="MeasureType">
+		<annotation>
+			<documentation>gml:MeasureType supports recording an amount encoded as a value of XML Schema double, together with a units of measure indicated by an attribute uom, short for "units Of measure". The value of the uom attribute identifies a reference system for the amount, usually a ratio or interval scale.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="double">
+				<attribute name="uom" type="gml:UomIdentifier" use="required"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="UomIdentifier">
+		<annotation>
+			<documentation>The simple type gml:UomIdentifer defines the syntax and value space of the unit of measure identifier.</documentation>
+		</annotation>
+		<union memberTypes="gml:UomSymbol gml:UomURI"/>
+	</simpleType>
+	<simpleType name="UomSymbol">
+		<annotation>
+			<documentation>This type specifies a character string of length at least one, and restricted such that it must not contain any of the following characters: ":" (colon), " " (space), (newline), (carriage return), (tab). This allows values corresponding to familiar abbreviations, such as "kg", "m/s", etc. 
+It is recommended that the symbol be an identifier for a unit of measure as specified in the "Unified Code of Units of Measure" (UCUM) (http://aurora.regenstrief.org/UCUM). This provides a set of symbols and a grammar for constructing identifiers for units of measure that are unique, and may be easily entered with a keyboard supporting the limited character set known as 7-bit ASCII. ISO 2955 formerly provided a specification with this scope, but was withdrawn in 2001. UCUM largely follow [...]
+		</annotation>
+		<restriction base="string">
+			<pattern value="[^: \n\r\t]+"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="UomURI">
+		<annotation>
+			<documentation>This type specifies a URI, restricted such that it must start with one of the following sequences: "#", "./", "../", or a string of characters followed by a ":". These patterns ensure that the most common URI forms are supported, including absolute and relative URIs and URIs that are simple fragment identifiers, but prohibits certain forms of relative URI that could be mistaken for unit of measure symbol . 
+NOTE	It is possible to re-write such a relative URI to conform to the restriction (e.g. "./m/s").
+In an instance document, on elements of type gml:MeasureType the mandatory uom attribute shall carry a value corresponding to either 
+-	a conventional unit of measure symbol,
+-	a link to a definition of a unit of measure that does not have a conventional symbol, or when it is desired to indicate a precise or variant definition.</documentation>
+		</annotation>
+		<restriction base="anyURI">
+			<pattern value="([a-zA-Z][a-zA-Z0-9\-\+\.]*:|\.\./|\./|#).*"/>
+		</restriction>
+	</simpleType>
+	<complexType name="CoordinatesType">
+		<annotation>
+			<documentation>This type is deprecated for tuples with ordinate values that are numbers.
+CoordinatesType is a text string, intended to be used to record an array of tuples or coordinates. 
+While it is not possible to enforce the internal structure of the string through schema validation, some optional attributes have been provided in previous versions of GML to support a description of the internal structure. These attributes are deprecated. The attributes were intended to be used as follows:
+Decimal	symbol used for a decimal point (default="." a stop or period)
+cs        	symbol used to separate components within a tuple or coordinate string (default="," a comma)
+ts        	symbol used to separate tuples or coordinate strings (default=" " a space)
+Since it is based on the XML Schema string type, CoordinatesType may be used in the construction of tables of tuples or arrays of tuples, including ones that contain mixed text and numeric values.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute name="decimal" type="string" default="."/>
+				<attribute name="cs" type="string" default=","/>
+				<attribute name="ts" type="string" default="&#x20;"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="booleanList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="boolean"/>
+	</simpleType>
+	<simpleType name="doubleList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="double"/>
+	</simpleType>
+	<simpleType name="integerList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="integer"/>
+	</simpleType>
+	<simpleType name="NameList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="Name"/>
+	</simpleType>
+	<simpleType name="NCNameList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="NCName"/>
+	</simpleType>
+	<simpleType name="QNameList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="QName"/>
+	</simpleType>
+	<simpleType name="booleanOrNilReasonList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="gml:booleanOrNilReason"/>
+	</simpleType>
+	<simpleType name="NameOrNilReasonList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="gml:NameOrNilReason"/>
+	</simpleType>
+	<simpleType name="doubleOrNilReasonList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="gml:doubleOrNilReason"/>
+	</simpleType>
+	<simpleType name="integerOrNilReasonList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="gml:integerOrNilReason"/>
+	</simpleType>
+	<complexType name="CodeListType">
+		<annotation>
+			<documentation>gml:CodeListType provides for lists of terms. The values in an instance element shall all be valid according to the rules of the dictionary, classification scheme, or authority identified by the value of its codeSpace attribute.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:NameList">
+				<attribute name="codeSpace" type="anyURI"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<complexType name="CodeOrNilReasonListType">
+		<annotation>
+			<documentation>gml:CodeOrNilReasonListType provides for lists of terms. The values in an instance element shall all be valid according to the rules of the dictionary, classification scheme, or authority identified by the value of its codeSpace attribute. An instance element may also include embedded values from NilReasonType. It is intended to be used in situations where a term or classification is expected, but the value may be absent for some reason.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:NameOrNilReasonList">
+				<attribute name="codeSpace" type="anyURI"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<complexType name="MeasureListType">
+		<annotation>
+			<documentation>gml:MeasureListType provides for a list of quantities.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attribute name="uom" type="gml:UomIdentifier" use="required"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<complexType name="MeasureOrNilReasonListType">
+		<annotation>
+			<documentation>gml:MeasureOrNilReasonListType provides for a list of quantities. An instance element may also include embedded values from NilReasonType. It is intended to be used in situations where a value is expected, but the value may be absent for some reason.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleOrNilReasonList">
+				<attribute name="uom" type="gml:UomIdentifier" use="required"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateOperations.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateOperations.xsd
new file mode 100755
index 0000000..5eaacaf
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateOperations.xsd
@@ -0,0 +1,525 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" xml:lang="en" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns="http://www.w3.org/2001/XMLSchema" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:coordinateOperations:3.2.1">coordinateOperations.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.6.
+The spatial or temporal coordinate operations schema components can be divided into five logical parts, which define elements and types for XML encoding of the definitions of:
+-	Multiple abstract coordinate operations
+-	Multiple concrete types of coordinate operations, including Transformations and Conversions
+-	Abstract and concrete parameter values and groups
+-	Operation methods
+-	Abstract and concrete operation parameters and groups
+These schema component encodes the Coordinate Operation package of the UML Model for ISO 19111 Clause 11.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<include schemaLocation="measures.xsd"/>
+	<import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
+	<element name="AbstractCoordinateOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:AbstractCoordinateOperation is a mathematical operation on coordinates that transforms or converts coordinates to another coordinate reference system. Many but not all coordinate operations (from CRS A to CRS B) also uniquely define the inverse operation (from CRS B to CRS A). In some cases, the operation method algorithm for the inverse operation is the same as for the forward algorithm, but the signs of some operation parameter values shall be reversed. In other c [...]
+The optional coordinateOperationAccuracy property elements provide estimates of the impact of this coordinate operation on point position accuracy.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractCoordinateOperationType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+					<element ref="gml:operationVersion" minOccurs="0"/>
+					<element ref="gml:coordinateOperationAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:sourceCRS" minOccurs="0"/>
+					<element ref="gml:targetCRS" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="operationVersion" type="string">
+		<annotation>
+			<documentation>gml:operationVersion is the version of the coordinate transformation (i.e., instantiation due to the stochastic nature of the parameters). Mandatory when describing a transformation, and should not be supplied for a conversion.</documentation>
+		</annotation>
+	</element>
+	<element name="coordinateOperationAccuracy">
+		<annotation>
+			<documentation>gml:coordinateOperationAccuracy is an association role to a DQ_PositionalAccuracy object as encoded in ISO/TS 19139, either referencing or containing the definition of that positional accuracy. That object contains an estimate of the impact of this coordinate operation on point accuracy. That is, it gives position error estimates for the target coordinates of this coordinate operation, assuming no errors in the source coordinates.</documentation>
+		</annotation>
+		<complexType>
+			<sequence minOccurs="0">
+				<element ref="gmd:AbstractDQ_PositionalAccuracy"/>
+			</sequence>
+			<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</complexType>
+	</element>
+	<element name="sourceCRS" type="gml:CRSPropertyType">
+		<annotation>
+			<documentation>gml:sourceCRS is an association role to the source CRS (coordinate reference system) of this coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<element name="targetCRS" type="gml:CRSPropertyType">
+		<annotation>
+			<documentation>gml:targetCRS is an association role to the target CRS (coordinate reference system) of this coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoordinateOperationPropertyType">
+		<annotation>
+			<documentation>gml:CoordinateOperationPropertyType is a property type for association roles to a coordinate operation, either referencing or containing the definition of that coordinate operation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractCoordinateOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="AbstractSingleOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:AbstractCoordinateOperation">
+		<annotation>
+			<documentation>gml:AbstractSingleOperation is a single (not concatenated) coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SingleOperationPropertyType">
+		<annotation>
+			<documentation>gml:SingleOperationPropertyType is a property type for association roles to a single operation, either referencing or containing the definition of that single operation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractSingleOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="AbstractGeneralConversion" type="gml:AbstractGeneralConversionType" abstract="true" substitutionGroup="gml:AbstractOperation">
+		<annotation>
+			<documentation>gm:AbstractGeneralConversion is an abstract operation on coordinates that does not include any change of datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters. The operationVersion, sourceCRS, and targetCRS elements are omitted in a coordinate conversion.
+This abstract complex type is expected to be extended for well-known operation methods with many Conversion instances, in GML Application Schemas that define operation-method-specialized element names and contents. This conversion uses an operation method, usually with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to  [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralConversionType" abstract="true">
+		<complexContent>
+			<restriction base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:descriptionReference" minOccurs="0"/>
+					<element ref="gml:identifier"/>
+					<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+					<element ref="gml:coordinateOperationAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="GeneralConversionPropertyType">
+		<annotation>
+			<documentation>gml:GeneralConversionPropertyType is a property type for association roles to a general conversion, either referencing or containing the definition of that conversion.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeneralConversion"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="AbstractGeneralTransformation" type="gml:AbstractGeneralTransformationType" abstract="true" substitutionGroup="gml:AbstractOperation">
+		<annotation>
+			<documentation>gml:AbstractGeneralTransformation is an abstract operation on coordinates that usually includes a change of Datum. The parameters of a coordinate transformation are empirically derived from data containing the coordinates of a series of points in both coordinate reference systems. This computational process is usually "over-determined", allowing derivation of error (or accuracy) estimates for the transformation. Also, the stochastic nature of the parameters may result i [...]
+This abstract complex type is expected to be extended for well-known operation methods with many Transformation instances, in Application Schemas that define operation-method-specialized value element names and contents. This transformation uses an operation method with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralTransformationType" abstract="true">
+		<complexContent>
+			<restriction base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:descriptionReference" minOccurs="0"/>
+					<element ref="gml:identifier"/>
+					<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+					<element ref="gml:operationVersion"/>
+					<element ref="gml:coordinateOperationAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:sourceCRS"/>
+					<element ref="gml:targetCRS"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="GeneralTransformationPropertyType">
+		<annotation>
+			<documentation>gml:GeneralTransformationPropertyType is a property type for association roles to a general transformation, either referencing or containing the definition of that transformation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeneralTransformation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="ConcatenatedOperation" type="gml:ConcatenatedOperationType" substitutionGroup="gml:AbstractCoordinateOperation"/>
+	<complexType name="ConcatenatedOperationType">
+		<annotation>
+			<documentation>gml:ConcatenatedOperation is an ordered sequence of two or more coordinate operations. This sequence of operations is constrained by the requirement that the source coordinate reference system of step (n+1) must be the same as the target coordinate reference system of step (n). The source coordinate reference system of the first step and the target coordinate reference system of the last step are the source and target coordinate reference system associated with the conc [...]
+The gml:coordOperation property elements are an ordered sequence of associations to the two or more operations used by this concatenated operation. The AggregationAttributeGroup should be used to specify that the coordOperation associations are ordered.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:coordOperation" minOccurs="2" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="coordOperation" type="gml:CoordinateOperationPropertyType">
+		<annotation>
+			<documentation>gml:coordOperation is an association role to a coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ConcatenatedOperationPropertyType">
+		<annotation>
+			<documentation>gml:ConcatenatedOperationPropertyType is a property type for association roles to a concatenated operation, either referencing or containing the definition of that concatenated operation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ConcatenatedOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="PassThroughOperation" type="gml:PassThroughOperationType" substitutionGroup="gml:AbstractSingleOperation">
+		<annotation>
+			<documentation>gml:PassThroughOperation is a pass-through operation specifies that a subset of a coordinate tuple is subject to a specific coordinate operation.
+The modifiedCoordinate property elements are an ordered sequence of positive integers defining the positions in a coordinate tuple of the coordinates affected by this pass-through operation. The AggregationAttributeGroup should be used to specify that the modifiedCoordinate elements are ordered.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PassThroughOperationType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:modifiedCoordinate" maxOccurs="unbounded"/>
+					<element ref="gml:coordOperation"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="modifiedCoordinate" type="positiveInteger">
+		<annotation>
+			<documentation>gml:modifiedCoordinate is a positive integer defining a position in a coordinate tuple.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PassThroughOperationPropertyType">
+		<annotation>
+			<documentation>gml:PassThroughOperationPropertyType is a property type for association roles to a pass through operation, either referencing or containing the definition of that pass through operation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PassThroughOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="Conversion" type="gml:ConversionType" substitutionGroup="gml:AbstractGeneralConversion">
+		<annotation>
+			<documentation>gml:Conversion is a concrete operation on coordinates that does not include any change of Datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters.
+This concrete complex type can be used without using a GML Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Conversion instance.
+The usesValue property elements are an unordered list of composition associations to the set of parameter values used by this conversion operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ConversionType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralConversionType">
+				<sequence>
+					<element ref="gml:method"/>
+					<element ref="gml:parameterValue" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="method" type="gml:OperationMethodPropertyType">
+		<annotation>
+			<documentation>gml:method is an association role to the operation method used by a coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<element name="parameterValue" type="gml:AbstractGeneralParameterValuePropertyType">
+		<annotation>
+			<documentation>gml:parameterValue is a composition association to a parameter value or group of parameter values used by a coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ConversionPropertyType">
+		<annotation>
+			<documentation>gml:ConversionPropertyType is a property type for association roles to a concrete general-purpose conversion, either referencing or containing the definition of that conversion.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Conversion"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="Transformation" type="gml:TransformationType" substitutionGroup="gml:AbstractGeneralTransformation">
+		<annotation>
+			<documentation>gml:Transformation is a concrete object element derived from gml:GeneralTransformation (13.6.2.13).
+This concrete object can be used for all operation methods, without using a GML Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Transformation instance.
+The parameterValue elements are an unordered list of composition associations to the set of parameter values used by this conversion operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TransformationType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralTransformationType">
+				<sequence>
+					<element ref="gml:method"/>
+					<element ref="gml:parameterValue" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TransformationPropertyType">
+		<annotation>
+			<documentation>gml:TransformationPropertyType is a property type for association roles to a transformation, either referencing or containing the definition of that transformation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Transformation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="AbstractGeneralParameterValue" type="gml:AbstractGeneralParameterValueType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:AbstractGeneralParameterValue is an abstract parameter value or group of parameter values.
+This abstract complexType is expected to be extended and restricted for well-known operation methods with many instances, in Application Schemas that define operation-method-specialized element names and contents. Specific parameter value elements are directly contained in concrete subtypes, not in this abstract type. All concrete types derived from this type shall extend this type to include one "...Value" element with an appropriate type, which should be one of the element types allowe [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralParameterValueType" abstract="true">
+		<sequence/>
+	</complexType>
+	<complexType name="AbstractGeneralParameterValuePropertyType">
+		<annotation>
+			<documentation>gml:AbstractGeneralParameterValuePropertyType is a  property type for inline association roles to a parameter value or group of parameter values, always containing the values.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:AbstractGeneralParameterValue"/>
+		</sequence>
+	</complexType>
+	<element name="ParameterValue" type="gml:ParameterValueType" substitutionGroup="gml:AbstractGeneralParameterValue">
+		<annotation>
+			<documentation>gml:ParameterValue is a parameter value, an ordered sequence of values, or a reference to a file of parameter values. This concrete complex type may be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one instance. This complex type may be used, extended, or restricted for well-known operation methods, especially for methods with many instances.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ParameterValueType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralParameterValueType">
+				<sequence>
+					<choice>
+						<element ref="gml:value"/>
+						<element ref="gml:dmsAngleValue"/>
+						<element ref="gml:stringValue"/>
+						<element ref="gml:integerValue"/>
+						<element ref="gml:booleanValue"/>
+						<element ref="gml:valueList"/>
+						<element ref="gml:integerValueList"/>
+						<element ref="gml:valueFile"/>
+					</choice>
+					<element ref="gml:operationParameter"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="value" type="gml:MeasureType">
+		<annotation>
+			<documentation>gml:value is a numeric value of an operation parameter, with its associated unit of measure.</documentation>
+		</annotation>
+	</element>
+	<element name="stringValue" type="string">
+		<annotation>
+			<documentation>gml:stringValue is a character string value of an operation parameter. A string value does not have an associated unit of measure.</documentation>
+		</annotation>
+	</element>
+	<element name="integerValue" type="positiveInteger">
+		<annotation>
+			<documentation>gml:integerValue is a positive integer value of an operation parameter, usually used for a count. An integer value does not have an associated unit of measure.</documentation>
+		</annotation>
+	</element>
+	<element name="booleanValue" type="boolean">
+		<annotation>
+			<documentation>gml:booleanValue is a boolean value of an operation parameter. A Boolean value does not have an associated unit of measure.</documentation>
+		</annotation>
+	</element>
+	<element name="valueList" type="gml:MeasureListType">
+		<annotation>
+			<documentation>gml:valueList is an ordered sequence of two or more numeric values of an operation parameter list, where each value has the same associated unit of measure. An element of this type contains a space-separated sequence of double values.</documentation>
+		</annotation>
+	</element>
+	<element name="integerValueList" type="gml:integerList">
+		<annotation>
+			<documentation>gml:integerValueList is an ordered sequence of two or more integer values of an operation parameter list, usually used for counts. These integer values do not have an associated unit of measure. An element of this type contains a space-separated sequence of integer values.</documentation>
+		</annotation>
+	</element>
+	<element name="valueFile" type="anyURI">
+		<annotation>
+			<documentation>gml:valueFile is a reference to a file or a part of a file containing one or more parameter values, each numeric value with its associated unit of measure. When referencing a part of a file, that file shall contain multiple identified parts, such as an XML encoded document. Furthermore, the referenced file or part of a file may reference another part of the same or different files, as allowed in XML documents.</documentation>
+		</annotation>
+	</element>
+	<element name="operationParameter" type="gml:OperationParameterPropertyType">
+		<annotation>
+			<documentation>gml:operationParameter is an association role to the operation parameter of which this is a value.</documentation>
+		</annotation>
+	</element>
+	<element name="ParameterValueGroup" type="gml:ParameterValueGroupType" substitutionGroup="gml:AbstractGeneralParameterValue">
+		<annotation>
+			<documentation>gml:ParameterValueGroup is a group of related parameter values. The same group can be repeated more than once in a Conversion, Transformation, or higher level ParameterValueGroup, if those instances contain different values of one or more parameterValues which suitably distinquish among those groups. This concrete complex type can be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents. This  [...]
+The parameterValue elements are an unordered set of composition association roles to the parameter values and groups of values included in this group.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ParameterValueGroupType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralParameterValueType">
+				<sequence>
+					<element ref="gml:parameterValue" minOccurs="2" maxOccurs="unbounded"/>
+					<element ref="gml:group"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="group" type="gml:OperationParameterGroupPropertyType">
+		<annotation>
+			<documentation>gml:group is an association role to the operation parameter group for which this element provides parameter values.</documentation>
+		</annotation>
+	</element>
+	<element name="OperationMethod" type="gml:OperationMethodType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:OperationMethod is a method (algorithm or procedure) used to perform a coordinate operation. Most operation methods use a number of operation parameters, although some coordinate conversions use none. Each coordinate operation using the method assigns values to these parameters.
+The parameter elements are an unordered list of associations to the set of operation parameters and parameter groups used by this operation method.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OperationMethodType">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<choice>
+						<element ref="gml:formulaCitation"/>
+						<element ref="gml:formula"/>
+					</choice>
+					<element ref="gml:sourceDimensions" minOccurs="0"/>
+					<element ref="gml:targetDimensions" minOccurs="0"/>
+					<element ref="gml:parameter" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="formulaCitation">
+		<annotation>
+			<documentation>gml:formulaCitation provides a reference to a publication giving the formula(s) or procedure used by an coordinate operation method.</documentation>
+		</annotation>
+		<complexType>
+			<sequence minOccurs="0">
+				<element ref="gmd:CI_Citation"/>
+			</sequence>
+			<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</complexType>
+	</element>
+	<element name="formula" type="gml:CodeType">
+		<annotation>
+			<documentation>gml:formula Formula(s) or procedure used by an operation method. The use of the codespace attribite has been deprecated. The property value shall be a character string.</documentation>
+		</annotation>
+	</element>
+	<element name="sourceDimensions" type="positiveInteger">
+		<annotation>
+			<documentation>gml:sourceDimensions is the number of dimensions in the source CRS of this operation method.</documentation>
+		</annotation>
+	</element>
+	<element name="targetDimensions" type="positiveInteger">
+		<annotation>
+			<documentation>gml:targetDimensions is the number of dimensions in the target CRS of this operation method.</documentation>
+		</annotation>
+	</element>
+	<element name="parameter" type="gml:AbstractGeneralOperationParameterPropertyType">
+		<annotation>
+			<documentation>gml:parameter is an association to an operation parameter or parameter group.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OperationMethodPropertyType">
+		<annotation>
+			<documentation>gml:OperationMethodPropertyType is a property type for association roles to a concrete general-purpose operation method, either referencing or containing the definition of that method.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationMethod"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="AbstractGeneralOperationParameter" type="gml:AbstractGeneralOperationParameterType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:GeneralOperationParameter is the abstract definition of a parameter or group of parameters used by an operation method.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralOperationParameterType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:minimumOccurs" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="minimumOccurs" type="nonNegativeInteger">
+		<annotation>
+			<documentation>gml:minimumOccurs is the minimum number of times that values for this parameter group or parameter are required. If this attribute is omitted, the minimum number shall be one.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralOperationParameterPropertyType">
+		<annotation>
+			<documentation>gml:AbstractGeneralOperationParameterPropertyType is a property type for association roles to an operation parameter or group, either referencing or containing the definition of that parameter or group.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeneralOperationParameter"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="OperationParameter" type="gml:OperationParameterType" substitutionGroup="gml:AbstractGeneralOperationParameter">
+		<annotation>
+			<documentation>gml:OperationParameter is the definition of a parameter used by an operation method. Most parameter values are numeric, but other types of parameter values are possible. This complex type is expected to be used or extended for all operation methods, without defining operation-method-specialized element names.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OperationParameterType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralOperationParameterType">
+				<sequence/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="OperationParameterPropertyType">
+		<annotation>
+			<documentation>gml:OperationParameterPropertyType is a property type for association roles to an operation parameter, either referencing or containing the definition of that parameter.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationParameter"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="OperationParameterGroup" type="gml:OperationParameterGroupType" substitutionGroup="gml:AbstractGeneralOperationParameter">
+		<annotation>
+			<documentation>gml:OperationParameterGroup is the definition of a group of parameters used by an operation method. This complex type is expected to be used or extended for all applicable operation methods, without defining operation-method-specialized element names.
+The generalOperationParameter elements are an unordered list of associations to the set of operation parameters that are members of this group.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OperationParameterGroupType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralOperationParameterType">
+				<sequence>
+					<element ref="gml:maximumOccurs" minOccurs="0"/>
+					<element ref="gml:parameter" minOccurs="2" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="maximumOccurs" type="positiveInteger">
+		<annotation>
+			<documentation>gml:maximumOccurs is the maximum number of times that values for this parameter group may be included. If this attribute is omitted, the maximum number shall be one.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OperationParameterGroupPropertyType">
+		<annotation>
+			<documentation>gml:OperationParameterPropertyType is a property type for association roles to an operation parameter group, either referencing or containing the definition of that parameter group.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationParameterGroup"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateReferenceSystems.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateReferenceSystems.xsd
new file mode 100755
index 0000000..72a6ced
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateReferenceSystems.xsd
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" xml:lang="en" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:coordinateReferenceSystems:3.2.1">coordinateReferenceSystems.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.3.
+The spatial-temporal coordinate reference systems schema components are divided into two logical parts. One part defines elements and types for XML encoding of abstract coordinate reference systems definitions. The larger part defines specialized constructs for XML encoding of definitions of the multiple concrete types of spatial-temporal coordinate reference systems.
+These schema components encode the Coordinate Reference System packages of the UML Models of ISO 19111 Clause 8 and ISO/DIS 19136 D.3.10, with the exception of the abstract "SC_CRS" class.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="coordinateSystems.xsd"/>
+	<include schemaLocation="datums.xsd"/>
+	<include schemaLocation="coordinateOperations.xsd"/>
+	<element name="AbstractSingleCRS" type="gml:AbstractCRSType" abstract="true" substitutionGroup="gml:AbstractCRS">
+		<annotation>
+			<documentation>gml:AbstractSingleCRS implements a coordinate reference system consisting of one coordinate system and one datum (as opposed to a Compound CRS).</documentation>
+		</annotation>
+	</element>
+	<complexType name="SingleCRSPropertyType">
+		<annotation>
+			<documentation>gml:SingleCRSPropertyType is a property type for association roles to a single coordinate reference system, either referencing or containing the definition of that coordinate reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractSingleCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="AbstractGeneralDerivedCRS" type="gml:AbstractGeneralDerivedCRSType" abstract="true" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:AbstractGeneralDerivedCRS is a coordinate reference system that is defined by its coordinate conversion from another coordinate reference system. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralDerivedCRSType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:conversion"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="conversion" type="gml:GeneralConversionPropertyType">
+		<annotation>
+			<documentation>gml:conversion is an association role to the coordinate conversion used to define the derived CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="CompoundCRS" type="gml:CompoundCRSType" substitutionGroup="gml:AbstractCRS">
+		<annotation>
+			<documentation>gml:CompundCRS is a coordinate reference system describing the position of points through two or more independent coordinate reference systems. It is associated with a non-repeating sequence of two or more instances of SingleCRS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompoundCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:componentReferenceSystem" minOccurs="2" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="componentReferenceSystem" type="gml:SingleCRSPropertyType">
+		<annotation>
+			<documentation>The gml:componentReferenceSystem elements are an ordered sequence of associations to all the component coordinate reference systems included in this compound coordinate reference system. The gml:AggregationAttributeGroup should be used to specify that the gml:componentReferenceSystem properties are ordered.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompoundCRSPropertyType">
+		<annotation>
+			<documentation>gml:CompoundCRSPropertyType is a property type for association roles to a compound coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CompoundCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="GeodeticCRS" type="gml:GeodeticCRSType" substitutionGroup="gml:AbstractSingleCRS"/>
+	<complexType name="GeodeticCRSType">
+		<annotation>
+			<documentation>gml:GeodeticCRS is a coordinate reference system based on a geodetic datum.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:ellipsoidalCS"/>
+						<element ref="gml:cartesianCS"/>
+						<element ref="gml:sphericalCS"/>
+					</choice>
+					<element ref="gml:geodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ellipsoidalCS" type="gml:EllipsoidalCSPropertyType">
+		<annotation>
+			<documentation>gml:ellipsoidalCS is an association role to the ellipsoidal coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="cartesianCS" type="gml:CartesianCSPropertyType">
+		<annotation>
+			<documentation>gml:cartesianCS is an association role to the Cartesian coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="sphericalCS" type="gml:SphericalCSPropertyType">
+		<annotation>
+			<documentation>gml:sphericalCS is an association role to the spherical coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="geodeticDatum" type="gml:GeodeticDatumPropertyType">
+		<annotation>
+			<documentation>gml:geodeticDatum is an association role to the geodetic datum used by this CRS.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeodeticCRSPropertyType">
+		<annotation>
+			<documentation>gml:GeodeticCRSPropertyType is a property type for association roles to a geodetic coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeodeticCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="VerticalCRS" type="gml:VerticalCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:VerticalCRS is a 1D coordinate reference system used for recording heights or depths. Vertical CRSs make use of the direction of gravity to define the concept of height or depth, but the relationship with gravity may not be straightforward. By implication, ellipsoidal heights (h) cannot be captured in a vertical coordinate reference system. Ellipsoidal heights cannot exist independently, but only as an inseparable part of a 3D coordinate tuple defined in a geographi [...]
+		</annotation>
+	</element>
+	<complexType name="VerticalCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:verticalCS"/>
+					<element ref="gml:verticalDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="verticalCS" type="gml:VerticalCSPropertyType">
+		<annotation>
+			<documentation>gml:verticalCS is an association role to the vertical coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="verticalDatum" type="gml:VerticalDatumPropertyType">
+		<annotation>
+			<documentation>gml:verticalDatum is an association role to the vertical datum used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="VerticalCRSPropertyType">
+		<annotation>
+			<documentation>gml:VerticalCRSPropertyType is a property type for association roles to a vertical coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="ProjectedCRS" type="gml:ProjectedCRSType" substitutionGroup="gml:AbstractGeneralDerivedCRS">
+		<annotation>
+			<documentation>gml:ProjectedCRS is a 2D coordinate reference system used to approximate the shape of the earth on a planar surface, but in such a way that the distortion that is inherent to the approximation is carefully controlled and known. Distortion correction is commonly applied to calculated bearings and distances to produce values that are a close match to actual field values.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ProjectedCRSType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralDerivedCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:baseGeodeticCRS"/>
+						<element ref="gml:baseGeographicCRS"/>
+					</choice>
+					<element ref="gml:cartesianCS"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="baseGeodeticCRS" type="gml:GeodeticCRSPropertyType">
+		<annotation>
+			<documentation>gml:baseGeodeticCRS is an association role to the geodetic coordinate reference system used by this projected CRS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ProjectedCRSPropertyType">
+		<annotation>
+			<documentation>gml:ProjectedCRSPropertyType is a property type for association roles to a projected coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ProjectedCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="DerivedCRS" type="gml:DerivedCRSType" substitutionGroup="gml:AbstractGeneralDerivedCRS">
+		<annotation>
+			<documentation>gml:DerivedCRS is a single coordinate reference system that is defined by its coordinate conversion from another single coordinate reference system known as the base CRS. The base CRS can be a projected coordinate reference system, if this DerivedCRS is used for a georectified grid coverage as described in ISO 19123, Clause 8.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DerivedCRSType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralDerivedCRSType">
+				<sequence>
+					<element ref="gml:baseCRS"/>
+					<element ref="gml:derivedCRSType"/>
+					<element ref="gml:coordinateSystem"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="baseCRS" type="gml:SingleCRSPropertyType">
+		<annotation>
+			<documentation>gml:baseCRS is an association role to the coordinate reference system used by this derived CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="derivedCRSType" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>The gml:derivedCRSType property describes the type of a derived coordinate reference system. The required codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property.</documentation>
+		</annotation>
+	</element>
+	<element name="coordinateSystem" type="gml:CoordinateSystemPropertyType">
+		<annotation>
+			<documentation>An association role to the coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DerivedCRSPropertyType">
+		<annotation>
+			<documentation>gml:DerivedCRSPropertyType is a property type for association roles to a non-projected derived coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:DerivedCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="EngineeringCRS" type="gml:EngineeringCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:EngineeringCRS is a contextually local coordinate reference system which can be divided into two broad categories:
+-	earth-fixed systems applied to engineering activities on or near the surface of the earth;
+-	CRSs on moving platforms such as road vehicles, vessels, aircraft, or spacecraft, see ISO 19111 8.3.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EngineeringCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:affineCS"/>
+						<element ref="gml:cartesianCS"/>
+						<element ref="gml:cylindricalCS"/>
+						<element ref="gml:linearCS"/>
+						<element ref="gml:polarCS"/>
+						<element ref="gml:sphericalCS"/>
+						<element ref="gml:userDefinedCS"/>
+						<element ref="gml:coordinateSystem">
+							<annotation>
+								<appinfo>deprecated</appinfo>
+							</annotation>
+						</element>
+					</choice>
+					<element ref="gml:engineeringDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="cylindricalCS" type="gml:CylindricalCSPropertyType">
+		<annotation>
+			<documentation>gml:cylindricalCS is an association role to the cylindrical coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="linearCS" type="gml:LinearCSPropertyType">
+		<annotation>
+			<documentation>gml:linearCS is an association role to the linear coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="polarCS" type="gml:PolarCSPropertyType">
+		<annotation>
+			<documentation>gml:polarCS is an association role to the polar coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="userDefinedCS" type="gml:UserDefinedCSPropertyType">
+		<annotation>
+			<documentation>gml:userDefinedCS is an association role to the user defined coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="engineeringDatum" type="gml:EngineeringDatumPropertyType">
+		<annotation>
+			<documentation>gml:engineeringDatum is an association role to the engineering datum used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EngineeringCRSPropertyType">
+		<annotation>
+			<documentation>gml:EngineeringCRSPropertyType is a property type for association roles to an engineering coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EngineeringCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="ImageCRS" type="gml:ImageCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:ImageCRS is an engineering coordinate reference system applied to locations in images. Image coordinate reference systems are treated as a separate sub-type because the definition of the associated image datum contains two attributes not relevant to other engineering datums.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ImageCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:cartesianCS"/>
+						<element ref="gml:affineCS"/>
+						<element ref="gml:usesObliqueCartesianCS"/>
+					</choice>
+					<element ref="gml:imageDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="affineCS" type="gml:AffineCSPropertyType">
+		<annotation>
+			<documentation>gml:affineCS is an association role to the affine coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="imageDatum" type="gml:ImageDatumPropertyType">
+		<annotation>
+			<documentation>gml:imageDatum is an association role to the image datum used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ImageCRSPropertyType">
+		<annotation>
+			<documentation>gml:ImageCRSPropertyType is a property type for association roles to an image coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ImageCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="TemporalCRS" type="gml:TemporalCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:TemporalCRS is a 1D coordinate reference system used for the recording of time.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TemporalCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:timeCS"/>
+						<element ref="gml:usesTemporalCS"/>
+					</choice>
+					<element ref="gml:temporalDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="timeCS" type="gml:TimeCSPropertyType">
+		<annotation>
+			<documentation>gml:timeCS is an association role to the time coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="temporalDatum" type="gml:TemporalDatumPropertyType">
+		<annotation>
+			<documentation>gml:temporalDatum is an association role to the temporal datum used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TemporalCRSPropertyType">
+		<annotation>
+			<documentation>gml:TemporalCRSPropertyType is a property type for association roles to a temporal coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateSystems.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateSystems.xsd
new file mode 100755
index 0000000..37627f2
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coordinateSystems.xsd
@@ -0,0 +1,297 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" xml:lang="en"  version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:coordinateSystems:3.2.1">coordinateSystems.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.4.
+The coordinate systems schema components can be divded into  three logical parts, which define elements and types for XML encoding of the definitions of:
+-	Coordinate system axes
+-	Abstract coordinate system
+-	Multiple concrete types of spatial-temporal coordinate systems
+These schema components encode the Coordinate System packages of the UML Models of ISO 19111 Clause 9 and ISO/DIS 19136 D.3.10.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<element name="CoordinateSystemAxis" type="gml:CoordinateSystemAxisType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:CoordinateSystemAxis is a definition of a coordinate system axis.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoordinateSystemAxisType">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:axisAbbrev"/>
+					<element ref="gml:axisDirection"/>
+					<element ref="gml:minimumValue" minOccurs="0"/>
+					<element ref="gml:maximumValue" minOccurs="0"/>
+					<element ref="gml:rangeMeaning" minOccurs="0"/>
+				</sequence>
+				<attribute name="uom" type="gml:UomIdentifier" use="required">
+					<annotation>
+						<documentation>The uom attribute provides an identifier of the unit of measure used for this coordinate system axis. The value of this coordinate in a coordinate tuple shall be recorded using this unit of measure, whenever those coordinates use a coordinate reference system that uses a coordinate system that uses this axis.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="axisAbbrev" type="gml:CodeType">
+		<annotation>
+			<documentation>gml:axisAbbrev is the abbreviation used for this coordinate system axis; this abbreviation is also used to identify the coordinates in the coordinate tuple. The codeSpace attribute may reference a source of more information on a set of standardized abbreviations, or on this abbreviation.</documentation>
+		</annotation>
+	</element>
+	<element name="axisDirection" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>gml:axisDirection is the direction of this coordinate system axis (or in the case of Cartesian projected coordinates, the direction of this coordinate system axis at the origin).
+Within any set of coordinate system axes, only one of each pair of terms may be used. For earth-fixed CRSs, this direction is often approximate and intended to provide a human interpretable meaning to the axis. When a geodetic datum is used, the precise directions of the axes may therefore vary slightly from this approximate direction.
+The codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property.</documentation>
+		</annotation>
+	</element>
+	<element name="minimumValue" type="double">
+		<annotation>
+			<documentation>The gml:minimumValue and gml:maximumValue properties allow the specification of minimum and maximum value normally allowed for this axis, in the unit of measure for the axis. For a continuous angular axis such as longitude, the values wrap-around at this value. Also, values beyond this minimum/maximum can be used for specified purposes, such as in a bounding box. A value of minus infinity shall be allowed for the gml:minimumValue element, a value of plus infiniy for the [...]
+		</annotation>
+	</element>
+	<element name="maximumValue" type="double">
+		<annotation>
+			<documentation>The gml:minimumValue and gml:maximumValue properties allow the specification of minimum and maximum value normally allowed for this axis, in the unit of measure for the axis. For a continuous angular axis such as longitude, the values wrap-around at this value. Also, values beyond this minimum/maximum can be used for specified purposes, such as in a bounding box. A value of minus infinity shall be allowed for the gml:minimumValue element, a value of plus infiniy for the [...]
+		</annotation>
+	</element>
+	<element name="rangeMeaning" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>gml:rangeMeaning describes the meaning of axis value range specified by gml:minimumValue and gml:maximumValue. This element shall be omitted when both gml:minimumValue and gml:maximumValue are omitted. This element should be included when gml:minimumValue and/or gml:maximumValue are included. If this element is omitted when the gml:minimumValue and/or gml:maximumValue are included, the meaning is unspecified. The codeSpace attribute shall reference a source of informati [...]
+		</annotation>
+	</element>
+	<complexType name="CoordinateSystemAxisPropertyType">
+		<annotation>
+			<documentation>gml:CoordinateSystemAxisPropertyType is a property type for association roles to a coordinate system axis, either referencing or containing the definition of that axis.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CoordinateSystemAxis"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="AbstractCoordinateSystem" type="gml:AbstractCoordinateSystemType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:AbstractCoordinateSystem is a coordinate system (CS) is the non-repeating sequence of coordinate system axes that spans a given coordinate space. A CS is derived from a set of mathematical rules for specifying how coordinates in a given space are to be assigned to points. The coordinate values in a coordinate tuple shall be recorded in the order in which the coordinate system axes associations are recorded. This abstract complex type shall not be used, extended, or  [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractCoordinateSystemType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:axis" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="axis" type="gml:CoordinateSystemAxisPropertyType">
+		<annotation>
+			<documentation>The gml:axis property is an association role (ordered sequence) to the coordinate system axes included in this coordinate system. The coordinate values in a coordinate tuple shall be recorded in the order in which the coordinate system axes associations are recorded, whenever those coordinates use a coordinate reference system that uses this coordinate system. The gml:AggregationAttributeGroup should be used to specify that the axis objects are ordered.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoordinateSystemPropertyType">
+		<annotation>
+			<documentation>gml:CoordinateSystemPropertyType is a property type for association roles to a coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractCoordinateSystem"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="EllipsoidalCS" type="gml:EllipsoidalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:EllipsoidalCS is a two- or three-dimensional coordinate system in which position is specified by geodetic latitude, geodetic longitude, and (in the three-dimensional case) ellipsoidal height. An EllipsoidalCS shall have two or three gml:axis property elements; the number of associations shall equal the dimension of the CS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EllipsoidalCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="EllipsoidalCSPropertyType">
+		<annotation>
+			<documentation>gml:EllipsoidalCSPropertyType is a property type for association roles to an ellipsoidal coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EllipsoidalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="CartesianCS" type="gml:CartesianCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:CartesianCS is a 1-, 2-, or 3-dimensional coordinate system. In the 1-dimensional case, it contains a single straight coordinate axis. In the 2- and 3-dimensional cases gives the position of points relative to orthogonal straight axes. In the multi-dimensional case, all axes shall have the same length unit of measure. A CartesianCS shall have one, two, or three gml:axis property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CartesianCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="CartesianCSPropertyType">
+		<annotation>
+			<documentation>gml:CartesianCSPropertyType is a property type for association roles to a Cartesian coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CartesianCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="VerticalCS" type="gml:VerticalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:VerticalCS is a one-dimensional coordinate system used to record the heights or depths of points. Such a coordinate system is usually dependent on the Earth's gravity field, perhaps loosely as when atmospheric pressure is the basis for the vertical coordinate system axis. A VerticalCS shall have one gml:axis property element.</documentation>
+		</annotation>
+	</element>
+	<complexType name="VerticalCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="VerticalCSPropertyType">
+		<annotation>
+			<documentation>gml:VerticalCSPropertyType is a property type for association roles to a vertical coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="TimeCS" type="gml:TimeCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:TimeCS is a one-dimensional coordinate system containing a time axis, used to describe the temporal position of a point in the specified time units from a specified time origin. A TimeCS shall have one gml:axis property element.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeCSPropertyType">
+		<annotation>
+			<documentation>gml:TimeCSPropertyType is a property type for association roles to a time coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="LinearCS" type="gml:LinearCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:LinearCS is a one-dimensional coordinate system that consists of the points that lie on the single axis described. The associated coordinate is the distance – with or without offset – from the specified datum to the point along the axis. A LinearCS shall have one gml:axis property element.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LinearCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="LinearCSPropertyType">
+		<annotation>
+			<documentation>gml:LinearCSPropertyType is a property type for association roles to a linear coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:LinearCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="UserDefinedCS" type="gml:UserDefinedCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:UserDefinedCS is a two- or three-dimensional coordinate system that consists of any combination of coordinate axes not covered by any other coordinate system type. A UserDefinedCS shall have two or three gml:axis property elements; the number of property elements shall equal the dimension of the CS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="UserDefinedCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="UserDefinedCSPropertyType">
+		<annotation>
+			<documentation>gml:UserDefinedCSPropertyType is a property type for association roles to a user-defined coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:UserDefinedCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="SphericalCS" type="gml:SphericalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:SphericalCS is a three-dimensional coordinate system with one distance measured from the origin and two angular coordinates. A SphericalCS shall have three gml:axis property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SphericalCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="SphericalCSPropertyType">
+		<annotation>
+			<documentation>gml:SphericalCSPropertyType is property type for association roles to a spherical coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:SphericalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="PolarCS" type="gml:PolarCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:PolarCS ia s two-dimensional coordinate system in which position is specified by the distance from the origin and the angle between the line from the origin to a point and a reference direction. A PolarCS shall have two gml:axis property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PolarCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="PolarCSPropertyType">
+		<annotation>
+			<documentation>gml:PolarCSPropertyType is a property type for association roles to a polar coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PolarCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="CylindricalCS" type="gml:CylindricalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:CylindricalCS is a three-dimensional coordinate system consisting of a polar coordinate system extended by a straight coordinate axis perpendicular to the plane spanned by the polar coordinate system. A CylindricalCS shall have three gml:axis property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CylindricalCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="CylindricalCSPropertyType">
+		<annotation>
+			<documentation>gml:CylindricalCSPropertyType is a property type for association roles to a cylindrical coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CylindricalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="AffineCS" type="gml:AffineCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:AffineCS is a two- or three-dimensional coordinate system with straight axes that are not necessarily orthogonal. An AffineCS shall have two or three gml:axis property elements; the number of property elements shall equal the dimension of the CS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AffineCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="AffineCSPropertyType">
+		<annotation>
+			<documentation>gml:AffineCSPropertyType is a property type for association roles to an affine coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AffineCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coverage.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coverage.xsd
new file mode 100755
index 0000000..a1bbfa4
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/coverage.xsd
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:coverage:3.2.1">coverage.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 20.3.
+A coverage incorporates a mapping from a spatiotemporal domain to a range set, the latter providing the set in which the attribute values live.  The range set may be an arbitrary set including discrete lists, integer or floating point ranges, and multi-dimensional vector spaces.
+A coverage can be viewed as the graph of the coverage function f:A à B, that is as the set of ordered pairs {(x, f(x)) | where x is in A}. This view is especially applicable to the GML encoding of a coverage.  In the case of a discrete coverage, the domain set A is partitioned into a collection of subsets (typically a disjoint collection) A = UAi and the function f is constant on each Ai. For a spatial domain, the Ai are geometry elements, hence the coverage can be viewed as a collection [...]
+A coverage is implemented as a GML feature. We can thus speak of a "temperature distribution feature", or a "remotely sensed image feature", or a "soil distribution feature".
+As is the case for any GML object, a coverage object may also be the value of a property of a feature.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="valueObjects.xsd"/>
+	<include schemaLocation="grids.xsd"/>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<complexType name="AbstractCoverageType" abstract="true">
+		<annotation>
+			<documentation>The base type for coverages is gml:AbstractCoverageType. The basic elements of a coverage can be seen in this content model: the coverage contains gml:domainSet and gml:rangeSet properties. The gml:domainSet property describes the domain of the coverage and the gml:rangeSet property describes the range of the coverage.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:domainSet"/>
+					<element ref="gml:rangeSet"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractCoverage" type="gml:AbstractCoverageType" abstract="true" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<documentation>This element serves as the head of a substitution group which may contain any coverage whose type is derived from gml:AbstractCoverageType.  It may act as a variable in the definition of content models where it is required to permit any coverage to be valid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DiscreteCoverageType">
+		<complexContent>
+			<extension base="gml:AbstractCoverageType">
+				<sequence>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractDiscreteCoverage" type="gml:DiscreteCoverageType" abstract="true" substitutionGroup="gml:AbstractCoverage">
+		<annotation>
+			<documentation>A discrete coverage consists of a domain set, range set and optionally a coverage function. The domain set consists of either spatial or temporal geometry objects, finite in number. The range set is comprised of a finite number of attribute values each of which is associated to every direct position within any single spatiotemporal object in the domain. In other words, the range values are constant on each spatiotemporal object in the domain. This coverage function maps [...]
+This element serves as the head of a substitution group which may contain any discrete coverage whose type is derived from gml:DiscreteCoverageType.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractContinuousCoverageType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractCoverageType">
+				<sequence>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractContinuousCoverage" type="gml:AbstractContinuousCoverageType" abstract="true" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<documentation>A continuous coverage as defined in ISO 19123 is a coverage that can return different values for the same feature attribute at different direct positions within a single spatiotemporal object in its spatiotemporal domain. The base type for continuous coverages is AbstractContinuousCoverageType.
+The coverageFunction element describes the mapping function. 
+The abstract element gml:AbstractContinuousCoverage serves as the head of a substitution group which may contain any continuous coverage whose type is derived from gml:AbstractContinuousCoverageType.</documentation>
+		</annotation>
+	</element>
+	<element name="domainSet" type="gml:DomainSetType">
+		<annotation>
+			<documentation>The gml:domainSet property element describes the spatio-temporal region of interest, within which the coverage is defined. Its content model is given by gml:DomainSetType.
+The value of the domain is thus a choice between a gml:AbstractGeometry and a gml:AbstractTimeObject.  In the instance these abstract elements will normally be substituted by a geometry complex or temporal complex, to represent spatial coverages and time-series, respectively.  
+The presence of the gml:AssociationAttributeGroup means that domainSet follows the usual GML property model and may use the xlink:href attribute to point to the domain, as an alternative to describing the domain inline. Ownership semantics may be provided using the gml:OwnershipAttributeGroup.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="DomainSetType">
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:AbstractGeometry"/>
+				<element ref="gml:AbstractTimeObject"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="rangeSet" type="gml:RangeSetType">
+		<annotation>
+			<documentation>The gml:rangeSet property element contains the values of the coverage (sometimes called the attribute values).  Its content model is given by gml:RangeSetType.
+This content model supports a structural description of the range.  The semantic information describing the range set is embedded using a uniform method, as part of the explicit values, or as a template value accompanying the representation using gml:DataBlock and gml:File.
+The values from each component (or "band") in the range may be encoded within a gml:ValueArray element or a concrete member of the gml:AbstractScalarValueList substitution group . Use of these elements satisfies the value-type homogeneity requirement.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RangeSetType">
+		<choice>
+			<element ref="gml:ValueArray" maxOccurs="unbounded"/>
+			<element ref="gml:AbstractScalarValueList" maxOccurs="unbounded"/>
+			<element ref="gml:DataBlock"/>
+			<element ref="gml:File"/>
+		</choice>
+	</complexType>
+	<element name="DataBlock" type="gml:DataBlockType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:DataBlock describes the Range as a block of text encoded values similar to a Common Separated Value (CSV) representation.
+The range set parameterization is described by the property gml:rangeParameters.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DataBlockType">
+		<sequence>
+			<element ref="gml:rangeParameters"/>
+			<choice>
+				<element ref="gml:tupleList"/>
+				<element ref="gml:doubleOrNilReasonTupleList"/>
+			</choice>
+		</sequence>
+	</complexType>
+	<element name="rangeParameters" type="gml:AssociationRoleType"/>
+	<element name="tupleList" type="gml:CoordinatesType">
+		<annotation>
+			<documentation>gml:CoordinatesType consists of a list of coordinate tuples, with each coordinate tuple separated by the ts or tuple separator (whitespace), and each coordinate in the tuple by the cs or coordinate separator (comma).
+The gml:tupleList encoding is effectively "band-interleaved".</documentation>
+		</annotation>
+	</element>
+	<element name="doubleOrNilReasonTupleList" type="gml:doubleOrNilReasonList">
+		<annotation>
+			<documentation>gml:doubleOrNilReasonList consists of a list of gml:doubleOrNilReason values, each separated by a whitespace. The gml:doubleOrNilReason values are grouped into tuples where the dimension of each tuple in the list is equal to the number of range parameters.</documentation>
+		</annotation>
+	</element>
+	<element name="File" type="gml:FileType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>for efficiency reasons, GML also provides a means of encoding the range set in an arbitrary external encoding, such as a binary file.  This encoding may be "well-known" but this is not required. This mode uses the gml:File element.
+The values of the coverage (attribute values in the range set) are transmitted in a external file that is referenced from the XML structure described by gml:FileType.  The external file is referenced by the gml:fileReference property that is an anyURI (the gml:fileName property has been deprecated).  This means that the external file may be located remotely from the referencing GML instance. 
+The gml:compression property points to a definition of a compression algorithm through an anyURI.  This may be a retrievable, computable definition or simply a reference to an unambiguous name for the compression method.
+The gml:mimeType property points to a definition of the file mime type.
+The gml:fileStructure property is defined by a codelist. Note further that all values shall be enclosed in a single file. Multi-file structures for values are not supported in GML.
+The semantics of the range set is described as above using the gml:rangeParameters property.
+Note that if any compression algorithm is applied, the structure above applies only to the pre-compression or post-decompression structure of the file.
+Note that the fields within a record match the gml:valueComponents of the gml:CompositeValue in document order.</documentation>
+		</annotation>
+	</element>
+	<complexType name="FileType">
+		<sequence>
+			<element ref="gml:rangeParameters"/>
+			<choice>
+				<element name="fileName" type="anyURI">
+					<annotation>
+						<appinfo>deprecated</appinfo>
+					</annotation>
+				</element>
+				<element name="fileReference" type="anyURI"/>
+			</choice>
+			<element name="fileStructure" type="gml:CodeType"/>
+			<element name="mimeType" type="anyURI" minOccurs="0"/>
+			<element name="compression" type="anyURI" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<element name="coverageFunction" type="gml:CoverageFunctionType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>The gml:coverageFunction property describes the mapping function from the domain to the range of the coverage.
+The value of the CoverageFunction is one of gml:CoverageMappingRule and gml:GridFunction.
+If the gml:coverageFunction property is omitted for a gridded coverage (including rectified gridded coverages) the gml:startPoint is assumed to be the value of the gml:low property in the gml:Grid geometry, and the gml:sequenceRule is assumed to be linear and the gml:axisOrder property is assumed to be "+1 +2".</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoverageFunctionType">
+		<choice>
+			<element ref="gml:MappingRule"/>
+			<element ref="gml:CoverageMappingRule"/>
+			<element ref="gml:GridFunction"/>
+		</choice>
+	</complexType>
+	<element name="CoverageMappingRule" type="gml:MappingRuleType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:CoverageMappingRule provides a formal or informal description of the coverage function.
+The mapping rule may be defined as an in-line string (gml:ruleDefinition) or via a remote reference through xlink:href (gml:ruleReference).  
+If no rule name is specified, the default is 'Linear' with respect to members of the domain in document order.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MappingRuleType" final="#all">
+		<choice>
+			<element name="ruleDefinition" type="string"/>
+			<element name="ruleReference" type="gml:ReferenceType"/>
+		</choice>
+	</complexType>
+	<element name="GridFunction" type="gml:GridFunctionType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:GridFunction provides an explicit mapping rule for grid geometries, i.e. the domain shall be a geometry of type grid.  It describes the mapping of grid posts (discrete point grid coverage) or grid cells (discrete surface coverage) to the values in the range set.
+The gml:startPoint is the index position of a point in the grid that is mapped to the first point in the range set (this is also the index position of the first grid post).  If the gml:startPoint property is omitted the gml:startPoint is assumed to be equal to the value of gml:low in the gml:Grid geometry. Subsequent points in the mapping are determined by the value of the gml:sequenceRule.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GridFunctionType">
+		<sequence>
+			<element name="sequenceRule" type="gml:SequenceRuleType" minOccurs="0"/>
+			<element name="startPoint" type="gml:integerList" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<complexType name="SequenceRuleType">
+		<annotation>
+			<documentation>The gml:SequenceRuleType is derived from the gml:SequenceRuleEnumeration through the addition of an axisOrder attribute.  The gml:SequenceRuleEnumeration is an enumerated type. The rule names are defined in ISO 19123. If no rule name is specified the default is "Linear".</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:SequenceRuleEnumeration">
+				<attribute name="order" type="gml:IncrementOrder">
+					<annotation>
+						<appinfo>deprecated</appinfo>
+					</annotation>
+				</attribute>
+				<attribute name="axisOrder" type="gml:AxisDirectionList"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="SequenceRuleEnumeration">
+		<restriction base="string">
+			<enumeration value="Linear"/>
+			<enumeration value="Boustrophedonic"/>
+			<enumeration value="Cantor-diagonal"/>
+			<enumeration value="Spiral"/>
+			<enumeration value="Morton"/>
+			<enumeration value="Hilbert"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="AxisDirectionList">
+		<annotation>
+			<documentation>The different values in a gml:AxisDirectionList indicate the incrementation order to be used on all axes of the grid. Each axis shall be mentioned once and only once.</documentation>
+		</annotation>
+		<list itemType="gml:AxisDirection"/>
+	</simpleType>
+	<simpleType name="AxisDirection">
+		<annotation>
+			<documentation>The value of a gml:AxisDirection indicates the incrementation order to be used on an axis of the grid.</documentation>
+		</annotation>
+		<restriction base="string">
+			<pattern value="[\+\-][1-9][0-9]*"/>
+		</restriction>
+	</simpleType>
+	<element name="MultiPointCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>In a gml:MultiPointCoverage the domain set is a gml:MultiPoint, that is a collection of arbitrarily distributed geometric points.
+The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiPoint.
+In a gml:MultiPointCoverage the mapping from the domain to the range is straightforward.
+-	For gml:DataBlock encodings the points of the gml:MultiPoint are mapped in document order to the tuples of the data block.
+-	For gml:CompositeValue encodings the points of the gml:MultiPoint are mapped to the members of the composite value in document order.
+-	For gml:File encodings the points of the gml:MultiPoint are mapped to the records of the file in sequential order.
+</documentation>
+		</annotation>
+	</element>
+	<element name="MultiCurveCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>In a gml:MultiCurveCoverage the domain is partioned into a collection of curves comprising a gml:MultiCurve.  The coverage function then maps each curve in the collection to a value in the range set.
+The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiCurve.
+In a gml:MultiCurveCoverage the mapping from the domain to the range is straightforward.
+-	For gml:DataBlock encodings the curves of the gml:MultiCurve are mapped in document order to the tuples of the data block.
+-	For gml:CompositeValue encodings the curves of the gml:MultiCurve are mapped to the members of the composite value in document order.
+-	For gml:File encodings the curves of the gml:MultiCurve are mapped to the records of the file in sequential order.
+</documentation>
+		</annotation>
+	</element>
+	<element name="MultiSurfaceCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>In a gml:MultiSurfaceCoverage the domain is partioned into a collection of surfaces comprising a gml:MultiSurface.  The coverage function than maps each surface in the collection to a value in the range set.
+The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiSurface.
+In a gml:MultiSurfaceCoverage the mapping from the domain to the range is straightforward.
+-	For gml:DataBlock encodings the surfaces of the gml:MultiSurface are mapped in document order to the tuples of the data block.
+-	For gml:CompositeValue encodings the surfaces of the gml:MultiSurface are mapped to the members of the composite value in document order.
+-	For gml:File encodings the surfaces of the gml:MultiSurface are mapped to the records of the file in sequential order.
+</documentation>
+		</annotation>
+	</element>
+	<element name="MultiSolidCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>In a gml:MultiSolidCoverage the domain is partioned into a collection of solids comprising a gml:MultiSolid.  The coverage function than maps each solid in the collection to a value in the range set.
+The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiSolid.
+In a gml:MultiSolidCoverage the mapping from the domain to the range is straightforward.
+-	For gml:DataBlock encodings the solids of the gml:MultiSolid are mapped in document order to the tuples of the data block.
+-	For gml:CompositeValue encodings the solids of the gml:MultiSolid are mapped to the members of the composite value in document order.
+-	For gml:File encodings the solids of the gml:MultiSolid are mapped to the records of the file in sequential order.
+</documentation>
+		</annotation>
+	</element>
+	<element name="GridCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>A gml:GriddedCoverage is a discrete point coverage in which the domain set is a geometric grid of points.
+Note that this is the same as the gml:MultiPointCoverage except that we have a gml:Grid to describe the domain.
+The simple gridded coverage is not geometrically referenced and hence no geometric positions are assignable to the points in the grid. Such geometric positioning is introduced in the gml:RectifiedGridCoverage.</documentation>
+		</annotation>
+	</element>
+	<element name="RectifiedGridCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>The gml:RectifiedGridCoverage is a discrete point coverage based on a rectified grid. It is similar to the grid coverage except that the points of the grid are geometrically referenced. The rectified grid coverage has a domain that is a gml:RectifiedGrid geometry.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/datums.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/datums.xsd
new file mode 100755
index 0000000..a62b866
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/datums.xsd
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Clemens Portele (interactive instruments) -->
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" xml:lang="en" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:datums:3.2.1">datums.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.5
+The datums schema components can be divided into three logical parts, which define elements and types for XML encoding of the definitions of:
+-	Abstract datum
+-	Geodetic datums, including ellipsoid and prime meridian
+-	Multiple other concrete types of spatial or temporal datums
+These schema components encode the Datum packages of the UML Models of ISO 19111 Clause 10 and ISO/DIS 19136 D.3.10.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<include schemaLocation="measures.xsd"/>
+	<element name="AbstractDatum" type="gml:AbstractDatumType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A gml:AbstractDatum specifies the relationship of a coordinate system to the earth, thus creating a coordinate reference system. A datum uses a parameter or set of parameters that determine the location of the origin of the coordinate reference system. Each datum subtype may be associated with only specific types of coordinate systems. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a  [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractDatumType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+					<element ref="gml:anchorDefinition" minOccurs="0"/>
+					<element ref="gml:realizationEpoch" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="anchorDefinition" type="gml:CodeType">
+		<annotation>
+			<documentation>gml:anchorDefinition is a description, possibly including coordinates, of the definition used to anchor the datum to the Earth. Also known as the "origin", especially for engineering and image datums. The codeSpace attribute may be used to reference a source of more detailed on this point or surface, or on a set of such descriptions.
+-	For a geodetic datum, this point is also known as the fundamental point, which is traditionally the point where the relationship between geoid and ellipsoid is defined. In some cases, the "fundamental point" may consist of a number of points. In those cases, the parameters defining the geoid/ellipsoid relationship have been averaged for these points, and the averages adopted as the datum definition.
+-	For an engineering datum, the anchor definition may be a physical point, or it may be a point with defined coordinates in another CRS.may
+-	For an image datum, the anchor definition is usually either the centre of the image or the corner of the image.
+-	For a temporal datum, this attribute is not defined. Instead of the anchor definition, a temporal datum carries a separate time origin of type DateTime.</documentation>
+		</annotation>
+	</element>
+	<element name="realizationEpoch" type="date">
+		<annotation>
+			<documentation>gml:realizationEpoch is the time after which this datum definition is valid. See ISO 19111 Table 32 for details.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DatumPropertyType">
+		<annotation>
+			<documentation>gml:DatumPropertyType is a property type for association roles to a datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="GeodeticDatum" type="gml:GeodeticDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>gml:GeodeticDatum is a geodetic datum defines the precise location and orientation in 3-dimensional space of a defined ellipsoid (or sphere), or of a Cartesian coordinate system centered in this ellipsoid (or sphere).</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeodeticDatumType">
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:primeMeridian"/>
+					<element ref="gml:ellipsoid"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="primeMeridian" type="gml:PrimeMeridianPropertyType">
+		<annotation>
+			<documentation>gml:primeMeridian is an association role to the prime meridian used by this geodetic datum.</documentation>
+		</annotation>
+	</element>
+	<element name="ellipsoid" type="gml:EllipsoidPropertyType">
+		<annotation>
+			<documentation>gml:ellipsoid is an association role to the ellipsoid used by this geodetic datum.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeodeticDatumPropertyType">
+		<annotation>
+			<documentation>gml:GeodeticDatumPropertyType is a property type for association roles to a geodetic datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeodeticDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="Ellipsoid" type="gml:EllipsoidType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A gml:Ellipsoid is a geometric figure that may be used to describe the approximate shape of the earth. In mathematical terms, it is a surface formed by the rotation of an ellipse about its minor axis.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EllipsoidType">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:semiMajorAxis"/>
+					<element ref="gml:secondDefiningParameter"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="semiMajorAxis" type="gml:MeasureType">
+		<annotation>
+			<documentation>gml:semiMajorAxis specifies the length of the semi-major axis of the ellipsoid, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet.</documentation>
+		</annotation>
+	</element>
+	<element name="secondDefiningParameter">
+		<annotation>
+			<documentation>gml:secondDefiningParameter is a property containing the definition of the second parameter that defines the shape of an ellipsoid. An ellipsoid requires two defining parameters: semi-major axis and inverse flattening or semi-major axis and semi-minor axis. When the reference body is a sphere rather than an ellipsoid, only a single defining parameter is required, namely the radius of the sphere; in that case, the semi-major axis "degenerates" into the radius of the sphere.
+The inverseFlattening element contains the inverse flattening value of the ellipsoid. This value is a scale factor (or ratio). It uses gml:LengthType with the restriction that the unit of measure referenced by the uom attribute must be suitable for a scale factor, such as percent, permil, or parts-per-million.
+The semiMinorAxis element contains the length of the semi-minor axis of the ellipsoid. When the isSphere element is included, the ellipsoid is degenerate and is actually a sphere. The sphere is completely defined by the semi-major axis, which is the radius of the sphere.</documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element ref="gml:SecondDefiningParameter"/>
+			</sequence>
+		</complexType>
+	</element>
+	<element name="SecondDefiningParameter">
+		<complexType>
+			<choice>
+				<element name="inverseFlattening" type="gml:MeasureType"/>
+				<element name="semiMinorAxis" type="gml:LengthType"/>
+				<element name="isSphere" type="boolean" default="true"/>
+			</choice>
+		</complexType>
+	</element>
+	<complexType name="EllipsoidPropertyType">
+		<annotation>
+			<documentation>gml:EllipsoidPropertyType is a property type for association roles to an ellipsoid, either referencing or containing the definition of that ellipsoid.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Ellipsoid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="PrimeMeridian" type="gml:PrimeMeridianType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A gml:PrimeMeridian defines the origin from which longitude values are determined. The default value for the prime meridian gml:identifier value is "Greenwich".</documentation>
+		</annotation>
+	</element>
+	<complexType name="PrimeMeridianType">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:greenwichLongitude"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="greenwichLongitude" type="gml:AngleType">
+		<annotation>
+			<documentation>gml:greenwichLongitude is the longitude of the prime meridian measured from the Greenwich meridian, positive eastward. If the value of the prime meridian "name" is "Greenwich" then the value of greenwichLongitude shall be 0 degrees.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PrimeMeridianPropertyType">
+		<annotation>
+			<documentation>gml:PrimeMeridianPropertyType is a property type for association roles to a prime meridian, either referencing or containing the definition of that meridian.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PrimeMeridian"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="EngineeringDatum" type="gml:EngineeringDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>gml:EngineeringDatum defines the origin of an engineering coordinate reference system, and is used in a region around that origin. This origin may be fixed with respect to the earth (such as a defined point at a construction site), or be a defined point on a moving vehicle (such as on a ship or satellite).</documentation>
+		</annotation>
+	</element>
+	<complexType name="EngineeringDatumType">
+		<complexContent>
+			<extension base="gml:AbstractDatumType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="EngineeringDatumPropertyType">
+		<annotation>
+			<documentation>gml:EngineeringDatumPropertyType is a property type for association roles to an engineering datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EngineeringDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="ImageDatum" type="gml:ImageDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>gml:ImageDatum defines the origin of an image coordinate reference system, and is used in a local context only. For an image datum, the anchor definition is usually either the centre of the image or the corner of the image. For more information, see ISO 19111 B.3.5.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ImageDatumType">
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:pixelInCell"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="pixelInCell" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>gml:pixelInCell is a specification of the way an image grid is associated with the image data attributes. The required codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ImageDatumPropertyType">
+		<annotation>
+			<documentation>gml:ImageDatumPropertyType is a property type for association roles to an image datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ImageDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="VerticalDatum" type="gml:VerticalDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>gml:VerticalDatum is a textual description and/or a set of parameters identifying a particular reference level surface used as a zero-height surface, including its position with respect to the Earth for any of the height types recognized by this International Standard.</documentation>
+		</annotation>
+	</element>
+	<complexType name="VerticalDatumType">
+		<complexContent>
+			<extension base="gml:AbstractDatumType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="VerticalDatumPropertyType">
+		<annotation>
+			<documentation>gml:VerticalDatumPropertyType is property type for association roles to a vertical datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="TemporalDatum" type="gml:TemporalDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>A gml:TemporalDatum defines the origin of a Temporal Reference System. This type omits the "anchorDefinition" and "realizationEpoch" elements and adds the "origin" element with the dateTime type.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TemporalDatumType">
+		<complexContent>
+			<extension base="gml:TemporalDatumBaseType">
+				<sequence>
+					<element ref="gml:origin"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TemporalDatumBaseType" abstract="true">
+		<annotation>
+			<documentation>The TemporalDatumBaseType partially defines the origin of a temporal coordinate reference system. This type restricts the AbstractDatumType to remove the "anchorDefinition" and "realizationEpoch" elements.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:descriptionReference" minOccurs="0"/>
+					<element ref="gml:identifier"/>
+					<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="origin" type="dateTime">
+		<annotation>
+			<documentation>gml:origin is the date and time origin of this temporal datum.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TemporalDatumPropertyType">
+		<annotation>
+			<documentation>gml:TemporalDatumPropertyType is a property type for association roles to a temporal datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/deprecatedTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/deprecatedTypes.xsd
new file mode 100755
index 0000000..7dbd79b
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/deprecatedTypes.xsd
@@ -0,0 +1,1133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:deprecatedTypes:3.2.1">deprecatedTypes.xsd</appinfo>
+		<documentation>All global schema components that are part of the GML schema, but were deprecated. See Annex I.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<element name="Null" type="gml:NilReasonType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="anchorPoint" type="gml:CodeType" substitutionGroup="gml:anchorDefinition">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="datumRef" type="gml:DatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesPrimeMeridian" type="gml:PrimeMeridianPropertyType" substitutionGroup="gml:primeMeridian">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesEllipsoid" type="gml:EllipsoidPropertyType" substitutionGroup="gml:ellipsoid">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="geodeticDatumRef" type="gml:GeodeticDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ellipsoidRef" type="gml:EllipsoidPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="primeMeridianRef" type="gml:PrimeMeridianPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="engineeringDatumRef" type="gml:EngineeringDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="imageDatumRef" type="gml:ImageDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="verticalDatumRef" type="gml:VerticalDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="temporalDatumRef" type="gml:TemporalDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="coordinateOperationRef" type="gml:CoordinateOperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="singleOperationRef" type="gml:SingleOperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:AbstractSingleOperation">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="OperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="operationRef" type="gml:OperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="generalConversionRef" type="gml:GeneralConversionPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="generalTransformationRef" type="gml:GeneralTransformationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesSingleOperation" type="gml:CoordinateOperationPropertyType" substitutionGroup="gml:coordOperation">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="concatenatedOperationRef" type="gml:ConcatenatedOperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesOperation" type="gml:CoordinateOperationPropertyType" substitutionGroup="gml:coordOperation">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="passThroughOperationRef" type="gml:PassThroughOperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesMethod" type="gml:OperationMethodPropertyType" substitutionGroup="gml:method">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesValue" type="gml:AbstractGeneralParameterValuePropertyType" substitutionGroup="gml:parameterValue">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="conversionRef" type="gml:ConversionPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="transformationRef" type="gml:TransformationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="dmsAngleValue" type="gml:DMSAngleType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="valueOfParameter" type="gml:OperationParameterPropertyType" substitutionGroup="gml:operationParameter">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="includesValue" type="gml:AbstractGeneralParameterValuePropertyType" substitutionGroup="gml:parameterValue">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="valuesOfGroup" type="gml:OperationParameterGroupPropertyType" substitutionGroup="gml:group">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="methodFormula" type="gml:CodeType" substitutionGroup="gml:formula">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesParameter" type="gml:AbstractGeneralOperationParameterPropertyType" substitutionGroup="gml:generalOperationParameter">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="operationMethodRef" type="gml:OperationMethodPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="abstractGeneralOperationParameterRef" type="gml:AbstractGeneralOperationParameterPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="operationParameterRef" type="gml:OperationParameterPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="includesParameter" type="gml:AbstractGeneralOperationParameterPropertyType" substitutionGroup="gml:parameter">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="operationParameterGroupRef" type="gml:OperationParameterPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="referenceSystemRef" type="gml:CRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="crsRef" type="gml:CRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="coordinateSystemAxisRef" type="gml:CoordinateSystemAxisPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesAxis" type="gml:CoordinateSystemAxisPropertyType" substitutionGroup="gml:axis">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="coordinateSystemRef" type="gml:CoordinateSystemPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ellipsoidalCSRef" type="gml:EllipsoidalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="cartesianCSRef" type="gml:CartesianCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="verticalCSRef" type="gml:VerticalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="TemporalCS" type="gml:TemporalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="TemporalCSType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="TemporalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="temporalCSRef" type="gml:TemporalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="linearCSRef" type="gml:LinearCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="userDefinedCSRef" type="gml:UserDefinedCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="sphericalCSRef" type="gml:SphericalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="polarCSRef" type="gml:PolarCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="cylindricalCSRef" type="gml:CylindricalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ObliqueCartesianCS" type="gml:ObliqueCartesianCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ObliqueCartesianCSType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="ObliqueCartesianCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ObliqueCartesianCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="obliqueCartesianCSRef" type="gml:ObliqueCartesianCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="singleCRSRef" type="gml:SingleCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="definedByConversion" type="gml:GeneralConversionPropertyType" substitutionGroup="gml:conversion">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="includesSingleCRS" type="gml:SingleCRSPropertyType" substitutionGroup="gml:componentReferenceSystem">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="compoundCRSRef" type="gml:CompoundCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesEllipsoidalCS" type="gml:EllipsoidalCSPropertyType" substitutionGroup="gml:ellipsoidalCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesCartesianCS" type="gml:CartesianCSPropertyType" substitutionGroup="gml:cartesianCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesSphericalCS" type="gml:SphericalCSPropertyType" substitutionGroup="gml:sphericalCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesGeodeticDatum" type="gml:GeodeticDatumPropertyType" substitutionGroup="gml:geodeticDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesVerticalCS" type="gml:VerticalCSPropertyType" substitutionGroup="gml:verticalCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesVerticalDatum" type="gml:VerticalDatumPropertyType" substitutionGroup="gml:verticalDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="verticalCRSRef" type="gml:VerticalCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="baseGeographicCRS" type="gml:GeographicCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="projectedCRSRef" type="gml:ProjectedCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesCS" type="gml:CoordinateSystemPropertyType" substitutionGroup="gml:coordinateSystem">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="derivedCRSRef" type="gml:DerivedCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesEngineeringDatum" type="gml:EngineeringDatumPropertyType" substitutionGroup="gml:engineeringDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="engineeringCRSRef" type="gml:EngineeringCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesAffineCS" type="gml:AffineCSPropertyType" substitutionGroup="gml:affineCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesImageDatum" type="gml:ImageDatumPropertyType" substitutionGroup="gml:imageDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesObliqueCartesianCS" type="gml:ObliqueCartesianCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="imageCRSRef" type="gml:ImageCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesTimeCS" type="gml:TimeCSPropertyType" substitutionGroup="gml:timeCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesTemporalCS" type="gml:TemporalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesTemporalDatum" type="gml:TemporalDatumPropertyType" substitutionGroup="gml:temporalDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="temporalCRSRef" type="gml:TemporalCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="GeographicCRS" type="gml:GeographicCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="GeographicCRSType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:usesEllipsoidalCS"/>
+					<element ref="gml:usesGeodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="GeographicCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeographicCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="geographicCRSRef" type="gml:GeographicCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="GeocentricCRS" type="gml:GeocentricCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="GeocentricCRSType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:usesCartesianCS"/>
+						<element ref="gml:usesSphericalCS"/>
+					</choice>
+					<element ref="gml:usesGeodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="GeocentricCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeocentricCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="geocentricCRSRef" type="gml:GeocentricCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<attribute name="uom" type="anyURI">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</attribute>
+	<simpleType name="SuccessionType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="substitution"/>
+			<enumeration value="division"/>
+			<enumeration value="fusion"/>
+			<enumeration value="initiation"/>
+		</restriction>
+	</simpleType>
+	<element name="dmsAngle" type="gml:DMSAngleType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DMSAngleType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence>
+			<element ref="gml:degrees"/>
+			<choice minOccurs="0">
+				<element ref="gml:decimalMinutes"/>
+				<sequence>
+					<element ref="gml:minutes"/>
+					<element ref="gml:seconds" minOccurs="0"/>
+				</sequence>
+			</choice>
+		</sequence>
+	</complexType>
+	<element name="degrees" type="gml:DegreesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DegreesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:DegreeValueType">
+				<attribute name="direction">
+					<simpleType>
+						<restriction base="string">
+							<enumeration value="N"/>
+							<enumeration value="E"/>
+							<enumeration value="S"/>
+							<enumeration value="W"/>
+							<enumeration value="+"/>
+							<enumeration value="-"/>
+						</restriction>
+					</simpleType>
+				</attribute>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="DegreeValueType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="nonNegativeInteger">
+			<maxInclusive value="359"/>
+		</restriction>
+	</simpleType>
+	<element name="decimalMinutes" type="gml:DecimalMinutesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<simpleType name="DecimalMinutesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="decimal">
+			<minInclusive value="0.00"/>
+			<maxExclusive value="60.00"/>
+		</restriction>
+	</simpleType>
+	<element name="minutes" type="gml:ArcMinutesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<simpleType name="ArcMinutesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="nonNegativeInteger">
+			<maxInclusive value="59"/>
+		</restriction>
+	</simpleType>
+	<element name="seconds" type="gml:ArcSecondsType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<simpleType name="ArcSecondsType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="decimal">
+			<minInclusive value="0.00"/>
+			<maxExclusive value="60.00"/>
+		</restriction>
+	</simpleType>
+	<complexType name="AngleChoiceType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<choice>
+			<element ref="gml:angle"/>
+			<element ref="gml:dmsAngle"/>
+		</choice>
+	</complexType>
+	<attribute name="remoteSchema" type="anyURI">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</attribute>
+	<element name="member" type="gml:AssociationRoleType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ArrayAssociationType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence>
+			<element ref="gml:AbstractObject" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="members" type="gml:ArrayAssociationType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="StringOrRefType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<element name="metaDataProperty" type="gml:MetaDataPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="Bag" type="gml:BagType" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="BagType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:member" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:members" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Array" type="gml:ArrayType" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ArrayType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:members" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="MetaDataPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractMetaData"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attribute name="about" type="anyURI"/>
+	</complexType>
+	<element name="AbstractMetaData" type="gml:AbstractMetaDataType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="AbstractMetaDataType" abstract="true" mixed="true">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence/>
+		<attribute ref="gml:id"/>
+	</complexType>
+	<element name="GenericMetaData" type="gml:GenericMetaDataType" substitutionGroup="gml:AbstractMetaData">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="GenericMetaDataType" mixed="true">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent mixed="true">
+			<extension base="gml:AbstractMetaDataType">
+				<sequence>
+					<any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="coordinates" type="gml:CoordinatesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="pointRep" type="gml:PointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="location" type="gml:LocationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="LocationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence>
+			<choice>
+				<element ref="gml:AbstractGeometry"/>
+				<element ref="gml:LocationKeyWord"/>
+				<element ref="gml:LocationString"/>
+				<element ref="gml:Null"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="LocationString" type="gml:StringOrRefType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="LocationKeyWord" type="gml:CodeType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="priorityLocation" type="gml:PriorityLocationPropertyType" substitutionGroup="gml:location">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="PriorityLocationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:LocationPropertyType">
+				<attribute name="priority" type="string"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="featureMember" type="gml:FeaturePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="featureProperty" type="gml:FeaturePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="FeatureArrayPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractFeature"/>
+		</sequence>
+	</complexType>
+	<element name="featureMembers" type="gml:FeatureArrayPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="BoundedFeatureType" abstract="true">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractFeatureType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy"/>
+					<element ref="gml:location" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="AbstractFeatureCollectionType" abstract="true">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:featureMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:featureMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractFeatureCollection" type="gml:AbstractFeatureCollectionType" abstract="true" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="FeatureCollection" type="gml:FeatureCollectionType" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="FeatureCollectionType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureCollectionType"/>
+		</complexContent>
+	</complexType>
+	<element name="track" type="gml:HistoryPropertyType" substitutionGroup="gml:history">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="DefinitionCollection" type="gml:DictionaryType" substitutionGroup="gml:Definition">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="definitionMember" type="gml:DictionaryEntryType" substitutionGroup="gml:dictionaryEntry">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="indirectEntry" type="gml:IndirectEntryType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="IndirectEntryType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence>
+			<element ref="gml:DefinitionProxy"/>
+		</sequence>
+	</complexType>
+	<element name="DefinitionProxy" type="gml:DefinitionProxyType" substitutionGroup="gml:Definition">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DefinitionProxyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:definitionRef"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="definitionRef" type="gml:ReferenceType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="MappingRule" type="gml:StringOrRefType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<simpleType name="IncrementOrder">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="+x+y"/>
+			<enumeration value="+y+x"/>
+			<enumeration value="+x-y"/>
+			<enumeration value="-x-y"/>
+		</restriction>
+	</simpleType>
+	<element name="centerOf" type="gml:PointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="position" type="gml:PointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="extentOf" type="gml:SurfacePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="edgeOf" type="gml:CurvePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="centerLineOf" type="gml:CurvePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiLocation" type="gml:MultiPointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiCenterOf" type="gml:MultiPointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiPosition" type="gml:MultiPointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiCenterLineOf" type="gml:MultiCurvePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiEdgeOf" type="gml:MultiCurvePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiCoverage" type="gml:MultiSurfacePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiExtentOf" type="gml:MultiSurfacePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="polygonPatches" type="gml:SurfacePatchArrayPropertyType" substitutionGroup="gml:patches">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="trianglePatches" type="gml:SurfacePatchArrayPropertyType" substitutionGroup="gml:patches">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiPointDomain" type="gml:DomainSetType" substitutionGroup="gml:domainSet">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiCurveDomain" type="gml:DomainSetType" substitutionGroup="gml:domainSet">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiSurfaceDomain" type="gml:DomainSetType" substitutionGroup="gml:domainSet">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiSolidDomain" type="gml:DomainSetType" substitutionGroup="gml:domainSet">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="gridDomain" type="gml:DomainSetType" substitutionGroup="gml:domainSet">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="rectifiedGridDomain" type="gml:DomainSetType" substitutionGroup="gml:domainSet">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="generalOperationParameter" type="gml:AbstractGeneralOperationParameterPropertyType" substitutionGroup="gml:parameter">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="MovingObjectStatus" type="gml:MovingObjectStatusType" substitutionGroup="gml:AbstractTimeSlice">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="MovingObjectStatusType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeSliceType">
+				<sequence>
+					<choice>
+						<element name="position" type="gml:GeometryPropertyType"/>
+						<element ref="gml:pos"/>
+						<element ref="gml:locationName"/>
+						<element ref="gml:locationReference"/>
+						<element ref="gml:location"/>
+					</choice>
+					<element name="speed" type="gml:MeasureType" minOccurs="0"/>
+					<element name="bearing" type="gml:DirectionPropertyType" minOccurs="0"/>
+					<element name="acceleration" type="gml:MeasureType" minOccurs="0"/>
+					<element name="elevation" type="gml:MeasureType" minOccurs="0"/>
+					<element ref="gml:status" minOccurs="0"/>
+					<element ref="gml:statusReference" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="status" type="gml:StringOrRefType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="statusReference" type="gml:ReferenceType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+  <element name="topoComplexProperty" type="gml:TopoComplexPropertyType">
+    <annotation>
+			<appinfo>deprecated</appinfo>
+    </annotation>
+  </element>
+	<element name="multiPointProperty" type="gml:MultiPointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiCurveProperty" type="gml:MultiCurvePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiSurfaceProperty" type="gml:MultiSurfacePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiSolidProperty" type="gml:MultiSolidPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="multiGeometryProperty" type="gml:MultiGeometryPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="pointArrayProperty" type="gml:PointArrayPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="curveArrayProperty" type="gml:CurveArrayPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="surfaceArrayProperty" type="gml:SurfaceArrayPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="solidArrayProperty" type="gml:SolidArrayPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/dictionary.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/dictionary.xsd
new file mode 100755
index 0000000..8d6f94a
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/dictionary.xsd
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:dictionary:v3.2.1">dictionary.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 16.
+Many applications require definitions of terms which are used within instance documents as the values of certain properties or as reference information to tie properties to standard information values in some way.  Units of measure and descriptions of measurable phenomena are two particular examples. 
+It will often be convenient to use definitions provided by external authorities. These may already be packaged for delivery in various ways, both online and offline. In order that they may be referred to from GML documents it is generally necessary that a URI be available for each definition. Where this is the case then it is usually preferable to refer to these directly. 
+Alternatively, it may be convenient or necessary to capture definitions in XML, either embedded within an instance document containing features or as a separate document. The definitions may be transcriptions from an external source, or may be new definitions for a local purpose. In order to support this case, some simple components are provided in GML in the form of 
+-	a generic gml:Definition, which may serve as the basis for more specialized definitions
+-	a generic gml:Dictionary, which allows a set of definitions or references to definitions to be collected 
+These components may be used directly, but also serve as the basis for more specialised definition elements in GML, in particular: coordinate operations, coordinate reference systems, datums, temporal reference systems, and units of measure.  
+Note that the GML definition and dictionary components implement a simple nested hierarchy of definitions with identifiers. The latter provide handles which may be used in the description of more complex relationships between terms. However, the GML dictionary components are not intended to provide direct support for complex taxonomies, ontologies or thesauri.  Specialised XML tools are available to satisfy the more sophisticated requirements.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="gmlBase.xsd"/>
+	<element name="Definition" type="gml:DefinitionType" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>The basic gml:Definition element specifies a definition, which can be included in or referenced by a dictionary. 
+The content model for a generic definition is a derivation from gml:AbstractGMLType.  
+The gml:description property element shall hold the definition if this can be captured in a simple text string, or the gml:descriptionReference property element may carry a link to a description elsewhere.
+The gml:identifier element shall provide one identifier identifying this definition. The identifier shall be unique within the dictionaries using this definition. 
+The gml:name elements shall provide zero or more terms and synonyms for which this is the definition.
+The gml:remarks element shall be used to hold additional textual information that is not conceptually part of the definition but is useful in understanding the definition.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DefinitionBaseType">
+		<complexContent>
+			<restriction base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:descriptionReference" minOccurs="0"/>
+					<element ref="gml:identifier"/>
+					<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="DefinitionType">
+		<complexContent>
+			<extension base="gml:DefinitionBaseType">
+				<sequence>
+					<element ref="gml:remarks" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="remarks" type="string"/>
+	<element name="Dictionary" type="gml:DictionaryType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>Sets of definitions may be collected into dictionaries or collections.
+A gml:Dictionary is a non-abstract collection of definitions.
+The gml:Dictionary content model adds a list of gml:dictionaryEntry properties that contain or reference gml:Definition objects.  A database handle (gml:id attribute) is required, in order that this collection may be referred to. The standard gml:identifier, gml:description, gml:descriptionReference and gml:name properties are available to reference or contain more information about this dictionary. The gml:description and gml:descriptionReference property elements may be used for a desc [...]
+		</annotation>
+	</element>
+	<complexType name="DictionaryType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<choice minOccurs="0" maxOccurs="unbounded">
+					<element ref="gml:dictionaryEntry"/>
+					<element ref="gml:indirectEntry"/>
+				</choice>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="dictionaryEntry" type="gml:DictionaryEntryType">
+		<annotation>
+			<documentation>This property element contains or refers to the definitions which are members of a dictionary. 
+The content model follows the standard GML property pattern, so a gml:dictionaryEntry may either contain or refer to a single gml:Definition. Since gml:Dictionary is substitutable for gml:Definition, the content of an entry may itself be a lower level dictionary. 
+Note that if the value is provided by reference, this definition does not carry a handle (gml:id) in this context, so does not allow external references to this specific definition in this context.  When used in this way the referenced definition will usually be in a dictionary in the same XML document.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DictionaryEntryType">
+		<complexContent>
+			<extension base="gml:AbstractMemberType">
+				<sequence minOccurs="0">
+					<element ref="gml:Definition"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/direction.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/direction.xsd
new file mode 100755
index 0000000..8b0f7f5
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/direction.xsd
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:direction:3.2.1">direction.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 18.
+The direction schema components provide the GML Application Schema developer with a standard property element to describe direction, and associated objects that may be used to express orientation, direction, heading, bearing or other directional aspects of geographic features.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<element name="direction" type="gml:DirectionPropertyType">
+		<annotation>
+			<documentation>The property gml:direction is intended as a pre-defined property expressing a direction to be assigned to features defined in a GML application schema.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectionPropertyType">
+		<choice minOccurs="0">
+			<element name="DirectionVector" type="gml:DirectionVectorType"/>
+			<element name="DirectionDescription" type="gml:DirectionDescriptionType"/>
+			<element name="CompassPoint" type="gml:CompassPointEnumeration"/>
+			<element name="DirectionKeyword" type="gml:CodeType"/>
+			<element name="DirectionString" type="gml:StringOrRefType"/>
+		</choice>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="DirectionVectorType">
+		<annotation>
+			<documentation>Direction vectors are specified by providing components of a vector.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:vector"/>
+			<sequence>
+				<annotation>
+					<appinfo>deprecated</appinfo>
+				</annotation>
+				<element name="horizontalAngle" type="gml:AngleType"/>
+				<element name="verticalAngle" type="gml:AngleType"/>
+			</sequence>
+		</choice>
+	</complexType>
+	<complexType name="DirectionDescriptionType">
+		<annotation>
+			<documentation>direction descriptions are specified by a compass point code, a keyword, a textual description or a reference to a description.
+A gml:compassPoint is specified by a simple enumeration.  	
+In addition, thre elements to contain text-based descriptions of direction are provided.  
+If the direction is specified using a term from a list, gml:keyword should be used, and the list indicated using the value of the codeSpace attribute. 
+if the direction is decribed in prose, gml:direction or gml:reference should be used, allowing the value to be included inline or by reference.</documentation>
+		</annotation>
+		<choice>
+			<element name="compassPoint" type="gml:CompassPointEnumeration"/>
+			<element name="keyword" type="gml:CodeType"/>
+			<element name="description" type="string"/>
+			<element name="reference" type="gml:ReferenceType"/>
+		</choice>
+	</complexType>
+	<simpleType name="CompassPointEnumeration">
+		<annotation>
+			<documentation>These directions are necessarily approximate, giving direction with a precision of 22.5°. It is thus generally unnecessary to specify the reference frame, though this may be detailed in the definition of a GML application language.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="N"/>
+			<enumeration value="NNE"/>
+			<enumeration value="NE"/>
+			<enumeration value="ENE"/>
+			<enumeration value="E"/>
+			<enumeration value="ESE"/>
+			<enumeration value="SE"/>
+			<enumeration value="SSE"/>
+			<enumeration value="S"/>
+			<enumeration value="SSW"/>
+			<enumeration value="SW"/>
+			<enumeration value="WSW"/>
+			<enumeration value="W"/>
+			<enumeration value="WNW"/>
+			<enumeration value="NW"/>
+			<enumeration value="NNW"/>
+		</restriction>
+	</simpleType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/dynamicFeature.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/dynamicFeature.xsd
new file mode 100755
index 0000000..d755067
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/dynamicFeature.xsd
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:dynamicFeature:3.2.1">dynamicFeature.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 15.6.
+A number of types and relationships are defined to represent the time-varying properties of geographic features. 
+In a comprehensive treatment of spatiotemporal modeling, Langran (see Bibliography) distinguished three principal temporal entities: states, events, and evidence; the schema specified in the following Subclauses incorporates elements for each.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="direction.xsd"/>
+	<element name="dataSource" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Evidence is represented by a simple gml:dataSource or gml:dataSourceReference property that indicates the source of the temporal data. The remote link attributes of the gml:dataSource element have been deprecated along with its current type.</documentation>
+		</annotation>
+	</element>
+	<element name="dataSourceReference" type="gml:ReferenceType">
+		<annotation>
+			<documentation>Evidence is represented by a simple gml:dataSource or gml:dataSourceReference property that indicates the source of the temporal data.</documentation>
+		</annotation>
+	</element>
+	<group name="dynamicProperties">
+		<annotation>
+			<documentation>A convenience group. This allows an application schema developer to include dynamic properties in a content model in a standard fashion.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:validTime" minOccurs="0"/>
+			<element ref="gml:history" minOccurs="0"/>
+			<element ref="gml:dataSource" minOccurs="0"/>
+			<element ref="gml:dataSourceReference" minOccurs="0"/>
+		</sequence>
+	</group>
+	<element name="DynamicFeature" type="gml:DynamicFeatureType" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<documentation>States are captured by time-stamped instances of a feature. The content model extends the standard gml:AbstractFeatureType with the gml:dynamicProperties model group.
+Each time-stamped instance represents a 'snapshot' of a feature. The dynamic feature classes will normally be extended to suit particular applications.  A dynamic feature bears either a time stamp or a history.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DynamicFeatureType">
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<group ref="gml:dynamicProperties"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="DynamicFeatureCollection" type="gml:DynamicFeatureCollectionType" substitutionGroup="gml:DynamicFeature">
+		<annotation>
+			<documentation>A gml:DynamicFeatureCollection is a feature collection that has a gml:validTime property (i.e. is a snapshot of the feature collection) or which has a gml:history property that contains one or more gml:AbstractTimeSlices each of which contain values of the time varying properties of the feature collection.  Note that the gml:DynamicFeatureCollection may be one of the following:
+1.	A feature collection which consists of static feature members (members do not change in time) but which has properties of the collection object as a whole that do change in time .  
+2.	A feature collection which consists of dynamic feature members (the members are gml:DynamicFeatures) but which also has properties of the collection as a whole that vary in time.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DynamicFeatureCollectionType">
+		<complexContent>
+			<extension base="gml:DynamicFeatureType">
+				<sequence>
+					<element ref="gml:dynamicMembers"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="dynamicMembers" type="gml:DynamicFeatureMemberType"/>
+	<complexType name="DynamicFeatureMemberType">
+		<complexContent>
+			<extension base="gml:AbstractFeatureMemberType">
+				<sequence>
+					<element ref="gml:DynamicFeature" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTimeSlice" type="gml:AbstractTimeSliceType" abstract="true" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>To describe an event — an action that occurs at an instant or over an interval of time — GML provides the gml:AbtractTimeSlice element. A timeslice encapsulates the time-varying properties of a dynamic feature -- it shall be extended to represent a time stamped projection of a specific feature. The gml:dataSource property describes how the temporal data was acquired.
+A gml:AbstractTimeSlice instance is a GML object that encapsulates updates of the dynamic—or volatile—properties that reflect some change event; it thus includes only those feature properties that have actually changed due to some process.
+gml:AbstractTimeSlice basically provides a facility for attribute-level time stamping, in contrast to the object-level time stamping of dynamic feature instances. 
+The time slice can thus be viewed as event or process-oriented, whereas a snapshot is more state or structure-oriented. A timeslice has richer causality, whereas a snapshot merely portrays the status of the whole. 
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeSliceType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:validTime"/>
+					<element ref="gml:dataSource" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="history" type="gml:HistoryPropertyType">
+		<annotation>
+			<documentation>A generic sequence of events constitute a gml:history of an object.
+The gml:history element contains a set of elements in the substitution group headed by the abstract element gml:AbstractTimeSlice, representing the time-varying properties of interest. The history property of a dynamic feature associates a feature instance with a sequence of time slices (i.e. change events) that encapsulate the evolution of the feature.</documentation>
+		</annotation>
+	</element>
+	<complexType name="HistoryPropertyType">
+		<sequence>
+			<element ref="gml:AbstractTimeSlice" maxOccurs="unbounded"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/feature.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/feature.xsd
new file mode 100755
index 0000000..1892ef6
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/feature.xsd
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:feature:3.2.1">feature.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 9.
+A GML feature is a (representation of a) identifiable real-world object in a selected domain of discourse. The feature schema provides a framework for the creation of GML features and feature collections.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<complexType name="AbstractFeatureType" abstract="true">
+		<annotation>
+			<documentation>The basic feature model is given by the gml:AbstractFeatureType.
+The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. 
+The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. 
+The value of the gml:location property describes the extent, position or relative location of the feature.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:location" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractFeature" type="gml:AbstractFeatureType" abstract="true" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>This abstract element serves as the head of a substitution group which may contain any elements whose content model is derived from gml:AbstractFeatureType.  This may be used as a variable in the construction of content models.  
+gml:AbstractFeature may be thought of as "anything that is a GML feature" and may be used to define variables or templates in which the value of a GML property is "any feature". This occurs in particular in a GML feature collection where the feature member properties contain one or multiple copies of gml:AbstractFeature respectively.</documentation>
+		</annotation>
+	</element>
+	<complexType name="FeaturePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractFeature"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="boundedBy" type="gml:BoundingShapeType" nillable="true">
+		<annotation>
+			<documentation>This property describes the minimum bounding box or rectangle that encloses the entire feature.</documentation>
+		</annotation>
+	</element>
+	<complexType name="BoundingShapeType">
+		<sequence>
+			<choice>
+				<element ref="gml:Envelope"/>
+				<element ref="gml:Null"/>
+			</choice>
+		</sequence>
+		<attribute name="nilReason" type="gml:NilReasonType"/>
+	</complexType>
+	<element name="EnvelopeWithTimePeriod" type="gml:EnvelopeWithTimePeriodType" substitutionGroup="gml:Envelope">
+		<annotation>
+			<documentation>gml:EnvelopeWithTimePeriod is provided for envelopes that include a temporal extent. It adds two time position properties, gml:beginPosition and gml:endPosition, which describe the extent of a time-envelope.  
+Since gml:EnvelopeWithTimePeriod is assigned to the substitution group headed by gml:Envelope, it may be used whenever gml:Envelope is valid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EnvelopeWithTimePeriodType">
+		<complexContent>
+			<extension base="gml:EnvelopeType">
+				<sequence>
+					<element name="beginPosition" type="gml:TimePositionType"/>
+					<element name="endPosition" type="gml:TimePositionType"/>
+				</sequence>
+				<attribute name="frame" type="anyURI" default="#ISO-8601"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="locationName" type="gml:CodeType">
+		<annotation>
+			<documentation>The gml:locationName property element is a convenience property where the text value describes the location of the feature. If the location names are selected from a controlled list, then the list shall be identified in the codeSpace attribute.</documentation>
+		</annotation>
+	</element>
+	<element name="locationReference" type="gml:ReferenceType">
+		<annotation>
+			<documentation>The gml:locationReference property element is a convenience property where the text value referenced by the xlink:href attribute describes the location of the feature.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractFeatureMemberType" abstract="true">
+		<annotation>
+			<documentation>To create a collection of GML features, a property type shall be derived by extension from gml:AbstractFeatureMemberType.
+By default, this abstract property type does not imply any ownership of the features in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of a feature in the collection. A collection shall not own a feature already owned by another object.</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryAggregates.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryAggregates.xsd
new file mode 100755
index 0000000..9ffbdc0
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryAggregates.xsd
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:geometryAggregates:3.2.1">geometryAggregates.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 12.3.
+Geometric aggregates (i.e. instances of a subtype of gml:AbstractGeometricAggregateType) are arbitrary aggregations of geometry elements. They are not assumed to have any additional internal structure and are used to "collect" pieces of geometry of a specified type. Application schemas may use aggregates for features that use multiple geometric objects in their representations.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryPrimitives.xsd"/>
+	<complexType name="AbstractGeometricAggregateType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractGeometricAggregate" type="gml:AbstractGeometricAggregateType" abstract="true" substitutionGroup="gml:AbstractGeometry">
+		<annotation>
+			<documentation>gml:AbstractGeometricAggregate is the abstract head of the substitution group for all geometric aggregates.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiGeometryType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:geometryMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:geometryMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiGeometry" type="gml:MultiGeometryType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>gml:MultiGeometry is a collection of one or more GML geometry objects of arbitrary type. 
+The members of the geometric aggregate may be specified either using the "standard" property (gml:geometryMember) or the array property (gml:geometryMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="geometryMember" type="gml:GeometryPropertyType">
+		<annotation>
+			<documentation>This property element either references a geometry element via the XLink-attributes or contains the geometry element.</documentation>
+		</annotation>
+	</element>
+	<element name="geometryMembers" type="gml:GeometryArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of geometry elements. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiGeometryPropertyType">
+		<annotation>
+			<documentation>A property that has a geometric aggregate as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeometricAggregate"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="MultiPointType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:pointMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:pointMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiPoint" type="gml:MultiPointType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>A gml:MultiPoint consists of one or more gml:Points.
+The members of the geometric aggregate may be specified either using the "standard" property (gml:pointMember) or the array property (gml:pointMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="pointMember" type="gml:PointPropertyType">
+		<annotation>
+			<documentation>This property element either references a Point via the XLink-attributes or contains the Point element.</documentation>
+		</annotation>
+	</element>
+	<element name="pointMembers" type="gml:PointArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of points. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiPointPropertyType">
+		<annotation>
+			<documentation>A property that has a collection of points as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiPoint"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="MultiCurveType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:curveMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:curveMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiCurve" type="gml:MultiCurveType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>A gml:MultiCurve is defined by one or more gml:AbstractCurves.
+The members of the geometric aggregate may be specified either using the "standard" property (gml:curveMember) or the array property (gml:curveMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="curveMembers" type="gml:CurveArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curves. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiCurvePropertyType">
+		<annotation>
+			<documentation>A property that has a collection of curves as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="MultiSurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:surfaceMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:surfaceMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiSurface" type="gml:MultiSurfaceType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>A gml:MultiSurface is defined by one or more gml:AbstractSurfaces.
+The members of the geometric aggregate may be specified either using the "standard" property (gml:surfaceMember) or the array property (gml:surfaceMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="surfaceMembers" type="gml:SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of surfaces. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiSurfacePropertyType">
+		<annotation>
+			<documentation>A property that has a collection of surfaces as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="MultiSolidType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:solidMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:solidMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiSolid" type="gml:MultiSolidType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>A gml:MultiSolid is defined by one or more gml:AbstractSolids.
+The members of the geometric aggregate may be specified either using the "standard" property (gml:solidMember) or the array property (gml:solidMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="solidMember" type="gml:SolidPropertyType">
+		<annotation>
+			<documentation>This property element either references a solid via the XLink-attributes or contains the solid element. A solid element is any element, which is substitutable for gml:AbstractSolid.</documentation>
+		</annotation>
+	</element>
+	<element name="solidMembers" type="gml:SolidArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of solids. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiSolidPropertyType">
+		<annotation>
+			<documentation>A property that has a collection of solids as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryBasic0d1d.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryBasic0d1d.xsd
new file mode 100755
index 0000000..2ac83e3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryBasic0d1d.xsd
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:geometryBasic0d1d:3.2.1">geometryBasic0d1d.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 10.
+Any geometry element that inherits the semantics of AbstractGeometryType may be viewed as a set of direct positions. 
+All of the classes derived from AbstractGeometryType inherit an optional association to a coordinate reference system. All direct positions shall directly or indirectly be associated with a coordinate reference system. When geometry elements are aggregated in another geometry element (such as a MultiGeometry or GeometricComplex), which already has a coordinate reference system specified, then these elements are assumed to be in that same coordinate reference system unless otherwise specified.
+The geometry model distinguishes geometric primitives, aggregates and complexes. 
+Geometric primitives, i.e. instances of a subtype of AbstractGeometricPrimitiveType, will be open, that is, they will not contain their boundary points; curves will not contain their end points, surfaces will not contain their boundary curves, and solids will not contain their bounding surfaces.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="measures.xsd"/>
+	<complexType name="AbstractGeometryType" abstract="true">
+		<annotation>
+			<documentation>All geometry elements are derived directly or indirectly from this abstract supertype. A geometry element may have an identifying attribute (gml:id), one or more names (elements identifier and name) and a description (elements description and descriptionReference) . It may be associated with a spatial reference system (attribute group gml:SRSReferenceGroup).
+The following rules shall be adhered to:
+-	Every geometry type shall derive from this abstract type.
+-	Every geometry element (i.e. an element of a geometry type) shall be directly or indirectly in the substitution group of AbstractGeometry.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<attributeGroup name="SRSReferenceGroup">
+		<annotation>
+			<documentation>The attribute group SRSReferenceGroup is an optional reference to the CRS used by this geometry, with optional additional information to simplify the processing of the coordinates when a more complete definition of the CRS is not needed.
+In general the attribute srsName points to a CRS instance of gml:AbstractCoordinateReferenceSystem. For well-known references it is not required that the CRS description exists at the location the URI points to. 
+If no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of.</documentation>
+		</annotation>
+		<attribute name="srsName" type="anyURI"/>
+		<attribute name="srsDimension" type="positiveInteger"/>
+		<attributeGroup ref="gml:SRSInformationGroup"/>
+	</attributeGroup>
+	<attributeGroup name="SRSInformationGroup">
+		<annotation>
+			<documentation>The attributes uomLabels and axisLabels, defined in the SRSInformationGroup attribute group, are optional additional and redundant information for a CRS to simplify the processing of the coordinate values when a more complete definition of the CRS is not needed. This information shall be the same as included in the complete definition of the CRS, referenced by the srsName attribute. When the srsName attribute is included, either both or neither of the axisLabels and uom [...]
+The attribute axisLabels is an ordered list of labels for all the axes of this CRS. The gml:axisAbbrev value should be used for these axis labels, after spaces and forbidden characters are removed. When the srsName attribute is included, this attribute is optional. When the srsName attribute is omitted, this attribute shall also be omitted.
+The attribute uomLabels is an ordered list of unit of measure (uom) labels for all the axes of this CRS. The value of the string in the gml:catalogSymbol should be used for this uom labels, after spaces and forbidden characters are removed. When the axisLabels attribute is included, this attribute shall also be included. When the axisLabels attribute is omitted, this attribute shall also be omitted.</documentation>
+		</annotation>
+		<attribute name="axisLabels" type="gml:NCNameList"/>
+		<attribute name="uomLabels" type="gml:NCNameList"/>
+	</attributeGroup>
+	<element name="AbstractGeometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>The AbstractGeometry element is the abstract head of the substitution group for all geometry elements of GML. This includes pre-defined and user-defined geometry elements. Any geometry element shall be a direct or indirect extension/restriction of AbstractGeometryType and shall be directly or indirectly in the substitution group of AbstractGeometry.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeometryPropertyType">
+		<annotation>
+			<documentation>A geometric property may either be any geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same or another document). Note that either the reference or the contained element shall be given, but not both or none.
+If a feature has a property that takes a geometry element as its value, this is called a geometry property. A generic type for such a geometry property is GeometryPropertyType.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeometry"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="GeometryArrayPropertyType">
+		<annotation>
+			<documentation>If a feature has a property which takes an array of geometry elements as its value, this is called a geometry array property. A generic type for such a geometry property is GeometryArrayPropertyType. 
+The elements are always contained inline in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractGeometry"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="DirectPositionType">
+		<annotation>
+			<documentation>Direct position instances hold the coordinates for a position within some coordinate reference system (CRS). Since direct positions, as data types, will often be included in larger objects (such as geometry elements) that have references to CRS, the srsName attribute will in general be missing, if this particular direct position is included in a larger element with such a reference to a CRS. In this case, the CRS is implicitly assumed to take on the value of the contain [...]
+if no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of, typically a geometric object like a point, curve, etc.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<element name="pos" type="gml:DirectPositionType"/>
+	<complexType name="DirectPositionListType">
+		<annotation>
+			<documentation>posList instances (and other instances with the content model specified by DirectPositionListType) hold the coordinates for a sequence of direct positions within the same coordinate reference system (CRS).
+if no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of, typically a geometric object like a point, curve, etc. 
+The optional attribute count specifies the number of direct positions in the list. If the attribute count is present then the attribute srsDimension shall be present, too.
+The number of entries in the list is equal to the product of the dimensionality of the coordinate reference system (i.e. it is a derived value of the coordinate reference system definition) and the number of direct positions.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+				<attribute name="count" type="positiveInteger"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<element name="posList" type="gml:DirectPositionListType"/>
+	<group name="geometricPositionGroup">
+		<annotation>
+			<documentation>GML supports two different ways to specify a geometric position: either by a direct position (a data type) or a point (a geometric object).
+pos elements are positions that are "owned" by the geometric primitive encapsulating this geometric position.
+pointProperty elements contain a point that may be referenced from other geometry elements or reference another point defined elsewhere (reuse of existing points).</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:pos"/>
+			<element ref="gml:pointProperty"/>
+		</choice>
+	</group>
+	<group name="geometricPositionListGroup">
+		<annotation>
+			<documentation>GML supports two different ways to specify a list of geometric positions: either by a sequence of geometric positions (by reusing the group definition) or a sequence of direct positions (element posList). 
+The posList element allows for a compact way to specify the coordinates of the positions, if all positions are represented in the same coordinate reference system.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:posList"/>
+			<group ref="gml:geometricPositionGroup" maxOccurs="unbounded"/>
+		</choice>
+	</group>
+	<complexType name="VectorType">
+		<annotation>
+			<documentation>For some applications the components of the position may be adjusted to yield a unit vector.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:DirectPositionType"/>
+		</simpleContent>
+	</complexType>
+	<element name="vector" type="gml:VectorType"/>
+	<complexType name="EnvelopeType">
+		<choice>
+			<sequence>
+				<element name="lowerCorner" type="gml:DirectPositionType"/>
+				<element name="upperCorner" type="gml:DirectPositionType"/>
+			</sequence>
+			<element ref="gml:pos" minOccurs="2" maxOccurs="2">
+				<annotation>
+					<appinfo>deprecated</appinfo>
+				</annotation>
+			</element>
+			<element ref="gml:coordinates"/>
+		</choice>
+		<attributeGroup ref="gml:SRSReferenceGroup"/>
+	</complexType>
+	<element name="Envelope" type="gml:EnvelopeType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>Envelope defines an extent using a pair of positions defining opposite corners in arbitrary dimensions. The first direct position is the "lower corner" (a coordinate position consisting of all the minimal ordinates for each dimension for all points within the envelope), the second one the "upper corner" (a coordinate position consisting of all the maximal ordinates for each dimension for all points within the envelope).
+The use of the properties "coordinates" and "pos" has been deprecated. The explicitly named properties "lowerCorner" and "upperCorner" shall be used instead.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGeometricPrimitiveType" abstract="true">
+		<annotation>
+			<documentation>gml:AbstractGeometricPrimitiveType is the abstract root type of the geometric primitives. A geometric primitive is a geometric object that is not decomposed further into other primitives in the system. All primitives are oriented in the direction implied by the sequence of their coordinate tuples.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractGeometricPrimitive" type="gml:AbstractGeometricPrimitiveType" abstract="true" substitutionGroup="gml:AbstractGeometry">
+		<annotation>
+			<documentation>The AbstractGeometricPrimitive element is the abstract head of the substitution group for all (pre- and user-defined) geometric primitives.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeometricPrimitivePropertyType">
+		<annotation>
+			<documentation>A property that has a geometric primitive as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeometricPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="PointType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType">
+				<sequence>
+					<choice>
+						<element ref="gml:pos"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Point" type="gml:PointType" substitutionGroup="gml:AbstractGeometricPrimitive">
+		<annotation>
+			<documentation>A Point is defined by a single coordinate tuple. The direct position of a point is specified by the pos element which is of type DirectPositionType.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PointPropertyType">
+		<annotation>
+			<documentation>A property that has a point as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Point"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="pointProperty" type="gml:PointPropertyType">
+		<annotation>
+			<documentation>This property element either references a point via the XLink-attributes or contains the point element. pointProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for Point.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PointArrayPropertyType">
+		<annotation>
+			<documentation>gml:PointArrayPropertyType is a container for an array of points. The elements are always contained inline in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:Point"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="AbstractCurveType" abstract="true">
+		<annotation>
+			<documentation>gml:AbstractCurveType is an abstraction of a curve to support the different levels of complexity. The curve may always be viewed as a geometric primitive, i.e. is continuous.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractCurve" type="gml:AbstractCurveType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive">
+		<annotation>
+			<documentation>The AbstractCurve element is the abstract head of the substitution group for all (continuous) curve elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CurvePropertyType">
+		<annotation>
+			<documentation>A property that has a curve as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="curveProperty" type="gml:CurvePropertyType">
+		<annotation>
+			<documentation>This property element either references a curve via the XLink-attributes or contains the curve element. curveProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractCurve.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CurveArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of curves. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="LineStringType">
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="LineString" type="gml:LineStringType" substitutionGroup="gml:AbstractCurve">
+		<annotation>
+			<documentation>A LineString is a special curve that consists of a single segment with linear interpolation. It is defined by two or more coordinate tuples, with linear interpolation between them. The number of direct positions in the list shall be at least two.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryBasic2d.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryBasic2d.xsd
new file mode 100755
index 0000000..5781df5
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryBasic2d.xsd
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:geometryBasic2d:3.2.1">geometryBasic2d.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 10.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<complexType name="AbstractSurfaceType" abstract="true">
+		<annotation>
+			<documentation>gml:AbstractSurfaceType is an abstraction of a surface to support the different levels of complexity. A surface is always a continuous region of a plane.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractSurface" type="gml:AbstractSurfaceType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive">
+		<annotation>
+			<documentation>The AbstractSurface element is the abstract head of the substitution group for all (continuous) surface elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SurfacePropertyType">
+		<annotation>
+			<documentation>A property that has a surface as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="surfaceProperty" type="gml:SurfacePropertyType">
+		<annotation>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. surfaceProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractSurface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>gml:SurfaceArrayPropertyType is a container for an array of surfaces. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="PolygonType">
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:exterior" minOccurs="0"/>
+					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:AbstractSurface">
+		<annotation>
+			<documentation>A Polygon is a special surface that is defined by a single surface patch (see D.3.6). The boundary of this patch is coplanar and the polygon uses planar interpolation in its interior. 
+The elements exterior and interior describe the surface boundary of the polygon.</documentation>
+		</annotation>
+	</element>
+	<element name="exterior" type="gml:AbstractRingPropertyType">
+		<annotation>
+			<documentation>A boundary of a surface consists of a number of rings. In the normal 2D case, one of these rings is distinguished as being the exterior boundary. In a general manifold this is not always possible, in which case all boundaries shall be listed as interior boundaries, and the exterior will be empty.</documentation>
+		</annotation>
+	</element>
+	<element name="interior" type="gml:AbstractRingPropertyType">
+		<annotation>
+			<documentation>A boundary of a surface consists of a number of rings. The "interior" rings separate the surface / surface patch from the area enclosed by the rings.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractRingType" abstract="true">
+		<sequence/>
+	</complexType>
+	<element name="AbstractRing" type="gml:AbstractRingType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>An abstraction of a ring to support surface boundaries of different complexity.
+The AbstractRing element is the abstract head of the substituition group for all closed boundaries of a surface patch.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractRingPropertyType">
+		<annotation>
+			<documentation>A property with the content model of gml:AbstractRingPropertyType encapsulates a ring to represent the surface boundary property of a surface.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:AbstractRing"/>
+		</sequence>
+	</complexType>
+	<complexType name="LinearRingType">
+		<complexContent>
+			<extension base="gml:AbstractRingType">
+				<sequence>
+					<choice>
+						<choice minOccurs="4" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:AbstractRing">
+		<annotation>
+			<documentation>A LinearRing is defined by four or more coordinate tuples, with linear interpolation between them; the first and last coordinates shall be coincident. The number of direct positions in the list shall be at least four.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LinearRingPropertyType">
+		<annotation>
+			<documentation>A property with the content model of gml:LinearRingPropertyType encapsulates a linear ring to represent a component of a surface boundary.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:LinearRing"/>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryComplexes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryComplexes.xsd
new file mode 100755
index 0000000..de4f945
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryComplexes.xsd
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:geometryComplexes:3.2.1">geometryComplexes.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 12.2.
+Geometric complexes (i.e. instances of gml:GeometricComplexType) are closed collections of geometric primitives, i.e. they will contain their boundaries. 
+A geometric complex (gml:GeometricComplex) is defined by ISO 19107:2003, 6.6.1 as "a set of primitive geometric objects (in a common coordinate system) whose interiors are disjoint. Further, if a primitive is in a geometric complex, then there exists a set of primitives in that complex whose point-wise union is the boundary of this first primitive."
+A geometric composite (gml:CompositeCurve, gml:CompositeSurface and gml:CompositeSolid) represents a geometric complex with an underlying core geometry that is isomorphic to a primitive, i.e. it can be viewed as a primitive and as a complex. See ISO 19107:2003, 6.1 and 6.6.3 for more details on the nature of composite geometries.
+Geometric complexes and composites are intended to be used in application schemas where the sharing of geometry is important.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<complexType name="GeometricComplexType">
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<sequence>
+					<element name="element" type="gml:GeometricPrimitivePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="GeometricComplex" type="gml:GeometricComplexType" substitutionGroup="gml:AbstractGeometry"/>
+	<complexType name="GeometricComplexPropertyType">
+		<annotation>
+			<documentation>A property that has a geometric complex as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:GeometricComplex"/>
+				<element ref="gml:CompositeCurve"/>
+				<element ref="gml:CompositeSurface"/>
+				<element ref="gml:CompositeSolid"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="CompositeCurveType">
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:curveMember" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="CompositeCurve" type="gml:CompositeCurveType" substitutionGroup="gml:AbstractCurve">
+		<annotation>
+			<documentation>A gml:CompositeCurve is represented by a sequence of (orientable) curves such that each curve in the sequence terminates at the start point of the subsequent curve in the list. 
+curveMember references or contains inline one curve in the composite curve. 
+The curves are contiguous, the collection of curves is ordered. Therefore, if provided, the aggregationType attribute shall have the value "sequence".</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompositeSurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:surfaceMember" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="CompositeSurface" type="gml:CompositeSurfaceType" substitutionGroup="gml:AbstractSurface">
+		<annotation>
+			<documentation>A gml:CompositeSurface is represented by a set of orientable surfaces. It is geometry type with all the geometric properties of a (primitive) surface. Essentially, a composite surface is a collection of surfaces that join in pairs on common boundary curves and which, when considered as a whole, form a single surface.
+surfaceMember references or contains inline one surface in the composite surface. 
+The surfaces are contiguous.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompositeSolidType">
+		<complexContent>
+			<extension base="gml:AbstractSolidType">
+				<sequence>
+					<element ref="gml:solidMember" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="CompositeSolid" type="gml:CompositeSolidType" substitutionGroup="gml:AbstractSolid">
+		<annotation>
+			<documentation>gml:CompositeSolid implements ISO 19107 GM_CompositeSolid (see ISO 19107:2003, 6.6.7) as specified in D.2.3.6. 
+A gml:CompositeSolid is represented by a set of orientable surfaces. It is a geometry type with all the geometric properties of a (primitive) solid. Essentially, a composite solid is a collection of solids that join in pairs on common boundary surfaces and which, when considered as a whole, form a single solid. 
+solidMember references or contains one solid in the composite solid. The solids are contiguous.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryPrimitives.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryPrimitives.xsd
new file mode 100755
index 0000000..9cbd52c
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/geometryPrimitives.xsd
@@ -0,0 +1,846 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:geometryPrimitives:3.2.1">geometryPrimitives.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 11.
+Beside the "simple" geometric primitives specified in the previous Clause, this Clause specifies additional primitives to describe real world situations which require a more expressive geometry model.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic2d.xsd"/>
+	<complexType name="CurveType">
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:segments"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Curve" type="gml:CurveType" substitutionGroup="gml:AbstractCurve">
+		<annotation>
+			<documentation>A curve is a 1-dimensional primitive. Curves are continuous, connected, and have a measurable length in terms of the coordinate system. 
+A curve is composed of one or more curve segments. Each curve segment within a curve may be defined using a different interpolation method. The curve segments are connected to one another, with the end point of each segment except the last being the start point of the next segment in the segment list.
+The orientation of the curve is positive.
+The element segments encapsulates the segments of the curve.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OrientableCurveType">
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:baseCurve"/>
+				</sequence>
+				<attribute name="orientation" type="gml:SignType" default="+"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="baseCurve" type="gml:CurvePropertyType">
+		<annotation>
+			<documentation>The property baseCurve references or contains the base curve, i.e. it either references the base curve via the XLink-attributes or contains the curve element. A curve element is any element which is substitutable for AbstractCurve. The base curve has positive orientation.</documentation>
+		</annotation>
+	</element>
+	<element name="OrientableCurve" type="gml:OrientableCurveType" substitutionGroup="gml:AbstractCurve">
+		<annotation>
+			<documentation>OrientableCurve consists of a curve and an orientation. If the orientation is "+", then the OrientableCurve is identical to the baseCurve. If the orientation is "-", then the OrientableCurve is related to another AbstractCurve with a parameterization that reverses the sense of the curve traversal.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractCurveSegmentType" abstract="true">
+		<attribute name="numDerivativesAtStart" type="integer" default="0"/>
+		<attribute name="numDerivativesAtEnd" type="integer" default="0"/>
+		<attribute name="numDerivativeInterior" type="integer" default="0"/>
+	</complexType>
+	<element name="AbstractCurveSegment" type="gml:AbstractCurveSegmentType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>A curve segment defines a homogeneous segment of a curve.
+The attributes numDerivativesAtStart, numDerivativesAtEnd and numDerivativesInterior specify the type of continuity as specified in ISO 19107:2003, 6.4.9.3.
+The AbstractCurveSegment element is the abstract head of the substituition group for all curve segment elements, i.e. continuous segments of the same interpolation mechanism.
+All curve segments shall have an attribute interpolation with type gml:CurveInterpolationType specifying the curve interpolation mechanism used for this segment. This mechanism uses the control points and control parameters to determine the position of this curve segment.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CurveSegmentArrayPropertyType">
+		<annotation>
+			<documentation>gml:CurveSegmentArrayPropertyType is a container for an array of curve segments.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractCurveSegment"/>
+		</sequence>
+	</complexType>
+	<element name="segments" type="gml:CurveSegmentArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curve segments. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<simpleType name="CurveInterpolationType">
+		<annotation>
+			<documentation>gml:CurveInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an application schema.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="linear"/>
+			<enumeration value="geodesic"/>
+			<enumeration value="circularArc3Points"/>
+			<enumeration value="circularArc2PointWithBulge"/>
+			<enumeration value="circularArcCenterPointWithRadius"/>
+			<enumeration value="elliptical"/>
+			<enumeration value="clothoid"/>
+			<enumeration value="conic"/>
+			<enumeration value="polynomialSpline"/>
+			<enumeration value="cubicSpline"/>
+			<enumeration value="rationalSpline"/>
+		</restriction>
+	</simpleType>
+	<complexType name="LineStringSegmentType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="LineStringSegment" type="gml:LineStringSegmentType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>A LineStringSegment is a curve segment that is defined by two or more control points including the start and end point, with linear interpolation between them.
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcStringType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="3" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="numArc" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ArcString" type="gml:ArcStringType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>An ArcString is a curve segment that uses three-point circular arc interpolation ("circularArc3Points"). The number of arcs in the arc string may be explicitly stated in the attribute numArc. The number of control points in the arc string shall be 2 * numArc + 1.
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcType">
+		<complexContent>
+			<restriction base="gml:ArcStringType">
+				<sequence>
+					<choice>
+						<choice minOccurs="3" maxOccurs="3">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+				<attribute name="numArc" type="integer" fixed="1"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="Arc" type="gml:ArcType" substitutionGroup="gml:ArcString">
+		<annotation>
+			<documentation>An Arc is an arc string with only one arc unit, i.e. three control points including the start and end point. As arc is an arc string consisting of a single arc, the attribute "numArc" is fixed to "1".</documentation>
+		</annotation>
+	</element>
+	<complexType name="CircleType">
+		<complexContent>
+			<extension base="gml:ArcType"/>
+		</complexContent>
+	</complexType>
+	<element name="Circle" type="gml:CircleType" substitutionGroup="gml:Arc">
+		<annotation>
+			<documentation>A Circle is an arc whose ends coincide to form a simple closed loop. The three control points shall be distinct non-co-linear points for the circle to be unambiguously defined. The arc is simply extended past the third control point until the first control point is encountered.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcStringByBulgeType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="bulge" type="double" maxOccurs="unbounded"/>
+					<element name="normal" type="gml:VectorType" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc2PointWithBulge"/>
+				<attribute name="numArc" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ArcStringByBulge" type="gml:ArcStringByBulgeType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>This variant of the arc computes the mid points of the arcs instead of storing the coordinates directly. The control point sequence consists of the start and end points of each arc plus the bulge (see ISO 19107:2003, 6.4.17.2). The normal is a vector normal (perpendicular) to the chord of the arc (see ISO 19107:2003, 6.4.17.4).
+The interpolation is fixed as "circularArc2PointWithBulge".
+The number of arcs in the arc string may be explicitly stated in the attribute numArc. The number of control points in the arc string shall be numArc + 1.
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcByBulgeType">
+		<complexContent>
+			<restriction base="gml:ArcStringByBulgeType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="2">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="bulge" type="double"/>
+					<element name="normal" type="gml:VectorType"/>
+				</sequence>
+				<attribute name="numArc" type="integer" fixed="1"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="ArcByBulge" type="gml:ArcByBulgeType" substitutionGroup="gml:ArcStringByBulge">
+		<annotation>
+			<documentation>An ArcByBulge is an arc string with only one arc unit, i.e. two control points, one bulge and one normal vector.
+As arc is an arc string consisting of a single arc, the attribute "numArc" is fixed to "1".</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcByCenterPointType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice>
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="radius" type="gml:LengthType"/>
+					<element name="startAngle" type="gml:AngleType" minOccurs="0"/>
+					<element name="endAngle" type="gml:AngleType" minOccurs="0"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArcCenterPointWithRadius"/>
+				<attribute name="numArc" type="integer" use="required" fixed="1"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ArcByCenterPoint" type="gml:ArcByCenterPointType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>This variant of the arc requires that the points on the arc shall be computed instead of storing the coordinates directly. The single control point is the center point of the arc plus the radius and the bearing at start and end. This representation can be used only in 2D.
+The element radius specifies the radius of the arc.
+The element startAngle specifies the bearing of the arc at the start.
+The element endAngle specifies the bearing of the arc at the end.
+The interpolation is fixed as "circularArcCenterPointWithRadius".
+Since this type describes always a single arc, the attribute "numArc" is fixed to "1".
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CircleByCenterPointType">
+		<complexContent>
+			<restriction base="gml:ArcByCenterPointType">
+				<sequence>
+					<choice>
+						<choice>
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="radius" type="gml:LengthType"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="CircleByCenterPoint" type="gml:CircleByCenterPointType" substitutionGroup="gml:ArcByCenterPoint">
+		<annotation>
+			<documentation>A gml:CircleByCenterPoint is an gml:ArcByCenterPoint with identical start and end angle to form a full circle. Again, this representation can be used only in 2D.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CubicSplineType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="vectorAtStart" type="gml:VectorType"/>
+					<element name="vectorAtEnd" type="gml:VectorType"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="cubicSpline"/>
+				<attribute name="degree" type="integer" fixed="3"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="CubicSpline" type="gml:CubicSplineType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>The number of control points shall be at least three.
+vectorAtStart is the unit tangent vector at the start point of the spline. vectorAtEnd is the unit tangent vector at the end point of the spline. Only the direction of the vectors shall be used to determine the shape of the cubic spline, not their length.
+interpolation is fixed as "cubicSpline".
+degree shall be the degree of the polynomial used for the interpolation in this spline. Therefore the degree for a cubic spline is fixed to "3".
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="BSplineType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="0" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="degree" type="nonNegativeInteger"/>
+					<element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" default="polynomialSpline"/>
+				<attribute name="isPolynomial" type="boolean"/>
+				<attribute name="knotType" type="gml:KnotTypesType"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="BSpline" type="gml:BSplineType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>A B-Spline is a piecewise parametric polynomial or rational curve described in terms of control points and basis functions as specified in ISO 19107:2003, 6.4.30. Therefore, interpolation may be either "polynomialSpline" or "rationalSpline" depending on the interpolation type; default is "polynomialSpline".
+degree shall be the degree of the polynomial used for interpolation in this spline.
+knot shall be the sequence of distinct knots used to define the spline basis functions (see ISO 19107:2003, 6.4.26.2).
+The attribute isPolynomial shall be set to "true" if this is a polynomial spline (see ISO 19107:2003, 6.4.30.5).
+The attribute knotType shall provide the type of knot distribution used in defining this spline (see ISO 19107:2003, 6.4.30.4).
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="KnotType">
+		<sequence>
+			<element name="value" type="double"/>
+			<element name="multiplicity" type="nonNegativeInteger"/>
+			<element name="weight" type="double"/>
+		</sequence>
+	</complexType>
+	<complexType name="KnotPropertyType">
+		<annotation>
+			<documentation>gml:KnotPropertyType encapsulates a knot to use it in a geometric type.</documentation>
+		</annotation>
+		<sequence>
+			<element name="Knot" type="gml:KnotType">
+				<annotation>
+					<documentation>A knot is a breakpoint on a piecewise spline curve.
+value is the value of the parameter at the knot of the spline (see ISO 19107:2003, 6.4.24.2).
+multiplicity is the multiplicity of this knot used in the definition of the spline (with the same weight).
+weight is the value of the averaging weight used for this knot of the spline.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<simpleType name="KnotTypesType">
+		<annotation>
+			<documentation>This enumeration type specifies values for the knots' type (see ISO 19107:2003, 6.4.25).</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="uniform"/>
+			<enumeration value="quasiUniform"/>
+			<enumeration value="piecewiseBezier"/>
+		</restriction>
+	</simpleType>
+	<complexType name="BezierType">
+		<complexContent>
+			<restriction base="gml:BSplineType">
+				<sequence>
+					<choice>
+						<choice minOccurs="0" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="degree" type="nonNegativeInteger"/>
+					<element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="2"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="polynomialSpline"/>
+				<attribute name="isPolynomial" type="boolean" fixed="true"/>
+				<attribute name="knotType" type="gml:KnotTypesType" use="prohibited"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="Bezier" type="gml:BezierType" substitutionGroup="gml:BSpline">
+		<annotation>
+			<documentation>Bezier curves are polynomial splines that use Bezier or Bernstein polynomials for interpolation purposes. It is a special case of the B-Spline curve with two knots.
+degree shall be the degree of the polynomial used for interpolation in this spline.
+knot shall be the sequence of distinct knots used to define the spline basis functions.
+interpolation is fixed as "polynomialSpline".
+isPolynomial is fixed as "true".
+knotType is not relevant for Bezier curve segments.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="OffsetCurveType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<element name="offsetBase" type="gml:CurvePropertyType"/>
+					<element name="distance" type="gml:LengthType"/>
+					<element name="refDirection" type="gml:VectorType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="OffsetCurve" type="gml:OffsetCurveType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>An offset curve is a curve at a constant distance from the basis curve. offsetBase is the base curve from which this curve is defined as an offset. distance and refDirection have the same meaning as specified in ISO 19107:2003, 6.4.23.
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AffinePlacementType">
+		<sequence>
+			<element name="location" type="gml:DirectPositionType"/>
+			<element name="refDirection" type="gml:VectorType" maxOccurs="unbounded"/>
+			<element name="inDimension" type="positiveInteger"/>
+			<element name="outDimension" type="positiveInteger"/>
+		</sequence>
+	</complexType>
+	<element name="AffinePlacement" type="gml:AffinePlacementType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>location, refDirection, inDimension and outDimension have the same meaning as specified in ISO 19107:2003, 6.4.21.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ClothoidType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<element name="refLocation">
+						<complexType>
+							<sequence>
+								<element ref="gml:AffinePlacement"/>
+							</sequence>
+						</complexType>
+					</element>
+					<element name="scaleFactor" type="decimal"/>
+					<element name="startParameter" type="double"/>
+					<element name="endParameter" type="double"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="clothoid"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Clothoid" type="gml:ClothoidType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>A clothoid, or Cornu's spiral, is plane curve whose curvature is a fixed function of its length.
+refLocation, startParameter, endParameter and scaleFactor have the same meaning as specified in ISO 19107:2003, 6.4.22.
+interpolation is fixed as "clothoid".
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeodesicStringType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<choice>
+					<element ref="gml:posList"/>
+					<group ref="gml:geometricPositionGroup" minOccurs="2" maxOccurs="unbounded"/>
+				</choice>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="geodesic"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="GeodesicString" type="gml:GeodesicStringType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>A sequence of geodesic segments. 
+The number of control points shall be at least two.
+interpolation is fixed as "geodesic".
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeodesicType">
+		<complexContent>
+			<extension base="gml:GeodesicStringType"/>
+		</complexContent>
+	</complexType>
+	<element name="Geodesic" type="gml:GeodesicType" substitutionGroup="gml:GeodesicString"/>
+	<complexType name="SurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:patches"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Surface" type="gml:SurfaceType" substitutionGroup="gml:AbstractSurface">
+		<annotation>
+			<documentation>A Surface is a 2-dimensional primitive and is composed of one or more surface patches as specified in ISO 19107:2003, 6.3.17.1. The surface patches are connected to one another.
+patches encapsulates the patches of the surface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OrientableSurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:baseSurface"/>
+				</sequence>
+				<attribute name="orientation" type="gml:SignType" default="+"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="baseSurface" type="gml:SurfacePropertyType">
+		<annotation>
+			<documentation>The property baseSurface references or contains the base surface. The property baseSurface either references the base surface via the XLink-attributes or contains the surface element. A surface element is any element which is substitutable for gml:AbstractSurface. The base surface has positive orientation.</documentation>
+		</annotation>
+	</element>
+	<element name="OrientableSurface" type="gml:OrientableSurfaceType" substitutionGroup="gml:AbstractSurface">
+		<annotation>
+			<documentation>OrientableSurface consists of a surface and an orientation. If the orientation is "+", then the OrientableSurface is identical to the baseSurface. If the orientation is "-", then the OrientableSurface is a reference to a gml:AbstractSurface with an up-normal that reverses the direction for this OrientableSurface, the sense of "the top of the surface".</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractSurfacePatchType" abstract="true"/>
+	<element name="AbstractSurfacePatch" type="gml:AbstractSurfacePatchType" abstract="true">
+		<annotation>
+			<documentation>A surface patch defines a homogenuous portion of a surface. 
+The AbstractSurfacePatch element is the abstract head of the substituition group for all surface patch elements describing a continuous portion of a surface.
+All surface patches shall have an attribute interpolation (declared in the types derived from gml:AbstractSurfacePatchType) specifying the interpolation mechanism used for the patch using gml:SurfaceInterpolationType.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SurfacePatchArrayPropertyType">
+		<annotation>
+			<documentation>gml:SurfacePatchArrayPropertyType is a container for a sequence of surface patches.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractSurfacePatch"/>
+		</sequence>
+	</complexType>
+	<element name="patches" type="gml:SurfacePatchArrayPropertyType">
+		<annotation>
+			<documentation>The patches property element contains the sequence of surface patches. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<simpleType name="SurfaceInterpolationType">
+		<annotation>
+			<documentation>gml:SurfaceInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an application schema.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="none"/>
+			<enumeration value="planar"/>
+			<enumeration value="spherical"/>
+			<enumeration value="elliptical"/>
+			<enumeration value="conic"/>
+			<enumeration value="tin"/>
+			<enumeration value="parametricCurve"/>
+			<enumeration value="polynomialSpline"/>
+			<enumeration value="rationalSpline"/>
+			<enumeration value="triangulatedSpline"/>
+		</restriction>
+	</simpleType>
+	<complexType name="PolygonPatchType">
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior" minOccurs="0"/>
+					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="PolygonPatch" type="gml:PolygonPatchType" substitutionGroup="gml:AbstractSurfacePatch">
+		<annotation>
+			<documentation>A gml:PolygonPatch is a surface patch that is defined by a set of boundary curves and an underlying surface to which these curves adhere. The curves shall be coplanar and the polygon uses planar interpolation in its interior. 
+interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TriangleType">
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Triangle" type="gml:TriangleType" substitutionGroup="gml:AbstractSurfacePatch">
+		<annotation>
+			<documentation>gml:Triangle represents a triangle as a surface patch with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring shall be four.
+The ring (element exterior) shall be a gml:LinearRing and shall form a triangle, the first and the last position shall be coincident.
+interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RectangleType">
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Rectangle" type="gml:RectangleType" substitutionGroup="gml:AbstractSurfacePatch">
+		<annotation>
+			<documentation>gml:Rectangle represents a rectangle as a surface patch with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring shall be five.
+The ring (element exterior) shall be a gml:LinearRing and shall form a rectangle; the first and the last position shall be coincident.
+interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RingType">
+		<complexContent>
+			<extension base="gml:AbstractRingType">
+				<sequence>
+					<element ref="gml:curveMember" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Ring" type="gml:RingType" substitutionGroup="gml:AbstractRing">
+		<annotation>
+			<documentation>A ring is used to represent a single connected component of a surface boundary as specified in ISO 19107:2003, 6.3.6.
+Every gml:curveMember references or contains one curve, i.e. any element which is substitutable for gml:AbstractCurve. In the context of a ring, the curves describe the boundary of the surface. The sequence of curves shall be contiguous and connected in a cycle.
+If provided, the aggregationType attribute shall have the value "sequence".</documentation>
+		</annotation>
+	</element>
+	<element name="curveMember" type="gml:CurvePropertyType"/>
+	<complexType name="RingPropertyType">
+		<annotation>
+			<documentation>A property with the content model of gml:RingPropertyType encapsulates a ring to represent a component of a surface boundary.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:Ring"/>
+		</sequence>
+	</complexType>
+	<group name="PointGrid">
+		<annotation>
+			<documentation>A gml:PointGrid group contains or references points or positions which are organised into sequences or grids. All rows shall have the same number of positions (columns).</documentation>
+		</annotation>
+		<sequence>
+			<element name="rows">
+				<complexType>
+					<sequence>
+						<element name="Row" maxOccurs="unbounded">
+							<complexType>
+								<group ref="gml:geometricPositionListGroup"/>
+							</complexType>
+						</element>
+					</sequence>
+				</complexType>
+			</element>
+		</sequence>
+	</group>
+	<complexType name="AbstractParametricCurveSurfaceType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractParametricCurveSurface" type="gml:AbstractParametricCurveSurfaceType" abstract="true" substitutionGroup="gml:AbstractSurfacePatch">
+		<annotation>
+			<documentation>The element provides a substitution group head for the surface patches based on parametric curves. All properties are specified in the derived subtypes. All derived subtypes shall conform to the constraints specified in ISO 19107:2003, 6.4.40.
+If provided, the aggregationType attribute shall have the value "set".</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGriddedSurfaceType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractParametricCurveSurfaceType">
+				<sequence>
+					<group ref="gml:PointGrid"/>
+				</sequence>
+				<attribute name="rows" type="integer"/>
+				<attribute name="columns" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractGriddedSurface" type="gml:AbstractGriddedSurfaceType" abstract="true" substitutionGroup="gml:AbstractParametricCurveSurface">
+		<annotation>
+			<documentation>if provided, rows gives the number of rows, columns the number of columns in the parameter grid. The parameter grid is represented by an instance of the gml:PointGrid group.
+The element provides a substitution group head for the surface patches based on a grid. All derived subtypes shall conform to the constraints specified in ISO 19107:2003, 6.4.41.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ConeType">
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Cone" type="gml:ConeType" substitutionGroup="gml:AbstractGriddedSurface"/>
+	<complexType name="CylinderType">
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Cylinder" type="gml:CylinderType" substitutionGroup="gml:AbstractGriddedSurface"/>
+	<complexType name="SphereType">
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Sphere" type="gml:SphereType" substitutionGroup="gml:AbstractGriddedSurface"/>
+	<element name="PolyhedralSurface" type="gml:SurfaceType" substitutionGroup="gml:Surface">
+		<annotation>
+			<documentation>A polyhedral surface is a surface composed of polygon patches connected along their common boundary curves. This differs from the surface type only in the restriction on the types of surface patches acceptable.
+polygonPatches encapsulates the polygon patches of the polyhedral surface.</documentation>
+		</annotation>
+	</element>
+	<element name="TriangulatedSurface" type="gml:SurfaceType" substitutionGroup="gml:Surface">
+		<annotation>
+			<documentation>A triangulated surface is a polyhedral surface that is composed only of triangles. There is no restriction on how the triangulation is derived.
+trianglePatches encapsulates the triangles of the triangulated surface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TinType">
+		<complexContent>
+			<extension base="gml:SurfaceType">
+				<sequence>
+					<element name="stopLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="breakLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="maxLength" type="gml:LengthType"/>
+					<element name="controlPoint">
+						<complexType>
+							<choice>
+								<element ref="gml:posList"/>
+								<group ref="gml:geometricPositionGroup" minOccurs="3" maxOccurs="unbounded"/>
+							</choice>
+						</complexType>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Tin" type="gml:TinType" substitutionGroup="gml:TriangulatedSurface">
+		<annotation>
+			<documentation>A tin is a triangulated surface that uses the Delauny algorithm or a similar algorithm complemented with consideration of stoplines (stopLines), breaklines (breakLines), and maximum length of triangle sides (maxLength). controlPoint shall contain a set of the positions (three or more) used as posts for this TIN (corners of the triangles in the TIN). See ISO 19107:2003, 6.4.39 for details.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LineStringSegmentArrayPropertyType">
+		<annotation>
+			<documentation>gml:LineStringSegmentArrayPropertyType provides a container for line strings.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:LineStringSegment"/>
+		</sequence>
+	</complexType>
+	<complexType name="AbstractSolidType">
+		<annotation>
+			<documentation>gml:AbstractSolidType is an abstraction of a solid to support the different levels of complexity. The solid may always be viewed as a geometric primitive, i.e. is contiguous.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractSolid" type="gml:AbstractSolidType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive">
+		<annotation>
+			<documentation>The AbstractSolid element is the abstract head of the substituition group for all (continuous) solid elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SolidPropertyType">
+		<annotation>
+			<documentation>A property that has a solid as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="solidProperty" type="gml:SolidPropertyType">
+		<annotation>
+			<documentation>This property element either references a solid via the XLink-attributes or contains the solid element. solidProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractSolid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SolidArrayPropertyType">
+		<annotation>
+			<documentation>gml:SolidArrayPropertyType is a container for an array of solids. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="SolidType">
+		<complexContent>
+			<extension base="gml:AbstractSolidType">
+				<sequence>
+					<element name="exterior" type="gml:ShellPropertyType" minOccurs="0"/>
+					<element name="interior" type="gml:ShellPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Solid" type="gml:SolidType" substitutionGroup="gml:AbstractSolid">
+		<annotation>
+			<documentation>A solid is the basis for 3-dimensional geometry. The extent of a solid is defined by the boundary surfaces as specified in ISO 19107:2003, 6.3.18. exterior specifies the outer boundary, interior the inner boundary of the solid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ShellType">
+		<sequence>
+			<element ref="gml:surfaceMember" maxOccurs="unbounded"/>
+		</sequence>
+		<attributeGroup ref="gml:AggregationAttributeGroup"/>
+	</complexType>
+	<element name="Shell" type="gml:ShellType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>A shell is used to represent a single connected component of a solid boundary as specified in ISO 19107:2003, 6.3.8.
+Every gml:surfaceMember references or contains one surface, i.e. any element which is substitutable for gml:AbstractSurface. In the context of a shell, the surfaces describe the boundary of the solid. 
+If provided, the aggregationType attribute shall have the value "set".
+</documentation>
+		</annotation>
+	</element>
+	<element name="surfaceMember" type="gml:SurfacePropertyType">
+		<annotation>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. A surface element is any element, which is substitutable for gml:AbstractSurface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ShellPropertyType">
+		<annotation>
+			<documentation>A property with the content model of gml:ShellPropertyType encapsulates a shell to represent a component of a solid boundary.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:Shell"/>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/gml.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/gml.xsd
new file mode 100755
index 0000000..b319a19
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/gml.xsd
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:gml:3.2.1">gml.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<include schemaLocation="dynamicFeature.xsd"/>
+	<include schemaLocation="topology.xsd"/>
+	<include schemaLocation="coverage.xsd"/>
+	<include schemaLocation="coordinateReferenceSystems.xsd"/>
+	<include schemaLocation="observation.xsd"/>
+	<include schemaLocation="temporalReferenceSystems.xsd"/>
+	<include schemaLocation="deprecatedTypes.xsd"/>
+	<!-- ====================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/gmlBase.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/gmlBase.xsd
new file mode 100755
index 0000000..ec81080
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/gmlBase.xsd
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:gmlBase:3.2.1">gmlBase.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 7.2.
+The gmlBase schema components establish the GML model and syntax, in particular
+-	a root XML type from which XML types for all GML objects should be derived,
+-	a pattern and components for GML properties,
+-	patterns for collections and arrays, and components for generic collections and arrays,
+-	components for associating metadata with GML objects,
+-	components for constructing definitions and dictionaries.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="basicTypes.xsd"/>
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<element name="AbstractObject" abstract="true">
+		<annotation>
+			<documentation>This element has no type defined, and is therefore implicitly (according to the rules of W3C XML Schema) an XML Schema anyType. It is used as the head of an XML Schema substitution group which unifies complex content and certain simple content elements used for datatypes in GML, including the gml:AbstractGML substitution group.</documentation>
+		</annotation>
+	</element>
+	<element name="AbstractGML" type="gml:AbstractGMLType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>The abstract element gml:AbstractGML is "any GML object having identity".   It acts as the head of an XML Schema substitution group, which may include any element which is a GML feature, or other object, with identity.  This is used as a variable in content models in GML core and application schemas.  It is effectively an abstract superclass for all GML objects.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGMLType" abstract="true">
+		<sequence>
+			<group ref="gml:StandardObjectProperties"/>
+		</sequence>
+		<attribute ref="gml:id" use="required"/>
+	</complexType>
+	<group name="StandardObjectProperties">
+		<sequence>
+			<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+			<element ref="gml:description" minOccurs="0"/>
+			<element ref="gml:descriptionReference" minOccurs="0"/>
+			<element ref="gml:identifier" minOccurs="0"/>
+			<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</group>
+	<attributeGroup name="AssociationAttributeGroup">
+		<annotation>
+			<documentation>XLink components are the standard method to support hypertext referencing in XML. An XML Schema attribute group, gml:AssociationAttributeGroup, is provided to support the use of Xlinks as the method for indicating the value of a property by reference in a uniform manner in GML.</documentation>
+		</annotation>
+		<attributeGroup ref="xlink:simpleAttrs"/>
+		<attribute name="nilReason" type="gml:NilReasonType"/>
+		<attribute ref="gml:remoteSchema">
+			<annotation>
+				<appinfo>deprecated</appinfo>
+			</annotation>
+		</attribute>
+	</attributeGroup>
+	<element name="abstractAssociationRole" type="gml:AssociationRoleType" abstract="true">
+		<annotation>
+			<documentation>Applying this pattern shall restrict the multiplicity of objects in a property element using this content model to exactly one. An instance of this type shall contain an element representing an object, or serve as a pointer to a remote object.
+Applying the pattern to define an application schema specific property type allows to restrict
+-	the inline object to specified object types, 
+-	the encoding to "by-reference only" (see 7.2.3.7),
+-	the encoding to "inline only" (see 7.2.3.8).</documentation>
+		</annotation>
+	</element>
+	<complexType name="AssociationRoleType">
+		<sequence minOccurs="0">
+			<any namespace="##any"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<attributeGroup name="OwnershipAttributeGroup">
+		<annotation>
+			<documentation>Encoding a GML property inline vs. by-reference shall not imply anything about the "ownership" of the contained or referenced GML Object, i.e. the encoding style shall not imply any "deep-copy" or "deep-delete" semantics. To express ownership over the contained or referenced GML Object, the gml:OwnershipAttributeGroup attribute group may be added to object-valued property elements. If the attribute group is not part of the content model of such a property element, then  [...]
+When the value of the owns attribute is "true", the existence of inline or referenced object(s) depends upon the existence of the parent object.</documentation>
+		</annotation>
+		<attribute name="owns" type="boolean" default="false"/>
+	</attributeGroup>
+	<element name="abstractStrictAssociationRole" type="gml:AssociationRoleType" abstract="true">
+		<annotation>
+			<documentation>This element shows how an element 
+	declaration may include a Schematron constraint to limit the property to act 
+	in either inline or by-reference mode, but not both.</documentation>
+		</annotation>
+	</element>
+	<element name="abstractReference" type="gml:ReferenceType" abstract="true">
+		<annotation>
+			<documentation>gml:abstractReference may be used as the head of a subtitution group of more specific elements providing a value by-reference.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ReferenceType">
+		<annotation>
+			<documentation>gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a "by-reference only" encoding.</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="abstractInlineProperty" type="gml:InlinePropertyType" abstract="true">
+		<annotation>
+			<documentation>gml:abstractInlineProperty may be used as the head of a subtitution group of more specific elements providing a value inline.</documentation>
+		</annotation>
+	</element>
+	<complexType name="InlinePropertyType">
+		<sequence>
+			<any namespace="##any"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="reversePropertyName" type="string">
+		<annotation>
+			<documentation>If the value of an object property is another object and that object contains also a property for the association between the two objects, then this name of the reverse property may be encoded in a gml:reversePropertyName element in an appinfo annotation of the property element to document the constraint between the two properties. The value of the element shall contain the qualified name of the property element.</documentation>
+		</annotation>
+	</element>
+	<element name="description" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property.</documentation>
+		</annotation>
+	</element>
+	<element name="descriptionReference" type="gml:ReferenceType">
+		<annotation>
+			<documentation>The value of this property is a remote text description of the object. The xlink:href attribute of the gml:descriptionReference property references the external description.</documentation>
+		</annotation>
+	</element>
+	<element name="name" type="gml:CodeType">
+		<annotation>
+			<documentation>The gml:name property provides a label or identifier for the object, commonly a descriptive name. An object may have several names, typically assigned by different authorities. gml:name uses the gml:CodeType content model.  The authority for a name is indicated by the value of its (optional) codeSpace attribute.  The name may or may not be unique, as determined by the rules of the organization responsible for the codeSpace.  In common usage there will be one name per au [...]
+		</annotation>
+	</element>
+	<element name="identifier" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers.</documentation>
+		</annotation>
+	</element>
+	<attribute name="id" type="ID">
+		<annotation>
+			<documentation>The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs.</documentation>
+		</annotation>
+	</attribute>
+	<complexType name="AbstractMemberType" abstract="true">
+		<annotation>
+			<documentation>To create a collection of GML Objects that are not all features, a property type shall be derived by extension from gml:AbstractMemberType.
+This abstract property type is intended to be used only in object types where software shall be able to identify that an instance of such an object type is to be interpreted as a collection of objects.
+By default, this abstract property type does not imply any ownership of the objects in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of an object in the collection. A collection shall not own an object already owned by another object.
+</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<attributeGroup name="AggregationAttributeGroup">
+		<annotation>
+			<documentation>A GML Object Collection is any GML Object with a property element in its content model whose content model is derived by extension from gml:AbstractMemberType.
+In addition, the complex type describing the content model of the GML Object Collection may also include a reference to the attribute group gml:AggregationAttributeGroup to provide additional information about the semantics of the object collection.  This information may be used by applications to group GML objects, and optionally to order and index them.
+The allowed values for the aggregationType attribute are defined by gml:AggregationType. See 8.4 of ISO/IEC 11404:1996 for the meaning of the values in the enumeration.</documentation>
+		</annotation>
+		<attribute name="aggregationType" type="gml:AggregationType"/>
+	</attributeGroup>
+	<simpleType name="AggregationType" final="#all">
+		<restriction base="string">
+			<enumeration value="set"/>
+			<enumeration value="bag"/>
+			<enumeration value="sequence"/>
+			<enumeration value="array"/>
+			<enumeration value="record"/>
+			<enumeration value="table"/>
+		</restriction>
+	</simpleType>
+	<complexType name="AbstractMetadataPropertyType" abstract="true">
+		<annotation>
+			<documentation>To associate metadata described by any XML Schema with a GML object, a property element shall be defined whose content model is derived by extension from gml:AbstractMetadataPropertyType. 
+The value of such a property shall be metadata. The content model of such a property type, i.e. the metadata application schema shall be specified by the GML Application Schema.
+By default, this abstract property type does not imply any ownership of the metadata. The owns attribute of gml:OwnershipAttributeGroup may be used on a metadata property element instance to assert ownership of the metadata. 
+If metadata following the conceptual model of ISO 19115 is to be encoded in a GML document, the corresponding Implementation Specification specified in ISO/TS 19139 shall be used to encode the metadata information.
+</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="targetElement" type="string"/>
+	<element name="associationName" type="string"/>
+	<element name="defaultCodeSpace" type="anyURI"/>
+	<element name="gmlProfileSchema" type="anyURI"/>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/grids.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/grids.xsd
new file mode 100755
index 0000000..7592e0e
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/grids.xsd
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:grids:3.2.1">grids.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 20.2.
+An implicit description of geometry is one in which the items of the geometry do not explicitly appear in the encoding.  Instead, a compact notation records a set of parameters, and a set of objects may be generated using a rule with these parameters.  This Clause provides grid geometries that are used in the description of gridded coverages and other applications.
+In GML two grid structures are defined, namely gml:Grid and gml:RectifiedGrid.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<element name="Grid" type="gml:GridType" substitutionGroup="gml:AbstractImplicitGeometry">
+		<annotation>
+			<documentation>The gml:Grid implicitly defines an unrectified grid, which is a network composed of two or more sets of curves in which the members of each set intersect the members of the other sets in an algorithmic way.  The region of interest within the grid is given in terms of its gml:limits, being the grid coordinates of  diagonally opposed corners of a rectangular region.  gml:axisLabels is provided with a list of labels of the axes of the grid (gml:axisName has been deprecated [...]
+The gml:limits element contains a single gml:GridEnvelope. The gml:low and gml:high property elements of the envelope are each integerLists, which are coordinate tuples, the coordinates being measured as offsets from the origin of the grid along each axis, of the diagonally opposing corners of a "rectangular" region of interest.</documentation>
+		</annotation>
+	</element>
+	<element name="AbstractImplicitGeometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:AbstractGeometry"/>
+	<complexType name="GridType">
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<sequence>
+					<element name="limits" type="gml:GridLimitsType"/>
+					<choice>
+						<element name="axisLabels" type="gml:NCNameList"/>
+						<element name="axisName" type="string" maxOccurs="unbounded"/>
+					</choice>
+				</sequence>
+				<attribute name="dimension" type="positiveInteger" use="required"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="GridLimitsType">
+		<sequence>
+			<element name="GridEnvelope" type="gml:GridEnvelopeType"/>
+		</sequence>
+	</complexType>
+	<complexType name="GridEnvelopeType">
+		<sequence>
+			<element name="low" type="gml:integerList"/>
+			<element name="high" type="gml:integerList"/>
+		</sequence>
+	</complexType>
+	<element name="RectifiedGrid" type="gml:RectifiedGridType" substitutionGroup="gml:Grid">
+		<annotation>
+			<documentation>A rectified grid is a grid for which there is an affine transformation between the grid coordinates and the coordinates of an external coordinate reference system. It is defined by specifying the position (in some geometric space) of the grid "origin" and of the vectors that specify the post locations.
+Note that the grid limits (post indexes) and axis name properties are inherited from gml:GridType and that gml:RectifiedGrid adds a gml:origin property (contains or references a gml:Point) and a set of gml:offsetVector properties.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RectifiedGridType">
+		<complexContent>
+			<extension base="gml:GridType">
+				<sequence>
+					<element name="origin" type="gml:PointPropertyType"/>
+					<element name="offsetVector" type="gml:VectorType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/measures.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/measures.xsd
new file mode 100755
index 0000000..c3a91fb
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/measures.xsd
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xml:lang="en" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:measures:3.2.1">measures.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 17.3.
+gml:MeasureType is defined in the basicTypes schema.  The measure types defined here correspond with a set of convenience measure types described in ISO/TS 19103.  The XML implementation is based on the XML Schema simple type "double" which supports both decimal and scientific notation, and includes an XML attribute "uom" which refers to the units of measure for the value.  Note that, there is no requirement to store values using any particular format, and applications receiving elements [...]
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="units.xsd"/>
+	<element name="measure" type="gml:MeasureType">
+		<annotation>
+			<documentation>The value of a physical quantity, together with its unit.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LengthType">
+		<annotation>
+			<documentation>This is a prototypical definition for a specific measure type defined as a vacuous extension (i.e. aliases) of gml:MeasureType. In this case, the content model supports the description of a length (or distance) quantity, with its units. The unit of measure referenced by uom shall be suitable for a length, such as metres or feet.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="ScaleType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="TimeType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="GridLengthType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="AreaType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="VolumeType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="SpeedType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="AngleType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<element name="angle" type="gml:AngleType">
+		<annotation>
+			<documentation>The gml:angle property element is used to record the value of an angle quantity as a single number, with its units.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/observation.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/observation.xsd
new file mode 100755
index 0000000..944c989
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/observation.xsd
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:observation:3.2.1">observation.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 19.
+A GML observation models the act of observing, often with a camera, a person or some form of instrument.  An observation feature describes the "metadata" associated with an information capture event, together with a value for the result of the observation.  This covers a broad range of cases, from a tourist photo (not the photo but the act of taking the photo), to images acquired by space borne sensors or the measurement of a temperature 5 meters below the surfaces of a lake.
+The basic structures introduced in this schema are intended to serve as the foundation for more comprehensive schemas for scientific, technical and engineering measurement schemas.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="direction.xsd"/>
+	<include schemaLocation="valueObjects.xsd"/>
+	<element name="Observation" type="gml:ObservationType" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<documentation>The content model is a straightforward extension of gml:AbstractFeatureType; it automatically has the gml:identifier, gml:description, gml:descriptionReference, gml:name, and gml:boundedBy properties. 
+The gml:validTime element describes the time of the observation. Note that this may be a time instant or a time period.
+The gml:using property contains or references a description of a sensor, instrument or procedure used for the observation.
+The gml:target property contains or references the specimen, region or station which is the object of the observation. This property is particularly useful for remote observations, such as photographs, where a generic location property might apply to the location of the camera or the location of the field of view, and thus may be ambiguous.  
+The gml:subject element is provided as a convenient synonym for gml:target. This is the term commonly used in phtotography.  
+The gml:resultOf property indicates the result of the observation.  The value may be inline, or a reference to a value elsewhere.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="ObservationType">
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:validTime"/>
+					<element ref="gml:using" minOccurs="0"/>
+					<element ref="gml:target" minOccurs="0"/>
+					<element ref="gml:resultOf"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="using" type="gml:ProcedurePropertyType"/>
+	<complexType name="ProcedurePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractFeature"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="target" type="gml:TargetPropertyType"/>
+	<element name="subject" type="gml:TargetPropertyType" substitutionGroup="gml:target"/>
+	<complexType name="TargetPropertyType">
+		<choice minOccurs="0">
+			<element ref="gml:AbstractFeature"/>
+			<element ref="gml:AbstractGeometry"/>
+		</choice>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="resultOf" type="gml:ResultType"/>
+	<complexType name="ResultType">
+		<sequence minOccurs="0">
+			<any namespace="##any"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="DirectedObservation" type="gml:DirectedObservationType" substitutionGroup="gml:Observation">
+		<annotation>
+			<documentation>A gml:DirectedObservation is the same as an observation except that it adds an additional gml:direction property. This is the direction in which the observation was acquired. Clearly this applies only to certain types of observations such as visual observations by people, or observations obtained from terrestrial cameras.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectedObservationType">
+		<complexContent>
+			<extension base="gml:ObservationType">
+				<sequence>
+					<element ref="gml:direction"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="DirectedObservationAtDistance" type="gml:DirectedObservationAtDistanceType" substitutionGroup="gml:DirectedObservation">
+		<annotation>
+			<documentation>gml:DirectedObservationAtDistance adds an additional distance property. This is the distance from the observer to the subject of the observation. Clearly this applies only to certain types of observations such as visual observations by people, or observations obtained from terrestrial cameras.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectedObservationAtDistanceType">
+		<complexContent>
+			<extension base="gml:DirectedObservationType">
+				<sequence>
+					<element name="distance" type="gml:MeasureType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/referenceSystems.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/referenceSystems.xsd
new file mode 100755
index 0000000..fb7e897
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/referenceSystems.xsd
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" xml:lang="en" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:referenceSystems:3.2.1">referenceSystems.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.2.
+The reference systems schema components have two logical parts, which define elements and types for XML encoding of the definitions of:
+-	Identified Object, inherited by the ten types of GML objects used for coordinate reference systems and coordinate operations
+-	High-level part of the definitions of coordinate reference systems
+This schema encodes the Identified Object and Reference System packages of the UML Model for ISO 19111.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="dictionary.xsd"/>
+	<import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
+	<complexType name="IdentifiedObjectType" abstract="true">
+		<annotation>
+			<documentation>gml:IdentifiedObjectType provides identification properties of a CRS-related object. In gml:DefinitionType, the gml:identifier element shall be the primary name by which this object is identified, encoding the "name" attribute in the UML model.
+Zero or more of the gml:name elements can be an unordered set of "identifiers", encoding the "identifier" attribute in the UML model. Each of these gml:name elements can reference elsewhere the object's defining information or be an identifier by which this object can be referenced.
+Zero or more other gml:name elements can be an unordered set of "alias" alternative names by which this CRS related object is identified, encoding the "alias" attributes in the UML model. An object may have several aliases, typically used in different contexts. The context for an alias is indicated by the value of its (optional) codeSpace attribute.
+Any needed version information shall be included in the codeSpace attribute of a gml:identifier and gml:name elements. In this use, the gml:remarks element in the gml:DefinitionType shall contain comments on or information about this object, including data source information.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractCRS" type="gml:AbstractCRSType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:AbstractCRS specifies a coordinate reference system which is usually single but may be compound. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractCRSType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:domainOfValidity" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="domainOfValidity">
+		<annotation>
+			<documentation>The gml:domainOfValidity property implements an association role to an EX_Extent object as encoded in ISO/TS 19139, either referencing or containing the definition of that extent.</documentation>
+		</annotation>
+		<complexType>
+			<sequence minOccurs="0">
+				<element ref="gmd:EX_Extent"/>
+			</sequence>
+			<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</complexType>
+	</element>
+	<element name="scope" type="string">
+		<annotation>
+			<documentation>The gml:scope property provides a description of the usage, or limitations of usage, for which this CRS-related object is valid. If unknown, enter "not known".</documentation>
+		</annotation>
+	</element>
+	<complexType name="CRSPropertyType">
+		<annotation>
+			<documentation>gml:CRSPropertyType is a property type for association roles to a CRS abstract coordinate reference system, either referencing or containing the definition of that CRS.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporal.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporal.xsd
new file mode 100755
index 0000000..11c4ae3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporal.xsd
@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:temporal:3.2.1">temporal.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 15.2.
+The GML temporal schemas include components for describing temporal geometry and topology, temporal reference systems, and the temporal characteristics of geographic data. The model underlying the representation constitutes a profile of the conceptual schema described in ISO 19108. The underlying spatiotemporal model strives to accommodate both feature-level and attribute-level time stamping; basic support for tracking moving objects is also included. 
+Time is measured on two types of scales: interval and ordinal.  An interval scale offers a basis for measuring duration, an ordinal scale provides information only about relative position in time.
+Two other ISO standards are relevant to describing temporal objects:  ISO 8601 describes encodings for time instants and time periods, as text strings with particular structure and punctuation; ISO 11404 provides a detailed description of time intervals as part of a general discussion of language independent datatypes.  
+The temporal schemas cover two interrelated topics and provide basic schema components for representing temporal instants and periods, temporal topology, and reference systems; more specialized schema components defines components used for dynamic features. Instances of temporal geometric types are used as values for the temporal properties of geographic features.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="gmlBase.xsd"/>
+	<element name="AbstractTimeObject" type="gml:AbstractTimeObjectType" abstract="true" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>gml:AbstractTimeObject acts as the head of a substitution group for all temporal primitives and complexes.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeObjectType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTimePrimitive" type="gml:AbstractTimePrimitiveType" abstract="true" substitutionGroup="gml:AbstractTimeObject">
+		<annotation>
+			<documentation>gml:AbstractTimePrimitive acts as the head of a substitution group for geometric and topological temporal primitives.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimePrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType">
+				<sequence>
+					<element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimePrimitivePropertyType">
+		<annotation>
+			<documentation>gml:TimePrimitivePropertyType provides a standard content model for associations between an arbitrary member of the substitution group whose head is gml:AbstractTimePrimitive and another object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractTimePrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="validTime" type="gml:TimePrimitivePropertyType">
+		<annotation>
+			<documentation>gml:validTime is a convenience property element.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RelatedTimeType">
+		<annotation>
+			<documentation>gml:RelatedTimeType provides a content model for indicating the relative position of an arbitrary member of the substitution group whose head is gml:AbstractTimePrimitive. It extends the generic gml:TimePrimitivePropertyType with an XML attribute relativePosition, whose value is selected from the set of 13 temporal relationships identified by Allen (1983)</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:TimePrimitivePropertyType">
+				<attribute name="relativePosition">
+					<simpleType>
+						<restriction base="string">
+							<enumeration value="Before"/>
+							<enumeration value="After"/>
+							<enumeration value="Begins"/>
+							<enumeration value="Ends"/>
+							<enumeration value="During"/>
+							<enumeration value="Equals"/>
+							<enumeration value="Contains"/>
+							<enumeration value="Overlaps"/>
+							<enumeration value="Meets"/>
+							<enumeration value="OverlappedBy"/>
+							<enumeration value="MetBy"/>
+							<enumeration value="BegunBy"/>
+							<enumeration value="EndedBy"/>
+						</restriction>
+					</simpleType>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTimeComplex" type="gml:AbstractTimeComplexType" abstract="true" substitutionGroup="gml:AbstractTimeObject">
+		<annotation>
+			<documentation>gml:AbstractTimeComplex is an aggregation of temporal primitives and acts as the head of a substitution group for temporal complexes.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeComplexType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTimeGeometricPrimitive" type="gml:AbstractTimeGeometricPrimitiveType" abstract="true" substitutionGroup="gml:AbstractTimePrimitive">
+		<annotation>
+			<documentation>gml:TimeGeometricPrimitive acts as the head of a substitution group for geometric temporal primitives.
+A temporal geometry shall be associated with a temporal reference system through the frame attribute that provides a URI reference that identifies a description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default reference system, but others may also be used. The GPS calendar is an alternative reference systems in common use.
+The two geometric primitives in the temporal dimension are the instant and the period. GML components are defined to support these as follows.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeGeometricPrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimePrimitiveType">
+				<attribute name="frame" type="anyURI" default="#ISO-8601"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeInstant" type="gml:TimeInstantType" substitutionGroup="gml:AbstractTimeGeometricPrimitive">
+		<annotation>
+			<documentation>gml:TimeInstant acts as a zero-dimensional geometric primitive that represents an identifiable position in time.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeInstantType" final="#all">
+		<complexContent>
+			<extension base="gml:AbstractTimeGeometricPrimitiveType">
+				<sequence>
+					<element ref="gml:timePosition"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeInstantPropertyType">
+		<annotation>
+			<documentation>gml:TimeInstantPropertyType provides for associating a gml:TimeInstant with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeInstant"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="TimePeriod" type="gml:TimePeriodType" substitutionGroup="gml:AbstractTimeGeometricPrimitive">
+		<annotation>
+			<documentation>gml:TimePeriod acts as a one-dimensional geometric primitive that represents an identifiable extent in time.
+The location in of a gml:TimePeriod is described by the temporal positions of the instants at which it begins and ends. The length of the period is equal to the temporal distance between the two bounding temporal positions. 
+Both beginning and end may be described in terms of their direct position using gml:TimePositionType which is an XML Schema simple content type, or by reference to an indentifiable time instant using gml:TimeInstantPropertyType.
+Alternatively a limit of a gml:TimePeriod may use the conventional GML property model to make a reference to a time instant described elsewhere, or a limit may be indicated as a direct position.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimePeriodType">
+		<complexContent>
+			<extension base="gml:AbstractTimeGeometricPrimitiveType">
+				<sequence>
+					<choice>
+						<element name="beginPosition" type="gml:TimePositionType"/>
+						<element name="begin" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<choice>
+						<element name="endPosition" type="gml:TimePositionType"/>
+						<element name="end" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<group ref="gml:timeLength" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimePeriodPropertyType">
+		<annotation>
+			<documentation>gml:TimePeriodPropertyType provides for associating a gml:TimePeriod with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimePeriod"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="TimePositionType" final="#all">
+		<annotation>
+			<documentation>The method for identifying a temporal position is specific to each temporal reference system.  gml:TimePositionType supports the description of temporal position according to the subtypes described in ISO 19108.
+Values based on calendars and clocks use lexical formats that are based on ISO 8601, as described in XML Schema Part 2:2001. A decimal value may be used with coordinate systems such as GPS time or UNIX time. A URI may be used to provide a reference to some era in an ordinal reference system . 
+In common with many of the components modelled as data types in the ISO 19100 series of International Standards, the corresponding GML component has simple content. However, the content model gml:TimePositionType is defined in several steps.
+Three XML attributes appear on gml:TimePositionType:
+A time value shall be associated with a temporal reference system through the frame attribute that provides a URI reference that identifies a description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default reference system, but others may also be used. Components for describing temporal reference systems are described in 14.4, but it is not required that the reference system be described in this, as the reference may refer to anything that may be  [...]
+For time values using a calendar containing more than one era, the (optional) calendarEraName attribute provides the name of the calendar era.  
+Inexact temporal positions may be expressed using the optional indeterminatePosition attribute.  This takes a value from an enumeration.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:TimePositionUnion">
+				<attribute name="frame" type="anyURI" default="#ISO-8601"/>
+				<attribute name="calendarEraName" type="string"/>
+				<attribute name="indeterminatePosition" type="gml:TimeIndeterminateValueType"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="TimeIndeterminateValueType">
+		<annotation>
+			<documentation>These values are interpreted as follows: 
+-	"unknown" indicates that no specific value for temporal position is provided.
+-	"now" indicates that the specified value shall be replaced with the current temporal position whenever the value is accessed.
+-	"before" indicates that the actual temporal position is unknown, but it is known to be before the specified value.
+-	"after" indicates that the actual temporal position is unknown, but it is known to be after the specified value.
+A value for indeterminatePosition may 
+-	be used either alone, or 
+-	qualify a specific value for temporal position.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="after"/>
+			<enumeration value="before"/>
+			<enumeration value="now"/>
+			<enumeration value="unknown"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="TimePositionUnion">
+		<annotation>
+			<documentation>The simple type gml:TimePositionUnion is a union of XML Schema simple types which instantiate the subtypes for temporal position described in ISO 19108.
+ An ordinal era may be referenced via URI.  A decimal value may be used to indicate the distance from the scale origin .  time is used for a position that recurs daily (see ISO 19108:2002 5.4.4.2).
+ Finally, calendar and clock forms that support the representation of time in systems based on years, months, days, hours, minutes and seconds, in a notation following ISO 8601, are assembled by gml:CalDate</documentation>
+		</annotation>
+		<union memberTypes="gml:CalDate time dateTime anyURI decimal"/>
+	</simpleType>
+	<simpleType name="CalDate">
+		<union memberTypes="date gYearMonth gYear"/>
+	</simpleType>
+	<element name="timePosition" type="gml:TimePositionType">
+		<annotation>
+			<documentation>This element is used directly as a property of gml:TimeInstant (see 15.2.2.3), and may also be used in application schemas.</documentation>
+		</annotation>
+	</element>
+	<group name="timeLength">
+		<annotation>
+			<documentation>The length of a time period.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:duration"/>
+			<element ref="gml:timeInterval"/>
+		</choice>
+	</group>
+	<element name="duration" type="duration">
+		<annotation>
+			<documentation>gml:duration conforms to the ISO 8601 syntax for temporal length as implemented by the XML Schema duration type.</documentation>
+		</annotation>
+	</element>
+	<element name="timeInterval" type="gml:TimeIntervalLengthType">
+		<annotation>
+			<documentation> gml:timeInterval conforms to ISO 11404 which is based on floating point values for temporal length.
+ISO 11404 syntax specifies the use of a positiveInteger together with appropriate values for radix and factor. The resolution of the time interval is to one radix ^(-factor) of the specified time unit.
+The value of the unit is either selected from the units for time intervals from ISO 31-1:1992, or is another suitable unit.  The encoding is defined for GML in gml:TimeUnitType. The second component of this union type provides a method for indicating time units other than the six standard units given in the enumeration.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeIntervalLengthType" final="#all">
+		<simpleContent>
+			<extension base="decimal">
+				<attribute name="unit" type="gml:TimeUnitType" use="required"/>
+				<attribute name="radix" type="positiveInteger"/>
+				<attribute name="factor" type="integer"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="TimeUnitType">
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="year"/>
+					<enumeration value="month"/>
+					<enumeration value="day"/>
+					<enumeration value="hour"/>
+					<enumeration value="minute"/>
+					<enumeration value="second"/>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporalReferenceSystems.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporalReferenceSystems.xsd
new file mode 100755
index 0000000..88f610b
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporalReferenceSystems.xsd
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:temporalReferenceSystems:3.2.1">temporalReferenceSystems.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 15.5.
+A value in the time domain is measured relative to a temporal reference system. Common types of reference systems include calendars, ordinal temporal reference systems, and temporal coordinate systems (time elapsed since some epoch).  The primary temporal reference system for use with geographic information is the Gregorian Calendar and 24 hour local or Coordinated Universal Time (UTC), but special applications may entail the use of alternative reference systems.  The Julian day numberin [...]
+In GML seven concrete elements are used to describe temporal reference systems: gml:TimeReferenceSystem, gml:TimeCoordinateSystem, gml:TimeCalendar, gml:TimeCalendarEra, gml:TimeClock, gml:TimeOrdinalReferenceSystem, and gml:TimeOrdinalEra.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="temporalTopology.xsd"/>
+	<include schemaLocation="dictionary.xsd"/>
+	<element name="TimeReferenceSystem" type="gml:TimeReferenceSystemType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A reference system is characterized in terms of its domain of validity: the spatial and temporal extent over which it is applicable. The basic GML element for temporal reference systems is gml:TimeReferenceSystem.  Its content model extends gml:DefinitionType with one additional property, gml:domainOfValidity.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeReferenceSystemType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="domainOfValidity" type="string"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeCoordinateSystem" type="gml:TimeCoordinateSystemType" substitutionGroup="gml:TimeReferenceSystem">
+		<annotation>
+			<documentation>A temporal coordinate system shall be based on a continuous interval scale defined in terms of a single time interval.
+The differences to ISO 19108 TM_CoordinateSystem are:
+-	the origin is specified either using the property gml:originPosition whose value is a direct time position, or using the property gml:origin whose model is gml:TimeInstantPropertyType; this permits more flexibility in representation and also supports referring to a value fixed elsewhere;
+-	the interval uses gml:TimeIntervalLengthType.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeCoordinateSystemType">
+		<complexContent>
+			<extension base="gml:TimeReferenceSystemType">
+				<sequence>
+					<choice>
+						<element name="originPosition" type="gml:TimePositionType"/>
+						<element name="origin" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<element name="interval" type="gml:TimeIntervalLengthType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeCalendar" type="gml:TimeCalendarType" substitutionGroup="gml:TimeReferenceSystem">
+		<annotation>
+			<documentation>A calendar is a discrete temporal reference system that provides a basis for defining temporal position to a resolution of one day.
+gml:TimeCalendar adds one property to those inherited from gml:TimeReferenceSystem. A gml:referenceFrame provides a link to a gml:TimeCalendarEra that it uses. A  gml:TimeCalendar may reference more than one calendar era. 
+The referenceFrame element follows the standard GML property model, allowing the association to be instantiated either using an inline description using the gml:TimeCalendarEra element, or a link to a gml:TimeCalendarEra which is explicit elsewhere.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeCalendarType">
+		<complexContent>
+			<extension base="gml:TimeReferenceSystemType">
+				<sequence>
+					<element name="referenceFrame" type="gml:TimeCalendarEraPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeCalendarEra" type="gml:TimeCalendarEraType">
+		<annotation>
+			<documentation>gml:TimeCalendarEra inherits basic properties from gml:DefinitionType and has the following additional properties:
+-	gml:referenceEvent is the name or description of a mythical or historic event which fixes the position of the base scale of the calendar era.  This is given as text or using a link to description held elsewhere.
+-	gml:referenceDate specifies the date of the referenceEvent expressed as a date in the given calendar.  In most calendars, this date is the origin (i.e., the first day) of the scale, but this is not always true.
+-	gml:julianReference specifies the Julian date that corresponds to the reference date.  The Julian day number is an integer value; the Julian date is a decimal value that allows greater resolution.  Transforming calendar dates to and from Julian dates provides a relatively simple basis for transforming dates from one calendar to another.
+-	gml:epochOfUse is the period for which the calendar era was used as a basis for dating.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeCalendarEraType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="referenceEvent" type="gml:StringOrRefType"/>
+					<element name="referenceDate" type="gml:CalDate"/>
+					<element name="julianReference" type="decimal"/>
+					<element name="epochOfUse" type="gml:TimePeriodPropertyType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeCalendarPropertyType">
+		<annotation>
+			<documentation>gml:TimeCalendarPropertyType provides for associating a gml:TimeCalendar with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCalendar"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="TimeCalendarEraPropertyType">
+		<annotation>
+			<documentation>gml:TimeCalendarEraPropertyType provides for associating a gml:TimeCalendarEra with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCalendarEra"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="TimeClock" type="gml:TimeClockType" substitutionGroup="gml:TimeReferenceSystem">
+		<annotation>
+			<documentation>A clock provides a basis for defining temporal position within a day. A clock shall be used with a calendar in order to provide a complete description of a temporal position within a specific day.
+gml:TimeClock adds the following properties to those inherited from gml:TimeReferenceSystemType:
+-	gml:referenceEvent is the name or description of an event, such as solar noon or sunrise, which fixes the position of the base scale of the clock.
+-	gml:referenceTime specifies the time of day associated with the reference event expressed as a time of day in the given clock. The reference time is usually the origin of the clock scale. 
+-	gml:utcReference specifies the 24 hour local or UTC time that corresponds to the reference time.
+-	gml:dateBasis contains or references the calendars that use this clock.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeClockType" final="#all">
+		<complexContent>
+			<extension base="gml:TimeReferenceSystemType">
+				<sequence>
+					<element name="referenceEvent" type="gml:StringOrRefType"/>
+					<element name="referenceTime" type="time"/>
+					<element name="utcReference" type="time"/>
+					<element name="dateBasis" type="gml:TimeCalendarPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeClockPropertyType">
+		<annotation>
+			<documentation>gml:TimeClockPropertyType provides for associating a gml:TimeClock with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeClock"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="TimeOrdinalReferenceSystem" type="gml:TimeOrdinalReferenceSystemType" substitutionGroup="gml:TimeReferenceSystem">
+		<annotation>
+			<documentation>In some applications of geographic information — such as geology and archaeology — relative position in time is known more precisely than absolute time or duration. The order of events in time can be well established, but the magnitude of the intervals between them cannot be accurately determined; in such cases, the use of an ordinal temporal reference system is appropriate. An ordinal temporal reference system is composed of a sequence of named coterminous eras, which  [...]
+An ordinal temporal reference system whose component eras are not further subdivided is effectively a temporal topological complex constrained to be a linear graph. An ordinal temporal reference system some or all of whose component eras are subdivided is effectively a temporal topological complex with the constraint that parallel branches may only be constructed in pairs where one is a single temporal ordinal era and the other is a sequence of temporal ordinal eras that are called "memb [...]
+The positions of the beginning and end of a given era may calibrate the relative time scale.
+gml:TimeOrdinalReferenceSystem adds one or more gml:component properties to the generic temporal reference system model.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeOrdinalReferenceSystemType">
+		<complexContent>
+			<extension base="gml:TimeReferenceSystemType">
+				<sequence>
+					<element name="component" type="gml:TimeOrdinalEraPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeOrdinalEra" type="gml:TimeOrdinalEraType">
+		<annotation>
+			<documentation>Its content model follows the pattern of gml:TimeEdge, inheriting standard properties from gml:DefinitionType, and adding gml:start, gml:end and gml:extent properties, a set of gml:member properties which indicate ordered gml:TimeOrdinalEra elements, and a gml:group property which points to the parent era.
+The recursive inclusion of gml:TimeOrdinalEra elements allow the construction of an arbitrary depth hierarchical ordinal reference schema, such that an ordinal era at a given level of the hierarchy includes a sequence of shorter, coterminous ordinal eras.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeOrdinalEraType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="start" type="gml:TimeNodePropertyType" minOccurs="0"/>
+					<element name="end" type="gml:TimeNodePropertyType" minOccurs="0"/>
+					<element name="extent" type="gml:TimePeriodPropertyType" minOccurs="0"/>
+					<element name="member" type="gml:TimeOrdinalEraPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="group" type="gml:ReferenceType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeOrdinalEraPropertyType">
+		<annotation>
+			<documentation>gml:TimeOrdinalEraPropertyType provides for associating a gml:TimeOrdinalEra with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeOrdinalEra"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporalTopology.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporalTopology.xsd
new file mode 100755
index 0000000..b38392c
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/temporalTopology.xsd
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:temporalTopology:3.2.1">temporalTopology.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 15.3.
+Temporal topology is described in terms of time complexes, nodes, and edges, and the connectivity between these. Temporal topology does not directly provide information about temporal position. It is used in the case of describing a lineage or a history (e.g. a family tree expressing evolution of species, an ecological cycle, a lineage of lands or buildings, or a history of separation and merger of administrative boundaries). The following Subclauses specifies the temporal topology as te [...]
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<element name="AbstractTimeTopologyPrimitive" type="gml:AbstractTimeTopologyPrimitiveType" abstract="true" substitutionGroup="gml:AbstractTimePrimitive">
+		<annotation>
+			<documentation>gml:TimeTopologyPrimitive acts as the head of a substitution group for topological temporal primitives.
+Temporal topology primitives shall imply the ordering information between features or feature properties. The temporal connection of features can be examined if they have temporal topology primitives as values of their properties. Usually, an instantaneous feature associates with a time node, and a static feature associates with a time edge.  A feature with both modes associates with the temporal topology primitive: a supertype of time nodes and time edges.
+A topological primitive is always connected to one or more other topological primitives, and is, therefore, always a member of a topological complex. In a GML instance, this will often be indicated by the primitives being described by elements that are descendents of an element describing a complex. However, in order to support the case where a temporal topological primitive is described in another context, the optional complex property is provided, which carries a reference to the paren [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeTopologyPrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimePrimitiveType">
+				<sequence>
+					<element name="complex" type="gml:ReferenceType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeTopologyPrimitivePropertyType">
+		<annotation>
+			<documentation>gml:TimeTopologyPrimitivePropertyType provides for associating a gml:AbstractTimeTopologyPrimitive with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractTimeTopologyPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="TimeTopologyComplex" type="gml:TimeTopologyComplexType" substitutionGroup="gml:AbstractTimeComplex">
+		<annotation>
+			<documentation>A temporal topology complex shall be the connected acyclic directed graph composed of temporal topological primitives, i.e. time nodes and time edges. Because a time edge may not exist without two time nodes on its boundaries, static features have time edges from a temporal topology complex as the values of their temporal properties, regardless of explicit declarations.
+A temporal topology complex expresses a linear or a non-linear graph. A temporal linear graph, composed of a sequence of time edges, provides a lineage described only by "substitution" of feature instances or feature element values. A time node as the start or the end of the graph connects with at least one time edge. A time node other than the start and the end shall connect to at least two time edges: one of starting from the node, and another ending at the node.
+A temporal topological complex is a set of connected temporal topological primitives. The member primtives are indicated, either by reference or by value, using the primitive property.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeTopologyComplexType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimeComplexType">
+				<sequence>
+					<element name="primitive" type="gml:TimeTopologyPrimitivePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeTopologyComplexPropertyType">
+		<annotation>
+			<documentation>gml:TimeTopologyComplexPropertyType provides for associating a gml:TimeTopologyComplex with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeTopologyComplex"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="TimeNode" type="gml:TimeNodeType" substitutionGroup="gml:AbstractTimeTopologyPrimitive">
+		<annotation>
+			<documentation>A time node is a zero-dimensional topological primitive that represents an identifiable node in time (it is equivalent to a point in space). A node may act as the termination or initiation of any number of time edges. A time node may be realised as a geometry, its position, whose value is a time instant.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeNodeType">
+		<complexContent>
+			<extension base="gml:AbstractTimeTopologyPrimitiveType">
+				<sequence>
+					<element name="previousEdge" type="gml:TimeEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="nextEdge" type="gml:TimeEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="position" type="gml:TimeInstantPropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeNodePropertyType">
+		<annotation>
+			<documentation>gml:TimeNodePropertyType provides for associating a gml:TimeNode with an object</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeNode"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="TimeEdge" type="gml:TimeEdgeType" substitutionGroup="gml:AbstractTimeTopologyPrimitive">
+		<annotation>
+			<documentation>A time edge is a one-dimensional topological primitive. It is an open interval that starts and ends at a node. The edge may be realised as a geometry whose value is a time period.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeEdgeType">
+		<complexContent>
+			<extension base="gml:AbstractTimeTopologyPrimitiveType">
+				<sequence>
+					<element name="start" type="gml:TimeNodePropertyType"/>
+					<element name="end" type="gml:TimeNodePropertyType"/>
+					<element name="extent" type="gml:TimePeriodPropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeEdgePropertyType">
+		<annotation>
+			<documentation>gml:TimeEdgePropertyType provides for associating a gml:TimeEdge with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeEdge"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/topology.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/topology.xsd
new file mode 100755
index 0000000..c528e6c
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/topology.xsd
@@ -0,0 +1,386 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:topology:3.2.1">topology.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 14.
+Topology is the branch of mathematics describing the properties of objects which are invariant under continuous deformation. For example, a circle is topologically equivalent to an ellipse because one can be transformed into the other by stretching. In geographic modelling, the foremost use of topology is in accelerating computational geometry. The constructs of topology allow characterisation of the spatial relationships between objects using simple combinatorial or algebraic algorithms [...]
+There are four instantiable classes of primitive topology objects, one for each dimension up to 3D. In addition, topological complexes are supported, too. 
+There is strong symmetry in the (topological boundary and coboundary) relationships between topology primitives of adjacent dimensions. Topology primitives are bounded by directed primitives of one lower dimension. The coboundary of each topology primitive is formed from directed topology primitives of one higher dimension.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+  <include schemaLocation="gml.xsd"/>
+  <include schemaLocation="geometryComplexes.xsd"/>
+  <complexType name="AbstractTopologyType" abstract="true">
+    <annotation>
+      <documentation>This abstract type supplies the root or base type for all topological elements including primitives and complexes. It inherits AbstractGMLType and hence can be identified using the gml:id attribute.</documentation>
+    </annotation>
+    <complexContent>
+      <extension base="gml:AbstractGMLType"/>
+    </complexContent>
+  </complexType>
+  <element name="AbstractTopology" type="gml:AbstractTopologyType" abstract="true" substitutionGroup="gml:AbstractGML"/>
+  <complexType name="AbstractTopoPrimitiveType" abstract="true">
+    <complexContent>
+      <extension base="gml:AbstractTopologyType"/>
+    </complexContent>
+  </complexType>
+  <element name="AbstractTopoPrimitive" type="gml:AbstractTopoPrimitiveType" abstract="true" substitutionGroup="gml:AbstractTopology">
+    <annotation>
+      <documentation>gml:AbstractTopoPrimitive acts as the base type for all topological primitives. Topology primitives are the atomic (smallest possible) units of a topology complex. 
+Each topology primitive may contain references to other topology primitives of codimension 2 or more (gml:isolated). Conversely, nodes may have faces as containers and nodes and edges may have solids as containers (gml:container).</documentation>
+    </annotation>
+  </element>
+  <complexType name="NodeOrEdgePropertyType">
+    <choice minOccurs="0">
+      <element ref="gml:Node"/>
+      <element ref="gml:Edge"/>
+    </choice>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="NodePropertyType">
+    <choice minOccurs="0">
+      <element ref="gml:Node"/>
+    </choice>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="FaceOrTopoSolidPropertyType">
+    <choice minOccurs="0">
+      <element ref="gml:Face"/>
+      <element ref="gml:TopoSolid"/>
+    </choice>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="TopoSolidPropertyType">
+    <choice minOccurs="0">
+      <element ref="gml:TopoSolid"/>
+    </choice>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="NodeType">
+    <complexContent>
+      <extension base="gml:AbstractTopoPrimitiveType">
+        <sequence>
+          <element name="container" type="gml:FaceOrTopoSolidPropertyType" minOccurs="0"/>
+          <element ref="gml:directedEdge" minOccurs="0" maxOccurs="unbounded">
+            <annotation>
+              <documentation>In the case of planar topology, a gml:Node must have a clockwise sequence of gml:directedEdge properties, to ensure a lossless topology representation as defined by Kuijpers, et. al. (see OGC 05-102 Topology IPR).</documentation>
+            </annotation>
+          </element>
+          <element ref="gml:pointProperty" minOccurs="0"/>
+        </sequence>
+        <attributeGroup ref="gml:AggregationAttributeGroup"/>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="Node" type="gml:NodeType" substitutionGroup="gml:AbstractTopoPrimitive">
+    <annotation>
+      <documentation>gml:Node represents the 0-dimensional primitive.
+The optional coboundary of a node (gml:directedEdge) is a sequence of directed edges which are incident on this node. Edges emanating from this node appear in the node coboundary with a negative orientation. 
+If provided, the aggregationType attribute shall have the value "sequence".
+A node may optionally be realised by a 0-dimensional geometric primitive (gml:pointProperty).</documentation>
+    </annotation>
+  </element>
+  <element name="directedNode" type="gml:DirectedNodePropertyType">
+    <annotation>
+      <documentation>A gml:directedNode property element describes the boundary of topology edges and is used in the support of topological point features via the gml:TopoPoint expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included node is used: start ("-") or end ("+") node.</documentation>
+    </annotation>
+  </element>
+  <complexType name="DirectedNodePropertyType">
+    <sequence minOccurs="0">
+      <element ref="gml:Node"/>
+    </sequence>
+    <attribute name="orientation" type="gml:SignType" default="+"/>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="EdgeType">
+    <complexContent>
+      <extension base="gml:AbstractTopoPrimitiveType">
+        <sequence>
+          <element name="container" type="gml:TopoSolidPropertyType" minOccurs="0"/>
+          <element ref="gml:directedNode" minOccurs="2" maxOccurs="2"/>
+          <element ref="gml:directedFace" minOccurs="0" maxOccurs="unbounded"/>
+          <element ref="gml:curveProperty" minOccurs="0"/>
+        </sequence>
+        <attributeGroup ref="gml:AggregationAttributeGroup"/>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="Edge" type="gml:EdgeType" substitutionGroup="gml:AbstractTopoPrimitive">
+    <annotation>
+      <documentation>gml:Edge represents the 1-dimensional primitive.
+The topological boundary of an Edge (gml:directedNode) consists of a negatively directed start Node and a positively directed end Node.   
+The optional coboundary of an edge (gml:directedFace) is a circular sequence of directed faces which are incident on this edge in document order. In the 2D case, the orientation of the face on the left of the edge is "+"; the orientation of the face on the right on its right is "-". 
+If provided, the aggregationType attribute shall have the value "sequence".
+An edge may optionally be realised by a 1-dimensional geometric primitive (gml:curveProperty).</documentation>
+    </annotation>
+  </element>
+  <element name="directedEdge" type="gml:DirectedEdgePropertyType">
+    <annotation>
+      <documentation>A gml:directedEdge property element describes the boundary of topology faces, the coBoundary of topology nodes and is used in the support of topological line features via the gml:TopoCurve expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included edge is used, i.e. forward or reverse.</documentation>
+    </annotation>
+  </element>
+  <complexType name="DirectedEdgePropertyType">
+    <sequence minOccurs="0">
+      <element ref="gml:Edge"/>
+    </sequence>
+    <attribute name="orientation" type="gml:SignType" default="+"/>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="FaceType">
+    <complexContent>
+      <extension base="gml:AbstractTopoPrimitiveType">
+        <sequence>
+          <element name="isolated" type="gml:NodePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+          <element ref="gml:directedEdge" maxOccurs="unbounded"/>
+          <element ref="gml:directedTopoSolid" minOccurs="0" maxOccurs="2"/>
+          <element ref="gml:surfaceProperty" minOccurs="0"/>
+        </sequence>
+        <attributeGroup ref="gml:AggregationAttributeGroup"/>
+        <attribute name="universal" type="boolean" use="optional" default="false">
+          <annotation>
+            <documentation>If the topological representation exists an unbounded manifold (e.g. Euclidean plane), a gml:Face must indicate whether it is a universal face or not, to ensure a lossless topology representation as defined by Kuijpers, et. al. (see OGC 05-102 Topology IPR). The optional universal attribute of type boolean is used to indicate this. NOTE The universal face is normally not part of any feature, and is used to represent the unbounded portion of the data set. Its in [...]
+          </annotation>
+        </attribute>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="Face" type="gml:FaceType" substitutionGroup="gml:AbstractTopoPrimitive">
+    <annotation>
+      <documentation>gml:Face represents the 2-dimensional topology primitive.
+The topological boundary of a face (gml:directedEdge) consists of a sequence of directed edges. If provided, the aggregationType attribute shall have the value "sequence".
+The optional coboundary of a face (gml:directedTopoSolid) is a pair of directed solids which are bounded by this face. A positively directed solid corresponds to a solid which lies in the direction of the negatively directed normal to the face in any geometric realisation. 
+A face may optionally be realised by a 2-dimensional geometric primitive (gml:surfaceProperty).</documentation>
+    </annotation>
+  </element>
+  <element name="directedFace" type="gml:DirectedFacePropertyType">
+    <annotation>
+      <documentation>The gml:directedFace property element describes the boundary of topology solids, in the coBoundary of topology edges and is used in the support of surface features via the gml:TopoSurface expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included face is used i.e. inward or outward with respect to the surface normal in any geometric realisation.</documentation>
+    </annotation>
+  </element>
+  <complexType name="DirectedFacePropertyType">
+    <sequence minOccurs="0">
+      <element ref="gml:Face"/>
+    </sequence>
+    <attribute name="orientation" type="gml:SignType" default="+"/>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="TopoSolidType">
+    <complexContent>
+      <extension base="gml:AbstractTopoPrimitiveType">
+        <sequence>
+          <element name="isolated" type="gml:NodeOrEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+          <element ref="gml:directedFace" maxOccurs="unbounded"/>
+          <element ref="gml:solidProperty" minOccurs="0"/>
+        </sequence>
+        <attributeGroup ref="gml:AggregationAttributeGroup"/>
+        <attribute name="universal" type="boolean" use="optional" default="false">
+          <annotation>
+            <documentation>A gml:TopoSolid must indicate whether it is a universal topo-solid or not, to ensure a lossless topology representation as defined by Kuijpers, et. al. (see OGC 05-102 Topology IPR). The optional universal attribute of type boolean is used to indicate this and the default is fault. NOTE The universal topo-solid is normally not part of any feature, and is used to represent the unbounded portion of the data set. Its interior boundary (it has no exterior boundary) [...]
+          </annotation>
+        </attribute>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="TopoSolid" type="gml:TopoSolidType" substitutionGroup="gml:AbstractTopoPrimitive">
+    <annotation>
+      <documentation>gml:TopoSolid represents the 3-dimensional topology primitive. 
+The topological boundary of a solid (gml:directedFace) consists of a set of directed faces.
+A solid may optionally be realised by a 3-dimensional geometric primitive (gml:solidProperty).</documentation>
+    </annotation>
+  </element>
+  <element name="directedTopoSolid" type="gml:DirectedTopoSolidPropertyType">
+    <annotation>
+      <documentation>The gml:directedSolid property element describes the coBoundary of topology faces and is used in the support of volume features via the gml:TopoVolume expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included solid appears in the face coboundary. In the context of a gml:TopoVolume the orientation attribute has no meaning.</documentation>
+    </annotation>
+  </element>
+  <complexType name="DirectedTopoSolidPropertyType">
+    <sequence minOccurs="0">
+      <element ref="gml:TopoSolid"/>
+    </sequence>
+    <attribute name="orientation" type="gml:SignType" default="+"/>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="TopoPointType">
+    <complexContent>
+      <extension base="gml:AbstractTopologyType">
+        <sequence>
+          <element ref="gml:directedNode"/>
+        </sequence>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="TopoPoint" type="gml:TopoPointType">
+    <annotation>
+      <documentation>The intended use of gml:TopoPoint is to appear within a point feature to express the structural and possibly geometric relationships of this feature to other features via shared node definitions.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoPointPropertyType">
+    <sequence>
+      <element ref="gml:TopoPoint"/>
+    </sequence>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <element name="topoPointProperty" type="gml:TopoPointPropertyType">
+    <annotation>
+      <documentation>The gml:topoPointProperty property element may be used in features to express their relationship to the referenced topology node.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoCurveType">
+    <complexContent>
+      <extension base="gml:AbstractTopologyType">
+        <sequence>
+          <element ref="gml:directedEdge" maxOccurs="unbounded"/>
+        </sequence>
+        <attributeGroup ref="gml:AggregationAttributeGroup"/>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="TopoCurve" type="gml:TopoCurveType">
+    <annotation>
+      <documentation>gml:TopoCurve represents a homogeneous topological expression, a sequence of directed edges, which if realised are isomorphic to a geometric curve primitive. The intended use of gml:TopoCurve is to appear within a line feature to express the structural and geometric relationships of this feature to other features via the shared edge definitions.
+If provided, the aggregationType attribute shall have the value "sequence".</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoCurvePropertyType">
+    <sequence>
+      <element ref="gml:TopoCurve"/>
+    </sequence>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <element name="topoCurveProperty" type="gml:TopoCurvePropertyType">
+    <annotation>
+      <documentation>The gml:topoCurveProperty property element may be used in features to express their relationship to the referenced topology edges.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoSurfaceType">
+    <complexContent>
+      <extension base="gml:AbstractTopologyType">
+        <sequence>
+          <element ref="gml:directedFace" maxOccurs="unbounded"/>
+        </sequence>
+        <attributeGroup ref="gml:AggregationAttributeGroup"/>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="TopoSurface" type="gml:TopoSurfaceType">
+    <annotation>
+      <documentation>gml:TopoSurface represents a homogeneous topological expression, a set of directed faces, which if realised are isomorphic to a geometric surface primitive. The intended use of gml:TopoSurface is to appear within a surface feature to express the structural and possibly geometric relationships of this surface feature to other features via the shared face definitions.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoSurfacePropertyType">
+    <sequence>
+      <element ref="gml:TopoSurface"/>
+    </sequence>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <element name="topoSurfaceProperty" type="gml:TopoSurfacePropertyType">
+    <annotation>
+      <documentation>The gml:topoSurfaceProperty property element may be used in features to express their relationship to the referenced topology faces.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoVolumeType">
+    <complexContent>
+      <extension base="gml:AbstractTopologyType">
+        <sequence>
+          <element ref="gml:directedTopoSolid" maxOccurs="unbounded"/>
+        </sequence>
+        <attributeGroup ref="gml:AggregationAttributeGroup"/>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="TopoVolume" type="gml:TopoVolumeType">
+    <annotation>
+      <documentation>gml:TopoVolume represents a homogeneous topological expression, a set of directed topologic solids, which if realised are isomorphic to a geometric solid primitive. The intended use of gml:TopoVolume is to appear within a solid feature to express the structural and geometric relationships of this solid feature to other features via the shared solid definitions.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoVolumePropertyType">
+    <sequence>
+      <element ref="gml:TopoVolume"/>
+    </sequence>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <element name="topoVolumeProperty" type="gml:TopoVolumePropertyType">
+    <annotation>
+      <documentation>The gml:topoVolumeProperty element may be used in features to express their relationship to the referenced topology volume.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoComplexType">
+    <complexContent>
+      <extension base="gml:AbstractTopologyType">
+        <sequence>
+          <element ref="gml:maximalComplex"/>
+          <element ref="gml:superComplex" minOccurs="0" maxOccurs="unbounded"/>
+          <element ref="gml:subComplex" minOccurs="0" maxOccurs="unbounded"/>
+          <element ref="gml:topoPrimitiveMember" minOccurs="0" maxOccurs="unbounded"/>
+          <element ref="gml:topoPrimitiveMembers" minOccurs="0"/>
+        </sequence>
+        <attribute name="isMaximal" type="boolean" default="false"/>
+        <attributeGroup ref="gml:AggregationAttributeGroup"/>
+      </extension>
+    </complexContent>
+  </complexType>
+  <element name="TopoComplex" type="gml:TopoComplexType" substitutionGroup="gml:AbstractTopology">
+    <annotation>
+      <documentation>gml:TopoComplex is a collection of topological primitives.
+Each complex holds a reference to its maximal complex (gml:maximalComplex) and optionally to sub- or super-complexes (gml:subComplex, gml:superComplex). 
+A topology complex contains its primitive and sub-complex members.
+</documentation>
+    </annotation>
+  </element>
+  <element name="subComplex" type="gml:TopoComplexPropertyType">
+    <annotation>
+      <documentation>The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above.</documentation>
+    </annotation>
+  </element>
+  <element name="superComplex" type="gml:TopoComplexPropertyType">
+    <annotation>
+      <documentation>The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above.</documentation>
+    </annotation>
+  </element>
+  <element name="maximalComplex" type="gml:TopoComplexPropertyType">
+    <annotation>
+      <documentation>The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above.</documentation>
+    </annotation>
+  </element>
+  <element name="topoPrimitiveMember" type="gml:TopoPrimitiveMemberType">
+    <annotation>
+      <documentation>The gml:topoPrimitiveMember property element encodes for the relationship between a topology complex and a single topology primitive.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoPrimitiveMemberType">
+    <sequence minOccurs="0">
+      <element ref="gml:AbstractTopoPrimitive"/>
+    </sequence>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <element name="topoPrimitiveMembers" type="gml:TopoPrimitiveArrayAssociationType">
+    <annotation>
+      <documentation>The gml:topoPrimitiveMembers property element encodes the relationship between a topology complex and an arbitrary number of topology primitives.</documentation>
+    </annotation>
+  </element>
+  <complexType name="TopoPrimitiveArrayAssociationType">
+    <sequence minOccurs="0" maxOccurs="unbounded">
+      <element ref="gml:AbstractTopoPrimitive"/>
+    </sequence>
+    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
+  </complexType>
+  <complexType name="TopoComplexPropertyType">
+    <sequence minOccurs="0">
+      <element ref="gml:TopoComplex"/>
+    </sequence>
+    <attributeGroup ref="gml:AssociationAttributeGroup"/>
+  </complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/units.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/units.xsd
new file mode 100755
index 0000000..84eca23
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/units.xsd
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" xml:lang="en" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:units:3.2.1">units.xsd</appinfo>
+		<documentation>See ISO/DIS 17.2.
+Several GML Schema components concern or require a reference scale or units of measure.  Units are required for quantities that may occur as values of properties of feature types, as the results of observations, in the range parameters of a coverage, and for measures used in Coordinate Reference System definitions. 
+The basic unit definition is an extension of the general gml:Definition element defined in 16.2.1.  Three specialized elements for unit definition are further derived from this. 
+This model is based on the SI system of units [ISO 1000], which distinguishes between Base Units and Derived Units.  
+-	Base Units are the preferred units for a set of orthogonal fundamental quantities which define the particular system of units, which may not be derived by combination of other base units.  
+-	Derived Units are the preferred units for other quantities in the system, which may be defined by algebraic combination of the base units.  
+In some application areas Conventional units are used, which may be converted to the preferred units using a scaling factor or a formula which defines a re-scaling and offset.  The set of preferred units for all physical quantity types in a particular system of units is composed of the union of its base units and derived units.  
+Unit definitions are substitutable for the gml:Definition element declared as part of the dictionary model.  A dictionary that contains only unit definitions and references to unit definitions is a units dictionary.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="dictionary.xsd"/>
+	<element name="unitOfMeasure" type="gml:UnitOfMeasureType">
+		<annotation>
+			<documentation>The element gml:unitOfMeasure is a property element to refer to a unit of measure. This is an empty element which carries a reference to a unit of measure definition.</documentation>
+		</annotation>
+	</element>
+	<complexType name="UnitOfMeasureType">
+		<sequence/>
+		<attribute name="uom" type="gml:UomIdentifier" use="required"/>
+	</complexType>
+	<element name="UnitDefinition" type="gml:UnitDefinitionType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A gml:UnitDefinition is a general definition of a unit of measure. This generic element is used only for units for which no relationship with other units or units systems is known.
+The content model of gml:UnitDefinition adds three additional properties to gml:Definition, gml:quantityType, gml:quantityTypeReference and gml:catalogSymbol.  
+The gml:catalogSymbol property optionally gives the short symbol used for this unit. This element is usually used when the relationship of this unit to other units or units systems is unknown.</documentation>
+		</annotation>
+	</element>
+	<complexType name="UnitDefinitionType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:quantityType" minOccurs="0"/>
+					<element ref="gml:quantityTypeReference" minOccurs="0"/>
+					<element ref="gml:catalogSymbol" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="quantityType" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>The gml:quantityType property indicates the phenomenon to which the units apply. This element contains an informal description of the phenomenon or type of physical quantity that is measured or observed. When the physical quantity is the result of an observation or measurement, this term is known as observable type or measurand.
+The use of gml:quantityType for references to remote values is deprecated.</documentation>
+		</annotation>
+	</element>
+	<element name="quantityTypeReference" type="gml:ReferenceType">
+		<annotation>
+			<documentation>The gml:quantityTypeReference property indicates the phenomenon to which the units apply. The content is a reference to a remote value.</documentation>
+		</annotation>
+	</element>
+	<element name="catalogSymbol" type="gml:CodeType">
+		<annotation>
+			<documentation>The catalogSymbol is the preferred lexical symbol used for this unit of measure.
+The codeSpace attribute in gml:CodeType identifies a namespace for the catalog symbol value, and might reference the external catalog. The string value in gml:CodeType contains the value of a symbol that should be unique within this catalog namespace. This symbol often appears explicitly in the catalog, but it could be a combination of symbols using a specified algebra of units.</documentation>
+		</annotation>
+	</element>
+	<element name="BaseUnit" type="gml:BaseUnitType" substitutionGroup="gml:UnitDefinition">
+		<annotation>
+			<documentation>A base unit is a unit of measure that cannot be derived by combination of other base units within a particular system of units.  For example, in the SI system of units, the base units are metre, kilogram, second, Ampere, Kelvin, mole, and candela, for the physical quantity types length, mass, time interval, electric current, thermodynamic temperature, amount of substance and luminous intensity, respectively.
+gml:BaseUnit extends generic gml:UnitDefinition with the property gml:unitsSystem, which carries a reference to the units system to which this base unit is asserted to belong.  </documentation>
+		</annotation>
+	</element>
+	<complexType name="BaseUnitType">
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<element name="unitsSystem" type="gml:ReferenceType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="DerivedUnit" type="gml:DerivedUnitType" substitutionGroup="gml:UnitDefinition">
+		<annotation>
+			<documentation>Derived units are defined by combination of other units.  Derived units are used for quantities other than those corresponding to the base units, such as hertz (s-1) for frequency, Newton (kg.m/s2) for force.  Derived units based directly on base units are usually preferred for quantities other than the fundamental quantities within a system. If a derived unit is not the preferred unit, the gml:ConventionalUnit element should be used instead.
+The gml:DerivedUnit extends gml:UnitDefinition with the property gml:derivationUnitTerms.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DerivedUnitType">
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<element ref="gml:derivationUnitTerm" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="derivationUnitTerm" type="gml:DerivationUnitTermType">
+		<annotation>
+			<documentation>A set of gml:derivationUnitTerm elements describes a derived unit of measure.  Each element carries an integer exponent.  The terms are combined by raising each referenced unit to the power of its exponent and forming the product.
+This unit term references another unit of measure (uom) and provides an integer exponent applied to that unit in defining the compound unit. The exponent may be positive or negative, but not zero.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DerivationUnitTermType">
+		<complexContent>
+			<extension base="gml:UnitOfMeasureType">
+				<attribute name="exponent" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ConventionalUnit" type="gml:ConventionalUnitType" substitutionGroup="gml:UnitDefinition">
+		<annotation>
+			<documentation>Conventional units that are neither base units nor defined by direct combination of base units are used in many application domains.  For example electronVolt for energy, feet and nautical miles for length.  In most cases there is a known, usually linear, conversion to a preferred unit which is either a base unit or derived by direct combination of base units.
+The gml:ConventionalUnit extends gml:UnitDefinition with a property that describes a conversion to a preferred unit for this physical quantity.  When the conversion is exact, the element gml:conversionToPreferredUnit should be used, or when the conversion is not exact the element gml:roughConversionToPreferredUnit is available. Both of these elements have the same content model.  The gml:derivationUnitTerm property defined above is included to allow a user to optionally record how this u [...]
+		</annotation>
+	</element>
+	<complexType name="ConventionalUnitType">
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<choice>
+						<element ref="gml:conversionToPreferredUnit"/>
+						<element ref="gml:roughConversionToPreferredUnit"/>
+					</choice>
+					<element ref="gml:derivationUnitTerm" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="conversionToPreferredUnit" type="gml:ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>The elements gml:conversionToPreferredUnit and gml:roughConversionToPreferredUnit represent parameters used to convert conventional units to preferred units for this physical quantity type.  A preferred unit is either a Base Unit or a Derived Unit that is selected for all values of one physical quantity type.</documentation>
+		</annotation>
+	</element>
+	<element name="roughConversionToPreferredUnit" type="gml:ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>The elements gml:conversionToPreferredUnit and gml:roughConversionToPreferredUnit represent parameters used to convert conventional units to preferred units for this physical quantity type.  A preferred unit is either a Base Unit or a Derived Unit that is selected for all values of one physical quantity type.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>The inherited attribute uom references the preferred unit that this conversion applies to. The conversion of a unit to the preferred unit for this physical quantity type is specified by an arithmetic conversion (scaling and/or offset). The content model extends gml:UnitOfMeasureType, which has a mandatory attribute uom which identifies the preferred unit for the physical quantity type that this conversion applies to. The conversion is specified by a choice of 
+-	gml:factor, which defines the scale factor, or
+-	gml:formula, which defines a formula 
+by which a value using the conventional unit of measure can be converted to obtain the corresponding value using the preferred unit of measure.  
+The formula defines the parameters of a simple formula by which a value using the conventional unit of measure can be converted to the corresponding value using the preferred unit of measure. The formula element contains elements a, b, c and d, whose values use the XML Schema type double. These values are used in the formula y = (a + bx) / (c + dx), where x is a value using this unit, and y is the corresponding value using the base unit. The elements a and d are optional, and if values a [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitOfMeasureType">
+				<choice>
+					<element name="factor" type="double"/>
+					<element name="formula" type="gml:FormulaType"/>
+				</choice>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="FormulaType">
+		<sequence>
+			<element name="a" type="double" minOccurs="0"/>
+			<element name="b" type="double"/>
+			<element name="c" type="double"/>
+			<element name="d" type="double" minOccurs="0"/>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/valueObjects.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/valueObjects.xsd
new file mode 100755
index 0000000..204bdfd
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/gml/3.2.1/valueObjects.xsd
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml/3.2" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.1.2">
+	<annotation>
+		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:valueObjects:3.2.1">valueObjects.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 17.5.
+The elements declared in this Clause build on other GML schema components, in particular gml:AbstractTimeObject, gml:AbstractGeometry, and the following types:  gml:MeasureType, gml:MeasureListType, gml:CodeType, gml:CodeOrNilReasonListType, gml:BooleanOrNilReasonListType, gml:IntegerOrNilReasonList.  
+Of particular interest are elements that are the heads of substitution groups, and one named choice group. These are the primary reasons for the value objects schema, since they may act as variables in the definition of content models, such as Observations, when it is desired to permit alternative value types to occur some of which may have complex content such as arrays, geometry and time objects, and where it is useful not to prescribe the actual value type in advance. The members of t [...]
+The value objects are defined in a hierarchy. The following relationships are defined:
+-	Concrete elements gml:Quantity, gml:Category, gml:Count and gml:Boolean are substitutable for the abstract element gml:AbstractScalarValue.  
+-	Concrete elements gml:QuantityList, gml:CategoryList, gml:CountList and gml:BooleanList are substitutable for the abstract element gml:AbstractScalarValueList.  
+-	Concrete element gml:ValueArray is substitutable for the concrete element gml:CompositeValue.  
+-	Abstract elements gml:AbstractScalarValue and gml:AbstractScalarValueList, and concrete elements gml:CompositeValue, gml:ValueExtent, gml:CategoryExtent, gml:CountExtent and gml:QuantityExtent are substitutable for abstract element gml:AbstractValue.  
+-	Abstract elements gml:AbstractValue, gml:AbstractTimeObject and gml:AbstractGeometry are all in a choice group named gml:Value, which is used for compositing in gml:CompositeValue and gml:ValueExtent.  
+-	Schemas which need values may use the abstract element gml:AbstractValue in a content model in order to permit any of the gml:AbstractScalarValues, gml:AbstractScalarValueLists, gml:CompositeValue or gml:ValueExtent to occur in an instance, or the named group gml:Value to also permit gml:AbstractTimeObjects, gml:AbstractGeometrys.
+
+GML is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="gml.xsd"/>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<element name="Boolean" substitutionGroup="gml:AbstractScalarValue" nillable="true">
+		<complexType>
+			<simpleContent>
+				<extension base="boolean">
+					<attribute name="nilReason" type="gml:NilReasonType"/>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<element name="BooleanList" type="gml:booleanOrNilReasonList" substitutionGroup="gml:AbstractScalarValueList"/>
+	<element name="Category" substitutionGroup="gml:AbstractScalarValue" nillable="true">
+		<annotation>
+			<documentation>A gml:Category has an optional XML attribute codeSpace, whose value is a URI which identifies a dictionary, codelist or authority for the term.</documentation>
+		</annotation>
+		<complexType>
+			<simpleContent>
+				<extension base="gml:CodeType">
+					<attribute name="nilReason" type="gml:NilReasonType"/>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<element name="CategoryList" type="gml:CodeOrNilReasonListType" substitutionGroup="gml:AbstractScalarValueList"/>
+	<element name="Count" substitutionGroup="gml:AbstractScalarValue" nillable="true">
+		<complexType>
+			<simpleContent>
+				<extension base="integer">
+					<attribute name="nilReason" type="gml:NilReasonType"/>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<element name="CountList" type="gml:integerOrNilReasonList" substitutionGroup="gml:AbstractScalarValueList"/>
+	<element name="Quantity" substitutionGroup="gml:AbstractScalarValue" nillable="true">
+		<annotation>
+			<documentation>An XML attribute uom ("unit of measure") is required, whose value is a URI which identifies the definition of a ratio scale or units by which the numeric value shall be multiplied, or an interval or position scale on which the value occurs.</documentation>
+		</annotation>
+		<complexType>
+			<simpleContent>
+				<extension base="gml:MeasureType">
+					<attribute name="nilReason" type="gml:NilReasonType"/>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<element name="QuantityList" type="gml:MeasureOrNilReasonListType" substitutionGroup="gml:AbstractScalarValueList"/>
+	<element name="AbstractValue" type="anyType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:AbstractValue is an abstract element which acts as the head of a substitution group which contains gml:AbstractScalarValue, gml:AbstractScalarValueList, gml:CompositeValue and gml:ValueExtent, and (transitively) the elements in their substitution groups.
+These elements may be used in an application schema as variables, so that in an XML instance document any member of its substitution group may occur.</documentation>
+		</annotation>
+	</element>
+	<element name="AbstractScalarValue" type="anyType" abstract="true" substitutionGroup="gml:AbstractValue">
+		<annotation>
+			<documentation>gml:AbstractScalarValue is an abstract element which acts as the head of a substitution group which contains gml:Boolean, gml:Category, gml:Count and gml:Quantity, and (transitively) the elements in their substitution groups.</documentation>
+		</annotation>
+	</element>
+	<element name="AbstractScalarValueList" type="anyType" abstract="true" substitutionGroup="gml:AbstractValue">
+		<annotation>
+			<documentation>gml:AbstractScalarValueList is an abstract element which acts as the head of a substitution group which contains gml:BooleanList, gml:CategoryList, gml:CountList and gml:QuantityList, and (transitively) the elements in their substitution groups.</documentation>
+		</annotation>
+	</element>
+	<group name="Value">
+		<annotation>
+			<documentation>This is a convenience choice group which unifies generic values defined in this Clause with spatial and temporal objects and the measures described above, so that any of these may be used within aggregate values.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:AbstractValue"/>
+			<element ref="gml:AbstractGeometry"/>
+			<element ref="gml:AbstractTimeObject"/>
+			<element ref="gml:Null"/>
+		</choice>
+	</group>
+	<element name="valueProperty" type="gml:ValuePropertyType">
+		<annotation>
+			<documentation>Property that refers to, or contains, a Value. Convenience element for general use.</documentation>
+		</annotation>
+	</element>
+	<element name="valueComponent" type="gml:ValuePropertyType">
+		<annotation>
+			<documentation>Property that refers to, or contains, a Value.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ValuePropertyType">
+		<sequence minOccurs="0">
+			<group ref="gml:Value"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="valueComponents" type="gml:ValueArrayPropertyType">
+		<annotation>
+			<documentation>Property that contains Values.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ValueArrayPropertyType">
+		<sequence maxOccurs="unbounded">
+			<group ref="gml:Value"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="CompositeValue" type="gml:CompositeValueType" substitutionGroup="gml:AbstractValue">
+		<annotation>
+			<documentation>gml:CompositeValue is an aggregate value built from other values . It contains zero or an arbitrary number of gml:valueComponent elements, and zero or one gml:valueComponents property elements.  It may be used for strongly coupled aggregates (vectors, tensors) or for arbitrary collections of values.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompositeValueType">
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:valueComponent" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:valueComponents" minOccurs="0"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ValueArray" type="gml:ValueArrayType" substitutionGroup="gml:CompositeValue">
+		<annotation>
+			<documentation>A Value Array is used for homogeneous arrays of primitive and aggregate values.  
+The member values may be scalars, composites, arrays or lists.
+ValueArray has the same content model as CompositeValue, but the member values shall be homogeneous.  The element declaration contains a Schematron constraint which expresses this restriction precisely.  Since the members are homogeneous, the gml:referenceSystem (uom, codeSpace) may be specified on the gml:ValueArray itself and inherited by all the members if desired.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ValueArrayType">
+		<complexContent>
+			<extension base="gml:CompositeValueType">
+				<attributeGroup ref="gml:referenceSystem"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<attributeGroup name="referenceSystem">
+		<attribute name="codeSpace" type="anyURI"/>
+		<attribute name="uom" type="gml:UomIdentifier"/>
+	</attributeGroup>
+	<element name="CategoryExtent" type="gml:CategoryExtentType" substitutionGroup="gml:AbstractValue"/>
+	<complexType name="CategoryExtentType">
+		<simpleContent>
+			<restriction base="gml:CodeOrNilReasonListType">
+				<length value="2"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<element name="CountExtent" type="gml:CountExtentType" substitutionGroup="gml:AbstractValue"/>
+	<simpleType name="CountExtentType">
+		<restriction base="gml:integerOrNilReasonList">
+			<length value="2"/>
+		</restriction>
+	</simpleType>
+	<element name="QuantityExtent" type="gml:QuantityExtentType" substitutionGroup="gml:AbstractValue"/>
+	<complexType name="QuantityExtentType">
+		<simpleContent>
+			<restriction base="gml:MeasureOrNilReasonListType">
+				<length value="2"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<complexType name="BooleanPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Boolean"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="CategoryPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Category"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="QuantityPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Quantity"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="CountPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Count"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ic/2.0/IC-ISM-v2.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ic/2.0/IC-ISM-v2.xsd
new file mode 100755
index 0000000..f9c0600
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ic/2.0/IC-ISM-v2.xsd
@@ -0,0 +1,553 @@
+<?xml version="1.0" ?>
+<!-- *********************************************************************** -->
+<!--                                UNCLASSIFIED                             -->
+<!-- *********************************************************************** -->
+<!-- *************************** IC ISM XML Schema ************************* -->
+
+<!--
+     The IC ISM XML Schema is described in the IC Information Security
+     Marking (IC ISM) Data Element Dictionary and the IC ISM Implementation
+     Guide. It is one of the Intelligence Community (IC) Metadata Standards
+     for Information Assurance.
+-->
+<!--    
+     IC ISM, Version 2.0, dated 30 April 2004
+
+     This file provides an XML-based schema for specification of metadata
+     for classification and controls markings.  The goal of the IC ISM XML
+     Schema is to provide a common set of XML attributes for implementing
+     security-based metadata throughout the IC. The IC ISM XML Schema
+     provides markup for the tokens that are used to format the CAPCO
+     markings.
+     
+     The IC ISM XML Schema may be incorporated into organizational 
+     XML-based schemas by (a) declaring the IC ISM v2.0 namespace and
+     (b) inserting an "import" statement:
+
+        <xsd:schema
+            xmlns="...my namespace name..."
+            targetNamespace="...my namespace name..."
+            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+            xmlns:ism="urn:us:gov:ic:ism:v2">
+        ...
+        <xsd:import 
+            namespace="urn:us:gov:ic:ism:v2"
+            schemaLocation="IC-ISM-v2.xsd" />
+		
+     IMPLEMENTATION NOTES:
+     
+     1. Refer to the Data Element Dictionary and Implementation Guide for an
+        explanation of the relationships of the IC ISM attributes and the 
+        associated controlled vocabularies.  The CAPCO Register and CAPCO
+        Implementation Manual provide business rules (that may be
+        classified) not provided in the DED or Implementation Guide.
+         
+     2. The IC ISM attributes are intended to support all CAPCO security
+        markings.  However, the attribute values are NOT intended to be
+        verbatim pieces of portionmarks and banners.  Instead, the values
+        should be interpreted by XSLT stylesheets or other formatting speci-
+        fications to produce the required portionmarks and banners.
+
+     3. The IC ISM schema is not a standalone construct; it should be
+        imported into a parent XML schema.
+     
+     4. The controlled vocabularies containing the required values for popu-
+        lating the attributes are defined in the Implementation Guide and
+        maintained as separate text files. The terms of the controlled
+        vocabularies are defined in the CAPCO Register.
+        
+     5. Attribute group "SecurityAttributesGroup" should be referenced
+        in the attribute definition list of any element that REQUIRES 
+        security metadata.
+     
+     6. Attribute group "SecurityAttributesOptionGroup" may be referenced
+        in the attribute definition list of any element for which
+        security metadata may be appropriate but is not required (such
+        as, an individual cell of a table).
+-->
+
+<xsd:schema
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  targetNamespace="urn:us:gov:ic:ism:v2"
+  xmlns="urn:us:gov:ic:ism:v2"
+  elementFormDefault="qualified"
+  xml:lang="en">
+  
+  <xsd:annotation>
+    <xsd:documentation>
+W3C XML Schema for the Intelligence Community Metadata Standard for
+Information Security Marking (IC-ISM), which is part of the IC
+standards for Information Assurance.
+    </xsd:documentation>
+  </xsd:annotation>
+  
+
+<!-- ************************************************************* -->
+<!-- TYPE DEFINITIONS ................................           . -->
+<!-- ************************************************************* -->
+
+  <xsd:simpleType name="ClassificationType">
+     <xsd:annotation>
+       <xsd:documentation>
+A simple type in which a name token is restricted to the US,
+non-US, and joint classification portionmark abbreviations from 
+the CAPCO Register.
+       </xsd:documentation>
+     </xsd:annotation>
+     <xsd:restriction base="xsd:NMTOKEN">
+        <xsd:enumeration value="U">
+           <xsd:annotation>
+              <xsd:documentation>
+US, non-US or joint UNCLASSIFIED.
+              </xsd:documentation>
+           </xsd:annotation>
+        </xsd:enumeration>
+        <xsd:enumeration value="C"/>
+        <xsd:enumeration value="S"/>
+        <xsd:enumeration value="TS"/>
+        <xsd:enumeration value="R"/>
+        <xsd:enumeration value="CTS"/>
+        <xsd:enumeration value="CTS-B"/>
+        <xsd:enumeration value="CTS-BALK"/>
+        <xsd:enumeration value="NU"/>
+        <xsd:enumeration value="NR"/>
+        <xsd:enumeration value="NC"/>
+        <xsd:enumeration value="NS"/>
+        <xsd:enumeration value="NS-S"/>
+        <xsd:enumeration value="NS-A"/>
+        <xsd:enumeration value="CTSA"/>
+        <xsd:enumeration value="NSAT"/>
+        <xsd:enumeration value="NCA"/>
+     </xsd:restriction>
+  </xsd:simpleType>
+
+
+<!-- ************************************************************* -->
+<!-- ATTRIBUTE GROUP DEFINITIONS ................................. -->
+<!-- ************************************************************* -->
+
+  <xsd:attributeGroup name="SecurityAttributesGroup">
+
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+The group of Information Security Marking attributes in which
+the use of attributes 'classification' and 'ownerProducer' is
+required. This group is to be contrasted with group
+'SecurityAttributesOptionGroup' in which use of those attributes
+is optional.
+      </xsd:documentation>
+    </xsd:annotation>
+  
+    <xsd:attribute ref="classification" use="required"/>
+    <xsd:attribute ref="ownerProducer" use="required"/>
+    <xsd:attribute ref="SCIcontrols" use="optional"/>
+    <xsd:attribute ref="SARIdentifier" use="optional"/>
+    <xsd:attribute ref="disseminationControls" use="optional"/>
+    <xsd:attribute ref="FGIsourceOpen" use="optional"/>
+    <xsd:attribute ref="FGIsourceProtected" use="optional"/>
+    <xsd:attribute ref="releasableTo" use="optional"/>
+    <xsd:attribute ref="nonICmarkings" use="optional"/>
+    <xsd:attribute ref="classifiedBy" use="optional"/>
+    <xsd:attribute ref="classificationReason" use="optional"/>
+    <xsd:attribute ref="derivedFrom" use="optional"/>
+    <xsd:attribute ref="declassDate" use="optional"/>
+    <xsd:attribute ref="declassEvent" use="optional"/>
+    <xsd:attribute ref="declassException" use="optional"/>
+    <xsd:attribute ref="typeOfExemptedSource" use="optional"/>
+    <xsd:attribute ref="dateOfExemptedSource" use="optional"/>
+    <xsd:attribute ref="declassManualReview" use="optional"/>
+  
+  </xsd:attributeGroup>
+  
+  
+  <xsd:attributeGroup name="SecurityAttributesOptionGroup">
+
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+The group of Information Security Marking attributes in which
+the use of attributes 'classification' and 'ownerProducer'
+is optional. This group is to be contrasted with group
+'SecurityAttributesGroup' in which use of these attributes
+is required.
+      </xsd:documentation>
+    </xsd:annotation>
+  
+    <xsd:attribute ref="classification" use="optional"/>
+    <xsd:attribute ref="ownerProducer" use="optional"/>
+    <xsd:attribute ref="SCIcontrols" use="optional"/>
+    <xsd:attribute ref="SARIdentifier" use="optional"/>
+    <xsd:attribute ref="disseminationControls" use="optional"/>
+    <xsd:attribute ref="FGIsourceOpen" use="optional"/>
+    <xsd:attribute ref="FGIsourceProtected" use="optional"/>
+    <xsd:attribute ref="releasableTo" use="optional"/>
+    <xsd:attribute ref="nonICmarkings" use="optional"/>
+    <xsd:attribute ref="classifiedBy" use="optional"/>
+    <xsd:attribute ref="classificationReason" use="optional"/>
+    <xsd:attribute ref="derivedFrom" use="optional"/>
+    <xsd:attribute ref="declassDate" use="optional"/>
+    <xsd:attribute ref="declassEvent" use="optional"/>
+    <xsd:attribute ref="declassException" use="optional"/>
+    <xsd:attribute ref="typeOfExemptedSource" use="optional"/>
+    <xsd:attribute ref="dateOfExemptedSource" use="optional"/>
+    <xsd:attribute ref="declassManualReview" use="optional"/>
+  
+  </xsd:attributeGroup>
+    
+  
+<!-- ************************************************************* -->
+<!-- GLOBAL ATTRIBUTE DECLARATIONS ............................... -->
+<!-- ************************************************************* -->
+
+  <xsd:attribute name="classification" type="ClassificationType"/>
+  
+  
+  <xsd:attribute name="ownerProducer">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+ISO 3166-1 trigraph(s) of the owner or producer country(ies) and/or
+CAPCO-specified tetragraphs of international organizations.
+Either (a) a single trigraph or tetragraph or (b) a space-delimited
+list of trigraphs followed by tetragraphs. Trigraphs must be in
+alphabetical order and tetragraphs must be in alphabetical order.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+  
+  
+  <xsd:attribute name="SCIcontrols">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+Authorized abbreviation(s) of SCI control system(s). Either
+(a) a single abbreviation or (b) a space-delimited list of
+abbreviations in the order prescribed in the CAPCO Register.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="SARIdentifier">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+Authorized Special Access Required program digraph(s) or
+trigraph(s) preceded by "SAR-". Either (a) a single digraph or
+trigraph or (b) a space-delimited list of digraphs or trigraphs.
+Example: "SAR-ABC SAR-DEF ..."
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="disseminationControls">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+Authorized dissemination control portion mark abbreviation(s).
+Either (a) a single abbreviation or (b) a space-delimited list
+of abbreviations in the order shown in the CAPCO Register.
+Exception: For the "REL" abbreviation, omit the country code
+trigraph(s) and instead place the trigraph(s) in the
+"releasableTo" attribute value.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="FGIsourceOpen">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+Non-US classification portion marking for foreign government
+information in a document portion. Use this attribute to record
+a source country when the intent is to post the document to a
+shared space with the source identified.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="FGIsourceProtected">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+Non-US classification portion marking for foreign government
+information in a document portion. Use this attribute to record
+a source country when the intent is to filter out the identity of
+the source prior to posting the document to a shared space.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="releasableTo">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+ISO 3166-1 trigraphic codes of countries to which the associated
+content can be released. Include "USA" in all instances. Use a space-
+delimited list with "USA" first, followed by the other trigraph(s)
+in alphabetical order.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="nonICmarkings">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+Authorized non-IC portion marking abbreviation(s) from the CAPCO
+Register. Either (a) a single non-IC abbreviated marking or
+(b) a space-delimited list of abbreviations in the order shown
+in the CAPCO Register.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="classifiedBy">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+Use as specified by E.O. 12958.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:string"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="classificationReason">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+A text string containing one or more paragraph numbers, 1.4(a)
+through 1.4(h), taken from E.O. 12958, as amended. Enter the
+paragraph references as they should appear in a
+classification/declassification block.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:string"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="derivedFrom">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+A text string containing (a) the title and date of a specific source
+document, or (b) the title and date of an organization classification
+guide, or (c) the literal string "Multiple Sources".
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:string"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="declassDate">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+A specific date, in the format YYYY-MM-DD, at which the applicable
+information is automatically declassified.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:date"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="declassEvent">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+A textual description of an event that triggers declassification.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:string"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="declassException">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+One or more of the exceptions to 25-year declassification:
+specify "25X1-human", "25X1", "25X2", ..., "25X9". If more than
+one exception applies, use a space-delimited list. If "25X1-human"
+applies, it should be first in a list.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="typeOfExemptedSource">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+One or more tokens indicating that a source that is exempted from
+automatic declassification applies. Specify "OADR", "X1", "X2", ...,
+"X8". If more than one applies, use a space-delimited list.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKENS"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="dateOfExemptedSource">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+A specific date, in the format YYYY-MM-DD. Used in conjunction with
+attribute "typeOfExemptedSource." If there are multiple exempted
+sources, specify the date of the exempted
+source that has the most recent date.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:date"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+
+  <xsd:attribute name="declassManualReview">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+A true/false indication that manual review is required for
+declassification. Use this attribute to force the appearance of
+"//MR" in the header and footer marking titles. Use this attribute
+ONLY when it is necessary to override the business logic applied to
+classification and control markings in the document to determine
+whether manual review is required.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:boolean"/>
+    </xsd:simpleType>
+  </xsd:attribute>
+        
+</xsd:schema>
+
+<!-- ***************************************************************
+                             USAGE GUIDELINES
+     ***************************************************************
+     
+     1. Use "classification" and "ownerProducer" together to specify
+     the classification and type of classification.
+     
+        a. If "ownerProducer" equals "USA," the classification is
+        a US classification and is restricted to "U," "C," "S" and
+        "TS."
+        
+        b. If "ownerProducer" equals a trigraph other than "USA" or
+        equals a tetragraph, the classification is a non-US classi-
+        fication.
+        
+        c. If "ownerProducer" equals two or more trigraphs or tetra-
+        graphs, the classification is a joint classification. If "USA"
+        is one of the trigraphs, the classification values are 
+        restricted as shown in a, above. If "USA" is not listed, the
+        permissible classification values include "R" in addition to
+        those in a, above.
+        
+     2. Use "classifiedBy" and "classificationReason" for original
+     classifications. Use "derivedFrom" for derived classifications.
+     
+     3. Use one and only one of:
+     
+        "declassDate"
+        "declassEvent"
+        "declassException"
+        "typeOfExemptedSource"
+        
+     4. If "typeOfExemptedSource" is used, "dateOfExemptedSource" must
+     also be used.
+     
+     5. Use "declassManualReview" to force the appearance of "//MR" in
+     header and footer marking titles. Otherwise, the applicability of
+     manual review should be determined from the other markings in the
+     document.
+     
+     6. Attribute "FGIsourceProtected" is included for use by organiza-
+     tions that want to use IC ISM internally and track protected
+     sources within the origanization private spaces. It is not
+     anticipated that this attribute will be used in documents posted
+     to the shared spaces.
+-->
+
+
+<!-- **************************************************************
+                            CHANGE HISTORY
+     **************************************************************
+*
+* VERSION: 1.0
+* DATE:    2002-07-05
+* BY:      IC MWG
+* PURPOSE: Released as a registered, production XML entity set.
+*
+* VERSION: 2.0
+* DATE:    2004-04-30
+* BY:      IC MWG
+* PURPOSE: Updated to support changes to the CAPCO Register and
+           Implementation Manual.
+* 
+*     - Added "ownerProducer" as a required attribute for entity
+*       "SecurityAttributes" and as an optional attribute for entity
+*       "SecurityAttributesOption."  Purpose is to provide a single method
+*       for specification of US, non-US, and joint classifications.
+*
+*     - Changed the enumerated list that is the declared value of attribute
+*       "classification" in order to accommodate non-US classifications.
+*     
+*     - Added optional attribute "SARIdentifier" as a separate container for
+*       DoD/DoE special-access-required nicknames, codewords, or trigraph/
+*       digraph to support elevation of SAR to the same level as SCI controls.
+*
+*     - Added optional attributes "classifiedBy" and "classificationReason"
+*       to support generation of EO 12958 classification/declassification
+*       blocks.
+*
+*     - Changed the declared value of "derivedFrom" to CDATA to allow the titles
+*       and dates of source documents or classification guides to be specified.
+*
+*     - Replaced the single attribute "declassification" with distinct attri-
+*       butes for date-determined and event-determined declassification and
+*       for the 25X declassification exceptions.
+*
+*     - Added attributes "typeOfExemptedSource" and "dateOfExemptedSource" for
+*       use in specifying that one or more sources was marked OADR, X1 through
+*       X8, or X-Foreign Relations.
+*
+*     - Added attribute "declassManualReview" for use in forcing "MR" to
+*       appear in header and footer banners (regardless of whether any
+*       caveats in the portions would necessitate manual review).
+*     
+*
+******************************** END CHANGE HISTORY ************************ -->
+
+<!-- *********************************************************************** -->
+<!--                               UNCLASSIFIED                              -->
+<!-- *********************************************************************** -->         
\ No newline at end of file
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/basicTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/basicTypes.xsd
new file mode 100755
index 0000000..b3353ac
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/basicTypes.xsd
@@ -0,0 +1,431 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gco="http://www.isotc211.org/2005/gco" targetNamespace="http://www.isotc211.org/2005/gco" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic COmmon (GCO) extensible markup language is a component of the XML Schema Implementation of Geographic
+Information Metadata documented in ISO/TS 19139:2007. GCO includes all the definitions of http://www.isotc211.org/2005/gco namespace. The root document of this namespace is the file gco.xsd. This basicTypes.xsd schema implements concepts from the "basic types" package of ISO/TS 19103.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
+	<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<xs:include schemaLocation="gco.xsd"/>
+	<xs:include schemaLocation="gcoBase.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- =========================================================================== -->
+	<xs:complexType name="TypeName_Type">
+		<xs:annotation>
+			<xs:documentation>A TypeName is a LocalName that references either a recordType or object type in some form of schema. The stored value "aName" is the returned value for the "aName()" operation. This is the types name.  - For parsing from types (or objects) the parsible name normally uses a "." navigation separator, so that it is of the form  [class].[member].[memberOfMember]. ...)</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="aName" type="gco:CharacterString_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="TypeName" type="gco:TypeName_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="TypeName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:TypeName"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MemberName_Type">
+		<xs:annotation>
+			<xs:documentation>A MemberName is a LocalName that references either an attribute slot in a record or  recordType or an attribute, operation, or association role in an object instance or  type description in some form of schema. The stored value "aName" is the returned value for the "aName()" operation.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="aName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="attributeType" type="gco:TypeName_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MemberName" type="gco:MemberName_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MemberName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:MemberName"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="Multiplicity_Type">
+		<xs:annotation>
+			<xs:documentation>Use to represent the possible cardinality of a relation. Represented by a set of simple multiplicity ranges.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="range" type="gco:MultiplicityRange_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="Multiplicity" type="gco:Multiplicity_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Multiplicity_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Multiplicity"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MultiplicityRange_Type">
+		<xs:annotation>
+			<xs:documentation>A component of a multiplicity, consisting of an non-negative lower bound, and a potentially infinite upper bound.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="lower" type="gco:Integer_PropertyType"/>
+					<xs:element name="upper" type="gco:UnlimitedInteger_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MultiplicityRange" type="gco:MultiplicityRange_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MultiplicityRange_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:MultiplicityRange"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!--================================================-->
+	<!-- ================== Measure ===================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Measure" type="gml:MeasureType"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Measure_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Measure"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Length" type="gml:LengthType" substitutionGroup="gco:Measure"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Length_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Length"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Angle" type="gml:AngleType" substitutionGroup="gco:Measure"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Angle_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Angle"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Scale" type="gml:ScaleType" substitutionGroup="gco:Measure"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Scale_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Scale"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Distance" type="gml:LengthType" substitutionGroup="gco:Length"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Distance_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Distance"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CharacterString" type="xs:string"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CharacterString_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:CharacterString"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Boolean" type="xs:boolean"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Boolean_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Boolean"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractGenericName" type="gml:CodeType" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="GenericName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:AbstractGenericName"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="LocalName" type="gml:CodeType" substitutionGroup="gco:AbstractGenericName"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LocalName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:LocalName"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="ScopedName" type="gml:CodeType" substitutionGroup="gco:AbstractGenericName"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ScopedName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:ScopedName"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ============================= UOM ========================================= -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomAngle_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomLength_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomScale_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UnitOfMeasure_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomArea_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomVelocity_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomTime_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomVolume_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- =========================== Date & DateTime ================================= -->
+	<!--=============================================-->
+	<xs:element name="DateTime" type="xs:dateTime"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DateTime_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:DateTime"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="Date_Type">
+		<xs:union memberTypes="xs:date xs:gYearMonth xs:gYear"/>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="Date" type="gco:Date_Type" nillable="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Date_PropertyType">
+		<xs:choice minOccurs="0">
+			<xs:element ref="gco:Date"/>
+			<xs:element ref="gco:DateTime"/>
+		</xs:choice>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- =========================== Number basic type =============================== -->
+	<!--=======================================================-->
+	<xs:complexType name="Number_PropertyType">
+		<xs:choice minOccurs="0">
+			<xs:element ref="gco:Real"/>
+			<xs:element ref="gco:Decimal"/>
+			<xs:element ref="gco:Integer"/>
+		</xs:choice>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Decimal" type="xs:decimal"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Decimal_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Decimal"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Real" type="xs:double"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Real_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Real"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Integer" type="xs:integer"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Integer_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Integer"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ============================= UnlimitedInteger ================================ -->
+	<!--NB: The encoding mechanism below is based on the use of XCPT (see the usage of xsi:nil in XML instance).-->
+	<!--================= Type ==================-->
+	<xs:complexType name="UnlimitedInteger_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:nonNegativeInteger">
+				<xs:attribute name="isInfinite" type="xs:boolean"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="UnlimitedInteger" type="gco:UnlimitedInteger_Type" nillable="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="UnlimitedInteger_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:UnlimitedInteger"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ========================= Record & RecordType ============================== -->
+	<!--================= Record ==================-->
+	<xs:element name="Record"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Record_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Record"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--================= RecordType ==================-->
+	<xs:complexType name="RecordType_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attributeGroup ref="xlink:simpleAttrs"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="RecordType" type="gco:RecordType_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="RecordType_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:RecordType"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- =========================== Binary basic type ================================ -->
+	<!--NB: this type is not declared in 19103 but used in 19115. -->
+	<!--================= Type ==================-->
+	<xs:complexType name="Binary_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="src" type="xs:anyURI"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="Binary" type="gco:Binary_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Binary_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Binary"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!--================================================-->
+	<!-- =============================================== -->
+	<!--================================================-->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/gco.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/gco.xsd
new file mode 100755
index 0000000..6090d49
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/gco.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" targetNamespace="http://www.isotc211.org/2005/gco" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic COmmon (GCO) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GCO includes all the definitions of http://www.isotc211.org/2005/gco namespace. The root document of this namespace is the file gco.xsd.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="basicTypes.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/gcoBase.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/gcoBase.xsd
new file mode 100755
index 0000000..78b9767
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gco/gcoBase.xsd
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml/3.2" targetNamespace="http://www.isotc211.org/2005/gco" elementFormDefault="qualified" attributeFormDefault="unqualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic COmmon (GCO) extensible markup language is a component of the XML Schema Implementation of Geographic
+Information Metadata documented in ISO/TS 19139:2007. GCO includes all the definitions of http://www.isotc211.org/2005/gco namespace. The root document of this namespace is the file gco.xsd. This gcoBase.xsd schema provides:
+		1.  tools to handle specific objects like "code lists" and "record";
+		2. Some XML types representing that do not follow the general encoding rules.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
+	<xs:include schemaLocation="gco.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- =========================================================================== -->
+	<!-- ========================= IM_Object: abstract Root ============================= -->
+	<!--================= Type ===================-->
+	<xs:complexType name="AbstractObject_Type" abstract="true">
+		<xs:sequence/>
+		<xs:attributeGroup ref="gco:ObjectIdentification"/>
+	</xs:complexType>
+	<!--================= Element =================-->
+	<xs:element name="AbstractObject" type="gco:AbstractObject_Type" abstract="true"/>
+	<!-- ========================================================================== -->
+	<!-- ====================== Reference of a resource =============================== -->
+	<!--The following attributeGroup 'extends' the GML  gml:AssociationAttributeGroup-->
+	<xs:attributeGroup name="ObjectReference">
+		<xs:attributeGroup ref="xlink:simpleAttrs"/>
+		<xs:attribute name="uuidref" type="xs:string"/>
+	</xs:attributeGroup>
+	<!--================== NULL ====================-->
+	<xs:attribute name="nilReason" type="gml:NilReasonType"/>
+	<!--=============== PropertyType =================-->
+	<xs:complexType name="ObjectReference_PropertyType">
+		<xs:sequence/>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ====================== Identification of a resource ============================== -->
+	<xs:attributeGroup name="ObjectIdentification">
+		<xs:attribute name="id" type="xs:ID"/>
+		<xs:attribute name="uuid" type="xs:string"/>
+	</xs:attributeGroup>
+	<!-- ========================================================================== -->
+	<!-- ====================== The CodeList prototype ================================= -->
+	<!--It is used to refer to a specific codeListValue in a register-->
+	<!--================= Type ==================-->
+	<xs:complexType name="CodeListValue_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="codeList" type="xs:anyURI" use="required"/>
+				<xs:attribute name="codeListValue" type="xs:anyURI" use="required"/>
+				<xs:attribute name="codeSpace" type="xs:anyURI"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ========================== The isoType attribute ============================== -->
+	<xs:attribute name="isoType" type="xs:string"/>
+	<!--==============End================-->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/applicationSchema.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/applicationSchema.xsd
new file mode 100755
index 0000000..f333a2b
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/applicationSchema.xsd
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This applicationSchema.xsd schema implements the UML conceptual schema defined in A.2.12 of ISO 19115:2003. It contains the implementation of the class MD_Application [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_ApplicationSchemaInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the application schema used to build the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gmd:CI_Citation_PropertyType"/>
+					<xs:element name="schemaLanguage" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="constraintLanguage" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="schemaAscii" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="graphicsFile" type="gco:Binary_PropertyType" minOccurs="0"/>
+					<xs:element name="softwareDevelopmentFile" type="gco:Binary_PropertyType" minOccurs="0"/>
+					<xs:element name="softwareDevelopmentFileFormat" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ApplicationSchemaInformation" type="gmd:MD_ApplicationSchemaInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ApplicationSchemaInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ApplicationSchemaInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/citation.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/citation.xsd
new file mode 100755
index 0000000..6ec6677
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/citation.xsd
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This citation.xsd schema implements the UML conceptual schema defined in A.3.2 of ISO 19115:2003. It contains the implementation of the following classes: CI_Responsi [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="referenceSystem.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="CI_ResponsibleParty_Type">
+		<xs:annotation>
+			<xs:documentation>Identification of, and means of communication with, person(s) and organisations associated with the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="individualName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="organisationName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="positionName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="contactInfo" type="gmd:CI_Contact_PropertyType" minOccurs="0"/>
+					<xs:element name="role" type="gmd:CI_RoleCode_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_ResponsibleParty" type="gmd:CI_ResponsibleParty_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_ResponsibleParty_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_ResponsibleParty"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Citation_Type">
+		<xs:annotation>
+			<xs:documentation>Standardized resource reference</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="title" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="alternateTitle" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="date" type="gmd:CI_Date_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="edition" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="editionDate" type="gco:Date_PropertyType" minOccurs="0"/>
+					<xs:element name="identifier" type="gmd:MD_Identifier_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="citedResponsibleParty" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="presentationForm" type="gmd:CI_PresentationFormCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="series" type="gmd:CI_Series_PropertyType" minOccurs="0"/>
+					<xs:element name="otherCitationDetails" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="collectiveTitle" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="ISBN" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="ISSN" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Citation" type="gmd:CI_Citation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Citation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Citation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Address_Type">
+		<xs:annotation>
+			<xs:documentation>Location of the responsible individual or organisation</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="deliveryPoint" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="city" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="administrativeArea" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="postalCode" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="country" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="electronicMailAddress" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Address" type="gmd:CI_Address_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Address_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Address"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_OnlineResource_Type">
+		<xs:annotation>
+			<xs:documentation>Information about online sources from which the dataset, specification, or community profile name and extended metadata elements can be obtained.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="linkage" type="gmd:URL_PropertyType"/>
+					<xs:element name="protocol" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="applicationProfile" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="name" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="function" type="gmd:CI_OnLineFunctionCode_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_OnlineResource" type="gmd:CI_OnlineResource_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_OnlineResource_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_OnlineResource"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Contact_Type">
+		<xs:annotation>
+			<xs:documentation>Information required enabling contact with the  responsible person and/or organisation</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="phone" type="gmd:CI_Telephone_PropertyType" minOccurs="0"/>
+					<xs:element name="address" type="gmd:CI_Address_PropertyType" minOccurs="0"/>
+					<xs:element name="onlineResource" type="gmd:CI_OnlineResource_PropertyType" minOccurs="0"/>
+					<xs:element name="hoursOfService" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="contactInstructions" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Contact" type="gmd:CI_Contact_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Contact_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Contact"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Telephone_Type">
+		<xs:annotation>
+			<xs:documentation>Telephone numbers for contacting the responsible individual or organisation</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="voice" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="facsimile" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Telephone" type="gmd:CI_Telephone_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Telephone_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Telephone"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Date_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="date" type="gco:Date_PropertyType"/>
+					<xs:element name="dateType" type="gmd:CI_DateTypeCode_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Date" type="gmd:CI_Date_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Date_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Date"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Series_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="issueIdentification" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="page" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Series" type="gmd:CI_Series_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Series_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Series"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="URL" type="xs:anyURI"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="URL_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:URL"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CI_RoleCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_RoleCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_RoleCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CI_PresentationFormCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_PresentationFormCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_PresentationFormCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CI_OnLineFunctionCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_OnLineFunctionCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_OnLineFunctionCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CI_DateTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_DateTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_DateTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/constraints.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/constraints.xsd
new file mode 100755
index 0000000..5986c09
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/constraints.xsd
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This constraints.xsd schema implements the UML conceptual schema defined in A.2.3 of ISO 19115:2003. It contains the implementation of the following classes: MD_Const [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_Constraints_Type">
+		<xs:annotation>
+			<xs:documentation>Restrictions on the access and use of a dataset or metadata</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="useLimitation" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Constraints" type="gmd:MD_Constraints_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Constraints_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Constraints"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_LegalConstraints_Type">
+		<xs:annotation>
+			<xs:documentation>Restrictions and legal prerequisites for accessing and using the dataset.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_Constraints_Type">
+				<xs:sequence>
+					<xs:element name="accessConstraints" type="gmd:MD_RestrictionCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="useConstraints" type="gmd:MD_RestrictionCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="otherConstraints" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_LegalConstraints" type="gmd:MD_LegalConstraints_Type" substitutionGroup="gmd:MD_Constraints"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_LegalConstraints_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_LegalConstraints"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_SecurityConstraints_Type">
+		<xs:annotation>
+			<xs:documentation>Handling restrictions imposed on the dataset because of national security, privacy, or other concerns</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_Constraints_Type">
+				<xs:sequence>
+					<xs:element name="classification" type="gmd:MD_ClassificationCode_PropertyType"/>
+					<xs:element name="userNote" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="classificationSystem" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="handlingDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_SecurityConstraints" type="gmd:MD_SecurityConstraints_Type" substitutionGroup="gmd:MD_Constraints"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_SecurityConstraints_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_SecurityConstraints"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ClassificationCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ClassificationCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ClassificationCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_RestrictionCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_RestrictionCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_RestrictionCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/content.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/content.xsd
new file mode 100755
index 0000000..0381452
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/content.xsd
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This content.xsd schema implements the UML conceptual schema defined in ISO 19115:2003, A.2.8. It contains the implementation of the following classes: MD_FeatureCata [...]
+MD_ImageDescription, MD_ContentInformation, MD_RangeDimension, MD_Band, MD_CoverageContentTypeCode, MD_ImagingConditionCode.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_FeatureCatalogueDescription_Type">
+		<xs:annotation>
+			<xs:documentation>Information identifing the feature catalogue</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_ContentInformation_Type">
+				<xs:sequence>
+					<xs:element name="complianceCode" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="language" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="includedWithDataset" type="gco:Boolean_PropertyType"/>
+					<xs:element name="featureTypes" type="gco:GenericName_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="featureCatalogueCitation" type="gmd:CI_Citation_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_FeatureCatalogueDescription" type="gmd:MD_FeatureCatalogueDescription_Type" substitutionGroup="gmd:AbstractMD_ContentInformation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_FeatureCatalogueDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_FeatureCatalogueDescription"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_CoverageDescription_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the domain of the raster cell</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_ContentInformation_Type">
+				<xs:sequence>
+					<xs:element name="attributeDescription" type="gco:RecordType_PropertyType"/>
+					<xs:element name="contentType" type="gmd:MD_CoverageContentTypeCode_PropertyType"/>
+					<xs:element name="dimension" type="gmd:MD_RangeDimension_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CoverageDescription" type="gmd:MD_CoverageDescription_Type" substitutionGroup="gmd:AbstractMD_ContentInformation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CoverageDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CoverageDescription"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ImageDescription_Type">
+		<xs:annotation>
+			<xs:documentation>Information about an image's suitability for use</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_CoverageDescription_Type">
+				<xs:sequence>
+					<xs:element name="illuminationElevationAngle" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="illuminationAzimuthAngle" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="imagingCondition" type="gmd:MD_ImagingConditionCode_PropertyType" minOccurs="0"/>
+					<xs:element name="imageQualityCode" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="cloudCoverPercentage" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="processingLevelCode" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="compressionGenerationQuantity" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="triangulationIndicator" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="radiometricCalibrationDataAvailability" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="cameraCalibrationInformationAvailability" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="filmDistortionInformationAvailability" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="lensDistortionInformationAvailability" type="gco:Boolean_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ImageDescription" type="gmd:MD_ImageDescription_Type" substitutionGroup="gmd:MD_CoverageDescription"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ImageDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ImageDescription"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractMD_ContentInformation_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractMD_ContentInformation" type="gmd:AbstractMD_ContentInformation_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ContentInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractMD_ContentInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_RangeDimension_Type">
+		<xs:annotation>
+			<xs:documentation>Set of adjacent wavelengths in the electro-magnetic spectrum with a common characteristic, such as the visible band</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="sequenceIdentifier" type="gco:MemberName_PropertyType" minOccurs="0"/>
+					<xs:element name="descriptor" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_RangeDimension" type="gmd:MD_RangeDimension_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_RangeDimension_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_RangeDimension"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Band_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_RangeDimension_Type">
+				<xs:sequence>
+					<xs:element name="maxValue" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="minValue" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="units" type="gco:UomLength_PropertyType" minOccurs="0"/>
+					<xs:element name="peakResponse" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="bitsPerValue" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="toneGradation" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="scaleFactor" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="offset" type="gco:Real_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Band" type="gmd:MD_Band_Type" substitutionGroup="gmd:MD_RangeDimension"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Band_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Band"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CoverageContentTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CoverageContentTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CoverageContentTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ImagingConditionCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ImagingConditionCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ImagingConditionCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/dataQuality.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/dataQuality.xsd
new file mode 100755
index 0000000..cb08ed5
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/dataQuality.xsd
@@ -0,0 +1,556 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This dataQuality.xsd schema implements the UML conceptual schema defined in A.2.4 of ISO 19115:2003. It contains the implementation of the following classes: LI_Proce [...]
+DQ_ConformanceResult, DQ_QuantitativeResult, DQ_Result, DQ_TemporalValidity, DQ_AccuracyOfATimeMeasurement, DQ_QuantitativeAttributeAccuracy, DQ_NonQuantitativeAttributeAccuracy, DQ_ThematicClassificationCorrectness, DQ_RelativeInternalPositionalAccuracy, DQ_GriddedDataPositionalAccuracy, DQ_AbsoluteExternalPositionalAccuracy, DQ_TopologicalConsistency, DQ_FormatConsistency, DQ_DomainConsistency, DQ_ConceptualConsistency, DQ_CompletenessOmission, DQ_CompletenessCommission, DQ_TemporalAcc [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="identification.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="LI_ProcessStep_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="description" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="rationale" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="dateTime" type="gco:DateTime_PropertyType" minOccurs="0"/>
+					<xs:element name="processor" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="source" type="gmd:LI_Source_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="LI_ProcessStep" type="gmd:LI_ProcessStep_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LI_ProcessStep_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:LI_ProcessStep"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="LI_Source_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="scaleDenominator" type="gmd:MD_RepresentativeFraction_PropertyType" minOccurs="0"/>
+					<xs:element name="sourceReferenceSystem" type="gmd:MD_ReferenceSystem_PropertyType" minOccurs="0"/>
+					<xs:element name="sourceCitation" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="sourceExtent" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="sourceStep" type="gmd:LI_ProcessStep_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="LI_Source" type="gmd:LI_Source_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LI_Source_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:LI_Source"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="LI_Lineage_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="statement" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="processStep" type="gmd:LI_ProcessStep_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="source" type="gmd:LI_Source_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="LI_Lineage" type="gmd:LI_Lineage_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LI_Lineage_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:LI_Lineage"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_ConformanceResult_Type">
+		<xs:annotation>
+			<xs:documentation>quantitative_result from Quality Procedures -  - renamed to remove implied use limitiation.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Result_Type">
+				<xs:sequence>
+					<xs:element name="specification" type="gmd:CI_Citation_PropertyType"/>
+					<xs:element name="explanation" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="pass" type="gco:Boolean_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_ConformanceResult" type="gmd:DQ_ConformanceResult_Type" substitutionGroup="gmd:AbstractDQ_Result"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_ConformanceResult_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_ConformanceResult"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_QuantitativeResult_Type">
+		<xs:annotation>
+			<xs:documentation>Quantitative_conformance_measure from Quality Procedures.  -  - Renamed to remove implied use limitation -  - OCL - -- result is type specified by valueDomain - result.tupleType = valueDomain</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Result_Type">
+				<xs:sequence>
+					<xs:element name="valueType" type="gco:RecordType_PropertyType" minOccurs="0"/>
+					<xs:element name="valueUnit" type="gco:UnitOfMeasure_PropertyType"/>
+					<xs:element name="errorStatistic" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="value" type="gco:Record_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_QuantitativeResult" type="gmd:DQ_QuantitativeResult_Type" substitutionGroup="gmd:AbstractDQ_Result"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_QuantitativeResult_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_QuantitativeResult"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_Result_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_Result" type="gmd:AbstractDQ_Result_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_Result_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_Result"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_TemporalValidity_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_TemporalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_TemporalValidity" type="gmd:DQ_TemporalValidity_Type" substitutionGroup="gmd:AbstractDQ_TemporalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_TemporalValidity_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_TemporalValidity"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_TemporalConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_TemporalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_TemporalConsistency" type="gmd:DQ_TemporalConsistency_Type" substitutionGroup="gmd:AbstractDQ_TemporalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_TemporalConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_TemporalConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_AccuracyOfATimeMeasurement_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_TemporalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_AccuracyOfATimeMeasurement" type="gmd:DQ_AccuracyOfATimeMeasurement_Type" substitutionGroup="gmd:AbstractDQ_TemporalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_AccuracyOfATimeMeasurement_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_AccuracyOfATimeMeasurement"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_QuantitativeAttributeAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_ThematicAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_QuantitativeAttributeAccuracy" type="gmd:DQ_QuantitativeAttributeAccuracy_Type" substitutionGroup="gmd:AbstractDQ_ThematicAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_QuantitativeAttributeAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_QuantitativeAttributeAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_NonQuantitativeAttributeAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_ThematicAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_NonQuantitativeAttributeAccuracy" type="gmd:DQ_NonQuantitativeAttributeAccuracy_Type" substitutionGroup="gmd:AbstractDQ_ThematicAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_NonQuantitativeAttributeAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_NonQuantitativeAttributeAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_ThematicClassificationCorrectness_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_ThematicAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_ThematicClassificationCorrectness" type="gmd:DQ_ThematicClassificationCorrectness_Type" substitutionGroup="gmd:AbstractDQ_ThematicAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_ThematicClassificationCorrectness_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_ThematicClassificationCorrectness"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_RelativeInternalPositionalAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_PositionalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_RelativeInternalPositionalAccuracy" type="gmd:DQ_RelativeInternalPositionalAccuracy_Type" substitutionGroup="gmd:AbstractDQ_PositionalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_RelativeInternalPositionalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_RelativeInternalPositionalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_GriddedDataPositionalAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_PositionalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_GriddedDataPositionalAccuracy" type="gmd:DQ_GriddedDataPositionalAccuracy_Type" substitutionGroup="gmd:AbstractDQ_PositionalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_GriddedDataPositionalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_GriddedDataPositionalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_AbsoluteExternalPositionalAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_PositionalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_AbsoluteExternalPositionalAccuracy" type="gmd:DQ_AbsoluteExternalPositionalAccuracy_Type" substitutionGroup="gmd:AbstractDQ_PositionalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_AbsoluteExternalPositionalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_AbsoluteExternalPositionalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_TopologicalConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_LogicalConsistency_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_TopologicalConsistency" type="gmd:DQ_TopologicalConsistency_Type" substitutionGroup="gmd:AbstractDQ_LogicalConsistency"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_TopologicalConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_TopologicalConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_FormatConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_LogicalConsistency_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_FormatConsistency" type="gmd:DQ_FormatConsistency_Type" substitutionGroup="gmd:AbstractDQ_LogicalConsistency"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_FormatConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_FormatConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_DomainConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_LogicalConsistency_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_DomainConsistency" type="gmd:DQ_DomainConsistency_Type" substitutionGroup="gmd:AbstractDQ_LogicalConsistency"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_DomainConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_DomainConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_ConceptualConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_LogicalConsistency_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_ConceptualConsistency" type="gmd:DQ_ConceptualConsistency_Type" substitutionGroup="gmd:AbstractDQ_LogicalConsistency"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_ConceptualConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_ConceptualConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_CompletenessOmission_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Completeness_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_CompletenessOmission" type="gmd:DQ_CompletenessOmission_Type" substitutionGroup="gmd:AbstractDQ_Completeness"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_CompletenessOmission_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_CompletenessOmission"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_CompletenessCommission_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Completeness_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_CompletenessCommission" type="gmd:DQ_CompletenessCommission_Type" substitutionGroup="gmd:AbstractDQ_Completeness"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_CompletenessCommission_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_CompletenessCommission"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_TemporalAccuracy_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_TemporalAccuracy" type="gmd:AbstractDQ_TemporalAccuracy_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_TemporalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_TemporalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_ThematicAccuracy_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_ThematicAccuracy" type="gmd:AbstractDQ_ThematicAccuracy_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_ThematicAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_ThematicAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_PositionalAccuracy_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_PositionalAccuracy" type="gmd:AbstractDQ_PositionalAccuracy_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_PositionalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_PositionalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_LogicalConsistency_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_LogicalConsistency" type="gmd:AbstractDQ_LogicalConsistency_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_LogicalConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_LogicalConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_Completeness_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_Completeness" type="gmd:AbstractDQ_Completeness_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_Completeness_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_Completeness"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_Element_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="nameOfMeasure" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="measureIdentification" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="measureDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="evaluationMethodType" type="gmd:DQ_EvaluationMethodTypeCode_PropertyType" minOccurs="0"/>
+					<xs:element name="evaluationMethodDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="evaluationProcedure" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="dateTime" type="gco:DateTime_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="result" type="gmd:DQ_Result_PropertyType" maxOccurs="2"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_Element" type="gmd:AbstractDQ_Element_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_Element_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_Element"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_DataQuality_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="scope" type="gmd:DQ_Scope_PropertyType"/>
+					<xs:element name="report" type="gmd:DQ_Element_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="lineage" type="gmd:LI_Lineage_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_DataQuality" type="gmd:DQ_DataQuality_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_DataQuality_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_DataQuality"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_Scope_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="level" type="gmd:MD_ScopeCode_PropertyType"/>
+					<xs:element name="extent" type="gmd:EX_Extent_PropertyType" minOccurs="0"/>
+					<xs:element name="levelDescription" type="gmd:MD_ScopeDescription_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_Scope" type="gmd:DQ_Scope_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_Scope_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_Scope"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_EvaluationMethodTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_EvaluationMethodTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_EvaluationMethodTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/distribution.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/distribution.xsd
new file mode 100755
index 0000000..435e235
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/distribution.xsd
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This distribution.xsd schema implements the UML conceptual schema defined in A.2.10 of ISO 19115:2003. It contains the implementation of the following classes: MD_Med [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_Medium_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the media on which the data can be distributed</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gmd:MD_MediumNameCode_PropertyType" minOccurs="0"/>
+					<xs:element name="density" type="gco:Real_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="densityUnits" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="volumes" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="mediumFormat" type="gmd:MD_MediumFormatCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="mediumNote" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Medium" type="gmd:MD_Medium_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Medium_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Medium"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_DigitalTransferOptions_Type">
+		<xs:annotation>
+			<xs:documentation>Technical means and media by which a dataset is obtained from the distributor</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="unitsOfDistribution" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="transferSize" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="onLine" type="gmd:CI_OnlineResource_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="offLine" type="gmd:MD_Medium_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DigitalTransferOptions" type="gmd:MD_DigitalTransferOptions_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DigitalTransferOptions_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DigitalTransferOptions"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_StandardOrderProcess_Type">
+		<xs:annotation>
+			<xs:documentation>Common ways in which the dataset may be obtained or received, and related instructions and fee information</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="fees" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="plannedAvailableDateTime" type="gco:DateTime_PropertyType" minOccurs="0"/>
+					<xs:element name="orderingInstructions" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="turnaround" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_StandardOrderProcess" type="gmd:MD_StandardOrderProcess_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_StandardOrderProcess_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_StandardOrderProcess"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Distributor_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the distributor</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="distributorContact" type="gmd:CI_ResponsibleParty_PropertyType"/>
+					<xs:element name="distributionOrderProcess" type="gmd:MD_StandardOrderProcess_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="distributorFormat" type="gmd:MD_Format_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="distributorTransferOptions" type="gmd:MD_DigitalTransferOptions_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Distributor" type="gmd:MD_Distributor_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Distributor_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Distributor"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Distribution_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the distributor of and options for obtaining the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="distributionFormat" type="gmd:MD_Format_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="distributor" type="gmd:MD_Distributor_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="transferOptions" type="gmd:MD_DigitalTransferOptions_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Distribution" type="gmd:MD_Distribution_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Distribution_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Distribution"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Format_Type">
+		<xs:annotation>
+			<xs:documentation>Description of the form of the data to be distributed</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="version" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="amendmentNumber" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="specification" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="fileDecompressionTechnique" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="formatDistributor" type="gmd:MD_Distributor_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Format" type="gmd:MD_Format_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Format_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Format"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DistributionUnits" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DistributionUnits_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DistributionUnits"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MediumFormatCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MediumFormatCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MediumFormatCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MediumNameCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MediumNameCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MediumNameCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/extent.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/extent.xsd
new file mode 100755
index 0000000..4ada781
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/extent.xsd
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This extent.xsd schema implements the UML conceptual schema defined in A.3.1 of ISO 19115:2003 and the associated corrigendum. It contains the implementation of the f [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gss" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gss/gss.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gts" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gts/gts.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gsr" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gsr/gsr.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="referenceSystem.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="EX_TemporalExtent_Type">
+		<xs:annotation>
+			<xs:documentation>Time period covered by the content of the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="extent" type="gts:TM_Primitive_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_TemporalExtent" type="gmd:EX_TemporalExtent_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_TemporalExtent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_TemporalExtent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_VerticalExtent_Type">
+		<xs:annotation>
+			<xs:documentation>Vertical domain of dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="minimumValue" type="gco:Real_PropertyType"/>
+					<xs:element name="maximumValue" type="gco:Real_PropertyType"/>
+					<xs:element name="verticalCRS" type="gsr:SC_CRS_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_VerticalExtent" type="gmd:EX_VerticalExtent_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_VerticalExtent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_VerticalExtent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_BoundingPolygon_Type">
+		<xs:annotation>
+			<xs:documentation>Boundary enclosing the dataset expressed as the closed set of (x,y) coordinates of the polygon (last point replicates first point)</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractEX_GeographicExtent_Type">
+				<xs:sequence>
+					<xs:element name="polygon" type="gss:GM_Object_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_BoundingPolygon" type="gmd:EX_BoundingPolygon_Type" substitutionGroup="gmd:AbstractEX_GeographicExtent"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_BoundingPolygon_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_BoundingPolygon"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_Extent_Type">
+		<xs:annotation>
+			<xs:documentation>Information about spatial, vertical, and temporal extent</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="geographicElement" type="gmd:EX_GeographicExtent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="temporalElement" type="gmd:EX_TemporalExtent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="verticalElement" type="gmd:EX_VerticalExtent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_Extent" type="gmd:EX_Extent_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_Extent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_Extent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractEX_GeographicExtent_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Geographic area of the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="extentTypeCode" type="gco:Boolean_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractEX_GeographicExtent" type="gmd:AbstractEX_GeographicExtent_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_GeographicExtent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractEX_GeographicExtent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_GeographicBoundingBox_Type">
+		<xs:annotation>
+			<xs:documentation>Geographic area of the entire dataset referenced to WGS 84</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractEX_GeographicExtent_Type">
+				<xs:sequence>
+					<xs:element name="westBoundLongitude" type="gco:Decimal_PropertyType"/>
+					<xs:element name="eastBoundLongitude" type="gco:Decimal_PropertyType"/>
+					<xs:element name="southBoundLatitude" type="gco:Decimal_PropertyType"/>
+					<xs:element name="northBoundLatitude" type="gco:Decimal_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_GeographicBoundingBox" type="gmd:EX_GeographicBoundingBox_Type" substitutionGroup="gmd:AbstractEX_GeographicExtent"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_GeographicBoundingBox_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_GeographicBoundingBox"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_SpatialTemporalExtent_Type">
+		<xs:annotation>
+			<xs:documentation>Extent with respect to date and time</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:EX_TemporalExtent_Type">
+				<xs:sequence>
+					<xs:element name="spatialExtent" type="gmd:EX_GeographicExtent_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_SpatialTemporalExtent" type="gmd:EX_SpatialTemporalExtent_Type" substitutionGroup="gmd:EX_TemporalExtent"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_SpatialTemporalExtent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_SpatialTemporalExtent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_GeographicDescription_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractEX_GeographicExtent_Type">
+				<xs:sequence>
+					<xs:element name="geographicIdentifier" type="gmd:MD_Identifier_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_GeographicDescription" type="gmd:EX_GeographicDescription_Type" substitutionGroup="gmd:AbstractEX_GeographicExtent"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_GeographicDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_GeographicDescription"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/freeText.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/freeText.xsd
new file mode 100755
index 0000000..ff9ffa8
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/freeText.xsd
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This freeText.xsd schema implements cultural and linguistic adaptability extensions defined in 7.3 of ISO/TS 19139:2007. This extension essentially formalizes the fre [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="identification.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="PT_FreeText_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="textGroup" type="gmd:LocalisedCharacterString_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="PT_FreeText" type="gmd:PT_FreeText_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="PT_FreeText_PropertyType">
+		<xs:complexContent>
+			<xs:extension base="gco:CharacterString_PropertyType">
+				<xs:sequence minOccurs="0">
+					<xs:element ref="gmd:PT_FreeText"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="PT_Locale_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="languageCode" type="gmd:LanguageCode_PropertyType"/>
+					<xs:element name="country" type="gmd:Country_PropertyType" minOccurs="0"/>
+					<xs:element name="characterEncoding" type="gmd:MD_CharacterSetCode_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="PT_Locale" type="gmd:PT_Locale_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="PT_Locale_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:PT_Locale"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="LocalisedCharacterString_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="id" type="xs:ID"/>
+				<xs:attribute name="locale" type="xs:anyURI"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="LocalisedCharacterString" type="gmd:LocalisedCharacterString_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LocalisedCharacterString_PropertyType">
+		<xs:complexContent>
+			<xs:extension base="gco:ObjectReference_PropertyType">
+				<xs:sequence minOccurs="0">
+					<xs:element ref="gmd:LocalisedCharacterString"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="PT_LocaleContainer_Type">
+		<xs:sequence>
+			<xs:element name="description" type="gco:CharacterString_PropertyType"/>
+			<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+			<xs:element name="date" type="gmd:CI_Date_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="responsibleParty" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="localisedString" type="gmd:LocalisedCharacterString_PropertyType" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="PT_LocaleContainer" type="gmd:PT_LocaleContainer_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="PT_LocaleContainer_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:PT_LocaleContainer"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="LanguageCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LanguageCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:LanguageCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Country" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Country_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:Country"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--====EOF====-->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd
new file mode 100755
index 0000000..8037c8a
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gmd="http://www.isotc211.org/2005/gmd" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="metadataApplication.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/identification.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/identification.xsd
new file mode 100755
index 0000000..0e87995
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/identification.xsd
@@ -0,0 +1,349 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This identification.xsd schema implements the UML conceptual schema defined in A.2.2 of ISO 19115:2003. It contains the implementation of the following classes: MD_Id [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="constraints.xsd"/>
+	<xs:include schemaLocation="distribution.xsd"/>
+	<xs:include schemaLocation="maintenance.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="AbstractMD_Identification_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Basic information about data</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="citation" type="gmd:CI_Citation_PropertyType"/>
+					<xs:element name="abstract" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="purpose" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="credit" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="status" type="gmd:MD_ProgressCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="pointOfContact" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceMaintenance" type="gmd:MD_MaintenanceInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="graphicOverview" type="gmd:MD_BrowseGraphic_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceFormat" type="gmd:MD_Format_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="descriptiveKeywords" type="gmd:MD_Keywords_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceSpecificUsage" type="gmd:MD_Usage_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceConstraints" type="gmd:MD_Constraints_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="aggregationInfo" type="gmd:MD_AggregateInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractMD_Identification" type="gmd:AbstractMD_Identification_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Identification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractMD_Identification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_BrowseGraphic_Type">
+		<xs:annotation>
+			<xs:documentation>Graphic that provides an illustration of the dataset (should include a legend for the graphic)</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="fileName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="fileDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="fileType" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_BrowseGraphic" type="gmd:MD_BrowseGraphic_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_BrowseGraphic_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_BrowseGraphic"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_DataIdentification_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_Identification_Type">
+				<xs:sequence>
+					<xs:element name="spatialRepresentationType" type="gmd:MD_SpatialRepresentationTypeCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="spatialResolution" type="gmd:MD_Resolution_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="language" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="characterSet" type="gmd:MD_CharacterSetCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="topicCategory" type="gmd:MD_TopicCategoryCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="environmentDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="extent" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="supplementalInformation" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DataIdentification" type="gmd:MD_DataIdentification_Type" substitutionGroup="gmd:AbstractMD_Identification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DataIdentification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DataIdentification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ServiceIdentification_Type">
+		<xs:annotation>
+			<xs:documentation>See 19119 for further info</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_Identification_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ServiceIdentification" type="gmd:MD_ServiceIdentification_Type" substitutionGroup="gmd:AbstractMD_Identification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ServiceIdentification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ServiceIdentification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_RepresentativeFraction_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="denominator" type="gco:Integer_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_RepresentativeFraction" type="gmd:MD_RepresentativeFraction_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_RepresentativeFraction_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_RepresentativeFraction"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Usage_Type">
+		<xs:annotation>
+			<xs:documentation>Brief description of ways in which the dataset is currently used.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="specificUsage" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="usageDateTime" type="gco:DateTime_PropertyType" minOccurs="0"/>
+					<xs:element name="userDeterminedLimitations" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="userContactInfo" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Usage" type="gmd:MD_Usage_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Usage_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Usage"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Keywords_Type">
+		<xs:annotation>
+			<xs:documentation>Keywords, their type and reference source</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="keyword" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="type" type="gmd:MD_KeywordTypeCode_PropertyType" minOccurs="0"/>
+					<xs:element name="thesaurusName" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Keywords" type="gmd:MD_Keywords_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Keywords_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Keywords"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Association_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Association" type="gmd:DS_Association_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Association_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Association"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_AggregateInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Encapsulates the dataset aggregation information</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="aggregateDataSetName" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="aggregateDataSetIdentifier" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="associationType" type="gmd:DS_AssociationTypeCode_PropertyType"/>
+					<xs:element name="initiativeType" type="gmd:DS_InitiativeTypeCode_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_AggregateInformation" type="gmd:MD_AggregateInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_AggregateInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_AggregateInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Resolution_Type">
+		<xs:choice>
+			<xs:element name="equivalentScale" type="gmd:MD_RepresentativeFraction_PropertyType"/>
+			<xs:element name="distance" type="gco:Distance_PropertyType"/>
+		</xs:choice>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Resolution" type="gmd:MD_Resolution_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Resolution_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Resolution"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="MD_TopicCategoryCode_Type">
+		<xs:annotation>
+			<xs:documentation>High-level geospatial data thematic classification to assist in the grouping and search of available geospatial datasets</xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="farming"/>
+			<xs:enumeration value="biota"/>
+			<xs:enumeration value="boundaries"/>
+			<xs:enumeration value="climatologyMeteorologyAtmosphere"/>
+			<xs:enumeration value="economy"/>
+			<xs:enumeration value="elevation"/>
+			<xs:enumeration value="environment"/>
+			<xs:enumeration value="geoscientificInformation"/>
+			<xs:enumeration value="health"/>
+			<xs:enumeration value="imageryBaseMapsEarthCover"/>
+			<xs:enumeration value="intelligenceMilitary"/>
+			<xs:enumeration value="inlandWaters"/>
+			<xs:enumeration value="location"/>
+			<xs:enumeration value="oceans"/>
+			<xs:enumeration value="planningCadastre"/>
+			<xs:enumeration value="society"/>
+			<xs:enumeration value="structure"/>
+			<xs:enumeration value="transportation"/>
+			<xs:enumeration value="utilitiesCommunication"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_TopicCategoryCode" type="gmd:MD_TopicCategoryCode_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_TopicCategoryCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_TopicCategoryCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CharacterSetCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CharacterSetCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CharacterSetCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_SpatialRepresentationTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_SpatialRepresentationTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_SpatialRepresentationTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ProgressCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ProgressCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ProgressCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_KeywordTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_KeywordTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_KeywordTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DS_AssociationTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_AssociationTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_AssociationTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DS_InitiativeTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_InitiativeTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_InitiativeTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/maintenance.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/maintenance.xsd
new file mode 100755
index 0000000..025fb48
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/maintenance.xsd
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This maintenance.xsd schema implements the UML conceptual schema defined in A.2.5 of ISO 19115:2003. It contains the implementation of the following classes: MD_Maint [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gts" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gts/gts.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_MaintenanceInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the scope and frequency of updating</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="maintenanceAndUpdateFrequency" type="gmd:MD_MaintenanceFrequencyCode_PropertyType"/>
+					<xs:element name="dateOfNextUpdate" type="gco:Date_PropertyType" minOccurs="0"/>
+					<xs:element name="userDefinedMaintenanceFrequency" type="gts:TM_PeriodDuration_PropertyType" minOccurs="0"/>
+					<xs:element name="updateScope" type="gmd:MD_ScopeCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="updateScopeDescription" type="gmd:MD_ScopeDescription_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="maintenanceNote" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="contact" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MaintenanceInformation" type="gmd:MD_MaintenanceInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MaintenanceInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MaintenanceInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ScopeDescription_Type">
+		<xs:annotation>
+			<xs:documentation>Description of the class of information covered by the information</xs:documentation>
+		</xs:annotation>
+		<xs:choice>
+			<xs:element name="attributes" type="gco:ObjectReference_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="features" type="gco:ObjectReference_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="featureInstances" type="gco:ObjectReference_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="attributeInstances" type="gco:ObjectReference_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="dataset" type="gco:CharacterString_PropertyType"/>
+			<xs:element name="other" type="gco:CharacterString_PropertyType"/>
+		</xs:choice>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ScopeDescription" type="gmd:MD_ScopeDescription_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ScopeDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ScopeDescription"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MaintenanceFrequencyCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MaintenanceFrequencyCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MaintenanceFrequencyCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ScopeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ScopeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ScopeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataApplication.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataApplication.xsd
new file mode 100755
index 0000000..dc889e1
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataApplication.xsd
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This metadataApplication.xsd schema implements the UML conceptual schema defined in A.2.12 of ISO 19115:2003. It contains the implementation of the class: MD_Applicat [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="metadataEntity.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="AbstractDS_Aggregate_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Identifiable collection of datasets</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="composedOf" type="gmd:DS_DataSet_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="seriesMetadata" type="gmd:MD_Metadata_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="subset" type="gmd:DS_Aggregate_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="superset" type="gmd:DS_Aggregate_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDS_Aggregate" type="gmd:AbstractDS_Aggregate_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Aggregate_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDS_Aggregate"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_DataSet_Type">
+		<xs:annotation>
+			<xs:documentation>Identifiable collection of data</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="has" type="gmd:MD_Metadata_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="partOf" type="gmd:DS_Aggregate_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_DataSet" type="gmd:DS_DataSet_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_DataSet_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_DataSet"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_OtherAggregate_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDS_Aggregate_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_OtherAggregate" type="gmd:DS_OtherAggregate_Type" substitutionGroup="gmd:AbstractDS_Aggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_OtherAggregate_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_OtherAggregate"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Series_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDS_Aggregate_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Series" type="gmd:DS_Series_Type" substitutionGroup="gmd:AbstractDS_Aggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Series_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Series"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Initiative_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDS_Aggregate_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Initiative" type="gmd:DS_Initiative_Type" substitutionGroup="gmd:AbstractDS_Aggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Initiative_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Initiative"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Platform_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_Series_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Platform" type="gmd:DS_Platform_Type" substitutionGroup="gmd:DS_Series"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Platform_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Platform"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Sensor_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_Series_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Sensor" type="gmd:DS_Sensor_Type" substitutionGroup="gmd:DS_Series"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Sensor_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Sensor"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_ProductionSeries_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_Series_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_ProductionSeries" type="gmd:DS_ProductionSeries_Type" substitutionGroup="gmd:DS_Series"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_ProductionSeries_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_ProductionSeries"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_StereoMate_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_OtherAggregate_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_StereoMate" type="gmd:DS_StereoMate_Type" substitutionGroup="gmd:DS_OtherAggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_StereoMate_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_StereoMate"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataEntity.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataEntity.xsd
new file mode 100755
index 0000000..18dee8f
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataEntity.xsd
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This metadataEntity.xsd schema implements the UML conceptual schema defined in A.2.1 of ISO 19115:2003. It contains the implementation of the class MD_Metadata.</xs:d [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="spatialRepresentation.xsd"/>
+	<xs:include schemaLocation="metadataExtension.xsd"/>
+	<xs:include schemaLocation="content.xsd"/>
+	<xs:include schemaLocation="metadataApplication.xsd"/>
+	<xs:include schemaLocation="applicationSchema.xsd"/>
+	<xs:include schemaLocation="portrayalCatalogue.xsd"/>
+	<xs:include schemaLocation="dataQuality.xsd"/>
+	<xs:include schemaLocation="freeText.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_Metadata_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the metadata</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="fileIdentifier" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="language" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="characterSet" type="gmd:MD_CharacterSetCode_PropertyType" minOccurs="0"/>
+					<xs:element name="parentIdentifier" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="hierarchyLevel" type="gmd:MD_ScopeCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="hierarchyLevelName" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="contact" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="dateStamp" type="gco:Date_PropertyType"/>
+					<xs:element name="metadataStandardName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="metadataStandardVersion" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="dataSetURI" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="spatialRepresentationInfo" type="gmd:MD_SpatialRepresentation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="referenceSystemInfo" type="gmd:MD_ReferenceSystem_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="metadataExtensionInfo" type="gmd:MD_MetadataExtensionInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="identificationInfo" type="gmd:MD_Identification_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="contentInfo" type="gmd:MD_ContentInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="distributionInfo" type="gmd:MD_Distribution_PropertyType" minOccurs="0"/>
+					<xs:element name="dataQualityInfo" type="gmd:DQ_DataQuality_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="portrayalCatalogueInfo" type="gmd:MD_PortrayalCatalogueReference_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="metadataConstraints" type="gmd:MD_Constraints_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="applicationSchemaInfo" type="gmd:MD_ApplicationSchemaInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="metadataMaintenance" type="gmd:MD_MaintenanceInformation_PropertyType" minOccurs="0"/>
+					<xs:element name="series" type="gmd:DS_Aggregate_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="describes" type="gmd:DS_DataSet_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="propertyType" type="gco:ObjectReference_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="featureType" type="gco:ObjectReference_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="featureAttribute" type="gco:ObjectReference_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Metadata" type="gmd:MD_Metadata_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Metadata_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Metadata"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataExtension.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataExtension.xsd
new file mode 100755
index 0000000..f861d78
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/metadataExtension.xsd
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This metadataExtension.xsd schema implements the UML conceptual schema defined in A.2.11 of ISO 19115:2003. It contains the implementation of the following classes: M [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_ExtendedElementInformation_Type">
+		<xs:annotation>
+			<xs:documentation>New metadata element, not found in ISO 19115, which is required to describe geographic data</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="shortName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="domainCode" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="definition" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="obligation" type="gmd:MD_ObligationCode_PropertyType" minOccurs="0"/>
+					<xs:element name="condition" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="dataType" type="gmd:MD_DatatypeCode_PropertyType"/>
+					<xs:element name="maximumOccurrence" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="domainValue" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="parentEntity" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="rule" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="rationale" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="source" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ExtendedElementInformation" type="gmd:MD_ExtendedElementInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ExtendedElementInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ExtendedElementInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_MetadataExtensionInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Information describing metadata extensions.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="extensionOnLineResource" type="gmd:CI_OnlineResource_PropertyType" minOccurs="0"/>
+					<xs:element name="extendedElementInformation" type="gmd:MD_ExtendedElementInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MetadataExtensionInformation" type="gmd:MD_MetadataExtensionInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MetadataExtensionInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MetadataExtensionInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="MD_ObligationCode_Type">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="mandatory"/>
+			<xs:enumeration value="optional"/>
+			<xs:enumeration value="conditional"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ObligationCode" type="gmd:MD_ObligationCode_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ObligationCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ObligationCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DatatypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DatatypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DatatypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/portrayalCatalogue.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/portrayalCatalogue.xsd
new file mode 100755
index 0000000..b38b71d
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/portrayalCatalogue.xsd
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This portrayalCatalogue.xsd schema implements the UML conceptual schema defined in A.2.9 of ISO 19115:2003. It contains the implementation of the class MD_PortrayalCa [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_PortrayalCatalogueReference_Type">
+		<xs:annotation>
+			<xs:documentation>Information identifing the portrayal catalogue used</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="portrayalCatalogueCitation" type="gmd:CI_Citation_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_PortrayalCatalogueReference" type="gmd:MD_PortrayalCatalogueReference_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_PortrayalCatalogueReference_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_PortrayalCatalogueReference"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/referenceSystem.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/referenceSystem.xsd
new file mode 100755
index 0000000..035da6d
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/referenceSystem.xsd
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This referenceSystem.xsd schema implements the UML conceptual schema defined in A.2.7 of ISO 19115:2003 and ISO 19115:2003/Cor. 1:2006. It contains the implementation [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="citation.xsd"/>
+	<xs:include schemaLocation="extent.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="RS_Identifier_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_Identifier_Type">
+				<xs:sequence>
+					<xs:element name="codeSpace" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="version" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="RS_Identifier" type="gmd:RS_Identifier_Type" substitutionGroup="gmd:MD_Identifier"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="RS_Identifier_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:RS_Identifier"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ReferenceSystem_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="referenceSystemIdentifier" type="gmd:RS_Identifier_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ReferenceSystem" type="gmd:MD_ReferenceSystem_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ReferenceSystem_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ReferenceSystem"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Identifier_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="authority" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="code" type="gco:CharacterString_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Identifier" type="gmd:MD_Identifier_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Identifier_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Identifier"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractRS_ReferenceSystem_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Description of the spatial and temporal reference systems used in the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gmd:RS_Identifier_PropertyType"/>
+					<xs:element name="domainOfValidity" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractRS_ReferenceSystem" type="gmd:AbstractRS_ReferenceSystem_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="RS_ReferenceSystem_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractRS_ReferenceSystem"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/spatialRepresentation.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/spatialRepresentation.xsd
new file mode 100755
index 0000000..74293c3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gmd/spatialRepresentation.xsd
@@ -0,0 +1,238 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gmd="http://www.isotc211.org/2005/gmd" targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic MetaData (GMD) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GMD includes all the definitions of http://www.isotc211.org/2005/gmd namespace. The root document of this namespace is the file gmd.xsd. This portrayalCatalogue.xsd schema implements the UML conceptual schema defined in A.2.6 of ISO 19115:2003. It contains the implementation of the following classes: M [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gss" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gss/gss.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gmd.xsd"/>
+	<xs:include schemaLocation="citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_GridSpatialRepresentation_Type">
+		<xs:annotation>
+			<xs:documentation>Types and numbers of raster spatial objects in the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_SpatialRepresentation_Type">
+				<xs:sequence>
+					<xs:element name="numberOfDimensions" type="gco:Integer_PropertyType"/>
+					<xs:element name="axisDimensionProperties" type="gmd:MD_Dimension_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="cellGeometry" type="gmd:MD_CellGeometryCode_PropertyType"/>
+					<xs:element name="transformationParameterAvailability" type="gco:Boolean_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_GridSpatialRepresentation" type="gmd:MD_GridSpatialRepresentation_Type" substitutionGroup="gmd:AbstractMD_SpatialRepresentation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_GridSpatialRepresentation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_GridSpatialRepresentation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_VectorSpatialRepresentation_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the vector spatial objects in the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_SpatialRepresentation_Type">
+				<xs:sequence>
+					<xs:element name="topologyLevel" type="gmd:MD_TopologyLevelCode_PropertyType" minOccurs="0"/>
+					<xs:element name="geometricObjects" type="gmd:MD_GeometricObjects_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_VectorSpatialRepresentation" type="gmd:MD_VectorSpatialRepresentation_Type" substitutionGroup="gmd:AbstractMD_SpatialRepresentation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_VectorSpatialRepresentation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_VectorSpatialRepresentation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractMD_SpatialRepresentation_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Digital mechanism used to represent spatial information</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractMD_SpatialRepresentation" type="gmd:AbstractMD_SpatialRepresentation_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_SpatialRepresentation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractMD_SpatialRepresentation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Georeferenceable_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_GridSpatialRepresentation_Type">
+				<xs:sequence>
+					<xs:element name="controlPointAvailability" type="gco:Boolean_PropertyType"/>
+					<xs:element name="orientationParameterAvailability" type="gco:Boolean_PropertyType"/>
+					<xs:element name="orientationParameterDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="georeferencedParameters" type="gco:Record_PropertyType"/>
+					<xs:element name="parameterCitation" type="gmd:CI_Citation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Georeferenceable" type="gmd:MD_Georeferenceable_Type" substitutionGroup="gmd:MD_GridSpatialRepresentation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Georeferenceable_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Georeferenceable"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Dimension_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="dimensionName" type="gmd:MD_DimensionNameTypeCode_PropertyType"/>
+					<xs:element name="dimensionSize" type="gco:Integer_PropertyType"/>
+					<xs:element name="resolution" type="gco:Measure_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Dimension" type="gmd:MD_Dimension_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Dimension_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Dimension"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Georectified_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_GridSpatialRepresentation_Type">
+				<xs:sequence>
+					<xs:element name="checkPointAvailability" type="gco:Boolean_PropertyType"/>
+					<xs:element name="checkPointDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="cornerPoints" type="gss:GM_Point_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="centerPoint" type="gss:GM_Point_PropertyType" minOccurs="0"/>
+					<xs:element name="pointInPixel" type="gmd:MD_PixelOrientationCode_PropertyType"/>
+					<xs:element name="transformationDimensionDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="transformationDimensionMapping" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="2"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Georectified" type="gmd:MD_Georectified_Type" substitutionGroup="gmd:MD_GridSpatialRepresentation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Georectified_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Georectified"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_GeometricObjects_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="geometricObjectType" type="gmd:MD_GeometricObjectTypeCode_PropertyType"/>
+					<xs:element name="geometricObjectCount" type="gco:Integer_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_GeometricObjects" type="gmd:MD_GeometricObjects_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_GeometricObjects_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_GeometricObjects"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="MD_PixelOrientationCode_Type">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="center"/>
+			<xs:enumeration value="lowerLeft"/>
+			<xs:enumeration value="lowerRight"/>
+			<xs:enumeration value="upperRight"/>
+			<xs:enumeration value="upperLeft"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_PixelOrientationCode" type="gmd:MD_PixelOrientationCode_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_PixelOrientationCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_PixelOrientationCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_TopologyLevelCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_TopologyLevelCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_TopologyLevelCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_GeometricObjectTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_GeometricObjectTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_GeometricObjectTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CellGeometryCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CellGeometryCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CellGeometryCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DimensionNameTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DimensionNameTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DimensionNameTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gsr/gsr.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gsr/gsr.xsd
new file mode 100755
index 0000000..a3aacf3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gsr/gsr.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gsr" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gsr="http://www.isotc211.org/2005/gsr" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic Spatial Referencing (GSR) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GSR includes all the definitions of http://www.isotc211.org/2005/gsr namespace. The root document of this namespace is the file gsr.xsd.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="spatialReferencing.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gsr/spatialReferencing.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gsr/spatialReferencing.xsd
new file mode 100755
index 0000000..32b8b42
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gsr/spatialReferencing.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gsr="http://www.isotc211.org/2005/gsr" targetNamespace="http://www.isotc211.org/2005/gsr" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic Spatial Referencing (GSR) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GSR includes all the definitions of http://www.isotc211.org/2005/gsr namespace. The root document of this namespace is the file gsr.xsd. This spatialReferencing.xsd schema contains the implementation of SC_CRS. The encoding of this class is mapped to an ISO 19136 XML type.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
+	<xs:include schemaLocation="gsr.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!--==XCGE: gml:AbstractCRS==-->
+	<!-- ........................................................................ -->
+	<xs:complexType name="SC_CRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gss/geometry.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gss/geometry.xsd
new file mode 100755
index 0000000..39d6f3b
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gss/geometry.xsd
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gss="http://www.isotc211.org/2005/gss" targetNamespace="http://www.isotc211.org/2005/gss" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic Spatial Schema (GSS) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GSS includes all the definitions of http://www.isotc211.org/2005/gss namespace. The root document of this namespace is the file gss.xsd. This geometry.xsd schema contains the implementation of GM_Object and GM_Point. The encoding of these classes is mapped to ISO 19136 geometric types.</xs:docume [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gss.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!--==XCGE: gml:Point==-->
+	<!-- ........................................................................ -->
+	<xs:complexType name="GM_Point_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:Point"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!--==XCGE: gml:AbstractGeometry==-->
+	<!-- ........................................................................ -->
+	<xs:complexType name="GM_Object_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractGeometry"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gss/gss.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gss/gss.xsd
new file mode 100755
index 0000000..2594cfe
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gss/gss.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gss" elementFormDefault="qualified"  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gss="http://www.isotc211.org/2005/gss" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic Spatial Schema (GSS) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GSS includes all the definitions of http://www.isotc211.org/2005/gss namespace. The root document of this namespace is the file gss.xsd.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="geometry.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gts/gts.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gts/gts.xsd
new file mode 100755
index 0000000..a4184fd
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gts/gts.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gts="http://www.isotc211.org/2005/gts" targetNamespace="http://www.isotc211.org/2005/gts" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic Temporal Schema (GTS) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GTS includes all the definitions of http://www.isotc211.org/2005/gts namespace. The root document of this namespace is the file gts.xsd.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="temporalObjects.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gts/temporalObjects.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gts/temporalObjects.xsd
new file mode 100755
index 0000000..a770ec7
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/iso/19139/20070417/gts/temporalObjects.xsd
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gts="http://www.isotc211.org/2005/gts" targetNamespace="http://www.isotc211.org/2005/gts" elementFormDefault="qualified" version="2012-07-13">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>Geographic Temporal Schema (GTS) extensible markup language is a component of the XML Schema Implementation of Geographic Information Metadata documented in ISO/TS 19139:2007. GTS includes all the definitions of http://www.isotc211.org/2005/gts namespace. The root document of this namespace is the file gts.xsd. The temporalObjects.xsd schema contains the XML implementation of TM_Object, TM_Primitive and TM_PeriodDuration from ISO 19108. The encoding of these classes i [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
+	<xs:include schemaLocation="gts.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!--==XCGE: gml:AbstractTimePrimitive==-->
+	<!-- ........................................................................ -->
+	<xs:complexType name="TM_Primitive_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractTimePrimitive"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="TM_PeriodDuration" type="xs:duration"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="TM_PeriodDuration_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gts:TM_PeriodDuration"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/om/1.0.0/observation.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/om/1.0.0/observation.xsd
new file mode 100755
index 0000000..bb69963
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/om/1.0.0/observation.xsd
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:om="http://www.opengis.net/om/1.0"
+        xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:sml="http://www.opengis.net/sensorML/1.0.1" targetNamespace="http://www.opengis.net/om/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.3">
+	<annotation>
+		<documentation>observation.xsd
+
+An XML implementation of the OandM model from OGC 07-022
+
+Observations and Measurements is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="om.xsd"/>
+	<!-- ====================================================================== -->
+	<!-- bring in other schemas -->
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<!-- can't use ISO Metadata schema with GML 3.1.1
+		<import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
+	-->
+	<import namespace="http://www.opengis.net/swe/1.0.1" schemaLocation="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+	<import namespace="http://www.opengis.net/sensorML/1.0.1" schemaLocation="http://schemas.opengis.net/sensorML/1.0.1/sensorML.xsd"/>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<!-- ===== Object types for Observations ====== -->
+	<!-- ====================================================================== -->
+	<complexType name="ObservationType">
+		<annotation>
+			<documentation>Base type for Observations. 
+            Observation is an act ("event"), whose result is an estimate of the value of a property of the feature of interest. 
+            The observed property may be any property associated with the type of the feature of interest.
+
+			    The following properties are inherited from AbstractFeatureType:
+				<!--	from AbstractGMLType
+				<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+				<element ref="gml:description" minOccurs="0"/>
+				<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/> -->
+				<!--    from AbstractFeatureType
+				<element ref="gml:boundedBy" minOccurs="0"/> --></documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element name="metadata" type="om:AnyOrReferenceType" minOccurs="0">
+						<!--					<element name="observationMetadata" type="gmd:MD_Metadata_PropertyType" minOccurs="0"> -->
+						<annotation>
+							<documentation>Replace with reference to ISO Metadata entity when GML version 3.2.X has been formally adopted.</documentation>
+						</annotation>
+					</element>
+					<element name="samplingTime" type="swe:TimeObjectPropertyType">
+						<annotation>
+							<documentation>The samplingTime is the time that the result applies to the feature-of-interest. 
+					This is the time usually required for geospatial analysis of the result.</documentation>
+						</annotation>
+					</element>
+					<element name="resultTime" type="swe:TimeObjectPropertyType" minOccurs="0">
+						<annotation>
+							<documentation>The resultTime is the time when the procedure associated with the observation act was applied. 
+					For some observations this is identical to samplingTime, in which case the resultTime may be omitted. 
+					
+					Example: 	Where a measurement is made on a specimen in a laboratory, the samplingTime should record the time the specimen was retrieved from its host, while the resultTime should record the time the laboratory procedure was applied. 
+					Example: 	Where sensor observation results are post-processed, the resultTime is the post-processing time, while the samplingTime preserves the time of initial interaction with the world. 
+					Example: 	Simulations are often used to estimate the values for phenomena in the future or past. The samplingTime is the real-world time that the result applies to, while the resultTime is the time that the simulation process was executed.</documentation>
+						</annotation>
+					</element>
+					<element name="procedure" type="om:ProcessPropertyType">
+						<annotation>
+							<documentation>The procedure is the description of a process used to generate the result. 
+							It must be suitable for the observed property. 
+							NOTE: 	At this level we do not distinguish between sensor-observations, 
+							estimations made by an observer, or algorithms, simulations, computations and complex processing chains.</documentation>
+						</annotation>
+					</element>
+					<element name="resultQuality" type="om:AnyOrReferenceType" minOccurs="0">
+						<!--					<element name="resultQuality" type="gmd:DQ_Element_PropertyType" minOccurs="0"> -->
+						<annotation>
+							<documentation>Instance-specific quality assessment or measure. 
+							Allow multiple quality measures if required.			
+									
+					Replace with reference to ISO Metadata entity when GML version 3.2.X has been formally adopted.</documentation>
+						</annotation>
+					</element>
+					<element name="observedProperty" type="swe:PhenomenonPropertyType">
+						<annotation>
+							<documentation>Property-type or phenomenon for which the observation result provides an estimate of its value. 
+							for example "wavelength", "grass-species", "power", "intensity in the waveband x-y", etc. 
+							It must be a property associated with the type of the feature of interest. 
+							This feature-property that provides the (semantic) type of the observation. 
+							The description of the phenomenon may be quite specific and constrained. 
+
+							The description of the property-type may be presented using various alternative encodings. 
+							If shown inline, the swe:Phenomenon schema is required. 
+							If provided using another encoding (e.g. OWL or SWEET) then the description must be in a remote repository and xlink reference used.</documentation>
+						</annotation>
+					</element>
+					<element name="featureOfInterest" type="gml:FeaturePropertyType">
+						<annotation>
+							<documentation>The featureOfInterest is a feature of any type (ISO 19109, ISO 19101), which is a representation of the observation target, being the real-world object regarding which the observation is made. 
+							such as a specimen, station, tract, mountain, pixel, etc. 
+							The spatial properties (location) of this feature of interest are typically of most interest for spatial analysis of the observation result.</documentation>
+						</annotation>
+					</element>
+					<element name="parameter" type="swe:AnyDataPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>An Observation parameter is a general event-specific parameter. 
+							This will typically be used to record environmental parameters, or event-specific sampling parameters that are not tightly bound to either the feature-of-interest or the procedure. 
+							NOTE: 	Parameters that are tightly bound to the procedure should be recorded as part of the procedure description. For example, the SensorML model associates parameters with specific process elements or stages. 
+							NOTE: 	The semantics of the parameter must be provided as part of its value. 
+							
+							In some applications it is convenient to use a generic or standard procedure, or feature-of-interest, rather than define an event-specific process or feature. 
+							In this context, event-specific parameters are bound to the Observation act.</documentation>
+						</annotation>
+					</element>
+					<element name="result" type="anyType">
+						<annotation>
+							<documentation>The result contains the value generated by the procedure. 
+							The type of the observation result must be consistent with the observed property, and the scale or scope for the value must be consistent with the quantity or category type. 
+							Application profiles may choose to constrain the type of the result.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ......................... -->
+	<element name="Observation" type="om:ObservationType" substitutionGroup="gml:_Feature">
+		<annotation>
+			<documentation>Observation is an act ("event"), whose result is an estimate of the value of a property of the feature of interest. 
+            The observed property may be any property associated with the type of the feature of interest.</documentation>
+		</annotation>
+	</element>
+	<!-- ...................... -->
+	<complexType name="ObservationPropertyType">
+		<sequence minOccurs="0">
+			<element ref="om:Observation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ===== Observation Collection ======= -->
+	<!-- ====================================================================== -->
+	<complexType name="ObservationCollectionType">
+		<annotation>
+			<documentation>Collection of arbitrary observations</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element name="member" type="om:ObservationPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ...................... -->
+	<element name="ObservationCollection" type="om:ObservationCollectionType" substitutionGroup="gml:_Feature">
+		<annotation>
+			<documentation>Collection of arbitrary observations</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<complexType name="ProcessPropertyType">
+		<annotation>
+			<documentation>This property type allows the Observation/procedure property to  either 
+		* contain a SensorML Process, 
+		* contain a description of a process described using another model, wrapped inside a om:Process element
+		* point to a Process either elsewhere in the document or identified by a URI</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="sml:_Process">
+					<annotation>
+						<documentation>Top of  SensorML Process hierarchy</documentation>
+					</annotation>
+				</element>
+				<element name="Process">
+					<annotation>
+						<documentation>This element is xs:anyType so may contain a description of a process provided in any well-formed XML. 
+				If the process description is namespace qualified, then the namespace must be identified in the instance document.</documentation>
+					</annotation>
+				</element>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<complexType name="AnyOrReferenceType">
+		<annotation>
+			<documentation>Placeholder type
+			Used in a few places where ISO 19139 metadata classes are used, which will become available with GML 3.2</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<any/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/om/1.0.0/om.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/om/1.0.0/om.xsd
new file mode 100755
index 0000000..9a2c879
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/om/1.0.0/om.xsd
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:om="http://www.opengis.net/om/1.0" targetNamespace="http://www.opengis.net/om/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.3">
+	<annotation>
+		<documentation>om.xsd
+
+The Observations and Measurements schema
+This document contains only the normative elements described in the OGC standard
+
+Observations and Measurements is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<include schemaLocation="./observation.xsd"/>
+	<!-- ====================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/ows19115subset.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/ows19115subset.xsd
new file mode 100755
index 0000000..ae702db
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/ows19115subset.xsd
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns:xlink="http://www.w3.org/1999/xlink" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>ows19115subset.xsd</appinfo>
+		<documentation>This XML Schema Document encodes the parts of ISO 19115 used by the common "ServiceIdentification" and "ServiceProvider" sections of the GetCapabilities operation response, known as the service metadata XML document. The parts encoded here are the MD_Keywords, CI_ResponsibleParty, and related classes. The UML package prefixes were omitted from XML names, and the XML element names were all capitalized, for consistency with other OWS Schemas. This document also provides a  [...]
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+    <include schemaLocation="owsAll.xsd"/>
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<complexType name="LanguageStringType">
+		<annotation>
+			<documentation>Text string with the language of the string identified as recommended in the XML 1.0 W3C Recommendation, section 2.12. </documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute ref="xml:lang" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Title" type="ows:LanguageStringType">
+		<annotation>
+			<documentation>Title of this resource, normally used for display to a human. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Abstract" type="ows:LanguageStringType">
+		<annotation>
+			<documentation>Brief narrative description of this resource, normally used for display to a human. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Keywords" type="ows:KeywordsType"/>
+	<!-- =========================================================== -->
+	<complexType name="KeywordsType">
+		<annotation>
+			<documentation>Unordered list of one or more commonly used or formalised word(s) or phrase(s) used to describe the subject. When needed, the optional "type" can name the type of the associated list of keywords that shall all have the same type. Also when needed, the codeSpace attribute of that "type" can reference the type name authority and/or thesaurus.
+			If the xml:lang attribute is not included in a Keyword element, then no language is specified for that element unless specified by another means.  All Keyword elements in the same Keywords element that share the same xml:lang attribute value represent different keywords in that language. </documentation>
+			<documentation>For OWS use, the optional thesaurusName element was omitted as being complex information that could be referenced by the codeSpace attribute of the Type element. </documentation>
+		</annotation>
+		<sequence>
+			<element name="Keyword" type="ows:LanguageStringType" maxOccurs="unbounded"/>
+			<element name="Type" type="ows:CodeType" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="CodeType">
+		<annotation>
+			<documentation>Name or code with an (optional) authority. If the codeSpace attribute is present, its value shall reference a dictionary, thesaurus, or authority for the name or code, such as the organisation who assigned the value, or the dictionary from which it is taken. </documentation>
+			<documentation>Type copied from basicTypes.xsd of GML 3 with documentation edited, for possible use outside the ServiceIdentification section of a service metadata document. </documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute name="codeSpace" type="anyURI" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="PointOfContact" type="ows:ResponsiblePartyType">
+		<annotation>
+			<documentation>Identification of, and means of communication with, person(s) responsible for the resource(s). </documentation>
+			<documentation>For OWS use in the ServiceProvider section of a service metadata document, the optional organizationName element was removed, since this type is always used with the ProviderName element which provides that information. The optional individualName element was made mandatory, since either the organizationName or individualName element is mandatory. The mandatory "role" element was changed to optional, since no clear use of this information is known in the ServiceProvider [...]
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="ResponsiblePartyType">
+		<annotation>
+			<documentation>Identification of, and means of communication with, person responsible for the server. At least one of IndividualName, OrganisationName, or PositionName shall be included. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="ows:IndividualName" minOccurs="0"/>
+			<element ref="ows:OrganisationName" minOccurs="0"/>
+			<element ref="ows:PositionName" minOccurs="0"/>
+			<element ref="ows:ContactInfo" minOccurs="0"/>
+			<element ref="ows:Role"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<complexType name="ResponsiblePartySubsetType">
+		<annotation>
+			<documentation>Identification of, and means of communication with, person responsible for the server. </documentation>
+			<documentation>For OWS use in the ServiceProvider section of a service metadata document, the optional organizationName element was removed, since this type is always used with the ProviderName element which provides that information. The mandatory "role" element was changed to optional, since no clear use of this information is known in the ServiceProvider section. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="ows:IndividualName" minOccurs="0"/>
+			<element ref="ows:PositionName" minOccurs="0"/>
+			<element ref="ows:ContactInfo" minOccurs="0"/>
+			<element ref="ows:Role" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="IndividualName" type="string">
+		<annotation>
+			<documentation>Name of the responsible person: surname, given name, title separated by a delimiter. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="OrganisationName" type="string">
+		<annotation>
+			<documentation>Name of the responsible organization. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="PositionName" type="string">
+		<annotation>
+			<documentation>Role or position of the responsible person. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Role" type="ows:CodeType">
+		<annotation>
+			<documentation>Function performed by the responsible party. Possible values of this Role shall include the values and the meanings listed in Subclause B.5.5 of ISO 19115:2003. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="ContactInfo" type="ows:ContactType">
+		<annotation>
+			<documentation>Address of the responsible party. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="ContactType">
+		<annotation>
+			<documentation>Information required to enable contact with the responsible person and/or organization. </documentation>
+			<documentation>For OWS use in the service metadata document, the optional hoursOfService and contactInstructions elements were retained, as possibly being useful in the ServiceProvider section. </documentation>
+		</annotation>
+		<sequence>
+			<element name="Phone" type="ows:TelephoneType" minOccurs="0">
+				<annotation>
+					<documentation>Telephone numbers at which the organization or individual may be contacted. </documentation>
+				</annotation>
+			</element>
+			<element name="Address" type="ows:AddressType" minOccurs="0">
+				<annotation>
+					<documentation>Physical and email address at which the organization or individual may be contacted. </documentation>
+				</annotation>
+			</element>
+			<element name="OnlineResource" type="ows:OnlineResourceType" minOccurs="0">
+				<annotation>
+					<documentation>On-line information that can be used to contact the individual or organization. OWS specifics: The xlink:href attribute in the xlink:simpleAttrs attribute group shall be used to reference this resource. Whenever practical, the xlink:href attribute with type anyURI should be a URL from which more contact information can be electronically retrieved. The xlink:title attribute with type "string" can be used to name this set of information. The other attributes in the xlin [...]
+				</annotation>
+			</element>
+			<element name="HoursOfService" type="string" minOccurs="0">
+				<annotation>
+					<documentation>Time period (including time zone) when individuals can contact the organization or individual. </documentation>
+				</annotation>
+			</element>
+			<element name="ContactInstructions" type="string" minOccurs="0">
+				<annotation>
+					<documentation>Supplemental instructions on how or when to contact the individual or organization. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="OnlineResourceType">
+		<annotation>
+			<documentation>Reference to on-line resource from which data can be obtained. </documentation>
+			<documentation>For OWS use in the service metadata document, the CI_OnlineResource class was XML encoded as the attributeGroup "xlink:simpleAttrs", as used in GML. </documentation>
+		</annotation>
+		<attributeGroup ref="xlink:simpleAttrs"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<complexType name="TelephoneType">
+		<annotation>
+			<documentation>Telephone numbers for contacting the responsible individual or organization. </documentation>
+		</annotation>
+		<sequence>
+			<element name="Voice" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Telephone number by which individuals can speak to the responsible organization or individual. </documentation>
+				</annotation>
+			</element>
+			<element name="Facsimile" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Telephone number of a facsimile machine for the responsible
+organization or individual. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="AddressType">
+		<annotation>
+			<documentation>Location of the responsible individual or organization. </documentation>
+		</annotation>
+		<sequence>
+			<element name="DeliveryPoint" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Address line for the location. </documentation>
+				</annotation>
+			</element>
+			<element name="City" type="string" minOccurs="0">
+				<annotation>
+					<documentation>City of the location. </documentation>
+				</annotation>
+			</element>
+			<element name="AdministrativeArea" type="string" minOccurs="0">
+				<annotation>
+					<documentation>State or province of the location. </documentation>
+				</annotation>
+			</element>
+			<element name="PostalCode" type="string" minOccurs="0">
+				<annotation>
+					<documentation>ZIP or other postal code. </documentation>
+				</annotation>
+			</element>
+			<element name="Country" type="string" minOccurs="0">
+				<annotation>
+					<documentation>Country of the physical address. </documentation>
+				</annotation>
+			</element>
+			<element name="ElectronicMailAddress" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Address of the electronic mailbox of the responsible organization or individual. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsAll.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsAll.xsd
new file mode 100755
index 0000000..a2fbd77
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsAll.xsd
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsAll.xsd</appinfo>
+		<documentation>This XML Schema Document includes and imports, directly and indirectly, all the XML Schemas defined by the OWS Common Implemetation Specification.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsGetResourceByID.xsd"/>
+	<include schemaLocation="owsExceptionReport.xsd"/>
+	<include schemaLocation="owsDomainType.xsd"/>
+	<include schemaLocation="owsContents.xsd"/>
+	<include schemaLocation="owsInputOutputData.xsd"/>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsCommon.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsCommon.xsd
new file mode 100755
index 0000000..dedc799
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsCommon.xsd
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns:xlink="http://www.w3.org/1999/xlink" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsCommon.xsd</appinfo>
+		<documentation>This XML Schema Document encodes various parameters and parameter types that can be used in OWS operation requests and responses.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+    <include schemaLocation="owsAll.xsd"/>
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<simpleType name="MimeType">
+		<annotation>
+			<documentation>XML encoded identifier of a standard MIME type, possibly a parameterized MIME type. </documentation>
+		</annotation>
+		<restriction base="string">
+			<pattern value="(application|audio|image|text|video|message|multipart|model)/.+(;\s*.+=.+)*"/>
+		</restriction>
+	</simpleType>
+	<!-- ========================================================= -->
+	<simpleType name="VersionType">
+		<annotation>
+			<documentation>Specification version for OWS operation. The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99. Each version shall be for the Implementation Specification (document) and the associated XML Schemas to which requested operations will conform. An Implementation Specification version normally specifies XML  [...]
+		</annotation>
+		<restriction base="string">
+			<pattern value="\d+\.\d?\d\.\d?\d"/>
+		</restriction>
+	</simpleType>
+	<!-- ========================================================== -->
+	<element name="Metadata" type="ows:MetadataType"/>
+	<!-- ========================================================== -->
+	<complexType name="MetadataType">
+		<annotation>
+			<documentation>This element either references or contains more metadata about the element that includes this element. To reference metadata stored remotely, at least the xlinks:href attribute in xlink:simpleAttrs shall be included. Either at least one of the attributes in xlink:simpleAttrs or a substitute for the AbstractMetaData element shall be included, but not both. An Implementation Specification can restrict the contents of this element to always be a reference or always contain [...]
+		</annotation>
+		<sequence>
+			<element ref="ows:AbstractMetaData" minOccurs="0"/>
+		</sequence>
+		<attributeGroup ref="xlink:simpleAttrs">
+			<annotation>
+				<documentation>Reference to metadata recorded elsewhere, either external to this XML document or within it. Whenever practical, the xlink:href attribute with type anyURI should include a URL from which this metadata can be electronically retrieved. </documentation>
+			</annotation>
+		</attributeGroup>
+		<attribute name="about" type="anyURI" use="optional">
+			<annotation>
+				<documentation>Optional reference to the aspect of the element which includes this "metadata" element that this metadata provides more information about. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="AbstractMetaData" abstract="true">
+		<annotation>
+			<documentation>Abstract element containing more metadata about the element that includes the containing "metadata" element. A specific server implementation, or an Implementation Specification, can define concrete elements in the AbstractMetaData substitution group. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="BoundingBox" type="ows:BoundingBoxType"/>
+	<!-- =========================================================== -->
+	<complexType name="BoundingBoxType">
+		<annotation>
+			<documentation>XML encoded minimum rectangular bounding box (or region) parameter, surrounding all the associated data. </documentation>
+			<documentation>This type is adapted from the EnvelopeType of GML 3.1, with modified contents and documentation for encoding a MINIMUM size box SURROUNDING all associated data. </documentation>
+		</annotation>
+		<sequence>
+			<element name="LowerCorner" type="ows:PositionType">
+				<annotation>
+					<documentation>Position of the bounding box corner at which the value of each coordinate normally is the algebraic minimum within this bounding box. In some cases, this position is normally displayed at the top, such as the top left for some image coordinates. For more information, see Subclauses 10.2.5 and C.13. </documentation>
+				</annotation>
+			</element>
+			<element name="UpperCorner" type="ows:PositionType">
+				<annotation>
+					<documentation>Position of the bounding box corner at which the value of each coordinate normally is the algebraic maximum within this bounding box. In some cases, this position is normally displayed at the bottom, such as the bottom right for some image coordinates. For more information, see Subclauses 10.2.5 and C.13. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="crs" type="anyURI" use="optional">
+			<annotation>
+				<documentation>Usually references the definition of a CRS, as specified in [OGC Topic 2]. Such a CRS definition can be XML encoded using the gml:CoordinateReferenceSystemType in [GML 3.1]. For well known references, it is not required that a CRS definition exist at the location the URI points to. If no anyURI value is included, the applicable CRS must be either:
+a)	Specified outside the bounding box, but inside a data structure that includes this bounding box, as specified for a specific OWS use of this bounding box type.
+b)	Fixed and specified in the Implementation Specification for a specific OWS use of the bounding box type. </documentation>
+			</annotation>
+		</attribute>
+		<attribute name="dimensions" type="positiveInteger" use="optional">
+			<annotation>
+				<documentation>The number of dimensions in this CRS (the length of a coordinate sequence in this use of the PositionType). This number is specified by the CRS definition, but can also be specified here. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="PositionType">
+		<annotation>
+			<documentation>Position instances hold the coordinates of a position in a coordinate reference system (CRS) referenced by the related "crs" attribute or elsewhere. For an angular coordinate axis that is physically continuous for multiple revolutions, but whose recorded values can be discontinuous, special conditions apply when the bounding box is continuous across the value discontinuity:
+a)  If the bounding box is continuous clear around this angular axis, then ordinate values of minus and plus infinity shall be used.
+b)  If the bounding box is continuous across the value discontinuity but is not continuous clear around this angular axis, then some non-normal value can be used if specified for a specific OWS use of the BoundingBoxType. For more information, see Subclauses 10.2.5 and C.13. </documentation>
+			<documentation>This type is adapted from DirectPositionType and doubleList of GML 3.1. The adaptations include omission of all the attributes, since the needed information is included in the BoundingBoxType. </documentation>
+		</annotation>
+		<list itemType="double"/>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="WGS84BoundingBox" type="ows:WGS84BoundingBoxType" substitutionGroup="ows:BoundingBox"/>
+	<!-- =========================================================== -->
+	<complexType name="WGS84BoundingBoxType">
+		<annotation>
+			<documentation>XML encoded minimum rectangular bounding box (or region) parameter, surrounding all the associated data. This box is specialized for use with the 2D WGS 84 coordinate reference system with decimal values of longitude and latitude. </documentation>
+			<documentation>This type is adapted from the general BoundingBoxType, with modified contents and documentation for use with the 2D WGS 84 coordinate reference system. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="ows:BoundingBoxType">
+				<sequence>
+					<element name="LowerCorner" type="ows:PositionType2D">
+						<annotation>
+							<documentation>Position of the bounding box corner at which the values of longitude and latitude normally are the algebraic minimums within this bounding box. For more information, see Subclauses 10.4.5 and C.13. </documentation>
+						</annotation>
+					</element>
+					<element name="UpperCorner" type="ows:PositionType2D">
+						<annotation>
+							<documentation>Position of the bounding box corner at which the values of longitude and latitude normally are the algebraic minimums within this bounding box. For more information, see Subclauses 10.4.5 and C.13. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="crs" type="anyURI" use="optional" fixed="urn:ogc:def:crs:OGC:2:84">
+					<annotation>
+						<documentation>This attribute can be included when considered useful. When included, this attribute shall reference the 2D WGS 84 coordinate reference system with longitude before latitude and decimal values of longitude and latitude. </documentation>
+					</annotation>
+				</attribute>
+				<attribute name="dimensions" type="positiveInteger" use="optional" fixed="2">
+					<annotation>
+						<documentation>The number of dimensions in this CRS (the length of a coordinate sequence in this use of the PositionType). This number is specified by the CRS definition, but can also be specified here. </documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="PositionType2D">
+		<annotation>
+			<documentation>Two-dimensional position instances hold the longitude and latitude coordinates of a position in the 2D WGS 84 coordinate reference system. The longitude value shall be listed first, followed by the latitude value, both in decimal degrees. Latitude values shall range from -90 to +90 degrees, and longitude values shall normally range from -180 to +180 degrees. For the longitude axis, special conditions apply when the bounding box is continuous across the +/- 180 degrees m [...]
+a)  If the bounding box is continuous clear around the Earth, then longitude values of minus and plus infinity shall be used.
+b)  If the bounding box is continuous across the value discontinuity but is not continuous clear around the Earth, then some non-normal value can be used if specified for a specific OWS use of the WGS84BoundingBoxType. For more information, see Subclauses 10.4.5 and C.13. </documentation>
+		</annotation>
+		<restriction base="ows:PositionType">
+			<length value="2"/>
+		</restriction>
+	</simpleType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsContents.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsContents.xsd
new file mode 100755
index 0000000..5a1f47b
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsContents.xsd
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1"
+xmlns:ows="http://www.opengis.net/ows/1.1"
+xmlns:xlink="http://www.w3.org/1999/xlink"
+xmlns="http://www.w3.org/2001/XMLSchema"
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsContents.xsd</appinfo>
+		<documentation>This XML Schema  Document encodes the typical Contents section of an OWS service metadata (Capabilities) document. This  Schema can be built upon to define the Contents section for a specific OWS. If the ContentsBaseType in this XML Schema cannot be restricted and extended to define the Contents section for a specific OWS, all other relevant parts defined in owsContents.xsd shall be used by the "ContentsType" in the wxsContents.xsd prepared for the specific OWS.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="owsDataIdentification.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<complexType name="ContentsBaseType">
+		<annotation>
+			<documentation>Contents of typical Contents section of an OWS service metadata (Capabilities) document. This type shall be extended and/or restricted if needed for specific OWS use to include the specific metadata needed. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="ows:DatasetDescriptionSummary" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Unordered set of summary descriptions for the datasets available from this OWS server. This set shall be included unless another source is referenced and all this metadata is available from that source. </documentation>
+				</annotation>
+			</element>
+			<element ref="ows:OtherSource" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Unordered set of references to other sources of metadata describing the coverage offerings available from this server. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- ===========================================================-->
+	<element name="OtherSource" type="ows:MetadataType">
+		<annotation>
+			<documentation>Reference to a source of metadata describing  coverage offerings available from this server. This  parameter can reference a catalogue server from which dataset metadata is available. This ability is expected to be used by servers with thousands or millions of datasets, for which searching a catalogue is more feasible than fetching a long Capabilities XML document. When no DatasetDescriptionSummaries are included, and one or more catalogue servers are referenced, this s [...]
+		</annotation>
+	</element>
+	<!-- ===========================================================-->
+	<element name="DatasetDescriptionSummary" type="ows:DatasetDescriptionSummaryBaseType"/>
+	<!-- ===========================================================-->
+	<complexType name="DatasetDescriptionSummaryBaseType">
+		<annotation>
+			<documentation>Typical dataset metadata in typical Contents section of an OWS service metadata (Capabilities) document. This type shall be extended and/or restricted if needed for specific OWS use, to include the specific Dataset  description metadata needed. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:DescriptionType">
+				<sequence>
+					<element ref="ows:WGS84BoundingBox" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of zero or more minimum bounding rectangles surrounding coverage data, using the WGS 84 CRS with decimal degrees and longitude before latitude. If no WGS 84 bounding box is recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall apply to this coverage. If WGS 84 bounding box(es) are recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall be igno [...]
+						</annotation>
+					</element>
+					<element name="Identifier" type="ows:CodeType">
+						<annotation>
+							<documentation>Unambiguous identifier or name of this coverage, unique for this server. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of zero or more minimum bounding rectangles surrounding coverage data, in AvailableCRSs.  Zero or more BoundingBoxes are  allowed in addition to one or more WGS84BoundingBoxes to allow more precise specification of the Dataset area in AvailableCRSs. These Bounding Boxes shall not use any CRS not listed as an AvailableCRS. However, an AvailableCRS can be listed without a corresponding Bounding Box. If no such bounding box is recorded for a coverage, an [...]
+						</annotation>
+					</element>
+					<element ref="ows:Metadata" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Optional unordered list of additional metadata about this dataset. A list of optional metadata elements for this dataset description could be specified in the Implementation Specification for this service. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:DatasetDescriptionSummary" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Metadata describing zero or more unordered subsidiary datasets available from this server. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===========================================================-->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsDataIdentification.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsDataIdentification.xsd
new file mode 100755
index 0000000..b28c4c3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsDataIdentification.xsd
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns:xlink="http://www.w3.org/1999/xlink" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsDataIdentification.xsd</appinfo>
+		<documentation>This XML Schema Document encodes the parts of the MD_DataIdentification class of ISO 19115 (OGC Abstract Specification Topic 11) which are expected to be used for most datasets. This Schema also encodes the parts of this class that are expected to be useful for other metadata. Both may be used within the Contents section of OWS service metadata (Capabilities) documents.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="owsCommon.xsd"/>
+	<include schemaLocation="ows19115subset.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<complexType name="DescriptionType">
+		<annotation>
+			<documentation>Human-readable descriptive information for the object it is included within.
+This type shall be extended if needed for specific OWS use to include additional metadata for each type of information. This type shall not be restricted for a specific OWS to change the multiplicity (or optionality) of some elements.
+			If the xml:lang attribute is not included in a Title, Abstract or Keyword element, then no language is specified for that element unless specified by another means.  All Title, Abstract and Keyword elements in the same Description that share the same xml:lang attribute value represent the description of the parent object in that language. Multiple Title or Abstract elements shall not exist in the same Description with the same xml:lang attribute value unless otherwise specified. </doc [...]
+		</annotation>
+		<sequence>
+			<element ref="ows:Title" minOccurs="0" maxOccurs="unbounded"/>
+			<element ref="ows:Abstract" minOccurs="0" maxOccurs="unbounded"/>
+			<element ref="ows:Keywords" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================= -->
+	<complexType name="BasicIdentificationType">
+		<annotation>
+			<documentation>Basic metadata identifying and describing a set of data. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:DescriptionType">
+				<sequence>
+					<element ref="ows:Identifier" minOccurs="0">
+						<annotation>
+							<documentation>Optional unique identifier or name of this dataset. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:Metadata" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Optional unordered list of additional metadata about this data(set). A list of optional metadata elements for this data identification could be specified in the Implementation Specification for this service. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================= -->
+	<complexType name="IdentificationType">
+		<annotation>
+			<documentation>Extended metadata identifying and describing a set of data. This type shall be extended if needed for each specific OWS to include additional metadata for each type of dataset. If needed, this type should first be restricted for each specific OWS to change the multiplicity (or optionality) of some elements. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:BasicIdentificationType">
+				<sequence>
+					<element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of zero or more bounding boxes whose union describes the extent of this dataset. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:OutputFormat" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of zero or more references to data formats supported for server outputs. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:AvailableCRS" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of zero or more available coordinate reference systems. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===========================================================-->
+	<element name="Identifier" type="ows:CodeType">
+		<annotation>
+			<documentation>Unique identifier or name of this dataset. </documentation>
+		</annotation>
+	</element>
+	<!-- ===========================================================-->
+	<element name="OutputFormat" type="ows:MimeType">
+		<annotation>
+			<documentation>Reference to a format in which this data can be encoded and transferred. More specific parameter names should be used by specific OWS specifications wherever applicable. More than one such parameter can be included for different purposes. </documentation>
+		</annotation>
+	</element>
+	<!-- ===========================================================-->
+	<element name="AvailableCRS" type="anyURI"/>
+	<element name="SupportedCRS" type="anyURI" substitutionGroup="ows:AvailableCRS">
+		<annotation>
+			<documentation>Coordinate reference system in which data from this data(set) or resource is available or supported. More specific parameter names should be used by specific OWS specifications wherever applicable. More than one such parameter can be included for different purposes. </documentation>
+		</annotation>
+	</element>
+	<!-- ==========================================================
+	The following elements could be added to the IdentificationType when useful for a 
+	specific OWS. In addition the PointOfContact element in ows19115subset.xsd could 
+	be added.
+	============================================================= -->
+	<element name="AccessConstraints" type="string">
+		<annotation>
+			<documentation>Access constraint applied to assure the protection of privacy or intellectual property, or any other restrictions on retrieving or using data from or otherwise using this server. The reserved value NONE (case insensitive) shall be used to mean no access constraints are imposed. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Fees" type="string">
+		<annotation>
+			<documentation>Fees and terms for retrieving data from or otherwise using this server, including the monetary units as specified in ISO 4217. The reserved value NONE (case insensitive) shall be used to mean no fees or terms. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Language" type="language">
+		<annotation>
+			<documentation>Identifier of a language used by the data(set) contents. This language identifier shall be as specified in IETF RFC 4646. When this element is omitted, the language used is not identified. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsDomainType.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsDomainType.xsd
new file mode 100755
index 0000000..c3006f3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsDomainType.xsd
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns:xlink="http://www.w3.org/1999/xlink" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsDomainType.xsd</appinfo>
+		<documentation>This XML Schema Document encodes the allowed values (or domain) of a quantity, often for an input or output parameter to an OWS. Such a parameter is sometimes called a variable, quantity, literal, or typed literal. Such a parameter can use one of many data types, including double, integer, boolean, string, or URI. The allowed values can also be encoded for a quantity that is not explicit or not transferred, but is constrained by a server implementation.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="owsCommon.xsd"></include>
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"></import>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<complexType name="DomainType">
+		<annotation>
+			<documentation>Valid domain (or allowed set of values) of one quantity, with its name or identifier. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:UnNamedDomainType">
+				<attribute name="name" type="string" use="required">
+					<annotation>
+						<documentation>Name or identifier of this quantity. </documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<complexType name="UnNamedDomainType">
+		<annotation>
+			<documentation>Valid domain (or allowed set of values) of one quantity, with needed metadata but without a quantity name or identifier. </documentation>
+		</annotation>
+		<sequence>
+			<group ref="ows:PossibleValues"/>
+			<element ref="ows:DefaultValue" minOccurs="0">
+				<annotation>
+					<documentation>Optional default value for this quantity, which should be included when this quantity has a default value. </documentation>
+				</annotation>
+			</element>
+			<element ref="ows:Meaning" minOccurs="0">
+				<annotation>
+					<documentation>Meaning metadata should be referenced or included for each quantity. </documentation>
+				</annotation>
+			</element>
+			<element ref="ows:DataType" minOccurs="0">
+				<annotation>
+					<documentation>This data type metadata should be referenced or included for each quantity. </documentation>
+				</annotation>
+			</element>
+			<group ref="ows:ValuesUnit" minOccurs="0">
+				<annotation>
+					<documentation>Unit of measure, which should be included when this set of PossibleValues has units or a more complete reference system. </documentation>
+				</annotation>
+			</group>
+			<element ref="ows:Metadata" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Optional unordered list of other metadata about this quantity. A list of required and optional other metadata elements for this quantity should be specified in the Implementation Specification for this service. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<group name="PossibleValues">
+		<annotation>
+			<documentation>Specifies the possible values of this quantity. </documentation>
+		</annotation>
+			<choice>
+				<element ref="ows:AllowedValues"/>
+				<element ref="ows:AnyValue"/>
+				<element ref="ows:NoValues"/>
+				<element ref="ows:ValuesReference"/>
+			</choice>
+	</group>
+	<!-- ========================================================== -->
+	<element name="AnyValue">
+		<annotation>
+			<documentation>Specifies that any value is allowed for this parameter.</documentation>
+		</annotation>
+		<complexType></complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="NoValues">
+		<annotation>
+			<documentation>Specifies that no values are allowed for this parameter or quantity.</documentation>
+		</annotation>
+		<complexType></complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="ValuesReference">
+		<annotation>
+			<documentation>Reference to externally specified list of all the valid values and/or ranges of values for this quantity. (Informative: This element was simplified from the metaDataProperty element in GML 3.0.) </documentation>
+		</annotation>
+		<complexType>
+			<simpleContent>
+				<extension base="string">
+					<annotation>
+						<documentation>Human-readable name of the list of values provided by the referenced document. Can be empty string when this list has no name. </documentation>
+					</annotation>
+					<attribute ref="ows:reference" use="required">
+					</attribute>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<group name="ValuesUnit">
+		<annotation>
+			<documentation>Indicates that this quantity has units or a reference system, and identifies the unit or reference system used by the AllowedValues or ValuesReference. </documentation>
+		</annotation>
+			<choice>
+				<element ref="ows:UOM">
+					<annotation>
+						<documentation>Identifier of unit of measure of this set of values. Should be included then this set of values has units (and not a more complete reference system). </documentation>
+					</annotation>
+				</element>
+				<element ref="ows:ReferenceSystem">
+					<annotation>
+						<documentation>Identifier of reference system used by this set of values. Should be included then this set of values has a reference system (not just units). </documentation>
+					</annotation>
+				</element>
+			</choice>
+	</group>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="AllowedValues">
+		<annotation>
+			<documentation>List of all the valid values and/or ranges of values for this quantity. For numeric quantities, signed values should be ordered from negative infinity to positive infinity. </documentation>
+		</annotation>
+		<complexType>
+			<choice maxOccurs="unbounded">
+				<element ref="ows:Value"/>
+				<element ref="ows:Range"/>
+			</choice>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Value" type="ows:ValueType"></element>
+	<!-- ========================================================== -->
+	<complexType name="ValueType">
+		<annotation>
+			<documentation>A single value, encoded as a string. This type can be used for one value, for a spacing between allowed values, or for the default value of a parameter. </documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string"></extension>
+		</simpleContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="DefaultValue" type="ows:ValueType">
+		<annotation>
+			<documentation>The default value for a quantity for which multiple values are allowed. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Range" type="ows:RangeType"></element>
+	<!-- ========================================================== -->
+	<complexType name="RangeType">
+		<annotation>
+			<documentation>A range of values of a numeric parameter. This range can be continuous or discrete, defined by a fixed spacing between adjacent valid values. If the MinimumValue or MaximumValue is not included, there is no value limit in that direction. Inclusion of the specified minimum and maximum values in the range shall be defined by the rangeClosure. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="ows:MinimumValue" minOccurs="0"></element>
+			<element ref="ows:MaximumValue" minOccurs="0"></element>
+			<element ref="ows:Spacing" minOccurs="0">
+				<annotation>
+					<documentation>Shall be included when the allowed values are NOT continuous in this range. Shall not be included when the allowed values are continuous in this range. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute ref="ows:rangeClosure" use="optional">
+			<annotation>
+				<documentation>Shall be included unless the default value applies. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="MinimumValue" type="ows:ValueType">
+		<annotation>
+			<documentation>Minimum value of this numeric parameter. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="MaximumValue" type="ows:ValueType">
+		<annotation>
+			<documentation>Maximum value of this numeric parameter. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Spacing" type="ows:ValueType">
+		<annotation>
+			<documentation>The regular distance or spacing between the allowed values in a range. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<attribute name="rangeClosure" default="closed">
+		<annotation>
+			<documentation>Specifies which of the minimum and maximum values are included in the range. Note that plus and minus infinity are considered closed bounds. </documentation>
+		</annotation>
+		<simpleType>
+			<restriction base="NMTOKENS">
+				<enumeration value="closed">
+					<annotation>
+						<documentation>The specified minimum and maximum values are included in this range. </documentation>
+					</annotation>
+				</enumeration>
+				<enumeration value="open">
+					<annotation>
+						<documentation>The specified minimum and maximum values are NOT included in this range. </documentation>
+					</annotation>
+				</enumeration>
+				<enumeration value="open-closed">
+					<annotation>
+						<documentation>The specified minimum value is NOT included in this range, and the specified maximum value IS included in this range. </documentation>
+					</annotation>
+				</enumeration>
+				<enumeration value="closed-open">
+					<annotation>
+						<documentation>The specified minimum value IS included in this range, and the specified maximum value is NOT included in this range. </documentation>
+					</annotation>
+				</enumeration>
+			</restriction>
+		</simpleType>
+	</attribute>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<complexType name="DomainMetadataType">
+		<annotation>
+			<documentation>References metadata about a quantity, and provides a name for this metadata. (Informative: This element was simplified from the metaDataProperty element in GML 3.0.) </documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<annotation>
+					<documentation>Human-readable name of the metadata described by associated referenced document. </documentation>
+				</annotation>
+				<attribute ref="ows:reference" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<attribute name="reference" type="anyURI">
+		<annotation>
+			<documentation>Reference to data or metadata recorded elsewhere, either external to this XML document or within it. Whenever practical, this attribute should be a URL from which this metadata can be electronically retrieved. Alternately, this attribute can reference a URN for well-known metadata. For example, such a URN could be a URN defined in the "ogc" URN namespace. </documentation>
+		</annotation>
+	</attribute>
+	<!-- ========================================================== -->
+	<element name="Meaning" type="ows:DomainMetadataType">
+		<annotation>
+			<documentation>Definition of the meaning or semantics of this set of values. This Meaning can provide more specific, complete, precise, machine accessible, and machine understandable semantics about this quantity, relative to other available semantic information. For example, other semantic information is often provided in "documentation" elements in XML Schemas or "description" elements in GML objects. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="DataType" type="ows:DomainMetadataType">
+		<annotation>
+			<documentation>Definition of the data type of this set of values. In this case, the xlink:href attribute can reference a URN for a well-known data type. For example, such a URN could be a data type identification URN defined in the "ogc" URN namespace. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="ReferenceSystem" type="ows:DomainMetadataType">
+		<annotation>
+			<documentation>Definition of the reference system used by this set of values, including the unit of measure whenever applicable (as is normal). In this case, the xlink:href attribute can reference a URN for a well-known reference system, such as for a coordinate reference system (CRS). For example, such a URN could be a CRS identification URN defined in the "ogc" URN namespace. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="UOM" type="ows:DomainMetadataType">
+		<annotation>
+			<documentation>Definition of the unit of measure of this set of values. In this case, the xlink:href attribute can reference a URN for a well-known unit of measure (uom). For example, such a URN could be a UOM identification URN defined in the "ogc" URN namespace. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd
new file mode 100755
index 0000000..c6751f9
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0 2011-02-07" xml:lang="en">
+	<annotation>
+		<appinfo>owsExceptionReport.xsd</appinfo>
+		<documentation>This XML Schema Document encodes the Exception Report response to all OWS operations.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="ExceptionReport">
+		<annotation>
+			<documentation>Report message returned to the client that requested any OWS operation when the server detects an error while processing that operation request. </documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element ref="ows:Exception" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Unordered list of one or more Exception elements that each describes an error. These Exception elements shall be interpreted by clients as being independent of one another (not hierarchical). </documentation>
+					</annotation>
+				</element>
+			</sequence>
+			<attribute name="version" use="required">
+				<annotation>
+					<documentation>Specification version for OWS operation. The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99. Each version shall be for the Implementation Specification (document) and the associated XML Schemas to which requested operations will conform. An Implementation Specification version normally specifies XM [...]
+				</annotation>
+				<simpleType>
+					<restriction base="string">
+						<pattern value="\d+\.\d?\d\.\d?\d"/>
+					</restriction>
+				</simpleType>
+			</attribute>
+			<attribute ref="xml:lang" use="optional">
+				<annotation>
+					<documentation>Identifier of the language used by all included exception text values. These language identifiers shall be as specified in IETF RFC 4646. When this attribute is omitted, the language used is not identified. </documentation>
+				</annotation>
+			</attribute>
+		</complexType>
+	</element>
+	<!-- ======================================================= -->
+	<element name="Exception" type="ows:ExceptionType"/>
+	<!-- ======================================================= -->
+	<complexType name="ExceptionType">
+		<annotation>
+			<documentation>An Exception element describes one detected error that a server chooses to convey to the client. </documentation>
+		</annotation>
+		<sequence>
+			<element name="ExceptionText" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Ordered sequence of text strings that describe this specific exception or error. The contents of these strings are left open to definition by each server implementation. A server is strongly encouraged to include at least one ExceptionText value, to provide more information about the detected error than provided by the exceptionCode. When included, multiple ExceptionText values shall provide hierarchical information about one detected error, with the most significant  [...]
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="exceptionCode" type="string" use="required">
+			<annotation>
+				<documentation>A code representing the type of this exception, which shall be selected from a set of exceptionCode values specified for the specific service operation and server. </documentation>
+			</annotation>
+		</attribute>
+		<attribute name="locator" type="string" use="optional">
+			<annotation>
+				<documentation>When included, this locator shall indicate to the client where an exception was encountered in servicing the client's operation request. This locator should be included whenever meaningful information can be provided by the server. The contents of this locator will depend on the specific exceptionCode and OWS service, and shall be specified in the OWS Implementation Specification. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsGetCapabilities.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsGetCapabilities.xsd
new file mode 100755
index 0000000..4ab69a6
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsGetCapabilities.xsd
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsGetCapabilities.xsd</appinfo>
+		<documentation>This XML Schema Document defines the GetCapabilities operation request and response XML elements and types, which are common to all OWSs. This XML Schema shall be edited by each OWS, for example, to specify a specific value for the "service" attribute.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="owsServiceIdentification.xsd"/>
+	<include schemaLocation="owsServiceProvider.xsd"/>
+	<include schemaLocation="owsOperationsMetadata.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<complexType name="CapabilitiesBaseType">
+		<annotation>
+			<documentation>XML encoded GetCapabilities operation response. This document provides clients with service metadata about a specific service instance, usually including metadata about the tightly-coupled data served. If the server does not implement the updateSequence parameter, the server shall always return the complete Capabilities document, without the updateSequence parameter. When the server implements the updateSequence parameter and the GetCapabilities operation request includ [...]
+		</annotation>
+		<sequence>
+			<element ref="ows:ServiceIdentification" minOccurs="0"/>
+			<element ref="ows:ServiceProvider" minOccurs="0"/>
+			<element ref="ows:OperationsMetadata" minOccurs="0"/>
+		</sequence>
+		<attribute name="version" type="ows:VersionType" use="required"/>
+		<attribute name="updateSequence" type="ows:UpdateSequenceType" use="optional">
+			<annotation>
+				<documentation>Service metadata document version, having values that are "increased" whenever any change is made in service metadata document. Values are selected by each server, and are always opaque to clients. When not supported by server, server shall not return this attribute. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="GetCapabilities" type="ows:GetCapabilitiesType"/>
+	<!-- =========================================================== -->
+	<complexType name="GetCapabilitiesType">
+		<annotation>
+			<documentation>XML encoded GetCapabilities operation request. This operation allows clients to retrieve service metadata about a specific service instance. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. This base type shall be extended by each specific OWS to include the additional required "service" attribute, with the correct value for that OWS. </documentation>
+		</annotation>
+		<sequence>
+			<element name="AcceptVersions" type="ows:AcceptVersionsType" minOccurs="0">
+				<annotation>
+					<documentation>When omitted, server shall return latest supported version. </documentation>
+				</annotation>
+			</element>
+			<element name="Sections" type="ows:SectionsType" minOccurs="0">
+				<annotation>
+					<documentation>When omitted or not supported by server, server shall return complete service metadata (Capabilities) document. </documentation>
+				</annotation>
+			</element>
+			<element name="AcceptFormats" type="ows:AcceptFormatsType" minOccurs="0">
+				<annotation>
+					<documentation>When omitted or not supported by server, server shall return service metadata document using the MIME type "text/xml". </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="updateSequence" type="ows:UpdateSequenceType" use="optional">
+			<annotation>
+				<documentation>When omitted or not supported by server, server shall return latest complete service metadata document. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<simpleType name="ServiceType">
+		<annotation>
+			<documentation>Service type identifier, where the string value is the OWS type abbreviation, such as "WMS" or "WFS". </documentation>
+		</annotation>
+		<restriction base="string"/>
+	</simpleType>
+	<!-- ========================================================= -->
+	<complexType name="AcceptVersionsType">
+		<annotation>
+			<documentation>Prioritized sequence of one or more specification versions accepted by client, with preferred versions listed first. See Version negotiation subclause for more information. </documentation>
+		</annotation>
+		<sequence>
+			<element name="Version" type="ows:VersionType" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="SectionsType">
+		<annotation>
+			<documentation>Unordered list of zero or more names of requested sections in complete service metadata document. Each Section value shall contain an allowed section name as specified by each OWS specification. See Sections parameter subclause for more information.  </documentation>
+		</annotation>
+		<sequence>
+			<element name="Section" type="string" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="UpdateSequenceType">
+		<annotation>
+			<documentation>Service metadata document version, having values that are "increased" whenever any change is made in service metadata document. Values are selected by each server, and are always opaque to clients. See updateSequence parameter use subclause for more information. </documentation>
+		</annotation>
+		<restriction base="string"/>
+	</simpleType>
+	<!-- =========================================================== -->
+	<complexType name="AcceptFormatsType">
+		<annotation>
+			<documentation>Prioritized sequence of zero or more GetCapabilities operation response formats desired by client, with preferred formats listed first. Each response format shall be identified by its MIME type. See AcceptFormats parameter use subclause for more information. </documentation>
+		</annotation>
+		<sequence>
+			<element name="OutputFormat" type="ows:MimeType" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsGetResourceByID.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsGetResourceByID.xsd
new file mode 100755
index 0000000..553601a
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsGetResourceByID.xsd
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsGetResourceByID.xsd</appinfo>
+		<documentation>This XML Schema Document encodes the GetResourceByID operation request message. This typical operation is specified as a base for profiling in specific OWS specifications. For information on the allowed changes and limitations in such profiling, see Subclause 9.4.1 of the OWS Common specification.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="owsDataIdentification.xsd"></include>
+	<include schemaLocation="owsGetCapabilities.xsd"></include>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="Resource">
+		<annotation>
+			<documentation>XML encoded GetResourceByID operation response. The complexType used by this element shall be specified by each specific OWS.  </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="GetResourceByID" type="ows:GetResourceByIdType"></element>
+	<!-- =========================================================== -->
+	<complexType name="GetResourceByIdType">
+		<annotation>
+			<documentation>Request to a service to perform the GetResourceByID operation. This operation allows a client to retrieve one or more identified resources, including datasets and resources that describe datasets or parameters. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. </documentation>
+		</annotation>
+		<sequence>
+			<element name="ResourceID" type="anyURI" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Unordered list of zero or more resource identifiers. These identifiers can be listed in the Contents section of the service metadata (Capabilities) document. For more information on this parameter, see Subclause 9.4.2.1 of the OWS Common specification. </documentation>
+				</annotation>
+			</element>
+			<element ref="ows:OutputFormat" minOccurs="0">
+				<annotation>
+					<documentation>Optional reference to the data format to be used for response to this operation request. This element shall be included when multiple output formats are available for the selected resource(s), and the client desires a format other than the specified default, if any. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="service" type="ows:ServiceType" use="required"></attribute>
+		<attribute name="version" type="ows:VersionType" use="required"></attribute>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsInputOutputData.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsInputOutputData.xsd
new file mode 100755
index 0000000..7bdd52b
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsInputOutputData.xsd
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsInputOutputData.xsd</appinfo>
+		<documentation>This XML Schema Document specifies types and elements for input and output of operation data, allowing including multiple data items with each data item either included or referenced. The contents of each type and element specified here can be restricted and/or extended for each use in a specific OWS specification.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="owsManifest.xsd"/>
+	<!-- ==========================================================
+		Types and elements
+	    ========================================================== -->
+	<element name="OperationResponse" type="ows:ManifestType">
+		<annotation>
+			<documentation>Response from an OWS operation, allowing including multiple output data items with each item either included or referenced. This OperationResponse element, or an element using the ManifestType with a more specific element name, shall be used whenever applicable for responses from OWS operations. </documentation>
+			<documentation>This element is specified for use where the ManifestType contents are needed for an operation response, but the Manifest element name is not fully applicable. This element or the ManifestType shall be used instead of using the ows:ReferenceType proposed in OGC 04-105. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="InputData" type="ows:ManifestType">
+		<annotation>
+			<documentation>Input data in a XML-encoded OWS operation request, allowing including multiple data items with each data item either included or referenced. This InputData element, or an element using the ManifestType with a more-specific element name (TBR), shall be used whenever applicable within XML-encoded OWS operation requests. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="ServiceReference" type="ows:ServiceReferenceType" substitutionGroup="ows:Reference"/>
+	<!-- ========================================================== -->
+	<complexType name="ServiceReferenceType">
+		<annotation>
+			<documentation>Complete reference to a remote resource that needs to be retrieved from an OWS using an XML-encoded operation request. This element shall be used, within an InputData or Manifest element that is used for input data, when that input data needs to be retrieved from another web service using a XML-encoded OWS operation request. This element shall not be used for local payload input data or for requesting the resource from a web server using HTTP Get. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:ReferenceType">
+				<choice>
+					<element name="RequestMessage" type="anyType">
+						<annotation>
+							<documentation>The XML-encoded operation request message to be sent to request this input data from another web server using HTTP Post. </documentation>
+						</annotation>
+					</element>
+					<element name="RequestMessageReference" type="anyURI">
+						<annotation>
+							<documentation>Reference to the XML-encoded operation request message to be sent to request this input data from another web server using HTTP Post. The referenced message shall be attached to the same message (using the cid scheme), or be accessible using a URL. </documentation>
+						</annotation>
+					</element>
+				</choice>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsManifest.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsManifest.xsd
new file mode 100755
index 0000000..d450db1
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsManifest.xsd
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns:xlink="http://www.w3.org/1999/xlink" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsManifest.xsd</appinfo>
+		<documentation>This XML Schema Document specifies types and elements for document or resource references and for package manifests that contain multiple references. The contents of each type and element specified here can be restricted and/or extended for each use in a specific OWS specification.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsDataIdentification.xsd"/>
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<!-- ==========================================================
+		Types and elements
+	    ========================================================== -->
+	<element name="AbstractReferenceBase" type="ows:AbstractReferenceBaseType" abstract="true"/>
+	<!-- ========================================================== -->
+	<complexType name="AbstractReferenceBaseType">
+		<annotation>
+			<documentation> Base for a reference to a remote or local resource. </documentation>
+			<documentation>This type contains only a restricted and annotated set of the attributes from the xlink:simpleAttrs attributeGroup. </documentation>
+		</annotation>
+		<attribute name="type" type="string" fixed="simple" form="qualified"/>
+		<attribute ref="xlink:href" use="required">
+				<annotation>
+					<documentation>Reference to a remote resource or local payload. A remote resource is typically addressed by a URL. For a local payload (such as a multipart mime message), the xlink:href must start with the prefix cid:. </documentation>
+			</annotation>
+		</attribute>
+		<attribute ref="xlink:role" use="optional">
+			<annotation>
+				<documentation>Reference to a resource that describes the role of this reference. When no value is supplied, no particular role value is to be inferred. </documentation>
+			</annotation>
+		</attribute>
+		<attribute ref="xlink:arcrole" use="optional">
+			<annotation>
+				<documentation>Although allowed, this attribute is not expected to be useful in this application of xlink:simpleAttrs. </documentation>
+			</annotation>
+		</attribute>
+		<attribute ref="xlink:title" use="optional">
+			<annotation>
+				<documentation>Describes the meaning of the referenced resource in a human-readable fashion. </documentation>
+			</annotation>
+		</attribute>
+		<attribute ref="xlink:show" use="optional">
+			<annotation>
+				<documentation>Although allowed, this attribute is not expected to be useful in this application of xlink:simpleAttrs. </documentation>
+			</annotation>
+		</attribute>
+		<attribute ref="xlink:actuate" use="optional">
+			<annotation>
+				<documentation>Although allowed, this attribute is not expected to be useful in this application of xlink:simpleAttrs. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="Reference" type="ows:ReferenceType" substitutionGroup="ows:AbstractReferenceBase"/>
+	<!-- ========================================================== -->
+	<complexType name="ReferenceType">
+		<annotation>
+			<documentation>Complete reference to a remote or local resource, allowing including metadata about that resource. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:AbstractReferenceBaseType">
+				<sequence>
+					<element ref="ows:Identifier" minOccurs="0">
+						<annotation>
+							<documentation>Optional unique identifier of the referenced resource. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:Abstract" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="Format" type="ows:MimeType" minOccurs="0">
+						<annotation>
+							<documentation>The format of the referenced resource. This element is omitted when the mime type is indicated in the http header of the reference. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:Metadata" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Optional unordered list of additional metadata about this resource. A list of optional metadata elements for this ReferenceType could be specified in the Implementation Specification for each use of this type in a specific OWS. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="ReferenceGroup" type="ows:ReferenceGroupType"/>
+	<!-- =========================================================== -->
+	<complexType name="ReferenceGroupType">
+		<annotation>
+			<documentation>Logical group of one or more references to remote and/or local resources, allowing including metadata about that group. A Group can be used instead of a Manifest that can only contain one group. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:BasicIdentificationType">
+				<sequence>
+					<element ref="ows:AbstractReferenceBase" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Manifest" type="ows:ManifestType"/>
+	<!-- =========================================================== -->
+	<complexType name="ManifestType">
+		<annotation>
+			<documentation>Unordered list of one or more groups of references to remote and/or local resources. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:BasicIdentificationType">
+				<sequence>
+					<element ref="ows:ReferenceGroup" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsOperationsMetadata.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsOperationsMetadata.xsd
new file mode 100755
index 0000000..4861a90
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsOperationsMetadata.xsd
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsOperationsMetadata.xsd</appinfo>
+		<documentation>This XML Schema Document encodes the basic contents of the "OperationsMetadata" section of the GetCapabilities operation response, also known as the Capabilities XML document.
+			
+			OWS is an OGC Standard.
+			Copyright (c) 2006,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="owsCommon.xsd"/>
+	<include schemaLocation="ows19115subset.xsd"/>
+	<include schemaLocation="owsDomainType.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="OperationsMetadata">
+		<annotation>
+			<documentation>Metadata about the operations and related abilities specified by this service and implemented by this server, including the URLs for operation requests. The basic contents of this section shall be the same for all OWS types, but individual services can add elements and/or change the optionality of optional elements. </documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element ref="ows:Operation" minOccurs="2" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Metadata for unordered list of all the (requests for) operations that this server interface implements. The list of required and optional operations implemented shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element name="Parameter" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of parameter valid domains that each apply to one or more operations which this server interface implements. The list of required and optional parameter domain limitations shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element name="Constraint" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this server. The list of required and optional constraints shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element ref="ows:ExtendedCapabilities" minOccurs="0"/>
+			</sequence>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="ExtendedCapabilities" type="anyType">
+		<annotation>
+			<documentation>Individual software vendors and servers can use this element to provide metadata about any additional server abilities. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Operation">
+		<annotation>
+			<documentation>Metadata for one operation that this server implements. </documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element ref="ows:DCP" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Unordered list of Distributed Computing Platforms (DCPs) supported for this operation. At present, only the HTTP DCP is defined, so this element will appear only once. </documentation>
+					</annotation>
+				</element>
+				<element name="Parameter" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of parameter domains that each apply to this operation which this server implements. If one of these Parameter elements has the same "name" attribute as a Parameter element in the OperationsMetadata element, this Parameter element shall override the other one for this operation. The list of required and optional parameter domain limitations for this operation shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element name="Constraint" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this operation. If one of these Constraint elements has the same "name" attribute as a Constraint element in the OperationsMetadata element, this Constraint element shall override the other one for this operation. The list of required and optional constraints for this operation shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element ref="ows:Metadata" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of additional metadata about this operation and its' implementation. A list of required and optional metadata elements for this operation should be specified in the Implementation Specification for this service. (Informative: This metadata might specify the operation request parameters or provide the XML Schemas for the operation request.) </documentation>
+					</annotation>
+				</element>
+			</sequence>
+			<attribute name="name" type="string" use="required">
+				<annotation>
+					<documentation>Name or identifier of this operation (request) (for example, GetCapabilities). The list of required and optional operations implemented shall be specified in the Implementation Specification for this service. </documentation>
+				</annotation>
+			</attribute>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="DCP">
+		<annotation>
+			<documentation>Information for one distributed Computing Platform (DCP) supported for this operation. At present, only the HTTP DCP is defined, so this element only includes the HTTP element.
+</documentation>
+		</annotation>
+		<complexType>
+			<choice>
+				<element ref="ows:HTTP"/>
+			</choice>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="HTTP">
+		<annotation>
+			<documentation>Connect point URLs for the HTTP Distributed Computing Platform (DCP). Normally, only one Get and/or one Post is included in this element. More than one Get and/or Post is allowed to support including alternative URLs for uses such as load balancing or backup. </documentation>
+		</annotation>
+		<complexType>
+			<choice maxOccurs="unbounded">
+				<element name="Get" type="ows:RequestMethodType">
+					<annotation>
+						<documentation>Connect point URL prefix and any constraints for the HTTP "Get" request method for this operation request. </documentation>
+					</annotation>
+				</element>
+				<element name="Post" type="ows:RequestMethodType">
+					<annotation>
+						<documentation>Connect point URL and any constraints for the HTTP "Post" request method for this operation request. </documentation>
+					</annotation>
+				</element>
+			</choice>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="RequestMethodType">
+		<annotation>
+			<documentation>Connect point URL and any constraints for this HTTP request method for this operation request. In the OnlineResourceType, the xlink:href attribute in the xlink:simpleAttrs attribute group shall be used to contain this URL. The other attributes in the xlink:simpleAttrs attribute group should not be used. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:OnlineResourceType">
+				<sequence>
+					<element name="Constraint" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this request method for this operation. If one of these Constraint elements has the same "name" attribute as a Constraint element in the OperationsMetadata or Operation element, this Constraint element shall override the other one for this operation. The list of required and optional constraints for this request method for this operation shall be specified in the Imple [...]
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsServiceIdentification.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsServiceIdentification.xsd
new file mode 100755
index 0000000..c15fcfa
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsServiceIdentification.xsd
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsServiceIdentification.xsd</appinfo>
+		<documentation>This XML Schema Document encodes the common "ServiceIdentification" section of the GetCapabilities operation response, known as the Capabilities XML document. This section encodes the SV_ServiceIdentification class of ISO 19119 (OGC Abstract Specification Topic 12). 
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="owsDataIdentification.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="ServiceIdentification">
+		<annotation>
+			<documentation>General metadata for this specific server. This XML Schema of this section shall be the same for all OWS. </documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="ows:DescriptionType">
+					<sequence>
+						<element name="ServiceType" type="ows:CodeType">
+							<annotation>
+								<documentation>A service type name from a registry of services. For example, the values of the codeSpace URI and name and code string may be "OGC" and "catalogue." This type name is normally used for machine-to-machine communication. </documentation>
+							</annotation>
+						</element>
+						<element name="ServiceTypeVersion" type="ows:VersionType" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Unordered list of one or more versions of this service type implemented by this server. This information is not adequate for version negotiation, and shall not be used for that purpose. </documentation>
+							</annotation>
+						</element>
+						<element name="Profile" type="anyURI" minOccurs="0" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Unordered list of identifiers of Application Profiles that are implemented by this server. This element should be included for each specified application profile implemented by this server. The identifier value should be specified by each Application Profile. If this element is omitted, no meaning is implied. </documentation>
+							</annotation>
+						</element>
+						<element ref="ows:Fees" minOccurs="0">
+							<annotation>
+								<documentation>If this element is omitted, no meaning is implied. </documentation>
+							</annotation>
+						</element>
+						<element ref="ows:AccessConstraints" minOccurs="0" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Unordered list of access constraints applied to assure the protection of privacy or intellectual property, and any other restrictions on retrieving or using data from or otherwise using this server. The reserved value NONE (case insensitive) shall be used to mean no access constraints are imposed. When this element is omitted, no meaning is implied. </documentation>
+							</annotation>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsServiceProvider.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsServiceProvider.xsd
new file mode 100755
index 0000000..bce3e64
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/ows/1.1.0/owsServiceProvider.xsd
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows/1.1" 
+xmlns:ows="http://www.opengis.net/ows/1.1" 
+xmlns:xlink="http://www.w3.org/1999/xlink" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.1.0.3" xml:lang="en">
+	<annotation>
+		<appinfo>owsServiceProvider.xsd</appinfo>
+		<documentation>This XML Schema Document encodes the common "ServiceProvider" section of the GetCapabilities operation response, known as the Capabilities XML document. This section encodes the SV_ServiceProvider class of ISO 19119 (OGC Abstract Specification Topic 12). 
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2006,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsAll.xsd"/>
+	<include schemaLocation="ows19115subset.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="ServiceProvider">
+		<annotation>
+			<documentation>Metadata about the organization that provides this specific service instance or server. </documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element name="ProviderName" type="string">
+					<annotation>
+						<documentation>A unique identifier for the service provider organization. </documentation>
+					</annotation>
+				</element>
+				<element name="ProviderSite" type="ows:OnlineResourceType" minOccurs="0">
+					<annotation>
+						<documentation>Reference to the most relevant web site of the service provider. </documentation>
+					</annotation>
+				</element>
+				<element name="ServiceContact" type="ows:ResponsiblePartySubsetType">
+					<annotation>
+						<documentation>Information for contacting the service provider. The OnlineResource element within this ServiceContact element should not be used to reference a web site of the service provider. </documentation>
+					</annotation>
+				</element>
+			</sequence>
+		</complexType>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/LUTgeodesy.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/LUTgeodesy.xsd
new file mode 100755
index 0000000..785e326
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/LUTgeodesy.xsd
@@ -0,0 +1,439 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sa="http://www.opengis.net/sampling/1.0" targetNamespace="http://www.opengis.net/sampling/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" version="pre-release">
+	<!-- ==================================================================        -->
+	<annotation>
+		<documentation>
+LUTgeodesy.xsd
+
+Codelists used in geodesy and surveying
+
+2003-07-15
+
+Copyright (c) 2004 CSIRO - see https://www.seegrid.csiro.au/twiki/bin/view/Xmml/LegalNotices#Software_Notice
+</documentation>
+	</annotation>
+	<!-- ==================================================================        -->
+	<simpleType name="projections">
+		<annotation>
+			<documentation>Projected coordinate reference systems (equivalent code from EPSG Geodetic reference systems database v6.3)</documentation>
+		</annotation>
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="MGA48">
+						<annotation>
+							<documentation>Map grid of Australia zone 48 - EPSG projected CRS code 28348</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA49">
+						<annotation>
+							<documentation>Map grid of Australia zone 49 - EPSG projected CRS code 28349</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA50">
+						<annotation>
+							<documentation>Map grid of Australia zone 50 - EPSG projected CRS code 28350</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA51">
+						<annotation>
+							<documentation>Map grid of Australia zone 51 - EPSG projected CRS code 28351</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA52">
+						<annotation>
+							<documentation>Map grid of Australia zone 52 - EPSG projected CRS code 28352</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA53">
+						<annotation>
+							<documentation>Map grid of Australia zone 53 - EPSG projected CRS code 28353</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA54">
+						<annotation>
+							<documentation>Map grid of Australia zone 54 - EPSG projected CRS code 28354</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA55">
+						<annotation>
+							<documentation>Map grid of Australia zone 55 - EPSG projected CRS code 28355</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA56">
+						<annotation>
+							<documentation>Map grid of Australia zone 56 - EPSG projected CRS code 28356</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA57">
+						<annotation>
+							<documentation>Map grid of Australia zone 57 - EPSG projected CRS code 28357</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MGA58">
+						<annotation>
+							<documentation>Map grid of Australia zone 58 - EPSG projected CRS code 28358</documentation>
+						</annotation>
+					</enumeration>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<!-- ================================================================== -->
+	<simpleType name="gDatums">
+		<annotation>
+			<documentation>Geodetic datums (equivalent code from EPSG Geodetic reference systems database v6.3)</documentation>
+		</annotation>
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="AGD66">
+						<annotation>
+							<documentation>Australian geodetic datum 1966 - lon-lat/DD - no epsg code</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="WGS84(DMSH)">
+						<annotation>
+							<documentation>World Geodetic System 1984 - lon-lat/DMSH - as in epsg:4326 but with axis order switched</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="WGS84">
+						<annotation>
+							<documentation>World Geodetic System 19845 - lon-lat/DD - as in epsg:6326640 but with axis order switched</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="AGD84">
+						<annotation>
+							<documentation>Australian geodetic datum 1984 - lon-lat/DD - as in epsg:62036405 but with axis order switched</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="GDA94">
+						<annotation>
+							<documentation>Geodetic datum of Australia 1994 - lon-lat/DD - as in epsg:62836405 but with axis order switched</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="GDA94(3D)">
+						<annotation>
+							<documentation>Geodetic datum of Australia 1994 - lon-lat-h/DDm - as in epsg:62836413 but with 2D axis order switched</documentation>
+						</annotation>
+					</enumeration>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<!-- ================================================================== -->
+	<simpleType name="vDatums">
+		<annotation>
+			<documentation>Height datums (equivalent code from EPSG Geodetic reference systems database v6.3)</documentation>
+		</annotation>
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="AHD">
+						<annotation>
+							<documentation>Australian height datum - epsg:5711</documentation>
+						</annotation>
+					</enumeration>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<!-- ================================================================== -->
+	<simpleType name="elevationMethodType">
+		<annotation>
+			<documentation>Codes used in the Geoscience Australia corporate database http://www.ga.gov.au/oracle/#online</documentation>
+		</annotation>
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="MAP">
+						<annotation>
+							<documentation>Height is picked off a topographic map</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="PGE">
+						<annotation>
+							<documentation>Height computed from pressure gauge readings</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MIB">
+						<annotation>
+							<documentation>Micro-barometer recording technique</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="DRB">
+						<annotation>
+							<documentation>Digitally recording barometer technique</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="PHG">
+						<annotation>
+							<documentation>Heights determined by photogrammetry</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="ALT">
+						<annotation>
+							<documentation>Heights measured by aircraft altimeter</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="SAT">
+						<annotation>
+							<documentation>Height derived from satellite measurements</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="SON">
+						<annotation>
+							<documentation>Water depths derived from sonar recording</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="GPH">
+						<annotation>
+							<documentation>Hand held GPS height value (not very reliable)</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="GPS">
+						<annotation>
+							<documentation>Heights derived from post processed or real time dual frequency GPS recording</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="SUR">
+						<annotation>
+							<documentation>Heights determined by optical surveying methods or taken at surveyed points</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="FOS">
+						<annotation>
+							<documentation>First order geodetic height determination</documentation>
+						</annotation>
+					</enumeration>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<!-- ================================================================== -->
+	<simpleType name="positionMethodType">
+		<annotation>
+			<documentation>Alternative codes for the Geoscience Australia corporate database http://www.ga.gov.au/oracle/#online</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="Unknown">
+				<annotation>
+					<documentation>0 Unknown</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="GPS">
+				<annotation>
+					<documentation>1 GPS</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="GPS2">
+				<annotation>
+					<documentation>2 GPS</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="GPS3">
+				<annotation>
+					<documentation>3 GPS</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="GPS4">
+				<annotation>
+					<documentation>4 GPS</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Astronomical">
+				<annotation>
+					<documentation>5 Astronomical observation</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Surveyed from ground control">
+				<annotation>
+					<documentation>6 Surveyed from ground control</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Published report">
+				<annotation>
+					<documentation>7 Published report</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Unpublished report">
+				<annotation>
+					<documentation>8 Unpublished report</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Non-standard topographic map">
+				<annotation>
+					<documentation>10 Non-standard topographic map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="25k topo map">
+				<annotation>
+					<documentation>11 - 1:25 000 topographic map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="50k topo map">
+				<annotation>
+					<documentation>12 - 1:50 000 topographic map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="100k topo map">
+				<annotation>
+					<documentation>13 - 1:100 000 topographic map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="250k topo map">
+				<annotation>
+					<documentation>14 - 1:250 000 topographic map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="500k topo map">
+				<annotation>
+					<documentation>15 - 1:500 000 topographic map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="1M topo map">
+				<annotation>
+					<documentation>16 - 1:1 000 000 topographic map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Non-standard geological map">
+				<annotation>
+					<documentation>20 Non-standard geological map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="25k geological map">
+				<annotation>
+					<documentation>21 - 1:25 000 geological map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="50k geological map">
+				<annotation>
+					<documentation>22 - 1:50 000 geological map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="100k geological map">
+				<annotation>
+					<documentation>23 - 1:100 000 geological map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="250k geological map">
+				<annotation>
+					<documentation>24 - 1:250 000 geological map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="500k geological map">
+				<annotation>
+					<documentation>25 - 1:500 000 geological map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="1M geological map">
+				<annotation>
+					<documentation>26 - 1:1 000 000 geological map</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Differential GPS - Survey quality">
+				<annotation>
+					<documentation>30 Differential GPS - Survey quality</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Differential GPS">
+				<annotation>
+					<documentation>31 Differential GPS</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Averaged GPS">
+				<annotation>
+					<documentation>35 Averaged GPS</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Orthophoto">
+				<annotation>
+					<documentation>40 Orthophoto image</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="25k orthophoto">
+				<annotation>
+					<documentation>41 Orthophoto image 1:25 000 scale</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="Company supplied location - method unkown">
+				<annotation>
+					<documentation>50 Company supplied location - method unkown</documentation>
+				</annotation>
+			</enumeration>
+			<enumeration value="State/NT supplied location - method unkown">
+				<annotation>
+					<documentation>51 State/NT supplied location - method unkown</documentation>
+				</annotation>
+			</enumeration>
+		</restriction>
+	</simpleType>
+	<!-- ==================================================================   -->
+	<simpleType name="detailedElevationMethodType">
+		<annotation>
+			<documentation>Codes used in the Geoscience Australia gravity database http://www.ga.gov.au/oracle/#online</documentation>
+		</annotation>
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="PGE">
+						<annotation>
+							<documentation>Height computed from pressure gauge readings</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="MIB">
+						<annotation>
+							<documentation>Micro-barometer recording technique</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="DRB">
+						<annotation>
+							<documentation>Digitally recording barometer technique</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="RUL">
+						<annotation>
+							<documentation>Height above ground surface measured by ruler</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="ALT">
+						<annotation>
+							<documentation>Heights measured by aircraft altimeter</documentation>
+						</annotation>
+					</enumeration>
+					<enumeration value="EST">
+						<annotation>
+							<documentation>Height difference estimated from equipment type</documentation>
+						</annotation>
+					</enumeration>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<!-- ================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/sampling.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/sampling.xsd
new file mode 100755
index 0000000..8b2cf98
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/sampling.xsd
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" 
+xmlns:sa="http://www.opengis.net/sampling/1.0" 
+targetNamespace="http://www.opengis.net/sampling/1.0" 
+elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.3">
+	<annotation>
+		<documentation>sampling.xsd
+
+The complete sampling schema
+
+Sampling is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<include schemaLocation="./samplingManifold.xsd"/>
+	<include schemaLocation="./specimen.xsd"/>
+	<include schemaLocation="./samplingBase.xsd"/>
+	<include schemaLocation="./surveyProcedure.xsd"/> 
+	<include schemaLocation="./LUTgeodesy.xsd"/> 
+	<!-- ====================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/samplingBase.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/samplingBase.xsd
new file mode 100755
index 0000000..3dc674d
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/samplingBase.xsd
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:gml="http://www.opengis.net/gml" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:om="http://www.opengis.net/om/1.0" xmlns="http://www.w3.org/2001/XMLSchema"
+        xmlns:sa="http://www.opengis.net/sampling/1.0" targetNamespace="http://www.opengis.net/sampling/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.3">
+	<annotation>
+		<documentation>samplingBase.xsd
+
+Sampling features are feature types that are used primarily for making observations: 
+Abstract SamplingFeature, and collections are described in this schema document
+
+SamplingPoint, SamplingCurve, SamplingSurface and SamplingSolid are described in samplingManifold.xsd
+Specimen and LocatedSpecimen are described in specimen.xsd
+
+Sampling is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<!-- bring in other schemas -->
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<!-- GMD schema does not work with GML 3.1.1
+		<import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
+	-->
+	<!--
+	<import namespace="http://www.opengis.net/cv/0.2" schemaLocation="http://schemas.opengis.net/cv/0.2.0/cv.xsd"/>
+	-->
+	<import namespace="http://www.opengis.net/swe/1.0.1" schemaLocation="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+	<import namespace="http://www.opengis.net/om/1.0" schemaLocation="http://schemas.opengis.net/om/1.0.0/om.xsd"/>
+	<include schemaLocation="./sampling.xsd"/>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<!-- ===== Feature types in Site hierarchy ====== -->
+	<!-- ====================================================================== -->
+	<complexType name="SamplingFeatureType">
+		<annotation>
+			<documentation>A "SamplingFeature" is a feature used primarily for taking observations.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element name="sampledFeature" type="gml:FeaturePropertyType" maxOccurs="unbounded">
+						<annotation>
+							<documentation>A SamplingFeature must be associated with one or more other features through an association role sampledFeature. 
+							This association records the intention of the sample design. 
+							The target of this association will usually be a domain feature.</documentation>
+						</annotation>
+					</element>
+					<element name="relatedObservation" type="om:ObservationPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>A SamplingFeature is distinguished from typical domain feature types in that it has a set of [0..*] navigable associations with Observations, given the rolename relatedObservation. 
+					This complements the association role “featureOfInterest” which is constrained to point back from the Observation to the Sampling-Feature. 
+					The usual requirement of an Observation feature-of-interest is that its type has a property matching the observed-property on the Observation. 
+					In the case of Sampling-features, the topology of the model and navigability of the relatedObservation role means that this requirement is satisfied automatically: 
+					a property of the sampling-feature is implied by the observedProperty of a related observation. 
+					This effectively provides an unlimited set of “soft-typed” properties on a Sampling Feature.</documentation>
+						</annotation>
+					</element>
+					<element name="relatedSamplingFeature" type="sa:SamplingFeatureRelationPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Sampling features are frequently related to each other, as parts of complexes, networks, through sub-sampling, etc. 
+							This is supported by the relatedSamplingFeature association with a SamplingFeatureRelation association class, which carries a source, target and role.</documentation>
+						</annotation>
+					</element>
+					<element name="surveyDetails" type="sa:SurveyProcedurePropertyType" minOccurs="0">
+						<annotation>
+							<documentation>A common requirement for sampling features is an indication of the SurveyProcedure 
+							that provides the surveyDetails related to determination of its location and shape. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="SamplingFeature" abstract="true" type="sa:SamplingFeatureType" substitutionGroup="gml:_Feature"/>
+	<!-- .................. -->
+	<complexType name="SamplingFeaturePropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:SamplingFeature"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<complexType name="SamplingFeatureRelationType">
+		<annotation>
+			<documentation>A "SamplingFeatureRelation" is used to describe relationships between sampling features, including part-whole, siblings, etc.</documentation>
+		</annotation>
+		<sequence>
+			<element name="role" type="gml:CodeType"/>
+			<element name="target" type="sa:SamplingFeaturePropertyType"/>
+		</sequence>
+	</complexType>
+	<!-- .................. -->
+	<element name="SamplingFeatureRelation" type="sa:SamplingFeatureRelationType"/>
+	<!-- .................. -->
+	<complexType name="SamplingFeatureRelationPropertyType">
+		<sequence>
+			<element ref="sa:SamplingFeatureRelation"/>
+		</sequence>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<!-- Collection -->
+	<!-- ====================================================================== -->
+	<complexType name="SamplingFeatureCollectionType">
+		<annotation>
+			<documentation>A Sampling Feature Collection is a simple collection of sampling features. 
+			The relationship of members to the collection is equivalent to a part-whole relation. 
+			A collection is a sampling feature so must still carry the sampledFeature association to indicate intention.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="sa:SamplingFeatureType">
+				<sequence>
+					<element name="member" type="sa:SamplingFeaturePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="SamplingFeatureCollection" type="sa:SamplingFeatureCollectionType" substitutionGroup="sa:SamplingFeature"/>
+	<!-- .................. -->
+	<complexType name="SamplingFeatureCollectionPropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:SamplingFeatureCollection"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/samplingManifold.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/samplingManifold.xsd
new file mode 100755
index 0000000..e82c0bc
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/samplingManifold.xsd
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:gml="http://www.opengis.net/gml" 
+        xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sa="http://www.opengis.net/sampling/1.0"
+        targetNamespace="http://www.opengis.net/sampling/1.0" elementFormDefault="qualified"
+        attributeFormDefault="unqualified" version="1.0.3">
+	<annotation>
+		<documentation>samplingManifold.xsd
+
+SamplingFeatures are feature types that are used primarily for making observations: 
+SamplingFeature,  and collections are described in samplingBase.xsd
+
+SamplingPoint (0-D)
+SamplingCurve (1-D)
+SamplingSurface (2-D)
+SamplingSolid (3-D) are described in this schema document
+
+In many cases the properties of interest vary within the site, so may be represented as a coverage associated with the SamplingFeature. 
+
+Sampling is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<!-- bring in other schemas -->
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<include schemaLocation="./sampling.xsd"/>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<!-- 0-D sampling regimes -->
+	<!-- ====================================================================== -->
+	<complexType name="SamplingPointType">
+		<annotation>
+			<documentation>A "SamplingPoint" is an identified position (0-D geospatial feature). 
+		It may be revisited for various purposes, in particular to retrieve multiple specimens or make repeated or complementary observations. 
+		The position property of the SamplingPoint provides the value of the position property of observations an specimens associated with the SamplingPoint. 
+		By using the SamplingPoint feature, this position information and any metadata associated with it may be encoded in one place, i.e. normalised, and then re-used _by reference_ on other feature instances associated with it.
+		SamplingPoints are often known as Stations</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="sa:SamplingFeatureType">
+				<sequence>
+					<element name="position" type="gml:PointPropertyType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="SamplingPoint" type="sa:SamplingPointType" substitutionGroup="sa:SamplingFeature"/>
+	<!-- .................. -->
+	<complexType name="SamplingPointPropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:SamplingPoint"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- Extensive sampling regimes -->
+	<!-- ====================================================================== -->
+	<complexType name="SpatiallyExtensiveSamplingFeatureType">
+		<annotation>
+			<documentation>SpatiallyExtensiveSamplingFeature is the root class for sampling manifolds that are extensive in 1- 2- or 3-D.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="sa:SamplingFeatureType"/>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="SpatiallyExtensiveSamplingFeature" abstract="true" type="sa:SpatiallyExtensiveSamplingFeatureType" substitutionGroup="sa:SamplingFeature"/>
+	<!-- .................. -->
+	<complexType name="SpatiallyExtensiveSamplingFeaturePropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:SpatiallyExtensiveSamplingFeature"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- 1-D sites and sampling regimes -->
+	<!-- ====================================================================== -->
+	<complexType name="SamplingCurveType">
+		<annotation>
+			<documentation>A "SamplingCurve" is an identified 1-D spatial feature. 
+		It may be revisited for various purposes, in particular to retrieve multiple specimens or make repeated or complementary observations.
+		Specialized names for SamplingCurve include Sounding, ObservationWell, FlightLine, Transect.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="sa:SpatiallyExtensiveSamplingFeatureType">
+				<sequence>
+					<element name="shape" type="gml:CurvePropertyType"/>
+					<element name="length" type="gml:MeasureType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="SamplingCurve" type="sa:SamplingCurveType" substitutionGroup="sa:SpatiallyExtensiveSamplingFeature">
+		<annotation>
+			<documentation>A "SamplingCurve" is an identified 1-D spatial feature. 
+		It may be revisited for various purposes, in particular to retrieve multiple specimens or make repeated or complementary observations.
+		Specialized names for SamplingCurve include Profile, ObservationWell, FlightLine, Transect.</documentation>
+		</annotation>
+	</element>
+	<!-- .................. -->
+	<complexType name="SamplingCurvePropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:SamplingCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- 2-D sites and sampling regimes -->
+	<!-- ====================================================================== -->
+	<complexType name="SamplingSurfaceType">
+		<annotation>
+			<documentation>A "SamplingSurface" is an identified 2-D spatial feature. 
+		It may be used for various purposes, in particular for observations of cross sections through features.
+		Specialized names for SamplingSurface include CrossSection, Section, Flitch, Swath, Scene, MapHorizon.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="sa:SpatiallyExtensiveSamplingFeatureType">
+				<sequence>
+					<element name="shape" type="gml:SurfacePropertyType"/>
+					<element name="area" type="gml:MeasureType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="SamplingSurface" type="sa:SamplingSurfaceType" substitutionGroup="sa:SpatiallyExtensiveSamplingFeature">
+		<annotation>
+			<documentation>A "SamplingSurface" is an identified 2-D spatial feature. 
+		It may be used for various purposes, in particular for observations of cross sections through features.
+		Specialized names for SamplingSurface include CrossSection, Section, Flitch, Swath, Scene, MapHorizon.</documentation>
+		</annotation>
+	</element>
+	<!-- .................. -->
+	<complexType name="SamplingSurfacePropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:SamplingSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- 3-D sites and sampling regimes -->
+	<!-- ====================================================================== -->
+	<complexType name="SamplingSolidType">
+		<annotation>
+			<documentation>A "SamplingSolid" is an identified 3-D spatial feature used in sampling.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="sa:SpatiallyExtensiveSamplingFeatureType">
+				<sequence>
+					<element name="shape" type="gml:SolidPropertyType"/>
+					<element name="volume" type="gml:MeasureType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="SamplingSolid" type="sa:SamplingSolidType" substitutionGroup="sa:SpatiallyExtensiveSamplingFeature">
+		<annotation>
+			<documentation>A "SamplingSolid" is an identified 3-D spatial feature used in sampling.</documentation>
+		</annotation>
+	</element>
+	<!-- .................. -->
+	<complexType name="SamplingSolidPropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:SamplingSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/specimen.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/specimen.xsd
new file mode 100755
index 0000000..9718826
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/specimen.xsd
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:gml="http://www.opengis.net/gml" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sa="http://www.opengis.net/sampling/1.0"
+        targetNamespace="http://www.opengis.net/sampling/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.3">
+	<annotation>
+		<documentation>specimen.xsd
+
+SamplingFeatures are feature types that are used primarily for making observations: 
+SamplingFeature,  and collections are described in samplingBase.xsd
+
+Specimen and LocatedSpecimen are described in this schema document
+
+Sampling is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<!-- bring in other schemas -->
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<!-- GMD cannot be used with GML 3.1.1
+		<import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
+	-->
+	<include schemaLocation="./sampling.xsd"/>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<complexType name="SpecimenType">
+		<annotation>
+			<documentation>An object on which measurements may be made, often ex-situ.
+									
+			Note that if this specimen is a "processed" version of another (e.g. by grinding, sieving, etc) then 
+			the predecessor (if known) may be recorded as a relatedSamplingFeature</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="sa:SamplingFeatureType">
+				<sequence>
+					<element name="materialClass" type="gml:CodeType">
+						<annotation>
+							<documentation>Material type, usually taken from a controlled vocabulary
+					Specialised domains may choose to fix the vocabulary to be used
+					Its value may be relatively generic (rock, pulp) or may reflect a detailed classification (calcrete, adamellite, biotite-schist). 
+			In the latter case it is wise to use the codeSpace attribute to provide a link to the classification scheme/vocabulary used. 
+</documentation>
+						</annotation>
+					</element>
+					<element name="currentLocation" type="sa:LocationPropertyType" minOccurs="0">
+						<annotation>
+							<documentation>Storage location of specimen if it still exists. If destroyed in analysis, then either omit or use xlink:href to point to a suitable URN, e.g. urn:cgi:def:nil:destroyed</documentation>
+						</annotation>
+					</element>
+					<element name="size" minOccurs="0">
+						<annotation>
+							<documentation>The size of the specimen: mass, length, volume, etc</documentation>
+						</annotation>
+						<complexType>
+							<annotation>
+								<documentation>Xlink attributes added to enable rich annotation, e.g. size-type</documentation>
+							</annotation>
+							<simpleContent>
+								<extension base="gml:MeasureType">
+									<attributeGroup ref="gml:AssociationAttributeGroup"/>
+								</extension>
+							</simpleContent>
+						</complexType>
+					</element>
+					<element name="samplingMethod" type="gml:ReferenceType" minOccurs="0">
+						<annotation>
+							<documentation>Method used when retrieving specimen from host sampledFeature</documentation>
+						</annotation>
+					</element>
+					<element name="samplingTime" type="gml:TimePrimitivePropertyType">
+						<annotation>
+							<documentation>Time and date when the specimen was initially retrieved</documentation>
+						</annotation>
+					</element>
+					<element name="processingDetails" type="gml:ReferenceType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>One or more procedures may have been applied to a specimen.  
+            May contain collection, sampling and preparation procedures</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="Specimen" type="sa:SpecimenType" substitutionGroup="sa:SamplingFeature"/>
+	<!-- .................. -->
+	<complexType name="SpecimenPropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:Specimen"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<complexType name="LocatedSpecimenType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<complexContent>
+			<extension base="sa:SpecimenType">
+				<sequence>
+					<element name="samplingLocation" type="gml:GeometryPropertyType">
+						<annotation>
+							<documentation>Sampling location may be provided directly if not available through its association with either the sampledFeature or a relatedSamplingFeature</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- .................. -->
+	<element name="LocatedSpecimen" type="sa:LocatedSpecimenType" substitutionGroup="sa:Specimen"/>
+	<!-- .................. -->
+	<complexType name="LocatedSpecimenPropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:LocatedSpecimen"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<complexType name="LocationPropertyType">
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:_Geometry"/>
+				<element name="EX_GeographicDescription" type="sa:AnyOrReferenceType"/>
+				<!--
+				<element ref="gmd:EX_GeographicDescription"/>
+				-->
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attribute name="unionSemantics">
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="geometryLocation"/>
+					<enumeration value="nameLocation"/>
+				</restriction>
+			</simpleType>
+		</attribute>
+	</complexType>
+	<!-- ====================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/surveyProcedure.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/surveyProcedure.xsd
new file mode 100755
index 0000000..1eafbd6
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sampling/1.0.0/surveyProcedure.xsd
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:sa="http://www.opengis.net/sampling/1.0" xmlns="http://www.w3.org/2001/XMLSchema"
+        xmlns:gml="http://www.opengis.net/gml" xmlns:gmd="http://www.isotc211.org/2005/gmd"
+        xmlns:om="http://www.opengis.net/om/1.0" targetNamespace="http://www.opengis.net/sampling/1.0"
+        elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.3">
+	<annotation>
+		<documentation>surveyProcedure.xsd
+
+Components to describe procedures used in sampling.
+
+Sampling is an OGC Standard.
+Copyright (c) 2007,2010 Open Geospatial Consortium.
+To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<!-- bring in other schemas -->
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<!-- GMD cannot be used with GML 3.1.1
+		<import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
+	-->
+	<import namespace="http://www.opengis.net/om/1.0" schemaLocation="http://schemas.opengis.net/om/1.0.0/om.xsd"/>
+	<include schemaLocation="./sampling.xsd"/>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<complexType name="SurveyProcedureType">
+		<annotation>
+			<documentation>Specialized procedure related to surveying positions and locations.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element name="operator" type="sa:AnyOrReferenceType" minOccurs="0"/>
+					<!-- Replace with
+					<element name="operator" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0"/>
+					when upgrading to GML 3.2
+					-->
+					<element name="elevationDatum" type="gml:ReferenceType" minOccurs="0"/>
+					<!-- Replace with
+					<element name="elevationDatum" type="gml:VerticalDatumPropertyType" minOccurs="0"/>
+					when upgrading to GML 3.2
+					-->
+					<element name="elevationMethod" type="om:ProcessPropertyType" minOccurs="0"/>
+					<element name="elevationAccuracy" type="gml:MeasureType" minOccurs="0"/>
+					<element name="geodeticDatum" type="gml:ReferenceType" minOccurs="0"/>
+					<!-- Replace with
+					<element name="geodeticDatum" type="gml:GeodeticDatumPropertyType" minOccurs="0"/>
+					when upgrading to GML 3.2
+					-->
+					<element name="positionMethod" type="om:ProcessPropertyType"/>
+					<element name="positionAccuracy" type="gml:MeasureType" minOccurs="0"/>
+					<element name="projection" type="gml:ReferenceType" minOccurs="0"/>
+					<!-- Replace with
+					<element name="projection" type="gml:SingleCRSPropertyType" minOccurs="0"/>
+					when upgrading to GML 3.2
+					-->
+					<element name="surveyTime" type="gml:TimePrimitivePropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ...................... -->
+	<element name="SurveyProcedure" type="sa:SurveyProcedureType" substitutionGroup="gml:_Feature">
+		<annotation>
+			<documentation>Specialized procedure related to surveying positions and locations.</documentation>
+		</annotation>
+	</element>
+	<!-- ...................... -->
+	<complexType name="SurveyProcedurePropertyType">
+		<sequence minOccurs="0">
+			<element ref="sa:SurveyProcedure"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+		<!-- ====================================================================== -->
+	<complexType name="AnyOrReferenceType">
+		<annotation>
+			<documentation>Placeholder type</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<any/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/base.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/base.xsd
new file mode 100755
index 0000000..85a0a3c
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/base.xsd
@@ -0,0 +1,483 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/sensorML/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:gml="http://www.opengis.net/gml" xmlns:sml="http://www.opengis.net/sensorML/1.0.1" xmlns:ism="urn:us:gov:ic:ism:v2" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<!--  -->
+	<xs:annotation>
+		<xs:documentation>Base class definitions for core SensorML
+			
+			SensorML is an OGC Standard.
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<!-- import GML 3.1.1 -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<!-- import SWE Common Data Types 1.0.1 -->
+	<xs:import namespace="http://www.opengis.net/swe/1.0.1" schemaLocation="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+	<!-- import US Intelligence Community schema for security speciifications-->
+	<xs:import namespace="urn:us:gov:ic:ism:v2" schemaLocation="http://schemas.opengis.net/ic/2.0/IC-ISM-v2.xsd"/>
+	<xs:include schemaLocation="./sensorML.xsd"/>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractSMLType" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Main Abstract SensorML Object</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:restriction base="gml:AbstractFeatureType">
+				<xs:sequence>
+					<xs:sequence>
+						<xs:sequence>
+							<xs:element ref="gml:description" minOccurs="0"/>
+							<xs:element ref="gml:name" minOccurs="0">
+								<xs:annotation>
+									<xs:documentation>The gml:name property should be used only as a label in SensorML, and thus is limited to one occurence. Multiple robust and well defined identifiers can be provided in the identification section.
+                           </xs:documentation>
+								</xs:annotation>
+							</xs:element>
+							<xs:element ref="gml:boundedBy" minOccurs="0">
+								<xs:annotation>
+									<xs:documentation>Specifies the possible extent of the component location</xs:documentation>
+								</xs:annotation>
+							</xs:element>
+						</xs:sequence>
+					</xs:sequence>
+				</xs:sequence>
+			</xs:restriction>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:group name="constraints">
+		<xs:sequence>
+			<xs:element ref="sml:validTime" minOccurs="0"/>
+			<xs:element ref="sml:securityConstraint" minOccurs="0"/>
+			<xs:element ref="sml:legalConstraint" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:group>
+	<!-- ================================================= -->
+	<xs:element name="securityConstraint">
+		<xs:annotation>
+			<xs:documentation>Means of providing security constraints of description</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="sml:Security"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="Security">
+		<xs:annotation>
+			<xs:documentation>based on IC:ISM definition</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:attributeGroup ref="ism:SecurityAttributesOptionGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="validTime">
+		<xs:annotation>
+			<xs:documentation>Means of providing time validity constraint of description</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice>
+				<xs:element ref="gml:TimeInstant"/>
+				<xs:element ref="gml:TimePeriod"/>
+			</xs:choice>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="legalConstraint">
+		<xs:annotation>
+			<xs:documentation>Means of providing legal constraints of description</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element ref="sml:Rights"/>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="Rights">
+		<xs:annotation>
+			<xs:documentation>based on IC:DDMS definition</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="sml:documentation"/>
+			</xs:sequence>
+			<xs:attribute ref="gml:id"/>
+			<xs:attribute name="privacyAct" type="xs:boolean" use="optional"/>
+			<xs:attribute name="intellectualPropertyRights" type="xs:boolean" use="optional"/>
+			<xs:attribute name="copyRights" type="xs:boolean" use="optional"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:group name="generalInfo">
+		<xs:sequence>
+			<xs:element ref="sml:keywords" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="sml:identification" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="sml:classification" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:group>
+	<!-- ================================================= -->
+	<xs:element name="keywords">
+		<xs:annotation>
+			<xs:documentation>Means of providing a list of keywords (with a codeSpace) for quick discovery</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="KeywordList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="keyword" type="xs:token" maxOccurs="unbounded"/>
+						</xs:sequence>
+						<xs:attribute name="id" type="xs:ID"/>
+						<xs:attribute name="codeSpace" type="xs:anyURI"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="identification">
+		<xs:annotation>
+			<xs:documentation>Means of providing various identity and alias values, with types such as "longName", "abbreviation", "modelNumber", "serialNumber", whose terms can be defined in a dictionary</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="IdentifierList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="identifier" maxOccurs="unbounded">
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element ref="sml:Term"/>
+									</xs:sequence>
+									<xs:attribute name="name" type="xs:token" use="optional"/>
+								</xs:complexType>
+							</xs:element>
+						</xs:sequence>
+						<xs:attribute name="id" type="xs:ID"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="classification">
+		<xs:annotation>
+			<xs:documentation>Means of specifying classification values with types such as "sensorType", "intendedApplication", etc., whose terms can be defined in a dictionary</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="ClassifierList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="classifier" maxOccurs="unbounded">
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element ref="sml:Term"/>
+									</xs:sequence>
+									<xs:attribute name="name" type="xs:token" use="optional"/>
+								</xs:complexType>
+							</xs:element>
+						</xs:sequence>
+						<xs:attribute name="id" type="xs:ID"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="Term">
+		<xs:annotation>
+			<xs:documentation>A well defined token used to specify identifier and classifier values (single spaces allowed)</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="codeSpace" type="swe:CodeSpacePropertyType" minOccurs="0"/>
+				<xs:element name="value" type="xs:token"/>
+			</xs:sequence>
+			<xs:attribute name="definition" type="xs:anyURI">
+				<xs:annotation>
+					<xs:documentation>Points to the term definition using a URI. Term definitions are things like uid, shortName, sensorType, application, etc...</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:group name="references">
+		<xs:sequence>
+			<xs:element ref="sml:contact" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="sml:documentation" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:group>
+	<!-- ================================================= -->
+	<xs:element name="contact">
+		<xs:annotation>
+			<xs:documentation>Relevant contacts for that object</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice minOccurs="0">
+				<xs:group ref="sml:ContactGroup"/>
+				<xs:element ref="sml:ContactList"/>
+			</xs:choice>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="ContactList">
+		<xs:annotation>
+			<xs:documentation>Allows to group several contacts together in a list that can be referenced as a whole</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="gml:description" minOccurs="0"/>
+				<xs:element name="member" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:group ref="sml:ContactGroup"/>
+						<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute ref="gml:id"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:group name="ContactGroup">
+		<xs:choice>
+			<xs:element ref="sml:Person"/>
+			<xs:element ref="sml:ResponsibleParty"/>
+		</xs:choice>
+	</xs:group>
+	<!-- ================================================= -->
+	<xs:element name="Person">
+		<xs:annotation>
+			<xs:documentation>based on IC:DMMS</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="surname" type="xs:token"/>
+				<xs:element name="name" type="xs:token"/>
+				<xs:element name="userID" type="xs:token"/>
+				<xs:element name="affiliation" type="xs:token"/>
+				<xs:element name="phoneNumber" type="xs:token"/>
+				<xs:element name="email" type="xs:token"/>
+			</xs:sequence>
+			<xs:attribute ref="gml:id"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="ResponsibleParty">
+		<xs:annotation>
+			<xs:documentation>based on ISO 19115</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="individualName" type="xs:string" minOccurs="0"/>
+				<xs:element name="organizationName" type="xs:string" minOccurs="0"/>
+				<xs:element name="positionName" type="xs:string" minOccurs="0"/>
+				<xs:element ref="sml:contactInfo" minOccurs="0"/>
+			</xs:sequence>
+			<xs:attribute ref="gml:id"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="contactInfo">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="phone" minOccurs="0">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="voice" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+							<xs:element name="facsimile" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="address" minOccurs="0">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="deliveryPoint" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+							<xs:element name="city" type="xs:string" minOccurs="0"/>
+							<xs:element name="administrativeArea" type="xs:string" minOccurs="0"/>
+							<xs:element name="postalCode" type="xs:string" minOccurs="0"/>
+							<xs:element name="country" type="xs:string" minOccurs="0"/>
+							<xs:element name="electronicMailAddress" type="xs:string" minOccurs="0"/>
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+				<xs:element ref="sml:onlineResource" minOccurs="0" maxOccurs="unbounded"/>
+				<xs:element name="hoursOfService" type="xs:string" minOccurs="0"/>
+				<xs:element name="contactInstructions" type="xs:string" minOccurs="0"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="onlineResource">
+		<xs:complexType>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="documentation">
+		<xs:annotation>
+			<xs:documentation>Relevant documentation for that object</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice minOccurs="0">
+				<xs:element ref="sml:Document"/>
+				<xs:element ref="sml:DocumentList"/>
+			</xs:choice>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="Document">
+		<xs:annotation>
+			<xs:documentation>Document record with date/time, version, author, etc. pointing to an online resource related to the enclosing object</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="gml:description"/>
+				<xs:element name="date" type="swe:timeIso8601" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Date of creation</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element ref="sml:contact" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Person who is responsible for the document</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="format" type="xs:token" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Specifies the fornat of the file pointed to by onlineResource</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element ref="sml:onlineResource" minOccurs="0" maxOccurs="unbounded">
+					<xs:annotation>
+						<xs:documentation>Points to the actual document corresponding to that version</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute ref="gml:id"/>
+			<xs:attribute name="version" type="xs:token" use="optional"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="DocumentList">
+		<xs:annotation>
+			<xs:documentation>List of documents related to the enclosing object</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="gml:description" minOccurs="0"/>
+				<xs:element name="member" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:sequence minOccurs="0">
+							<xs:element ref="sml:Document"/>
+						</xs:sequence>
+						<xs:attribute name="name" type="xs:token" use="required"/>
+						<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute ref="gml:id"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:group name="history">
+		<xs:sequence>
+			<xs:element ref="sml:history" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:group>
+	<!-- ================================================= -->
+	<xs:element name="history">
+		<xs:annotation>
+			<xs:documentation>History of the object described (Recalibration, adjustments, etc...)</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element ref="sml:EventList"/>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="EventList">
+		<xs:annotation>
+			<xs:documentation>List of events related to the enclosing object</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="member" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:sequence minOccurs="0">
+							<xs:element ref="sml:Event"/>
+						</xs:sequence>
+						<xs:attribute name="name" type="xs:token" use="required"/>
+						<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute ref="gml:id"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="Event">
+		<xs:annotation>
+			<xs:documentation>Event record (change to the object) including a date/time, description, identification and additional references and metadata</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="date" type="swe:timeIso8601" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Date/Time of event</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element ref="gml:description" minOccurs="0"/>
+				<xs:group ref="sml:generalInfo" minOccurs="0"/>
+				<xs:group ref="sml:references" minOccurs="0"/>
+				<xs:element name="property" type="swe:DataComponentPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+			</xs:sequence>
+			<xs:attribute ref="gml:id"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:group name="properties">
+		<xs:sequence>
+			<xs:element ref="sml:characteristics" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="sml:capabilities" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:group>
+	<!-- ================================================= -->
+	<xs:element name="capabilities">
+		<xs:annotation>
+			<xs:documentation>Capability list for quick discovery</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element ref="swe:AbstractDataRecord"/>
+			</xs:sequence>
+			<xs:attribute name="name" type="xs:token" use="optional"/>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="characteristics">
+		<xs:annotation>
+			<xs:documentation>Characteristic list for quick discovery</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element ref="swe:AbstractDataRecord"/>
+			</xs:sequence>
+			<xs:attribute name="name" type="xs:token" use="optional"/>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/method.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/method.xsd
new file mode 100755
index 0000000..6840f0f
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/method.xsd
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/sensorML/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:sml="http://www.opengis.net/sensorML/1.0.1" xmlns:swe="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>Defines Process Method
+			
+			SensorML is an OGC Standard.
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:import namespace="http://www.opengis.net/swe/1.0.1" schemaLocation="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+	<xs:include schemaLocation="./sensorML.xsd"/>
+	<xs:include schemaLocation="./base.xsd"/>
+	<xs:include schemaLocation="./process.xsd"/>
+	<!-- ================================================= -->
+	<xs:element name="ProcessMethod" type="sml:ProcessMethodType">
+		<xs:annotation>
+			<xs:documentation>Method describing a process (Can also be a dictionary entry)</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="ProcessMethodType">
+		<xs:annotation>
+			<xs:documentation>Complex Type for process methods definition</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:AbstractGMLType">
+				<xs:sequence>
+					<xs:group ref="sml:metadataGroup" minOccurs="0"/>
+					<xs:element name="rules">
+						<xs:annotation>
+							<xs:documentation>Text and/or language defining rules for process profile (e.g. inputs, outputs, parameters, and metadata)</xs:documentation>
+						</xs:annotation>
+						<xs:complexType>
+							<xs:sequence>
+								<xs:element name="RulesDefinition">
+									<xs:complexType>
+										<xs:sequence>
+											<xs:element ref="gml:description" minOccurs="0">
+												<xs:annotation>
+													<xs:documentation>Textual description of the i/o structure</xs:documentation>
+												</xs:annotation>
+											</xs:element>
+											<xs:element ref="sml:ruleLanguage" minOccurs="0"/>
+										</xs:sequence>
+									</xs:complexType>
+								</xs:element>
+							</xs:sequence>
+						</xs:complexType>
+					</xs:element>
+					<xs:element name="algorithm" minOccurs="0">
+						<xs:annotation>
+							<xs:documentation>Textual and/or MathML description of the algorithm</xs:documentation>
+						</xs:annotation>
+						<xs:complexType>
+							<xs:sequence>
+								<xs:element name="AlgorithmDefinition">
+									<xs:complexType>
+										<xs:sequence>
+											<xs:element ref="gml:description" minOccurs="0">
+												<xs:annotation>
+													<xs:documentation>Textual description of the algorithm</xs:documentation>
+												</xs:annotation>
+											</xs:element>
+											<xs:element name="mathML" minOccurs="0">
+												<xs:annotation>
+													<xs:documentation>Includes or reference a MathML doc specifying the maths of the algorithm</xs:documentation>
+												</xs:annotation>
+												<xs:complexType>
+													<xs:sequence minOccurs="0">
+														<xs:any namespace="##any" processContents="lax"/>
+													</xs:sequence>
+													<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+												</xs:complexType>
+											</xs:element>
+										</xs:sequence>
+									</xs:complexType>
+								</xs:element>
+							</xs:sequence>
+						</xs:complexType>
+					</xs:element>
+					<xs:element name="implementation" minOccurs="0" maxOccurs="unbounded">
+						<xs:annotation>
+							<xs:documentation>Points to the reference implementation of this process in the specified programming language (can be a SensorML process chain)</xs:documentation>
+						</xs:annotation>
+						<xs:complexType>
+							<xs:choice minOccurs="0">
+								<xs:element ref="sml:ProcessChain"/>
+								<xs:element name="ImplementationCode">
+									<xs:complexType>
+										<xs:sequence>
+											<xs:element ref="gml:description" minOccurs="0">
+												<xs:annotation>
+													<xs:documentation>Textual description of the algorithm</xs:documentation>
+												</xs:annotation>
+											</xs:element>
+											<xs:group ref="sml:metadataGroup" minOccurs="0"/>
+											<xs:element name="sourceRef" minOccurs="0">
+												<xs:complexType>
+													<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+												</xs:complexType>
+											</xs:element>
+											<xs:element name="binaryRef" minOccurs="0">
+												<xs:complexType>
+													<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+												</xs:complexType>
+											</xs:element>
+										</xs:sequence>
+										<xs:attribute name="language" type="xs:token" use="required"/>
+										<xs:attribute name="framework" type="xs:token" use="optional"/>
+										<xs:attribute name="version" type="xs:token" use="optional"/>
+									</xs:complexType>
+								</xs:element>
+							</xs:choice>
+							<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="method" type="sml:methodPropertyType">
+		<xs:annotation>
+			<xs:documentation>process method</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="methodPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="sml:ProcessMethod"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="ruleLanguage" type="sml:ruleLanguageType" abstract="true">
+		<xs:annotation>
+			<xs:documentation>substitutionGroup for languages that define rules</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="ruleLanguageType">
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<xs:element name="schematron" substitutionGroup="sml:ruleLanguage">
+		<xs:annotation>
+			<xs:documentation>Includes or references a schematron doc for enforcing process constraints</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="sml:ruleLanguageType">
+					<xs:sequence minOccurs="0">
+						<xs:any namespace="http://www.ascc.net/xml/schematron" processContents="lax"/>
+					</xs:sequence>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="relaxNG" substitutionGroup="sml:ruleLanguage">
+		<xs:annotation>
+			<xs:documentation>Includes or references a relaxNG doc for enforcing process constraints</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="sml:ruleLanguageType">
+					<xs:sequence minOccurs="0">
+						<xs:any namespace="http://relaxng.org/ns/structure/1.0" processContents="lax"/>
+					</xs:sequence>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/process.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/process.xsd
new file mode 100755
index 0000000..b5fca95
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/process.xsd
@@ -0,0 +1,410 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/sensorML/1.0.1" xmlns:gml="http://www.opengis.net/gml" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:sml="http://www.opengis.net/sensorML/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>Defines Basic Process Elements and Types for SensorML
+			
+			SensorML is an OGC Standard.
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:import namespace="http://www.opengis.net/swe/1.0.1" schemaLocation="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+	<xs:include schemaLocation="./sensorML.xsd"/>
+	<xs:include schemaLocation="./method.xsd"/>
+	<!-- ================================================= -->
+	<xs:element name="_Process" type="sml:AbstractProcessType" abstract="true">
+		<xs:annotation>
+			<xs:documentation>base substitution group for all processes</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractProcessType" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractSMLType">
+				<xs:sequence>
+					<xs:group ref="sml:metadataGroup" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:group name="metadataGroup">
+		<xs:annotation>
+			<xs:documentation>Group containing all metadata information</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:group ref="sml:generalInfo" minOccurs="0"/>
+			<xs:group ref="sml:constraints" minOccurs="0"/>
+			<xs:group ref="sml:properties" minOccurs="0"/>
+			<xs:group ref="sml:references" minOccurs="0"/>
+			<xs:group ref="sml:history" minOccurs="0"/>
+		</xs:sequence>
+	</xs:group>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractRestrictedProcessType" abstract="true">
+		<xs:complexContent>
+			<xs:restriction base="sml:AbstractProcessType">
+				<xs:sequence>
+					<xs:sequence>
+						<xs:element ref="gml:description" minOccurs="0"/>
+						<xs:element ref="gml:name" minOccurs="0"/>
+					</xs:sequence>
+					<xs:group ref="sml:metadataGroup" minOccurs="0"/>
+				</xs:sequence>
+			</xs:restriction>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractPureProcessType" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Complex Type for all soft-typed processes</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractRestrictedProcessType">
+				<xs:sequence>
+					<xs:element ref="sml:inputs" minOccurs="0"/>
+					<xs:element ref="sml:outputs" minOccurs="0"/>
+					<xs:element ref="sml:parameters" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="inputs">
+		<xs:annotation>
+			<xs:documentation>list of input signals</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="InputList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="input" type="sml:IoComponentPropertyType" maxOccurs="unbounded"/>
+						</xs:sequence>
+						<xs:attribute name="id" type="xs:ID"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="outputs">
+		<xs:annotation>
+			<xs:documentation>list of output signals</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="OutputList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="output" type="sml:IoComponentPropertyType" maxOccurs="unbounded"/>
+						</xs:sequence>
+						<xs:attribute name="id" type="xs:ID"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="parameters">
+		<xs:annotation>
+			<xs:documentation>list of parameters</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="ParameterList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="parameter" type="swe:DataComponentPropertyType" maxOccurs="unbounded"/>
+						</xs:sequence>
+						<xs:attribute name="id" type="xs:ID"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="ProcessModel" type="sml:ProcessModelType" substitutionGroup="sml:_Process">
+		<xs:annotation>
+			<xs:documentation>Simple atomic process defined using a ProcessMethod</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="ProcessModelType">
+		<xs:annotation>
+			<xs:documentation>Complex Type for atomic processes</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractPureProcessType">
+				<xs:sequence>
+					<xs:element ref="sml:method"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="ProcessChain" type="sml:ProcessChainType" substitutionGroup="sml:_Process">
+		<xs:annotation>
+			<xs:documentation>Process formed by chaining sub-processes</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="ProcessChainType">
+		<xs:annotation>
+			<xs:documentation>Complex Type for process chains</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractPureProcessType">
+				<xs:sequence>
+					<xs:element ref="sml:components"/>
+					<xs:element ref="sml:connections"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="components">
+		<xs:annotation>
+			<xs:documentation>Collection of subprocesses that can be chained using connections</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="ComponentList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="component" maxOccurs="unbounded">
+								<xs:complexType>
+									<xs:sequence minOccurs="0">
+										<xs:element ref="sml:_Process"/>
+									</xs:sequence>
+									<xs:attribute name="name" type="xs:token" use="required"/>
+									<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+								</xs:complexType>
+							</xs:element>
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="DataSource" type="sml:DataSourceType" substitutionGroup="sml:_Process">
+		<xs:annotation>
+			<xs:documentation>Process with no inputs representing a source of data (Tables, Observations...) for other processes to connect to.</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="DataSourceType">
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractProcessType">
+				<xs:sequence>
+					<xs:choice>
+						<xs:sequence>
+							<xs:element name="dataDefinition">
+								<xs:complexType>
+									<xs:choice minOccurs="0">
+										<xs:element ref="swe:DataBlockDefinition"/>
+										<xs:element ref="swe:DataStreamDefinition"/>
+									</xs:choice>
+									<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+								</xs:complexType>
+							</xs:element>
+							<xs:element name="values">
+								<xs:complexType>
+									<xs:complexContent>
+										<xs:extension base="xs:anyType"/>
+									</xs:complexContent>
+								</xs:complexType>
+							</xs:element>
+						</xs:sequence>
+						<xs:element name="observationReference">
+							<xs:complexType>
+								<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+							</xs:complexType>
+						</xs:element>
+					</xs:choice>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="connections">
+		<xs:annotation>
+			<xs:documentation>provides links between processes or between data sources and processes</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="ConnectionList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element ref="sml:connection" maxOccurs="unbounded"/>
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="connection">
+		<xs:annotation>
+			<xs:documentation>Specify a connection between two elements</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice>
+				<xs:element ref="sml:Link"/>
+				<xs:element ref="sml:ArrayLink"/>
+			</xs:choice>
+			<xs:attribute name="name" type="xs:token" use="optional"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="Link">
+		<xs:annotation>
+			<xs:documentation>Link object used to make connections between processes</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="source">
+					<xs:complexType>
+						<xs:attribute name="ref" type="sml:linkRef" use="required"/>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="destination">
+					<xs:complexType>
+						<xs:attribute name="ref" type="sml:linkRef" use="required"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute name="type" type="xs:anyURI" use="optional"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:simpleType name="linkRef">
+		<xs:restriction base="xs:token"/>
+	</xs:simpleType>
+	<!-- ================================================= -->
+	<xs:element name="ArrayLink">
+		<xs:annotation>
+			<xs:documentation>Special Link to handle accessing array elements sequentially</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:choice>
+					<xs:sequence>
+						<xs:element name="sourceArray">
+							<xs:complexType>
+								<xs:attribute name="ref" type="sml:linkRef"/>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="destinationIndex" minOccurs="0" maxOccurs="unbounded">
+							<xs:complexType>
+								<xs:attribute name="ref" type="sml:linkRef"/>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+					<xs:sequence>
+						<xs:element name="destinationArray">
+							<xs:complexType>
+								<xs:attribute name="ref" type="sml:linkRef"/>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="sourceIndex" minOccurs="0">
+							<xs:complexType>
+								<xs:attribute name="ref" type="sml:linkRef"/>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+				</xs:choice>
+				<xs:element ref="sml:connection" minOccurs="0" maxOccurs="unbounded"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<!-- 
+		NOTE: we intend to support switch between process using special ProcessModels rather than a special Link
+		      because it provides more flexibility (though it is more verbose)
+	-->
+	<!-- =================================================================== -->
+	<!-- Complex Types used for deriving hard-typed processes by restriction -->
+	<!-- =================================================================== -->
+	<xs:complexType name="AbstractDerivableProcessType" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractProcessType">
+				<xs:sequence>
+					<xs:element name="inputs" type="sml:inputsPropertyType" minOccurs="0"/>
+					<xs:element name="outputs" type="sml:outputsPropertyType" minOccurs="0"/>
+					<xs:element name="parameters" type="sml:parametersPropertyType" minOccurs="0"/>
+					<xs:choice minOccurs="0">
+						<xs:element ref="sml:method"/>
+						<xs:sequence>
+							<xs:element name="components" type="sml:componentsPropertyType"/>
+							<xs:element name="dataSources" type="sml:dataSourcesPropertyType" minOccurs="0"/>
+							<xs:element name="connections" type="sml:connectionsPropertyType"/>
+						</xs:sequence>
+					</xs:choice>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractListType">
+		<xs:complexContent>
+			<xs:extension base="xs:anyType">
+				<xs:attribute name="id" type="xs:ID" use="optional"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="inputsPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element name="InputList" type="sml:AbstractListType"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="outputsPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element name="OutputList" type="sml:AbstractListType"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="parametersPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element name="ParameterList" type="sml:AbstractListType"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="componentsPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element name="ProcessList" type="sml:AbstractListType"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="dataSourcesPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element name="DataSourceList" type="sml:AbstractListType"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="connectionsPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element name="ConnectionList" type="sml:AbstractListType"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="IoComponentPropertyType">
+		<xs:choice minOccurs="0">
+			<xs:group ref="swe:AnyData"/>
+			<xs:element ref="swe:ObservableProperty"/>
+		</xs:choice>
+		<xs:attribute name="name" type="xs:token" use="required"/>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/sensorML.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/sensorML.xsd
new file mode 100755
index 0000000..3370676
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/sensorML.xsd
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/sensorML/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:sml="http://www.opengis.net/sensorML/1.0.1" xmlns:swe="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>SensorML document root definition
+			
+			SensorML is an OGC Standard.
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:import namespace="http://www.opengis.net/swe/1.0.1" schemaLocation="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+	<xs:include schemaLocation="./system.xsd"/>
+	<!-- ================================================= -->
+	<xs:element name="SensorML">
+		<xs:annotation>
+			<xs:documentation>SensorML document root</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:group ref="sml:metadataGroup"/>
+				<xs:element name="member" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:choice>
+							<xs:element ref="sml:_Process"/>
+							<xs:element ref="sml:DocumentList"/>
+							<xs:element ref="sml:ContactList"/>
+						</xs:choice>
+						<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute name="version" type="xs:token" use="required" fixed="1.0.1"/>
+		</xs:complexType>
+	</xs:element>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/system.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/system.xsd
new file mode 100755
index 0000000..7811316
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sensorML/1.0.1/system.xsd
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/sensorML/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sml="http://www.opengis.net/sensorML/1.0.1" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>Component and System objects for core SensorML
+			
+			SensorML is an OGC Standard.
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:import namespace="http://www.opengis.net/swe/1.0.1" schemaLocation="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+	<xs:include schemaLocation="./sensorML.xsd"/>
+	<xs:include schemaLocation="./process.xsd"/>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractDerivableComponentType" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Complex Type to allow creation of component profiles by extension</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractProcessType">
+				<xs:sequence>
+					<xs:element ref="sml:spatialReferenceFrame" minOccurs="0"/>
+					<xs:element ref="sml:temporalReferenceFrame" minOccurs="0"/>
+					<xs:choice minOccurs="0">
+						<xs:element ref="sml:location"/>
+						<xs:element ref="sml:position"/>
+					</xs:choice>
+					<xs:element ref="sml:timePosition" minOccurs="0"/>
+					<xs:element ref="sml:interfaces" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractComponentType" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Complex Type for all generic components (soft typed inputs/outputs/parameters)</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractDerivableComponentType">
+				<xs:sequence>
+					<xs:element ref="sml:inputs" minOccurs="0"/>
+					<xs:element ref="sml:outputs" minOccurs="0"/>
+					<xs:element ref="sml:parameters" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="spatialReferenceFrame">
+		<xs:annotation>
+			<xs:documentation>Textual definition of a spatial frame axes (origin, orientation). Spatial frames can be related to one another by specifying relative positions.</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="gml:EngineeringCRS"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="temporalReferenceFrame">
+		<xs:annotation>
+			<xs:documentation>Textual definition of a temporal frame (time origin). Temporal frames can be related to one another by specifying relative times.</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="gml:TemporalCRS"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="location">
+		<xs:annotation>
+			<xs:documentation>Uses a gml:Point for a fixed location or a (time dependant) curve for time variable location</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice minOccurs="0">
+				<xs:element ref="gml:Point"/>
+				<xs:element ref="gml:_Curve"/>
+			</xs:choice>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="position">
+		<xs:annotation>
+			<xs:documentation>Full position (location + orientation) given by a swe:Position or a Process (if variable)</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice minOccurs="0">
+				<xs:element ref="sml:_Process"/>
+				<xs:element ref="swe:Position"/>
+				<xs:element ref="swe:Vector"/>
+			</xs:choice>
+			<xs:attribute name="name" type="xs:token" use="required"/>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="timePosition">
+		<xs:annotation>
+			<xs:documentation>Provide the ability to relate  a local time frame to a reference time frame</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice minOccurs="0">
+				<xs:element ref="swe:Time"/>
+				<xs:element ref="sml:_Process"/>
+			</xs:choice>
+			<xs:attribute name="name" type="xs:token" use="required"/>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="Component" type="sml:ComponentType" substitutionGroup="sml:_Process">
+		<xs:annotation>
+			<xs:documentation>Atomic SensorML Component</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="ComponentType">
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractComponentType">
+				<xs:sequence>
+					<xs:element ref="sml:method" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="System" type="sml:SystemType" substitutionGroup="sml:_Process">
+		<xs:annotation>
+			<xs:documentation>System is a composite component containing sub-components.</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="SystemType">
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractComponentType">
+				<xs:sequence>
+					<xs:element ref="sml:components" minOccurs="0"/>
+					<xs:element ref="sml:positions" minOccurs="0"/>
+					<xs:element ref="sml:connections" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="positions">
+		<xs:annotation>
+			<xs:documentation>Relative positions of the System components</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="PositionList">
+					<xs:complexType>
+						<xs:choice>
+							<xs:element ref="sml:position" maxOccurs="unbounded"/>
+							<xs:element ref="sml:timePosition"/>
+						</xs:choice>
+						<xs:attribute name="id" type="xs:ID" use="optional"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="interfaces">
+		<xs:annotation>
+			<xs:documentation>List of interfaces useable to access System inputs and outputs</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element name="InterfaceList">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element ref="sml:interface" maxOccurs="unbounded"/>
+						</xs:sequence>
+						<xs:attribute name="id" type="xs:ID" use="optional"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="interface">
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element ref="sml:InterfaceDefinition"/>
+			</xs:sequence>
+			<xs:attribute name="name" type="xs:token" use="required"/>
+			<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="InterfaceDefinition">
+		<xs:annotation>
+			<xs:documentation>Interface definition based on the OSI model. (http://en.wikipedia.org/wiki/OSI_model)</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="serviceLayer" type="sml:LayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 8 (not in OSI). Type of web service used to access the data. (Ex: SOS, WCS, WFS)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="applicationLayer" type="sml:LayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 7 of the OSI model. Provides a means for the user to access information on the network through an application. (Ex: HTTP, SMTP, FTP, XMPP, Telnet, NTP, RTP, NFS)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="presentationLayer" type="sml:PresentationLayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 6 of the OSI model. Transforms the data to provide a standard interface for the Application layer. (Ex: SSL, TLS, ASCII, MIDI, MPEG, SWECommon)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="sessionLayer" type="sml:LayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 5 of the OSI model. Controls the dialogues (sessions) between computers by establishing, managing and terminating connections between the local and remote application. (Ex: NetBios, TCP session establishment)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="transportLayer" type="sml:LayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 4 of the OSI model. Provides transparent transfer of data between end users and can control reliability of a given link. (Ex: TCP, UDP, SPX)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="networkLayer" type="sml:LayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 3 of the OSI model. Provides functional and procedural means of transfering data from source to destination via one or more networks while insuring QoS. (Ex: IP, ICMP, ARP, IPSec, IPX)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="dataLinkLayer" type="sml:LayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 2 of the OSI model. Provides functional and procedural means of transfering data between network entities and detecting/correcting errors. (Ex: Ethernet, 802.11, Token ring, ATM, Fibre Channel)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="physicalLayer" type="sml:LayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 1 of the OSI model. Provides all electrical and physical characteristics of the connection including pin layouts, voltages, cables specifcations, etc... (Ex: RS232, 100BASE-T, DSL, 802.11g)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="mechanicalLayer" type="sml:LayerPropertyType" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>Layer 0 (not is OSI). Type of connector used. (Ex: DB9, DB25, RJ45, RJ11, MINIDIN-8, USB-A, USB-B)</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute name="id" type="xs:ID" use="optional"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:complexType name="LayerPropertyType">
+		<xs:choice minOccurs="0">
+			<xs:element ref="swe:AbstractDataRecord"/>
+			<xs:element ref="swe:Category"/>
+		</xs:choice>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="PresentationLayerPropertyType">
+		<xs:choice minOccurs="0">
+			<xs:element ref="swe:AbstractDataRecord"/>
+			<xs:element ref="swe:Category"/>
+			<xs:element ref="swe:DataBlockDefinition"/>
+			<xs:element ref="swe:DataStreamDefinition"/>
+		</xs:choice>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="ComponentArray" type="sml:ComponentArrayType" substitutionGroup="sml:_Process">
+		<xs:annotation>
+			<xs:documentation>Special Type of system used to describe large arrays of almost identical components. An indexing mechanism can be used to vary certain parameters according to one or more indices value</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:complexType name="ComponentArrayType">
+		<xs:complexContent>
+			<xs:extension base="sml:AbstractDerivableComponentType">
+				<xs:sequence>
+					<xs:element ref="sml:inputs" minOccurs="0"/>
+					<xs:element ref="sml:outputs" minOccurs="0"/>
+					<xs:element name="parameters">
+						<xs:complexType>
+							<xs:complexContent>
+								<xs:restriction base="sml:parametersPropertyType">
+									<xs:sequence minOccurs="0">
+										<xs:element name="ParameterList">
+											<xs:complexType>
+												<xs:complexContent>
+													<xs:restriction base="sml:AbstractListType">
+														<xs:sequence>
+															<xs:element name="index" maxOccurs="unbounded">
+																<xs:complexType>
+																	<xs:sequence>
+																		<xs:element ref="swe:Count"/>
+																	</xs:sequence>
+																	<xs:attribute name="name" type="xs:token"/>
+																</xs:complexType>
+															</xs:element>
+															<xs:element name="parameter" type="swe:DataComponentPropertyType" maxOccurs="unbounded"/>
+														</xs:sequence>
+													</xs:restriction>
+												</xs:complexContent>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+								</xs:restriction>
+							</xs:complexContent>
+						</xs:complexType>
+					</xs:element>
+					<xs:element ref="sml:components" minOccurs="0"/>
+					<xs:element ref="sml:positions" minOccurs="0"/>
+					<xs:element ref="sml:connections" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/ogc4sos.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/ogc4sos.xsd
new file mode 100755
index 0000000..7727b83
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/ogc4sos.xsd
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" targetNamespace="http://www.opengis.net/ogc" elementFormDefault="qualified" version="1.0.0.2">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+  <xs:annotation>
+    <xs:documentation>ogc4sos.xsd
+    Utility schema which simply includes the OGC schema documents required for the OGC SOS schemas
+    
+    SOS is an OGC Standard.
+    Copyright (c) 2006,2010 Open Geospatial Consortium.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+    </xs:documentation>
+  </xs:annotation>
+  <!-- ==============================================================
+       includes and imports
+       ============================================================== -->
+  <xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+  <xs:include schemaLocation="http://schemas.opengis.net/filter/1.1.0/filter.xsd"/>
+  <!-- =================================================================== -->
+  <!-- TEMPORAL OPERATORS                                                  -->
+  <!-- =================================================================== -->
+  <xs:element name="temporalOps" type="ogc:TemporalOpsType" abstract="true"/>
+  <xs:complexType name="TemporalOpsType" abstract="true"/>
+  <xs:element name="TM_After" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_Before" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_Begins" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_BegunBy" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_Contains" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_During" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_EndedBy" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_Ends" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_Equals" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_Meets" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_MetBy" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_Overalps" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:element name="TM_OverlappedBy" type="ogc:BinaryTemporalOpType" substitutionGroup="ogc:temporalOps"/>
+  <xs:complexType name="BinaryTemporalOpType">
+    <xs:complexContent>
+      <xs:extension base="ogc:TemporalOpsType">
+        <xs:sequence>
+          <xs:element ref="ogc:PropertyName" minOccurs="1"/>
+          <xs:choice>
+            <xs:element ref="ogc:PropertyName"/>
+            <xs:element ref="gml:_TimeObject"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="Temporal_CapabilitiesType">
+    <xs:sequence>
+      <xs:element name="TemporalOperands" type="ogc:TemporalOperandsType"/>
+      <xs:element name="TemporalOperators" type="ogc:TemporalOperatorsType"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="TemporalOperandsType">
+    <xs:sequence>
+      <xs:element name="TemporalOperand" type="ogc:TemporalOperandType" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:simpleType name="TemporalOperandType">
+    <xs:restriction base="xs:QName">
+      <xs:enumeration value="gml:validTime"/>
+      <xs:enumeration value="gml:TimeInstant"/>
+      <xs:enumeration value="gml:TimePeriod"/>
+      <xs:enumeration value="gml:timePosition"/>
+      <xs:enumeration value="gml:timeInterval"/>
+      <xs:enumeration value="gml:duration"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:complexType name="TemporalOperatorsType">
+    <xs:sequence>
+      <xs:element name="TemporalOperator" type="ogc:TemporalOperatorType" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="TemporalOperatorType">
+    <xs:sequence>
+      <xs:element name="TemporalOperands" type="ogc:TemporalOperandsType" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="ogc:TemporalOperatorNameType"/>
+  </xs:complexType>
+  <xs:simpleType name="TemporalOperatorNameType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="TM_After"/>
+      <xs:enumeration value="TM_Before"/>
+      <xs:enumeration value="TM_Begins"/>
+      <xs:enumeration value="TM_BegunBy"/>
+      <xs:enumeration value="TM_Contains"/>
+      <xs:enumeration value="TM_During"/>
+      <xs:enumeration value="TM_Equals"/>
+      <xs:enumeration value="TM_Overlaps"/>
+      <xs:enumeration value="TM_Meets"/>
+      <xs:enumeration value="TM_OverlappedBy"/>
+      <xs:enumeration value="TM_MetBy"/>
+      <xs:enumeration value="TM_EndedBy"/>
+      <xs:enumeration value="TM_Ends"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <!-- ========================================== -->
+  <xs:element name="Spatial_Capabilities" type="ogc:Spatial_CapabilitiesType"/>
+  <xs:element name="Scalar_Capabilities" type="ogc:Scalar_CapabilitiesType"/>
+  <xs:element name="Id_Capabilities" type="ogc:Id_CapabilitiesType"/>
+  <xs:element name="Temporal_Capabilities" type="ogc:Temporal_CapabilitiesType"/>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosAll.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosAll.xsd
new file mode 100755
index 0000000..91bc8e9
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosAll.xsd
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:sos="http://www.opengis.net/sos/1.0" targetNamespace="http://www.opengis.net/sos/1.0" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+  <annotation>
+    <documentation>
+      <description>
+        This XML Schema includes and imports, directly and indirectly, 
+        all the XML Schemas defined by the OGC Sensor Observation Service (SOS).
+        
+        SOS is an OGC Standard.
+        Copyright (c) 2006,2010 Open Geospatial Consortium.
+        To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </description>
+    </documentation>
+  </annotation>
+  <!-- ==============================================================
+		includes and imports
+	============================================================== -->
+  <include schemaLocation="sosCommon.xsd"/>
+  <include schemaLocation="sosGetCapabilities.xsd"/>
+  <include schemaLocation="sosDescribeFeatureType.xsd"/>
+  <include schemaLocation="sosDescribeSensor.xsd"/>
+  <include schemaLocation="sosDescribeObservationType.xsd"/>
+  <include schemaLocation="sosDescribeResultModel.xsd"/>
+  <include schemaLocation="sosGetObservation.xsd"/>
+  <include schemaLocation="sosGetResult.xsd"/>
+  <include schemaLocation="sosGetFeatureOfInterest.xsd"/>
+  <include schemaLocation="sosGetFeatureOfInterestTime.xsd"/>
+  <include schemaLocation="sosInsert.xsd"/>
+  <include schemaLocation="sosRegisterSensor.xsd"/>
+  <include schemaLocation="sosGetObservationById.xsd"/>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosCommon.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosCommon.xsd
new file mode 100755
index 0000000..602d3ec
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosCommon.xsd
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema encodes the elements and types that are shared by muliple SOS operations./
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="sosAll.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<complexType name="RequestBaseType">
+		<annotation>
+			<documentation>XML encoded SOS operation request base, for all operations except Get Capabilities. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. </documentation>
+		</annotation>
+		<attribute name="service" type="string" use="required" fixed="SOS">
+			<annotation>
+				<documentation>Service type identifier. </documentation>
+			</annotation>
+		</attribute>
+		<attribute name="version" type="string" use="required" fixed="1.0.0">
+			<annotation>
+				<documentation>Specification version for SOS version and operation.</documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<simpleType name="responseModeType">
+		<restriction base="string">
+			<enumeration value="inline"/>
+			<enumeration value="attached"/>
+			<enumeration value="out-of-band"/>
+			<enumeration value="resultTemplate"/>
+		</restriction>
+	</simpleType>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosContents.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosContents.xsd
new file mode 100755
index 0000000..3b11808
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosContents.xsd
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema encodes the Contents section of the SOS GetCapabilities operation response.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.opengis.net/ows/1.1" schemaLocation="http://schemas.opengis.net/ows/1.1.0/owsAll.xsd"/>
+	<import namespace="http://www.opengis.net/swe/1.0.1" schemaLocation="http://schemas.opengis.net/sweCommon/1.0.1/swe.xsd"/>
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="Contents">
+		<annotation>
+			<documentation>Contents section of SOS service metadata (or Capabilites) XML document. For the SOS, these contents are data and functions that the SOS server provides.</documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element name="ObservationOfferingList">
+					<complexType>
+						<sequence>
+							<element name="ObservationOffering" type="sos:ObservationOfferingType" maxOccurs="unbounded"/>
+						</sequence>
+					</complexType>
+				</element>
+			</sequence>
+		</complexType>
+	</element>
+	<!-- ============================ -->
+	<complexType name="ObservationOfferingBaseType" abstract="true">
+		<annotation>
+			<documentation>Makes boundedBy mandatory</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractFeatureType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ============================-->
+	<complexType name="ObservationOfferingType">
+		<complexContent>
+			<extension base="sos:ObservationOfferingBaseType">
+				<sequence>
+					<element name="intendedApplication" type="token" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="time" type="swe:TimeGeometricPrimitivePropertyType"/>
+					<element name="procedure" type="gml:ReferenceType" maxOccurs="unbounded"/>
+					<element name="observedProperty" type="swe:PhenomenonPropertyType" maxOccurs="unbounded"/>
+					<element name="featureOfInterest" type="gml:ReferenceType" maxOccurs="unbounded"/>
+					<element name="responseFormat" type="ows:MimeType" maxOccurs="unbounded"/>
+					<element name="resultModel" type="QName" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>
+							Indicates the qualified name of the observation element that will be returned from a call to GetObservation for this offering.  
+							This element must be in the om:AbstractObservation substitution group and is typically the om:Observation or a specialized extension.
+							</documentation>
+						</annotation>
+					</element>
+					<element name="responseMode" type="sos:responseModeType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>This element allows the client to request the form of the response.  The value of resultTemplate is used to retrieve an observation template 
+							that will later be used in calls to GetResult.  The other options allow results to appear inline in a resultTag (inline), external to the observation element (out-of-band)
+							or as a MIME attachment (attached)</documentation>
+						</annotation>
+					</element>
+					<!-- intendedApplication and slotID can be supported by a more generic identifier/classifier section-->
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="srsName" type="gml:CodeType" substitutionGroup="ows:AbstractMetaData"/>
+	<element name="supportedSensorDescription" type="QName" substitutionGroup="ows:AbstractMetaData">
+		<annotation>
+			<documentation>The QName of the root of a sensor desription that is supported by this service.  Examples are "sml:_Process" and "tml:system"</documentation>
+		</annotation>
+	</element>
+	<element name="supportedSRS" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this reference system is identified.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeFeatureType.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeFeatureType.xsd
new file mode 100755
index 0000000..ba450af
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeFeatureType.xsd
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the DescribeFeatureType request and response XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+	request
+	============================================================== -->
+	<element name="DescribeFeatureType">
+		<annotation>
+			<documentation>Request to a SOS to perform the DescribeFeatureType operation. This operation is designed to request detailed information concerning the observation's target</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<element name="FeatureId" type="anyURI">
+							<annotation>
+								<documentation>Identifier of the feature for which detailed information is requested. These identifiers are usually listed in the Contents section of the service metadata (Capabilities) document. </documentation>
+							</annotation>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- ==============================================================
+		response
+	============================================================== -->
+	<!--the response is a XML schema-->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeObservationType.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeObservationType.xsd
new file mode 100755
index 0000000..8f2ee8f
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeObservationType.xsd
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the DescribeObservationType request and response XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+	request
+	============================================================== -->
+	<element name="DescribeObservationType">
+		<annotation>
+			<documentation>Request to a SOS to perform the DescribeObservationTypeoperation. This operation is designed to request detailed information concerning hard typed observation schemas</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<element name="observedProperty" type="anyURI">
+							<annotation>
+								<documentation>The phenomenon for which the observationType (OM application schema) is requested.</documentation>
+							</annotation>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- ==============================================================
+		response
+	============================================================== -->
+	<!--The response will be an XML schema defining the OM applicatoin schemas-->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeResultModel.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeResultModel.xsd
new file mode 100755
index 0000000..9e1adb1
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeResultModel.xsd
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the DescribeResultModel request and response XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+	request
+	============================================================== -->
+	<element name="DescribeResultModel">
+		<annotation>
+			<documentation>Request to a SOS to perform the DescribeResultModel operation. 
+			This operation is designed to request detailed information concerning the format of the observation's result</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<element name="ResultName" type="QName">
+							<annotation>
+								<documentation>Identifier of the type of the result, for which detailed information is requested.</documentation>
+							</annotation>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- ==============================================================
+		response
+	============================================================== -->
+	<!--the response is an XML schema-->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeSensor.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeSensor.xsd
new file mode 100755
index 0000000..5bbda7f
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosDescribeSensor.xsd
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the DescribeSensor request and response XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.opengis.net/ows/1.1" schemaLocation="http://schemas.opengis.net/ows/1.1.0/owsAll.xsd"/>
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+		request
+	============================================================== -->
+	<element name="DescribeSensor">
+		<annotation>
+			<documentation>Request to a SOS to perform the DescribeSensor operation. This operation is designed to request detailed sensor metadata.	</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<element name="procedure" type="anyURI">
+							<annotation>
+								<documentation>Identifier of the sensor, for which detailed metadata is requested.</documentation>
+							</annotation>
+						</element>
+					</sequence>
+					<attribute name="outputFormat" type="ows:MimeType" use="required">
+						<annotation>
+							<documentation>Identifier of the output format to be used for the requested data. The outputFormats supported by a SOS server are listed in the operations metadata section of the service metadata (capabilities XML). If this attribute is omitted, the outputFormat should be tex/xml;subtype="sensorML/1.0.0". If the requested outputFormat is not supported by the SOS server, an exception message shall be returned.
+				</documentation>
+						</annotation>
+					</attribute>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- ==============================================================
+		response
+	============================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetCapabilities.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetCapabilities.xsd
new file mode 100755
index 0000000..291df65
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetCapabilities.xsd
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:sos="http://www.opengis.net/sos/1.0" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema encodes the SOS GetCapabilities operation request and response.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosContents.xsd"/>
+	<import namespace="http://www.opengis.net/ows/1.1" schemaLocation="http://schemas.opengis.net/ows/1.1.0/owsAll.xsd"/>
+	<import namespace="http://www.opengis.net/ogc" schemaLocation="http://schemas.opengis.net/sos/1.0.0/ogc4sos.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="GetCapabilities">
+		<annotation>
+			<documentation>Request to a SOS to perform the GetCapabilities operation. This operation allows a client to retrieve service metadata (capabilities XML) providing metadata for the specific SOS server. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. </documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="ows:GetCapabilitiesType">
+					<sequence/>
+					<attribute name="service" type="ows:ServiceType" use="required" fixed="SOS"/>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Capabilities">
+		<annotation>
+			<documentation>XML encoded SOS GetCapabilities operation response. This document provides clients with service metadata about a specific service instance, including metadata about the tightly-coupled data served. If the server does not implement the updateSequence parameter, the server shall always return the complete Capabilities document, without the updateSequence parameter. When the server implements the updateSequence parameter and the GetCapabilities operation request included t [...]
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="ows:CapabilitiesBaseType">
+					<sequence>
+						<element ref="sos:Filter_Capabilities" minOccurs="0"/>
+						<element ref="sos:Contents" minOccurs="0"/>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- added by Mike Botts and Johannes Echterhoff to support temporal filter in SOS Capabailities 2007-10-18 -->
+	<!-- temporary fix until temporal ops supported in filter -->
+	<element name="Filter_Capabilities">
+		<complexType>
+			<sequence>
+				<element ref="ogc:Spatial_Capabilities"/>
+				<element ref="ogc:Temporal_Capabilities"/>
+				<element ref="ogc:Scalar_Capabilities"/>
+				<element ref="ogc:Id_Capabilities"/>
+			</sequence>
+		</complexType>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterest.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterest.xsd
new file mode 100755
index 0000000..13941dc
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterest.xsd
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the GetFeatureOfInterest request and response XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.opengis.net/ogc" schemaLocation="http://schemas.opengis.net/sos/1.0.0/ogc4sos.xsd"/>
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+		request
+	============================================================== -->
+	<element name="GetFeatureOfInterest">
+		<annotation>
+			<documentation>Request to a SOS to perform the GetFeatureOfInterest operation. This operation is designed to request target feaure instances</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<choice>
+							<element name="FeatureOfInterestId" type="anyURI" maxOccurs="unbounded">
+								<annotation>
+									<documentation>Identifier of the feature of interest, for which detailed information is requested. These identifiers are usually listed in the Contents section of the service metadata (Capabilities) document. </documentation>
+								</annotation>
+							</element>
+							<element name="location">
+								<annotation>
+									<documentation>Uses modified version of filter.xsd</documentation>
+								</annotation>
+								<complexType>
+									<sequence>
+										<element ref="ogc:spatialOps"/>
+									</sequence>
+								</complexType>
+							</element>
+						</choice>
+						<element name="eventTime" minOccurs="0" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Uses modified version of filter.xsd 
+								
+								Allows a client to request targets from a specific instant, multiple instances or periods of time in the past, present and future. 
+								This is useful for dynamic sensors for which the properties of the target are time-dependent. 
+								Multiple time paramters may be indicated so that the client may request details of the observation target at multiple times. 
+								The supported range is listed in the contents section of the service metadata.</documentation>
+							</annotation>
+							<complexType>
+								<sequence>
+									<element ref="ogc:temporalOps"/>
+								</sequence>
+							</complexType>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- ====================================================
+	response
+	=======================================================-->
+	<!-- The response is an GML feature, the schema of the feature instance can be retrieved using the DescribeFeatureType request.-->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterestTime.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterestTime.xsd
new file mode 100755
index 0000000..21c1978
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetFeatureOfInterestTime.xsd
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the GetFeatureOfInterestTime request and response XML elements and types.
+				
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.opengis.net/ogc" schemaLocation="http://schemas.opengis.net/sos/1.0.0/ogc4sos.xsd"/>
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+		request
+	============================================================== -->
+	<element name="GetFeatureOfInterestTime">
+		<annotation>
+			<documentation>Request to a SOS to perform the GetTargetTime operation. 
+			This operation is designed to request the time that specified target feature instances or target locations are available</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<element name="FeatureOfInterestId" type="anyURI">
+							<annotation>
+								<documentation>Identifier of the feature of interest, for which detailed information is requested. These identifiers are usually listed in the Contents section of the service metadata (Capabilities) document. </documentation>
+							</annotation>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- ====================================================
+	response
+	=======================================================-->
+	<!-- The response is an GML time primitive.-->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd
new file mode 100755
index 0000000..e792276
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:om="http://www.opengis.net/om/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<dc:description>
+				This XML Schema defines the GetObservation request XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</dc:description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.opengis.net/ows/1.1" schemaLocation="http://schemas.opengis.net/ows/1.1.0/owsAll.xsd"/>
+	<import namespace="http://www.opengis.net/ogc" schemaLocation="http://schemas.opengis.net/sos/1.0.0/ogc4sos.xsd"/>
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+		request
+	============================================================== -->
+	<element name="GetObservation">
+		<annotation>
+			<documentation>Request to a SOS to perform the GetObservation operation. This operation is designed to request sensor data from live sensors as well as sensor data archives.</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence minOccurs="0">
+						<element name="offering" type="anyURI">
+							<annotation>
+								<documentation>ID of an offering advertised in the capabilities.
+									All following parameters are depending on the selected offering.
+								</documentation>
+							</annotation>
+						</element>
+						<element name="eventTime" minOccurs="0" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Allows a client to request observations from a specific instant, multiple instances or periods of time in the past, present and future. The supported range is listed in the selected offering capabilities.
+								</documentation>
+							</annotation>
+							<complexType>
+								<sequence>
+									<element ref="ogc:temporalOps"/>
+								</sequence>
+							</complexType>
+						</element>
+						<element name="procedure" type="anyURI" minOccurs="0" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Index of a particular sensor if offering procedure is a Sensor Array. Allows client to request data from one or more sensors in the array. The size of the array should be specified in the selected offering capabilities. This is to support scenarios with sensor grids (we don't want to have one offering for each sensor in that case). Note that sensorML can describe Sensor Arrays too. 										</documentation>
+							</annotation>
+						</element>
+						<element name="observedProperty" type="anyURI" maxOccurs="unbounded">
+							<annotation>
+								<documentation>ID of a phenomenon advertised in capabilities document.
+									All possible phenomena are listed in the selected offering capabilities.
+								</documentation>
+							</annotation>
+						</element>
+						<element name="featureOfInterest" minOccurs="0">
+							<annotation>
+								<documentation>Specifies target feature for which observations are requested. Mostly a hepler for in-situ sensors, since geo-location has to be done on the server side. The supported area should be listed in the selected offering capabilities.
+								</documentation>
+							</annotation>
+							<complexType>
+								<choice>
+									<element ref="ogc:spatialOps"/>
+									<element name="ObjectID" type="anyURI" maxOccurs="unbounded">
+										<annotation>
+											<documentation>Unordered list of zero or more object identifiers. These identifiers are usually listed in the Contents section of the service metadata (Capabilities) document. If no ObjectID value is included, and if only one category of objects is allowed for this operation, the server shall return all objects of that category. NOTE: Although retention of this ability is allowed by a specific OWS that uses this operation, such retention is discouraged due to possible problems [...]
+										</annotation>
+									</element>
+								</choice>
+							</complexType>
+						</element>
+						<element name="result" minOccurs="0">
+							<annotation>
+								<documentation>Only report observations where the result matches this expression.
+								</documentation>
+							</annotation>
+							<complexType>
+								<sequence>
+									<element ref="ogc:comparisonOps"/>
+								</sequence>
+							</complexType>
+						</element>
+						<element name="responseFormat" type="ows:MimeType">
+							<annotation>
+								<documentation>ID of the output format to be used for the requested data. The supported output formats are listed in the selected offering capabilities.
+								</documentation>
+							</annotation>
+						</element>
+						<element name="resultModel" type="QName" minOccurs="0">
+							<annotation>
+								<documentation>Identifier of the result model to be used for the requested data. The resultModel values supported by a SOS server are listed in the contents section of the service metadata, identified as QName values.  If the requested resultModel is not supported by the SOS server, an exception message shall be returned.
+							</documentation>
+							</annotation>
+						</element>
+						<element name="responseMode" type="sos:responseModeType" minOccurs="0">
+							<annotation>
+								<documentation>This element allows the client to request the form of the response.  The value of resultTemplate is used to retrieve an observation template 
+							that will later be used in calls to GetResult.  The other options allow results to appear inline in a resultTag (inline), external to the observation element (out-of-band)
+							or as a MIME attachment (attached)</documentation>
+							</annotation>
+						</element>
+					</sequence>
+					<attribute name="srsName" type="anyURI" use="optional"/>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetObservationById.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetObservationById.xsd
new file mode 100755
index 0000000..faec131
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetObservationById.xsd
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the GetObservation request XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.opengis.net/ows/1.1" schemaLocation="http://schemas.opengis.net/ows/1.1.0/owsAll.xsd"/>
+	<import namespace="http://www.opengis.net/ogc" schemaLocation="http://schemas.opengis.net/sos/1.0.0/ogc4sos.xsd"/>
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+		request
+	============================================================== -->
+	<element name="GetObservationById">
+		<annotation>
+			<documentation>Request to a SOS to perform the GetObservation operation using an Observation ID.</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<element name="ObservationId" type="anyURI">
+							<annotation>
+								<documentation>ID of the observation to obtain.  This could have been obtained by the client via a URL in a feed, alert, or some other notification
+								</documentation>
+							</annotation>
+						</element>
+						<element name="responseFormat" type="ows:MimeType" minOccurs="0">
+							<annotation>
+								<documentation>ID of the output format to be used for the requested data. The supported output formats are listed in the selected offering capabilities.
+								</documentation>
+							</annotation>
+						</element>
+						<element name="resultModel" type="QName" minOccurs="0"/>
+						<element name="responseMode" type="sos:responseModeType" minOccurs="0">
+							<annotation>
+								<documentation>This element allows the client to request the form of the response.  The value of resultTemplate is used to retrieve an observation template 
+							that will later be used in calls to GetResult.  The other options allow results to appear inline in a resultTag (inline), external to the observation element (out-of-band)
+							or as a MIME attachment (attached)</documentation>
+							</annotation>
+						</element>
+					</sequence>
+					<attribute name="srsName" type="anyURI" use="optional"/>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetResult.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetResult.xsd
new file mode 100755
index 0000000..de2bd52
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosGetResult.xsd
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the GetResult request and response XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.opengis.net/ogc" schemaLocation="http://schemas.opengis.net/sos/1.0.0/ogc4sos.xsd"/>
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+		request
+	============================================================== -->
+	<element name="GetResult">
+		<annotation>
+			<documentation>request to a SOS to perform a GetResult operation. this operation is designed to request sensor data from live sensors. Instead of retriveing the observations as a full OM document, you will get an simple value and a link to the reference system</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<element name="ObservationTemplateId" type="anyURI">
+							<annotation>
+								<documentation>The gml:id of an previous GetObservation request response indicating observations from a certain sensor for a certain target.
+								</documentation>
+							</annotation>
+						</element>
+						<element name="eventTime" minOccurs="0" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Allows a client to request observations from a specific instant, multiple instances or periods of time in the past, present and future. The supported range is listed in the selected offering capabilities.
+								</documentation>
+							</annotation>
+							<complexType>
+								<sequence>
+									<element ref="ogc:temporalOps"/>
+								</sequence>
+							</complexType>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- ==============================================================
+		response
+	============================================================== -->
+	<element name="GetResultResponse">
+		<annotation>
+			<documentation>the response of a GetResult operation</documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element name="result">
+					<annotation>
+						<documentation>RS attribute points to the description of the reference system of the result. The description will contain all information necessary to understand what is provided within the result response. The most simple case would be a single value.</documentation>
+					</annotation>
+					<complexType>
+						<simpleContent>
+							<extension base="string">
+								<attribute name="RS" type="anyURI" use="required"/>
+							</extension>
+						</simpleContent>
+					</complexType>
+				</element>
+			</sequence>
+		</complexType>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosInsert.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosInsert.xsd
new file mode 100755
index 0000000..ad8792e
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosInsert.xsd
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2005 rel. 3 U (http://www.altova.com) by Johannes Echterhoff (Westfälische Wilhelms-Universität Münster) -->
+<schema targetNamespace="http://www.opengis.net/sos/1.0" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:om="http://www.opengis.net/om/1.0" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+	<annotation>
+		<documentation>
+			<description>
+				This XML Schema defines the insert request and response XML elements and types.
+				
+				SOS is an OGC Standard.
+				Copyright (c) 2006,2010 Open Geospatial Consortium.
+				To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+			</description>
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.opengis.net/ows/1.1" schemaLocation="http://schemas.opengis.net/ows/1.1.0/owsAll.xsd"/>
+	<import namespace="http://www.opengis.net/om/1.0" schemaLocation="http://schemas.opengis.net/om/1.0.0/om.xsd"/>
+	<include schemaLocation="sosAll.xsd"/>
+	<include schemaLocation="sosCommon.xsd"/>
+	<!-- ==============================================================
+		request
+	============================================================== -->
+	<element name="InsertObservation">
+		<annotation>
+			<documentation>Request to a SOS to perform the Insert operation. This operation is designed to insert new observations. The request is constraint by the following parameters: ID obtained by the registerSensor operation (identifying the sensor and the observyationType, and the observation encoded as OM</documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="sos:RequestBaseType">
+					<sequence>
+						<element name="AssignedSensorId" type="anyURI">
+							<annotation>
+								<documentation>The id obtained by the registerSensor operation.</documentation>
+							</annotation>
+						</element>
+						<element ref="om:Observation">
+							<annotation>
+								<documentation>The observation to be inserted to the SOS.</documentation>
+							</annotation>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+	<!-- ====================================================
+	response
+	=======================================================-->
+	<element name="InsertObservationResponse">
+		<annotation>
+			<documentation>returns the Id of the Observation assigend by the SOS</documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element name="AssignedObservationId" type="anyURI"/>
+			</sequence>
+		</complexType>
+	</element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosRegisterSensor.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosRegisterSensor.xsd
new file mode 100755
index 0000000..cfc1fca
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sos/1.0.0/sosRegisterSensor.xsd
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:om="http://www.opengis.net/om/1.0" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.opengis.net/sos/1.0" elementFormDefault="qualified" version="1.0.0.2" xml:lang="en">
+  <!-- This version of sos/1.0.0 was previously versioned as '1.0.1' . -->
+  <annotation>
+    <documentation>
+      <description>
+        This XML Schema defines the registerSenor request and response XML elements and types.
+        
+        SOS is an OGC Standard.
+        Copyright (c) 2006,2010 Open Geospatial Consortium.
+        To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </description>
+    </documentation>
+  </annotation>
+  <!-- ==============================================================
+		includes and imports
+	============================================================== -->
+  <import namespace="http://www.opengis.net/ows/1.1" schemaLocation="http://schemas.opengis.net/ows/1.1.0/owsAll.xsd"/>
+  <import namespace="http://www.opengis.net/om/1.0" schemaLocation="http://schemas.opengis.net/om/1.0.0/om.xsd"/>
+  <include schemaLocation="sosAll.xsd"/>
+  <include schemaLocation="sosCommon.xsd"/>
+  <!-- ==============================================================
+		request
+	============================================================== -->
+  <element name="RegisterSensor">
+    <annotation>
+      <documentation>Request to a SOS to perform the registerSensor operation. This operation is designed to register new sensors at the SOS.</documentation>
+    </annotation>
+    <complexType>
+      <complexContent>
+        <extension base="sos:RequestBaseType">
+          <sequence>
+            <element name="SensorDescription">
+              <complexType>
+                <sequence>
+                  <any namespace="##other" processContents="lax"/>
+                </sequence>
+              </complexType>
+            </element>
+            <element ref="sos:ObservationTemplate"/>
+          </sequence>
+        </extension>
+      </complexContent>
+    </complexType>
+  </element>
+  <element name="ObservationTemplate">
+    <annotation>
+      <documentation>A template of the observations that will be inserted into the SOS.</documentation>
+    </annotation>
+    <complexType>
+      <sequence>
+        <element ref="om:Observation"/>
+      </sequence>
+    </complexType>
+  </element>
+  <!-- ====================================================
+	response
+	=======================================================-->
+  <element name="RegisterSensorResponse">
+    <annotation>
+      <documentation>returns the Id that is used in the insert operation to link the sensor to an Observation</documentation>
+    </annotation>
+    <complexType>
+      <sequence>
+        <element name="AssignedSensorId" type="anyURI"/>
+      </sequence>
+    </complexType>
+  </element>
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/aggregateTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/aggregateTypes.xsd
new file mode 100755
index 0000000..cc0a7a1
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/aggregateTypes.xsd
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/swe/1.0.1" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>SWE Common schema for aggregate data types
+			
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:include schemaLocation="./swe.xsd"/>
+	<xs:include schemaLocation="./simpleTypes.xsd"/>
+	<xs:include schemaLocation="./encoding.xsd"/>
+	<!-- ================================================= -->
+	<!--         Composite/Aggregate Components - Records and arrays            -->
+	<!-- ================================================= -->
+	<xs:element name="AbstractDataRecord" type="swe:AbstractDataRecordType" abstract="true"/>
+	<!-- ........ -->
+	<xs:complexType name="AbstractDataRecordType" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="DataRecord" type="swe:DataRecordType" substitutionGroup="swe:AbstractDataRecord">
+		<xs:annotation>
+			<xs:documentation>Implementation of ISO-11404 Record datatype. This allows grouping of data components which can themselves be Records, Arrays or Simple Types</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="DataRecordType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataRecordType">
+				<xs:sequence>
+					<xs:element name="field" type="swe:DataComponentPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="DataRecordPropertyType">
+		<xs:annotation>
+			<xs:documentation>DataRecord is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:DataRecord"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="SimpleDataRecord" type="swe:SimpleDataRecordType" substitutionGroup="swe:AbstractDataRecord">
+		<xs:annotation>
+			<xs:documentation>Implementation of ISO-11404 Record datatype that takes only simple scalars (i.e. no data aggregates)</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="SimpleDataRecordType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataRecordType">
+				<xs:sequence>
+					<xs:element name="field" type="swe:AnyScalarPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="SimpleDataRecordPropertyType">
+		<xs:annotation>
+			<xs:documentation>SimpleDataRecord is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:SimpleDataRecord"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="AbstractDataArray" type="swe:AbstractDataArrayType" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Implemetation of ISO-11404 Array datatype. This defines an array of identical data components with a elementCount. Values are given as a block and can be encoded in different ways</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="AbstractDataArrayType" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataComponentType">
+				<xs:sequence>
+					<xs:element name="elementCount">
+						<xs:annotation>
+							<xs:documentation>Specifies the size of the array (i.e. the number of elements of the defined type it contains)</xs:documentation>
+						</xs:annotation>
+						<xs:complexType>
+							<xs:sequence minOccurs="0">
+								<xs:element ref="swe:Count">
+									<!-- Should this really be swe:Count rather than xs:integer??? -->
+								</xs:element>
+								<!-- maxOccurs="unbounded" to support multiple dimensions? -->
+							</xs:sequence>
+							<xs:attribute name="ref" type="xs:IDREF">
+								<xs:annotation>
+									<xs:documentation>If present, the array size is variable and should be obtained from the referenced component.
+			                    The referenced component must occur before the array values in a data stream to allow parsing.</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="DataArray" type="swe:DataArrayType" substitutionGroup="swe:AbstractDataArray">
+		<xs:annotation>
+			<xs:documentation>Implemetation of ISO-11404 Array datatype. This defines an array of identical data components with a elementCount. Values are given as a block and can be encoded in different ways</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="DataArrayType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataArrayType">
+				<xs:sequence>
+					<xs:element name="elementType" type="swe:DataComponentPropertyType"/>
+					<xs:group ref="swe:EncodedValuesGroup" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="DataArrayPropertyType">
+		<xs:annotation>
+			<xs:documentation>DataArray is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:DataArray"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="DataValuePropertyType">
+		<xs:annotation>
+			<xs:documentation>Use to point or include data values inline</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xs:anyType">
+				<xs:attribute name="recordCount" type="xs:positiveInteger"/>
+				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!--         Conditionals            -->
+	<!-- ================================================= -->
+	<xs:element name="ConditionalData" type="swe:ConditionalDataType" substitutionGroup="swe:AbstractDataRecord">
+		<xs:annotation>
+			<xs:documentation>List of Conditional Values for a property</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="ConditionalDataType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataRecordType">
+				<xs:sequence>
+					<xs:element name="case" maxOccurs="unbounded">
+						<xs:complexType>
+							<xs:sequence>
+								<xs:element ref="swe:ConditionalValue" minOccurs="0"/>
+							</xs:sequence>
+							<xs:attribute name="name" type="xs:token" use="required"/>
+							<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractConditionalType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataRecordType">
+				<xs:sequence>
+					<xs:element name="condition" maxOccurs="unbounded">
+						<xs:annotation>
+							<xs:documentation>Specifies one or more conditions for which the given value is valid</xs:documentation>
+						</xs:annotation>
+						<xs:complexType>
+							<xs:group ref="swe:AnyData" minOccurs="0"/>
+							<xs:attribute name="name" type="xs:token" use="required"/>
+							<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="ConditionalValue" type="swe:ConditionalValueType" substitutionGroup="swe:AbstractDataRecord">
+		<xs:annotation>
+			<xs:documentation>Qualifies data (scalar or not) with one or more conditions</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="ConditionalValueType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractConditionalType">
+				<xs:sequence>
+					<xs:element name="data">
+						<xs:complexType>
+							<xs:group ref="swe:AnyData" minOccurs="0"/>
+							<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!--               Data Component Groups               -->
+	<!-- ================================================= -->
+	<xs:group name="AnyData">
+		<xs:choice>
+			<xs:group ref="swe:AnyScalar"/>
+			<xs:group ref="swe:AnyRange"/>
+			<xs:element ref="swe:AbstractDataRecord"/>
+			<xs:element ref="swe:AbstractDataArray"/>
+		</xs:choice>
+	</xs:group>
+	<!-- ........ -->
+	<xs:complexType name="DataComponentPropertyType">
+		<xs:annotation>
+			<xs:documentation>Complex Type for all properties taking the AnyData Group with a "name" key</xs:documentation>
+		</xs:annotation>
+		<xs:group ref="swe:AnyData" minOccurs="0"/>
+		<xs:attribute name="name" type="xs:token" use="required"/>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="AnyDataPropertyType">
+		<xs:annotation>
+			<xs:documentation>Complex Type for all properties taking the AnyData Group</xs:documentation>
+		</xs:annotation>
+		<xs:group ref="swe:AnyData" minOccurs="0"/>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:group name="EncodedValuesGroup">
+		<xs:sequence>
+			<xs:element name="encoding" type="swe:BlockEncodingPropertyType">
+				<xs:annotation>
+					<xs:documentation>Specifies an encoding for the data structure defined by the enclosing element</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="values" type="swe:DataValuePropertyType" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>Carries the block of values encoded as specified by the encoding element</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+		</xs:sequence>
+	</xs:group>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/basicTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/basicTypes.xsd
new file mode 100755
index 0000000..2645253
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/basicTypes.xsd
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" targetNamespace="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>basicTypes.xsd
+	Some basic types (simpleContent) required in various places in OWS Sensor Web application schemas
+	
+	Copyright (c) 2007,2010 Open Geospatial Consortium.
+	To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ====================================================================== -->
+	<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:include schemaLocation="./swe.xsd"/>
+	<!-- ====================================================================== -->
+	<!-- === Units of Measure === -->
+	<!-- ====================================================================== -->
+	<xs:simpleType name="UomSymbol">
+		<xs:annotation>
+			<xs:documentation>Local copy of GML 3.2 uom symbol definition
+			Included for forward compatibility. 
+			Note: in future of this specification based on GML 3.2, these will be removed in favour of the GML 3.2 implementation</xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[^: \n\r\t]+"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ............ -->
+	<xs:simpleType name="UomURI">
+		<xs:annotation>
+			<xs:documentation>Local copy of GML 3.2 uom URI definition</xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="xs:anyURI">
+			<xs:pattern value="([a-zA-Z][a-zA-Z0-9\-\+\.]*:|\.\./|\./|#).*"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ............ -->
+	<xs:simpleType name="UomIdentifier">
+		<xs:annotation>
+			<xs:documentation>Local copy of GML 3.2 uom identifier definition</xs:documentation>
+		</xs:annotation>
+		<xs:union memberTypes="swe:UomSymbol swe:UomURI"/>
+	</xs:simpleType>
+	<!-- ............ -->
+	<xs:complexType name="UomPropertyType">
+		<xs:annotation>
+			<xs:documentation>Property type that indicates unit-of-measure, either by (i) inline definition; (ii)  reference; (iii)  UCUM code</xs:documentation>
+		</xs:annotation>
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition">
+				<xs:annotation>
+					<xs:documentation>Defines a unit inline</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+		</xs:sequence>
+		<xs:attribute name="code" type="swe:UomSymbol">
+			<xs:annotation>
+				<xs:documentation>Specifies a unit by using a UCUM expression (prefered)</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup">
+			<xs:annotation>
+				<xs:documentation>Specifies a unit by referencing a dictionary entry (to be used only for units not defined in UCUM)</xs:documentation>
+			</xs:annotation>
+		</xs:attributeGroup>
+	</xs:complexType>
+	<!-- ====================================================================== -->
+	<!-- === Code space/vocabulary === -->
+	<!-- ====================================================================== -->
+   <xs:complexType name="CodeSpacePropertyType">
+      <xs:annotation>
+         <xs:documentation>Property type that indicates the codespace</xs:documentation>
+      </xs:annotation>
+      <xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+   </xs:complexType>
+	<!-- ====================================================================== -->
+	<!-- === Time position === -->
+	<!-- overlaps with GML TimePositionType -->
+	<!-- ====================================================================== -->
+	<xs:simpleType name="timeIso8601">
+		<xs:annotation>
+			<xs:documentation>Choice of time position encodings, not including numeric representation. 
+	      A minor variation on gml:TimePositionUnion - carrying "indeterminate value" as content instead of an attribute.</xs:documentation>
+		</xs:annotation>
+		<xs:union memberTypes="xs:date xs:time xs:dateTime gml:TimeIndeterminateValueType"/>
+	</xs:simpleType>
+	<!-- ............ -->
+	<xs:simpleType name="timePositionType">
+		<xs:annotation>
+			<xs:documentation>Choice of time position encodings, including numeric representation but no frame. 
+	A minor variation on gml:TimePositionUnion - carrying "indeterminate value" as content instead of an attribute. </xs:documentation>
+		</xs:annotation>
+		<xs:union memberTypes="swe:timeIso8601 xs:double"/>
+	</xs:simpleType>
+	<!-- ====================================================================== -->
+	<!-- === Scoped Name === -->
+	<!-- equivalent to GML 3.2 CodeWithAuthorityType -->
+	<!-- ====================================================================== -->
+	<xs:complexType name="ScopedNameType">
+		<xs:annotation>
+			<xs:documentation>Explicit implementation of ISO 19103 ScopedName. 
+			Extension of string which also carries a codeSpace attribute.
+			Note: in future versions of this specification based on GML 3.2, this will be removed in favour of gml:CodeWithAuthorityType. </xs:documentation>
+		</xs:annotation>
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ====================================================================== -->
+	<!-- === Lists === -->
+	<!-- ================================================= -->
+	<xs:simpleType name="decimalList">
+		<xs:annotation>
+			<xs:documentation>Simple list of double-precision numbers. 
+	Note: xs:double supports either decimal or scientific notation</xs:documentation>
+		</xs:annotation>
+		<xs:list itemType="xs:double"/>
+	</xs:simpleType>
+	<!-- ............ -->
+	<xs:simpleType name="decimalPair">
+		<xs:annotation>
+			<xs:documentation>Pair of double-precision numbers. 
+	Note: xs:double supports either decimal or scientific notation</xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="swe:decimalList">
+			<xs:length value="2"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ================================================= -->
+	<xs:simpleType name="countList">
+		<xs:annotation>
+			<xs:documentation>Simple list of integers. </xs:documentation>
+		</xs:annotation>
+		<xs:list itemType="xs:integer"/>
+	</xs:simpleType>
+	<!-- ............ -->
+	<xs:simpleType name="countPair">
+		<xs:annotation>
+			<xs:documentation>Pair of integers. </xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="swe:countList">
+			<xs:length value="2"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ================================================= -->
+	<xs:simpleType name="tokenList">
+		<xs:annotation>
+			<xs:documentation>Simple list of tokens. 
+			Note: xs:token is a string with no embedded white-space allowed</xs:documentation>
+		</xs:annotation>
+		<xs:list itemType="xs:token"/>
+	</xs:simpleType>
+	<!-- ================================================= -->
+	<xs:simpleType name="timeList">
+		<xs:annotation>
+			<xs:documentation>Simple list of time positions. </xs:documentation>
+		</xs:annotation>
+		<xs:list itemType="swe:timePositionType"/>
+	</xs:simpleType>
+	<!-- ............ -->
+	<xs:simpleType name="timePair">
+		<xs:annotation>
+			<xs:documentation>Pair of time positions. </xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="swe:timeList">
+			<xs:length value="2"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ====================================================================== -->
+	<!-- === Generic Interval === -->
+	<!-- ====================================================================== -->
+	<xs:complexType name="IntervalType">
+		<xs:annotation>
+			<xs:documentation>A generic interval. The type of the two limits will normally be the same.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element name="lowerBound">
+				<xs:annotation>
+					<xs:documentation>Implicit xs:anyType</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="upperBound">
+				<xs:annotation>
+					<xs:documentation>Implicit xs:anyType</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ................ -->
+	<xs:element name="Interval" type="swe:IntervalType">
+		<xs:annotation>
+			<xs:documentation>A generic interval. The type of the two limits will normally be the same.</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ................ -->
+	<xs:complexType name="IntervalPropertyType">
+		<xs:annotation>
+			<xs:documentation>Inline property type for generic intervals</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:Interval"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ====================================================================== -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/curveTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/curveTypes.xsd
new file mode 100755
index 0000000..2fd9e62
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/curveTypes.xsd
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/swe/1.0.1" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>Schema for defining different types of curves based on aggregate data types
+			
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:include schemaLocation="./swe.xsd"/>
+	<xs:include schemaLocation="./aggregateTypes.xsd"/>
+	<!-- ================================================= -->
+	<!--                  Curve Components                 -->
+	<!-- ================================================= -->
+	<xs:element name="Curve" type="swe:CurveType" substitutionGroup="swe:AbstractDataArray">
+		<xs:annotation>
+			<xs:documentation>Curve describing variations of a parameter vs. another quantity</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="CurveType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataArrayType">
+				<xs:sequence>
+					<xs:element name="elementType" type="swe:SimpleDataRecordPropertyType"/>
+					<xs:group ref="swe:EncodedValuesGroup" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="CurvePropertyType">
+		<xs:annotation>
+			<xs:documentation>Curve is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:Curve"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="NormalizedCurve" type="swe:NormalizedCurveType" substitutionGroup="swe:AbstractDataRecord"/>
+	<xs:complexType name="NormalizedCurveType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataRecordType">
+				<xs:sequence>
+					<xs:element name="inputGain" type="swe:QuantityPropertyType" minOccurs="0"/>
+					<xs:element name="inputBias" type="swe:QuantityPropertyType" minOccurs="0"/>
+					<xs:element name="outputGain" type="swe:QuantityPropertyType" minOccurs="0"/>
+					<xs:element name="outputBias" type="swe:QuantityPropertyType" minOccurs="0"/>
+					<xs:element name="interpolationMethod" type="swe:CategoryPropertyType" minOccurs="0"/>
+					<xs:element name="extrapolationMethod" type="swe:CategoryPropertyType" minOccurs="0"/>
+					<xs:element name="function" type="swe:CurvePropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!--               Data Component Groups               -->
+	<!-- ================================================= -->
+	<xs:group name="Curves">
+		<xs:choice>
+			<xs:element ref="swe:Curve"/>
+			<xs:element ref="swe:NormalizedCurve"/>
+		</xs:choice>
+	</xs:group>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/data.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/data.xsd
new file mode 100755
index 0000000..6cea4c1
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/data.xsd
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/swe/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:swe="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>Schema allowing definition of structure and encoding of sensor data. Multiplexed streams can also be described
+		   
+		   Copyright (c) 2007,2010 Open Geospatial Consortium.
+		   To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+   <!-- ================================================= -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:include schemaLocation="./swe.xsd"/>
+	<xs:include schemaLocation="./aggregateTypes.xsd"/>
+   <!-- ================================================= -->
+   <xs:element name="DataBlockDefinition" type="swe:DataBlockDefinitionType"/>
+	<!-- ........ -->
+   <xs:complexType name="DataBlockDefinitionType">
+		<xs:sequence>
+		   <xs:element name="components" type="swe:DataComponentPropertyType"/>
+		   <xs:element name="encoding" type="swe:BlockEncodingPropertyType"/>
+		</xs:sequence>
+		<xs:attribute name="id" type="xs:ID" use="optional"/>
+   </xs:complexType>
+	<!-- ........ -->
+   <xs:complexType name="DataBlockDefinitionPropertyType">
+      <xs:sequence minOccurs="0">
+         <xs:element ref="swe:DataBlockDefinition"/>
+      </xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+   </xs:complexType>
+   <!-- ================================================= -->
+   <xs:element name="DataStreamDefinition" type="swe:DataStreamDefinitionType"/>
+	<!-- ........ -->
+   <xs:complexType name="DataStreamDefinitionType">
+      <xs:sequence>
+         <xs:element name="streamComponent" type="swe:DataBlockDefinitionPropertyType" maxOccurs="unbounded"/>
+         <xs:element name="streamEncoding" type="swe:MultiplexedStreamFormatPropertyType"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:ID" use="optional"/>
+   </xs:complexType>
+	<!-- ........ -->
+   <xs:complexType name="DataStreamDefinitionPropertyType">
+      <xs:sequence minOccurs="0">
+         <xs:element ref="swe:DataStreamDefinition"/>
+      </xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+   </xs:complexType> 
+   <!-- ================================================= -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/encoding.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/encoding.xsd
new file mode 100755
index 0000000..31d4a0a
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/encoding.xsd
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/swe/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:swe="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>Defines basic ResponseType definition and commonly used sensor characteristics
+			
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:include schemaLocation="./swe.xsd"/>
+	<!-- ================================================= -->
+	<xs:complexType name="BlockEncodingPropertyType">
+		<xs:choice minOccurs="0">
+			<xs:element ref="swe:StandardFormat"/>
+			<xs:element ref="swe:BinaryBlock"/>
+			<xs:element ref="swe:TextBlock"/>
+			<xs:element ref="swe:XMLBlock"/>
+		</xs:choice>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractEncodingType">
+		<xs:attribute name="id" type="xs:ID"/>
+		<!-- why bother with the supertype? Not used to form a substitution group. -->
+		<!--->Remember - attributes are Optional by default -->
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- ================================================= -->
+	<xs:element name="StandardFormat">
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractEncodingType">
+					<xs:attribute name="mimeType" type="xs:token" use="required"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<!-- ================================================= -->
+	<xs:element name="TextBlock">
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractEncodingType">
+					<xs:attribute name="tokenSeparator" type="swe:textSeparator" use="required"/>
+					<xs:attribute name="blockSeparator" type="swe:textSeparator" use="required"/>
+					<xs:attribute name="decimalSeparator" type="swe:decimalSeparator" use="required"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:simpleType name="textSeparator">
+		<xs:annotation>
+			<xs:documentation>Max three characters to use as token or block separator</xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="xs:string">
+			<xs:maxLength value="3"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ================================================= -->
+	<xs:simpleType name="decimalSeparator">
+		<xs:annotation>
+			<xs:documentation>One character to use as a decimal separator</xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="xs:token">
+			<xs:length value="1"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ================================================= -->
+	<!-- ================================================= -->
+	<xs:element name="BinaryBlock">
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractEncodingType">
+					<xs:sequence>
+						<xs:element name="member" maxOccurs="unbounded">
+							<xs:complexType>
+								<xs:choice>
+									<xs:element name="Component">
+										<xs:complexType>
+											<xs:attribute name="ref" type="xs:token" use="required"/>
+											<xs:attribute name="dataType" type="xs:anyURI" use="optional"/>
+											<xs:attribute name="significantBits" type="xs:positiveInteger" use="optional"/>
+											<xs:attribute name="bitLength" type="xs:positiveInteger" use="optional"/>
+											<xs:attribute name="paddingBits-before" type="xs:nonNegativeInteger" use="optional" default="0"/>
+											<xs:attribute name="paddingBits-after" type="xs:nonNegativeInteger" use="optional" default="0"/>
+											<xs:attribute name="encryption" type="xs:anyURI" use="optional"/>
+										</xs:complexType>
+									</xs:element>
+									<xs:element name="Block">
+										<xs:complexType>
+											<xs:attribute name="ref" type="xs:token" use="required"/>
+											<xs:attribute name="byteLength" type="xs:positiveInteger" use="optional"/>
+											<xs:attribute name="paddingBytes-before" type="xs:nonNegativeInteger" use="optional" default="0"/>
+											<xs:attribute name="paddingBytes-after" type="xs:nonNegativeInteger" use="optional" default="0"/>
+											<xs:attribute name="encryption" type="xs:anyURI" use="optional"/>
+											<xs:attribute name="compression" type="xs:anyURI" use="optional"/>
+										</xs:complexType>
+									</xs:element>
+								</xs:choice>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+					<xs:attribute name="byteLength" type="xs:positiveInteger" use="optional"/>
+					<xs:attribute name="byteEncoding" type="swe:byteEncoding" use="required"/>
+					<xs:attribute name="byteOrder" type="swe:byteOrder" use="required"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:simpleType name="byteEncoding">
+		<xs:restriction base="xs:token">
+			<xs:enumeration value="base64"/>
+			<xs:enumeration value="raw"/>
+			<xs:enumeration value="hex"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ================================================= -->
+	<xs:simpleType name="byteOrder">
+		<xs:restriction base="xs:token">
+			<xs:enumeration value="bigEndian"/>
+			<xs:enumeration value="littleEndian"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ================================================= -->
+	<xs:element name="MultiplexedStreamFormat" type="swe:MultiplexedStreamFormatType">
+		<xs:annotation>
+			<xs:documentation>Allows specification of the stream/packaging format used (ex: RTP, ASF, AAF, TML...)</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="MultiplexedStreamFormatType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractEncodingType">
+				<xs:attribute name="type" type="xs:anyURI" use="required"/>
+				<xs:attribute name="version" type="xs:string" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="MultiplexedStreamFormatPropertyType">
+		<xs:sequence>
+			<xs:element ref="swe:MultiplexedStreamFormat" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- ================================================= -->
+	<xs:element name="XMLBlock" type="swe:XMLBlockType">
+		<xs:annotation>
+			<xs:documentation>Carries the designator for an element implementing an XML-encoded data-type</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="XMLBlockType">
+		<xs:annotation>
+			<xs:documentation>Carries the designator for an element implementing an XML-encoded data-type</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractEncodingType">
+				<xs:attribute name="xmlElement" type="xs:QName">
+					<xs:annotation>
+						<xs:documentation>May be any XML Schema defined global element. 
+		typically this will be swe:Array, swe:Record, cv:CV_DiscreteCoverage, etc</xs:documentation>
+					</xs:annotation>
+				</xs:attribute>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/phenomenon.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/phenomenon.xsd
new file mode 100755
index 0000000..2126692
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/phenomenon.xsd
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" targetNamespace="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<annotation>
+		<documentation>phenomenon.xsd
+			
+	A GML conformant schema 
+	for definitions of phenomena, per Annex C of OM specification
+	
+	Copyright (c) 2007,2010 Open Geospatial Consortium.
+	To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<!-- bring in other schemas -->
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<include schemaLocation="./swe.xsd"/>
+	<include schemaLocation="./aggregateTypes.xsd"/>
+	<!-- ====================================================================== -->
+	<complexType name="PhenomenonType">
+		<annotation>
+			<documentation>Basic Phenomenon definition, and head of substitution group of specialized phenomenon defs. 
+			gml:description may be used for a more extensive description of the semantics, with a link to a definitive version (if available).  
+			gml:name should be used for the name or label.
+			
+			Note: In GML 3.2 the gml:identifier element should be used for the identifier assigned by or preferred by the data provider. 
+			This identifier will typically be in the form of a URN, for example following the OGC URN scheme
+			e.g. urn:x-ogc:def:phenomenon:OGC:Age
+			</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType"/>
+		</complexContent>
+	</complexType>
+	<!-- .......... -->
+	<element name="Phenomenon" type="swe:PhenomenonType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>Basic Phenomenon definition, and head of substitution group of specialized phenomenon defs. </documentation>
+		</annotation>
+	</element>
+	<!-- .......... -->
+	<complexType name="PhenomenonPropertyType">
+		<sequence minOccurs="0">
+			<element ref="swe:Phenomenon"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<complexType name="ConstrainedPhenomenonType">
+		<annotation>
+			<documentation>A scalar Phenomenon is defined by adding constraints to an existing property.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="swe:PhenomenonType">
+				<sequence>
+					<element name="base" type="swe:PhenomenonPropertyType">
+						<annotation>
+							<documentation>Property that forms the basis for generating a set of more refined Phenomena; e.g. Chemical Composition, Radiance</documentation>
+						</annotation>
+					</element>
+					<element name="otherConstraint" type="string" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Constraints that cannot be expressed as values of an orthogonal/helper phenomenon</documentation>
+						</annotation>
+					</element>
+					<element name="singleConstraint" type="swe:AnyDataPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Constraint expressed as a value or range of an orthogonal/helper phenomenon</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ........................................ -->
+	<element name="ConstrainedPhenomenon" type="swe:ConstrainedPhenomenonType" substitutionGroup="swe:Phenomenon">
+		<annotation>
+			<documentation>Description of a scalar Phenomenon defined by adding constraints to a property previously defined elsewhere.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<complexType name="CompoundPhenomenonType" abstract="true">
+		<annotation>
+			<documentation>Description of a set of Phenomena.  
+	  CompoundPhenomenon is the abstract head of a substitution group of specialized compound phenomena</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="swe:PhenomenonType">
+				<attribute name="dimension" type="positiveInteger" use="required">
+					<annotation>
+						<documentation>The number of components in the tuple</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ........................................ -->
+	<element name="CompoundPhenomenon" type="swe:CompoundPhenomenonType" abstract="true" substitutionGroup="swe:Phenomenon">
+		<annotation>
+			<documentation>Description of a set of Phenomena.  
+	  CompoundPhenomenon is the abstract head of a substitution group of specialized compound phenomena</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<complexType name="CompositePhenomenonType">
+		<annotation>
+			<documentation>A Phenomenon defined as a set of explicitly enumerated components which may or may not be related to one another</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="swe:CompoundPhenomenonType">
+				<sequence>
+					<element name="base" type="swe:PhenomenonPropertyType" minOccurs="0">
+						<annotation>
+							<documentation>Optional phenomenon that forms the basis for generating more specialized composite Phenomenon by adding more components</documentation>
+						</annotation>
+					</element>
+					<element name="component" type="swe:PhenomenonPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ........................................ -->
+	<element name="CompositePhenomenon" type="swe:CompositePhenomenonType" substitutionGroup="swe:CompoundPhenomenon">
+		<annotation>
+			<documentation>A Phenomenon defined as a set of explicitly enumerated components which may or may not be related to one another</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<complexType name="PhenomenonSeriesType">
+		<annotation>
+			<documentation>A phenomenon defined as a base property convolved with a set of constraints
+      The set of constraints may be either
+      * an explicit set of soft-typed measures, intervals and categories
+      * one or more lists of soft-typed measures, intervals and categories
+      * one or more sequences of soft-typed measures and intervals</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="swe:CompoundPhenomenonType">
+				<sequence>
+					<element name="base" type="swe:PhenomenonPropertyType">
+						<annotation>
+							<documentation>Phenomenon that forms the basis for generating a set of more refined Phenomena; e.g. Chemical Composition, Radiance</documentation>
+						</annotation>
+					</element>
+					<element name="constraintList" type="swe:DataArrayPropertyType" maxOccurs="unbounded">
+						<annotation>
+							<documentation>A set of values of some secondary property that constraints the basePhenomenon to generate a Phenomenon set.  
+							If more than one set of constraints are possible, then these are applied simultaneously to generate</documentation>
+						</annotation>
+					</element>
+					<element name="otherConstraint" type="string" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Other constraints are described in text</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ........................................ -->
+	<element name="PhenomenonSeries" type="swe:PhenomenonSeriesType" substitutionGroup="swe:CompoundPhenomenon">
+		<annotation>
+			<documentation>A phenomenon defined as a base property convolved with a set of constraints
+      The set of constraints may be either
+      * an explicit set of soft-typed measures, intervals and categories
+      * one or more lists of soft-typed measures, intervals and categories
+      * one or more sequences of soft-typed measures and intervals</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/positionTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/positionTypes.xsd
new file mode 100755
index 0000000..037236b
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/positionTypes.xsd
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/swe/1.0.1" xmlns:gml="http://www.opengis.net/gml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:swe="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>Schema for defining position data (location, orientation, etc...) based on aggregate data types
+			
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:include schemaLocation="./swe.xsd"/>
+	<xs:include schemaLocation="./aggregateTypes.xsd"/>
+	<!-- ================================================= -->
+	<xs:element name="Position" type="swe:PositionType" substitutionGroup="swe:AbstractDataRecord">
+		<xs:annotation>
+			<xs:documentation>Position is given as a group of Vectors/Matrices, each of which can specify location, orientation, velocity, angularVelocity, acceleration or angularAcceleration or a combination of those in a composite state Vector. Each Vector can have a separate frame of reference or inherit the frame from the parent Position object.</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="PositionType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractVectorType">
+				<xs:sequence>
+					<xs:element name="time" type="swe:TimePropertyType" minOccurs="0"/>
+					<xs:element name="location" type="swe:VectorPropertyType" minOccurs="0"/>
+					<xs:element name="orientation" type="swe:VectorOrSquareMatrixPropertyType" minOccurs="0"/>
+					<xs:element name="velocity" type="swe:VectorPropertyType" minOccurs="0"/>
+					<xs:element name="angularVelocity" type="swe:VectorOrSquareMatrixPropertyType" minOccurs="0"/>
+					<xs:element name="acceleration" type="swe:VectorPropertyType" minOccurs="0"/>
+					<xs:element name="angularAcceleration" type="swe:VectorOrSquareMatrixPropertyType" minOccurs="0"/>
+					<xs:element name="state" type="swe:VectorOrSquareMatrixPropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractMatrixType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataArrayType">
+				<xs:attribute name="referenceFrame" type="xs:anyURI" use="optional">
+					<xs:annotation>
+						<xs:documentation>Points to a spatial reference frame definition. Coordinates of the vector will be expressed in this reference frame</xs:documentation>
+					</xs:annotation>
+				</xs:attribute>
+				<xs:attribute name="localFrame" type="xs:anyURI" use="optional">
+					<xs:annotation>
+						<xs:documentation>Specifies the spatial frame which location and/or orientation is given by the enclosing vector</xs:documentation>
+					</xs:annotation>
+				</xs:attribute>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="SquareMatrix" type="swe:SquareMatrixType" substitutionGroup="swe:AbstractDataArray">
+		<xs:annotation>
+			<xs:documentation>This is a square matrix (so the size is the square of one dimension) which is a DataArray of Quantities. 		It has a referenceFrame in which the matrix components are described</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="SquareMatrixType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractMatrixType">
+				<xs:sequence>
+					<xs:element name="elementType" type="swe:QuantityPropertyType"/>
+					<xs:group ref="swe:EncodedValuesGroup" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="VectorOrSquareMatrixPropertyType">
+		<xs:annotation>
+			<xs:documentation>Vector/SquareMatrix is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:choice>
+			<xs:element ref="swe:Vector"/>
+			<xs:element ref="swe:SquareMatrix"/>
+		</xs:choice>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- Areas and Envelopes -->
+	<!-- ================================================= -->
+	<xs:element name="GeoLocationArea" substitutionGroup="swe:AbstractDataRecord">
+		<xs:annotation>
+			<xs:documentation>Area used to define bounding boxes</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractVectorType">
+					<xs:sequence>
+						<xs:element name="member" type="swe:EnvelopePropertyType" maxOccurs="unbounded">
+							<xs:annotation>
+								<xs:documentation>Is this an aggregate geometry?</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+					</xs:sequence>
+					<xs:attribute name="name" type="xs:token"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:element name="Envelope" type="swe:EnvelopeType" substitutionGroup="swe:AbstractDataRecord">
+		<xs:annotation>
+			<xs:documentation>Envelope described using two vectors specifying lower and upper corner points.
+           This is typically use to define rectangular bounding boxes in any coordinate system.</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="EnvelopeType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractVectorType">
+				<xs:sequence>
+					<xs:element name="time" type="swe:TimeRangePropertyType" minOccurs="0">
+						<xs:annotation>
+							<xs:documentation>Optionally provides time range during which this bounding envelope applies</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="lowerCorner" type="swe:VectorPropertyType"/>
+					<xs:element name="upperCorner" type="swe:VectorPropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="EnvelopePropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="swe:Envelope"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!--         Composite/Aggregate Components - Vectors and Matrices            -->
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractVectorType" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractDataRecordType">
+				<xs:attribute name="referenceFrame" type="xs:anyURI" use="optional">
+					<xs:annotation>
+						<xs:documentation>Points to a spatial reference frame definition. Coordinates of the vector will be expressed in this reference frame</xs:documentation>
+					</xs:annotation>
+				</xs:attribute>
+				<xs:attribute name="localFrame" type="xs:anyURI" use="optional">
+					<xs:annotation>
+						<xs:documentation>Specifies the spatial frame which location and/or orientation is given by the enclosing vector</xs:documentation>
+					</xs:annotation>
+				</xs:attribute>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="Vector" type="swe:VectorType" substitutionGroup="swe:AbstractDataRecord">
+		<xs:annotation>
+			<xs:documentation>A Vector is a special type of DataRecord that takes a list of numerical scalars called coordinates. The Vector has a referenceFrame in which the coordinates are expressed</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<!-- ............... -->
+	<xs:complexType name="VectorType">
+		<xs:complexContent>
+			<xs:extension base="swe:AbstractVectorType">
+				<xs:sequence>
+					<xs:element name="coordinate" maxOccurs="unbounded">
+						<xs:complexType>
+							<xs:group ref="swe:AnyNumerical" minOccurs="0"/>
+							<xs:attribute name="name" type="xs:token" use="required"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:complexType name="VectorPropertyType">
+		<xs:annotation>
+			<xs:documentation>Vector is a data-type so usually appears "by value" rather than by reference. However, by reference is still useful when objects, for instance, share a location.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence minOccurs="0">
+			<xs:element ref="swe:Vector"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- ================================================= -->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/simpleTypes.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/simpleTypes.xsd
new file mode 100755
index 0000000..e462af3
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/simpleTypes.xsd
@@ -0,0 +1,659 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/swe/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>SWE common schema for simple data types (i.e. without children)		
+
+		These have mostly been implemented using the "composition" pattern, rather than using inheritance/type-derivation. 
+Note: In general, content model definition using composition is more easily accomplished using groups and attribute groups.
+			* global/named type definitions are not needed unless type derivation is required. 
+			* type derivation is not needed unless substitution groups are to be supported. 
+			* parent types that are too generalized will require derivation by restriction further down, so should be avoided.
+
+		Copyright (c) 2007,2010 Open Geospatial Consortium.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!-- ================================================= -->
+	<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<xs:include schemaLocation="./swe.xsd"/>
+	<xs:include schemaLocation="./basicTypes.xsd"/>
+	<!-- ================================================= -->
+	<!-- === Root class model === -->
+	<!-- ================================================= -->
+	<xs:complexType name="AbstractDataComponentType" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Base type for all data components. 
+			This is implemented as an XML Schema complexType because it includes both element and attribute content.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:AbstractGMLType">
+				<xs:attribute name="fixed" type="xs:boolean" use="optional" default="false">
+					<xs:annotation>
+						<xs:documentation>Specifies if the value of a component stays fixed in time or is variable. Default is variable</xs:documentation>
+					</xs:annotation>
+				</xs:attribute>
+				<xs:attribute name="definition" type="xs:anyURI" use="optional">
+					<xs:annotation>
+						<xs:documentation>Points to semantics information defining the precise nature of the component</xs:documentation>
+					</xs:annotation>
+				</xs:attribute>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!--                 Simple Components                 -->
+	<!-- ================================================= -->
+	<xs:attributeGroup name="SimpleComponentAttributeGroup">
+		<xs:annotation>
+			<xs:documentation>Basic attributes required for all simple data components (i.e. without children)</xs:documentation>
+		</xs:annotation>
+		<xs:attribute name="referenceFrame" type="xs:anyURI" use="optional">
+			<xs:annotation>
+				<xs:documentation>A reference frame anchors a value to a datum or interval scale</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="axisID" type="xs:token" use="optional">
+			<xs:annotation>
+				<xs:documentation>Specifies the reference axis using the gml:axisID. The reference frame URI is inherited from parent Vector</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+	</xs:attributeGroup>
+	<!-- ================================================= -->
+	<!-- ======== Booleans ============= -->
+	<!-- ================================================= -->
+	<xs:element name="Boolean">
+		<xs:annotation>
+			<xs:documentation>Scalar component used to express truth: True or False, 0 or 1</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="quality" type="swe:QualityPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The quality property provides an indication of the reliability of estimates of the asociated value</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="value" type="xs:boolean" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+					</xs:sequence>
+					<xs:attributeGroup ref="swe:SimpleComponentAttributeGroup"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="BooleanPropertyType">
+		<xs:annotation>
+			<xs:documentation>Boolean is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:Boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- ======== Quantities ============= -->
+	<!-- ================================================= -->
+	<xs:element name="Quantity">
+		<xs:annotation>
+			<xs:documentation>Decimal number with optional unit and constraints</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="uom" type="swe:UomPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Unit of measure</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="constraint" type="swe:AllowedValuesPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The constraint property defines the permitted values, as a range or enumerated list</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="quality" type="swe:QualityPropertyType" minOccurs="0" maxOccurs="unbounded">
+							<xs:annotation>
+								<xs:documentation>The quality property provides an indication of the reliability of estimates of the asociated value</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="value" type="xs:double" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+					</xs:sequence>
+					<xs:attributeGroup ref="swe:SimpleComponentAttributeGroup"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="QuantityPropertyType">
+		<xs:annotation>
+			<xs:documentation>Quantity is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:Quantity"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="QuantityRange">
+		<xs:annotation>
+			<xs:documentation>Decimal pair for specifying a quantity range with constraints</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="uom" type="swe:UomPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Unit of measure</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="constraint" type="swe:AllowedValuesPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The constraint property defines the permitted values, as a range or enumerated list</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="quality" type="swe:QualityPropertyType" minOccurs="0" maxOccurs="unbounded">
+							<xs:annotation>
+								<xs:documentation>The quality property provides an indication of the reliability of estimates of the asociated value</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="value" type="swe:decimalPair" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<!-- *** Maybe cleaner to implement as a pair of value elements? *** -->
+					</xs:sequence>
+					<xs:attributeGroup ref="swe:SimpleComponentAttributeGroup"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="QuantityRangePropertyType">
+		<xs:annotation>
+			<xs:documentation>QuantityRange is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:QuantityRange"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="Count">
+		<xs:annotation>
+			<xs:documentation>Integer number used for a counting value</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="constraint" type="swe:AllowedValuesPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The constraint property defines the permitted values, as a range or enumerated list</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="quality" type="swe:QualityPropertyType" minOccurs="0" maxOccurs="unbounded">
+							<xs:annotation>
+								<xs:documentation>The quality property provides an indication of the reliability of estimates of the asociated value</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="value" type="xs:integer" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<!--
+						<xs:element name="uom" type="swe:UomPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Unit of measure</xs:documentation>
+							</xs:annotation> 
+						If there is a UOM then it is a scaled Quantity, not a Count. 
+						</xs:element>
+						-->
+					</xs:sequence>
+					<xs:attributeGroup ref="swe:SimpleComponentAttributeGroup"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="CountPropertyType">
+		<xs:annotation>
+			<xs:documentation>Count is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:Count"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="CountRange">
+		<xs:annotation>
+			<xs:documentation>Integer pair used for specifying a count range</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="constraint" type="swe:AllowedValuesPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The constraint property defines the permitted values, as a range or enumerated list</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="quality" type="swe:QualityPropertyType" minOccurs="0" maxOccurs="unbounded">
+							<xs:annotation>
+								<xs:documentation>The quality property provides an indication of the reliability of estimates of the asociated value</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="value" type="swe:countPair" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+							<!-- *** Maybe cleaner to implement as a pair of value elements? *** -->
+						</xs:element>
+						<!--
+						<xs:element name="uom" type="swe:UomPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Unit of measure</xs:documentation>
+							</xs:annotation> 
+						If there is a UOM then it is a scaled Quantity, not a Count. 
+						</xs:element>
+						-->
+					</xs:sequence>
+					<xs:attributeGroup ref="swe:SimpleComponentAttributeGroup"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="CountRangePropertyType">
+		<xs:annotation>
+			<xs:documentation>CountRange is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:CountRange"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- ======== Categories ============= -->
+	<!-- ================================================= -->
+	<xs:element name="Category">
+		<xs:annotation>
+			<xs:documentation>A simple token identifying a term or category (single spaces allowed); definition attribute should provide dictionary entry useful for interpretation of the value</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="codeSpace" type="swe:CodeSpacePropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Provides link to dictionary or rule set to which the value belongs</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="constraint" type="swe:AllowedTokensPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The constraint property defines the permitted values, as an enumerated list</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="quality" type="swe:QualityPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The quality property provides an indication of the reliability of estimates of the asociated value</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="value" type="xs:token" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+					</xs:sequence>
+					<xs:attributeGroup ref="swe:SimpleComponentAttributeGroup"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="CategoryPropertyType">
+		<xs:annotation>
+			<xs:documentation>Category is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:Category"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- ========== Time Components ======== -->
+	<!-- ================================================= -->
+	<xs:attributeGroup name="TRSAttributeGroup">
+		<xs:attribute name="referenceTime" type="swe:timeIso8601" use="optional">
+			<xs:annotation>
+				<xs:documentation>Specifies the origin of the temporal reference frame as an ISO8601 date (used to specify time after an epoch)</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="referenceFrame" type="xs:anyURI" use="optional">
+			<xs:annotation>
+				<xs:documentation>Points to a temporal reference frame definition. Time value will be expressed relative to this frame</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="localFrame" type="xs:anyURI" use="optional">
+			<xs:annotation>
+				<xs:documentation>Specifies the temporal frame which origin is given by this time component</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+	</xs:attributeGroup>
+	<!-- ================================================= -->
+	<xs:element name="Time">
+		<xs:annotation>
+			<xs:documentation>Either ISO 8601 (e.g. 2004-04-18T12:03:04.6Z) or time relative to a time origin</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="uom" type="swe:UomPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Unit of measure</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="constraint" type="swe:AllowedTimesPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The constraint property defines the permitted values, as a range or enumerated list</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="quality" type="swe:QualityPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The quality property provides an indication of the reliability of estimates of the asociated value</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="value" type="swe:timePositionType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+					</xs:sequence>
+					<xs:attributeGroup ref="swe:TRSAttributeGroup"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="TimePropertyType">
+		<xs:annotation>
+			<xs:documentation>Time is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:Time"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:element name="TimeRange">
+		<xs:annotation>
+			<xs:documentation>Time value pair for specifying a time range (can be a decimal or ISO 8601)</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="uom" type="swe:UomPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Unit of measure</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="constraint" type="swe:AllowedTimesPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The constraint property defines the permitted values, as a range or enumerated list</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="quality" type="swe:QualityPropertyType" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>The quality property provides an indication of the reliability of estimates of the asociated value</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="value" type="swe:timePair" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+							<!-- *** Maybe cleaner to implement as a pair of value elements? *** -->
+						</xs:element>
+					</xs:sequence>
+					<xs:attributeGroup ref="swe:TRSAttributeGroup"/>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="TimeRangePropertyType">
+		<xs:annotation>
+			<xs:documentation>TimeRange is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:TimeRange"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- ======== Text Object  ============= -->
+	<!-- ================================================= -->
+	<xs:element name="Text">
+		<xs:annotation>
+			<xs:documentation>Free textual component</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType">
+					<xs:sequence>
+						<xs:element name="value" type="xs:string" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>Value is optional, to enable structure to act in a schema for values provided using other encodings</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+					</xs:sequence>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ........ -->
+	<xs:complexType name="TextPropertyType">
+		<xs:annotation>
+			<xs:documentation>Text is a data-type so usually appears "by value" rather than by reference.</xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element ref="swe:Text"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<!-- ======== ObservableProperty ============= -->
+	<!-- ================================================= -->
+	<xs:element name="ObservableProperty">
+		<xs:annotation>
+			<xs:documentation>ObservableProperty should be used to identify (through reference only) stimuli or measurable property types. The consequence is that it does not have a uom because it has not been measured yet.  This is used to define sensor/detector/actuator inputs and outputs, for instance.</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="swe:AbstractDataComponentType"/>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<!-- ============ Constraints and Qualifiers ================ -->
+	<!-- ================================================= -->
+	<xs:complexType name="QualityPropertyType">
+		<xs:annotation>
+			<xs:documentation>Allows for a simple quality assessment of the values carried by this component.
+	      This value can be numerical or categorical thus allowing for things like accuracy, precision, tolerance, confidence level, etc...
+	      
+	      The  meaning of the quality measure is indicated by the definition attribute of the chosen sub-component.
+	      
+	      The use of the 'ref'attribute indicate that the value of accuracy is included itself in the data inside the referred component. 
+	      
+	      This soft-typed Data Quality description may be replaced by ISO 19115/19139 DQ_DataQuality elements in later versions</xs:documentation>
+		</xs:annotation>
+		<xs:choice minOccurs="0">
+			<xs:element ref="swe:Quantity"/>
+			<xs:element ref="swe:QuantityRange"/>
+			<xs:element ref="swe:Category"/>
+			<xs:element ref="swe:Text"/>
+		</xs:choice>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:complexType name="AllowedValuesPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="swe:AllowedValues"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:element name="AllowedValues">
+		<xs:annotation>
+			<xs:documentation>List of allowed values (There is an implicit AND between all members)</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice>
+				<xs:choice>
+					<xs:element name="min" type="xs:double">
+						<xs:annotation>
+							<xs:documentation>Specifies minimum allowed value for an open interval (no max)</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="max" type="xs:double">
+						<xs:annotation>
+							<xs:documentation>Specifies maximum allowed value for an open interval (no min)</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+				</xs:choice>
+				<xs:choice maxOccurs="unbounded">
+					<xs:element name="interval" type="swe:decimalPair">
+						<xs:annotation>
+							<xs:documentation>Range of allowed values (closed interval) for this component</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="valueList" type="swe:decimalList">
+						<xs:annotation>
+							<xs:documentation>List of allowed values for this component</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+				</xs:choice>
+			</xs:choice>
+			<xs:attribute name="id" type="xs:ID"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:complexType name="AllowedTokensPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="swe:AllowedTokens"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:element name="AllowedTokens">
+		<xs:annotation>
+			<xs:documentation>Enumeration of allowed values</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="valueList" type="swe:tokenList" maxOccurs="unbounded">
+					<xs:annotation>
+						<xs:documentation>List of allowed token values for this component</xs:documentation>
+					</xs:annotation>
+					<!-- why tokens? Better to allow strings. In which case either the members must be tagged, or whitespace escaped -->
+					<!-- the Category component is limited to the use of tokens to simplify comparisons (remove possible confusions due to
+					     insertion of \n or double spaces). Free Strings are only used in the Text component -->
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute name="id" type="xs:ID"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<xs:complexType name="AllowedTimesPropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="swe:AllowedTimes"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ........ -->
+	<xs:element name="AllowedTimes">
+		<xs:annotation>
+			<xs:documentation>List of allowed time values (There is an implicit AND between all members)</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:choice>
+				<xs:choice>
+					<xs:element name="min" type="swe:timePositionType">
+						<xs:annotation>
+							<xs:documentation>Specifies minimum allowed time value for an open interval (no max)</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="max" type="swe:timePositionType">
+						<xs:annotation>
+							<xs:documentation>Specifies maximum allowed time value for an open interval (no min)</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+				</xs:choice>
+				<xs:choice maxOccurs="unbounded">
+					<xs:element name="interval" type="swe:timePair">
+						<xs:annotation>
+							<xs:documentation>Range of allowed time values (closed interval) for this component</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="valueList" type="swe:timeList">
+						<xs:annotation>
+							<xs:documentation>List of allowed time values for this component</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+				</xs:choice>
+			</xs:choice>
+			<xs:attribute name="id" type="xs:ID"/>
+		</xs:complexType>
+	</xs:element>
+	<!-- ================================================= -->
+	<!--               Data Component Groups               -->
+	<!-- ================================================= -->
+	<xs:group name="AnyScalar">
+		<xs:annotation>
+			<xs:documentation>Re-usable group providing a choice of scalar data types</xs:documentation>
+		</xs:annotation>
+		<xs:choice>
+			<xs:group ref="swe:AnyNumerical"/>
+			<xs:element ref="swe:Boolean"/>
+			<xs:element ref="swe:Category"/>
+			<xs:element ref="swe:Text"/>
+		</xs:choice>
+	</xs:group>
+	<!-- ........ -->
+	<xs:complexType name="AnyScalarPropertyType">
+		<xs:annotation>
+			<xs:documentation>Complex Type for all properties taking the AnyScalar Group</xs:documentation>
+		</xs:annotation>
+		<xs:group ref="swe:AnyScalar" minOccurs="0"/>
+		<xs:attribute name="name" type="xs:token" use="required"/>
+		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</xs:complexType>
+	<!-- ================================================= -->
+	<xs:group name="AnyNumerical">
+		<xs:annotation>
+			<xs:documentation>Re-usable group providing a choice of numeric data types</xs:documentation>
+		</xs:annotation>
+		<xs:choice>
+			<xs:element ref="swe:Count"/>
+			<xs:element ref="swe:Quantity"/>
+			<xs:element ref="swe:Time"/>
+		</xs:choice>
+	</xs:group>
+	<!-- ........ -->
+	<xs:group name="AnyRange">
+		<xs:annotation>
+			<xs:documentation>Re-usable group providing a choice of range data types</xs:documentation>
+		</xs:annotation>
+		<xs:choice>
+			<xs:element ref="swe:QuantityRange"/>
+			<xs:element ref="swe:CountRange"/>
+			<xs:element ref="swe:TimeRange"/>
+		</xs:choice>
+	</xs:group>
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/swe.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/swe.xsd
new file mode 100755
index 0000000..ca00a78
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/swe.xsd
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.opengis.net/swe/1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<xs:annotation>
+		<xs:documentation>swe document root definition
+			
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</xs:documentation>
+	</xs:annotation>
+	<!--========================-->
+	<!--   <xs:include schemaLocation="./basicTypes.xsd"/>  included by simpleTypes.xsd -->
+	<!--   <xs:include schemaLocation="./simpleTypes.xsd"/> included by aggregateTypes.xsd -->
+	<!--   <xs:include schemaLocation="./aggregateTypes.xsd"/> included by positionTypes, curveTypes and data -->
+	<xs:include schemaLocation="./positionTypes.xsd"/>
+	<xs:include schemaLocation="./curveTypes.xsd"/>
+	<xs:include schemaLocation="./data.xsd"/>
+	<xs:include schemaLocation="./temporalAggregates.xsd"/>
+	<xs:include schemaLocation="./phenomenon.xsd"/>
+	<xs:include schemaLocation="./xmlData.xsd"/>
+	<!--========================-->
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/temporalAggregates.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/temporalAggregates.xsd
new file mode 100755
index 0000000..093df59
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/temporalAggregates.xsd
@@ -0,0 +1,265 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:swe="http://www.opengis.net/swe/1.0.1" targetNamespace="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.1.2">
+	<annotation>
+		<documentation>temporalAggregates.xsd
+			
+	time geometric complex, time aggregates and time grids
+	
+	Copyright (c) 2007,2010 Open Geospatial Consortium.
+	To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<!-- bring in other schemas -->
+	<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
+	<include schemaLocation="./swe.xsd"/>
+	<!-- ================================================================== -->
+	<!-- =========================================================== -->
+	<!-- ============================================================== -->
+	<simpleType name="TimeValueList">
+	<annotation><documentation>Compact list of time instants, following gml:posList pattern. </documentation></annotation>
+		<list itemType="gml:TimePositionUnion"/>
+	</simpleType>
+	<!-- ====================================================================== -->
+	<complexType name="TimePositionListType">
+		<annotation>
+			<documentation>TimePositionList instances hold a sequence of time positions within the same frame.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="swe:TimeValueList">
+				<attribute name="frame" type="anyURI" use="optional" default="#ISO-8601"/>
+				<attribute name="calendarEraName" type="string" use="optional"/>
+				<attribute name="indeterminatePosition" type="gml:TimeIndeterminateValueType" use="optional"/>
+				<attribute name="count" type="positiveInteger" use="optional">
+					<annotation>
+						<documentation>"count" allows to specify the number of direct positions in the list. </documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- ===== Missing property types ====== -->
+	<!-- ================================================================== -->
+	<complexType name="TimeGeometricPrimitivePropertyType">
+	<annotation><documentation>Property type not provided by GML</documentation></annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_TimeGeometricPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ===== Time geometric complexes ====== -->
+	<!-- ================================================================== -->
+	<complexType name="TimeGeometricComplexType">
+	<annotation><documentation>Explicit implementation of ISO 19108 TM_GeometricComplex - a self-consistent set of TimeInstants and TimePeriods</documentation></annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeComplexType">
+					<sequence>
+							<element name="primitive" type="swe:TimeGeometricPrimitivePropertyType" maxOccurs="unbounded">
+								<annotation>
+									<documentation>Reference to an identified time primitive</documentation>
+								</annotation>
+							</element>
+					</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ......................... -->
+	<element name="TimeGeometricComplex" type="swe:TimeGeometricComplexType" substitutionGroup="gml:_TimeComplex">
+	<annotation><documentation>Explicit implementation of ISO 19108 TM_GeometricComplex - a self-consistent set of TimeInstants and TimePeriods</documentation></annotation>
+	</element>
+	<!-- ......................... -->
+	<complexType name="TimeGeometricComplexPropertyType">
+		<sequence minOccurs="0">
+			<element ref="swe:TimeGeometricComplex"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ===================================== -->
+	<!-- ===== Time aggregates ====== -->
+	<!-- ================================================================== -->
+	<!-- ===== Explicit time aggregates ====== -->
+	<!-- ================================================================== -->
+	<complexType name="TimeObjectPropertyType">
+	<annotation><documentation>Property type not provided by GML</documentation></annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_TimeObject"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeAggregateType">
+		<annotation>
+			<documentation>an arbitrary set of TimeObjects, often TimeInstants and TimePeriods</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType">
+				<sequence>
+					<element name="member" type="swe:TimeObjectPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ......................... -->
+	<element name="TimeAggregate" type="swe:TimeAggregateType" substitutionGroup="gml:_TimeObject">
+		<annotation>
+			<documentation>an arbitrary set of TimeObjects, often TimeInstants and TimePeriods</documentation>
+		</annotation>
+	</element>
+	<!-- ......................... -->
+	<complexType name="TimeAggregatePropertyType">
+		<sequence minOccurs="0">
+			<element ref="swe:TimeAggregate"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ===================================== -->
+	<!-- ===== Implicit time aggregates ====== -->
+	<!-- ================================================================== -->
+	<complexType name="TimeGridType">
+		<annotation>
+			<documentation>A set of uniformly spaced time instants described using an implicit notation.
+      Follow pattern of (ISO 19123) spatial grids: 
+  these have (dimension,axisName,extent(,origin,offsetVector))
+  For temporal case, dimension is fixed (1), axisName is fixed ("time")</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeComplexType">
+				<sequence>
+					<element name="extent" type="swe:TimeGridEnvelopePropertyType"/>
+					<choice>
+						<element name="originPos" type="gml:TimePositionType">
+							<annotation>
+								<documentation>Simple-content time position</documentation>
+							</annotation>
+						</element>
+						<element name="origin" type="gml:TimeInstantPropertyType">
+							<annotation>
+								<documentation>Reference to an identified time instant</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<choice>
+						<element name="offsetDuration" type="duration">
+							<annotation>
+								<documentation>XML Schema built-in simple type for duration: e.g. 
+                P1Y (1 year) 
+                P1M (1 month) 
+                P1DT12H (1 day 12 hours) 
+                PT5M (5 minutes) 
+                PT0.007S (7 milliseconds)</documentation>
+							</annotation>
+						</element>
+						<element name="offsetInterval" type="gml:TimeIntervalLengthType">
+							<annotation>
+								<documentation>representation of the ISO 11404 model of a time interval length: e.g. 
+                value=1, unit="year"  
+                value=1, unit="other:month" (or see next)
+                value=1, unit="year" radix="12" factor="1" (1/12 year)
+                value=1.5, unit="day"  
+                value=36, unit="hour" 
+                value=5, unit="minute"  
+                value=7, unit="second" radix="10" factor="3" (7 milliseconds)</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="duration" type="duration" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ......................... -->
+	<element name="TimeGrid" type="swe:TimeGridType" abstract="true" substitutionGroup="gml:_TimeComplex">
+		<annotation>
+			<documentation>A set of uniformly spaced time instants described using an implicit notation
+			      Follow pattern of (ISO 19123) spatial grids: 
+  these have (dimension,axisName,extent(,origin,offsetVector))
+  For temporal case, dimension is fixed (1), axisName is fixed ("time")</documentation>
+		</annotation>
+	</element>
+	<!-- ......................... -->
+	<complexType name="TimeGridPropertyType">
+		<sequence minOccurs="0">
+			<element ref="swe:TimeInstantGrid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="TimeGridEnvelopePropertyType">
+		<sequence>
+			<element name="TimeGridEnvelope">
+				<annotation>
+					<documentation>Grid extent specified in grid coordinates - i.e. 2 integers</documentation>
+				</annotation>
+				<complexType>
+					<sequence>
+						<element name="low" type="integer"/>
+						<element name="high" type="integer"/>
+					</sequence>
+				</complexType>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeInstantGridType">
+		<annotation>
+			<documentation>Extend time instant grid with window size property</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="swe:TimeGridType">
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ......................... -->
+	<element name="TimeInstantGrid" type="swe:TimeInstantGridType" substitutionGroup="swe:TimeGrid">
+		<annotation>
+			<documentation>A set of uniformly spaced time instants described using an implicit notation</documentation>
+		</annotation>
+	</element>
+	<!-- ......................... -->
+	<complexType name="TimeInstantGridPropertyType">
+		<sequence minOccurs="0">
+			<element ref="swe:TimeInstantGrid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeIntervalGridType">
+		<annotation>
+			<documentation>Extend time instant grid with window size property</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="swe:TimeGridType">
+				<sequence>
+					<choice>
+						<element name="windowDuration" type="duration">
+							<annotation>
+								<documentation>XML Schema built-in simple type for duration</documentation>
+							</annotation>
+						</element>
+						<element name="windowInterval" type="gml:TimeIntervalLengthType">
+							<annotation>
+								<documentation>representation of the ISO 11404 model of a time interval length</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ......................... -->
+	<element name="TimeIntervalGrid" type="swe:TimeIntervalGridType" substitutionGroup="swe:TimeGrid">
+		<annotation>
+			<documentation>A set of uniformly spaced time intervals described using an implicit notation</documentation>
+		</annotation>
+	</element>
+	<!-- ......................... -->
+	<complexType name="TimeIntervalGridPropertyType">
+		<sequence minOccurs="0">
+			<element ref="swe:TimeIntervalGrid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/xmlData.xsd b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/xmlData.xsd
new file mode 100755
index 0000000..940126f
--- /dev/null
+++ b/interface/nbproject/private/retriever/schemas.opengis.net/sweCommon/1.0.1/xmlData.xsd
@@ -0,0 +1,117 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:swe="http://www.opengis.net/swe/1.0.1"
+        targetNamespace="http://www.opengis.net/swe/1.0.1" elementFormDefault="qualified" attributeFormDefault="unqualified"
+        version="1.0.1.2">
+	<annotation>
+		<documentation>A basic schema for XML-tagged data aggregates (Records and Arrays), using terminology consistent with ISO 11404. 
+			
+			Copyright (c) 2007,2010 Open Geospatial Consortium.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ============== -->
+	<include schemaLocation="./swe.xsd"/>
+	<!-- ============== -->
+	<element name="Item">
+		<annotation>
+			<documentation>An Item is an item of data of any type</documentation>
+		</annotation>
+	</element>
+	<!-- ......  ...... -->
+	<complexType name="ItemPropertyType">
+		<sequence>
+			<element ref="swe:Item"/>
+		</sequence>
+	</complexType>
+	<!-- ============== -->
+	<!-- ============== -->
+	<complexType name="RecordType">
+		<annotation>
+			<documentation>A record is a list of fields</documentation>
+		</annotation>
+		<sequence>
+			<element name="field" type="swe:ItemPropertyType" maxOccurs="unbounded">
+				<annotation>
+					<documentation>A Record/field contains an item of data</documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="RS" type="anyURI" use="optional">
+			<annotation>
+				<documentation>Optional pointer to record-type schema</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="fieldCount" type="positiveInteger" use="optional">
+			<annotation>
+				<documentation>Optional count of the number of fields in the record. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- ......  ...... -->
+	<element name="Record" type="swe:RecordType">
+		<annotation>
+			<documentation>A record is a list of fields</documentation>
+		</annotation>
+	</element>
+	<!-- ......  ...... -->
+	<complexType name="RecordPropertyType">
+		<sequence>
+			<element ref="swe:Record"/>
+		</sequence>
+	</complexType>
+	<!-- ============== -->
+	<!-- ============== -->
+	<complexType name="ArrayType">
+		<annotation>
+			<documentation>An array is an indexed set of records of homogeneous type</documentation>
+		</annotation>
+		<sequence>
+			<element name="element" type="swe:XMLDataPropertyType" maxOccurs="unbounded">
+				<annotation>
+					<documentation>An Array/element contains an Item or a Record or an Array</documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="RS" type="anyURI" use="optional">
+			<annotation>
+				<documentation>Optional pointer to the record-type schema. This should be used when the elements of the array are Records</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="elementCount" type="positiveInteger" use="optional">
+			<annotation>
+				<documentation>Optional count of the number of elements in the array. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- ......  ...... -->
+	<element name="Array" type="swe:ArrayType">
+		<annotation>
+			<documentation>An array is an indexed set of records of homogeneous type</documentation>
+		</annotation>
+	</element>
+	<!-- ......  ...... -->
+	<complexType name="ArrayPropertyType">
+		<sequence>
+			<element ref="swe:Array"/>
+		</sequence>
+	</complexType>
+	<!-- ============== -->
+	<complexType name="XMLDataPropertyType">
+		<annotation>
+			<documentation>Choice of Item or Record or Array - used in composing Arrays</documentation>
+		</annotation>
+		<group ref="swe:XMLData"/>
+	</complexType>
+	<!-- ============== -->
+	<group name="XMLData">
+		<annotation>
+			<documentation>Convenience group that bundles all the soft-typed XML-encoded aggregates into a choice group</documentation>
+		</annotation>
+		<choice>
+			<element ref="swe:Item"/>
+			<element ref="swe:Record"/>
+			<element ref="swe:Array"/>
+		</choice>
+	</group>
+	<!-- ============== -->
+</schema>
diff --git a/interface/nbproject/private/retriever/www.w3.org/1999/xlink b/interface/nbproject/private/retriever/www.w3.org/1999/xlink
new file mode 100755
index 0000000..58881fc
--- /dev/null
+++ b/interface/nbproject/private/retriever/www.w3.org/1999/xlink
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html lang="en">
+<head>
+  <title>XLink namespace</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+  <link rel="stylesheet" type="text/css"
+        href="http://www.w3.org/StyleSheets/TR/base.css">
+</head>
+<body>
+<div class="head">
+<p><a href="http://www.w3.org/"><img class="head"
+src="http://www.w3.org/Icons/WWW/w3c_home.gif" alt="W3C"></a></p>
+</div>
+<p>
+This is an XML namespace defined in the 
+<a href="http://www.w3.org/TR/xlink/">XML Linking Language (XLink) specification</a>.
+</p>
+<p>
+For more information about XML, please refer to <a
+href="http://www.w3.org/TR/REC-xml">The Extensible Markup Language
+(XML) 1.0 specification</a>. For more information about XML
+namespaces, please refer to the
+<a href="http://www.w3.org/TR/REC-xml-names">Namespaces in XML
+specification</a>.
+
+<hr>
+<address>
+  <a href="/Help/Webmaster">Webmaster</a><BR>
+  Last modified: $Date: 2000/06/22 15:15:22 $
+</address>
+</body>
+</html>
diff --git a/interface/nbproject/private/retriever/www.w3.org/1999/xlink.xsd b/interface/nbproject/private/retriever/www.w3.org/1999/xlink.xsd
new file mode 100755
index 0000000..bc7f31e
--- /dev/null
+++ b/interface/nbproject/private/retriever/www.w3.org/1999/xlink.xsd
@@ -0,0 +1,270 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink">
+ 
+ <xs:annotation>
+  <xs:documentation>This schema document provides attribute declarations and
+attribute group, complex type and simple type definitions which can be used in
+the construction of user schemas to define the structure of particular linking
+constructs, e.g.
+<![CDATA[
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns:xl="http://www.w3.org/1999/xlink">
+
+ <xs:import namespace="http://www.w3.org/1999/xlink"
+            location="http://www.w3.org/1999/xlink.xsd">
+
+ <xs:element name="mySimple">
+  <xs:complexType>
+   ...
+   <xs:attributeGroup ref="xl:simpleAttrs"/>
+   ...
+  </xs:complexType>
+ </xs:element>
+ ...
+</xs:schema>]]></xs:documentation>
+ </xs:annotation>
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <xs:attribute name="type" type="xlink:typeType"/>
+
+ <xs:simpleType name="typeType">
+  <xs:restriction base="xs:token">
+   <xs:enumeration value="simple"/>
+   <xs:enumeration value="extended"/>
+   <xs:enumeration value="title"/>
+   <xs:enumeration value="resource"/>
+   <xs:enumeration value="locator"/>
+   <xs:enumeration value="arc"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="href" type="xlink:hrefType"/>
+
+ <xs:simpleType name="hrefType">
+  <xs:restriction base="xs:anyURI"/>
+ </xs:simpleType>
+
+ <xs:attribute name="role" type="xlink:roleType"/>
+
+ <xs:simpleType name="roleType">
+  <xs:restriction base="xs:anyURI">
+   <xs:minLength value="1"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="arcrole" type="xlink:arcroleType"/>
+
+ <xs:simpleType name="arcroleType">
+  <xs:restriction base="xs:anyURI">
+   <xs:minLength value="1"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="title" type="xlink:titleAttrType"/>
+
+ <xs:simpleType name="titleAttrType">
+  <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+
+ <xs:attribute name="show" type="xlink:showType"/>
+
+ <xs:simpleType name="showType">
+  <xs:restriction base="xs:token">
+   <xs:enumeration value="new"/>
+   <xs:enumeration value="replace"/>
+   <xs:enumeration value="embed"/>
+   <xs:enumeration value="other"/>
+   <xs:enumeration value="none"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="actuate" type="xlink:actuateType"/>
+
+ <xs:simpleType name="actuateType">
+  <xs:restriction base="xs:token">
+   <xs:enumeration value="onLoad"/>
+   <xs:enumeration value="onRequest"/>
+   <xs:enumeration value="other"/>
+   <xs:enumeration value="none"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="label" type="xlink:labelType"/>
+
+ <xs:simpleType name="labelType">
+  <xs:restriction base="xs:NCName"/>
+ </xs:simpleType>
+
+ <xs:attribute name="from" type="xlink:fromType"/>
+
+ <xs:simpleType name="fromType">
+  <xs:restriction base="xs:NCName"/>
+ </xs:simpleType>
+
+ <xs:attribute name="to" type="xlink:toType"/>
+
+ <xs:simpleType name="toType">
+  <xs:restriction base="xs:NCName"/>
+ </xs:simpleType>
+
+ <xs:attributeGroup name="simpleAttrs">
+  <xs:attribute ref="xlink:type" fixed="simple"/>
+  <xs:attribute ref="xlink:href"/>
+  <xs:attribute ref="xlink:role"/>
+  <xs:attribute ref="xlink:arcrole"/>
+  <xs:attribute ref="xlink:title"/>
+  <xs:attribute ref="xlink:show"/>
+  <xs:attribute ref="xlink:actuate"/>
+ </xs:attributeGroup>
+
+ <xs:group name="simpleModel">
+  <xs:sequence>
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType mixed="true" name="simple">
+  <xs:annotation>
+   <xs:documentation>
+    Intended for use as the type of user-declared elements to make them
+    simple links.
+   </xs:documentation>
+  </xs:annotation>
+  <xs:group ref="xlink:simpleModel"/>
+  <xs:attributeGroup ref="xlink:simpleAttrs"/>
+ </xs:complexType>
+
+ <xs:attributeGroup name="extendedAttrs">
+  <xs:attribute ref="xlink:type" fixed="extended" use="required"/>
+  <xs:attribute ref="xlink:role"/>
+  <xs:attribute ref="xlink:title"/>
+ </xs:attributeGroup>
+
+ <xs:group name="extendedModel">
+   <xs:choice>
+    <xs:element ref="xlink:title"/>
+    <xs:element ref="xlink:resource"/>
+    <xs:element ref="xlink:locator"/>
+    <xs:element ref="xlink:arc"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:complexType name="extended">
+  <xs:annotation>
+   <xs:documentation>
+    Intended for use as the type of user-declared elements to make them
+    extended links.
+    Note that the elements referenced in the content model are all abstract.
+    The intention is that by simply declaring elements with these as their
+    substitutionGroup, all the right things will happen.
+   </xs:documentation>
+  </xs:annotation>
+  <xs:group ref="xlink:extendedModel" minOccurs="0" maxOccurs="unbounded"/>
+  <xs:attributeGroup ref="xlink:extendedAttrs"/>
+ </xs:complexType>
+
+ <xs:element name="title" type="xlink:titleEltType" abstract="true"/>
+
+ <xs:attributeGroup name="titleAttrs">
+  <xs:attribute ref="xlink:type" fixed="title" use="required"/>
+  <xs:attribute ref="xml:lang">
+   <xs:annotation>
+    <xs:documentation>
+     xml:lang is not required, but provides much of the
+     motivation for title elements in addition to attributes, and so
+     is provided here for convenience.
+    </xs:documentation>
+   </xs:annotation>
+  </xs:attribute>
+ </xs:attributeGroup>
+
+ <xs:group name="titleModel">
+  <xs:sequence>
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType mixed="true" name="titleEltType">
+  <xs:group ref="xlink:titleModel"/>
+  <xs:attributeGroup ref="xlink:titleAttrs"/>
+ </xs:complexType>
+
+ <xs:element name="resource" type="xlink:resourceType" abstract="true"/>
+
+ <xs:attributeGroup name="resourceAttrs">
+  <xs:attribute ref="xlink:type" fixed="resource" use="required"/>
+  <xs:attribute ref="xlink:role"/>
+  <xs:attribute ref="xlink:title"/>
+  <xs:attribute ref="xlink:label"/>
+ </xs:attributeGroup>
+
+ <xs:group name="resourceModel">
+  <xs:sequence>
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType mixed="true" name="resourceType">
+  <xs:group ref="xlink:resourceModel"/>
+  <xs:attributeGroup ref="xlink:resourceAttrs"/>
+ </xs:complexType>
+
+ <xs:element name="locator" type="xlink:locatorType" abstract="true"/>
+
+ <xs:attributeGroup name="locatorAttrs">
+  <xs:attribute ref="xlink:type" fixed="locator" use="required"/>
+  <xs:attribute ref="xlink:href" use="required"/>
+  <xs:attribute ref="xlink:role"/>
+  <xs:attribute ref="xlink:title"/>
+  <xs:attribute ref="xlink:label">
+   <xs:annotation>
+    <xs:documentation>
+     label is not required, but locators have no particular
+     XLink function if they are not labeled.
+    </xs:documentation>
+   </xs:annotation>
+  </xs:attribute>
+ </xs:attributeGroup>
+
+ <xs:group name="locatorModel">
+  <xs:sequence>
+   <xs:element ref="xlink:title" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType name="locatorType">
+  <xs:group ref="xlink:locatorModel"/>
+  <xs:attributeGroup ref="xlink:locatorAttrs"/>
+ </xs:complexType>
+
+ <xs:element name="arc" type="xlink:arcType" abstract="true"/>
+
+ <xs:attributeGroup name="arcAttrs">
+  <xs:attribute ref="xlink:type" fixed="arc" use="required"/>
+  <xs:attribute ref="xlink:arcrole"/>
+  <xs:attribute ref="xlink:title"/>
+  <xs:attribute ref="xlink:show"/>
+  <xs:attribute ref="xlink:actuate"/>
+  <xs:attribute ref="xlink:from"/>
+  <xs:attribute ref="xlink:to">
+   <xs:annotation>
+    <xs:documentation>
+     from and to have default behavior when values are missing
+    </xs:documentation>
+   </xs:annotation>
+  </xs:attribute>
+ </xs:attributeGroup>
+
+ <xs:group name="arcModel">
+  <xs:sequence>
+   <xs:element ref="xlink:title" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType name="arcType">
+  <xs:group ref="xlink:arcModel"/>
+  <xs:attributeGroup ref="xlink:arcAttrs"/>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/interface/nbproject/private/retriever/www.w3.org/2001/xml.xsd b/interface/nbproject/private/retriever/www.w3.org/2001/xml.xsd
new file mode 100755
index 0000000..aea7d0d
--- /dev/null
+++ b/interface/nbproject/private/retriever/www.w3.org/2001/xml.xsd
@@ -0,0 +1,287 @@
+<?xml version='1.0'?>
+<?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" 
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns   ="http://www.w3.org/1999/xhtml"
+  xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   <div>
+    <h1>About the XML namespace</h1>
+
+    <div class="bodytext">
+     <p>
+      This schema document describes the XML namespace, in a form
+      suitable for import by other schema documents.
+     </p>
+     <p>
+      See <a href="http://www.w3.org/XML/1998/namespace.html">
+      http://www.w3.org/XML/1998/namespace.html</a> and
+      <a href="http://www.w3.org/TR/REC-xml">
+      http://www.w3.org/TR/REC-xml</a> for information 
+      about this namespace.
+     </p>
+     <p>
+      Note that local names in this namespace are intended to be
+      defined only by the World Wide Web Consortium or its subgroups.
+      The names currently defined in this namespace are listed below.
+      They should not be used with conflicting semantics by any Working
+      Group, specification, or document instance.
+     </p>
+     <p>   
+      See further below in this document for more information about <a
+      href="#usage">how to refer to this schema document from your own
+      XSD schema documents</a> and about <a href="#nsversioning">the
+      namespace-versioning policy governing this schema document</a>.
+     </p>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>lang (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose value
+       is a language code for the natural language of the content of
+       any element; its value is inherited.  This name is reserved
+       by virtue of its definition in the XML specification.</p>
+     
+    </div>
+    <div>
+     <h4>Notes</h4>
+     <p>
+      Attempting to install the relevant ISO 2- and 3-letter
+      codes as the enumerated possible values is probably never
+      going to be a realistic possibility.  
+     </p>
+     <p>
+      See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
+       http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
+      and the IANA language subtag registry at
+      <a href="http://www.iana.org/assignments/language-subtag-registry">
+       http://www.iana.org/assignments/language-subtag-registry</a>
+      for further information.
+     </p>
+     <p>
+      The union allows for the 'un-declaration' of xml:lang with
+      the empty string.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:union memberTypes="xs:language">
+    <xs:simpleType>    
+     <xs:restriction base="xs:string">
+      <xs:enumeration value=""/>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:union>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>space (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose
+       value is a keyword indicating what whitespace processing
+       discipline is intended for the content of the element; its
+       value is inherited.  This name is reserved by virtue of its
+       definition in the XML specification.</p>
+     
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+ 
+ <xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>base (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose value
+       provides a URI to be used as the base for interpreting any
+       relative URIs in the scope of the element on which it
+       appears; its value is inherited.  This name is reserved
+       by virtue of its definition in the XML Base specification.</p>
+     
+     <p>
+      See <a
+      href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
+      for information about this attribute.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+ 
+ <xs:attribute name="id" type="xs:ID">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>id (as an attribute name)</h3> 
+      <p>
+       denotes an attribute whose value
+       should be interpreted as if declared to be of type ID.
+       This name is reserved by virtue of its definition in the
+       xml:id specification.</p>
+     
+     <p>
+      See <a
+      href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
+      for information about this attribute.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+  <xs:attribute ref="xml:id"/>
+ </xs:attributeGroup>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div>
+   
+    <h3>Father (in any context at all)</h3> 
+
+    <div class="bodytext">
+     <p>
+      denotes Jon Bosak, the chair of 
+      the original XML Working Group.  This name is reserved by 
+      the following decision of the W3C XML Plenary and 
+      XML Coordination groups:
+     </p>
+     <blockquote>
+       <p>
+	In appreciation for his vision, leadership and
+	dedication the W3C XML Plenary on this 10th day of
+	February, 2000, reserves for Jon Bosak in perpetuity
+	the XML name "xml:Father".
+       </p>
+     </blockquote>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div xml:id="usage" id="usage">
+    <h2><a name="usage">About this schema document</a></h2>
+
+    <div class="bodytext">
+     <p>
+      This schema defines attributes and an attribute group suitable
+      for use by schemas wishing to allow <code>xml:base</code>,
+      <code>xml:lang</code>, <code>xml:space</code> or
+      <code>xml:id</code> attributes on elements they define.
+     </p>
+     <p>
+      To enable this, such a schema must import this schema for
+      the XML namespace, e.g. as follows:
+     </p>
+     <pre>
+          <schema . . .>
+           . . .
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+     </pre>
+     <p>
+      or
+     </p>
+     <pre>
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+     </pre>
+     <p>
+      Subsequently, qualified reference to any of the attributes or the
+      group defined below will have the desired effect, e.g.
+     </p>
+     <pre>
+          <type . . .>
+           . . .
+           <attributeGroup ref="xml:specialAttrs"/>
+     </pre>
+     <p>
+      will define a type which will schema-validate an instance element
+      with any of those attributes.
+     </p>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div id="nsversioning" xml:id="nsversioning">
+    <h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
+    <div class="bodytext">
+     <p>
+      In keeping with the XML Schema WG's standard versioning
+      policy, this schema document will persist at
+      <a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd</a>.
+     </p>
+     <p>
+      At the date of issue it can also be found at
+      <a href="http://www.w3.org/2001/xml.xsd">
+       http://www.w3.org/2001/xml.xsd</a>.
+     </p>
+     <p>
+      The schema document at that URI may however change in the future,
+      in order to remain compatible with the latest version of XML
+      Schema itself, or with the XML namespace itself.  In other words,
+      if the XML Schema or XML namespaces change, the version of this
+      document at <a href="http://www.w3.org/2001/xml.xsd">
+       http://www.w3.org/2001/xml.xsd 
+      </a> 
+      will change accordingly; the version at 
+      <a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd 
+      </a> 
+      will not change.
+     </p>
+     <p>
+      Previous dated (and unchanging) versions of this schema 
+      document are at:
+     </p>
+     <ul>
+      <li><a href="http://www.w3.org/2009/01/xml.xsd">
+	http://www.w3.org/2009/01/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2007/08/xml.xsd">
+	http://www.w3.org/2007/08/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2004/10/xml.xsd">
+	http://www.w3.org/2004/10/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2001/03/xml.xsd">
+	http://www.w3.org/2001/03/xml.xsd</a></li>
+     </ul>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+</xs:schema>
+
diff --git a/interface/nbproject/project.properties b/interface/nbproject/project.properties
new file mode 100755
index 0000000..94429c9
--- /dev/null
+++ b/interface/nbproject/project.properties
@@ -0,0 +1,7 @@
+include.path=${php.global.include.path}
+php.version=PHP_53
+source.encoding=UTF-8
+src.dir=.
+tags.asp=false
+tags.short=true
+web.root=.
diff --git a/interface/nbproject/project.xml b/interface/nbproject/project.xml
new file mode 100755
index 0000000..0d11ad0
--- /dev/null
+++ b/interface/nbproject/project.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.php.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/php-project/1">
+            <name>istSOS 2</name>
+        </data>
+    </configuration>
+</project>
diff --git a/interface/poster.html b/interface/poster.html
new file mode 100755
index 0000000..6da29ec
--- /dev/null
+++ b/interface/poster.html
@@ -0,0 +1,357 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+    <head>
+        <title>istSOS Poster</title>
+        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
+        <style type="text/css">
+            body {
+                padding: 0;
+                margin: 0;
+                background-color: #fff;
+                color: #000;
+            }
+
+            #content {
+                margin-top: 10px;
+                margin-right: 20px;
+                margin-left: 20px;
+                width: 95%;
+                font-family: Verdana, Arial, Helvetica, sans-serif;
+            }
+
+            #header {
+                position: relative;
+                height: 80px;
+                margin-bottom: 20px;
+            }
+
+            #healine {
+                position: absolute;
+                top: 0;
+                left: 0;
+            }
+
+            #logo {
+                position: absolute;
+                top: 0;
+                right: 0;
+            }
+
+            #url-form {
+                float: none;
+                margin-top: 8em;
+            }
+
+            #requestTextarea {
+                width: 100%;
+                height: 250px;
+                padding: 2px;
+            }
+
+            #requestGetInput {
+                width: 100%;
+                height: 40px;
+                padding: 1px;
+            }
+
+            h1, .title {
+                color: #5D5D49;
+                font-size: 20pt;
+                margin-right: 6pt;
+            }
+
+            h3 {
+                color: #5D5D49;
+                font-size: 12pt;
+                font-weight: bold;
+            }
+
+            .infotext {
+                color: #5D5D49;
+                font-size: 10pt;
+            }
+
+            .request-form {
+                margin-bottom: 12px;
+            }
+
+            .request-form-buttons {
+                margin: 6px;
+            }
+        </style>
+        <script language="JavaScript" type="text/javascript">
+
+            var datafolder = window.location.href.substring(0,
+            window.location.href.lastIndexOf("/") + 1) +
+                "requests/";
+            
+            var lastGetIdx = 0;
+            
+            
+            //alert(datafolder);
+            function load()
+            {
+                document.getElementById('adresa').value=window.location.origin + "/istsos/demo";
+                var placeholderIndex = "PLACEHOLDER";
+                //load files
+                var requests=new Array();
+                var j = 0;
+
+                // GET
+                requests[j]=["getCapabilities","request=getCapabilities&section=serviceidentification,serviceprovider,operationsmetadata,contents"];
+                j += 1;
+                requests[j]=["describeSensor","request=DescribeSensor&procedure=BELLINZONA&outputFormat=text/xml;subtype='sensorML/1.0.0'"];
+                j += 1;
+                requests[j]=["getObservation [SML]","request=GetObservation&offering=temporary&procedure=BELLINZONA&eventTime=2013-01-01T00:00:00+01/2013-01-07T00:00:00+01&observedProperty=rainfall,temperature,humidity,wind&responseFormat=text/xml;subtype='sensorML/1.0.0'&service=SOS&version=1.0.0"];
+                j += 1;
+                requests[j]=["getObservation [CSV]","request=GetObservation&offering=temporary&procedure=BELLINZONA&eventTime=2013-01-01T00:00:00+01/2013-01-07T00:00:00+01&observedProperty=rainfall,temperature,humidity,wind&responseFormat=text/plain&service=SOS&version=1.0.0"];
+                j += 1;
+                requests[j]=["getObservation [JSON]","request=GetObservation&offering=temporary&procedure=BELLINZONA&eventTime=2013-01-01T00:00:00+01/2013-01-07T00:00:00+01&observedProperty=rainfall,temperature,humidity,wind&responseFormat=application/json&service=SOS&version=1.0.0"];
+                j += 1;
+                requests[j]=["getObservationBBOX","request=GetObservation&offering=temporary&observedProperty=temperature&responseFormat=text/xml;subtype='sensorML/1.0.0'&service=SOS&version=1.0.0&featureOfInterest=<ogc:BBOX><ogc:PropertyName>the_geom</ogc:PropertyName><gml:Box srsName='EPSG:21781'><gml:coordinates>690549,82219 738549,134219</gml:coordinates></gml:Box></ogc:BBOX>"];
+                j += 1;
+                requests[j]=["getFeatureOfInterest","request=getFeatureOfInterest&featureOfInterest=LUGANO&srsName=900913"];
+		
+                lastGetIdx = j; 
+		
+                // POST
+                j += 1;		        
+                requests[j]=datafolder+"getCapabilities.xml";
+                j += 1;		        
+                requests[j]=datafolder+"describeSensor.xml";
+                j += 1;		        
+                requests[j]=datafolder+"getObservation.xml";
+                j += 1;		        
+                requests[j]=datafolder+"getObservation2.xml";
+                j += 1;		        
+                requests[j]=datafolder+"getObservation3.xml";
+                /*j += 1;		        
+                requests[j]=datafolder+"getObservationBBOX.xml";
+                j += 1;		        
+                requests[j]=datafolder+"getObservationDWithin.xml";
+                j += 1;		        
+                requests[j]=datafolder+"getObservationQualityIndex.xml";*/		        
+                j += 1;		        
+                requests[j]=datafolder+"getFeatureOfInterest.xml";
+                j += 1;		        
+                requests[j]=datafolder+"registerSensor_stationary_insitu_simple.xml";
+                j += 1;		        
+                requests[j]=datafolder+"registerSensor_stationary_insitu_composite.xml";
+                /*j += 1;		        
+                requests[j]=datafolder+"registerSensor_dynamic_insitu_simple.xml";
+                j += 1;		        
+                requests[j]=datafolder+"registerSensor_dynamic_insitu_composite.xml";
+                j += 1;		        
+                requests[j]=datafolder+"insertObservation_stationary_insitu_simple.xml";
+                j += 1;		        
+                requests[j]=datafolder+"insertObservation_stationary_insitu_composite.xml";
+                j += 1;		        
+                requests[j]=datafolder+"insertObservation_dynamic_insitu_simple.xml";
+                j += 1;		        
+                requests[j]=datafolder+"insertObservation_dynamic_insitu_composite.xml";*/
+		
+                //fill the select element
+                var selRequest = document.getElementById("selRequest");
+		
+                l = requests.length;
+		
+                for (var i=0; i<l; i++ ){
+                    var requestString = "";
+                    if(i <= lastGetIdx) {// Adding GET request
+                        selRequest.add(new Option("GET - " + requests[i][0], requests[i][1]), null);
+                    }
+                    else {// Adding POST request
+                        try {
+                            var name = requests[i].substring(requests[i].lastIndexOf("/") + 1, requests[i].length);
+                            selRequest.add(new Option("POST - " + name, requests[i]), null);
+                        } catch(err) {
+                            var txt="";
+                            txt+="Error loading file: " + requests[i];
+                            txt+="Error: " + err + "\n\n";
+                            var requestTextarea = document.getElementById('requestTextarea').value = "";
+                            requestTextarea.value+=txt;
+                        }
+                    }
+                }
+            }
+            function insertSelected() {
+                try {
+                    var selObj = document.getElementById('selRequest');
+                    var requestTextarea = document.getElementById('requestTextarea');
+                    var requestGetInput = document.getElementById('requestGetInput');
+                    var requestString = "";
+                    
+                    if(selObj.selectedIndex != 0){
+                        //console.log(selObj.selectedIndex + "-"+lastGetIdx);
+                        if(selObj.selectedIndex <= (lastGetIdx+1)){
+                            requestString = selObj.options[selObj.selectedIndex].value;
+                            requestTextarea.value = "";
+                            requestGetInput.value = requestString+"&service=SOS&version=1.0.0";
+                        }else{
+                            requestString = getFile(selObj.options[selObj.selectedIndex].value);
+                            if(requestString == null){
+                                requestString = "Error loading file!";
+                            }
+                            requestGetInput.value = "";
+                            requestTextarea.value = requestString;
+                        }
+                    }else{
+                        requestTextarea.value = requestString;
+                        requestGetInput.value = requestString;
+                    }
+                } catch(err) {
+                    var txt="";
+                    txt+="Error loading file: " + selObj.options[selObj.selectedIndex].value;
+                    txt+="Error: " + err + "\n\n";
+                    var requestTextarea = document.getElementById('requestTextarea').value = "";
+                    requestTextarea.value+=txt;
+                }
+            }
+            function getFile(fileName){
+                oxmlhttp = null;
+                try{
+                    oxmlhttp = new XMLHttpRequest();
+                    oxmlhttp.overrideMimeType("text/xml");
+                }
+                catch(e){
+                    try{
+                        oxmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+                    }
+                    catch(e){
+                        return null;
+                    }
+                }
+                if(!oxmlhttp) return null;
+                try{
+                    oxmlhttp.open("GET",fileName,false);
+                    oxmlhttp.send(null);
+                }
+                catch(e){
+                    return null;
+                }
+                return oxmlhttp.responseText;
+            }
+          	
+            var newPage = false;
+            function executeRequest(){
+                var selObj = document.getElementById('selRequest');
+                var requestform = document.getElementById('requestform');
+                if(selObj.selectedIndex != 0){
+                    if(selObj.selectedIndex <= (lastGetIdx+1)){
+                        var prms = document.getElementById("requestGetInput").value;
+                        prmArr = prms.split("&");
+                        prms = "";
+                        for(var c = 0; c < prmArr.length ; c++){
+                            avArr = prmArr[c].split("=");
+                            if(avArr.length==3){
+                                avArr = [avArr[0],avArr[1]+"="+avArr[2]]
+                            }
+                            avArr[1] = escape(avArr[1]);
+                            prms += avArr[0]+"="+avArr[1];
+                            if(c<(prmArr.length-1)){
+                                prms += "&";
+                            }
+                        }
+                        var url = document.getElementById('adresa').value+"?"+prms;
+                        if(newPage){
+                            window.open(url);
+                        }else{
+                            var frm = document.getElementById("outputframe");
+                            frm.src = url;
+                        }
+                        window.location.hash="DETAILS";
+                        return false;
+                    }else{
+                        if(!newPage){
+                            requestform.target = 'ServiceResponce'; 
+                        }else{
+                            requestform.target = '_blank';
+                        }
+                        requestform.action = document.getElementById('adresa').value;
+                        window.location.hash="DETAILS";
+                        return true; 
+                    }
+                }else{
+                    requestTextarea.value = requestString;
+                    requestGetInput.value = requestString;
+                }
+                return false;
+            }
+        </script>
+    </head>
+    <body bgcolor="#ffffff" text="#000000" onload="load()">
+        <a name="TOP"/>
+        <div id="content">
+            <div id="header">
+                <form name="requestform" onsubmit="return executeRequest()" id="requestform" method="post" action="" target='ServiceResponce'>
+                    <table>
+                        <tr>
+                            <td rowspan=3 style='padding-right:15px;'>
+                                <img
+                                    src="images/istsos-logo.png"
+                                    height="78"
+                                    border="0"/>
+                            </td>
+                            <td>
+                                URL:   <span> <input id='adresa' name="url"
+                                                               value="http://localhost/istsos/demo" size="50"
+                                                               type="text" /> </span>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <div>
+                                    Requests:<br>
+
+                                        <select id="selRequest"
+                                                onchange="insertSelected();">
+                                            <option value=" "></option>
+                                        </select>
+
+                                        <input value="Execute"
+                                               onclick="newPage=false;" type="submit" /> 
+
+                                        <input
+                                            value="Clear" name="reset" type="reset"
+                                            onclick="
+	                                        document.getElementById('selRequest').selectedIndex = 0;" />
+
+                                        <input value="Execute in new page"
+                                               onclick="newPage=true;" type="submit" /> 
+
+                                </div>
+                            </td>
+                        </tr>
+                    </table>
+                    <br>
+                        <small>GET parameters:</small><br>
+                            <textarea name="parameters" id="requestGetInput"></textarea>
+                            <!--<input id='requestGetInput' name="parameters"
+                                value="" 
+                                type="text" />-->
+                            <small>POST XML:</small><br>
+                                <div><textarea name="request" id="requestTextarea"></textarea></div>
+                                </form>
+                                <hr>
+                                    <table width="100%">
+                                        <tr>
+                                            <td align='left'>
+                                                <small><a name="DETAILS">Response:</a></small>
+                                            </td>
+                                            <td align='left'>
+                                                <STRONG><a href="#TOP">top</a></STRONG>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                    <iframe width="100%" height="500" id="outputframe" name='ServiceResponce'>
+                                        <p>Your browser does not support iframes.</p>
+                                    </iframe>
+                                    <br>
+                                        </div>
+                                        </div>
+                                        </body>
+                                        </html>
+
diff --git a/interface/requests/describeSensor.xml b/interface/requests/describeSensor.xml
new file mode 100755
index 0000000..9585396
--- /dev/null
+++ b/interface/requests/describeSensor.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:describeSensor
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" 
+   service="SOS" 
+   outputFormat="text/xml;subtype='sensorML/1.0.0'"> 
+    <procedure>P_LUGANO</procedure>
+</sos:describeSensor>
+
diff --git a/interface/requests/getCapabilities.xml b/interface/requests/getCapabilities.xml
new file mode 100755
index 0000000..548b185
--- /dev/null
+++ b/interface/requests/getCapabilities.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:GetCapabilities
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" 
+   version="1.0.0" service="SOS">
+    <section>serviceidentification</section>
+    <section>serviceprovider</section>
+    <section>operationsmetadata</section>
+    <section>contents</section>
+</sos:GetCapabilities>
diff --git a/interface/requests/getFeatureOfInterest.xml b/interface/requests/getFeatureOfInterest.xml
new file mode 100755
index 0000000..c9e5dae
--- /dev/null
+++ b/interface/requests/getFeatureOfInterest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:getfeatureOfinterest
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" service="SOS" outputFormat="text/xml;subtype='sensorML/1.0.0'"> 
+    <FeatureOfInterestId>urn:ogc:def:feature:x-istsos:1.0:Point:lugano</FeatureOfInterestId>
+    <srsName>4326</srsName>
+
+    <!-- See GetFeatureOfInterest operation description 
+    in the getCapabilities response to see available projection -->
+
+    <!-- Examples
+    <srsName>urn:ogc:crs:EPSG:21781</srsName>
+    <srsName>urn:ogc:crs:EPSG:4326</srsName>
+    <srsName>urn:ogc:crs:EPSG:8001</srsName>
+    -->
+    
+</sos:getfeatureOfinterest>
+
diff --git a/interface/requests/getObservation.xml b/interface/requests/getObservation.xml
new file mode 100755
index 0000000..32e4663
--- /dev/null
+++ b/interface/requests/getObservation.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:GetObservation
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" 
+   service="SOS" version='1.0.0'>
+    <!--
+        Get Observation time series: 
+            - in a time period + an instant (1-many Optional)
+            - of rainfall observed property
+            - from a specific procedure (stationary, in-situ) (1-many Optional)
+            - from an offering (1 mandatory)
+            
+    -->
+    <offering>urn:ogc:def:offering:x-istsos:1.0:temporary</offering>
+    <procedure>urn:ogc:def:procedure:x-istsos:1.0:BELLINZONA</procedure>
+    <eventTime>
+        <gml:TimePeriod>
+           <gml:beginPosition>2013-01-01T00:00:00+01:00</gml:beginPosition>
+           <gml:endPosition>2013-01-05T00:00:00+01:00</gml:endPosition>
+        </gml:TimePeriod>
+        <gml:TimeInstant>
+           <gml:timePosition>2013-01-07T00:00:00+01:00</gml:timePosition>
+        </gml:TimeInstant>
+    </eventTime>
+    <responseFormat>text/xml;subtype='sensorML/1.0.0'</responseFormat>
+    <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature</observedProperty>
+</sos:GetObservation>
+
diff --git a/interface/requests/getObservation2.xml b/interface/requests/getObservation2.xml
new file mode 100755
index 0000000..79823aa
--- /dev/null
+++ b/interface/requests/getObservation2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:GetObservation
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" 
+   service="SOS" version='1.0.0'>
+    <!--
+        Get an Observation: 
+            - in a given instant (1-many Optional)
+            - with EPSG code (1 Optional)
+            - from a specific procedure (stationary, in-situ) (1-many Optional)
+            - from an offering (1 Mandatory)
+    -->
+    <offering>urn:ogc:def:offering:x-istsos:1.0:temporary</offering>
+    <procedure>urn:ogc:def:procedure:x-istsos:1.0:BELLINZONA</procedure>
+
+    <eventTime>
+        <gml:TimeInstant>
+           <gml:timePosition>2013-01-07T00:00:00+01:00</gml:timePosition>
+        </gml:TimeInstant>
+    </eventTime>
+    <responseFormat>text/xml;subtype='sensorML/1.0.0'</responseFormat>
+    <srsName>urn:ogc:crs:EPSG:4326</srsName>
+    <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature</observedProperty>
+    <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall</observedProperty>
+    <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity:relative</observedProperty>
+    <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:meteo:air:wind:velocity</observedProperty>
+</sos:GetObservation>
+
diff --git a/interface/requests/getObservation3.xml b/interface/requests/getObservation3.xml
new file mode 100755
index 0000000..13e7f12
--- /dev/null
+++ b/interface/requests/getObservation3.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:GetObservation
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" 
+   service="SOS" version='1.0.0'>
+    <!--
+        Get an Observation: 
+            - last observation (omitting the optional eventTime definition)
+            - with EPSG code (1 Optional)
+            - from an offering (1 Mandatory)
+            - from a specific mobile procedure (1-many Optional)
+    -->
+    <offering>urn:ogc:def:offering:x-istsos:1.0:temporary</offering>
+    <procedure>urn:ogc:def:procedure:x-istsos:1.0:LOCARNO</procedure>
+    <eventTime>
+        <gml:TimeInstant>
+           <gml:timePosition>2013-01-07T00:00:00+01:00</gml:timePosition>
+        </gml:TimeInstant>
+    </eventTime>
+    <responseFormat>text/xml;subtype='sensorML/1.0.0'</responseFormat>
+    <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature</observedProperty>
+</sos:GetObservation>
+
+
+
diff --git a/interface/requests/getfeatureOfinterestBBOX.xml b/interface/requests/getfeatureOfinterestBBOX.xml
new file mode 100755
index 0000000..7ad2bef
--- /dev/null
+++ b/interface/requests/getfeatureOfinterestBBOX.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:GetObservation
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" 
+   service="SOS" version='1.0.0'>
+    <offering>urn:ogc:def:offering:istsos:1.0:temporary</offering>
+    <responseFormat>text/xml;subtype='sensorML/1.0.0'</responseFormat>
+    <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature</observedProperty>
+    <featureOfInterest>
+      <ogc:BBOX><ogc:PropertyName>the_geom</ogc:PropertyName><gml:Box srsName='epsg:21781'><gml:coordinates>717900 98520,717900 98520</gml:coordinates></gml:Box></ogc:BBOX>
+    </featureOfInterest>
+</sos:GetObservation>
diff --git a/interface/requests/getfeatureOfinterestId.xml b/interface/requests/getfeatureOfinterestId.xml
new file mode 100755
index 0000000..b92a4d5
--- /dev/null
+++ b/interface/requests/getfeatureOfinterestId.xml
@@ -0,0 +1,17 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <sos:getfeatureOfinterest
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" 
+   service="SOS" outputFormat="text/xml;subtype='sensorML/1.0.0'"> 
+	<featureOfInterest>urn:ogc:object:feature:x-istsos:1.01.0:LUGANO</featureOfInterest>
+	<srsName>4326</srsName>
+
+	<!-- See GetFeatureOfInterest operation description in the getCapabilities response to see available projection -->
+
+	<!-- Examples 	<srsName>urn:ogc:crs:EPSG:21781</srsName> <srsName>urn:ogc:crs:EPSG:4326</srsName> <srsName>urn:ogc:crs:EPSG:8001</srsName> -->
+
+ </sos:getfeatureOfinterest>
diff --git a/interface/requests/insertObservation_dynamic_insitu_composite.xml b/interface/requests/insertObservation_dynamic_insitu_composite.xml
new file mode 100755
index 0000000..2bdbd00
--- /dev/null
+++ b/interface/requests/insertObservation_dynamic_insitu_composite.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:InsertObservation
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sa="http://www.opengis.net/sampling/1.0"
+   xmlns:swe="http://www.opengis.net/swe/1.0.1"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" service="SOS" version="1.0.0" >
+   <AssignedSensorId>urn:ogc:object:sensor:x-istsos:1.0:???</AssignedSensorId>
+   <om:Observation>
+    <om:procedure xlink:href="urn:ogc:object:procedure:x-istsos:1.0:LimnoGPS1"/>
+    <om:samplingTime>
+      <gml:TimePeriod>
+        <gml:beginPosition>2010-02-10T16:10:00+01:00</gml:beginPosition>
+        <gml:endPosition>2010-02-10T18:00:00+01:00</gml:endPosition>
+        <gml:TimeLength>
+          <gml:duration>PT10M</gml:duration>
+          <gml:timeInterval unit="Min">10</gml:timeInterval>
+        </gml:TimeLength>
+      </gml:TimePeriod>
+    </om:samplingTime>
+    <om:observedProperty>
+      <swe:CompositPhenomenon dimension="6">
+            <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>  
+            <swe:component xlink:href="urn:ogc:crs:EPSG:21781:x-position"/>  
+            <swe:component xlink:href="urn:ogc:crs:EPSG:21781:y-position"/>  
+            <swe:component xlink:href="urn:ogc:crs:EPSG:21781:z-position"/>  
+            <swe:component xlink:href="urn:ogc:def:property:x-istsos:1.0:phosphorus_concentration" />   
+            <swe:component xlink:href="urn:ogc:def:property:x-istsos:1.0:nitrogen_concentration" />          
+      </swe:CompositPhenomenon>
+    </om:observedProperty>
+    <om:featureOfInterest xlink:href="urn:ogc:object:feature:x-istsos:1.0:station:CERESIO_LANCHETTA"/>
+      <om:result>
+          <swe:DataArray>
+            <swe:elementCount>
+              <swe:Count>
+                <swe:value>6</swe:value>
+              </swe:Count>
+            </swe:elementCount>
+            <swe:elementType name="SimpleDataArray" xlink:href="http://mmisw.org/ont/mmi/obs.owl/timeSeriesDataRecord">
+              <swe:DataRecord definition="http://mmiws.org/ont/x/timeSeries">
+                <swe:field name="Time">
+                  <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>
+                </swe:field>
+                <swe:field name="x-position">
+                    <swe:Quantity definition="urn:ogc:crs:EPSG:4326:x-position"/>
+                </swe:field>
+                <swe:field name="y-position">
+                    <swe:Quantity definition="urn:ogc:crs:EPSG:4326:y-position"/>
+                </swe:field>
+                <swe:field name="z-position">
+                    <swe:Quantity definition="urn:ogc:crs:EPSG:4326:z-position"/>
+                </swe:field>
+                <swe:field name="phosphorus_concentration">
+                    <swe:Quantity definition="urn:ogc:def:property:x-istsos:1.0:phosphorus_concentration">
+                       <swe:uom code="mg*P/m^3"/>
+                    </swe:Quantity>
+                </swe:field>
+                <swe:field name="nitrogen_concentration">
+                    <swe:Quantity definition="urn:ogc:def:property:x-istsos:1.0:nitrogen_concentration"/>
+                </swe:field>
+              </swe:DataRecord>
+            </swe:elementType>
+            <swe:encoding>
+              <swe:TextBlock tokenSeparator="," blockSeparator="@" decimalSeparator="."/>
+            </swe:encoding>
+            <swe:values>
+                2010-02-10T16:10:00+01:00,718309.05,95450.21,271,9.28,479@
+                2010-02-10T16:20:00+01:00,718299.97,95541.11,271,9.31,481@
+                2010-02-10T16:30:00+01:00,718436.30,95450.21,271,9.32,480@
+                2010-02-10T16:40:00+01:00,718518.11,95395.68,271,9.3,478@
+                2010-02-10T16:50:00+01:00,718436.30,95277.52,271,9.4,478@
+                2010-02-10T17:00:00+01:00,718490.84,95250.25,271,9.38,477@
+                2010-02-10T17:10:00+01:00,718481.75,95359.32,271,9.45,485@
+                2010-02-10T17:20:00+01:00,718690.80,95286.61,271,9.6,488@
+                2010-02-10T17:30:00+01:00,718536.29,95359.32,271,9.56,485@
+                2010-02-10T17:40:00+01:00,718499.93,95286.61,271,9.8,490@
+                2010-02-10T17:50:00+01:00,718481.75,95359.32,271,8.91,483@
+                2010-02-10T18:00:00+01:00,718554.46,95595.64,271,9.1,480
+            </swe:values>
+      </swe:DataArray>
+    </om:result>
+  </om:Observation>
+</sos:InsertObservation>
+
diff --git a/interface/requests/insertObservation_dynamic_insitu_simple.xml b/interface/requests/insertObservation_dynamic_insitu_simple.xml
new file mode 100755
index 0000000..79eab22
--- /dev/null
+++ b/interface/requests/insertObservation_dynamic_insitu_simple.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:InsertObservation
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sa="http://www.opengis.net/sampling/1.0"
+   xmlns:swe="http://www.opengis.net/swe/1.0.1"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" service="SOS" version="1.0.0" >
+   <AssignedSensorId>urn:ogc:object:sensor:x-istsos:1.0:???</AssignedSensorId>
+   <om:Observation>
+    <om:procedure xlink:href="urn:ogc:object:procedure:x-istsos:1.0:FOSS4G-IT:thermoGPS1"/>
+    <om:samplingTime>
+      <gml:TimePeriod>
+        <gml:beginPosition>2011-02-10T16:10:00+01:00</gml:beginPosition>
+        <gml:endPosition>2011-02-10T18:00:00+01:00</gml:endPosition>
+        <gml:TimeLength>
+          <gml:duration>PT1H50M</gml:duration>
+          <gml:timeInterval unit="Min">10</gml:timeInterval>
+        </gml:TimeLength>
+      </gml:TimePeriod>
+    </om:samplingTime>
+    <om:observedProperty>
+      <swe:CompositPhenomenon dimension="5">
+        <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>  
+        <swe:component xlink:href="urn:ogc:crs:EPSG:21781:x-position"/>  
+        <swe:component xlink:href="urn:ogc:crs:EPSG:21781:y-position"/>  
+        <swe:component xlink:href="urn:ogc:crs:EPSG:21781:z-position"/>  
+        <swe:component xlink:href="urn:ogc:def:property:x-istsos:1.0:water_surface_temperature" />      
+      </swe:CompositPhenomenon>
+    </om:observedProperty>
+    <om:featureOfInterest xlink:href="urn:ogc:object:feature:x-istsos:1.0:station:CERESIO_LANCHETTA"/>
+      <om:result>
+        <swe:DataArray>
+          <swe:elementCount>
+            <swe:Count>
+              <swe:value>5</swe:value>
+            </swe:Count>
+          </swe:elementCount>
+          <swe:elementType name="SimpleDataArray">
+            <swe:DataRecord definition="http://mmiws.org/ont/x/timeSeries">
+                <swe:field name="Time">
+                  <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>
+                </swe:field>
+                <swe:field name="x-position">
+                  <swe:Quantity definition="urn:ogc:crs:EPSG:21781:x-position"/>
+                </swe:field>
+                <swe:field name="y-position">
+                  <swe:Quantity definition="urn:ogc:crs:EPSG:21781:y-position"/>
+                </swe:field>
+                <swe:field name="z-position">
+                  <swe:Quantity definition="urn:ogc:crs:EPSG:21781:z-position">
+                    <swe:uom code="deg"/>
+                  </swe:Quantity>
+                </swe:field>
+                <swe:field name="water_surface_temperature">
+                  <swe:Quantity definition="urn:ogc:def:property:x-istsos:1.0:water_surface_temperature">
+                    <swe:uom code="deg"/>
+                  </swe:Quantity>
+                </swe:field>
+              </swe:DataRecord>
+          </swe:elementType>
+        <swe:encoding>
+          <swe:TextBlock tokenSeparator="," blockSeparator="@" decimalSeparator="."/>
+        </swe:encoding>
+        <swe:values>
+            2010-02-10T16:10:00+01:00,718309.05,95450.21,271,13.8@
+            2010-02-10T16:20:00+01:00,718299.97,95541.11,271,14@
+            2010-02-10T16:30:00+01:00,718436.30,95450.21,271,13.9@
+            2010-02-10T16:40:00+01:00,718518.11,95395.68,271,14@
+            2010-02-10T16:50:00+01:00,718436.30,95277.52,271,14.2@
+            2010-02-10T17:00:00+01:00,718490.84,95250.25,271,14.1@
+            2010-02-10T17:10:00+01:00,718481.75,95359.32,271,13.7@
+            2010-02-10T17:20:00+01:00,718690.80,95286.61,271,13.9@
+            2010-02-10T17:30:00+01:00,718536.29,95359.32,271,13.7@
+            2010-02-10T17:40:00+01:00,718499.93,95286.61,271,13.8@
+            2010-02-10T17:50:00+01:00,718481.75,95359.32,271,13.7@
+            2010-02-10T18:00:00+01:00,718554.46,95595.64,271,13.4
+        </swe:values>
+      </swe:DataArray>
+    </om:result>
+  </om:Observation>
+</sos:InsertObservation>
+
diff --git a/interface/requests/insertObservation_stationary_insitu_composite.xml b/interface/requests/insertObservation_stationary_insitu_composite.xml
new file mode 100755
index 0000000..68cbf11
--- /dev/null
+++ b/interface/requests/insertObservation_stationary_insitu_composite.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:InsertObservation
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sa="http://www.opengis.net/sampling/1.0"
+   xmlns:swe="http://www.opengis.net/swe/1.0.1"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" service="SOS" version="1.0.0" >
+   <AssignedSensorId>urn:ogc:object:sensor:x-istsos:1.0:???</AssignedSensorId>
+   <om:Observation>
+    <om:procedure xlink:href="urn:ogc:object:procedure:x-istsos:1.0:meteo1"/>
+    <om:samplingTime>
+      <gml:TimePeriod>
+        <gml:beginPosition>2010-02-10T16:10:00+01:00</gml:beginPosition>
+        <gml:endPosition>2010-02-10T18:00:00+01:00</gml:endPosition>
+      </gml:TimePeriod>
+    </om:samplingTime>
+    <om:observedProperty>
+      <swe:CompositPhenomenon dimension="4">
+        <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>  
+        <swe:component xlink:href="urn:ogc:def:property:x-istsos:1.0:airtemperature"/> 
+        <swe:component xlink:href="urn:ogc:def:property:x-istsos:1.0:rainfall"/> 
+        <swe:component xlink:href="urn:ogc:def:property:x-istsos:1.0:pressure"/>
+      </swe:CompositPhenomenon>
+    </om:observedProperty>
+    <om:featureOfInterest xlink:href="urn:ogc:object:feature:x-istsos:1.0:station:LUGANO"/>
+      <om:result>
+        <swe:DataArray>
+          <swe:elementCount>
+            <swe:Count>
+              <swe:value>5</swe:value>
+            </swe:Count>
+          </swe:elementCount>
+          <swe:elementType name="SimpleDataArray">
+              <swe:DataRecord definition="http://mmiws.org/ont/x/timeSeries">
+                <swe:field name="Time">
+                  <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>
+                </swe:field>
+                <swe:field name="airtemperature">
+                  <swe:Quantity definition="urn:ogc:def:property:x-istsos:1.0:airtemperature">
+                    <swe:uom code="deg"/>
+                  </swe:Quantity>
+                </swe:field>
+                <swe:field name="rainfall">
+                  <swe:Quantity definition="urn:ogc:def:property:x-istsos:1.0:rainfall">
+                    <swe:uom code="mm"/>
+                  </swe:Quantity>
+                </swe:field>
+                <swe:field name="pressure">
+                  <swe:Quantity definition="urn:ogc:def:property:x-istsos:1.0:pressure">
+                    <swe:uom code="mbar"/>
+                  </swe:Quantity>
+                </swe:field>
+              </swe:DataRecord>
+          </swe:elementType>
+        <swe:encoding>
+          <swe:TextBlock tokenSeparator="," blockSeparator="@" decimalSeparator="."/>
+        </swe:encoding>
+        <swe:values>
+            2010-02-10T16:10:00+01:00,12.8,0.2,940@
+            2010-02-10T16:20:00+01:00,12.7,0.3,948@
+            2010-02-10T16:30:00+01:00,12.5,0.2,949@
+            2010-02-10T16:40:00+01:00,12.3,0.3,950@
+            2010-02-10T16:50:00+01:00,12.2,0.4,949@
+            2010-02-10T17:00:00+01:00,12.1,0.4,947@
+            2010-02-10T17:10:00+01:00,11.8,0.5,948@
+            2010-02-10T17:20:00+01:00,11.6,0.3,944@
+            2010-02-10T17:30:00+01:00,11.7,0.4,943@
+            2010-02-10T17:40:00+01:00,11.4,0.4,944@
+            2010-02-10T17:50:00+01:00,11.4,0.5,944@
+            2010-02-10T18:00:00+01:00,11.3,0.4,945
+        </swe:values>
+      </swe:DataArray>
+    </om:result>
+  </om:Observation>
+</sos:InsertObservation>
+
diff --git a/interface/requests/insertObservation_stationary_insitu_simple.xml b/interface/requests/insertObservation_stationary_insitu_simple.xml
new file mode 100755
index 0000000..80640a0
--- /dev/null
+++ b/interface/requests/insertObservation_stationary_insitu_simple.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:InsertObservation
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+   xmlns:sos="http://www.opengis.net/sos/1.0"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sa="http://www.opengis.net/sampling/1.0"
+   xmlns:swe="http://www.opengis.net/swe/1.0.1"
+   xmlns:gml="http://www.opengis.net/gml/3.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:om="http://www.opengis.net/om/1.0" service="SOS" version="1.0.0" >
+   <AssignedSensorId>urn:ogc:object:sensor:x-istsos:1.0:???</AssignedSensorId>
+   <om:Observation>
+    <om:procedure xlink:href="urn:ogc:object:procedure:x-istsos:1.0:thermo1"/>
+    <om:samplingTime>
+      <gml:TimePeriod>
+        <gml:beginPosition>2010-01-01T00:10:00+00:00</gml:beginPosition>
+        <gml:endPosition>2010-01-01T02:00:00+00:00</gml:endPosition>
+      </gml:TimePeriod>
+    </om:samplingTime>
+    <om:observedProperty>
+      <swe:CompositPhenomenon dimension="2">
+        <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>  
+        <swe:component xlink:href="urn:ogc:def:property:x-istsos:1.0:airtemperature" />      
+      </swe:CompositPhenomenon>
+    </om:observedProperty>
+    <om:featureOfInterest xlink:href="urn:ogc:object:feature:x-istsos:1.0:station:LUGANO"/>
+      <om:result>
+        <swe:DataArray>
+          <swe:elementCount>
+            <swe:Count>
+              <swe:value>2</swe:value>
+            </swe:Count>
+          </swe:elementCount>
+          <swe:elementType name="SimpleDataArray">
+              <swe:DataRecord definition="http://mmiws.org/ont/x/timeSeries">
+                <swe:field name="Time">
+                  <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>
+                </swe:field>
+                <swe:field name="airtemperature">
+                  <swe:Quantity definition="urn:ogc:def:property:x-istsos:1.0:airtemperature">
+                    <swe:uom code="deg"/>
+                  </swe:Quantity>
+                </swe:field>
+              </swe:DataRecord>
+          </swe:elementType>
+        <swe:encoding>
+          <swe:TextBlock tokenSeparator="," blockSeparator="@" decimalSeparator="."/>
+        </swe:encoding>
+        <swe:values>
+            2010-01-01T00:10:00+00:00,9.81@
+            2010-01-01T00:20:00+00:00,9.78@
+            2010-01-01T00:30:00+00:00,9.74@
+            2010-01-01T00:40:00+00:00,9.69@
+            2010-01-01T00:50:00+00:00,9.4@
+            2010-01-01T01:00:00+00:00,9.1@
+            2010-01-01T01:10:00+00:00,8.7@
+            2010-01-01T01:20:00+00:00,8.5@
+            2010-01-01T01:30:00+00:00,8.4@
+            2010-01-01T01:40:00+00:00,8.32@
+            2010-01-01T01:50:00+00:00,8.30@
+            2010-01-01T02:00:00+00:00,8.27
+        </swe:values>
+      </swe:DataArray>
+    </om:result>
+  </om:Observation>
+</sos:InsertObservation>
+
diff --git a/interface/requests/istSOS_post_xml_index.xml b/interface/requests/istSOS_post_xml_index.xml
new file mode 100755
index 0000000..e41e288
--- /dev/null
+++ b/interface/requests/istSOS_post_xml_index.xml
@@ -0,0 +1,28 @@
+Elenco degli XML da inserire nella cartella
+
+<option value="http://geoservice.ist.supsi.ch/test/requests/
+
+
+
+getCapabilities.xml
+describeSensor.xml
+getObservation.xml
+getObservation2.xml
+getObservation3.xml
+getObservation4.xml
+getObservationBBOX.xml
+getObservationDWithin.xml
+getObservationQualityIndex.xml
+getFeatureOfInterest.xml
+registerSensor_stationary_insitu_simple.xml
+registerSensor_stationary_insitu_composite.xml
+registerSensor_dynamic_insitu_simple.xml
+registerSensor_dynamic_insitu_composite.xml
+insertObservation_stationary_insitu_simple.xml
+insertObservation_stationary_insitu_composite.xml
+insertObservation_dynamic_insitu_simple.xml
+insertObservation_dynamic_insitu_composite.xml
+
+
+
+</option>
diff --git a/interface/requests/registerSensor_stationary_insitu_composite.xml b/interface/requests/registerSensor_stationary_insitu_composite.xml
new file mode 100755
index 0000000..781ac71
--- /dev/null
+++ b/interface/requests/registerSensor_stationary_insitu_composite.xml
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:RegisterSensor 
+    service="SOS" 
+    version="1.0.0" 
+    xmlns:sos="http://www.opengis.net/sos/1.0" 
+    xmlns:gml="http://www.opengis.net/gml" 
+    xmlns:om="http://www.opengis.net/om" 
+    xmlns:sml="http://www.opengis.net/sensorML" 
+    xmlns:swe="http://www.opengis.net/swe" 
+    xmlns:xlink="http://www.w3.org/1999/xlink" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <sos:SensorDescription>
+    <sml:member>
+      <sml:System gml:id="LL_CERESIO">
+        <gml:name>LL_CERESIO</gml:name>
+        <sml:identification>
+          <sml:IdentifierList>
+            <sml:identifier name="Short Name">
+              <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:shortName">
+                <sml:value>CHS001</sml:value>
+              </sml:Term>
+            </sml:identifier>
+            <sml:identifier name="Long Name">
+              <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:longName">
+                <sml:value>Capacitive humidity sensors model 001</sml:value>
+              </sml:Term>
+            </sml:identifier>
+            <sml:identifier name="Manufacturer Name">
+              <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:manufacturerName">
+                <sml:value>Technical Department - SUPSI</sml:value>
+              </sml:Term>
+            </sml:identifier>
+            <sml:identifier name="Model Number">
+              <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:modelNumber">
+                <sml:value>TDS-001</sml:value>
+              </sml:Term>
+            </sml:identifier>
+            <sml:identifier name="Serial Number">
+              <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:serialNumber">
+                <sml:value>EXZU70012987712ABC</sml:value>
+              </sml:Term>
+            </sml:identifier>
+            <sml:identifier name="Device ID">
+              <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:deviceID">
+                <sml:value>TDSCHSMWLLUGANO</sml:value>
+              </sml:Term>
+            </sml:identifier>
+          </sml:IdentifierList>
+        </sml:identification>
+        <sml:classification>
+          <sml:ClassifierList>
+            <sml:classifier name="System Type">
+              <sml:Term definition="urn:ogc:def:classifier:x-istsos:1.0:systemType">
+                <sml:value>insitu-fixed-point</sml:value>
+              </sml:Term>
+            </sml:classifier>
+            <sml:classifier name="Sensor Type">
+              <sml:Term definition="urn:ogc:def:classifier:x-istsos:1.0:sensorType">
+                <sml:value>lake water level</sml:value>
+              </sml:Term>
+            </sml:classifier>
+          </sml:ClassifierList>
+        </sml:classification>
+        <sml:characteristics xlink:href="http://192.168.56.101/istsos/admin/"/>
+        <sml:capabilities>
+          <swe:DataRecord>
+            <swe:field name="Memory Capacity">
+              <swe:Quantity definition="urn:x-ogc:def:classifier:x-istsos:1.0:memoryCapacity">
+                <swe:uom code="Byte"/>
+                <swe:value>34359738368</swe:value>
+              </swe:Quantity>
+            </swe:field>
+            <swe:field name="Battery Current">
+              <swe:Quantity definition="urn:x-ogc:def:phenomenon:x-istsos:1.0:batteryCurrent">
+                <swe:uom code="A.h"/>
+                <swe:value>1420000</swe:value>
+              </swe:Quantity>
+            </swe:field>
+            <swe:field name="Sampling time resolution">
+              <swe:Quantity definition="urn:x-ogc:def:classifier:x-istsos:1.0:samplingTimeResolution">
+                <swe:uom code="iso8601"/>
+                <swe:value>PT20M</swe:value>
+              </swe:Quantity>
+            </swe:field>
+            <swe:field name="Acquisition time resolution">
+              <swe:Quantity definition="urn:x-ogc:def:classifier:x-istsos:1.0:acquisitionTimeResolution">
+                <swe:uom code="iso8601"/>
+                <swe:value>PT30M</swe:value>
+              </swe:Quantity>
+            </swe:field>
+          </swe:DataRecord>
+        </sml:capabilities>
+        <sml:contact role="urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:owner">
+          <sml:ResponsibleParty>
+            <sml:individualName>Fausto Gervasoni</sml:individualName>
+            <sml:organizationName>Institute of Earth Science - SUPSI</sml:organizationName>
+            <sml:contactInfo>
+              <sml:phone>
+                <sml:voice>+41586666200</sml:voice>
+                <sml:facsimile>+41586666209</sml:facsimile>
+              </sml:phone>
+              <sml:address>
+                <sml:deliveryPoint>Campus Trevano</sml:deliveryPoint>
+                <sml:city>Canobbio</sml:city>
+                <sml:administrativeArea>Ticino</sml:administrativeArea>
+                <sml:postalCode>6952</sml:postalCode>
+                <sml:country>Switzerland</sml:country>
+                <sml:electronicMailAddress>ist at supsi.ch</sml:electronicMailAddress>
+              </sml:address>
+              <sml:onlineResource xlink:href="http://www.supsi.ch/ist"/>
+            </sml:contactInfo>
+          </sml:ResponsibleParty>
+        </sml:contact>
+        <sml:contact role="urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:manufacturer">
+          <sml:ResponsibleParty>
+            <sml:individualName>Paolo Rezzonico</sml:individualName>
+            <sml:organizationName>Technical Department - SUPSI</sml:organizationName>
+            <sml:contactInfo>
+              <sml:phone>
+                <sml:voice>+41586666200</sml:voice>
+                <sml:facsimile>+41586666209</sml:facsimile>
+              </sml:phone>
+              <sml:address>
+                <sml:deliveryPoint>Residence Stella alpina</sml:deliveryPoint>
+                <sml:city>Viganello</sml:city>
+                <sml:administrativeArea>Ticino</sml:administrativeArea>
+                <sml:postalCode>6962</sml:postalCode>
+                <sml:country>Switzerland</sml:country>
+                <sml:electronicMailAddress>ist at supsi.ch</sml:electronicMailAddress>
+              </sml:address>
+              <sml:onlineResource xlink:href="http://www.supsi.ch/ist"/>
+            </sml:contactInfo>
+          </sml:ResponsibleParty>
+        </sml:contact>
+        <sml:contact role="urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:operator">
+          <sml:ResponsibleParty>
+            <sml:individualName>Giacomino Bragaferro</sml:individualName>
+            <sml:organizationName>Ufficio Tecnico Augenthaler</sml:organizationName>
+            <sml:contactInfo>
+              <sml:phone>
+                <sml:voice>+41586666200</sml:voice>
+                <sml:facsimile>+41586666209</sml:facsimile>
+              </sml:phone>
+              <sml:address>
+                <sml:deliveryPoint>Via delle Vigne 6</sml:deliveryPoint>
+                <sml:city>Bironico</sml:city>
+                <sml:administrativeArea>Ticino</sml:administrativeArea>
+                <sml:postalCode>6804</sml:postalCode>
+                <sml:country>Switzerland</sml:country>
+                <sml:electronicMailAddress>ist at supsi.ch</sml:electronicMailAddress>
+              </sml:address>
+              <sml:onlineResource xlink:href="http://www.supsi.ch/ist"/>
+            </sml:contactInfo>
+          </sml:ResponsibleParty>
+        </sml:contact>
+        <sml:documentation>
+          <sml:Document>
+            <gml:description>User Manual</gml:description>
+            <sml:date>01/01/2013</sml:date>
+            <sml:format>text/html</sml:format>
+            <gml:onlineResource xlink:href="http://goo.gl/0fpAA"/>
+          </sml:Document>
+        </sml:documentation>
+        <gml:location>
+          <gml:Point gml:id="ceresio" srsName="EPSG:4326">
+            <gml:coordinates>8.962662,46.004809,270</gml:coordinates>
+          </gml:Point>
+        </gml:location>
+        <sml:interfaces>
+          <sml:InterfaceList>
+            <sml:interface name="Bluetooth4.0/SDP/RFCOMM/L2CAP"/>
+            <sml:interface name="USB2.0/Mass Storage"/>
+          </sml:InterfaceList>
+        </sml:interfaces>
+        <sml:outputs>
+          <sml:OutputList>
+            <sml:output name="output data">
+              <swe:DataRecord definition="urn:ogc:def:dataType:x-istsos:1.0:timeSeries">
+                <swe:field name="Time">
+                  <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601" gml:id="1">
+                    <swe:uom code="iso8601"/>
+                  </swe:Time>
+                </swe:field>
+                <swe:field name="lake water level">
+                  <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:lake:water:level" gml:id="2">
+                    <swe:uom code="m"/>
+                  </swe:Quantity>
+                </swe:field>
+                <swe:field name="lake water temperature">
+                  <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:lake:water:temperature" gml:id="2">
+                    <swe:uom code="°C"/>
+                  </swe:Quantity>
+                </swe:field>
+              </swe:DataRecord>
+            </sml:output>
+          </sml:OutputList>
+        </sml:outputs>
+      </sml:System>
+    </sml:member>
+  </sos:SensorDescription>
+  <sos:ObservationTemplate>
+    <om:Observation>
+      <om:procedure xlink:href="urn:ogc:object:procedure:x-istsos:1.0:LL_CERESIO"/>
+      <om:samplingTime>
+        <gml:TimePeriod>
+          <gml:TimeLength/>
+        </gml:TimePeriod>
+      </om:samplingTime>
+      <om:observedProperty>
+        <swe:CompositPhenomenon dimension="2">
+          <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>
+          <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:lake:water:level"/>
+          <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:lake:water:temperature"/>
+        </swe:CompositPhenomenon>
+      </om:observedProperty>
+      <om:featureOfInterest xlink:href="ceresio">
+        <gml:Point gml:id="ceresio" srsName="EPSG:4326">
+          <gml:coordinates>8.962662,46.004809,270</gml:coordinates>
+        </gml:Point>
+      </om:featureOfInterest>
+      <om:result>
+        <swe:DataArray>
+          <swe:elementCount>
+            <swe:value>2</swe:value>
+          </swe:elementCount>
+          <swe:elementType name="SimpleDataArray" xlink:href="urn:ogc:def:dataType:x-istsos:1.0:timeSeriesDataRecord">
+            <swe:DataRecord definition="urn:ogc:def:dataType:x-istsos:1.0:timeSeries">
+              <swe:field name="Time">
+                <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601" gml:id="1">
+                  <swe:uom code="iso8601"/>
+                </swe:Time>
+              </swe:field>
+              <swe:field name="lake water level">
+                <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:lake:water:level" gml:id="2">
+                  <swe:uom code="m"/>
+                </swe:Quantity>
+              </swe:field>
+              <swe:field name="lake water temperature">
+                <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:lake:water:temperature" gml:id="2">
+                  <swe:uom code="°C"/>
+                </swe:Quantity>
+              </swe:field>
+            </swe:DataRecord>
+          </swe:elementType>
+          <swe:encoding>
+            <swe:TextBlock blockSeparator="@" decimalSeparator="." tokenSeparator=","/>
+          </swe:encoding>
+          <swe:values/>
+        </swe:DataArray>
+      </om:result>
+    </om:Observation>
+  </sos:ObservationTemplate>
+</sos:RegisterSensor>
diff --git a/interface/requests/registerSensor_stationary_insitu_simple.xml b/interface/requests/registerSensor_stationary_insitu_simple.xml
new file mode 100755
index 0000000..ca6d29c
--- /dev/null
+++ b/interface/requests/registerSensor_stationary_insitu_simple.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sos:RegisterSensor 
+    service="SOS" 
+    version="1.0.0" 
+    xmlns:sos="http://www.opengis.net/sos/1.0" 
+    xmlns:gml="http://www.opengis.net/gml" 
+    xmlns:om="http://www.opengis.net/om" 
+    xmlns:sml="http://www.opengis.net/sensorML" 
+    xmlns:swe="http://www.opengis.net/swe" 
+    xmlns:xlink="http://www.w3.org/1999/xlink" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosRegisterSensor.xsd">
+  <sos:SensorDescription>
+    <sml:member>
+      <sml:System gml:id="H_TREVANO">
+        <gml:name>H_TREVANO</gml:name>
+        <sml:identification/>
+        <sml:classification>
+          <sml:ClassifierList>
+            <sml:classifier name="System Type">
+              <sml:Term definition="urn:ogc:def:classifier:x-istsos:1.0:systemType">
+                <sml:value>insitu-fixed-point</sml:value>
+              </sml:Term>
+            </sml:classifier>
+            <sml:classifier name="Sensor Type">
+              <sml:Term definition="urn:ogc:def:classifier:x-istsos:1.0:sensorType">
+                <sml:value>humidity sensor</sml:value>
+              </sml:Term>
+            </sml:classifier>
+          </sml:ClassifierList>
+        </sml:classification>
+        <sml:capabilities>
+          <swe:DataRecord/>
+        </sml:capabilities>
+        <gml:location>
+          <gml:Point gml:id="trevano" srsName="EPSG:4326">
+            <gml:coordinates>8.961435,46.028235,350</gml:coordinates>
+          </gml:Point>
+        </gml:location>
+        <sml:outputs>
+          <sml:OutputList>
+            <sml:output name="output data">
+              <swe:DataRecord definition="urn:ogc:def:dataType:x-istsos:1.0:timeSeries">
+                <swe:field name="Time">
+                  <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601" gml:id="1">
+                    <swe:uom code="iso8601"/>
+                  </swe:Time>
+                </swe:field>
+                <swe:field name="air humidity">
+                  <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity" gml:id="2">
+                    <swe:uom code="%"/>
+                  </swe:Quantity>
+                </swe:field>
+              </swe:DataRecord>
+            </sml:output>
+          </sml:OutputList>
+        </sml:outputs>
+      </sml:System>
+    </sml:member>
+  </sos:SensorDescription>
+  <sos:ObservationTemplate>
+    <om:Observation>
+      <om:procedure xlink:href="urn:ogc:object:procedure:x-istsos:1.0:H_TREVANO"/>
+      <om:samplingTime>
+        <gml:TimePeriod>
+          <gml:TimeLength/>
+        </gml:TimePeriod>
+      </om:samplingTime>
+      <om:observedProperty>
+        <swe:CompositPhenomenon dimension="2">
+          <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>
+          <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity"/>
+        </swe:CompositPhenomenon>
+      </om:observedProperty>
+      <om:featureOfInterest xlink:href="trevano">
+        <gml:Point gml:id="trevano" srsName="EPSG:4326">
+          <gml:coordinates>8.961435,46.028235,350</gml:coordinates>
+        </gml:Point>
+      </om:featureOfInterest>
+      <om:result>
+        <swe:DataArray>
+          <swe:elementCount>
+            <swe:value>2</swe:value>
+          </swe:elementCount>
+          <swe:elementType name="SimpleDataArray" xlink:href="urn:ogc:def:dataType:x-istsos:1.0:timeSeriesDataRecord">
+            <swe:DataRecord definition="urn:ogc:def:dataType:x-istsos:1.0:timeSeries">
+              <swe:field name="Time">
+                <swe:Time definition="urn:ogc:def:parameter:x-istsos::time:iso8601" gml:id="1">
+                  <swe:uom code="iso8601"/>
+                </swe:Time>
+              </swe:field>
+              <swe:field name="air humidity">
+                <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity" gml:id="2">
+                  <swe:uom code="%"/>
+                </swe:Quantity>
+              </swe:field>
+            </swe:DataRecord>
+          </swe:elementType>
+          <swe:encoding>
+            <swe:TextBlock blockSeparator="@" decimalSeparator="." tokenSeparator=","/>
+          </swe:encoding>
+          <swe:values/>
+        </swe:DataArray>
+      </om:result>
+    </om:Observation>
+  </sos:ObservationTemplate>
+</sos:RegisterSensor>
diff --git a/interface/servicestatus.html b/interface/servicestatus.html
new file mode 100755
index 0000000..1637c2f
--- /dev/null
+++ b/interface/servicestatus.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title></title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    </head>
+    <body>
+        <div>TODO write content</div>
+    </body>
+</html>
diff --git a/interface/test/chart/app/config/data.json b/interface/test/chart/app/config/data.json
new file mode 100755
index 0000000..e7897f4
--- /dev/null
+++ b/interface/test/chart/app/config/data.json
@@ -0,0 +1,18 @@
+{
+    "success": true,
+    "total": 3,
+    "data": [
+    {
+        "isodate": "2012-01-01T00:00:00+01",
+        "value": 2
+    },
+    {
+        "isodate": "2012-01-01T01:00:00+01",
+        "value": 1
+    },
+    {
+        "isodate": "2012-01-01T02:00:00+01",
+        "value": 3
+    }
+    ]
+}
\ No newline at end of file
diff --git a/interface/test/chart/app/store/testColumnStore.js b/interface/test/chart/app/store/testColumnStore.js
new file mode 100755
index 0000000..3e44128
--- /dev/null
+++ b/interface/test/chart/app/store/testColumnStore.js
@@ -0,0 +1,40 @@
+/*
+ * File: app/store/testColumnStore.js
+ * Date: Tue Mar 20 2012 10:10:02 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('MyApp.store.testColumnStore', {
+    extend: 'Ext.data.Store',
+
+    constructor: function(cfg) {
+        var me = this;
+        cfg = cfg || {};
+        me.callParent([Ext.apply({
+            storeId: 'testcolumnstore',
+            proxy: {
+                type: 'ajax',
+                url: 'app/config/data.json',
+                reader: {
+                    type: 'json'
+                }
+            },
+            fields: [
+                {
+                    name: 'isodate',
+                    type: 'string'
+                },
+                {
+                    name: 'value',
+                    type: 'float'
+                }
+            ]
+        }, cfg)]);
+    }
+});
\ No newline at end of file
diff --git a/interface/test/chart/app/view/testColumn.js b/interface/test/chart/app/view/testColumn.js
new file mode 100755
index 0000000..bd84db3
--- /dev/null
+++ b/interface/test/chart/app/view/testColumn.js
@@ -0,0 +1,24 @@
+/*
+ * File: app/view/testColumn.js
+ * Date: Tue Mar 20 2012 09:46:26 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be generated the first time you export.
+ *
+ * You should implement event handling and custom methods in this
+ * class.
+ */
+
+Ext.define('MyApp.view.testColumn', {
+    extend: 'MyApp.view.ui.testColumn',
+
+    initComponent: function() {
+        
+        Ext.create('MyApp.store.testColumnStore');
+        
+        var me = this;
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/test/chart/app/view/ui/testColumn.js b/interface/test/chart/app/view/ui/testColumn.js
new file mode 100755
index 0000000..4bec695
--- /dev/null
+++ b/interface/test/chart/app/view/ui/testColumn.js
@@ -0,0 +1,74 @@
+/*
+ * File: app/view/ui/testColumn.js
+ * Date: Tue Mar 20 2012 10:10:02 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.define('MyApp.view.ui.testColumn', {
+    extend: 'Ext.panel.Panel',
+
+    height: 538,
+    width: 702,
+    layout: {
+        type: 'fit'
+    },
+    title: 'My Panel',
+
+    initComponent: function() {
+        var me = this;
+
+        Ext.applyIf(me, {
+            items: [
+                {
+                    xtype: 'chart',
+                    height: 250,
+                    width: 400,
+                    animate: true,
+                    insetPadding: 20,
+                    store: 'testcolumnstore',
+                    axes: [
+                        {
+                            type: 'Category',
+                            fields: [
+                                'isodate'
+                            ],
+                            position: 'bottom',
+                            title: 'Time'
+                        },
+                        {
+                            type: 'Numeric',
+                            fields: [
+                                'value'
+                            ],
+                            position: 'left',
+                            title: 'Temperature'
+                        }
+                    ],
+                    series: [
+                        {
+                            type: 'column',
+                            label: {
+                                display: 'insideEnd',
+                                field: 'y',
+                                color: '#333',
+                                'text-anchor': 'middle'
+                            },
+                            xField: 'x',
+                            yField: [
+                                'y'
+                            ]
+                        }
+                    ]
+                }
+            ]
+        });
+
+        me.callParent(arguments);
+    }
+});
\ No newline at end of file
diff --git a/interface/test/chart/charts.xds b/interface/test/chart/charts.xds
new file mode 100755
index 0000000..7b472c1
--- /dev/null
+++ b/interface/test/chart/charts.xds
@@ -0,0 +1,175 @@
+{
+    "name": "charts.xds",
+    "settings": {
+        "urlPrefix": "http://localhost/",
+        "directAPI": "",
+        "spacesToIndent": 4,
+        "codeGenFormat": "Class",
+        "exportPath": ".",
+        "extPath": "http://extjs.cachefly.net/ext-4.0.2a/",
+        "lineEnding": "LF",
+        "instantiateStore": true,
+        "exportXDSFiles": true,
+        "genTimestamps": true,
+        "appName": "MyApp"
+    },
+    "xdsVersion": "1.2.2",
+    "components": [
+        {
+            "id": "ExtBox1-ext-gen1666",
+            "type": "panel",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "height": 538,
+                "width": 702,
+                "layout": "fit",
+                "title": "My Panel",
+                "designer|userClassName": "testColumn"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen6049",
+                    "type": "chart",
+                    "reference": {
+                        "name": "items",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "height": 250,
+                        "width": 400,
+                        "animate": "true",
+                        "insetPadding": 20,
+                        "store": "testcolumnstore",
+                        "designer|userClassName": "MyChart"
+                    },
+                    "iconCls": "icon-column-chart",
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen6054",
+                            "type": "categoryaxis",
+                            "reference": {
+                                "name": "axes",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "fields": "['isodate']",
+                                "position": "bottom",
+                                "title": "Time",
+                                "designer|userClassName": "MyCategoryAxis"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen6057",
+                            "type": "numericaxis",
+                            "reference": {
+                                "name": "axes",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "fields": "['value']",
+                                "position": "left",
+                                "title": "Temperature",
+                                "designer|userClassName": "MyNumericAxis"
+                            }
+                        },
+                        {
+                            "id": "ExtBox1-ext-gen6060",
+                            "type": "columnseries",
+                            "reference": {
+                                "name": "series",
+                                "type": "array"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "label": "{'display':'insideEnd','field':'y','color':'#333','text-anchor':'middle'}",
+                                "xField": "x",
+                                "yField": "['y']",
+                                "designer|userClassName": "MyColumnSeries"
+                            }
+                        }
+                    ]
+                }
+            ]
+        }
+    ],
+    "stores": [
+        {
+            "id": "ExtBox1-ext-gen2046",
+            "type": "jsonstore",
+            "reference": {
+                "name": "items",
+                "type": "array"
+            },
+            "codeClass": null,
+            "userConfig": {
+                "storeId": "testcolumnstore",
+                "designer|userClassName": "testColumnStore"
+            },
+            "cn": [
+                {
+                    "id": "ExtBox1-ext-gen2050",
+                    "type": "ajaxproxy",
+                    "reference": {
+                        "name": "proxy",
+                        "type": "object"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "url": "app/config/data.json",
+                        "designer|userClassName": "Ajax Proxy"
+                    },
+                    "cn": [
+                        {
+                            "id": "ExtBox1-ext-gen2056",
+                            "type": "jsonreader",
+                            "reference": {
+                                "name": "reader",
+                                "type": "object"
+                            },
+                            "codeClass": null,
+                            "userConfig": {
+                                "designer|userClassName": "Json Reader"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "id": "ExtBox1-ext-gen2353",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "isodate",
+                        "type": "string",
+                        "designer|userClassName": "MyField"
+                    }
+                },
+                {
+                    "id": "ExtBox1-ext-gen2360",
+                    "type": "datafield",
+                    "reference": {
+                        "name": "fields",
+                        "type": "array"
+                    },
+                    "codeClass": null,
+                    "userConfig": {
+                        "name": "value",
+                        "type": "float",
+                        "designer|userClassName": "MyField1"
+                    }
+                }
+            ]
+        }
+    ],
+    "framework": "ext40"
+}
\ No newline at end of file
diff --git a/interface/test/chart/column-cathegory.html b/interface/test/chart/column-cathegory.html
new file mode 100755
index 0000000..3f5c232
--- /dev/null
+++ b/interface/test/chart/column-cathegory.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html>
+
+<!-- Auto Generated with Ext Designer -->
+<!-- Modifications to this file will be overwritten. -->
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>dev - charts</title>
+        <link rel="stylesheet" type="text/css" href="http://docs.sencha.com/ext-js/4-0/extjs-build/resources/css/ext-all.css"/>
+        <script type="text/javascript" src="http://docs.sencha.com/ext-js/4-0/extjs-build/ext-all-debug.js"></script>
+        <script type="text/javascript">
+            
+            function ISO8601FromDate(isodate) {
+                function pad(n){return n<10 ? '0'+n : n}
+                var offset = isodate.getTimezoneOffset()/-60;
+                var tz = ((offset > 0) ? "+"+pad(offset) : pad(offset))
+                return isodate.getFullYear()+'-'
+                    + pad(isodate.getMonth()+1)+'-'
+                    + pad(isodate.getDate())+'T'
+                    + pad(isodate.getHours())+':'
+                    + pad(isodate.getMinutes())+':'
+                    + pad(isodate.getSeconds())+'.'
+                    + isodate.getMilliseconds() + tz;
+            }
+
+                
+            Ext.Loader.setConfig({
+                enabled: true
+            });
+            
+            Ext.require('Ext.chart.*');
+            Ext.require(['Ext.Window', 'Ext.layout.container.Fit', 'Ext.fx.target.Sprite']);
+            
+            Ext.onReady(function () {
+                
+                Ext.define('sosstore', {
+                    extend: 'Ext.data.JsonStore',
+
+                    constructor: function(cfg) {
+                        var me = this;
+                        cfg = cfg || {};
+                        me.callParent([Ext.apply({
+                                storeId: 'testcolumnstore',
+                                proxy: {
+                                    type: 'ajax',
+                                    url: 'app/config/data.json',
+                                    reader: {
+                                        type: 'json'
+                                    }
+                                },
+                                fields: [
+                                    {
+                                        name: 'isodate',
+                                        dateFormat: 'c',
+                                        type: 'date'
+                                    },
+                                    {
+                                        name: 'value',
+                                        type: 'float'
+                                    }
+                                ]
+                            }, cfg)]);
+                    }
+                });
+                
+                var sosStore = Ext.create('sosstore',{
+                    "data": [
+                        {
+                            "isodate": "2012-01-01T00:00:00.000000+0100",
+                            "value": 2
+                        },
+                        {
+                            "isodate": "2012-01-01T01:00:00.000000+0100",
+                            "value": 1
+                        },
+                        {
+                            "isodate": "2012-01-01T02:00:00.000000+0100",
+                            "value": 3
+                        },
+                        {
+                            "isodate": "2012-01-01T03:00:00.000000+0100",
+                            "value": 4
+                        },
+                        {
+                            "isodate": "2012-01-01T04:00:00.000000+0100",
+                            "value": 5.2
+                        },
+                        {
+                            "isodate": "2012-01-01T05:00:00.000000+0100",
+                            "value": 3.5453
+                        },
+                        {
+                            "isodate": "2012-01-01T06:00:00.000000+0100",
+                            "value": 3.4
+                        },
+                        {
+                            "isodate": "2012-01-01T07:00:00.000000+0100",
+                            "value": 3.1243
+                        },
+                        {
+                            "isodate": "2012-01-01T08:00:00.000000+0100",
+                            "value": 6.4
+                        },
+                        {
+                            "isodate": "2012-01-01T09:00:00.000000+0100",
+                            "value": 3.4
+                        },
+                        {
+                            "isodate": "2012-01-01T10:00:00.000000+0100",
+                            "value": 5.4
+                        },
+                        {
+                            "isodate": "2012-01-01T11:00:00.000000+0100",
+                            "value": 2.6
+                        },
+                        {
+                            "isodate": "2012-01-01T12:00:00.000000+0100",
+                            "value": 5.2
+                        },
+                        {
+                            "isodate": "2012-01-01T13:00:00.000000+0100",
+                            "value": 0
+                        },
+                        {
+                            "isodate": "2012-01-01T14:00:00.000000+0100",
+                            "value": 0
+                        },
+                        {
+                            "isodate": "2012-01-01T15:00:00.000000+0100",
+                            "value": 0
+                        },
+                        {
+                            "isodate": "2012-01-01T16:00:00.000000+0100",
+                            "value": 0
+                        },
+                        {
+                            "isodate": "2012-01-01T17:00:00.000000+0100",
+                            "value": 5.2
+                        },
+                        {
+                            "isodate": "2012-01-01T18:00:00.000000+0100",
+                            "value": 3.5453
+                        },
+                        {
+                            "isodate": "2012-01-01T19:00:00.000000+0100",
+                            "value": 3.4
+                        },
+                        {
+                            "isodate": "2012-01-01T20:00:00.000000+0100",
+                            "value": 3.1243
+                        },
+                        {
+                            "isodate": "2012-01-01T21:00:00.000000+0100",
+                            "value": 6.4
+                        },
+                        {
+                            "isodate": "2012-01-01T22:00:00.000000+0100",
+                            "value": 1.4
+                        }
+                    ]
+                });
+                
+                
+                var winSos = Ext.create('Ext.Window', {
+                    width: 800,
+                    height: 600,
+                    minHeight: 400,
+                    minWidth: 550,
+                    hidden: false,
+                    maximizable: true,
+                    title: 'Column Chart',
+                    layout: 'fit',
+                    tbar: [{
+                            text: 'Reload Data',
+                            handler: function() {
+                                sosStore.reloadData();
+                            }
+                        }],
+                    items: {
+                        id: 'chartCmpSOS',
+                        xtype: 'chart',
+                        style: 'background: WHITE',
+                        animate: true,
+                        shadow: true,
+                        store: sosStore,
+                        axes: [{
+                                type: 'Numeric',
+                                position: 'left',
+                                fields: ['value'],
+                                label: {
+                                    renderer: Ext.util.Format.numberRenderer('0.0')
+                                },
+                                title: 'Value',
+                                grid: true,
+                                minimum: 0
+                            }, 
+                            {
+                                type: 'Category',
+                                position: 'bottom',
+                                fields: ['isodate'],
+                                title: 'Datetime',
+                                dateFormat: 'c',
+                                label: {
+                                    renderer: function(v) {
+                                        return ISO8601FromDate(v);
+                                        //return Ext.String.ellipsis(v, 15, false);
+                                    },
+                                    font: '12px Arial',
+                                    rotate: {
+                                        degrees: -90
+                                    }
+                                }
+                            }],
+                        series: [{
+                                type: 'column',
+                                axis: 'left',
+                                highlight: true,
+                                label: {
+                                    display: 'middle',
+                                    'text-anchor': 'middle',
+                                    field: 'value',
+                                    renderer: Ext.util.Format.numberRenderer('0.0'),
+                                    color: '#333'
+                                },
+                                xField: 'isodate',
+                                yField: ['value'],
+                                listeners: {
+                                    'itemmouseup': function(item) {
+                                        console.dir(item);
+                                        /*
+                                        var series = Ext.getCmp('chartCmpSOS').series.get(0),
+                                        index = Ext.Array.indexOf(series.items, item),
+                                        selectionModel = gridPanel.getSelectionModel();
+                     
+                                        selectedStoreItem = item.storeItem;
+                                        selectionModel.select(index);*/
+                                    }
+                                }
+                            }]
+                    }
+                });
+                winSos.show();
+                
+                
+                
+                
+                /*var store1 = Ext.create('Ext.data.JsonStore', {
+                    fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5', 'data6', 'data7', 'data9', 'data9'],
+                    data: generateData()
+                });
+                
+                var win = Ext.create('Ext.Window', {
+                    width: 800,
+                    height: 600,
+                    minHeight: 400,
+                    minWidth: 550,
+                    hidden: false,
+                    maximizable: true,
+                    title: 'DEV-TEST Column Chart',
+                    //renderTo: Ext.getBody(),
+                    layout: 'fit',
+                    tbar: [{
+                            text: 'Reload Data',
+                            handler: function() {
+                                store1.loadData(generateData());
+                            }
+                        }],
+                    items: {
+                        id: 'chartCmp',
+                        xtype: 'chart',
+                        style: 'background:#fff',
+                        animate: true,
+                        shadow: true,
+                        store: store1,
+                        axes: [{
+                                type: 'Numeric',
+                                position: 'left',
+                                fields: ['data1'],
+                                label: {
+                                    renderer: Ext.util.Format.numberRenderer('0,0')
+                                },
+                                title: 'Number of Hits',
+                                grid: true,
+                                minimum: 0
+                            }, 
+                            {
+                                type: 'Category',
+                                position: 'bottom',
+                                fields: ['name'],
+                                title: 'Month of the Year'
+                            }],
+                        series: [{
+                                type: 'column',
+                                axis: 'left',
+                                highlight: true,
+                                tips: {
+                                    trackMouse: true,
+                                    width: 140,
+                                    height: 28,
+                                    renderer: function(storeItem, item) {
+                                        this.setTitle(storeItem.get('name') + ': ' + storeItem.get('data1') + ' $');
+                                    }
+                                },
+                                label: {
+                                    display: 'insideEnd',
+                                    'text-anchor': 'middle',
+                                    field: 'data1',
+                                    renderer: Ext.util.Format.numberRenderer('0'),
+                                    orientation: 'vertical',
+                                    color: '#333'
+                                },
+                                xField: 'name',
+                                yField: 'data1'
+                            }]
+                    }
+                });
+                win.show();*/
+                
+                
+            });
+        </script>
+    </head>
+    <body id="docbody">
+        ciao
+    </body>
+</html>
diff --git a/interface/test/chart/column-time.html b/interface/test/chart/column-time.html
new file mode 100755
index 0000000..d830205
--- /dev/null
+++ b/interface/test/chart/column-time.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html>
+
+<!-- Auto Generated with Ext Designer -->
+<!-- Modifications to this file will be overwritten. -->
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>dev - charts</title>
+        <link rel="stylesheet" type="text/css" href="http://docs.sencha.com/ext-js/4-0/extjs-build/resources/css/ext-all.css"/>
+        <script type="text/javascript" src="http://docs.sencha.com/ext-js/4-0/extjs-build/ext-all-debug.js"></script>
+        <script type="text/javascript">
+            
+                
+            function generateData(n, floor){
+                var data = [],
+                p = (Math.random() *  11) + 1,
+                i;
+            
+                floor = (!floor && floor !== 0)? 20 : floor;
+        
+                for (i = 0; i < (n || 12); i++) {
+                    data.push({
+                        name: Ext.Date.monthNames[i % 12],
+                        data1: Math.floor(Math.max((Math.random() * 100), floor)),
+                        data2: Math.floor(Math.max((Math.random() * 100), floor)),
+                        data3: Math.floor(Math.max((Math.random() * 100), floor)),
+                        data4: Math.floor(Math.max((Math.random() * 100), floor)),
+                        data5: Math.floor(Math.max((Math.random() * 100), floor)),
+                        data6: Math.floor(Math.max((Math.random() * 100), floor)),
+                        data7: Math.floor(Math.max((Math.random() * 100), floor)),
+                        data8: Math.floor(Math.max((Math.random() * 100), floor)),
+                        data9: Math.floor(Math.max((Math.random() * 100), floor))
+                    });
+                }
+                return data;
+            };
+                
+            Ext.Loader.setConfig({
+                enabled: true
+            });
+            
+            Ext.require('Ext.chart.*');
+            Ext.require(['Ext.Window', 'Ext.layout.container.Fit', 'Ext.fx.target.Sprite']);
+            
+            Ext.onReady(function () {
+                
+                Ext.define('sosstore', {
+                    extend: 'Ext.data.JsonStore',
+
+                    constructor: function(cfg) {
+                        var me = this;
+                        cfg = cfg || {};
+                        me.callParent([Ext.apply({
+                                storeId: 'testcolumnstore',
+                                proxy: {
+                                    type: 'ajax',
+                                    url: 'app/config/data.json',
+                                    reader: {
+                                        type: 'json'
+                                    }
+                                },
+                                fields: [
+                                    {
+                                        name: 'isodate',
+                                        dateFormat: 'c',
+                                        type: 'date'
+                                    },
+                                    {
+                                        name: 'value',
+                                        type: 'float'
+                                    }
+                                ]
+                            }, cfg)]);
+                    }
+                });
+                
+                var sosStore = Ext.create('sosstore',{
+                    "data": [
+                        {
+                            "isodate": "2012-01-01T00:00:00.000000+0100",
+                            "value": 2
+                        },
+                        {
+                            "isodate": "2012-01-01T01:00:00.000000+0100",
+                            "value": 1
+                        },
+                        {
+                            "isodate": "2012-01-01T02:00:00.000000+0100",
+                            "value": 3
+                        },
+                        {
+                            "isodate": "2012-01-01T03:00:00.000000+0100",
+                            "value": 4
+                        },
+                        {
+                            "isodate": "2012-01-01T04:00:00.000000+0100",
+                            "value": 5.2
+                        },
+                        {
+                            "isodate": "2012-01-01T05:00:00.000000+0100",
+                            "value": 3.5453
+                        },
+                        {
+                            "isodate": "2012-01-01T06:00:00.000000+0100",
+                            "value": 3.4
+                        },
+                        {
+                            "isodate": "2012-01-01T07:00:00.000000+0100",
+                            "value": 3.1243
+                        },
+                        {
+                            "isodate": "2012-01-01T08:00:00.000000+0100",
+                            "value": 6.4
+                        },
+                        {
+                            "isodate": "2012-01-01T09:00:00.000000+0100",
+                            "value": 3.4
+                        },
+                        {
+                            "isodate": "2012-01-01T10:00:00.000000+0100",
+                            "value": 5.4
+                        },
+                        {
+                            "isodate": "2012-01-01T11:00:00.000000+0100",
+                            "value": 2.6
+                        },
+                        {
+                            "isodate": "2012-01-01T12:00:00.000000+0100",
+                            "value": 5.2
+                        },
+                        {
+                            "isodate": "2012-01-01T13:00:00.000000+0100",
+                            "value": 0
+                        },
+                        {
+                            "isodate": "2012-01-01T14:00:00.000000+0100",
+                            "value": 0
+                        },
+                        {
+                            "isodate": "2012-01-01T15:00:00.000000+0100",
+                            "value": 0
+                        },
+                        {
+                            "isodate": "2012-01-01T16:00:00.000000+0100",
+                            "value": 0
+                        },
+                        {
+                            "isodate": "2012-01-01T17:00:00.000000+0100",
+                            "value": 5.2
+                        },
+                        {
+                            "isodate": "2012-01-01T18:00:00.000000+0100",
+                            "value": 3.5453
+                        },
+                        {
+                            "isodate": "2012-01-01T19:00:00.000000+0100",
+                            "value": 3.4
+                        },
+                        {
+                            "isodate": "2012-01-01T20:00:00.000000+0100",
+                            "value": 3.1243
+                        },
+                        {
+                            "isodate": "2012-01-01T21:00:00.000000+0100",
+                            "value": 6.4
+                        },
+                        {
+                            "isodate": "2012-01-01T22:00:00.000000+0100",
+                            "value": 1.4
+                        }
+                    ]
+                });
+                
+                
+                var winSos = Ext.create('Ext.Window', {
+                    width: 800,
+                    height: 600,
+                    minHeight: 400,
+                    minWidth: 550,
+                    hidden: false,
+                    maximizable: true,
+                    title: 'Column Chart',
+                    layout: 'fit',
+                    tbar: [{
+                            text: 'Reload Data',
+                            handler: function() {
+                                sosStore.reloadData();
+                            }
+                        }],
+                    items: {
+                        id: 'chartCmpSOS',
+                        xtype: 'chart',
+                        style: 'background: WHITE',
+                        animate: true,
+                        shadow: true,
+                        store: sosStore,
+                        axes: [{
+                                type: 'Numeric',
+                                position: 'left',
+                                fields: ['value'],
+                                label: {
+                                    renderer: Ext.util.Format.numberRenderer('0.0')
+                                },
+                                title: 'Value',
+                                grid: true,
+                                minimum: 0
+                            }, 
+                            {
+                                type: 'Time',
+                                position: 'bottom',
+                                step: [Ext.Date.HOUR, 1],
+                                fields: 'isodate',
+                                title: 'Datetime',
+                                dateFormat: 'c',
+                                label: {
+                                    renderer: function(v) {
+                                        return Ext.String.ellipsis(v, 15, false);
+                                    },
+                                    font: '9px Arial',
+                                    rotate: {
+                                        degrees: 270
+                                    }
+                                }
+                            }],
+                        series: [{
+                                type: 'column',
+                                axis: 'left',
+                                highlight: true,
+                                label: {
+                                    display: 'middle',
+                                    'text-anchor': 'middle',
+                                    field: 'value',
+                                    renderer: Ext.util.Format.numberRenderer('0.0'),
+                                    //orientation: 'vertical',
+                                    color: '#333'
+                                },
+                                xField: 'isodate',
+                                yField: ['value']
+                            }]
+                    }
+                });
+                winSos.show();
+                
+                
+                
+                
+                /*var store1 = Ext.create('Ext.data.JsonStore', {
+                    fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5', 'data6', 'data7', 'data9', 'data9'],
+                    data: generateData()
+                });
+                
+                var win = Ext.create('Ext.Window', {
+                    width: 800,
+                    height: 600,
+                    minHeight: 400,
+                    minWidth: 550,
+                    hidden: false,
+                    maximizable: true,
+                    title: 'DEV-TEST Column Chart',
+                    //renderTo: Ext.getBody(),
+                    layout: 'fit',
+                    tbar: [{
+                            text: 'Reload Data',
+                            handler: function() {
+                                store1.loadData(generateData());
+                            }
+                        }],
+                    items: {
+                        id: 'chartCmp',
+                        xtype: 'chart',
+                        style: 'background:#fff',
+                        animate: true,
+                        shadow: true,
+                        store: store1,
+                        axes: [{
+                                type: 'Numeric',
+                                position: 'left',
+                                fields: ['data1'],
+                                label: {
+                                    renderer: Ext.util.Format.numberRenderer('0,0')
+                                },
+                                title: 'Number of Hits',
+                                grid: true,
+                                minimum: 0
+                            }, 
+                            {
+                                type: 'Category',
+                                position: 'bottom',
+                                fields: ['name'],
+                                title: 'Month of the Year'
+                            }],
+                        series: [{
+                                type: 'column',
+                                axis: 'left',
+                                highlight: true,
+                                tips: {
+                                    trackMouse: true,
+                                    width: 140,
+                                    height: 28,
+                                    renderer: function(storeItem, item) {
+                                        this.setTitle(storeItem.get('name') + ': ' + storeItem.get('data1') + ' $');
+                                    }
+                                },
+                                label: {
+                                    display: 'insideEnd',
+                                    'text-anchor': 'middle',
+                                    field: 'data1',
+                                    renderer: Ext.util.Format.numberRenderer('0'),
+                                    orientation: 'vertical',
+                                    color: '#333'
+                                },
+                                xField: 'name',
+                                yField: 'data1'
+                            }]
+                    }
+                });
+                win.show();*/
+                
+                
+            });
+        </script>
+    </head>
+    <body id="docbody">
+        ciao
+    </body>
+</html>
\ No newline at end of file
diff --git a/interface/test/chart/designer.html b/interface/test/chart/designer.html
new file mode 100755
index 0000000..3e49eec
--- /dev/null
+++ b/interface/test/chart/designer.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+
+<!-- Auto Generated with Ext Designer -->
+<!-- Modifications to this file will be overwritten. -->
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>charts.xds</title>
+    <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-4.0.2a/resources/css/ext-all.css"/>
+    <script type="text/javascript" src="http://extjs.cachefly.net/ext-4.0.2a/ext-all-debug.js"></script>
+    <script type="text/javascript" src="designer.js"></script>
+</head>
+<body></body>
+</html>
\ No newline at end of file
diff --git a/interface/test/chart/designer.js b/interface/test/chart/designer.js
new file mode 100755
index 0000000..d207939
--- /dev/null
+++ b/interface/test/chart/designer.js
@@ -0,0 +1,32 @@
+/*
+ * File: designer.js
+ * Date: Tue Mar 20 2012 10:10:02 GMT+0100 (CET)
+ *
+ * This file was generated by Ext Designer version 1.2.2.
+ * http://www.sencha.com/products/designer/
+ *
+ * This file will be auto-generated each and everytime you export.
+ *
+ * Do NOT hand edit this file.
+ */
+
+Ext.Loader.setConfig({
+    enabled: true
+});
+
+Ext.application({
+    name: 'MyApp',
+
+    stores: [
+        'testColumnStore'
+    ],
+
+    launch: function() {
+        Ext.QuickTips.init();
+
+        var cmp1 = Ext.create('MyApp.view.testColumn', {
+            renderTo: Ext.getBody()
+        });
+        cmp1.show();
+    }
+});
diff --git a/interface/test/chart/designer_includeOrder.txt b/interface/test/chart/designer_includeOrder.txt
new file mode 100755
index 0000000..ae2c140
--- /dev/null
+++ b/interface/test/chart/designer_includeOrder.txt
@@ -0,0 +1,3 @@
+<script type="text/javascript" src="app/view/ui/testColumn.js"></script>
+<script type="text/javascript" src="app/view/testColumn.js"></script>
+<script type="text/javascript" src="app/store/testColumnStore.js"></script>
diff --git a/interface/test_ObservationEditor.html b/interface/test_ObservationEditor.html
new file mode 100755
index 0000000..bf64d88
--- /dev/null
+++ b/interface/test_ObservationEditor.html
@@ -0,0 +1,64 @@
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>extDesigner</title>
+        <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css"/>
+        <link rel="stylesheet" type="text/css" href="css/main.css"/>
+        <link href='http://fonts.googleapis.com/css?family=Patrick+Hand' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Nova+Square' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
+
+        <script type="text/javascript" src="app/store/Offerings.js"></script>
+        <script type="text/javascript" src="app/store/Procedures.js"></script>
+        <script type="text/javascript" src="app/store/ObservedProperties.js"></script>
+        <script type="text/javascript" src="app/store/Observations.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/ObservationEditorColumn.js"></script>
+        <script type="text/javascript" src="app/view/ObservationEditorColumn.js"></script>
+        <script type="text/javascript" src="app/view/ui/ObservationEditor.js"></script>
+        <script type="text/javascript" src="app/view/ObservationEditor.js"></script>
+
+        <script type="text/javascript">
+            
+            function ISO8601FromDate(isodate) {
+                function pad(n){return n<10 ? '0'+n : n}
+                var offset = isodate.getTimezoneOffset()/-60;
+                var tz = ((offset > 0) ? "+"+pad(offset) : pad(offset))
+                return isodate.getFullYear()+'-'
+                    + pad(isodate.getMonth()+1)+'-'
+                    + pad(isodate.getDate())+'T'
+                    + pad(isodate.getHours())+':'
+                    + pad(isodate.getMinutes())+':'
+                    + pad(isodate.getSeconds())+'.'
+                    + isodate.getMilliseconds() + tz;
+            }
+
+            Ext.Loader.setConfig({
+                enabled: false
+            });
+
+            Ext.application({
+                name: 'istsos',
+
+                stores: [
+                    'Offerings',
+                    'Procedures',
+                    'ObservedProperties'
+                ],
+
+                launch: function() {
+                    Ext.QuickTips.init();
+
+                    var cmp9 = Ext.create('istsos.view.ObservationEditor', {
+                        renderTo: Ext.getBody(),
+                        width: 900,
+                        height: 600
+                    });
+                    cmp9.show();
+                }
+            });
+            
+        </script>
+    </head>
+    <body></body>
+</html>
diff --git a/interface/test_csv.html b/interface/test_csv.html
new file mode 100755
index 0000000..233d3dd
--- /dev/null
+++ b/interface/test_csv.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+
+<!-- Auto Generated with Ext Designer -->
+<!-- Modifications to this file will be overwritten. -->
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>istsos.xds</title>
+        <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css"/>
+        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
+        <script type="text/javascript" src="app/Procedure.js"></script>
+        <script type="text/javascript" src="app/xdate.js"></script>
+        <script type="text/javascript" src="app/engine/wa.js"></script>
+        <script type="text/javascript">
+        
+            Ext.Loader.setConfig({
+                enabled: true
+            });
+
+            Ext.application({
+                name: 'istsos',
+                launch: function() {
+                    Ext.QuickTips.init();
+                    var cmp = Ext.create('istsos.view.TestCsv', {
+                        renderTo: Ext.getBody()
+                    });
+                    cmp.show();
+                    
+                }
+            });
+
+        </script>
+    </head>
+    <body></body>
+</html>
\ No newline at end of file
diff --git a/interface/test_observedPropertiesEditor.html b/interface/test_observedPropertiesEditor.html
new file mode 100755
index 0000000..86660a5
--- /dev/null
+++ b/interface/test_observedPropertiesEditor.html
@@ -0,0 +1,251 @@
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>extDesigner</title>
+        <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css"/>
+        <link rel="stylesheet" type="text/css" href="css/main.css"/>
+        <!--
+        <link href='http://fonts.googleapis.com/css?family=Exo' rel='stylesheet' type='text/css'>
+        -->
+        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
+        <!--<script type="text/javascript" src="/dygraphs/dygraph-combined.js"></script>-->
+        <script type="text/javascript" src="/dygraphs/dygraph-dev.js"></script>
+
+        <script src="codemirror/lib/codemirror.js"></script>
+        <link rel="stylesheet" href="codemirror/lib/codemirror.css">
+        <script src="codemirror/mode/javascript/javascript.js"></script>
+        <script type="text/javascript" src="ext/codemirror.js"></script>
+
+        <script type="text/javascript">
+            function pad(n){return n<10 ? '0'+n : n}
+            
+            function ISO8601FromDate(isodate) {
+                alert("ISO8601FromDate is deprecated!!");
+                var offset = isodate.getTimezoneOffset()/-60;
+                var tz = ((offset > 0) ? "+"+pad(offset) : pad(offset))
+                return isodate.getFullYear()+'-'
+                    + pad(isodate.getMonth()+1)+'-'
+                    + pad(isodate.getDate())+'T'
+                    + pad(isodate.getHours())+':'
+                    + pad(isodate.getMinutes())+':'
+                    + pad(isodate.getSeconds())+'.'
+                    + isodate.getMilliseconds() + tz;
+            }
+            String.prototype.capitalize = function(){
+                return this.toLowerCase().replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
+            };
+            Ext.override(Ext.layout.Layout, {
+                renderItem: function(item, target, position) {
+                    if (item && !item.rendered && item.isFieldLabelable && item.fieldLabel && item.allowBlank == false) {
+                        item.fieldLabel = '<span title="This is a mandatory parameter">' + item.fieldLabel + '<span style="color:red">*</span></span>';
+                    }
+                    this.callOverridden(arguments);
+                }
+            });
+            Function.prototype.defer =
+                function(n,o) {
+                // Get arguments as array
+                var a = [];
+                for(var i=2; i<arguments.length; i++)
+                    a.push(arguments[i]);
+                var that = this;
+                window.setTimeout(function(){return that.apply(o,a);},n);
+            };
+            
+            Ext.override(Ext.form.FieldSet, {
+                setExpanded: function(expanded) {
+                    var me = this,
+                    checkboxCmp = me.checkboxCmp,
+                    toggleCmp = me.toggleCmp,
+                    event;
+
+                    expanded = !!expanded;
+        
+                    if (checkboxCmp) {
+                        checkboxCmp.setValue(expanded);
+                    }
+        
+                    if (toggleCmp) {
+                        toggleCmp.setType(expanded ? 'up' : 'down');
+                    }
+        
+                    if (expanded) {
+                        event = "expand";
+                        me.removeCls(me.baseCls + '-collapsed');
+                    } else {
+                        event = "collapse";
+                        me.addCls(me.baseCls + '-collapsed');
+                    }
+                    me.collapsed = !expanded;
+                    if (expanded) {
+                        // ensure subitems will get rendered and layed out when expanding
+                        me.getComponentLayout().childrenChanged = true;
+                    }
+                    me.doComponentLayout();
+                    me.fireEvent(event, me);
+                    return me;
+                }
+            });
+            /* 
+            This reusable script is copyrighted.
+            Copyright (c) 2004,2005,2006 Claude Ostyn
+            This script is free for use with attribution
+            under the Creative Commons Attribution-ShareAlike 2.5 License.
+            To view a copy of this license, visit
+            http://creativecommons.org/licenses/by-sa/2.5/
+            or send a letter to
+            Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+
+            For any other use, contact Claude Ostyn via tools at Ostyn.com.
+
+            USE AT YOUR OWN RISK!
+            THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+            OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER
+            BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+            ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+            CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+            SOFTWARE.
+             */
+
+            function centisecsToISODuration(n, bPrecise)
+            {
+                // Note: SCORM and IEEE 1484.11.1 require centisec precision
+                // Parameters:
+                // n = number of centiseconds
+                // bPrecise = optional parameter; if true, duration will
+                // be expressed without using year and/or month fields.
+                // If bPrecise is not true, and the duration is long,
+                // months are calculated by approximation based on average number
+                // of days over 4 years (365*4+1), not counting the extra days
+                // for leap years. If a reference date was available,
+                // the calculation could be more precise, but becomes complex,
+                // since the exact result depends on where the reference date
+                // falls within the period (e.g. beginning, end or ???)
+                // 1 year ~ (365*4+1)/4*60*60*24*100 = 3155760000 centiseconds
+                // 1 month ~ (365*4+1)/48*60*60*24*100 = 262980000 centiseconds
+                // 1 day = 8640000 centiseconds
+                // 1 hour = 360000 centiseconds
+                // 1 minute = 6000 centiseconds
+                var str = "P";
+                var nCs=n;
+                var nY=0, nM=0, nD=0, nH=0, nMin=0, nS=0;
+                n = Math.max(n,0); // there is no such thing as a negative duration
+                var nCs = n;
+                // Next set of operations uses whole seconds
+                with (Math)
+                {
+                    nCs = round(nCs);
+                    if (bPrecise == true)
+                    {
+                        nD = floor(nCs / 8640000);
+                    }
+                    else
+                    {
+                        nY = floor(nCs / 3155760000);
+                        nCs -= nY * 3155760000;
+                        nM = floor(nCs / 262980000);
+                        nCs -= nM * 262980000;
+                        nD = floor(nCs / 8640000);
+                    }
+                    nCs -= nD * 8640000;
+                    nH = floor(nCs / 360000);
+                    nCs -= nH * 360000;
+                    var nMin = floor(nCs /6000);
+                    nCs -= nMin * 6000
+                }
+                // Now we can construct string
+                if (nY > 0) str += nY + "Y";
+                if (nM > 0) str += nM + "M";
+                if (nD > 0) str += nD + "D";
+                if ((nH > 0) || (nMin > 0) || (nCs > 0))
+                {
+                    str += "T";
+                    if (nH > 0) str += nH + "H";
+                    if (nMin > 0) str += nMin + "M";
+                    if (nCs > 0) str += (nCs / 100) + "S";
+                }
+                if (str == "P") str = "PT0H0M0S";
+                // technically PT0S should do but SCORM test suite assumes longer form.
+                return str;
+            }
+        </script>
+
+        <script type="text/javascript" src="app/store/DataQualityStore.js"></script>
+        <script type="text/javascript" src="app/store/Offerings.js"></script>
+        <script type="text/javascript" src="app/store/Procedures.js"></script>
+        <script type="text/javascript" src="app/store/ObservedProperties.js"></script>
+
+        <script type="text/javascript" src="app/store/Services.js"></script>
+        <script type="text/javascript" src="app/store/gridProceduresList.js"></script>
+        <script type="text/javascript" src="app/view/ui/obsPropEditor.js"></script>
+        <script type="text/javascript" src="app/store/gridOfferings.js"></script>
+
+
+        <script type="text/javascript" src="app/Procedure.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/CheckColumn.js"></script>
+        <script type="text/javascript" src="app/view/CheckColumn.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/Calc.js"></script>
+        <script type="text/javascript" src="app/view/Calc.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/Chart.js"></script>
+        <script type="text/javascript" src="app/view/Chart.js"></script>
+
+
+        <script type="text/javascript">
+            
+            Ext.ns("wa");
+            wa.isodef = "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601";
+            
+            Ext.Loader.setConfig({
+                enabled: false
+            });
+
+            Ext.application({
+                name: 'istsos',
+                launch: function() {
+                    
+                    Ext.QuickTips.init();
+                    
+                    var cmp9 = Ext.create('Ext.Viewport', {
+                        layout: {
+                            type: 'fit'
+                        },
+                        items: {
+                            xtype: 'panel',
+                            layout: {
+                                type: 'border'
+                            },
+                            title: 'TEST PAGE: CHART',
+                            items: [
+                                {
+                                    xtype: 'panel',
+                                    layout: {
+                                        type: 'fit'
+                                    },
+                                    region: 'north'
+                                },
+                                Ext.create('istsos.view.Chart',{
+                                    region: 'center',
+                                    id: 'chartpanel'
+                                })
+                            ]
+                        }
+                    });
+                    
+                    cmp9.show();
+                }
+            });
+          
+        </script>
+    </head>
+    <body>
+        <!--<div class="softLink" onclick="execute();">
+            execute
+        </div>
+        <div id="here" style="width: 100%"></div>-->
+    </body>
+</html>
diff --git a/interface/test_procedure.html b/interface/test_procedure.html
new file mode 100755
index 0000000..7912970
--- /dev/null
+++ b/interface/test_procedure.html
@@ -0,0 +1,127 @@
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>extDesigner</title>
+        <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css"/>
+        <link rel="stylesheet" type="text/css" href="css/main.css"/>
+        <link href='http://fonts.googleapis.com/css?family=Patrick+Hand' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Nova+Square' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
+
+        <script type="text/javascript">
+            function ISO8601FromDate(isodate) {
+                function pad(n){return n<10 ? '0'+n : n}
+                var offset = isodate.getTimezoneOffset()/-60;
+                var tz = ((offset > 0) ? "+"+pad(offset) : pad(offset))
+                return isodate.getFullYear()+'-'
+                    + pad(isodate.getMonth()+1)+'-'
+                    + pad(isodate.getDate())+'T'
+                    + pad(isodate.getHours())+':'
+                    + pad(isodate.getMinutes())+':'
+                    + pad(isodate.getSeconds())+'.'
+                    + isodate.getMilliseconds() + tz;
+            }
+            String.prototype.capitalize = function(){
+                return this.toLowerCase().replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
+            };
+            Ext.override(Ext.layout.Layout, {
+                renderItem: function(item, target, position) {
+                    if (item && !item.rendered && item.isFieldLabelable && item.fieldLabel && item.allowBlank == false) {
+                        item.fieldLabel = '<span title="This is a mandatory parameter">' + item.fieldLabel + '<span style="color:red">*</span></span>';
+                    }
+                    this.callOverridden(arguments);
+                }
+            });
+            /*Ext.override(Ext.form.field.Picker, {
+                alignPicker: Ext.Function.createSequence(Ext.form.field.Picker.prototype.alignPicker, function() {
+                    var picker = this.getPicker();
+                    picker.setHeight(picker.store && picker.store.getCount() ? null : 0);
+                })
+            });
+            
+            Ext.override(Ext.form.field.Picker, {
+                alignPicker: function() {
+                    var me = this,
+                    picker = me.getPicker();
+                    if (me.isExpanded) {
+                        if (me.matchFieldWidth) {
+                            // Auto the height (it will be constrained by min and max width) unless there are no records to display.
+                            picker.setWidth(me.bodyEl.getWidth());
+                        } else { // MODIFIED - this else block added 
+                            picker.setSize(
+                            me.listConfig ? me.listConfig.width || null : null,
+                            ( picker.store && picker.store.getCount() ) ? null : 0
+                        );
+                        }
+                        if (picker.isFloating()) {
+                            me.doAlign();
+                        }
+                        picker.setHeight(picker.store && picker.store.getCount() ? null : 0);
+                    }
+                }
+            });*/
+        </script>
+
+        <script type="text/javascript" src="app/store/Fake.js"></script>
+        <script type="text/javascript" src="app/store/cmbIdentification.js"></script>
+        <script type="text/javascript" src="app/store/cmbSystemType.js"></script>
+        <script type="text/javascript" src="app/store/cmbSml.js"></script>
+        <script type="text/javascript" src="app/store/cmbName.js"></script>
+        <script type="text/javascript" src="app/store/cmbDocumentFormat.js"></script>
+        <script type="text/javascript" src="app/store/gridDocumentation.js"></script>
+        <script type="text/javascript" src="app/store/gridOutputs.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/procedure.js"></script>
+        <script type="text/javascript" src="app/view/procedure.js"></script>
+
+        <script type="text/javascript">
+            
+            Ext.Loader.setConfig({
+                enabled: false
+            });
+
+            Ext.application({
+                name: 'istsos',
+                stores: [
+                    'Fake'
+                ],
+                launch: function() {
+                    Ext.QuickTips.init();
+
+                    var cmp9 = Ext.create('istsos.view.procedure', {
+                        renderTo: Ext.getBody(),
+                        id: 'procedureid',
+                        width: 1100,
+                        height: 900,
+                        dockedItems: [
+                            {
+                                xtype: 'toolbar',
+                                dock: 'top',
+                                items: [
+                                    {
+                                        xtype: 'button',
+                                        text: 'SUBMIT',
+                                        id: 'configsubmit',
+                                        handler: function(){
+                                            Ext.getCmp('procedureid').executePost();
+                                        }
+                                    },
+                                    {
+                                        xtype: 'button',
+                                        text: 'TEST',
+                                        handler: function(){
+                                            Ext.getCmp('procedureid').getContacts();
+                                        }
+                                    }
+                                ]
+                            }
+                        ]
+                    });
+                    cmp9.show();
+                }
+            });
+            
+        </script>
+    </head>
+    <body></body>
+</html>
diff --git a/interface/test_requests.html b/interface/test_requests.html
new file mode 100755
index 0000000..d81b099
--- /dev/null
+++ b/interface/test_requests.html
@@ -0,0 +1,25 @@
+<!--
+To change this template, choose Tools | Templates
+and open the template in the editor.
+-->
+<!DOCTYPE html>
+<html>
+    <head>
+        <title></title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    </head>
+    <body>
+        <table style="width: 100%; height: 100%">
+            <tbody>
+                <tr>
+                    <td>
+                        
+                    </td>
+                    <td>
+                        <iframe id=""/>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </body>
+</html>
diff --git a/interface/test_virtualprocedureeditor.html b/interface/test_virtualprocedureeditor.html
new file mode 100755
index 0000000..7e7a7b0
--- /dev/null
+++ b/interface/test_virtualprocedureeditor.html
@@ -0,0 +1,53 @@
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>extDesigner</title>
+        <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css"/>
+        <link rel="stylesheet" type="text/css" href="css/main.css"/>
+        <link href='http://fonts.googleapis.com/css?family=Patrick+Hand' rel='stylesheet' type='text/css'>
+        <link href='http://fonts.googleapis.com/css?family=Nova+Square' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
+        
+        
+        <script src="codemirror/lib/codemirror.js"></script>
+        <link rel="stylesheet" href="codemirror/lib/codemirror.css">
+        <script src="codemirror/mode/python/python.js"></script>
+        <script type="text/javascript" src="ext/codemirror.js"></script>
+        
+        
+        <script type="text/javascript" src="app/store/RatingCurve.js"></script>
+        <script type="text/javascript" src="app/store/vplist.js"></script>
+
+        <script type="text/javascript" src="app/view/ui/VirtualProcedureEditor.js"></script>
+        <script type="text/javascript" src="app/view/VirtualProcedureEditor.js"></script>
+
+        <script type="text/javascript">
+            
+            Ext.ns("wa");
+            wa.isodef = "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601";
+            wa.url = "../wa";
+
+            Ext.Loader.setConfig({
+                enabled: false
+            });
+
+            Ext.application({
+                name: 'istsos',
+                launch: function() {
+                    Ext.QuickTips.init();
+                    
+                    Ext.create('Ext.container.Viewport', {
+                        layout: 'fit',
+                        items: Ext.create('istsos.view.VirtualProcedureEditor',{
+                            istService: 'demo'
+                        }),
+                        padding: 35
+                    });
+                    
+                }
+            });
+            
+        </script>
+    </head>
+    <body></body>
+</html>
diff --git a/interface/viewer.html b/interface/viewer.html
new file mode 100755
index 0000000..fce859c
--- /dev/null
+++ b/interface/viewer.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <title>istSOS - Data viewer</title>
+        <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css"/>
+        <!--[if gte IE 9]>
+            <style type="text/css">
+                .gradient {
+                filter: none;
+                }
+            </style>
+        <![endif]-->
+        <link rel="stylesheet" type="text/css" href="css/main.css"/>
+
+        <link href='http://fonts.googleapis.com/css?family=Electrolize' rel='stylesheet' type='text/css'>
+
+        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
+
+        <script type="text/javascript" src="dygraphs/dygraph-combined.js"></script>
+
+        <script type="text/javascript" src="app/store/Offerings.js"></script>
+        <script type="text/javascript" src="app/store/gridProceduresList.js"></script>
+        <script type="text/javascript" src="app/store/Services.js"></script>
+        
+        <script type="text/javascript" src="app/store/ObservedProperties.js"></script>
+        
+        <script type="text/javascript" src="app/view/ui/ProcedureChooser.js"></script>
+        <script type="text/javascript" src="app/view/ProcedureChooser.js"></script>
+        
+        <script type="text/javascript" src="app/view/ui/ProcedureChart.js"></script>
+        <script type="text/javascript" src="app/view/ProcedureChart.js"></script>
+        
+        <script type="text/javascript" src="app/view/ui/ProcedureGrid.js"></script>
+        <script type="text/javascript" src="app/view/ProcedureGrid.js"></script>
+        
+        
+        <script type="text/javascript" src="app/view/ui/Viewer.js"></script>
+        <script type="text/javascript" src="app/view/Viewer.js"></script>
+
+        <script type="text/javascript" src="app/Procedure.js"></script>
+
+
+
+        <style type="text/css">
+
+            .x-btn-default-toolbar-small .x-btn-inner {
+                color: white !important;
+            }
+            .x-btn-arrow {
+                background-image: url('ext/resources/themes/images/default/button/arrow.gif');
+                display: block;
+            }
+        </style> 
+
+        <script type="text/javascript">
+            
+            function pad(n){return n<10 ? '0'+n : n}
+            
+            Ext.ns("wa");
+            wa.url = "../wa";
+
+            Ext.Loader.setConfig({
+                enabled: false
+            });
+            
+            Ext.application({
+                
+                name: 'istsos',
+
+                launch: function() {
+                    
+                    Ext.QuickTips.init();
+                    
+                    Ext.Ajax.on("requestexception",function(conn, response, options, eOpts ){
+                        try{
+                            var json = Ext.decode(response.responseText);
+                            if(!json.success && !Ext.isEmpty(json.message)){
+                                Ext.Msg.alert(response.statusText, json.message);
+                            }
+                        }catch(e){
+                            console.error(response);
+                        }
+                    });
+                    
+                    Ext.Ajax.on("requestcomplete",function(conn, response, options, eOpts ){
+                        try{
+                            var json = Ext.decode(response.responseText);
+                            if(!json.success && !Ext.isEmpty(json.message)){
+                                Ext.Msg.alert("Server message",json.message + "<br/><br/>" + 
+                                    "<small>Status response: " + response.statusText + "</small><br/>" + 
+                                    "<small>Resource: " + json.resource + "</small><br/>" + 
+                                    "<small>Method: " + json.method + "</small><br/>" + 
+                                    "<small>Path " + json.path + "</small>");
+                                console.error(json.message);
+                            }else if (json.success && !Ext.isEmpty(json.message)){
+                                console.log(json.message);
+                            }
+                        }catch(e){
+                            console.error(response);
+                        }
+                    });
+                    
+                    Ext.create('istsos.view.Viewer', {
+                        renderTo: Ext.getBody()
+                    }).show();
+                    
+                }
+            });
+        </script>
+    </head>
+    <body></body>
+</html>
diff --git a/istsoslib/__init__.py b/istsoslib/__init__.py
new file mode 100755
index 0000000..b203b48
--- /dev/null
+++ b/istsoslib/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "renderers", "responders", "filters", "sosDatabase", "sosException","sos_version" ]
diff --git a/istsoslib/__init__.pyc b/istsoslib/__init__.pyc
new file mode 100644
index 0000000..53d5a60
Binary files /dev/null and b/istsoslib/__init__.pyc differ
diff --git a/istsoslib/filters/DS_filter.py b/istsoslib/filters/DS_filter.py
new file mode 100755
index 0000000..f88a296
--- /dev/null
+++ b/istsoslib/filters/DS_filter.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import sosConfig
+from istsoslib.filters import filter as f
+from istsoslib import sosException
+
+class sosDSfilter(f.sosFilter):
+    "filter object for a DescribeSensor request"
+    def __init__(self,sosRequest,method,requestObject,sosConfig):
+        f.sosFilter.__init__(self,sosRequest,method,requestObject,sosConfig)
+        #**************************
+        if method == "GET":
+            self.outputFormat = None
+            self.procedure = None
+            #-------OUTPUTFORMAT----
+            if requestObject.has_key("outputformat"):
+                if requestObject["outputformat"] in sosConfig.parameters["DS_outputFormats"]:
+                    self.outputFormat = requestObject["outputformat"]
+                else:
+                    err_txt = "Supported \"outputFormat\" values are: " + ",".join(sosConfig.parameters["DS_outputFormats"])
+                    raise sosException.SOSException("InvalidParameterValue","outputFormat",err_txt)
+            else:
+                #self.outputFormat = sosConfig.parameters["DS_outputFormats"][0]
+                raise sosException.SOSException("MissingParameterValue","outputFormat","Parameter \"outputFormat\" is mandatory")
+            #---------PROCEDURES----
+            if requestObject.has_key("procedure"):
+                """
+                self.procedure = requestObject["procedure"]
+                """
+                prc = requestObject["procedure"].split(":")
+                self.procedure = prc[-1]
+                if len(prc)>1:
+                    prc[-1]=""
+                    if ":".join(prc)==sosConfig.urn["procedure"]:
+                        pass
+                    else:
+                        err_txt = "Supported \"procedure\" urn is: " + sosConfig.urn["procedure"]
+                        err_txt += "\n passed: " + ":".join(prc) 
+                        raise sosException.SOSException("InvalidParameterValue","procedure",err_txt)
+            else:
+                raise sosException.SOSException("MissingParameterValue","procedure","Parameter \"procedure\" is mandatory with multiplicity 1")
+        #**************************            
+        if method == "POST":            
+            from xml.dom import minidom
+            self.outputFormat = None
+            self.procedure = None
+            #-------OUTPUTFORMAT--
+            if "outputFormat" in requestObject.attributes.keys():
+                self.outputFormat = str(requestObject.getAttribute("outputFormat"))
+                if self.outputFormat not in sosConfig.parameters["DS_outputFormats"]:
+                    err_txt = "Allowed \"outputFormat\" values are: " + ",".join(sosConfig.parameters["DS_outputFormats"])
+                    raise sosException.SOSException("InvalidParameterValue","outputFormat",err_txt)
+            else:
+                err_txt = "Parameter \"outputFormat\" is mandatory"
+                raise sosException.SOSException("MissingParameterValue","outputFormat","Parameter \"outputFormat\" is mandatory")
+            #-------PROCEDURES---
+            procs=requestObject.getElementsByTagName('procedure')
+            if len(procs) > 0:
+                if len(procs) < 2:
+                    #raise sosException.SOSException(1,"" + str(procs[0].nodeType) + "," + str(procs[0].TEXT_NODE))
+                    val = procs[0].firstChild
+                    if val.nodeType == val.TEXT_NODE:
+                        """
+                        self.procedure = str(val.data)
+                        """
+                        prc = str(val.data).split(":")
+                        if len(prc)>1:
+                            if prc[0:-1] == filter(None,sosConfig.urn["procedure"].split(":")):
+                                pass
+                            else:
+                                err_txt = "Supported \"procedure\" urn is: " + sosConfig.urn["procedure"]
+                                raise sosException.SOSException("InvalidParameterValue","procedure",err_txt)
+                        self.procedure = prc[-1] 
+                    else:
+                        err_txt = "XML parsing error (get value: procedure)"
+                        raise sosException.SOSException("MissingParameterValue","procedure","Parameter \"procedure\" is mandatory with multiplicity 1",err_txt)
+                else:
+                    err_txt = "Allowed only ONE parameter \"procedure\""
+                    raise sosException.SOSException("IvalidParameterValue","procedure",err_txt)
+            else:
+                err_txt = "Parameter \"procedure\" is mandatory"
+                raise sosException.SOSException("MissingParameterValue","procedure","Parameter \"procedure\" is mandatory with multiplicity 1")
+                
diff --git a/istsoslib/filters/DS_filter.pyc b/istsoslib/filters/DS_filter.pyc
new file mode 100644
index 0000000..8a08ff8
Binary files /dev/null and b/istsoslib/filters/DS_filter.pyc differ
diff --git a/istsoslib/filters/GC_filter.py b/istsoslib/filters/GC_filter.py
new file mode 100755
index 0000000..3c065b0
--- /dev/null
+++ b/istsoslib/filters/GC_filter.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License. 
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import sosConfig
+from istsoslib.filters import filter as f
+from istsoslib import sosException
+
+class sosGCfilter(f.sosFilter):
+    "filter object for a GetCapabalities request"
+    def __init__(self,sosRequest,method,requestObject,sosConfig):
+        f.sosFilter.__init__(self,sosRequest,method,requestObject,sosConfig)
+        #**************************
+        if method == "GET":
+            #-------SECTIONS-------------           
+            if requestObject.has_key("section"):
+                self.sections = requestObject["section"].lower().split( "," )
+                for s in self.sections:
+                    if s not in sosConfig.parameters["GC_Section"]:
+                        err_txt = "Allowed parameter \"section\" values are: " + ",".join(sosConfig.parameters["GC_Section"])
+                        raise sosException.SOSException("InvalidParameterValue","sections",err_txt)
+            else:
+                self.sections=["all"]
+        #**************************
+        if method == "POST":           
+            if requestObject.nodeType == requestObject.ELEMENT_NODE:
+                #-------SECTIONS-------------
+                self.sections=[]
+                sects=requestObject.getElementsByTagName('section')
+                if len(sects) > 0:
+                    for sect in sects:
+                        for val in sect.childNodes:
+                            if val.nodeType == val.TEXT_NODE and str(val.data).lower() in sosConfig.parameters["GC_Section"]:
+                                self.sections.append(str(val.data).lower())
+                            else:
+                                err_txt = "Allowed parameter \"section\" values are: " + ",".join(sosConfig.parameters["GC_Section"])
+                                raise sosException.SOSException("InvalidParameterValue","sections",err_txt)
+                else:
+                    self.sections = ["all"]
+            
+
+    
+
+
diff --git a/istsoslib/filters/GC_filter.pyc b/istsoslib/filters/GC_filter.pyc
new file mode 100644
index 0000000..78d4d0f
Binary files /dev/null and b/istsoslib/filters/GC_filter.pyc differ
diff --git a/istsoslib/filters/GF_filter.py b/istsoslib/filters/GF_filter.py
new file mode 100755
index 0000000..92365c2
--- /dev/null
+++ b/istsoslib/filters/GF_filter.py
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import sosConfig
+from istsoslib.filters import filter as f
+from istsoslib import sosException
+
+def getElemTxt(node):
+    if node.hasChildNodes():
+        val = node.firstChild
+        if val.nodeType == val.TEXT_NODE:
+            return str(val.data)
+        else:
+            err_txt = "get node text value: \"%s\" is not of type TEXT" %(node.nodeName)
+            raise Exception(err_txt)
+    else:
+            err_txt = "get node text value: \"%s\" has no child node" %(node.nodeName)
+            raise Exception(err_txt)
+        
+def getElemAtt(node,att):
+    if att in node.attributes.keys():
+        return str(node.getAttribute(att))
+    else:
+        err_txt = "get node attribute value: \"%s\"has no \"%s\" attribute" %(node.nodeName,att)
+        raise Exception(err_txt)
+    
+def get_name_from_urn(stringa,urnName,sosConfig):
+    a = stringa.split(":")
+    name = a[-1]
+    urn = sosConfig.urn[urnName].split(":")
+    if len(a)>1:
+        for index in range(len(urn)-1):
+            if urn[index]==a[index]:
+                pass
+            else:
+                raise Exception(1,"Urn \"%s\" is not valid: %s."%(a,urn))
+    return name 
+
+class sosGFfilter(f.sosFilter):
+    "filter object for a GetFeatureOfInterest request"
+    def __init__(self,sosRequest,method,requestObject,sosConfig):
+        f.sosFilter.__init__(self,sosRequest,method,requestObject,sosConfig)
+        #**************************
+        if method == "GET":
+            #---FeatureOfInterest
+            if not requestObject.has_key("featureofinterestid"):
+                raise sosException.SOSException("MissingParameterValue","FeatureOfInterestId","Parameter \"FeatureOfInterestId\" is required with multiplicity 1")
+            else:
+                self.featureOfInterest = get_name_from_urn(requestObject["featureofinterestid"],"feature",sosConfig) #one-many ID
+            #---srsName
+            if requestObject.has_key("srsName"):
+                self.srsName = get_name_from_urn(requestObject["srsName"],"refsystem",sosConfig)
+                if not self.srsName in sosConfig.parameters["GO_srs"]:
+                    raise sosException.SOSException("OptionNotSupported","srsName","Supported \"srsName\" valueas are: " + ",".join(sosConfig.parameters["GO_srs"]))
+            else:
+                self.srsName = sosConfig.parameters["GO_srs"][0]
+        if method == "POST":
+            #---FeatureOfInterest
+            fets = requestObject.getElementsByTagName('FeatureOfInterestId')
+            if len(fets)==1:
+                try:
+                    self.featureOfInterest = get_name_from_urn(getElemAtt(fets[0],"xlink:href"),"feature",sosConfig)
+                except:
+                    try:
+                        self.featureOfInterest = get_name_from_urn(getElemTxt(fets[0]),"feature",sosConfig)
+                    except:
+                        err_txt = "XML parsing error (get value: FeatureOfInterestId)"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                err_txt = "parameter \"FeatureOfInterestId\" is mandatory with multiplicity 1"
+                if len(fets)==0:
+                    raise sosException.SOSException("MissingParameterValue","FeatureOfInterestId",err_txt)
+                else:
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+
+            #---srsName
+            srss = requestObject.getElementsByTagName('srsName')
+            if len(srss) ==1:
+                self.srsName = get_name_from_urn(getElemTxt(srss[0]),"refsystem",sosConfig)
+                if not self.srsName in sosConfig.parameters["GO_srs"]:
+                    raise sosException.SOSException("OptionNotSupported","srsName","Supported \"srsName\" valueas are: " + ",".join(sosConfig.parameters["GO_srs"]))
+            elif len(srss) == 0:
+                self.srsName = sosConfig.parameters["GO_srs"][0]
+            else:
+                err_txt = "parameter \"srsName\" is optional with multiplicity 1"
+                raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            
diff --git a/istsoslib/filters/GO_filter.py b/istsoslib/filters/GO_filter.py
new file mode 100755
index 0000000..884a62d
--- /dev/null
+++ b/istsoslib/filters/GO_filter.py
@@ -0,0 +1,564 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import sosConfig
+from istsoslib.filters import filter as f
+from istsoslib import sosException, sosUtils
+from lib import isodate as iso
+
+def get_name_from_urn(stringa,urnName,sosConfig):
+    a = stringa.split(":")
+    name = a[-1]
+    urn = sosConfig.urn[urnName].split(":")
+    if len(a)>1:
+        for index in range(len(urn)-1):
+            if urn[index]==a[index]:
+                pass
+            else:
+                raise Exception("Urn \"%s\" is not valid: %s."%(a,urn))
+    return name
+
+
+'''
+ATTRIBUTES:
+
+offering (string)
+qualityIndex (boolean)
+observedProperty (array of string)
+srsName (string)
+eventTime (array of string)
+procedure (array of string)
+featureOfInterest (array of string)
+
+'''
+class sosGOfilter(f.sosFilter):
+    "filter object for a GetObservations request"
+    def __init__(self,sosRequest,method,requestObject,sosConfig):
+        f.sosFilter.__init__(self,sosRequest,method,requestObject,sosConfig)
+        # @TODO Declare attribute first!
+        # self.offering = None
+        # etc..
+
+        #**************************
+        if method == "GET":
+            #---------- THE OFFERING
+            if requestObject.has_key("offering"):
+                try:
+                    self.offering = get_name_from_urn(requestObject["offering"],"offering",sosConfig)
+                except Exception as e:
+                    raise sosException.SOSException("InvalidParameterValue","offering","%s" % e)
+            else:
+                raise sosException.SOSException("MissingParameterValue","offering","Parameter \"offering\" is mandatory with multiplicity 1")
+                
+            #---------- THE OBSERVED PROPERTY
+            if requestObject.has_key("observedproperty"):
+                self.observedProperty = []
+                oprs = requestObject["observedproperty"].split(",")
+                for opr in oprs:
+                    # get_name_from_urn limit the ability to ask for an observedProperty with LIKE:
+                    # eg: ask "water" to get all the water related data, "water:discharge", "water:temperature" ...
+                    #oprName = get_name_from_urn(opr,"property")
+                    oprName = opr
+                    self.observedProperty.append(oprName) # one-many ID 
+            else:
+                raise sosException.SOSException("MissingParameterValue","observedProperty","Parameter \"observedProperty\" is mandatory with multiplicity N")
+                
+            #---------- RESPONSE FORMAT
+            if requestObject.has_key("responseformat"):
+                if not requestObject["responseformat"] in sosConfig.parameters["GO_responseFormat"]:   
+                    raise sosException.SOSException("InvalidParameterValue","responseFormat","Parameter \"responseFormat\" sent with invalid value : use one of %s" % "; ".join(sosConfig.parameters["GO_responseFormat"]))
+                else:
+                    self.responseFormat = requestObject["responseformat"]
+            else:
+                raise sosException.SOSException("MissingParameterValue","responseFormat","Parameter \"responseFormat\" is mandatory with multiplicity 1") #one
+                
+            #OPTIONAL request parameters
+            #---------- SRS FILTER                
+            if requestObject.has_key("srsname"):
+                try:
+                    self.srsName = get_name_from_urn(requestObject["srsname"],"refsystem",sosConfig)
+                except Exception as e:
+                    raise sosException.SOSException("InvalidParameterValue","srsname","%s" % e)
+            
+                if not self.srsName in sosConfig.parameters["GO_srs"]:
+                    raise sosException.SOSException("InvalidParameterValue","srsName","srsName \"%s\" not supported, use one of: %s" %(self.srsName,",".join(sosConfig.parameters["GO_srs"])))
+            else:
+                self.srsName = sosConfig.parameters["GO_srs"][0]
+
+            #---------- TIME FILTER                
+            if requestObject.has_key('eventtime'):
+                self.eventTime = []
+                for i in requestObject["eventtime"].replace(" ","+").split(","):
+                    if len(i.split("/")) < 3:
+                        self.eventTime.append(i.split("/"))
+                    else:
+                        raise sosException.SOSException("InvalidParameterValue","eventTime","Parameter \"eventTime\" bad formatted")
+                
+                # Checking if some event limitation is reached
+                #if sosConfig["maxGoPeriod"]:
+                tp=[]
+                for t in self.eventTime:
+                    if len(t) == 2:
+                        tp.append(iso.parse_datetime(t[0]))
+                        tp.append(iso.parse_datetime(t[1]))
+                    if len(t)==1:
+                        tp.append(iso.parse_datetime(t[0]))
+                if int(sosConfig.maxGoPeriod) > 0:
+                    from datetime import timedelta
+                    d = timedelta(hours=int(sosConfig.maxGoPeriod))
+                    userPeriod = max(tp)-min(tp)
+                    if d < userPeriod:
+                        raise sosException.SOSException("InvalidParameterValue","eventTime","You are requesting data for a period of [%s hours], but you are not permitted to ask for a period longer than: %s hours" % (userPeriod,d))
+                
+            else:
+                self.eventTime = None
+            
+            #---------- PROCEDURES FILTER
+            if requestObject.has_key("procedure"):
+                self.procedure = []
+                prcs = requestObject["procedure"].split(",")
+                for prc in prcs:
+                    try:
+                        prcName = get_name_from_urn(prc,"procedure",sosConfig)
+                    except Exception as e:
+                        raise sosException.SOSException("InvalidParameterValue","procedure","%s" % e)
+            
+                    self.procedure.append(prcName)
+            else:
+                self.procedure = None
+            
+            #---------- FEATURES OF INTEREST FILTER
+            self.featureOfInterest = None
+            self.featureOfInterestSpatial = None
+            if requestObject.has_key("featureofinterest"):
+                foi = requestObject["featureofinterest"]
+                if foi.find("<ogc:")>=0 and foi.find("<gml:")>=0:
+                    #raise sosException.SOSException(3,"FOI SPATIAL: %s" %(foi))
+                    self.featureOfInterestSpatial = sosUtils.ogcSpatCons2PostgisSql(foi,'geom_foi',sosConfig.istsosepsg)
+                else:
+                    try:
+                        self.featureOfInterest = get_name_from_urn(foi,"feature",sosConfig)
+                    except Exception as e:
+                        raise sosException.SOSException("InvalidParameterValue","featureofinterest","%s" % e)
+            
+                #fois = requestObject["featureOfInterest"].split(",")
+                #for foi in fois:
+                #    foiName = get_name_from_urn(foi,"feature")
+                #    self.featureOfInterest.append(foiName)
+            
+            #---------- FILTERS FOR QUERY NOT SUPPORTED YET            
+            if requestObject.has_key("result"):
+                #raise sosException.SOSException(3,"Parameter \"result\" not yet supported")
+                self.result = sosUtils.ogcCompCons2PostgisSql(requestObject["result"])
+            else:
+                self.result = None #zero-one optional
+            
+            #---------- RESULT MODEL
+            if requestObject.has_key("resultmodel"):
+                if requestObject["resultmodel"] in sosConfig.parameters["GO_resultModel"]:
+                    self.resultModel = requestObject["resultmodel"]                    
+                else:
+                    raise sosException.SOSException("InvalidParameterValue","resultModel","Parameter \"resultModel\" sent with invalid value: supported values are: %s" %",".join(sosConfig.parameters["GO_resultModel"]))                    
+            else:
+                self.resultModel = sosConfig.parameters["GO_resultModel"][0]
+            
+            #---------- RESPONSE MODE
+            if requestObject.has_key("responsemode"):
+                if requestObject["responsemode"] in sosConfig.parameters["GO_responseMode"]:
+                    self.responseMode = requestObject["responsemode"]
+                else:
+                    raise sosException.SOSException("InvalidParameterValue","responseMode","Parameter \"responseMode\" sent with invalid value, supported values are: %s" %(",".join(sosConfig.parameters["GO_responseMode"])))
+                    
+            else:
+                self.responseMode = sosConfig.parameters["GO_responseMode"][0]
+
+            ###########################
+            # NON STANDARD PARAMETERS #
+            ###########################
+            #---------- AGGREGATE INTERVAL
+            # In ISO 8601 duration format
+            if requestObject.has_key("aggregateinterval"):
+                # Check on the eventTime parameter: it must be only one interval: 2010-01-01T00:00:00+00/2011-01-01T00:00:01+00
+                exeMsg = "Using aggregate functions, the event time must exist with an interval composed by a begin and an end date (ISO8601)"
+                if self.eventTime == None or len(self.eventTime)!=1 or len(self.eventTime[0])!=2:
+                    raise sosException.SOSException("InvalidParameterValue","aggregateInterval",exeMsg)
+                self.aggregate_interval = requestObject["aggregateinterval"]
+                try:
+                    iso.parse_duration(self.aggregate_interval)
+                except Exception as ex:
+                    raise sosException.SOSException("InvalidParameterValue","aggregateInterval","Parameter \"aggregate_interval\" sent with invalid format (check ISO8601 duration spec): %s" % ex)
+            else:
+                self.aggregate_interval = None
+
+            #---------- AGGREGATE FUNCTION
+            # sum,avg,max,min
+            if requestObject.has_key("aggregatefunction"):
+                if self.aggregate_interval==None:
+                    raise sosException.SOSException("InvalidParameterValue","aggregateFunction","Using aggregate functions parameters \"aggregateInterval\" and \"aggregateFunction\" are both mandatory")
+                self.aggregate_function = requestObject["aggregatefunction"]
+                if not (self.aggregate_function.upper() in ["AVG","COUNT","MAX","MIN","SUM"]):
+                    raise sosException.SOSException("InvalidParameterValue","aggregateFunction","Available aggregation functions: avg, count, max, min, sum.")
+            else:
+                self.aggregate_function = None
+                
+            #---------- AGGREGATE NODATA
+            if requestObject.has_key("aggregatenodata"):
+                if self.aggregate_interval==None or self.aggregate_function==None:
+                    raise sosException.SOSException("InvalidParameterValue","aggregateNodata","Using aggregateNodata parameter requires both \"aggregateInterval\" and \"aggregateFunction\"")
+                self.aggregate_nodata = requestObject["aggregatenodata"]
+            else:
+                self.aggregate_nodata = sosConfig.aggregate_nodata
+                
+            #---------- AGGREGATE NODATA QUALITY INDEX
+            if requestObject.has_key("aggregatenodataqi"):
+                if self.aggregate_interval==None or self.aggregate_function==None:
+                    raise sosException.SOSException("InvalidParameterValue","aggregateNodataQi","Using aggregateNodataQi parameter requires both \"aggregateInterval\" and \"aggregateFunction\"")
+                self.aggregate_nodata_qi = requestObject["aggregatenodataqi"]
+            else:
+                self.aggregate_nodata_qi = sosConfig.aggregate_nodata_qi
+                
+            #------------ QUALITY INDEX
+            self.qualityIndex=False
+            if requestObject.has_key("qualityindex"):
+                if requestObject["qualityindex"].upper() == "TRUE":
+                    self.qualityIndex = True
+                elif requestObject["qualityindex"].upper() == "FALSE":
+                    self.qualityIndex = False
+                else:
+                    raise sosException.SOSException("InvalidParameterValue","qualityIndex","qualityIndex can only be True or False!")
+                #    self.qualityIndex = sosUtils.CQLvalueFilter2PostgisSql("id_qi_fk",requestObject["qualityIndex"])
+
+                
+                
+        #**********************
+        if method == "POST":
+            from xml.dom import minidom
+            #---------- THE OFFERING
+            offs = requestObject.getElementsByTagName('offering')
+            if len(offs) == 1:
+                val = offs[0].firstChild
+                if val.nodeType == val.TEXT_NODE:
+                    try:
+                        self.offering = get_name_from_urn(str(val.data),"offering",sosConfig)
+                    except Exception as e:
+                        raise sosException.SOSException("InvalidParameterValue","offering","%s" % e)
+                else:
+                    err_txt = "XML parsing error (get value: offering)"
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                err_txt = "Parameter \"offering\" is mandatory with multiplicity 1"
+                raise sosException.SOSException("MissingParameterValue","offering",err_txt)
+            
+            
+            #---------- THE OBSERVED PROPERTY
+            obsProps = requestObject.getElementsByTagName('observedProperty')
+            self.observedProperty = []
+            if len(obsProps) > 0:
+                for obsProp in obsProps:
+                    val = obsProp.firstChild
+                    if val.nodeType == val.TEXT_NODE:                    
+                        # get_name_from_urn limit the ability to ask for an observedProperty with LIKE:
+                        # eg: ask "water" to get all the water related data, "water:discharge", "water:temperature" ...
+                        #self.observedProperty.append(get_name_from_urn(str(val.data),"property"))
+                        self.observedProperty.append(str(val.data))
+                    else:
+                        err_txt = "XML parsing error (get value: observedProperty)"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                err_txt = "Parameter \"observedProperty\" is mandatory with multiplicity N"
+                raise sosException.SOSException("MissingParameterValue","observedProperty",err_txt)
+            
+            #---------- RESPONSE FORMAT
+            respF = requestObject.getElementsByTagName('responseFormat')
+            if len(respF) == 1:
+                val = respF[0].firstChild
+                if val.nodeType == val.TEXT_NODE:
+                    self.responseFormat = str(val.data)
+                    if self.responseFormat not in sosConfig.parameters["GO_responseFormat"]:   
+                        raise sosException.SOSException("InvalidParameterValue","responseFormat","Parameter \"responseFormat\" sent with invalid value: use one of %s" % "; ".join(sosConfig.parameters["GO_responseFormat"]))
+                else:
+                    err_txt = "XML parsing error (get value: responseFormat)"
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                err_txt = "Parameter \"responseFormat\" is mandatory with multiplicity 1"
+                raise sosException.SOSException("MissingParameterValue","responseFormat",err_txt)
+            
+            #OPTIONAL request parameters
+            #---------- SRS OF RETURNED GML FEATURES
+            srs = requestObject.getAttributeNode('srsName')
+            if srs:
+                self.srsName = srs.nodeValue
+                if not self.srsName in sosConfig.parameters["GO_srs"]:
+                    raise sosException.SOSException("InvalidParameterValue","srsName","srsName \"%s\" not supported, use one of: %s" %(self.srsName,",".join(sosConfig.parameters["GO_srs"])))
+            else:
+                self.srsName = sosConfig.parameters["GO_srs"][0]
+            """
+            srss = requestObject.getElementsByTagName('srsName')
+            if len(srss) > 0:
+                if len(srss) < 2:
+                    val = srss[0].firstChild
+                    if val.nodeType == val.TEXT_NODE:
+                        self.srsName = get_name_from_urn(str(val.data),"refsystem",sosConfig)
+                    else:
+                        err_txt = "XML parsing error (get value: srsName)"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                else:
+                    err_txt = "Allowed only ONE parameter \"srsName\""
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                self.srsName = sosConfig.parameters["GO_srs"][0]
+            """
+            #---------- TIME FILTER  
+            evtms = requestObject.getElementsByTagName('eventTime')
+            self.eventTime = []
+            if len(evtms) > 0:
+                for evtm in evtms:
+                    tps = evtm.getElementsByTagName('gml:TimePeriod')
+                    for tp in tps:
+                        begin = tp.getElementsByTagName('gml:beginPosition')
+                        end = tp.getElementsByTagName('gml:endPosition')
+                        if len(begin)==1 and len(end)==1:
+                            Bval = begin[0].firstChild
+                            Eval = end[0].firstChild
+                            #raise sosException.SOSException(1,end[0].toprettyxml())
+                            if Bval.nodeType == Bval.TEXT_NODE and Eval.nodeType == Eval.TEXT_NODE:
+                                self.eventTime.append([str(Bval.data).replace(" ","+"),str(Eval.data).replace(" ","+")])
+                                #raise sosException.SOSException(1,str(self.eventTime))
+                            else:
+                                err_txt = "XML parsing error (get value: TimePeriod)"
+                                raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                            
+                    tis = evtm.getElementsByTagName('gml:TimeInstant')
+                    for ti in tis:
+                        instant = ti.getElementsByTagName('gml:timePosition')
+                        if len(instant)>0 and len(instant)<2:
+                            Ival = instant[0].firstChild
+                            if Ival.nodeType == Ival.TEXT_NODE:
+                                self.eventTime.append([str(Ival.data).replace(" ","+")])
+                            else:
+                                err_txt = "XML parsing error (get value: Timeinstant)"
+                                raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                self.eventTime = None
+                
+            #---------- PROCEDURES FILTER
+            procs = requestObject.getElementsByTagName('procedure')
+            if len(procs) > 0:
+                self.procedure=[]
+                for proc in procs:
+                    if "xlink:href" in proc.attributes.keys():
+                        self.procedure.append(str(proc.getAttribute("xlink:href")))
+                    elif proc.hasChildNodes():
+                        val = proc.firstChild
+                        if val.nodeType == val.TEXT_NODE:
+                            try:
+                                self.procedure.append(get_name_from_urn(str(val.data),"procedure",sosConfig))
+                            except Exception as e:
+                                raise sosException.SOSException("InvalidParameterValue","procedure","%s" % e)
+                    else:
+                        err_txt = "XML parsing error (get value: procedure)"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                self.procedure = None
+            
+            #---------- FEATURES OF INTEREST FILTER
+            fets = requestObject.getElementsByTagName('featureOfInterest')
+            self.featureOfInterest = None
+            self.featureOfInterestSpatial = None
+            # get sub-elements of FOI
+            if fets:
+                elements = [e for e in fets[0].childNodes if e.nodeType == e.ELEMENT_NODE]
+#            else:
+#               import sys
+#               print >> sys.stderr, "\n\nELE: %s" % len(elements)                    
+#                err_txt = "Parameter \"featureOfInterest\" is mandatory"
+#                raise sosException.SOSException("MissingParameterValue","featureOfInterest",err_txt)            
+            
+                if len(elements)==0:
+                    err_txt = "ObjectID or ogc:spatialOps elements in parameter \"featureOfInterest\" are mandatory"
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                # only one sub element                    
+                elif len(elements)==1 and elements[0].tagName!="ObjectID" :
+                    self.featureOfInterestSpatial = sosUtils.ogcSpatCons2PostgisSql(elements[0],'geom_foi',sosConfig.istsosepsg)            
+                else:
+                    tempfois=[]
+                    for e in elements:
+                        if not e.tagName=="ObjectID":
+                            err_txt = "Allowed only ObjectID or ogc:spatialOps elements in parameter \"featureOfInterest\""
+                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                        try:
+                            val = e.firstChild
+                            import sys
+                            print >> sys.stderr, "\n\nVAL: %s\n\n" % (val.data) 
+                            if val.nodeType == val.TEXT_NODE:
+                                try:
+                                    tempfois.append( get_name_from_urn(str(val.data),"feature",sosConfig) )
+                                except Exception as e:
+                                     raise sosException.SOSException("InvalidParameterValue","featureOfInterest","%s" % e)
+                        except Exception as e:
+                            raise e
+                        
+                    self.featureOfInterest = ",".join(tempfois)
+                
+            
+            #---------- FILTERS FOR QUERY NOT SUPPORTED YET            
+            ress = requestObject.getElementsByTagName('result')
+            if len(ress)>0:
+                raise sosException.SOSException("NoApplicableCode",None,"Parameter \"result\" not yet supported")
+            else:
+                self.result = None #zero-one optional
+            
+            #---------- RESULT MODEL
+            mods = requestObject.getElementsByTagName('resultModel')
+            if len(mods)>0:
+                if len(mods)<2:
+                    val = mods[0].firstChild
+                    if val.nodeType == val.TEXT_NODE:
+                        self.resultModel = str(val.data)
+                        if self.resultModel not in sosConfig.parameters["GO_resultModel"]:
+                            raise sosException.SOSException("InvalidParameterValue","resultModel","Parameter \"resultModel\" sent with invalid value")
+                    else:
+                        err_txt = "XML parsing error (get value: resultModel)"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                else:
+                    err_txt = "Allowed only ONE parameter \"resultModel\""
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                self.resultModel = None
+            
+            #---------- RESPONSE MODE
+            rsmods = requestObject.getElementsByTagName('responseMode')
+            if len(rsmods)>0:
+                if len(rsmods)<2:
+                    val = rsmods[0].firstChild
+                    if val.nodeType == val.TEXT_NODE:
+                        self.responseMode = str(val.data)
+                        if self.responseMode not in sosConfig.parameters["GO_responseMode"]:
+                            raise sosException.SOSException("InvalidParameterValue","responseMode","Parameter \"responseMode\" sent with invalid value")
+                    else:
+                        err_txt = "XML parsing error (get value: responseMode)"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                else:
+                    err_txt = "Allowed only ONE parameter \"responseMode\""
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            else:
+                self.responseMode = sosConfig.parameters["GO_responseMode"][0]
+        
+
+            #-------------- AGGREGATE INTERVAL & FUNCTION
+            self.aggregate_interval = None
+            self.aggregate_function = None
+            self.aggregate_nodata = None
+            self.aggregate_nodata_qi = None
+            
+            aggint = requestObject.getElementsByTagName('aggregateInterval')
+            aggfun = requestObject.getElementsByTagName('aggregateFunction')
+            aggnodata = requestObject.getElementsByTagName('aggregateNodata')
+            
+            if len(aggint)==1 and len(aggfun)==1:
+                #-----------------------
+                # -- aggregate_interval
+                #-----------------------
+                # Check on the eventTime parameter: it must be only one interval: 2010-01-01T00:00:00+00/2011-01-01T00:00:01+00
+                exeMsg = "Using aggregate functions, the event time must exist with an interval composed by a begin and an end date (ISO8601)"
+                if self.eventTime == None or len(self.eventTime)!=1 or len(self.eventTime[0])!=2:
+                    raise sosException.SOSException("NoApplicableCode",None,exeMsg)
+                val = aggint[0].firstChild
+                if val.nodeType == val.TEXT_NODE:
+                    self.aggregate_interval = str(val.data)
+                    try:
+                        iso.parse_duration(self.aggregate_interval)
+                    except Exception as ex:
+                        raise sosException.SOSException("InvalidParameterValue","aggregateInterval","Parameter \"aggregate_interval\" sent with invalid format (check ISO8601 duration spec): %s" % ex)
+                else:
+                    err_txt = "cannot get ISO8601 duration value in \"aggregateInterval\""
+                    raise sosException.SOSException("InvalidParameterValue","aggregateInterval",err_txt)
+                #-----------------------
+                # -- aggregate_function
+                #-----------------------
+                val = aggfun[0].firstChild
+                if val.nodeType == val.TEXT_NODE:
+                    self.aggregate_function = str(val.data)
+                    if not (self.aggregate_function.upper() in ["AVG","COUNT","MAX","MIN","SUM"]):
+                        raise sosException.SOSException("InvalidParameterValue","aggregateFunction","Available aggregation functions: avg, count, max, min, sum.")
+                
+                
+                #-----------------------------------
+                # -- aggregate_no_data default value
+                #-----------------------------------
+                if len(aggnodata)==1:
+                    val = aggnodata[0].firstChild
+                    self.aggregate_nodata = str(val.data)
+                else:
+                    self.aggregate_nodata = sosConfig.aggregate_nodata
+
+           #================================
+           #MISSING AGGREGATE QUALITY INDEX
+           #================================         
+                    
+            elif len(aggint)==0 and len(aggfun)==0:
+                pass
+            else:
+                err_txt = "\"aggregateInterval\" and \"aggregate_function\" are both required with multiplicity 1"
+                raise sosException.SOSException("NoApplicableCode",None,err_txt)
+
+            #------------ QUALITY INDEX
+            self.qualityIndex=False
+            qidx = requestObject.getElementsByTagName('qualityIndex')
+            if len(qidx)>0:
+                if len(qidx)<2:
+                    val = qidx[0].firstChild
+                    if val.nodeType == val.TEXT_NODE:
+                        self.qualityIndex = str(val.data)
+                        if self.qualityIndex.upper() == "TRUE":
+                            self.qualityIndex=True
+                        elif self.qualityIndex.upper() == "FALSE":
+                            pass
+                        else:
+                            raise sosException.SOSException("InvalidParameterValue","qualityIndex","qualityIndex can only be \'True\' or \'False\'")
+            elif len(qidx)==0:
+                pass
+            else:
+                err_txt = "\"qualityIndex\" is allowed with multiplicity 1 only"
+                raise sosException.SOSException("NoApplicableCode",None,err_txt)
+
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+
diff --git a/istsoslib/filters/GO_filter.pyc b/istsoslib/filters/GO_filter.pyc
new file mode 100644
index 0000000..46ca828
Binary files /dev/null and b/istsoslib/filters/GO_filter.pyc differ
diff --git a/istsoslib/filters/IO_filter.py b/istsoslib/filters/IO_filter.py
new file mode 100755
index 0000000..c2aa9cd
--- /dev/null
+++ b/istsoslib/filters/IO_filter.py
@@ -0,0 +1,274 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import sosConfig
+from istsoslib.filters import filter as f
+from istsoslib import sosException
+from lib.etree import et
+
+def parse_and_get_ns(file):
+    events = "start", "start-ns"
+    root = None
+    ns = {}
+    for event, elem in et.iterparse(file, events):
+        if event == "start-ns":
+            if elem[0] in ns and ns[elem[0]] != elem[1]:
+                # NOTE: It is perfectly valid to have the same prefix refer
+                #   to different URI namespaces in different parts of the
+                #   document. This exception serves as a reminder that this
+                #   solution is not robust.  Use at your own peril.
+                raise KeyError("Duplicate prefix with different URI found.")
+            ns[elem[0]] = "%s" % elem[1]
+        elif event == "start":
+            if root is None:
+                root = elem 
+    return et.ElementTree(root), ns
+
+class sosIOfilter(f.sosFilter):
+    "filter object for a InsertObservation request"
+    #self.sensorId
+    #self.samplingTime
+    #self.procedure
+    #self.observedProperty
+    #self.featureOfInterest
+    #self.data {def:string {"uom":string,"vals":[]}
+    def __init__(self,sosRequest,method,requestObject,sosConfig):
+        f.sosFilter.__init__(self,sosRequest,method,requestObject,sosConfig)
+        #**************************
+        if method == "GET":
+            raise sosException.SOSException("NoApplicableCode",None,"insertObservation request support only POST method!")
+        
+        if method == "POST":
+            from StringIO import StringIO
+            
+            tree, ns = parse_and_get_ns(StringIO(requestObject))
+            
+            #---assignedSensorId
+            #----------------------
+            AssignedSensorId = tree.find("{%s}AssignedSensorId" % ns['sos'] )
+            if AssignedSensorId == None:
+                raise sosException.SOSException("MissingParameterValue","AssignedSensorId","sos:AssignedSensorId parameter is mandatory with multiplicity 1")
+            else:
+                self.assignedSensorId = AssignedSensorId.text.split(":")[-1]
+            
+            #---forceInsert
+            ForceInsert = tree.find("{%s}ForceInsert" % ns['sos'] )
+            if not ForceInsert==None:
+                if ForceInsert.text == 'true' or ForceInsert.text == "":
+                    self.forceInsert = True 
+                elif ForceInsert.text == 'false':
+                    self.forceInsert = False
+                else:
+                    err_txt = "parameter \"ForceInsert\" can only be: 'true' or 'false'"
+                    raise sosException.SOSException("InvalidParameterValue","ForceInsert",err_txt)
+            else:
+                self.forceInsert = False
+                
+            #---om:observation
+            Observation = tree.find("{%s}Observation" % ns['om'] )
+            if Observation == None:
+                raise sosException.SOSException("MissingParameterValue","Observation","om:Observation tag is mandatory with multiplicity 1")
+            
+            #-------procedure
+            procedure = Observation.find("{%s}procedure" % ns['om'] )
+            if procedure == None:
+                raise sosException.SOSException("NoApplicableCode",None,"om:procedure tag is mandatory with multiplicity 1")
+            self.procedure = procedure.attrib[ "{%s}href" % ns['xlink'] ].split(":")[-1]
+
+            #-------ObservedProperties
+            self.oprName=[]
+            observedProperty = Observation.find("{%s}observedProperty" % ns['om'] )
+            if observedProperty == None:
+                raise sosException.SOSException("NoApplicableCode",None,"om:observedProperty tag is mandatory with multiplicity 1")
+            
+            
+            CompositPhenomenon = observedProperty.find("{%s}CompositePhenomenon" % ns['swe'] )
+            import traceback, sys
+            
+            if not CompositPhenomenon == None:
+                components = CompositPhenomenon.findall("{%s}component" % ns['swe'] )
+                for co in components:
+                    try:
+                        self.oprName.append(co.attrib[ "{%s}href" % ns['xlink'] ] )
+                    except:
+                        try:
+                            name = co.find("{%s}name" % ns['gml'] )
+                            self.oprName.append(name.text)
+                        except:
+                            raise sosException.SOSException("NoApplicableCode",None,"om:observedProperty Name is missing: 'xlink:href' or 'gml:name' required")
+            else:
+                try:
+                    self.oprName.append(observedProperty.attrib[ "{%s}href" % ns['xlink'] ])
+                except:
+                    try:
+                        name = co.find( "{%s}name" % ns['gml'] )
+                        self.oprName.append(name.text)
+                    except:
+                        raise sosException.SOSException("NoApplicableCode",None,"om:observedProperty Name is missing: 'xlink:href' or 'gml:name' required")
+                    
+            #-----samplingTime
+            samplingTime = Observation.find("{%s}samplingTime" % ns['om'] )
+            if samplingTime==None:
+                err_txt = "om:samplingTime is mandatory in multiplicity 1"
+                raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            
+            TimePeriod = samplingTime.find("{%s}TimePeriod" % ns['gml'] )
+            if not TimePeriod == None:
+                bp = TimePeriod.find("{%s}beginPosition" % ns['gml'] )
+                ep = TimePeriod.find("{%s}endPosition" % ns['gml'] )
+                if bp==None or ep==None:
+                    err_txt = "gml:TimePeriod is mandatory in multiplicity 1"
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                self.samplingTime = bp.text + "/" + ep.text
+
+            else:
+                TimeInstant = samplingTime.find("{%s}TimeInstant" % ns['gml'] )
+                if not TimeInstant==None:
+                    tpos = TimeInstant.find("{%s}timePosition" % ns['gml'] )
+                    self.samplingTime = tpos.text
+                else:
+                    err_txt = "one of gml:TimePeriod or gml:TimeInstant is mandatory in multiplicity 1"
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+            
+            #------featureOfInterest
+            featureOfInterest = Observation.find("{%s}featureOfInterest" % ns['om'] )
+            if featureOfInterest == None:
+                raise sosException.SOSException("NoApplicableCode",None,"om:featureOfInterest tag is mandatory with multiplicity 1")
+            try:
+                self.foiName = featureOfInterest.attrib[ "{%s}href" % ns['xlink'] ].split(":")[-1]
+            except:
+                try:
+                    gml_name = featureOfInterest.find("{%s}name" % ns['gml'] ).split(":")[-1]
+                    self.foiName = gml_name.text
+                except:
+                    raise sosException.SOSException("NoApplicableCode",None,"om:featureOfInterest name is missing: 'xlink:href' or 'gml:name' is required")
+            
+            #--result
+            if Observation.find("{%s}result" % ns['om'] ) == None:
+                raise sosException.SOSException("NoApplicableCode",None,"om:result tag is required")
+            
+            SimpleDataRecord = Observation.find("{%s}result/{%s}SimpleDataRecord" %(ns['om'],ns['swe']) )
+            DataArray = Observation.find("{%s}result/{%s}DataArray" %(ns['om'],ns['swe']) )
+            
+            ##########################################################################################################
+            #-----result---
+            #return self.data where self.data is a dictionary of "definition" containing dictionary of "uom" and "vals"
+            """ e.g.:
+            self.data = {   
+                        "urn:ist:parameter:time:iso8601": 
+                            {
+                            "uom":"sec", 
+                            "vals":["2009-07-31T12:00:00+02:00","2009-07-31T12:10:00+02:00","2009-07-31T12:20:00+02:00"]
+                            },
+                        "urn:ist:def:phenomenon:rainfall": 
+                            {
+                            "uom":"mm", 
+                            "vals":[0.1,0.2,0.3,0.4]
+                            }
+                        }
+            """
+            ##########################################################################################################
+            
+            self.parameters = []
+            self.uoms = []
+            self.data = {}
+            
+            #case SimpleDataRecord 
+            if not SimpleDataRecord==None and DataArray==None:
+                fields = SimpleDataRecord.findall("{%s}field" % ns['swe'] )
+                for field in fields:
+                    defin = None
+                    uom = None
+                    vals = []
+                    fieldName = field.attrib["name"]
+                    if not field.find("{%s}Time" % ns['swe']) == None:
+                        tf = field.find("{%s}Time" % ns['swe'])
+                        defin = tf.attrib["definition"]
+                        vals.append( tf.find("{%s}value" % ns['swe']).text )
+                    elif not field.find("{%s}Quantity" % ns['swe']) == None:
+                        qf = field.find("{%s}Quantity" % ns['swe'])
+                        defin = qf.attrib["definition"]
+                        uom = qf.find("{%s}uom" % ns['swe']).attrib["code"]
+                        vals.append( qf.find("{%s}value" % ns['swe']).text )
+                    else:
+                        err_txt = "swe:Time or swe:Quantity is mandatory in multiplicity 1"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                    self.data[defin]={"uom":uom,"vals":vals}
+            
+            #Case DataArray
+            elif SimpleDataRecord==None and not DataArray==None:
+                DataRecord = DataArray.find("{%s}elementType/{%s}DataRecord" % (ns['swe'],ns['swe']))
+                fields = DataRecord.findall("{%s}field" % ns['swe'] )
+                urnlist=[]
+                for id, field in enumerate(fields):
+                    defin = None
+                    uom = None
+                    vals = []
+                    #fieldName = field.attrib["name"]
+                    if not field.find("{%s}Time" % ns['swe']) == None:
+                        swet = field.find("{%s}Time" % ns['swe'])
+                        defin = swet.attrib["definition"]
+                        urnlist.append(swet.attrib["definition"])
+                    elif not field.find("{%s}Quantity" % ns['swe']) == None:
+                        sweq = field.find("{%s}Quantity" % ns['swe'])
+                        defin = sweq.attrib["definition"]
+                        urnlist.append( sweq.attrib["definition"])
+                        if not sweq.find("{%s}uom" % ns['swe']) == None:
+                           uom = sweq.find("{%s}uom" % ns['swe']).attrib["code"]
+                    else:
+                        err_txt = "swe:Time or swe:Quantity is mandatory in multiplicity 1"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                    self.data[defin]={"uom":uom,"vals":vals}
+                #encoding
+                encodingTxtBlock = Observation.find("{%s}result/{%s}DataArray/{%s}encoding/{%s}TextBlock" 
+                                            %(ns['om'],ns['swe'],ns['swe'],ns['swe']) )
+                if encodingTxtBlock == None:
+                    err_txt = "swe:encoding is mandatory in multiplicity 1"
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                tokenSeparator = encodingTxtBlock.attrib["tokenSeparator"]
+                blockSeparator = encodingTxtBlock.attrib["blockSeparator"]
+                #decimalSeparator = encodingTxtBlock.attrib["decimalSeparator"]
+                #values
+                values = Observation.find("{%s}result/{%s}DataArray/{%s}values" %(ns['om'],ns['swe'],ns['swe']) )
+                if values == None:
+                    err_txt = "swe:values is mandatory in multiplicity 1"
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                
+                if values.text:
+                    valsplit=[i.split(tokenSeparator) for i in values.text.split(blockSeparator)]
+                    for index,c in enumerate(urnlist):
+                        col = []
+                        for l in valsplit:
+                            col.append(l[index])
+                        self.data[c]["vals"] = col
+                
+            
+            #case simple om:result
+            elif SimpleDataRecord==None and DataArray==None:
+                self.data[sosConfig.urn["time"]] = {"uom":None,"vals":[self.samplingTime]}
+                result = Observation.find("{%s}result" %(ns['om']) )
+                uom = result.attrib["uom"]
+                vals = result.text
+                self.data[sosConfig.urn["phenomena"]+self.oprName]={"uom":uom,"vals":vals}
+                
+            #error
+            else:
+                err_txt = "om:SimpleDataRecord in multiplicity N or om:DataArray in multiplicity 1 is mandatory"
+                raise sosException.SOSException("NoApplicableCode",None,err_txt) 
+             
+        
+                        
diff --git a/istsoslib/filters/IO_filter.pyc b/istsoslib/filters/IO_filter.pyc
new file mode 100644
index 0000000..77be4bf
Binary files /dev/null and b/istsoslib/filters/IO_filter.pyc differ
diff --git a/istsoslib/filters/RS_filter.py b/istsoslib/filters/RS_filter.py
new file mode 100755
index 0000000..db24b83
--- /dev/null
+++ b/istsoslib/filters/RS_filter.py
@@ -0,0 +1,438 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from istsoslib.filters import filter as f
+from istsoslib import sosException
+from lib.isodate import parse_duration
+from lib.etree import et
+import json
+
+def parse_and_get_ns(file):
+    events = "start", "start-ns"
+    root = None
+    ns = {}
+    for event, elem in et.iterparse(file, events):
+        if event == "start-ns":
+            if elem[0] in ns and ns[elem[0]] != elem[1]:
+                # NOTE: It is perfectly valid to have the same prefix refer
+                #   to different URI namespaces in different parts of the
+                #   document. This exception serves as a reminder that this
+                #   solution is not robust.  Use at your own peril.
+                raise KeyError("Duplicate prefix with different URI found.")
+            ns[elem[0]] = "%s" % elem[1]
+        elif event == "start":
+            if root is None:
+                root = elem 
+    return et.ElementTree(root), ns
+    
+class sosRSfilter(f.sosFilter): 
+    "filter object for a registerSensor request"
+    """
+    self.xmlSensorDescription = None
+    self.procedure = None
+    self.observedProperties = []
+
+    self.uom = []
+    self.featureOfInterestUrn = None
+    self.featureOfInterestSRS = None
+    self.featureOfInterestWKT = None
+
+    """
+    def __init__(self,sosRequest,method,requestObject,sosConfig):
+        f.sosFilter.__init__(self,sosRequest,method,requestObject,sosConfig)
+        #**************************
+        if method == "GET":
+            raise sosException.SOSException("NoApplicableCode",None,"registerSensor request support only POST method!")
+
+        if method == "POST":
+            from StringIO import StringIO
+            
+            tree, ns = parse_and_get_ns(StringIO(requestObject))
+            
+            #---SensorDescription
+            #----------------------
+            SensorDescription = tree.find("{%s}SensorDescription" % ns['sos'] )
+            if SensorDescription == None:
+                raise sosException.SOSException("MissingParameterValue","SensorDescription","sos:SensorDescription parameter is mandatory with multiplicity 1")
+            
+            #---Procedure Name
+            name = tree.find("{%s}SensorDescription/{%s}member/{%s}System/{%s}name" 
+                            %(ns['sos'],ns['sml'],ns['sml'],ns['gml']) )
+            self.procedure = name.text
+            
+            #---ProcedureDescription
+            description = tree.find("{%s}SensorDescription/{%s}member/{%s}System/{%s}description" 
+                            %(ns['sos'],ns['sml'],ns['sml'],ns['gml']) )
+            if not description==None:
+                self.proc_desc = description.text
+            else:
+                self.proc_desc = 'NULL'
+            
+            #---System type
+            # From istSOS 2.0 the system type became mandatory (insitu-fixed-point, insitu-mobile-point, ...)
+            self.systemType = None
+            classifiers = tree.findall("{%s}SensorDescription/{%s}member/{%s}System/{%s}classification/{%s}ClassifierList/{%s}classifier" 
+                            % ( ns['sos'],ns['sml'],ns['sml'],ns['sml'],ns['sml'],ns['sml'] ) )
+            for classifier in classifiers:
+                if classifier.attrib.has_key('name') and classifier.attrib['name']=='System Type':
+                    val = classifier.find("{%s}Term/{%s}value"
+                        % ( ns['sml'],ns['sml']) )
+                    if val != None:
+                        self.systemType = val.text
+            
+            
+            member = tree.find("{%s}SensorDescription/{%s}member" %(ns['sos'],ns['sml']) )
+            root = et.Element("{%s}SensorML" % ns['sml'])
+            root.attrib[ "{%s}schemaLocation" % ns['xsi'] ] = "http://www.opengis.net/sensorML/1.0.1 http://schemas.opengis.net/sensorML/1.0.1/sensorML.xsd"
+            root.attrib["version"] = "1.0.1"
+            root.append(member)
+            self.xmlSensorDescription = root
+            """
+            from xml.dom.minidom import parseString
+            txt = et.tostring(root, encoding="UTF-8")
+            self.xmlSensorDescription = parseString(txt).toprettyxml()
+            """
+            
+            #---ObservationTemplate
+            #----------------------
+            ObservationTemplate = tree.find("{%s}ObservationTemplate" % ns['sos'] )
+            if ObservationTemplate==None:
+                raise sosException.SOSException("MissingParameterValue","ObservationTemplate","ObservationTemplate parameter is mandatory with multiplicity 1")
+            
+            Observation = ObservationTemplate.find("{%s}Observation" % ns['om'] )
+            if Observation==None:
+                raise sosException.SOSException("NoApplicableCode",None,"om:Observation tag is mandatory with multiplicity 1")
+            
+            #-------procedure
+            procedure = Observation.find("{%s}procedure" % ns['om'] )
+            self.procedure = procedure.attrib["{%s}href" % ns['xlink']].split(":")[-1]
+            if procedure == None:
+                raise sosException.SOSException("NoApplicableCode",None,"om:procedure tag is mandatory with multiplicity 1")
+            
+            #-------ObservedProperties
+            self.oprDef=[]
+            self.oprDesc=[]
+            self.oprName=[]
+            self.beginPosition = 'NULL'
+            
+            try:            
+                name = Observation.find("{%s}observedProperty/{%s}CompositePhenomenon/{%s}name" 
+                                        %(ns['om'],ns['swe'],ns['gml']) )            
+            except:
+                raise sosException.SOSException("NoApplicableCode",None,
+                                "swe:CompositePhenomenon mandatory name element is missing")
+            
+            components = Observation.findall("{%s}observedProperty/{%s}CompositePhenomenon/{%s}component" 
+                                        %(ns['om'],ns['swe'],ns['swe']) )
+            if not components == []:
+                for comp in components:
+                    try:
+                        self.oprDef.append(comp.attrib["{%s}href" % ns['xlink']])
+                    except:
+                        raise sosException.SOSException("NoApplicableCode",None,
+                                "om:observedProperty/component attribute missing: 'xlink:href' required")
+                        
+                        """ NON STANDARD                        
+                        try:
+                            desc = comp.find("{%s}description" % ns['gml'])
+                            self.oprDesc.append(desc.text)
+                        except:
+                            self.oprDesc.append("NULL")
+                            
+                        try:
+                            desc = comp.find("{%s}name" % ns['gml'])
+                            self.oprName.append(desc.text)
+                        except:
+                            self.oprName.append("NULL")
+                        """    
+            
+
+            """ PER COSA È? CASO NON COMPOSITEPHENOMENON?            
+            else:
+                observedProperty = Observation.find("{%s}observedProperty" % ns['om'])
+                try:
+                    self.oprName.append(observedProperty.attrib["{%s}href" % ns['xlink']])
+                except:
+                    name = Observation.find("{%s}observedProperty/{%s}name" %(ns['om'],ns['gml']) )
+                    try:
+                        self.oprName.append(name.txt)
+                    except:
+                        raise sosException.SOSException(1,
+                                "om:observedProperty Name is missing: 'xlink:href' or 'gml:name' required")
+                    
+                    desc = Observation.find("{%s}observedProperty/{%s}description" %(ns['om'],ns['gml']) )
+                    try:
+                        self.oprDesc.append(desc.txt)
+                    except:
+                        self.oprDesc.append("NULL")
+            """
+
+            #-------samplingTime
+            samplingTime = Observation.find("{%s}samplingTime" % ns['om'] )
+            if samplingTime == None:
+                raise sosException.SOSException("NoApplicableCode",None,"om:samplingTime tag is mandatory with multiplicity 1")
+            else:
+                duration = samplingTime.find("{%s}TimePeriod/{%s}TimeLength/{%s}duration" 
+                                            %(ns['gml'],ns['gml'],ns['gml'], ) ) 
+                                            
+                if not duration==None:
+                    
+                    strdur = str( parse_duration( duration.text.strip() ) ).split(",")
+                    if len(strdur)>1:
+                        self.time_res_val = strdur[0].split(" ")[0]
+                        self.time_res_unit = strdur[0].split(" ")[1]
+                    elif len(strdur)==1:
+                        time = strdur[0].split(":")
+                        self.time_res_val = parse_duration( duration.text.strip() ).seconds
+                        self.time_res_unit = "sec"
+                else:
+                    self.time_res_unit = "unknown"
+                    self.time_res_val = "NULL"
+                
+            
+            #------featureOfInterest
+            featureOfInterest = Observation.find("{%s}featureOfInterest" % ns['om'] )
+            if featureOfInterest == None:
+                raise sosException.SOSException("NoApplicableCode",None,"om:featureOfInterest tag is mandatory with multiplicity 1")
+            try:
+                self.foiName = featureOfInterest.attrib["{%s}href" % ns['xlink']]
+            except:
+                raise sosException.SOSException("NoApplicableCode",None,"om:featureOfInterest: attribute 'xlink:href' is required")
+                """ NON COMPLIANT                 
+                name = Observation.find("{%s}featureOfInterest/{%s}name" %(ns['om'],ns['gml']) )                               
+                try:
+                    self.foiName = name.text
+                except:
+                    raise sosException.SOSException(1,"om:featureOfInterest name is missing: 'xlink:href' or 'gml:name' is required")
+                """
+            
+            
+            description = Observation.find("{%s}featureOfInterest/{%s}FeatureCollection/{%s}description" %(ns['om'],ns['gml'],ns['gml']) )
+            if not description == None:
+                self.foiDesc = description.text
+            else:
+                self.foiDesc = "NULL"
+            
+            #--foiWKZ
+            # gml_type = ["gml:Polygon", "gml:LineString", "gml:Point", "gml:Box", "gml:GeometryCollection",
+            #            "gml:MultiPoint", "gml:MultiLineString", "gml:MultiPolygon"]
+            self.foiType = None
+            for geomtype in sosConfig.foiGeometryType:
+                geomtype = geomtype.split(":")[1]                
+                GMLfeature = Observation.find("{%s}featureOfInterest/{%s}FeatureCollection/{%s}location/{%s}%s" 
+                                                %(ns['om'],ns['gml'],ns['gml'],ns['gml'],geomtype) )
+
+                if not GMLfeature==None:
+                    self.foiType = geomtype
+                    self.foiSRS = GMLfeature.attrib["srsName"].split(":")[-1]
+                    self.foiGML = et.tostring(GMLfeature, encoding="UTF-8").replace("<?xml version='1.0' encoding='UTF-8'?>","")
+            if self.foiType == None:
+                raise sosException.SOSException("NoApplicableCode",None,"not found valid GML feature, supported: %s "
+                                    %(";".join(sosConfig.foiGeometryType)))
+            
+            
+            #--result
+            result = Observation.find("{%s}result" % ns['om'] )
+            self.parameters = []
+            self.uoms = []
+            self.names = []
+            self.descs = []
+            self.constr = []
+            self.partime = []
+            
+            if not result == None:
+                sdr = Observation.find("{%s}result/{%s}SimpleDataRecord" %(ns['om'],ns['swe']) )
+                da = Observation.find("{%s}result/{%s}DataArray" %(ns['om'],ns['swe']) )
+                
+                if sdr!=None and da==None:
+                    fields = sdr.findall("{%s}field" % ns['swe'])
+                elif da!=None and sdr==None:
+                    fields = da.findall("{%s}elementType/{%s}DataRecord/{%s}field" %(ns['swe'],ns['swe'],ns['swe']))
+                else:
+                    err_txt = "in <swe:result>: <swe:DataRecord> or <swe:DataArray> are mandatory in multiplicity 1"
+                    raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                
+                timetag = False
+                for field in fields:
+                    defin = None
+                    uom = None
+                    self.names.append(field.attrib['name'])
+                    tf = field.find("{%s}Time" % ns['swe'])
+                    qf = field.find("{%s}Quantity" % ns['swe'])
+                    
+                    if not tf==None and qf==None:
+                        self.partime.append(1)
+                        timetag = True
+                        self.parameters.append(tf.attrib["definition"])
+                        uom = tf.find("{%s}uom" % ns['swe'])
+                        self.uoms.append(uom.attrib["code"])
+                        desc = tf.find("{%s}description" % ns['swe'])
+                        if not desc==None:
+                            self.descs.append(desc.text)
+                        else:
+                            self.descs.append("NULL")
+                        #self.constr.append(None)
+                        #self.constr.append("NULL")
+                        
+                    elif not qf==None and tf==None:
+                        self.partime.append(0)
+                        self.parameters.append(qf.attrib["definition"])
+                        uom = qf.find("{%s}uom" % ns['swe'])
+                        self.uoms.append(uom.attrib["code"])
+                        desc = qf.find("{%s}description" % ns['swe'])
+                        if not desc==None:
+                            self.descs.append(desc.text)
+                        else:
+                            self.descs.append("NULL")
+                        
+                        # look for constraints [min,max,interval,valueList]
+                        #===================================================
+                        #import sys
+                        cc = {}
+                        constraints = qf.findall("{%s}constraint" %(ns['swe']))
+                        if len(constraints)==0:
+                            self.constr.append(None)
+                        else:
+                            for constraint in constraints:
+                                if constraint:
+                                    if "{%s}role" % ns["xlink"] in constraint.attrib:
+                                        if constraint.attrib[ "{%s}role" % ns["xlink"] ] == "urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable":
+                                            crole = constraint.attrib[ "{%s}role" % ns["xlink"] ]
+                                                                   
+                                            allow = constraint.find("{%s}AllowedValues" %(ns['swe']))
+                                            if allow is None:
+                                                err_txt = "in <swe:constraint>: <swe:AllowedValues> is mandatory in multiplicity 1"
+                                                raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                            else:
+                                                
+                                                cvals = None
+                                                if len(allow)==1:
+                                                    ct = allow[0].tag
+                                                    if not ct in ["{%s}min" % ns["swe"],"{%s}max" % ns["swe"],"{%s}interval" % ns["swe"],"{%s}valueList" % ns["swe"]]:
+                                                        err_txt = "in <swe:constraint>: support only min, max, interval, valueList tag" 
+                                                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                    
+                                                    xvals = allow[0].text.strip().split(" ")
+                                                    
+                                                    if ct == "{%s}min" % ns["swe"]: 
+                                                        ct = "min"
+                                                        if not len(xvals)==1:
+                                                            err_txt = "'%s' constraint support/need one values" % ct
+                                                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                        try:
+                                                            cvals = float(xvals[0])
+                                                        except:
+                                                            err_txt = "'%s' constraint requires float value" % ct
+                                                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                   
+                                                    elif ct == "{%s}max" % ns["swe"]:
+                                                        ct = "max"
+                                                        if not len(xvals)==1:
+                                                            err_txt = "'%s' constraint support/need one values" % ct
+                                                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                        try:
+                                                            cvals = float(xvals[0])
+                                                        except:
+                                                            err_txt = "'%s' constraint requires float value" % ct
+                                                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                        
+                                                    elif ct == "{%s}interval" % ns["swe"]: 
+                                                        ct = "interval"
+                                                        if not len(xvals)==2:
+                                                            err_txt = "'%s' constraint support/need two values" % ct
+                                                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                        try:
+                                                            cvals = [float(xvals[0]),float(xvals[1])]
+                                                        except:
+                                                            err_txt = "'%s' constraint requires float value" % ct
+                                                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                
+                                                    elif ct == "{%s}valueList" % ns["swe"]:
+                                                        ct = "valueList"
+                                                        if not len(xvals)>0:
+                                                            err_txt = "'%s' constraint support/need at least one values" % ct
+                                                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                        try:
+                                                            cvals = [float(a) for a in xvals]
+                                                        except:
+                                                            err_txt = "'%s' constraint requires float value" % ct
+                                                            raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                                                    
+                                                    cc["role"] = crole
+                                                    cc["%s" % ct] = cvals
+                                
+                                if not cc=={}:
+                                    self.constr.append(json.dumps(cc))
+                                else:
+                                    self.constr.append(None)
+                        
+                        
+                    else:
+                        err_txt = "swe:Time or swe:Quantity is mandatory in multiplicity 1:N"
+                        raise sosException.SOSException("NoApplicableCode",None,err_txt)
+                    
+                    
+            else:
+                err_txt = "om:result is mandatory in multiplicity 1:N"
+                raise sosException.SOSException("NoApplicableCode",None,err_txt)
+           
+
+            #case simple om:result
+            """ WAS
+            elif len(sdr)==0 and len(da)==0:
+                if len(observedProperties)==1:
+                    self.parameters.append(observedProperties[0])
+                    self.uoms.append(getElemAtt(res[0],"uom"))
+                else:
+                    raise sosException.SOSException(1,"om:observedProperty is mandatory with multiplicity 1")
+                    
+            
+            
+            else:
+                err_txt = "om:observation ERROR"
+                raise sosException.SOSException(1,err_txt) 
+            """
+
+            """
+            #####################################################################
+            # DEBUG
+            #####################################################################
+            err_txt = "xmlSensorDescription = %s @" %(self.xmlSensorDescription)
+            err_txt += "procedure = %s  @" %(self.procedure)
+            err_txt += "observedProperties = %s @" %(self.observedProperties)
+            err_txt += "uoms = %s @" %(self.uoms)
+            err_txt += "featureOfInterestUrn = %s @" %(self.featureOfInterestUrn)
+            err_txt += "featureOfInterestSRS = %s @" %(self.featureOfInterestSRS)
+            err_txt += "featureOfInterestWKT = %s @" %(self.featureOfInterestWKT)                
+            raise sosException.SOSException(1,err_txt)
+            #####################################################################
+            """
+            
+            
+            
+            
+           
+            
+        
+
+
+
+
+
+
+
+
diff --git a/istsoslib/filters/RS_filter.pyc b/istsoslib/filters/RS_filter.pyc
new file mode 100644
index 0000000..76c1eb3
Binary files /dev/null and b/istsoslib/filters/RS_filter.pyc differ
diff --git a/istsoslib/filters/USD_filter.py b/istsoslib/filters/USD_filter.py
new file mode 100755
index 0000000..16c538f
--- /dev/null
+++ b/istsoslib/filters/USD_filter.py
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import sosConfig
+from istsoslib.filters import filter as f
+from istsoslib import sosException
+
+def getElemTxt(node):
+    if node.hasChildNodes():
+        val = node.firstChild
+        if val.nodeType == val.TEXT_NODE:
+            return str(val.data)
+        else:
+            err_txt = "get node text value: \"%s\" is not of type TEXT" %(node.nodeName)
+            raise Exception(,err_txt)
+    else:
+            err_txt = "get node text value: \"%s\" has no child node" %(node.nodeName)
+            raise Exception(err_txt)
+        
+def getElemAtt(node,att):
+    if att in node.attributes.keys():
+        return str(node.getAttribute(att))
+    else:
+        None
+        #err_txt = "get node attribute value: \"%s\"has no \"%s\" attribute" %(node.nodeName,att)
+        #raise sosException.SOSException(1,err_txt)
+
+def get_name_from_urn(stringa,urnName,sosConfig):
+    a = stringa.split(":")
+    name = a[-1]
+    urn = sosConfig.urn[urnName].split(":")
+    if len(a)>1:
+        for index in range(len(urn)-1):
+            if urn[index]==a[index]:
+                pass
+            else:
+                raise Exception("Urn \"%s\" is not valid: %s."%(a,urn))
+    return name 
+
+class sosUSDfilter(f.sosFilter): 
+    "filter object for an updateSensorDescription request"
+    """
+    self.assignedSensorId = None
+    self.xmlSensorDescription = None
+    """
+
+    def __init__(self,sosRequest,method,requestObject,sosConfig):
+        f.sosFilter.__init__(self,sosRequest,method,requestObject,sosConfig)
+        #**************************
+        if method == "GET":
+            raise sosException.SOSException("NoApplicableCode",None,"registerSensor request support only POST method!")
+            
+        if method == "POST":
+            
+            #---assignedSensorId
+            asid = requestObject.getElementsByTagName('AssignedSensorId')
+            if len(asid)==1:
+                    self.assignedSensorId = getElemTxt(asid[0])
+            else:
+                raise sosException.SOSException("MissingParameterValue","AssignedSensorId","AssignedSensorId parameter is mandatory with multiplicity 1")
+            
+            #---SensorDescription            
+            sd = requestObject.getElementsByTagName('SensorDescription')
+            if len(sd)==1:
+                self.xmlSensorDescription = sd[0]
+            else:
+                raise sosException.SOSException("MissingParameterValue","SensorDescription","SensorDescription parameter is mandatory with multiplicity 1")
+                
+                
+                
+                
+                
+                
diff --git a/istsoslib/filters/__init__.py b/istsoslib/filters/__init__.py
new file mode 100755
index 0000000..654553b
--- /dev/null
+++ b/istsoslib/filters/__init__.py
@@ -0,0 +1 @@
+__all__ = ["filter", "factory_filters", "GC_filter", "GF_filter", "GO_filter", "DS_filter", "IO_filter", "RS_filter", "USD_filter"]
diff --git a/istsoslib/filters/__init__.pyc b/istsoslib/filters/__init__.pyc
new file mode 100644
index 0000000..9ef32bd
Binary files /dev/null and b/istsoslib/filters/__init__.pyc differ
diff --git a/istsoslib/filters/factory_filters.py b/istsoslib/filters/factory_filters.py
new file mode 100755
index 0000000..99acb77
--- /dev/null
+++ b/istsoslib/filters/factory_filters.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from istsoslib import sosException
+import cgi
+from urlparse import parse_qs
+import sys
+
+def sosFactoryFilter(environ,sosConfig):
+    content_type = environ.get('CONTENT_TYPE', '')
+    
+    #---- set method, requestObject and sosRequest ----
+    method = str(environ['REQUEST_METHOD']).upper()
+    
+    if method=="GET":
+        # Returns a dictionary containing lists as values.
+        rect = parse_qs(environ['QUERY_STRING'])
+        requestObject = {}
+        for key in rect.keys():
+            requestObject[key.lower()] = rect[key][0]
+
+        if requestObject.has_key("request"):
+            sosRequest = requestObject["request"].lower()
+        else:
+            raise sosException.SOSException("MissingParameterValue","request","Parameter \"request\" is mandatory") 
+
+    elif method=="POST":
+        # the environment variable CONTENT_LENGTH may be empty or missing
+        try:
+            request_body_size = int(environ.get('CONTENT_LENGTH', 0))
+        except (ValueError):
+            request_body_size = 0
+
+        # get the request
+        from xml.dom import minidom
+        
+        content = environ['wsgi.input'].read(request_body_size)
+        if content_type.startswith("application/x-www-form-urlencoded"):
+            form = cgi.parse_qs(content)
+            if form.has_key("request"):
+                xmldoc = minidom.parseString(form["request"][0])
+            else:
+                raise sosException.SOSException("MissingParameterValue","request","Parameter \"request\" is mandatory")
+
+        else:
+            try:
+                xmldoc = minidom.parseString(content)
+            except:
+                raise sosException.SOSException("MissingParameterValue",None,"Unable to parse the request body: validation issue")
+            
+        requestObject = xmldoc.firstChild
+        sosRequest = requestObject.localName.lower()
+            
+    else:
+        err_txt = "Allowed \"http request\" are GET and POST: %s" %(method=="GET")
+        raise sosException.SOSException("InvalidRequest",None,err_txt)
+        
+    #--- if request is allowed instantiate the rigth filter ---
+    if sosRequest in sosConfig.parameters["requests"]:
+        if sosRequest == "getcapabilities":
+            from istsoslib.filters import GC_filter
+            return GC_filter.sosGCfilter(sosRequest,method,requestObject,sosConfig)
+        elif sosRequest == "describesensor":
+            from istsoslib.filters import DS_filter
+            return DS_filter.sosDSfilter(sosRequest,method,requestObject,sosConfig)
+        elif sosRequest == "getobservation":
+            from istsoslib.filters import GO_filter
+            return GO_filter.sosGOfilter(sosRequest,method,requestObject,sosConfig)
+        elif sosRequest == "getfeatureofinterest":
+            from istsoslib.filters import GF_filter
+            return GF_filter.sosGFfilter(sosRequest,method,requestObject,sosConfig)
+        elif sosRequest == "insertobservation":
+            from istsoslib.filters import IO_filter
+            return IO_filter.sosIOfilter(sosRequest,method,content,sosConfig)
+        elif sosRequest == "registersensor":
+            from istsoslib.filters import RS_filter
+            return RS_filter.sosRSfilter(sosRequest,method,content,sosConfig)
+        elif sosRequest == "updateSensorDescription":
+            from istsoslib.filters import USD_filter
+            return USD_filter.sosUSDfilter(sosRequest,method,requestObject,sosConfig)
+    else:
+        raise sosException.SOSException("InvalidParameterValue","request","\"request\": %s not supported" %(sosRequest))
+    
+
diff --git a/istsoslib/filters/factory_filters.pyc b/istsoslib/filters/factory_filters.pyc
new file mode 100644
index 0000000..928592d
Binary files /dev/null and b/istsoslib/filters/factory_filters.pyc differ
diff --git a/istsoslib/filters/filter.py b/istsoslib/filters/filter.py
new file mode 100755
index 0000000..2a78f99
--- /dev/null
+++ b/istsoslib/filters/filter.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import sosConfig
+from istsoslib import sosException
+
+class sosFilter():
+    "SOS request filters, set request, service and version"
+    #self.request = None
+    #self.service = None
+    #self.version = None
+    def __init__(self,sosRequest,method,requestObject,sosConfig):
+        #--------REQUEST-----------
+        self.request = sosRequest
+        self.sosConfig = sosConfig
+        #*****************
+        if method == "GET":
+            #--------SERVICE------------
+            if requestObject.has_key("service"):
+                self.service = requestObject["service"]
+                if self.service not in sosConfig.parameters["service"]:
+                    raise sosException.SOSException("InvalidParameterValue","service","\"service\": %s not supported" %(self.service))
+            else:
+                raise sosException.SOSException("MissingParameterValue","service","\"service\" parameter is mandatory")
+            #---------VERSION NEGOTIATION -----------
+            if self.request=="getcapabilities":
+                if requestObject.has_key("acceptversions"):
+                    AcceptVersions = requestObject["acceptversions"].split(",")
+                    AcceptVersions.sort()
+                    self.version = None
+                    for version in AcceptVersions:
+                        if version in sosConfig.parameters["version"]:
+                            self.version=version
+                            break
+                    if not self.version:
+                        raise sosException.SOSException("VersionNegotiationFailed",None,"Any of the accepted versions are supported by this server")
+                else:
+                    self.version = sosConfig.parameters["version"][0]
+            else:
+                #---------VERSION-----------
+                if requestObject.has_key("version"):
+                    self.version = requestObject["version"]
+                    if self.version not in sosConfig.parameters["version"]:
+                        raise sosException.SOSException("InvalidParameterValue","version","\"version\": %s not supported" %(self.version))
+                else:
+                    raise sosException.SOSException("MissingParameterValue","version","\"version\" parameter is mandatory")
+        #********************
+        if method == "POST":
+            if not type(requestObject)==type("pp"):                            
+                #--------SERVICE------------
+                if "service" in requestObject.attributes.keys():
+                    self.service = str(requestObject.getAttribute("service"))
+                    if self.service not in sosConfig.parameters["service"]:
+                        raise sosException.SOSException("InvalidParameterValue","service","\"service\": %s not supported" %(self.service))
+                else:
+                    raise sosException.SOSException("MissingParameterValue","service","\"service\" parameter is mandatory")
+                #---------VERSION NEGOTIATION -----------                        
+                if self.request=="getcapabilities":
+                    AcceptVersions = requestObject.getElementsByTagName('AcceptVersions')
+                    if len(AcceptVersions)>1:
+                        raise sosException.SOSException("InvalidParameterValue","AcceptVersions","AcceptVersions multiplicity is 1" %(self.version))
+                    elif len(AcceptVersions)==1:
+                        VersionsObj = requestObject.getElementsByTagName('Version')
+                        versions = [ str(val.firstChild.data) for val in VersionsObj]
+                        versions.sort()
+                        self.version = None
+                        for version in versions:
+                            if version in sosConfig.parameters["version"]:
+                                self.version=version
+                                break
+                        if not self.version:
+                            raise sosException.SOSException("VersionNegotiationFailed",None,"Any of the accepted versions are supported by this server")
+                    else:
+                        self.version = sosConfig.parameters["version"][0]
+                else:
+                    #---------VERSION-----------
+                    if "version" in requestObject.attributes.keys():
+                        self.version = str(requestObject.getAttribute("version"))
+                        if self.version not in sosConfig.parameters["version"]:
+                            raise sosException.SOSException("InvalidParameterValue","version","\"version\": %s not supported" %(self.version))
+                    else:
+                        self.version = sosConfig.parameters["version"][0]
+
+            
diff --git a/istsoslib/filters/filter.pyc b/istsoslib/filters/filter.pyc
new file mode 100644
index 0000000..d38ebe4
Binary files /dev/null and b/istsoslib/filters/filter.pyc differ
diff --git a/istsoslib/renderers/DSresponseRender.py b/istsoslib/renderers/DSresponseRender.py
new file mode 100755
index 0000000..0ce20b8
--- /dev/null
+++ b/istsoslib/renderers/DSresponseRender.py
@@ -0,0 +1,255 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from istsoslib import sosException
+import sys   
+from lib.etree import et
+import json
+
+reurl = r'(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?'
+
+def parse_and_get_ns(filename):
+    events = "start", "start-ns"
+
+    root = None
+    ns = {}
+    f = open(filename)
+    for event, elem in et.iterparse(f, events):
+        if event == "start-ns":
+            if elem[0] in ns and ns[elem[0]] != elem[1]:
+                # NOTE: It is perfectly valid to have the same prefix refer
+                #   to different URI namespaces in different parts of the
+                #   document. This exception serves as a reminder that this
+                #   solution is not robust.  Use at your own peril.
+                raise KeyError("Duplicate prefix with different URI found.")
+            ns[elem[0]] = "%s" % elem[1]
+        elif event == "start":
+            if root is None:
+                root = elem 
+    f.close()
+    return et.ElementTree(root), ns
+
+     
+def render(DS,sosConfig):
+    # Returning content of the SensorML
+    
+    try:
+        #---parse xml
+        tree, ns = parse_and_get_ns(DS.smlFile)
+    except Exception as ex:
+        raise Exception("sensorML description for procedure '%s' not found or corrupted! [%s]"%(DS.smlFile,ex))    
+    
+    #---map namespaces---
+    try:
+        register_namespace = et.register_namespace
+        for key in ns:
+            register_namespace(key,ns[key])
+    except AttributeError:
+        try:
+            et._namespace_map.update(ns)
+            for key in ns:
+                et._namespace_map[ns[key]] = key
+        except AttributeError:
+            try:
+                from xml.etree.ElementTree import _namespace_map
+            except ImportError:
+                try:
+                    from elementtree.ElementTree import _namespace_map
+                except ImportError:
+                    print >> sys.stderr, ("Failed to import ElementTree from any known place")
+            for key in ns:
+                _namespace_map[ns[key]] = key
+        
+    mns = {
+            'xsi': "http://www.w3.org/2001/XMLSchema-instance" ,
+            'sml': "http://www.opengis.net/sensorML/1.0.1", 
+            'swe': "http://www.opengis.net/swe/1.0.1", 
+            'xlink': "http://www.w3.org/1999/xlink", 
+            'gml': 'http://www.opengis.net/gml'            
+        }
+    
+    for n in mns.keys():
+        try:
+            ns[n]
+        except:
+            ns[n] = mns[n]
+    
+    
+    #--- CREEATE FIELDS ACCORDING TO DATABASE OBSERVED_PROPERTIES 
+    datarecord = tree.find("{%s}member/{%s}System/{%s}outputs/{%s}OutputList/{%s}output/{%s}DataRecord"
+                        %(ns['sml'],ns['sml'],ns['sml'],ns['sml'],ns['sml'],ns['swe']) )
+    
+    
+    datarecord.clear()
+    datarecord.attrib["definition"] = "%stimeSeries" % (sosConfig.urn['dataType'])
+    fieldT = et.SubElement(datarecord,"{%s}field" % ns["swe"])
+    fieldT.attrib["name"] = "Time"
+    time = et.SubElement(fieldT,"{%s}Time" % ns["swe"])
+    time.attrib["definition"] = sosConfig.urn["time"]
+    
+    # Adding constraint for current allowed times
+    if (not DS.stime == None) and (not DS.etime == None):
+        constraint =  et.SubElement(time, "{%s}constraint" % ns['swe'])
+        allowedTimes =  et.SubElement(constraint, "{%s}AllowedTimes" % ns['swe'])
+        interval = et.SubElement(allowedTimes, "{%s}interval" % ns['swe'])
+        interval.text = "%s %s" %(DS.stime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), DS.etime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"))
+    
+    if DS.procedureType=="insitu-mobile-point": # Adding 3d coordinates observation
+        
+        cord = et.SubElement(datarecord,"{%s}field" % ns["swe"])
+        cord.attrib["name"] = "x"
+        quantity = et.SubElement(cord,"{%s}Quantity" % ns["swe"])
+        quantity.attrib["definition"] = sosConfig.urn["refsystem"] + sosConfig.istsosepsg + ":x-position"
+        
+        cord = et.SubElement(datarecord,"{%s}field" % ns["swe"])
+        cord.attrib["name"] = "y"
+        quantity = et.SubElement(cord,"{%s}Quantity" % ns["swe"])
+        quantity.attrib["definition"] = sosConfig.urn["refsystem"] + sosConfig.istsosepsg + ":y-position"
+        
+        cord = et.SubElement(datarecord,"{%s}field" % ns["swe"])
+        cord.attrib["name"] = "z"
+        quantity = et.SubElement(cord,"{%s}Quantity" % ns["swe"])
+        quantity.attrib["definition"] = sosConfig.urn["refsystem"] + sosConfig.istsosepsg + ":z-position"
+        
+        
+    for index,field in enumerate(DS.observedProperties):
+        
+        fieldQ = et.SubElement(datarecord,"{%s}field" % ns["swe"])
+        fieldQ.attrib["name"] = field["name_opr"]
+        quantity = et.SubElement(fieldQ,"{%s}Quantity" % ns["swe"])
+        quantity.attrib["definition"] = field["def_opr"]
+        
+        if not (field["name_uom"]=="" or field["name_uom"]==None or field["name_uom"]=="NULL"):
+            uom = et.SubElement(quantity,"{%s}uom" % ns["swe"])
+            uom.attrib["code"] = field["name_uom"]
+        """
+        if not (field["desc_opr"]=="" or field["desc_opr"]==None or field["desc_opr"]=="NULL"):
+            description = et.SubElement(quantity,"{%s}description" % ns["swe"])
+            description.text = field["desc_opr"]
+        """
+        
+        """
+        # Handling constraint
+        Permitted conigurations:
+            {"role":"urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable","min":"10"}
+            {"role":"urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable","max":"10"}
+            {"role":"urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable","interval":["-10","10"]}
+            {"role":"urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable","valueList":["1","2","3","4","5","6"]}
+        """
+        if not (field["constr_pro"]=="" or field["constr_pro"]==None):
+            try:
+                constraintObj = json.loads(field["constr_pro"])
+                
+                constraint = et.SubElement(quantity,"{%s}constraint" % ns["swe"])
+                
+                # Role attribute is not mandatory
+                if "role" in constraintObj and constraintObj["role"]!="" and constraintObj["role"]!=None:
+                    constraint.attrib[ "{%s}role" % ns['xlink'] ]= constraintObj["role"]
+                    
+                AllowedValues = et.SubElement(constraint, "{%s}AllowedValues" % ns['swe'])
+                
+                # Factory on constraint min/max/interval/valuelist
+                if "interval" in constraintObj:
+                    interval = et.SubElement(AllowedValues, "{%s}interval" % ns['swe'])
+                    interval.text = " ".join([ str(a) for a in constraintObj["interval"] ])
+                    #interval.text = " ".join(constraintObj["interval"])
+                    
+                elif "valueList" in constraintObj:#.has_key("valueList"):
+                    valueList = et.SubElement(AllowedValues, "{%s}valueList" % ns['swe'])
+                    valueList.text = ", ".join([ str(a) for a in constraintObj["valueList"] ])
+                    #valueList.text = " ".join(constraintObj["valueList"])
+                    
+                elif "min" in constraintObj:#.has_key("min"):
+                    amin = et.SubElement(AllowedValues, "{%s}min" % ns['swe'])
+                    amin.text = str(constraintObj["min"])
+                    
+                elif "max" in constraintObj:#.has_key("max"):
+                    amax = et.SubElement(AllowedValues, "{%s}max" % ns['swe'])
+                    amax.text = str(constraintObj["max"])
+                
+            except Exception:
+                raise Exception("Constraint definition invalid in the database for %s" % field["def_opr"])
+    
+    #verify that gml_id does not contain blanks 
+    #(workaround to be corrected in future name sensor registration)
+#    ------------------------------------------
+#    NCName stands for "non-colonized name". 
+#    NCName can be defined as an XML Schema regular expression [\i-[:]][\c-[:]]*
+#    
+#    So in plain English it would mean "any initial character, but not :". 
+#    The whole regular expression reads as "One initial XML name character, 
+#    but not a colon, followed by zero or more XML name characters, but not a colon."
+#    
+#    The practical restrictions of NCName are that it cannot contain several symbol characters
+#    ------------------------------------------
+    
+    not_allowed_NCName = [' ', '!','"', '#', '$', '%', '&', '\'', 
+                          '(', ')', '*', '+', ',', '/', ':', ';', 
+                          '<', '=', '>', '?', '@', '[', '\\', ']', 
+                          '^', '`', '{', '|', '}', '~']
+                          
+    location = tree.find("{%s}member/{%s}System/{%s}location"
+                        %(ns['sml'],ns['sml'],ns['sml']) )
+    for feature in location:
+        for ch in not_allowed_NCName:
+            if ch in feature.attrib['{%s}id' %ns['gml']]:
+                feature.attrib['{%s}id' %ns['gml']] = feature.attrib['{%s}id' %ns['gml']].replace(ch,"_")
+
+    # The unique identifier in the response document matches the procedure specified in the request
+    system = tree.find("{%s}member/{%s}System" %(ns['sml'],ns['sml']))
+    identification = tree.find("{%s}member/{%s}System/{%s}identification" %(ns['sml'],ns['sml'],ns['sml']))
+    
+    if not identification:
+        identification = et.Element("{%s}identification" % ns["sml"])
+        identifierList = et.SubElement(identification,"{%s}IdentifierList" % ns["sml"])
+        identifier = et.SubElement(identifierList,"{%s}identifier" % ns["sml"])
+        term = et.SubElement(identifier,"{%s}Term" % ns["sml"])
+        term.attrib['definition'] = "urn:ogc:def:identifier:OGC:uniqueID"
+        value = et.SubElement(term,"{%s}value" % ns["sml"])
+        value.text = sosConfig.urn["procedure"]+system.attrib['{%s}id' %ns['gml']]
+        system.insert(1,identification)
+    else:
+        identifierList = identification.find("{%s}IdentifierList" % ns["sml"])
+        if not identifierList:
+            identifierList = et.SubElement(identification,"{%s}IdentifierList" % ns["sml"])
+            identifier = et.SubElement(identifierList,"{%s}identifier" % ns["sml"])
+            term = et.SubElement(identifier,"{%s}Term" % ns["sml"])
+            term.attrib['definition'] = "urn:ogc:def:identifier:OGC:uniqueID"
+            value = et.SubElement(term,"{%s}value" % ns["sml"])
+            value.text = sosConfig.urn["procedure"]+system.attrib['{%s}id' %ns['gml']]
+#            system.insert(1,identification)
+        else:
+            identifiers = identifierList.findall("{%s}identifier" % ns["sml"])
+            unique = False
+            for identifier in identifiers:
+                if identifier.find("{%s}Term" % ns["sml"]).attrib['definition'] == "urn:ogc:def:identifier:OGC:uniqueID":
+                    unique = True
+                    break
+            if not unique:
+                identifier = et.SubElement(identifierList,"{%s}identifier" % ns["sml"])
+                term = et.SubElement(identifier,"{%s}Term" % ns["sml"])
+                term.attrib['definition'] = "urn:ogc:def:identifier:OGC:uniqueID"
+                value = et.SubElement(term,"{%s}value" % ns["sml"])
+                value.text = sosConfig.urn["procedure"]+system.attrib['{%s}id' %ns['gml']]
+#                system.insert(1,identification)
+    
+            
+    
+    
+    root = tree.getroot()
+    root.attrib["xmlns"]="http://www.opengis.net/sensorML/1.0.1"
+    return """<?xml version="1.0" encoding="UTF-8"?>\n%s""" % et.tostring(root)
diff --git a/istsoslib/renderers/DSresponseRender.pyc b/istsoslib/renderers/DSresponseRender.pyc
new file mode 100644
index 0000000..24b58bd
Binary files /dev/null and b/istsoslib/renderers/DSresponseRender.pyc differ
diff --git a/istsoslib/renderers/GCresponseRender.py b/istsoslib/renderers/GCresponseRender.py
new file mode 100755
index 0000000..48e2030
--- /dev/null
+++ b/istsoslib/renderers/GCresponseRender.py
@@ -0,0 +1,182 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from lib import isodate as iso
+
+def render(GC,sosConfig):
+    r = '''<?xml version="1.0" encoding="UTF-8"?>
+    <Capabilities
+      xmlns:gml="http://www.opengis.net/gml"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      xmlns:swe="http://www.opengis.net/swe/1.0.1"
+      xmlns:om="http://www.opengis.net/om/1.0"
+      xmlns="http://www.opengis.net/sos/1.0"
+      xmlns:sos="http://www.opengis.net/sos/1.0"
+      xmlns:ows="http://www.opengis.net/ows/1.1"
+      xmlns:ogc="http://www.opengis.net/ogc"
+      xmlns:tml="http://www.opengis.net/tml"
+      xmlns:sml="http://www.opengis.net/sensorML/1.0.1"
+      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+      xsi:schemaLocation="http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosGetCapabilities.xsd"
+      version="1.0.0">'''
+    
+    if not GC.ServiceIdentifier==[]:
+        r += "  <!--~~~~~~~~~~~~~~~~~~~~~~~~-->\n"
+        r += "  <!-- Service Identification -->\n"
+        r += "  <!--~~~~~~~~~~~~~~~~~~~~~~~~-->\n"
+        r += "  <ows:ServiceIdentification>\n"
+        r += "    <ows:Title>" + GC.ServiceIdentifier.title  + "</ows:Title>\n"
+        r += "    <ows:Abstract>" + GC.ServiceIdentifier.abstract +"</ows:Abstract>\n"
+        r += "    <ows:Keywords>\n"
+        for k in GC.ServiceIdentifier.keywords:
+            r += "      <ows:Keyword>"+ k +"</ows:Keyword>\n"
+        r += "    </ows:Keywords>\n"
+        r += "    <ows:ServiceType codeSpace=\"" + GC.ServiceIdentifier.serviceTypeCode + "\">"
+        r +=  GC.ServiceIdentifier.serviceTypeValue + "</ows:ServiceType>\n"
+        r += "    <ows:ServiceTypeVersion>" + GC.ServiceIdentifier.serviceTypeVersion + "</ows:ServiceTypeVersion>\n"
+        r += "    <ows:Fees>" + GC.ServiceIdentifier.fees + "</ows:Fees>\n"
+        r += "    <ows:AccessConstraints>" + GC.ServiceIdentifier.accessconstrains + "</ows:AccessConstraints>\n"
+        r += "  </ows:ServiceIdentification>\n"
+
+    if not GC.ServiceProvider==[]:
+        r += "  <!--~~~~~~~~~~~~~~~~~~~~~~-->\n"
+        r += "  <!-- Provider Description -->\n"
+        r += "  <!--~~~~~~~~~~~~~~~~~~~~~~-->\n"
+        r += "  <ows:ServiceProvider>\n"
+        r += "    <ows:ProviderName>" + GC.ServiceProvider.providerName + "</ows:ProviderName>\n"
+        r += "    <ows:ProviderSite xlink:href=\"" + GC.ServiceProvider.providerSite + "\"/>\n"
+        r += "    <ows:ServiceContact>\n"
+        r += "      <ows:IndividualName>" + GC.ServiceProvider.individualName + "</ows:IndividualName>\n"
+        r += "      <ows:PositionName>" + GC.ServiceProvider.positionName + "</ows:PositionName>\n"
+        r += "      <ows:ContactInfo>\n"
+        r += "        <ows:Phone>\n"
+        r += "          <ows:Voice>" + GC.ServiceProvider.contactVoice + "</ows:Voice>\n"
+        r += "          <ows:Facsimile>" + GC.ServiceProvider.contactFax + "</ows:Facsimile>\n"
+        r += "        </ows:Phone>\n"
+        r += "        <ows:Address>\n"
+        r += "          <ows:DeliveryPoint>" + GC.ServiceProvider.contactDelivery + "</ows:DeliveryPoint>\n"
+        r += "          <ows:City>" + GC.ServiceProvider.contactCity + "</ows:City>\n"
+        r += "          <ows:AdministrativeArea>" + GC.ServiceProvider.contactArea + "</ows:AdministrativeArea>\n"
+        r += "          <ows:PostalCode>" + GC.ServiceProvider.contactPostCode + "</ows:PostalCode>\n"
+        r += "          <ows:Country>" + GC.ServiceProvider.contactCountry + "</ows:Country>\n"
+        r += "          <ows:ElectronicMailAddress>" + GC.ServiceProvider.contactMail + "</ows:ElectronicMailAddress>\n"        
+        r += "        </ows:Address>\n"
+        r += "      </ows:ContactInfo>\n"
+        r += "    </ows:ServiceContact>\n"
+        r += "  </ows:ServiceProvider>\n"
+
+    if GC.OperationsMetadata:
+        r += "  <!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->\n"
+        r += "  <!-- operations Metadata Section -->\n"
+        r += "  <!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->\n"
+        r += "  <ows:OperationsMetadata>\n"
+        for o in GC.OperationsMetadata.OP:
+            r += "    <ows:Operation name=\"" + o.name + "\">\n"
+            r += "      <ows:DCP>\n"
+            r += "        <ows:HTTP>\n"
+            if o.get:
+                r += "          <ows:Get xlink:href=\"" + o.get + "\"/>\n"
+            if o.post:
+                r += "          <ows:Post xlink:href=\"" + o.post + "\"/>\n"
+            r += "        </ows:HTTP>\n"
+            r += "      </ows:DCP>\n"
+            for p in o.parameters:
+                # r += "    <ows:Parameter name=\"" + p.name + "\" use=\"" + p.use + "\">\n"
+                r += "    <ows:Parameter name=\"" + p.name + "\">\n"
+                r += "      <ows:AllowedValues>\n"
+                if len(p.allowedValues)>0:
+                    for a in p.allowedValues:
+                        r += "        <ows:Value>" + str(a) + "</ows:Value>\n"
+                if len(p.range)>0:
+                    r += "        <ows:Range>\n"
+                    r += "          <ows:MinimumValue>"  
+                    if str(type(p.range[0]))== "<type 'datetime.datetime'>":
+                        r += iso.datetime_isoformat(p.range[0])
+                    else:
+                        r += str(p.range[0])
+                    r += "</ows:MinimumValue>\n"
+                    r += "          <ows:MaximumValue>"
+                    if str(type(p.range[1]))== "<type 'datetime.datetime'>":
+                        r += iso.datetime_isoformat(p.range[1])
+                    else:
+                        r += str(p.range[1])
+                    r += "</ows:MaximumValue>\n"
+                    r += "        </ows:Range>\n"
+                r += "      </ows:AllowedValues>\n"
+                r += "    </ows:Parameter>\n"
+            r += "    </ows:Operation>\n"
+        r += "  </ows:OperationsMetadata>\n"
+        
+    if not GC.ObservationOfferingList==[]:
+        r += "  <!--~~~~~~~~~~~~~~~~~~-->\n"
+        r += "  <!-- Contents Section -->\n"
+        r += "  <!--~~~~~~~~~~~~~~~~~~-->\n"
+        r += "  <Contents>\n"
+        r += "    <ObservationOfferingList>\n"
+        for ofl in GC.ObservationOfferingList.offerings:
+            r += "      <ObservationOffering gml:id=\"" + str(ofl.id) + "\">\n"
+            r += "        <gml:description>" + ofl.desc + "</gml:description>\n"
+            r += "        <gml:name>" + ofl.name + "</gml:name>\n"
+
+            if ofl.boundedBy:
+                r += "        <gml:boundedBy>\n"
+                r += "          <gml:Envelope>\n"
+                r += "            " + str(ofl.boundedBy) + "\n"
+                r += "          </gml:Envelope>\n"
+                r += "        </gml:boundedBy>\n"
+
+            
+            if ofl.beginPosition and ofl.endPosition :
+                r += "        <time>\n"
+                r += "          <gml:TimePeriod>\n"
+                r += "            <gml:beginPosition>" + iso.datetime_isoformat(ofl.beginPosition) + "</gml:beginPosition>\n"
+                r += "            <gml:endPosition>" + iso.datetime_isoformat(ofl.endPosition) + "</gml:endPosition>\n"
+                r += "          </gml:TimePeriod>\n"
+                r += "        </time>\n"
+            else:
+                r += "        <sos:time />\n"
+                
+            for pr in ofl.procedures:
+                r += "        <sos:procedure xlink:href=\"" + sosConfig.urn["procedure"] + pr + "\" />\n"
+            
+            for op in ofl.obsProp:
+                r += "        <sos:observedProperty xlink:href=\"" + op + "\" />\n"
+            
+            for fo in ofl.fois:
+                r += "        <sos:featureOfInterest xlink:href=\"" + fo + "\" />\n"
+            
+            
+            for ef in GC.ObservationOfferingList.responseFormat:
+                r += "        <sos:responseFormat>" + ef + "</sos:responseFormat>\n"
+                
+            for rmd in GC.ObservationOfferingList.resultModel:
+                r += "        <sos:resultModel>" + rmd + "</sos:resultModel>\n"
+                
+            for rm in GC.ObservationOfferingList.responseMode:
+                r += "        <sos:responseMode>" + rm + "</sos:responseMode>\n"
+
+            r += "        </ObservationOffering>\n"
+        
+        r += "      </ObservationOfferingList>\n"
+        r += "      </Contents>\n"
+    r += "    </Capabilities>"
+    return r
+    
+
+
+
+
diff --git a/istsoslib/renderers/GCresponseRender.pyc b/istsoslib/renderers/GCresponseRender.pyc
new file mode 100644
index 0000000..8545c75
Binary files /dev/null and b/istsoslib/renderers/GCresponseRender.pyc differ
diff --git a/istsoslib/renderers/GFresponseRender.py b/istsoslib/renderers/GFresponseRender.py
new file mode 100755
index 0000000..f563f08
--- /dev/null
+++ b/istsoslib/renderers/GFresponseRender.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from lib import isodate as iso
+#import sosConfig
+
+def render(GF,sosConfig):
+    r = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+    if GF.type.lower()=="station" or GF.type.lower()=="point":
+        r += "<sa:SamplingPoint \n"
+    elif GF.type=="surface":
+        r += "<sa:SamplingSurface \n"
+    r += "gml:id=\"" + GF.name + "\" \n"
+    r += "xmlns:sa=\"http://www.opengis.net/sampling/1.0\" \n"
+    r += "xmlns:swe=\"http://www.opengis.net/swe/1.0.1\" \n"
+    r += "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" 
+    r += "xmlns:xlink=\"http://www.w3.org/1999/xlink\" \n" 
+    r += "xmlns:gml=\"http://www.opengis.net/gml\" \n"
+    r += "xmlns:om=\"http://www.opengis.net/om/1.0\" \n"
+    r += "xsi:schemaLocation=\"http://www.opengis.net/sampling/1.0 http://schemas.opengis.net/sampling/1.0.0/sampling.xsd\">\n"
+
+    r += "  <gml:description>" + GF.desc + "</gml:description>\n"
+    r += "  <gml:name>" + GF.name + "</gml:name> \n"
+    r += "  <sa:sampledFeature/>\n"
+    
+    for i in range(len(GF.procedures)):
+        r += "  <sa:relatedObservation>\n"
+        r += "    <om:Observation>\n"
+        
+        # Sampling time
+        for a in range(len(GF.samplingTime[i])):
+            if len(GF.samplingTime[i][a])==2: 
+                r += "    <om:samplingTime>\n"
+                r += "      <gml:TimePeriod>\n"
+                r += "        <gml:beginPosition>" + iso.datetime_isoformat(GF.samplingTime[i][a][0]) + "</gml:beginPosition>\n"
+                r += "        <gml:endPosition>" + iso.datetime_isoformat(GF.samplingTime[i][a][1]) + "</gml:endPosition>\n"
+                r += "        <gml:duration>"  + iso.duration_isoformat(GF.samplingTime[i][a][1]-GF.samplingTime[i][a][0]) + "</gml:duration>\n"
+                '''
+                r += "        <gml:TimeLength>\n"
+                r += "          <gml:duration>"  + iso.duration_isoformat(a[1]-a[0]) + "</gml:duration>\n"
+                r += "          <gml:timeInterval unit=\"" + str(ob.timeResUnit) + "\">" + str(ob.timeResVal) + "</gml:timeInterval>\n"            
+                r += "        </gml:TimeLength>\n"
+                '''
+                r += "      </gml:TimePeriod>\n"
+                r += "    </om:samplingTime>\n"
+                
+        # Procedure
+        r += "      <om:procedure xlink:href=\"" + GF.procedures[i] + "\"/>\n"
+        
+        # ObservationProperty
+        r += "      <om:observedProperty>\n"
+        if GF.obsType[i] == "insitu-fixed-point":
+            ii=1
+        elif GF.obsType[i] == "insitu-mobile-point":
+            ii=4
+        r += "      <swe:CompositePhenomenon gml:id=\"comp_" + str(GF.idPrc[i]) + "\" dimension=\"" + str(len(GF.properties[i])+ii) + "\">\n"
+        r += "      <gml:name/>\n"
+        r += "        <swe:component xlink:href=\"" + sosConfig.urn["parameter"] + "time:iso8601" + " \" />\n" 
+        #if ob.procedureType == "insitu-fixed-point":
+            
+        if GF.obsType[i]=="insitu-mobile-point":          
+            r += "        <swe:component xlink:href=\"" + sosConfig.urn["refsystem"] + ":x-position\" />\n"
+            r += "        <swe:component xlink:href=\"" + sosConfig.urn["refsystem"] + ":y-position\" />\n"
+            r += "        <swe:component xlink:href=\"" + sosConfig.urn["refsystem"] + ":z-position\" />\n"
+        
+        for c in range(len(GF.properties[i])):
+            r += "        <swe:component xlink:href=\"" + sosConfig.urn["parameter"] + GF.properties[i][c] + "\"/>\n"
+            
+        r += "      </swe:CompositePhenomenon>\n"
+        r += "      </om:observedProperty>\n"
+        
+        #FEATURE OF INTEREST
+        r += "    <om:featureOfInterest xlink:href=\"" + sosConfig.urn["feature"] + GF.type + ":" + GF.name + "\"/>\n"
+            
+        #RESULT EMPTY (?)
+        r += "      <om:result/>\n"
+        
+        r += "    </om:Observation>\n"
+        r += "  </sa:relatedObservation>\n"
+    
+    r += "  <sa:position> \n"
+    r += "    " + GF.geom + "\n"
+    r += "  </sa:position>\n"
+    if GF.type.lower()=="station" or GF.type.lower()=="point":
+        r += "</sa:SamplingPoint> \n"
+    elif GF.type=="surface":
+        r += "</sa:SamplingSurface> \n"
+    
+    return r
diff --git a/istsoslib/renderers/GOresponseRender.py b/istsoslib/renderers/GOresponseRender.py
new file mode 100755
index 0000000..9fda219
--- /dev/null
+++ b/istsoslib/renderers/GOresponseRender.py
@@ -0,0 +1,350 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from lib import isodate as iso
+from istsoslib import sosException
+
+def render(GO,sosConfig):
+    if GO.filter.responseFormat in ['text/xml;subtype="om/1.0"',"text/xml"]:
+        return XMLformat(GO)
+    elif GO.filter.responseFormat=="text/plain":
+        return CSVformat(GO)
+#    elif GO.filter.responseFormat=="image/png":
+#        return CHARTformat(GO)
+    elif GO.filter.responseFormat in ["application/json","text/x-json"]:
+        return JSONformat(GO)
+    else:
+        raise Exception("not supported format: %s, try one of %s" % (GO.filter.responseFormat,"; ".join(sosConfig.parameters["GO_responseFormat"])))
+
+def XMLformat(GO):
+    r = """<om:ObservationCollection xmlns:sos="http://www.opengis.net/sos/1.0"
+  xmlns:om="http://www.opengis.net/om/1.0" xmlns:swe="http://www.opengis.net/swe/1.0.1"
+  xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.opengis.net/om/1.0  http://schemas.opengis.net/om/1.0.0/om.xsd">
+"""
+    r += "<gml:description>" + GO.offInfo.desc + "</gml:description>\n"    
+    r += "<gml:name>" + GO.offInfo.name + "</gml:name>\n"    
+    
+    if len(GO.obs)==0:
+        raise sosException.SOSException("NoApplicableCode",None,"No matching observation was found according the request parameters!")
+                
+        r += "<om:member/>\n"
+    for ob in GO.obs:
+        
+        #OBSERVATION OBJ
+        r += "<om:member>\n"
+        r += "  <om:Observation>\n"
+        r += "    <gml:name>" + ob.name + "</gml:name>\n"
+        
+        #PERIODO DI CAMPIONAMENTO DEI DATI ESTRATTI      
+        if ob.samplingTime != None:
+            r += "    <om:samplingTime>\n"
+            r += "      <gml:TimePeriod>\n"
+#            r += "        <gml:beginPosition>" + ob.samplingTime[0].astimezone(GO.reqTZ).strftime("%Y-%m-%dT%H:%M:%S.%f%z") + "</gml:beginPosition>\n"
+            
+            r += "        <gml:beginPosition>" + ob.samplingTime[0].astimezone(GO.reqTZ).isoformat() + "</gml:beginPosition>\n"
+            
+            if ob.samplingTime[1]:
+                r += "        <gml:endPosition>" + ob.samplingTime[1].astimezone(GO.reqTZ).isoformat() + "</gml:endPosition>\n"
+            else:
+                r += "        <gml:endPosition>" + ob.samplingTime[0].astimezone(GO.reqTZ).isoformat() + "</gml:endPosition>\n"
+                
+            if ob.samplingTime[1]:
+                r += "        <gml:duration>"  + iso.duration_isoformat(ob.samplingTime[1]-ob.samplingTime[0]) + "</gml:duration>\n"
+            r += "      </gml:TimePeriod>\n"
+            r += "    </om:samplingTime>\n"
+        else:
+            r += "    <om:samplingTime/>\n"
+        
+        #PROCEDURE
+        r += "    <om:procedure xlink:href=\"" + ob.procedure + "\"/>\n"                
+        
+        #PROPRIETA OSSERVATA
+        if ob.procedureType == "insitu-fixed-point":
+            ii=1
+        elif ob.procedureType == "insitu-mobile-point":
+            ii=4
+        elif ob.procedureType == "virtual":
+            ii=1
+        
+        #OBSERVED PROPERTIES
+        r += "    <om:observedProperty>\n"
+        r += "      <swe:CompositePhenomenon gml:id=\"comp_" + str(ob.id_prc) + "\" dimension=\"" + str(len(ob.opr_urn)+ii) + "\">\n"
+        r += "        <gml:name>timeSeriesOfObservations</gml:name>\n"
+        r += "        <swe:component xlink:href=\"" + ob.timedef + "\"/>\n"
+        
+        if ob.procedureType=="insitu-mobile-point":
+            r += "        <swe:component xlink:href=\"" + GO.refsys + ":x-position\"/>\n"
+            r += "        <swe:component xlink:href=\"" + GO.refsys + ":y-position\"/>\n"
+            r += "        <swe:component xlink:href=\"" + GO.refsys + ":z-position\"/>\n"
+
+        for urn in ob.opr_urn:    
+            r += "        <swe:component xlink:href=\"" + urn + "\"/>\n"
+        r += "      </swe:CompositePhenomenon>\n"
+        r += "    </om:observedProperty>\n"      
+    
+        #FEATURE OF INTEREST
+        r += "    <om:featureOfInterest xlink:href=\"" + ob.foi_urn + "\">\n"
+        r += "      <gml:FeatureCollection>\n"
+        r += "        <gml:location>\n"
+        r += "          " + ob.foiGml + "\n"
+        r += "        </gml:location>\n"
+        r += "      </gml:FeatureCollection>\n"
+        r += "    </om:featureOfInterest>"
+    
+        #SERIE TEMPORALE
+        r += "    <om:result>\n"
+        
+        #ii = 1
+        #if ob.procedureType=="insitu-mobile-point":
+        #    ii = 4
+        
+        #DESCRIZIONE DEI DATI ESTRATTI: VARIA A SECONDA DEL TIPO DI PROCEDURA
+        
+        #-- CASO GENERALE
+        r += "      <swe:DataArray>\n"
+        r += "        <swe:elementCount>\n"
+        r += "          <swe:Count>\n"
+        r += "            <swe:value>" + str(len(ob.observedProperty)+ii) + "</swe:value>\n"
+        r += "          </swe:Count>\n"
+        r += "        </swe:elementCount>\n"
+        r += "        <swe:elementType name=\"SimpleDataArray\">\n"
+        r += "          <swe:DataRecord>\n"
+        r += "            <swe:field name=\"Time\">\n"
+        r += "              <swe:Time definition=\"" + ob.timedef + "\"/>\n"
+        r += "            </swe:field>\n"
+        
+        if ob.procedureType=="insitu-mobile-point":
+            r += "            <swe:field name=\"x-position\">\n"
+            r += "              <swe:Quantity definition=\"" + GO.refsys + ":x-position\"/>\n"
+            r += "            </swe:field>\n"
+            r += "            <swe:field name=\"y-position\">\n"
+            r += "              <swe:Quantity definition=\"" + GO.refsys + ":y-position\"/>\n"
+            r += "            </swe:field>\n"
+            r += "            <swe:field name=\"z-position\">\n"
+            r += "              <swe:Quantity definition=\"" + GO.refsys + ":z-position\"/>\n"
+            r += "            </swe:field>\n"
+            if ob.qualityIndex:
+                r += "            <swe:field name=\"position-qualityIndex\">\n"
+                r += "              <swe:Quantity definition=\"" + GO.refsys + ":position:qualityIndex\"/>\n"
+                r += "            </swe:field>\n"
+        
+        for idx in range(len(ob.observedProperty)):
+            if ob.aggregate_function:
+                if ob.observedProperty[idx].split(":")[-1] == "qualityIndex":
+                    r += "            <swe:field name=\"%s\">\n" % (ob.observedPropertyName[idx])
+                    r += "              <swe:Quantity definition=\"%s\">\n" % (ob.observedProperty[idx])
+                else:
+                    r += "            <swe:field name=\"%s:%s\">\n" % (ob.observedPropertyName[idx],ob.aggregate_function)
+                    r += "              <swe:Quantity definition=\"%s:%s\">\n" % (ob.observedProperty[idx],ob.aggregate_function)
+                if ob.aggregate_function.upper()=="COUNT":
+                    r += "                <swe:uom code=\"None\"/>\n"
+                else:
+                    r += "                <swe:uom code=\"" + ob.uom[idx] + "\"/>\n"
+            else:
+                r += "            <swe:field name=\"%s\">\n" % (ob.observedPropertyName[idx])
+                r += "              <swe:Quantity definition=\"" + ob.observedProperty[idx] + "\">\n"
+                r += "                <swe:uom code=\"" + ob.uom[idx] + "\"/>\n"
+            r += "              </swe:Quantity>\n"
+            r += "            </swe:field>\n"
+            
+        r += "          </swe:DataRecord>\n"
+        r += "        </swe:elementType>\n"
+        r += "        <swe:encoding>\n"
+        r += "          <swe:TextBlock tokenSeparator=\",\" blockSeparator=\"@\" decimalSeparator=\".\"/>\n"
+        r += "        </swe:encoding>\n"
+        if len(ob.data)>0:
+            r += "        <swe:values>"
+            data=[]
+            for row in range(len(ob.data)):
+                str_data=[ob.data[row][0].isoformat()]
+                for i in range(1,len(ob.data[0])):
+                    str_data.append(str(ob.data[row][i]))
+                data.append(",".join(str_data))
+            r += "@".join(data)
+            r += "</swe:values>\n"
+        else:
+            r += "        <swe:values/>"
+        r += "      </swe:DataArray>\n"
+        r += "    </om:result>\n"
+        r += "  </om:Observation>\n"
+        r += "</om:member>\n"
+    r += "</om:ObservationCollection>" 
+    return r
+
+def JSONformat(GO):
+    import json
+    oc = {
+        "ObservationCollection": {
+            "description": GO.offInfo.desc,
+            "name": GO.offInfo.name,            
+            "member": []
+        }
+    }
+    for iob, ob in enumerate(GO.obs):
+        member = {
+            "name": ob.name,
+            "samplingTime": {},
+            "procedure": ob.procedure
+        }
+        if ob.samplingTime != None:
+            member["samplingTime"]["beginPosition"] = ob.samplingTime[0].astimezone(GO.reqTZ).isoformat()
+            if ob.samplingTime[1]:
+                member["samplingTime"]["endPosition"] = ob.samplingTime[1].astimezone(GO.reqTZ).isoformat()
+                member["samplingTime"]["duration"] = iso.duration_isoformat(ob.samplingTime[1]-ob.samplingTime[0])
+                
+            else:
+                member["samplingTime"]["endPosition"] = ob.samplingTime[0].astimezone(GO.reqTZ).isoformat()
+        if ob.procedureType == "insitu-fixed-point":
+            ii=1
+        elif ob.procedureType == "insitu-mobile-point":
+            ii=4
+        elif ob.procedureType == "virtual":
+            ii=1
+            
+        member['observedProperty'] = {
+            "CompositePhenomenon": {
+                "id": "comp_%s" % str(ob.id_prc),
+                "dimension": str(len(ob.opr_urn)+ii),
+                "name": "timeSeriesOfObservations"
+            }
+        }
+        
+        member['observedProperty']["component"] = [ob.timedef]
+        
+        if ii==4:
+            member['observedProperty']["component"] += [
+                ("%s:x-position" % GO.refsys), 
+                ("%s:y-position" % GO.refsys), 
+                ("%s:z-position" % GO.refsys)
+            ]
+            
+        member['observedProperty']["component"] += ob.opr_urn
+        
+        member['featureOfInterest'] = {
+            "name": ob.foi_urn,
+            "geom": ob.foiGml.replace("\"","'")
+        }
+        
+        member['result'] = {
+            "DataArray": {
+                "elementCount": str(len(ob.observedProperty)+ii),
+                "field": [
+                    {
+                        "name": "Time",
+                        "definition": ob.timedef
+                    }
+                ]
+            }
+        }
+        if ii==4:
+            member['result']['DataArray']['field'] += [
+                {
+                    "name": "x-position",
+                    "definition": "%s:x-position" % GO.refsys
+                },
+                {
+                    "name": "y-position",
+                    "definition": "%s:y-position" % GO.refsys
+                },
+                {
+                    "name": "z-position",
+                    "definition": "%s:z-position" % GO.refsys
+                }
+            ]
+        for idx in range(len(ob.observedProperty)):
+            member['result']['DataArray']['field'] += [
+                {
+                    "name": ob.observedPropertyName[idx],
+                    "definition": ob.observedProperty[idx],
+                    "uom": ob.uom[idx]  
+                }
+            ]
+        
+        member['result']['DataArray']['values'] = []
+        for row in range(len(ob.data)):
+            data = [ob.data[row][0].isoformat()]
+            for i in range(1,len(ob.data[0])):
+                data.append(str(ob.data[row][i]))
+            member['result']['DataArray']['values'].append(data)
+            
+        # append member to collection
+        oc["ObservationCollection"]["member"].append(member)
+
+    
+    
+    return json.dumps(oc)
+    #return json.dumps(wut.encodeobject(oc))
+
+def CSVformat(GO):
+    #create unique columns name
+    columns = ["time","procedure"]
+    columns_name = [None,"urn:ogc:def:procedure"]
+    
+    
+    for iob, ob in enumerate(GO.obs):
+        if columns_name[0]==None:
+            columns_name[0] = ob.timedef
+        if ob.procedureType == "insitu-mobile-point":
+            columns += ["x-position","y-position","z-position"]
+            columns_name += ["%s:x-position" % GO.refsys,"%s:y-position" % GO.refsys,"%s:z-position" % GO.refsys]
+        for idx,opr in enumerate(ob.observedProperty):
+            if not opr in columns:
+                columns += [opr]
+                columns_name += ["%s" %(opr)]
+    
+    #create rows
+    rows = []
+    for iob, ob in enumerate(GO.obs):
+        #create look-up-table for given observation member
+        #associates opr index with row index
+        lut = { 0 : 0}
+        i=0
+        if ob.procedureType == "insitu-mobile-point":
+            lut[1] = columns.index("x-position")
+            lut[2] = columns.index("y-position")
+            lut[3] = columns.index("z-position")
+            i=3
+        for opr in ob.observedProperty:
+            i += 1
+            try:
+                lut[i] = columns.index(opr)
+            except:
+                raise Exception("%s - %s" %(lut,columns))
+        #raise Exception( "%s - %s" %(lut,columns))
+        #create row
+        
+        
+        #append row
+        for vals in ob.data:
+            row = [""] * len(columns)
+            row[0] = vals[0].isoformat()
+            row[1] = ob.procedure.split(":")[-1]
+            for i in range(1,len(vals)):
+                row[lut[i]] = str(vals[i])
+            rows.append(row)
+                
+    #write results as CSV    
+    r  = ",".join(columns_name) + "\n"
+    for c in rows:
+        r += ",".join(c) + "\n"
+    
+    return r
+
+
+    
diff --git a/istsoslib/renderers/GOresponseRender.pyc b/istsoslib/renderers/GOresponseRender.pyc
new file mode 100644
index 0000000..44abb27
Binary files /dev/null and b/istsoslib/renderers/GOresponseRender.pyc differ
diff --git a/istsoslib/renderers/IOresponseRender.py b/istsoslib/renderers/IOresponseRender.py
new file mode 100755
index 0000000..5a94076
--- /dev/null
+++ b/istsoslib/renderers/IOresponseRender.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+def render(IO,sosConfig):
+    r =  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+    r += "  <sos:InsertObservationResponse xmlns:sos=\"http://www.opengis.net/sos/1.0\">"
+    if IO.assignedId == "":
+        r += "    <sos:AssignedObservationId/>"
+    else:
+        r += "    <sos:AssignedObservationId>" + str(IO.assignedId) + "</sos:AssignedObservationId>"
+    r += "  </sos:InsertObservationResponse>"
+    
+    return r
+
diff --git a/istsoslib/renderers/IOresponseRender.pyc b/istsoslib/renderers/IOresponseRender.pyc
new file mode 100644
index 0000000..c6cecb4
Binary files /dev/null and b/istsoslib/renderers/IOresponseRender.pyc differ
diff --git a/istsoslib/renderers/RSresponseRender.py b/istsoslib/renderers/RSresponseRender.py
new file mode 100755
index 0000000..c2e59cb
--- /dev/null
+++ b/istsoslib/renderers/RSresponseRender.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from lib import isodate as iso
+
+def render(RS,sosConfig):
+    r = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+    r += "<sos:RegisterSensorResponse\n"
+    r += "     xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+    r += "     xsi:schemaLocation=\"http://schemas.opengis.net/sos/1.0.0/sosAll.xsd\"\n"
+    r += "     xmlns:sos=\"http://www.opengis.net/sos/1.0\">\n"
+    r += "<AssignedSensorId>"
+    r += "%s" %(RS.assignedSensorId)
+    r += "</AssignedSensorId>\n"
+    r += "</sos:RegisterSensorResponse>"
+    return r
diff --git a/istsoslib/renderers/RSresponseRender.pyc b/istsoslib/renderers/RSresponseRender.pyc
new file mode 100644
index 0000000..de7af60
Binary files /dev/null and b/istsoslib/renderers/RSresponseRender.pyc differ
diff --git a/istsoslib/renderers/USDresponseRender.py b/istsoslib/renderers/USDresponseRender.py
new file mode 100755
index 0000000..3a71991
--- /dev/null
+++ b/istsoslib/renderers/USDresponseRender.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+def render(USD,sosConfig):
+    r =  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+    r += "  <sos:updateSensorDescriptionResponse xmlns:sos=\"http://www.opengis.net/sos/1.0\">"
+    r += "    <sos:UpdatedProcedure>" + str(USD.procedure) + "</sos:UpdatedProcedure>"
+    r += "  </sos:updateSensorDescription>"
+    
+    return r
+
diff --git a/istsoslib/renderers/__init__.py b/istsoslib/renderers/__init__.py
new file mode 100755
index 0000000..5fc6bc6
--- /dev/null
+++ b/istsoslib/renderers/__init__.py
@@ -0,0 +1 @@
+__all__ = ["GCresponseRender","DSresponseRender","GOresponseRendered", "GFresponseRender", "IOresponseRender", "RSresponseRender", "USDresponseRender", "factory_render", "VirtualProcess" ]
diff --git a/istsoslib/renderers/__init__.pyc b/istsoslib/renderers/__init__.pyc
new file mode 100644
index 0000000..edd57e4
Binary files /dev/null and b/istsoslib/renderers/__init__.pyc differ
diff --git a/istsoslib/renderers/factory_render.py b/istsoslib/renderers/factory_render.py
new file mode 100755
index 0000000..c38cc5d
--- /dev/null
+++ b/istsoslib/renderers/factory_render.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import sosConfig
+from istsoslib import sosException
+
+def sosFactoryRender(response,sosConfig):
+    
+    res_type = str(response.__class__.__name__)
+    
+    if res_type == "GetCapabilitiesResponse":
+        from istsoslib.renderers import GCresponseRender
+        return GCresponseRender.render(response,sosConfig)
+    
+    elif res_type == "DescribeSensorResponse":
+        from istsoslib.renderers import DSresponseRender
+        return DSresponseRender.render(response,sosConfig)
+    
+    elif res_type == "observations":
+        from istsoslib.renderers import GOresponseRender
+        return GOresponseRender.render(response,sosConfig)
+    
+    elif res_type == "foi":
+        from istsoslib.renderers import GFresponseRender
+        return GFresponseRender.render(response,sosConfig)
+    
+    elif res_type == "InsertObservationResponse":
+        from istsoslib.renderers import IOresponseRender
+        return IOresponseRender.render(response,sosConfig)
+    
+    elif res_type == "RegisterSensorResponse":
+        from istsoslib.renderers import RSresponseRender
+        return RSresponseRender.render(response,sosConfig)
+    
+    elif res_type == "UpdateSensorDescriptionResponse":
+        from istsoslib.renderers import USDresponseRender
+        return USDresponseRender.render(response,sosConfig)
+   
+    else:
+        raise sosException.SOSException("InvalidRequest","request","\"request\": %s not supported" %(str(response.__class__.__name__)))
+        
+
+
+    
+
diff --git a/istsoslib/renderers/factory_render.pyc b/istsoslib/renderers/factory_render.pyc
new file mode 100644
index 0000000..1dc26cf
Binary files /dev/null and b/istsoslib/renderers/factory_render.pyc differ
diff --git a/istsoslib/responders/DSresponse.py b/istsoslib/responders/DSresponse.py
new file mode 100755
index 0000000..507fd51
--- /dev/null
+++ b/istsoslib/responders/DSresponse.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+import string
+import os
+import os.path
+import sys
+
+from istsoslib import sosException
+
+
+class DescribeSensorResponse:
+    def __init__(self, filter, pgdb):
+        
+        pgdb.setTimeTZ("UTC")
+    
+        self.smlFile = ""
+        sql = "SELECT id_prc, stime_prc, etime_prc, name_oty from %s.procedures, %s.obs_type" %(filter.sosConfig.schema,filter.sosConfig.schema)
+        sql += " WHERE id_oty=id_oty_fk AND name_prc = %s" 
+        params = (str(filter.procedure),)
+        try:
+            res=pgdb.select(sql,params)
+        except:
+            raise Exception("Error! sql: %s." %(pgdb.mogrify(sql,params)) )
+        
+        # raise error if the procedure is not found in db
+        if res==None:
+            raise sosException.SOSException("InvalidParameterValue","procedure","Procedure '%s' not exist or can't be found.")
+        
+        
+        # look for observation end time
+        try:
+            self.procedureType = res[0]['name_oty']
+        except:
+            self.procedureType = None
+            
+        
+        if self.procedureType == 'virtual':
+            vpFolder = os.path.join(filter.sosConfig.virtual_processes_folder,filter.procedure)
+            try:
+                sys.path.append(vpFolder)
+            except:
+                raise Exception("Error in loading virtual procedure path")
+                
+            # check if python file exist
+            if os.path.isfile("%s/%s.py" % (vpFolder,filter.procedure)):
+                
+                #import procedure process
+                exec "import %s as vproc" %(filter.procedure)
+                
+                # Initialization of virtual procedure will load the source data
+                vp = vproc.istvp()
+                vp._configure(filter,pgdb)
+                
+                self.stime, self.etime = vp.getSampligTime()
+                
+            else:
+                self.stime = None
+                self.etime = None
+        
+        else:
+            # look for observation start time
+            try:
+                self.stime = res[0]['stime_prc']
+            except:
+                self.stime = None
+                #raise sosException.SOSException(1,"Procedure '%s' has no valid stime."%(filter.procedure))
+            
+            # look for observation end time
+            try:
+                self.etime = res[0]['etime_prc']
+            except:
+                self.etime = None
+            
+        
+        # check if folder containing SensorML exists
+        if not os.path.isdir(filter.sosConfig.sensorMLpath):
+            raise Exception("istsos configuration error, cannot find sensorMLpath!")
+        
+        # clean up the procedure name to produce a valid file name
+        filename = filter.procedure
+        valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
+        for c in filename:
+            if not c in valid_chars:
+                raise Exception("procedure name '%s' is not a valid: use only letters or digits!"%(filter.procedure))
+        filename += '.xml'
+        
+        self.smlFile = os.path.join(filter.sosConfig.sensorMLpath, filename)
+        # check if file exist                
+        if not os.path.isfile(self.smlFile):
+            raise Exception("SensorML file for procedure '%s' not found!"%(filter.procedure))
+        
+        sqlProc  = "SELECT def_opr, name_opr, desc_opr, constr_pro, name_uom"
+        sqlProc += " FROM %s.observed_properties opr, %s.proc_obs po," %(filter.sosConfig.schema,filter.sosConfig.schema)
+        sqlProc += " %s.procedures pr, %s.uoms um" %(filter.sosConfig.schema,filter.sosConfig.schema)
+        sqlProc += " WHERE opr.id_opr=po.id_opr_fk AND pr.id_prc=po.id_prc_fk AND um.id_uom = po.id_uom_fk"
+        sqlProc += " AND name_prc = %s" 
+        params = (str(filter.procedure),)
+        try:
+            self.observedProperties=pgdb.select(sqlProc,params)
+        except Exception as exe:
+            raise Exception("Error! sql: %s." % pgdb.mogrify(sqlProc,params))
+        
+        
diff --git a/istsoslib/responders/DSresponse.pyc b/istsoslib/responders/DSresponse.pyc
new file mode 100644
index 0000000..4530aac
Binary files /dev/null and b/istsoslib/responders/DSresponse.pyc differ
diff --git a/istsoslib/responders/GCresponse.py b/istsoslib/responders/GCresponse.py
new file mode 100755
index 0000000..8fc513b
--- /dev/null
+++ b/istsoslib/responders/GCresponse.py
@@ -0,0 +1,368 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+import psycopg2 # @TODO the right library
+import psycopg2.extras
+
+#import sosConfig
+from istsoslib import sosDatabase
+from istsoslib import sosException
+
+class ServiceIdentification:
+    def __init__(self,sosConfig):
+        self.title=sosConfig.serviceIdentification["title"]
+        self.abstract=sosConfig.serviceIdentification["abstract"]
+        self.keywords=sosConfig.serviceIdentification["keywords"]
+        self.serviceTypeCode=sosConfig.serviceType["codespace"]
+        self.serviceTypeValue=sosConfig.serviceType["value"]
+        self.serviceTypeVersion=sosConfig.serviceType["version"]
+        self.fees=sosConfig.serviceIdentification["fees"]
+        self.accessconstrains=sosConfig.serviceIdentification["accessConstrains"]
+    
+class ServiceProvider:
+    def __init__(self,sosConfig):
+        self.providerName=sosConfig.serviceProvider["providerName"]
+        self.providerSite=sosConfig.serviceProvider["providerSite"]
+        self.individualName=sosConfig.serviceProvider["serviceContact"]["individualName"]
+        self.positionName=sosConfig.serviceProvider["serviceContact"]["positionName"]
+        self.contactVoice=sosConfig.serviceProvider["serviceContact"]["contactInfo"]["voice"]
+        self.contactFax=sosConfig.serviceProvider["serviceContact"]["contactInfo"]["fax"]
+        self.contactDelivery=sosConfig.serviceProvider["serviceContact"]["contactInfo"]["deliveryPoint"]
+        self.contactCity=sosConfig.serviceProvider["serviceContact"]["contactInfo"]["city"]
+        self.contactArea=sosConfig.serviceProvider["serviceContact"]["contactInfo"]["administrativeArea"]
+        self.contactPostCode=sosConfig.serviceProvider["serviceContact"]["contactInfo"]["postalCode"]
+        self.contactCountry=sosConfig.serviceProvider["serviceContact"]["contactInfo"]["country"]
+        self.contactMail=sosConfig.serviceProvider["serviceContact"]["contactInfo"]["email"]
+
+class Parameter:
+    def __init__(self,name,use="optional",allowedValues=[],range=[]):
+        self.name=name
+        self.use=use
+        self.allowedValues=allowedValues
+        self.range=range
+
+class Operation:
+    def __init__(self,name,get="",post=""):
+        self.name=name
+        self.get=get
+        self.post=post
+        self.parameters=[]
+    def addParameter(self,name,use="optional",allowedValues=[],range=[]):
+        self.parameters.append(Parameter(name,use,allowedValues,range))
+    
+def BuildSensorIdList(pgdb,sosConfig):
+    list=[]
+    sql = "SELECT name_prc FROM %s.procedures ORDER BY name_prc" %(sosConfig.schema)
+    try:
+        rows=pgdb.select(sql)
+    except:
+        raise Exception("sql: %s" %(pgdb.mogrify(sql)))
+    for row in rows:
+        list.append(sosConfig.urn["procedure"] + row["name_prc"])    
+    return list
+    
+def BuildOfferingList(pgdb,sosConfig):
+    list=[]
+    sql = "SELECT distinct(name_off) FROM %s.procedures, %s.off_proc, %s.offerings" %(sosConfig.schema,sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_prc=id_prc_fk AND id_off_fk=id_off ORDER BY name_off"
+    try:
+        rows=pgdb.select(sql)
+    except:
+        raise Exception("sql: %s" %(pgdb.mogrify(sql)))
+    #rows=pgdb.select(sql)
+    for row in rows:
+        list.append(sosConfig.urn["offering"] +row["name_off"])
+    return list
+
+def BuildEventTimeRange(pgdb,sosConfig):
+    sql = "SELECT min(stime_prc) as b, max(etime_prc) as e FROM %s.procedures" %(sosConfig.schema)
+    #sql = "SELECT min(time_eti) as b, max(time_eti) as e FROM %s.event_time" %(sosConfig.schema)
+    try:
+        rows=pgdb.select(sql)
+    except:
+        raise Exception("sql: %s" %(pgdb.mogrify(sql)))
+    #check if not observation?!?!?!?
+    return [rows[0]["b"],rows[0]["e"]]
+
+def BuildobservedPropertyList(pgdb,sosConfig):
+    list=[]
+    sql = "SELECT distinct(def_opr) as nopr FROM %s.procedures,%s.proc_obs,%s.observed_properties" %(sosConfig.schema,sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_prc_fk=id_prc AND id_opr_fk=id_opr ORDER BY nopr"
+    rows=pgdb.select(sql)
+    for row in rows:
+        #list.append(sosConfig.urn["phenomena"] + row["nopr"])
+        list.append(row["nopr"])
+    return list
+
+def BuildfeatureOfInterestList(pgdb,sosConfig):
+    list=[]
+    sql = "SELECT distinct(name_fty||':'||name_foi) as nfoi FROM %s.foi, %s.feature_type" %(sosConfig.schema,sosConfig.schema) 
+    sql += " WHERE id_fty=id_fty_fk ORDER BY nfoi"
+    try:
+        rows=pgdb.select(sql)
+    except:
+        raise Exception("sql: %s" %(pgdb.mogrify(sql)))
+    for row in rows:
+        list.append(sosConfig.urn["feature"] + row["nfoi"])
+    return list
+
+def BuildOffEnvelope(pgdb,id,sosConfig):
+    sql = "SELECT ST_asgml(Box2D(u.geom)) as ext FROM"
+    sql += " ("
+    #----case obs_type = fix
+    sql += " SELECT ST_Transform(geom_foi,%s) as geom FROM %s.off_proc," %(sosConfig.istsosepsg,sosConfig.schema)
+    sql += " %s.procedures, %s.foi" %(sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_prc_fk=id_prc AND id_foi_fk=id_foi AND id_off_fk=%s"
+    #---------------
+    sql += " UNION"
+    #----case obs_type = mobile
+    sql += " SELECT ST_Transform(geom_pos,%s) as geom FROM %s.positions, %s.event_time e," %(sosConfig.istsosepsg,sosConfig.schema,sosConfig.schema)
+    sql += " %s.procedures, %s.off_proc o" %(sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_eti=id_eti_fk AND id_prc=e.id_prc_fk AND id_prc=o.id_prc_fk AND id_off_fk=%s"
+    #----------------
+    sql += " ) u"
+    params=(id,id)
+    try:
+        rows=pgdb.select(sql,params)
+    except:
+        raise Exception("sql: %s" %(pgdb.mogrify(sql,params)))
+        
+    # Retrieve any of the gml:* elements below to go inside the gml:Envelope tag.
+    # Unfortunately, xml.etree.ElementTree.fromstring cannot parse xml elements with
+    # an unknown prefix, so I have to revert to string manipulation.
+    result = "<gml:Null>Not Applicable</gml:Null>"
+    if rows:
+        gml = rows[0]["ext"]
+        # TODO: a better solution would be to parse these from the schema definition.
+        for element in ['gml:coordinates','gml:lowerCorner', 'gml:coord', 'gml:pos']:
+            open_tag = '<%s>' % element
+            close_tag = '</%s>' % element
+            pos = gml.find(open_tag)
+            if pos:
+                gml = gml[pos:]
+                pos = gml.find(close_tag)
+                result = gml[:pos+len(close_tag)]
+                break
+    return result
+
+
+def BuildOffTimePeriod(pgdb,id,sosConfig):
+    sql = "SELECT max(etime_prc) as e, min(stime_prc) as b"
+    sql += " from %s.procedures, %s.off_proc o" %(sosConfig.schema,sosConfig.schema)
+    sql += " WHERE o.id_prc_fk=id_prc and id_off_fk=%s" 
+    params = (id,)
+    try:
+        rows=pgdb.select(sql,params)
+    except Exception as err:
+        raise Exception("SQL2: %s - %s" %(pgdb.mogrify(sql,params), err))
+    
+    return [rows[0]["b"],rows[0]["e"]]
+
+def BuildOffProcList(pgdb,id,sosConfig):
+    list=[]
+    sql = "SELECT distinct(name_prc)"
+    sql += " FROM %s.off_proc, %s.procedures,%s.offerings" %(sosConfig.schema,sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_off=id_off_fk AND id_prc_fk=id_prc AND id_off=%s"
+    sql += " ORDER BY name_prc"
+    params = (id,)
+    try:
+        rows=pgdb.select(sql,params)
+    except:
+        raise Exception("sql: %s" %(pgdb.mogrify(sql,params)))
+    for row in rows:
+        #list.append(sosConfig.urn["procedure"] + row["name_prc"])
+        list.append(row["name_prc"])
+    return list
+
+def BuildOffObsPrList(pgdb,id,sosConfig):
+    list=[]
+    sql = "SELECT distinct(def_opr)"
+    sql += " FROM %s.offerings, %s.off_proc o, %s.procedures," %(sosConfig.schema,sosConfig.schema,sosConfig.schema)
+    sql += " %s.proc_obs p, %s.observed_properties" %(sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_off=id_off_fk AND o.id_prc_fk=id_prc AND p.id_prc_fk=id_prc"
+    sql += " AND id_opr_fk=id_opr AND id_off=%s" %(id)
+    sql += " ORDER BY def_opr"
+    params = (id,)
+    try:
+        rows=pgdb.select(sql,params)
+    except:
+        raise Exception("sql: %s"%(pgdb.mogrify(sql,params)))
+    for row in rows:
+        list.append(row["def_opr"])
+    return list
+
+def BuildOffFoiList(pgdb,id,sosConfig):
+    list=[]
+
+    sql = "SELECT distinct(name_fty || ':' || name_foi) as fois" 
+
+    sql += " FROM %s.off_proc, %s.procedures,%s.foi,%s.feature_type"  %(sosConfig.schema,sosConfig.schema,sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_prc_fk=id_prc AND id_off_fk=%s"
+    sql += " AND id_foi_fk=id_foi AND id_fty_fk=id_fty"
+    sql += " ORDER BY fois"
+    params = (id,)
+    try:
+        rows=pgdb.select(sql,params)
+    except:
+        raise Exception("sql: %s" %(pgdb.mogrify(sql,params)))
+    for row in rows:
+        list.append(sosConfig.urn["feature"] + row["fois"])
+    return list
+
+def BuildSensorList(pgdb,sosConfig):
+    sql = "SELECT assignedid_prc as id from %s.procedures" %(sosConfig.schema)
+    try:
+        rows=pgdb.select(sql)
+    except:
+        raise Exception("sql: %s" %(pgdb.mogrify(sql)))
+    return [ sosConfig.urn["sensor"]+str(sid["id"]) for sid in rows ]
+
+class OperationsMetadata:
+    def __init__(self,pgdb,sosConfig):
+        self.OP=[]
+        srslist=[sosConfig.urn["refsystem"]+i for i in sosConfig.parameters["GO_srs"]]
+
+        """ GetCapabilities """
+        GetCapabilities=Operation(name="GetCapabilities",get=sosConfig.serviceUrl["get"],post=sosConfig.serviceUrl["post"])
+        GetCapabilities.addParameter(name="service",use="required",allowedValues=sosConfig.parameters["service"])
+        GetCapabilities.addParameter(name="version",use="required",allowedValues=sosConfig.parameters["version"])
+        GetCapabilities.addParameter(name="section",use="optional",allowedValues=sosConfig.parameters["GC_Section"])
+        self.OP.append(GetCapabilities)
+        
+        #DescribeSensor 
+        DescribeSensor=Operation(name="DescribeSensor",get=sosConfig.serviceUrl["get"],post=sosConfig.serviceUrl["post"])
+        DescribeSensor.addParameter(name="service",use="required",allowedValues=sosConfig.parameters["service"])
+        DescribeSensor.addParameter(name="version",use="required",allowedValues=sosConfig.parameters["version"])
+        DescribeSensor.addParameter(name="procedure",use="required",allowedValues=BuildSensorIdList(pgdb,sosConfig))
+        DescribeSensor.addParameter(name="outputFormat",use="required",allowedValues=sosConfig.parameters["DS_outputFormats"])
+        self.OP.append(DescribeSensor)
+         
+        #GetObservation 
+        GetObservation=Operation(name="GetObservation",get=sosConfig.serviceUrl["get"],post=sosConfig.serviceUrl["post"])
+        GetObservation.addParameter(name="service",use="required",allowedValues=sosConfig.parameters["service"])
+        GetObservation.addParameter(name="version",use="required",allowedValues=sosConfig.parameters["version"])
+        GetObservation.addParameter(name="srsName",use="optional",allowedValues=srslist) 
+        GetObservation.addParameter(name="offering",use="required",allowedValues=BuildOfferingList(pgdb,sosConfig))
+        GetObservation.addParameter(name="eventTime",use="optional",allowedValues=[],range=BuildEventTimeRange(pgdb,sosConfig))
+        GetObservation.addParameter(name="procedure",use="optional",allowedValues=BuildSensorIdList(pgdb,sosConfig))
+        GetObservation.addParameter(name="observedProperty",use="optional",allowedValues=BuildobservedPropertyList(pgdb,sosConfig))
+        GetObservation.addParameter(name="featureOfInterest",use="optional",allowedValues=BuildfeatureOfInterestList(pgdb,sosConfig))
+        
+        #GetObservation.addParameter(name="result",use="optional",allowedValues=[sosConfig.parameters["result"]])
+        GetObservation.addParameter(name="responseFormat",use="required",allowedValues=sosConfig.parameters["GO_responseFormat"])
+        GetObservation.addParameter(name="resultModel",use="optional",allowedValues=sosConfig.parameters["GO_resultModel"])
+        GetObservation.addParameter(name="responseMode",use="optional",allowedValues=sosConfig.parameters["GO_responseMode"])
+        self.OP.append(GetObservation)
+         
+        #GetFeatureOfInterest 
+        GetFeatureOfInterest=Operation(name="GetFeatureOfInterest",get=sosConfig.serviceUrl["get"],post=sosConfig.serviceUrl["post"])
+        GetFeatureOfInterest.addParameter(name="service",use="required",allowedValues=sosConfig.parameters["service"])
+        GetFeatureOfInterest.addParameter(name="version",use="required",allowedValues=sosConfig.parameters["version"])
+        GetFeatureOfInterest.addParameter(name="featureOfInterest",use="required",allowedValues=BuildfeatureOfInterestList(pgdb,sosConfig))
+        GetFeatureOfInterest.addParameter(name="srsName",use="optional",allowedValues=srslist)
+        self.OP.append(GetFeatureOfInterest)
+         
+        #RegisterSensor 
+        RegisterSensor=Operation(name="RegisterSensor",get=None,post=sosConfig.serviceUrl["post"])
+        RegisterSensor.addParameter(name="service",use="required",allowedValues=sosConfig.parameters["service"])
+        RegisterSensor.addParameter(name="version",use="required",allowedValues=sosConfig.parameters["version"])
+        RegisterSensor.addParameter(name="SensorDescription",use="required",allowedValues=["Any SensorML"])
+        RegisterSensor.addParameter(name="ObservationTemplate",use="required",allowedValues=["Any om:Observation"])
+        self.OP.append(RegisterSensor)
+        
+        #--InsertObservation 
+        InsertObservation=Operation(name="InsertObservation",get=None,post=sosConfig.serviceUrl["post"])
+        InsertObservation.addParameter(name="service",use="required",allowedValues=sosConfig.parameters["service"])
+        InsertObservation.addParameter(name="version",use="required",allowedValues=sosConfig.parameters["version"])
+        InsertObservation.addParameter(name="AssignedSensorId",use="required",allowedValues=["Any registered sensorID"])
+        InsertObservation.addParameter(name="Observation",use="optional",allowedValues=["Any om:Observation"])
+        self.OP.append(InsertObservation)
+        
+        """ optional parameters are:
+        result ogc:comparisonOps Zero or one (Optional)
+        responseFormat (e.g.: text/xml;schema="ioos/0.6.1" TML, O&M, native format, or MPEG stream out-of-band). (MIME content type) One (mandatory)
+        resultModel QName Zero or one (Optional)
+        responseMode (inline, out-of-band, attached, resultTemplate) Zero or one (Optional)
+        """
+
+class Offering:
+    def __init__(self):
+        self.id = None
+        self.name = None
+        self.desc = None
+        self.boundedBy = None
+        self.beginPosition = None
+        self.endPosition = None
+        self.procedures=[]
+        self.obsProp=[]
+        self.fois=[]
+         
+class ObservationOfferingList:
+    #def __init__(self,filter, pgdb):
+    def __init__(self, pgdb,sosConfig):        
+        self.offerings=[]
+        self.responseFormat = sosConfig.parameters["GO_responseFormat"]
+        self.resultModel = sosConfig.parameters["GO_resultModel"]
+        self.responseMode = sosConfig.parameters["GO_responseMode"]
+
+        #get offering list
+        sql = "SELECT id_off,name_off,desc_off from %s.offerings where active_off != false ORDER BY name_off" %(sosConfig.schema)
+        rows=pgdb.select(sql)
+        for row in rows:
+            off = Offering()
+            off.id = row["name_off"]
+            off.name = sosConfig.urn["offering"] + row["name_off"]
+            off.desc = row["desc_off"]
+            off.boundedBy = BuildOffEnvelope(pgdb,row["id_off"],sosConfig)
+            timelag = BuildOffTimePeriod(pgdb,row["id_off"],sosConfig)
+            off.beginPosition = timelag[0]
+            off.endPosition = timelag[1]
+            off.procedures = BuildOffProcList(pgdb,row["id_off"],sosConfig)
+            off.obsProp = BuildOffObsPrList(pgdb,row["id_off"],sosConfig)
+            off.fois = BuildOffFoiList(pgdb,row["id_off"],sosConfig)
+            self.offerings.append(off)
+        
+
+class GetCapabilitiesResponse():
+    def __init__(self,fil,pgdb):
+        if "all" in fil.sections:
+            self.ServiceIdentifier = ServiceIdentification(fil.sosConfig)
+            self.ServiceProvider = ServiceProvider(fil.sosConfig)
+            self.OperationsMetadata = OperationsMetadata(pgdb,fil.sosConfig)
+            self.ObservationOfferingList = ObservationOfferingList(pgdb,fil.sosConfig)
+        else:
+            if "serviceidentification" in fil.sections:
+                self.ServiceIdentifier = ServiceIdentification(fil.sosConfig)
+            else:
+                self.ServiceIdentifier = []
+            if "serviceprovider" in fil.sections:
+                self.ServiceProvider = ServiceProvider(fil.sosConfig)
+            else:
+                self.ServiceProvider = []
+            if "operationsmetadata" in fil.sections:
+                self.OperationsMetadata = OperationsMetadata(pgdb,fil.sosConfig)
+            else:
+                self.OperationsMetadata = []
+            if "contents" in fil.sections:
+                self.ObservationOfferingList = ObservationOfferingList(pgdb,fil.sosConfig)
+            else:
+                self.ObservationOfferingList = []
+
+    
+    
+    
diff --git a/istsoslib/responders/GCresponse.pyc b/istsoslib/responders/GCresponse.pyc
new file mode 100644
index 0000000..ffcff78
Binary files /dev/null and b/istsoslib/responders/GCresponse.pyc differ
diff --git a/istsoslib/responders/GFresponse.py b/istsoslib/responders/GFresponse.py
new file mode 100755
index 0000000..6b0b52d
--- /dev/null
+++ b/istsoslib/responders/GFresponse.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+import psycopg2 # @TODO the right library
+import psycopg2.extras
+import os
+import sys
+
+#import sosConfig
+from istsoslib import sosDatabase
+#from SOS.config import mimetype
+from istsoslib import sosException
+#from mx import DateTime
+import mx.DateTime.ISO
+           
+class foi:
+    def __init__(self,filter,pgdb):
+        #sys.stderr.write("*****************************************************************")
+        self.name=filter.featureOfInterest
+        self.type=""
+        self.desc=""
+        self.procedures=[]
+        self.idPrc=[]
+        self.obsType=[]
+        self.samplingTime=[]
+        self.properties=[]
+        self.geom=""
+        
+        #select foi
+        sql  = "SELECT id_foi, name_foi, desc_foi, ST_AsGml(ST_Transform(geom_foi,%s)) as geom, name_fty" #%(filter.srsName)
+        sql += " FROM %s.foi, %s.feature_type" %(filter.sosConfig.schema,filter.sosConfig.schema)
+        sql += " WHERE id_fty_fk=id_fty AND name_foi=%s" #%(filter.featureOfInterest)
+        params = (filter.srsName,str(filter.featureOfInterest))
+        try:
+            foi = pgdb.select(sql,params)[0]
+        except:
+            raise sosException.SOSException("InvalidParameterValue","FeatureOfInterestId","FeatureOfInterestId: Feature of Interest '%s' not found."%(filter.featureOfInterest))
+        
+        self.name=foi["name_foi"]
+        self.desc=foi["desc_foi"]
+        self.type=foi["name_fty"]
+        self.geom=foi["geom"]
+        
+        #select procedures
+        sql  = "SELECT id_prc, name_prc, name_oty "
+        sql += "FROM %s.procedures, %s.foi, %s.obs_type " %(filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema)
+        sql += "WHERE id_foi_fk=id_foi AND id_oty=id_oty_fk AND name_foi=%s " #%(filter.featureOfInterest)
+        sql += "ORDER BY name_prc " 
+        params = (str(filter.featureOfInterest),)
+        try:
+            prc = pgdb.select(sql,params)
+        except:
+            raise Exception("GFresponse, SQL: %s"%(pgdb.mogrify(sql,params)))        
+        
+        for p in prc:
+            self.procedures.append(p["name_prc"])
+            self.obsType.append(p["name_oty"])
+            self.idPrc.append(p["id_prc"])
+            # select obesrved properties of aa given procedure
+            sql = "SELECT name_opr "
+            sql += " FROM %s.procedures, %s.proc_obs, %s.observed_properties" %(filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema)
+            sql += " WHERE id_prc=id_prc_fk AND id_opr=id_opr_fk AND name_prc=%s" #%(p["name_prc"])
+            sql += " ORDER BY name_opr" 
+            params = (p["name_prc"],)
+            try:
+                obs = pgdb.select(sql,params)
+            except:
+                raise Exception("GFresponse, SQL: %s"%(pgdb.mogrify(sql,params)))    
+            obsArr = []
+            for o in obs:
+                obsArr.append(o['name_opr'])       
+            self.properties.append(obsArr)
+            
+            sql = "SELECT MIN(time_eti) as firstet, MAX(time_eti) as lastet FROM %s.event_time " %(filter.sosConfig.schema)
+            sql += "WHERE id_prc_fk = %s GROUP BY id_prc_fk" #% (p["id_prc"])
+            params = (p["id_prc"],)
+            try:
+                samplTime = pgdb.select(sql,params)
+            except:
+                raise Exception("GFresponse, SQL: %s"%(pgdb.mogrify(sql,params)))    
+            samplTimeArr = []
+            for st in samplTime:
+                samplTimeArr.append([st['firstet'],st['lastet']])
+            self.samplingTime.append(samplTimeArr)
+            
+        
+        
+        
+        
+        
+        
+        
diff --git a/istsoslib/responders/GOresponse.py b/istsoslib/responders/GOresponse.py
new file mode 100755
index 0000000..b0311ab
--- /dev/null
+++ b/istsoslib/responders/GOresponse.py
@@ -0,0 +1,1067 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+#import psycopg2 # @TODO the right library
+#import psycopg2.extras
+import os, sys
+
+#import sosConfig
+#from istsoslib import sosDatabase
+from istsoslib import sosException
+#import mx.DateTime.ISO
+from datetime import timedelta
+import copy
+#from datetime import datetime
+from lib import isodate as iso
+from lib import pytz
+
+class VirtualProcess():
+    
+    procedures = {}
+    samplingTime = (None,None)
+    
+    def _configure(self, filterRequest, pgdb):
+        self.filter = copy.deepcopy(filterRequest)
+        self.pgdb = pgdb
+        
+    def addProcedure(self, name, observedProperty):
+        """
+        name: String
+        observedProperty: String or Array of String
+        """
+        self.procedures[name] = observedProperty
+        
+    def execute(self):
+        "This method must be overridden to implement data gathering for this virtual procedure"
+        raise Exception("function execute must be overridden")
+    
+    def calculateObservations(self, observation):
+        self.observation = observation
+        self.observation.samplingTime = self.getSampligTime()
+        self.observation.data = self.execute()
+        if self.filter.aggregate_interval != None:
+            self.applyFunction()
+    
+    def getSampligTime(self):
+        self.setSampligTime()
+        return self.samplingTime
+        
+    def setSampligTime(self):
+        """
+        This method can be overridden to set the virtual procedure sampling time
+        *************************************************************************
+        By default This method calculate the sampling time of a virtual procedure 
+        giving the procedure name from witch the data are derived 
+        as single string or array of strings.
+        
+        If derivation procedures are more than one it will return the minimum 
+        begin position and the maximum end position among all the procedures 
+        name given.
+        
+        It supports also SamplingTime calculation from cascading Virtual Procedures.
+        """
+                
+        if len(self.procedures)==0:
+            self.samplingTime = (None,None)
+        else:
+            
+            # Identify if procedures are virtual
+            
+            tmp = self.procedures.keys()
+            procedures = []
+            
+            # Handle cascading virtual procedures
+            for p in tmp:
+                
+                sql = """
+                    SELECT name_oty 
+                    FROM %s.obs_type, %s.procedures 
+                    WHERE id_oty=id_oty_fk""" % ((self.filter.sosConfig.schema,)*2)
+                sql += " AND name_prc = %s"
+                
+                result = self.pgdb.select(sql, (p,))
+                    
+                if len(result)==0:
+                    raise sosException.SOSException("InvalidParameterValue","procedure","Virtual Procedure Error: procedure %s not found in the database" % (p))
+                
+                result = result[0]
+                
+                if result[0] == 'virtual':
+                    vpFolder = os.path.join(self.filter.sosConfig.virtual_processes_folder,p)
+                    try:
+                        if vpFolder not in sys.path:
+                            sys.path.append(vpFolder)
+                    except Exception as e:
+                        raise Exception("error in loading virtual procedure path (%s):\n%s" % (vpFolder,e))
+                        
+                    # check if python file exist
+                    if os.path.isfile("%s/%s.py" % (vpFolder,p)):
+                        exec "import %s as vproc" %(p)
+                        vp = vproc.istvp()
+                        if len(vp.procedures)>0:
+                            tmp.extend(vp.procedures.keys())
+                        
+                else:
+                    procedures.append(p)
+            
+            # removing duplicates
+            procedures = list(set(procedures))
+                
+            if len(procedures)>1: 
+                sql = """ 
+                    SELECT min(stime_prc), max(etime_prc)
+                    FROM %s.procedures 
+                    WHERE (stime_prc IS NOT NULL
+                    AND etime_prc IS NOT NULL)
+                    AND (
+                """ % self.filter.sosConfig.schema
+                sql += " OR ".join(["name_prc=%s"] * len(procedures))
+                sql += ") GROUP BY stime_prc, etime_prc"
+                param = tuple(procedures)
+            else:
+                sql = """ 
+                    SELECT stime_prc, etime_prc
+                    FROM %s.procedures 
+                    WHERE (stime_prc IS NOT NULL
+                    AND etime_prc IS NOT NULL)
+                """ % self.filter.sosConfig.schema
+                sql += "AND name_prc=%s"
+                param = (procedures[0],)
+                
+            try:
+                result = self.pgdb.select(sql, param)
+                if len(result)==0:
+                    raise Exception("Virtual Procedure Error: procedure %s not found in the database" % (", ".join(param)) )
+                result = result[0]
+            except Exception as e:
+                raise Exception("Database error: %s - %s" % (sql, e))    
+                
+            self.samplingTime = (result[0],result[1])
+        
+    def getData(self, procedure=None, disableAggregation=False):
+        """
+        procedure: String
+        """
+        
+        # Validating:
+        # If procedure is None, it is supposed that only one procedure has been added
+        if procedure is None:
+            if len(self.procedures)==0:
+                raise Exception("Virtual Procedure Error: no procedures added")    
+            procedure = self.procedures.keys()[0]
+            
+        elif procedure not in self.procedures.keys():
+            raise Exception("Virtual Procedure Error: procedure %s has not been added to this virtual procedure" % procedure)    
+        
+        virtualFilter = copy.deepcopy(self.filter)
+        virtualFilter.procedure = [procedure]
+        virtualFilter.observedProperty = self.procedures[procedure]
+        
+        sql = """
+            SELECT DISTINCT id_prc, name_prc, name_oty, 
+                stime_prc, etime_prc, time_res_prc, name_tru 
+            FROM 
+                %s.procedures, 
+                %s.proc_obs p, 
+                %s.observed_properties, 
+                %s.uoms, 
+                %s.time_res_unit, 
+                %s.obs_type """ % ((self.filter.sosConfig.schema,)*6 )
+        sql += """
+                WHERE id_prc = p.id_prc_fk 
+                AND id_opr_fk = id_opr 
+                AND id_uom = id_uom_fk 
+                AND id_tru = id_tru_fk 
+                AND id_oty = id_oty_fk
+                AND name_prc=%s"""
+        
+        try:
+            result = self.pgdb.select(sql, (procedure,))
+            if len(result)==0:
+                raise Exception("Virtual Procedure Error: procedure %s not found in the database" % procedure)
+            result = result[0]
+        except Exception as e:
+            raise Exception("Database error: %s - %s" % (sql, e))    
+        
+        obs = Observation()
+        
+        obs.baseInfo(self.pgdb, result, virtualFilter.sosConfig)
+        obs.setData(self.pgdb, result, virtualFilter)
+        
+        return obs.data
+    
+    def applyFunction(self):
+        try:
+            # Create array container
+            begin = iso.parse_datetime(self.filter.eventTime[0][0])
+            end = iso.parse_datetime(self.filter.eventTime[0][1])
+            duration = iso.parse_duration(self.filter.aggregate_interval)
+            result = {}
+            dt = begin
+            fields = len(self.observation.observedProperty)# + 1 # +1 timestamp field not mentioned in the observedProperty array
+            
+            while dt < end:
+                dt2 = dt + duration
+                result[dt2]=[]
+                for c in range(fields):
+                    result[dt2].append([])
+                
+                d = 0
+                data = copy.copy(self.observation.data)
+                while len(data) > 0:
+                    tmp = data.pop(d)
+                    if dt < tmp[0] and tmp[0] <= dt2:
+                        self.observation.data.pop(d)
+                        for c in range(fields):
+                            result[dt2][c].append(float(tmp[c+1]))
+                    elif dt > tmp[0]:
+                        self.observation.data.pop(d)
+                    elif dt2 < tmp[0]:
+                        break
+                        
+                dt = dt2
+                
+            data = []
+            
+            for r in sorted(result):
+                record = [r]
+                for v in range(len(result[r])):
+                    if self.observation.observedProperty[v].split(":")[-1]=="qualityIndex":
+                        if len(result[r][v])==0:
+                            record.append(self.filter.aggregate_nodata_qi)
+                        else:
+                            record.append(int(min(result[r][v])))
+                    else:
+                        val = None
+                        if len(result[r][v])==0:
+                            val = self.filter.aggregate_nodata
+                        elif self.filter.aggregate_function.upper() == 'SUM':
+                            val = sum(result[r][v])
+                        elif self.filter.aggregate_function.upper() == 'MAX':
+                            val = max(result[r][v])
+                        elif self.filter.aggregate_function.upper() == 'MIN':
+                            val = min(result[r][v])
+                        elif self.filter.aggregate_function.upper() == 'AVG':
+                            val = round(sum(result[r][v])/len(result[r][v]),4)
+                        elif self.filter.aggregate_function.upper() == 'COUNT':
+                            val = len(result[r][v])
+                        record.append(val)
+                data.append(record)
+                    
+            self.observation.data = data
+            
+        except Exception as e:
+            raise Exception("Error while applying aggregate function on virtual procedures: %s" % (e))
+        
+
+class VirtualProcessHQ(VirtualProcess):
+    
+    def setDischargeCurves(self):
+        "method for setting h-q tranformation tables/curves"       
+        #set requested period
+        #================================================
+        hqFile = os.path.join(
+                        self.filter.sosConfig.virtual_processes_folder,
+                        self.filter.procedure[0],
+                        self.filter.procedure[0]+".rcv"
+				)
+        tp=[]
+        if self.filter.eventTime == None:
+            tp = [None,None]
+        else:
+            for t in self.filter.eventTime:
+                if len(t) == 2:
+                    if t[0].find('+')==-1:
+                        t[0] += "+00:00"
+                    if t[1].find('+')==-1:
+                        t[1] += "+00:00"    
+                    tp.append(iso.parse_datetime(t[0]))
+                    tp.append(iso.parse_datetime(t[1]))
+                if len(t)==1:
+                    if t[0].find('+')==-1:
+                        t[0] += "+00:00"
+                    tp.append(iso.parse_datetime(t[0]))
+        period = (min(tp),max(tp))
+        #get required parameters
+        #==================================================
+        try:        
+            hq_fh = open(hqFile,'r')
+        except Exception as e:
+            raise Exception("Unable to open hq rating curve file at: %s" % hqFile)
+        lines = hq_fh.readlines()
+        #read header
+        hqs = {'from':[],'to':[],'low':[],'up': [],'A':[],'B':[],'C':[],'K':[]}
+        head = lines[0].strip().split("|")
+        try:
+            fromt = head.index('from')  #from time
+            tot = head.index('to')      #to time
+            low = head.index('low_val') #if value is bigger than
+            up = head.index('up_val')   #and is lower than
+            A = head.index('A')         #use this A
+            B = head.index('B')         #use this B
+            C = head.index('C')         #use this C
+            K = head.index('K')         #use this K
+        except Exception as e:
+            raise Exception("setDischargeCurves: FILE %s ,%s error in header.\n %s" %(hqFile,head,e))
+        
+        #get equations
+        if not period[0] == None:
+            for l in range(1,len(lines)):
+                line = lines[l].split("|")
+                if iso.parse_datetime(line[1]) > period[0] or iso.parse_datetime(line[0]) <= period[1]:
+                    hqs['from'].append(iso.parse_datetime(line[fromt]))
+                    hqs['to'].append(iso.parse_datetime(line[tot]))
+                    hqs['low'].append(float(line[low]))
+                    hqs['up'].append(float(line[up]))
+                    hqs['A'].append(float(line[A]))
+                    hqs['B'].append(float(line[B]))
+                    hqs['C'].append(float(line[C]))
+                    hqs['K'].append(float(line[K]))
+        else:
+            for l in [-1,-2]:
+                try:
+                    line = lines[l].split("|")
+                    hqs['from'].append(iso.parse_datetime(line[fromt]))
+                    hqs['to'].append(iso.parse_datetime(line[tot]))
+                    hqs['low'].append(float(line[low]))
+                    hqs['up'].append(float(line[up]))
+                    hqs['A'].append(float(line[A]))
+                    hqs['B'].append(float(line[B]))
+                    hqs['C'].append(float(line[C]))
+                    hqs['K'].append(float(line[K]))
+                except:
+                    pass
+        #raise sosException.SOSException(3,"%s" %(hqs))
+        self.hqCurves = hqs
+        
+    def execute(self):
+        
+        self.setDischargeCurves()
+        data = self.getData()
+        
+        if self.filter.qualityIndex == True:
+            data_out=[]
+            for rec in data:
+                if (float(rec[1])) < -999.0:
+                    data_out.append([ rec[0], -999.9, 110 ])
+                else:
+                    for o in range(len(self.hqCurves['from'])):
+                        if (self.hqCurves['from'][o] < rec[0] <= self.hqCurves['to'][o]) and (self.hqCurves['low'][o] <= float(rec[1]) < self.hqCurves['up'][o]):
+                            if (float(rec[1])-self.hqCurves['B'][o]) >=0:
+                                data_out.append([ rec[0], "%.3f" %(self.hqCurves['K'][o] + self.hqCurves['A'][o]*((float(rec[1])-self.hqCurves['B'][o])**self.hqCurves['C'][o])), rec[2] ])
+                            else:
+                                #data not evaluable
+                                data_out.append([ rec[0], -999.9, 120 ])
+                            break
+                        if o == ( len(self.hqCurves['from']) -1):
+                            #data non in curves definition
+                            data_out.append([ rec[0], -999.9, 120 ])       
+        else:
+            data_out=[]
+            for rec in data:
+                for o in range(len(self.hqCurves['from'])):
+                    if (self.hqCurves['from'][o] < rec[0] <= self.hqCurves['to'][o]) and (self.hqCurves['low'][o] <= float(rec[1]) < self.hqCurves['up'][o]):
+                        if (float(rec[1])-self.hqCurves['B'][o]) >=0:
+                            data_out.append([ rec[0], "%.3f" %(self.hqCurves['K'][o] + self.hqCurves['A'][o]*((float(rec[1])-self.hqCurves['B'][o])**self.hqCurves['C'][o])) ])
+                        else:
+                            data_out.append([ rec[0],-999.9 ])
+                        break
+                    if o == (len(self.hqCurves['from'])-1):
+                        data_out.append([ rec[0], -999.9 ])
+                        
+        return data_out  
+        
+        
+#--this while is not
+#import TEST as Vproc        
+#----------------------------------
+
+def BuildobservedPropertyList(pgdb,offering,sosConfig):
+    list=[]
+    sql = "SELECT distinct(def_opr) as nopr FROM %s.procedures, %s.proc_obs p," %(sosConfig.schema,sosConfig.schema)
+    sql += " %s.observed_properties, %s.off_proc o, %s.offerings" %(sosConfig.schema,sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_opr_fk=id_opr AND p.id_prc_fk=id_prc AND o.id_prc_fk=id_prc AND id_off=id_off_fk"
+    sql += " AND name_off='%s' ORDER BY nopr" %(offering)
+    rows=pgdb.select(sql)
+    for row in rows:
+        list.append(row["nopr"])
+    return list
+
+def BuildfeatureOfInterestList(pgdb,offering,sosConfig):
+    list=[]
+    sql = "SELECT distinct(name_foi) as nfoi FROM %s.foi, %s.procedures " %(sosConfig.schema,sosConfig.schema)
+    sql += " , %s.off_proc, %s.offerings" %(sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_foi=id_foi_fk AND id_prc_fk=id_prc"
+    sql += " AND id_off=id_off_fk AND name_off='%s' ORDER BY nfoi"  %(offering)
+  
+    try:
+        rows=pgdb.select(sql)
+    except:
+        raise Exception("sql: %s" %(sql))
+    for row in rows:
+        list.append(row["nfoi"])
+    return list
+    
+def BuildProcedureList(pgdb,offering,sosConfig):
+    list=[]
+    sql = "SELECT name_prc FROM %s.procedures, %s.off_proc, %s.offerings"  %(sosConfig.schema,sosConfig.schema,sosConfig.schema)
+    sql += " WHERE id_prc=id_prc_fk AND id_off=id_off_fk AND name_off='%s'" %(offering)
+    sql += " ORDER BY name_prc"
+    rows=pgdb.select(sql)
+    for row in rows:
+        list.append(row["name_prc"])    
+    return list
+
+def BuildOfferingList(pgdb,sosConfig):
+    list=[]
+    sql = "SELECT distinct(name_off) FROM %s.offerings" %(sosConfig.schema,)
+    rows=pgdb.select(sql)
+    for row in rows:
+        list.append(row["name_off"])
+    return list
+
+'''
+def buildQuery(parameters):
+    """Documentation"""
+
+'''
+
+                
+'''
+filter.eventTime
+filter.aggregate_function
+filter.aggregate_interval
+filter.aggregate_nodata
+filter.aggregate_nodata_qi
+'''
+
+def applyFunction(ob, filter):
+    import copy
+    try:
+        # Create array container
+        begin = iso.parse_datetime(filter.eventTime[0][0])
+        end = iso.parse_datetime(filter.eventTime[0][1])
+        duration = iso.parse_duration(filter.aggregate_interval)
+        result = {}        
+        dt = begin
+        fields = len(ob.observedProperty)# + 1 # +1 timestamp field not mentioned in the observedProperty array
+        
+        while dt < end:
+            dt2 = dt + duration
+            result[dt2]=[]
+            for c in range(fields):
+                result[dt2].append([])
+            
+            d = 0
+            data = copy.copy(ob.data)
+            while len(data) > 0:
+                tmp = data.pop(d)
+                if dt < tmp[0] and tmp[0] <= dt2:
+                    ob.data.pop(d)
+                    for c in range(fields):
+                        result[dt2][c].append(float(tmp[c+1]))
+                elif dt > tmp[0]:
+                    ob.data.pop(d)
+                elif dt2 < tmp[0]:
+                    break
+                    
+            dt = dt2
+            
+        data = []
+        
+        for r in sorted(result):
+            record = [r]
+            for v in range(len(result[r])):
+                if ob.observedProperty[v].split(":")[-1]=="qualityIndex":
+                    if len(result[r][v])==0:
+                        record.append(filter.aggregate_nodata_qi)
+                    else:
+                        record.append(int(min(result[r][v])))
+                else:
+                    val = None
+                    if len(result[r][v])==0:
+                        val = filter.aggregate_nodata
+                    elif filter.aggregate_function.upper() == 'SUM':
+                        val = sum(result[r][v])
+                    elif filter.aggregate_function.upper() == 'MAX':
+                        val = max(result[r][v])
+                    elif filter.aggregate_function.upper() == 'MIN':
+                        val = min(result[r][v])
+                    elif filter.aggregate_function.upper() == 'AVG':
+                        val = round(sum(result[r][v])/len(result[r][v]),4)
+                    elif filter.aggregate_function.upper() == 'COUNT':
+                        val = len(result[r][v])
+                    record.append(val)
+            data.append(record)
+                
+        ob.data = data
+        
+    except Exception as e:
+        raise Exception("Error while applying aggregate function on virtual procedures: %s" % (e))
+    
+
+class offInfo:
+    def __init__(self,off_name,pgdb,sosConfig):
+        sql = "SELECT name_off, desc_off FROM %s.offerings WHERE name_off='%s'" %(sosConfig.schema,off_name)
+        try:
+            off = pgdb.select(sql)[0]
+            self.name=off["name_off"]
+            self.desc=off["desc_off"]
+        except:
+            raise sosException.SOSException("InvalidParameterValue","offering","Parameter \"offering\" sent with invalid value: %s"%(off_name))
+
+
+# @todo instantation with Builder pattern will be less confusing, observation class must be just a data container
+class Observation:
+
+    def __init__(self):
+        self.procedure=None
+        self.name = None
+        self.id_prc=None
+        self.procedureType=None
+        self.samplingTime=None
+        #self.reqTZ = None
+        self.refsys = None
+        self.timeResUnit=None
+        self.timeResVal=None
+        self.observedProperty=None
+        self.opr_urn=None
+        self.uom=None
+        self.featureOfInterest=None
+        self.foi_urn=None
+        self.foiGml = None
+        self.dataType=None
+        self.timedef = None
+        self.qualitydef = None
+        self.data=[]
+        
+    def baseInfo(self, pgdb, o, sosConfig):
+        #set base information of registered procedure
+        #=============================================
+        
+        k = o.keys()
+        if not ("id_prc" in k and "name_prc" in k and  "name_oty" in k and "stime_prc" in k and "etime_prc" in k and "time_res_prc" in k and "name_tru" in k ):
+            raise Exception("Error, baseInfo argument: %s"%(o))
+        
+        #SET PROCEDURE NAME AND ID
+        #===========================
+        self.id_prc=o["id_prc"]
+        self.name = o["name_prc"]
+        #self.procedure = sosConfig.urn["procedure"] + ":" + o["name_prc"]
+        self.procedure = sosConfig.urn["procedure"] + o["name_prc"]
+        
+        #SET PROCEDURE TYPE
+        #========================= --> ADD OTHER TYPES (IN CONFIG??)
+        if o["name_oty"].lower() in ["insitu-fixed-point","insitu-mobile-point","virtual"]:
+            self.procedureType=o["name_oty"]
+            #TO BE IMPLEMENTED FOR MORE OPTIONS
+        else:
+            raise Exception("error in procedure type setting")
+        
+        #SET TIME: RESOLUTION VALUE AND UNIT
+        #===================================
+        self.timeResVal = o["time_res_prc"]
+        self.timeResUnit = o["name_tru"]
+        
+        #SET SAMPLING TIME
+        #===================================
+        if o["stime_prc"]!=None and o["etime_prc"]!=None:
+            self.samplingTime=[o["stime_prc"],o["etime_prc"]]
+        else:
+            self.samplingTime = None
+        
+        self.dataType = sosConfig.urn["dataType"] + "timeSeries"
+        self.timedef = sosConfig.urn["parameter"] + "time:iso8601"
+        self.qualitydef = None
+        
+        
+    def setData(self,pgdb,o,filter):
+        """get data according to request filters"""
+        # @todo mettere da qualche altra parte
+	        
+        #SET FOI OF PROCEDURE
+        #=========================================
+        sqlFoi  = "SELECT name_fty, name_foi, ST_AsGml(ST_Transform(geom_foi,%s)) as gml" %(filter.srsName)
+        sqlFoi += " FROM %s.procedures, %s.foi, %s.feature_type" %(filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema)
+        sqlFoi += " WHERE id_foi_fk=id_foi AND id_fty_fk=id_fty AND id_prc=%s" %(o["id_prc"])
+        try:
+            resFoi = pgdb.select(sqlFoi)
+        except:
+            raise Exception("SQL: %s"%(sqlFoi))
+        
+        self.featureOfInterest = resFoi[0]["name_foi"]
+        self.foi_urn = filter.sosConfig.urn["feature"] + resFoi[0]["name_fty"] + ":" + resFoi[0]["name_foi"]
+        if resFoi[0]["gml"].find("srsName")<0:
+            srs = filter.srsName or filter.sosConfig.istsosepsg
+            self.foiGml = resFoi[0]["gml"][:resFoi[0]["gml"].find(">")] + " srsName=\"EPSG:%s\"" % srs + resFoi[0]["gml"][resFoi[0]["gml"].find(">"):]
+        else:
+            self.foiGml = resFoi[0]["gml"]
+        
+        #SET INFORMATION ABOUT OBSERVED_PROPERTIES
+        #=========================================       
+        sqlObsPro = "SELECT id_pro, id_opr, name_opr, def_opr, name_uom FROM %s.observed_properties, %s.proc_obs, %s.uoms" %(filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema)
+        sqlObsPro += " WHERE id_opr_fk=id_opr AND id_uom_fk=id_uom AND id_prc_fk=%s" %(o["id_prc"])
+        sqlObsPro += " AND ("
+        #sqlObsPro += " OR ".join(["def_opr='" + str(i) + "'" for i in filter.observedProperty])
+        sqlObsPro += " OR ".join(["def_opr SIMILAR TO '%(:|)" + str(i) + "(:|)%'" for i in filter.observedProperty])
+        sqlObsPro += " ) ORDER BY def_opr ASC"
+        try:
+            obspr_res = pgdb.select(sqlObsPro)
+        except:
+            raise Exception("SQL: %s"%(sqlObsPro))
+            
+        self.observedProperty = []
+        self.observedPropertyName = []
+        self.opr_urn = []
+        self.uom = []
+        self.qualityIndex = filter.qualityIndex
+        
+        for row in obspr_res:
+            self.observedProperty += [str(row["def_opr"])]
+            self.observedPropertyName +=[str(row["name_opr"])]
+            self.opr_urn += [str(row["def_opr"])]
+            try:
+                #self.uom += [str(row["name_uom"]).encode('utf-8')]
+                self.uom += [row["name_uom"]]
+            except:
+                self.uom += ["n/a"]
+            if self.qualityIndex==True:
+                self.observedProperty += [str(row["def_opr"])+":qualityIndex"]
+                self.observedPropertyName += [str(row["name_opr"])+":qualityIndex"]
+                self.opr_urn += [str(row["def_opr"] +":qualityIndex")]
+                self.uom += ["-"]
+        
+        #SET DATA
+        #=========================================getSampligTime
+        #CASE "insitu-fixed-point" or "insitu-mobile-point"
+        #-----------------------------------------
+        if self.procedureType in ["insitu-fixed-point","insitu-mobile-point"]:
+            sqlSel = "SELECT et.time_eti as t," 
+            joinar=[]
+            cols=[]
+
+            aggrCols=[]
+            aggrNotNull=[]
+
+            valeFieldName = []
+            for idx, obspr_row in enumerate(obspr_res):
+                if self.qualityIndex==True:
+                    cols.append("C%s.val_msr as c%s_v, C%s.id_qi_fk as c%s_qi" %(idx,idx,idx,idx))
+                    valeFieldName.append("c%s_v" %(idx))
+                    valeFieldName.append("c%s_qi" %(idx))
+                else:
+                    cols.append("C%s.val_msr as c%s_v" %(idx,idx))
+                    valeFieldName.append("c%s_v" %(idx))
+
+                # If Aggregatation funtion is set
+                #---------------------------------
+                if filter.aggregate_interval != None:
+                    # This can be usefull with string values
+                    '''aggrCols.append("CASE WHEN %s(dt.c%s_v) is NULL THEN '%s' ELSE '' || %s(dt.c%s_v) END as c%s_v\n" % ( 
+                        filter.aggregate_function, idx, filter.aggregate_nodata, filter.aggregate_function, idx, idx)
+                    )'''
+                    # This accept only numeric results
+                    aggrCols.append("COALESCE(%s(dt.c%s_v),'%s') as c%s_v\n" %(filter.aggregate_function,idx,filter.aggregate_nodata,idx))
+                    if self.qualityIndex==True:
+                        #raise sosException.SOSException(3,"QI: %s"%(self.qualityIndex))
+                        aggrCols.append("COALESCE(MIN(dt.c%s_qi),%s) as c%s_qi\n" %( idx, filter.aggregate_nodata_qi, idx ))
+                    aggrNotNull.append(" c%s_v > -900 " %(idx))
+                
+                # Set SQL JOINS
+                #---------------
+                join_txt  = " left join (\n"
+                join_txt += " SELECT distinct A%s.id_msr, A%s.val_msr, A%s.id_eti_fk\n" %(idx,idx,idx)
+
+                if self.qualityIndex==True:
+                    join_txt += ",A%s.id_qi_fk\n" %(idx)
+                join_txt += "   FROM %s.measures A%s, %s.event_time B%s\n" %(filter.sosConfig.schema,idx,filter.sosConfig.schema,idx)
+                join_txt += " WHERE A%s.id_eti_fk = B%s.id_eti\n" %(idx,idx)
+                join_txt += " AND A%s.id_pro_fk=%s\n" %(idx,obspr_row["id_pro"])
+                join_txt += " AND B%s.id_prc_fk=%s\n" %(idx,o["id_prc"])
+                
+                # if qualityIndex has filter
+                #------------------------------
+                #if filter.qualityIndex and filter.qualityIndex.__class__.__name__=='str':
+                #    join_txt += " AND %s\n" %(filter.qualityIndex)
+
+                # ATTETION: HERE -999 VALUES ARE EXCLUDED WHEN ASKING AN AGGREAGATE FUNCTION
+                if filter.aggregate_interval != None:
+                    join_txt += " AND A%s.val_msr > -900 " % idx
+                
+                # If eventTime is set add to JOIN part
+                #--------------------------------------
+                if filter.eventTime:
+                    join_txt += " AND ("
+                    etf=[]
+                    for ft in filter.eventTime:
+                        if len(ft)==2:
+                            etf.append("B%s.time_eti > timestamptz '%s' AND B%s.time_eti <= timestamptz '%s' \n" %(idx,ft[0],idx,ft[1]))
+                        elif len(ft)==1:
+                            etf.append("B%s.time_eti = timestamptz '%s' \n" %(idx,ft[0]))
+                        else:
+                            raise Exception("error in time filter")
+                    join_txt += " OR ".join(etf)
+                    join_txt +=  ")\n"
+                else:
+                    join_txt += " AND B%s.time_eti = (SELECT max(time_eti) FROM %s.event_time WHERE id_prc_fk=%s) \n" %(idx,filter.sosConfig.schema,o["id_prc"])
+                
+                # close SQL JOINS
+                #-----------------
+                join_txt += " ) as C%s\n" %(idx)
+                join_txt += " on C%s.id_eti_fk = et.id_eti" %(idx)
+                joinar.append(join_txt)
+            
+            
+            #If MOBILE PROCEDURE
+            #--------------------
+            if self.procedureType=="insitu-mobile-point":
+                join_txt  = " left join (\n"
+                join_txt += " SELECT distinct Ax.id_pos, X(ST_Transform(Ax.geom_pos,%s)) as x,Y(ST_Transform(Ax.geom_pos,%s)) as y,Z(ST_Transform(Ax.geom_pos,%s)) as z, Ax.id_eti_fk\n" %(filter.srsName,filter.srsName,filter.srsName)
+                if self.qualityIndex==True:
+                    join_txt += ", Ax.id_qi_fk as posqi\n"
+                join_txt += "   FROM %s.positions Ax, %s.event_time Bx\n" %(filter.sosConfig.schema,filter.sosConfig.schema)
+                join_txt += " WHERE Ax.id_eti_fk = Bx.id_eti"
+                join_txt += " AND Bx.id_prc_fk=%s" %(o["id_prc"])
+                
+                if filter.eventTime:
+                    join_txt += " AND ("
+                    etf=[]
+                    for ft in filter.eventTime:
+                        if len(ft)==2:
+                            etf.append("Bx.time_eti > timestamptz '%s' AND Bx.time_eti <= timestamptz '%s' " %(ft[0],ft[1]))
+                        elif len(ft)==1:
+                            etf.append("Bx.time_eti = timestamptz '%s' " %(ft[0]))                       
+                        else:
+                            raise Exception("error in time filter")
+                    join_txt += " OR ".join(etf)
+                    join_txt +=  ")\n"
+                else:
+                    join_txt += " AND Bx.time_eti = (SELECT max(time_eti) FROM %s.event_time WHERE id_prc_fk=%s) " %(filter.sosConfig.schema,o["id_prc"])
+                
+                join_txt += " ) as Cx on Cx.id_eti_fk = et.id_eti\n"
+                sqlSel += " Cx.x as x, Cx.y as y, Cx.z as z, "
+                if self.qualityIndex==True:
+                    sqlSel += "Cx.posqi, "
+                joinar.append(join_txt)
+            
+            
+            # Set FROM CLAUSE
+            #-----------------    
+            sqlSel += ", ".join(cols)
+            sqlSel += " FROM %s.event_time et\n" %(filter.sosConfig.schema)
+
+            #====================            
+            # Set WHERE CLAUSES
+            #====================
+            sqlData = " ".join(joinar)
+            sqlData += " WHERE et.id_prc_fk=%s\n" %(o["id_prc"]) 
+
+            # Set FILTER ON RESULT (OGC:COMPARISON) -
+            #----------------------------------------
+            if filter.result:
+                for ind, ov in enumerate(self.observedProperty):
+                    if ov.find(filter.result[0])>0:
+                        sqlData += " AND C%s.val_msr %s" %(ind,filter.result[1])
+                #sqlData += " AND C%s.val_msr %s" %(self.observedProperty.index(filter.result[0]),filter.result[1])
+                
+            # Set FILTER ON EVENT-TIME -
+            #---------------------------
+            if filter.eventTime:
+                sqlData += " AND ("
+                etf=[]
+                for ft in filter.eventTime:
+                    if len(ft)==2:
+                        etf.append("et.time_eti > timestamptz '%s' AND et.time_eti <= timestamptz '%s' " %(ft[0],ft[1]))
+                    elif len(ft)==1:
+                        etf.append("et.time_eti = timestamptz '%s' " %(ft[0]))                        
+                    else:
+                        raise Exception("error in time filter")
+                sqlData += " OR ".join(etf)
+                sqlData +=  ")"
+            else:
+                sqlData += " AND et.time_eti = (SELECT max(time_eti) FROM %s.event_time WHERE id_prc_fk=%s) " %(filter.sosConfig.schema,o["id_prc"])
+
+            sqlData += " ORDER by et.time_eti"
+
+            sql = sqlSel+sqlData
+            
+            #
+            if filter.aggregate_interval != None:
+                self.aggregate_function = filter.aggregate_function.upper()
+                '''
+                for i in range(0,len(self.observedProperty)):
+                    self.observedProperty[i] = "%s:%s" % (self.observedProperty[i], filter.aggregate_function)
+
+                for ob in self.observedProperty:
+                    ob = "%s:%s" % (ob, filter.aggregate_function)'''
+                
+                # Interval preparation
+                # Converting ISO 8601 duration
+                isoInt = iso.parse_duration(filter.aggregate_interval)
+                sqlInt = ""
+
+                if isinstance(isoInt, timedelta):
+                
+                    if isoInt.days>0:
+                        sqlInt += "%s days " % isoInt.days
+                    if isoInt.seconds>0:
+                        sqlInt += "%s seconds " % isoInt.seconds
+                        
+                elif isinstance(isoInt, iso.Duration): 
+                    if isoInt.years>0:
+                        sqlInt += "%s years " % isoInt.years
+                    if isoInt.months>0:
+                        isoInt.months = int(isoInt.months)
+                        sqlInt += "%s months " % isoInt.months
+                    if isoInt.days>0:
+                        sqlInt += "%s days " % isoInt.days
+                    if isoInt.seconds>0:
+                        sqlInt += "%s seconds " % isoInt.seconds
+
+                
+                # @todo improve this part
+                # calculate how many step are included in the asked interval.
+                hopBefore = 1
+                hop = 0
+                tmpStart = iso.parse_datetime(filter.eventTime[0][0])
+                tmpEnd = self.samplingTime[1]
+                
+                while (tmpStart+isoInt)<=tmpEnd and (tmpStart+isoInt)<=iso.parse_datetime(filter.eventTime[0][1]):
+                    
+                    if   tmpStart <  self.samplingTime[0]:
+                        hopBefore+=1
+                        hop+=1
+
+                    elif (tmpStart >= self.samplingTime[0]) and ((tmpStart+isoInt)<=self.samplingTime[1]):
+                        hop+=1
+                        
+                    tmpStart=tmpStart+isoInt
+
+                aggregationSQL = "SELECT ts.sint  as t, %s\n"
+                aggregationSQL += "FROM\n"
+                aggregationSQL += "    (\n" # Generating time series here
+                aggregationSQL += "        select\n"
+                aggregationSQL += "        (('%s'::TIMESTAMP WITH TIME ZONE)  \n"
+                aggregationSQL += "            + s.a * '%s'::interval)::TIMESTAMP WITH TIME ZONE as sint\n"
+                aggregationSQL += "        from generate_series(%s, %s) as s(a)\n"
+                aggregationSQL += "    ) as ts LEFT JOIN ( \n\n"
+                aggregationSQL += "    %s \n\n"
+                aggregationSQL += "    ) as dt\n"
+                aggregationSQL += "    ON (\n"
+                aggregationSQL += "        dt.t > (ts.sint-'%s'::interval)\n"
+                aggregationSQL += "        AND\n"
+                aggregationSQL += "        dt.t <= (ts.sint) \n"
+                aggregationSQL += "    )\n"
+                aggregationSQL += "    GROUP BY ts.sint\n"
+                aggregationSQL += "    ORDER BY ts.sint"
+                sql = aggregationSQL % (", ".join(aggrCols), filter.eventTime[0][0], sqlInt, hopBefore, hop, sql, sqlInt)
+                
+            else:
+                self.aggregate_function = None
+                
+            #--------- debug execute query --------
+            #raise sosException.SOSException(3,sql)
+            #--------------------------------------
+            
+            try:
+                data_res = pgdb.select(sql)
+            except:
+                raise Exception("SQL: %s"%(sql))
+            
+
+            #------------------------------------            
+            #--------- APPEND DATA IN ARRAY -----
+            #------------------------------------            
+            #append data
+            for line in data_res:
+                if self.procedureType=="insitu-fixed-point":
+                    data_array = [line["t"]]
+                elif self.procedureType=="insitu-mobile-point":
+                    if self.qualityIndex==True:
+                        data_array = [line["t"],line["x"],line["y"],line["z"],line["posqi"]]
+                    else:
+                        data_array = [line["t"],line["x"],line["y"],line["z"]]
+                data_array.extend([line[field] for field in valeFieldName])
+                self.data.append(data_array)
+            
+        #-----------------------------------------                
+        #CASE "virtual"
+        #-----------------------------------------       
+        elif self.procedureType in ["virtual"]:
+            
+            
+            self.aggregate_function = filter.aggregate_function
+            self.aggregate_interval = filter.aggregate_interval
+            self.aggregate_nodata = filter.aggregate_nodata
+            self.aggregate_nodata_qi = filter.aggregate_nodata_qi
+                        
+            vpFolder = os.path.join(os.path.join(filter.sosConfig.virtual_processes_folder,self.name))
+            
+            if not os.path.isfile("%s/%s.py" % (vpFolder,self.name)):
+                raise Exception("Virtual procedure folder does not contain any Virtual Procedure code for %s" % self.name)
+                
+            #----- VIRTUAL PROCESS LOADING -----
+            try:
+                sys.path.append(vpFolder)
+            except:
+                raise Exception("error in loading virtual procedure path")
+            #import procedure process
+            exec "import %s as vproc" %(self.name)
+            
+            # Initialization of virtual procedure will load the source data
+            vp = vproc.istvp()
+            vp._configure(filter, pgdb)
+            # Calculate virtual procedure data
+            vp.calculateObservations(self)
+                
+                
+class observations:
+    def __init__(self,filter,pgdb):
+        self.offInfo = offInfo(filter.offering,pgdb,filter.sosConfig)
+        self.refsys = filter.sosConfig.urn["refsystem"] + filter.srsName
+        self.filter = filter
+        
+        #CHECK FILTER VALIDITY
+        #=========================================
+        """        
+        off_list = BuildOfferingList(pgdb,filter.sosConfig)
+        if not filter.offering in off_list:
+            raise sosException.SOSException("InvalidParameterValue","offering","Parameter \"offering\" sent with invalid value: %s -  available options for offering are %s" %(filter.offering,off_list))
+        """    
+        if filter.procedure:
+            pl = BuildProcedureList(pgdb,filter.offering,filter.sosConfig)
+            for p in filter.procedure:
+                if not p in pl:
+                    raise sosException.SOSException("InvalidParameterValue","procedure","Parameter \"procedure\" sent with invalid value: %s -  available options for offering \"%s\": %s"%(p,filter.offering,pl))
+        
+        if filter.featureOfInterest:
+            fl = BuildfeatureOfInterestList(pgdb,filter.offering,filter.sosConfig)
+            if not filter.featureOfInterest in fl:
+                raise sosException.SOSException("InvalidParameterValue","featureOfInterest","Parameter \"featureOfInterest\" sent with invalid value: %s - available options: %s"%(filter.featureOfInterest,fl))
+        
+        if filter.observedProperty:
+            opl = BuildobservedPropertyList(pgdb, filter.offering,filter.sosConfig)
+            opr_sel = "SELECT def_opr FROM %s.observed_properties WHERE " %(filter.sosConfig.schema,)
+            opr_sel_w = []
+            for op in filter.observedProperty:
+                opr_sel_w += ["def_opr SIMILAR TO '%%(:|)%s(:|)%%'" %(op)]
+            opr_sel = opr_sel + " OR ".join(opr_sel_w)
+            try:
+                opr_filtered = pgdb.select(opr_sel)
+            except:
+                raise Exception("SQL: %s"%(opr_sel))
+            if not len(opr_filtered)>0:
+                raise sosException.SOSException("InvalidParameterValue","observedProperty","Parameter \"observedProperty\" sent with invalid value: %s - available options: %s"%(filter.observedProperty,opl))
+        
+        #SET TIME PERIOD
+        #=========================================
+        tp=[]
+        if filter.eventTime == None:
+            tp = [None,None]
+        else:
+            for t in filter.eventTime:
+                if len(t) == 2:
+                    tp.append(iso.parse_datetime(t[0]))
+                    tp.append(iso.parse_datetime(t[1]))
+                if len(t)==1:
+                    tp.append(iso.parse_datetime(t[0]))
+                #else: rise error ???
+        self.period = [min(tp),max(tp)]
+        
+        self.obs=[]
+        
+        # SET REQUEST TIMEZONE
+        #===================================
+        if filter.eventTime:
+            if iso.parse_datetime(filter.eventTime[0][0]).tzinfo:
+                self.reqTZ = iso.parse_datetime(filter.eventTime[0][0]).tzinfo
+                pgdb.setTimeTZ(iso.parse_datetime(filter.eventTime[0][0]))
+            else:
+                self.reqTZ = pytz.utc
+                pgdb.setTimeTZ("UTC")
+        else:
+            self.reqTZ = pytz.utc
+            pgdb.setTimeTZ("UTC")
+            
+        
+        
+        #BUILD PROCEDURES LIST
+        #=========================================
+        #---select part of query
+        sqlSel = "SELECT DISTINCT"
+        sqlSel += " id_prc, name_prc, name_oty, stime_prc, etime_prc, time_res_prc, name_tru"
+        #---from part of query
+        sqlFrom = "FROM %s.procedures, %s.proc_obs p, %s.observed_properties, %s.uoms, %s.time_res_unit," %(filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema)
+        sqlFrom += " %s.off_proc o, %s.offerings, %s.obs_type" %(filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema)
+        if filter.featureOfInterest or filter.featureOfInterestSpatial:
+            sqlFrom += " ,%s.foi, %s.feature_type" %(filter.sosConfig.schema,filter.sosConfig.schema)
+        
+        sqlWhere = "WHERE id_prc=p.id_prc_fk AND id_opr_fk=id_opr AND o.id_prc_fk=id_prc AND id_off_fk=id_off AND id_uom=id_uom_fk AND id_tru=id_tru_fk AND id_oty=id_oty_fk"
+        sqlWhere += " AND name_off='%s'" %(filter.offering) 
+        
+        #---where condition based on featureOfInterest
+        if filter.featureOfInterest:
+            #sqlWhere += " AND id_foi=id_foi_fk AND id_fty=id_fty_fk AND (name_foi='%s')" %(filter.featureOfInterest)
+            sqlWhere += " AND id_foi=id_foi_fk AND id_fty=id_fty_fk AND (name_foi IN (%s))" %(",".join( [ "'"+f+"'" for f in filter.featureOfInterest.split(",")]))
+        if filter.featureOfInterestSpatial:
+            sqlWhere += " AND id_foi_fk=id_foi AND %s" %(filter.featureOfInterestSpatial)
+        
+        #---where condition based on procedures
+        if filter.procedure:
+            sqlWhere += " AND ("
+            procWhere = []
+            for proc in filter.procedure:
+                procWhere.append("name_prc='%s'" %(proc))
+            sqlWhere += " OR ".join(procWhere)
+            sqlWhere += ")"
+        
+        #---where condition based on observed properties
+        sqlWhere += " AND ("
+        obsprWhere = []
+        for obs in opr_filtered:
+            obsprWhere.append("def_opr='%s'" %(obs["def_opr"])) 
+        sqlWhere += " OR ".join(obsprWhere)
+        sqlWhere += ")"
+        
+        try:
+            res = pgdb.select(sqlSel + " " + sqlFrom + " " + sqlWhere)
+        except:
+            raise Exception("SQL: %s"%(sqlSel + " " + sqlFrom + " " + sqlWhere))
+        
+        #FOR EACH PROCEDURE
+        #=========================================
+        for o in res:
+            #id_prc, name_prc, name_oty, stime_prc, etime_prc, time_res_prc, name_tru
+            
+            #CRETE OBSERVATION OBJECT
+            #=================================================
+            ob = Observation()
+            
+            #BUILD BASE INFOS FOR EACH PROCEDURE (Pi)
+            #=================================================
+            ob.baseInfo(pgdb,o,filter.sosConfig)
+            
+            #GET DATA FROM PROCEDURE ACCORDING TO THE FILTERS
+            #=================================================
+            ob.setData(pgdb,o,filter)
+            
+            #ADD OBSERVATIONS
+            #=================================================
+            self.obs.append(ob)
+            
+            
diff --git a/istsoslib/responders/GOresponse.pyc b/istsoslib/responders/GOresponse.pyc
new file mode 100644
index 0000000..f252114
Binary files /dev/null and b/istsoslib/responders/GOresponse.pyc differ
diff --git a/istsoslib/responders/IOresponse.py b/istsoslib/responders/IOresponse.py
new file mode 100755
index 0000000..66cd1e2
--- /dev/null
+++ b/istsoslib/responders/IOresponse.py
@@ -0,0 +1,424 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+#import psycopg2 # @TODO the right library
+#import psycopg2.extras
+#import os
+import sys, pprint #for debug only
+
+#import sosConfig
+#from istsoslib import sosDatabase
+from istsoslib import sosException
+#import mx.DateTime.ISO
+from lib import isodate as iso
+
+from datetime import datetime
+
+import json
+
+now = datetime.now()
+
+class InsertObservationResponse:
+    #self.assignedObservationId
+    def __init__(self,filter,pgdb):
+                
+        #--get procedure information
+        #============================================
+        sql  = "SELECT id_prc, name_prc, name_oty, name_foi, stime_prc, etime_prc from %s.procedures,%s.obs_type,%s.foi" %(filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema)
+        sql += " WHERE id_oty=id_oty_fk AND id_foi=id_foi_fk AND assignedid_prc=%s"
+        params = (filter.assignedSensorId,)
+        try:
+            prc = pgdb.select(sql,params)[0]
+        except:
+            raise sosException.SOSException("InvalidParameterValue","assignedSensorId","assignedSensorId '%s' is not valid!" %(filter.assignedSensorId))
+                
+        #--check requested procedure name exists
+        #=============================================
+        if not prc["name_prc"]==filter.procedure:
+            raise sosException.SOSException("NoApplicableCode",None,"procedure '%s' not associated with provided assignedSensorId!" %(filter.procedure))
+        
+        #--check requested  foi name exists
+        #=============================================
+        if not filter.foiName == prc["name_foi"]:
+            raise sosException.SOSException("NoApplicableCode",None,"featureOfInterest '%s' not associated with provided assignedSensorId" %(filter.foiName))
+        
+        #--check provided samplingTime and upadate 
+        #  begin/end time procedure if necessary  
+        # (samplingTime=period or istant of provided 
+        #  observations defined by samplingTime filter)
+        #=============================================
+        if filter.samplingTime:
+            stime = filter.samplingTime.split("/")
+            #
+            if len(stime)==2: # is a TimePeriod
+                start = iso.parse_datetime(stime[0])
+                end  = iso.parse_datetime(stime[1])
+            elif len(stime)==1: # is a TimeInstant
+                start = end = iso.parse_datetime(stime[0])
+            else:
+                raise Exception(" filter samplingTime error! given '%s'" %(filter.samplingTime))
+
+            if start>end:
+                raise Exception(" endPosition (%s) must be after beginPosition (%s)" %(end,start))
+            
+            #-- check samplingTime
+            #==========================================
+            # verify procedure begin/end exist
+            #-----------------------------------
+            if not (prc["stime_prc"].__class__.__name__ == "NoneType" and prc["etime_prc"].__class__.__name__ == "NoneType"):
+                
+                # check eventTime interval and update begin/end position when force flas is active
+                #----------------------------------------------------------------------------------
+                if filter.forceInsert:
+                    #-- verify interval limits
+                    '''if not (end>=prc["stime_prc"] and start<=prc["etime_prc"]):
+                        raise sosException.SOSException(3,"observation eventTime (%s-%s) must overlap procedure samplingTime (%s-%s)" %(start,end,prc["stime_prc"],prc["etime_prc"]))
+                    else:'''
+                    #-- update begin time of procedure
+                    if start<prc["stime_prc"]:
+                        sql  = "UPDATE %s.procedures" %(filter.sosConfig.schema)
+                        sql += " SET stime_prc=%s::TIMESTAMPTZ WHERE id_prc=%s" 
+                        params = (stime[0],prc["id_prc"])
+                        try:
+                            a = pgdb.executeInTransaction(sql,params)
+                            com=True
+                        except:
+                            raise Exception("SQL: %s" %(pgdb.mogrify(sql,params)))
+                    
+                    #-- update end time of procedure
+                    if end>prc["etime_prc"]:
+                        sql  = "UPDATE %s.procedures" %(filter.sosConfig.schema)
+                        sql += " SET etime_prc=%s::TIMESTAMPTZ WHERE id_prc=%s" 
+                        params = (stime[1],prc["id_prc"])
+                        try:
+                            b = pgdb.executeInTransaction(sql,params)
+                            com=True   
+                        except Exception as err:
+                            raise Exception("SQL: %s - %s" %(pgdb.mogrify(sql,params), err.pgerror))
+
+                # check eventTime interval and update begin/end position when force flag is off
+                #----------------------------------------------------------------------------------                            
+                else:
+                    sql  = "SELECT max(time_eti) as max_time_eti from %s.event_time" %(filter.sosConfig.schema)
+                    sql += " WHERE id_prc_fk = %s group by id_prc_fk" 
+                    params = (prc["id_prc"],)
+                    try:
+                        lastMsr = pgdb.select(sql,params)[0]["max_time_eti"]
+                    except:
+                        lastMsr = None
+                    
+                    if lastMsr!=None:
+                        #-- verify begin observation is minor/equal then end time procedure and later then last observation
+                        if not (end>=prc["etime_prc"] and start<=prc["etime_prc"] and start>=lastMsr):
+                            raise Exception("begin observation (%s) must be between last observation (%s) and end procedure (%s); end observation (%s) must be after end procedure (%s)" %(start,lastMsr,prc["etime_prc"],end,prc["etime_prc"]))
+                    else:
+                        #-- verify begin observation is minor/equal then end time procedure and later then first observation
+                        if not (end>=prc["etime_prc"] and start<=prc["etime_prc"] and start>=prc["stime_prc"]) :
+                            raise Exception("begin observation (%s) must be between start procedure (%s) and end procedure (%s); end observation (%s) must be after end procedure (%s)" %(start,prc["stime_prc"],prc["etime_prc"],end,prc["etime_prc"]))
+                        
+                    #-- update end time of procedure
+                    sql  = "UPDATE %s.procedures" %(filter.sosConfig.schema)
+                    sql += " SET etime_prc=%s::TIMESTAMPTZ WHERE id_prc=%s" 
+                    params = (str(stime[1]),int(prc["id_prc"]))
+                    try:
+                        b = pgdb.executeInTransaction(sql,params)
+                        com=True
+                    except Exception as err:
+                        raise Exception("SQL: %s - %s" %(pgdb.mogrify(sql,params), err.pgerror))
+            
+            else:
+                sql  = "UPDATE %s.procedures" %(filter.sosConfig.schema)
+                sql += " SET stime_prc=%s::TIMESTAMPTZ, etime_prc=%s::TIMESTAMPTZ WHERE id_prc=%s" 
+                params = (str(stime[0]),str(stime[1]),int(prc["id_prc"]))
+                try:
+                    b = pgdb.executeInTransaction(sql,params)
+                    com=True
+                except:
+                    raise Exception("SQL: %s" %(pgdb.mogrify(sql,params)))
+            
+        #  check data definition and uom (compare registered 
+        #  observed properties with provided observations)
+        #==================================================
+        # get values for provided data: UOM, NAME, URN, ID
+        #--------------------------------------------------
+        sql  = "SELECT id_pro, id_opr, def_opr, name_uom, constr_opr, constr_pro FROM %s.observed_properties, %s.proc_obs, %s.uoms" %(filter.sosConfig.schema,filter.sosConfig.schema,filter.sosConfig.schema)
+        sql += " WHERE id_uom_fk=id_uom AND id_opr_fk=id_opr AND id_prc_fk=%s" 
+        params = (prc["id_prc"],)
+        try:
+            opr = pgdb.select(sql,params)
+        except Exception as err:
+            raise Exception("SQL2: %s -%s" %(pgdb.mogrify(sql,params), err.pgerror))
+            
+        #---- get list of available ObservedProperty, unit of measure, property id for this procedure -----
+        oprNames=[]
+        oprUoms=[]
+        oprIds=[] #to be removed ????
+        proIds=[]
+        obsPropConstr=[]
+        procConstr=[]
+        
+        
+        # Building a matrix
+        '''
+        oprNames=       ["urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature" , ...]
+        oprUoms=        ["mm" , ...]
+        oprIds=         [id_opr , ...]
+        proIds=         [id_pro , ...]
+        obsPropConstr=  [{"interval": ["-40", "50"], "role": "urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:acceptable"} , ...]
+        procConstr=     [{"max": "100", "role": "urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable"} , ...]
+        '''
+        
+        for row in opr:
+            
+            oprNames.append(row["def_opr"])
+            oprUoms.append(row["name_uom"])
+            oprIds.append(row["id_opr"])
+            proIds.append(row["id_pro"])
+            
+            if not row["constr_opr"] in [None,'']:
+                obsPropConstr.append(json.loads(row["constr_opr"]))
+            else:
+                obsPropConstr.append(None)
+                
+            if not row["constr_pro"] in [None,'']:
+                procConstr.append(json.loads(row["constr_pro"]))
+            else:
+                procConstr.append(None)
+                
+        #---- get ordered list of observed properties in data----
+        dataKeys = [ key for key in filter.data.keys() ] 
+        
+        #----- get ordered list of unit of measures provided with data-------
+        dataUoms = []
+        for key in filter.data.keys():
+            if "uom" in filter.data[key].keys():
+                dataUoms.append(filter.data[key]["uom"])
+            else:
+                dataUoms.append('None')
+                
+        #------------------------------------------------------------------  
+        # verify that all the properties observed by this procedure
+        # are provided with the correct data definition and uom  
+        #------------------------------------------------------------------   
+        for i,opr in enumerate(oprNames):
+            try: 
+                k = dataKeys.index(opr)
+            except:
+                raise sosException.SOSException("NoApplicableCode",None,"parameter '%s' not observed by RegisteredSensor %s - %s" %(opr,oprNames,dataKeys))
+            #if not str(dataUoms[k])==str(oprUoms[i]):
+            if not dataUoms[k]==oprUoms[i]:
+                raise sosException.SOSException("NoApplicableCode",None,"parameter '%s' not observed with provided unit of measure" %(opr))
+        
+        #---------------------------------------------------------------    
+        # verify if time and coordinates are passed as data parameters
+        # and create the parameters list and parameters ID
+        #--------------------------------------------------------------  
+        xobs=None
+        yobs=None
+        zobs=None
+        tpar=None
+        pars=[] # Observed parameters
+        parsId=[]
+        parsConsObs=[]
+        parsConsPro=[]
+        
+        # urn of different parameters
+        for i, dn in enumerate(dataKeys):
+            if dn.split(":")[-1] in filter.sosConfig.parGeom["x"]:
+                xobs = dataKeys[i]
+            elif dn.split(":")[-1] in filter.sosConfig.parGeom["y"]:
+                yobs = dataKeys[i]
+            elif dn.split(":")[-1] in filter.sosConfig.parGeom["z"]:
+                zobs = dataKeys[i]
+            elif dn.find("iso8601")>=0:
+                tpar = dataKeys[i]
+            else:
+                if dn.split(":")[-1] != "qualityIndex":
+                    pars.append(dn)
+                    try:
+                        parsId.append(proIds[oprNames.index(dn)])
+                        parsConsObs.append(obsPropConstr[oprNames.index(dn)])
+                        parsConsPro.append(procConstr[oprNames.index(dn)])
+                    except:
+                        raise Exception("parameter %s not observed by this sensor %s - %s" %(dn,pars,oprNames))
+                        
+        #----------------------------------------------------------------------------------
+        # set default quality index if not provided
+        #----------------------------------------------------------------------------------
+        for par in pars:
+            try:
+                dataKeys.index(par+":qualityIndex")
+            except:
+                filter.data[par+":qualityIndex"]={"vals":[filter.sosConfig.default_qi]*len(filter.data[par]["vals"])}
+                    
+        #---------------------------------------------------------------        
+        # verify that mobile sensors provide coordinates as X,Y,Z
+        #---------------------------------------------------------------
+        if (xobs==False and yobs==False and zobs==False) and prc["name_oty"] == "insitu-mobile-point":
+            raise Exception("Mobile sensors require x,y,z parameters")
+        
+        #---------------------------------------------------------------
+        # verify that time parameter is provided
+        #---------------------------------------------------------------
+        if not tpar:
+            raise Exception("parameter 'time:iso8601' is required for InsertObservation")
+        
+        #---------------------------------------------------------------
+        # verify that eventime are in provided samplingTime
+        #---------------------------------------------------------------
+        
+        if (len(filter.data[tpar]["vals"])>0 and 
+                not iso.parse_datetime(max(filter.data[tpar]["vals"]))<= end and 
+                iso.parse_datetime(min(filter.data[tpar]["vals"]))>= start):
+            raise Exception("provided data are not included in provided <samplingTime> period")
+        
+        #======================        
+        #-- insert observation
+        #======================
+        # delete existing observations if force flag is active
+        #------------------------------------------------------
+        if filter.forceInsert:
+            sql  = "DELETE FROM %s.event_time" %(filter.sosConfig.schema)
+            sql += " WHERE id_prc_fk=%s AND time_eti>=%s::TIMESTAMPTZ AND time_eti<=%s::TIMESTAMPTZ" 
+            params = (prc["id_prc"],stime[0],stime[1])
+            try:
+                b = pgdb.executeInTransaction(sql,params)
+                com=True
+            except:
+                raise Exception("SQL: %s" %(pgdb.mogrify(sql,params)))
+        
+        #----------------------------------------
+        # CASE I: observations list is void
+        #----------------------------------------
+        if len(filter.data[tpar]["vals"])==0:
+            self.assignedId = ""
+            ids_eti = []
+        #----------------------------------------
+        # CASE I: observations list contains data
+        #----------------------------------------
+        elif len(filter.data[tpar]["vals"])>0:
+            #--------------------
+            # insert event times
+            #--------------------   
+            ids_eti = []         
+            params = []
+            sql  = "INSERT INTO %s.event_time (id_prc_fk,time_eti)" %(filter.sosConfig.schema)
+            sql += " VALUES (%s,%s::TIMESTAMPTZ) RETURNING id_eti" 
+            for val in filter.data[tpar]["vals"]:
+                try:
+                    ids_eti.append(pgdb.executeInTransaction(sql,(prc["id_prc"],val))[0]['id_eti'])
+                    com=True
+                except Exception as e:
+                    raise e
+            
+            for i, par in enumerate(pars):
+                params = []
+                ids_msr = []
+                sql = "INSERT INTO %s.measures (id_pro_fk, id_eti_fk,id_qi_fk,val_msr) VALUES" %(filter.sosConfig.schema)
+                sql += " (%s,%s,%s,%s) RETURNING id_msr"
+                #hasvalues = False
+                for ii,id_et in enumerate(ids_eti):
+                    
+                    if not filter.data[par]["vals"][ii] in ['NULL',u'NULL',None,-999,"-999",u"-999",filter.sosConfig.aggregate_nodata]:
+                        
+                        pqi = int(filter.data[par+":qualityIndex"]["vals"][ii])
+                        
+                        # Constraint quality is done only if the quality index is equal to the default qi (RAW DATA)
+                        if int(filter.sosConfig.default_qi) == pqi:
+                            
+                            # quality check level I (gross error)
+                            #------------------------------------
+                            if filter.sosConfig.correct_qi != None and parsConsObs[i] != None:
+                                
+                                if 'max' in parsConsObs[i]:
+                                    if float(filter.data[par]["vals"][ii]) <= float(parsConsObs[i]['max']):
+                                        pqi = int(filter.sosConfig.correct_qi)
+                                elif 'min' in parsConsObs[i]:
+                                    if float(filter.data[par]["vals"][ii]) >= float(parsConsObs[i]['min']):
+                                        pqi = int(filter.sosConfig.correct_qi)
+                                elif 'interval' in parsConsObs[i]:
+                                    if float(parsConsObs[i]['interval'][0]) <= float(filter.data[par]["vals"][ii]) <= float(parsConsObs[i]['interval'][1]):
+                                        pqi = int(filter.sosConfig.correct_qi)
+                                elif 'valueList' in parsConsObs[i]:
+                                    if float(filter.data[par]["vals"][ii]) in [float(p) for p in parsConsObs[i]['valueList']]:
+                                        pqi = int(filter.sosConfig.correct_qi)
+                                    
+                            # quality check level II (statistical range)
+                            #-------------------------------------------
+                            if filter.sosConfig.stat_qi != None and parsConsPro[i] != None:
+                                
+                                if 'max' in parsConsPro[i]:
+                                    if float(filter.data[par]["vals"][ii]) <= float(parsConsPro[i]['max']):
+                                        pqi = int(filter.sosConfig.stat_qi)
+                                elif 'min' in parsConsPro[i]:
+                                    if float(filter.data[par]["vals"][ii]) >= float(parsConsPro[i]['min']):
+                                        pqi = int(filter.sosConfig.stat_qi)
+                                elif 'interval' in parsConsPro[i]:
+                                    if float(parsConsPro[i]['interval'][0]) <= float(filter.data[par]["vals"][ii]) <= float(parsConsPro[i]['interval'][1]):
+                                        pqi = int(filter.sosConfig.stat_qi)
+                                elif 'valueList' in parsConsPro[i]:
+                                    if float(filter.data[par]["vals"][ii]) in [float(p) for p in parsConsPro[i]['valueList']]:
+                                        pqi = int(filter.sosConfig.stat_qi)
+                           
+                        params = (int(parsId[i]),int(id_et),pqi,float(filter.data[par]["vals"][ii]))
+                        try:
+                            nid_msr = pgdb.executeInTransaction(sql,params)
+                            ids_msr.append(str(nid_msr[0]['id_msr']))
+                        except Exception as e:
+                            com=False
+                            raise e
+                            raise Exception("L: %s - %s - %s - %s") %(int(parsId[i]),int(id_et),pqi,float(filter.data[par]["vals"][ii]))
+            
+            #-------------------------------------
+            #--insert position values if required 
+            #-------------------------------------
+            if prc["name_oty"] == "insitu-mobile-point":
+                xparspl = xobs.split(":")
+                epsg = xparspl[xparspl.index("EPSG")+1]
+                params = []
+                sql = "INSERT INTO %s.positions (id_qi_fk, id_eti_fk,geom_pos) VALUES" %(filter.sosConfig.schema)
+                sql += "(%s,%s,ST_Transform(ST_SetSRID(ST_MakePoint(%s, %s, %s), %s), %s))"
+                
+                for i,id_et in enumerate(ids_eti):
+                    params = (filter.sosConfig.default_qi,id_et,filter.data[xobs]["vals"][i],filter.data[yobs]["vals"][i],filter.data[zobs]["vals"][i],epsg,filter.sosConfig.istsosepsg)
+                    try:
+                        ids_pos = pgdb.executeInTransaction(sql,params)
+                        com=True
+                    except Exception as a:
+                        com=False
+                        raise Exception("%s\nSQL: %s" %(a,pgdb.mogrify(sql,params)))
+            
+            # register assigned IDs of measures
+            self.assignedId = "@".join([str(p) for p in ids_eti])
+            # commit executed operations                
+        
+        #Register the transactional operation in Log table 
+        if filter.sosConfig.transactional_log in ['True','true',1]:
+            sqlLog  = "INSERT INTO %s.tran_log" %(filter.sosConfig.schema)
+            sqlLog  += " (operation_trl,procedure_trl,begin_trl,end_trl,count,stime_prc,etime_prc)"
+            sqlLog  += " VALUES ('InsertObservation', %s, %s::TIMESTAMPTZ, %s::TIMESTAMPTZ, %s, %s::TIMESTAMPTZ , %s::TIMESTAMPTZ)" 
+            params = (str(filter.procedure),start,end,len(ids_eti),prc["stime_prc"],prc["etime_prc"])
+            try:
+                pgdb.executeInTransaction(sqlLog,params)
+                com=True
+            except:
+                raise Exception("SQL: %s" %(pgdb.mogrify(sqlLog,params)))
+        
+        if com==True:
+            pgdb.commitTransaction()
+            
diff --git a/istsoslib/responders/IOresponse.pyc b/istsoslib/responders/IOresponse.pyc
new file mode 100644
index 0000000..3b931c0
Binary files /dev/null and b/istsoslib/responders/IOresponse.pyc differ
diff --git a/istsoslib/responders/RSresponse.py b/istsoslib/responders/RSresponse.py
new file mode 100755
index 0000000..ba5c2d2
--- /dev/null
+++ b/istsoslib/responders/RSresponse.py
@@ -0,0 +1,386 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#import psycopg2 # @TODO the right library
+#import psycopg2.extras
+import sys, os
+
+from istsoslib import sosException
+from lib.etree import et
+
+class RegisterSensorResponse:
+    #Register sensor object
+    #self.assignedObservationId
+    def __init__(self,filter,pgdb):
+        
+        #-----------------------------
+        # transaction: insert procedure in DB
+        #-----------------------------
+        
+        #--check if proc_name exist
+        prc_name=None
+        sqlId  = "SELECT name_prc FROM %s.procedures" %(filter.sosConfig.schema)
+        sqlId += " WHERE name_prc=%s" 
+        params = (str(filter.procedure),)
+        try:
+            prc_name = pgdb.select(sqlId,params)
+        except:
+            raise Exception("SQL: %s"%(pgdb.mogrify(sqlId,params)))
+        if prc_name:
+            raise Exception("Procedure '%s' already exist, consider to change the name" %(prc_name))
+        
+        #--get id_foi or create it if it does not exist yet
+        sqlId  = "SELECT id_foi FROM %s.foi" %(filter.sosConfig.schema)
+        sqlId += " WHERE name_foi=%s" 
+        params=(str(filter.foiName),)
+        try:
+            id_foi= pgdb.select(sqlId,params)[0]["id_foi"]
+        except:
+            sqlId  = "SELECT id_fty FROM %s.feature_type" %(filter.sosConfig.schema)
+            sqlId += " WHERE name_fty=%s" 
+            params = (str(filter.foiType),)
+            try:
+                id_fty= pgdb.select(sqlId,params)[0]["id_fty"]
+            except:
+                sqlIns  = "INSERT INTO %s.feature_type (name_fty)" %(filter.sosConfig.schema)
+                sqlIns += " VALUES (%s) RETURNING id_fty" 
+                params = (str(filter.foiType),)
+                try:
+                    id_fty= pgdb.executeInTransaction(sqlIns,params)[0]["id_fty"]
+                except:
+                    raise Exception("SQL: %s"%(sqlIns))
+            
+            sqlIns  = "INSERT INTO %s.foi (name_foi,desc_foi,geom_foi,id_fty_fk)" %(filter.sosConfig.schema)
+            sqlIns += " VALUES (%s,%s,st_transform(ST_GeomFromGML(%s),%s),%s) RETURNING id_foi"   
+            params = (str(filter.foiName),str(filter.foiDesc),str(filter.foiGML.strip()),int(filter.sosConfig.istsosepsg),int(id_fty))
+            try:
+                id_foi = pgdb.executeInTransaction(sqlIns,params)[0]["id_foi"]
+                com=True
+            except:
+                raise Exception("SQL: %s"%(pgdb.mogrify(sqlIns,params)))
+        
+        #--get id_tru or create it if it does not exist yet
+        sqlId  = "SELECT id_tru FROM %s.time_res_unit" %(filter.sosConfig.schema)
+        sqlId += " WHERE name_tru=%s" 
+        params = (filter.time_res_unit,)
+        try:
+            id_tru = pgdb.select(sqlId,params)[0]["id_tru"]
+        except:
+            sqlIns  = "INSERT INTO %s.time_res_unit (name_tru)" %(filter.sosConfig.schema)
+            sqlIns += " VALUES (%s) RETURNING id_tru" 
+            params = (str(filter.time_res_unit),)
+            try:
+                id_tru = pgdb.executeInTransaction(sqlIns,params)[0]["id_tru"]
+                com=True
+            except:
+                raise Exception("SQL: %s"%(pgdb.mogrify(sqlIns,params)))
+        
+        #--get a list of observed properties id (id_opr) and check if  
+        # the fileds of the <Result> data record description
+        # are found in the components listed in the <observedProperty>
+        # or create them if they do not exist yet
+        opr_ids=[]
+        for index, par in enumerate(filter.parameters):
+            #--insitu-fixed-point (this is the default if no system type defined in XML request)
+            if filter.systemType=='insitu-fixed-point' or filter.systemType == None or filter.systemType =="virtual":
+                oty = 'virtual' if filter.systemType =="virtual" else 'insitu-fixed-point'
+                if not par.split(":")[-1]=="iso8601":
+                    if par in filter.oprDef:
+                        i = filter.oprDef.index(par)
+                        oprDef = par
+                        oprName = filter.names[i]
+                        #oprDesc = filter.oprDesc[i]
+                    else:
+                        raise Exception("Field %s not found in Components %s"%(par,filter.oprDef))
+                    sqlId  = "SELECT id_opr FROM %s.observed_properties" %(filter.sosConfig.schema)
+                    sqlId += " WHERE def_opr=%s"
+                    params = (str(oprDef),)
+                    try:
+                        id_opr = pgdb.select(sqlId,params)[0]["id_opr"]
+                        opr_ids.append(id_opr)
+                    except:
+                        sqlIns  = "INSERT INTO %s.observed_properties (name_opr,def_opr)" %(filter.sosConfig.schema)
+                        sqlIns += " VALUES (%s,%s) RETURNING id_opr"
+                        params = (str(oprName),str(oprDef))
+                        #sqlIns  = "INSERT INTO %s.observed_properties (name_opr,desc_opr,def_opr)" %(filter.sosConfig.schema)
+                        #sqlIns += " VALUES (%s,%s,%s) RETURNING id_opr" 
+                        #params = (str(oprName),str(oprDesc),str(oprDef))
+                        try:
+                            id_opr = pgdb.executeInTransaction(sqlIns,params)[0]["id_opr"]
+                            com=True
+                            opr_ids.append(id_opr)
+                        except:
+                            raise Exception("SQL: %s"%(pgdb.mogrify(sqlIns,params)))
+            #--virtual
+            
+            #--insitu-mobile-point
+            elif filter.systemType=='insitu-mobile-point':
+                oty = 'insitu-mobile-point'
+                if not (par.split(":")[-1] in filter.sosConfig.parGeom["x"] or par.split(":")[-1] in filter.sosConfig.parGeom["y"] 
+                   or par.split(":")[-1] in filter.sosConfig.parGeom["z"] or par.split(":")[-1]=="iso8601"):
+                    if par in filter.oprDef:
+                        i = filter.oprDef.index(par)
+                        oprDef = par
+                        oprName = filter.names[i]
+                        #oprDesc = filter.oprDesc[i]
+                    else:
+                        raise Exception("Field %s not found in Components %s"%(par,filter.oprDef))
+                    sqlId  = "SELECT id_opr FROM %s.observed_properties" %(filter.sosConfig.schema)
+                    sqlId += " WHERE def_opr=%s"
+                    params = (str(oprDef),)
+                    try:
+                        id_opr = pgdb.select(sqlId,params)[0]["id_opr"]
+                        opr_ids.append(id_opr)
+                    except:
+                        sqlIns  = "INSERT INTO %s.observed_properties (name_opr,def_opr)" %(filter.sosConfig.schema)
+                        sqlIns += " VALUES (%s,%s) RETURNING id_opr"
+                        params = (str(oprName),str(oprDef))
+                        try:
+                            id_opr = pgdb.executeInTransaction(sqlIns,params)[0]["id_opr"]
+                            com=True
+                            opr_ids.append(id_opr)
+                        except:
+                            raise Exception("SQL: %s"%(pgdb.mogrify(sqlIns,params)))
+            else:
+                raise Exception("Error: observation type not supported")      
+             
+        #-- get id_oty or create it if it does not exist yet
+        sqlId  = "SELECT id_oty FROM %s.obs_type" %(filter.sosConfig.schema)
+        sqlId += " WHERE name_oty=%s" 
+        params = (str(oty),)
+        try:
+            id_oty = pgdb.select(sqlId,params)[0]["id_oty"]
+        except:
+            sqlIns  = "INSERT INTO %s.obs_type (name_oty,desc_oty)" %(filter.sosConfig.schema)
+            sqlIns += " VALUES (%s,%s) RETURNING id_oty"
+            params = (str(oty),None)
+            try:
+                id_oty = pgdb.executeInTransaction(sqlIns,params)[0]["id_oty"]
+                com=True
+            except:
+                raise Exception("SQL: %s"%(sqlIns))
+        
+        #--get id_uom or create it if it does not exist yet
+        uom_ids=[]
+        #for uom in filter.uoms:
+        for i, uom in enumerate(filter.uoms):
+            par = filter.parameters[i]
+            if oty=='insitu-fixed-point' or oty=='virtual':
+                if not par.split(":")[-1]=="iso8601": 
+                    sqlId  = "SELECT id_uom FROM %s.uoms" %(filter.sosConfig.schema)
+                    sqlId += " WHERE name_uom=%s" 
+                    params = (uom,)
+                    try:
+                        id_uom = pgdb.select(sqlId,params)[0]["id_uom"]
+                        uom_ids.append(id_uom)
+                    except:
+                        sqlIns  = "INSERT INTO %s.uoms (name_uom,desc_uom)" %(filter.sosConfig.schema)
+                        sqlIns += " VALUES (%s,%s) RETURNING id_uom" 
+                        params = (uom,None)
+                        try:
+                            id_uom = pgdb.executeInTransaction(sqlIns,params)[0]["id_uom"]
+                            com=True
+                            uom_ids.append(id_uom)
+                        except:
+                            raise Exception("SQL: %s"%(pgdb.mogrify(sqlIns,params)))
+            elif oty == 'insitu-mobile-point':
+                if not (par.split(":")[-1] in filter.sosConfig.parGeom["x"] or par.split(":")[-1] in filter.sosConfig.parGeom["y"] 
+                   or par.split(":")[-1] in filter.sosConfig.parGeom["z"] or par.split(":")[-1]=="iso8601") :
+                    sqlId  = "SELECT id_uom FROM %s.uoms" %(filter.sosConfig.schema)
+                    sqlId += " WHERE name_uom=%s" 
+                    params = (uom,)
+                    try:
+                        id_uom = pgdb.select(sqlId,params)[0]["id_uom"]
+                        uom_ids.append(id_uom)
+                    except:
+                        sqlIns  = "INSERT INTO %s.uoms (name_uom,desc_uom)" %(filter.sosConfig.schema)
+                        sqlIns += " VALUES (%s,%s) RETURNING id_uom" 
+                        params = (uom,None)
+                        try:
+                            id_uom = pgdb.executeInTransaction(sqlIns,params)[0]["id_uom"]
+                            com=True
+                            uom_ids.append(id_uom)
+                        except:
+                            raise Exception("SQL: %s"%(pgdb.mogrify(sqlIns,params)))
+                
+            else:
+                raise Exception("Error: observation type not supported")
+        
+        #--get temporary id_off or create it if it does not exist yet
+        sqlId  = "SELECT id_off FROM %s.offerings WHERE" %(filter.sosConfig.schema)
+        sqlId += " name_off='temporary'"
+        try:
+            id_off = pgdb.select(sqlId)[0]["id_off"]
+        except:
+            sqlIns ="INSERT INTO %s.offerings (name_off,desc_off) VALUES" %(filter.sosConfig.schema)
+            sqlIns += " ('temporary','temporary offering to hold self-registered procedures/sensors waiting for service adimistration acceptance') RETURNING id_off"
+            try:
+                id_off = pgdb.executeInTransaction(sqlIns)[0]["id_off"]
+                com=True
+            except:
+                raise Exception("SQL: %s"%(pgdb.mogrify(sqlIns)))
+           
+        #--insert procedure
+        sqlIns  = "INSERT INTO %s.procedures (id_foi_fk, id_oty_fk, id_tru_fk, " %(filter.sosConfig.schema)
+        sqlIns  += "name_prc, desc_prc, "
+        sqlIns  += "stime_prc, etime_prc, "
+        sqlIns  += "time_res_prc, assignedid_prc)" 
+
+        #sqlIns += " VALUES (%s, %s, %s, '%s', NULL, now()::timestamptz, now()::timestamptz, %s,(select(md5(current_timestamp::text)))) RETURNING id_prc, assignedid_prc" %(id_foi,id_oty,id_tru,filter.procedure,filter.time_res_val)
+        sqlIns += " VALUES (%s, %s, %s, "
+        sqlIns += "%s, %s, "
+        params = [id_foi,id_oty,id_tru,str(filter.procedure), str(filter.proc_desc)]
+        if not filter.beginPosition=='NULL':
+            sqlIns += "%s::TIMESTAMPTZ , %s::TIMESTAMPTZ, "  
+            params.extend([str(filter.beginPosition),str(filter.beginPosition)])
+        else:
+            sqlIns += "%s , %s, "
+            params.extend([None,None])
+        sqlIns += " %s, (select(md5(current_timestamp::text))))" 
+        params.append(filter.time_res_val)
+        sqlIns += " RETURNING id_prc, assignedid_prc" 
+        params = tuple([None if x=='NULL' else x for x in params])
+        try:
+            ret_prc = pgdb.executeInTransaction(sqlIns,params)[0]
+            com=True
+        except:
+            raise Exception("SQL: %s"%(pgdb.mogrify(sqlIns,params)))
+        
+        #--link proc_obs
+        sqlIns  = "INSERT INTO %s.proc_obs (id_prc_fk, id_uom_fk, id_opr_fk, constr_pro) VALUES " % (
+            filter.sosConfig.schema
+        )
+        
+        params=[]
+        
+        print >> sys.stderr, "opr_ids: %s" % opr_ids
+        print >> sys.stderr, "ret_prc: %s" % ret_prc
+        print >> sys.stderr, "uom_ids: %s" % uom_ids
+        print >> sys.stderr, "opr_ids: %s" % opr_ids
+        print >> sys.stderr, "filter.constr: %s" % filter.constr
+        for i in range(len(opr_ids)):
+            params.append((
+                ret_prc["id_prc"],
+                uom_ids[i],
+                opr_ids[i],
+                filter.constr[i]
+            ))
+        sqlIns += ",".join(["%s"]*len(params))
+        sqlIns += " RETURNING id_pro"
+        try:
+            res = pgdb.executeInTransaction(sqlIns,params)
+            com=True
+        except:
+            raise Exception("SQL: %s" %(pgdb.mogrify(sqlIns,params)))
+        
+        #--link off_prc
+        sqlIns  = "INSERT INTO %s.off_proc (id_off_fk, id_prc_fk)" %(filter.sosConfig.schema)
+        sqlIns  += " VALUES (%s,%s) RETURNING id_off_prc" 
+        params = (id_off, ret_prc["id_prc"])
+        try:
+            res = pgdb.executeInTransaction(sqlIns,params)
+            com=True
+        except:
+            raise Exception("SQL: %s" %(pgdb.mogrify(sqlIns,params)))
+        
+        self.assignedSensorId = filter.sosConfig.urn["sensor"]+ret_prc["assignedid_prc"]
+        
+        #----------------------------------------
+        # create SensorML for inserted procedure
+        #----------------------------------------
+        
+        f = open(os.path.join(filter.sosConfig.sensorMLpath,filter.procedure + ".xml"), 'w')
+        
+        ns = {
+            'xsi': "http://www.w3.org/2001/XMLSchema-instance" ,
+            'sml': "http://www.opengis.net/sensorML/1.0.1", 
+            'swe': "http://www.opengis.net/swe/1.0.1", 
+            'xlink': "http://www.w3.org/1999/xlink", 
+            'gml': 'http://www.opengis.net/gml'            
+        }
+        
+        #---map namespaces---
+        try:
+            register_namespace = et.register_namespace
+            for key in ns:
+                register_namespace(key,ns[key])
+        except AttributeError:
+            try:
+                et._namespace_map.update(ns)
+                for key in ns:
+                    et._namespace_map[ns[key]] = key
+            except AttributeError:
+                try:
+                    from xml.etree.ElementTree import _namespace_map
+                except ImportError:
+                    try:
+                        from elementtree.ElementTree import _namespace_map
+                    except ImportError:
+                        print >> sys.stderr, ("Failed to import ElementTree from any known place")
+                for key in ns:
+                    _namespace_map[ns[key]] = key
+        
+        tree = et.ElementTree(filter.xmlSensorDescription)
+        tree.write(f, encoding="UTF-8")
+        
+        #-----------------------------------------------------------
+        # create virtual procedure folder if system type is virtual
+        #-----------------------------------------------------------
+        if oty == "virtual":
+            procedureFolder = os.path.join(filter.sosConfig.virtual_processes_folder, filter.procedure)
+            if not os.path.exists(procedureFolder):
+                os.makedirs(procedureFolder)
+        
+        
+        """
+        xml_pre = ""<SensorML xmlns:sml="http://www.opengis.net/sensorML/1.0.1"
+            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xmlns:swe="http://www.opengis.net/swe/1.0.1"
+            xmlns:gml="http://www.opengis.net/gml"
+            xmlns:xlink="http://www.w3.org/1999/xlink"
+            xmlns:dlm="http://www.ist.supsi.ch/dataloggerMD/1.0"
+            xsi:schemaLocation="http://www.opengis.net/sensorML/1.0.1 http://schemas.opengis.net/sensorML/1.0.1/sensorML.xsd"
+            version="1.0.1">
+            <member xlink:arcrole="urn:ogc:def:process:OGC:detector">""
+ 
+        #xml_ascii = filter.xmlSensorDescription.toxml().encode('ascii','ignore')
+        
+        xml_ascii = filter.xmlSensorDescription
+        
+        xml_post = "  </member>\n</SensorML>"
+        """
+        
+        #Register the transactional operation in Log table 
+        if filter.sosConfig.transactional_log in ['True','true',1]:
+            sqlLog  = "INSERT INTO %s.tran_log (operation_trl,procedure_trl)" %(filter.sosConfig.schema)
+            sqlLog  += " VALUES ('RegisterSensor',%s)" 
+            params = (str(filter.procedure),)
+            try:
+                pgdb.executeInTransaction(sqlLog,params)
+                com=True
+            except:
+                raise Exception("SQL: %s" %(pgdb.mogrify(sqlLog,params)))
+        
+        if com==True:
+            pgdb.commitTransaction()
+            
+        #f.write(xml_pre + xml_ascii + xml_post)
+        f.close()
+        
+        
+        
+        
diff --git a/istsoslib/responders/RSresponse.pyc b/istsoslib/responders/RSresponse.pyc
new file mode 100644
index 0000000..a6b6680
Binary files /dev/null and b/istsoslib/responders/RSresponse.pyc differ
diff --git a/istsoslib/responders/USDresponse.py b/istsoslib/responders/USDresponse.py
new file mode 100755
index 0000000..5b4ca02
--- /dev/null
+++ b/istsoslib/responders/USDresponse.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+import psycopg2 # @TODO the right library
+import psycopg2.extras
+import os
+
+#import sosConfig
+from istsoslib import sosDatabase
+from istsoslib import sosException
+#import mx.DateTime.ISO
+from lib import isodate as iso
+
+def get_name_from_urn(stringa,urnName,sosConfig):
+    a = stringa.split(":")
+    name = a[-1]
+    urn = sosConfig.urn[urnName].split(":")
+    if len(a)>1 and not name=="iso8601":
+        for index in range(len(urn)-1):
+            if urn[index]==a[index]:
+                pass
+            else:
+                raise Exception("Urn \"%s\" is not valid: %s."%(a,urn))
+    return name
+
+class UpdateSensorDescriptionResponse:
+    #self.assignedObservationId
+    def __init__(self,filter,pgdb):
+        
+        #check assigned sensor id
+        sql  = "SELECT id_prc, name_prc FROM %s.procedures WHERE assignedid_prc='%s'" %(filter.sosConfig.schema,get_name_from_urn(filter.assignedSensorId,"sensor",filter.sosConfig))
+        try:
+            prc = pgdb.select(sql)[0]
+        except:
+            raise sosException.SOSException("InvalidParameterValue","assignedSensorId","assignedSensorId: '%s' is not valid!" %(filter.assignedSensorId))
+    
+        #----------------------------------------
+        # create SensorML for inserted procedure
+        #----------------------------------------
+        
+        f = open(filter.sosConfig.sensorMLpath + filter.procedure + ".xml", 'w')
+        
+        xml_pre = """<SensorML xmlns:sml="http://www.opengis.net/sensorML/1.0.1"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xmlns:swe="http://www.opengis.net/swe/1.0.1"
+          xmlns:gml="http://www.opengis.net/gml"
+          xmlns:xlink="http://www.w3.org/1999/xlink"
+          xsi:schemaLocation="http://www.opengis.net/sensorML/1.0.1 http://schemas.opengis.net/sensorML/1.0.1/sensorML.xsd"
+          version="1.0.1">
+  <member xlink:arcrole="urn:ogc:def:process:OGC:detector">"""
+ 
+        xml_ascii = filter.xmlSensorDescription.toxml().encode('ascii','ignore')
+        
+        xml_post = "  </member>\n</SensorML>"
+        
+        f.write(xml_pre + xml_ascii + xml_post)
+        f.close()
+        
+        self.procedure = prc["name_prc"]
+        
+    
+    
+    
+    
+    
+    
diff --git a/istsoslib/responders/__init__.py b/istsoslib/responders/__init__.py
new file mode 100755
index 0000000..5e93bf6
--- /dev/null
+++ b/istsoslib/responders/__init__.py
@@ -0,0 +1 @@
+__all__ = ["GCresponse","DSresponse","GOresponse", "GFresponse", "IOresponse", "RSresponse", "USDresponse", "factory_response"]
diff --git a/istsoslib/responders/__init__.pyc b/istsoslib/responders/__init__.pyc
new file mode 100644
index 0000000..7af4076
Binary files /dev/null and b/istsoslib/responders/__init__.pyc differ
diff --git a/istsoslib/responders/factory_response.py b/istsoslib/responders/factory_response.py
new file mode 100755
index 0000000..9427452
--- /dev/null
+++ b/istsoslib/responders/factory_response.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+# istsos Istituto Scienze della Terra Sensor Observation Service
+# Copyright (C) 2010 Massimiliano Cannata
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+#import sosConfig
+from istsoslib import sosException
+
+def sosFactoryResponse(sosFilter,pgdb):
+    
+    if sosFilter.request == "getcapabilities":
+        from istsoslib.responders import GCresponse
+        return GCresponse.GetCapabilitiesResponse(sosFilter,pgdb)
+    
+    elif sosFilter.request == "describesensor":
+        from istsoslib.responders import DSresponse
+        return DSresponse.DescribeSensorResponse(sosFilter,pgdb)
+    
+    elif sosFilter.request == "getobservation":
+        from istsoslib.responders import GOresponse
+        return GOresponse.observations(sosFilter,pgdb)
+    
+    elif sosFilter.request == "getfeatureofinterest":
+        from istsoslib.responders import GFresponse
+        return GFresponse.foi(sosFilter,pgdb)
+    
+    elif sosFilter.request == "insertobservation":
+        from istsoslib.responders import IOresponse
+        return IOresponse.InsertObservationResponse(sosFilter,pgdb)
+    
+    elif sosFilter.request == "registersensor":
+        from istsoslib.responders import RSresponse
+        return RSresponse.RegisterSensorResponse(sosFilter,pgdb)
+    
+    elif sosFilter.request == "updatesensordescription":
+        from istsoslib.responders import USDresponse
+        return USDresponse.UpdateSensorDescription(sosFilter,pgdb)
+   
+    else:
+        raise sosException.SOSException("InvalidRequest","request","\"request\": %s not supported" %(self.request))
+
+
+    
+
diff --git a/istsoslib/responders/factory_response.pyc b/istsoslib/responders/factory_response.pyc
new file mode 100644
index 0000000..b023fe4
Binary files /dev/null and b/istsoslib/responders/factory_response.pyc differ
diff --git a/istsoslib/sosDatabase.py b/istsoslib/sosDatabase.py
new file mode 100755
index 0000000..4478a87
--- /dev/null
+++ b/istsoslib/sosDatabase.py
@@ -0,0 +1,208 @@
+# -*- coding: utf-8 -*-
+# Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import psycopg2 # @TODO the right library
+import psycopg2.extras
+import psycopg2.extensions
+psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
+psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
+
+#import pprint
+#pp = pprint.PrettyPrinter(indent=4)
+    
+
+class Database:
+    """Connect to a database"""
+    user = None
+    password = None
+    host = None
+    dbName = None
+    port = None
+    def getConnection(self):
+        """Return a database connection"""
+        return None;
+    def closeConnection(self):
+        """Close a database connection"""
+        return None
+
+class PgDB(Database):
+    """Connect to a PostgreSQL database"""
+    host=None
+    def __init__(self,user,password,dbName,host='localhost',port='5432',tz=None):
+        "Initialize PostgreSQL connection parameters"
+        self.__dns=""
+        if host: self.__dns += "host='%s' " % host
+        if port: self.__dns += "port='%d' " % int(port)
+        if dbName: self.__dns += "dbname='%s' " % dbName
+        if user: self.__dns += "user='%s' " % user
+        if password: self.__dns += "password='%s' " % password
+        self.__connect()
+    
+    def __connect(self):
+        """Connect to a PostgreSQL database"""
+        try:
+            self.__conn=psycopg2.connect(self.__dns)
+        except Exception as e:
+            emes = "%s" % e
+            if emes.find("CONNECTION ERROR: wrong password")>-1:
+                raise Exception("CONNECTION ERROR: wrong password or user")
+            elif emes.find("could not translate host")>-1:
+                raise Exception("CONNECTION ERROR: wrong host name")
+            elif emes.find("database")>-1:
+                raise Exception("CONNECTION ERROR: wrong database")
+            elif emes.find("connections on port")>-1 or emes.find("invalid literal for int()")>-1:
+                raise Exception("CONNECTION ERROR: wrong port")
+            else:
+                raise Exception("CONNECTION ERROR: %s" % e)  
+        
+    def setTimeTZ(self,tz):
+        """
+        Set the database Time Zone for this connection:
+        
+        @param tz: object that define the Time Zone
+        
+        .. note::  The input parameter can be af differents types:
+            1. A String that can be handled by postgresql (see Time Zone at http://www.postgresql.org/docs/current/static/sql-set.html)
+            2. An integer, for instance -7. The time zone 7 hours west from UTC (equivalent to PDT / -07:00). Positive values are east from UTC.
+            3. A datetime with timezone information
+        """
+        import datetime
+        offset = "UTC"
+        if type(tz) == type("") or type(tz) == type(1):
+            offset = tz
+        elif type(tz) == datetime.datetime:
+            try:
+                o = tz.utcoffset()
+                seconds = o.total_seconds()
+                offset = seconds / 3600
+            except:
+                seconds = o.seconds
+                if o.days < 0:
+                    offset = -1 * ((86400 - seconds) / 3600)
+                else:
+                    offset = seconds / 3600
+                
+        else:
+            raise Exception("Time Zone object tz Unknown")
+        
+        self.execute("SET SESSION TIME ZONE '%s';" % offset)
+    
+    def select(self,sql,par=None):
+        """ Execute a select statement"""
+        if sql.lstrip()[0:6].lower() == "select":
+            cur = self.__conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+            try:
+                cur.execute(sql,par)
+            except psycopg2.ProgrammingError as e:
+                raise e
+            try:
+                rows = cur.fetchall()
+            except:
+                rows = None
+            #self.__conn.commit()
+            cur.close()
+            return rows
+        else:
+            raise Exception("sql must be a SELECT statement")
+
+    def commitTransaction(self):
+        """Commit current transaction"""
+        try:
+            self.__conn.commit()
+        except psycopg2.ProgrammingError as e:
+            #print e.message
+            raise e
+        except Exception as e:
+            raise e
+            
+    def rollbackTransaction(self):
+        """Rollback current transaction"""
+        try:
+            self.__conn.rollback()
+        except psycopg2.ProgrammingError as e:
+            print e.message
+    
+    def executeInTransaction(self,sql,par=None):
+        """Execute an sql statement in an open session"""
+        cur = self.__conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+        try:
+            cur.execute(sql,par)
+        except psycopg2.ProgrammingError as e:
+            print e.message
+            self.__conn.rollback()
+            raise e
+        except Exception as e:
+            raise e
+        try:
+            rows = cur.fetchall()
+        except:
+            rows = None
+        cur.close()
+        return rows
+                
+    def execute(self,sql,par=None):
+        """Execute an sql statement"""
+        cur = self.__conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+        try:
+            cur.execute(sql,par)
+        except psycopg2.ProgrammingError as e:
+            raise e
+        try:
+            rows = cur.fetchall()
+        except:
+            rows = None
+        self.__conn.commit()
+        return rows
+
+    def insertMany(self,sql,dict):
+        """Insert many values at once"""
+        cur = self.__conn.cursor()
+        try:
+            cur.executemany(sql,dict)
+        except psycopg2.ProgrammingError as e:
+            raise e
+        self.__conn.commit()
+        return
+    
+    def insertManyInTransaction(self,sql,dict):
+        """Insert many values at once"""
+        cur = self.__conn.cursor()
+        try:
+            cur.executemany(sql,dict)
+        except psycopg2.ProgrammingError as e:
+            print e.message
+            self.__conn.rollback()
+            raise e
+        try:
+            rows = cur.fetchall()
+        except:
+            rows = None
+        return rows
+    
+    def mogrify(self,sql,par=None):
+        """Mogrify an sql statement (print the actual sql query that will be executed)"""
+        cur = self.__conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+        try:
+            if par:
+                a = cur.mogrify(sql,par)
+            else:
+                a = cur.mogrify(sql)
+        except psycopg2.ProgrammingError as e:
+            raise e
+        cur.close()
+        return a
+        
diff --git a/istsoslib/sosDatabase.pyc b/istsoslib/sosDatabase.pyc
new file mode 100644
index 0000000..1f9e590
Binary files /dev/null and b/istsoslib/sosDatabase.pyc differ
diff --git a/istsoslib/sosException.py b/istsoslib/sosException.py
new file mode 100755
index 0000000..dba7471
--- /dev/null
+++ b/istsoslib/sosException.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+
+
+import xml.sax.saxutils as sax
+
+class SOSException(ValueError):
+  exceptionreport = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?><ExceptionReport xmlns="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ows/1.1 ../owsExceptionReport.xsd" version="1.0.0" xml:lang="en">
+%s  
+</ExceptionReport>'''
+  exceptionLoc = ''' <Exception locator="%s" exceptionCode="%s">
+%s  
+ </Exception>'''
+  exception = ''' <Exception exceptionCode="%s">
+%s  
+ </Exception>'''
+  exceptiontext = '''  <ExceptionText>
+    %s
+  </ExceptionText>'''
+
+  def __init__(self, code, locator, msg, othermsgs = []):
+    self.code = code
+    self.locator = locator
+    self.msg = sax.escape(str(msg))
+    self.children = []
+    for msg in othermsgs:
+#        self.children.append(sax.escape(msg))
+        self.children.append(msg)
+  
+  def __str__(self):
+    return self.ToXML()
+
+  def __repr__(self):
+    return self.ToXML()
+  
+  def AddText(self, text):
+    self.children.append(text)
+
+  def ToXML(self):
+    exchildren = [self.exceptiontext % (c,) for c in self.children]
+    extextlist = [self.exceptiontext % (self.msg,)] + exchildren
+    extext = "\n".join(extextlist)
+    if not self.locator==None:
+        body = self.exceptionLoc % (self.locator,self.code, extext)
+    else:
+        body = self.exception % (self.code, extext)
+    return self.exceptionreport % (body,)
diff --git a/istsoslib/sosException.pyc b/istsoslib/sosException.pyc
new file mode 100644
index 0000000..1954163
Binary files /dev/null and b/istsoslib/sosException.pyc differ
diff --git a/istsoslib/sosUtils.py b/istsoslib/sosUtils.py
new file mode 100755
index 0000000..5c692a3
--- /dev/null
+++ b/istsoslib/sosUtils.py
@@ -0,0 +1,204 @@
+# -*- coding: utf-8 -*-
+
+from xml.dom import minidom
+from istsoslib import sosException
+
+def childElementNodes(xmlnode):
+    elements = [e for e in xmlnode.childNodes if e.nodeType == e.ELEMENT_NODE]
+    return elements
+
+def ogcSpatCons2PostgisSql(ogcSpatialOperator,geomField,epsgField):
+    """parse an ogc spatial operator element and convert it to a PostGIS SQL spatial WHERE clause"""
+    ogcSupportedSpatialOperators = {'ogc:Disjoint':'ST_Disjoint',
+                        'ogc:Equals':'ST_Equals',
+                        'ogc:Intersect':'ST_Intersects',
+                        'ogc:Touches':'ST_Touches',
+                        'ogc:Crosses':'ST_Crosses',
+                        'ogc:Within':'ST_Within',
+                        'ogc:Contains':'ST_Contains',
+                        'ogc:Overlaps':'ST_Overlaps',                        
+                    }
+                      
+    ogcSupportedDistanceBufferType = [ 'ogc:DWithin' ] 
+    ogcBBOXType = ['ogc:BBOX']
+    ogcUnsupportedSpatialOperators = ['ogc:Beyond']
+    
+    if ogcSpatialOperator.__class__.__name__ in ["str","StringField"]:
+        xmlString = """<?xml version="1.0" encoding="UTF-8"?><sos:featureOfInterest 
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+        xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+        xmlns:sos="http://www.opengis.net/sos/1.0"
+        xmlns:gml="http://www.opengis.net/gml/3.2"
+        xmlns:ogc="http://www.opengis.net/ogc"
+        xmlns:om="http://www.opengis.net/om/1.0" 
+        service="SOS" version='1.0.0'>
+        """
+        xmlString += ogcSpatialOperator + "</sos:featureOfInterest>"
+        xmlObject = minidom.parseString(xmlString)
+        foi = xmlObject.getElementsByTagName("sos:featureOfInterest")[0]
+        ogcSpatialOperator = childElementNodes(foi)[0]
+    
+    try:
+        ogcOperator = ogcSpatialOperator.nodeName.encode()
+    except:
+        raise sosException.SOSException("NoApplicableCode",None,"ogcSpatCons2PostgisSql: argunment must be an ''XML object'' or a valid ''XML string''")
+    
+    sql=''
+
+    #---------------------------
+    # PARSE OPTIONS
+    #---------------------------
+    if ogcOperator in ogcSupportedSpatialOperators.keys():
+        childs = childElementNodes(ogcSpatialOperator)
+        propertyName = childs[0].firstChild.data.encode()
+        geometry = childs[1]
+        try:
+            epsg = geometry.attributes['srsName'].value.split(":")[-1]
+        except:
+            epsg = None
+        if not epsg.isdigit() and not epsg == None:
+            raise sosException.SOSException("NoApplicableCode",None,"Error: srsName '%s' must be numeric!" %(epsg))
+        GMLgeom = str(geometry.toxml()).replace("epsg:","EPSG:")
+        if epsgField == epsg or epsg == None:
+            sql = "%s(%s,ST_GeomFromGML('%s'),%s))" %(ogcSupportedSpatialOperators[ogcOperator],geomField,GMLgeom,epsgField)
+        else:
+            sql = "%s(%s,ST_Transform(ST_Transform(ST_GeomFromGML('%s'),%s),%s))" %(ogcSupportedSpatialOperators[ogcOperator],geomField,GMLgeom,epsg,epsgField)
+        return sql
+    
+    elif ogcOperator == 'ogc:BBOX':
+        childs = childElementNodes(ogcSpatialOperator)
+        propertyName = childs[0].firstChild.data.encode()
+        geometry = childs[1]
+        try:
+            epsg = geometry.attributes['srsName'].value.split(":")[-1]
+        except:
+            epsg = None
+        if not epsg.isdigit() and not epsg == None:
+            raise sosException.SOSException("NoApplicableCode",None,"Error: srsName '%s' must be numeric!" %(epsg))            
+        
+        coords_llur=",".join(geometry.getElementsByTagName('gml:coordinates')[0].firstChild.data.split(" "))
+        ce=[ float(a) for a in coords_llur.split(",")]
+        
+        if epsgField == epsg or epsg == None:
+            sql = "%s && ST_MakeEnvelope(%s,%s,%s,%s,%s)" %(geomField,ce[0],ce[1],ce[2],ce[3],epsgField)
+        else:
+            sql = "%s && ST_Transform(ST_MakeEnvelope(%s,%s,%s,%s,%s),%s)"  %(geomField,ce[0],ce[1],ce[2],ce[3],epsg,epsgField)
+        return sql
+    
+    elif ogcOperator == 'ogc:DWithin':
+        childs = childElementNodes(ogcSpatialOperator)
+        propertyName = childs[0].firstChild.data.encode()
+        geometry = childs[1]
+        distance = childs[2].firstChild.data.encode()
+        try:
+            epsg = geometry.attributes['srsName'].value.split(":")[-1]
+        except:
+            epsg = None        
+        if not epsg.isdigit() and not epsg == None:
+            raise sosException.SOSException("NoApplicableCode",None,"Error: srsName '%s' must be numeric!" %(epsg))
+        GMLgeom = str(geometry.toxml()).replace("epsg:","EPSG:")
+        if epsgField == epsg or epsg == None:
+            sql = "ST_DWithin(%s,ST_GeomFromGML('%s'),%s)" %(geomField,GMLgeom,distance)
+        else:
+            sql = "ST_DWithin(%s,ST_Transform(ST_GeomFromGML('%s'),%s),%s)" %(geomField,GMLgeom,epsgField,distance)
+        return sql
+    
+    elif ogcOperator in ogcUnsupportedSpatialOperators:
+        raise sosException.SOSException("NoApplicableCode",None,"Spatial Operator nor supported. Available methods are: %s" %(",".join(ogcSupportedSpatialOperators.keys())))
+    
+    else:
+        raise sosException.SOSException("NoApplicableCode",None,"ogcSpatialOperator format ERROR")
+        
+
+def ogcCompCons2PostgisSql(ogcComparisonOperator):
+    """parse an ogc property operator element and convert it to a PostGIS SQL WHERE clause"""
+    ogcSupportedCompOperators = {'ogc:PropertyIsEqualTo':'=',
+                        'ogc:PropertyIsNotEqualTo':'!=',
+                        'ogc:PropertyIsLessThan':'<',
+                        'ogc:PropertyIsGreaterThan':'>',
+                        'ogc:PropertyIsLessThanOrEqualTo':'<=',
+                        'ogc:PropertyIsGreaterThanOrEqualTo':'>=',
+                    }
+    """
+    'ogc:PropertyIsBetween':'BETWEEN'
+    'ogc:PropertyIsLike':'LIKE',
+    'ogc:PropertyIsNull':'= NULL'
+    """
+    
+    if ogcComparisonOperator.__class__.__name__ in ["str","StringField"]:
+        xmlString = """<?xml version="1.0" encoding="UTF-8"?><sos:result 
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+        xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+        xmlns:sos="http://www.opengis.net/sos/1.0"
+        xmlns:gml="http://www.opengis.net/gml/3.2"
+        xmlns:ogc="http://www.opengis.net/ogc"
+        xmlns:om="http://www.opengis.net/om/1.0" 
+        service="SOS" version='1.0.0'>
+        """
+        xmlString += ogcComparisonOperator + "</sos:result>"
+        xmlObject = minidom.parseString(xmlString)
+        res = xmlObject.getElementsByTagName("sos:result")[0]
+        ogcComparisonOperator = childElementNodes(res)[0]
+    
+    try:
+        ogcOperator = ogcComparisonOperator.nodeName.encode()
+    except:
+        raise sosException.SOSException("NoApplicableCode",None,"ogcCompCons2PostgisSql: argunment must be an ''XML object'' or a valid ''XML string''")
+    
+    
+    prop = ''
+    sql=''
+
+    #---------------------------
+    # PARSE OPTIONS
+    #---------------------------
+    if ogcOperator in ogcSupportedCompOperators.keys():
+        childs = childElementNodes(ogcComparisonOperator)
+        propertyNameObj = ogcComparisonOperator.getElementsByTagName("ogc:PropertyName")
+        literalObj = ogcComparisonOperator.getElementsByTagName("ogc:Literal")
+        matchCase = True
+        if len(propertyNameObj)==1 and len(literalObj)==1:
+            #raise sosException.SOSException(1,"XML %s" %(propertyNameObj[0].data))
+            propertyName = propertyNameObj[0].firstChild.data.encode().strip()
+            """ -- unsupported because only digits are valid --
+            if propertyNameObj[0].value.upper()=="FALSE": 
+                matchCase = False
+            """
+            literal = literalObj[0].firstChild.data.encode().strip()
+            if not literal.isdigit() and not literal == None:
+                raise sosException.SOSException("NoApplicableCode",None,"Sorry istsos support only numeric constraints, provided: \'%s\'" %(literal))
+        else:
+            raise sosException.SOSException("NoApplicableCode",None,"ogcCompCons2PostgisSql: ogc:comparisonOps allow only two expression")
+        
+        return ("%s" %(propertyName),"%s %s" %(ogcSupportedCompOperators[ogcOperator],literal))
+    else:
+        raise sosException.SOSException("NoApplicableCode",None,"ogcCompCons2PostgisSql: ogc:comparisonOps not jet supported")
+        
+def CQLvalueFilter2PostgisSql(fildName,CQLfilter):
+    """parse a CQL filter and returen an SQL filter"""
+    CQLsupportedOperators = ("<","<=",">",">=","=")
+    
+    if CQLfilter.__class__.__name__ in ["str","StringField"]:
+        if CQLfilter[0] in ["<",">","="]:
+            if CQLfilter[1] in ["="]:
+                if not CQLfilter[2:].isdigit():
+                    raise sosException.SOSException("NoApplicableCode",None,"CQLvalueFilter2PostgisSql: only numeric comparison supported")
+            else:
+                if not CQLfilter[1:].isdigit():
+                    raise sosException.SOSException("NoApplicableCode",None,"CQLvalueFilter2PostgisSql: only numeric comparison supported")
+        else:
+            raise sosException.SOSException("NoApplicableCode",None,"CQLvalueFilter2PostgisSql: only filter by comparing values is supported")
+    else:
+        raise sosException.SOSException("NoApplicableCode",None,"CQLvalueFilter2PostgisSql: input must be a string")
+    return "%s %s" %(fildName,CQLfilter)
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+        
diff --git a/istsoslib/sosUtils.pyc b/istsoslib/sosUtils.pyc
new file mode 100644
index 0000000..12ad705
Binary files /dev/null and b/istsoslib/sosUtils.pyc differ
diff --git a/istsoslib/sos_version.py b/istsoslib/sos_version.py
new file mode 100755
index 0000000..5f56ddf
--- /dev/null
+++ b/istsoslib/sos_version.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+version = "2.1.1"
diff --git a/lib/__init__.py b/lib/__init__.py
new file mode 100755
index 0000000..58e61f5
--- /dev/null
+++ b/lib/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "requests","argparse","pytz","isodate","etree","apscheduler"]
diff --git a/lib/__init__.pyc b/lib/__init__.pyc
new file mode 100644
index 0000000..556bca0
Binary files /dev/null and b/lib/__init__.pyc differ
diff --git a/lib/apscheduler/__init__.py b/lib/apscheduler/__init__.py
new file mode 100755
index 0000000..d93e1b3
--- /dev/null
+++ b/lib/apscheduler/__init__.py
@@ -0,0 +1,3 @@
+version_info = (2, 1, 1)
+version = '.'.join(str(n) for n in version_info[:3])
+release = '.'.join(str(n) for n in version_info)
diff --git a/lib/apscheduler/events.py b/lib/apscheduler/events.py
new file mode 100755
index 0000000..80bde8e
--- /dev/null
+++ b/lib/apscheduler/events.py
@@ -0,0 +1,64 @@
+__all__ = ('EVENT_SCHEDULER_START', 'EVENT_SCHEDULER_SHUTDOWN',
+           'EVENT_JOBSTORE_ADDED', 'EVENT_JOBSTORE_REMOVED',
+           'EVENT_JOBSTORE_JOB_ADDED', 'EVENT_JOBSTORE_JOB_REMOVED',
+           'EVENT_JOB_EXECUTED', 'EVENT_JOB_ERROR', 'EVENT_JOB_MISSED',
+           'EVENT_ALL', 'SchedulerEvent', 'JobStoreEvent', 'JobEvent')
+
+
+EVENT_SCHEDULER_START = 1        # The scheduler was started
+EVENT_SCHEDULER_SHUTDOWN = 2     # The scheduler was shut down
+EVENT_JOBSTORE_ADDED = 4         # A job store was added to the scheduler
+EVENT_JOBSTORE_REMOVED = 8       # A job store was removed from the scheduler
+EVENT_JOBSTORE_JOB_ADDED = 16    # A job was added to a job store
+EVENT_JOBSTORE_JOB_REMOVED = 32  # A job was removed from a job store
+EVENT_JOB_EXECUTED = 64          # A job was executed successfully
+EVENT_JOB_ERROR = 128            # A job raised an exception during execution
+EVENT_JOB_MISSED = 256           # A job's execution was missed
+EVENT_ALL = (EVENT_SCHEDULER_START | EVENT_SCHEDULER_SHUTDOWN |
+             EVENT_JOBSTORE_ADDED | EVENT_JOBSTORE_REMOVED |
+             EVENT_JOBSTORE_JOB_ADDED | EVENT_JOBSTORE_JOB_REMOVED |
+             EVENT_JOB_EXECUTED | EVENT_JOB_ERROR | EVENT_JOB_MISSED)
+
+
+class SchedulerEvent(object):
+    """
+    An event that concerns the scheduler itself.
+
+    :var code: the type code of this event
+    """
+    def __init__(self, code):
+        self.code = code
+
+
+class JobStoreEvent(SchedulerEvent):
+    """
+    An event that concerns job stores.
+
+    :var alias: the alias of the job store involved
+    :var job: the new job if a job was added
+    """
+    def __init__(self, code, alias, job=None):
+        SchedulerEvent.__init__(self, code)
+        self.alias = alias
+        if job:
+            self.job = job
+
+
+class JobEvent(SchedulerEvent):
+    """
+    An event that concerns the execution of individual jobs.
+
+    :var job: the job instance in question
+    :var scheduled_run_time: the time when the job was scheduled to be run
+    :var retval: the return value of the successfully executed job
+    :var exception: the exception raised by the job
+    :var traceback: the traceback object associated with the exception
+    """
+    def __init__(self, code, job, scheduled_run_time, retval=None,
+                 exception=None, traceback=None):
+        SchedulerEvent.__init__(self, code)
+        self.job = job
+        self.scheduled_run_time = scheduled_run_time
+        self.retval = retval
+        self.exception = exception
+        self.traceback = traceback
diff --git a/lib/apscheduler/job.py b/lib/apscheduler/job.py
new file mode 100755
index 0000000..4b5fc69
--- /dev/null
+++ b/lib/apscheduler/job.py
@@ -0,0 +1,137 @@
+"""
+Jobs represent scheduled tasks.
+"""
+
+from threading import Lock
+from datetime import timedelta
+
+from lib.apscheduler.util import to_unicode, ref_to_obj, get_callable_name,\
+    obj_to_ref
+
+
+class MaxInstancesReachedError(Exception):
+    pass
+
+
+class Job(object):
+    """
+    Encapsulates the actual Job along with its metadata. Job instances
+    are created by the scheduler when adding jobs, and should not be
+    directly instantiated. These options can be set when adding jobs
+    to the scheduler (see :ref:`job_options`).
+
+    :var trigger: trigger that determines the execution times
+    :var func: callable to call when the trigger is triggered
+    :var args: list of positional arguments to call func with
+    :var kwargs: dict of keyword arguments to call func with
+    :var name: name of the job
+    :var misfire_grace_time: seconds after the designated run time that
+        the job is still allowed to be run
+    :var coalesce: run once instead of many times if the scheduler determines
+        that the job should be run more than once in succession
+    :var max_runs: maximum number of times this job is allowed to be
+        triggered
+    :var max_instances: maximum number of concurrently running
+        instances allowed for this job
+    :var runs: number of times this job has been triggered
+    :var instances: number of concurrently running instances of this job
+    """
+    id = None
+    next_run_time = None
+
+    def __init__(self, trigger, func, args, kwargs, misfire_grace_time,
+                 coalesce, name=None, max_runs=None, max_instances=1):
+        if not trigger:
+            raise ValueError('The trigger must not be None')
+        if not hasattr(func, '__call__'):
+            raise TypeError('func must be callable')
+        if not hasattr(args, '__getitem__'):
+            raise TypeError('args must be a list-like object')
+        if not hasattr(kwargs, '__getitem__'):
+            raise TypeError('kwargs must be a dict-like object')
+        if misfire_grace_time <= 0:
+            raise ValueError('misfire_grace_time must be a positive value')
+        if max_runs is not None and max_runs <= 0:
+            raise ValueError('max_runs must be a positive value')
+        if max_instances <= 0:
+            raise ValueError('max_instances must be a positive value')
+
+        self._lock = Lock()
+
+        self.trigger = trigger
+        self.func = func
+        self.args = args
+        self.kwargs = kwargs
+        self.name = to_unicode(name or get_callable_name(func))
+        self.misfire_grace_time = misfire_grace_time
+        self.coalesce = coalesce
+        self.max_runs = max_runs
+        self.max_instances = max_instances
+        self.runs = 0
+        self.instances = 0
+
+    def compute_next_run_time(self, now):
+        if self.runs == self.max_runs:
+            self.next_run_time = None
+        else:
+            self.next_run_time = self.trigger.get_next_fire_time(now)
+
+        return self.next_run_time
+
+    def get_run_times(self, now):
+        """
+        Computes the scheduled run times between ``next_run_time`` and ``now``.
+        """
+        run_times = []
+        run_time = self.next_run_time
+        increment = timedelta(microseconds=1)
+        while ((not self.max_runs or self.runs < self.max_runs) and
+               run_time and run_time <= now):
+            run_times.append(run_time)
+            run_time = self.trigger.get_next_fire_time(run_time + increment)
+
+        return run_times
+
+    def add_instance(self):
+        self._lock.acquire()
+        try:
+            if self.instances == self.max_instances:
+                raise MaxInstancesReachedError
+            self.instances += 1
+        finally:
+            self._lock.release()
+
+    def remove_instance(self):
+        self._lock.acquire()
+        try:
+            assert self.instances > 0, 'Already at 0 instances'
+            self.instances -= 1
+        finally:
+            self._lock.release()
+
+    def __getstate__(self):
+        # Prevents the unwanted pickling of transient or unpicklable variables
+        state = self.__dict__.copy()
+        state.pop('instances', None)
+        state.pop('func', None)
+        state.pop('_lock', None)
+        state['func_ref'] = obj_to_ref(self.func)
+        return state
+
+    def __setstate__(self, state):
+        state['instances'] = 0
+        state['func'] = ref_to_obj(state.pop('func_ref'))
+        state['_lock'] = Lock()
+        self.__dict__ = state
+
+    def __eq__(self, other):
+        if isinstance(other, Job):
+            return self.id is not None and other.id == self.id or self is other
+        return NotImplemented
+
+    def __repr__(self):
+        return '<Job (name=%s, trigger=%s)>' % (self.name, repr(self.trigger))
+
+    def __str__(self):
+        return '%s (trigger: %s, next run at: %s)' % (
+            self.name, str(self.trigger), str(self.next_run_time))
diff --git a/lib/apscheduler/jobstores/__init__.py b/lib/apscheduler/jobstores/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/apscheduler/jobstores/base.py b/lib/apscheduler/jobstores/base.py
new file mode 100755
index 0000000..f0a16dd
--- /dev/null
+++ b/lib/apscheduler/jobstores/base.py
@@ -0,0 +1,25 @@
+"""
+Abstract base class that provides the interface needed by all job stores.
+Job store methods are also documented here.
+"""
+
+
+class JobStore(object):
+    def add_job(self, job):
+        """Adds the given job from this store."""
+        raise NotImplementedError
+
+    def update_job(self, job):
+        """Persists the running state of the given job."""
+        raise NotImplementedError
+
+    def remove_job(self, job):
+        """Removes the given jobs from this store."""
+        raise NotImplementedError
+
+    def load_jobs(self):
+        """Loads jobs from this store into memory."""
+        raise NotImplementedError
+
+    def close(self):
+        """Frees any resources still bound to this job store."""
diff --git a/lib/apscheduler/jobstores/mongodb_store.py b/lib/apscheduler/jobstores/mongodb_store.py
new file mode 100755
index 0000000..d109386
--- /dev/null
+++ b/lib/apscheduler/jobstores/mongodb_store.py
@@ -0,0 +1,84 @@
+"""
+Stores jobs in a MongoDB database.
+"""
+import logging
+
+from lib.apscheduler.jobstores.base import JobStore
+from lib.apscheduler.job import Job
+
+try:
+    import cPickle as pickle
+except ImportError:  # pragma: nocover
+    import pickle
+
+try:
+    from bson.binary import Binary
+    from pymongo.connection import Connection
+except ImportError:  # pragma: nocover
+    raise ImportError('MongoDBJobStore requires PyMongo installed')
+
+logger = logging.getLogger(__name__)
+
+
+class MongoDBJobStore(JobStore):
+    def __init__(self, database='apscheduler', collection='jobs',
+                 connection=None, pickle_protocol=pickle.HIGHEST_PROTOCOL,
+                 **connect_args):
+        self.jobs = []
+        self.pickle_protocol = pickle_protocol
+
+        if not database:
+            raise ValueError('The "database" parameter must not be empty')
+        if not collection:
+            raise ValueError('The "collection" parameter must not be empty')
+
+        if connection:
+            self.connection = connection
+        else:
+            self.connection = Connection(**connect_args)
+
+        self.collection = self.connection[database][collection]
+
+    def add_job(self, job):
+        job_dict = job.__getstate__()
+        job_dict['trigger'] = Binary(pickle.dumps(job.trigger,
+                                                  self.pickle_protocol))
+        job_dict['args'] = Binary(pickle.dumps(job.args,
+                                               self.pickle_protocol))
+        job_dict['kwargs'] = Binary(pickle.dumps(job.kwargs,
+                                                 self.pickle_protocol))
+        job.id = self.collection.insert(job_dict)
+        self.jobs.append(job)
+
+    def remove_job(self, job):
+        self.collection.remove(job.id)
+        self.jobs.remove(job)
+
+    def load_jobs(self):
+        jobs = []
+        for job_dict in self.collection.find():
+            try:
+                job = Job.__new__(Job)
+                job_dict['id'] = job_dict.pop('_id')
+                job_dict['trigger'] = pickle.loads(job_dict['trigger'])
+                job_dict['args'] = pickle.loads(job_dict['args'])
+                job_dict['kwargs'] = pickle.loads(job_dict['kwargs'])
+                job.__setstate__(job_dict)
+                jobs.append(job)
+            except Exception:
+                job_name = job_dict.get('name', '(unknown)')
+                logger.exception('Unable to restore job "%s"', job_name)
+        self.jobs = jobs
+
+    def update_job(self, job):
+        spec = {'_id': job.id}
+        document = {'$set': {'next_run_time': job.next_run_time},
+                    '$inc': {'runs': 1}}
+        self.collection.update(spec, document)
+
+    def close(self):
+        self.connection.disconnect()
+
+    def __repr__(self):
+        connection = self.collection.database.connection
+        return '<%s (connection=%s)>' % (self.__class__.__name__, connection)
diff --git a/lib/apscheduler/jobstores/ram_store.py b/lib/apscheduler/jobstores/ram_store.py
new file mode 100755
index 0000000..ca6d567
--- /dev/null
+++ b/lib/apscheduler/jobstores/ram_store.py
@@ -0,0 +1,25 @@
+"""
+Stores jobs in an array in RAM. Provides no persistence support.
+"""
+
+from lib.apscheduler.jobstores.base import JobStore
+
+
+class RAMJobStore(JobStore):
+    def __init__(self):
+        self.jobs = []
+
+    def add_job(self, job):
+        self.jobs.append(job)
+
+    def update_job(self, job):
+        pass
+
+    def remove_job(self, job):
+        self.jobs.remove(job)
+
+    def load_jobs(self):
+        pass
+
+    def __repr__(self):
+        return '<%s>' % (self.__class__.__name__)
diff --git a/lib/apscheduler/jobstores/redis_store.py b/lib/apscheduler/jobstores/redis_store.py
new file mode 100755
index 0000000..6e91698
--- /dev/null
+++ b/lib/apscheduler/jobstores/redis_store.py
@@ -0,0 +1,91 @@
+"""
+Stores jobs in a Redis database.
+"""
+from uuid import uuid4
+from datetime import datetime
+import logging
+
+from lib.apscheduler.jobstores.base import JobStore
+from lib.apscheduler.job import Job
+
+try:
+    import cPickle as pickle
+except ImportError:  # pragma: nocover
+    import pickle
+
+try:
+    from redis import StrictRedis
+except ImportError:  # pragma: nocover
+    raise ImportError('RedisJobStore requires redis installed')
+
+try:
+    long = long
+except NameError:
+    long = int
+
+logger = logging.getLogger(__name__)
+
+
+class RedisJobStore(JobStore):
+    def __init__(self, db=0, key_prefix='jobs.',
+                 pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args):
+        self.jobs = []
+        self.pickle_protocol = pickle_protocol
+        self.key_prefix = key_prefix
+
+        if db is None:
+            raise ValueError('The "db" parameter must not be empty')
+        if not key_prefix:
+            raise ValueError('The "key_prefix" parameter must not be empty')
+
+        self.redis = StrictRedis(db=db, **connect_args)
+
+    def add_job(self, job):
+        job.id = str(uuid4())
+        job_state = job.__getstate__()
+        job_dict = {
+            'job_state': pickle.dumps(job_state, self.pickle_protocol),
+            'runs': '0',
+            'next_run_time': job_state.pop('next_run_time').isoformat()}
+        self.redis.hmset(self.key_prefix + job.id, job_dict)
+        self.jobs.append(job)
+
+    def remove_job(self, job):
+        self.redis.delete(self.key_prefix + job.id)
+        self.jobs.remove(job)
+
+    def load_jobs(self):
+        jobs = []
+        keys = self.redis.keys(self.key_prefix + '*')
+        pipeline = self.redis.pipeline()
+        for key in keys:
+            pipeline.hgetall(key)
+        results = pipeline.execute()
+
+        for job_dict in results:
+            job_state = {}
+            try:
+                job = Job.__new__(Job)
+                job_state = pickle.loads(job_dict['job_state'.encode()])
+                job_state['runs'] = long(job_dict['runs'.encode()])
+                dateval = job_dict['next_run_time'.encode()].decode()
+                job_state['next_run_time'] = datetime.strptime(
+                    dateval, '%Y-%m-%dT%H:%M:%S')
+                job.__setstate__(job_state)
+                jobs.append(job)
+            except Exception:
+                job_name = job_state.get('name', '(unknown)')
+                logger.exception('Unable to restore job "%s"', job_name)
+        self.jobs = jobs
+
+    def update_job(self, job):
+        attrs = {
+            'next_run_time': job.next_run_time.isoformat(),
+            'runs': job.runs}
+        self.redis.hmset(self.key_prefix + job.id, attrs)
+
+    def close(self):
+        self.redis.connection_pool.disconnect()
+
+    def __repr__(self):
+        return '<%s>' % self.__class__.__name__
diff --git a/lib/apscheduler/jobstores/shelve_store.py b/lib/apscheduler/jobstores/shelve_store.py
new file mode 100755
index 0000000..172d066
--- /dev/null
+++ b/lib/apscheduler/jobstores/shelve_store.py
@@ -0,0 +1,68 @@
+"""
+Stores jobs in a file governed by the :mod:`shelve` module.
+"""
+
+import shelve
+import pickle
+import random
+import logging
+
+from lib.apscheduler.jobstores.base import JobStore
+from lib.apscheduler.job import Job
+from lib.apscheduler.util import itervalues
+
+logger = logging.getLogger(__name__)
+
+
+class ShelveJobStore(JobStore):
+    MAX_ID = 1000000
+
+    def __init__(self, path, pickle_protocol=pickle.HIGHEST_PROTOCOL):
+        self.jobs = []
+        self.path = path
+        self.pickle_protocol = pickle_protocol
+        self.store = shelve.open(path, 'c', self.pickle_protocol)
+
+    def _generate_id(self):
+        id = None
+        while not id:
+            id = str(random.randint(1, self.MAX_ID))
+            if not id in self.store:
+                return id
+
+    def add_job(self, job):
+        job.id = self._generate_id()
+        self.store[job.id] = job.__getstate__()
+        self.store.sync()
+        self.jobs.append(job)
+
+    def update_job(self, job):
+        job_dict = self.store[job.id]
+        job_dict['next_run_time'] = job.next_run_time
+        job_dict['runs'] = job.runs
+        self.store[job.id] = job_dict
+        self.store.sync()
+
+    def remove_job(self, job):
+        del self.store[job.id]
+        self.store.sync()
+        self.jobs.remove(job)
+
+    def load_jobs(self):
+        jobs = []
+        for job_dict in itervalues(self.store):
+            try:
+                job = Job.__new__(Job)
+                job.__setstate__(job_dict)
+                jobs.append(job)
+            except Exception:
+                job_name = job_dict.get('name', '(unknown)')
+                logger.exception('Unable to restore job "%s"', job_name)
+
+        self.jobs = jobs
+
+    def close(self):
+        self.store.close()
+
+    def __repr__(self):
+        return '<%s (path=%s)>' % (self.__class__.__name__, self.path)
diff --git a/lib/apscheduler/jobstores/sqlalchemy_store.py b/lib/apscheduler/jobstores/sqlalchemy_store.py
new file mode 100755
index 0000000..57a5556
--- /dev/null
+++ b/lib/apscheduler/jobstores/sqlalchemy_store.py
@@ -0,0 +1,91 @@
+"""
+Stores jobs in a database table using SQLAlchemy.
+"""
+import pickle
+import logging
+
+import sqlalchemy
+
+from lib.apscheduler.jobstores.base import JobStore
+from lib.apscheduler.job import Job
+
+try:
+    from sqlalchemy import *
+except ImportError:  # pragma: nocover
+    raise ImportError('SQLAlchemyJobStore requires SQLAlchemy installed')
+
+logger = logging.getLogger(__name__)
+
+
+class SQLAlchemyJobStore(JobStore):
+    def __init__(self, url=None, engine=None, tablename='apscheduler_jobs',
+                 metadata=None, pickle_protocol=pickle.HIGHEST_PROTOCOL):
+        self.jobs = []
+        self.pickle_protocol = pickle_protocol
+
+        if engine:
+            self.engine = engine
+        elif url:
+            self.engine = create_engine(url)
+        else:
+            raise ValueError('Need either "engine" or "url" defined')
+
+        if sqlalchemy.__version__ < '0.7':
+            pickle_coltype = PickleType(pickle_protocol, mutable=False)
+        else:
+            pickle_coltype = PickleType(pickle_protocol)
+        self.jobs_t = Table(
+            tablename, metadata or MetaData(),
+            Column('id', Integer,
+                   Sequence(tablename + '_id_seq', optional=True),
+                   primary_key=True),
+            Column('trigger', pickle_coltype, nullable=False),
+            Column('func_ref', String(1024), nullable=False),
+            Column('args', pickle_coltype, nullable=False),
+            Column('kwargs', pickle_coltype, nullable=False),
+            Column('name', Unicode(1024)),
+            Column('misfire_grace_time', Integer, nullable=False),
+            Column('coalesce', Boolean, nullable=False),
+            Column('max_runs', Integer),
+            Column('max_instances', Integer),
+            Column('next_run_time', DateTime, nullable=False),
+            Column('runs', BigInteger))
+
+        self.jobs_t.create(self.engine, True)
+
+    def add_job(self, job):
+        job_dict = job.__getstate__()
+        result = self.engine.execute(self.jobs_t.insert().values(**job_dict))
+        job.id = result.inserted_primary_key[0]
+        self.jobs.append(job)
+
+    def remove_job(self, job):
+        delete = self.jobs_t.delete().where(self.jobs_t.c.id == job.id)
+        self.engine.execute(delete)
+        self.jobs.remove(job)
+
+    def load_jobs(self):
+        jobs = []
+        for row in self.engine.execute(select([self.jobs_t])):
+            try:
+                job = Job.__new__(Job)
+                job_dict = dict(row.items())
+                job.__setstate__(job_dict)
+                jobs.append(job)
+            except Exception:
+                job_name = job_dict.get('name', '(unknown)')
+                logger.exception('Unable to restore job "%s"', job_name)
+        self.jobs = jobs
+
+    def update_job(self, job):
+        job_dict = job.__getstate__()
+        update = self.jobs_t.update().where(self.jobs_t.c.id == job.id).\
+            values(next_run_time=job_dict['next_run_time'],
+                   runs=job_dict['runs'])
+        self.engine.execute(update)
+
+    def close(self):
+        self.engine.dispose()
+
+    def __repr__(self):
+        return '<%s (url=%s)>' % (self.__class__.__name__, self.engine.url)
diff --git a/lib/apscheduler/scheduler.py b/lib/apscheduler/scheduler.py
new file mode 100755
index 0000000..8cc9434
--- /dev/null
+++ b/lib/apscheduler/scheduler.py
@@ -0,0 +1,601 @@
+"""
+This module is the main part of the library. It houses the Scheduler class
+and related exceptions.
+"""
+
+from threading import Thread, Event, Lock
+from datetime import datetime, timedelta
+from logging import getLogger
+import os
+import sys
+
+from lib.apscheduler.util import *
+from lib.apscheduler.triggers import SimpleTrigger, IntervalTrigger, CronTrigger
+from lib.apscheduler.jobstores.ram_store import RAMJobStore
+from lib.apscheduler.job import Job, MaxInstancesReachedError
+from lib.apscheduler.events import *
+from lib.apscheduler.threadpool import ThreadPool
+
+logger = getLogger(__name__)
+
+
+class SchedulerAlreadyRunningError(Exception):
+    """
+    Raised when attempting to start or configure the scheduler when it's
+    already running.
+    """
+
+    def __str__(self):
+        return 'Scheduler is already running'
+
+
+class Scheduler(object):
+    """
+    This class is responsible for scheduling jobs and triggering
+    their execution.
+    """
+
+    _stopped = True
+    _thread = None
+
+    def __init__(self, gconfig={}, **options):
+        self._wakeup = Event()
+        self._jobstores = {}
+        self._jobstores_lock = Lock()
+        self._listeners = []
+        self._listeners_lock = Lock()
+        self._pending_jobs = []
+        self.configure(gconfig, **options)
+
+    def configure(self, gconfig={}, **options):
+        """
+        Reconfigures the scheduler with the given options. Can only be done
+        when the scheduler isn't running.
+        """
+        if self.running:
+            raise SchedulerAlreadyRunningError
+
+        # Set general options
+        config = combine_opts(gconfig, 'apscheduler.', options)
+        self.misfire_grace_time = int(config.pop('misfire_grace_time', 1))
+        self.coalesce = asbool(config.pop('coalesce', True))
+        self.daemonic = asbool(config.pop('daemonic', True))
+        self.standalone = asbool(config.pop('standalone', False))
+
+        # Configure the thread pool
+        if 'threadpool' in config:
+            self._threadpool = maybe_ref(config['threadpool'])
+        else:
+            threadpool_opts = combine_opts(config, 'threadpool.')
+            self._threadpool = ThreadPool(**threadpool_opts)
+
+        # Configure job stores
+        jobstore_opts = combine_opts(config, 'jobstore.')
+        jobstores = {}
+        for key, value in jobstore_opts.items():
+            store_name, option = key.split('.', 1)
+            opts_dict = jobstores.setdefault(store_name, {})
+            opts_dict[option] = value
+
+        for alias, opts in jobstores.items():
+            classname = opts.pop('class')
+            cls = maybe_ref(classname)
+            jobstore = cls(**opts)
+            self.add_jobstore(jobstore, alias, True)
+
+    def start(self):
+        """
+        Starts the scheduler in a new thread.
+
+        In threaded mode (the default), this method will return immediately
+        after starting the scheduler thread.
+
+        In standalone mode, this method will block until there are no more
+        scheduled jobs.
+        """
+        if self.running:
+            raise SchedulerAlreadyRunningError
+
+        # Create a RAMJobStore as the default if there is no default job store
+        if not 'default' in self._jobstores:
+            self.add_jobstore(RAMJobStore(), 'default', True)
+
+        # Schedule all pending jobs
+        for job, jobstore in self._pending_jobs:
+            self._real_add_job(job, jobstore, False)
+        del self._pending_jobs[:]
+
+        self._stopped = False
+        if self.standalone:
+            self._main_loop()
+        else:
+            self._thread = Thread(target=self._main_loop, name='APScheduler')
+            self._thread.setDaemon(self.daemonic)
+            self._thread.start()
+
+    def shutdown(self, wait=True, shutdown_threadpool=True,
+                 close_jobstores=True):
+        """
+        Shuts down the scheduler and terminates the thread.
+        Does not interrupt any currently running jobs.
+
+        :param wait: ``True`` to wait until all currently executing jobs have
+                     finished (if ``shutdown_threadpool`` is also ``True``)
+        :param shutdown_threadpool: ``True`` to shut down the thread pool
+        :param close_jobstores: ``True`` to close all job stores after shutdown
+        """
+        if not self.running:
+            return
+
+        self._stopped = True
+        self._wakeup.set()
+
+        # Shut down the thread pool
+        if shutdown_threadpool:
+            self._threadpool.shutdown(wait)
+
+        # Wait until the scheduler thread terminates
+        if self._thread:
+            self._thread.join()
+
+        # Close all job stores
+        if close_jobstores:
+            for jobstore in itervalues(self._jobstores):
+                jobstore.close()
+
+    @property
+    def running(self):
+        thread_alive = self._thread and self._thread.isAlive()
+        standalone = getattr(self, 'standalone', False)
+        return not self._stopped and (standalone or thread_alive)
+
+    def add_jobstore(self, jobstore, alias, quiet=False):
+        """
+        Adds a job store to this scheduler.
+
+        :param jobstore: job store to be added
+        :param alias: alias for the job store
+        :param quiet: True to suppress scheduler thread wakeup
+        :type jobstore: instance of
+            :class:`~apscheduler.jobstores.base.JobStore`
+        :type alias: str
+        """
+        self._jobstores_lock.acquire()
+        try:
+            if alias in self._jobstores:
+                raise KeyError('Alias "%s" is already in use' % alias)
+            self._jobstores[alias] = jobstore
+            jobstore.load_jobs()
+        finally:
+            self._jobstores_lock.release()
+
+        # Notify listeners that a new job store has been added
+        self._notify_listeners(JobStoreEvent(EVENT_JOBSTORE_ADDED, alias))
+
+        # Notify the scheduler so it can scan the new job store for jobs
+        if not quiet:
+            self._wakeup.set()
+
+    def remove_jobstore(self, alias, close=True):
+        """
+        Removes the job store by the given alias from this scheduler.
+
+        :param close: ``True`` to close the job store after removing it
+        :type alias: str
+        """
+        self._jobstores_lock.acquire()
+        try:
+            jobstore = self._jobstores.pop(alias)
+            if not jobstore:
+                raise KeyError('No such job store: %s' % alias)
+        finally:
+            self._jobstores_lock.release()
+
+        # Close the job store if requested
+        if close:
+            jobstore.close()
+
+        # Notify listeners that a job store has been removed
+        self._notify_listeners(JobStoreEvent(EVENT_JOBSTORE_REMOVED, alias))
+
+    def add_listener(self, callback, mask=EVENT_ALL):
+        """
+        Adds a listener for scheduler events. When a matching event occurs,
+        ``callback`` is executed with the event object as its sole argument.
+        If the ``mask`` parameter is not provided, the callback will receive
+        events of all types.
+
+        :param callback: any callable that takes one argument
+        :param mask: bitmask that indicates which events should be listened to
+        """
+        self._listeners_lock.acquire()
+        try:
+            self._listeners.append((callback, mask))
+        finally:
+            self._listeners_lock.release()
+
+    def remove_listener(self, callback):
+        """
+        Removes a previously added event listener.
+        """
+        self._listeners_lock.acquire()
+        try:
+            for i, (cb, _) in enumerate(self._listeners):
+                if callback == cb:
+                    del self._listeners[i]
+        finally:
+            self._listeners_lock.release()
+
+    def _notify_listeners(self, event):
+        self._listeners_lock.acquire()
+        try:
+            listeners = tuple(self._listeners)
+        finally:
+            self._listeners_lock.release()
+
+        for cb, mask in listeners:
+            if event.code & mask:
+                try:
+                    cb(event)
+                except:
+                    logger.exception('Error notifying listener')
+
+    def _real_add_job(self, job, jobstore, wakeup):
+        job.compute_next_run_time(datetime.now())
+        if not job.next_run_time:
+            raise ValueError('Not adding job since it would never be run')
+
+        self._jobstores_lock.acquire()
+        try:
+            try:
+                store = self._jobstores[jobstore]
+            except KeyError:
+                raise KeyError('No such job store: %s' % jobstore)
+            store.add_job(job)
+        finally:
+            self._jobstores_lock.release()
+
+        # Notify listeners that a new job has been added
+        event = JobStoreEvent(EVENT_JOBSTORE_JOB_ADDED, jobstore, job)
+        self._notify_listeners(event)
+
+        logger.info('Added job "%s" to job store "%s"', job, jobstore)
+
+        # Notify the scheduler about the new job
+        if wakeup:
+            self._wakeup.set()
+
+    def add_job(self, trigger, func, args, kwargs, jobstore='default',
+                **options):
+        """
+        Adds the given job to the job list and notifies the scheduler thread.
+        Any extra keyword arguments are passed along to the constructor of the
+        :class:`~apscheduler.job.Job` class (see :ref:`job_options`).
+
+        :param trigger: trigger that determines when ``func`` is called
+        :param func: callable to run at the given time
+        :param args: list of positional arguments to call func with
+        :param kwargs: dict of keyword arguments to call func with
+        :param jobstore: alias of the job store to store the job in
+        :rtype: :class:`~apscheduler.job.Job`
+        """
+        job = Job(trigger, func, args or [], kwargs or {},
+                  options.pop('misfire_grace_time', self.misfire_grace_time),
+                  options.pop('coalesce', self.coalesce), **options)
+        if not self.running:
+            self._pending_jobs.append((job, jobstore))
+            logger.info('Adding job tentatively -- it will be properly '
+                        'scheduled when the scheduler starts')
+        else:
+            self._real_add_job(job, jobstore, True)
+        return job
+
+    def _remove_job(self, job, alias, jobstore):
+        jobstore.remove_job(job)
+
+        # Notify listeners that a job has been removed
+        event = JobStoreEvent(EVENT_JOBSTORE_JOB_REMOVED, alias, job)
+        self._notify_listeners(event)
+
+        logger.info('Removed job "%s"', job)
+
+    def add_date_job(self, func, date, args=None, kwargs=None, **options):
+        """
+        Schedules a job to be completed on a specific date and time.
+        Any extra keyword arguments are passed along to the constructor of the
+        :class:`~apscheduler.job.Job` class (see :ref:`job_options`).
+
+        :param func: callable to run at the given time
+        :param date: the date/time to run the job at
+        :param name: name of the job
+        :param jobstore: stored the job in the named (or given) job store
+        :param misfire_grace_time: seconds after the designated run time that
+            the job is still allowed to be run
+        :type date: :class:`datetime.date`
+        :rtype: :class:`~apscheduler.job.Job`
+        """
+        trigger = SimpleTrigger(date)
+        return self.add_job(trigger, func, args, kwargs, **options)
+
+    def add_interval_job(self, func, weeks=0, days=0, hours=0, minutes=0,
+                         seconds=0, start_date=None, args=None, kwargs=None,
+                         **options):
+        """
+        Schedules a job to be completed on specified intervals.
+        Any extra keyword arguments are passed along to the constructor of the
+        :class:`~apscheduler.job.Job` class (see :ref:`job_options`).
+
+        :param func: callable to run
+        :param weeks: number of weeks to wait
+        :param days: number of days to wait
+        :param hours: number of hours to wait
+        :param minutes: number of minutes to wait
+        :param seconds: number of seconds to wait
+        :param start_date: when to first execute the job and start the
+            counter (default is after the given interval)
+        :param args: list of positional arguments to call func with
+        :param kwargs: dict of keyword arguments to call func with
+        :param name: name of the job
+        :param jobstore: alias of the job store to add the job to
+        :param misfire_grace_time: seconds after the designated run time that
+            the job is still allowed to be run
+        :rtype: :class:`~apscheduler.job.Job`
+        """
+        interval = timedelta(weeks=weeks, days=days, hours=hours,
+                             minutes=minutes, seconds=seconds)
+        trigger = IntervalTrigger(interval, start_date)
+        return self.add_job(trigger, func, args, kwargs, **options)
+
+    def add_cron_job(self, func, year=None, month=None, day=None, week=None,
+                     day_of_week=None, hour=None, minute=None, second=None,
+                     start_date=None, args=None, kwargs=None, **options):
+        """
+        Schedules a job to be completed on times that match the given
+        expressions.
+        Any extra keyword arguments are passed along to the constructor of the
+        :class:`~apscheduler.job.Job` class (see :ref:`job_options`).
+
+        :param func: callable to run
+        :param year: year to run on
+        :param month: month to run on
+        :param day: day of month to run on
+        :param week: week of the year to run on
+        :param day_of_week: weekday to run on (0 = Monday)
+        :param hour: hour to run on
+        :param second: second to run on
+        :param args: list of positional arguments to call func with
+        :param kwargs: dict of keyword arguments to call func with
+        :param name: name of the job
+        :param jobstore: alias of the job store to add the job to
+        :param misfire_grace_time: seconds after the designated run time that
+            the job is still allowed to be run
+        :return: the scheduled job
+        :rtype: :class:`~apscheduler.job.Job`
+        """
+        trigger = CronTrigger(year=year, month=month, day=day, week=week,
+                              day_of_week=day_of_week, hour=hour,
+                              minute=minute, second=second,
+                              start_date=start_date)
+        return self.add_job(trigger, func, args, kwargs, **options)
+
+    def cron_schedule(self, **options):
+        """
+        Decorator version of :meth:`add_cron_job`.
+        This decorator does not wrap its host function.
+        Unscheduling decorated functions is possible by passing the ``job``
+        attribute of the scheduled function to :meth:`unschedule_job`.
+        Any extra keyword arguments are passed along to the constructor of the
+        :class:`~apscheduler.job.Job` class (see :ref:`job_options`).
+        """
+        def inner(func):
+            func.job = self.add_cron_job(func, **options)
+            return func
+        return inner
+
+    def interval_schedule(self, **options):
+        """
+        Decorator version of :meth:`add_interval_job`.
+        This decorator does not wrap its host function.
+        Unscheduling decorated functions is possible by passing the ``job``
+        attribute of the scheduled function to :meth:`unschedule_job`.
+        Any extra keyword arguments are passed along to the constructor of the
+        :class:`~apscheduler.job.Job` class (see :ref:`job_options`).
+        """
+        def inner(func):
+            func.job = self.add_interval_job(func, **options)
+            return func
+        return inner
+
+    def get_jobs(self):
+        """
+        Returns a list of all scheduled jobs.
+
+        :return: list of :class:`~apscheduler.job.Job` objects
+        """
+        self._jobstores_lock.acquire()
+        try:
+            jobs = []
+            for jobstore in itervalues(self._jobstores):
+                jobs.extend(jobstore.jobs)
+            return jobs
+        finally:
+            self._jobstores_lock.release()
+
+    def unschedule_job(self, job):
+        """
+        Removes a job, preventing it from being run any more.
+        """
+        self._jobstores_lock.acquire()
+        try:
+            for alias, jobstore in iteritems(self._jobstores):
+                if job in list(jobstore.jobs):
+                    self._remove_job(job, alias, jobstore)
+                    return
+        finally:
+            self._jobstores_lock.release()
+
+        raise KeyError('Job "%s" is not scheduled in any job store' % job)
+
+    def unschedule_func(self, func):
+        """
+        Removes all jobs that would execute the given function.
+        """
+        found = False
+        self._jobstores_lock.acquire()
+        try:
+            for alias, jobstore in iteritems(self._jobstores):
+                for job in list(jobstore.jobs):
+                    if job.func == func:
+                        self._remove_job(job, alias, jobstore)
+                        found = True
+        finally:
+            self._jobstores_lock.release()
+
+        if not found:
+            raise KeyError('The given function is not scheduled in this '
+                           'scheduler')
+
+    def print_jobs(self, out=None):
+        """
+        Prints out a textual listing of all jobs currently scheduled on this
+        scheduler.
+
+        :param out: a file-like object to print to (defaults to **sys.stdout**
+                    if nothing is given)
+        """
+        out = out or sys.stdout
+        job_strs = []
+        self._jobstores_lock.acquire()
+        try:
+            for alias, jobstore in iteritems(self._jobstores):
+                job_strs.append('Jobstore %s:' % alias)
+                if jobstore.jobs:
+                    for job in jobstore.jobs:
+                        job_strs.append('    %s' % job)
+                else:
+                    job_strs.append('    No scheduled jobs')
+        finally:
+            self._jobstores_lock.release()
+
+        out.write(os.linesep.join(job_strs) + os.linesep)
+
+    def _run_job(self, job, run_times):
+        """
+        Acts as a harness that runs the actual job code in a thread.
+        """
+        for run_time in run_times:
+            # See if the job missed its run time window, and handle possible
+            # misfires accordingly
+            difference = datetime.now() - run_time
+            grace_time = timedelta(seconds=job.misfire_grace_time)
+            if difference > grace_time:
+                # Notify listeners about a missed run
+                event = JobEvent(EVENT_JOB_MISSED, job, run_time)
+                self._notify_listeners(event)
+                logger.warning('Run time of job "%s" was missed by %s',
+                               job, difference)
+            else:
+                try:
+                    job.add_instance()
+                except MaxInstancesReachedError:
+                    event = JobEvent(EVENT_JOB_MISSED, job, run_time)
+                    self._notify_listeners(event)
+                    logger.warning('Execution of job "%s" skipped: '
+                                   'maximum number of running instances '
+                                   'reached (%d)', job, job.max_instances)
+                    break
+
+                logger.info('Running job "%s" (scheduled at %s)', job,
+                            run_time)
+
+                try:
+                    retval = job.func(*job.args, **job.kwargs)
+                except:
+                    # Notify listeners about the exception
+                    exc, tb = sys.exc_info()[1:]
+                    event = JobEvent(EVENT_JOB_ERROR, job, run_time,
+                                     exception=exc, traceback=tb)
+                    self._notify_listeners(event)
+
+                    logger.exception('Job "%s" raised an exception', job)
+                else:
+                    # Notify listeners about successful execution
+                    event = JobEvent(EVENT_JOB_EXECUTED, job, run_time,
+                                     retval=retval)
+                    self._notify_listeners(event)
+
+                    logger.info('Job "%s" executed successfully', job)
+
+                job.remove_instance()
+
+                # If coalescing is enabled, don't attempt any further runs
+                if job.coalesce:
+                    break
+
+    def _process_jobs(self, now):
+        """
+        Iterates through jobs in every jobstore, starts pending jobs
+        and figures out the next wakeup time.
+        """
+        next_wakeup_time = None
+        self._jobstores_lock.acquire()
+        try:
+            for alias, jobstore in iteritems(self._jobstores):
+                for job in tuple(jobstore.jobs):
+                    run_times = job.get_run_times(now)
+                    if run_times:
+                        self._threadpool.submit(self._run_job, job, run_times)
+
+                        # Increase the job's run count
+                        if job.coalesce:
+                            job.runs += 1
+                        else:
+                            job.runs += len(run_times)
+
+                        # Update the job, but don't keep finished jobs around
+                        if job.compute_next_run_time(
+                                now + timedelta(microseconds=1)):
+                            jobstore.update_job(job)
+                        else:
+                            self._remove_job(job, alias, jobstore)
+
+                    if not next_wakeup_time:
+                        next_wakeup_time = job.next_run_time
+                    elif job.next_run_time:
+                        next_wakeup_time = min(next_wakeup_time,
+                                               job.next_run_time)
+            return next_wakeup_time
+        finally:
+            self._jobstores_lock.release()
+
+    def _main_loop(self):
+        """Executes jobs on schedule."""
+
+        logger.info('Scheduler started')
+        self._notify_listeners(SchedulerEvent(EVENT_SCHEDULER_START))
+
+        self._wakeup.clear()
+        while not self._stopped:
+            logger.debug('Looking for jobs to run')
+            now = datetime.now()
+            next_wakeup_time = self._process_jobs(now)
+
+            # Sleep until the next job is scheduled to be run,
+            # a new job is added or the scheduler is stopped
+            if next_wakeup_time is not None:
+                wait_seconds = time_difference(next_wakeup_time, now)
+                logger.debug('Next wakeup is due at %s (in %f seconds)',
+                             next_wakeup_time, wait_seconds)
+                self._wakeup.wait(wait_seconds)
+                self._wakeup.clear()
+            elif self.standalone:
+                logger.debug('No jobs left; shutting down scheduler')
+                self.shutdown()
+                break
+            else:
+                logger.debug('No jobs; waiting until a job is added')
+                self._wakeup.wait()
+                self._wakeup.clear()
+
+        logger.info('Scheduler has been shut down')
+        self._notify_listeners(SchedulerEvent(EVENT_SCHEDULER_SHUTDOWN))
diff --git a/lib/apscheduler/threadpool.py b/lib/apscheduler/threadpool.py
new file mode 100755
index 0000000..8ec47da
--- /dev/null
+++ b/lib/apscheduler/threadpool.py
@@ -0,0 +1,133 @@
+"""
+Generic thread pool class. Modeled after Java's ThreadPoolExecutor.
+Please note that this ThreadPool does *not* fully implement the PEP 3148
+ThreadPool!
+"""
+
+from threading import Thread, Lock, currentThread
+from weakref import ref
+import logging
+import atexit
+
+try:
+    from queue import Queue, Empty
+except ImportError:
+    from Queue import Queue, Empty
+
+logger = logging.getLogger(__name__)
+_threadpools = set()
+
+
+# Worker threads are daemonic in order to let the interpreter exit without
+# an explicit shutdown of the thread pool. The following trick is necessary
+# to allow worker threads to finish cleanly.
+def _shutdown_all():
+    for pool_ref in tuple(_threadpools):
+        pool = pool_ref()
+        if pool:
+            pool.shutdown()
+
+atexit.register(_shutdown_all)
+
+
+class ThreadPool(object):
+    def __init__(self, core_threads=0, max_threads=20, keepalive=1):
+        """
+        :param core_threads: maximum number of persistent threads in the pool
+        :param max_threads: maximum number of total threads in the pool
+        :param thread_class: callable that creates a Thread object
+        :param keepalive: seconds to keep non-core worker threads waiting
+            for new tasks
+        """
+        self.core_threads = core_threads
+        self.max_threads = max(max_threads, core_threads, 1)
+        self.keepalive = keepalive
+        self._queue = Queue()
+        self._threads_lock = Lock()
+        self._threads = set()
+        self._shutdown = False
+
+        _threadpools.add(ref(self))
+        logger.info('Started thread pool with %d core threads and %s maximum '
+                    'threads', core_threads, max_threads or 'unlimited')
+
+    def _adjust_threadcount(self):
+        self._threads_lock.acquire()
+        try:
+            if self.num_threads < self.max_threads:
+                self._add_thread(self.num_threads < self.core_threads)
+        finally:
+            self._threads_lock.release()
+
+    def _add_thread(self, core):
+        t = Thread(target=self._run_jobs, args=(core,))
+        t.setDaemon(True)
+        t.start()
+        self._threads.add(t)
+
+    def _run_jobs(self, core):
+        logger.debug('Started worker thread')
+        block = True
+        timeout = None
+        if not core:
+            block = self.keepalive > 0
+            timeout = self.keepalive
+
+        while True:
+            try:
+                func, args, kwargs = self._queue.get(block, timeout)
+            except Empty:
+                break
+
+            if self._shutdown:
+                break
+
+            try:
+                func(*args, **kwargs)
+            except:
+                logger.exception('Error in worker thread')
+
+        self._threads_lock.acquire()
+        self._threads.remove(currentThread())
+        self._threads_lock.release()
+
+        logger.debug('Exiting worker thread')
+
+    @property
+    def num_threads(self):
+        return len(self._threads)
+
+    def submit(self, func, *args, **kwargs):
+        if self._shutdown:
+            raise RuntimeError('Cannot schedule new tasks after shutdown')
+
+        self._queue.put((func, args, kwargs))
+        self._adjust_threadcount()
+
+    def shutdown(self, wait=True):
+        if self._shutdown:
+            return
+
+        logging.info('Shutting down thread pool')
+        self._shutdown = True
+        _threadpools.remove(ref(self))
+
+        self._threads_lock.acquire()
+        for _ in range(self.num_threads):
+            self._queue.put((None, None, None))
+        self._threads_lock.release()
+
+        if wait:
+            self._threads_lock.acquire()
+            threads = tuple(self._threads)
+            self._threads_lock.release()
+            for thread in threads:
+                thread.join()
+
+    def __repr__(self):
+        if self.max_threads:
+            threadcount = '%d/%d' % (self.num_threads, self.max_threads)
+        else:
+            threadcount = '%d' % self.num_threads
+
+        return '<ThreadPool at %x; threads=%s>' % (id(self), threadcount)
diff --git a/lib/apscheduler/triggers/__init__.py b/lib/apscheduler/triggers/__init__.py
new file mode 100755
index 0000000..a40ece2
--- /dev/null
+++ b/lib/apscheduler/triggers/__init__.py
@@ -0,0 +1,3 @@
+from lib.apscheduler.triggers.cron import CronTrigger
+from lib.apscheduler.triggers.interval import IntervalTrigger
+from lib.apscheduler.triggers.simple import SimpleTrigger
diff --git a/lib/apscheduler/triggers/cron/__init__.py b/lib/apscheduler/triggers/cron/__init__.py
new file mode 100755
index 0000000..b7a4c90
--- /dev/null
+++ b/lib/apscheduler/triggers/cron/__init__.py
@@ -0,0 +1,144 @@
+from datetime import date, datetime
+
+from lib.apscheduler.triggers.cron.fields import *
+from lib.apscheduler.util import datetime_ceil, convert_to_datetime, iteritems
+
+
+class CronTrigger(object):
+    FIELD_NAMES = ('year', 'month', 'day', 'week', 'day_of_week', 'hour',
+                   'minute', 'second')
+    FIELDS_MAP = {'year': BaseField,
+                  'month': BaseField,
+                  'week': WeekField,
+                  'day': DayOfMonthField,
+                  'day_of_week': DayOfWeekField,
+                  'hour': BaseField,
+                  'minute': BaseField,
+                  'second': BaseField}
+
+    def __init__(self, **values):
+        self.start_date = values.pop('start_date', None)
+        if self.start_date:
+            self.start_date = convert_to_datetime(self.start_date)
+
+        # Check field names and yank out all None valued fields
+        for key, value in list(iteritems(values)):
+            if key not in self.FIELD_NAMES:
+                raise TypeError('Invalid field name: %s' % key)
+            if value is None:
+                del values[key]
+
+        self.fields = []
+        assign_defaults = False
+        for field_name in self.FIELD_NAMES:
+            if field_name in values:
+                exprs = values.pop(field_name)
+                is_default = False
+                assign_defaults = not values
+            elif assign_defaults:
+                exprs = DEFAULT_VALUES[field_name]
+                is_default = True
+            else:
+                exprs = '*'
+                is_default = True
+
+            field_class = self.FIELDS_MAP[field_name]
+            field = field_class(field_name, exprs, is_default)
+            self.fields.append(field)
+
+    def _increment_field_value(self, dateval, fieldnum):
+        """
+        Increments the designated field and resets all less significant fields
+        to their minimum values.
+
+        :type dateval: datetime
+        :type fieldnum: int
+        :type amount: int
+        :rtype: tuple
+        :return: a tuple containing the new date, and the number of the field
+                 that was actually incremented
+        """
+        i = 0
+        values = {}
+        while i < len(self.fields):
+            field = self.fields[i]
+            if not field.REAL:
+                if i == fieldnum:
+                    fieldnum -= 1
+                    i -= 1
+                else:
+                    i += 1
+                continue
+
+            if i < fieldnum:
+                values[field.name] = field.get_value(dateval)
+                i += 1
+            elif i > fieldnum:
+                values[field.name] = field.get_min(dateval)
+                i += 1
+            else:
+                value = field.get_value(dateval)
+                maxval = field.get_max(dateval)
+                if value == maxval:
+                    fieldnum -= 1
+                    i -= 1
+                else:
+                    values[field.name] = value + 1
+                    i += 1
+
+        return datetime(**values), fieldnum
+
+    def _set_field_value(self, dateval, fieldnum, new_value):
+        values = {}
+        for i, field in enumerate(self.fields):
+            if field.REAL:
+                if i < fieldnum:
+                    values[field.name] = field.get_value(dateval)
+                elif i > fieldnum:
+                    values[field.name] = field.get_min(dateval)
+                else:
+                    values[field.name] = new_value
+
+        return datetime(**values)
+
+    def get_next_fire_time(self, start_date):
+        if self.start_date:
+            start_date = max(start_date, self.start_date)
+        next_date = datetime_ceil(start_date)
+        fieldnum = 0
+        while 0 <= fieldnum < len(self.fields):
+            field = self.fields[fieldnum]
+            curr_value = field.get_value(next_date)
+            next_value = field.get_next_value(next_date)
+
+            if next_value is None:
+                # No valid value was found
+                next_date, fieldnum = self._increment_field_value(
+                    next_date, fieldnum - 1)
+            elif next_value > curr_value:
+                # A valid, but higher than the starting value, was found
+                if field.REAL:
+                    next_date = self._set_field_value(
+                        next_date, fieldnum, next_value)
+                    fieldnum += 1
+                else:
+                    next_date, fieldnum = self._increment_field_value(
+                        next_date, fieldnum)
+            else:
+                # A valid value was found, no changes necessary
+                fieldnum += 1
+
+        if fieldnum >= 0:
+            return next_date
+
+    def __str__(self):
+        options = ["%s='%s'" % (f.name, str(f)) for f in self.fields
+                   if not f.is_default]
+        return 'cron[%s]' % (', '.join(options))
+
+    def __repr__(self):
+        options = ["%s='%s'" % (f.name, str(f)) for f in self.fields
+                   if not f.is_default]
+        if self.start_date:
+            options.append("start_date='%s'" % self.start_date.isoformat(' '))
+        return '<%s (%s)>' % (self.__class__.__name__, ', '.join(options))
diff --git a/lib/apscheduler/triggers/cron/expressions.py b/lib/apscheduler/triggers/cron/expressions.py
new file mode 100755
index 0000000..68f5440
--- /dev/null
+++ b/lib/apscheduler/triggers/cron/expressions.py
@@ -0,0 +1,194 @@
+"""
+This module contains the expressions applicable for CronTrigger's fields.
+"""
+
+from calendar import monthrange
+import re
+
+from lib.apscheduler.util import asint
+
+__all__ = ('AllExpression', 'RangeExpression', 'WeekdayRangeExpression',
+           'WeekdayPositionExpression', 'LastDayOfMonthExpression')
+
+
+WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
+
+
+class AllExpression(object):
+    value_re = re.compile(r'\*(?:/(?P<step>\d+))?$')
+
+    def __init__(self, step=None):
+        self.step = asint(step)
+        if self.step == 0:
+            raise ValueError('Increment must be higher than 0')
+
+    def get_next_value(self, date, field):
+        start = field.get_value(date)
+        minval = field.get_min(date)
+        maxval = field.get_max(date)
+        start = max(start, minval)
+
+        if not self.step:
+            next = start
+        else:
+            distance_to_next = (self.step - (start - minval)) % self.step
+            next = start + distance_to_next
+
+        if next <= maxval:
+            return next
+
+    def __str__(self):
+        if self.step:
+            return '*/%d' % self.step
+        return '*'
+
+    def __repr__(self):
+        return "%s(%s)" % (self.__class__.__name__, self.step)
+
+
+class RangeExpression(AllExpression):
+    value_re = re.compile(
+        r'(?P<first>\d+)(?:-(?P<last>\d+))?(?:/(?P<step>\d+))?$')
+
+    def __init__(self, first, last=None, step=None):
+        AllExpression.__init__(self, step)
+        first = asint(first)
+        last = asint(last)
+        if last is None and step is None:
+            last = first
+        if last is not None and first > last:
+            raise ValueError('The minimum value in a range must not be '
+                             'higher than the maximum')
+        self.first = first
+        self.last = last
+
+    def get_next_value(self, date, field):
+        start = field.get_value(date)
+        minval = field.get_min(date)
+        maxval = field.get_max(date)
+
+        # Apply range limits
+        minval = max(minval, self.first)
+        if self.last is not None:
+            maxval = min(maxval, self.last)
+        start = max(start, minval)
+
+        if not self.step:
+            next = start
+        else:
+            distance_to_next = (self.step - (start - minval)) % self.step
+            next = start + distance_to_next
+
+        if next <= maxval:
+            return next
+
+    def __str__(self):
+        if self.last != self.first and self.last is not None:
+            range = '%d-%d' % (self.first, self.last)
+        else:
+            range = str(self.first)
+
+        if self.step:
+            return '%s/%d' % (range, self.step)
+        return range
+
+    def __repr__(self):
+        args = [str(self.first)]
+        if self.last != self.first and self.last is not None or self.step:
+            args.append(str(self.last))
+        if self.step:
+            args.append(str(self.step))
+        return "%s(%s)" % (self.__class__.__name__, ', '.join(args))
+
+
+class WeekdayRangeExpression(RangeExpression):
+    value_re = re.compile(r'(?P<first>[a-z]+)(?:-(?P<last>[a-z]+))?',
+                          re.IGNORECASE)
+
+    def __init__(self, first, last=None):
+        try:
+            first_num = WEEKDAYS.index(first.lower())
+        except ValueError:
+            raise ValueError('Invalid weekday name "%s"' % first)
+
+        if last:
+            try:
+                last_num = WEEKDAYS.index(last.lower())
+            except ValueError:
+                raise ValueError('Invalid weekday name "%s"' % last)
+        else:
+            last_num = None
+
+        RangeExpression.__init__(self, first_num, last_num)
+
+    def __str__(self):
+        if self.last != self.first and self.last is not None:
+            return '%s-%s' % (WEEKDAYS[self.first], WEEKDAYS[self.last])
+        return WEEKDAYS[self.first]
+
+    def __repr__(self):
+        args = ["'%s'" % WEEKDAYS[self.first]]
+        if self.last != self.first and self.last is not None:
+            args.append("'%s'" % WEEKDAYS[self.last])
+        return "%s(%s)" % (self.__class__.__name__, ', '.join(args))
+
+
+class WeekdayPositionExpression(AllExpression):
+    options = ['1st', '2nd', '3rd', '4th', '5th', 'last']
+    value_re = re.compile(r'(?P<option_name>%s) +(?P<weekday_name>(?:\d+|\w+))'
+                          % '|'.join(options), re.IGNORECASE)
+
+    def __init__(self, option_name, weekday_name):
+        try:
+            self.option_num = self.options.index(option_name.lower())
+        except ValueError:
+            raise ValueError('Invalid weekday position "%s"' % option_name)
+
+        try:
+            self.weekday = WEEKDAYS.index(weekday_name.lower())
+        except ValueError:
+            raise ValueError('Invalid weekday name "%s"' % weekday_name)
+
+    def get_next_value(self, date, field):
+        # Figure out the weekday of the month's first day and the number
+        # of days in that month
+        first_day_wday, last_day = monthrange(date.year, date.month)
+
+        # Calculate which day of the month is the first of the target weekdays
+        first_hit_day = self.weekday - first_day_wday + 1
+        if first_hit_day <= 0:
+            first_hit_day += 7
+
+        # Calculate what day of the month the target weekday would be
+        if self.option_num < 5:
+            target_day = first_hit_day + self.option_num * 7
+        else:
+            target_day = first_hit_day + ((last_day - first_hit_day) / 7) * 7
+
+        if target_day <= last_day and target_day >= date.day:
+            return target_day
+
+    def __str__(self):
+        return '%s %s' % (self.options[self.option_num],
+                          WEEKDAYS[self.weekday])
+
+    def __repr__(self):
+        return "%s('%s', '%s')" % (self.__class__.__name__,
+                                   self.options[self.option_num],
+                                   WEEKDAYS[self.weekday])
+
+
+class LastDayOfMonthExpression(AllExpression):
+    value_re = re.compile(r'last', re.IGNORECASE)
+
+    def __init__(self):
+        pass
+
+    def get_next_value(self, date, field):
+        return monthrange(date.year, date.month)[1]
+
+    def __str__(self):
+        return 'last'
+
+    def __repr__(self):
+        return "%s()" % self.__class__.__name__
diff --git a/lib/apscheduler/triggers/cron/fields.py b/lib/apscheduler/triggers/cron/fields.py
new file mode 100755
index 0000000..be99709
--- /dev/null
+++ b/lib/apscheduler/triggers/cron/fields.py
@@ -0,0 +1,100 @@
+"""
+Fields represent CronTrigger options which map to :class:`~datetime.datetime`
+fields.
+"""
+
+from calendar import monthrange
+
+from lib.apscheduler.triggers.cron.expressions import *
+
+__all__ = ('MIN_VALUES', 'MAX_VALUES', 'DEFAULT_VALUES', 'BaseField',
+           'WeekField', 'DayOfMonthField', 'DayOfWeekField')
+
+
+MIN_VALUES = {'year': 1970, 'month': 1, 'day': 1, 'week': 1,
+              'day_of_week': 0, 'hour': 0, 'minute': 0, 'second': 0}
+MAX_VALUES = {'year': 2 ** 63, 'month': 12, 'day:': 31, 'week': 53,
+              'day_of_week': 6, 'hour': 23, 'minute': 59, 'second': 59}
+DEFAULT_VALUES = {'year': '*', 'month': 1, 'day': 1, 'week': '*',
+                  'day_of_week': '*', 'hour': 0, 'minute': 0, 'second': 0}
+
+
+class BaseField(object):
+    REAL = True
+    COMPILERS = [AllExpression, RangeExpression]
+
+    def __init__(self, name, exprs, is_default=False):
+        self.name = name
+        self.is_default = is_default
+        self.compile_expressions(exprs)
+
+    def get_min(self, dateval):
+        return MIN_VALUES[self.name]
+
+    def get_max(self, dateval):
+        return MAX_VALUES[self.name]
+
+    def get_value(self, dateval):
+        return getattr(dateval, self.name)
+
+    def get_next_value(self, dateval):
+        smallest = None
+        for expr in self.expressions:
+            value = expr.get_next_value(dateval, self)
+            if smallest is None or (value is not None and value < smallest):
+                smallest = value
+
+        return smallest
+
+    def compile_expressions(self, exprs):
+        self.expressions = []
+
+        # Split a comma-separated expression list, if any
+        exprs = str(exprs).strip()
+        if ',' in exprs:
+            for expr in exprs.split(','):
+                self.compile_expression(expr)
+        else:
+            self.compile_expression(exprs)
+
+    def compile_expression(self, expr):
+        for compiler in self.COMPILERS:
+            match = compiler.value_re.match(expr)
+            if match:
+                compiled_expr = compiler(**match.groupdict())
+                self.expressions.append(compiled_expr)
+                return
+
+        raise ValueError('Unrecognized expression "%s" for field "%s"' %
+                         (expr, self.name))
+
+    def __str__(self):
+        expr_strings = (str(e) for e in self.expressions)
+        return ','.join(expr_strings)
+
+    def __repr__(self):
+        return "%s('%s', '%s')" % (self.__class__.__name__, self.name,
+                                   str(self))
+
+
+class WeekField(BaseField):
+    REAL = False
+
+    def get_value(self, dateval):
+        return dateval.isocalendar()[1]
+
+
+class DayOfMonthField(BaseField):
+    COMPILERS = BaseField.COMPILERS + [WeekdayPositionExpression,
+                                       LastDayOfMonthExpression]
+
+    def get_max(self, dateval):
+        return monthrange(dateval.year, dateval.month)[1]
+
+
+class DayOfWeekField(BaseField):
+    REAL = False
+    COMPILERS = BaseField.COMPILERS + [WeekdayRangeExpression]
+
+    def get_value(self, dateval):
+        return dateval.weekday()
diff --git a/lib/apscheduler/triggers/interval.py b/lib/apscheduler/triggers/interval.py
new file mode 100755
index 0000000..a7c1ee1
--- /dev/null
+++ b/lib/apscheduler/triggers/interval.py
@@ -0,0 +1,39 @@
+from datetime import datetime, timedelta
+from math import ceil
+
+from lib.apscheduler.util import convert_to_datetime, timedelta_seconds
+
+
+class IntervalTrigger(object):
+    def __init__(self, interval, start_date=None):
+        if not isinstance(interval, timedelta):
+            raise TypeError('interval must be a timedelta')
+        if start_date:
+            start_date = convert_to_datetime(start_date)
+
+        self.interval = interval
+        self.interval_length = timedelta_seconds(self.interval)
+        if self.interval_length == 0:
+            self.interval = timedelta(seconds=1)
+            self.interval_length = 1
+
+        if start_date is None:
+            self.start_date = datetime.now() + self.interval
+        else:
+            self.start_date = convert_to_datetime(start_date)
+
+    def get_next_fire_time(self, start_date):
+        if start_date < self.start_date:
+            return self.start_date
+
+        timediff_seconds = timedelta_seconds(start_date - self.start_date)
+        next_interval_num = int(ceil(timediff_seconds / self.interval_length))
+        return self.start_date + self.interval * next_interval_num
+
+    def __str__(self):
+        return 'interval[%s]' % str(self.interval)
+
+    def __repr__(self):
+        return "<%s (interval=%s, start_date=%s)>" % (
+            self.__class__.__name__, repr(self.interval),
+            repr(self.start_date))
diff --git a/lib/apscheduler/triggers/simple.py b/lib/apscheduler/triggers/simple.py
new file mode 100755
index 0000000..702ed78
--- /dev/null
+++ b/lib/apscheduler/triggers/simple.py
@@ -0,0 +1,17 @@
+from lib.apscheduler.util import convert_to_datetime
+
+
+class SimpleTrigger(object):
+    def __init__(self, run_date):
+        self.run_date = convert_to_datetime(run_date)
+
+    def get_next_fire_time(self, start_date):
+        if self.run_date >= start_date:
+            return self.run_date
+
+    def __str__(self):
+        return 'date[%s]' % str(self.run_date)
+
+    def __repr__(self):
+        return '<%s (run_date=%s)>' % (
+            self.__class__.__name__, repr(self.run_date))
diff --git a/lib/apscheduler/util.py b/lib/apscheduler/util.py
new file mode 100755
index 0000000..dcede4c
--- /dev/null
+++ b/lib/apscheduler/util.py
@@ -0,0 +1,230 @@
+"""
+This module contains several handy functions primarily meant for internal use.
+"""
+
+from datetime import date, datetime, timedelta
+from time import mktime
+import re
+import sys
+
+__all__ = ('asint', 'asbool', 'convert_to_datetime', 'timedelta_seconds',
+           'time_difference', 'datetime_ceil', 'combine_opts',
+           'get_callable_name', 'obj_to_ref', 'ref_to_obj', 'maybe_ref',
+           'to_unicode', 'iteritems', 'itervalues', 'xrange')
+
+
+def asint(text):
+    """
+    Safely converts a string to an integer, returning None if the string
+    is None.
+
+    :type text: str
+    :rtype: int
+    """
+    if text is not None:
+        return int(text)
+
+
+def asbool(obj):
+    """
+    Interprets an object as a boolean value.
+
+    :rtype: bool
+    """
+    if isinstance(obj, str):
+        obj = obj.strip().lower()
+        if obj in ('true', 'yes', 'on', 'y', 't', '1'):
+            return True
+        if obj in ('false', 'no', 'off', 'n', 'f', '0'):
+            return False
+        raise ValueError('Unable to interpret value "%s" as boolean' % obj)
+    return bool(obj)
+
+
+_DATE_REGEX = re.compile(
+    r'(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})'
+    r'(?: (?P<hour>\d{1,2}):(?P<minute>\d{1,2}):(?P<second>\d{1,2})'
+    r'(?:\.(?P<microsecond>\d{1,6}))?)?')
+
+
+def convert_to_datetime(input):
+    """
+    Converts the given object to a datetime object, if possible.
+    If an actual datetime object is passed, it is returned unmodified.
+    If the input is a string, it is parsed as a datetime.
+
+    Date strings are accepted in three different forms: date only (Y-m-d),
+    date with time (Y-m-d H:M:S) or with date+time with microseconds
+    (Y-m-d H:M:S.micro).
+
+    :rtype: datetime
+    """
+    if isinstance(input, datetime):
+        return input
+    elif isinstance(input, date):
+        return datetime.fromordinal(input.toordinal())
+    elif isinstance(input, basestring):
+        m = _DATE_REGEX.match(input)
+        if not m:
+            raise ValueError('Invalid date string')
+        values = [(k, int(v or 0)) for k, v in m.groupdict().items()]
+        values = dict(values)
+        return datetime(**values)
+    raise TypeError('Unsupported input type: %s' % type(input))
+
+
+def timedelta_seconds(delta):
+    """
+    Converts the given timedelta to seconds.
+
+    :type delta: timedelta
+    :rtype: float
+    """
+    return delta.days * 24 * 60 * 60 + delta.seconds + \
+        delta.microseconds / 1000000.0
+
+
+def time_difference(date1, date2):
+    """
+    Returns the time difference in seconds between the given two
+    datetime objects. The difference is calculated as: date1 - date2.
+
+    :param date1: the later datetime
+    :type date1: datetime
+    :param date2: the earlier datetime
+    :type date2: datetime
+    :rtype: float
+    """
+    later = mktime(date1.timetuple()) + date1.microsecond / 1000000.0
+    earlier = mktime(date2.timetuple()) + date2.microsecond / 1000000.0
+    return later - earlier
+
+
+def datetime_ceil(dateval):
+    """
+    Rounds the given datetime object upwards.
+
+    :type dateval: datetime
+    """
+    if dateval.microsecond > 0:
+        return dateval + timedelta(seconds=1,
+                                   microseconds=-dateval.microsecond)
+    return dateval
+
+
+def combine_opts(global_config, prefix, local_config={}):
+    """
+    Returns a subdictionary from keys and values of  ``global_config`` where
+    the key starts with the given prefix, combined with options from
+    local_config. The keys in the subdictionary have the prefix removed.
+
+    :type global_config: dict
+    :type prefix: str
+    :type local_config: dict
+    :rtype: dict
+    """
+    prefixlen = len(prefix)
+    subconf = {}
+    for key, value in global_config.items():
+        if key.startswith(prefix):
+            key = key[prefixlen:]
+            subconf[key] = value
+    subconf.update(local_config)
+    return subconf
+
+
+def get_callable_name(func):
+    """
+    Returns the best available display name for the given function/callable.
+    """
+    f_self = getattr(func, '__self__', None) or getattr(func, 'im_self', None)
+
+    if f_self and hasattr(func, '__name__'):
+        if isinstance(f_self, type):
+            # class method
+            clsname = getattr(f_self, '__qualname__', None) or f_self.__name__
+            return '%s.%s' % (clsname, func.__name__)
+        # bound method
+        return '%s.%s' % (f_self.__class__.__name__, func.__name__)
+
+    if hasattr(func, '__call__'):
+        if hasattr(func, '__name__'):
+            # function, unbound method or a class with a __call__ method
+            return func.__name__
+        # instance of a class with a __call__ method
+        return func.__class__.__name__
+
+    raise TypeError('Unable to determine a name for %s -- '
+                    'maybe it is not a callable?' % repr(func))
+
+
+def obj_to_ref(obj):
+    """
+    Returns the path to the given object.
+    """
+    ref = '%s:%s' % (obj.__module__, get_callable_name(obj))
+    try:
+        obj2 = ref_to_obj(ref)
+        if obj != obj2:
+            raise ValueError
+    except Exception:
+        raise ValueError('Cannot determine the reference to %s' % repr(obj))
+
+    return ref
+
+
+def ref_to_obj(ref):
+    """
+    Returns the object pointed to by ``ref``.
+    """
+    if not isinstance(ref, basestring):
+        raise TypeError('References must be strings')
+    if not ':' in ref:
+        raise ValueError('Invalid reference')
+
+    modulename, rest = ref.split(':', 1)
+    try:
+        obj = __import__(modulename)
+    except ImportError:
+        raise LookupError('Error resolving reference %s: '
+                          'could not import module' % ref)
+
+    try:
+        for name in modulename.split('.')[1:] + rest.split('.'):
+            obj = getattr(obj, name)
+        return obj
+    except Exception:
+        raise LookupError('Error resolving reference %s: '
+                          'error looking up object' % ref)
+
+
+def maybe_ref(ref):
+    """
+    Returns the object that the given reference points to, if it is indeed
+    a reference. If it is not a reference, the object is returned as-is.
+    """
+    if not isinstance(ref, str):
+        return ref
+    return ref_to_obj(ref)
+
+
+def to_unicode(string, encoding='ascii'):
+    """
+    Safely converts a string to a unicode representation on any
+    Python version.
+    """
+    if hasattr(string, 'decode'):
+        return string.decode(encoding, 'ignore')
+    return string  # pragma: nocover
+
+
+if sys.version_info < (3, 0):  # pragma: nocover
+    iteritems = lambda d: d.iteritems()
+    itervalues = lambda d: d.itervalues()
+    xrange = xrange
+    basestring = basestring
+else:  # pragma: nocover
+    iteritems = lambda d: d.items()
+    itervalues = lambda d: d.values()
+    xrange = range
+    basestring = str
diff --git a/lib/argparse.py b/lib/argparse.py
new file mode 100755
index 0000000..8ce7d3d
--- /dev/null
+++ b/lib/argparse.py
@@ -0,0 +1,2365 @@
+# Author: Steven J. Bethard <steven.bethard at gmail.com>.
+
+"""Command-line parsing library
+
+This module is an optparse-inspired command-line parsing library that:
+
+    - handles both optional and positional arguments
+    - produces highly informative usage messages
+    - supports parsers that dispatch to sub-parsers
+
+The following is a simple usage example that sums integers from the
+command-line and writes the result to a file::
+
+    parser = argparse.ArgumentParser(
+        description='sum the integers at the command line')
+    parser.add_argument(
+        'integers', metavar='int', nargs='+', type=int,
+        help='an integer to be summed')
+    parser.add_argument(
+        '--log', default=sys.stdout, type=argparse.FileType('w'),
+        help='the file where the sum should be written')
+    args = parser.parse_args()
+    args.log.write('%s' % sum(args.integers))
+    args.log.close()
+
+The module contains the following public classes:
+
+    - ArgumentParser -- The main entry point for command-line parsing. As the
+        example above shows, the add_argument() method is used to populate
+        the parser with actions for optional and positional arguments. Then
+        the parse_args() method is invoked to convert the args at the
+        command-line into an object with attributes.
+
+    - ArgumentError -- The exception raised by ArgumentParser objects when
+        there are errors with the parser's actions. Errors raised while
+        parsing the command-line are caught by ArgumentParser and emitted
+        as command-line messages.
+
+    - FileType -- A factory for defining types of files to be created. As the
+        example above shows, instances of FileType are typically passed as
+        the type= argument of add_argument() calls.
+
+    - Action -- The base class for parser actions. Typically actions are
+        selected by passing strings like 'store_true' or 'append_const' to
+        the action= argument of add_argument(). However, for greater
+        customization of ArgumentParser actions, subclasses of Action may
+        be defined and passed as the action= argument.
+
+    - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter,
+        ArgumentDefaultsHelpFormatter -- Formatter classes which
+        may be passed as the formatter_class= argument to the
+        ArgumentParser constructor. HelpFormatter is the default,
+        RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser
+        not to change the formatting for help text, and
+        ArgumentDefaultsHelpFormatter adds information about argument defaults
+        to the help.
+
+All other classes in this module are considered implementation details.
+(Also note that HelpFormatter and RawDescriptionHelpFormatter are only
+considered public as object names -- the API of the formatter objects is
+still considered an implementation detail.)
+"""
+
+__version__ = '1.1'
+__all__ = [
+    'ArgumentParser',
+    'ArgumentError',
+    'ArgumentTypeError',
+    'FileType',
+    'HelpFormatter',
+    'ArgumentDefaultsHelpFormatter',
+    'RawDescriptionHelpFormatter',
+    'RawTextHelpFormatter',
+    'MetavarTypeHelpFormatter',
+    'Namespace',
+    'Action',
+    'ONE_OR_MORE',
+    'OPTIONAL',
+    'PARSER',
+    'REMAINDER',
+    'SUPPRESS',
+    'ZERO_OR_MORE',
+]
+
+
+import collections as _collections
+import copy as _copy
+import os as _os
+import re as _re
+import sys as _sys
+import textwrap as _textwrap
+
+from gettext import gettext as _, ngettext
+
+
+SUPPRESS = '==SUPPRESS=='
+
+OPTIONAL = '?'
+ZERO_OR_MORE = '*'
+ONE_OR_MORE = '+'
+PARSER = 'A...'
+REMAINDER = '...'
+_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'
+
+# =============================
+# Utility functions and classes
+# =============================
+
+class _AttributeHolder(object):
+    """Abstract base class that provides __repr__.
+
+    The __repr__ method returns a string in the format::
+        ClassName(attr=name, attr=name, ...)
+    The attributes are determined either by a class-level attribute,
+    '_kwarg_names', or by inspecting the instance __dict__.
+    """
+
+    def __repr__(self):
+        type_name = type(self).__name__
+        arg_strings = []
+        for arg in self._get_args():
+            arg_strings.append(repr(arg))
+        for name, value in self._get_kwargs():
+            arg_strings.append('%s=%r' % (name, value))
+        return '%s(%s)' % (type_name, ', '.join(arg_strings))
+
+    def _get_kwargs(self):
+        return sorted(self.__dict__.items())
+
+    def _get_args(self):
+        return []
+
+
+def _ensure_value(namespace, name, value):
+    if getattr(namespace, name, None) is None:
+        setattr(namespace, name, value)
+    return getattr(namespace, name)
+
+
+# ===============
+# Formatting Help
+# ===============
+
+class HelpFormatter(object):
+    """Formatter for generating usage messages and argument help strings.
+
+    Only the name of this class is considered a public API. All the methods
+    provided by the class are considered an implementation detail.
+    """
+
+    def __init__(self,
+                 prog,
+                 indent_increment=2,
+                 max_help_position=24,
+                 width=None):
+
+        # default setting for width
+        if width is None:
+            try:
+                width = int(_os.environ['COLUMNS'])
+            except (KeyError, ValueError):
+                width = 80
+            width -= 2
+
+        self._prog = prog
+        self._indent_increment = indent_increment
+        self._max_help_position = max_help_position
+        self._width = width
+
+        self._current_indent = 0
+        self._level = 0
+        self._action_max_length = 0
+
+        self._root_section = self._Section(self, None)
+        self._current_section = self._root_section
+
+        self._whitespace_matcher = _re.compile(r'\s+')
+        self._long_break_matcher = _re.compile(r'\n\n\n+')
+
+    # ===============================
+    # Section and indentation methods
+    # ===============================
+    def _indent(self):
+        self._current_indent += self._indent_increment
+        self._level += 1
+
+    def _dedent(self):
+        self._current_indent -= self._indent_increment
+        assert self._current_indent >= 0, 'Indent decreased below 0.'
+        self._level -= 1
+
+    class _Section(object):
+
+        def __init__(self, formatter, parent, heading=None):
+            self.formatter = formatter
+            self.parent = parent
+            self.heading = heading
+            self.items = []
+
+        def format_help(self):
+            # format the indented section
+            if self.parent is not None:
+                self.formatter._indent()
+            join = self.formatter._join_parts
+            for func, args in self.items:
+                func(*args)
+            item_help = join([func(*args) for func, args in self.items])
+            if self.parent is not None:
+                self.formatter._dedent()
+
+            # return nothing if the section was empty
+            if not item_help:
+                return ''
+
+            # add the heading if the section was non-empty
+            if self.heading is not SUPPRESS and self.heading is not None:
+                current_indent = self.formatter._current_indent
+                heading = '%*s%s:\n' % (current_indent, '', self.heading)
+            else:
+                heading = ''
+
+            # join the section-initial newline, the heading and the help
+            return join(['\n', heading, item_help, '\n'])
+
+    def _add_item(self, func, args):
+        self._current_section.items.append((func, args))
+
+    # ========================
+    # Message building methods
+    # ========================
+    def start_section(self, heading):
+        self._indent()
+        section = self._Section(self, self._current_section, heading)
+        self._add_item(section.format_help, [])
+        self._current_section = section
+
+    def end_section(self):
+        self._current_section = self._current_section.parent
+        self._dedent()
+
+    def add_text(self, text):
+        if text is not SUPPRESS and text is not None:
+            self._add_item(self._format_text, [text])
+
+    def add_usage(self, usage, actions, groups, prefix=None):
+        if usage is not SUPPRESS:
+            args = usage, actions, groups, prefix
+            self._add_item(self._format_usage, args)
+
+    def add_argument(self, action):
+        if action.help is not SUPPRESS:
+
+            # find all invocations
+            get_invocation = self._format_action_invocation
+            invocations = [get_invocation(action)]
+            for subaction in self._iter_indented_subactions(action):
+                invocations.append(get_invocation(subaction))
+
+            # update the maximum item length
+            invocation_length = max([len(s) for s in invocations])
+            action_length = invocation_length + self._current_indent
+            self._action_max_length = max(self._action_max_length,
+                                          action_length)
+
+            # add the item to the list
+            self._add_item(self._format_action, [action])
+
+    def add_arguments(self, actions):
+        for action in actions:
+            self.add_argument(action)
+
+    # =======================
+    # Help-formatting methods
+    # =======================
+    def format_help(self):
+        help = self._root_section.format_help()
+        if help:
+            help = self._long_break_matcher.sub('\n\n', help)
+            help = help.strip('\n') + '\n'
+        return help
+
+    def _join_parts(self, part_strings):
+        return ''.join([part
+                        for part in part_strings
+                        if part and part is not SUPPRESS])
+
+    def _format_usage(self, usage, actions, groups, prefix):
+        if prefix is None:
+            prefix = _('usage: ')
+
+        # if usage is specified, use that
+        if usage is not None:
+            usage = usage % dict(prog=self._prog)
+
+        # if no optionals or positionals are available, usage is just prog
+        elif usage is None and not actions:
+            usage = '%(prog)s' % dict(prog=self._prog)
+
+        # if optionals and positionals are available, calculate usage
+        elif usage is None:
+            prog = '%(prog)s' % dict(prog=self._prog)
+
+            # split optionals from positionals
+            optionals = []
+            positionals = []
+            for action in actions:
+                if action.option_strings:
+                    optionals.append(action)
+                else:
+                    positionals.append(action)
+
+            # build full usage string
+            format = self._format_actions_usage
+            action_usage = format(optionals + positionals, groups)
+            usage = ' '.join([s for s in [prog, action_usage] if s])
+
+            # wrap the usage parts if it's too long
+            text_width = self._width - self._current_indent
+            if len(prefix) + len(usage) > text_width:
+
+                # break usage into wrappable parts
+                part_regexp = r'\(.*?\)+|\[.*?\]+|\S+'
+                opt_usage = format(optionals, groups)
+                pos_usage = format(positionals, groups)
+                opt_parts = _re.findall(part_regexp, opt_usage)
+                pos_parts = _re.findall(part_regexp, pos_usage)
+                assert ' '.join(opt_parts) == opt_usage
+                assert ' '.join(pos_parts) == pos_usage
+
+                # helper for wrapping lines
+                def get_lines(parts, indent, prefix=None):
+                    lines = []
+                    line = []
+                    if prefix is not None:
+                        line_len = len(prefix) - 1
+                    else:
+                        line_len = len(indent) - 1
+                    for part in parts:
+                        if line_len + 1 + len(part) > text_width:
+                            lines.append(indent + ' '.join(line))
+                            line = []
+                            line_len = len(indent) - 1
+                        line.append(part)
+                        line_len += len(part) + 1
+                    if line:
+                        lines.append(indent + ' '.join(line))
+                    if prefix is not None:
+                        lines[0] = lines[0][len(indent):]
+                    return lines
+
+                # if prog is short, follow it with optionals or positionals
+                if len(prefix) + len(prog) <= 0.75 * text_width:
+                    indent = ' ' * (len(prefix) + len(prog) + 1)
+                    if opt_parts:
+                        lines = get_lines([prog] + opt_parts, indent, prefix)
+                        lines.extend(get_lines(pos_parts, indent))
+                    elif pos_parts:
+                        lines = get_lines([prog] + pos_parts, indent, prefix)
+                    else:
+                        lines = [prog]
+
+                # if prog is long, put it on its own line
+                else:
+                    indent = ' ' * len(prefix)
+                    parts = opt_parts + pos_parts
+                    lines = get_lines(parts, indent)
+                    if len(lines) > 1:
+                        lines = []
+                        lines.extend(get_lines(opt_parts, indent))
+                        lines.extend(get_lines(pos_parts, indent))
+                    lines = [prog] + lines
+
+                # join lines into usage
+                usage = '\n'.join(lines)
+
+        # prefix with 'usage:'
+        return '%s%s\n\n' % (prefix, usage)
+
+    def _format_actions_usage(self, actions, groups):
+        # find group indices and identify actions in groups
+        group_actions = set()
+        inserts = {}
+        for group in groups:
+            try:
+                start = actions.index(group._group_actions[0])
+            except ValueError:
+                continue
+            else:
+                end = start + len(group._group_actions)
+                if actions[start:end] == group._group_actions:
+                    for action in group._group_actions:
+                        group_actions.add(action)
+                    if not group.required:
+                        if start in inserts:
+                            inserts[start] += ' ['
+                        else:
+                            inserts[start] = '['
+                        inserts[end] = ']'
+                    else:
+                        if start in inserts:
+                            inserts[start] += ' ('
+                        else:
+                            inserts[start] = '('
+                        inserts[end] = ')'
+                    for i in range(start + 1, end):
+                        inserts[i] = '|'
+
+        # collect all actions format strings
+        parts = []
+        for i, action in enumerate(actions):
+
+            # suppressed arguments are marked with None
+            # remove | separators for suppressed arguments
+            if action.help is SUPPRESS:
+                parts.append(None)
+                if inserts.get(i) == '|':
+                    inserts.pop(i)
+                elif inserts.get(i + 1) == '|':
+                    inserts.pop(i + 1)
+
+            # produce all arg strings
+            elif not action.option_strings:
+                default = self._get_default_metavar_for_positional(action)
+                part = self._format_args(action, default)
+
+                # if it's in a group, strip the outer []
+                if action in group_actions:
+                    if part[0] == '[' and part[-1] == ']':
+                        part = part[1:-1]
+
+                # add the action string to the list
+                parts.append(part)
+
+            # produce the first way to invoke the option in brackets
+            else:
+                option_string = action.option_strings[0]
+
+                # if the Optional doesn't take a value, format is:
+                #    -s or --long
+                if action.nargs == 0:
+                    part = '%s' % option_string
+
+                # if the Optional takes a value, format is:
+                #    -s ARGS or --long ARGS
+                else:
+                    default = self._get_default_metavar_for_optional(action)
+                    args_string = self._format_args(action, default)
+                    part = '%s %s' % (option_string, args_string)
+
+                # make it look optional if it's not required or in a group
+                if not action.required and action not in group_actions:
+                    part = '[%s]' % part
+
+                # add the action string to the list
+                parts.append(part)
+
+        # insert things at the necessary indices
+        for i in sorted(inserts, reverse=True):
+            parts[i:i] = [inserts[i]]
+
+        # join all the action items with spaces
+        text = ' '.join([item for item in parts if item is not None])
+
+        # clean up separators for mutually exclusive groups
+        open = r'[\[(]'
+        close = r'[\])]'
+        text = _re.sub(r'(%s) ' % open, r'\1', text)
+        text = _re.sub(r' (%s)' % close, r'\1', text)
+        text = _re.sub(r'%s *%s' % (open, close), r'', text)
+        text = _re.sub(r'\(([^|]*)\)', r'\1', text)
+        text = text.strip()
+
+        # return the text
+        return text
+
+    def _format_text(self, text):
+        if '%(prog)' in text:
+            text = text % dict(prog=self._prog)
+        text_width = self._width - self._current_indent
+        indent = ' ' * self._current_indent
+        return self._fill_text(text, text_width, indent) + '\n\n'
+
+    def _format_action(self, action):
+        # determine the required width and the entry label
+        help_position = min(self._action_max_length + 2,
+                            self._max_help_position)
+        help_width = self._width - help_position
+        action_width = help_position - self._current_indent - 2
+        action_header = self._format_action_invocation(action)
+
+        # ho nelp; start on same line and add a final newline
+        if not action.help:
+            tup = self._current_indent, '', action_header
+            action_header = '%*s%s\n' % tup
+
+        # short action name; start on the same line and pad two spaces
+        elif len(action_header) <= action_width:
+            tup = self._current_indent, '', action_width, action_header
+            action_header = '%*s%-*s  ' % tup
+            indent_first = 0
+
+        # long action name; start on the next line
+        else:
+            tup = self._current_indent, '', action_header
+            action_header = '%*s%s\n' % tup
+            indent_first = help_position
+
+        # collect the pieces of the action help
+        parts = [action_header]
+
+        # if there was help for the action, add lines of help text
+        if action.help:
+            help_text = self._expand_help(action)
+            help_lines = self._split_lines(help_text, help_width)
+            parts.append('%*s%s\n' % (indent_first, '', help_lines[0]))
+            for line in help_lines[1:]:
+                parts.append('%*s%s\n' % (help_position, '', line))
+
+        # or add a newline if the description doesn't end with one
+        elif not action_header.endswith('\n'):
+            parts.append('\n')
+
+        # if there are any sub-actions, add their help as well
+        for subaction in self._iter_indented_subactions(action):
+            parts.append(self._format_action(subaction))
+
+        # return a single string
+        return self._join_parts(parts)
+
+    def _format_action_invocation(self, action):
+        if not action.option_strings:
+            default = self._get_default_metavar_for_positional(action)
+            metavar, = self._metavar_formatter(action, default)(1)
+            return metavar
+
+        else:
+            parts = []
+
+            # if the Optional doesn't take a value, format is:
+            #    -s, --long
+            if action.nargs == 0:
+                parts.extend(action.option_strings)
+
+            # if the Optional takes a value, format is:
+            #    -s ARGS, --long ARGS
+            else:
+                default = self._get_default_metavar_for_optional(action)
+                args_string = self._format_args(action, default)
+                for option_string in action.option_strings:
+                    parts.append('%s %s' % (option_string, args_string))
+
+            return ', '.join(parts)
+
+    def _metavar_formatter(self, action, default_metavar):
+        if action.metavar is not None:
+            result = action.metavar
+        elif action.choices is not None:
+            choice_strs = [str(choice) for choice in action.choices]
+            result = '{%s}' % ','.join(choice_strs)
+        else:
+            result = default_metavar
+
+        def format(tuple_size):
+            if isinstance(result, tuple):
+                return result
+            else:
+                return (result, ) * tuple_size
+        return format
+
+    def _format_args(self, action, default_metavar):
+        get_metavar = self._metavar_formatter(action, default_metavar)
+        if action.nargs is None:
+            result = '%s' % get_metavar(1)
+        elif action.nargs == OPTIONAL:
+            result = '[%s]' % get_metavar(1)
+        elif action.nargs == ZERO_OR_MORE:
+            result = '[%s [%s ...]]' % get_metavar(2)
+        elif action.nargs == ONE_OR_MORE:
+            result = '%s [%s ...]' % get_metavar(2)
+        elif action.nargs == REMAINDER:
+            result = '...'
+        elif action.nargs == PARSER:
+            result = '%s ...' % get_metavar(1)
+        else:
+            formats = ['%s' for _ in range(action.nargs)]
+            result = ' '.join(formats) % get_metavar(action.nargs)
+        return result
+
+    def _expand_help(self, action):
+        params = dict(vars(action), prog=self._prog)
+        for name in list(params):
+            if params[name] is SUPPRESS:
+                del params[name]
+        for name in list(params):
+            if hasattr(params[name], '__name__'):
+                params[name] = params[name].__name__
+        if params.get('choices') is not None:
+            choices_str = ', '.join([str(c) for c in params['choices']])
+            params['choices'] = choices_str
+        return self._get_help_string(action) % params
+
+    def _iter_indented_subactions(self, action):
+        try:
+            get_subactions = action._get_subactions
+        except AttributeError:
+            pass
+        else:
+            self._indent()
+            yield get_subactions()
+            self._dedent()
+
+    def _split_lines(self, text, width):
+        text = self._whitespace_matcher.sub(' ', text).strip()
+        return _textwrap.wrap(text, width)
+
+    def _fill_text(self, text, width, indent):
+        text = self._whitespace_matcher.sub(' ', text).strip()
+        return _textwrap.fill(text, width, initial_indent=indent,
+                                           subsequent_indent=indent)
+
+    def _get_help_string(self, action):
+        return action.help
+
+    def _get_default_metavar_for_optional(self, action):
+        return action.dest.upper()
+
+    def _get_default_metavar_for_positional(self, action):
+        return action.dest
+
+
+class RawDescriptionHelpFormatter(HelpFormatter):
+    """Help message formatter which retains any formatting in descriptions.
+
+    Only the name of this class is considered a public API. All the methods
+    provided by the class are considered an implementation detail.
+    """
+
+    def _fill_text(self, text, width, indent):
+        return ''.join(indent + line for line in text.splitlines(keepends=True))
+
+
+class RawTextHelpFormatter(RawDescriptionHelpFormatter):
+    """Help message formatter which retains formatting of all help text.
+
+    Only the name of this class is considered a public API. All the methods
+    provided by the class are considered an implementation detail.
+    """
+
+    def _split_lines(self, text, width):
+        return text.splitlines()
+
+
+class ArgumentDefaultsHelpFormatter(HelpFormatter):
+    """Help message formatter which adds default values to argument help.
+
+    Only the name of this class is considered a public API. All the methods
+    provided by the class are considered an implementation detail.
+    """
+
+    def _get_help_string(self, action):
+        help = action.help
+        if '%(default)' not in action.help:
+            if action.default is not SUPPRESS:
+                defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
+                if action.option_strings or action.nargs in defaulting_nargs:
+                    help += ' (default: %(default)s)'
+        return help
+
+
+class MetavarTypeHelpFormatter(HelpFormatter):
+    """Help message formatter which uses the argument 'type' as the default
+    metavar value (instead of the argument 'dest')
+
+    Only the name of this class is considered a public API. All the methods
+    provided by the class are considered an implementation detail.
+    """
+
+    def _get_default_metavar_for_optional(self, action):
+        return action.type.__name__
+
+    def _get_default_metavar_for_positional(self, action):
+        return action.type.__name__
+
+
+
+# =====================
+# Options and Arguments
+# =====================
+
+def _get_action_name(argument):
+    if argument is None:
+        return None
+    elif argument.option_strings:
+        return  '/'.join(argument.option_strings)
+    elif argument.metavar not in (None, SUPPRESS):
+        return argument.metavar
+    elif argument.dest not in (None, SUPPRESS):
+        return argument.dest
+    else:
+        return None
+
+
+class ArgumentError(Exception):
+    """An error from creating or using an argument (optional or positional).
+
+    The string value of this exception is the message, augmented with
+    information about the argument that caused it.
+    """
+
+    def __init__(self, argument, message):
+        self.argument_name = _get_action_name(argument)
+        self.message = message
+
+    def __str__(self):
+        if self.argument_name is None:
+            format = '%(message)s'
+        else:
+            format = 'argument %(argument_name)s: %(message)s'
+        return format % dict(message=self.message,
+                             argument_name=self.argument_name)
+
+
+class ArgumentTypeError(Exception):
+    """An error from trying to convert a command line string to a type."""
+    pass
+
+
+# ==============
+# Action classes
+# ==============
+
+class Action(_AttributeHolder):
+    """Information about how to convert command line strings to Python objects.
+
+    Action objects are used by an ArgumentParser to represent the information
+    needed to parse a single argument from one or more strings from the
+    command line. The keyword arguments to the Action constructor are also
+    all attributes of Action instances.
+
+    Keyword Arguments:
+
+        - option_strings -- A list of command-line option strings which
+            should be associated with this action.
+
+        - dest -- The name of the attribute to hold the created object(s)
+
+        - nargs -- The number of command-line arguments that should be
+            consumed. By default, one argument will be consumed and a single
+            value will be produced.  Other values include:
+                - N (an integer) consumes N arguments (and produces a list)
+                - '?' consumes zero or one arguments
+                - '*' consumes zero or more arguments (and produces a list)
+                - '+' consumes one or more arguments (and produces a list)
+            Note that the difference between the default and nargs=1 is that
+            with the default, a single value will be produced, while with
+            nargs=1, a list containing a single value will be produced.
+
+        - const -- The value to be produced if the option is specified and the
+            option uses an action that takes no values.
+
+        - default -- The value to be produced if the option is not specified.
+
+        - type -- A callable that accepts a single string argument, and
+            returns the converted value.  The standard Python types str, int,
+            float, and complex are useful examples of such callables.  If None,
+            str is used.
+
+        - choices -- A container of values that should be allowed. If not None,
+            after a command-line argument has been converted to the appropriate
+            type, an exception will be raised if it is not a member of this
+            collection.
+
+        - required -- True if the action must always be specified at the
+            command line. This is only meaningful for optional command-line
+            arguments.
+
+        - help -- The help string describing the argument.
+
+        - metavar -- The name to be used for the option's argument with the
+            help string. If None, the 'dest' value will be used as the name.
+    """
+
+    def __init__(self,
+                 option_strings,
+                 dest,
+                 nargs=None,
+                 const=None,
+                 default=None,
+                 type=None,
+                 choices=None,
+                 required=False,
+                 help=None,
+                 metavar=None):
+        self.option_strings = option_strings
+        self.dest = dest
+        self.nargs = nargs
+        self.const = const
+        self.default = default
+        self.type = type
+        self.choices = choices
+        self.required = required
+        self.help = help
+        self.metavar = metavar
+
+    def _get_kwargs(self):
+        names = [
+            'option_strings',
+            'dest',
+            'nargs',
+            'const',
+            'default',
+            'type',
+            'choices',
+            'help',
+            'metavar',
+        ]
+        return [(name, getattr(self, name)) for name in names]
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        raise NotImplementedError(_('.__call__() not defined'))
+
+
+class _StoreAction(Action):
+
+    def __init__(self,
+                 option_strings,
+                 dest,
+                 nargs=None,
+                 const=None,
+                 default=None,
+                 type=None,
+                 choices=None,
+                 required=False,
+                 help=None,
+                 metavar=None):
+        if nargs == 0:
+            raise ValueError('nargs for store actions must be > 0; if you '
+                             'have nothing to store, actions such as store '
+                             'true or store const may be more appropriate')
+        if const is not None and nargs != OPTIONAL:
+            raise ValueError('nargs must be %r to supply const' % OPTIONAL)
+        super(_StoreAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            nargs=nargs,
+            const=const,
+            default=default,
+            type=type,
+            choices=choices,
+            required=required,
+            help=help,
+            metavar=metavar)
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        setattr(namespace, self.dest, values)
+
+
+class _StoreConstAction(Action):
+
+    def __init__(self,
+                 option_strings,
+                 dest,
+                 const,
+                 default=None,
+                 required=False,
+                 help=None,
+                 metavar=None):
+        super(_StoreConstAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            nargs=0,
+            const=const,
+            default=default,
+            required=required,
+            help=help)
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        setattr(namespace, self.dest, self.const)
+
+
+class _StoreTrueAction(_StoreConstAction):
+
+    def __init__(self,
+                 option_strings,
+                 dest,
+                 default=False,
+                 required=False,
+                 help=None):
+        super(_StoreTrueAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            const=True,
+            default=default,
+            required=required,
+            help=help)
+
+
+class _StoreFalseAction(_StoreConstAction):
+
+    def __init__(self,
+                 option_strings,
+                 dest,
+                 default=True,
+                 required=False,
+                 help=None):
+        super(_StoreFalseAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            const=False,
+            default=default,
+            required=required,
+            help=help)
+
+
+class _AppendAction(Action):
+
+    def __init__(self,
+                 option_strings,
+                 dest,
+                 nargs=None,
+                 const=None,
+                 default=None,
+                 type=None,
+                 choices=None,
+                 required=False,
+                 help=None,
+                 metavar=None):
+        if nargs == 0:
+            raise ValueError('nargs for append actions must be > 0; if arg '
+                             'strings are not supplying the value to append, '
+                             'the append const action may be more appropriate')
+        if const is not None and nargs != OPTIONAL:
+            raise ValueError('nargs must be %r to supply const' % OPTIONAL)
+        super(_AppendAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            nargs=nargs,
+            const=const,
+            default=default,
+            type=type,
+            choices=choices,
+            required=required,
+            help=help,
+            metavar=metavar)
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        items = _copy.copy(_ensure_value(namespace, self.dest, []))
+        items.append(values)
+        setattr(namespace, self.dest, items)
+
+
+class _AppendConstAction(Action):
+
+    def __init__(self,
+                 option_strings,
+                 dest,
+                 const,
+                 default=None,
+                 required=False,
+                 help=None,
+                 metavar=None):
+        super(_AppendConstAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            nargs=0,
+            const=const,
+            default=default,
+            required=required,
+            help=help,
+            metavar=metavar)
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        items = _copy.copy(_ensure_value(namespace, self.dest, []))
+        items.append(self.const)
+        setattr(namespace, self.dest, items)
+
+
+class _CountAction(Action):
+
+    def __init__(self,
+                 option_strings,
+                 dest,
+                 default=None,
+                 required=False,
+                 help=None):
+        super(_CountAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            nargs=0,
+            default=default,
+            required=required,
+            help=help)
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        new_count = _ensure_value(namespace, self.dest, 0) + 1
+        setattr(namespace, self.dest, new_count)
+
+
+class _HelpAction(Action):
+
+    def __init__(self,
+                 option_strings,
+                 dest=SUPPRESS,
+                 default=SUPPRESS,
+                 help=None):
+        super(_HelpAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            default=default,
+            nargs=0,
+            help=help)
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        parser.print_help()
+        parser.exit()
+
+
+class _VersionAction(Action):
+
+    def __init__(self,
+                 option_strings,
+                 version=None,
+                 dest=SUPPRESS,
+                 default=SUPPRESS,
+                 help="show program's version number and exit"):
+        super(_VersionAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            default=default,
+            nargs=0,
+            help=help)
+        self.version = version
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        version = self.version
+        if version is None:
+            version = parser.version
+        formatter = parser._get_formatter()
+        formatter.add_text(version)
+        parser.exit(message=formatter.format_help())
+
+
+class _SubParsersAction(Action):
+
+    class _ChoicesPseudoAction(Action):
+
+        def __init__(self, name, aliases, help):
+            metavar = dest = name
+            if aliases:
+                metavar += ' (%s)' % ', '.join(aliases)
+            sup = super(_SubParsersAction._ChoicesPseudoAction, self)
+            sup.__init__(option_strings=[], dest=dest, help=help,
+                         metavar=metavar)
+
+    def __init__(self,
+                 option_strings,
+                 prog,
+                 parser_class,
+                 dest=SUPPRESS,
+                 help=None,
+                 metavar=None):
+
+        self._prog_prefix = prog
+        self._parser_class = parser_class
+        self._name_parser_map = _collections.OrderedDict()
+        self._choices_actions = []
+
+        super(_SubParsersAction, self).__init__(
+            option_strings=option_strings,
+            dest=dest,
+            nargs=PARSER,
+            choices=self._name_parser_map,
+            help=help,
+            metavar=metavar)
+
+    def add_parser(self, name, **kwargs):
+        # set prog from the existing prefix
+        if kwargs.get('prog') is None:
+            kwargs['prog'] = '%s %s' % (self._prog_prefix, name)
+
+        aliases = kwargs.pop('aliases', ())
+
+        # create a pseudo-action to hold the choice help
+        if 'help' in kwargs:
+            help = kwargs.pop('help')
+            choice_action = self._ChoicesPseudoAction(name, aliases, help)
+            self._choices_actions.append(choice_action)
+
+        # create the parser and add it to the map
+        parser = self._parser_class(**kwargs)
+        self._name_parser_map[name] = parser
+
+        # make parser available under aliases also
+        for alias in aliases:
+            self._name_parser_map[alias] = parser
+
+        return parser
+
+    def _get_subactions(self):
+        return self._choices_actions
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        parser_name = values[0]
+        arg_strings = values[1:]
+
+        # set the parser name if requested
+        if self.dest is not SUPPRESS:
+            setattr(namespace, self.dest, parser_name)
+
+        # select the parser
+        try:
+            parser = self._name_parser_map[parser_name]
+        except KeyError:
+            args = {'parser_name': parser_name,
+                    'choices': ', '.join(self._name_parser_map)}
+            msg = _('unknown parser %(parser_name)r (choices: %(choices)s)') % args
+            raise ArgumentError(self, msg)
+
+        # parse all the remaining options into the namespace
+        # store any unrecognized options on the object, so that the top
+        # level parser can decide what to do with them
+        namespace, arg_strings = parser.parse_known_args(arg_strings, namespace)
+        if arg_strings:
+            vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
+            getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)
+
+
+# ==============
+# Type classes
+# ==============
+
+class FileType(object):
+    """Factory for creating file object types
+
+    Instances of FileType are typically passed as type= arguments to the
+    ArgumentParser add_argument() method.
+
+    Keyword Arguments:
+        - mode -- A string indicating how the file is to be opened. Accepts the
+            same values as the builtin open() function.
+        - bufsize -- The file's desired buffer size. Accepts the same values as
+            the builtin open() function.
+    """
+
+    def __init__(self, mode='r', bufsize=-1):
+        self._mode = mode
+        self._bufsize = bufsize
+
+    def __call__(self, string):
+        # the special argument "-" means sys.std{in,out}
+        if string == '-':
+            if 'r' in self._mode:
+                return _sys.stdin
+            elif 'w' in self._mode:
+                return _sys.stdout
+            else:
+                msg = _('argument "-" with mode %r') % self._mode
+                raise ValueError(msg)
+
+        # all other arguments are used as file names
+        try:
+            return open(string, self._mode, self._bufsize)
+        except IOError as e:
+            message = _("can't open '%s': %s")
+            raise ArgumentTypeError(message % (string, e))
+
+    def __repr__(self):
+        args = self._mode, self._bufsize
+        args_str = ', '.join(repr(arg) for arg in args if arg != -1)
+        return '%s(%s)' % (type(self).__name__, args_str)
+
+# ===========================
+# Optional and Positional Parsing
+# ===========================
+
+class Namespace(_AttributeHolder):
+    """Simple object for storing attributes.
+
+    Implements equality by attribute names and values, and provides a simple
+    string representation.
+    """
+
+    def __init__(self, **kwargs):
+        for name in kwargs:
+            setattr(self, name, kwargs[name])
+
+    def __eq__(self, other):
+        return vars(self) == vars(other)
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    def __contains__(self, key):
+        return key in self.__dict__
+
+
+class _ActionsContainer(object):
+
+    def __init__(self,
+                 description,
+                 prefix_chars,
+                 argument_default,
+                 conflict_handler):
+        super(_ActionsContainer, self).__init__()
+
+        self.description = description
+        self.argument_default = argument_default
+        self.prefix_chars = prefix_chars
+        self.conflict_handler = conflict_handler
+
+        # set up registries
+        self._registries = {}
+
+        # register actions
+        self.register('action', None, _StoreAction)
+        self.register('action', 'store', _StoreAction)
+        self.register('action', 'store_const', _StoreConstAction)
+        self.register('action', 'store_true', _StoreTrueAction)
+        self.register('action', 'store_false', _StoreFalseAction)
+        self.register('action', 'append', _AppendAction)
+        self.register('action', 'append_const', _AppendConstAction)
+        self.register('action', 'count', _CountAction)
+        self.register('action', 'help', _HelpAction)
+        self.register('action', 'version', _VersionAction)
+        self.register('action', 'parsers', _SubParsersAction)
+
+        # raise an exception if the conflict handler is invalid
+        self._get_handler()
+
+        # action storage
+        self._actions = []
+        self._option_string_actions = {}
+
+        # groups
+        self._action_groups = []
+        self._mutually_exclusive_groups = []
+
+        # defaults storage
+        self._defaults = {}
+
+        # determines whether an "option" looks like a negative number
+        self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$')
+
+        # whether or not there are any optionals that look like negative
+        # numbers -- uses a list so it can be shared and edited
+        self._has_negative_number_optionals = []
+
+    # ====================
+    # Registration methods
+    # ====================
+    def register(self, registry_name, value, object):
+        registry = self._registries.setdefault(registry_name, {})
+        registry[value] = object
+
+    def _registry_get(self, registry_name, value, default=None):
+        return self._registries[registry_name].get(value, default)
+
+    # ==================================
+    # Namespace default accessor methods
+    # ==================================
+    def set_defaults(self, **kwargs):
+        self._defaults.update(kwargs)
+
+        # if these defaults match any existing arguments, replace
+        # the previous default on the object with the new one
+        for action in self._actions:
+            if action.dest in kwargs:
+                action.default = kwargs[action.dest]
+
+    def get_default(self, dest):
+        for action in self._actions:
+            if action.dest == dest and action.default is not None:
+                return action.default
+        return self._defaults.get(dest, None)
+
+
+    # =======================
+    # Adding argument actions
+    # =======================
+    def add_argument(self, *args, **kwargs):
+        """
+        add_argument(dest, ..., name=value, ...)
+        add_argument(option_string, option_string, ..., name=value, ...)
+        """
+
+        # if no positional args are supplied or only one is supplied and
+        # it doesn't look like an option string, parse a positional
+        # argument
+        chars = self.prefix_chars
+        if not args or len(args) == 1 and args[0][0] not in chars:
+            if args and 'dest' in kwargs:
+                raise ValueError('dest supplied twice for positional argument')
+            kwargs = self._get_positional_kwargs(*args, **kwargs)
+
+        # otherwise, we're adding an optional argument
+        else:
+            kwargs = self._get_optional_kwargs(*args, **kwargs)
+
+        # if no default was supplied, use the parser-level default
+        if 'default' not in kwargs:
+            dest = kwargs['dest']
+            if dest in self._defaults:
+                kwargs['default'] = self._defaults[dest]
+            elif self.argument_default is not None:
+                kwargs['default'] = self.argument_default
+
+        # create the action object, and add it to the parser
+        action_class = self._pop_action_class(kwargs)
+        if not callable(action_class):
+            raise ValueError('unknown action "%s"' % (action_class,))
+        action = action_class(**kwargs)
+
+        # raise an error if the action type is not callable
+        type_func = self._registry_get('type', action.type, action.type)
+        if not callable(type_func):
+            raise ValueError('%r is not callable' % (type_func,))
+
+        # raise an error if the metavar does not match the type
+        if hasattr(self, "_get_formatter"):
+            try:
+                self._get_formatter()._format_args(action, None)
+            except TypeError:
+                raise ValueError("length of metavar tuple does not match nargs")
+
+        return self._add_action(action)
+
+    def add_argument_group(self, *args, **kwargs):
+        group = _ArgumentGroup(self, *args, **kwargs)
+        self._action_groups.append(group)
+        return group
+
+    def add_mutually_exclusive_group(self, **kwargs):
+        group = _MutuallyExclusiveGroup(self, **kwargs)
+        self._mutually_exclusive_groups.append(group)
+        return group
+
+    def _add_action(self, action):
+        # resolve any conflicts
+        self._check_conflict(action)
+
+        # add to actions list
+        self._actions.append(action)
+        action.container = self
+
+        # index the action by any option strings it has
+        for option_string in action.option_strings:
+            self._option_string_actions[option_string] = action
+
+        # set the flag if any option strings look like negative numbers
+        for option_string in action.option_strings:
+            if self._negative_number_matcher.match(option_string):
+                if not self._has_negative_number_optionals:
+                    self._has_negative_number_optionals.append(True)
+
+        # return the created action
+        return action
+
+    def _remove_action(self, action):
+        self._actions.remove(action)
+
+    def _add_container_actions(self, container):
+        # collect groups by titles
+        title_group_map = {}
+        for group in self._action_groups:
+            if group.title in title_group_map:
+                msg = _('cannot merge actions - two groups are named %r')
+                raise ValueError(msg % (group.title))
+            title_group_map[group.title] = group
+
+        # map each action to its group
+        group_map = {}
+        for group in container._action_groups:
+
+            # if a group with the title exists, use that, otherwise
+            # create a new group matching the container's group
+            if group.title not in title_group_map:
+                title_group_map[group.title] = self.add_argument_group(
+                    title=group.title,
+                    description=group.description,
+                    conflict_handler=group.conflict_handler)
+
+            # map the actions to their new group
+            for action in group._group_actions:
+                group_map[action] = title_group_map[group.title]
+
+        # add container's mutually exclusive groups
+        # NOTE: if add_mutually_exclusive_group ever gains title= and
+        # description= then this code will need to be expanded as above
+        for group in container._mutually_exclusive_groups:
+            mutex_group = self.add_mutually_exclusive_group(
+                required=group.required)
+
+            # map the actions to their new mutex group
+            for action in group._group_actions:
+                group_map[action] = mutex_group
+
+        # add all actions to this container or their group
+        for action in container._actions:
+            group_map.get(action, self)._add_action(action)
+
+    def _get_positional_kwargs(self, dest, **kwargs):
+        # make sure required is not specified
+        if 'required' in kwargs:
+            msg = _("'required' is an invalid argument for positionals")
+            raise TypeError(msg)
+
+        # mark positional arguments as required if at least one is
+        # always required
+        if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]:
+            kwargs['required'] = True
+        if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs:
+            kwargs['required'] = True
+
+        # return the keyword arguments with no option strings
+        return dict(kwargs, dest=dest, option_strings=[])
+
+    def _get_optional_kwargs(self, *args, **kwargs):
+        # determine short and long option strings
+        option_strings = []
+        long_option_strings = []
+        for option_string in args:
+            # error on strings that don't start with an appropriate prefix
+            if not option_string[0] in self.prefix_chars:
+                args = {'option': option_string,
+                        'prefix_chars': self.prefix_chars}
+                msg = _('invalid option string %(option)r: '
+                        'must start with a character %(prefix_chars)r')
+                raise ValueError(msg % args)
+
+            # strings starting with two prefix characters are long options
+            option_strings.append(option_string)
+            if option_string[0] in self.prefix_chars:
+                if len(option_string) > 1:
+                    if option_string[1] in self.prefix_chars:
+                        long_option_strings.append(option_string)
+
+        # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
+        dest = kwargs.pop('dest', None)
+        if dest is None:
+            if long_option_strings:
+                dest_option_string = long_option_strings[0]
+            else:
+                dest_option_string = option_strings[0]
+            dest = dest_option_string.lstrip(self.prefix_chars)
+            if not dest:
+                msg = _('dest= is required for options like %r')
+                raise ValueError(msg % option_string)
+            dest = dest.replace('-', '_')
+
+        # return the updated keyword arguments
+        return dict(kwargs, dest=dest, option_strings=option_strings)
+
+    def _pop_action_class(self, kwargs, default=None):
+        action = kwargs.pop('action', default)
+        return self._registry_get('action', action, action)
+
+    def _get_handler(self):
+        # determine function from conflict handler string
+        handler_func_name = '_handle_conflict_%s' % self.conflict_handler
+        try:
+            return getattr(self, handler_func_name)
+        except AttributeError:
+            msg = _('invalid conflict_resolution value: %r')
+            raise ValueError(msg % self.conflict_handler)
+
+    def _check_conflict(self, action):
+
+        # find all options that conflict with this option
+        confl_optionals = []
+        for option_string in action.option_strings:
+            if option_string in self._option_string_actions:
+                confl_optional = self._option_string_actions[option_string]
+                confl_optionals.append((option_string, confl_optional))
+
+        # resolve any conflicts
+        if confl_optionals:
+            conflict_handler = self._get_handler()
+            conflict_handler(action, confl_optionals)
+
+    def _handle_conflict_error(self, action, conflicting_actions):
+        message = ngettext('conflicting option string: %s',
+                           'conflicting option strings: %s',
+                           len(conflicting_actions))
+        conflict_string = ', '.join([option_string
+                                     for option_string, action
+                                     in conflicting_actions])
+        raise ArgumentError(action, message % conflict_string)
+
+    def _handle_conflict_resolve(self, action, conflicting_actions):
+
+        # remove all conflicting options
+        for option_string, action in conflicting_actions:
+
+            # remove the conflicting option
+            action.option_strings.remove(option_string)
+            self._option_string_actions.pop(option_string, None)
+
+            # if the option now has no option string, remove it from the
+            # container holding it
+            if not action.option_strings:
+                action.container._remove_action(action)
+
+
+class _ArgumentGroup(_ActionsContainer):
+
+    def __init__(self, container, title=None, description=None, **kwargs):
+        # add any missing keyword arguments by checking the container
+        update = kwargs.setdefault
+        update('conflict_handler', container.conflict_handler)
+        update('prefix_chars', container.prefix_chars)
+        update('argument_default', container.argument_default)
+        super_init = super(_ArgumentGroup, self).__init__
+        super_init(description=description, **kwargs)
+
+        # group attributes
+        self.title = title
+        self._group_actions = []
+
+        # share most attributes with the container
+        self._registries = container._registries
+        self._actions = container._actions
+        self._option_string_actions = container._option_string_actions
+        self._defaults = container._defaults
+        self._has_negative_number_optionals = \
+            container._has_negative_number_optionals
+        self._mutually_exclusive_groups = container._mutually_exclusive_groups
+
+    def _add_action(self, action):
+        action = super(_ArgumentGroup, self)._add_action(action)
+        self._group_actions.append(action)
+        return action
+
+    def _remove_action(self, action):
+        super(_ArgumentGroup, self)._remove_action(action)
+        self._group_actions.remove(action)
+
+
+class _MutuallyExclusiveGroup(_ArgumentGroup):
+
+    def __init__(self, container, required=False):
+        super(_MutuallyExclusiveGroup, self).__init__(container)
+        self.required = required
+        self._container = container
+
+    def _add_action(self, action):
+        if action.required:
+            msg = _('mutually exclusive arguments must be optional')
+            raise ValueError(msg)
+        action = self._container._add_action(action)
+        self._group_actions.append(action)
+        return action
+
+    def _remove_action(self, action):
+        self._container._remove_action(action)
+        self._group_actions.remove(action)
+
+
+class ArgumentParser(_AttributeHolder, _ActionsContainer):
+    """Object for parsing command line strings into Python objects.
+
+    Keyword Arguments:
+        - prog -- The name of the program (default: sys.argv[0])
+        - usage -- A usage message (default: auto-generated from arguments)
+        - description -- A description of what the program does
+        - epilog -- Text following the argument descriptions
+        - parents -- Parsers whose arguments should be copied into this one
+        - formatter_class -- HelpFormatter class for printing help messages
+        - prefix_chars -- Characters that prefix optional arguments
+        - fromfile_prefix_chars -- Characters that prefix files containing
+            additional arguments
+        - argument_default -- The default value for all arguments
+        - conflict_handler -- String indicating how to handle conflicts
+        - add_help -- Add a -h/-help option
+    """
+
+    def __init__(self,
+                 prog=None,
+                 usage=None,
+                 description=None,
+                 epilog=None,
+                 parents=[],
+                 formatter_class=HelpFormatter,
+                 prefix_chars='-',
+                 fromfile_prefix_chars=None,
+                 argument_default=None,
+                 conflict_handler='error',
+                 add_help=True):
+
+        superinit = super(ArgumentParser, self).__init__
+        superinit(description=description,
+                  prefix_chars=prefix_chars,
+                  argument_default=argument_default,
+                  conflict_handler=conflict_handler)
+
+        # default setting for prog
+        if prog is None:
+            prog = _os.path.basename(_sys.argv[0])
+
+        self.prog = prog
+        self.usage = usage
+        self.epilog = epilog
+        self.formatter_class = formatter_class
+        self.fromfile_prefix_chars = fromfile_prefix_chars
+        self.add_help = add_help
+
+        add_group = self.add_argument_group
+        self._positionals = add_group(_('positional arguments'))
+        self._optionals = add_group(_('optional arguments'))
+        self._subparsers = None
+
+        # register types
+        def identity(string):
+            return string
+        self.register('type', None, identity)
+
+        # add help argument if necessary
+        # (using explicit default to override global argument_default)
+        default_prefix = '-' if '-' in prefix_chars else prefix_chars[0]
+        if self.add_help:
+            self.add_argument(
+                default_prefix+'h', default_prefix*2+'help',
+                action='help', default=SUPPRESS,
+                help=_('show this help message and exit'))
+
+        # add parent arguments and defaults
+        for parent in parents:
+            self._add_container_actions(parent)
+            try:
+                defaults = parent._defaults
+            except AttributeError:
+                pass
+            else:
+                self._defaults.update(defaults)
+
+    # =======================
+    # Pretty __repr__ methods
+    # =======================
+    def _get_kwargs(self):
+        names = [
+            'prog',
+            'usage',
+            'description',
+            'formatter_class',
+            'conflict_handler',
+            'add_help',
+        ]
+        return [(name, getattr(self, name)) for name in names]
+
+    # ==================================
+    # Optional/Positional adding methods
+    # ==================================
+    def add_subparsers(self, **kwargs):
+        if self._subparsers is not None:
+            self.error(_('cannot have multiple subparser arguments'))
+
+        # add the parser class to the arguments if it's not present
+        kwargs.setdefault('parser_class', type(self))
+
+        if 'title' in kwargs or 'description' in kwargs:
+            title = _(kwargs.pop('title', 'subcommands'))
+            description = _(kwargs.pop('description', None))
+            self._subparsers = self.add_argument_group(title, description)
+        else:
+            self._subparsers = self._positionals
+
+        # prog defaults to the usage message of this parser, skipping
+        # optional arguments and with no "usage:" prefix
+        if kwargs.get('prog') is None:
+            formatter = self._get_formatter()
+            positionals = self._get_positional_actions()
+            groups = self._mutually_exclusive_groups
+            formatter.add_usage(self.usage, positionals, groups, '')
+            kwargs['prog'] = formatter.format_help().strip()
+
+        # create the parsers action and add it to the positionals list
+        parsers_class = self._pop_action_class(kwargs, 'parsers')
+        action = parsers_class(option_strings=[], **kwargs)
+        self._subparsers._add_action(action)
+
+        # return the created parsers action
+        return action
+
+    def _add_action(self, action):
+        if action.option_strings:
+            self._optionals._add_action(action)
+        else:
+            self._positionals._add_action(action)
+        return action
+
+    def _get_optional_actions(self):
+        return [action
+                for action in self._actions
+                if action.option_strings]
+
+    def _get_positional_actions(self):
+        return [action
+                for action in self._actions
+                if not action.option_strings]
+
+    # =====================================
+    # Command line argument parsing methods
+    # =====================================
+    def parse_args(self, args=None, namespace=None):
+        args, argv = self.parse_known_args(args, namespace)
+        if argv:
+            msg = _('unrecognized arguments: %s')
+            self.error(msg % ' '.join(argv))
+        return args
+
+    def parse_known_args(self, args=None, namespace=None):
+        if args is None:
+            # args default to the system args
+            args = _sys.argv[1:]
+        else:
+            # make sure that args are mutable
+            args = list(args)
+
+        # default Namespace built from parser defaults
+        if namespace is None:
+            namespace = Namespace()
+
+        # add any action defaults that aren't present
+        for action in self._actions:
+            if action.dest is not SUPPRESS:
+                if not hasattr(namespace, action.dest):
+                    if action.default is not SUPPRESS:
+                        setattr(namespace, action.dest, action.default)
+
+        # add any parser defaults that aren't present
+        for dest in self._defaults:
+            if not hasattr(namespace, dest):
+                setattr(namespace, dest, self._defaults[dest])
+
+        # parse the arguments and exit if there are any errors
+        try:
+            namespace, args = self._parse_known_args(args, namespace)
+            if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
+                args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
+                delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
+            return namespace, args
+        except ArgumentError:
+            err = _sys.exc_info()[1]
+            self.error(str(err))
+
+    def _parse_known_args(self, arg_strings, namespace):
+        # replace arg strings that are file references
+        if self.fromfile_prefix_chars is not None:
+            arg_strings = self._read_args_from_files(arg_strings)
+
+        # map all mutually exclusive arguments to the other arguments
+        # they can't occur with
+        action_conflicts = {}
+        for mutex_group in self._mutually_exclusive_groups:
+            group_actions = mutex_group._group_actions
+            for i, mutex_action in enumerate(mutex_group._group_actions):
+                conflicts = action_conflicts.setdefault(mutex_action, [])
+                conflicts.extend(group_actions[:i])
+                conflicts.extend(group_actions[i + 1:])
+
+        # find all option indices, and determine the arg_string_pattern
+        # which has an 'O' if there is an option at an index,
+        # an 'A' if there is an argument, or a '-' if there is a '--'
+        option_string_indices = {}
+        arg_string_pattern_parts = []
+        arg_strings_iter = iter(arg_strings)
+        for i, arg_string in enumerate(arg_strings_iter):
+
+            # all args after -- are non-options
+            if arg_string == '--':
+                arg_string_pattern_parts.append('-')
+                for arg_string in arg_strings_iter:
+                    arg_string_pattern_parts.append('A')
+
+            # otherwise, add the arg to the arg strings
+            # and note the index if it was an option
+            else:
+                option_tuple = self._parse_optional(arg_string)
+                if option_tuple is None:
+                    pattern = 'A'
+                else:
+                    option_string_indices[i] = option_tuple
+                    pattern = 'O'
+                arg_string_pattern_parts.append(pattern)
+
+        # join the pieces together to form the pattern
+        arg_strings_pattern = ''.join(arg_string_pattern_parts)
+
+        # converts arg strings to the appropriate and then takes the action
+        seen_actions = set()
+        seen_non_default_actions = set()
+
+        def take_action(action, argument_strings, option_string=None):
+            seen_actions.add(action)
+            argument_values = self._get_values(action, argument_strings)
+
+            # error if this argument is not allowed with other previously
+            # seen arguments, assuming that actions that use the default
+            # value don't really count as "present"
+            if argument_values is not action.default:
+                seen_non_default_actions.add(action)
+                for conflict_action in action_conflicts.get(action, []):
+                    if conflict_action in seen_non_default_actions:
+                        msg = _('not allowed with argument %s')
+                        action_name = _get_action_name(conflict_action)
+                        raise ArgumentError(action, msg % action_name)
+
+            # take the action if we didn't receive a SUPPRESS value
+            # (e.g. from a default)
+            if argument_values is not SUPPRESS:
+                action(self, namespace, argument_values, option_string)
+
+        # function to convert arg_strings into an optional action
+        def consume_optional(start_index):
+
+            # get the optional identified at this index
+            option_tuple = option_string_indices[start_index]
+            action, option_string, explicit_arg = option_tuple
+
+            # identify additional optionals in the same arg string
+            # (e.g. -xyz is the same as -x -y -z if no args are required)
+            match_argument = self._match_argument
+            action_tuples = []
+            while True:
+
+                # if we found no optional action, skip it
+                if action is None:
+                    extras.append(arg_strings[start_index])
+                    return start_index + 1
+
+                # if there is an explicit argument, try to match the
+                # optional's string arguments to only this
+                if explicit_arg is not None:
+                    arg_count = match_argument(action, 'A')
+
+                    # if the action is a single-dash option and takes no
+                    # arguments, try to parse more single-dash options out
+                    # of the tail of the option string
+                    chars = self.prefix_chars
+                    if arg_count == 0 and option_string[1] not in chars:
+                        action_tuples.append((action, [], option_string))
+                        char = option_string[0]
+                        option_string = char + explicit_arg[0]
+                        new_explicit_arg = explicit_arg[1:] or None
+                        optionals_map = self._option_string_actions
+                        if option_string in optionals_map:
+                            action = optionals_map[option_string]
+                            explicit_arg = new_explicit_arg
+                        else:
+                            msg = _('ignored explicit argument %r')
+                            raise ArgumentError(action, msg % explicit_arg)
+
+                    # if the action expect exactly one argument, we've
+                    # successfully matched the option; exit the loop
+                    elif arg_count == 1:
+                        stop = start_index + 1
+                        args = [explicit_arg]
+                        action_tuples.append((action, args, option_string))
+                        break
+
+                    # error if a double-dash option did not use the
+                    # explicit argument
+                    else:
+                        msg = _('ignored explicit argument %r')
+                        raise ArgumentError(action, msg % explicit_arg)
+
+                # if there is no explicit argument, try to match the
+                # optional's string arguments with the following strings
+                # if successful, exit the loop
+                else:
+                    start = start_index + 1
+                    selected_patterns = arg_strings_pattern[start:]
+                    arg_count = match_argument(action, selected_patterns)
+                    stop = start + arg_count
+                    args = arg_strings[start:stop]
+                    action_tuples.append((action, args, option_string))
+                    break
+
+            # add the Optional to the list and return the index at which
+            # the Optional's string args stopped
+            assert action_tuples
+            for action, args, option_string in action_tuples:
+                take_action(action, args, option_string)
+            return stop
+
+        # the list of Positionals left to be parsed; this is modified
+        # by consume_positionals()
+        positionals = self._get_positional_actions()
+
+        # function to convert arg_strings into positional actions
+        def consume_positionals(start_index):
+            # match as many Positionals as possible
+            match_partial = self._match_arguments_partial
+            selected_pattern = arg_strings_pattern[start_index:]
+            arg_counts = match_partial(positionals, selected_pattern)
+
+            # slice off the appropriate arg strings for each Positional
+            # and add the Positional and its args to the list
+            for action, arg_count in zip(positionals, arg_counts):
+                args = arg_strings[start_index: start_index + arg_count]
+                start_index += arg_count
+                take_action(action, args)
+
+            # slice off the Positionals that we just parsed and return the
+            # index at which the Positionals' string args stopped
+            positionals[:] = positionals[len(arg_counts):]
+            return start_index
+
+        # consume Positionals and Optionals alternately, until we have
+        # passed the last option string
+        extras = []
+        start_index = 0
+        if option_string_indices:
+            max_option_string_index = max(option_string_indices)
+        else:
+            max_option_string_index = -1
+        while start_index <= max_option_string_index:
+
+            # consume any Positionals preceding the next option
+            next_option_string_index = min([
+                index
+                for index in option_string_indices
+                if index >= start_index])
+            if start_index != next_option_string_index:
+                positionals_end_index = consume_positionals(start_index)
+
+                # only try to parse the next optional if we didn't consume
+                # the option string during the positionals parsing
+                if positionals_end_index > start_index:
+                    start_index = positionals_end_index
+                    continue
+                else:
+                    start_index = positionals_end_index
+
+            # if we consumed all the positionals we could and we're not
+            # at the index of an option string, there were extra arguments
+            if start_index not in option_string_indices:
+                strings = arg_strings[start_index:next_option_string_index]
+                extras.extend(strings)
+                start_index = next_option_string_index
+
+            # consume the next optional and any arguments for it
+            start_index = consume_optional(start_index)
+
+        # consume any positionals following the last Optional
+        stop_index = consume_positionals(start_index)
+
+        # if we didn't consume all the argument strings, there were extras
+        extras.extend(arg_strings[stop_index:])
+
+        # make sure all required actions were present and also convert
+        # action defaults which were not given as arguments
+        required_actions = []
+        for action in self._actions:
+            if action not in seen_actions:
+                if action.required:
+                    required_actions.append(_get_action_name(action))
+                else:
+                    # Convert action default now instead of doing it before
+                    # parsing arguments to avoid calling convert functions
+                    # twice (which may fail) if the argument was given, but
+                    # only if it was defined already in the namespace
+                    if (action.default is not None and
+                        isinstance(action.default, str) and
+                        hasattr(namespace, action.dest) and
+                        action.default is getattr(namespace, action.dest)):
+                        setattr(namespace, action.dest,
+                                self._get_value(action, action.default))
+
+        if required_actions:
+            self.error(_('the following arguments are required: %s') %
+                       ', '.join(required_actions))
+
+        # make sure all required groups had one option present
+        for group in self._mutually_exclusive_groups:
+            if group.required:
+                for action in group._group_actions:
+                    if action in seen_non_default_actions:
+                        break
+
+                # if no actions were used, report the error
+                else:
+                    names = [_get_action_name(action)
+                             for action in group._group_actions
+                             if action.help is not SUPPRESS]
+                    msg = _('one of the arguments %s is required')
+                    self.error(msg % ' '.join(names))
+
+        # return the updated namespace and the extra arguments
+        return namespace, extras
+
+    def _read_args_from_files(self, arg_strings):
+        # expand arguments referencing files
+        new_arg_strings = []
+        for arg_string in arg_strings:
+
+            # for regular arguments, just add them back into the list
+            if not arg_string or arg_string[0] not in self.fromfile_prefix_chars:
+                new_arg_strings.append(arg_string)
+
+            # replace arguments referencing files with the file content
+            else:
+                try:
+                    args_file = open(arg_string[1:])
+                    try:
+                        arg_strings = []
+                        for arg_line in args_file.read().splitlines():
+                            for arg in self.convert_arg_line_to_args(arg_line):
+                                arg_strings.append(arg)
+                        arg_strings = self._read_args_from_files(arg_strings)
+                        new_arg_strings.extend(arg_strings)
+                    finally:
+                        args_file.close()
+                except IOError:
+                    err = _sys.exc_info()[1]
+                    self.error(str(err))
+
+        # return the modified argument list
+        return new_arg_strings
+
+    def convert_arg_line_to_args(self, arg_line):
+        return [arg_line]
+
+    def _match_argument(self, action, arg_strings_pattern):
+        # match the pattern for this action to the arg strings
+        nargs_pattern = self._get_nargs_pattern(action)
+        match = _re.match(nargs_pattern, arg_strings_pattern)
+
+        # raise an exception if we weren't able to find a match
+        if match is None:
+            nargs_errors = {
+                None: _('expected one argument'),
+                OPTIONAL: _('expected at most one argument'),
+                ONE_OR_MORE: _('expected at least one argument'),
+            }
+            default = ngettext('expected %s argument',
+                               'expected %s arguments',
+                               action.nargs) % action.nargs
+            msg = nargs_errors.get(action.nargs, default)
+            raise ArgumentError(action, msg)
+
+        # return the number of arguments matched
+        return len(match.group(1))
+
+    def _match_arguments_partial(self, actions, arg_strings_pattern):
+        # progressively shorten the actions list by slicing off the
+        # final actions until we find a match
+        result = []
+        for i in range(len(actions), 0, -1):
+            actions_slice = actions[:i]
+            pattern = ''.join([self._get_nargs_pattern(action)
+                               for action in actions_slice])
+            match = _re.match(pattern, arg_strings_pattern)
+            if match is not None:
+                result.extend([len(string) for string in match.groups()])
+                break
+
+        # return the list of arg string counts
+        return result
+
+    def _parse_optional(self, arg_string):
+        # if it's an empty string, it was meant to be a positional
+        if not arg_string:
+            return None
+
+        # if it doesn't start with a prefix, it was meant to be positional
+        if not arg_string[0] in self.prefix_chars:
+            return None
+
+        # if the option string is present in the parser, return the action
+        if arg_string in self._option_string_actions:
+            action = self._option_string_actions[arg_string]
+            return action, arg_string, None
+
+        # if it's just a single character, it was meant to be positional
+        if len(arg_string) == 1:
+            return None
+
+        # if the option string before the "=" is present, return the action
+        if '=' in arg_string:
+            option_string, explicit_arg = arg_string.split('=', 1)
+            if option_string in self._option_string_actions:
+                action = self._option_string_actions[option_string]
+                return action, option_string, explicit_arg
+
+        # search through all possible prefixes of the option string
+        # and all actions in the parser for possible interpretations
+        option_tuples = self._get_option_tuples(arg_string)
+
+        # if multiple actions match, the option string was ambiguous
+        if len(option_tuples) > 1:
+            options = ', '.join([option_string
+                for action, option_string, explicit_arg in option_tuples])
+            args = {'option': arg_string, 'matches': options}
+            msg = _('ambiguous option: %(option)s could match %(matches)s')
+            self.error(msg % args)
+
+        # if exactly one action matched, this segmentation is good,
+        # so return the parsed action
+        elif len(option_tuples) == 1:
+            option_tuple, = option_tuples
+            return option_tuple
+
+        # if it was not found as an option, but it looks like a negative
+        # number, it was meant to be positional
+        # unless there are negative-number-like options
+        if self._negative_number_matcher.match(arg_string):
+            if not self._has_negative_number_optionals:
+                return None
+
+        # if it contains a space, it was meant to be a positional
+        if ' ' in arg_string:
+            return None
+
+        # it was meant to be an optional but there is no such option
+        # in this parser (though it might be a valid option in a subparser)
+        return None, arg_string, None
+
+    def _get_option_tuples(self, option_string):
+        result = []
+
+        # option strings starting with two prefix characters are only
+        # split at the '='
+        chars = self.prefix_chars
+        if option_string[0] in chars and option_string[1] in chars:
+            if '=' in option_string:
+                option_prefix, explicit_arg = option_string.split('=', 1)
+            else:
+                option_prefix = option_string
+                explicit_arg = None
+            for option_string in self._option_string_actions:
+                if option_string.startswith(option_prefix):
+                    action = self._option_string_actions[option_string]
+                    tup = action, option_string, explicit_arg
+                    result.append(tup)
+
+        # single character options can be concatenated with their arguments
+        # but multiple character options always have to have their argument
+        # separate
+        elif option_string[0] in chars and option_string[1] not in chars:
+            option_prefix = option_string
+            explicit_arg = None
+            short_option_prefix = option_string[:2]
+            short_explicit_arg = option_string[2:]
+
+            for option_string in self._option_string_actions:
+                if option_string == short_option_prefix:
+                    action = self._option_string_actions[option_string]
+                    tup = action, option_string, short_explicit_arg
+                    result.append(tup)
+                elif option_string.startswith(option_prefix):
+                    action = self._option_string_actions[option_string]
+                    tup = action, option_string, explicit_arg
+                    result.append(tup)
+
+        # shouldn't ever get here
+        else:
+            self.error(_('unexpected option string: %s') % option_string)
+
+        # return the collected option tuples
+        return result
+
+    def _get_nargs_pattern(self, action):
+        # in all examples below, we have to allow for '--' args
+        # which are represented as '-' in the pattern
+        nargs = action.nargs
+
+        # the default (None) is assumed to be a single argument
+        if nargs is None:
+            nargs_pattern = '(-*A-*)'
+
+        # allow zero or one arguments
+        elif nargs == OPTIONAL:
+            nargs_pattern = '(-*A?-*)'
+
+        # allow zero or more arguments
+        elif nargs == ZERO_OR_MORE:
+            nargs_pattern = '(-*[A-]*)'
+
+        # allow one or more arguments
+        elif nargs == ONE_OR_MORE:
+            nargs_pattern = '(-*A[A-]*)'
+
+        # allow any number of options or arguments
+        elif nargs == REMAINDER:
+            nargs_pattern = '([-AO]*)'
+
+        # allow one argument followed by any number of options or arguments
+        elif nargs == PARSER:
+            nargs_pattern = '(-*A[-AO]*)'
+
+        # all others should be integers
+        else:
+            nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
+
+        # if this is an optional action, -- is not allowed
+        if action.option_strings:
+            nargs_pattern = nargs_pattern.replace('-*', '')
+            nargs_pattern = nargs_pattern.replace('-', '')
+
+        # return the pattern
+        return nargs_pattern
+
+    # ========================
+    # Value conversion methods
+    # ========================
+    def _get_values(self, action, arg_strings):
+        # for everything but PARSER, REMAINDER args, strip out first '--'
+        if action.nargs not in [PARSER, REMAINDER]:
+            try:
+                arg_strings.remove('--')
+            except ValueError:
+                pass
+
+        # optional argument produces a default when not present
+        if not arg_strings and action.nargs == OPTIONAL:
+            if action.option_strings:
+                value = action.const
+            else:
+                value = action.default
+            if isinstance(value, str):
+                value = self._get_value(action, value)
+                self._check_value(action, value)
+
+        # when nargs='*' on a positional, if there were no command-line
+        # args, use the default if it is anything other than None
+        elif (not arg_strings and action.nargs == ZERO_OR_MORE and
+              not action.option_strings):
+            if action.default is not None:
+                value = action.default
+            else:
+                value = arg_strings
+            self._check_value(action, value)
+
+        # single argument or optional argument produces a single value
+        elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
+            arg_string, = arg_strings
+            value = self._get_value(action, arg_string)
+            self._check_value(action, value)
+
+        # REMAINDER arguments convert all values, checking none
+        elif action.nargs == REMAINDER:
+            value = [self._get_value(action, v) for v in arg_strings]
+
+        # PARSER arguments convert all values, but check only the first
+        elif action.nargs == PARSER:
+            value = [self._get_value(action, v) for v in arg_strings]
+            self._check_value(action, value[0])
+
+        # all other types of nargs produce a list
+        else:
+            value = [self._get_value(action, v) for v in arg_strings]
+            for v in value:
+                self._check_value(action, v)
+
+        # return the converted value
+        return value
+
+    def _get_value(self, action, arg_string):
+        type_func = self._registry_get('type', action.type, action.type)
+        if not callable(type_func):
+            msg = _('%r is not callable')
+            raise ArgumentError(action, msg % type_func)
+
+        # convert the value to the appropriate type
+        try:
+            result = type_func(arg_string)
+
+        # ArgumentTypeErrors indicate errors
+        except ArgumentTypeError:
+            name = getattr(action.type, '__name__', repr(action.type))
+            msg = str(_sys.exc_info()[1])
+            raise ArgumentError(action, msg)
+
+        # TypeErrors or ValueErrors also indicate errors
+        except (TypeError, ValueError):
+            name = getattr(action.type, '__name__', repr(action.type))
+            args = {'type': name, 'value': arg_string}
+            msg = _('invalid %(type)s value: %(value)r')
+            raise ArgumentError(action, msg % args)
+
+        # return the converted value
+        return result
+
+    def _check_value(self, action, value):
+        # converted value must be one of the choices (if specified)
+        if action.choices is not None and value not in action.choices:
+            args = {'value': value,
+                    'choices': ', '.join(map(repr, action.choices))}
+            msg = _('invalid choice: %(value)r (choose from %(choices)s)')
+            raise ArgumentError(action, msg % args)
+
+    # =======================
+    # Help-formatting methods
+    # =======================
+    def format_usage(self):
+        formatter = self._get_formatter()
+        formatter.add_usage(self.usage, self._actions,
+                            self._mutually_exclusive_groups)
+        return formatter.format_help()
+
+    def format_help(self):
+        formatter = self._get_formatter()
+
+        # usage
+        formatter.add_usage(self.usage, self._actions,
+                            self._mutually_exclusive_groups)
+
+        # description
+        formatter.add_text(self.description)
+
+        # positionals, optionals and user-defined groups
+        for action_group in self._action_groups:
+            formatter.start_section(action_group.title)
+            formatter.add_text(action_group.description)
+            formatter.add_arguments(action_group._group_actions)
+            formatter.end_section()
+
+        # epilog
+        formatter.add_text(self.epilog)
+
+        # determine help from format above
+        return formatter.format_help()
+
+    def _get_formatter(self):
+        return self.formatter_class(prog=self.prog)
+
+    # =====================
+    # Help-printing methods
+    # =====================
+    def print_usage(self, file=None):
+        if file is None:
+            file = _sys.stdout
+        self._print_message(self.format_usage(), file)
+
+    def print_help(self, file=None):
+        if file is None:
+            file = _sys.stdout
+        self._print_message(self.format_help(), file)
+
+    def _print_message(self, message, file=None):
+        if message:
+            if file is None:
+                file = _sys.stderr
+            file.write(message)
+
+    # ===============
+    # Exiting methods
+    # ===============
+    def exit(self, status=0, message=None):
+        if message:
+            self._print_message(message, _sys.stderr)
+        _sys.exit(status)
+
+    def error(self, message):
+        """error(message: string)
+
+        Prints a usage message incorporating the message to stderr and
+        exits.
+
+        If you override this in a subclass, it should not return -- it
+        should either exit or raise an exception.
+        """
+        self.print_usage(_sys.stderr)
+        args = {'prog': self.prog, 'message': message}
+        self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
diff --git a/lib/argparse.pyc b/lib/argparse.pyc
new file mode 100644
index 0000000..00dfd12
Binary files /dev/null and b/lib/argparse.pyc differ
diff --git a/lib/etree.py b/lib/etree.py
new file mode 100755
index 0000000..bc3930c
--- /dev/null
+++ b/lib/etree.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+
+try:
+  from lxml import et
+  lib = "lxml"
+except ImportError:
+  try:
+    # Python 2.5
+    import xml.etree.cElementTree as et
+    lib = "xml.etree.cElementTree"
+  except ImportError:
+    try:
+      # Python 2.5
+      import xml.etree.ElementTree as et
+      lib = "xml.etree.ElementTree"
+    except ImportError:
+      try:
+        # normal cElementTree install
+        import cElementTree as et
+        lib = "cElementTree"
+      except ImportError:
+        try:
+          # normal ElementTree install
+          import elementtree.ElementTree as et
+          lib = "ElementTree"
+        except ImportError:
+          print >> sys.stderr, ("Failed to import ElementTree from any known place")
+          
\ No newline at end of file
diff --git a/lib/etree.pyc b/lib/etree.pyc
new file mode 100644
index 0000000..a41bb3d
Binary files /dev/null and b/lib/etree.pyc differ
diff --git a/lib/isodate/__init__.py b/lib/isodate/__init__.py
new file mode 100755
index 0000000..7eccd3f
--- /dev/null
+++ b/lib/isodate/__init__.py
@@ -0,0 +1,55 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+'''
+Import all essential functions and constants to re-export them here for easy
+access.
+
+This module contains also various pre-defined ISO 8601 format strings. 
+'''
+from lib.isodate.isodates import parse_date, date_isoformat
+from lib.isodate.isotime import parse_time, time_isoformat
+from lib.isodate.isodatetime import parse_datetime, datetime_isoformat
+from lib.isodate.isoduration import parse_duration, duration_isoformat, Duration
+from lib.isodate.isoerror import ISO8601Error
+from lib.isodate.isotzinfo import parse_tzinfo, tz_isoformat
+from lib.isodate.tzinfo import UTC, FixedOffset, LOCAL
+from lib.isodate.duration import Duration
+from lib.isodate.isostrf import strftime
+from lib.isodate.isostrf import DATE_BAS_COMPLETE, DATE_BAS_ORD_COMPLETE
+from lib.isodate.isostrf import DATE_BAS_WEEK, DATE_BAS_WEEK_COMPLETE
+from lib.isodate.isostrf import DATE_CENTURY, DATE_EXT_COMPLETE
+from lib.isodate.isostrf import DATE_EXT_ORD_COMPLETE, DATE_EXT_WEEK
+from lib.isodate.isostrf import DATE_EXT_WEEK_COMPLETE, DATE_MONTH, DATE_YEAR
+from lib.isodate.isostrf import TIME_BAS_COMPLETE, TIME_BAS_MINUTE
+from lib.isodate.isostrf import TIME_EXT_COMPLETE, TIME_EXT_MINUTE
+from lib.isodate.isostrf import TIME_HOUR
+from lib.isodate.isostrf import TZ_BAS, TZ_EXT, TZ_HOUR
+from lib.isodate.isostrf import DT_BAS_COMPLETE, DT_EXT_COMPLETE
+from lib.isodate.isostrf import DT_BAS_ORD_COMPLETE, DT_EXT_ORD_COMPLETE
+from lib.isodate.isostrf import DT_BAS_WEEK_COMPLETE, DT_EXT_WEEK_COMPLETE
+from lib.isodate.isostrf import D_DEFAULT, D_WEEK, D_ALT_EXT, D_ALT_BAS
+from lib.isodate.isostrf import D_ALT_BAS_ORD, D_ALT_EXT_ORD
diff --git a/lib/isodate/__init__.pyc b/lib/isodate/__init__.pyc
new file mode 100644
index 0000000..859702e
Binary files /dev/null and b/lib/isodate/__init__.pyc differ
diff --git a/lib/isodate/duration.py b/lib/isodate/duration.py
new file mode 100755
index 0000000..b8ec98b
--- /dev/null
+++ b/lib/isodate/duration.py
@@ -0,0 +1,261 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+'''
+This module defines a Duration class.
+
+The class Duration allows to define durations in years and months and can be
+used as limited replacement for timedelta objects.
+'''
+from datetime import date, datetime, timedelta
+
+
+def fquotmod(val, low, high):
+    '''
+    A divmod function with boundaries.
+    '''
+    div, mod = divmod(val - low, high - low)
+    mod += low
+    return int(div), mod
+
+
+def max_days_in_month(year, month):
+    '''
+    Determines the number of days of a specific month in a specific year.
+    '''
+    if month in (1, 3, 5, 7, 8, 10, 12):
+        return 31
+    if month in (4, 6, 9, 11):
+        return 30
+    if ((year % 400) == 0) or ((year % 100) != 0) and ((year % 4) == 0):
+        return 29
+    return 28
+
+
+class Duration(object):
+    '''
+    A class which represents a duration.
+
+    The difference to datetime.timedelta is, that this class handles also
+    differences given in years and months.
+    A Duration treats differences given in year, months separately from all
+    other components.
+
+    A Duration can be used almost like any timedelta object, however there
+    are some restrictions:
+      * It is not really possible to compare Durations, because it is unclear,
+        whether a duration of 1 year is bigger than 365 days or not.
+      * Equality is only tested between the two (year, month vs. timedelta)
+        basic components.
+
+    A Duration can also be converted into a datetime object, but this requires
+    a start date or an end date.
+
+    The algorithm to add a duration to a date is defined at
+    http://www.w3.org/TR/xmlschema-2/#adding-durations-to-dateTimes
+    '''
+
+    def __init__(self, days=0, seconds=0, microseconds=0, milliseconds=0,
+                 minutes=0, hours=0, weeks=0, months=0, years=0):
+        '''
+        Initialise this Duration instance with the given parameters.
+        '''
+        self.months = months
+        self.years = years
+        self.tdelta = timedelta(days, seconds, microseconds, milliseconds,
+                                minutes, hours, weeks)
+
+    def __getattr__(self, name):
+        '''
+        Provide direct access to attributes of included timedelta instance.
+        '''
+        return getattr(self.tdelta, name)
+
+    def __str__(self):
+        '''
+        Return a string representation of this duration similar to timedelta.
+        '''
+        params = []
+        if self.years:
+            params.append('%d years' % self.years)
+        if self.months:
+            params.append('%d months' % self.months)
+        params.append(str(self.tdelta))
+        return ', '.join(params)
+
+    def __repr__(self):
+        '''
+        Return a string suitable for repr(x) calls.
+        '''
+        return "%s.%s(%d, %d, %d, years=%d, months=%d)" % (
+                self.__class__.__module__, self.__class__.__name__,
+                self.tdelta.days, self.tdelta.seconds,
+                self.tdelta.microseconds, self.years, self.months)
+
+    def __neg__(self):
+        """
+        A simple unary minus.
+
+        Returns a new Duration instance with all it's negated.
+        """
+        negduration = Duration(years=-self.years, months=-self.months)
+        negduration.tdelta = -self.tdelta
+        return negduration
+
+    def __add__(self, other):
+        '''
+        Durations can be added with Duration, timedelta, date and datetime
+        objects.
+        '''
+        if isinstance(other, timedelta):
+            newduration = Duration(years=self.years, months=self.months)
+            newduration.tdelta = self.tdelta + other
+            return newduration
+        if isinstance(other, Duration):
+            newduration = Duration(years=self.years + other.years,
+                                   months=self.months + other.months)
+            newduration.tdelta = self.tdelta + other.tdelta
+            return newduration
+        if isinstance(other, (date, datetime)):
+            newmonth = other.month + self.months
+            carry, newmonth = fquotmod(newmonth, 1, 13)
+            newyear = other.year + self.years + carry
+            maxdays = max_days_in_month(newyear, newmonth)
+            if other.day > maxdays:
+                newday = maxdays
+            else:
+                newday = other.day
+            newdt = other.replace(year=newyear, month=newmonth, day=newday)
+            return self.tdelta + newdt
+        raise TypeError('unsupported operand type(s) for +: %s and %s' %
+                        (self.__class__, other.__class__))
+
+    def __radd__(self, other):
+        '''
+        Add durations to timedelta, date and datetime objects.
+        '''
+        if isinstance(other, timedelta):
+            newduration = Duration(years=self.years, months=self.months)
+            newduration.tdelta = self.tdelta + other
+            return newduration
+        if isinstance(other, (date, datetime)):
+            newmonth = int(other.month + self.months)
+            carry, newmonth = fquotmod(newmonth, 1, 13)
+            newyear = int(other.year + self.years + carry)
+            maxdays = max_days_in_month(newyear, newmonth)
+            if other.day > maxdays:
+                newday = maxdays
+            else:
+                newday = other.day
+            newdt = other.replace(year=newyear, month=newmonth, day=newday)
+            return newdt + self.tdelta
+        raise TypeError('unsupported operand type(s) for +: %s and %s' %
+                        (other.__class__, self.__class__))
+
+    def __sub__(self, other):
+        '''
+        It is possible to subtract Duration and timedelta objects from Duration
+        objects.
+        '''
+        if isinstance(other, Duration):
+            newduration = Duration(years=self.years - other.years,
+                                   months=self.months - other.months)
+            newduration.tdelta = self.tdelta - other.tdelta
+            return newduration
+        if isinstance(other, timedelta):
+            newduration = Duration(years=self.years, months=self.months)
+            newduration.tdelta = self.tdelta - other
+            return newduration
+        raise TypeError('unsupported operand type(s) for -: %s and %s' %
+                        (self.__class__, other.__class__))
+
+    def __rsub__(self, other):
+        '''
+        It is possible to subtract Duration objecs from date, datetime and
+        timedelta objects.
+        '''
+        #print '__rsub__:', self, other
+        if isinstance(other, (date, datetime)):
+            newmonth = other.month - self.months
+            carry, newmonth = fquotmod(newmonth, 1, 13)
+            newyear = other.year - self.years + carry
+            maxdays = max_days_in_month(newyear, newmonth)
+            if other.day > maxdays:
+                newday = maxdays
+            else:
+                newday = other.day
+            newdt = other.replace(year=newyear, month=newmonth, day=newday)
+            return newdt - self.tdelta
+        if isinstance(other, timedelta):
+            tmpdur = Duration()
+            tmpdur.tdelta = other
+            return tmpdur - self
+        raise TypeError('unsupported operand type(s) for -: %s and %s' %
+                        (other.__class__, self.__class__))
+
+    def __eq__(self, other):
+        '''
+        If the years, month part and the timedelta part are both equal, then
+        the two Durations are considered equal.
+        '''
+        if (isinstance(other, timedelta) and
+            self.years == 0 and self.months == 0):
+            return self.tdelta == other
+        if not isinstance(other, Duration):
+            return NotImplemented
+        if ((self.years * 12 + self.months) ==
+            (other.years * 12 + other.months) and self.tdelta == other.tdelta):
+            return True
+        return False
+
+    def __ne__(self, other):
+        '''
+        If the years, month part or the timedelta part is not equal, then
+        the two Durations are considered not equal.
+        '''
+        if isinstance(other, timedelta) and self.years == 0 and self.months == 0:
+            return self.tdelta != other
+        if not isinstance(other, Duration):
+            return NotImplemented
+        if ((self.years * 12 + self.months) !=
+            (other.years * 12 + other.months) or self.tdelta != other.tdelta):
+            return True
+        return False
+
+    def todatetime(self, start=None, end=None):
+        '''
+        Convert this duration into a timedelta object.
+
+        This method requires a start datetime or end datetimem, but raises
+        an exception if both are given.
+        '''
+        if start is None and end is None:
+            raise ValueError("start or end required")
+        if start is not None and end is not None:
+            raise ValueError("only start or end allowed")
+        if start is not None:
+            return (start + self) - start
+        return end - (end - self)
diff --git a/lib/isodate/duration.pyc b/lib/isodate/duration.pyc
new file mode 100644
index 0000000..dd8ef1a
Binary files /dev/null and b/lib/isodate/duration.pyc differ
diff --git a/lib/isodate/isodates.py b/lib/isodate/isodates.py
new file mode 100755
index 0000000..ca55489
--- /dev/null
+++ b/lib/isodate/isodates.py
@@ -0,0 +1,201 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+'''
+This modules provides a method to parse an ISO 8601:2004 date string to a
+python datetime.date instance.
+
+It supports all basic, extended and expanded formats as described in the ISO
+standard. The only limitations it has, are given by the Python datetime.date
+implementation, which does not support dates before 0001-01-01.
+'''
+import re
+from datetime import date, timedelta
+
+from lib.isodate.isostrf import strftime, DATE_EXT_COMPLETE
+from lib.isodate.isoerror import ISO8601Error
+
+DATE_REGEX_CACHE = {}
+# A dictionary to cache pre-compiled regular expressions.
+# A set of regular expressions is identified, by number of year digits allowed
+# and whether a plus/minus sign is required or not. (This option is changeable
+# only for 4 digit years).  
+
+def build_date_regexps(yeardigits=4, expanded=False):
+    '''
+    Compile set of regular expressions to parse ISO dates. The expressions will
+    be created only if they are not already in REGEX_CACHE.
+    
+    It is necessary to fix the number of year digits, else it is not possible
+    to automatically distinguish between various ISO date formats.
+    
+    ISO 8601 allows more than 4 digit years, on prior agreement, but then a +/-
+    sign is required (expanded format). To support +/- sign for 4 digit years, 
+    the expanded parameter needs to be set to True.
+    '''
+    if yeardigits != 4:
+        expanded = True
+    if (yeardigits, expanded) not in DATE_REGEX_CACHE:
+        cache_entry = []
+        # ISO 8601 expanded DATE formats allow an arbitrary number of year
+        # digits with a leading +/- sign.
+        if expanded:
+            sign = 1
+        else:
+            sign = 0
+        # 1. complete dates:
+        #    YYYY-MM-DD or +- YYYYYY-MM-DD... extended date format
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})"
+                                      r"-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})"
+                                      % (sign, yeardigits)))
+        #    YYYYMMDD or +- YYYYYYMMDD... basic date format
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})"
+                                      r"(?P<month>[0-9]{2})(?P<day>[0-9]{2})" 
+                                      % (sign, yeardigits)))
+        # 2. complete week dates:
+        #    YYYY-Www-D or +-YYYYYY-Www-D ... extended week date
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})"
+                                      r"-W(?P<week>[0-9]{2})-(?P<day>[0-9]{1})"
+                                      % (sign, yeardigits)))
+        #    YYYYWwwD or +-YYYYYYWwwD ... basic week date
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})W"
+                                      r"(?P<week>[0-9]{2})(?P<day>[0-9]{1})"
+                                      % (sign, yeardigits)))
+        # 3. ordinal dates:
+        #    YYYY-DDD or +-YYYYYY-DDD ... extended format
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})"
+                                      r"-(?P<day>[0-9]{3})"
+                                      % (sign, yeardigits)))
+        #    YYYYDDD or +-YYYYYYDDD ... basic format
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})"
+                                      r"(?P<day>[0-9]{3})"
+                                      % (sign, yeardigits)))
+        # 4. week dates:
+        #    YYYY-Www or +-YYYYYY-Www ... extended reduced accuracy week date
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})"
+                                      r"-W(?P<week>[0-9]{2})"
+                                      % (sign, yeardigits)))
+        #    YYYYWww or +-YYYYYYWww ... basic reduced accuracy week date 
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})W"
+                                      r"(?P<week>[0-9]{2})"
+                                      % (sign, yeardigits)))
+        # 5. month dates:
+        #    YYY-MM or +-YYYYYY-MM ... reduced accuracy specific month
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})"
+                                      r"-(?P<month>[0-9]{2})"
+                                      % (sign, yeardigits)))
+        # 6. year dates:
+        #    YYYY or +-YYYYYY ... reduced accuracy specific year
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}(?P<year>[0-9]{%d})"
+                                      % (sign, yeardigits)))
+        # 7. century dates:
+        #    YY or +-YYYY ... reduced accuracy specific century
+        cache_entry.append(re.compile(r"(?P<sign>[+-]){%d}"
+                                      r"(?P<century>[0-9]{%d})"
+                                      % (sign, yeardigits - 2)))
+
+        DATE_REGEX_CACHE[(yeardigits, expanded)] = cache_entry
+    return DATE_REGEX_CACHE[(yeardigits, expanded)]
+
+def parse_date(datestring, yeardigits=4, expanded=False):
+    '''
+    Parse an ISO 8601 date string into a datetime.date object.
+    
+    As the datetime.date implementation is limited to dates starting from
+    0001-01-01, negative dates (BC) and year 0 can not be parsed by this
+    method.
+    
+    For incomplete dates, this method chooses the first day for it. For
+    instance if only a century is given, this method returns the 1st of 
+    January in year 1 of this century.
+    
+    supported formats: (expanded formats are shown with 6 digits for year)
+      YYYYMMDD    +-YYYYYYMMDD      basic complete date
+      YYYY-MM-DD  +-YYYYYY-MM-DD    extended complete date
+      YYYYWwwD    +-YYYYYYWwwD      basic complete week date
+      YYYY-Www-D  +-YYYYYY-Www-D    extended complete week date
+      YYYYDDD     +-YYYYYYDDD       basic ordinal date
+      YYYY-DDD    +-YYYYYY-DDD      extended ordinal date
+      YYYYWww     +-YYYYYYWww       basic incomplete week date
+      YYYY-Www    +-YYYYYY-Www      extended incomplete week date
+      YYY-MM      +-YYYYYY-MM       incomplete month date
+      YYYY        +-YYYYYY          incomplete year date
+      YY          +-YYYY            incomplete century date
+
+    @param datestring: the ISO date string to parse
+    @param yeardigits: how many digits are used to represent a year
+    @param expanded: if True then +/- signs are allowed. This parameter
+                     is forced to True, if yeardigits != 4
+                     
+    @return: a datetime.date instance represented by datestring
+    @raise ISO8601Error: if this function can not parse the datestring
+    @raise ValueError: if datestring can not be represented by datetime.date 
+    '''
+    if yeardigits != 4:
+        expanded = True
+    isodates = build_date_regexps(yeardigits, expanded)
+    for pattern in isodates:
+        match = pattern.match(datestring)
+        if match:
+            groups = match.groupdict()
+            # sign, century, year, month, week, day,
+            # FIXME: negative dates not possible with python standard types
+            sign = (groups['sign'] == '-' and -1) or 1 
+            if 'century' in groups:
+                return date(sign * (int(groups['century']) * 100 + 1), 1, 1)
+            if not 'month' in groups: # weekdate or ordinal date
+                ret = date(sign * int(groups['year']), 1, 1)
+                if 'week' in groups:
+                    isotuple = ret.isocalendar()
+                    if 'day' in groups:
+                        days = int(groups['day'] or 1)
+                    else:
+                        days = 1
+                    # if first week in year, do weeks-1
+                    return ret + timedelta(weeks=int(groups['week']) - 
+                                            (((isotuple[1] == 1) and 1) or 0),
+                                           days = -isotuple[2] + days)
+                elif 'day' in groups: # ordinal date
+                    return ret + timedelta(days=int(groups['day'])-1)
+                else:  # year date
+                    return ret
+            # year-, month-, or complete date
+            if 'day' not in groups or groups['day'] is None:
+                day = 1
+            else:
+                day = int(groups['day'])
+            return date(sign * int(groups['year']), 
+                        int(groups['month']) or 1, day)
+    raise ISO8601Error('Unrecognised ISO 8601 date format: %r' % datestring)
+
+def date_isoformat(tdate, format=DATE_EXT_COMPLETE, yeardigits=4):
+    '''
+    Format date strings. 
+    
+    This method is just a wrapper around lib.isodate.isostrf.strftime and uses
+    Date-Extended-Complete as default format.
+    '''
+    return strftime(tdate, format, yeardigits)
diff --git a/lib/isodate/isodates.pyc b/lib/isodate/isodates.pyc
new file mode 100644
index 0000000..99f88f7
Binary files /dev/null and b/lib/isodate/isodates.pyc differ
diff --git a/lib/isodate/isodatetime.py b/lib/isodate/isodatetime.py
new file mode 100755
index 0000000..ad7115a
--- /dev/null
+++ b/lib/isodate/isodatetime.py
@@ -0,0 +1,61 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+'''
+This module defines a method to parse an ISO 8601:2004 date time string.
+
+For this job it uses the parse_date and parse_time methods defined in date
+and time module.
+'''
+from datetime import datetime
+
+from lib.isodate.isostrf import strftime
+from lib.isodate.isostrf import DATE_EXT_COMPLETE, TIME_EXT_COMPLETE, TZ_EXT
+from lib.isodate.isodates import parse_date
+from lib.isodate.isotime import parse_time
+
+def parse_datetime(datetimestring):
+    '''
+    Parses ISO 8601 date-times into datetime.datetime objects.
+    
+    This function uses parse_date and parse_time to do the job, so it allows
+    more combinations of date and time representations, than the actual
+    ISO 8601:2004 standard allows.
+    '''
+    datestring, timestring = datetimestring.split('T')
+    tmpdate = parse_date(datestring)
+    tmptime = parse_time(timestring)
+    return datetime.combine(tmpdate, tmptime)
+
+def datetime_isoformat(tdt, format=DATE_EXT_COMPLETE + 'T' + 
+                                   TIME_EXT_COMPLETE + TZ_EXT):
+    '''
+    Format datetime strings. 
+    
+    This method is just a wrapper around lib.isodate.isostrf.strftime and uses
+    Extended-Complete as default format.
+    '''
+    return strftime(tdt, format)
diff --git a/lib/isodate/isodatetime.pyc b/lib/isodate/isodatetime.pyc
new file mode 100644
index 0000000..12099ea
Binary files /dev/null and b/lib/isodate/isodatetime.pyc differ
diff --git a/lib/isodate/isoduration.py b/lib/isodate/isoduration.py
new file mode 100755
index 0000000..f56b627
--- /dev/null
+++ b/lib/isodate/isoduration.py
@@ -0,0 +1,140 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+'''
+This module provides an ISO 8601:2004 duration parser.
+
+It also provides a wrapper to strftime. This wrapper makes it easier to
+format timedelta or Duration instances as ISO conforming strings.
+'''
+from datetime import timedelta
+import re
+
+from lib.isodate.duration import Duration
+from lib.isodate.isoerror import ISO8601Error
+from lib.isodate.isodatetime import parse_datetime
+from lib.isodate.isostrf import strftime, D_DEFAULT
+
+ISO8601_PERIOD_REGEX = re.compile(r"^(?P<sign>[+-])?"
+                r"P(?P<years>[0-9]+([,.][0-9]+)?Y)?"
+                r"(?P<months>[0-9]+([,.][0-9]+)?M)?"
+                r"(?P<weeks>[0-9]+([,.][0-9]+)?W)?"
+                r"(?P<days>[0-9]+([,.][0-9]+)?D)?"
+                r"((?P<separator>T)(?P<hours>[0-9]+([,.][0-9]+)?H)?"
+                r"(?P<minutes>[0-9]+([,.][0-9]+)?M)?"
+                r"(?P<seconds>[0-9]+([,.][0-9]+)?S)?)?$")
+# regular expression to parse ISO duartion strings.
+
+
+def parse_duration(datestring):
+    """
+    Parses an ISO 8601 durations into datetime.timedelta or Duration objects.
+
+    If the ISO date string does not contain years or months, a timedelta
+    instance is returned, else a Duration instance is returned.
+
+    The following duration formats are supported:
+      -PnnW                  duration in weeks
+      -PnnYnnMnnDTnnHnnMnnS  complete duration specification
+      -PYYYYMMDDThhmmss      basic alternative complete date format
+      -PYYYY-MM-DDThh:mm:ss  extended alternative complete date format
+      -PYYYYDDDThhmmss       basic alternative ordinal date format
+      -PYYYY-DDDThh:mm:ss    extended alternative ordinal date format
+
+    The '-' is optional.
+
+    Limitations:  ISO standard defines some restrictions about where to use
+      fractional numbers and which component and format combinations are
+      allowed. This parser implementation ignores all those restrictions and
+      returns something when it is able to find all necessary components.
+      In detail:
+        it does not check, whether only the last component has fractions.
+        it allows weeks specified with all other combinations
+
+      The alternative format does not support durations with years, months or
+      days set to 0.
+    """
+    if not isinstance(datestring, basestring):
+        raise TypeError("Expecting a string %r" % datestring)
+    match = ISO8601_PERIOD_REGEX.match(datestring)
+    if not match:
+        # try alternative format:
+        if datestring.startswith("P"):
+            durdt = parse_datetime(datestring[1:])
+            if durdt.year != 0 or durdt.month != 0:
+                # create Duration
+                ret = Duration(days=durdt.day, seconds=durdt.second,
+                               microseconds=durdt.microsecond,
+                               minutes=durdt.minute, hours=durdt.hour,
+                               months=durdt.month, years=durdt.year)
+            else:  # FIXME: currently not possible in alternative format
+                # create timedelta
+                ret = timedelta(days=durdt.day, seconds=durdt.second,
+                                microseconds=durdt.microsecond,
+                                minutes=durdt.minute, hours=durdt.hour)
+            return ret
+        raise ISO8601Error("Unable to parse duration string %r" % datestring)
+    groups = match.groupdict()
+    for key, val in groups.items():
+        if key not in ('separator', 'sign'):
+            if val is None:
+                groups[key] = "0n"
+            #print groups[key]
+            groups[key] = float(groups[key][:-1].replace(',', '.'))
+    if groups["years"] == 0 and groups["months"] == 0:
+        ret = timedelta(days=groups["days"], hours=groups["hours"],
+                        minutes=groups["minutes"], seconds=groups["seconds"],
+                        weeks=groups["weeks"])
+        if groups["sign"] == '-':
+            ret = timedelta(0) - ret
+    else:
+        ret = Duration(years=groups["years"], months=groups["months"],
+                       days=groups["days"], hours=groups["hours"],
+                       minutes=groups["minutes"], seconds=groups["seconds"],
+                       weeks=groups["weeks"])
+        if groups["sign"] == '-':
+            ret = Duration(0) - ret
+    return ret
+
+
+def duration_isoformat(tduration, format=D_DEFAULT):
+    '''
+    Format duration strings.
+
+    This method is just a wrapper around lib.isodate.isostrf.strftime and uses
+    P%P (D_DEFAULT) as default format.
+    '''
+    # TODO: implement better decision for negative Durations.
+    #       should be done in Duration class in consistent way with timedelta.
+    if ((isinstance(tduration, Duration) and (tduration.years < 0 or
+                                             tduration.months < 0 or
+                                             tduration.tdelta < timedelta(0)))
+        or (isinstance(tduration, timedelta) and (tduration < timedelta(0)))):
+        ret = '-'
+    else:
+        ret = ''
+    ret += strftime(tduration, format)
+    return ret
diff --git a/lib/isodate/isoduration.pyc b/lib/isodate/isoduration.pyc
new file mode 100644
index 0000000..08caa5d
Binary files /dev/null and b/lib/isodate/isoduration.pyc differ
diff --git a/lib/isodate/isoerror.py b/lib/isodate/isoerror.py
new file mode 100755
index 0000000..b690bfe
--- /dev/null
+++ b/lib/isodate/isoerror.py
@@ -0,0 +1,32 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+'''
+This module defines all exception classes in the whole package.
+'''
+
+class ISO8601Error(Exception):
+    '''Raised when the given ISO string can not be parsed.'''
diff --git a/lib/isodate/isoerror.pyc b/lib/isodate/isoerror.pyc
new file mode 100644
index 0000000..33c7691
Binary files /dev/null and b/lib/isodate/isoerror.pyc differ
diff --git a/lib/isodate/isostrf.py b/lib/isodate/isostrf.py
new file mode 100755
index 0000000..7bf0fe6
--- /dev/null
+++ b/lib/isodate/isostrf.py
@@ -0,0 +1,207 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+"""
+This module provides an alternative strftime method.
+
+The strftime method in this module allows only a subset of Python's strftime
+format codes, plus a few additional. It supports the full range of date values
+possible with standard Python date/time objects. Furthermore there are several
+pr-defined format strings in this module to make ease producing of ISO 8601
+conforming strings.
+"""
+import re
+from datetime import date, timedelta
+
+from lib.isodate.duration import Duration
+from lib.isodate.isotzinfo import tz_isoformat
+
+# Date specific format strings
+DATE_BAS_COMPLETE = '%Y%m%d'
+DATE_EXT_COMPLETE = '%Y-%m-%d'
+DATE_BAS_WEEK_COMPLETE = '%YW%W%w'
+DATE_EXT_WEEK_COMPLETE = '%Y-W%W-%w'
+DATE_BAS_ORD_COMPLETE = '%Y%j'
+DATE_EXT_ORD_COMPLETE = '%Y-%j'
+DATE_BAS_WEEK = '%YW%W'
+DATE_EXT_WEEK = '%Y-W%W'
+DATE_MONTH = '%Y-%m'
+DATE_YEAR = '%Y'
+DATE_CENTURY = '%C'
+
+# Time specific format strings
+TIME_BAS_COMPLETE = '%H%M%S'
+TIME_EXT_COMPLETE = '%H:%M:%S'
+TIME_BAS_MINUTE = '%H%M'
+TIME_EXT_MINUTE = '%H:%M'
+TIME_HOUR = '%H'
+
+# Time zone formats
+TZ_BAS = '%z'
+TZ_EXT = '%Z'
+TZ_HOUR = '%h'
+
+# DateTime formats
+DT_EXT_COMPLETE = DATE_EXT_COMPLETE + 'T' + TIME_EXT_COMPLETE + TZ_EXT
+DT_BAS_COMPLETE = DATE_BAS_COMPLETE + 'T' + TIME_BAS_COMPLETE + TZ_BAS
+DT_EXT_ORD_COMPLETE = DATE_EXT_ORD_COMPLETE + 'T' + TIME_EXT_COMPLETE + TZ_EXT
+DT_BAS_ORD_COMPLETE = DATE_BAS_ORD_COMPLETE + 'T' + TIME_BAS_COMPLETE + TZ_BAS
+DT_EXT_WEEK_COMPLETE = DATE_EXT_WEEK_COMPLETE + 'T' + TIME_EXT_COMPLETE +\
+                       TZ_EXT
+DT_BAS_WEEK_COMPLETE = DATE_BAS_WEEK_COMPLETE + 'T' + TIME_BAS_COMPLETE +\
+                       TZ_BAS
+
+# Duration formts
+D_DEFAULT = 'P%P'
+D_WEEK = 'P%p'
+D_ALT_EXT = 'P' + DATE_EXT_COMPLETE + 'T' + TIME_EXT_COMPLETE
+D_ALT_BAS = 'P' + DATE_BAS_COMPLETE + 'T' + TIME_BAS_COMPLETE
+D_ALT_EXT_ORD = 'P' + DATE_EXT_ORD_COMPLETE + 'T' + TIME_EXT_COMPLETE
+D_ALT_BAS_ORD = 'P' + DATE_BAS_ORD_COMPLETE + 'T' + TIME_BAS_COMPLETE
+
+STRF_DT_MAP = {'%d': lambda tdt, yds: '%02d' % tdt.day,
+               '%f': lambda tdt, yds: '%d' % tdt.microsecond,
+               '%H': lambda tdt, yds: '%02d' % tdt.hour,
+               '%j': lambda tdt, yds: '%03d' % (tdt.toordinal() -
+                                            date(tdt.year, 1, 1).toordinal() +
+                                            1),
+               '%m': lambda tdt, yds: '%02d' % tdt.month,
+               '%M': lambda tdt, yds: '%02d' % tdt.minute,
+               '%S': lambda tdt, yds: '%02d' % tdt.second,
+               '%w': lambda tdt, yds: '%1d' % tdt.isoweekday(),
+               '%W': lambda tdt, yds: '%02d' % tdt.isocalendar()[1],
+               '%Y': lambda tdt, yds: (((yds != 4) and '+') or '') +\
+                                   (('%%0%dd' % yds) % tdt.year),
+               '%C': lambda tdt, yds: (((yds != 4) and '+') or '') +\
+                                   (('%%0%dd' % (yds - 2)) % (tdt.year / 100)),
+               '%h': lambda tdt, yds: tz_isoformat(tdt, '%h'),
+               '%Z': lambda tdt, yds: tz_isoformat(tdt, '%Z'),
+               '%z': lambda tdt, yds: tz_isoformat(tdt, '%z'),
+               '%%': lambda tdt, yds: '%'}
+
+STRF_D_MAP = {'%d': lambda tdt, yds: '%02d' % tdt.days,
+              '%f': lambda tdt, yds: '%d' % tdt.microseconds,
+              '%H': lambda tdt, yds: '%02d' % (tdt.seconds / 60 / 60),
+              '%m': lambda tdt, yds: '%02d' % tdt.months,
+              '%M': lambda tdt, yds: '%02d' % ((tdt.seconds / 60) % 60),
+              '%S': lambda tdt, yds: '%02d' % (tdt.seconds % 60),
+              '%W': lambda tdt, yds: '%02d' % (abs(tdt.days / 7)),
+              '%Y': lambda tdt, yds: (((yds != 4) and '+') or '') +\
+                                   (('%%0%dd' % yds) % tdt.years),
+              '%C': lambda tdt, yds: (((yds != 4) and '+') or '') +\
+                                   (('%%0%dd' % (yds - 2)) %
+                                    (tdt.years / 100)),
+              '%%': lambda tdt, yds: '%'}
+
+
+def _strfduration(tdt, format, yeardigits=4):
+    '''
+    this is the work method for timedelta and Duration instances.
+
+    see strftime for more details.
+    '''
+    def repl(match):
+        '''
+        lookup format command and return corresponding replacement.
+        '''
+        if match.group(0) in STRF_D_MAP:
+            return STRF_D_MAP[match.group(0)](tdt, yeardigits)
+        elif match.group(0) == '%P':
+            ret = []
+            if isinstance(tdt, Duration):
+                if tdt.years:
+                    ret.append('%sY' % abs(tdt.years))
+                if tdt.months:
+                    ret.append('%sM' % abs(tdt.months))
+            usecs = abs((tdt.days * 24 * 60 * 60 + tdt.seconds) * 1000000 +
+                        tdt.microseconds)
+            seconds, usecs = divmod(usecs, 1000000)
+            minutes, seconds = divmod(seconds, 60)
+            hours, minutes = divmod(minutes, 60)
+            days, hours = divmod(hours, 24)
+            if days:
+                ret.append('%sD' % days)
+            if hours or minutes or seconds or usecs:
+                ret.append('T')
+                if hours:
+                    ret.append('%sH' % hours)
+                if minutes:
+                    ret.append('%sM' % minutes)
+                if seconds or usecs:
+                    if usecs:
+                        ret.append(("%d.%06d" % (seconds, usecs)).rstrip('0'))
+                    else:
+                        ret.append("%d" % seconds)
+                    ret.append('S')
+            # at least one component has to be there.
+            return ret and ''.join(ret) or '0D'
+        elif match.group(0) == '%p':
+            return str(abs(tdt.days // 7)) + 'W'
+        return match.group(0)
+    return re.sub('%d|%f|%H|%m|%M|%S|%W|%Y|%C|%%|%P|%p', repl,
+                  format)
+
+
+def _strfdt(tdt, format, yeardigits=4):
+    '''
+    this is the work method for time and date instances.
+
+    see strftime for more details.
+    '''
+    def repl(match):
+        '''
+        lookup format command and return corresponding replacement.
+        '''
+        if match.group(0) in STRF_DT_MAP:
+            return STRF_DT_MAP[match.group(0)](tdt, yeardigits)
+        return match.group(0)
+    return re.sub('%d|%f|%H|%j|%m|%M|%S|%w|%W|%Y|%C|%z|%Z|%h|%%', repl,
+                  format)
+
+
+def strftime(tdt, format, yeardigits=4):
+    '''
+    Directive    Meaning    Notes
+    %d    Day of the month as a decimal number [01,31].
+    %f    Microsecond as a decimal number [0,999999], zero-padded on the left (1)
+    %H    Hour (24-hour clock) as a decimal number [00,23].
+    %j    Day of the year as a decimal number [001,366].
+    %m    Month as a decimal number [01,12].
+    %M    Minute as a decimal number [00,59].
+    %S    Second as a decimal number [00,61].    (3)
+    %w    Weekday as a decimal number [0(Monday),6].
+    %W    Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.    (4)
+    %Y    Year with century as a decimal number. [0000,9999]
+    %C    Century as a decimal number. [00,99]
+    %z    UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive).    (5)
+    %Z    Time zone name (empty string if the object is naive).
+    %P    ISO8601 duration format.
+    %p    ISO8601 duration format in weeks.
+    %%    A literal '%' character.
+    '''
+    if isinstance(tdt, (timedelta, Duration)):
+        return _strfduration(tdt, format, yeardigits)
+    return _strfdt(tdt, format, yeardigits)
diff --git a/lib/isodate/isostrf.pyc b/lib/isodate/isostrf.pyc
new file mode 100644
index 0000000..c21968e
Binary files /dev/null and b/lib/isodate/isostrf.pyc differ
diff --git a/lib/isodate/isotime.py b/lib/isodate/isotime.py
new file mode 100755
index 0000000..46510d9
--- /dev/null
+++ b/lib/isodate/isotime.py
@@ -0,0 +1,156 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+'''
+This modules provides a method to parse an ISO 8601:2004 time string to a
+Python datetime.time instance.
+
+It supports all basic and extended formats including time zone specifications
+as described in the ISO standard.
+'''
+import re
+from decimal import Decimal
+from datetime import time
+
+from lib.isodate.isostrf import strftime, TIME_EXT_COMPLETE, TZ_EXT
+from lib.isodate.isoerror import ISO8601Error
+from lib.isodate.isotzinfo import TZ_REGEX, build_tzinfo
+
+TIME_REGEX_CACHE = []
+# used to cache regular expressions to parse ISO time strings.
+
+
+def build_time_regexps():
+    '''
+    Build regular expressions to parse ISO time string.
+
+    The regular expressions are compiled and stored in TIME_REGEX_CACHE
+    for later reuse.
+    '''
+    if not TIME_REGEX_CACHE:
+        # ISO 8601 time representations allow decimal fractions on least
+        #    significant time component. Command and Full Stop are both valid
+        #    fraction separators.
+        #    The letter 'T' is allowed as time designator in front of a time
+        #    expression.
+        #    Immediately after a time expression, a time zone definition is
+        #      allowed.
+        #    a TZ may be missing (local time), be a 'Z' for UTC or a string of
+        #    +-hh:mm where the ':mm' part can be skipped.
+        # TZ information patterns:
+        #    ''
+        #    Z
+        #    +-hh:mm
+        #    +-hhmm
+        #    +-hh =>
+        #    isotzinfo.TZ_REGEX
+        # 1. complete time:
+        #    hh:mm:ss.ss ... extended format
+        TIME_REGEX_CACHE.append(re.compile(r"T?(?P<hour>[0-9]{2}):"
+                                           r"(?P<minute>[0-9]{2}):"
+                                           r"(?P<second>[0-9]{2}([,.][0-9]+)?)"
+                                           + TZ_REGEX))
+        #    hhmmss.ss ... basic format
+        TIME_REGEX_CACHE.append(re.compile(r"T?(?P<hour>[0-9]{2})"
+                                           r"(?P<minute>[0-9]{2})"
+                                           r"(?P<second>[0-9]{2}([,.][0-9]+)?)"
+                                           + TZ_REGEX))
+        # 2. reduced accuracy:
+        #    hh:mm.mm ... extended format
+        TIME_REGEX_CACHE.append(re.compile(r"T?(?P<hour>[0-9]{2}):"
+                                           r"(?P<minute>[0-9]{2}([,.][0-9]+)?)"
+                                           + TZ_REGEX))
+        #    hhmm.mm ... basic format
+        TIME_REGEX_CACHE.append(re.compile(r"T?(?P<hour>[0-9]{2})"
+                                           r"(?P<minute>[0-9]{2}([,.][0-9]+)?)"
+                                           + TZ_REGEX))
+        #    hh.hh ... basic format
+        TIME_REGEX_CACHE.append(re.compile(r"T?(?P<hour>[0-9]{2}([,.][0-9]+)?)"
+                                           + TZ_REGEX))
+    return TIME_REGEX_CACHE
+
+
+def parse_time(timestring):
+    '''
+    Parses ISO 8601 times into datetime.time objects.
+
+    Following ISO 8601 formats are supported:
+      (as decimal separator a ',' or a '.' is allowed)
+      hhmmss.ssTZD    basic complete time
+      hh:mm:ss.ssTZD  extended compelte time
+      hhmm.mmTZD      basic reduced accuracy time
+      hh:mm.mmTZD     extended reduced accuracy time
+      hh.hhTZD        basic reduced accuracy time
+    TZD is the time zone designator which can be in the following format:
+              no designator indicates local time zone
+      Z       UTC
+      +-hhmm  basic hours and minutes
+      +-hh:mm extended hours and minutes
+      +-hh    hours
+    '''
+    isotimes = build_time_regexps()
+    for pattern in isotimes:
+        match = pattern.match(timestring)
+        if match:
+            groups = match.groupdict()
+            for key, value in groups.items():
+                if value is not None:
+                    groups[key] = value.replace(',', '.')
+            tzinfo = build_tzinfo(groups['tzname'], groups['tzsign'],
+                                  int(groups['tzhour'] or 0),
+                                  int(groups['tzmin'] or 0))
+            if 'second' in groups:
+                second = Decimal(groups['second'])
+                microsecond = (second - int(second)) * long(1e6)
+                # int(...) ... no rounding
+                # to_integral() ... rounding
+                return time(int(groups['hour']), int(groups['minute']),
+                            int(second), microsecond.to_integral(), tzinfo)
+            if 'minute' in groups:
+                minute = Decimal(groups['minute'])
+                second = (minute - int(minute)) * 60
+                microsecond = (second - int(second)) * long(1e6)
+                return time(int(groups['hour']), int(minute), int(second),
+                            microsecond.to_integral(), tzinfo)
+            else:
+                microsecond, second, minute = 0, 0, 0
+            hour = Decimal(groups['hour'])
+            minute = (hour - int(hour)) * 60
+            second = (minute - int(minute)) * 60
+            microsecond = (second - int(second)) * long(1e6)
+            return time(int(hour), int(minute), int(second),
+                        microsecond.to_integral(), tzinfo)
+    raise ISO8601Error('Unrecognised ISO 8601 time format: %r' % timestring)
+
+
+def time_isoformat(ttime, format=TIME_EXT_COMPLETE + TZ_EXT):
+    '''
+    Format time strings.
+
+    This method is just a wrapper around lib.isodate.isostrf.strftime and uses
+    Time-Extended-Complete with extended time zone as default format.
+    '''
+    return strftime(ttime, format)
diff --git a/lib/isodate/isotime.pyc b/lib/isodate/isotime.pyc
new file mode 100644
index 0000000..bf9cb84
Binary files /dev/null and b/lib/isodate/isotime.pyc differ
diff --git a/lib/isodate/isotzinfo.py b/lib/isodate/isotzinfo.py
new file mode 100755
index 0000000..4a46ca1
--- /dev/null
+++ b/lib/isodate/isotzinfo.py
@@ -0,0 +1,109 @@
+##############################################################################
+# Copyright 2009, Gerhard Weis
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#  * Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#  * Neither the name of the authors nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT
+##############################################################################
+'''
+This module provides an ISO 8601:2004 time zone info parser.
+
+It offers a function to parse the time zone offset as specified by ISO 8601. 
+'''
+import re
+
+from lib.isodate.isoerror import ISO8601Error
+from lib.isodate.tzinfo import UTC, FixedOffset, ZERO
+
+TZ_REGEX = r"(?P<tzname>(Z|(?P<tzsign>[+-])"\
+           r"(?P<tzhour>[0-9]{2})(:(?P<tzmin>[0-9]{2}))?)?)"
+
+TZ_RE = re.compile(TZ_REGEX)
+
+def build_tzinfo(tzname, tzsign='+', tzhour=0, tzmin=0):
+    '''
+    create a tzinfo instance according to given parameters.
+    
+    tzname:
+      'Z'       ... return UTC
+      '' | None ... return None
+      other     ... return FixedOffset
+    '''
+    if tzname is None or tzname == '':
+        return None
+    if tzname == 'Z':
+        return UTC
+    tzsign = ((tzsign == '-') and -1) or 1
+    return FixedOffset(tzsign * tzhour, tzsign * tzmin, tzname)
+
+def parse_tzinfo(tzstring):
+    '''
+    Parses ISO 8601 time zone designators to tzinfo objecs.
+    
+    A time zone designator can be in the following format:
+              no designator indicates local time zone
+      Z       UTC
+      +-hhmm  basic hours and minutes
+      +-hh:mm extended hours and minutes
+      +-hh    hours
+    '''
+    match = TZ_RE.match(tzstring)
+    if match:
+        groups = match.groupdict()
+        return build_tzinfo(groups['tzname'], groups['tzsign'], 
+                            int(groups['tzhour'] or 0), 
+                            int(groups['tzmin'] or 0))
+    raise ISO8601Error('%s not a valid time zone info' % tzstring)
+
+def tz_isoformat(dt, format='%Z'):
+    '''
+    return time zone offset ISO 8601 formatted. 
+    The various ISO formats can be chosen with the format parameter.
+    
+    if tzinfo is None returns ''
+    if tzinfo is UTC returns 'Z'
+    else the offset is rendered to the given format. 
+    format:
+        %h ... +-HH
+        %z ... +-HHMM
+        %Z ... +-HH:MM
+    '''
+    tzinfo = dt.tzinfo
+    if (tzinfo is None) or (tzinfo.utcoffset(dt) is None):
+        return ''
+    if tzinfo.utcoffset(dt) == ZERO and tzinfo.dst(dt) == ZERO:
+        return 'Z'
+    tdelta = tzinfo.utcoffset(dt)
+    seconds = tdelta.days * 24 * 60 * 60 + tdelta.seconds
+    sign = ((seconds < 0) and '-') or '+'
+    seconds = abs(seconds)
+    minutes, seconds = divmod(seconds, 60)
+    hours, minutes = divmod(minutes, 60)
+    if hours > 99:
+        raise OverflowError('can not handle differences > 99 hours')
+    if format == '%Z':
+        return '%s%02d:%02d' % (sign, hours, minutes)
+    elif format == '%z':
+        return '%s%02d%02d' % (sign, hours, minutes)
+    elif format == '%h':
+        return '%s%02d' % (sign, hours)
+    raise AttributeError('unknown format string "%s"' % format)
diff --git a/lib/isodate/isotzinfo.pyc b/lib/isodate/isotzinfo.pyc
new file mode 100644
index 0000000..f6a5ffd
Binary files /dev/null and b/lib/isodate/isotzinfo.pyc differ
diff --git a/lib/isodate/tzinfo.py b/lib/isodate/tzinfo.py
new file mode 100755
index 0000000..ed6720f
--- /dev/null
+++ b/lib/isodate/tzinfo.py
@@ -0,0 +1,137 @@
+'''
+This module provides some datetime.tzinfo implementations. 
+
+All those classes are taken from the Python documentation.
+'''
+from datetime import timedelta, tzinfo
+import time
+
+ZERO = timedelta(0)
+# constant for zero time offset.    
+
+class Utc(tzinfo):
+    '''UTC
+    
+    Universal time coordinated time zone.
+    '''
+    
+    def utcoffset(self, dt):
+        '''
+        Return offset from UTC in minutes east of UTC, which is ZERO for UTC.
+        '''
+        return ZERO
+
+    def tzname(self, dt):
+        '''
+        Return the time zone name corresponding to the datetime object dt, as a string.
+        '''
+        return "UTC"
+
+    def dst(self, dt):
+        '''
+        Return the daylight saving time (DST) adjustment, in minutes east of UTC.
+        '''
+        return ZERO
+
+UTC = Utc()
+# the default instance for UTC.
+
+class FixedOffset(tzinfo):
+    '''
+    A class building tzinfo objects for fixed-offset time zones.
+    
+    Note that FixedOffset(0, "UTC") is a different way to build a
+    UTC tzinfo object.
+    '''
+    
+    def __init__(self, offset_hours, offset_minutes, name):
+        '''
+        Initialise an instance with time offset and name.
+        The time offset should be positive for time zones east of UTC
+        and negate for time zones west of UTC. 
+        '''
+        self.__offset = timedelta(hours=offset_hours, minutes=offset_minutes)
+        self.__name = name
+
+    def utcoffset(self, dt):
+        '''
+        Return offset from UTC in minutes of UTC.
+        '''
+        return self.__offset
+
+    def tzname(self, dt):
+        '''
+        Return the time zone name corresponding to the datetime object dt, as a
+        string.
+        '''
+        return self.__name
+
+    def dst(self, dt):
+        '''
+        Return the daylight saving time (DST) adjustment, in minutes east of 
+        UTC.
+        '''
+        return ZERO
+    
+    def __repr__(self):
+        '''
+        Return nicely formatted repr string.
+        '''
+        return "<FixedOffset %r>" % self.__name
+
+
+STDOFFSET = timedelta(seconds = -time.timezone)
+# locale time zone offset
+
+# calculate local daylight saving offset if any.
+if time.daylight:
+    DSTOFFSET = timedelta(seconds = -time.altzone)
+else:
+    DSTOFFSET = STDOFFSET
+
+DSTDIFF = DSTOFFSET - STDOFFSET
+# difference between local time zone and local DST time zone
+
+class LocalTimezone(tzinfo):
+    """
+    A class capturing the platform's idea of local time.
+    """
+
+    def utcoffset(self, dt):
+        '''
+        Return offset from UTC in minutes of UTC.
+        '''
+        if self._isdst(dt):
+            return DSTOFFSET
+        else:
+            return STDOFFSET
+
+    def dst(self, dt):
+        '''
+        Return daylight saving offset.
+        '''
+        if self._isdst(dt):
+            return DSTDIFF
+        else:
+            return ZERO
+
+    def tzname(self, dt):
+        '''
+        Return the time zone name corresponding to the datetime object dt, as a
+        string.
+        '''
+        return time.tzname[self._isdst(dt)]
+
+    def _isdst(self, dt):
+        '''
+        Returns true if DST is active for given datetime object dt.
+        '''
+        tt = (dt.year, dt.month, dt.day,
+              dt.hour, dt.minute, dt.second,
+              dt.weekday(), 0, -1)
+        stamp = time.mktime(tt)
+        tt = time.localtime(stamp)
+        return tt.tm_isdst > 0
+
+LOCAL = LocalTimezone()
+# the default instance for local time zone.
diff --git a/lib/isodate/tzinfo.pyc b/lib/isodate/tzinfo.pyc
new file mode 100644
index 0000000..a0691cf
Binary files /dev/null and b/lib/isodate/tzinfo.pyc differ
diff --git a/lib/preparelibs.sh b/lib/preparelibs.sh
new file mode 100755
index 0000000..2a677d3
--- /dev/null
+++ b/lib/preparelibs.sh
@@ -0,0 +1,2 @@
+# APSScheduler - Correcting imports in python files
+find lib/apscheduler/ -name '*.py' -print0 | xargs -0 -n 1 sed -i -e 's/from apscheduler/from lib.apscheduler/g'
diff --git a/lib/pytz/__init__.py b/lib/pytz/__init__.py
new file mode 100755
index 0000000..f4ff913
--- /dev/null
+++ b/lib/pytz/__init__.py
@@ -0,0 +1,1322 @@
+'''
+datetime.tzinfo timezone definitions generated from the
+Olson timezone database:
+
+    ftp://elsie.nci.nih.gov/pub/tz*.tar.gz
+
+See the datetime section of the Python Library Reference for information
+on how to use these modules.
+'''
+
+# The Olson database has historically been updated about 4 times a year
+OLSON_VERSION = '2006p'
+VERSION = OLSON_VERSION
+#VERSION = OLSON_VERSION + '.2'
+__version__ = OLSON_VERSION
+
+OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling
+
+__all__ = [
+    'timezone', 'all_timezones', 'common_timezones', 'utc',
+    'AmbiguousTimeError', 'country_timezones', '_',
+    ]
+
+import sys, datetime, os.path, gettext
+from tzinfo import AmbiguousTimeError, unpickler
+
+# Enable this when we get some translations?
+# We want an i18n API that is useful to programs using Python's gettext
+# module, as well as the Zope3 i18n package. Perhaps we should just provide
+# the POT file and translations, and leave it up to callers to make use
+# of them.
+# 
+# t = gettext.translation(
+#         'pytz', os.path.join(os.path.dirname(__file__), 'locales'),
+#         fallback=True
+#         )
+# def _(timezone_name):
+#     """Translate a timezone name using the current locale, returning Unicode"""
+#     return t.ugettext(timezone_name)
+
+def timezone(zone):
+    ''' Return a datetime.tzinfo implementation for the given timezone 
+    
+    >>> from datetime import datetime, timedelta
+    >>> utc = timezone('UTC')
+    >>> eastern = timezone('US/Eastern')
+    >>> eastern.zone
+    'US/Eastern'
+    >>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
+    >>> loc_dt = utc_dt.astimezone(eastern)
+    >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
+    >>> loc_dt.strftime(fmt)
+    '2002-10-27 01:00:00 EST (-0500)'
+    >>> (loc_dt - timedelta(minutes=10)).strftime(fmt)
+    '2002-10-27 00:50:00 EST (-0500)'
+    >>> eastern.normalize(loc_dt - timedelta(minutes=10)).strftime(fmt)
+    '2002-10-27 01:50:00 EDT (-0400)'
+    >>> (loc_dt + timedelta(minutes=10)).strftime(fmt)
+    '2002-10-27 01:10:00 EST (-0500)'
+    '''
+    zone = _munge_zone(zone)
+    if zone.upper() == 'UTC':
+        return utc
+    zone_bits = ['zoneinfo'] + zone.split('/')
+
+    # Load zone's module
+    module_name = '.'.join(zone_bits)
+    try:
+        module = __import__(module_name, globals(), locals())
+    except ImportError:
+        raise KeyError, zone
+    rv = module
+    for bit in zone_bits[1:]:
+        rv = getattr(rv, bit)
+
+    # Return instance from that module
+    rv = getattr(rv, zone_bits[-1])
+    assert type(rv) != type(sys)
+    return rv
+
+
+def _munge_zone(zone):
+    ''' Convert a zone into a string suitable for use as a Python identifier 
+    '''
+    return zone.replace('+', '_plus_').replace('-', '_minus_')
+
+
+ZERO = datetime.timedelta(0)
+HOUR = datetime.timedelta(hours=1)
+
+
+class UTC(datetime.tzinfo):
+    """UTC
+    
+    Identical to the reference UTC implementation given in Python docs except
+    that it unpickles using the single module global instance defined beneath
+    this class declaration.
+
+    Also contains extra attributes and methods to match other pytz tzinfo
+    instances.
+    """
+    zone = "UTC"
+
+    def utcoffset(self, dt):
+        return ZERO
+
+    def tzname(self, dt):
+        return "UTC"
+
+    def dst(self, dt):
+        return ZERO
+    
+    def __reduce__(self):
+        return _UTC, ()
+
+    def localize(self, dt, is_dst=False):
+        '''Convert naive time to local time'''
+        if dt.tzinfo is not None:
+            raise ValueError, 'Not naive datetime (tzinfo is already set)'
+        return dt.replace(tzinfo=self)
+
+    def normalize(self, dt, is_dst=False):
+        '''Correct the timezone information on the given datetime'''
+        if dt.tzinfo is None:
+            raise ValueError, 'Naive time - no tzinfo set'
+        return dt.replace(tzinfo=self)
+
+    def __repr__(self):
+        return "<UTC>"
+
+    def __str__(self):
+        return "UTC"
+
+
+UTC = utc = UTC() # UTC is a singleton
+
+
+def _UTC():
+    """Factory function for utc unpickling.
+    
+    Makes sure that unpickling a utc instance always returns the same 
+    module global.
+    
+    These examples belong in the UTC class above, but it is obscured; or in
+    the README.txt, but we are not depending on Python 2.4 so integrating
+    the README.txt examples with the unit tests is not trivial.
+    
+    >>> import datetime, pickle
+    >>> dt = datetime.datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)
+    >>> naive = dt.replace(tzinfo=None)
+    >>> p = pickle.dumps(dt, 1)
+    >>> naive_p = pickle.dumps(naive, 1)
+    >>> len(p), len(naive_p), len(p) - len(naive_p)
+    (60, 43, 17)
+    >>> new = pickle.loads(p)
+    >>> new == dt
+    True
+    >>> new is dt
+    False
+    >>> new.tzinfo is dt.tzinfo
+    True
+    >>> utc is UTC is timezone('UTC')
+    True
+    >>> utc is timezone('GMT')
+    False
+    """
+    return utc
+_UTC.__safe_for_unpickling__ = True
+
+
+def _p(*args):
+    """Factory function for unpickling pytz tzinfo instances.
+
+    Just a wrapper around tzinfo.unpickler to save a few bytes in each pickle
+    by shortening the path.
+    """
+    return unpickler(*args)
+_p.__safe_for_unpickling__ = True
+
+_country_timezones_cache = {}
+
+def country_timezones(iso3166_code):
+    """Return a list of timezones used in a particular country.
+
+    iso3166_code is the two letter code used to identify the country.
+
+    >>> country_timezones('ch')
+    ['Europe/Zurich']
+    >>> country_timezones('CH')
+    ['Europe/Zurich']
+    >>> country_timezones('XXX')
+    Traceback (most recent call last):
+    ...
+    KeyError: 'XXX'
+    """
+    iso3166_code = iso3166_code.upper()
+    if not _country_timezones_cache:
+        try:
+            from pkg_resources import resource_stream
+            zone_tab = resource_stream(__name__, 'zone.tab')
+        except ImportError:
+            zone_tab = open(os.path.join(os.path.dirname(__file__), 'zone.tab'))
+        for line in zone_tab:
+            if line.startswith('#'):
+                continue
+            code, coordinates, zone = line.split(None, 4)[:3]
+            try:
+                _country_timezones_cache[code].append(zone)
+            except KeyError:
+                _country_timezones_cache[code] = [zone]
+    return _country_timezones_cache[iso3166_code]
+
+# Time-zone info based solely on fixed offsets
+
+class _FixedOffset(datetime.tzinfo):
+
+    zone = None # to match the standard pytz API
+
+    def __init__(self, minutes):
+        if abs(minutes) >= 1440:
+            raise ValueError("absolute offset is too large", minutes)
+        self._minutes = minutes
+        self._offset = datetime.timedelta(minutes=minutes)
+
+    def utcoffset(self, dt):
+        return self._offset
+
+    def __reduce__(self):
+        return FixedOffset, (self._minutes, )
+
+    def dst(self, dt):
+        return None
+    
+    def tzname(self, dt):
+        return None
+
+    def __repr__(self):
+        return 'pytz.FixedOffset(%d)' % self._minutes
+
+    def localize(self, dt, is_dst=False):
+        '''Convert naive time to local time'''
+        if dt.tzinfo is not None:
+            raise ValueError, 'Not naive datetime (tzinfo is already set)'
+        return dt.replace(tzinfo=self)
+
+    def normalize(self, dt, is_dst=False):
+        '''Correct the timezone information on the given datetime'''
+        if dt.tzinfo is None:
+            raise ValueError, 'Naive time - no tzinfo set'
+        return dt.replace(tzinfo=self)
+
+def FixedOffset(offset, _tzinfos = {}):
+    """return a fixed-offset timezone based off a number of minutes.
+    
+        >>> one = FixedOffset(-330)
+        >>> one
+        pytz.FixedOffset(-330)
+        >>> one.utcoffset(datetime.datetime.now())
+        datetime.timedelta(-1, 66600)
+
+        >>> two = FixedOffset(1380)
+        >>> two
+        pytz.FixedOffset(1380)
+        >>> two.utcoffset(datetime.datetime.now())
+        datetime.timedelta(0, 82800)
+    
+    The datetime.timedelta must be between the range of -1 and 1 day,
+    non-inclusive.
+
+        >>> FixedOffset(1440)
+        Traceback (most recent call last):
+        ...
+        ValueError: ('absolute offset is too large', 1440)
+
+        >>> FixedOffset(-1440)
+        Traceback (most recent call last):
+        ...
+        ValueError: ('absolute offset is too large', -1440)
+
+    An offset of 0 is special-cased to return UTC.
+
+        >>> FixedOffset(0) is UTC
+        True
+
+    There should always be only one instance of a FixedOffset per timedelta.
+    This should be true for multiple creation calls.
+    
+        >>> FixedOffset(-330) is one
+        True
+        >>> FixedOffset(1380) is two
+        True
+
+    It should also be true for pickling.
+
+        >>> import pickle
+        >>> pickle.loads(pickle.dumps(one)) is one
+        True
+        >>> pickle.loads(pickle.dumps(two)) is two
+        True
+
+    """
+
+    if offset == 0:
+        return UTC
+
+    info = _tzinfos.get(offset)
+    if info is None:
+        # We haven't seen this one before. we need to save it.
+
+        # Use setdefault to avoid a race condition and make sure we have
+        # only one
+        info = _tzinfos.setdefault(offset, _FixedOffset(offset))
+
+    return info
+
+FixedOffset.__safe_for_unpickling__ = True
+
+def _test():
+    import doctest, os, sys
+    sys.path.insert(0, os.pardir)
+    import pytz
+    return doctest.testmod(pytz)
+
+if __name__ == '__main__':
+    _test()
+
+common_timezones = \
+['Africa/Abidjan',
+ 'Africa/Accra',
+ 'Africa/Addis_Ababa',
+ 'Africa/Algiers',
+ 'Africa/Asmera',
+ 'Africa/Bamako',
+ 'Africa/Bangui',
+ 'Africa/Banjul',
+ 'Africa/Bissau',
+ 'Africa/Blantyre',
+ 'Africa/Brazzaville',
+ 'Africa/Bujumbura',
+ 'Africa/Cairo',
+ 'Africa/Casablanca',
+ 'Africa/Ceuta',
+ 'Africa/Conakry',
+ 'Africa/Dakar',
+ 'Africa/Dar_es_Salaam',
+ 'Africa/Djibouti',
+ 'Africa/Douala',
+ 'Africa/El_Aaiun',
+ 'Africa/Freetown',
+ 'Africa/Gaborone',
+ 'Africa/Harare',
+ 'Africa/Johannesburg',
+ 'Africa/Kampala',
+ 'Africa/Khartoum',
+ 'Africa/Kigali',
+ 'Africa/Kinshasa',
+ 'Africa/Lagos',
+ 'Africa/Libreville',
+ 'Africa/Lome',
+ 'Africa/Luanda',
+ 'Africa/Lubumbashi',
+ 'Africa/Lusaka',
+ 'Africa/Malabo',
+ 'Africa/Maputo',
+ 'Africa/Maseru',
+ 'Africa/Mbabane',
+ 'Africa/Mogadishu',
+ 'Africa/Monrovia',
+ 'Africa/Nairobi',
+ 'Africa/Ndjamena',
+ 'Africa/Niamey',
+ 'Africa/Nouakchott',
+ 'Africa/Ouagadougou',
+ 'Africa/Porto-Novo',
+ 'Africa/Sao_Tome',
+ 'Africa/Timbuktu',
+ 'Africa/Tripoli',
+ 'Africa/Tunis',
+ 'Africa/Windhoek',
+ 'America/Adak',
+ 'America/Anchorage',
+ 'America/Anguilla',
+ 'America/Antigua',
+ 'America/Araguaina',
+ 'America/Aruba',
+ 'America/Asuncion',
+ 'America/Atikokan',
+ 'America/Atka',
+ 'America/Bahia',
+ 'America/Barbados',
+ 'America/Belem',
+ 'America/Belize',
+ 'America/Blanc-Sablon',
+ 'America/Boa_Vista',
+ 'America/Bogota',
+ 'America/Boise',
+ 'America/Buenos_Aires',
+ 'America/Cambridge_Bay',
+ 'America/Campo_Grande',
+ 'America/Cancun',
+ 'America/Caracas',
+ 'America/Catamarca',
+ 'America/Cayenne',
+ 'America/Cayman',
+ 'America/Chicago',
+ 'America/Chihuahua',
+ 'America/Coral_Harbour',
+ 'America/Cordoba',
+ 'America/Costa_Rica',
+ 'America/Cuiaba',
+ 'America/Curacao',
+ 'America/Danmarkshavn',
+ 'America/Dawson',
+ 'America/Dawson_Creek',
+ 'America/Denver',
+ 'America/Detroit',
+ 'America/Dominica',
+ 'America/Edmonton',
+ 'America/Eirunepe',
+ 'America/El_Salvador',
+ 'America/Ensenada',
+ 'America/Fort_Wayne',
+ 'America/Fortaleza',
+ 'America/Glace_Bay',
+ 'America/Godthab',
+ 'America/Goose_Bay',
+ 'America/Grand_Turk',
+ 'America/Grenada',
+ 'America/Guadeloupe',
+ 'America/Guatemala',
+ 'America/Guayaquil',
+ 'America/Guyana',
+ 'America/Halifax',
+ 'America/Havana',
+ 'America/Hermosillo',
+ 'America/Indianapolis',
+ 'America/Inuvik',
+ 'America/Iqaluit',
+ 'America/Jamaica',
+ 'America/Jujuy',
+ 'America/Juneau',
+ 'America/Knox_IN',
+ 'America/La_Paz',
+ 'America/Lima',
+ 'America/Los_Angeles',
+ 'America/Louisville',
+ 'America/Maceio',
+ 'America/Managua',
+ 'America/Manaus',
+ 'America/Martinique',
+ 'America/Mazatlan',
+ 'America/Mendoza',
+ 'America/Menominee',
+ 'America/Merida',
+ 'America/Mexico_City',
+ 'America/Miquelon',
+ 'America/Moncton',
+ 'America/Monterrey',
+ 'America/Montevideo',
+ 'America/Montreal',
+ 'America/Montserrat',
+ 'America/Nassau',
+ 'America/New_York',
+ 'America/Nipigon',
+ 'America/Nome',
+ 'America/Noronha',
+ 'America/Panama',
+ 'America/Pangnirtung',
+ 'America/Paramaribo',
+ 'America/Phoenix',
+ 'America/Port-au-Prince',
+ 'America/Port_of_Spain',
+ 'America/Porto_Acre',
+ 'America/Porto_Velho',
+ 'America/Puerto_Rico',
+ 'America/Rainy_River',
+ 'America/Rankin_Inlet',
+ 'America/Recife',
+ 'America/Regina',
+ 'America/Rio_Branco',
+ 'America/Rosario',
+ 'America/Santiago',
+ 'America/Santo_Domingo',
+ 'America/Sao_Paulo',
+ 'America/Scoresbysund',
+ 'America/Shiprock',
+ 'America/St_Johns',
+ 'America/St_Kitts',
+ 'America/St_Lucia',
+ 'America/St_Thomas',
+ 'America/St_Vincent',
+ 'America/Swift_Current',
+ 'America/Tegucigalpa',
+ 'America/Thule',
+ 'America/Thunder_Bay',
+ 'America/Tijuana',
+ 'America/Toronto',
+ 'America/Tortola',
+ 'America/Vancouver',
+ 'America/Virgin',
+ 'America/Whitehorse',
+ 'America/Winnipeg',
+ 'America/Yakutat',
+ 'America/Yellowknife',
+ 'Antarctica/Casey',
+ 'Antarctica/Davis',
+ 'Antarctica/DumontDUrville',
+ 'Antarctica/Mawson',
+ 'Antarctica/McMurdo',
+ 'Antarctica/Palmer',
+ 'Antarctica/Rothera',
+ 'Antarctica/South_Pole',
+ 'Antarctica/Syowa',
+ 'Antarctica/Vostok',
+ 'Arctic/Longyearbyen',
+ 'Asia/Aden',
+ 'Asia/Almaty',
+ 'Asia/Amman',
+ 'Asia/Anadyr',
+ 'Asia/Aqtau',
+ 'Asia/Aqtobe',
+ 'Asia/Ashgabat',
+ 'Asia/Ashkhabad',
+ 'Asia/Baghdad',
+ 'Asia/Bahrain',
+ 'Asia/Baku',
+ 'Asia/Bangkok',
+ 'Asia/Beirut',
+ 'Asia/Bishkek',
+ 'Asia/Brunei',
+ 'Asia/Calcutta',
+ 'Asia/Choibalsan',
+ 'Asia/Chongqing',
+ 'Asia/Chungking',
+ 'Asia/Colombo',
+ 'Asia/Dacca',
+ 'Asia/Damascus',
+ 'Asia/Dhaka',
+ 'Asia/Dili',
+ 'Asia/Dubai',
+ 'Asia/Dushanbe',
+ 'Asia/Gaza',
+ 'Asia/Harbin',
+ 'Asia/Hong_Kong',
+ 'Asia/Hovd',
+ 'Asia/Irkutsk',
+ 'Asia/Istanbul',
+ 'Asia/Jakarta',
+ 'Asia/Jayapura',
+ 'Asia/Jerusalem',
+ 'Asia/Kabul',
+ 'Asia/Kamchatka',
+ 'Asia/Karachi',
+ 'Asia/Kashgar',
+ 'Asia/Katmandu',
+ 'Asia/Krasnoyarsk',
+ 'Asia/Kuala_Lumpur',
+ 'Asia/Kuching',
+ 'Asia/Kuwait',
+ 'Asia/Macao',
+ 'Asia/Macau',
+ 'Asia/Magadan',
+ 'Asia/Makassar',
+ 'Asia/Manila',
+ 'Asia/Muscat',
+ 'Asia/Nicosia',
+ 'Asia/Novosibirsk',
+ 'Asia/Omsk',
+ 'Asia/Oral',
+ 'Asia/Phnom_Penh',
+ 'Asia/Pontianak',
+ 'Asia/Pyongyang',
+ 'Asia/Qatar',
+ 'Asia/Qyzylorda',
+ 'Asia/Rangoon',
+ 'Asia/Riyadh',
+ 'Asia/Saigon',
+ 'Asia/Sakhalin',
+ 'Asia/Samarkand',
+ 'Asia/Seoul',
+ 'Asia/Shanghai',
+ 'Asia/Singapore',
+ 'Asia/Taipei',
+ 'Asia/Tashkent',
+ 'Asia/Tbilisi',
+ 'Asia/Tehran',
+ 'Asia/Tel_Aviv',
+ 'Asia/Thimbu',
+ 'Asia/Thimphu',
+ 'Asia/Tokyo',
+ 'Asia/Ujung_Pandang',
+ 'Asia/Ulaanbaatar',
+ 'Asia/Ulan_Bator',
+ 'Asia/Urumqi',
+ 'Asia/Vientiane',
+ 'Asia/Vladivostok',
+ 'Asia/Yakutsk',
+ 'Asia/Yekaterinburg',
+ 'Asia/Yerevan',
+ 'Atlantic/Azores',
+ 'Atlantic/Bermuda',
+ 'Atlantic/Canary',
+ 'Atlantic/Cape_Verde',
+ 'Atlantic/Faeroe',
+ 'Atlantic/Jan_Mayen',
+ 'Atlantic/Madeira',
+ 'Atlantic/Reykjavik',
+ 'Atlantic/South_Georgia',
+ 'Atlantic/St_Helena',
+ 'Atlantic/Stanley',
+ 'Australia/ACT',
+ 'Australia/Adelaide',
+ 'Australia/Brisbane',
+ 'Australia/Broken_Hill',
+ 'Australia/Canberra',
+ 'Australia/Currie',
+ 'Australia/Darwin',
+ 'Australia/Hobart',
+ 'Australia/LHI',
+ 'Australia/Lindeman',
+ 'Australia/Lord_Howe',
+ 'Australia/Melbourne',
+ 'Australia/NSW',
+ 'Australia/North',
+ 'Australia/Perth',
+ 'Australia/Queensland',
+ 'Australia/South',
+ 'Australia/Sydney',
+ 'Australia/Tasmania',
+ 'Australia/Victoria',
+ 'Australia/West',
+ 'Australia/Yancowinna',
+ 'Brazil/Acre',
+ 'Brazil/DeNoronha',
+ 'Brazil/East',
+ 'Brazil/West',
+ 'Canada/Atlantic',
+ 'Canada/Central',
+ 'Canada/East-Saskatchewan',
+ 'Canada/Eastern',
+ 'Canada/Mountain',
+ 'Canada/Newfoundland',
+ 'Canada/Pacific',
+ 'Canada/Saskatchewan',
+ 'Canada/Yukon',
+ 'Chile/Continental',
+ 'Chile/EasterIsland',
+ 'Europe/Amsterdam',
+ 'Europe/Andorra',
+ 'Europe/Athens',
+ 'Europe/Belfast',
+ 'Europe/Belgrade',
+ 'Europe/Berlin',
+ 'Europe/Bratislava',
+ 'Europe/Brussels',
+ 'Europe/Bucharest',
+ 'Europe/Budapest',
+ 'Europe/Chisinau',
+ 'Europe/Copenhagen',
+ 'Europe/Dublin',
+ 'Europe/Gibraltar',
+ 'Europe/Guernsey',
+ 'Europe/Helsinki',
+ 'Europe/Isle_of_Man',
+ 'Europe/Istanbul',
+ 'Europe/Jersey',
+ 'Europe/Kaliningrad',
+ 'Europe/Kiev',
+ 'Europe/Lisbon',
+ 'Europe/Ljubljana',
+ 'Europe/London',
+ 'Europe/Luxembourg',
+ 'Europe/Madrid',
+ 'Europe/Malta',
+ 'Europe/Mariehamn',
+ 'Europe/Minsk',
+ 'Europe/Monaco',
+ 'Europe/Moscow',
+ 'Europe/Nicosia',
+ 'Europe/Oslo',
+ 'Europe/Paris',
+ 'Europe/Podgorica',
+ 'Europe/Prague',
+ 'Europe/Riga',
+ 'Europe/Rome',
+ 'Europe/Samara',
+ 'Europe/San_Marino',
+ 'Europe/Sarajevo',
+ 'Europe/Simferopol',
+ 'Europe/Skopje',
+ 'Europe/Sofia',
+ 'Europe/Stockholm',
+ 'Europe/Tallinn',
+ 'Europe/Tirane',
+ 'Europe/Tiraspol',
+ 'Europe/Uzhgorod',
+ 'Europe/Vaduz',
+ 'Europe/Vatican',
+ 'Europe/Vienna',
+ 'Europe/Vilnius',
+ 'Europe/Volgograd',
+ 'Europe/Warsaw',
+ 'Europe/Zagreb',
+ 'Europe/Zaporozhye',
+ 'Europe/Zurich',
+ 'GMT',
+ 'Indian/Antananarivo',
+ 'Indian/Chagos',
+ 'Indian/Christmas',
+ 'Indian/Cocos',
+ 'Indian/Comoro',
+ 'Indian/Kerguelen',
+ 'Indian/Mahe',
+ 'Indian/Maldives',
+ 'Indian/Mauritius',
+ 'Indian/Mayotte',
+ 'Indian/Reunion',
+ 'Mexico/BajaNorte',
+ 'Mexico/BajaSur',
+ 'Mexico/General',
+ 'Pacific/Apia',
+ 'Pacific/Auckland',
+ 'Pacific/Chatham',
+ 'Pacific/Easter',
+ 'Pacific/Efate',
+ 'Pacific/Enderbury',
+ 'Pacific/Fakaofo',
+ 'Pacific/Fiji',
+ 'Pacific/Funafuti',
+ 'Pacific/Galapagos',
+ 'Pacific/Gambier',
+ 'Pacific/Guadalcanal',
+ 'Pacific/Guam',
+ 'Pacific/Honolulu',
+ 'Pacific/Johnston',
+ 'Pacific/Kiritimati',
+ 'Pacific/Kosrae',
+ 'Pacific/Kwajalein',
+ 'Pacific/Majuro',
+ 'Pacific/Marquesas',
+ 'Pacific/Midway',
+ 'Pacific/Nauru',
+ 'Pacific/Niue',
+ 'Pacific/Norfolk',
+ 'Pacific/Noumea',
+ 'Pacific/Pago_Pago',
+ 'Pacific/Palau',
+ 'Pacific/Pitcairn',
+ 'Pacific/Ponape',
+ 'Pacific/Port_Moresby',
+ 'Pacific/Rarotonga',
+ 'Pacific/Saipan',
+ 'Pacific/Samoa',
+ 'Pacific/Tahiti',
+ 'Pacific/Tarawa',
+ 'Pacific/Tongatapu',
+ 'Pacific/Truk',
+ 'Pacific/Wake',
+ 'Pacific/Wallis',
+ 'Pacific/Yap',
+ 'US/Alaska',
+ 'US/Aleutian',
+ 'US/Arizona',
+ 'US/Central',
+ 'US/East-Indiana',
+ 'US/Eastern',
+ 'US/Hawaii',
+ 'US/Indiana-Starke',
+ 'US/Michigan',
+ 'US/Mountain',
+ 'US/Pacific',
+ 'US/Pacific-New',
+ 'US/Samoa',
+ 'UTC']
+
+all_timezones = \
+['Africa/Abidjan',
+ 'Africa/Accra',
+ 'Africa/Addis_Ababa',
+ 'Africa/Algiers',
+ 'Africa/Asmera',
+ 'Africa/Bamako',
+ 'Africa/Bangui',
+ 'Africa/Banjul',
+ 'Africa/Bissau',
+ 'Africa/Blantyre',
+ 'Africa/Brazzaville',
+ 'Africa/Bujumbura',
+ 'Africa/Cairo',
+ 'Africa/Casablanca',
+ 'Africa/Ceuta',
+ 'Africa/Conakry',
+ 'Africa/Dakar',
+ 'Africa/Dar_es_Salaam',
+ 'Africa/Djibouti',
+ 'Africa/Douala',
+ 'Africa/El_Aaiun',
+ 'Africa/Freetown',
+ 'Africa/Gaborone',
+ 'Africa/Harare',
+ 'Africa/Johannesburg',
+ 'Africa/Kampala',
+ 'Africa/Khartoum',
+ 'Africa/Kigali',
+ 'Africa/Kinshasa',
+ 'Africa/Lagos',
+ 'Africa/Libreville',
+ 'Africa/Lome',
+ 'Africa/Luanda',
+ 'Africa/Lubumbashi',
+ 'Africa/Lusaka',
+ 'Africa/Malabo',
+ 'Africa/Maputo',
+ 'Africa/Maseru',
+ 'Africa/Mbabane',
+ 'Africa/Mogadishu',
+ 'Africa/Monrovia',
+ 'Africa/Nairobi',
+ 'Africa/Ndjamena',
+ 'Africa/Niamey',
+ 'Africa/Nouakchott',
+ 'Africa/Ouagadougou',
+ 'Africa/Porto-Novo',
+ 'Africa/Sao_Tome',
+ 'Africa/Timbuktu',
+ 'Africa/Tripoli',
+ 'Africa/Tunis',
+ 'Africa/Windhoek',
+ 'America/Adak',
+ 'America/Anchorage',
+ 'America/Anguilla',
+ 'America/Antigua',
+ 'America/Araguaina',
+ 'America/Argentina/Buenos_Aires',
+ 'America/Argentina/Catamarca',
+ 'America/Argentina/ComodRivadavia',
+ 'America/Argentina/Cordoba',
+ 'America/Argentina/Jujuy',
+ 'America/Argentina/La_Rioja',
+ 'America/Argentina/Mendoza',
+ 'America/Argentina/Rio_Gallegos',
+ 'America/Argentina/San_Juan',
+ 'America/Argentina/Tucuman',
+ 'America/Argentina/Ushuaia',
+ 'America/Aruba',
+ 'America/Asuncion',
+ 'America/Atikokan',
+ 'America/Atka',
+ 'America/Bahia',
+ 'America/Barbados',
+ 'America/Belem',
+ 'America/Belize',
+ 'America/Blanc-Sablon',
+ 'America/Boa_Vista',
+ 'America/Bogota',
+ 'America/Boise',
+ 'America/Buenos_Aires',
+ 'America/Cambridge_Bay',
+ 'America/Campo_Grande',
+ 'America/Cancun',
+ 'America/Caracas',
+ 'America/Catamarca',
+ 'America/Cayenne',
+ 'America/Cayman',
+ 'America/Chicago',
+ 'America/Chihuahua',
+ 'America/Coral_Harbour',
+ 'America/Cordoba',
+ 'America/Costa_Rica',
+ 'America/Cuiaba',
+ 'America/Curacao',
+ 'America/Danmarkshavn',
+ 'America/Dawson',
+ 'America/Dawson_Creek',
+ 'America/Denver',
+ 'America/Detroit',
+ 'America/Dominica',
+ 'America/Edmonton',
+ 'America/Eirunepe',
+ 'America/El_Salvador',
+ 'America/Ensenada',
+ 'America/Fort_Wayne',
+ 'America/Fortaleza',
+ 'America/Glace_Bay',
+ 'America/Godthab',
+ 'America/Goose_Bay',
+ 'America/Grand_Turk',
+ 'America/Grenada',
+ 'America/Guadeloupe',
+ 'America/Guatemala',
+ 'America/Guayaquil',
+ 'America/Guyana',
+ 'America/Halifax',
+ 'America/Havana',
+ 'America/Hermosillo',
+ 'America/Indiana/Indianapolis',
+ 'America/Indiana/Knox',
+ 'America/Indiana/Marengo',
+ 'America/Indiana/Petersburg',
+ 'America/Indiana/Vevay',
+ 'America/Indiana/Vincennes',
+ 'America/Indianapolis',
+ 'America/Inuvik',
+ 'America/Iqaluit',
+ 'America/Jamaica',
+ 'America/Jujuy',
+ 'America/Juneau',
+ 'America/Kentucky/Louisville',
+ 'America/Kentucky/Monticello',
+ 'America/Knox_IN',
+ 'America/La_Paz',
+ 'America/Lima',
+ 'America/Los_Angeles',
+ 'America/Louisville',
+ 'America/Maceio',
+ 'America/Managua',
+ 'America/Manaus',
+ 'America/Martinique',
+ 'America/Mazatlan',
+ 'America/Mendoza',
+ 'America/Menominee',
+ 'America/Merida',
+ 'America/Mexico_City',
+ 'America/Miquelon',
+ 'America/Moncton',
+ 'America/Monterrey',
+ 'America/Montevideo',
+ 'America/Montreal',
+ 'America/Montserrat',
+ 'America/Nassau',
+ 'America/New_York',
+ 'America/Nipigon',
+ 'America/Nome',
+ 'America/Noronha',
+ 'America/North_Dakota/Center',
+ 'America/North_Dakota/New_Salem',
+ 'America/Panama',
+ 'America/Pangnirtung',
+ 'America/Paramaribo',
+ 'America/Phoenix',
+ 'America/Port-au-Prince',
+ 'America/Port_of_Spain',
+ 'America/Porto_Acre',
+ 'America/Porto_Velho',
+ 'America/Puerto_Rico',
+ 'America/Rainy_River',
+ 'America/Rankin_Inlet',
+ 'America/Recife',
+ 'America/Regina',
+ 'America/Rio_Branco',
+ 'America/Rosario',
+ 'America/Santiago',
+ 'America/Santo_Domingo',
+ 'America/Sao_Paulo',
+ 'America/Scoresbysund',
+ 'America/Shiprock',
+ 'America/St_Johns',
+ 'America/St_Kitts',
+ 'America/St_Lucia',
+ 'America/St_Thomas',
+ 'America/St_Vincent',
+ 'America/Swift_Current',
+ 'America/Tegucigalpa',
+ 'America/Thule',
+ 'America/Thunder_Bay',
+ 'America/Tijuana',
+ 'America/Toronto',
+ 'America/Tortola',
+ 'America/Vancouver',
+ 'America/Virgin',
+ 'America/Whitehorse',
+ 'America/Winnipeg',
+ 'America/Yakutat',
+ 'America/Yellowknife',
+ 'Antarctica/Casey',
+ 'Antarctica/Davis',
+ 'Antarctica/DumontDUrville',
+ 'Antarctica/Mawson',
+ 'Antarctica/McMurdo',
+ 'Antarctica/Palmer',
+ 'Antarctica/Rothera',
+ 'Antarctica/South_Pole',
+ 'Antarctica/Syowa',
+ 'Antarctica/Vostok',
+ 'Arctic/Longyearbyen',
+ 'Asia/Aden',
+ 'Asia/Almaty',
+ 'Asia/Amman',
+ 'Asia/Anadyr',
+ 'Asia/Aqtau',
+ 'Asia/Aqtobe',
+ 'Asia/Ashgabat',
+ 'Asia/Ashkhabad',
+ 'Asia/Baghdad',
+ 'Asia/Bahrain',
+ 'Asia/Baku',
+ 'Asia/Bangkok',
+ 'Asia/Beirut',
+ 'Asia/Bishkek',
+ 'Asia/Brunei',
+ 'Asia/Calcutta',
+ 'Asia/Choibalsan',
+ 'Asia/Chongqing',
+ 'Asia/Chungking',
+ 'Asia/Colombo',
+ 'Asia/Dacca',
+ 'Asia/Damascus',
+ 'Asia/Dhaka',
+ 'Asia/Dili',
+ 'Asia/Dubai',
+ 'Asia/Dushanbe',
+ 'Asia/Gaza',
+ 'Asia/Harbin',
+ 'Asia/Hong_Kong',
+ 'Asia/Hovd',
+ 'Asia/Irkutsk',
+ 'Asia/Istanbul',
+ 'Asia/Jakarta',
+ 'Asia/Jayapura',
+ 'Asia/Jerusalem',
+ 'Asia/Kabul',
+ 'Asia/Kamchatka',
+ 'Asia/Karachi',
+ 'Asia/Kashgar',
+ 'Asia/Katmandu',
+ 'Asia/Krasnoyarsk',
+ 'Asia/Kuala_Lumpur',
+ 'Asia/Kuching',
+ 'Asia/Kuwait',
+ 'Asia/Macao',
+ 'Asia/Macau',
+ 'Asia/Magadan',
+ 'Asia/Makassar',
+ 'Asia/Manila',
+ 'Asia/Muscat',
+ 'Asia/Nicosia',
+ 'Asia/Novosibirsk',
+ 'Asia/Omsk',
+ 'Asia/Oral',
+ 'Asia/Phnom_Penh',
+ 'Asia/Pontianak',
+ 'Asia/Pyongyang',
+ 'Asia/Qatar',
+ 'Asia/Qyzylorda',
+ 'Asia/Rangoon',
+ 'Asia/Riyadh',
+ 'Asia/Saigon',
+ 'Asia/Sakhalin',
+ 'Asia/Samarkand',
+ 'Asia/Seoul',
+ 'Asia/Shanghai',
+ 'Asia/Singapore',
+ 'Asia/Taipei',
+ 'Asia/Tashkent',
+ 'Asia/Tbilisi',
+ 'Asia/Tehran',
+ 'Asia/Tel_Aviv',
+ 'Asia/Thimbu',
+ 'Asia/Thimphu',
+ 'Asia/Tokyo',
+ 'Asia/Ujung_Pandang',
+ 'Asia/Ulaanbaatar',
+ 'Asia/Ulan_Bator',
+ 'Asia/Urumqi',
+ 'Asia/Vientiane',
+ 'Asia/Vladivostok',
+ 'Asia/Yakutsk',
+ 'Asia/Yekaterinburg',
+ 'Asia/Yerevan',
+ 'Atlantic/Azores',
+ 'Atlantic/Bermuda',
+ 'Atlantic/Canary',
+ 'Atlantic/Cape_Verde',
+ 'Atlantic/Faeroe',
+ 'Atlantic/Jan_Mayen',
+ 'Atlantic/Madeira',
+ 'Atlantic/Reykjavik',
+ 'Atlantic/South_Georgia',
+ 'Atlantic/St_Helena',
+ 'Atlantic/Stanley',
+ 'Australia/ACT',
+ 'Australia/Adelaide',
+ 'Australia/Brisbane',
+ 'Australia/Broken_Hill',
+ 'Australia/Canberra',
+ 'Australia/Currie',
+ 'Australia/Darwin',
+ 'Australia/Hobart',
+ 'Australia/LHI',
+ 'Australia/Lindeman',
+ 'Australia/Lord_Howe',
+ 'Australia/Melbourne',
+ 'Australia/NSW',
+ 'Australia/North',
+ 'Australia/Perth',
+ 'Australia/Queensland',
+ 'Australia/South',
+ 'Australia/Sydney',
+ 'Australia/Tasmania',
+ 'Australia/Victoria',
+ 'Australia/West',
+ 'Australia/Yancowinna',
+ 'Brazil/Acre',
+ 'Brazil/DeNoronha',
+ 'Brazil/East',
+ 'Brazil/West',
+ 'CET',
+ 'CST6CDT',
+ 'Canada/Atlantic',
+ 'Canada/Central',
+ 'Canada/East-Saskatchewan',
+ 'Canada/Eastern',
+ 'Canada/Mountain',
+ 'Canada/Newfoundland',
+ 'Canada/Pacific',
+ 'Canada/Saskatchewan',
+ 'Canada/Yukon',
+ 'Chile/Continental',
+ 'Chile/EasterIsland',
+ 'Cuba',
+ 'EET',
+ 'EST',
+ 'EST5EDT',
+ 'Egypt',
+ 'Eire',
+ 'Etc/GMT',
+ 'Etc/GMT+0',
+ 'Etc/GMT+1',
+ 'Etc/GMT+10',
+ 'Etc/GMT+11',
+ 'Etc/GMT+12',
+ 'Etc/GMT+2',
+ 'Etc/GMT+3',
+ 'Etc/GMT+4',
+ 'Etc/GMT+5',
+ 'Etc/GMT+6',
+ 'Etc/GMT+7',
+ 'Etc/GMT+8',
+ 'Etc/GMT+9',
+ 'Etc/GMT-0',
+ 'Etc/GMT-1',
+ 'Etc/GMT-10',
+ 'Etc/GMT-11',
+ 'Etc/GMT-12',
+ 'Etc/GMT-13',
+ 'Etc/GMT-14',
+ 'Etc/GMT-2',
+ 'Etc/GMT-3',
+ 'Etc/GMT-4',
+ 'Etc/GMT-5',
+ 'Etc/GMT-6',
+ 'Etc/GMT-7',
+ 'Etc/GMT-8',
+ 'Etc/GMT-9',
+ 'Etc/GMT0',
+ 'Etc/Greenwich',
+ 'Etc/UCT',
+ 'Etc/UTC',
+ 'Etc/Universal',
+ 'Etc/Zulu',
+ 'Europe/Amsterdam',
+ 'Europe/Andorra',
+ 'Europe/Athens',
+ 'Europe/Belfast',
+ 'Europe/Belgrade',
+ 'Europe/Berlin',
+ 'Europe/Bratislava',
+ 'Europe/Brussels',
+ 'Europe/Bucharest',
+ 'Europe/Budapest',
+ 'Europe/Chisinau',
+ 'Europe/Copenhagen',
+ 'Europe/Dublin',
+ 'Europe/Gibraltar',
+ 'Europe/Guernsey',
+ 'Europe/Helsinki',
+ 'Europe/Isle_of_Man',
+ 'Europe/Istanbul',
+ 'Europe/Jersey',
+ 'Europe/Kaliningrad',
+ 'Europe/Kiev',
+ 'Europe/Lisbon',
+ 'Europe/Ljubljana',
+ 'Europe/London',
+ 'Europe/Luxembourg',
+ 'Europe/Madrid',
+ 'Europe/Malta',
+ 'Europe/Mariehamn',
+ 'Europe/Minsk',
+ 'Europe/Monaco',
+ 'Europe/Moscow',
+ 'Europe/Nicosia',
+ 'Europe/Oslo',
+ 'Europe/Paris',
+ 'Europe/Podgorica',
+ 'Europe/Prague',
+ 'Europe/Riga',
+ 'Europe/Rome',
+ 'Europe/Samara',
+ 'Europe/San_Marino',
+ 'Europe/Sarajevo',
+ 'Europe/Simferopol',
+ 'Europe/Skopje',
+ 'Europe/Sofia',
+ 'Europe/Stockholm',
+ 'Europe/Tallinn',
+ 'Europe/Tirane',
+ 'Europe/Tiraspol',
+ 'Europe/Uzhgorod',
+ 'Europe/Vaduz',
+ 'Europe/Vatican',
+ 'Europe/Vienna',
+ 'Europe/Vilnius',
+ 'Europe/Volgograd',
+ 'Europe/Warsaw',
+ 'Europe/Zagreb',
+ 'Europe/Zaporozhye',
+ 'Europe/Zurich',
+ 'GB',
+ 'GB-Eire',
+ 'GMT',
+ 'GMT+0',
+ 'GMT-0',
+ 'GMT0',
+ 'Greenwich',
+ 'HST',
+ 'Hongkong',
+ 'Iceland',
+ 'Indian/Antananarivo',
+ 'Indian/Chagos',
+ 'Indian/Christmas',
+ 'Indian/Cocos',
+ 'Indian/Comoro',
+ 'Indian/Kerguelen',
+ 'Indian/Mahe',
+ 'Indian/Maldives',
+ 'Indian/Mauritius',
+ 'Indian/Mayotte',
+ 'Indian/Reunion',
+ 'Iran',
+ 'Israel',
+ 'Jamaica',
+ 'Japan',
+ 'Kwajalein',
+ 'Libya',
+ 'MET',
+ 'MST',
+ 'MST7MDT',
+ 'Mexico/BajaNorte',
+ 'Mexico/BajaSur',
+ 'Mexico/General',
+ 'NZ',
+ 'NZ-CHAT',
+ 'Navajo',
+ 'PRC',
+ 'PST8PDT',
+ 'Pacific/Apia',
+ 'Pacific/Auckland',
+ 'Pacific/Chatham',
+ 'Pacific/Easter',
+ 'Pacific/Efate',
+ 'Pacific/Enderbury',
+ 'Pacific/Fakaofo',
+ 'Pacific/Fiji',
+ 'Pacific/Funafuti',
+ 'Pacific/Galapagos',
+ 'Pacific/Gambier',
+ 'Pacific/Guadalcanal',
+ 'Pacific/Guam',
+ 'Pacific/Honolulu',
+ 'Pacific/Johnston',
+ 'Pacific/Kiritimati',
+ 'Pacific/Kosrae',
+ 'Pacific/Kwajalein',
+ 'Pacific/Majuro',
+ 'Pacific/Marquesas',
+ 'Pacific/Midway',
+ 'Pacific/Nauru',
+ 'Pacific/Niue',
+ 'Pacific/Norfolk',
+ 'Pacific/Noumea',
+ 'Pacific/Pago_Pago',
+ 'Pacific/Palau',
+ 'Pacific/Pitcairn',
+ 'Pacific/Ponape',
+ 'Pacific/Port_Moresby',
+ 'Pacific/Rarotonga',
+ 'Pacific/Saipan',
+ 'Pacific/Samoa',
+ 'Pacific/Tahiti',
+ 'Pacific/Tarawa',
+ 'Pacific/Tongatapu',
+ 'Pacific/Truk',
+ 'Pacific/Wake',
+ 'Pacific/Wallis',
+ 'Pacific/Yap',
+ 'Poland',
+ 'Portugal',
+ 'ROC',
+ 'ROK',
+ 'Singapore',
+ 'Turkey',
+ 'UCT',
+ 'US/Alaska',
+ 'US/Aleutian',
+ 'US/Arizona',
+ 'US/Central',
+ 'US/East-Indiana',
+ 'US/Eastern',
+ 'US/Hawaii',
+ 'US/Indiana-Starke',
+ 'US/Michigan',
+ 'US/Mountain',
+ 'US/Pacific',
+ 'US/Pacific-New',
+ 'US/Samoa',
+ 'UTC',
+ 'Universal',
+ 'W-SU',
+ 'WET',
+ 'Zulu',
+ 'posixrules']
diff --git a/lib/pytz/__init__.pyc b/lib/pytz/__init__.pyc
new file mode 100644
index 0000000..a3f5b76
Binary files /dev/null and b/lib/pytz/__init__.pyc differ
diff --git a/lib/pytz/locales/pytz.pot b/lib/pytz/locales/pytz.pot
new file mode 100755
index 0000000..fc06204
--- /dev/null
+++ b/lib/pytz/locales/pytz.pot
@@ -0,0 +1,1645 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: pytz 2006p\n"
+"POT-Creation-Date: 2006-12-08 05:03+UTC\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+
+
+msgid "Africa/Abidjan"
+msgstr ""
+
+msgid "Africa/Accra"
+msgstr ""
+
+msgid "Africa/Addis_Ababa"
+msgstr ""
+
+msgid "Africa/Algiers"
+msgstr ""
+
+msgid "Africa/Asmera"
+msgstr ""
+
+msgid "Africa/Bamako"
+msgstr ""
+
+msgid "Africa/Bangui"
+msgstr ""
+
+msgid "Africa/Banjul"
+msgstr ""
+
+msgid "Africa/Bissau"
+msgstr ""
+
+msgid "Africa/Blantyre"
+msgstr ""
+
+msgid "Africa/Brazzaville"
+msgstr ""
+
+msgid "Africa/Bujumbura"
+msgstr ""
+
+msgid "Africa/Cairo"
+msgstr ""
+
+msgid "Africa/Casablanca"
+msgstr ""
+
+msgid "Africa/Ceuta"
+msgstr ""
+
+msgid "Africa/Conakry"
+msgstr ""
+
+msgid "Africa/Dakar"
+msgstr ""
+
+msgid "Africa/Dar_es_Salaam"
+msgstr ""
+
+msgid "Africa/Djibouti"
+msgstr ""
+
+msgid "Africa/Douala"
+msgstr ""
+
+msgid "Africa/El_Aaiun"
+msgstr ""
+
+msgid "Africa/Freetown"
+msgstr ""
+
+msgid "Africa/Gaborone"
+msgstr ""
+
+msgid "Africa/Harare"
+msgstr ""
+
+msgid "Africa/Johannesburg"
+msgstr ""
+
+msgid "Africa/Kampala"
+msgstr ""
+
+msgid "Africa/Khartoum"
+msgstr ""
+
+msgid "Africa/Kigali"
+msgstr ""
+
+msgid "Africa/Kinshasa"
+msgstr ""
+
+msgid "Africa/Lagos"
+msgstr ""
+
+msgid "Africa/Libreville"
+msgstr ""
+
+msgid "Africa/Lome"
+msgstr ""
+
+msgid "Africa/Luanda"
+msgstr ""
+
+msgid "Africa/Lubumbashi"
+msgstr ""
+
+msgid "Africa/Lusaka"
+msgstr ""
+
+msgid "Africa/Malabo"
+msgstr ""
+
+msgid "Africa/Maputo"
+msgstr ""
+
+msgid "Africa/Maseru"
+msgstr ""
+
+msgid "Africa/Mbabane"
+msgstr ""
+
+msgid "Africa/Mogadishu"
+msgstr ""
+
+msgid "Africa/Monrovia"
+msgstr ""
+
+msgid "Africa/Nairobi"
+msgstr ""
+
+msgid "Africa/Ndjamena"
+msgstr ""
+
+msgid "Africa/Niamey"
+msgstr ""
+
+msgid "Africa/Nouakchott"
+msgstr ""
+
+msgid "Africa/Ouagadougou"
+msgstr ""
+
+msgid "Africa/Porto-Novo"
+msgstr ""
+
+msgid "Africa/Sao_Tome"
+msgstr ""
+
+msgid "Africa/Timbuktu"
+msgstr ""
+
+msgid "Africa/Tripoli"
+msgstr ""
+
+msgid "Africa/Tunis"
+msgstr ""
+
+msgid "Africa/Windhoek"
+msgstr ""
+
+msgid "America/Adak"
+msgstr ""
+
+msgid "America/Anchorage"
+msgstr ""
+
+msgid "America/Anguilla"
+msgstr ""
+
+msgid "America/Antigua"
+msgstr ""
+
+msgid "America/Araguaina"
+msgstr ""
+
+msgid "America/Argentina/Buenos_Aires"
+msgstr ""
+
+msgid "America/Argentina/Catamarca"
+msgstr ""
+
+msgid "America/Argentina/ComodRivadavia"
+msgstr ""
+
+msgid "America/Argentina/Cordoba"
+msgstr ""
+
+msgid "America/Argentina/Jujuy"
+msgstr ""
+
+msgid "America/Argentina/La_Rioja"
+msgstr ""
+
+msgid "America/Argentina/Mendoza"
+msgstr ""
+
+msgid "America/Argentina/Rio_Gallegos"
+msgstr ""
+
+msgid "America/Argentina/San_Juan"
+msgstr ""
+
+msgid "America/Argentina/Tucuman"
+msgstr ""
+
+msgid "America/Argentina/Ushuaia"
+msgstr ""
+
+msgid "America/Aruba"
+msgstr ""
+
+msgid "America/Asuncion"
+msgstr ""
+
+msgid "America/Atikokan"
+msgstr ""
+
+msgid "America/Atka"
+msgstr ""
+
+msgid "America/Bahia"
+msgstr ""
+
+msgid "America/Barbados"
+msgstr ""
+
+msgid "America/Belem"
+msgstr ""
+
+msgid "America/Belize"
+msgstr ""
+
+msgid "America/Blanc-Sablon"
+msgstr ""
+
+msgid "America/Boa_Vista"
+msgstr ""
+
+msgid "America/Bogota"
+msgstr ""
+
+msgid "America/Boise"
+msgstr ""
+
+msgid "America/Buenos_Aires"
+msgstr ""
+
+msgid "America/Cambridge_Bay"
+msgstr ""
+
+msgid "America/Campo_Grande"
+msgstr ""
+
+msgid "America/Cancun"
+msgstr ""
+
+msgid "America/Caracas"
+msgstr ""
+
+msgid "America/Catamarca"
+msgstr ""
+
+msgid "America/Cayenne"
+msgstr ""
+
+msgid "America/Cayman"
+msgstr ""
+
+msgid "America/Chicago"
+msgstr ""
+
+msgid "America/Chihuahua"
+msgstr ""
+
+msgid "America/Coral_Harbour"
+msgstr ""
+
+msgid "America/Cordoba"
+msgstr ""
+
+msgid "America/Costa_Rica"
+msgstr ""
+
+msgid "America/Cuiaba"
+msgstr ""
+
+msgid "America/Curacao"
+msgstr ""
+
+msgid "America/Danmarkshavn"
+msgstr ""
+
+msgid "America/Dawson"
+msgstr ""
+
+msgid "America/Dawson_Creek"
+msgstr ""
+
+msgid "America/Denver"
+msgstr ""
+
+msgid "America/Detroit"
+msgstr ""
+
+msgid "America/Dominica"
+msgstr ""
+
+msgid "America/Edmonton"
+msgstr ""
+
+msgid "America/Eirunepe"
+msgstr ""
+
+msgid "America/El_Salvador"
+msgstr ""
+
+msgid "America/Ensenada"
+msgstr ""
+
+msgid "America/Fort_Wayne"
+msgstr ""
+
+msgid "America/Fortaleza"
+msgstr ""
+
+msgid "America/Glace_Bay"
+msgstr ""
+
+msgid "America/Godthab"
+msgstr ""
+
+msgid "America/Goose_Bay"
+msgstr ""
+
+msgid "America/Grand_Turk"
+msgstr ""
+
+msgid "America/Grenada"
+msgstr ""
+
+msgid "America/Guadeloupe"
+msgstr ""
+
+msgid "America/Guatemala"
+msgstr ""
+
+msgid "America/Guayaquil"
+msgstr ""
+
+msgid "America/Guyana"
+msgstr ""
+
+msgid "America/Halifax"
+msgstr ""
+
+msgid "America/Havana"
+msgstr ""
+
+msgid "America/Hermosillo"
+msgstr ""
+
+msgid "America/Indiana/Indianapolis"
+msgstr ""
+
+msgid "America/Indiana/Knox"
+msgstr ""
+
+msgid "America/Indiana/Marengo"
+msgstr ""
+
+msgid "America/Indiana/Petersburg"
+msgstr ""
+
+msgid "America/Indiana/Vevay"
+msgstr ""
+
+msgid "America/Indiana/Vincennes"
+msgstr ""
+
+msgid "America/Indianapolis"
+msgstr ""
+
+msgid "America/Inuvik"
+msgstr ""
+
+msgid "America/Iqaluit"
+msgstr ""
+
+msgid "America/Jamaica"
+msgstr ""
+
+msgid "America/Jujuy"
+msgstr ""
+
+msgid "America/Juneau"
+msgstr ""
+
+msgid "America/Kentucky/Louisville"
+msgstr ""
+
+msgid "America/Kentucky/Monticello"
+msgstr ""
+
+msgid "America/Knox_IN"
+msgstr ""
+
+msgid "America/La_Paz"
+msgstr ""
+
+msgid "America/Lima"
+msgstr ""
+
+msgid "America/Los_Angeles"
+msgstr ""
+
+msgid "America/Louisville"
+msgstr ""
+
+msgid "America/Maceio"
+msgstr ""
+
+msgid "America/Managua"
+msgstr ""
+
+msgid "America/Manaus"
+msgstr ""
+
+msgid "America/Martinique"
+msgstr ""
+
+msgid "America/Mazatlan"
+msgstr ""
+
+msgid "America/Mendoza"
+msgstr ""
+
+msgid "America/Menominee"
+msgstr ""
+
+msgid "America/Merida"
+msgstr ""
+
+msgid "America/Mexico_City"
+msgstr ""
+
+msgid "America/Miquelon"
+msgstr ""
+
+msgid "America/Moncton"
+msgstr ""
+
+msgid "America/Monterrey"
+msgstr ""
+
+msgid "America/Montevideo"
+msgstr ""
+
+msgid "America/Montreal"
+msgstr ""
+
+msgid "America/Montserrat"
+msgstr ""
+
+msgid "America/Nassau"
+msgstr ""
+
+msgid "America/New_York"
+msgstr ""
+
+msgid "America/Nipigon"
+msgstr ""
+
+msgid "America/Nome"
+msgstr ""
+
+msgid "America/Noronha"
+msgstr ""
+
+msgid "America/North_Dakota/Center"
+msgstr ""
+
+msgid "America/North_Dakota/New_Salem"
+msgstr ""
+
+msgid "America/Panama"
+msgstr ""
+
+msgid "America/Pangnirtung"
+msgstr ""
+
+msgid "America/Paramaribo"
+msgstr ""
+
+msgid "America/Phoenix"
+msgstr ""
+
+msgid "America/Port-au-Prince"
+msgstr ""
+
+msgid "America/Port_of_Spain"
+msgstr ""
+
+msgid "America/Porto_Acre"
+msgstr ""
+
+msgid "America/Porto_Velho"
+msgstr ""
+
+msgid "America/Puerto_Rico"
+msgstr ""
+
+msgid "America/Rainy_River"
+msgstr ""
+
+msgid "America/Rankin_Inlet"
+msgstr ""
+
+msgid "America/Recife"
+msgstr ""
+
+msgid "America/Regina"
+msgstr ""
+
+msgid "America/Rio_Branco"
+msgstr ""
+
+msgid "America/Rosario"
+msgstr ""
+
+msgid "America/Santiago"
+msgstr ""
+
+msgid "America/Santo_Domingo"
+msgstr ""
+
+msgid "America/Sao_Paulo"
+msgstr ""
+
+msgid "America/Scoresbysund"
+msgstr ""
+
+msgid "America/Shiprock"
+msgstr ""
+
+msgid "America/St_Johns"
+msgstr ""
+
+msgid "America/St_Kitts"
+msgstr ""
+
+msgid "America/St_Lucia"
+msgstr ""
+
+msgid "America/St_Thomas"
+msgstr ""
+
+msgid "America/St_Vincent"
+msgstr ""
+
+msgid "America/Swift_Current"
+msgstr ""
+
+msgid "America/Tegucigalpa"
+msgstr ""
+
+msgid "America/Thule"
+msgstr ""
+
+msgid "America/Thunder_Bay"
+msgstr ""
+
+msgid "America/Tijuana"
+msgstr ""
+
+msgid "America/Toronto"
+msgstr ""
+
+msgid "America/Tortola"
+msgstr ""
+
+msgid "America/Vancouver"
+msgstr ""
+
+msgid "America/Virgin"
+msgstr ""
+
+msgid "America/Whitehorse"
+msgstr ""
+
+msgid "America/Winnipeg"
+msgstr ""
+
+msgid "America/Yakutat"
+msgstr ""
+
+msgid "America/Yellowknife"
+msgstr ""
+
+msgid "Antarctica/Casey"
+msgstr ""
+
+msgid "Antarctica/Davis"
+msgstr ""
+
+msgid "Antarctica/DumontDUrville"
+msgstr ""
+
+msgid "Antarctica/Mawson"
+msgstr ""
+
+msgid "Antarctica/McMurdo"
+msgstr ""
+
+msgid "Antarctica/Palmer"
+msgstr ""
+
+msgid "Antarctica/Rothera"
+msgstr ""
+
+msgid "Antarctica/South_Pole"
+msgstr ""
+
+msgid "Antarctica/Syowa"
+msgstr ""
+
+msgid "Antarctica/Vostok"
+msgstr ""
+
+msgid "Arctic/Longyearbyen"
+msgstr ""
+
+msgid "Asia/Aden"
+msgstr ""
+
+msgid "Asia/Almaty"
+msgstr ""
+
+msgid "Asia/Amman"
+msgstr ""
+
+msgid "Asia/Anadyr"
+msgstr ""
+
+msgid "Asia/Aqtau"
+msgstr ""
+
+msgid "Asia/Aqtobe"
+msgstr ""
+
+msgid "Asia/Ashgabat"
+msgstr ""
+
+msgid "Asia/Ashkhabad"
+msgstr ""
+
+msgid "Asia/Baghdad"
+msgstr ""
+
+msgid "Asia/Bahrain"
+msgstr ""
+
+msgid "Asia/Baku"
+msgstr ""
+
+msgid "Asia/Bangkok"
+msgstr ""
+
+msgid "Asia/Beirut"
+msgstr ""
+
+msgid "Asia/Bishkek"
+msgstr ""
+
+msgid "Asia/Brunei"
+msgstr ""
+
+msgid "Asia/Calcutta"
+msgstr ""
+
+msgid "Asia/Choibalsan"
+msgstr ""
+
+msgid "Asia/Chongqing"
+msgstr ""
+
+msgid "Asia/Chungking"
+msgstr ""
+
+msgid "Asia/Colombo"
+msgstr ""
+
+msgid "Asia/Dacca"
+msgstr ""
+
+msgid "Asia/Damascus"
+msgstr ""
+
+msgid "Asia/Dhaka"
+msgstr ""
+
+msgid "Asia/Dili"
+msgstr ""
+
+msgid "Asia/Dubai"
+msgstr ""
+
+msgid "Asia/Dushanbe"
+msgstr ""
+
+msgid "Asia/Gaza"
+msgstr ""
+
+msgid "Asia/Harbin"
+msgstr ""
+
+msgid "Asia/Hong_Kong"
+msgstr ""
+
+msgid "Asia/Hovd"
+msgstr ""
+
+msgid "Asia/Irkutsk"
+msgstr ""
+
+msgid "Asia/Istanbul"
+msgstr ""
+
+msgid "Asia/Jakarta"
+msgstr ""
+
+msgid "Asia/Jayapura"
+msgstr ""
+
+msgid "Asia/Jerusalem"
+msgstr ""
+
+msgid "Asia/Kabul"
+msgstr ""
+
+msgid "Asia/Kamchatka"
+msgstr ""
+
+msgid "Asia/Karachi"
+msgstr ""
+
+msgid "Asia/Kashgar"
+msgstr ""
+
+msgid "Asia/Katmandu"
+msgstr ""
+
+msgid "Asia/Krasnoyarsk"
+msgstr ""
+
+msgid "Asia/Kuala_Lumpur"
+msgstr ""
+
+msgid "Asia/Kuching"
+msgstr ""
+
+msgid "Asia/Kuwait"
+msgstr ""
+
+msgid "Asia/Macao"
+msgstr ""
+
+msgid "Asia/Macau"
+msgstr ""
+
+msgid "Asia/Magadan"
+msgstr ""
+
+msgid "Asia/Makassar"
+msgstr ""
+
+msgid "Asia/Manila"
+msgstr ""
+
+msgid "Asia/Muscat"
+msgstr ""
+
+msgid "Asia/Nicosia"
+msgstr ""
+
+msgid "Asia/Novosibirsk"
+msgstr ""
+
+msgid "Asia/Omsk"
+msgstr ""
+
+msgid "Asia/Oral"
+msgstr ""
+
+msgid "Asia/Phnom_Penh"
+msgstr ""
+
+msgid "Asia/Pontianak"
+msgstr ""
+
+msgid "Asia/Pyongyang"
+msgstr ""
+
+msgid "Asia/Qatar"
+msgstr ""
+
+msgid "Asia/Qyzylorda"
+msgstr ""
+
+msgid "Asia/Rangoon"
+msgstr ""
+
+msgid "Asia/Riyadh"
+msgstr ""
+
+msgid "Asia/Saigon"
+msgstr ""
+
+msgid "Asia/Sakhalin"
+msgstr ""
+
+msgid "Asia/Samarkand"
+msgstr ""
+
+msgid "Asia/Seoul"
+msgstr ""
+
+msgid "Asia/Shanghai"
+msgstr ""
+
+msgid "Asia/Singapore"
+msgstr ""
+
+msgid "Asia/Taipei"
+msgstr ""
+
+msgid "Asia/Tashkent"
+msgstr ""
+
+msgid "Asia/Tbilisi"
+msgstr ""
+
+msgid "Asia/Tehran"
+msgstr ""
+
+msgid "Asia/Tel_Aviv"
+msgstr ""
+
+msgid "Asia/Thimbu"
+msgstr ""
+
+msgid "Asia/Thimphu"
+msgstr ""
+
+msgid "Asia/Tokyo"
+msgstr ""
+
+msgid "Asia/Ujung_Pandang"
+msgstr ""
+
+msgid "Asia/Ulaanbaatar"
+msgstr ""
+
+msgid "Asia/Ulan_Bator"
+msgstr ""
+
+msgid "Asia/Urumqi"
+msgstr ""
+
+msgid "Asia/Vientiane"
+msgstr ""
+
+msgid "Asia/Vladivostok"
+msgstr ""
+
+msgid "Asia/Yakutsk"
+msgstr ""
+
+msgid "Asia/Yekaterinburg"
+msgstr ""
+
+msgid "Asia/Yerevan"
+msgstr ""
+
+msgid "Atlantic/Azores"
+msgstr ""
+
+msgid "Atlantic/Bermuda"
+msgstr ""
+
+msgid "Atlantic/Canary"
+msgstr ""
+
+msgid "Atlantic/Cape_Verde"
+msgstr ""
+
+msgid "Atlantic/Faeroe"
+msgstr ""
+
+msgid "Atlantic/Jan_Mayen"
+msgstr ""
+
+msgid "Atlantic/Madeira"
+msgstr ""
+
+msgid "Atlantic/Reykjavik"
+msgstr ""
+
+msgid "Atlantic/South_Georgia"
+msgstr ""
+
+msgid "Atlantic/St_Helena"
+msgstr ""
+
+msgid "Atlantic/Stanley"
+msgstr ""
+
+msgid "Australia/ACT"
+msgstr ""
+
+msgid "Australia/Adelaide"
+msgstr ""
+
+msgid "Australia/Brisbane"
+msgstr ""
+
+msgid "Australia/Broken_Hill"
+msgstr ""
+
+msgid "Australia/Canberra"
+msgstr ""
+
+msgid "Australia/Currie"
+msgstr ""
+
+msgid "Australia/Darwin"
+msgstr ""
+
+msgid "Australia/Hobart"
+msgstr ""
+
+msgid "Australia/LHI"
+msgstr ""
+
+msgid "Australia/Lindeman"
+msgstr ""
+
+msgid "Australia/Lord_Howe"
+msgstr ""
+
+msgid "Australia/Melbourne"
+msgstr ""
+
+msgid "Australia/NSW"
+msgstr ""
+
+msgid "Australia/North"
+msgstr ""
+
+msgid "Australia/Perth"
+msgstr ""
+
+msgid "Australia/Queensland"
+msgstr ""
+
+msgid "Australia/South"
+msgstr ""
+
+msgid "Australia/Sydney"
+msgstr ""
+
+msgid "Australia/Tasmania"
+msgstr ""
+
+msgid "Australia/Victoria"
+msgstr ""
+
+msgid "Australia/West"
+msgstr ""
+
+msgid "Australia/Yancowinna"
+msgstr ""
+
+msgid "Brazil/Acre"
+msgstr ""
+
+msgid "Brazil/DeNoronha"
+msgstr ""
+
+msgid "Brazil/East"
+msgstr ""
+
+msgid "Brazil/West"
+msgstr ""
+
+msgid "CET"
+msgstr ""
+
+msgid "CST6CDT"
+msgstr ""
+
+msgid "Canada/Atlantic"
+msgstr ""
+
+msgid "Canada/Central"
+msgstr ""
+
+msgid "Canada/East-Saskatchewan"
+msgstr ""
+
+msgid "Canada/Eastern"
+msgstr ""
+
+msgid "Canada/Mountain"
+msgstr ""
+
+msgid "Canada/Newfoundland"
+msgstr ""
+
+msgid "Canada/Pacific"
+msgstr ""
+
+msgid "Canada/Saskatchewan"
+msgstr ""
+
+msgid "Canada/Yukon"
+msgstr ""
+
+msgid "Chile/Continental"
+msgstr ""
+
+msgid "Chile/EasterIsland"
+msgstr ""
+
+msgid "Cuba"
+msgstr ""
+
+msgid "EET"
+msgstr ""
+
+msgid "EST"
+msgstr ""
+
+msgid "EST5EDT"
+msgstr ""
+
+msgid "Egypt"
+msgstr ""
+
+msgid "Eire"
+msgstr ""
+
+msgid "Etc/GMT"
+msgstr ""
+
+msgid "Etc/GMT+0"
+msgstr ""
+
+msgid "Etc/GMT+1"
+msgstr ""
+
+msgid "Etc/GMT+10"
+msgstr ""
+
+msgid "Etc/GMT+11"
+msgstr ""
+
+msgid "Etc/GMT+12"
+msgstr ""
+
+msgid "Etc/GMT+2"
+msgstr ""
+
+msgid "Etc/GMT+3"
+msgstr ""
+
+msgid "Etc/GMT+4"
+msgstr ""
+
+msgid "Etc/GMT+5"
+msgstr ""
+
+msgid "Etc/GMT+6"
+msgstr ""
+
+msgid "Etc/GMT+7"
+msgstr ""
+
+msgid "Etc/GMT+8"
+msgstr ""
+
+msgid "Etc/GMT+9"
+msgstr ""
+
+msgid "Etc/GMT-0"
+msgstr ""
+
+msgid "Etc/GMT-1"
+msgstr ""
+
+msgid "Etc/GMT-10"
+msgstr ""
+
+msgid "Etc/GMT-11"
+msgstr ""
+
+msgid "Etc/GMT-12"
+msgstr ""
+
+msgid "Etc/GMT-13"
+msgstr ""
+
+msgid "Etc/GMT-14"
+msgstr ""
+
+msgid "Etc/GMT-2"
+msgstr ""
+
+msgid "Etc/GMT-3"
+msgstr ""
+
+msgid "Etc/GMT-4"
+msgstr ""
+
+msgid "Etc/GMT-5"
+msgstr ""
+
+msgid "Etc/GMT-6"
+msgstr ""
+
+msgid "Etc/GMT-7"
+msgstr ""
+
+msgid "Etc/GMT-8"
+msgstr ""
+
+msgid "Etc/GMT-9"
+msgstr ""
+
+msgid "Etc/GMT0"
+msgstr ""
+
+msgid "Etc/Greenwich"
+msgstr ""
+
+msgid "Etc/UCT"
+msgstr ""
+
+msgid "Etc/UTC"
+msgstr ""
+
+msgid "Etc/Universal"
+msgstr ""
+
+msgid "Etc/Zulu"
+msgstr ""
+
+msgid "Europe/Amsterdam"
+msgstr ""
+
+msgid "Europe/Andorra"
+msgstr ""
+
+msgid "Europe/Athens"
+msgstr ""
+
+msgid "Europe/Belfast"
+msgstr ""
+
+msgid "Europe/Belgrade"
+msgstr ""
+
+msgid "Europe/Berlin"
+msgstr ""
+
+msgid "Europe/Bratislava"
+msgstr ""
+
+msgid "Europe/Brussels"
+msgstr ""
+
+msgid "Europe/Bucharest"
+msgstr ""
+
+msgid "Europe/Budapest"
+msgstr ""
+
+msgid "Europe/Chisinau"
+msgstr ""
+
+msgid "Europe/Copenhagen"
+msgstr ""
+
+msgid "Europe/Dublin"
+msgstr ""
+
+msgid "Europe/Gibraltar"
+msgstr ""
+
+msgid "Europe/Guernsey"
+msgstr ""
+
+msgid "Europe/Helsinki"
+msgstr ""
+
+msgid "Europe/Isle_of_Man"
+msgstr ""
+
+msgid "Europe/Istanbul"
+msgstr ""
+
+msgid "Europe/Jersey"
+msgstr ""
+
+msgid "Europe/Kaliningrad"
+msgstr ""
+
+msgid "Europe/Kiev"
+msgstr ""
+
+msgid "Europe/Lisbon"
+msgstr ""
+
+msgid "Europe/Ljubljana"
+msgstr ""
+
+msgid "Europe/London"
+msgstr ""
+
+msgid "Europe/Luxembourg"
+msgstr ""
+
+msgid "Europe/Madrid"
+msgstr ""
+
+msgid "Europe/Malta"
+msgstr ""
+
+msgid "Europe/Mariehamn"
+msgstr ""
+
+msgid "Europe/Minsk"
+msgstr ""
+
+msgid "Europe/Monaco"
+msgstr ""
+
+msgid "Europe/Moscow"
+msgstr ""
+
+msgid "Europe/Nicosia"
+msgstr ""
+
+msgid "Europe/Oslo"
+msgstr ""
+
+msgid "Europe/Paris"
+msgstr ""
+
+msgid "Europe/Podgorica"
+msgstr ""
+
+msgid "Europe/Prague"
+msgstr ""
+
+msgid "Europe/Riga"
+msgstr ""
+
+msgid "Europe/Rome"
+msgstr ""
+
+msgid "Europe/Samara"
+msgstr ""
+
+msgid "Europe/San_Marino"
+msgstr ""
+
+msgid "Europe/Sarajevo"
+msgstr ""
+
+msgid "Europe/Simferopol"
+msgstr ""
+
+msgid "Europe/Skopje"
+msgstr ""
+
+msgid "Europe/Sofia"
+msgstr ""
+
+msgid "Europe/Stockholm"
+msgstr ""
+
+msgid "Europe/Tallinn"
+msgstr ""
+
+msgid "Europe/Tirane"
+msgstr ""
+
+msgid "Europe/Tiraspol"
+msgstr ""
+
+msgid "Europe/Uzhgorod"
+msgstr ""
+
+msgid "Europe/Vaduz"
+msgstr ""
+
+msgid "Europe/Vatican"
+msgstr ""
+
+msgid "Europe/Vienna"
+msgstr ""
+
+msgid "Europe/Vilnius"
+msgstr ""
+
+msgid "Europe/Volgograd"
+msgstr ""
+
+msgid "Europe/Warsaw"
+msgstr ""
+
+msgid "Europe/Zagreb"
+msgstr ""
+
+msgid "Europe/Zaporozhye"
+msgstr ""
+
+msgid "Europe/Zurich"
+msgstr ""
+
+msgid "GB"
+msgstr ""
+
+msgid "GB-Eire"
+msgstr ""
+
+msgid "GMT"
+msgstr ""
+
+msgid "GMT+0"
+msgstr ""
+
+msgid "GMT-0"
+msgstr ""
+
+msgid "GMT0"
+msgstr ""
+
+msgid "Greenwich"
+msgstr ""
+
+msgid "HST"
+msgstr ""
+
+msgid "Hongkong"
+msgstr ""
+
+msgid "Iceland"
+msgstr ""
+
+msgid "Indian/Antananarivo"
+msgstr ""
+
+msgid "Indian/Chagos"
+msgstr ""
+
+msgid "Indian/Christmas"
+msgstr ""
+
+msgid "Indian/Cocos"
+msgstr ""
+
+msgid "Indian/Comoro"
+msgstr ""
+
+msgid "Indian/Kerguelen"
+msgstr ""
+
+msgid "Indian/Mahe"
+msgstr ""
+
+msgid "Indian/Maldives"
+msgstr ""
+
+msgid "Indian/Mauritius"
+msgstr ""
+
+msgid "Indian/Mayotte"
+msgstr ""
+
+msgid "Indian/Reunion"
+msgstr ""
+
+msgid "Iran"
+msgstr ""
+
+msgid "Israel"
+msgstr ""
+
+msgid "Jamaica"
+msgstr ""
+
+msgid "Japan"
+msgstr ""
+
+msgid "Kwajalein"
+msgstr ""
+
+msgid "Libya"
+msgstr ""
+
+msgid "MET"
+msgstr ""
+
+msgid "MST"
+msgstr ""
+
+msgid "MST7MDT"
+msgstr ""
+
+msgid "Mexico/BajaNorte"
+msgstr ""
+
+msgid "Mexico/BajaSur"
+msgstr ""
+
+msgid "Mexico/General"
+msgstr ""
+
+msgid "NZ"
+msgstr ""
+
+msgid "NZ-CHAT"
+msgstr ""
+
+msgid "Navajo"
+msgstr ""
+
+msgid "PRC"
+msgstr ""
+
+msgid "PST8PDT"
+msgstr ""
+
+msgid "Pacific/Apia"
+msgstr ""
+
+msgid "Pacific/Auckland"
+msgstr ""
+
+msgid "Pacific/Chatham"
+msgstr ""
+
+msgid "Pacific/Easter"
+msgstr ""
+
+msgid "Pacific/Efate"
+msgstr ""
+
+msgid "Pacific/Enderbury"
+msgstr ""
+
+msgid "Pacific/Fakaofo"
+msgstr ""
+
+msgid "Pacific/Fiji"
+msgstr ""
+
+msgid "Pacific/Funafuti"
+msgstr ""
+
+msgid "Pacific/Galapagos"
+msgstr ""
+
+msgid "Pacific/Gambier"
+msgstr ""
+
+msgid "Pacific/Guadalcanal"
+msgstr ""
+
+msgid "Pacific/Guam"
+msgstr ""
+
+msgid "Pacific/Honolulu"
+msgstr ""
+
+msgid "Pacific/Johnston"
+msgstr ""
+
+msgid "Pacific/Kiritimati"
+msgstr ""
+
+msgid "Pacific/Kosrae"
+msgstr ""
+
+msgid "Pacific/Kwajalein"
+msgstr ""
+
+msgid "Pacific/Majuro"
+msgstr ""
+
+msgid "Pacific/Marquesas"
+msgstr ""
+
+msgid "Pacific/Midway"
+msgstr ""
+
+msgid "Pacific/Nauru"
+msgstr ""
+
+msgid "Pacific/Niue"
+msgstr ""
+
+msgid "Pacific/Norfolk"
+msgstr ""
+
+msgid "Pacific/Noumea"
+msgstr ""
+
+msgid "Pacific/Pago_Pago"
+msgstr ""
+
+msgid "Pacific/Palau"
+msgstr ""
+
+msgid "Pacific/Pitcairn"
+msgstr ""
+
+msgid "Pacific/Ponape"
+msgstr ""
+
+msgid "Pacific/Port_Moresby"
+msgstr ""
+
+msgid "Pacific/Rarotonga"
+msgstr ""
+
+msgid "Pacific/Saipan"
+msgstr ""
+
+msgid "Pacific/Samoa"
+msgstr ""
+
+msgid "Pacific/Tahiti"
+msgstr ""
+
+msgid "Pacific/Tarawa"
+msgstr ""
+
+msgid "Pacific/Tongatapu"
+msgstr ""
+
+msgid "Pacific/Truk"
+msgstr ""
+
+msgid "Pacific/Wake"
+msgstr ""
+
+msgid "Pacific/Wallis"
+msgstr ""
+
+msgid "Pacific/Yap"
+msgstr ""
+
+msgid "Poland"
+msgstr ""
+
+msgid "Portugal"
+msgstr ""
+
+msgid "ROC"
+msgstr ""
+
+msgid "ROK"
+msgstr ""
+
+msgid "Singapore"
+msgstr ""
+
+msgid "Turkey"
+msgstr ""
+
+msgid "UCT"
+msgstr ""
+
+msgid "US/Alaska"
+msgstr ""
+
+msgid "US/Aleutian"
+msgstr ""
+
+msgid "US/Arizona"
+msgstr ""
+
+msgid "US/Central"
+msgstr ""
+
+msgid "US/East-Indiana"
+msgstr ""
+
+msgid "US/Eastern"
+msgstr ""
+
+msgid "US/Hawaii"
+msgstr ""
+
+msgid "US/Indiana-Starke"
+msgstr ""
+
+msgid "US/Michigan"
+msgstr ""
+
+msgid "US/Mountain"
+msgstr ""
+
+msgid "US/Pacific"
+msgstr ""
+
+msgid "US/Pacific-New"
+msgstr ""
+
+msgid "US/Samoa"
+msgstr ""
+
+msgid "UTC"
+msgstr ""
+
+msgid "Universal"
+msgstr ""
+
+msgid "W-SU"
+msgstr ""
+
+msgid "WET"
+msgstr ""
+
+msgid "Zulu"
+msgstr ""
+
+msgid "posixrules"
+msgstr ""
+
diff --git a/lib/pytz/reference.py b/lib/pytz/reference.py
new file mode 100755
index 0000000..3dda13e
--- /dev/null
+++ b/lib/pytz/reference.py
@@ -0,0 +1,127 @@
+'''
+Reference tzinfo implementations from the Python docs.
+Used for testing against as they are only correct for the years
+1987 to 2006. Do not use these for real code.
+'''
+
+from datetime import tzinfo, timedelta, datetime
+from pytz import utc, UTC, HOUR, ZERO
+
+# A class building tzinfo objects for fixed-offset time zones.
+# Note that FixedOffset(0, "UTC") is a different way to build a
+# UTC tzinfo object.
+
+class FixedOffset(tzinfo):
+    """Fixed offset in minutes east from UTC."""
+
+    def __init__(self, offset, name):
+        self.__offset = timedelta(minutes = offset)
+        self.__name = name
+
+    def utcoffset(self, dt):
+        return self.__offset
+
+    def tzname(self, dt):
+        return self.__name
+
+    def dst(self, dt):
+        return ZERO
+
+# A class capturing the platform's idea of local time.
+
+import time as _time
+
+STDOFFSET = timedelta(seconds = -_time.timezone)
+if _time.daylight:
+    DSTOFFSET = timedelta(seconds = -_time.altzone)
+else:
+    DSTOFFSET = STDOFFSET
+
+DSTDIFF = DSTOFFSET - STDOFFSET
+
+class LocalTimezone(tzinfo):
+
+    def utcoffset(self, dt):
+        if self._isdst(dt):
+            return DSTOFFSET
+        else:
+            return STDOFFSET
+
+    def dst(self, dt):
+        if self._isdst(dt):
+            return DSTDIFF
+        else:
+            return ZERO
+
+    def tzname(self, dt):
+        return _time.tzname[self._isdst(dt)]
+
+    def _isdst(self, dt):
+        tt = (dt.year, dt.month, dt.day,
+              dt.hour, dt.minute, dt.second,
+              dt.weekday(), 0, -1)
+        stamp = _time.mktime(tt)
+        tt = _time.localtime(stamp)
+        return tt.tm_isdst > 0
+
+Local = LocalTimezone()
+
+# A complete implementation of current DST rules for major US time zones.
+
+def first_sunday_on_or_after(dt):
+    days_to_go = 6 - dt.weekday()
+    if days_to_go:
+        dt += timedelta(days_to_go)
+    return dt
+
+# In the US, DST starts at 2am (standard time) on the first Sunday in April.
+DSTSTART = datetime(1, 4, 1, 2)
+# and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct.
+# which is the first Sunday on or after Oct 25.
+DSTEND = datetime(1, 10, 25, 1)
+
+class USTimeZone(tzinfo):
+
+    def __init__(self, hours, reprname, stdname, dstname):
+        self.stdoffset = timedelta(hours=hours)
+        self.reprname = reprname
+        self.stdname = stdname
+        self.dstname = dstname
+
+    def __repr__(self):
+        return self.reprname
+
+    def tzname(self, dt):
+        if self.dst(dt):
+            return self.dstname
+        else:
+            return self.stdname
+
+    def utcoffset(self, dt):
+        return self.stdoffset + self.dst(dt)
+
+    def dst(self, dt):
+        if dt is None or dt.tzinfo is None:
+            # An exception may be sensible here, in one or both cases.
+            # It depends on how you want to treat them.  The default
+            # fromutc() implementation (called by the default astimezone()
+            # implementation) passes a datetime with dt.tzinfo is self.
+            return ZERO
+        assert dt.tzinfo is self
+
+        # Find first Sunday in April & the last in October.
+        start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year))
+        end = first_sunday_on_or_after(DSTEND.replace(year=dt.year))
+
+        # Can't compare naive to aware objects, so strip the timezone from
+        # dt first.
+        if start <= dt.replace(tzinfo=None) < end:
+            return HOUR
+        else:
+            return ZERO
+
+Eastern  = USTimeZone(-5, "Eastern",  "EST", "EDT")
+Central  = USTimeZone(-6, "Central",  "CST", "CDT")
+Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
+Pacific  = USTimeZone(-8, "Pacific",  "PST", "PDT")
+
diff --git a/lib/pytz/tests/__init__.py b/lib/pytz/tests/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/tests/test_docs.py b/lib/pytz/tests/test_docs.py
new file mode 100755
index 0000000..c37be3e
--- /dev/null
+++ b/lib/pytz/tests/test_docs.py
@@ -0,0 +1,35 @@
+# -*- coding: ascii -*-
+
+import unittest, os, os.path, sys
+from doctest import DocTestSuite
+
+# We test the documentation this way instead of using DocFileSuite so
+# we can run the tests under Python 2.3
+def test_README():
+    pass
+
+this_dir = os.path.dirname(__file__)
+locs = [
+    os.path.join(this_dir, os.pardir, 'README.txt'),
+    os.path.join(this_dir, os.pardir, os.pardir, 'README.txt'),
+    ]
+for loc in locs:
+    if os.path.exists(loc):
+        test_README.__doc__ = open(loc).read()
+        break
+if test_README.__doc__ is None:
+    raise RuntimeError('README.txt not found')
+
+README = DocTestSuite()
+
+def test_suite():
+    "For the Z3 test runner"
+    return README
+
+if __name__ == '__main__':
+    sys.path.insert(0, os.path.abspath(os.path.join(
+        this_dir, os.pardir, os.pardir
+        )))
+    unittest.main(defaultTest='README')
+
+
diff --git a/lib/pytz/tests/test_tzinfo.py b/lib/pytz/tests/test_tzinfo.py
new file mode 100755
index 0000000..9afebf4
--- /dev/null
+++ b/lib/pytz/tests/test_tzinfo.py
@@ -0,0 +1,457 @@
+# -*- coding: ascii -*-
+
+import sys, os, os.path
+import unittest, doctest
+import cPickle as pickle
+from datetime import datetime, tzinfo, timedelta
+
+if __name__ == '__main__':
+    # Only munge path if invoked as a script. Testrunners should have setup
+    # the paths already
+    sys.path.insert(0, os.path.abspath(os.path.join(os.pardir, os.pardir)))
+
+import pytz
+from pytz import reference
+
+EXPECTED_VERSION='2006p'
+
+fmt = '%Y-%m-%d %H:%M:%S %Z%z'
+
+NOTIME = timedelta(0)
+
+# GMT is a tzinfo.StaticTzInfo--the class we primarily want to test--while
+# UTC is reference implementation.  They both have the same timezone meaning.
+UTC = pytz.timezone('UTC')
+GMT = pytz.timezone('GMT')
+
+class BasicTest(unittest.TestCase):
+
+    def testVersion(self):
+        # Ensuring the correct version of pytz has been loaded
+        self.failUnlessEqual(EXPECTED_VERSION, pytz.__version__,
+                'Incorrect pytz version loaded. Import path is stuffed '
+                'or this test needs updating. (Wanted %s, got %s)'
+                % (EXPECTED_VERSION, pytz.__version__)
+                )
+
+    def testGMT(self):
+        now = datetime.now(tz=GMT)
+        self.failUnless(now.utcoffset() == NOTIME)
+        self.failUnless(now.dst() == NOTIME)
+        self.failUnless(now.timetuple() == now.utctimetuple())
+        self.failUnless(now==now.replace(tzinfo=UTC))
+
+    def testReferenceUTC(self):
+        now = datetime.now(tz=UTC)
+        self.failUnless(now.utcoffset() == NOTIME)
+        self.failUnless(now.dst() == NOTIME)
+        self.failUnless(now.timetuple() == now.utctimetuple())
+
+
+class PicklingTest(unittest.TestCase):
+
+    def _roundtrip_tzinfo(self, tz):
+        p = pickle.dumps(tz)
+        unpickled_tz = pickle.loads(p)
+        self.failUnless(tz is unpickled_tz, '%s did not roundtrip' % tz.zone)
+
+    def _roundtrip_datetime(self, dt):
+        # Ensure that the tzinfo attached to a datetime instance
+        # is identical to the one returned. This is important for
+        # DST timezones, as some state is stored in the tzinfo.
+        tz = dt.tzinfo
+        p = pickle.dumps(dt)
+        unpickled_dt = pickle.loads(p)
+        unpickled_tz = unpickled_dt.tzinfo
+        self.failUnless(tz is unpickled_tz, '%s did not roundtrip' % tz.zone)
+
+    def testDst(self):
+        tz = pytz.timezone('Europe/Amsterdam')
+        dt = datetime(2004, 2, 1, 0, 0, 0)
+
+        for localized_tz in tz._tzinfos.values():
+            self._roundtrip_tzinfo(localized_tz)
+            self._roundtrip_datetime(dt.replace(tzinfo=localized_tz))
+
+    def testRoundtrip(self):
+        dt = datetime(2004, 2, 1, 0, 0, 0)
+        for zone in pytz.all_timezones:
+            tz = pytz.timezone(zone)
+            self._roundtrip_tzinfo(tz)
+
+    def testDatabaseFixes(self):
+        # Hack the pickle to make it refer to a timezone abbreviation
+        # that does not match anything. The unpickler should be able
+        # to repair this case
+        tz = pytz.timezone('Australia/Melbourne')
+        p = pickle.dumps(tz)
+        tzname = tz._tzname
+        hacked_p = p.replace(tzname, '???')
+        self.failIfEqual(p, hacked_p)
+        unpickled_tz = pickle.loads(hacked_p)
+        self.failUnless(tz is unpickled_tz)
+
+        # Simulate a database correction. In this case, the incorrect
+        # data will continue to be used.
+        p = pickle.dumps(tz)
+        new_utcoffset = tz._utcoffset.seconds + 42
+        hacked_p = p.replace(str(tz._utcoffset.seconds), str(new_utcoffset))
+        self.failIfEqual(p, hacked_p)
+        unpickled_tz = pickle.loads(hacked_p)
+        self.failUnlessEqual(unpickled_tz._utcoffset.seconds, new_utcoffset)
+        self.failUnless(tz is not unpickled_tz)
+
+
+class USEasternDSTStartTestCase(unittest.TestCase):
+    tzinfo = pytz.timezone('US/Eastern')
+
+    # 24 hours before DST changeover
+    transition_time = datetime(2002, 4, 7, 7, 0, 0, tzinfo=UTC)
+
+    # Increase for 'flexible' DST transitions due to 1 minute granularity
+    # of Python's datetime library
+    instant = timedelta(seconds=1)
+
+    # before transition
+    before = {
+        'tzname': 'EST',
+        'utcoffset': timedelta(hours = -5),
+        'dst': timedelta(hours = 0),
+        }
+
+    # after transition
+    after = {
+        'tzname': 'EDT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+
+    def _test_tzname(self, utc_dt, wanted):
+        tzname = wanted['tzname']
+        dt = utc_dt.astimezone(self.tzinfo)
+        self.failUnlessEqual(dt.tzname(), tzname,
+            'Expected %s as tzname for %s. Got %s' % (
+                tzname, str(utc_dt), dt.tzname()
+                )
+            )
+
+    def _test_utcoffset(self, utc_dt, wanted):
+        utcoffset = wanted['utcoffset']
+        dt = utc_dt.astimezone(self.tzinfo)
+        self.failUnlessEqual(
+                dt.utcoffset(), wanted['utcoffset'],
+                'Expected %s as utcoffset for %s. Got %s' % (
+                    utcoffset, utc_dt, dt.utcoffset()
+                    )
+                )
+
+    def _test_dst(self, utc_dt, wanted):
+        dst = wanted['dst']
+        dt = utc_dt.astimezone(self.tzinfo)
+        self.failUnlessEqual(dt.dst(),dst,
+            'Expected %s as dst for %s. Got %s' % (
+                dst, utc_dt, dt.dst()
+                )
+            )
+
+    def test_arithmetic(self):
+        utc_dt = self.transition_time
+
+        for days in range(-420, 720, 20):
+            delta = timedelta(days=days)
+
+            # Make sure we can get back where we started
+            dt = utc_dt.astimezone(self.tzinfo)
+            dt2 = dt + delta
+            dt2 = dt2 - delta
+            self.failUnlessEqual(dt, dt2)
+
+            # Make sure arithmetic crossing DST boundaries ends
+            # up in the correct timezone after normalization
+            self.failUnlessEqual(
+                    (utc_dt + delta).astimezone(self.tzinfo).strftime(fmt),
+                    self.tzinfo.normalize(dt + delta).strftime(fmt),
+                    'Incorrect result for delta==%d days.  Wanted %r. Got %r'%(
+                        days,
+                        (utc_dt + delta).astimezone(self.tzinfo).strftime(fmt),
+                        self.tzinfo.normalize(dt + delta).strftime(fmt),
+                        )
+                    )
+
+    def _test_all(self, utc_dt, wanted):
+        self._test_utcoffset(utc_dt, wanted)
+        self._test_tzname(utc_dt, wanted)
+        self._test_dst(utc_dt, wanted)
+
+    def testDayBefore(self):
+        self._test_all(
+                self.transition_time - timedelta(days=1), self.before
+                )
+
+    def testTwoHoursBefore(self):
+        self._test_all(
+                self.transition_time - timedelta(hours=2), self.before
+                )
+
+    def testHourBefore(self):
+        self._test_all(
+                self.transition_time - timedelta(hours=1), self.before
+                )
+
+    def testInstantBefore(self):
+        self._test_all(
+                self.transition_time - self.instant, self.before
+                )
+
+    def testTransition(self):
+        self._test_all(
+                self.transition_time, self.after
+                )
+
+    def testInstantAfter(self):
+        self._test_all(
+                self.transition_time + self.instant, self.after
+                )
+
+    def testHourAfter(self):
+        self._test_all(
+                self.transition_time + timedelta(hours=1), self.after
+                )
+
+    def testTwoHoursAfter(self):
+        self._test_all(
+                self.transition_time + timedelta(hours=1), self.after
+                )
+
+    def testDayAfter(self):
+        self._test_all(
+                self.transition_time + timedelta(days=1), self.after
+                )
+
+
+class USEasternDSTEndTestCase(USEasternDSTStartTestCase):
+    tzinfo = pytz.timezone('US/Eastern')
+    transition_time = datetime(2002, 10, 27, 6, 0, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'EDT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+    after = {
+        'tzname': 'EST',
+        'utcoffset': timedelta(hours = -5),
+        'dst': timedelta(hours = 0),
+        }
+
+
+class USEasternEPTStartTestCase(USEasternDSTStartTestCase):
+    transition_time = datetime(1945, 8, 14, 23, 0, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'EWT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+    after = {
+        'tzname': 'EPT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+
+
+class USEasternEPTEndTestCase(USEasternDSTStartTestCase):
+    transition_time = datetime(1945, 9, 30, 6, 0, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'EPT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+    after = {
+        'tzname': 'EST',
+        'utcoffset': timedelta(hours = -5),
+        'dst': timedelta(hours = 0),
+        }
+
+
+class WarsawWMTEndTestCase(USEasternDSTStartTestCase):
+    # In 1915, Warsaw changed from Warsaw to Central European time.
+    # This involved the clocks being set backwards, causing a end-of-DST
+    # like situation without DST being involved.
+    tzinfo = pytz.timezone('Europe/Warsaw')
+    transition_time = datetime(1915, 8, 4, 22, 36, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'WMT',
+        'utcoffset': timedelta(hours=1, minutes=24),
+        'dst': timedelta(0),
+        }
+    after = {
+        'tzname': 'CET',
+        'utcoffset': timedelta(hours=1),
+        'dst': timedelta(0),
+        }
+
+
+class VilniusWMTEndTestCase(USEasternDSTStartTestCase):
+    # At the end of 1916, Vilnius changed timezones putting its clock
+    # forward by 11 minutes 35 seconds. Neither timezone was in DST mode.
+    tzinfo = pytz.timezone('Europe/Vilnius')
+    instant = timedelta(seconds=31)
+    transition_time = datetime(1916, 12, 31, 22, 36, 00, tzinfo=UTC)
+    before = {
+        'tzname': 'WMT',
+        'utcoffset': timedelta(hours=1, minutes=24),
+        'dst': timedelta(0),
+        }
+    after = {
+        'tzname': 'KMT',
+        'utcoffset': timedelta(hours=1, minutes=36), # Really 1:35:36
+        'dst': timedelta(0),
+        }
+
+
+class ReferenceUSEasternDSTStartTestCase(USEasternDSTStartTestCase):
+    tzinfo = reference.Eastern
+    def test_arithmetic(self):
+        # Reference implementation cannot handle this
+        pass
+
+
+class ReferenceUSEasternDSTEndTestCase(USEasternDSTEndTestCase):
+    tzinfo = reference.Eastern
+
+    def testHourBefore(self):
+        # Python's datetime library has a bug, where the hour before
+        # a daylight savings transition is one hour out. For example,
+        # at the end of US/Eastern daylight savings time, 01:00 EST
+        # occurs twice (once at 05:00 UTC and once at 06:00 UTC),
+        # whereas the first should actually be 01:00 EDT.
+        # Note that this bug is by design - by accepting this ambiguity
+        # for one hour one hour per year, an is_dst flag on datetime.time
+        # became unnecessary.
+        self._test_all(
+                self.transition_time - timedelta(hours=1), self.after
+                )
+
+    def testInstantBefore(self):
+        self._test_all(
+                self.transition_time - timedelta(seconds=1), self.after
+                )
+
+    def test_arithmetic(self):
+        # Reference implementation cannot handle this
+        pass
+
+
+class LocalTestCase(unittest.TestCase):
+    def testLocalize(self):
+        loc_tz = pytz.timezone('Europe/Amsterdam')
+
+        loc_time = loc_tz.localize(datetime(1930, 5, 10, 0, 0, 0))
+        # Actually +00:19:32, but Python datetime rounds this
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'AMT+0020')
+
+        loc_time = loc_tz.localize(datetime(1930, 5, 20, 0, 0, 0))
+        # Actually +00:19:32, but Python datetime rounds this
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'NST+0120')
+
+        loc_time = loc_tz.localize(datetime(1940, 5, 10, 0, 0, 0))
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'NET+0020')
+
+        loc_time = loc_tz.localize(datetime(1940, 5, 20, 0, 0, 0))
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'CEST+0200')
+
+        loc_time = loc_tz.localize(datetime(2004, 2, 1, 0, 0, 0))
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'CET+0100')
+
+        loc_time = loc_tz.localize(datetime(2004, 4, 1, 0, 0, 0))
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'CEST+0200')
+
+        tz = pytz.timezone('Europe/Amsterdam')
+        loc_time = loc_tz.localize(datetime(1943, 3, 29, 1, 59, 59))
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'CET+0100')
+
+
+        # Switch to US
+        loc_tz = pytz.timezone('US/Eastern')
+
+        # End of DST ambiguity check
+        loc_time = loc_tz.localize(datetime(1918, 10, 27, 1, 59, 59), is_dst=1)
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EDT-0400')
+
+        loc_time = loc_tz.localize(datetime(1918, 10, 27, 1, 59, 59), is_dst=0)
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EST-0500')
+
+        self.failUnlessRaises(pytz.AmbiguousTimeError,
+                loc_tz.localize, datetime(1918, 10, 27, 1, 59, 59), is_dst=None
+                )
+
+        # Weird changes - war time and peace time both is_dst==True
+
+        loc_time = loc_tz.localize(datetime(1942, 2, 9, 3, 0, 0))
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EWT-0400')
+
+        loc_time = loc_tz.localize(datetime(1945, 8, 14, 19, 0, 0))
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EPT-0400')
+
+        loc_time = loc_tz.localize(datetime(1945, 9, 30, 1, 0, 0), is_dst=1)
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EPT-0400')
+
+        loc_time = loc_tz.localize(datetime(1945, 9, 30, 1, 0, 0), is_dst=0)
+        self.failUnlessEqual(loc_time.strftime('%Z%z'), 'EST-0500')
+
+    def testNormalize(self):
+        tz = pytz.timezone('US/Eastern')
+        dt = datetime(2004, 4, 4, 7, 0, 0, tzinfo=UTC).astimezone(tz)
+        dt2 = dt - timedelta(minutes=10)
+        self.failUnlessEqual(
+                dt2.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
+                '2004-04-04 02:50:00 EDT-0400'
+                )
+
+        dt2 = tz.normalize(dt2)
+        self.failUnlessEqual(
+                dt2.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
+                '2004-04-04 01:50:00 EST-0500'
+                )
+
+    def testPartialMinuteOffsets(self):
+        # utcoffset in Amsterdam was not a whole minute until 1937
+        # However, we fudge this by rounding them, as the Python
+        # datetime library 
+        tz = pytz.timezone('Europe/Amsterdam')
+        utc_dt = datetime(1914, 1, 1, 13, 40, 28, tzinfo=UTC) # correct
+        utc_dt = utc_dt.replace(second=0) # But we need to fudge it
+        loc_dt = utc_dt.astimezone(tz)
+        self.failUnlessEqual(
+                loc_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
+                '1914-01-01 14:00:00 AMT+0020'
+                )
+
+        # And get back...
+        utc_dt = loc_dt.astimezone(UTC)
+        self.failUnlessEqual(
+                utc_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
+                '1914-01-01 13:40:00 UTC+0000'
+                )
+
+    def no_testCreateLocaltime(self):
+        # It would be nice if this worked, but it doesn't.
+        tz = pytz.timezone('Europe/Amsterdam')
+        dt = datetime(2004, 10, 31, 2, 0, 0, tzinfo=tz)
+        self.failUnlessEqual(
+                dt.strftime(fmt),
+                '2004-10-31 02:00:00 CET+0100'
+                )
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite('pytz'))
+    suite.addTest(doctest.DocTestSuite('pytz.tzinfo'))
+    import test_tzinfo
+    suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_tzinfo))
+    return suite
+
+DEFAULT = test_suite()
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='DEFAULT')
+
diff --git a/lib/pytz/tzinfo.py b/lib/pytz/tzinfo.py
new file mode 100755
index 0000000..8344258
--- /dev/null
+++ b/lib/pytz/tzinfo.py
@@ -0,0 +1,379 @@
+'''Base classes and helpers for building zone specific tzinfo classes'''
+
+from datetime import datetime, timedelta, tzinfo
+from bisect import bisect_right
+from sets import Set
+
+import lib.pytz
+
+__all__ = []
+
+_timedelta_cache = {}
+def memorized_timedelta(seconds):
+    '''Create only one instance of each distinct timedelta'''
+    try:
+        return _timedelta_cache[seconds]
+    except KeyError:
+        delta = timedelta(seconds=seconds)
+        _timedelta_cache[seconds] = delta
+        return delta
+
+_datetime_cache = {}
+def memorized_datetime(*args):
+    '''Create only one instance of each distinct datetime'''
+    try:
+        return _datetime_cache[args]
+    except KeyError:
+        dt = datetime(*args)
+        _datetime_cache[args] = dt
+        return dt
+
+_ttinfo_cache = {}
+def memorized_ttinfo(*args):
+    '''Create only one instance of each distinct tuple'''
+    try:
+        return _ttinfo_cache[args]
+    except KeyError:
+        ttinfo = (
+                memorized_timedelta(args[0]),
+                memorized_timedelta(args[1]),
+                args[2]
+                )
+        _ttinfo_cache[args] = ttinfo
+        return ttinfo
+
+_notime = memorized_timedelta(0)
+
+def _to_seconds(td):
+    '''Convert a timedelta to seconds'''
+    return td.seconds + td.days * 24 * 60 * 60
+
+
+class BaseTzInfo(tzinfo):
+    # Overridden in subclass
+    _utcoffset = None
+    _tzname = None
+    zone = None
+
+    def __str__(self):
+        return self.zone
+
+
+class StaticTzInfo(BaseTzInfo):
+    '''A timezone that has a constant offset from UTC
+
+    These timezones are rare, as most regions have changed their
+    offset from UTC at some point in their history
+    '''
+    def fromutc(self, dt):
+        '''See datetime.tzinfo.fromutc'''
+        return (dt + self._utcoffset).replace(tzinfo=self)
+    
+    def utcoffset(self,dt):
+        '''See datetime.tzinfo.utcoffset'''
+        return self._utcoffset
+
+    def dst(self,dt):
+        '''See datetime.tzinfo.dst'''
+        return _notime
+
+    def tzname(self,dt):
+        '''See datetime.tzinfo.tzname'''
+        return self._tzname
+
+    def localize(self, dt, is_dst=False):
+        '''Convert naive time to local time'''
+        if dt.tzinfo is not None:
+            raise ValueError, 'Not naive datetime (tzinfo is already set)'
+        return dt.replace(tzinfo=self)
+
+    def normalize(self, dt, is_dst=False):
+        '''Correct the timezone information on the given datetime'''
+        if dt.tzinfo is None:
+            raise ValueError, 'Naive time - no tzinfo set'
+        return dt.replace(tzinfo=self)
+
+    def __repr__(self):
+        return '<StaticTzInfo %r>' % (self.zone,)
+
+    def __reduce__(self):
+        # Special pickle to zone remains a singleton and to cope with
+        # database changes. 
+        return pytz._p, (self.zone,)
+
+
+class DstTzInfo(BaseTzInfo):
+    '''A timezone that has a variable offset from UTC
+   
+    The offset might change if daylight savings time comes into effect,
+    or at a point in history when the region decides to change their 
+    timezone definition. 
+
+    '''
+    # Overridden in subclass
+    _utc_transition_times = None # Sorted list of DST transition times in UTC
+    _transition_info = None # [(utcoffset, dstoffset, tzname)] corresponding
+                            # to _utc_transition_times entries
+    zone = None
+
+    # Set in __init__
+    _tzinfos = None
+    _dst = None # DST offset
+
+    def __init__(self, _inf=None, _tzinfos=None):
+        if _inf:
+            self._tzinfos = _tzinfos
+            self._utcoffset, self._dst, self._tzname = _inf
+        else:
+            _tzinfos = {}
+            self._tzinfos = _tzinfos
+            self._utcoffset, self._dst, self._tzname = self._transition_info[0]
+            _tzinfos[self._transition_info[0]] = self
+            for inf in self._transition_info[1:]:
+                if not _tzinfos.has_key(inf):
+                    _tzinfos[inf] = self.__class__(inf, _tzinfos)
+
+    def fromutc(self, dt):
+        '''See datetime.tzinfo.fromutc'''
+        dt = dt.replace(tzinfo=None)
+        idx = max(0, bisect_right(self._utc_transition_times, dt) - 1)
+        inf = self._transition_info[idx]
+        return (dt + inf[0]).replace(tzinfo=self._tzinfos[inf])
+
+    def normalize(self, dt):
+        '''Correct the timezone information on the given datetime
+
+        If date arithmetic crosses DST boundaries, the tzinfo
+        is not magically adjusted. This method normalizes the
+        tzinfo to the correct one.
+
+        To test, first we need to do some setup
+
+        >>> from pytz import timezone
+        >>> utc = timezone('UTC')
+        >>> eastern = timezone('US/Eastern')
+        >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
+
+        We next create a datetime right on an end-of-DST transition point,
+        the instant when the wallclocks are wound back one hour.
+
+        >>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
+        >>> loc_dt = utc_dt.astimezone(eastern)
+        >>> loc_dt.strftime(fmt)
+        '2002-10-27 01:00:00 EST (-0500)'
+
+        Now, if we subtract a few minutes from it, note that the timezone
+        information has not changed.
+
+        >>> before = loc_dt - timedelta(minutes=10)
+        >>> before.strftime(fmt)
+        '2002-10-27 00:50:00 EST (-0500)'
+
+        But we can fix that by calling the normalize method
+
+        >>> before = eastern.normalize(before)
+        >>> before.strftime(fmt)
+        '2002-10-27 01:50:00 EDT (-0400)'
+
+        '''
+        if dt.tzinfo is None:
+            raise ValueError, 'Naive time - no tzinfo set'
+
+        # Convert dt in localtime to UTC
+        offset = dt.tzinfo._utcoffset
+        dt = dt.replace(tzinfo=None)
+        dt = dt - offset
+        # convert it back, and return it
+        return self.fromutc(dt)
+
+    def localize(self, dt, is_dst=False):
+        '''Convert naive time to local time.
+        
+        This method should be used to construct localtimes, rather
+        than passing a tzinfo argument to a datetime constructor.
+
+        is_dst is used to determine the correct timezone in the ambigous
+        period at the end of daylight savings time.
+        
+        >>> from pytz import timezone
+        >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
+        >>> amdam = timezone('Europe/Amsterdam')
+        >>> dt  = datetime(2004, 10, 31, 2, 0, 0)
+        >>> loc_dt1 = amdam.localize(dt, is_dst=True)
+        >>> loc_dt2 = amdam.localize(dt, is_dst=False)
+        >>> loc_dt1.strftime(fmt)
+        '2004-10-31 02:00:00 CEST (+0200)'
+        >>> loc_dt2.strftime(fmt)
+        '2004-10-31 02:00:00 CET (+0100)'
+        >>> str(loc_dt2 - loc_dt1)
+        '1:00:00'
+
+        Use is_dst=None to raise an AmbiguousTimeError for ambiguous
+        times at the end of daylight savings
+
+        >>> try:
+        ...     loc_dt1 = amdam.localize(dt, is_dst=None)
+        ... except AmbiguousTimeError:
+        ...     print 'Oops'
+        Oops
+
+        >>> loc_dt1 = amdam.localize(dt, is_dst=None)
+        Traceback (most recent call last):
+            [...]
+        AmbiguousTimeError: 2004-10-31 02:00:00
+
+        is_dst defaults to False
+        
+        >>> amdam.localize(dt) == amdam.localize(dt, False)
+        True
+
+        '''
+        if dt.tzinfo is not None:
+            raise ValueError, 'Not naive datetime (tzinfo is already set)'
+
+        # Find the possibly correct timezones. We probably just have one,
+        # but we might end up with two if we are in the end-of-DST
+        # transition period. Or possibly more in some particularly confused
+        # location...
+        possible_loc_dt = Set()
+        for tzinfo in self._tzinfos.values():
+            loc_dt = tzinfo.normalize(dt.replace(tzinfo=tzinfo))
+            if loc_dt.replace(tzinfo=None) == dt:
+                possible_loc_dt.add(loc_dt)
+
+        if len(possible_loc_dt) == 1:
+            return possible_loc_dt.pop()
+
+        # If told to be strict, raise an exception since we have an
+        # ambiguous case
+        if is_dst is None:
+            raise AmbiguousTimeError(dt)
+
+        # Filter out the possiblilities that don't match the requested
+        # is_dst
+        filtered_possible_loc_dt = [
+            p for p in possible_loc_dt
+                if bool(p.tzinfo._dst) == is_dst
+            ]
+
+        # Hopefully we only have one possibility left. Return it.
+        if len(filtered_possible_loc_dt) == 1:
+            return filtered_possible_loc_dt[0]
+
+        if len(filtered_possible_loc_dt) == 0:
+            filtered_possible_loc_dt = list(possible_loc_dt)
+
+        # If we get this far, we have in a wierd timezone transition
+        # where the clocks have been wound back but is_dst is the same
+        # in both (eg. Europe/Warsaw 1915 when they switched to CET).
+        # At this point, we just have to guess unless we allow more
+        # hints to be passed in (such as the UTC offset or abbreviation),
+        # but that is just getting silly.
+        #
+        # Choose the earliest (by UTC) applicable timezone.
+        def mycmp(a,b):
+            return cmp(
+                    a.replace(tzinfo=None) - a.tzinfo._utcoffset,
+                    b.replace(tzinfo=None) - b.tzinfo._utcoffset,
+                    )
+        filtered_possible_loc_dt.sort(mycmp)
+        return filtered_possible_loc_dt[0]
+        
+    def utcoffset(self, dt):
+        '''See datetime.tzinfo.utcoffset'''
+        return self._utcoffset
+
+    def dst(self, dt):
+        '''See datetime.tzinfo.dst'''
+        return self._dst
+
+    def tzname(self, dt):
+        '''See datetime.tzinfo.tzname'''
+        return self._tzname
+
+    def __repr__(self):
+        if self._dst:
+            dst = 'DST'
+        else:
+            dst = 'STD'
+        if self._utcoffset > _notime:
+            return '<DstTzInfo %r %s+%s %s>' % (
+                    self.zone, self._tzname, self._utcoffset, dst
+                )
+        else:
+            return '<DstTzInfo %r %s%s %s>' % (
+                    self.zone, self._tzname, self._utcoffset, dst
+                )
+
+    def __reduce__(self):
+        # Special pickle to zone remains a singleton and to cope with
+        # database changes.
+        return pytz._p, (
+                self.zone,
+                _to_seconds(self._utcoffset),
+                _to_seconds(self._dst),
+                self._tzname
+                )
+
+
+class AmbiguousTimeError(Exception):
+    '''Exception raised when attempting to create an ambiguous wallclock time.
+
+    At the end of a DST transition period, a particular wallclock time will
+    occur twice (once before the clocks are set back, once after). Both
+    possibilities may be correct, unless further information is supplied.
+
+    See DstTzInfo.normalize() for more info
+    '''
+       
+
+def unpickler(zone, utcoffset=None, dstoffset=None, tzname=None):
+    """Factory function for unpickling pytz tzinfo instances.
+    
+    This is shared for both StaticTzInfo and DstTzInfo instances, because
+    database changes could cause a zones implementation to switch between
+    these two base classes and we can't break pickles on a pytz version
+    upgrade.
+    """
+    # Raises a KeyError if zone no longer exists, which should never happen
+    # and would be a bug.
+    tz = pytz.timezone(zone)
+
+    # A StaticTzInfo - just return it
+    if utcoffset is None:
+        return tz
+
+    # This pickle was created from a DstTzInfo. We need to
+    # determine which of the list of tzinfo instances for this zone
+    # to use in order to restore the state of any datetime instances using
+    # it correctly.
+    utcoffset = memorized_timedelta(utcoffset)
+    dstoffset = memorized_timedelta(dstoffset)
+    try:
+        return tz._tzinfos[(utcoffset, dstoffset, tzname)]
+    except KeyError:
+        # The particular state requested in this timezone no longer exists.
+        # This indicates a corrupt pickle, or the timezone database has been
+        # corrected violently enough to make this particular
+        # (utcoffset,dstoffset) no longer exist in the zone, or the
+        # abbreviation has been changed.
+        pass
+
+    # See if we can find an entry differing only by tzname. Abbreviations
+    # get changed from the initial guess by the database maintainers to
+    # match reality when this information is discovered.
+    for localized_tz in tz._tzinfos.values():
+        if (localized_tz._utcoffset == utcoffset
+                and localized_tz._dst == dstoffset):
+            return localized_tz
+
+    # This (utcoffset, dstoffset) information has been removed from the
+    # zone. Add it back. This might occur when the database maintainers have
+    # corrected incorrect information. datetime instances using this
+    # incorrect information will continue to do so, exactly as they were
+    # before being pickled. This is purely an overly paranoid safety net - I
+    # doubt this will ever been needed in real life.
+    inf = (utcoffset, dstoffset, tzname)
+    tz._tzinfos[inf] = tz.__class__(inf, tz._tzinfos)
+    return tz._tzinfos[inf]
+
diff --git a/lib/pytz/tzinfo.pyc b/lib/pytz/tzinfo.pyc
new file mode 100644
index 0000000..deb24c1
Binary files /dev/null and b/lib/pytz/tzinfo.pyc differ
diff --git a/lib/pytz/zone.tab b/lib/pytz/zone.tab
new file mode 100755
index 0000000..253e940
--- /dev/null
+++ b/lib/pytz/zone.tab
@@ -0,0 +1,417 @@
+# @(#)zone.tab	8.6
+#
+# TZ zone descriptions
+#
+# From Paul Eggert (1996-08-05):
+#
+# This file contains a table with the following columns:
+# 1.  ISO 3166 2-character country code.  See the file `iso3166.tab'.
+# 2.  Latitude and longitude of the zone's principal location
+#     in ISO 6709 sign-degrees-minutes-seconds format,
+#     either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
+#     first latitude (+ is north), then longitude (+ is east).
+# 3.  Zone name used in value of TZ environment variable.
+# 4.  Comments; present if and only if the country has multiple rows.
+#
+# Columns are separated by a single tab.
+# The table is sorted first by country, then an order within the country that
+# (1) makes some geographical sense, and
+# (2) puts the most populous zones first, where that does not contradict (1).
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code	coordinates	TZ			comments
+AD	+4230+00131	Europe/Andorra
+AE	+2518+05518	Asia/Dubai
+AF	+3431+06912	Asia/Kabul
+AG	+1703-06148	America/Antigua
+AI	+1812-06304	America/Anguilla
+AL	+4120+01950	Europe/Tirane
+AM	+4011+04430	Asia/Yerevan
+AN	+1211-06900	America/Curacao
+AO	-0848+01314	Africa/Luanda
+AQ	-7750+16636	Antarctica/McMurdo	McMurdo Station, Ross Island
+AQ	-9000+00000	Antarctica/South_Pole	Amundsen-Scott Station, South Pole
+AQ	-6734-06808	Antarctica/Rothera	Rothera Station, Adelaide Island
+AQ	-6448-06406	Antarctica/Palmer	Palmer Station, Anvers Island
+AQ	-6736+06253	Antarctica/Mawson	Mawson Station, Holme Bay
+AQ	-6835+07758	Antarctica/Davis	Davis Station, Vestfold Hills
+AQ	-6617+11031	Antarctica/Casey	Casey Station, Bailey Peninsula
+AQ	-7824+10654	Antarctica/Vostok	Vostok Station, S Magnetic Pole
+AQ	-6640+14001	Antarctica/DumontDUrville	Dumont-d'Urville Base, Terre Adelie
+AQ	-690022+0393524	Antarctica/Syowa	Syowa Station, E Ongul I
+AR	-3436-05827	America/Argentina/Buenos_Aires	Buenos Aires (BA, CF)
+AR	-3124-06411	America/Argentina/Cordoba	most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF, SL)
+AR	-2411-06518	America/Argentina/Jujuy	Jujuy (JY)
+AR	-2649-06513	America/Argentina/Tucuman	Tucuman (TM)
+AR	-2828-06547	America/Argentina/Catamarca	Catamarca (CT), Chubut (CH)
+AR	-2926-06651	America/Argentina/La_Rioja	La Rioja (LR)
+AR	-3132-06831	America/Argentina/San_Juan	San Juan (SJ)
+AR	-3253-06849	America/Argentina/Mendoza	Mendoza (MZ)
+AR	-5138-06913	America/Argentina/Rio_Gallegos	Santa Cruz (SC)
+AR	-5448-06818	America/Argentina/Ushuaia	Tierra del Fuego (TF)
+AS	-1416-17042	Pacific/Pago_Pago
+AT	+4813+01620	Europe/Vienna
+AU	-3133+15905	Australia/Lord_Howe	Lord Howe Island
+AU	-4253+14719	Australia/Hobart	Tasmania - most locations
+AU	-3956+14352	Australia/Currie	Tasmania - King Island
+AU	-3749+14458	Australia/Melbourne	Victoria
+AU	-3352+15113	Australia/Sydney	New South Wales - most locations
+AU	-3157+14127	Australia/Broken_Hill	New South Wales - Yancowinna
+AU	-2728+15302	Australia/Brisbane	Queensland - most locations
+AU	-2016+14900	Australia/Lindeman	Queensland - Holiday Islands
+AU	-3455+13835	Australia/Adelaide	South Australia
+AU	-1228+13050	Australia/Darwin	Northern Territory
+AU	-3157+11551	Australia/Perth	Western Australia
+AW	+1230-06858	America/Aruba
+AX	+6006+01957	Europe/Mariehamn
+AZ	+4023+04951	Asia/Baku
+BA	+4352+01825	Europe/Sarajevo
+BB	+1306-05937	America/Barbados
+BD	+2343+09025	Asia/Dhaka
+BE	+5050+00420	Europe/Brussels
+BF	+1222-00131	Africa/Ouagadougou
+BG	+4241+02319	Europe/Sofia
+BH	+2623+05035	Asia/Bahrain
+BI	-0323+02922	Africa/Bujumbura
+BJ	+0629+00237	Africa/Porto-Novo
+BM	+3217-06446	Atlantic/Bermuda
+BN	+0456+11455	Asia/Brunei
+BO	-1630-06809	America/La_Paz
+BR	-0351-03225	America/Noronha	Atlantic islands
+BR	-0127-04829	America/Belem	Amapa, E Para
+BR	-0343-03830	America/Fortaleza	NE Brazil (MA, PI, CE, RN, PB)
+BR	-0803-03454	America/Recife	Pernambuco
+BR	-0712-04812	America/Araguaina	Tocantins
+BR	-0940-03543	America/Maceio	Alagoas, Sergipe
+BR	-1259-03831	America/Bahia	Bahia
+BR	-2332-04637	America/Sao_Paulo	S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS)
+BR	-2027-05437	America/Campo_Grande	Mato Grosso do Sul
+BR	-1535-05605	America/Cuiaba	Mato Grosso
+BR	-0846-06354	America/Porto_Velho	W Para, Rondonia
+BR	+0249-06040	America/Boa_Vista	Roraima
+BR	-0308-06001	America/Manaus	E Amazonas
+BR	-0640-06952	America/Eirunepe	W Amazonas
+BR	-0958-06748	America/Rio_Branco	Acre
+BS	+2505-07721	America/Nassau
+BT	+2728+08939	Asia/Thimphu
+BW	-2545+02555	Africa/Gaborone
+BY	+5354+02734	Europe/Minsk
+BZ	+1730-08812	America/Belize
+CA	+4734-05243	America/St_Johns	Newfoundland Time, including SE Labrador
+CA	+4439-06336	America/Halifax	Atlantic Time - Nova Scotia (most places), PEI
+CA	+4612-05957	America/Glace_Bay	Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971
+CA	+4606-06447	America/Moncton	Atlantic Time - New Brunswick
+CA	+5320-06025	America/Goose_Bay	Atlantic Time - Labrador - most locations
+CA	+5125-05707	America/Blanc-Sablon	Atlantic Standard Time - Quebec - Lower North Shore
+CA	+4531-07334	America/Montreal	Eastern Time - Quebec - most locations
+CA	+4339-07923	America/Toronto	Eastern Time - Ontario - most locations
+CA	+4901-08816	America/Nipigon	Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
+CA	+4823-08915	America/Thunder_Bay	Eastern Time - Thunder Bay, Ontario
+CA	+6608-06544	America/Pangnirtung	Eastern Time - Pangnirtung, Nunavut
+CA	+6344-06828	America/Iqaluit	Eastern Time - east Nunavut
+CA	+484531-0913718	America/Atikokan	Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut
+CA	+624900-0920459	America/Rankin_Inlet	Central Time - central Nunavut
+CA	+4953-09709	America/Winnipeg	Central Time - Manitoba & west Ontario
+CA	+4843-09434	America/Rainy_River	Central Time - Rainy River & Fort Frances, Ontario
+CA	+6903-10505	America/Cambridge_Bay	Central Time - west Nunavut
+CA	+5024-10439	America/Regina	Central Standard Time - Saskatchewan - most locations
+CA	+5017-10750	America/Swift_Current	Central Standard Time - Saskatchewan - midwest
+CA	+5333-11328	America/Edmonton	Mountain Time - Alberta, east British Columbia & west Saskatchewan
+CA	+6227-11421	America/Yellowknife	Mountain Time - central Northwest Territories
+CA	+682059-1334300	America/Inuvik	Mountain Time - west Northwest Territories
+CA	+5946-12014	America/Dawson_Creek	Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia
+CA	+4916-12307	America/Vancouver	Pacific Time - west British Columbia
+CA	+6043-13503	America/Whitehorse	Pacific Time - south Yukon
+CA	+6404-13925	America/Dawson	Pacific Time - north Yukon
+CC	-1210+09655	Indian/Cocos
+CD	-0418+01518	Africa/Kinshasa	west Dem. Rep. of Congo
+CD	-1140+02728	Africa/Lubumbashi	east Dem. Rep. of Congo
+CF	+0422+01835	Africa/Bangui
+CG	-0416+01517	Africa/Brazzaville
+CH	+4723+00832	Europe/Zurich
+CI	+0519-00402	Africa/Abidjan
+CK	-2114-15946	Pacific/Rarotonga
+CL	-3327-07040	America/Santiago	most locations
+CL	-2710-10927	Pacific/Easter	Easter Island & Sala y Gomez
+CM	+0403+00942	Africa/Douala
+CN	+3114+12128	Asia/Shanghai	east China - Beijing, Guangdong, Shanghai, etc.
+CN	+4545+12641	Asia/Harbin	Heilongjiang (except Mohe), Jilin
+CN	+2934+10635	Asia/Chongqing	central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
+CN	+4348+08735	Asia/Urumqi	most of Tibet & Xinjiang
+CN	+3929+07559	Asia/Kashgar	west Tibet & Xinjiang
+CO	+0436-07405	America/Bogota
+CR	+0956-08405	America/Costa_Rica
+CU	+2308-08222	America/Havana
+CV	+1455-02331	Atlantic/Cape_Verde
+CX	-1025+10543	Indian/Christmas
+CY	+3510+03322	Asia/Nicosia
+CZ	+5005+01426	Europe/Prague
+DE	+5230+01322	Europe/Berlin
+DJ	+1136+04309	Africa/Djibouti
+DK	+5540+01235	Europe/Copenhagen
+DM	+1518-06124	America/Dominica
+DO	+1828-06954	America/Santo_Domingo
+DZ	+3647+00303	Africa/Algiers
+EC	-0210-07950	America/Guayaquil	mainland
+EC	-0054-08936	Pacific/Galapagos	Galapagos Islands
+EE	+5925+02445	Europe/Tallinn
+EG	+3003+03115	Africa/Cairo
+EH	+2709-01312	Africa/El_Aaiun
+ER	+1520+03853	Africa/Asmera
+ES	+4024-00341	Europe/Madrid	mainland
+ES	+3553-00519	Africa/Ceuta	Ceuta & Melilla
+ES	+2806-01524	Atlantic/Canary	Canary Islands
+ET	+0902+03842	Africa/Addis_Ababa
+FI	+6010+02458	Europe/Helsinki
+FJ	-1808+17825	Pacific/Fiji
+FK	-5142-05751	Atlantic/Stanley
+FM	+0725+15147	Pacific/Truk	Truk (Chuuk) and Yap
+FM	+0658+15813	Pacific/Ponape	Ponape (Pohnpei)
+FM	+0519+16259	Pacific/Kosrae	Kosrae
+FO	+6201-00646	Atlantic/Faeroe
+FR	+4852+00220	Europe/Paris
+GA	+0023+00927	Africa/Libreville
+GB	+512830-0001845	Europe/London
+GD	+1203-06145	America/Grenada
+GE	+4143+04449	Asia/Tbilisi
+GF	+0456-05220	America/Cayenne
+GG	+4927-00232	Europe/Guernsey
+GH	+0533-00013	Africa/Accra
+GI	+3608-00521	Europe/Gibraltar
+GL	+6411-05144	America/Godthab	most locations
+GL	+7646-01840	America/Danmarkshavn	east coast, north of Scoresbysund
+GL	+7029-02158	America/Scoresbysund	Scoresbysund / Ittoqqortoormiit
+GL	+7634-06847	America/Thule	Thule / Pituffik
+GM	+1328-01639	Africa/Banjul
+GN	+0931-01343	Africa/Conakry
+GP	+1614-06132	America/Guadeloupe
+GQ	+0345+00847	Africa/Malabo
+GR	+3758+02343	Europe/Athens
+GS	-5416-03632	Atlantic/South_Georgia
+GT	+1438-09031	America/Guatemala
+GU	+1328+14445	Pacific/Guam
+GW	+1151-01535	Africa/Bissau
+GY	+0648-05810	America/Guyana
+HK	+2217+11409	Asia/Hong_Kong
+HN	+1406-08713	America/Tegucigalpa
+HR	+4548+01558	Europe/Zagreb
+HT	+1832-07220	America/Port-au-Prince
+HU	+4730+01905	Europe/Budapest
+ID	-0610+10648	Asia/Jakarta	Java & Sumatra
+ID	-0002+10920	Asia/Pontianak	west & central Borneo
+ID	-0507+11924	Asia/Makassar	east & south Borneo, Celebes, Bali, Nusa Tengarra, west Timor
+ID	-0232+14042	Asia/Jayapura	Irian Jaya & the Moluccas
+IE	+5320-00615	Europe/Dublin
+IL	+3146+03514	Asia/Jerusalem
+IM	+5409-00428	Europe/Isle_of_Man
+IN	+2232+08822	Asia/Calcutta
+IO	-0720+07225	Indian/Chagos
+IQ	+3321+04425	Asia/Baghdad
+IR	+3540+05126	Asia/Tehran
+IS	+6409-02151	Atlantic/Reykjavik
+IT	+4154+01229	Europe/Rome
+JE	+4912-00207	Europe/Jersey
+JM	+1800-07648	America/Jamaica
+JO	+3157+03556	Asia/Amman
+JP	+353916+1394441	Asia/Tokyo
+KE	-0117+03649	Africa/Nairobi
+KG	+4254+07436	Asia/Bishkek
+KH	+1133+10455	Asia/Phnom_Penh
+KI	+0125+17300	Pacific/Tarawa	Gilbert Islands
+KI	-0308-17105	Pacific/Enderbury	Phoenix Islands
+KI	+0152-15720	Pacific/Kiritimati	Line Islands
+KM	-1141+04316	Indian/Comoro
+KN	+1718-06243	America/St_Kitts
+KP	+3901+12545	Asia/Pyongyang
+KR	+3733+12658	Asia/Seoul
+KW	+2920+04759	Asia/Kuwait
+KY	+1918-08123	America/Cayman
+KZ	+4315+07657	Asia/Almaty	most locations
+KZ	+4448+06528	Asia/Qyzylorda	Qyzylorda (Kyzylorda, Kzyl-Orda)
+KZ	+5017+05710	Asia/Aqtobe	Aqtobe (Aktobe)
+KZ	+4431+05016	Asia/Aqtau	Atyrau (Atirau, Gur'yev), Mangghystau (Mankistau)
+KZ	+5113+05121	Asia/Oral	West Kazakhstan
+LA	+1758+10236	Asia/Vientiane
+LB	+3353+03530	Asia/Beirut
+LC	+1401-06100	America/St_Lucia
+LI	+4709+00931	Europe/Vaduz
+LK	+0656+07951	Asia/Colombo
+LR	+0618-01047	Africa/Monrovia
+LS	-2928+02730	Africa/Maseru
+LT	+5441+02519	Europe/Vilnius
+LU	+4936+00609	Europe/Luxembourg
+LV	+5657+02406	Europe/Riga
+LY	+3254+01311	Africa/Tripoli
+MA	+3339-00735	Africa/Casablanca
+MC	+4342+00723	Europe/Monaco
+MD	+4700+02850	Europe/Chisinau
+ME	+4226+01916	Europe/Podgorica
+MG	-1855+04731	Indian/Antananarivo
+MH	+0709+17112	Pacific/Majuro	most locations
+MH	+0905+16720	Pacific/Kwajalein	Kwajalein
+MK	+4159+02126	Europe/Skopje
+ML	+1239-00800	Africa/Bamako
+MM	+1647+09610	Asia/Rangoon
+MN	+4755+10653	Asia/Ulaanbaatar	most locations
+MN	+4801+09139	Asia/Hovd	Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
+MN	+4804+11430	Asia/Choibalsan	Dornod, Sukhbaatar
+MO	+2214+11335	Asia/Macau
+MP	+1512+14545	Pacific/Saipan
+MQ	+1436-06105	America/Martinique
+MR	+1806-01557	Africa/Nouakchott
+MS	+1643-06213	America/Montserrat
+MT	+3554+01431	Europe/Malta
+MU	-2010+05730	Indian/Mauritius
+MV	+0410+07330	Indian/Maldives
+MW	-1547+03500	Africa/Blantyre
+MX	+1924-09909	America/Mexico_City	Central Time - most locations
+MX	+2105-08646	America/Cancun	Central Time - Quintana Roo
+MX	+2058-08937	America/Merida	Central Time - Campeche, Yucatan
+MX	+2540-10019	America/Monterrey	Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas
+MX	+2313-10625	America/Mazatlan	Mountain Time - S Baja, Nayarit, Sinaloa
+MX	+2838-10605	America/Chihuahua	Mountain Time - Chihuahua
+MX	+2904-11058	America/Hermosillo	Mountain Standard Time - Sonora
+MX	+3232-11701	America/Tijuana	Pacific Time
+MY	+0310+10142	Asia/Kuala_Lumpur	peninsular Malaysia
+MY	+0133+11020	Asia/Kuching	Sabah & Sarawak
+MZ	-2558+03235	Africa/Maputo
+NA	-2234+01706	Africa/Windhoek
+NC	-2216+16530	Pacific/Noumea
+NE	+1331+00207	Africa/Niamey
+NF	-2903+16758	Pacific/Norfolk
+NG	+0627+00324	Africa/Lagos
+NI	+1209-08617	America/Managua
+NL	+5222+00454	Europe/Amsterdam
+NO	+5955+01045	Europe/Oslo
+NP	+2743+08519	Asia/Katmandu
+NR	-0031+16655	Pacific/Nauru
+NU	-1901+16955	Pacific/Niue
+NZ	-3652+17446	Pacific/Auckland	most locations
+NZ	-4357-17633	Pacific/Chatham	Chatham Islands
+OM	+2336+05835	Asia/Muscat
+PA	+0858-07932	America/Panama
+PE	-1203-07703	America/Lima
+PF	-1732-14934	Pacific/Tahiti	Society Islands
+PF	-0900-13930	Pacific/Marquesas	Marquesas Islands
+PF	-2308-13457	Pacific/Gambier	Gambier Islands
+PG	-0930+14710	Pacific/Port_Moresby
+PH	+1435+12100	Asia/Manila
+PK	+2452+06703	Asia/Karachi
+PL	+5215+02100	Europe/Warsaw
+PM	+4703-05620	America/Miquelon
+PN	-2504-13005	Pacific/Pitcairn
+PR	+182806-0660622	America/Puerto_Rico
+PS	+3130+03428	Asia/Gaza
+PT	+3843-00908	Europe/Lisbon	mainland
+PT	+3238-01654	Atlantic/Madeira	Madeira Islands
+PT	+3744-02540	Atlantic/Azores	Azores
+PW	+0720+13429	Pacific/Palau
+PY	-2516-05740	America/Asuncion
+QA	+2517+05132	Asia/Qatar
+RE	-2052+05528	Indian/Reunion
+RO	+4426+02606	Europe/Bucharest
+RS	+4450+02030	Europe/Belgrade
+RU	+5443+02030	Europe/Kaliningrad	Moscow-01 - Kaliningrad
+RU	+5545+03735	Europe/Moscow	Moscow+00 - west Russia
+RU	+4844+04425	Europe/Volgograd	Moscow+00 - Caspian Sea
+RU	+5312+05009	Europe/Samara	Moscow+01 - Samara, Udmurtia
+RU	+5651+06036	Asia/Yekaterinburg	Moscow+02 - Urals
+RU	+5500+07324	Asia/Omsk	Moscow+03 - west Siberia
+RU	+5502+08255	Asia/Novosibirsk	Moscow+03 - Novosibirsk
+RU	+5601+09250	Asia/Krasnoyarsk	Moscow+04 - Yenisei River
+RU	+5216+10420	Asia/Irkutsk	Moscow+05 - Lake Baikal
+RU	+6200+12940	Asia/Yakutsk	Moscow+06 - Lena River
+RU	+4310+13156	Asia/Vladivostok	Moscow+07 - Amur River
+RU	+4658+14242	Asia/Sakhalin	Moscow+07 - Sakhalin Island
+RU	+5934+15048	Asia/Magadan	Moscow+08 - Magadan
+RU	+5301+15839	Asia/Kamchatka	Moscow+09 - Kamchatka
+RU	+6445+17729	Asia/Anadyr	Moscow+10 - Bering Sea
+RW	-0157+03004	Africa/Kigali
+SA	+2438+04643	Asia/Riyadh
+SB	-0932+16012	Pacific/Guadalcanal
+SC	-0440+05528	Indian/Mahe
+SD	+1536+03232	Africa/Khartoum
+SE	+5920+01803	Europe/Stockholm
+SG	+0117+10351	Asia/Singapore
+SH	-1555-00542	Atlantic/St_Helena
+SI	+4603+01431	Europe/Ljubljana
+SJ	+7800+01600	Arctic/Longyearbyen	Svalbard
+SJ	+7059-00805	Atlantic/Jan_Mayen	Jan Mayen
+SK	+4809+01707	Europe/Bratislava
+SL	+0830-01315	Africa/Freetown
+SM	+4355+01228	Europe/San_Marino
+SN	+1440-01726	Africa/Dakar
+SO	+0204+04522	Africa/Mogadishu
+SR	+0550-05510	America/Paramaribo
+ST	+0020+00644	Africa/Sao_Tome
+SV	+1342-08912	America/El_Salvador
+SY	+3330+03618	Asia/Damascus
+SZ	-2618+03106	Africa/Mbabane
+TC	+2128-07108	America/Grand_Turk
+TD	+1207+01503	Africa/Ndjamena
+TF	-492110+0701303	Indian/Kerguelen
+TG	+0608+00113	Africa/Lome
+TH	+1345+10031	Asia/Bangkok
+TJ	+3835+06848	Asia/Dushanbe
+TK	-0922-17114	Pacific/Fakaofo
+TL	-0833+12535	Asia/Dili
+TM	+3757+05823	Asia/Ashgabat
+TN	+3648+01011	Africa/Tunis
+TO	-2110+17510	Pacific/Tongatapu
+TR	+4101+02858	Europe/Istanbul
+TT	+1039-06131	America/Port_of_Spain
+TV	-0831+17913	Pacific/Funafuti
+TW	+2503+12130	Asia/Taipei
+TZ	-0648+03917	Africa/Dar_es_Salaam
+UA	+5026+03031	Europe/Kiev	most locations
+UA	+4837+02218	Europe/Uzhgorod	Ruthenia
+UA	+4750+03510	Europe/Zaporozhye	Zaporozh'ye, E Lugansk
+UA	+4457+03406	Europe/Simferopol	central Crimea
+UG	+0019+03225	Africa/Kampala
+UM	+1700-16830	Pacific/Johnston	Johnston Atoll
+UM	+2813-17722	Pacific/Midway	Midway Islands
+UM	+1917+16637	Pacific/Wake	Wake Island
+US	+404251-0740023	America/New_York	Eastern Time
+US	+421953-0830245	America/Detroit	Eastern Time - Michigan - most locations
+US	+381515-0854534	America/Kentucky/Louisville	Eastern Time - Kentucky - Louisville area
+US	+364947-0845057	America/Kentucky/Monticello	Eastern Time - Kentucky - Wayne County
+US	+394606-0860929	America/Indiana/Indianapolis	Eastern Time - Indiana - most locations
+US	+382232-0862041	America/Indiana/Marengo	Eastern Time - Indiana - Crawford County
+US	+411745-0863730	America/Indiana/Knox	Eastern Time - Indiana - Starke County
+US	+384452-0850402	America/Indiana/Vevay	Eastern Time - Indiana - Switzerland County
+US	+415100-0873900	America/Chicago	Central Time
+US	+384038-0873143	America/Indiana/Vincennes	Central Time - Indiana - Daviess, Dubois, Knox, Martin, Perry & Pulaski Counties
+US	+382931-0871643	America/Indiana/Petersburg	Central Time - Indiana - Pike County
+US	+450628-0873651	America/Menominee	Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties
+US	+470659-1011757	America/North_Dakota/Center	Central Time - North Dakota - Oliver County
+US	+465042-1012439	America/North_Dakota/New_Salem	Central Time - North Dakota - Morton County (except Mandan area)
+US	+394421-1045903	America/Denver	Mountain Time
+US	+433649-1161209	America/Boise	Mountain Time - south Idaho & east Oregon
+US	+364708-1084111	America/Shiprock	Mountain Time - Navajo
+US	+332654-1120424	America/Phoenix	Mountain Standard Time - Arizona
+US	+340308-1181434	America/Los_Angeles	Pacific Time
+US	+611305-1495401	America/Anchorage	Alaska Time
+US	+581807-1342511	America/Juneau	Alaska Time - Alaska panhandle
+US	+593249-1394338	America/Yakutat	Alaska Time - Alaska panhandle neck
+US	+643004-1652423	America/Nome	Alaska Time - west Alaska
+US	+515248-1763929	America/Adak	Aleutian Islands
+US	+211825-1575130	Pacific/Honolulu	Hawaii
+UY	-3453-05611	America/Montevideo
+UZ	+3940+06648	Asia/Samarkand	west Uzbekistan
+UZ	+4120+06918	Asia/Tashkent	east Uzbekistan
+VA	+4154+01227	Europe/Vatican
+VC	+1309-06114	America/St_Vincent
+VE	+1030-06656	America/Caracas
+VG	+1827-06437	America/Tortola
+VI	+1821-06456	America/St_Thomas
+VN	+1045+10640	Asia/Saigon
+VU	-1740+16825	Pacific/Efate
+WF	-1318-17610	Pacific/Wallis
+WS	-1350-17144	Pacific/Apia
+YE	+1245+04512	Asia/Aden
+YT	-1247+04514	Indian/Mayotte
+ZA	-2615+02800	Africa/Johannesburg
+ZM	-1525+02817	Africa/Lusaka
+ZW	-1750+03103	Africa/Harare
diff --git a/lib/pytz/zoneinfo/Africa/Abidjan.py b/lib/pytz/zoneinfo/Africa/Abidjan.py
new file mode 100755
index 0000000..a78a507
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Abidjan.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Abidjan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Abidjan(DstTzInfo):
+    '''Africa/Abidjan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Abidjan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,0,16,8),
+        ]
+
+    _transition_info = [
+i(-960,0,'LMT'),
+i(0,0,'GMT'),
+        ]
+
+Abidjan = Abidjan()
+
diff --git a/lib/pytz/zoneinfo/Africa/Accra.py b/lib/pytz/zoneinfo/Africa/Accra.py
new file mode 100755
index 0000000..62c42d3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Accra.py
@@ -0,0 +1,50 @@
+'''tzinfo timezone information for Africa/Accra.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Accra(DstTzInfo):
+    '''Africa/Accra timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Accra'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,1,1,0,0,52),
+d(1936,9,1,0,0,0),
+d(1936,12,30,23,40,0),
+d(1937,9,1,0,0,0),
+d(1937,12,30,23,40,0),
+d(1938,9,1,0,0,0),
+d(1938,12,30,23,40,0),
+d(1939,9,1,0,0,0),
+d(1939,12,30,23,40,0),
+d(1940,9,1,0,0,0),
+d(1940,12,30,23,40,0),
+d(1941,9,1,0,0,0),
+d(1941,12,30,23,40,0),
+d(1942,9,1,0,0,0),
+d(1942,12,30,23,40,0),
+        ]
+
+    _transition_info = [
+i(-60,0,'LMT'),
+i(0,0,'GMT'),
+i(1200,1200,'GHST'),
+i(0,0,'GMT'),
+i(1200,1200,'GHST'),
+i(0,0,'GMT'),
+i(1200,1200,'GHST'),
+i(0,0,'GMT'),
+i(1200,1200,'GHST'),
+i(0,0,'GMT'),
+i(1200,1200,'GHST'),
+i(0,0,'GMT'),
+i(1200,1200,'GHST'),
+i(0,0,'GMT'),
+i(1200,1200,'GHST'),
+i(0,0,'GMT'),
+        ]
+
+Accra = Accra()
+
diff --git a/lib/pytz/zoneinfo/Africa/Addis_Ababa.py b/lib/pytz/zoneinfo/Africa/Addis_Ababa.py
new file mode 100755
index 0000000..2b7a992
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Addis_Ababa.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Addis_Ababa.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Addis_Ababa(DstTzInfo):
+    '''Africa/Addis_Ababa timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Addis_Ababa'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1936,5,4,21,24,40),
+        ]
+
+    _transition_info = [
+i(9300,0,'ADMT'),
+i(10800,0,'EAT'),
+        ]
+
+Addis_Ababa = Addis_Ababa()
+
diff --git a/lib/pytz/zoneinfo/Africa/Algiers.py b/lib/pytz/zoneinfo/Africa/Algiers.py
new file mode 100755
index 0000000..6f2b763
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Algiers.py
@@ -0,0 +1,86 @@
+'''tzinfo timezone information for Africa/Algiers.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Algiers(DstTzInfo):
+    '''Africa/Algiers timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Algiers'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,3,10,23,50,39),
+d(1916,6,14,23,0,0),
+d(1916,10,1,23,0,0),
+d(1917,3,24,23,0,0),
+d(1917,10,7,23,0,0),
+d(1918,3,9,23,0,0),
+d(1918,10,6,23,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,5,23,0,0),
+d(1920,2,14,23,0,0),
+d(1920,10,23,23,0,0),
+d(1921,3,14,23,0,0),
+d(1921,6,21,23,0,0),
+d(1939,9,11,23,0,0),
+d(1939,11,19,0,0,0),
+d(1940,2,25,2,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,8,0,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,15,23,0,0),
+d(1946,10,6,23,0,0),
+d(1956,1,29,0,0,0),
+d(1963,4,13,23,0,0),
+d(1971,4,25,23,0,0),
+d(1971,9,26,23,0,0),
+d(1977,5,6,0,0,0),
+d(1977,10,20,23,0,0),
+d(1978,3,24,0,0,0),
+d(1978,9,22,1,0,0),
+d(1979,10,25,23,0,0),
+d(1980,4,25,0,0,0),
+d(1980,10,31,1,0,0),
+d(1981,5,1,0,0,0),
+        ]
+
+    _transition_info = [
+i(540,0,'PMT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(0,0,'WET'),
+i(3600,0,'CET'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,0,'CET'),
+        ]
+
+Algiers = Algiers()
+
diff --git a/lib/pytz/zoneinfo/Africa/Asmera.py b/lib/pytz/zoneinfo/Africa/Asmera.py
new file mode 100755
index 0000000..f05e044
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Asmera.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Asmera.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Asmera(DstTzInfo):
+    '''Africa/Asmera timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Asmera'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1936,5,4,21,24,40),
+        ]
+
+    _transition_info = [
+i(9300,0,'ADMT'),
+i(10800,0,'EAT'),
+        ]
+
+Asmera = Asmera()
+
diff --git a/lib/pytz/zoneinfo/Africa/Bamako.py b/lib/pytz/zoneinfo/Africa/Bamako.py
new file mode 100755
index 0000000..67a15dd
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Bamako.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Bamako.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bamako(DstTzInfo):
+    '''Africa/Bamako timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Bamako'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,0,32,0),
+d(1934,2,26,0,0,0),
+d(1960,6,20,1,0,0),
+        ]
+
+    _transition_info = [
+i(-1920,0,'LMT'),
+i(0,0,'GMT'),
+i(-3600,0,'WAT'),
+i(0,0,'GMT'),
+        ]
+
+Bamako = Bamako()
+
diff --git a/lib/pytz/zoneinfo/Africa/Bangui.py b/lib/pytz/zoneinfo/Africa/Bangui.py
new file mode 100755
index 0000000..6fc9ea9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Bangui.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Bangui.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bangui(DstTzInfo):
+    '''Africa/Bangui timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Bangui'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,22,45,40),
+        ]
+
+    _transition_info = [
+i(4440,0,'LMT'),
+i(3600,0,'WAT'),
+        ]
+
+Bangui = Bangui()
+
diff --git a/lib/pytz/zoneinfo/Africa/Banjul.py b/lib/pytz/zoneinfo/Africa/Banjul.py
new file mode 100755
index 0000000..6d88185
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Banjul.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Banjul.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Banjul(DstTzInfo):
+    '''Africa/Banjul timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Banjul'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,1,6,36),
+d(1935,1,1,1,6,36),
+d(1964,1,1,1,0,0),
+        ]
+
+    _transition_info = [
+i(-4020,0,'LMT'),
+i(-4020,0,'BMT'),
+i(-3600,0,'WAT'),
+i(0,0,'GMT'),
+        ]
+
+Banjul = Banjul()
+
diff --git a/lib/pytz/zoneinfo/Africa/Bissau.py b/lib/pytz/zoneinfo/Africa/Bissau.py
new file mode 100755
index 0000000..9ba10a3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Bissau.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Africa/Bissau.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bissau(DstTzInfo):
+    '''Africa/Bissau timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Bissau'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,5,26,1,2,20),
+d(1975,1,1,1,0,0),
+        ]
+
+    _transition_info = [
+i(-3720,0,'LMT'),
+i(-3600,0,'WAT'),
+i(0,0,'GMT'),
+        ]
+
+Bissau = Bissau()
+
diff --git a/lib/pytz/zoneinfo/Africa/Blantyre.py b/lib/pytz/zoneinfo/Africa/Blantyre.py
new file mode 100755
index 0000000..d9ee75f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Blantyre.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Blantyre.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Blantyre(DstTzInfo):
+    '''Africa/Blantyre timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Blantyre'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1903,2,28,21,40,0),
+        ]
+
+    _transition_info = [
+i(8400,0,'LMT'),
+i(7200,0,'CAT'),
+        ]
+
+Blantyre = Blantyre()
+
diff --git a/lib/pytz/zoneinfo/Africa/Brazzaville.py b/lib/pytz/zoneinfo/Africa/Brazzaville.py
new file mode 100755
index 0000000..b027a13
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Brazzaville.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Brazzaville.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Brazzaville(DstTzInfo):
+    '''Africa/Brazzaville timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Brazzaville'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,22,58,52),
+        ]
+
+    _transition_info = [
+i(3660,0,'LMT'),
+i(3600,0,'WAT'),
+        ]
+
+Brazzaville = Brazzaville()
+
diff --git a/lib/pytz/zoneinfo/Africa/Bujumbura.py b/lib/pytz/zoneinfo/Africa/Bujumbura.py
new file mode 100755
index 0000000..5c6df45
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Bujumbura.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Africa/Bujumbura.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Bujumbura(StaticTzInfo):
+    '''Africa/Bujumbura timezone definition. See datetime.tzinfo for details'''
+    zone = 'Africa/Bujumbura'
+    _utcoffset = timedelta(seconds=7200)
+    _tzname = 'CAT'
+
+Bujumbura = Bujumbura()
+
diff --git a/lib/pytz/zoneinfo/Africa/Cairo.py b/lib/pytz/zoneinfo/Africa/Cairo.py
new file mode 100755
index 0000000..f172d36
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Cairo.py
@@ -0,0 +1,368 @@
+'''tzinfo timezone information for Africa/Cairo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cairo(DstTzInfo):
+    '''Africa/Cairo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Cairo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1940,7,14,22,0,0),
+d(1940,9,30,21,0,0),
+d(1941,4,14,22,0,0),
+d(1941,9,15,21,0,0),
+d(1942,3,31,22,0,0),
+d(1942,10,26,21,0,0),
+d(1943,3,31,22,0,0),
+d(1943,10,31,21,0,0),
+d(1944,3,31,22,0,0),
+d(1944,10,31,21,0,0),
+d(1945,4,15,22,0,0),
+d(1945,10,31,21,0,0),
+d(1957,5,9,22,0,0),
+d(1957,9,30,21,0,0),
+d(1958,4,30,22,0,0),
+d(1958,9,30,21,0,0),
+d(1959,4,30,23,0,0),
+d(1959,9,30,0,0,0),
+d(1960,4,30,23,0,0),
+d(1960,9,30,0,0,0),
+d(1961,4,30,23,0,0),
+d(1961,9,30,0,0,0),
+d(1962,4,30,23,0,0),
+d(1962,9,30,0,0,0),
+d(1963,4,30,23,0,0),
+d(1963,9,30,0,0,0),
+d(1964,4,30,23,0,0),
+d(1964,9,30,0,0,0),
+d(1965,4,30,23,0,0),
+d(1965,9,30,0,0,0),
+d(1966,4,30,23,0,0),
+d(1966,10,1,0,0,0),
+d(1967,4,30,23,0,0),
+d(1967,10,1,0,0,0),
+d(1968,4,30,23,0,0),
+d(1968,10,1,0,0,0),
+d(1969,4,30,23,0,0),
+d(1969,10,1,0,0,0),
+d(1970,4,30,23,0,0),
+d(1970,10,1,0,0,0),
+d(1971,4,30,23,0,0),
+d(1971,10,1,0,0,0),
+d(1972,4,30,23,0,0),
+d(1972,10,1,0,0,0),
+d(1973,4,30,23,0,0),
+d(1973,10,1,0,0,0),
+d(1974,4,30,23,0,0),
+d(1974,10,1,0,0,0),
+d(1975,4,30,23,0,0),
+d(1975,10,1,0,0,0),
+d(1976,4,30,23,0,0),
+d(1976,10,1,0,0,0),
+d(1977,4,30,23,0,0),
+d(1977,10,1,0,0,0),
+d(1978,4,30,23,0,0),
+d(1978,10,1,0,0,0),
+d(1979,4,30,23,0,0),
+d(1979,10,1,0,0,0),
+d(1980,4,30,23,0,0),
+d(1980,10,1,0,0,0),
+d(1981,4,30,23,0,0),
+d(1981,10,1,0,0,0),
+d(1982,7,24,23,0,0),
+d(1982,10,1,0,0,0),
+d(1983,7,11,23,0,0),
+d(1983,10,1,0,0,0),
+d(1984,4,30,23,0,0),
+d(1984,10,1,0,0,0),
+d(1985,4,30,23,0,0),
+d(1985,10,1,0,0,0),
+d(1986,4,30,23,0,0),
+d(1986,10,1,0,0,0),
+d(1987,4,30,23,0,0),
+d(1987,10,1,0,0,0),
+d(1988,4,30,23,0,0),
+d(1988,10,1,0,0,0),
+d(1989,5,5,23,0,0),
+d(1989,10,1,0,0,0),
+d(1990,4,30,23,0,0),
+d(1990,10,1,0,0,0),
+d(1991,4,30,23,0,0),
+d(1991,10,1,0,0,0),
+d(1992,4,30,23,0,0),
+d(1992,10,1,0,0,0),
+d(1993,4,30,23,0,0),
+d(1993,10,1,0,0,0),
+d(1994,4,30,23,0,0),
+d(1994,10,1,0,0,0),
+d(1995,4,27,22,0,0),
+d(1995,9,28,21,0,0),
+d(1996,4,25,22,0,0),
+d(1996,9,26,21,0,0),
+d(1997,4,24,22,0,0),
+d(1997,9,25,21,0,0),
+d(1998,4,23,22,0,0),
+d(1998,9,24,21,0,0),
+d(1999,4,29,22,0,0),
+d(1999,9,30,21,0,0),
+d(2000,4,27,22,0,0),
+d(2000,9,28,21,0,0),
+d(2001,4,26,22,0,0),
+d(2001,9,27,21,0,0),
+d(2002,4,25,22,0,0),
+d(2002,9,26,21,0,0),
+d(2003,4,24,22,0,0),
+d(2003,9,25,21,0,0),
+d(2004,4,29,22,0,0),
+d(2004,9,30,21,0,0),
+d(2005,4,28,22,0,0),
+d(2005,9,29,21,0,0),
+d(2006,4,27,22,0,0),
+d(2006,9,21,21,0,0),
+d(2007,4,26,22,0,0),
+d(2007,9,27,21,0,0),
+d(2008,4,24,22,0,0),
+d(2008,9,25,21,0,0),
+d(2009,4,23,22,0,0),
+d(2009,9,24,21,0,0),
+d(2010,4,29,22,0,0),
+d(2010,9,30,21,0,0),
+d(2011,4,28,22,0,0),
+d(2011,9,29,21,0,0),
+d(2012,4,26,22,0,0),
+d(2012,9,27,21,0,0),
+d(2013,4,25,22,0,0),
+d(2013,9,26,21,0,0),
+d(2014,4,24,22,0,0),
+d(2014,9,25,21,0,0),
+d(2015,4,23,22,0,0),
+d(2015,9,24,21,0,0),
+d(2016,4,28,22,0,0),
+d(2016,9,29,21,0,0),
+d(2017,4,27,22,0,0),
+d(2017,9,28,21,0,0),
+d(2018,4,26,22,0,0),
+d(2018,9,27,21,0,0),
+d(2019,4,25,22,0,0),
+d(2019,9,26,21,0,0),
+d(2020,4,23,22,0,0),
+d(2020,9,24,21,0,0),
+d(2021,4,29,22,0,0),
+d(2021,9,30,21,0,0),
+d(2022,4,28,22,0,0),
+d(2022,9,29,21,0,0),
+d(2023,4,27,22,0,0),
+d(2023,9,28,21,0,0),
+d(2024,4,25,22,0,0),
+d(2024,9,26,21,0,0),
+d(2025,4,24,22,0,0),
+d(2025,9,25,21,0,0),
+d(2026,4,23,22,0,0),
+d(2026,9,24,21,0,0),
+d(2027,4,29,22,0,0),
+d(2027,9,30,21,0,0),
+d(2028,4,27,22,0,0),
+d(2028,9,28,21,0,0),
+d(2029,4,26,22,0,0),
+d(2029,9,27,21,0,0),
+d(2030,4,25,22,0,0),
+d(2030,9,26,21,0,0),
+d(2031,4,24,22,0,0),
+d(2031,9,25,21,0,0),
+d(2032,4,29,22,0,0),
+d(2032,9,30,21,0,0),
+d(2033,4,28,22,0,0),
+d(2033,9,29,21,0,0),
+d(2034,4,27,22,0,0),
+d(2034,9,28,21,0,0),
+d(2035,4,26,22,0,0),
+d(2035,9,27,21,0,0),
+d(2036,4,24,22,0,0),
+d(2036,9,25,21,0,0),
+d(2037,4,23,22,0,0),
+d(2037,9,24,21,0,0),
+        ]
+
+    _transition_info = [
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Cairo = Cairo()
+
diff --git a/lib/pytz/zoneinfo/Africa/Casablanca.py b/lib/pytz/zoneinfo/Africa/Casablanca.py
new file mode 100755
index 0000000..3e7bf3b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Casablanca.py
@@ -0,0 +1,58 @@
+'''tzinfo timezone information for Africa/Casablanca.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Casablanca(DstTzInfo):
+    '''Africa/Casablanca timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Casablanca'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1913,10,26,0,30,20),
+d(1939,9,12,0,0,0),
+d(1939,11,18,23,0,0),
+d(1940,2,25,0,0,0),
+d(1945,11,17,23,0,0),
+d(1950,6,11,0,0,0),
+d(1950,10,28,23,0,0),
+d(1967,6,3,12,0,0),
+d(1967,9,30,23,0,0),
+d(1974,6,24,0,0,0),
+d(1974,8,31,23,0,0),
+d(1976,5,1,0,0,0),
+d(1976,7,31,23,0,0),
+d(1977,5,1,0,0,0),
+d(1977,9,27,23,0,0),
+d(1978,6,1,0,0,0),
+d(1978,8,3,23,0,0),
+d(1984,3,16,0,0,0),
+d(1985,12,31,23,0,0),
+        ]
+
+    _transition_info = [
+i(-1800,0,'LMT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,0,'CET'),
+i(0,0,'WET'),
+        ]
+
+Casablanca = Casablanca()
+
diff --git a/lib/pytz/zoneinfo/Africa/Ceuta.py b/lib/pytz/zoneinfo/Africa/Ceuta.py
new file mode 100755
index 0000000..8da35b7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Ceuta.py
@@ -0,0 +1,272 @@
+'''tzinfo timezone information for Africa/Ceuta.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ceuta(DstTzInfo):
+    '''Africa/Ceuta timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Ceuta'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,5,6,23,0,0),
+d(1918,10,7,22,0,0),
+d(1924,4,16,23,0,0),
+d(1924,10,4,23,0,0),
+d(1926,4,17,23,0,0),
+d(1926,10,2,23,0,0),
+d(1927,4,9,23,0,0),
+d(1927,10,1,23,0,0),
+d(1928,4,14,23,0,0),
+d(1928,10,6,23,0,0),
+d(1929,1,1,0,0,0),
+d(1967,6,3,12,0,0),
+d(1967,9,30,23,0,0),
+d(1974,6,24,0,0,0),
+d(1974,8,31,23,0,0),
+d(1976,5,1,0,0,0),
+d(1976,7,31,23,0,0),
+d(1977,5,1,0,0,0),
+d(1977,9,27,23,0,0),
+d(1978,6,1,0,0,0),
+d(1978,8,3,23,0,0),
+d(1984,3,16,0,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Ceuta = Ceuta()
+
diff --git a/lib/pytz/zoneinfo/Africa/Conakry.py b/lib/pytz/zoneinfo/Africa/Conakry.py
new file mode 100755
index 0000000..39fd405
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Conakry.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Conakry.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Conakry(DstTzInfo):
+    '''Africa/Conakry timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Conakry'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,0,54,52),
+d(1934,2,26,0,0,0),
+d(1960,1,1,1,0,0),
+        ]
+
+    _transition_info = [
+i(-3300,0,'LMT'),
+i(0,0,'GMT'),
+i(-3600,0,'WAT'),
+i(0,0,'GMT'),
+        ]
+
+Conakry = Conakry()
+
diff --git a/lib/pytz/zoneinfo/Africa/Dakar.py b/lib/pytz/zoneinfo/Africa/Dakar.py
new file mode 100755
index 0000000..5a07e67
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Dakar.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Africa/Dakar.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dakar(DstTzInfo):
+    '''Africa/Dakar timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Dakar'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,1,9,44),
+d(1941,6,1,1,0,0),
+        ]
+
+    _transition_info = [
+i(-4200,0,'LMT'),
+i(-3600,0,'WAT'),
+i(0,0,'GMT'),
+        ]
+
+Dakar = Dakar()
+
diff --git a/lib/pytz/zoneinfo/Africa/Dar_es_Salaam.py b/lib/pytz/zoneinfo/Africa/Dar_es_Salaam.py
new file mode 100755
index 0000000..63f72fe
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Dar_es_Salaam.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Dar_es_Salaam.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dar_es_Salaam(DstTzInfo):
+    '''Africa/Dar_es_Salaam timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Dar_es_Salaam'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1930,12,31,21,22,52),
+d(1947,12,31,21,0,0),
+d(1960,12,31,21,15,15),
+        ]
+
+    _transition_info = [
+i(9420,0,'LMT'),
+i(10800,0,'EAT'),
+i(9900,0,'BEAUT'),
+i(10800,0,'EAT'),
+        ]
+
+Dar_es_Salaam = Dar_es_Salaam()
+
diff --git a/lib/pytz/zoneinfo/Africa/Djibouti.py b/lib/pytz/zoneinfo/Africa/Djibouti.py
new file mode 100755
index 0000000..1f11488
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Djibouti.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Djibouti.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Djibouti(DstTzInfo):
+    '''Africa/Djibouti timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Djibouti'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,6,30,21,7,24),
+        ]
+
+    _transition_info = [
+i(10380,0,'LMT'),
+i(10800,0,'EAT'),
+        ]
+
+Djibouti = Djibouti()
+
diff --git a/lib/pytz/zoneinfo/Africa/Douala.py b/lib/pytz/zoneinfo/Africa/Douala.py
new file mode 100755
index 0000000..ffa00b5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Douala.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Douala.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Douala(DstTzInfo):
+    '''Africa/Douala timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Douala'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,23,21,12),
+        ]
+
+    _transition_info = [
+i(2340,0,'LMT'),
+i(3600,0,'WAT'),
+        ]
+
+Douala = Douala()
+
diff --git a/lib/pytz/zoneinfo/Africa/El_Aaiun.py b/lib/pytz/zoneinfo/Africa/El_Aaiun.py
new file mode 100755
index 0000000..7fa97f7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/El_Aaiun.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Africa/El_Aaiun.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class El_Aaiun(DstTzInfo):
+    '''Africa/El_Aaiun timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/El_Aaiun'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1934,1,1,0,52,48),
+d(1976,4,14,1,0,0),
+        ]
+
+    _transition_info = [
+i(-3180,0,'LMT'),
+i(-3600,0,'WAT'),
+i(0,0,'WET'),
+        ]
+
+El_Aaiun = El_Aaiun()
+
diff --git a/lib/pytz/zoneinfo/Africa/Freetown.py b/lib/pytz/zoneinfo/Africa/Freetown.py
new file mode 100755
index 0000000..729e0f3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Freetown.py
@@ -0,0 +1,80 @@
+'''tzinfo timezone information for Africa/Freetown.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Freetown(DstTzInfo):
+    '''Africa/Freetown timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Freetown'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1913,6,1,0,53,0),
+d(1935,6,1,1,0,0),
+d(1935,10,1,0,20,0),
+d(1936,6,1,1,0,0),
+d(1936,10,1,0,20,0),
+d(1937,6,1,1,0,0),
+d(1937,10,1,0,20,0),
+d(1938,6,1,1,0,0),
+d(1938,10,1,0,20,0),
+d(1939,6,1,1,0,0),
+d(1939,10,1,0,20,0),
+d(1940,6,1,1,0,0),
+d(1940,10,1,0,20,0),
+d(1941,6,1,1,0,0),
+d(1941,10,1,0,20,0),
+d(1942,6,1,1,0,0),
+d(1942,10,1,0,20,0),
+d(1957,1,1,1,0,0),
+d(1957,6,1,0,0,0),
+d(1957,8,31,23,0,0),
+d(1958,6,1,0,0,0),
+d(1958,8,31,23,0,0),
+d(1959,6,1,0,0,0),
+d(1959,8,31,23,0,0),
+d(1960,6,1,0,0,0),
+d(1960,8,31,23,0,0),
+d(1961,6,1,0,0,0),
+d(1961,8,31,23,0,0),
+d(1962,6,1,0,0,0),
+d(1962,8,31,23,0,0),
+        ]
+
+    _transition_info = [
+i(-3180,0,'FMT'),
+i(-3600,0,'WAT'),
+i(-1200,2400,'SLST'),
+i(-3600,0,'WAT'),
+i(-1200,2400,'SLST'),
+i(-3600,0,'WAT'),
+i(-1200,2400,'SLST'),
+i(-3600,0,'WAT'),
+i(-1200,2400,'SLST'),
+i(-3600,0,'WAT'),
+i(-1200,2400,'SLST'),
+i(-3600,0,'WAT'),
+i(-1200,2400,'SLST'),
+i(-3600,0,'WAT'),
+i(-1200,2400,'SLST'),
+i(-3600,0,'WAT'),
+i(-1200,2400,'SLST'),
+i(-3600,0,'WAT'),
+i(0,0,'WAT'),
+i(3600,3600,'SLST'),
+i(0,0,'GMT'),
+i(3600,3600,'SLST'),
+i(0,0,'GMT'),
+i(3600,3600,'SLST'),
+i(0,0,'GMT'),
+i(3600,3600,'SLST'),
+i(0,0,'GMT'),
+i(3600,3600,'SLST'),
+i(0,0,'GMT'),
+i(3600,3600,'SLST'),
+i(0,0,'GMT'),
+        ]
+
+Freetown = Freetown()
+
diff --git a/lib/pytz/zoneinfo/Africa/Gaborone.py b/lib/pytz/zoneinfo/Africa/Gaborone.py
new file mode 100755
index 0000000..2f7ca37
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Gaborone.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Africa/Gaborone.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Gaborone(DstTzInfo):
+    '''Africa/Gaborone timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Gaborone'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1943,9,19,0,0,0),
+d(1944,3,18,23,0,0),
+        ]
+
+    _transition_info = [
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+        ]
+
+Gaborone = Gaborone()
+
diff --git a/lib/pytz/zoneinfo/Africa/Harare.py b/lib/pytz/zoneinfo/Africa/Harare.py
new file mode 100755
index 0000000..3dd81aa
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Harare.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Harare.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Harare(DstTzInfo):
+    '''Africa/Harare timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Harare'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1903,2,28,21,55,48),
+        ]
+
+    _transition_info = [
+i(7440,0,'LMT'),
+i(7200,0,'CAT'),
+        ]
+
+Harare = Harare()
+
diff --git a/lib/pytz/zoneinfo/Africa/Johannesburg.py b/lib/pytz/zoneinfo/Africa/Johannesburg.py
new file mode 100755
index 0000000..09bde27
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Johannesburg.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for Africa/Johannesburg.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Johannesburg(DstTzInfo):
+    '''Africa/Johannesburg timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Johannesburg'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1903,2,28,22,30,0),
+d(1942,9,20,0,0,0),
+d(1943,3,20,23,0,0),
+d(1943,9,19,0,0,0),
+d(1944,3,18,23,0,0),
+        ]
+
+    _transition_info = [
+i(5400,0,'SAST'),
+i(7200,0,'SAST'),
+i(10800,3600,'SAST'),
+i(7200,0,'SAST'),
+i(10800,3600,'SAST'),
+i(7200,0,'SAST'),
+        ]
+
+Johannesburg = Johannesburg()
+
diff --git a/lib/pytz/zoneinfo/Africa/Kampala.py b/lib/pytz/zoneinfo/Africa/Kampala.py
new file mode 100755
index 0000000..c60e898
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Kampala.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Africa/Kampala.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kampala(DstTzInfo):
+    '''Africa/Kampala timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Kampala'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1928,6,30,21,50,20),
+d(1929,12,31,21,0,0),
+d(1947,12,31,21,30,0),
+d(1956,12,31,21,15,15),
+        ]
+
+    _transition_info = [
+i(7800,0,'LMT'),
+i(10800,0,'EAT'),
+i(9000,0,'BEAT'),
+i(9900,0,'BEAUT'),
+i(10800,0,'EAT'),
+        ]
+
+Kampala = Kampala()
+
diff --git a/lib/pytz/zoneinfo/Africa/Khartoum.py b/lib/pytz/zoneinfo/Africa/Khartoum.py
new file mode 100755
index 0000000..94beac5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Khartoum.py
@@ -0,0 +1,88 @@
+'''tzinfo timezone information for Africa/Khartoum.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Khartoum(DstTzInfo):
+    '''Africa/Khartoum timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Khartoum'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1930,12,31,21,49,52),
+d(1970,4,30,22,0,0),
+d(1970,10,14,21,0,0),
+d(1971,4,29,22,0,0),
+d(1971,10,14,21,0,0),
+d(1972,4,29,22,0,0),
+d(1972,10,14,21,0,0),
+d(1973,4,28,22,0,0),
+d(1973,10,14,21,0,0),
+d(1974,4,27,22,0,0),
+d(1974,10,14,21,0,0),
+d(1975,4,26,22,0,0),
+d(1975,10,14,21,0,0),
+d(1976,4,24,22,0,0),
+d(1976,10,14,21,0,0),
+d(1977,4,23,22,0,0),
+d(1977,10,14,21,0,0),
+d(1978,4,29,22,0,0),
+d(1978,10,14,21,0,0),
+d(1979,4,28,22,0,0),
+d(1979,10,14,21,0,0),
+d(1980,4,26,22,0,0),
+d(1980,10,14,21,0,0),
+d(1981,4,25,22,0,0),
+d(1981,10,14,21,0,0),
+d(1982,4,24,22,0,0),
+d(1982,10,14,21,0,0),
+d(1983,4,23,22,0,0),
+d(1983,10,14,21,0,0),
+d(1984,4,28,22,0,0),
+d(1984,10,14,21,0,0),
+d(1985,4,27,22,0,0),
+d(1985,10,14,21,0,0),
+d(2000,1,15,10,0,0),
+        ]
+
+    _transition_info = [
+i(7800,0,'LMT'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,3600,'CAST'),
+i(7200,0,'CAT'),
+i(10800,0,'EAT'),
+        ]
+
+Khartoum = Khartoum()
+
diff --git a/lib/pytz/zoneinfo/Africa/Kigali.py b/lib/pytz/zoneinfo/Africa/Kigali.py
new file mode 100755
index 0000000..eaf21aa
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Kigali.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Kigali.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kigali(DstTzInfo):
+    '''Africa/Kigali timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Kigali'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1935,5,31,21,59,44),
+        ]
+
+    _transition_info = [
+i(7200,0,'LMT'),
+i(7200,0,'CAT'),
+        ]
+
+Kigali = Kigali()
+
diff --git a/lib/pytz/zoneinfo/Africa/Kinshasa.py b/lib/pytz/zoneinfo/Africa/Kinshasa.py
new file mode 100755
index 0000000..abba169
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Kinshasa.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Africa/Kinshasa.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Kinshasa(StaticTzInfo):
+    '''Africa/Kinshasa timezone definition. See datetime.tzinfo for details'''
+    zone = 'Africa/Kinshasa'
+    _utcoffset = timedelta(seconds=3600)
+    _tzname = 'WAT'
+
+Kinshasa = Kinshasa()
+
diff --git a/lib/pytz/zoneinfo/Africa/Lagos.py b/lib/pytz/zoneinfo/Africa/Lagos.py
new file mode 100755
index 0000000..23a616f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Lagos.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Lagos.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Lagos(DstTzInfo):
+    '''Africa/Lagos timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Lagos'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,8,31,23,46,24),
+        ]
+
+    _transition_info = [
+i(840,0,'LMT'),
+i(3600,0,'WAT'),
+        ]
+
+Lagos = Lagos()
+
diff --git a/lib/pytz/zoneinfo/Africa/Libreville.py b/lib/pytz/zoneinfo/Africa/Libreville.py
new file mode 100755
index 0000000..26c4bdf
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Libreville.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Libreville.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Libreville(DstTzInfo):
+    '''Africa/Libreville timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Libreville'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,23,22,12),
+        ]
+
+    _transition_info = [
+i(2280,0,'LMT'),
+i(3600,0,'WAT'),
+        ]
+
+Libreville = Libreville()
+
diff --git a/lib/pytz/zoneinfo/Africa/Lome.py b/lib/pytz/zoneinfo/Africa/Lome.py
new file mode 100755
index 0000000..f161ddd
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Lome.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Africa/Lome.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Lome(StaticTzInfo):
+    '''Africa/Lome timezone definition. See datetime.tzinfo for details'''
+    zone = 'Africa/Lome'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+Lome = Lome()
+
diff --git a/lib/pytz/zoneinfo/Africa/Luanda.py b/lib/pytz/zoneinfo/Africa/Luanda.py
new file mode 100755
index 0000000..80528f6
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Luanda.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Luanda.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Luanda(DstTzInfo):
+    '''Africa/Luanda timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Luanda'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,5,25,23,7,56),
+        ]
+
+    _transition_info = [
+i(3120,0,'AOT'),
+i(3600,0,'WAT'),
+        ]
+
+Luanda = Luanda()
+
diff --git a/lib/pytz/zoneinfo/Africa/Lubumbashi.py b/lib/pytz/zoneinfo/Africa/Lubumbashi.py
new file mode 100755
index 0000000..a9d6411
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Lubumbashi.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Africa/Lubumbashi.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Lubumbashi(StaticTzInfo):
+    '''Africa/Lubumbashi timezone definition. See datetime.tzinfo for details'''
+    zone = 'Africa/Lubumbashi'
+    _utcoffset = timedelta(seconds=7200)
+    _tzname = 'CAT'
+
+Lubumbashi = Lubumbashi()
+
diff --git a/lib/pytz/zoneinfo/Africa/Lusaka.py b/lib/pytz/zoneinfo/Africa/Lusaka.py
new file mode 100755
index 0000000..cb92fb8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Lusaka.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Lusaka.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Lusaka(DstTzInfo):
+    '''Africa/Lusaka timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Lusaka'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1903,2,28,22,6,52),
+        ]
+
+    _transition_info = [
+i(6780,0,'LMT'),
+i(7200,0,'CAT'),
+        ]
+
+Lusaka = Lusaka()
+
diff --git a/lib/pytz/zoneinfo/Africa/Malabo.py b/lib/pytz/zoneinfo/Africa/Malabo.py
new file mode 100755
index 0000000..c5ec85e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Malabo.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Africa/Malabo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Malabo(DstTzInfo):
+    '''Africa/Malabo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Malabo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,23,24,52),
+d(1963,12,15,0,0,0),
+        ]
+
+    _transition_info = [
+i(2100,0,'LMT'),
+i(0,0,'GMT'),
+i(3600,0,'WAT'),
+        ]
+
+Malabo = Malabo()
+
diff --git a/lib/pytz/zoneinfo/Africa/Maputo.py b/lib/pytz/zoneinfo/Africa/Maputo.py
new file mode 100755
index 0000000..69b83eb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Maputo.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Maputo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Maputo(DstTzInfo):
+    '''Africa/Maputo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Maputo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1903,2,28,21,49,40),
+        ]
+
+    _transition_info = [
+i(7800,0,'LMT'),
+i(7200,0,'CAT'),
+        ]
+
+Maputo = Maputo()
+
diff --git a/lib/pytz/zoneinfo/Africa/Maseru.py b/lib/pytz/zoneinfo/Africa/Maseru.py
new file mode 100755
index 0000000..d49b14f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Maseru.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Maseru.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Maseru(DstTzInfo):
+    '''Africa/Maseru timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Maseru'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1903,2,28,22,10,0),
+d(1943,9,19,0,0,0),
+d(1944,3,18,23,0,0),
+        ]
+
+    _transition_info = [
+i(6600,0,'LMT'),
+i(7200,0,'SAST'),
+i(10800,3600,'SAST'),
+i(7200,0,'SAST'),
+        ]
+
+Maseru = Maseru()
+
diff --git a/lib/pytz/zoneinfo/Africa/Mbabane.py b/lib/pytz/zoneinfo/Africa/Mbabane.py
new file mode 100755
index 0000000..caf48cc
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Mbabane.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Mbabane.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mbabane(DstTzInfo):
+    '''Africa/Mbabane timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Mbabane'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1903,2,28,21,55,36),
+        ]
+
+    _transition_info = [
+i(7440,0,'LMT'),
+i(7200,0,'SAST'),
+        ]
+
+Mbabane = Mbabane()
+
diff --git a/lib/pytz/zoneinfo/Africa/Mogadishu.py b/lib/pytz/zoneinfo/Africa/Mogadishu.py
new file mode 100755
index 0000000..fd871e1
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Mogadishu.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Africa/Mogadishu.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mogadishu(DstTzInfo):
+    '''Africa/Mogadishu timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Mogadishu'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1930,12,31,21,0,0),
+d(1956,12,31,21,30,0),
+        ]
+
+    _transition_info = [
+i(10800,0,'EAT'),
+i(9000,0,'BEAT'),
+i(10800,0,'EAT'),
+        ]
+
+Mogadishu = Mogadishu()
+
diff --git a/lib/pytz/zoneinfo/Africa/Monrovia.py b/lib/pytz/zoneinfo/Africa/Monrovia.py
new file mode 100755
index 0000000..15a4268
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Monrovia.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Africa/Monrovia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Monrovia(DstTzInfo):
+    '''Africa/Monrovia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Monrovia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,3,1,0,43,8),
+d(1972,5,1,0,44,30),
+        ]
+
+    _transition_info = [
+i(-2580,0,'MMT'),
+i(-2640,0,'LRT'),
+i(0,0,'GMT'),
+        ]
+
+Monrovia = Monrovia()
+
diff --git a/lib/pytz/zoneinfo/Africa/Nairobi.py b/lib/pytz/zoneinfo/Africa/Nairobi.py
new file mode 100755
index 0000000..fbee2de
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Nairobi.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Africa/Nairobi.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Nairobi(DstTzInfo):
+    '''Africa/Nairobi timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Nairobi'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1928,6,30,21,32,44),
+d(1929,12,31,21,0,0),
+d(1939,12,31,21,30,0),
+d(1959,12,31,21,15,15),
+        ]
+
+    _transition_info = [
+i(8820,0,'LMT'),
+i(10800,0,'EAT'),
+i(9000,0,'BEAT'),
+i(9900,0,'BEAUT'),
+i(10800,0,'EAT'),
+        ]
+
+Nairobi = Nairobi()
+
diff --git a/lib/pytz/zoneinfo/Africa/Ndjamena.py b/lib/pytz/zoneinfo/Africa/Ndjamena.py
new file mode 100755
index 0000000..52a0ea8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Ndjamena.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Ndjamena.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ndjamena(DstTzInfo):
+    '''Africa/Ndjamena timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Ndjamena'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,22,59,48),
+d(1979,10,13,23,0,0),
+d(1980,3,7,22,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'LMT'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+        ]
+
+Ndjamena = Ndjamena()
+
diff --git a/lib/pytz/zoneinfo/Africa/Niamey.py b/lib/pytz/zoneinfo/Africa/Niamey.py
new file mode 100755
index 0000000..f4ffd54
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Niamey.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Niamey.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Niamey(DstTzInfo):
+    '''Africa/Niamey timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Niamey'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,23,51,32),
+d(1934,2,26,1,0,0),
+d(1960,1,1,0,0,0),
+        ]
+
+    _transition_info = [
+i(480,0,'LMT'),
+i(-3600,0,'WAT'),
+i(0,0,'GMT'),
+i(3600,0,'WAT'),
+        ]
+
+Niamey = Niamey()
+
diff --git a/lib/pytz/zoneinfo/Africa/Nouakchott.py b/lib/pytz/zoneinfo/Africa/Nouakchott.py
new file mode 100755
index 0000000..1c35ec7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Nouakchott.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Nouakchott.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Nouakchott(DstTzInfo):
+    '''Africa/Nouakchott timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Nouakchott'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,1,3,48),
+d(1934,2,26,0,0,0),
+d(1960,11,28,1,0,0),
+        ]
+
+    _transition_info = [
+i(-3840,0,'LMT'),
+i(0,0,'GMT'),
+i(-3600,0,'WAT'),
+i(0,0,'GMT'),
+        ]
+
+Nouakchott = Nouakchott()
+
diff --git a/lib/pytz/zoneinfo/Africa/Ouagadougou.py b/lib/pytz/zoneinfo/Africa/Ouagadougou.py
new file mode 100755
index 0000000..1019d17
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Ouagadougou.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Ouagadougou.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ouagadougou(DstTzInfo):
+    '''Africa/Ouagadougou timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Ouagadougou'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,0,6,4),
+        ]
+
+    _transition_info = [
+i(-360,0,'LMT'),
+i(0,0,'GMT'),
+        ]
+
+Ouagadougou = Ouagadougou()
+
diff --git a/lib/pytz/zoneinfo/Africa/Porto_minus_Novo.py b/lib/pytz/zoneinfo/Africa/Porto_minus_Novo.py
new file mode 100755
index 0000000..867c468
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Porto_minus_Novo.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Africa/Porto_minus_Novo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Porto_minus_Novo(DstTzInfo):
+    '''Africa/Porto_minus_Novo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Porto_minus_Novo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,23,49,32),
+d(1934,2,26,0,0,0),
+        ]
+
+    _transition_info = [
+i(600,0,'LMT'),
+i(0,0,'GMT'),
+i(3600,0,'WAT'),
+        ]
+
+Porto_minus_Novo = Porto_minus_Novo()
+
diff --git a/lib/pytz/zoneinfo/Africa/Sao_Tome.py b/lib/pytz/zoneinfo/Africa/Sao_Tome.py
new file mode 100755
index 0000000..427b6d0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Sao_Tome.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Africa/Sao_Tome.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Sao_Tome(DstTzInfo):
+    '''Africa/Sao_Tome timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Sao_Tome'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,0,36,32),
+        ]
+
+    _transition_info = [
+i(-2220,0,'LMT'),
+i(0,0,'GMT'),
+        ]
+
+Sao_Tome = Sao_Tome()
+
diff --git a/lib/pytz/zoneinfo/Africa/Timbuktu.py b/lib/pytz/zoneinfo/Africa/Timbuktu.py
new file mode 100755
index 0000000..adc88f9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Timbuktu.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Africa/Timbuktu.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Timbuktu(DstTzInfo):
+    '''Africa/Timbuktu timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Timbuktu'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,0,32,0),
+d(1934,2,26,0,0,0),
+d(1960,6,20,1,0,0),
+        ]
+
+    _transition_info = [
+i(-1920,0,'LMT'),
+i(0,0,'GMT'),
+i(-3600,0,'WAT'),
+i(0,0,'GMT'),
+        ]
+
+Timbuktu = Timbuktu()
+
diff --git a/lib/pytz/zoneinfo/Africa/Tripoli.py b/lib/pytz/zoneinfo/Africa/Tripoli.py
new file mode 100755
index 0000000..d4752dc
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Tripoli.py
@@ -0,0 +1,78 @@
+'''tzinfo timezone information for Africa/Tripoli.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tripoli(DstTzInfo):
+    '''Africa/Tripoli timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Tripoli'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,23,7,16),
+d(1951,10,14,1,0,0),
+d(1951,12,31,22,0,0),
+d(1953,10,9,1,0,0),
+d(1953,12,31,22,0,0),
+d(1955,9,29,23,0,0),
+d(1955,12,31,22,0,0),
+d(1958,12,31,23,0,0),
+d(1981,12,31,22,0,0),
+d(1982,3,31,23,0,0),
+d(1982,9,30,22,0,0),
+d(1983,3,31,23,0,0),
+d(1983,9,30,22,0,0),
+d(1984,3,31,23,0,0),
+d(1984,9,30,22,0,0),
+d(1985,4,5,23,0,0),
+d(1985,9,30,22,0,0),
+d(1986,4,3,23,0,0),
+d(1986,10,2,22,0,0),
+d(1987,3,31,23,0,0),
+d(1987,9,30,22,0,0),
+d(1988,3,31,23,0,0),
+d(1988,9,30,22,0,0),
+d(1989,3,31,23,0,0),
+d(1989,9,30,22,0,0),
+d(1990,5,3,23,0,0),
+d(1996,9,29,22,0,0),
+d(1997,4,3,23,0,0),
+d(1997,10,3,22,0,0),
+        ]
+
+    _transition_info = [
+i(3180,0,'LMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,0,'EET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,0,'EET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,0,'EET'),
+        ]
+
+Tripoli = Tripoli()
+
diff --git a/lib/pytz/zoneinfo/Africa/Tunis.py b/lib/pytz/zoneinfo/Africa/Tunis.py
new file mode 100755
index 0000000..b534685
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Tunis.py
@@ -0,0 +1,202 @@
+'''tzinfo timezone information for Africa/Tunis.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tunis(DstTzInfo):
+    '''Africa/Tunis timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Tunis'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,3,10,23,50,39),
+d(1939,4,15,22,0,0),
+d(1939,11,18,22,0,0),
+d(1940,2,25,22,0,0),
+d(1941,10,5,22,0,0),
+d(1942,3,8,23,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,4,17,0,0,0),
+d(1943,4,25,1,0,0),
+d(1943,10,4,0,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,7,22,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,15,22,0,0),
+d(1977,4,29,23,0,0),
+d(1977,9,23,23,0,0),
+d(1978,4,30,23,0,0),
+d(1978,9,30,23,0,0),
+d(1988,5,31,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1990,4,30,23,0,0),
+d(1990,9,29,23,0,0),
+d(2005,4,30,23,0,0),
+d(2005,9,30,0,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(540,0,'PMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Tunis = Tunis()
+
diff --git a/lib/pytz/zoneinfo/Africa/Windhoek.py b/lib/pytz/zoneinfo/Africa/Windhoek.py
new file mode 100755
index 0000000..58bca75
--- /dev/null
+++ b/lib/pytz/zoneinfo/Africa/Windhoek.py
@@ -0,0 +1,204 @@
+'''tzinfo timezone information for Africa/Windhoek.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Windhoek(DstTzInfo):
+    '''Africa/Windhoek timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Africa/Windhoek'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1903,2,28,22,30,0),
+d(1942,9,20,0,0,0),
+d(1943,3,20,23,0,0),
+d(1990,3,20,22,0,0),
+d(1994,4,2,22,0,0),
+d(1994,9,4,1,0,0),
+d(1995,4,2,0,0,0),
+d(1995,9,3,1,0,0),
+d(1996,4,7,0,0,0),
+d(1996,9,1,1,0,0),
+d(1997,4,6,0,0,0),
+d(1997,9,7,1,0,0),
+d(1998,4,5,0,0,0),
+d(1998,9,6,1,0,0),
+d(1999,4,4,0,0,0),
+d(1999,9,5,1,0,0),
+d(2000,4,2,0,0,0),
+d(2000,9,3,1,0,0),
+d(2001,4,1,0,0,0),
+d(2001,9,2,1,0,0),
+d(2002,4,7,0,0,0),
+d(2002,9,1,1,0,0),
+d(2003,4,6,0,0,0),
+d(2003,9,7,1,0,0),
+d(2004,4,4,0,0,0),
+d(2004,9,5,1,0,0),
+d(2005,4,3,0,0,0),
+d(2005,9,4,1,0,0),
+d(2006,4,2,0,0,0),
+d(2006,9,3,1,0,0),
+d(2007,4,1,0,0,0),
+d(2007,9,2,1,0,0),
+d(2008,4,6,0,0,0),
+d(2008,9,7,1,0,0),
+d(2009,4,5,0,0,0),
+d(2009,9,6,1,0,0),
+d(2010,4,4,0,0,0),
+d(2010,9,5,1,0,0),
+d(2011,4,3,0,0,0),
+d(2011,9,4,1,0,0),
+d(2012,4,1,0,0,0),
+d(2012,9,2,1,0,0),
+d(2013,4,7,0,0,0),
+d(2013,9,1,1,0,0),
+d(2014,4,6,0,0,0),
+d(2014,9,7,1,0,0),
+d(2015,4,5,0,0,0),
+d(2015,9,6,1,0,0),
+d(2016,4,3,0,0,0),
+d(2016,9,4,1,0,0),
+d(2017,4,2,0,0,0),
+d(2017,9,3,1,0,0),
+d(2018,4,1,0,0,0),
+d(2018,9,2,1,0,0),
+d(2019,4,7,0,0,0),
+d(2019,9,1,1,0,0),
+d(2020,4,5,0,0,0),
+d(2020,9,6,1,0,0),
+d(2021,4,4,0,0,0),
+d(2021,9,5,1,0,0),
+d(2022,4,3,0,0,0),
+d(2022,9,4,1,0,0),
+d(2023,4,2,0,0,0),
+d(2023,9,3,1,0,0),
+d(2024,4,7,0,0,0),
+d(2024,9,1,1,0,0),
+d(2025,4,6,0,0,0),
+d(2025,9,7,1,0,0),
+d(2026,4,5,0,0,0),
+d(2026,9,6,1,0,0),
+d(2027,4,4,0,0,0),
+d(2027,9,5,1,0,0),
+d(2028,4,2,0,0,0),
+d(2028,9,3,1,0,0),
+d(2029,4,1,0,0,0),
+d(2029,9,2,1,0,0),
+d(2030,4,7,0,0,0),
+d(2030,9,1,1,0,0),
+d(2031,4,6,0,0,0),
+d(2031,9,7,1,0,0),
+d(2032,4,4,0,0,0),
+d(2032,9,5,1,0,0),
+d(2033,4,3,0,0,0),
+d(2033,9,4,1,0,0),
+d(2034,4,2,0,0,0),
+d(2034,9,3,1,0,0),
+d(2035,4,1,0,0,0),
+d(2035,9,2,1,0,0),
+d(2036,4,6,0,0,0),
+d(2036,9,7,1,0,0),
+d(2037,4,5,0,0,0),
+d(2037,9,6,1,0,0),
+        ]
+
+    _transition_info = [
+i(5400,0,'SWAT'),
+i(7200,0,'SAST'),
+i(10800,3600,'SAST'),
+i(7200,0,'SAST'),
+i(7200,0,'CAT'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+i(3600,0,'WAT'),
+i(7200,3600,'WAST'),
+        ]
+
+Windhoek = Windhoek()
+
diff --git a/lib/pytz/zoneinfo/Africa/__init__.py b/lib/pytz/zoneinfo/Africa/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/America/Adak.py b/lib/pytz/zoneinfo/America/Adak.py
new file mode 100755
index 0000000..9748947
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Adak.py
@@ -0,0 +1,306 @@
+'''tzinfo timezone information for America/Adak.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Adak(DstTzInfo):
+    '''America/Adak timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Adak'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,2,9,13,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,12,0,0),
+d(1967,4,1,11,0,0),
+d(1969,4,27,13,0,0),
+d(1969,10,26,12,0,0),
+d(1970,4,26,13,0,0),
+d(1970,10,25,12,0,0),
+d(1971,4,25,13,0,0),
+d(1971,10,31,12,0,0),
+d(1972,4,30,13,0,0),
+d(1972,10,29,12,0,0),
+d(1973,4,29,13,0,0),
+d(1973,10,28,12,0,0),
+d(1974,1,6,13,0,0),
+d(1974,10,27,12,0,0),
+d(1975,2,23,13,0,0),
+d(1975,10,26,12,0,0),
+d(1976,4,25,13,0,0),
+d(1976,10,31,12,0,0),
+d(1977,4,24,13,0,0),
+d(1977,10,30,12,0,0),
+d(1978,4,30,13,0,0),
+d(1978,10,29,12,0,0),
+d(1979,4,29,13,0,0),
+d(1979,10,28,12,0,0),
+d(1980,4,27,13,0,0),
+d(1980,10,26,12,0,0),
+d(1981,4,26,13,0,0),
+d(1981,10,25,12,0,0),
+d(1982,4,25,13,0,0),
+d(1982,10,31,12,0,0),
+d(1983,4,24,13,0,0),
+d(1983,10,30,12,0,0),
+d(1983,11,30,10,0,0),
+d(1984,4,29,12,0,0),
+d(1984,10,28,11,0,0),
+d(1985,4,28,12,0,0),
+d(1985,10,27,11,0,0),
+d(1986,4,27,12,0,0),
+d(1986,10,26,11,0,0),
+d(1987,4,5,12,0,0),
+d(1987,10,25,11,0,0),
+d(1988,4,3,12,0,0),
+d(1988,10,30,11,0,0),
+d(1989,4,2,12,0,0),
+d(1989,10,29,11,0,0),
+d(1990,4,1,12,0,0),
+d(1990,10,28,11,0,0),
+d(1991,4,7,12,0,0),
+d(1991,10,27,11,0,0),
+d(1992,4,5,12,0,0),
+d(1992,10,25,11,0,0),
+d(1993,4,4,12,0,0),
+d(1993,10,31,11,0,0),
+d(1994,4,3,12,0,0),
+d(1994,10,30,11,0,0),
+d(1995,4,2,12,0,0),
+d(1995,10,29,11,0,0),
+d(1996,4,7,12,0,0),
+d(1996,10,27,11,0,0),
+d(1997,4,6,12,0,0),
+d(1997,10,26,11,0,0),
+d(1998,4,5,12,0,0),
+d(1998,10,25,11,0,0),
+d(1999,4,4,12,0,0),
+d(1999,10,31,11,0,0),
+d(2000,4,2,12,0,0),
+d(2000,10,29,11,0,0),
+d(2001,4,1,12,0,0),
+d(2001,10,28,11,0,0),
+d(2002,4,7,12,0,0),
+d(2002,10,27,11,0,0),
+d(2003,4,6,12,0,0),
+d(2003,10,26,11,0,0),
+d(2004,4,4,12,0,0),
+d(2004,10,31,11,0,0),
+d(2005,4,3,12,0,0),
+d(2005,10,30,11,0,0),
+d(2006,4,2,12,0,0),
+d(2006,10,29,11,0,0),
+d(2007,3,11,12,0,0),
+d(2007,11,4,11,0,0),
+d(2008,3,9,12,0,0),
+d(2008,11,2,11,0,0),
+d(2009,3,8,12,0,0),
+d(2009,11,1,11,0,0),
+d(2010,3,14,12,0,0),
+d(2010,11,7,11,0,0),
+d(2011,3,13,12,0,0),
+d(2011,11,6,11,0,0),
+d(2012,3,11,12,0,0),
+d(2012,11,4,11,0,0),
+d(2013,3,10,12,0,0),
+d(2013,11,3,11,0,0),
+d(2014,3,9,12,0,0),
+d(2014,11,2,11,0,0),
+d(2015,3,8,12,0,0),
+d(2015,11,1,11,0,0),
+d(2016,3,13,12,0,0),
+d(2016,11,6,11,0,0),
+d(2017,3,12,12,0,0),
+d(2017,11,5,11,0,0),
+d(2018,3,11,12,0,0),
+d(2018,11,4,11,0,0),
+d(2019,3,10,12,0,0),
+d(2019,11,3,11,0,0),
+d(2020,3,8,12,0,0),
+d(2020,11,1,11,0,0),
+d(2021,3,14,12,0,0),
+d(2021,11,7,11,0,0),
+d(2022,3,13,12,0,0),
+d(2022,11,6,11,0,0),
+d(2023,3,12,12,0,0),
+d(2023,11,5,11,0,0),
+d(2024,3,10,12,0,0),
+d(2024,11,3,11,0,0),
+d(2025,3,9,12,0,0),
+d(2025,11,2,11,0,0),
+d(2026,3,8,12,0,0),
+d(2026,11,1,11,0,0),
+d(2027,3,14,12,0,0),
+d(2027,11,7,11,0,0),
+d(2028,3,12,12,0,0),
+d(2028,11,5,11,0,0),
+d(2029,3,11,12,0,0),
+d(2029,11,4,11,0,0),
+d(2030,3,10,12,0,0),
+d(2030,11,3,11,0,0),
+d(2031,3,9,12,0,0),
+d(2031,11,2,11,0,0),
+d(2032,3,14,12,0,0),
+d(2032,11,7,11,0,0),
+d(2033,3,13,12,0,0),
+d(2033,11,6,11,0,0),
+d(2034,3,12,12,0,0),
+d(2034,11,5,11,0,0),
+d(2035,3,11,12,0,0),
+d(2035,11,4,11,0,0),
+d(2036,3,9,12,0,0),
+d(2036,11,2,11,0,0),
+d(2037,3,8,12,0,0),
+d(2037,11,1,11,0,0),
+        ]
+
+    _transition_info = [
+i(-39600,0,'NST'),
+i(-36000,3600,'NWT'),
+i(-36000,3600,'NPT'),
+i(-39600,0,'NST'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-36000,0,'AHST'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+        ]
+
+Adak = Adak()
+
diff --git a/lib/pytz/zoneinfo/America/Anchorage.py b/lib/pytz/zoneinfo/America/Anchorage.py
new file mode 100755
index 0000000..869a882
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Anchorage.py
@@ -0,0 +1,306 @@
+'''tzinfo timezone information for America/Anchorage.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Anchorage(DstTzInfo):
+    '''America/Anchorage timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Anchorage'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,2,9,12,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,11,0,0),
+d(1967,4,1,10,0,0),
+d(1969,4,27,12,0,0),
+d(1969,10,26,11,0,0),
+d(1970,4,26,12,0,0),
+d(1970,10,25,11,0,0),
+d(1971,4,25,12,0,0),
+d(1971,10,31,11,0,0),
+d(1972,4,30,12,0,0),
+d(1972,10,29,11,0,0),
+d(1973,4,29,12,0,0),
+d(1973,10,28,11,0,0),
+d(1974,1,6,12,0,0),
+d(1974,10,27,11,0,0),
+d(1975,2,23,12,0,0),
+d(1975,10,26,11,0,0),
+d(1976,4,25,12,0,0),
+d(1976,10,31,11,0,0),
+d(1977,4,24,12,0,0),
+d(1977,10,30,11,0,0),
+d(1978,4,30,12,0,0),
+d(1978,10,29,11,0,0),
+d(1979,4,29,12,0,0),
+d(1979,10,28,11,0,0),
+d(1980,4,27,12,0,0),
+d(1980,10,26,11,0,0),
+d(1981,4,26,12,0,0),
+d(1981,10,25,11,0,0),
+d(1982,4,25,12,0,0),
+d(1982,10,31,11,0,0),
+d(1983,4,24,12,0,0),
+d(1983,10,30,11,0,0),
+d(1983,11,30,9,0,0),
+d(1984,4,29,11,0,0),
+d(1984,10,28,10,0,0),
+d(1985,4,28,11,0,0),
+d(1985,10,27,10,0,0),
+d(1986,4,27,11,0,0),
+d(1986,10,26,10,0,0),
+d(1987,4,5,11,0,0),
+d(1987,10,25,10,0,0),
+d(1988,4,3,11,0,0),
+d(1988,10,30,10,0,0),
+d(1989,4,2,11,0,0),
+d(1989,10,29,10,0,0),
+d(1990,4,1,11,0,0),
+d(1990,10,28,10,0,0),
+d(1991,4,7,11,0,0),
+d(1991,10,27,10,0,0),
+d(1992,4,5,11,0,0),
+d(1992,10,25,10,0,0),
+d(1993,4,4,11,0,0),
+d(1993,10,31,10,0,0),
+d(1994,4,3,11,0,0),
+d(1994,10,30,10,0,0),
+d(1995,4,2,11,0,0),
+d(1995,10,29,10,0,0),
+d(1996,4,7,11,0,0),
+d(1996,10,27,10,0,0),
+d(1997,4,6,11,0,0),
+d(1997,10,26,10,0,0),
+d(1998,4,5,11,0,0),
+d(1998,10,25,10,0,0),
+d(1999,4,4,11,0,0),
+d(1999,10,31,10,0,0),
+d(2000,4,2,11,0,0),
+d(2000,10,29,10,0,0),
+d(2001,4,1,11,0,0),
+d(2001,10,28,10,0,0),
+d(2002,4,7,11,0,0),
+d(2002,10,27,10,0,0),
+d(2003,4,6,11,0,0),
+d(2003,10,26,10,0,0),
+d(2004,4,4,11,0,0),
+d(2004,10,31,10,0,0),
+d(2005,4,3,11,0,0),
+d(2005,10,30,10,0,0),
+d(2006,4,2,11,0,0),
+d(2006,10,29,10,0,0),
+d(2007,3,11,11,0,0),
+d(2007,11,4,10,0,0),
+d(2008,3,9,11,0,0),
+d(2008,11,2,10,0,0),
+d(2009,3,8,11,0,0),
+d(2009,11,1,10,0,0),
+d(2010,3,14,11,0,0),
+d(2010,11,7,10,0,0),
+d(2011,3,13,11,0,0),
+d(2011,11,6,10,0,0),
+d(2012,3,11,11,0,0),
+d(2012,11,4,10,0,0),
+d(2013,3,10,11,0,0),
+d(2013,11,3,10,0,0),
+d(2014,3,9,11,0,0),
+d(2014,11,2,10,0,0),
+d(2015,3,8,11,0,0),
+d(2015,11,1,10,0,0),
+d(2016,3,13,11,0,0),
+d(2016,11,6,10,0,0),
+d(2017,3,12,11,0,0),
+d(2017,11,5,10,0,0),
+d(2018,3,11,11,0,0),
+d(2018,11,4,10,0,0),
+d(2019,3,10,11,0,0),
+d(2019,11,3,10,0,0),
+d(2020,3,8,11,0,0),
+d(2020,11,1,10,0,0),
+d(2021,3,14,11,0,0),
+d(2021,11,7,10,0,0),
+d(2022,3,13,11,0,0),
+d(2022,11,6,10,0,0),
+d(2023,3,12,11,0,0),
+d(2023,11,5,10,0,0),
+d(2024,3,10,11,0,0),
+d(2024,11,3,10,0,0),
+d(2025,3,9,11,0,0),
+d(2025,11,2,10,0,0),
+d(2026,3,8,11,0,0),
+d(2026,11,1,10,0,0),
+d(2027,3,14,11,0,0),
+d(2027,11,7,10,0,0),
+d(2028,3,12,11,0,0),
+d(2028,11,5,10,0,0),
+d(2029,3,11,11,0,0),
+d(2029,11,4,10,0,0),
+d(2030,3,10,11,0,0),
+d(2030,11,3,10,0,0),
+d(2031,3,9,11,0,0),
+d(2031,11,2,10,0,0),
+d(2032,3,14,11,0,0),
+d(2032,11,7,10,0,0),
+d(2033,3,13,11,0,0),
+d(2033,11,6,10,0,0),
+d(2034,3,12,11,0,0),
+d(2034,11,5,10,0,0),
+d(2035,3,11,11,0,0),
+d(2035,11,4,10,0,0),
+d(2036,3,9,11,0,0),
+d(2036,11,2,10,0,0),
+d(2037,3,8,11,0,0),
+d(2037,11,1,10,0,0),
+        ]
+
+    _transition_info = [
+i(-36000,0,'CAT'),
+i(-32400,3600,'CAWT'),
+i(-32400,3600,'CAPT'),
+i(-36000,0,'CAT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-32400,0,'YST'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+        ]
+
+Anchorage = Anchorage()
+
diff --git a/lib/pytz/zoneinfo/America/Anguilla.py b/lib/pytz/zoneinfo/America/Anguilla.py
new file mode 100755
index 0000000..e72c84f
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Anguilla.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Anguilla.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Anguilla(DstTzInfo):
+    '''America/Anguilla timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Anguilla'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,3,2,4,12,16),
+        ]
+
+    _transition_info = [
+i(-15120,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+Anguilla = Anguilla()
+
diff --git a/lib/pytz/zoneinfo/America/Antigua.py b/lib/pytz/zoneinfo/America/Antigua.py
new file mode 100755
index 0000000..7515f84
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Antigua.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for America/Antigua.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Antigua(DstTzInfo):
+    '''America/Antigua timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Antigua'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,3,2,4,7,12),
+d(1951,1,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-14820,0,'LMT'),
+i(-18000,0,'EST'),
+i(-14400,0,'AST'),
+        ]
+
+Antigua = Antigua()
+
diff --git a/lib/pytz/zoneinfo/America/Araguaina.py b/lib/pytz/zoneinfo/America/Araguaina.py
new file mode 100755
index 0000000..60e69fa
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Araguaina.py
@@ -0,0 +1,118 @@
+'''tzinfo timezone information for America/Araguaina.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Araguaina(DstTzInfo):
+    '''America/Araguaina timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Araguaina'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,3,12,48),
+d(1931,10,3,14,0,0),
+d(1932,4,1,2,0,0),
+d(1932,10,3,3,0,0),
+d(1933,4,1,2,0,0),
+d(1949,12,1,3,0,0),
+d(1950,4,16,3,0,0),
+d(1950,12,1,3,0,0),
+d(1951,4,1,2,0,0),
+d(1951,12,1,3,0,0),
+d(1952,4,1,2,0,0),
+d(1952,12,1,3,0,0),
+d(1953,3,1,2,0,0),
+d(1963,12,9,3,0,0),
+d(1964,3,1,2,0,0),
+d(1965,1,31,3,0,0),
+d(1965,3,31,2,0,0),
+d(1965,12,1,3,0,0),
+d(1966,3,1,2,0,0),
+d(1966,11,1,3,0,0),
+d(1967,3,1,2,0,0),
+d(1967,11,1,3,0,0),
+d(1968,3,1,2,0,0),
+d(1985,11,2,3,0,0),
+d(1986,3,15,2,0,0),
+d(1986,10,25,3,0,0),
+d(1987,2,14,2,0,0),
+d(1987,10,25,3,0,0),
+d(1988,2,7,2,0,0),
+d(1988,10,16,3,0,0),
+d(1989,1,29,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,2,11,2,0,0),
+d(1995,10,15,3,0,0),
+d(1996,2,11,2,0,0),
+d(1996,10,6,3,0,0),
+d(1997,2,16,2,0,0),
+d(1997,10,6,3,0,0),
+d(1998,3,1,2,0,0),
+d(1998,10,11,3,0,0),
+d(1999,2,21,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,2,27,2,0,0),
+d(2000,10,8,3,0,0),
+d(2001,2,18,2,0,0),
+d(2001,10,14,3,0,0),
+d(2002,2,17,2,0,0),
+d(2002,11,3,3,0,0),
+d(2003,2,16,2,0,0),
+        ]
+
+    _transition_info = [
+i(-11580,0,'LMT'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+        ]
+
+Araguaina = Araguaina()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/Buenos_Aires.py b/lib/pytz/zoneinfo/America/Argentina/Buenos_Aires.py
new file mode 100755
index 0000000..0862e0f
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/Buenos_Aires.py
@@ -0,0 +1,132 @@
+'''tzinfo timezone information for America/Argentina/Buenos_Aires.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Buenos_Aires(DstTzInfo):
+    '''America/Argentina/Buenos_Aires timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/Buenos_Aires'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,3,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+        ]
+
+Buenos_Aires = Buenos_Aires()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/Catamarca.py b/lib/pytz/zoneinfo/America/Argentina/Catamarca.py
new file mode 100755
index 0000000..f12423a
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/Catamarca.py
@@ -0,0 +1,136 @@
+'''tzinfo timezone information for America/Argentina/Catamarca.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Catamarca(DstTzInfo):
+    '''America/Argentina/Catamarca timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/Catamarca'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,6,1,3,0,0),
+d(2004,6,20,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+Catamarca = Catamarca()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/ComodRivadavia.py b/lib/pytz/zoneinfo/America/Argentina/ComodRivadavia.py
new file mode 100755
index 0000000..12a1e87
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/ComodRivadavia.py
@@ -0,0 +1,136 @@
+'''tzinfo timezone information for America/Argentina/ComodRivadavia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class ComodRivadavia(DstTzInfo):
+    '''America/Argentina/ComodRivadavia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/ComodRivadavia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,6,1,3,0,0),
+d(2004,6,20,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+ComodRivadavia = ComodRivadavia()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/Cordoba.py b/lib/pytz/zoneinfo/America/Argentina/Cordoba.py
new file mode 100755
index 0000000..c880297
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/Cordoba.py
@@ -0,0 +1,132 @@
+'''tzinfo timezone information for America/Argentina/Cordoba.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cordoba(DstTzInfo):
+    '''America/Argentina/Cordoba timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/Cordoba'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+        ]
+
+Cordoba = Cordoba()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/Jujuy.py b/lib/pytz/zoneinfo/America/Argentina/Jujuy.py
new file mode 100755
index 0000000..b6fe1dd
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/Jujuy.py
@@ -0,0 +1,132 @@
+'''tzinfo timezone information for America/Argentina/Jujuy.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jujuy(DstTzInfo):
+    '''America/Argentina/Jujuy timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/Jujuy'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,28,4,0,0),
+d(1991,3,17,3,0,0),
+d(1991,10,6,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-10800,3600,'WARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+        ]
+
+Jujuy = Jujuy()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/La_Rioja.py b/lib/pytz/zoneinfo/America/Argentina/La_Rioja.py
new file mode 100755
index 0000000..548dd2f
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/La_Rioja.py
@@ -0,0 +1,138 @@
+'''tzinfo timezone information for America/Argentina/La_Rioja.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class La_Rioja(DstTzInfo):
+    '''America/Argentina/La_Rioja timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/La_Rioja'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,1,2,0,0),
+d(1991,5,7,4,0,0),
+d(1991,10,20,3,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,6,1,3,0,0),
+d(2004,6,20,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+La_Rioja = La_Rioja()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/Mendoza.py b/lib/pytz/zoneinfo/America/Argentina/Mendoza.py
new file mode 100755
index 0000000..e699aa9
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/Mendoza.py
@@ -0,0 +1,136 @@
+'''tzinfo timezone information for America/Argentina/Mendoza.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mendoza(DstTzInfo):
+    '''America/Argentina/Mendoza timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/Mendoza'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,15,4,0,0),
+d(1991,3,1,3,0,0),
+d(1991,10,15,4,0,0),
+d(1992,3,1,3,0,0),
+d(1992,10,18,4,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,5,23,3,0,0),
+d(2004,9,26,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-10800,3600,'WARST'),
+i(-14400,0,'WART'),
+i(-10800,3600,'WARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+Mendoza = Mendoza()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/Rio_Gallegos.py b/lib/pytz/zoneinfo/America/Argentina/Rio_Gallegos.py
new file mode 100755
index 0000000..2c23446
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/Rio_Gallegos.py
@@ -0,0 +1,136 @@
+'''tzinfo timezone information for America/Argentina/Rio_Gallegos.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rio_Gallegos(DstTzInfo):
+    '''America/Argentina/Rio_Gallegos timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/Rio_Gallegos'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,3,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,6,1,3,0,0),
+d(2004,6,20,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+Rio_Gallegos = Rio_Gallegos()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/San_Juan.py b/lib/pytz/zoneinfo/America/Argentina/San_Juan.py
new file mode 100755
index 0000000..cce3e87
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/San_Juan.py
@@ -0,0 +1,138 @@
+'''tzinfo timezone information for America/Argentina/San_Juan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class San_Juan(DstTzInfo):
+    '''America/Argentina/San_Juan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/San_Juan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,1,2,0,0),
+d(1991,5,7,4,0,0),
+d(1991,10,20,3,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,5,31,3,0,0),
+d(2004,7,25,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+San_Juan = San_Juan()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/Tucuman.py b/lib/pytz/zoneinfo/America/Argentina/Tucuman.py
new file mode 100755
index 0000000..093eeaa
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/Tucuman.py
@@ -0,0 +1,136 @@
+'''tzinfo timezone information for America/Argentina/Tucuman.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tucuman(DstTzInfo):
+    '''America/Argentina/Tucuman timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/Tucuman'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,6,1,3,0,0),
+d(2004,6,13,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+Tucuman = Tucuman()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/Ushuaia.py b/lib/pytz/zoneinfo/America/Argentina/Ushuaia.py
new file mode 100755
index 0000000..37e681c
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Argentina/Ushuaia.py
@@ -0,0 +1,136 @@
+'''tzinfo timezone information for America/Argentina/Ushuaia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ushuaia(DstTzInfo):
+    '''America/Argentina/Ushuaia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Argentina/Ushuaia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,3,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,5,30,3,0,0),
+d(2004,6,20,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+Ushuaia = Ushuaia()
+
diff --git a/lib/pytz/zoneinfo/America/Argentina/__init__.py b/lib/pytz/zoneinfo/America/Argentina/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/America/Aruba.py b/lib/pytz/zoneinfo/America/Aruba.py
new file mode 100755
index 0000000..6f7afb0
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Aruba.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for America/Aruba.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Aruba(DstTzInfo):
+    '''America/Aruba timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Aruba'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,2,12,4,40,24),
+d(1965,1,1,4,30,0),
+        ]
+
+    _transition_info = [
+i(-16800,0,'LMT'),
+i(-16200,0,'ANT'),
+i(-14400,0,'AST'),
+        ]
+
+Aruba = Aruba()
+
diff --git a/lib/pytz/zoneinfo/America/Asuncion.py b/lib/pytz/zoneinfo/America/Asuncion.py
new file mode 100755
index 0000000..472182d
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Asuncion.py
@@ -0,0 +1,276 @@
+'''tzinfo timezone information for America/Asuncion.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Asuncion(DstTzInfo):
+    '''America/Asuncion timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Asuncion'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1931,10,10,3,50,40),
+d(1972,10,1,4,0,0),
+d(1974,4,1,3,0,0),
+d(1975,10,1,4,0,0),
+d(1976,3,1,3,0,0),
+d(1976,10,1,4,0,0),
+d(1977,3,1,3,0,0),
+d(1977,10,1,4,0,0),
+d(1978,3,1,3,0,0),
+d(1978,10,1,4,0,0),
+d(1979,4,1,3,0,0),
+d(1979,10,1,4,0,0),
+d(1980,4,1,3,0,0),
+d(1980,10,1,4,0,0),
+d(1981,4,1,3,0,0),
+d(1981,10,1,4,0,0),
+d(1982,4,1,3,0,0),
+d(1982,10,1,4,0,0),
+d(1983,4,1,3,0,0),
+d(1983,10,1,4,0,0),
+d(1984,4,1,3,0,0),
+d(1984,10,1,4,0,0),
+d(1985,4,1,3,0,0),
+d(1985,10,1,4,0,0),
+d(1986,4,1,3,0,0),
+d(1986,10,1,4,0,0),
+d(1987,4,1,3,0,0),
+d(1987,10,1,4,0,0),
+d(1988,4,1,3,0,0),
+d(1988,10,1,4,0,0),
+d(1989,4,1,3,0,0),
+d(1989,10,22,4,0,0),
+d(1990,4,1,3,0,0),
+d(1990,10,1,4,0,0),
+d(1991,4,1,3,0,0),
+d(1991,10,6,4,0,0),
+d(1992,3,1,3,0,0),
+d(1992,10,5,4,0,0),
+d(1993,3,31,3,0,0),
+d(1993,10,1,4,0,0),
+d(1994,2,27,3,0,0),
+d(1994,10,1,4,0,0),
+d(1995,2,26,3,0,0),
+d(1995,10,1,4,0,0),
+d(1996,3,1,3,0,0),
+d(1996,10,6,4,0,0),
+d(1997,2,23,3,0,0),
+d(1997,10,5,4,0,0),
+d(1998,3,1,3,0,0),
+d(1998,10,4,4,0,0),
+d(1999,3,7,3,0,0),
+d(1999,10,3,4,0,0),
+d(2000,3,5,3,0,0),
+d(2000,10,1,4,0,0),
+d(2001,3,4,3,0,0),
+d(2001,10,7,4,0,0),
+d(2002,4,7,3,0,0),
+d(2002,9,1,4,0,0),
+d(2003,4,6,3,0,0),
+d(2003,9,7,4,0,0),
+d(2004,4,4,3,0,0),
+d(2004,10,17,4,0,0),
+d(2005,3,13,3,0,0),
+d(2005,10,16,4,0,0),
+d(2006,3,12,3,0,0),
+d(2006,10,15,4,0,0),
+d(2007,3,11,3,0,0),
+d(2007,10,21,4,0,0),
+d(2008,3,9,3,0,0),
+d(2008,10,19,4,0,0),
+d(2009,3,8,3,0,0),
+d(2009,10,18,4,0,0),
+d(2010,3,14,3,0,0),
+d(2010,10,17,4,0,0),
+d(2011,3,13,3,0,0),
+d(2011,10,16,4,0,0),
+d(2012,3,11,3,0,0),
+d(2012,10,21,4,0,0),
+d(2013,3,10,3,0,0),
+d(2013,10,20,4,0,0),
+d(2014,3,9,3,0,0),
+d(2014,10,19,4,0,0),
+d(2015,3,8,3,0,0),
+d(2015,10,18,4,0,0),
+d(2016,3,13,3,0,0),
+d(2016,10,16,4,0,0),
+d(2017,3,12,3,0,0),
+d(2017,10,15,4,0,0),
+d(2018,3,11,3,0,0),
+d(2018,10,21,4,0,0),
+d(2019,3,10,3,0,0),
+d(2019,10,20,4,0,0),
+d(2020,3,8,3,0,0),
+d(2020,10,18,4,0,0),
+d(2021,3,14,3,0,0),
+d(2021,10,17,4,0,0),
+d(2022,3,13,3,0,0),
+d(2022,10,16,4,0,0),
+d(2023,3,12,3,0,0),
+d(2023,10,15,4,0,0),
+d(2024,3,10,3,0,0),
+d(2024,10,20,4,0,0),
+d(2025,3,9,3,0,0),
+d(2025,10,19,4,0,0),
+d(2026,3,8,3,0,0),
+d(2026,10,18,4,0,0),
+d(2027,3,14,3,0,0),
+d(2027,10,17,4,0,0),
+d(2028,3,12,3,0,0),
+d(2028,10,15,4,0,0),
+d(2029,3,11,3,0,0),
+d(2029,10,21,4,0,0),
+d(2030,3,10,3,0,0),
+d(2030,10,20,4,0,0),
+d(2031,3,9,3,0,0),
+d(2031,10,19,4,0,0),
+d(2032,3,14,3,0,0),
+d(2032,10,17,4,0,0),
+d(2033,3,13,3,0,0),
+d(2033,10,16,4,0,0),
+d(2034,3,12,3,0,0),
+d(2034,10,15,4,0,0),
+d(2035,3,11,3,0,0),
+d(2035,10,21,4,0,0),
+d(2036,3,9,3,0,0),
+d(2036,10,19,4,0,0),
+d(2037,3,8,3,0,0),
+d(2037,10,18,4,0,0),
+        ]
+
+    _transition_info = [
+i(-13860,0,'AMT'),
+i(-14400,0,'PYT'),
+i(-10800,0,'PYT'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+i(-14400,0,'PYT'),
+i(-10800,3600,'PYST'),
+        ]
+
+Asuncion = Asuncion()
+
diff --git a/lib/pytz/zoneinfo/America/Atikokan.py b/lib/pytz/zoneinfo/America/Atikokan.py
new file mode 100755
index 0000000..07bc0a1
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Atikokan.py
@@ -0,0 +1,32 @@
+'''tzinfo timezone information for America/Atikokan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Atikokan(DstTzInfo):
+    '''America/Atikokan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Atikokan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,8,0,0),
+d(1918,10,31,7,0,0),
+d(1940,9,29,6,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-18000,0,'EST'),
+        ]
+
+Atikokan = Atikokan()
+
diff --git a/lib/pytz/zoneinfo/America/Atka.py b/lib/pytz/zoneinfo/America/Atka.py
new file mode 100755
index 0000000..ab5d0dc
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Atka.py
@@ -0,0 +1,306 @@
+'''tzinfo timezone information for America/Atka.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Atka(DstTzInfo):
+    '''America/Atka timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Atka'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,2,9,13,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,12,0,0),
+d(1967,4,1,11,0,0),
+d(1969,4,27,13,0,0),
+d(1969,10,26,12,0,0),
+d(1970,4,26,13,0,0),
+d(1970,10,25,12,0,0),
+d(1971,4,25,13,0,0),
+d(1971,10,31,12,0,0),
+d(1972,4,30,13,0,0),
+d(1972,10,29,12,0,0),
+d(1973,4,29,13,0,0),
+d(1973,10,28,12,0,0),
+d(1974,1,6,13,0,0),
+d(1974,10,27,12,0,0),
+d(1975,2,23,13,0,0),
+d(1975,10,26,12,0,0),
+d(1976,4,25,13,0,0),
+d(1976,10,31,12,0,0),
+d(1977,4,24,13,0,0),
+d(1977,10,30,12,0,0),
+d(1978,4,30,13,0,0),
+d(1978,10,29,12,0,0),
+d(1979,4,29,13,0,0),
+d(1979,10,28,12,0,0),
+d(1980,4,27,13,0,0),
+d(1980,10,26,12,0,0),
+d(1981,4,26,13,0,0),
+d(1981,10,25,12,0,0),
+d(1982,4,25,13,0,0),
+d(1982,10,31,12,0,0),
+d(1983,4,24,13,0,0),
+d(1983,10,30,12,0,0),
+d(1983,11,30,10,0,0),
+d(1984,4,29,12,0,0),
+d(1984,10,28,11,0,0),
+d(1985,4,28,12,0,0),
+d(1985,10,27,11,0,0),
+d(1986,4,27,12,0,0),
+d(1986,10,26,11,0,0),
+d(1987,4,5,12,0,0),
+d(1987,10,25,11,0,0),
+d(1988,4,3,12,0,0),
+d(1988,10,30,11,0,0),
+d(1989,4,2,12,0,0),
+d(1989,10,29,11,0,0),
+d(1990,4,1,12,0,0),
+d(1990,10,28,11,0,0),
+d(1991,4,7,12,0,0),
+d(1991,10,27,11,0,0),
+d(1992,4,5,12,0,0),
+d(1992,10,25,11,0,0),
+d(1993,4,4,12,0,0),
+d(1993,10,31,11,0,0),
+d(1994,4,3,12,0,0),
+d(1994,10,30,11,0,0),
+d(1995,4,2,12,0,0),
+d(1995,10,29,11,0,0),
+d(1996,4,7,12,0,0),
+d(1996,10,27,11,0,0),
+d(1997,4,6,12,0,0),
+d(1997,10,26,11,0,0),
+d(1998,4,5,12,0,0),
+d(1998,10,25,11,0,0),
+d(1999,4,4,12,0,0),
+d(1999,10,31,11,0,0),
+d(2000,4,2,12,0,0),
+d(2000,10,29,11,0,0),
+d(2001,4,1,12,0,0),
+d(2001,10,28,11,0,0),
+d(2002,4,7,12,0,0),
+d(2002,10,27,11,0,0),
+d(2003,4,6,12,0,0),
+d(2003,10,26,11,0,0),
+d(2004,4,4,12,0,0),
+d(2004,10,31,11,0,0),
+d(2005,4,3,12,0,0),
+d(2005,10,30,11,0,0),
+d(2006,4,2,12,0,0),
+d(2006,10,29,11,0,0),
+d(2007,3,11,12,0,0),
+d(2007,11,4,11,0,0),
+d(2008,3,9,12,0,0),
+d(2008,11,2,11,0,0),
+d(2009,3,8,12,0,0),
+d(2009,11,1,11,0,0),
+d(2010,3,14,12,0,0),
+d(2010,11,7,11,0,0),
+d(2011,3,13,12,0,0),
+d(2011,11,6,11,0,0),
+d(2012,3,11,12,0,0),
+d(2012,11,4,11,0,0),
+d(2013,3,10,12,0,0),
+d(2013,11,3,11,0,0),
+d(2014,3,9,12,0,0),
+d(2014,11,2,11,0,0),
+d(2015,3,8,12,0,0),
+d(2015,11,1,11,0,0),
+d(2016,3,13,12,0,0),
+d(2016,11,6,11,0,0),
+d(2017,3,12,12,0,0),
+d(2017,11,5,11,0,0),
+d(2018,3,11,12,0,0),
+d(2018,11,4,11,0,0),
+d(2019,3,10,12,0,0),
+d(2019,11,3,11,0,0),
+d(2020,3,8,12,0,0),
+d(2020,11,1,11,0,0),
+d(2021,3,14,12,0,0),
+d(2021,11,7,11,0,0),
+d(2022,3,13,12,0,0),
+d(2022,11,6,11,0,0),
+d(2023,3,12,12,0,0),
+d(2023,11,5,11,0,0),
+d(2024,3,10,12,0,0),
+d(2024,11,3,11,0,0),
+d(2025,3,9,12,0,0),
+d(2025,11,2,11,0,0),
+d(2026,3,8,12,0,0),
+d(2026,11,1,11,0,0),
+d(2027,3,14,12,0,0),
+d(2027,11,7,11,0,0),
+d(2028,3,12,12,0,0),
+d(2028,11,5,11,0,0),
+d(2029,3,11,12,0,0),
+d(2029,11,4,11,0,0),
+d(2030,3,10,12,0,0),
+d(2030,11,3,11,0,0),
+d(2031,3,9,12,0,0),
+d(2031,11,2,11,0,0),
+d(2032,3,14,12,0,0),
+d(2032,11,7,11,0,0),
+d(2033,3,13,12,0,0),
+d(2033,11,6,11,0,0),
+d(2034,3,12,12,0,0),
+d(2034,11,5,11,0,0),
+d(2035,3,11,12,0,0),
+d(2035,11,4,11,0,0),
+d(2036,3,9,12,0,0),
+d(2036,11,2,11,0,0),
+d(2037,3,8,12,0,0),
+d(2037,11,1,11,0,0),
+        ]
+
+    _transition_info = [
+i(-39600,0,'NST'),
+i(-36000,3600,'NWT'),
+i(-36000,3600,'NPT'),
+i(-39600,0,'NST'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-36000,0,'AHST'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+        ]
+
+Atka = Atka()
+
diff --git a/lib/pytz/zoneinfo/America/Bahia.py b/lib/pytz/zoneinfo/America/Bahia.py
new file mode 100755
index 0000000..5d4d5c5
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Bahia.py
@@ -0,0 +1,138 @@
+'''tzinfo timezone information for America/Bahia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bahia(DstTzInfo):
+    '''America/Bahia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Bahia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,2,34,4),
+d(1931,10,3,14,0,0),
+d(1932,4,1,2,0,0),
+d(1932,10,3,3,0,0),
+d(1933,4,1,2,0,0),
+d(1949,12,1,3,0,0),
+d(1950,4,16,3,0,0),
+d(1950,12,1,3,0,0),
+d(1951,4,1,2,0,0),
+d(1951,12,1,3,0,0),
+d(1952,4,1,2,0,0),
+d(1952,12,1,3,0,0),
+d(1953,3,1,2,0,0),
+d(1963,12,9,3,0,0),
+d(1964,3,1,2,0,0),
+d(1965,1,31,3,0,0),
+d(1965,3,31,2,0,0),
+d(1965,12,1,3,0,0),
+d(1966,3,1,2,0,0),
+d(1966,11,1,3,0,0),
+d(1967,3,1,2,0,0),
+d(1967,11,1,3,0,0),
+d(1968,3,1,2,0,0),
+d(1985,11,2,3,0,0),
+d(1986,3,15,2,0,0),
+d(1986,10,25,3,0,0),
+d(1987,2,14,2,0,0),
+d(1987,10,25,3,0,0),
+d(1988,2,7,2,0,0),
+d(1988,10,16,3,0,0),
+d(1989,1,29,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,2,11,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,2,17,2,0,0),
+d(1991,10,20,3,0,0),
+d(1992,2,9,2,0,0),
+d(1992,10,25,3,0,0),
+d(1993,1,31,2,0,0),
+d(1993,10,17,3,0,0),
+d(1994,2,20,2,0,0),
+d(1994,10,16,3,0,0),
+d(1995,2,19,2,0,0),
+d(1995,10,15,3,0,0),
+d(1996,2,11,2,0,0),
+d(1996,10,6,3,0,0),
+d(1997,2,16,2,0,0),
+d(1997,10,6,3,0,0),
+d(1998,3,1,2,0,0),
+d(1998,10,11,3,0,0),
+d(1999,2,21,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,2,27,2,0,0),
+d(2000,10,8,3,0,0),
+d(2001,2,18,2,0,0),
+d(2001,10,14,3,0,0),
+d(2002,2,17,2,0,0),
+d(2002,11,3,3,0,0),
+d(2003,2,16,2,0,0),
+        ]
+
+    _transition_info = [
+i(-9240,0,'LMT'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+        ]
+
+Bahia = Bahia()
+
diff --git a/lib/pytz/zoneinfo/America/Barbados.py b/lib/pytz/zoneinfo/America/Barbados.py
new file mode 100755
index 0000000..97ba8c6
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Barbados.py
@@ -0,0 +1,40 @@
+'''tzinfo timezone information for America/Barbados.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Barbados(DstTzInfo):
+    '''America/Barbados timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Barbados'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,1,1,3,58,28),
+d(1932,1,1,3,58,28),
+d(1977,6,12,6,0,0),
+d(1977,10,2,5,0,0),
+d(1978,4,16,6,0,0),
+d(1978,10,1,5,0,0),
+d(1979,4,15,6,0,0),
+d(1979,9,30,5,0,0),
+d(1980,4,20,6,0,0),
+d(1980,9,25,5,0,0),
+        ]
+
+    _transition_info = [
+i(-14280,0,'LMT'),
+i(-14280,0,'BMT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Barbados = Barbados()
+
diff --git a/lib/pytz/zoneinfo/America/Belem.py b/lib/pytz/zoneinfo/America/Belem.py
new file mode 100755
index 0000000..f35f199
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Belem.py
@@ -0,0 +1,78 @@
+'''tzinfo timezone information for America/Belem.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Belem(DstTzInfo):
+    '''America/Belem timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Belem'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,3,13,56),
+d(1931,10,3,14,0,0),
+d(1932,4,1,2,0,0),
+d(1932,10,3,3,0,0),
+d(1933,4,1,2,0,0),
+d(1949,12,1,3,0,0),
+d(1950,4,16,3,0,0),
+d(1950,12,1,3,0,0),
+d(1951,4,1,2,0,0),
+d(1951,12,1,3,0,0),
+d(1952,4,1,2,0,0),
+d(1952,12,1,3,0,0),
+d(1953,3,1,2,0,0),
+d(1963,12,9,3,0,0),
+d(1964,3,1,2,0,0),
+d(1965,1,31,3,0,0),
+d(1965,3,31,2,0,0),
+d(1965,12,1,3,0,0),
+d(1966,3,1,2,0,0),
+d(1966,11,1,3,0,0),
+d(1967,3,1,2,0,0),
+d(1967,11,1,3,0,0),
+d(1968,3,1,2,0,0),
+d(1985,11,2,3,0,0),
+d(1986,3,15,2,0,0),
+d(1986,10,25,3,0,0),
+d(1987,2,14,2,0,0),
+d(1987,10,25,3,0,0),
+d(1988,2,7,2,0,0),
+        ]
+
+    _transition_info = [
+i(-11640,0,'LMT'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+        ]
+
+Belem = Belem()
+
diff --git a/lib/pytz/zoneinfo/America/Belize.py b/lib/pytz/zoneinfo/America/Belize.py
new file mode 100755
index 0000000..8f59933
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Belize.py
@@ -0,0 +1,130 @@
+'''tzinfo timezone information for America/Belize.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Belize(DstTzInfo):
+    '''America/Belize timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Belize'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,4,1,5,52,48),
+d(1918,10,6,6,0,0),
+d(1919,2,9,5,30,0),
+d(1919,10,5,6,0,0),
+d(1920,2,15,5,30,0),
+d(1920,10,3,6,0,0),
+d(1921,2,13,5,30,0),
+d(1921,10,2,6,0,0),
+d(1922,2,12,5,30,0),
+d(1922,10,8,6,0,0),
+d(1923,2,11,5,30,0),
+d(1923,10,7,6,0,0),
+d(1924,2,10,5,30,0),
+d(1924,10,5,6,0,0),
+d(1925,2,15,5,30,0),
+d(1925,10,4,6,0,0),
+d(1926,2,14,5,30,0),
+d(1926,10,3,6,0,0),
+d(1927,2,13,5,30,0),
+d(1927,10,2,6,0,0),
+d(1928,2,12,5,30,0),
+d(1928,10,7,6,0,0),
+d(1929,2,10,5,30,0),
+d(1929,10,6,6,0,0),
+d(1930,2,9,5,30,0),
+d(1930,10,5,6,0,0),
+d(1931,2,15,5,30,0),
+d(1931,10,4,6,0,0),
+d(1932,2,14,5,30,0),
+d(1932,10,2,6,0,0),
+d(1933,2,12,5,30,0),
+d(1933,10,8,6,0,0),
+d(1934,2,11,5,30,0),
+d(1934,10,7,6,0,0),
+d(1935,2,10,5,30,0),
+d(1935,10,6,6,0,0),
+d(1936,2,9,5,30,0),
+d(1936,10,4,6,0,0),
+d(1937,2,14,5,30,0),
+d(1937,10,3,6,0,0),
+d(1938,2,13,5,30,0),
+d(1938,10,2,6,0,0),
+d(1939,2,12,5,30,0),
+d(1939,10,8,6,0,0),
+d(1940,2,11,5,30,0),
+d(1940,10,6,6,0,0),
+d(1941,2,9,5,30,0),
+d(1941,10,5,6,0,0),
+d(1942,2,15,5,30,0),
+d(1942,10,4,6,0,0),
+d(1943,2,14,5,30,0),
+d(1973,12,5,6,0,0),
+d(1974,2,9,5,0,0),
+d(1982,12,18,6,0,0),
+d(1983,2,12,5,0,0),
+        ]
+
+    _transition_info = [
+i(-21180,0,'LMT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-19800,1800,'CHDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Belize = Belize()
+
diff --git a/lib/pytz/zoneinfo/America/Blanc_minus_Sablon.py b/lib/pytz/zoneinfo/America/Blanc_minus_Sablon.py
new file mode 100755
index 0000000..87d819e
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Blanc_minus_Sablon.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for America/Blanc_minus_Sablon.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Blanc_minus_Sablon(DstTzInfo):
+    '''America/Blanc_minus_Sablon timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Blanc_minus_Sablon'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,6,0,0),
+d(1918,10,31,5,0,0),
+d(1942,2,9,6,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,5,0,0),
+        ]
+
+    _transition_info = [
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'AWT'),
+i(-10800,3600,'APT'),
+i(-14400,0,'AST'),
+        ]
+
+Blanc_minus_Sablon = Blanc_minus_Sablon()
+
diff --git a/lib/pytz/zoneinfo/America/Boa_Vista.py b/lib/pytz/zoneinfo/America/Boa_Vista.py
new file mode 100755
index 0000000..f533ae9
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Boa_Vista.py
@@ -0,0 +1,86 @@
+'''tzinfo timezone information for America/Boa_Vista.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Boa_Vista(DstTzInfo):
+    '''America/Boa_Vista timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Boa_Vista'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,4,2,40),
+d(1931,10,3,15,0,0),
+d(1932,4,1,3,0,0),
+d(1932,10,3,4,0,0),
+d(1933,4,1,3,0,0),
+d(1949,12,1,4,0,0),
+d(1950,4,16,4,0,0),
+d(1950,12,1,4,0,0),
+d(1951,4,1,3,0,0),
+d(1951,12,1,4,0,0),
+d(1952,4,1,3,0,0),
+d(1952,12,1,4,0,0),
+d(1953,3,1,3,0,0),
+d(1963,12,9,4,0,0),
+d(1964,3,1,3,0,0),
+d(1965,1,31,4,0,0),
+d(1965,3,31,3,0,0),
+d(1965,12,1,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,11,1,4,0,0),
+d(1967,3,1,3,0,0),
+d(1967,11,1,4,0,0),
+d(1968,3,1,3,0,0),
+d(1985,11,2,4,0,0),
+d(1986,3,15,3,0,0),
+d(1986,10,25,4,0,0),
+d(1987,2,14,3,0,0),
+d(1987,10,25,4,0,0),
+d(1988,2,7,3,0,0),
+d(1999,10,3,4,0,0),
+d(2000,2,27,3,0,0),
+d(2000,10,8,4,0,0),
+d(2000,10,15,3,0,0),
+        ]
+
+    _transition_info = [
+i(-14580,0,'LMT'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+        ]
+
+Boa_Vista = Boa_Vista()
+
diff --git a/lib/pytz/zoneinfo/America/Bogota.py b/lib/pytz/zoneinfo/America/Bogota.py
new file mode 100755
index 0000000..5b295d9
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Bogota.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for America/Bogota.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bogota(DstTzInfo):
+    '''America/Bogota timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Bogota'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,11,23,4,56,20),
+d(1992,5,3,5,0,0),
+d(1993,4,4,4,0,0),
+        ]
+
+    _transition_info = [
+i(-17760,0,'BMT'),
+i(-18000,0,'COT'),
+i(-14400,3600,'COST'),
+i(-18000,0,'COT'),
+        ]
+
+Bogota = Bogota()
+
diff --git a/lib/pytz/zoneinfo/America/Boise.py b/lib/pytz/zoneinfo/America/Boise.py
new file mode 100755
index 0000000..ed61937
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Boise.py
@@ -0,0 +1,320 @@
+'''tzinfo timezone information for America/Boise.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Boise(DstTzInfo):
+    '''America/Boise timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Boise'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,10,0,0),
+d(1918,10,27,9,0,0),
+d(1919,3,30,10,0,0),
+d(1919,10,26,9,0,0),
+d(1923,5,13,10,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,9,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,9,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,9,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,2,3,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,2,23,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Boise = Boise()
+
diff --git a/lib/pytz/zoneinfo/America/Buenos_Aires.py b/lib/pytz/zoneinfo/America/Buenos_Aires.py
new file mode 100755
index 0000000..2a45760
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Buenos_Aires.py
@@ -0,0 +1,132 @@
+'''tzinfo timezone information for America/Buenos_Aires.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Buenos_Aires(DstTzInfo):
+    '''America/Buenos_Aires timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Buenos_Aires'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,3,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+        ]
+
+Buenos_Aires = Buenos_Aires()
+
diff --git a/lib/pytz/zoneinfo/America/Cambridge_Bay.py b/lib/pytz/zoneinfo/America/Cambridge_Bay.py
new file mode 100755
index 0000000..ce1d6db
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Cambridge_Bay.py
@@ -0,0 +1,272 @@
+'''tzinfo timezone information for America/Cambridge_Bay.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cambridge_Bay(DstTzInfo):
+    '''America/Cambridge_Bay timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Cambridge_Bay'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,5,25,9,0,0),
+d(1919,11,1,6,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,7,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2000,11,5,5,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-18000,7200,'MDDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-21600,0,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Cambridge_Bay = Cambridge_Bay()
+
diff --git a/lib/pytz/zoneinfo/America/Campo_Grande.py b/lib/pytz/zoneinfo/America/Campo_Grande.py
new file mode 100755
index 0000000..f01e39d
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Campo_Grande.py
@@ -0,0 +1,276 @@
+'''tzinfo timezone information for America/Campo_Grande.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Campo_Grande(DstTzInfo):
+    '''America/Campo_Grande timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Campo_Grande'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,3,38,28),
+d(1931,10,3,15,0,0),
+d(1932,4,1,3,0,0),
+d(1932,10,3,4,0,0),
+d(1933,4,1,3,0,0),
+d(1949,12,1,4,0,0),
+d(1950,4,16,4,0,0),
+d(1950,12,1,4,0,0),
+d(1951,4,1,3,0,0),
+d(1951,12,1,4,0,0),
+d(1952,4,1,3,0,0),
+d(1952,12,1,4,0,0),
+d(1953,3,1,3,0,0),
+d(1963,12,9,4,0,0),
+d(1964,3,1,3,0,0),
+d(1965,1,31,4,0,0),
+d(1965,3,31,3,0,0),
+d(1965,12,1,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,11,1,4,0,0),
+d(1967,3,1,3,0,0),
+d(1967,11,1,4,0,0),
+d(1968,3,1,3,0,0),
+d(1985,11,2,4,0,0),
+d(1986,3,15,3,0,0),
+d(1986,10,25,4,0,0),
+d(1987,2,14,3,0,0),
+d(1987,10,25,4,0,0),
+d(1988,2,7,3,0,0),
+d(1988,10,16,4,0,0),
+d(1989,1,29,3,0,0),
+d(1989,10,15,4,0,0),
+d(1990,2,11,3,0,0),
+d(1990,10,21,4,0,0),
+d(1991,2,17,3,0,0),
+d(1991,10,20,4,0,0),
+d(1992,2,9,3,0,0),
+d(1992,10,25,4,0,0),
+d(1993,1,31,3,0,0),
+d(1993,10,17,4,0,0),
+d(1994,2,20,3,0,0),
+d(1994,10,16,4,0,0),
+d(1995,2,19,3,0,0),
+d(1995,10,15,4,0,0),
+d(1996,2,11,3,0,0),
+d(1996,10,6,4,0,0),
+d(1997,2,16,3,0,0),
+d(1997,10,6,4,0,0),
+d(1998,3,1,3,0,0),
+d(1998,10,11,4,0,0),
+d(1999,2,21,3,0,0),
+d(1999,10,3,4,0,0),
+d(2000,2,27,3,0,0),
+d(2000,10,8,4,0,0),
+d(2001,2,18,3,0,0),
+d(2001,10,14,4,0,0),
+d(2002,2,17,3,0,0),
+d(2002,11,3,4,0,0),
+d(2003,2,16,3,0,0),
+d(2003,10,19,4,0,0),
+d(2004,2,15,3,0,0),
+d(2004,11,2,4,0,0),
+d(2005,2,20,3,0,0),
+d(2005,10,16,4,0,0),
+d(2006,2,19,3,0,0),
+d(2006,11,5,4,0,0),
+d(2007,2,25,3,0,0),
+d(2007,11,4,4,0,0),
+d(2008,2,24,3,0,0),
+d(2008,11,2,4,0,0),
+d(2009,2,22,3,0,0),
+d(2009,11,1,4,0,0),
+d(2010,2,28,3,0,0),
+d(2010,11,7,4,0,0),
+d(2011,2,27,3,0,0),
+d(2011,11,6,4,0,0),
+d(2012,2,26,3,0,0),
+d(2012,11,4,4,0,0),
+d(2013,2,24,3,0,0),
+d(2013,11,3,4,0,0),
+d(2014,2,23,3,0,0),
+d(2014,11,2,4,0,0),
+d(2015,2,22,3,0,0),
+d(2015,11,1,4,0,0),
+d(2016,2,28,3,0,0),
+d(2016,11,6,4,0,0),
+d(2017,2,26,3,0,0),
+d(2017,11,5,4,0,0),
+d(2018,2,25,3,0,0),
+d(2018,11,4,4,0,0),
+d(2019,2,24,3,0,0),
+d(2019,11,3,4,0,0),
+d(2020,2,23,3,0,0),
+d(2020,11,1,4,0,0),
+d(2021,2,28,3,0,0),
+d(2021,11,7,4,0,0),
+d(2022,2,27,3,0,0),
+d(2022,11,6,4,0,0),
+d(2023,2,26,3,0,0),
+d(2023,11,5,4,0,0),
+d(2024,2,25,3,0,0),
+d(2024,11,3,4,0,0),
+d(2025,2,23,3,0,0),
+d(2025,11,2,4,0,0),
+d(2026,2,22,3,0,0),
+d(2026,11,1,4,0,0),
+d(2027,2,28,3,0,0),
+d(2027,11,7,4,0,0),
+d(2028,2,27,3,0,0),
+d(2028,11,5,4,0,0),
+d(2029,2,25,3,0,0),
+d(2029,11,4,4,0,0),
+d(2030,2,24,3,0,0),
+d(2030,11,3,4,0,0),
+d(2031,2,23,3,0,0),
+d(2031,11,2,4,0,0),
+d(2032,2,29,3,0,0),
+d(2032,11,7,4,0,0),
+d(2033,2,27,3,0,0),
+d(2033,11,6,4,0,0),
+d(2034,2,26,3,0,0),
+d(2034,11,5,4,0,0),
+d(2035,2,25,3,0,0),
+d(2035,11,4,4,0,0),
+d(2036,2,24,3,0,0),
+d(2036,11,2,4,0,0),
+d(2037,2,22,3,0,0),
+d(2037,11,1,4,0,0),
+        ]
+
+    _transition_info = [
+i(-13080,0,'LMT'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+        ]
+
+Campo_Grande = Campo_Grande()
+
diff --git a/lib/pytz/zoneinfo/America/Cancun.py b/lib/pytz/zoneinfo/America/Cancun.py
new file mode 100755
index 0000000..75c0415
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Cancun.py
@@ -0,0 +1,194 @@
+'''tzinfo timezone information for America/Cancun.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cancun(DstTzInfo):
+    '''America/Cancun timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Cancun'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,6,0,0),
+d(1981,12,23,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,8,2,6,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,5,6,8,0,0),
+d(2001,9,30,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,4,1,8,0,0),
+d(2007,10,28,7,0,0),
+d(2008,4,6,8,0,0),
+d(2008,10,26,7,0,0),
+d(2009,4,5,8,0,0),
+d(2009,10,25,7,0,0),
+d(2010,4,4,8,0,0),
+d(2010,10,31,7,0,0),
+d(2011,4,3,8,0,0),
+d(2011,10,30,7,0,0),
+d(2012,4,1,8,0,0),
+d(2012,10,28,7,0,0),
+d(2013,4,7,8,0,0),
+d(2013,10,27,7,0,0),
+d(2014,4,6,8,0,0),
+d(2014,10,26,7,0,0),
+d(2015,4,5,8,0,0),
+d(2015,10,25,7,0,0),
+d(2016,4,3,8,0,0),
+d(2016,10,30,7,0,0),
+d(2017,4,2,8,0,0),
+d(2017,10,29,7,0,0),
+d(2018,4,1,8,0,0),
+d(2018,10,28,7,0,0),
+d(2019,4,7,8,0,0),
+d(2019,10,27,7,0,0),
+d(2020,4,5,8,0,0),
+d(2020,10,25,7,0,0),
+d(2021,4,4,8,0,0),
+d(2021,10,31,7,0,0),
+d(2022,4,3,8,0,0),
+d(2022,10,30,7,0,0),
+d(2023,4,2,8,0,0),
+d(2023,10,29,7,0,0),
+d(2024,4,7,8,0,0),
+d(2024,10,27,7,0,0),
+d(2025,4,6,8,0,0),
+d(2025,10,26,7,0,0),
+d(2026,4,5,8,0,0),
+d(2026,10,25,7,0,0),
+d(2027,4,4,8,0,0),
+d(2027,10,31,7,0,0),
+d(2028,4,2,8,0,0),
+d(2028,10,29,7,0,0),
+d(2029,4,1,8,0,0),
+d(2029,10,28,7,0,0),
+d(2030,4,7,8,0,0),
+d(2030,10,27,7,0,0),
+d(2031,4,6,8,0,0),
+d(2031,10,26,7,0,0),
+d(2032,4,4,8,0,0),
+d(2032,10,31,7,0,0),
+d(2033,4,3,8,0,0),
+d(2033,10,30,7,0,0),
+d(2034,4,2,8,0,0),
+d(2034,10,29,7,0,0),
+d(2035,4,1,8,0,0),
+d(2035,10,28,7,0,0),
+d(2036,4,6,8,0,0),
+d(2036,10,26,7,0,0),
+d(2037,4,5,8,0,0),
+d(2037,10,25,7,0,0),
+        ]
+
+    _transition_info = [
+i(-20820,0,'LMT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Cancun = Cancun()
+
diff --git a/lib/pytz/zoneinfo/America/Caracas.py b/lib/pytz/zoneinfo/America/Caracas.py
new file mode 100755
index 0000000..7d6276c
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Caracas.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for America/Caracas.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Caracas(DstTzInfo):
+    '''America/Caracas timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Caracas'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,2,12,4,27,40),
+d(1965,1,1,4,30,0),
+        ]
+
+    _transition_info = [
+i(-16080,0,'CMT'),
+i(-16200,0,'VET'),
+i(-14400,0,'VET'),
+        ]
+
+Caracas = Caracas()
+
diff --git a/lib/pytz/zoneinfo/America/Catamarca.py b/lib/pytz/zoneinfo/America/Catamarca.py
new file mode 100755
index 0000000..857a187
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Catamarca.py
@@ -0,0 +1,136 @@
+'''tzinfo timezone information for America/Catamarca.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Catamarca(DstTzInfo):
+    '''America/Catamarca timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Catamarca'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,6,1,3,0,0),
+d(2004,6,20,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+Catamarca = Catamarca()
+
diff --git a/lib/pytz/zoneinfo/America/Cayenne.py b/lib/pytz/zoneinfo/America/Cayenne.py
new file mode 100755
index 0000000..d20a6ed
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Cayenne.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for America/Cayenne.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cayenne(DstTzInfo):
+    '''America/Cayenne timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Cayenne'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,7,1,3,29,20),
+d(1967,10,1,4,0,0),
+        ]
+
+    _transition_info = [
+i(-12540,0,'LMT'),
+i(-14400,0,'GFT'),
+i(-10800,0,'GFT'),
+        ]
+
+Cayenne = Cayenne()
+
diff --git a/lib/pytz/zoneinfo/America/Cayman.py b/lib/pytz/zoneinfo/America/Cayman.py
new file mode 100755
index 0000000..96c1ffe
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Cayman.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Cayman.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cayman(DstTzInfo):
+    '''America/Cayman timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Cayman'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,2,1,5,7,12),
+        ]
+
+    _transition_info = [
+i(-18420,0,'KMT'),
+i(-18000,0,'EST'),
+        ]
+
+Cayman = Cayman()
+
diff --git a/lib/pytz/zoneinfo/America/Chicago.py b/lib/pytz/zoneinfo/America/Chicago.py
new file mode 100755
index 0000000..d104304
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Chicago.py
@@ -0,0 +1,490 @@
+'''tzinfo timezone information for America/Chicago.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Chicago(DstTzInfo):
+    '''America/Chicago timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Chicago'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1920,6,13,8,0,0),
+d(1920,10,31,7,0,0),
+d(1921,3,27,8,0,0),
+d(1921,10,30,7,0,0),
+d(1922,4,30,8,0,0),
+d(1922,9,24,7,0,0),
+d(1923,4,29,8,0,0),
+d(1923,9,30,7,0,0),
+d(1924,4,27,8,0,0),
+d(1924,9,28,7,0,0),
+d(1925,4,26,8,0,0),
+d(1925,9,27,7,0,0),
+d(1926,4,25,8,0,0),
+d(1926,9,26,7,0,0),
+d(1927,4,24,8,0,0),
+d(1927,9,25,7,0,0),
+d(1928,4,29,8,0,0),
+d(1928,9,30,7,0,0),
+d(1929,4,28,8,0,0),
+d(1929,9,29,7,0,0),
+d(1930,4,27,8,0,0),
+d(1930,9,28,7,0,0),
+d(1931,4,26,8,0,0),
+d(1931,9,27,7,0,0),
+d(1932,4,24,8,0,0),
+d(1932,9,25,7,0,0),
+d(1933,4,30,8,0,0),
+d(1933,9,24,7,0,0),
+d(1934,4,29,8,0,0),
+d(1934,9,30,7,0,0),
+d(1935,4,28,8,0,0),
+d(1935,9,29,7,0,0),
+d(1936,3,1,8,0,0),
+d(1936,11,15,7,0,0),
+d(1937,4,25,8,0,0),
+d(1937,9,26,7,0,0),
+d(1938,4,24,8,0,0),
+d(1938,9,25,7,0,0),
+d(1939,4,30,8,0,0),
+d(1939,9,24,7,0,0),
+d(1940,4,28,8,0,0),
+d(1940,9,29,7,0,0),
+d(1941,4,27,8,0,0),
+d(1941,9,28,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,4,28,8,0,0),
+d(1946,9,29,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,10,30,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,10,28,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,10,27,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,10,26,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,10,30,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,10,29,7,0,0),
+d(1962,4,29,8,0,0),
+d(1962,10,28,7,0,0),
+d(1963,4,28,8,0,0),
+d(1963,10,27,7,0,0),
+d(1964,4,26,8,0,0),
+d(1964,10,25,7,0,0),
+d(1965,4,25,8,0,0),
+d(1965,10,31,7,0,0),
+d(1966,4,24,8,0,0),
+d(1966,10,30,7,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,7,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,7,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,7,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,7,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,7,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,7,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,7,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,7,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,7,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Chicago = Chicago()
+
diff --git a/lib/pytz/zoneinfo/America/Chihuahua.py b/lib/pytz/zoneinfo/America/Chihuahua.py
new file mode 100755
index 0000000..b50fc99
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Chihuahua.py
@@ -0,0 +1,200 @@
+'''tzinfo timezone information for America/Chihuahua.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Chihuahua(DstTzInfo):
+    '''America/Chihuahua timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Chihuahua'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,7,0,0),
+d(1927,6,11,6,0,0),
+d(1930,11,15,6,0,0),
+d(1931,5,2,6,0,0),
+d(1931,10,1,6,0,0),
+d(1932,4,1,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,5,6,9,0,0),
+d(2001,9,30,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,4,1,9,0,0),
+d(2007,10,28,8,0,0),
+d(2008,4,6,9,0,0),
+d(2008,10,26,8,0,0),
+d(2009,4,5,9,0,0),
+d(2009,10,25,8,0,0),
+d(2010,4,4,9,0,0),
+d(2010,10,31,8,0,0),
+d(2011,4,3,9,0,0),
+d(2011,10,30,8,0,0),
+d(2012,4,1,9,0,0),
+d(2012,10,28,8,0,0),
+d(2013,4,7,9,0,0),
+d(2013,10,27,8,0,0),
+d(2014,4,6,9,0,0),
+d(2014,10,26,8,0,0),
+d(2015,4,5,9,0,0),
+d(2015,10,25,8,0,0),
+d(2016,4,3,9,0,0),
+d(2016,10,30,8,0,0),
+d(2017,4,2,9,0,0),
+d(2017,10,29,8,0,0),
+d(2018,4,1,9,0,0),
+d(2018,10,28,8,0,0),
+d(2019,4,7,9,0,0),
+d(2019,10,27,8,0,0),
+d(2020,4,5,9,0,0),
+d(2020,10,25,8,0,0),
+d(2021,4,4,9,0,0),
+d(2021,10,31,8,0,0),
+d(2022,4,3,9,0,0),
+d(2022,10,30,8,0,0),
+d(2023,4,2,9,0,0),
+d(2023,10,29,8,0,0),
+d(2024,4,7,9,0,0),
+d(2024,10,27,8,0,0),
+d(2025,4,6,9,0,0),
+d(2025,10,26,8,0,0),
+d(2026,4,5,9,0,0),
+d(2026,10,25,8,0,0),
+d(2027,4,4,9,0,0),
+d(2027,10,31,8,0,0),
+d(2028,4,2,9,0,0),
+d(2028,10,29,8,0,0),
+d(2029,4,1,9,0,0),
+d(2029,10,28,8,0,0),
+d(2030,4,7,9,0,0),
+d(2030,10,27,8,0,0),
+d(2031,4,6,9,0,0),
+d(2031,10,26,8,0,0),
+d(2032,4,4,9,0,0),
+d(2032,10,31,8,0,0),
+d(2033,4,3,9,0,0),
+d(2033,10,30,8,0,0),
+d(2034,4,2,9,0,0),
+d(2034,10,29,8,0,0),
+d(2035,4,1,9,0,0),
+d(2035,10,28,8,0,0),
+d(2036,4,6,9,0,0),
+d(2036,10,26,8,0,0),
+d(2037,4,5,9,0,0),
+d(2037,10,25,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25440,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-21600,0,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Chihuahua = Chihuahua()
+
diff --git a/lib/pytz/zoneinfo/America/Coral_Harbour.py b/lib/pytz/zoneinfo/America/Coral_Harbour.py
new file mode 100755
index 0000000..01848d6
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Coral_Harbour.py
@@ -0,0 +1,32 @@
+'''tzinfo timezone information for America/Coral_Harbour.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Coral_Harbour(DstTzInfo):
+    '''America/Coral_Harbour timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Coral_Harbour'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,8,0,0),
+d(1918,10,31,7,0,0),
+d(1940,9,29,6,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-18000,0,'EST'),
+        ]
+
+Coral_Harbour = Coral_Harbour()
+
diff --git a/lib/pytz/zoneinfo/America/Cordoba.py b/lib/pytz/zoneinfo/America/Cordoba.py
new file mode 100755
index 0000000..0a8bd6c
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Cordoba.py
@@ -0,0 +1,132 @@
+'''tzinfo timezone information for America/Cordoba.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cordoba(DstTzInfo):
+    '''America/Cordoba timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Cordoba'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+        ]
+
+Cordoba = Cordoba()
+
diff --git a/lib/pytz/zoneinfo/America/Costa_Rica.py b/lib/pytz/zoneinfo/America/Costa_Rica.py
new file mode 100755
index 0000000..62693b8
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Costa_Rica.py
@@ -0,0 +1,38 @@
+'''tzinfo timezone information for America/Costa_Rica.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Costa_Rica(DstTzInfo):
+    '''America/Costa_Rica timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Costa_Rica'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1921,1,15,5,36,20),
+d(1979,2,25,6,0,0),
+d(1979,6,3,5,0,0),
+d(1980,2,24,6,0,0),
+d(1980,6,1,5,0,0),
+d(1991,1,19,6,0,0),
+d(1991,7,1,5,0,0),
+d(1992,1,18,6,0,0),
+d(1992,3,15,5,0,0),
+        ]
+
+    _transition_info = [
+i(-20160,0,'SJMT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Costa_Rica = Costa_Rica()
+
diff --git a/lib/pytz/zoneinfo/America/Cuiaba.py b/lib/pytz/zoneinfo/America/Cuiaba.py
new file mode 100755
index 0000000..7efb789
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Cuiaba.py
@@ -0,0 +1,272 @@
+'''tzinfo timezone information for America/Cuiaba.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cuiaba(DstTzInfo):
+    '''America/Cuiaba timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Cuiaba'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,3,44,20),
+d(1931,10,3,15,0,0),
+d(1932,4,1,3,0,0),
+d(1932,10,3,4,0,0),
+d(1933,4,1,3,0,0),
+d(1949,12,1,4,0,0),
+d(1950,4,16,4,0,0),
+d(1950,12,1,4,0,0),
+d(1951,4,1,3,0,0),
+d(1951,12,1,4,0,0),
+d(1952,4,1,3,0,0),
+d(1952,12,1,4,0,0),
+d(1953,3,1,3,0,0),
+d(1963,12,9,4,0,0),
+d(1964,3,1,3,0,0),
+d(1965,1,31,4,0,0),
+d(1965,3,31,3,0,0),
+d(1965,12,1,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,11,1,4,0,0),
+d(1967,3,1,3,0,0),
+d(1967,11,1,4,0,0),
+d(1968,3,1,3,0,0),
+d(1985,11,2,4,0,0),
+d(1986,3,15,3,0,0),
+d(1986,10,25,4,0,0),
+d(1987,2,14,3,0,0),
+d(1987,10,25,4,0,0),
+d(1988,2,7,3,0,0),
+d(1988,10,16,4,0,0),
+d(1989,1,29,3,0,0),
+d(1989,10,15,4,0,0),
+d(1990,2,11,3,0,0),
+d(1990,10,21,4,0,0),
+d(1991,2,17,3,0,0),
+d(1991,10,20,4,0,0),
+d(1992,2,9,3,0,0),
+d(1992,10,25,4,0,0),
+d(1993,1,31,3,0,0),
+d(1993,10,17,4,0,0),
+d(1994,2,20,3,0,0),
+d(1994,10,16,4,0,0),
+d(1995,2,19,3,0,0),
+d(1995,10,15,4,0,0),
+d(1996,2,11,3,0,0),
+d(1996,10,6,4,0,0),
+d(1997,2,16,3,0,0),
+d(1997,10,6,4,0,0),
+d(1998,3,1,3,0,0),
+d(1998,10,11,4,0,0),
+d(1999,2,21,3,0,0),
+d(1999,10,3,4,0,0),
+d(2000,2,27,3,0,0),
+d(2000,10,8,4,0,0),
+d(2001,2,18,3,0,0),
+d(2001,10,14,4,0,0),
+d(2002,2,17,3,0,0),
+d(2002,11,3,4,0,0),
+d(2003,2,16,3,0,0),
+d(2004,11,2,4,0,0),
+d(2005,2,20,3,0,0),
+d(2005,10,16,4,0,0),
+d(2006,2,19,3,0,0),
+d(2006,11,5,4,0,0),
+d(2007,2,25,3,0,0),
+d(2007,11,4,4,0,0),
+d(2008,2,24,3,0,0),
+d(2008,11,2,4,0,0),
+d(2009,2,22,3,0,0),
+d(2009,11,1,4,0,0),
+d(2010,2,28,3,0,0),
+d(2010,11,7,4,0,0),
+d(2011,2,27,3,0,0),
+d(2011,11,6,4,0,0),
+d(2012,2,26,3,0,0),
+d(2012,11,4,4,0,0),
+d(2013,2,24,3,0,0),
+d(2013,11,3,4,0,0),
+d(2014,2,23,3,0,0),
+d(2014,11,2,4,0,0),
+d(2015,2,22,3,0,0),
+d(2015,11,1,4,0,0),
+d(2016,2,28,3,0,0),
+d(2016,11,6,4,0,0),
+d(2017,2,26,3,0,0),
+d(2017,11,5,4,0,0),
+d(2018,2,25,3,0,0),
+d(2018,11,4,4,0,0),
+d(2019,2,24,3,0,0),
+d(2019,11,3,4,0,0),
+d(2020,2,23,3,0,0),
+d(2020,11,1,4,0,0),
+d(2021,2,28,3,0,0),
+d(2021,11,7,4,0,0),
+d(2022,2,27,3,0,0),
+d(2022,11,6,4,0,0),
+d(2023,2,26,3,0,0),
+d(2023,11,5,4,0,0),
+d(2024,2,25,3,0,0),
+d(2024,11,3,4,0,0),
+d(2025,2,23,3,0,0),
+d(2025,11,2,4,0,0),
+d(2026,2,22,3,0,0),
+d(2026,11,1,4,0,0),
+d(2027,2,28,3,0,0),
+d(2027,11,7,4,0,0),
+d(2028,2,27,3,0,0),
+d(2028,11,5,4,0,0),
+d(2029,2,25,3,0,0),
+d(2029,11,4,4,0,0),
+d(2030,2,24,3,0,0),
+d(2030,11,3,4,0,0),
+d(2031,2,23,3,0,0),
+d(2031,11,2,4,0,0),
+d(2032,2,29,3,0,0),
+d(2032,11,7,4,0,0),
+d(2033,2,27,3,0,0),
+d(2033,11,6,4,0,0),
+d(2034,2,26,3,0,0),
+d(2034,11,5,4,0,0),
+d(2035,2,25,3,0,0),
+d(2035,11,4,4,0,0),
+d(2036,2,24,3,0,0),
+d(2036,11,2,4,0,0),
+d(2037,2,22,3,0,0),
+d(2037,11,1,4,0,0),
+        ]
+
+    _transition_info = [
+i(-13440,0,'LMT'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+        ]
+
+Cuiaba = Cuiaba()
+
diff --git a/lib/pytz/zoneinfo/America/Curacao.py b/lib/pytz/zoneinfo/America/Curacao.py
new file mode 100755
index 0000000..b96dd99
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Curacao.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for America/Curacao.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Curacao(DstTzInfo):
+    '''America/Curacao timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Curacao'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,2,12,4,35,44),
+d(1965,1,1,4,30,0),
+        ]
+
+    _transition_info = [
+i(-16560,0,'LMT'),
+i(-16200,0,'ANT'),
+i(-14400,0,'AST'),
+        ]
+
+Curacao = Curacao()
+
diff --git a/lib/pytz/zoneinfo/America/Danmarkshavn.py b/lib/pytz/zoneinfo/America/Danmarkshavn.py
new file mode 100755
index 0000000..a476ad6
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Danmarkshavn.py
@@ -0,0 +1,88 @@
+'''tzinfo timezone information for America/Danmarkshavn.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Danmarkshavn(DstTzInfo):
+    '''America/Danmarkshavn timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Danmarkshavn'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,7,28,1,14,40),
+d(1980,4,6,5,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,1,1,3,0,0),
+        ]
+
+    _transition_info = [
+i(-4500,0,'LMT'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(0,0,'GMT'),
+        ]
+
+Danmarkshavn = Danmarkshavn()
+
diff --git a/lib/pytz/zoneinfo/America/Dawson.py b/lib/pytz/zoneinfo/America/Dawson.py
new file mode 100755
index 0000000..d772e76
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Dawson.py
@@ -0,0 +1,272 @@
+'''tzinfo timezone information for America/Dawson.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dawson(DstTzInfo):
+    '''America/Dawson timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Dawson'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,11,0,0),
+d(1918,10,27,10,0,0),
+d(1919,5,25,11,0,0),
+d(1919,11,1,8,0,0),
+d(1942,2,9,11,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,10,0,0),
+d(1965,4,25,9,0,0),
+d(1965,10,31,9,0,0),
+d(1973,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YWT'),
+i(-28800,3600,'YPT'),
+i(-32400,0,'YST'),
+i(-25200,7200,'YDDT'),
+i(-32400,0,'YST'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Dawson = Dawson()
+
diff --git a/lib/pytz/zoneinfo/America/Dawson_Creek.py b/lib/pytz/zoneinfo/America/Dawson_Creek.py
new file mode 100755
index 0000000..cd815b0
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Dawson_Creek.py
@@ -0,0 +1,134 @@
+'''tzinfo timezone information for America/Dawson_Creek.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dawson_Creek(DstTzInfo):
+    '''America/Dawson_Creek timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Dawson_Creek'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,10,0,0),
+d(1918,10,31,9,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1947,4,27,10,0,0),
+d(1947,9,28,9,0,0),
+d(1948,4,25,10,0,0),
+d(1948,9,26,9,0,0),
+d(1949,4,24,10,0,0),
+d(1949,9,25,9,0,0),
+d(1950,4,30,10,0,0),
+d(1950,9,24,9,0,0),
+d(1951,4,29,10,0,0),
+d(1951,9,30,9,0,0),
+d(1952,4,27,10,0,0),
+d(1952,9,28,9,0,0),
+d(1953,4,26,10,0,0),
+d(1953,9,27,9,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1961,4,30,10,0,0),
+d(1961,9,24,9,0,0),
+d(1962,4,29,10,0,0),
+d(1962,10,28,9,0,0),
+d(1963,4,28,10,0,0),
+d(1963,10,27,9,0,0),
+d(1964,4,26,10,0,0),
+d(1964,10,25,9,0,0),
+d(1965,4,25,10,0,0),
+d(1965,10,31,9,0,0),
+d(1966,4,24,10,0,0),
+d(1966,10,30,9,0,0),
+d(1967,4,30,10,0,0),
+d(1967,10,29,9,0,0),
+d(1968,4,28,10,0,0),
+d(1968,10,27,9,0,0),
+d(1969,4,27,10,0,0),
+d(1969,10,26,9,0,0),
+d(1970,4,26,10,0,0),
+d(1970,10,25,9,0,0),
+d(1971,4,25,10,0,0),
+d(1971,10,31,9,0,0),
+d(1972,4,30,10,0,0),
+d(1972,8,30,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-25200,0,'MST'),
+        ]
+
+Dawson_Creek = Dawson_Creek()
+
diff --git a/lib/pytz/zoneinfo/America/Denver.py b/lib/pytz/zoneinfo/America/Denver.py
new file mode 100755
index 0000000..205e691
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Denver.py
@@ -0,0 +1,334 @@
+'''tzinfo timezone information for America/Denver.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Denver(DstTzInfo):
+    '''America/Denver timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Denver'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1920,3,28,9,0,0),
+d(1920,10,31,8,0,0),
+d(1921,3,27,9,0,0),
+d(1921,5,22,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1965,4,25,9,0,0),
+d(1965,10,31,8,0,0),
+d(1966,4,24,9,0,0),
+d(1966,10,30,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,9,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,9,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,9,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,1,6,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,2,23,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Denver = Denver()
+
diff --git a/lib/pytz/zoneinfo/America/Detroit.py b/lib/pytz/zoneinfo/America/Detroit.py
new file mode 100755
index 0000000..0c943ba
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Detroit.py
@@ -0,0 +1,298 @@
+'''tzinfo timezone information for America/Detroit.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Detroit(DstTzInfo):
+    '''America/Detroit timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Detroit'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,1,1,5,32,11),
+d(1915,5,15,8,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1948,4,25,7,0,0),
+d(1948,9,26,6,0,0),
+d(1967,6,14,7,0,0),
+d(1967,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,4,27,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-19920,0,'LMT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Detroit = Detroit()
+
diff --git a/lib/pytz/zoneinfo/America/Dominica.py b/lib/pytz/zoneinfo/America/Dominica.py
new file mode 100755
index 0000000..6d2c1ec
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Dominica.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Dominica.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dominica(DstTzInfo):
+    '''America/Dominica timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Dominica'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,7,1,4,6,36),
+        ]
+
+    _transition_info = [
+i(-14760,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+Dominica = Dominica()
+
diff --git a/lib/pytz/zoneinfo/America/Edmonton.py b/lib/pytz/zoneinfo/America/Edmonton.py
new file mode 100755
index 0000000..b0f947b
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Edmonton.py
@@ -0,0 +1,328 @@
+'''tzinfo timezone information for America/Edmonton.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Edmonton(DstTzInfo):
+    '''America/Edmonton timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Edmonton'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,9,1,7,33,52),
+d(1918,4,14,9,0,0),
+d(1918,10,31,8,0,0),
+d(1919,4,13,9,0,0),
+d(1919,5,27,8,0,0),
+d(1920,4,25,9,0,0),
+d(1920,10,31,8,0,0),
+d(1921,4,24,9,0,0),
+d(1921,9,25,8,0,0),
+d(1922,4,30,9,0,0),
+d(1922,9,24,8,0,0),
+d(1923,4,29,9,0,0),
+d(1923,9,30,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1947,4,27,9,0,0),
+d(1947,9,28,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,4,28,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,4,27,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-27240,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Edmonton = Edmonton()
+
diff --git a/lib/pytz/zoneinfo/America/Eirunepe.py b/lib/pytz/zoneinfo/America/Eirunepe.py
new file mode 100755
index 0000000..1c41bd9
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Eirunepe.py
@@ -0,0 +1,82 @@
+'''tzinfo timezone information for America/Eirunepe.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Eirunepe(DstTzInfo):
+    '''America/Eirunepe timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Eirunepe'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,4,39,28),
+d(1931,10,3,16,0,0),
+d(1932,4,1,4,0,0),
+d(1932,10,3,5,0,0),
+d(1933,4,1,4,0,0),
+d(1949,12,1,5,0,0),
+d(1950,4,16,5,0,0),
+d(1950,12,1,5,0,0),
+d(1951,4,1,4,0,0),
+d(1951,12,1,5,0,0),
+d(1952,4,1,4,0,0),
+d(1952,12,1,5,0,0),
+d(1953,3,1,4,0,0),
+d(1963,12,9,5,0,0),
+d(1964,3,1,4,0,0),
+d(1965,1,31,5,0,0),
+d(1965,3,31,4,0,0),
+d(1965,12,1,5,0,0),
+d(1966,3,1,4,0,0),
+d(1966,11,1,5,0,0),
+d(1967,3,1,4,0,0),
+d(1967,11,1,5,0,0),
+d(1968,3,1,4,0,0),
+d(1985,11,2,5,0,0),
+d(1986,3,15,4,0,0),
+d(1986,10,25,5,0,0),
+d(1987,2,14,4,0,0),
+d(1987,10,25,5,0,0),
+d(1988,2,7,4,0,0),
+d(1993,10,17,5,0,0),
+d(1994,2,20,4,0,0),
+        ]
+
+    _transition_info = [
+i(-16740,0,'LMT'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+        ]
+
+Eirunepe = Eirunepe()
+
diff --git a/lib/pytz/zoneinfo/America/El_Salvador.py b/lib/pytz/zoneinfo/America/El_Salvador.py
new file mode 100755
index 0000000..4ed5d13
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/El_Salvador.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for America/El_Salvador.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class El_Salvador(DstTzInfo):
+    '''America/El_Salvador timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/El_Salvador'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1921,1,1,5,56,48),
+d(1987,5,3,6,0,0),
+d(1987,9,27,5,0,0),
+d(1988,5,1,6,0,0),
+d(1988,9,25,5,0,0),
+        ]
+
+    _transition_info = [
+i(-21420,0,'LMT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+El_Salvador = El_Salvador()
+
diff --git a/lib/pytz/zoneinfo/America/Ensenada.py b/lib/pytz/zoneinfo/America/Ensenada.py
new file mode 100755
index 0000000..432d564
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Ensenada.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for America/Ensenada.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ensenada(DstTzInfo):
+    '''America/Ensenada timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Ensenada'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,8,0,0),
+d(1924,1,1,7,0,0),
+d(1927,6,11,7,0,0),
+d(1930,11,15,7,0,0),
+d(1931,4,1,8,0,0),
+d(1931,9,30,7,0,0),
+d(1942,4,24,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,11,12,7,0,0),
+d(1948,4,5,8,0,0),
+d(1949,1,14,7,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,4,1,10,0,0),
+d(2007,10,28,9,0,0),
+d(2008,4,6,10,0,0),
+d(2008,10,26,9,0,0),
+d(2009,4,5,10,0,0),
+d(2009,10,25,9,0,0),
+d(2010,4,4,10,0,0),
+d(2010,10,31,9,0,0),
+d(2011,4,3,10,0,0),
+d(2011,10,30,9,0,0),
+d(2012,4,1,10,0,0),
+d(2012,10,28,9,0,0),
+d(2013,4,7,10,0,0),
+d(2013,10,27,9,0,0),
+d(2014,4,6,10,0,0),
+d(2014,10,26,9,0,0),
+d(2015,4,5,10,0,0),
+d(2015,10,25,9,0,0),
+d(2016,4,3,10,0,0),
+d(2016,10,30,9,0,0),
+d(2017,4,2,10,0,0),
+d(2017,10,29,9,0,0),
+d(2018,4,1,10,0,0),
+d(2018,10,28,9,0,0),
+d(2019,4,7,10,0,0),
+d(2019,10,27,9,0,0),
+d(2020,4,5,10,0,0),
+d(2020,10,25,9,0,0),
+d(2021,4,4,10,0,0),
+d(2021,10,31,9,0,0),
+d(2022,4,3,10,0,0),
+d(2022,10,30,9,0,0),
+d(2023,4,2,10,0,0),
+d(2023,10,29,9,0,0),
+d(2024,4,7,10,0,0),
+d(2024,10,27,9,0,0),
+d(2025,4,6,10,0,0),
+d(2025,10,26,9,0,0),
+d(2026,4,5,10,0,0),
+d(2026,10,25,9,0,0),
+d(2027,4,4,10,0,0),
+d(2027,10,31,9,0,0),
+d(2028,4,2,10,0,0),
+d(2028,10,29,9,0,0),
+d(2029,4,1,10,0,0),
+d(2029,10,28,9,0,0),
+d(2030,4,7,10,0,0),
+d(2030,10,27,9,0,0),
+d(2031,4,6,10,0,0),
+d(2031,10,26,9,0,0),
+d(2032,4,4,10,0,0),
+d(2032,10,31,9,0,0),
+d(2033,4,3,10,0,0),
+d(2033,10,30,9,0,0),
+d(2034,4,2,10,0,0),
+d(2034,10,29,9,0,0),
+d(2035,4,1,10,0,0),
+d(2035,10,28,9,0,0),
+d(2036,4,6,10,0,0),
+d(2036,10,26,9,0,0),
+d(2037,4,5,10,0,0),
+d(2037,10,25,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28080,0,'LMT'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Ensenada = Ensenada()
+
diff --git a/lib/pytz/zoneinfo/America/Fort_Wayne.py b/lib/pytz/zoneinfo/America/Fort_Wayne.py
new file mode 100755
index 0000000..4a1bd60
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Fort_Wayne.py
@@ -0,0 +1,216 @@
+'''tzinfo timezone information for America/Fort_Wayne.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Fort_Wayne(DstTzInfo):
+    '''America/Fort_Wayne timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Fort_Wayne'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1941,6,22,8,0,0),
+d(1941,9,28,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,4,28,8,0,0),
+d(1946,9,29,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Fort_Wayne = Fort_Wayne()
+
diff --git a/lib/pytz/zoneinfo/America/Fortaleza.py b/lib/pytz/zoneinfo/America/Fortaleza.py
new file mode 100755
index 0000000..44ca5ae
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Fortaleza.py
@@ -0,0 +1,98 @@
+'''tzinfo timezone information for America/Fortaleza.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Fortaleza(DstTzInfo):
+    '''America/Fortaleza timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Fortaleza'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,2,34,0),
+d(1931,10,3,14,0,0),
+d(1932,4,1,2,0,0),
+d(1932,10,3,3,0,0),
+d(1933,4,1,2,0,0),
+d(1949,12,1,3,0,0),
+d(1950,4,16,3,0,0),
+d(1950,12,1,3,0,0),
+d(1951,4,1,2,0,0),
+d(1951,12,1,3,0,0),
+d(1952,4,1,2,0,0),
+d(1952,12,1,3,0,0),
+d(1953,3,1,2,0,0),
+d(1963,12,9,3,0,0),
+d(1964,3,1,2,0,0),
+d(1965,1,31,3,0,0),
+d(1965,3,31,2,0,0),
+d(1965,12,1,3,0,0),
+d(1966,3,1,2,0,0),
+d(1966,11,1,3,0,0),
+d(1967,3,1,2,0,0),
+d(1967,11,1,3,0,0),
+d(1968,3,1,2,0,0),
+d(1985,11,2,3,0,0),
+d(1986,3,15,2,0,0),
+d(1986,10,25,3,0,0),
+d(1987,2,14,2,0,0),
+d(1987,10,25,3,0,0),
+d(1988,2,7,2,0,0),
+d(1988,10,16,3,0,0),
+d(1989,1,29,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,2,11,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,2,27,2,0,0),
+d(2000,10,8,3,0,0),
+d(2000,10,22,2,0,0),
+d(2001,10,14,3,0,0),
+d(2002,2,17,2,0,0),
+        ]
+
+    _transition_info = [
+i(-9240,0,'LMT'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+        ]
+
+Fortaleza = Fortaleza()
+
diff --git a/lib/pytz/zoneinfo/America/Glace_Bay.py b/lib/pytz/zoneinfo/America/Glace_Bay.py
new file mode 100755
index 0000000..cd5edff
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Glace_Bay.py
@@ -0,0 +1,300 @@
+'''tzinfo timezone information for America/Glace_Bay.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Glace_Bay(DstTzInfo):
+    '''America/Glace_Bay timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Glace_Bay'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1902,6,15,3,59,48),
+d(1918,4,14,6,0,0),
+d(1918,10,31,5,0,0),
+d(1942,2,9,6,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,5,0,0),
+d(1953,4,26,6,0,0),
+d(1953,9,27,5,0,0),
+d(1972,4,30,6,0,0),
+d(1972,10,29,5,0,0),
+d(1973,4,29,6,0,0),
+d(1973,10,28,5,0,0),
+d(1974,4,28,6,0,0),
+d(1974,10,27,5,0,0),
+d(1975,4,27,6,0,0),
+d(1975,10,26,5,0,0),
+d(1976,4,25,6,0,0),
+d(1976,10,31,5,0,0),
+d(1977,4,24,6,0,0),
+d(1977,10,30,5,0,0),
+d(1978,4,30,6,0,0),
+d(1978,10,29,5,0,0),
+d(1979,4,29,6,0,0),
+d(1979,10,28,5,0,0),
+d(1980,4,27,6,0,0),
+d(1980,10,26,5,0,0),
+d(1981,4,26,6,0,0),
+d(1981,10,25,5,0,0),
+d(1982,4,25,6,0,0),
+d(1982,10,31,5,0,0),
+d(1983,4,24,6,0,0),
+d(1983,10,30,5,0,0),
+d(1984,4,29,6,0,0),
+d(1984,10,28,5,0,0),
+d(1985,4,28,6,0,0),
+d(1985,10,27,5,0,0),
+d(1986,4,27,6,0,0),
+d(1986,10,26,5,0,0),
+d(1987,4,5,6,0,0),
+d(1987,10,25,5,0,0),
+d(1988,4,3,6,0,0),
+d(1988,10,30,5,0,0),
+d(1989,4,2,6,0,0),
+d(1989,10,29,5,0,0),
+d(1990,4,1,6,0,0),
+d(1990,10,28,5,0,0),
+d(1991,4,7,6,0,0),
+d(1991,10,27,5,0,0),
+d(1992,4,5,6,0,0),
+d(1992,10,25,5,0,0),
+d(1993,4,4,6,0,0),
+d(1993,10,31,5,0,0),
+d(1994,4,3,6,0,0),
+d(1994,10,30,5,0,0),
+d(1995,4,2,6,0,0),
+d(1995,10,29,5,0,0),
+d(1996,4,7,6,0,0),
+d(1996,10,27,5,0,0),
+d(1997,4,6,6,0,0),
+d(1997,10,26,5,0,0),
+d(1998,4,5,6,0,0),
+d(1998,10,25,5,0,0),
+d(1999,4,4,6,0,0),
+d(1999,10,31,5,0,0),
+d(2000,4,2,6,0,0),
+d(2000,10,29,5,0,0),
+d(2001,4,1,6,0,0),
+d(2001,10,28,5,0,0),
+d(2002,4,7,6,0,0),
+d(2002,10,27,5,0,0),
+d(2003,4,6,6,0,0),
+d(2003,10,26,5,0,0),
+d(2004,4,4,6,0,0),
+d(2004,10,31,5,0,0),
+d(2005,4,3,6,0,0),
+d(2005,10,30,5,0,0),
+d(2006,4,2,6,0,0),
+d(2006,10,29,5,0,0),
+d(2007,3,11,6,0,0),
+d(2007,11,4,5,0,0),
+d(2008,3,9,6,0,0),
+d(2008,11,2,5,0,0),
+d(2009,3,8,6,0,0),
+d(2009,11,1,5,0,0),
+d(2010,3,14,6,0,0),
+d(2010,11,7,5,0,0),
+d(2011,3,13,6,0,0),
+d(2011,11,6,5,0,0),
+d(2012,3,11,6,0,0),
+d(2012,11,4,5,0,0),
+d(2013,3,10,6,0,0),
+d(2013,11,3,5,0,0),
+d(2014,3,9,6,0,0),
+d(2014,11,2,5,0,0),
+d(2015,3,8,6,0,0),
+d(2015,11,1,5,0,0),
+d(2016,3,13,6,0,0),
+d(2016,11,6,5,0,0),
+d(2017,3,12,6,0,0),
+d(2017,11,5,5,0,0),
+d(2018,3,11,6,0,0),
+d(2018,11,4,5,0,0),
+d(2019,3,10,6,0,0),
+d(2019,11,3,5,0,0),
+d(2020,3,8,6,0,0),
+d(2020,11,1,5,0,0),
+d(2021,3,14,6,0,0),
+d(2021,11,7,5,0,0),
+d(2022,3,13,6,0,0),
+d(2022,11,6,5,0,0),
+d(2023,3,12,6,0,0),
+d(2023,11,5,5,0,0),
+d(2024,3,10,6,0,0),
+d(2024,11,3,5,0,0),
+d(2025,3,9,6,0,0),
+d(2025,11,2,5,0,0),
+d(2026,3,8,6,0,0),
+d(2026,11,1,5,0,0),
+d(2027,3,14,6,0,0),
+d(2027,11,7,5,0,0),
+d(2028,3,12,6,0,0),
+d(2028,11,5,5,0,0),
+d(2029,3,11,6,0,0),
+d(2029,11,4,5,0,0),
+d(2030,3,10,6,0,0),
+d(2030,11,3,5,0,0),
+d(2031,3,9,6,0,0),
+d(2031,11,2,5,0,0),
+d(2032,3,14,6,0,0),
+d(2032,11,7,5,0,0),
+d(2033,3,13,6,0,0),
+d(2033,11,6,5,0,0),
+d(2034,3,12,6,0,0),
+d(2034,11,5,5,0,0),
+d(2035,3,11,6,0,0),
+d(2035,11,4,5,0,0),
+d(2036,3,9,6,0,0),
+d(2036,11,2,5,0,0),
+d(2037,3,8,6,0,0),
+d(2037,11,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-14400,0,'LMT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'AWT'),
+i(-10800,3600,'APT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Glace_Bay = Glace_Bay()
+
diff --git a/lib/pytz/zoneinfo/America/Godthab.py b/lib/pytz/zoneinfo/America/Godthab.py
new file mode 100755
index 0000000..bce7b30
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Godthab.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for America/Godthab.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Godthab(DstTzInfo):
+    '''America/Godthab timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Godthab'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,7,28,3,26,56),
+d(1980,4,6,5,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-12420,0,'LMT'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+i(-7200,3600,'WGST'),
+i(-10800,0,'WGT'),
+        ]
+
+Godthab = Godthab()
+
diff --git a/lib/pytz/zoneinfo/America/Goose_Bay.py b/lib/pytz/zoneinfo/America/Goose_Bay.py
new file mode 100755
index 0000000..b2bc26c
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Goose_Bay.py
@@ -0,0 +1,426 @@
+'''tzinfo timezone information for America/Goose_Bay.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Goose_Bay(DstTzInfo):
+    '''America/Goose_Bay timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Goose_Bay'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,5,30,52),
+d(1918,10,31,4,30,52),
+d(1935,3,30,3,30,52),
+d(1936,5,11,3,30,0),
+d(1936,10,5,2,30,0),
+d(1937,5,10,3,30,0),
+d(1937,10,4,2,30,0),
+d(1938,5,9,3,30,0),
+d(1938,10,3,2,30,0),
+d(1939,5,15,3,30,0),
+d(1939,10,2,2,30,0),
+d(1940,5,13,3,30,0),
+d(1940,10,7,2,30,0),
+d(1941,5,12,3,30,0),
+d(1941,10,6,2,30,0),
+d(1942,5,11,3,30,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,4,30,0),
+d(1946,5,12,5,30,0),
+d(1946,10,6,4,30,0),
+d(1947,5,11,5,30,0),
+d(1947,10,5,4,30,0),
+d(1948,5,9,5,30,0),
+d(1948,10,3,4,30,0),
+d(1949,5,8,5,30,0),
+d(1949,10,2,4,30,0),
+d(1950,5,14,5,30,0),
+d(1950,10,8,4,30,0),
+d(1951,4,29,5,30,0),
+d(1951,9,30,4,30,0),
+d(1952,4,27,5,30,0),
+d(1952,9,28,4,30,0),
+d(1953,4,26,5,30,0),
+d(1953,9,27,4,30,0),
+d(1954,4,25,5,30,0),
+d(1954,9,26,4,30,0),
+d(1955,4,24,5,30,0),
+d(1955,9,25,4,30,0),
+d(1956,4,29,5,30,0),
+d(1956,9,30,4,30,0),
+d(1957,4,28,5,30,0),
+d(1957,9,29,4,30,0),
+d(1958,4,27,5,30,0),
+d(1958,9,28,4,30,0),
+d(1959,4,26,5,30,0),
+d(1959,9,27,4,30,0),
+d(1960,4,24,5,30,0),
+d(1960,10,30,4,30,0),
+d(1961,4,30,5,30,0),
+d(1961,10,29,4,30,0),
+d(1962,4,29,5,30,0),
+d(1962,10,28,4,30,0),
+d(1963,4,28,5,30,0),
+d(1963,10,27,4,30,0),
+d(1964,4,26,5,30,0),
+d(1964,10,25,4,30,0),
+d(1965,4,25,5,30,0),
+d(1965,10,31,4,30,0),
+d(1966,3,15,5,30,0),
+d(1966,4,24,6,0,0),
+d(1966,10,30,5,0,0),
+d(1967,4,30,6,0,0),
+d(1967,10,29,5,0,0),
+d(1968,4,28,6,0,0),
+d(1968,10,27,5,0,0),
+d(1969,4,27,6,0,0),
+d(1969,10,26,5,0,0),
+d(1970,4,26,6,0,0),
+d(1970,10,25,5,0,0),
+d(1971,4,25,6,0,0),
+d(1971,10,31,5,0,0),
+d(1972,4,30,6,0,0),
+d(1972,10,29,5,0,0),
+d(1973,4,29,6,0,0),
+d(1973,10,28,5,0,0),
+d(1974,4,28,6,0,0),
+d(1974,10,27,5,0,0),
+d(1975,4,27,6,0,0),
+d(1975,10,26,5,0,0),
+d(1976,4,25,6,0,0),
+d(1976,10,31,5,0,0),
+d(1977,4,24,6,0,0),
+d(1977,10,30,5,0,0),
+d(1978,4,30,6,0,0),
+d(1978,10,29,5,0,0),
+d(1979,4,29,6,0,0),
+d(1979,10,28,5,0,0),
+d(1980,4,27,6,0,0),
+d(1980,10,26,5,0,0),
+d(1981,4,26,6,0,0),
+d(1981,10,25,5,0,0),
+d(1982,4,25,6,0,0),
+d(1982,10,31,5,0,0),
+d(1983,4,24,6,0,0),
+d(1983,10,30,5,0,0),
+d(1984,4,29,6,0,0),
+d(1984,10,28,5,0,0),
+d(1985,4,28,6,0,0),
+d(1985,10,27,5,0,0),
+d(1986,4,27,6,0,0),
+d(1986,10,26,5,0,0),
+d(1987,4,5,4,1,0),
+d(1987,10,25,3,1,0),
+d(1988,4,3,4,1,0),
+d(1988,10,30,2,1,0),
+d(1989,4,2,4,1,0),
+d(1989,10,29,3,1,0),
+d(1990,4,1,4,1,0),
+d(1990,10,28,3,1,0),
+d(1991,4,7,4,1,0),
+d(1991,10,27,3,1,0),
+d(1992,4,5,4,1,0),
+d(1992,10,25,3,1,0),
+d(1993,4,4,4,1,0),
+d(1993,10,31,3,1,0),
+d(1994,4,3,4,1,0),
+d(1994,10,30,3,1,0),
+d(1995,4,2,4,1,0),
+d(1995,10,29,3,1,0),
+d(1996,4,7,4,1,0),
+d(1996,10,27,3,1,0),
+d(1997,4,6,4,1,0),
+d(1997,10,26,3,1,0),
+d(1998,4,5,4,1,0),
+d(1998,10,25,3,1,0),
+d(1999,4,4,4,1,0),
+d(1999,10,31,3,1,0),
+d(2000,4,2,4,1,0),
+d(2000,10,29,3,1,0),
+d(2001,4,1,4,1,0),
+d(2001,10,28,3,1,0),
+d(2002,4,7,4,1,0),
+d(2002,10,27,3,1,0),
+d(2003,4,6,4,1,0),
+d(2003,10,26,3,1,0),
+d(2004,4,4,4,1,0),
+d(2004,10,31,3,1,0),
+d(2005,4,3,4,1,0),
+d(2005,10,30,3,1,0),
+d(2006,4,2,4,1,0),
+d(2006,10,29,3,1,0),
+d(2007,3,11,4,1,0),
+d(2007,11,4,3,1,0),
+d(2008,3,9,4,1,0),
+d(2008,11,2,3,1,0),
+d(2009,3,8,4,1,0),
+d(2009,11,1,3,1,0),
+d(2010,3,14,4,1,0),
+d(2010,11,7,3,1,0),
+d(2011,3,13,4,1,0),
+d(2011,11,6,3,1,0),
+d(2012,3,11,4,1,0),
+d(2012,11,4,3,1,0),
+d(2013,3,10,4,1,0),
+d(2013,11,3,3,1,0),
+d(2014,3,9,4,1,0),
+d(2014,11,2,3,1,0),
+d(2015,3,8,4,1,0),
+d(2015,11,1,3,1,0),
+d(2016,3,13,4,1,0),
+d(2016,11,6,3,1,0),
+d(2017,3,12,4,1,0),
+d(2017,11,5,3,1,0),
+d(2018,3,11,4,1,0),
+d(2018,11,4,3,1,0),
+d(2019,3,10,4,1,0),
+d(2019,11,3,3,1,0),
+d(2020,3,8,4,1,0),
+d(2020,11,1,3,1,0),
+d(2021,3,14,4,1,0),
+d(2021,11,7,3,1,0),
+d(2022,3,13,4,1,0),
+d(2022,11,6,3,1,0),
+d(2023,3,12,4,1,0),
+d(2023,11,5,3,1,0),
+d(2024,3,10,4,1,0),
+d(2024,11,3,3,1,0),
+d(2025,3,9,4,1,0),
+d(2025,11,2,3,1,0),
+d(2026,3,8,4,1,0),
+d(2026,11,1,3,1,0),
+d(2027,3,14,4,1,0),
+d(2027,11,7,3,1,0),
+d(2028,3,12,4,1,0),
+d(2028,11,5,3,1,0),
+d(2029,3,11,4,1,0),
+d(2029,11,4,3,1,0),
+d(2030,3,10,4,1,0),
+d(2030,11,3,3,1,0),
+d(2031,3,9,4,1,0),
+d(2031,11,2,3,1,0),
+d(2032,3,14,4,1,0),
+d(2032,11,7,3,1,0),
+d(2033,3,13,4,1,0),
+d(2033,11,6,3,1,0),
+d(2034,3,12,4,1,0),
+d(2034,11,5,3,1,0),
+d(2035,3,11,4,1,0),
+d(2035,11,4,3,1,0),
+d(2036,3,9,4,1,0),
+d(2036,11,2,3,1,0),
+d(2037,3,8,4,1,0),
+d(2037,11,1,3,1,0),
+        ]
+
+    _transition_info = [
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NWT'),
+i(-9000,3600,'NPT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-7200,7200,'ADDT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Goose_Bay = Goose_Bay()
+
diff --git a/lib/pytz/zoneinfo/America/Grand_Turk.py b/lib/pytz/zoneinfo/America/Grand_Turk.py
new file mode 100755
index 0000000..ba4cae5
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Grand_Turk.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for America/Grand_Turk.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Grand_Turk(DstTzInfo):
+    '''America/Grand_Turk timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Grand_Turk'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,2,1,5,7,12),
+d(1979,4,29,5,0,0),
+d(1979,10,28,4,0,0),
+d(1980,4,27,5,0,0),
+d(1980,10,26,4,0,0),
+d(1981,4,26,5,0,0),
+d(1981,10,25,4,0,0),
+d(1982,4,25,5,0,0),
+d(1982,10,31,4,0,0),
+d(1983,4,24,5,0,0),
+d(1983,10,30,4,0,0),
+d(1984,4,29,5,0,0),
+d(1984,10,28,4,0,0),
+d(1985,4,28,5,0,0),
+d(1985,10,27,4,0,0),
+d(1986,4,27,5,0,0),
+d(1986,10,26,4,0,0),
+d(1987,4,5,5,0,0),
+d(1987,10,25,4,0,0),
+d(1988,4,3,5,0,0),
+d(1988,10,30,4,0,0),
+d(1989,4,2,5,0,0),
+d(1989,10,29,4,0,0),
+d(1990,4,1,5,0,0),
+d(1990,10,28,4,0,0),
+d(1991,4,7,5,0,0),
+d(1991,10,27,4,0,0),
+d(1992,4,5,5,0,0),
+d(1992,10,25,4,0,0),
+d(1993,4,4,5,0,0),
+d(1993,10,31,4,0,0),
+d(1994,4,3,5,0,0),
+d(1994,10,30,4,0,0),
+d(1995,4,2,5,0,0),
+d(1995,10,29,4,0,0),
+d(1996,4,7,5,0,0),
+d(1996,10,27,4,0,0),
+d(1997,4,6,5,0,0),
+d(1997,10,26,4,0,0),
+d(1998,4,5,5,0,0),
+d(1998,10,25,4,0,0),
+d(1999,4,4,5,0,0),
+d(1999,10,31,4,0,0),
+d(2000,4,2,5,0,0),
+d(2000,10,29,4,0,0),
+d(2001,4,1,5,0,0),
+d(2001,10,28,4,0,0),
+d(2002,4,7,5,0,0),
+d(2002,10,27,4,0,0),
+d(2003,4,6,5,0,0),
+d(2003,10,26,4,0,0),
+d(2004,4,4,5,0,0),
+d(2004,10,31,4,0,0),
+d(2005,4,3,5,0,0),
+d(2005,10,30,4,0,0),
+d(2006,4,2,5,0,0),
+d(2006,10,29,4,0,0),
+d(2007,4,1,5,0,0),
+d(2007,10,28,4,0,0),
+d(2008,4,6,5,0,0),
+d(2008,10,26,4,0,0),
+d(2009,4,5,5,0,0),
+d(2009,10,25,4,0,0),
+d(2010,4,4,5,0,0),
+d(2010,10,31,4,0,0),
+d(2011,4,3,5,0,0),
+d(2011,10,30,4,0,0),
+d(2012,4,1,5,0,0),
+d(2012,10,28,4,0,0),
+d(2013,4,7,5,0,0),
+d(2013,10,27,4,0,0),
+d(2014,4,6,5,0,0),
+d(2014,10,26,4,0,0),
+d(2015,4,5,5,0,0),
+d(2015,10,25,4,0,0),
+d(2016,4,3,5,0,0),
+d(2016,10,30,4,0,0),
+d(2017,4,2,5,0,0),
+d(2017,10,29,4,0,0),
+d(2018,4,1,5,0,0),
+d(2018,10,28,4,0,0),
+d(2019,4,7,5,0,0),
+d(2019,10,27,4,0,0),
+d(2020,4,5,5,0,0),
+d(2020,10,25,4,0,0),
+d(2021,4,4,5,0,0),
+d(2021,10,31,4,0,0),
+d(2022,4,3,5,0,0),
+d(2022,10,30,4,0,0),
+d(2023,4,2,5,0,0),
+d(2023,10,29,4,0,0),
+d(2024,4,7,5,0,0),
+d(2024,10,27,4,0,0),
+d(2025,4,6,5,0,0),
+d(2025,10,26,4,0,0),
+d(2026,4,5,5,0,0),
+d(2026,10,25,4,0,0),
+d(2027,4,4,5,0,0),
+d(2027,10,31,4,0,0),
+d(2028,4,2,5,0,0),
+d(2028,10,29,4,0,0),
+d(2029,4,1,5,0,0),
+d(2029,10,28,4,0,0),
+d(2030,4,7,5,0,0),
+d(2030,10,27,4,0,0),
+d(2031,4,6,5,0,0),
+d(2031,10,26,4,0,0),
+d(2032,4,4,5,0,0),
+d(2032,10,31,4,0,0),
+d(2033,4,3,5,0,0),
+d(2033,10,30,4,0,0),
+d(2034,4,2,5,0,0),
+d(2034,10,29,4,0,0),
+d(2035,4,1,5,0,0),
+d(2035,10,28,4,0,0),
+d(2036,4,6,5,0,0),
+d(2036,10,26,4,0,0),
+d(2037,4,5,5,0,0),
+d(2037,10,25,4,0,0),
+        ]
+
+    _transition_info = [
+i(-18420,0,'KMT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Grand_Turk = Grand_Turk()
+
diff --git a/lib/pytz/zoneinfo/America/Grenada.py b/lib/pytz/zoneinfo/America/Grenada.py
new file mode 100755
index 0000000..37d67e8
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Grenada.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Grenada.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Grenada(DstTzInfo):
+    '''America/Grenada timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Grenada'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,7,1,4,7,0),
+        ]
+
+    _transition_info = [
+i(-14820,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+Grenada = Grenada()
+
diff --git a/lib/pytz/zoneinfo/America/Guadeloupe.py b/lib/pytz/zoneinfo/America/Guadeloupe.py
new file mode 100755
index 0000000..1972075
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Guadeloupe.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Guadeloupe.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Guadeloupe(DstTzInfo):
+    '''America/Guadeloupe timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Guadeloupe'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,6,8,4,6,8),
+        ]
+
+    _transition_info = [
+i(-14760,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+Guadeloupe = Guadeloupe()
+
diff --git a/lib/pytz/zoneinfo/America/Guatemala.py b/lib/pytz/zoneinfo/America/Guatemala.py
new file mode 100755
index 0000000..6d4a29c
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Guatemala.py
@@ -0,0 +1,38 @@
+'''tzinfo timezone information for America/Guatemala.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Guatemala(DstTzInfo):
+    '''America/Guatemala timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Guatemala'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,10,5,6,2,4),
+d(1973,11,25,6,0,0),
+d(1974,2,24,5,0,0),
+d(1983,5,21,6,0,0),
+d(1983,9,22,5,0,0),
+d(1991,3,23,6,0,0),
+d(1991,9,7,5,0,0),
+d(2006,4,30,6,0,0),
+d(2006,10,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-21720,0,'LMT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Guatemala = Guatemala()
+
diff --git a/lib/pytz/zoneinfo/America/Guayaquil.py b/lib/pytz/zoneinfo/America/Guayaquil.py
new file mode 100755
index 0000000..c44a5f1
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Guayaquil.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Guayaquil.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Guayaquil(DstTzInfo):
+    '''America/Guayaquil timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Guayaquil'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1931,1,1,5,14,0),
+        ]
+
+    _transition_info = [
+i(-18840,0,'QMT'),
+i(-18000,0,'ECT'),
+        ]
+
+Guayaquil = Guayaquil()
+
diff --git a/lib/pytz/zoneinfo/America/Guyana.py b/lib/pytz/zoneinfo/America/Guyana.py
new file mode 100755
index 0000000..3397d5e
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Guyana.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for America/Guyana.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Guyana(DstTzInfo):
+    '''America/Guyana timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Guyana'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1915,3,1,3,52,40),
+d(1966,5,26,3,45,0),
+d(1975,7,31,3,45,0),
+d(1991,1,1,3,0,0),
+        ]
+
+    _transition_info = [
+i(-13980,0,'LMT'),
+i(-13500,0,'GBGT'),
+i(-13500,0,'GYT'),
+i(-10800,0,'GYT'),
+i(-14400,0,'GYT'),
+        ]
+
+Guyana = Guyana()
+
diff --git a/lib/pytz/zoneinfo/America/Halifax.py b/lib/pytz/zoneinfo/America/Halifax.py
new file mode 100755
index 0000000..ae67391
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Halifax.py
@@ -0,0 +1,476 @@
+'''tzinfo timezone information for America/Halifax.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Halifax(DstTzInfo):
+    '''America/Halifax timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Halifax'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1902,6,15,4,14,24),
+d(1916,4,1,4,0,0),
+d(1916,10,1,3,0,0),
+d(1918,4,14,6,0,0),
+d(1918,10,31,5,0,0),
+d(1920,5,9,4,0,0),
+d(1920,8,29,3,0,0),
+d(1921,5,6,4,0,0),
+d(1921,9,5,3,0,0),
+d(1922,4,30,4,0,0),
+d(1922,9,5,3,0,0),
+d(1923,5,6,4,0,0),
+d(1923,9,4,3,0,0),
+d(1924,5,4,4,0,0),
+d(1924,9,15,3,0,0),
+d(1925,5,3,4,0,0),
+d(1925,9,28,3,0,0),
+d(1926,5,16,4,0,0),
+d(1926,9,13,3,0,0),
+d(1927,5,1,4,0,0),
+d(1927,9,26,3,0,0),
+d(1928,5,13,4,0,0),
+d(1928,9,9,3,0,0),
+d(1929,5,12,4,0,0),
+d(1929,9,3,3,0,0),
+d(1930,5,11,4,0,0),
+d(1930,9,15,3,0,0),
+d(1931,5,10,4,0,0),
+d(1931,9,28,3,0,0),
+d(1932,5,1,4,0,0),
+d(1932,9,26,3,0,0),
+d(1933,4,30,4,0,0),
+d(1933,10,2,3,0,0),
+d(1934,5,20,4,0,0),
+d(1934,9,16,3,0,0),
+d(1935,6,2,4,0,0),
+d(1935,9,30,3,0,0),
+d(1936,6,1,4,0,0),
+d(1936,9,14,3,0,0),
+d(1937,5,2,4,0,0),
+d(1937,9,27,3,0,0),
+d(1938,5,1,4,0,0),
+d(1938,9,26,3,0,0),
+d(1939,5,28,4,0,0),
+d(1939,9,25,3,0,0),
+d(1940,5,5,4,0,0),
+d(1940,9,30,3,0,0),
+d(1941,5,4,4,0,0),
+d(1941,9,29,3,0,0),
+d(1942,2,9,6,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,5,0,0),
+d(1946,4,28,6,0,0),
+d(1946,9,29,5,0,0),
+d(1947,4,27,6,0,0),
+d(1947,9,28,5,0,0),
+d(1948,4,25,6,0,0),
+d(1948,9,26,5,0,0),
+d(1949,4,24,6,0,0),
+d(1949,9,25,5,0,0),
+d(1951,4,29,6,0,0),
+d(1951,9,30,5,0,0),
+d(1952,4,27,6,0,0),
+d(1952,9,28,5,0,0),
+d(1953,4,26,6,0,0),
+d(1953,9,27,5,0,0),
+d(1954,4,25,6,0,0),
+d(1954,9,26,5,0,0),
+d(1956,4,29,6,0,0),
+d(1956,9,30,5,0,0),
+d(1957,4,28,6,0,0),
+d(1957,9,29,5,0,0),
+d(1958,4,27,6,0,0),
+d(1958,9,28,5,0,0),
+d(1959,4,26,6,0,0),
+d(1959,9,27,5,0,0),
+d(1962,4,29,6,0,0),
+d(1962,10,28,5,0,0),
+d(1963,4,28,6,0,0),
+d(1963,10,27,5,0,0),
+d(1964,4,26,6,0,0),
+d(1964,10,25,5,0,0),
+d(1965,4,25,6,0,0),
+d(1965,10,31,5,0,0),
+d(1966,4,24,6,0,0),
+d(1966,10,30,5,0,0),
+d(1967,4,30,6,0,0),
+d(1967,10,29,5,0,0),
+d(1968,4,28,6,0,0),
+d(1968,10,27,5,0,0),
+d(1969,4,27,6,0,0),
+d(1969,10,26,5,0,0),
+d(1970,4,26,6,0,0),
+d(1970,10,25,5,0,0),
+d(1971,4,25,6,0,0),
+d(1971,10,31,5,0,0),
+d(1972,4,30,6,0,0),
+d(1972,10,29,5,0,0),
+d(1973,4,29,6,0,0),
+d(1973,10,28,5,0,0),
+d(1974,4,28,6,0,0),
+d(1974,10,27,5,0,0),
+d(1975,4,27,6,0,0),
+d(1975,10,26,5,0,0),
+d(1976,4,25,6,0,0),
+d(1976,10,31,5,0,0),
+d(1977,4,24,6,0,0),
+d(1977,10,30,5,0,0),
+d(1978,4,30,6,0,0),
+d(1978,10,29,5,0,0),
+d(1979,4,29,6,0,0),
+d(1979,10,28,5,0,0),
+d(1980,4,27,6,0,0),
+d(1980,10,26,5,0,0),
+d(1981,4,26,6,0,0),
+d(1981,10,25,5,0,0),
+d(1982,4,25,6,0,0),
+d(1982,10,31,5,0,0),
+d(1983,4,24,6,0,0),
+d(1983,10,30,5,0,0),
+d(1984,4,29,6,0,0),
+d(1984,10,28,5,0,0),
+d(1985,4,28,6,0,0),
+d(1985,10,27,5,0,0),
+d(1986,4,27,6,0,0),
+d(1986,10,26,5,0,0),
+d(1987,4,5,6,0,0),
+d(1987,10,25,5,0,0),
+d(1988,4,3,6,0,0),
+d(1988,10,30,5,0,0),
+d(1989,4,2,6,0,0),
+d(1989,10,29,5,0,0),
+d(1990,4,1,6,0,0),
+d(1990,10,28,5,0,0),
+d(1991,4,7,6,0,0),
+d(1991,10,27,5,0,0),
+d(1992,4,5,6,0,0),
+d(1992,10,25,5,0,0),
+d(1993,4,4,6,0,0),
+d(1993,10,31,5,0,0),
+d(1994,4,3,6,0,0),
+d(1994,10,30,5,0,0),
+d(1995,4,2,6,0,0),
+d(1995,10,29,5,0,0),
+d(1996,4,7,6,0,0),
+d(1996,10,27,5,0,0),
+d(1997,4,6,6,0,0),
+d(1997,10,26,5,0,0),
+d(1998,4,5,6,0,0),
+d(1998,10,25,5,0,0),
+d(1999,4,4,6,0,0),
+d(1999,10,31,5,0,0),
+d(2000,4,2,6,0,0),
+d(2000,10,29,5,0,0),
+d(2001,4,1,6,0,0),
+d(2001,10,28,5,0,0),
+d(2002,4,7,6,0,0),
+d(2002,10,27,5,0,0),
+d(2003,4,6,6,0,0),
+d(2003,10,26,5,0,0),
+d(2004,4,4,6,0,0),
+d(2004,10,31,5,0,0),
+d(2005,4,3,6,0,0),
+d(2005,10,30,5,0,0),
+d(2006,4,2,6,0,0),
+d(2006,10,29,5,0,0),
+d(2007,3,11,6,0,0),
+d(2007,11,4,5,0,0),
+d(2008,3,9,6,0,0),
+d(2008,11,2,5,0,0),
+d(2009,3,8,6,0,0),
+d(2009,11,1,5,0,0),
+d(2010,3,14,6,0,0),
+d(2010,11,7,5,0,0),
+d(2011,3,13,6,0,0),
+d(2011,11,6,5,0,0),
+d(2012,3,11,6,0,0),
+d(2012,11,4,5,0,0),
+d(2013,3,10,6,0,0),
+d(2013,11,3,5,0,0),
+d(2014,3,9,6,0,0),
+d(2014,11,2,5,0,0),
+d(2015,3,8,6,0,0),
+d(2015,11,1,5,0,0),
+d(2016,3,13,6,0,0),
+d(2016,11,6,5,0,0),
+d(2017,3,12,6,0,0),
+d(2017,11,5,5,0,0),
+d(2018,3,11,6,0,0),
+d(2018,11,4,5,0,0),
+d(2019,3,10,6,0,0),
+d(2019,11,3,5,0,0),
+d(2020,3,8,6,0,0),
+d(2020,11,1,5,0,0),
+d(2021,3,14,6,0,0),
+d(2021,11,7,5,0,0),
+d(2022,3,13,6,0,0),
+d(2022,11,6,5,0,0),
+d(2023,3,12,6,0,0),
+d(2023,11,5,5,0,0),
+d(2024,3,10,6,0,0),
+d(2024,11,3,5,0,0),
+d(2025,3,9,6,0,0),
+d(2025,11,2,5,0,0),
+d(2026,3,8,6,0,0),
+d(2026,11,1,5,0,0),
+d(2027,3,14,6,0,0),
+d(2027,11,7,5,0,0),
+d(2028,3,12,6,0,0),
+d(2028,11,5,5,0,0),
+d(2029,3,11,6,0,0),
+d(2029,11,4,5,0,0),
+d(2030,3,10,6,0,0),
+d(2030,11,3,5,0,0),
+d(2031,3,9,6,0,0),
+d(2031,11,2,5,0,0),
+d(2032,3,14,6,0,0),
+d(2032,11,7,5,0,0),
+d(2033,3,13,6,0,0),
+d(2033,11,6,5,0,0),
+d(2034,3,12,6,0,0),
+d(2034,11,5,5,0,0),
+d(2035,3,11,6,0,0),
+d(2035,11,4,5,0,0),
+d(2036,3,9,6,0,0),
+d(2036,11,2,5,0,0),
+d(2037,3,8,6,0,0),
+d(2037,11,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-15240,0,'LMT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'AWT'),
+i(-10800,3600,'APT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Halifax = Halifax()
+
diff --git a/lib/pytz/zoneinfo/America/Havana.py b/lib/pytz/zoneinfo/America/Havana.py
new file mode 100755
index 0000000..988a380
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Havana.py
@@ -0,0 +1,330 @@
+'''tzinfo timezone information for America/Havana.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Havana(DstTzInfo):
+    '''America/Havana timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Havana'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1925,7,19,17,29,36),
+d(1928,6,10,5,0,0),
+d(1928,10,10,4,0,0),
+d(1940,6,2,5,0,0),
+d(1940,9,1,4,0,0),
+d(1941,6,1,5,0,0),
+d(1941,9,7,4,0,0),
+d(1942,6,7,5,0,0),
+d(1942,9,6,4,0,0),
+d(1945,6,3,5,0,0),
+d(1945,9,2,4,0,0),
+d(1946,6,2,5,0,0),
+d(1946,9,1,4,0,0),
+d(1965,6,1,5,0,0),
+d(1965,9,30,4,0,0),
+d(1966,5,29,5,0,0),
+d(1966,10,2,4,0,0),
+d(1967,4,8,5,0,0),
+d(1967,9,10,4,0,0),
+d(1968,4,14,5,0,0),
+d(1968,9,8,4,0,0),
+d(1969,4,27,5,0,0),
+d(1969,10,26,4,0,0),
+d(1970,4,26,5,0,0),
+d(1970,10,25,4,0,0),
+d(1971,4,25,5,0,0),
+d(1971,10,31,4,0,0),
+d(1972,4,30,5,0,0),
+d(1972,10,8,4,0,0),
+d(1973,4,29,5,0,0),
+d(1973,10,8,4,0,0),
+d(1974,4,28,5,0,0),
+d(1974,10,8,4,0,0),
+d(1975,4,27,5,0,0),
+d(1975,10,26,4,0,0),
+d(1976,4,25,5,0,0),
+d(1976,10,31,4,0,0),
+d(1977,4,24,5,0,0),
+d(1977,10,30,4,0,0),
+d(1978,5,7,5,0,0),
+d(1978,10,8,4,0,0),
+d(1979,3,18,5,0,0),
+d(1979,10,14,4,0,0),
+d(1980,3,16,5,0,0),
+d(1980,10,12,4,0,0),
+d(1981,5,10,5,0,0),
+d(1981,10,11,4,0,0),
+d(1982,5,9,5,0,0),
+d(1982,10,10,4,0,0),
+d(1983,5,8,5,0,0),
+d(1983,10,9,4,0,0),
+d(1984,5,6,5,0,0),
+d(1984,10,14,4,0,0),
+d(1985,5,5,5,0,0),
+d(1985,10,13,4,0,0),
+d(1986,3,16,5,0,0),
+d(1986,10,12,4,0,0),
+d(1987,3,15,5,0,0),
+d(1987,10,11,4,0,0),
+d(1988,3,20,5,0,0),
+d(1988,10,9,4,0,0),
+d(1989,3,19,5,0,0),
+d(1989,10,8,4,0,0),
+d(1990,4,1,5,0,0),
+d(1990,10,14,4,0,0),
+d(1991,4,7,5,0,0),
+d(1991,10,13,5,0,0),
+d(1992,4,5,5,0,0),
+d(1992,10,11,5,0,0),
+d(1993,4,4,5,0,0),
+d(1993,10,10,5,0,0),
+d(1994,4,3,5,0,0),
+d(1994,10,9,5,0,0),
+d(1995,4,2,5,0,0),
+d(1995,10,8,5,0,0),
+d(1996,4,7,5,0,0),
+d(1996,10,6,5,0,0),
+d(1997,4,6,5,0,0),
+d(1997,10,12,5,0,0),
+d(1998,3,29,5,0,0),
+d(1998,10,25,5,0,0),
+d(1999,3,28,5,0,0),
+d(1999,10,31,5,0,0),
+d(2000,4,2,5,0,0),
+d(2000,10,29,5,0,0),
+d(2001,4,1,5,0,0),
+d(2001,10,28,5,0,0),
+d(2002,4,7,5,0,0),
+d(2002,10,27,5,0,0),
+d(2003,4,6,5,0,0),
+d(2003,10,26,5,0,0),
+d(2004,4,4,5,0,0),
+d(2006,10,29,5,0,0),
+d(2007,4,1,5,0,0),
+d(2007,10,28,5,0,0),
+d(2008,4,6,5,0,0),
+d(2008,10,26,5,0,0),
+d(2009,4,5,5,0,0),
+d(2009,10,25,5,0,0),
+d(2010,4,4,5,0,0),
+d(2010,10,31,5,0,0),
+d(2011,4,3,5,0,0),
+d(2011,10,30,5,0,0),
+d(2012,4,1,5,0,0),
+d(2012,10,28,5,0,0),
+d(2013,4,7,5,0,0),
+d(2013,10,27,5,0,0),
+d(2014,4,6,5,0,0),
+d(2014,10,26,5,0,0),
+d(2015,4,5,5,0,0),
+d(2015,10,25,5,0,0),
+d(2016,4,3,5,0,0),
+d(2016,10,30,5,0,0),
+d(2017,4,2,5,0,0),
+d(2017,10,29,5,0,0),
+d(2018,4,1,5,0,0),
+d(2018,10,28,5,0,0),
+d(2019,4,7,5,0,0),
+d(2019,10,27,5,0,0),
+d(2020,4,5,5,0,0),
+d(2020,10,25,5,0,0),
+d(2021,4,4,5,0,0),
+d(2021,10,31,5,0,0),
+d(2022,4,3,5,0,0),
+d(2022,10,30,5,0,0),
+d(2023,4,2,5,0,0),
+d(2023,10,29,5,0,0),
+d(2024,4,7,5,0,0),
+d(2024,10,27,5,0,0),
+d(2025,4,6,5,0,0),
+d(2025,10,26,5,0,0),
+d(2026,4,5,5,0,0),
+d(2026,10,25,5,0,0),
+d(2027,4,4,5,0,0),
+d(2027,10,31,5,0,0),
+d(2028,4,2,5,0,0),
+d(2028,10,29,5,0,0),
+d(2029,4,1,5,0,0),
+d(2029,10,28,5,0,0),
+d(2030,4,7,5,0,0),
+d(2030,10,27,5,0,0),
+d(2031,4,6,5,0,0),
+d(2031,10,26,5,0,0),
+d(2032,4,4,5,0,0),
+d(2032,10,31,5,0,0),
+d(2033,4,3,5,0,0),
+d(2033,10,30,5,0,0),
+d(2034,4,2,5,0,0),
+d(2034,10,29,5,0,0),
+d(2035,4,1,5,0,0),
+d(2035,10,28,5,0,0),
+d(2036,4,6,5,0,0),
+d(2036,10,26,5,0,0),
+d(2037,4,5,5,0,0),
+d(2037,10,25,5,0,0),
+        ]
+
+    _transition_info = [
+i(-19800,0,'HMT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+        ]
+
+Havana = Havana()
+
diff --git a/lib/pytz/zoneinfo/America/Hermosillo.py b/lib/pytz/zoneinfo/America/Hermosillo.py
new file mode 100755
index 0000000..926ea81
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Hermosillo.py
@@ -0,0 +1,50 @@
+'''tzinfo timezone information for America/Hermosillo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Hermosillo(DstTzInfo):
+    '''America/Hermosillo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Hermosillo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,7,0,0),
+d(1927,6,11,6,0,0),
+d(1930,11,15,6,0,0),
+d(1931,5,2,6,0,0),
+d(1931,10,1,6,0,0),
+d(1932,4,1,7,0,0),
+d(1942,4,24,6,0,0),
+d(1949,1,14,7,0,0),
+d(1970,1,1,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+        ]
+
+    _transition_info = [
+i(-26640,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Hermosillo = Hermosillo()
+
diff --git a/lib/pytz/zoneinfo/America/Indiana/Indianapolis.py b/lib/pytz/zoneinfo/America/Indiana/Indianapolis.py
new file mode 100755
index 0000000..21369f1
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Indiana/Indianapolis.py
@@ -0,0 +1,216 @@
+'''tzinfo timezone information for America/Indiana/Indianapolis.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Indianapolis(DstTzInfo):
+    '''America/Indiana/Indianapolis timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Indiana/Indianapolis'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1941,6,22,8,0,0),
+d(1941,9,28,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,4,28,8,0,0),
+d(1946,9,29,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Indianapolis = Indianapolis()
+
diff --git a/lib/pytz/zoneinfo/America/Indiana/Knox.py b/lib/pytz/zoneinfo/America/Indiana/Knox.py
new file mode 100755
index 0000000..4ee2f5d
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Indiana/Knox.py
@@ -0,0 +1,326 @@
+'''tzinfo timezone information for America/Indiana/Knox.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Knox(DstTzInfo):
+    '''America/Indiana/Knox timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Indiana/Knox'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,10,30,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,10,28,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,9,28,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,10,30,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,10,29,7,0,0),
+d(1962,4,29,8,0,0),
+d(1963,10,27,7,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,7,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,7,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,7,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,7,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,7,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,7,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Knox = Knox()
+
diff --git a/lib/pytz/zoneinfo/America/Indiana/Marengo.py b/lib/pytz/zoneinfo/America/Indiana/Marengo.py
new file mode 100755
index 0000000..3eca6df
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Indiana/Marengo.py
@@ -0,0 +1,224 @@
+'''tzinfo timezone information for America/Indiana/Marengo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Marengo(DstTzInfo):
+    '''America/Indiana/Marengo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Indiana/Marengo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,9,25,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,9,30,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,9,28,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,9,27,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,9,25,7,0,0),
+d(1961,4,30,8,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Marengo = Marengo()
+
diff --git a/lib/pytz/zoneinfo/America/Indiana/Petersburg.py b/lib/pytz/zoneinfo/America/Indiana/Petersburg.py
new file mode 100755
index 0000000..71b842d
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Indiana/Petersburg.py
@@ -0,0 +1,250 @@
+'''tzinfo timezone information for America/Indiana/Petersburg.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Petersburg(DstTzInfo):
+    '''America/Indiana/Petersburg timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Indiana/Petersburg'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1955,5,1,6,0,0),
+d(1955,9,25,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,9,30,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,9,28,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,9,27,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,9,25,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,10,29,7,0,0),
+d(1962,4,29,8,0,0),
+d(1962,10,28,7,0,0),
+d(1963,4,28,8,0,0),
+d(1963,10,27,7,0,0),
+d(1964,4,26,8,0,0),
+d(1964,10,25,7,0,0),
+d(1965,4,25,8,0,0),
+d(1966,10,30,7,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,7,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,7,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,7,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,7,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,7,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,7,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Petersburg = Petersburg()
+
diff --git a/lib/pytz/zoneinfo/America/Indiana/Vevay.py b/lib/pytz/zoneinfo/America/Indiana/Vevay.py
new file mode 100755
index 0000000..614e1de
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Indiana/Vevay.py
@@ -0,0 +1,180 @@
+'''tzinfo timezone information for America/Indiana/Vevay.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vevay(DstTzInfo):
+    '''America/Indiana/Vevay timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Indiana/Vevay'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1954,4,25,8,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Vevay = Vevay()
+
diff --git a/lib/pytz/zoneinfo/America/Indiana/Vincennes.py b/lib/pytz/zoneinfo/America/Indiana/Vincennes.py
new file mode 100755
index 0000000..8365dae
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Indiana/Vincennes.py
@@ -0,0 +1,220 @@
+'''tzinfo timezone information for America/Indiana/Vincennes.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vincennes(DstTzInfo):
+    '''America/Indiana/Vincennes timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Indiana/Vincennes'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,4,28,8,0,0),
+d(1946,9,29,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,5,1,6,0,0),
+d(1955,9,25,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,9,30,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,9,28,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,9,27,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,10,30,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,9,24,7,0,0),
+d(1962,4,29,8,0,0),
+d(1962,10,28,7,0,0),
+d(1963,4,28,8,0,0),
+d(1963,10,27,7,0,0),
+d(1964,4,26,8,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Vincennes = Vincennes()
+
diff --git a/lib/pytz/zoneinfo/America/Indiana/__init__.py b/lib/pytz/zoneinfo/America/Indiana/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/America/Indianapolis.py b/lib/pytz/zoneinfo/America/Indianapolis.py
new file mode 100755
index 0000000..5cd52ed
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Indianapolis.py
@@ -0,0 +1,216 @@
+'''tzinfo timezone information for America/Indianapolis.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Indianapolis(DstTzInfo):
+    '''America/Indianapolis timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Indianapolis'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1941,6,22,8,0,0),
+d(1941,9,28,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,4,28,8,0,0),
+d(1946,9,29,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Indianapolis = Indianapolis()
+
diff --git a/lib/pytz/zoneinfo/America/Inuvik.py b/lib/pytz/zoneinfo/America/Inuvik.py
new file mode 100755
index 0000000..235d774
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Inuvik.py
@@ -0,0 +1,272 @@
+'''tzinfo timezone information for America/Inuvik.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Inuvik(DstTzInfo):
+    '''America/Inuvik timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Inuvik'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,10,0,0),
+d(1918,10,27,9,0,0),
+d(1919,5,25,10,0,0),
+d(1919,11,1,7,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1965,4,25,8,0,0),
+d(1965,10,31,8,0,0),
+d(1979,4,29,10,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-21600,7200,'PDDT'),
+i(-28800,0,'PST'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Inuvik = Inuvik()
+
diff --git a/lib/pytz/zoneinfo/America/Iqaluit.py b/lib/pytz/zoneinfo/America/Iqaluit.py
new file mode 100755
index 0000000..69597a4
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Iqaluit.py
@@ -0,0 +1,270 @@
+'''tzinfo timezone information for America/Iqaluit.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Iqaluit(DstTzInfo):
+    '''America/Iqaluit timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Iqaluit'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,7,0,0),
+d(1918,10,27,6,0,0),
+d(1919,5,25,7,0,0),
+d(1919,11,1,4,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1965,4,25,5,0,0),
+d(1965,10,31,5,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-10800,7200,'EDDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Iqaluit = Iqaluit()
+
diff --git a/lib/pytz/zoneinfo/America/Jamaica.py b/lib/pytz/zoneinfo/America/Jamaica.py
new file mode 100755
index 0000000..e9a82f5
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Jamaica.py
@@ -0,0 +1,62 @@
+'''tzinfo timezone information for America/Jamaica.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jamaica(DstTzInfo):
+    '''America/Jamaica timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Jamaica'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,2,1,5,7,12),
+d(1974,4,28,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18420,0,'KMT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Jamaica = Jamaica()
+
diff --git a/lib/pytz/zoneinfo/America/Jujuy.py b/lib/pytz/zoneinfo/America/Jujuy.py
new file mode 100755
index 0000000..3a1025b
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Jujuy.py
@@ -0,0 +1,132 @@
+'''tzinfo timezone information for America/Jujuy.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jujuy(DstTzInfo):
+    '''America/Jujuy timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Jujuy'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,28,4,0,0),
+d(1991,3,17,3,0,0),
+d(1991,10,6,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-10800,3600,'WARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+        ]
+
+Jujuy = Jujuy()
+
diff --git a/lib/pytz/zoneinfo/America/Juneau.py b/lib/pytz/zoneinfo/America/Juneau.py
new file mode 100755
index 0000000..def09cc
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Juneau.py
@@ -0,0 +1,304 @@
+'''tzinfo timezone information for America/Juneau.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Juneau(DstTzInfo):
+    '''America/Juneau timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Juneau'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1969,4,27,10,0,0),
+d(1969,10,26,9,0,0),
+d(1970,4,26,10,0,0),
+d(1970,10,25,9,0,0),
+d(1971,4,25,10,0,0),
+d(1971,10,31,9,0,0),
+d(1972,4,30,10,0,0),
+d(1972,10,29,9,0,0),
+d(1973,4,29,10,0,0),
+d(1973,10,28,9,0,0),
+d(1974,1,6,10,0,0),
+d(1974,10,27,9,0,0),
+d(1975,2,23,10,0,0),
+d(1975,10,26,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1983,11,30,9,0,0),
+d(1984,4,29,11,0,0),
+d(1984,10,28,10,0,0),
+d(1985,4,28,11,0,0),
+d(1985,10,27,10,0,0),
+d(1986,4,27,11,0,0),
+d(1986,10,26,10,0,0),
+d(1987,4,5,11,0,0),
+d(1987,10,25,10,0,0),
+d(1988,4,3,11,0,0),
+d(1988,10,30,10,0,0),
+d(1989,4,2,11,0,0),
+d(1989,10,29,10,0,0),
+d(1990,4,1,11,0,0),
+d(1990,10,28,10,0,0),
+d(1991,4,7,11,0,0),
+d(1991,10,27,10,0,0),
+d(1992,4,5,11,0,0),
+d(1992,10,25,10,0,0),
+d(1993,4,4,11,0,0),
+d(1993,10,31,10,0,0),
+d(1994,4,3,11,0,0),
+d(1994,10,30,10,0,0),
+d(1995,4,2,11,0,0),
+d(1995,10,29,10,0,0),
+d(1996,4,7,11,0,0),
+d(1996,10,27,10,0,0),
+d(1997,4,6,11,0,0),
+d(1997,10,26,10,0,0),
+d(1998,4,5,11,0,0),
+d(1998,10,25,10,0,0),
+d(1999,4,4,11,0,0),
+d(1999,10,31,10,0,0),
+d(2000,4,2,11,0,0),
+d(2000,10,29,10,0,0),
+d(2001,4,1,11,0,0),
+d(2001,10,28,10,0,0),
+d(2002,4,7,11,0,0),
+d(2002,10,27,10,0,0),
+d(2003,4,6,11,0,0),
+d(2003,10,26,10,0,0),
+d(2004,4,4,11,0,0),
+d(2004,10,31,10,0,0),
+d(2005,4,3,11,0,0),
+d(2005,10,30,10,0,0),
+d(2006,4,2,11,0,0),
+d(2006,10,29,10,0,0),
+d(2007,3,11,11,0,0),
+d(2007,11,4,10,0,0),
+d(2008,3,9,11,0,0),
+d(2008,11,2,10,0,0),
+d(2009,3,8,11,0,0),
+d(2009,11,1,10,0,0),
+d(2010,3,14,11,0,0),
+d(2010,11,7,10,0,0),
+d(2011,3,13,11,0,0),
+d(2011,11,6,10,0,0),
+d(2012,3,11,11,0,0),
+d(2012,11,4,10,0,0),
+d(2013,3,10,11,0,0),
+d(2013,11,3,10,0,0),
+d(2014,3,9,11,0,0),
+d(2014,11,2,10,0,0),
+d(2015,3,8,11,0,0),
+d(2015,11,1,10,0,0),
+d(2016,3,13,11,0,0),
+d(2016,11,6,10,0,0),
+d(2017,3,12,11,0,0),
+d(2017,11,5,10,0,0),
+d(2018,3,11,11,0,0),
+d(2018,11,4,10,0,0),
+d(2019,3,10,11,0,0),
+d(2019,11,3,10,0,0),
+d(2020,3,8,11,0,0),
+d(2020,11,1,10,0,0),
+d(2021,3,14,11,0,0),
+d(2021,11,7,10,0,0),
+d(2022,3,13,11,0,0),
+d(2022,11,6,10,0,0),
+d(2023,3,12,11,0,0),
+d(2023,11,5,10,0,0),
+d(2024,3,10,11,0,0),
+d(2024,11,3,10,0,0),
+d(2025,3,9,11,0,0),
+d(2025,11,2,10,0,0),
+d(2026,3,8,11,0,0),
+d(2026,11,1,10,0,0),
+d(2027,3,14,11,0,0),
+d(2027,11,7,10,0,0),
+d(2028,3,12,11,0,0),
+d(2028,11,5,10,0,0),
+d(2029,3,11,11,0,0),
+d(2029,11,4,10,0,0),
+d(2030,3,10,11,0,0),
+d(2030,11,3,10,0,0),
+d(2031,3,9,11,0,0),
+d(2031,11,2,10,0,0),
+d(2032,3,14,11,0,0),
+d(2032,11,7,10,0,0),
+d(2033,3,13,11,0,0),
+d(2033,11,6,10,0,0),
+d(2034,3,12,11,0,0),
+d(2034,11,5,10,0,0),
+d(2035,3,11,11,0,0),
+d(2035,11,4,10,0,0),
+d(2036,3,9,11,0,0),
+d(2036,11,2,10,0,0),
+d(2037,3,8,11,0,0),
+d(2037,11,1,10,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-32400,0,'YST'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+        ]
+
+Juneau = Juneau()
+
diff --git a/lib/pytz/zoneinfo/America/Kentucky/Louisville.py b/lib/pytz/zoneinfo/America/Kentucky/Louisville.py
new file mode 100755
index 0000000..501f456
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Kentucky/Louisville.py
@@ -0,0 +1,374 @@
+'''tzinfo timezone information for America/Kentucky/Louisville.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Louisville(DstTzInfo):
+    '''America/Kentucky/Louisville timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Kentucky/Louisville'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1921,5,1,8,0,0),
+d(1921,9,1,7,0,0),
+d(1941,4,27,8,0,0),
+d(1941,9,28,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,1,1,6,0,0),
+d(1946,6,2,7,0,0),
+d(1947,4,27,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,9,25,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,10,28,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,10,27,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,10,26,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,10,30,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,7,23,7,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Louisville = Louisville()
+
diff --git a/lib/pytz/zoneinfo/America/Kentucky/Monticello.py b/lib/pytz/zoneinfo/America/Kentucky/Monticello.py
new file mode 100755
index 0000000..a74d82b
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Kentucky/Monticello.py
@@ -0,0 +1,314 @@
+'''tzinfo timezone information for America/Kentucky/Monticello.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Monticello(DstTzInfo):
+    '''America/Kentucky/Monticello timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Kentucky/Monticello'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,7,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,7,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,7,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,7,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,7,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,7,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,7,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,7,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Monticello = Monticello()
+
diff --git a/lib/pytz/zoneinfo/America/Kentucky/__init__.py b/lib/pytz/zoneinfo/America/Kentucky/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/America/Knox_IN.py b/lib/pytz/zoneinfo/America/Knox_IN.py
new file mode 100755
index 0000000..b0f3b85
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Knox_IN.py
@@ -0,0 +1,326 @@
+'''tzinfo timezone information for America/Knox_IN.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Knox_IN(DstTzInfo):
+    '''America/Knox_IN timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Knox_IN'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,10,30,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,10,28,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,9,28,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,10,30,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,10,29,7,0,0),
+d(1962,4,29,8,0,0),
+d(1963,10,27,7,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,7,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,7,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,7,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,7,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,7,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,7,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Knox_IN = Knox_IN()
+
diff --git a/lib/pytz/zoneinfo/America/La_Paz.py b/lib/pytz/zoneinfo/America/La_Paz.py
new file mode 100755
index 0000000..bca04b0
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/La_Paz.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for America/La_Paz.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class La_Paz(DstTzInfo):
+    '''America/La_Paz timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/La_Paz'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1931,10,15,4,32,36),
+d(1932,3,21,3,32,36),
+        ]
+
+    _transition_info = [
+i(-16380,0,'CMT'),
+i(-12780,3600,'BOST'),
+i(-14400,0,'BOT'),
+        ]
+
+La_Paz = La_Paz()
+
diff --git a/lib/pytz/zoneinfo/America/Lima.py b/lib/pytz/zoneinfo/America/Lima.py
new file mode 100755
index 0000000..657d87a
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Lima.py
@@ -0,0 +1,50 @@
+'''tzinfo timezone information for America/Lima.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Lima(DstTzInfo):
+    '''America/Lima timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Lima'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1908,7,28,5,8,36),
+d(1938,1,1,5,0,0),
+d(1938,4,1,4,0,0),
+d(1938,9,25,5,0,0),
+d(1939,3,26,4,0,0),
+d(1939,9,24,5,0,0),
+d(1940,3,24,4,0,0),
+d(1986,1,1,5,0,0),
+d(1986,4,1,4,0,0),
+d(1987,1,1,5,0,0),
+d(1987,4,1,4,0,0),
+d(1990,1,1,5,0,0),
+d(1990,4,1,4,0,0),
+d(1994,1,1,5,0,0),
+d(1994,4,1,4,0,0),
+        ]
+
+    _transition_info = [
+i(-18540,0,'LMT'),
+i(-18000,0,'PET'),
+i(-14400,3600,'PEST'),
+i(-18000,0,'PET'),
+i(-14400,3600,'PEST'),
+i(-18000,0,'PET'),
+i(-14400,3600,'PEST'),
+i(-18000,0,'PET'),
+i(-14400,3600,'PEST'),
+i(-18000,0,'PET'),
+i(-14400,3600,'PEST'),
+i(-18000,0,'PET'),
+i(-14400,3600,'PEST'),
+i(-18000,0,'PET'),
+i(-14400,3600,'PEST'),
+i(-18000,0,'PET'),
+        ]
+
+Lima = Lima()
+
diff --git a/lib/pytz/zoneinfo/America/Los_Angeles.py b/lib/pytz/zoneinfo/America/Los_Angeles.py
new file mode 100755
index 0000000..5add3d1
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Los_Angeles.py
@@ -0,0 +1,390 @@
+'''tzinfo timezone information for America/Los_Angeles.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Los_Angeles(DstTzInfo):
+    '''America/Los_Angeles timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Los_Angeles'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,10,0,0),
+d(1918,10,27,9,0,0),
+d(1919,3,30,10,0,0),
+d(1919,10,26,9,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1948,3,14,10,0,0),
+d(1949,1,1,9,0,0),
+d(1950,4,30,10,0,0),
+d(1950,9,24,9,0,0),
+d(1951,4,29,10,0,0),
+d(1951,9,30,9,0,0),
+d(1952,4,27,10,0,0),
+d(1952,9,28,9,0,0),
+d(1953,4,26,10,0,0),
+d(1953,9,27,9,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1961,4,30,10,0,0),
+d(1961,9,24,9,0,0),
+d(1962,4,29,10,0,0),
+d(1962,10,28,9,0,0),
+d(1963,4,28,10,0,0),
+d(1963,10,27,9,0,0),
+d(1964,4,26,10,0,0),
+d(1964,10,25,9,0,0),
+d(1965,4,25,10,0,0),
+d(1965,10,31,9,0,0),
+d(1966,4,24,10,0,0),
+d(1966,10,30,9,0,0),
+d(1967,4,30,10,0,0),
+d(1967,10,29,9,0,0),
+d(1968,4,28,10,0,0),
+d(1968,10,27,9,0,0),
+d(1969,4,27,10,0,0),
+d(1969,10,26,9,0,0),
+d(1970,4,26,10,0,0),
+d(1970,10,25,9,0,0),
+d(1971,4,25,10,0,0),
+d(1971,10,31,9,0,0),
+d(1972,4,30,10,0,0),
+d(1972,10,29,9,0,0),
+d(1973,4,29,10,0,0),
+d(1973,10,28,9,0,0),
+d(1974,1,6,10,0,0),
+d(1974,10,27,9,0,0),
+d(1975,2,23,10,0,0),
+d(1975,10,26,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Los_Angeles = Los_Angeles()
+
diff --git a/lib/pytz/zoneinfo/America/Louisville.py b/lib/pytz/zoneinfo/America/Louisville.py
new file mode 100755
index 0000000..1c0e3cc
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Louisville.py
@@ -0,0 +1,374 @@
+'''tzinfo timezone information for America/Louisville.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Louisville(DstTzInfo):
+    '''America/Louisville timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Louisville'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1921,5,1,8,0,0),
+d(1921,9,1,7,0,0),
+d(1941,4,27,8,0,0),
+d(1941,9,28,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,1,1,6,0,0),
+d(1946,6,2,7,0,0),
+d(1947,4,27,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,9,25,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,10,28,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,10,27,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,10,26,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,10,30,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,7,23,7,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Louisville = Louisville()
+
diff --git a/lib/pytz/zoneinfo/America/Maceio.py b/lib/pytz/zoneinfo/America/Maceio.py
new file mode 100755
index 0000000..d4ac830
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Maceio.py
@@ -0,0 +1,102 @@
+'''tzinfo timezone information for America/Maceio.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Maceio(DstTzInfo):
+    '''America/Maceio timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Maceio'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,2,22,52),
+d(1931,10,3,14,0,0),
+d(1932,4,1,2,0,0),
+d(1932,10,3,3,0,0),
+d(1933,4,1,2,0,0),
+d(1949,12,1,3,0,0),
+d(1950,4,16,3,0,0),
+d(1950,12,1,3,0,0),
+d(1951,4,1,2,0,0),
+d(1951,12,1,3,0,0),
+d(1952,4,1,2,0,0),
+d(1952,12,1,3,0,0),
+d(1953,3,1,2,0,0),
+d(1963,12,9,3,0,0),
+d(1964,3,1,2,0,0),
+d(1965,1,31,3,0,0),
+d(1965,3,31,2,0,0),
+d(1965,12,1,3,0,0),
+d(1966,3,1,2,0,0),
+d(1966,11,1,3,0,0),
+d(1967,3,1,2,0,0),
+d(1967,11,1,3,0,0),
+d(1968,3,1,2,0,0),
+d(1985,11,2,3,0,0),
+d(1986,3,15,2,0,0),
+d(1986,10,25,3,0,0),
+d(1987,2,14,2,0,0),
+d(1987,10,25,3,0,0),
+d(1988,2,7,2,0,0),
+d(1988,10,16,3,0,0),
+d(1989,1,29,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,2,11,2,0,0),
+d(1995,10,15,3,0,0),
+d(1996,2,11,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,2,27,2,0,0),
+d(2000,10,8,3,0,0),
+d(2000,10,22,2,0,0),
+d(2001,10,14,3,0,0),
+d(2002,2,17,2,0,0),
+        ]
+
+    _transition_info = [
+i(-8580,0,'LMT'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+        ]
+
+Maceio = Maceio()
+
diff --git a/lib/pytz/zoneinfo/America/Managua.py b/lib/pytz/zoneinfo/America/Managua.py
new file mode 100755
index 0000000..bf8a6be
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Managua.py
@@ -0,0 +1,50 @@
+'''tzinfo timezone information for America/Managua.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Managua(DstTzInfo):
+    '''America/Managua timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Managua'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1934,6,23,5,45,12),
+d(1973,5,1,6,0,0),
+d(1975,2,16,5,0,0),
+d(1979,3,18,6,0,0),
+d(1979,6,25,5,0,0),
+d(1980,3,16,6,0,0),
+d(1980,6,23,5,0,0),
+d(1992,1,1,10,0,0),
+d(1992,9,24,5,0,0),
+d(1993,1,1,6,0,0),
+d(1997,1,1,5,0,0),
+d(2005,4,10,6,0,0),
+d(2005,10,2,5,0,0),
+d(2006,4,30,8,0,0),
+d(2006,10,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-20700,0,'MMT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Managua = Managua()
+
diff --git a/lib/pytz/zoneinfo/America/Manaus.py b/lib/pytz/zoneinfo/America/Manaus.py
new file mode 100755
index 0000000..b190af1
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Manaus.py
@@ -0,0 +1,82 @@
+'''tzinfo timezone information for America/Manaus.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Manaus(DstTzInfo):
+    '''America/Manaus timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Manaus'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,4,0,4),
+d(1931,10,3,15,0,0),
+d(1932,4,1,3,0,0),
+d(1932,10,3,4,0,0),
+d(1933,4,1,3,0,0),
+d(1949,12,1,4,0,0),
+d(1950,4,16,4,0,0),
+d(1950,12,1,4,0,0),
+d(1951,4,1,3,0,0),
+d(1951,12,1,4,0,0),
+d(1952,4,1,3,0,0),
+d(1952,12,1,4,0,0),
+d(1953,3,1,3,0,0),
+d(1963,12,9,4,0,0),
+d(1964,3,1,3,0,0),
+d(1965,1,31,4,0,0),
+d(1965,3,31,3,0,0),
+d(1965,12,1,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,11,1,4,0,0),
+d(1967,3,1,3,0,0),
+d(1967,11,1,4,0,0),
+d(1968,3,1,3,0,0),
+d(1985,11,2,4,0,0),
+d(1986,3,15,3,0,0),
+d(1986,10,25,4,0,0),
+d(1987,2,14,3,0,0),
+d(1987,10,25,4,0,0),
+d(1988,2,7,3,0,0),
+d(1993,10,17,4,0,0),
+d(1994,2,20,3,0,0),
+        ]
+
+    _transition_info = [
+i(-14400,0,'LMT'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+        ]
+
+Manaus = Manaus()
+
diff --git a/lib/pytz/zoneinfo/America/Martinique.py b/lib/pytz/zoneinfo/America/Martinique.py
new file mode 100755
index 0000000..7154b4f
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Martinique.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for America/Martinique.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Martinique(DstTzInfo):
+    '''America/Martinique timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Martinique'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,5,1,4,4,20),
+d(1980,4,6,4,0,0),
+d(1980,9,28,3,0,0),
+        ]
+
+    _transition_info = [
+i(-14640,0,'FFMT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Martinique = Martinique()
+
diff --git a/lib/pytz/zoneinfo/America/Mazatlan.py b/lib/pytz/zoneinfo/America/Mazatlan.py
new file mode 100755
index 0000000..30490aa
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Mazatlan.py
@@ -0,0 +1,206 @@
+'''tzinfo timezone information for America/Mazatlan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mazatlan(DstTzInfo):
+    '''America/Mazatlan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Mazatlan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,7,0,0),
+d(1927,6,11,6,0,0),
+d(1930,11,15,6,0,0),
+d(1931,5,2,6,0,0),
+d(1931,10,1,6,0,0),
+d(1932,4,1,7,0,0),
+d(1942,4,24,6,0,0),
+d(1949,1,14,7,0,0),
+d(1970,1,1,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,5,6,9,0,0),
+d(2001,9,30,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,4,1,9,0,0),
+d(2007,10,28,8,0,0),
+d(2008,4,6,9,0,0),
+d(2008,10,26,8,0,0),
+d(2009,4,5,9,0,0),
+d(2009,10,25,8,0,0),
+d(2010,4,4,9,0,0),
+d(2010,10,31,8,0,0),
+d(2011,4,3,9,0,0),
+d(2011,10,30,8,0,0),
+d(2012,4,1,9,0,0),
+d(2012,10,28,8,0,0),
+d(2013,4,7,9,0,0),
+d(2013,10,27,8,0,0),
+d(2014,4,6,9,0,0),
+d(2014,10,26,8,0,0),
+d(2015,4,5,9,0,0),
+d(2015,10,25,8,0,0),
+d(2016,4,3,9,0,0),
+d(2016,10,30,8,0,0),
+d(2017,4,2,9,0,0),
+d(2017,10,29,8,0,0),
+d(2018,4,1,9,0,0),
+d(2018,10,28,8,0,0),
+d(2019,4,7,9,0,0),
+d(2019,10,27,8,0,0),
+d(2020,4,5,9,0,0),
+d(2020,10,25,8,0,0),
+d(2021,4,4,9,0,0),
+d(2021,10,31,8,0,0),
+d(2022,4,3,9,0,0),
+d(2022,10,30,8,0,0),
+d(2023,4,2,9,0,0),
+d(2023,10,29,8,0,0),
+d(2024,4,7,9,0,0),
+d(2024,10,27,8,0,0),
+d(2025,4,6,9,0,0),
+d(2025,10,26,8,0,0),
+d(2026,4,5,9,0,0),
+d(2026,10,25,8,0,0),
+d(2027,4,4,9,0,0),
+d(2027,10,31,8,0,0),
+d(2028,4,2,9,0,0),
+d(2028,10,29,8,0,0),
+d(2029,4,1,9,0,0),
+d(2029,10,28,8,0,0),
+d(2030,4,7,9,0,0),
+d(2030,10,27,8,0,0),
+d(2031,4,6,9,0,0),
+d(2031,10,26,8,0,0),
+d(2032,4,4,9,0,0),
+d(2032,10,31,8,0,0),
+d(2033,4,3,9,0,0),
+d(2033,10,30,8,0,0),
+d(2034,4,2,9,0,0),
+d(2034,10,29,8,0,0),
+d(2035,4,1,9,0,0),
+d(2035,10,28,8,0,0),
+d(2036,4,6,9,0,0),
+d(2036,10,26,8,0,0),
+d(2037,4,5,9,0,0),
+d(2037,10,25,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25560,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Mazatlan = Mazatlan()
+
diff --git a/lib/pytz/zoneinfo/America/Mendoza.py b/lib/pytz/zoneinfo/America/Mendoza.py
new file mode 100755
index 0000000..2c00395
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Mendoza.py
@@ -0,0 +1,136 @@
+'''tzinfo timezone information for America/Mendoza.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mendoza(DstTzInfo):
+    '''America/Mendoza timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Mendoza'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,15,4,0,0),
+d(1991,3,1,3,0,0),
+d(1991,10,15,4,0,0),
+d(1992,3,1,3,0,0),
+d(1992,10,18,4,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+d(2004,5,23,3,0,0),
+d(2004,9,26,4,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-10800,3600,'WARST'),
+i(-14400,0,'WART'),
+i(-10800,3600,'WARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'WART'),
+i(-10800,0,'ART'),
+        ]
+
+Mendoza = Mendoza()
+
diff --git a/lib/pytz/zoneinfo/America/Menominee.py b/lib/pytz/zoneinfo/America/Menominee.py
new file mode 100755
index 0000000..63a6531
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Menominee.py
@@ -0,0 +1,304 @@
+'''tzinfo timezone information for America/Menominee.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Menominee(DstTzInfo):
+    '''America/Menominee timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Menominee'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,4,28,8,0,0),
+d(1946,9,29,7,0,0),
+d(1966,4,24,8,0,0),
+d(1966,10,30,7,0,0),
+d(1969,4,27,8,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,7,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,7,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,7,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Menominee = Menominee()
+
diff --git a/lib/pytz/zoneinfo/America/Merida.py b/lib/pytz/zoneinfo/America/Merida.py
new file mode 100755
index 0000000..e50f96e
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Merida.py
@@ -0,0 +1,194 @@
+'''tzinfo timezone information for America/Merida.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Merida(DstTzInfo):
+    '''America/Merida timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Merida'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,6,0,0),
+d(1981,12,23,6,0,0),
+d(1982,12,2,5,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,5,6,8,0,0),
+d(2001,9,30,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,4,1,8,0,0),
+d(2007,10,28,7,0,0),
+d(2008,4,6,8,0,0),
+d(2008,10,26,7,0,0),
+d(2009,4,5,8,0,0),
+d(2009,10,25,7,0,0),
+d(2010,4,4,8,0,0),
+d(2010,10,31,7,0,0),
+d(2011,4,3,8,0,0),
+d(2011,10,30,7,0,0),
+d(2012,4,1,8,0,0),
+d(2012,10,28,7,0,0),
+d(2013,4,7,8,0,0),
+d(2013,10,27,7,0,0),
+d(2014,4,6,8,0,0),
+d(2014,10,26,7,0,0),
+d(2015,4,5,8,0,0),
+d(2015,10,25,7,0,0),
+d(2016,4,3,8,0,0),
+d(2016,10,30,7,0,0),
+d(2017,4,2,8,0,0),
+d(2017,10,29,7,0,0),
+d(2018,4,1,8,0,0),
+d(2018,10,28,7,0,0),
+d(2019,4,7,8,0,0),
+d(2019,10,27,7,0,0),
+d(2020,4,5,8,0,0),
+d(2020,10,25,7,0,0),
+d(2021,4,4,8,0,0),
+d(2021,10,31,7,0,0),
+d(2022,4,3,8,0,0),
+d(2022,10,30,7,0,0),
+d(2023,4,2,8,0,0),
+d(2023,10,29,7,0,0),
+d(2024,4,7,8,0,0),
+d(2024,10,27,7,0,0),
+d(2025,4,6,8,0,0),
+d(2025,10,26,7,0,0),
+d(2026,4,5,8,0,0),
+d(2026,10,25,7,0,0),
+d(2027,4,4,8,0,0),
+d(2027,10,31,7,0,0),
+d(2028,4,2,8,0,0),
+d(2028,10,29,7,0,0),
+d(2029,4,1,8,0,0),
+d(2029,10,28,7,0,0),
+d(2030,4,7,8,0,0),
+d(2030,10,27,7,0,0),
+d(2031,4,6,8,0,0),
+d(2031,10,26,7,0,0),
+d(2032,4,4,8,0,0),
+d(2032,10,31,7,0,0),
+d(2033,4,3,8,0,0),
+d(2033,10,30,7,0,0),
+d(2034,4,2,8,0,0),
+d(2034,10,29,7,0,0),
+d(2035,4,1,8,0,0),
+d(2035,10,28,7,0,0),
+d(2036,4,6,8,0,0),
+d(2036,10,26,7,0,0),
+d(2037,4,5,8,0,0),
+d(2037,10,25,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21480,0,'LMT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Merida = Merida()
+
diff --git a/lib/pytz/zoneinfo/America/Mexico_City.py b/lib/pytz/zoneinfo/America/Mexico_City.py
new file mode 100755
index 0000000..e9b6ed0
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Mexico_City.py
@@ -0,0 +1,216 @@
+'''tzinfo timezone information for America/Mexico_City.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mexico_City(DstTzInfo):
+    '''America/Mexico_City timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Mexico_City'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,7,0,0),
+d(1927,6,11,6,0,0),
+d(1930,11,15,6,0,0),
+d(1931,5,2,6,0,0),
+d(1931,10,1,6,0,0),
+d(1932,4,1,7,0,0),
+d(1939,2,5,6,0,0),
+d(1939,6,25,5,0,0),
+d(1940,12,9,6,0,0),
+d(1941,4,1,5,0,0),
+d(1943,12,16,6,0,0),
+d(1944,5,1,5,0,0),
+d(1950,2,12,6,0,0),
+d(1950,7,30,5,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,5,6,8,0,0),
+d(2001,9,30,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,4,1,8,0,0),
+d(2007,10,28,7,0,0),
+d(2008,4,6,8,0,0),
+d(2008,10,26,7,0,0),
+d(2009,4,5,8,0,0),
+d(2009,10,25,7,0,0),
+d(2010,4,4,8,0,0),
+d(2010,10,31,7,0,0),
+d(2011,4,3,8,0,0),
+d(2011,10,30,7,0,0),
+d(2012,4,1,8,0,0),
+d(2012,10,28,7,0,0),
+d(2013,4,7,8,0,0),
+d(2013,10,27,7,0,0),
+d(2014,4,6,8,0,0),
+d(2014,10,26,7,0,0),
+d(2015,4,5,8,0,0),
+d(2015,10,25,7,0,0),
+d(2016,4,3,8,0,0),
+d(2016,10,30,7,0,0),
+d(2017,4,2,8,0,0),
+d(2017,10,29,7,0,0),
+d(2018,4,1,8,0,0),
+d(2018,10,28,7,0,0),
+d(2019,4,7,8,0,0),
+d(2019,10,27,7,0,0),
+d(2020,4,5,8,0,0),
+d(2020,10,25,7,0,0),
+d(2021,4,4,8,0,0),
+d(2021,10,31,7,0,0),
+d(2022,4,3,8,0,0),
+d(2022,10,30,7,0,0),
+d(2023,4,2,8,0,0),
+d(2023,10,29,7,0,0),
+d(2024,4,7,8,0,0),
+d(2024,10,27,7,0,0),
+d(2025,4,6,8,0,0),
+d(2025,10,26,7,0,0),
+d(2026,4,5,8,0,0),
+d(2026,10,25,7,0,0),
+d(2027,4,4,8,0,0),
+d(2027,10,31,7,0,0),
+d(2028,4,2,8,0,0),
+d(2028,10,29,7,0,0),
+d(2029,4,1,8,0,0),
+d(2029,10,28,7,0,0),
+d(2030,4,7,8,0,0),
+d(2030,10,27,7,0,0),
+d(2031,4,6,8,0,0),
+d(2031,10,26,7,0,0),
+d(2032,4,4,8,0,0),
+d(2032,10,31,7,0,0),
+d(2033,4,3,8,0,0),
+d(2033,10,30,7,0,0),
+d(2034,4,2,8,0,0),
+d(2034,10,29,7,0,0),
+d(2035,4,1,8,0,0),
+d(2035,10,28,7,0,0),
+d(2036,4,6,8,0,0),
+d(2036,10,26,7,0,0),
+d(2037,4,5,8,0,0),
+d(2037,10,25,7,0,0),
+        ]
+
+    _transition_info = [
+i(-23820,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Mexico_City = Mexico_City()
+
diff --git a/lib/pytz/zoneinfo/America/Miquelon.py b/lib/pytz/zoneinfo/America/Miquelon.py
new file mode 100755
index 0000000..f4dedbf
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Miquelon.py
@@ -0,0 +1,228 @@
+'''tzinfo timezone information for America/Miquelon.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Miquelon(DstTzInfo):
+    '''America/Miquelon timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Miquelon'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,5,15,3,44,40),
+d(1980,5,1,4,0,0),
+d(1987,4,5,5,0,0),
+d(1987,10,25,4,0,0),
+d(1988,4,3,5,0,0),
+d(1988,10,30,4,0,0),
+d(1989,4,2,5,0,0),
+d(1989,10,29,4,0,0),
+d(1990,4,1,5,0,0),
+d(1990,10,28,4,0,0),
+d(1991,4,7,5,0,0),
+d(1991,10,27,4,0,0),
+d(1992,4,5,5,0,0),
+d(1992,10,25,4,0,0),
+d(1993,4,4,5,0,0),
+d(1993,10,31,4,0,0),
+d(1994,4,3,5,0,0),
+d(1994,10,30,4,0,0),
+d(1995,4,2,5,0,0),
+d(1995,10,29,4,0,0),
+d(1996,4,7,5,0,0),
+d(1996,10,27,4,0,0),
+d(1997,4,6,5,0,0),
+d(1997,10,26,4,0,0),
+d(1998,4,5,5,0,0),
+d(1998,10,25,4,0,0),
+d(1999,4,4,5,0,0),
+d(1999,10,31,4,0,0),
+d(2000,4,2,5,0,0),
+d(2000,10,29,4,0,0),
+d(2001,4,1,5,0,0),
+d(2001,10,28,4,0,0),
+d(2002,4,7,5,0,0),
+d(2002,10,27,4,0,0),
+d(2003,4,6,5,0,0),
+d(2003,10,26,4,0,0),
+d(2004,4,4,5,0,0),
+d(2004,10,31,4,0,0),
+d(2005,4,3,5,0,0),
+d(2005,10,30,4,0,0),
+d(2006,4,2,5,0,0),
+d(2006,10,29,4,0,0),
+d(2007,3,11,5,0,0),
+d(2007,11,4,4,0,0),
+d(2008,3,9,5,0,0),
+d(2008,11,2,4,0,0),
+d(2009,3,8,5,0,0),
+d(2009,11,1,4,0,0),
+d(2010,3,14,5,0,0),
+d(2010,11,7,4,0,0),
+d(2011,3,13,5,0,0),
+d(2011,11,6,4,0,0),
+d(2012,3,11,5,0,0),
+d(2012,11,4,4,0,0),
+d(2013,3,10,5,0,0),
+d(2013,11,3,4,0,0),
+d(2014,3,9,5,0,0),
+d(2014,11,2,4,0,0),
+d(2015,3,8,5,0,0),
+d(2015,11,1,4,0,0),
+d(2016,3,13,5,0,0),
+d(2016,11,6,4,0,0),
+d(2017,3,12,5,0,0),
+d(2017,11,5,4,0,0),
+d(2018,3,11,5,0,0),
+d(2018,11,4,4,0,0),
+d(2019,3,10,5,0,0),
+d(2019,11,3,4,0,0),
+d(2020,3,8,5,0,0),
+d(2020,11,1,4,0,0),
+d(2021,3,14,5,0,0),
+d(2021,11,7,4,0,0),
+d(2022,3,13,5,0,0),
+d(2022,11,6,4,0,0),
+d(2023,3,12,5,0,0),
+d(2023,11,5,4,0,0),
+d(2024,3,10,5,0,0),
+d(2024,11,3,4,0,0),
+d(2025,3,9,5,0,0),
+d(2025,11,2,4,0,0),
+d(2026,3,8,5,0,0),
+d(2026,11,1,4,0,0),
+d(2027,3,14,5,0,0),
+d(2027,11,7,4,0,0),
+d(2028,3,12,5,0,0),
+d(2028,11,5,4,0,0),
+d(2029,3,11,5,0,0),
+d(2029,11,4,4,0,0),
+d(2030,3,10,5,0,0),
+d(2030,11,3,4,0,0),
+d(2031,3,9,5,0,0),
+d(2031,11,2,4,0,0),
+d(2032,3,14,5,0,0),
+d(2032,11,7,4,0,0),
+d(2033,3,13,5,0,0),
+d(2033,11,6,4,0,0),
+d(2034,3,12,5,0,0),
+d(2034,11,5,4,0,0),
+d(2035,3,11,5,0,0),
+d(2035,11,4,4,0,0),
+d(2036,3,9,5,0,0),
+d(2036,11,2,4,0,0),
+d(2037,3,8,5,0,0),
+d(2037,11,1,4,0,0),
+        ]
+
+    _transition_info = [
+i(-13500,0,'LMT'),
+i(-14400,0,'AST'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+i(-7200,3600,'PMDT'),
+i(-10800,0,'PMST'),
+        ]
+
+Miquelon = Miquelon()
+
diff --git a/lib/pytz/zoneinfo/America/Moncton.py b/lib/pytz/zoneinfo/America/Moncton.py
new file mode 100755
index 0000000..f72c5e0
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Moncton.py
@@ -0,0 +1,432 @@
+'''tzinfo timezone information for America/Moncton.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Moncton(DstTzInfo):
+    '''America/Moncton timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Moncton'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1902,6,15,5,0,0),
+d(1918,4,14,6,0,0),
+d(1918,10,31,5,0,0),
+d(1933,6,11,5,0,0),
+d(1933,9,10,4,0,0),
+d(1934,6,10,5,0,0),
+d(1934,9,9,4,0,0),
+d(1935,6,9,5,0,0),
+d(1935,9,8,4,0,0),
+d(1936,6,7,5,0,0),
+d(1936,9,6,4,0,0),
+d(1937,6,6,5,0,0),
+d(1937,9,5,4,0,0),
+d(1938,6,5,5,0,0),
+d(1938,9,4,4,0,0),
+d(1939,5,27,5,0,0),
+d(1939,9,23,4,0,0),
+d(1940,5,19,5,0,0),
+d(1940,9,21,4,0,0),
+d(1941,5,4,5,0,0),
+d(1941,9,27,4,0,0),
+d(1942,2,9,6,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,5,0,0),
+d(1946,4,28,6,0,0),
+d(1946,9,29,5,0,0),
+d(1947,4,27,6,0,0),
+d(1947,9,28,5,0,0),
+d(1948,4,25,6,0,0),
+d(1948,9,26,5,0,0),
+d(1949,4,24,6,0,0),
+d(1949,9,25,5,0,0),
+d(1950,4,30,6,0,0),
+d(1950,9,24,5,0,0),
+d(1951,4,29,6,0,0),
+d(1951,9,30,5,0,0),
+d(1952,4,27,6,0,0),
+d(1952,9,28,5,0,0),
+d(1953,4,26,6,0,0),
+d(1953,9,27,5,0,0),
+d(1954,4,25,6,0,0),
+d(1954,9,26,5,0,0),
+d(1955,4,24,6,0,0),
+d(1955,9,25,5,0,0),
+d(1956,4,29,6,0,0),
+d(1956,9,30,5,0,0),
+d(1957,4,28,6,0,0),
+d(1957,10,27,5,0,0),
+d(1958,4,27,6,0,0),
+d(1958,10,26,5,0,0),
+d(1959,4,26,6,0,0),
+d(1959,10,25,5,0,0),
+d(1960,4,24,6,0,0),
+d(1960,10,30,5,0,0),
+d(1961,4,30,6,0,0),
+d(1961,10,29,5,0,0),
+d(1962,4,29,6,0,0),
+d(1962,10,28,5,0,0),
+d(1963,4,28,6,0,0),
+d(1963,10,27,5,0,0),
+d(1964,4,26,6,0,0),
+d(1964,10,25,5,0,0),
+d(1965,4,25,6,0,0),
+d(1965,10,31,5,0,0),
+d(1966,4,24,6,0,0),
+d(1966,10,30,5,0,0),
+d(1967,4,30,6,0,0),
+d(1967,10,29,5,0,0),
+d(1968,4,28,6,0,0),
+d(1968,10,27,5,0,0),
+d(1969,4,27,6,0,0),
+d(1969,10,26,5,0,0),
+d(1970,4,26,6,0,0),
+d(1970,10,25,5,0,0),
+d(1971,4,25,6,0,0),
+d(1971,10,31,5,0,0),
+d(1972,4,30,6,0,0),
+d(1972,10,29,5,0,0),
+d(1974,4,28,6,0,0),
+d(1974,10,27,5,0,0),
+d(1975,4,27,6,0,0),
+d(1975,10,26,5,0,0),
+d(1976,4,25,6,0,0),
+d(1976,10,31,5,0,0),
+d(1977,4,24,6,0,0),
+d(1977,10,30,5,0,0),
+d(1978,4,30,6,0,0),
+d(1978,10,29,5,0,0),
+d(1979,4,29,6,0,0),
+d(1979,10,28,5,0,0),
+d(1980,4,27,6,0,0),
+d(1980,10,26,5,0,0),
+d(1981,4,26,6,0,0),
+d(1981,10,25,5,0,0),
+d(1982,4,25,6,0,0),
+d(1982,10,31,5,0,0),
+d(1983,4,24,6,0,0),
+d(1983,10,30,5,0,0),
+d(1984,4,29,6,0,0),
+d(1984,10,28,5,0,0),
+d(1985,4,28,6,0,0),
+d(1985,10,27,5,0,0),
+d(1986,4,27,6,0,0),
+d(1986,10,26,5,0,0),
+d(1987,4,5,6,0,0),
+d(1987,10,25,5,0,0),
+d(1988,4,3,6,0,0),
+d(1988,10,30,5,0,0),
+d(1989,4,2,6,0,0),
+d(1989,10,29,5,0,0),
+d(1990,4,1,6,0,0),
+d(1990,10,28,5,0,0),
+d(1991,4,7,6,0,0),
+d(1991,10,27,5,0,0),
+d(1992,4,5,6,0,0),
+d(1992,10,25,5,0,0),
+d(1993,4,4,4,1,0),
+d(1993,10,31,3,1,0),
+d(1994,4,3,4,1,0),
+d(1994,10,30,3,1,0),
+d(1995,4,2,4,1,0),
+d(1995,10,29,3,1,0),
+d(1996,4,7,4,1,0),
+d(1996,10,27,3,1,0),
+d(1997,4,6,4,1,0),
+d(1997,10,26,3,1,0),
+d(1998,4,5,4,1,0),
+d(1998,10,25,3,1,0),
+d(1999,4,4,4,1,0),
+d(1999,10,31,3,1,0),
+d(2000,4,2,4,1,0),
+d(2000,10,29,3,1,0),
+d(2001,4,1,4,1,0),
+d(2001,10,28,3,1,0),
+d(2002,4,7,4,1,0),
+d(2002,10,27,3,1,0),
+d(2003,4,6,4,1,0),
+d(2003,10,26,3,1,0),
+d(2004,4,4,4,1,0),
+d(2004,10,31,3,1,0),
+d(2005,4,3,4,1,0),
+d(2005,10,30,3,1,0),
+d(2006,4,2,4,1,0),
+d(2006,10,29,3,1,0),
+d(2007,3,11,6,0,0),
+d(2007,11,4,5,0,0),
+d(2008,3,9,6,0,0),
+d(2008,11,2,5,0,0),
+d(2009,3,8,6,0,0),
+d(2009,11,1,5,0,0),
+d(2010,3,14,6,0,0),
+d(2010,11,7,5,0,0),
+d(2011,3,13,6,0,0),
+d(2011,11,6,5,0,0),
+d(2012,3,11,6,0,0),
+d(2012,11,4,5,0,0),
+d(2013,3,10,6,0,0),
+d(2013,11,3,5,0,0),
+d(2014,3,9,6,0,0),
+d(2014,11,2,5,0,0),
+d(2015,3,8,6,0,0),
+d(2015,11,1,5,0,0),
+d(2016,3,13,6,0,0),
+d(2016,11,6,5,0,0),
+d(2017,3,12,6,0,0),
+d(2017,11,5,5,0,0),
+d(2018,3,11,6,0,0),
+d(2018,11,4,5,0,0),
+d(2019,3,10,6,0,0),
+d(2019,11,3,5,0,0),
+d(2020,3,8,6,0,0),
+d(2020,11,1,5,0,0),
+d(2021,3,14,6,0,0),
+d(2021,11,7,5,0,0),
+d(2022,3,13,6,0,0),
+d(2022,11,6,5,0,0),
+d(2023,3,12,6,0,0),
+d(2023,11,5,5,0,0),
+d(2024,3,10,6,0,0),
+d(2024,11,3,5,0,0),
+d(2025,3,9,6,0,0),
+d(2025,11,2,5,0,0),
+d(2026,3,8,6,0,0),
+d(2026,11,1,5,0,0),
+d(2027,3,14,6,0,0),
+d(2027,11,7,5,0,0),
+d(2028,3,12,6,0,0),
+d(2028,11,5,5,0,0),
+d(2029,3,11,6,0,0),
+d(2029,11,4,5,0,0),
+d(2030,3,10,6,0,0),
+d(2030,11,3,5,0,0),
+d(2031,3,9,6,0,0),
+d(2031,11,2,5,0,0),
+d(2032,3,14,6,0,0),
+d(2032,11,7,5,0,0),
+d(2033,3,13,6,0,0),
+d(2033,11,6,5,0,0),
+d(2034,3,12,6,0,0),
+d(2034,11,5,5,0,0),
+d(2035,3,11,6,0,0),
+d(2035,11,4,5,0,0),
+d(2036,3,9,6,0,0),
+d(2036,11,2,5,0,0),
+d(2037,3,8,6,0,0),
+d(2037,11,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'AWT'),
+i(-10800,3600,'APT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Moncton = Moncton()
+
diff --git a/lib/pytz/zoneinfo/America/Monterrey.py b/lib/pytz/zoneinfo/America/Monterrey.py
new file mode 100755
index 0000000..32b924a
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Monterrey.py
@@ -0,0 +1,194 @@
+'''tzinfo timezone information for America/Monterrey.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Monterrey(DstTzInfo):
+    '''America/Monterrey timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Monterrey'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,6,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,5,6,8,0,0),
+d(2001,9,30,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,4,1,8,0,0),
+d(2007,10,28,7,0,0),
+d(2008,4,6,8,0,0),
+d(2008,10,26,7,0,0),
+d(2009,4,5,8,0,0),
+d(2009,10,25,7,0,0),
+d(2010,4,4,8,0,0),
+d(2010,10,31,7,0,0),
+d(2011,4,3,8,0,0),
+d(2011,10,30,7,0,0),
+d(2012,4,1,8,0,0),
+d(2012,10,28,7,0,0),
+d(2013,4,7,8,0,0),
+d(2013,10,27,7,0,0),
+d(2014,4,6,8,0,0),
+d(2014,10,26,7,0,0),
+d(2015,4,5,8,0,0),
+d(2015,10,25,7,0,0),
+d(2016,4,3,8,0,0),
+d(2016,10,30,7,0,0),
+d(2017,4,2,8,0,0),
+d(2017,10,29,7,0,0),
+d(2018,4,1,8,0,0),
+d(2018,10,28,7,0,0),
+d(2019,4,7,8,0,0),
+d(2019,10,27,7,0,0),
+d(2020,4,5,8,0,0),
+d(2020,10,25,7,0,0),
+d(2021,4,4,8,0,0),
+d(2021,10,31,7,0,0),
+d(2022,4,3,8,0,0),
+d(2022,10,30,7,0,0),
+d(2023,4,2,8,0,0),
+d(2023,10,29,7,0,0),
+d(2024,4,7,8,0,0),
+d(2024,10,27,7,0,0),
+d(2025,4,6,8,0,0),
+d(2025,10,26,7,0,0),
+d(2026,4,5,8,0,0),
+d(2026,10,25,7,0,0),
+d(2027,4,4,8,0,0),
+d(2027,10,31,7,0,0),
+d(2028,4,2,8,0,0),
+d(2028,10,29,7,0,0),
+d(2029,4,1,8,0,0),
+d(2029,10,28,7,0,0),
+d(2030,4,7,8,0,0),
+d(2030,10,27,7,0,0),
+d(2031,4,6,8,0,0),
+d(2031,10,26,7,0,0),
+d(2032,4,4,8,0,0),
+d(2032,10,31,7,0,0),
+d(2033,4,3,8,0,0),
+d(2033,10,30,7,0,0),
+d(2034,4,2,8,0,0),
+d(2034,10,29,7,0,0),
+d(2035,4,1,8,0,0),
+d(2035,10,28,7,0,0),
+d(2036,4,6,8,0,0),
+d(2036,10,26,7,0,0),
+d(2037,4,5,8,0,0),
+d(2037,10,25,7,0,0),
+        ]
+
+    _transition_info = [
+i(-24060,0,'LMT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Monterrey = Monterrey()
+
diff --git a/lib/pytz/zoneinfo/America/Montevideo.py b/lib/pytz/zoneinfo/America/Montevideo.py
new file mode 100755
index 0000000..1ca0a9a
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Montevideo.py
@@ -0,0 +1,282 @@
+'''tzinfo timezone information for America/Montevideo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Montevideo(DstTzInfo):
+    '''America/Montevideo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Montevideo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,3,44,44),
+d(1923,10,2,3,30,0),
+d(1924,4,1,3,0,0),
+d(1924,10,1,3,30,0),
+d(1925,4,1,3,0,0),
+d(1925,10,1,3,30,0),
+d(1926,4,1,3,0,0),
+d(1933,10,29,3,30,0),
+d(1934,4,1,3,0,0),
+d(1934,10,28,3,30,0),
+d(1935,3,31,3,0,0),
+d(1935,10,27,3,30,0),
+d(1936,3,29,3,0,0),
+d(1936,11,1,3,30,0),
+d(1937,3,28,3,0,0),
+d(1937,10,31,3,30,0),
+d(1938,3,27,3,0,0),
+d(1938,10,30,3,30,0),
+d(1939,3,26,3,0,0),
+d(1939,10,29,3,30,0),
+d(1940,3,31,3,0,0),
+d(1940,10,27,3,30,0),
+d(1941,3,30,3,0,0),
+d(1941,8,1,3,30,0),
+d(1942,1,1,3,0,0),
+d(1942,12,14,3,30,0),
+d(1943,3,14,2,0,0),
+d(1959,5,24,3,0,0),
+d(1959,11,15,2,0,0),
+d(1960,1,17,3,0,0),
+d(1960,3,6,2,0,0),
+d(1965,4,4,3,0,0),
+d(1965,9,26,2,0,0),
+d(1966,4,3,3,0,0),
+d(1966,10,31,2,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,31,2,0,0),
+d(1968,5,27,3,0,0),
+d(1968,12,2,2,30,0),
+d(1969,5,27,3,0,0),
+d(1969,12,2,2,30,0),
+d(1970,5,27,3,0,0),
+d(1970,12,2,2,30,0),
+d(1972,4,24,3,0,0),
+d(1972,8,15,2,0,0),
+d(1974,3,10,3,0,0),
+d(1974,12,22,2,30,0),
+d(1976,10,1,2,0,0),
+d(1977,12,4,3,0,0),
+d(1978,4,1,2,0,0),
+d(1979,10,1,3,0,0),
+d(1980,5,1,2,0,0),
+d(1987,12,14,3,0,0),
+d(1988,3,14,2,0,0),
+d(1988,12,11,3,0,0),
+d(1989,3,12,2,0,0),
+d(1989,10,29,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,27,3,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,2,28,2,0,0),
+d(2004,9,19,3,0,0),
+d(2005,3,27,4,0,0),
+d(2005,10,9,5,0,0),
+d(2006,3,12,4,0,0),
+d(2006,10,1,5,0,0),
+d(2007,3,11,4,0,0),
+d(2007,10,7,5,0,0),
+d(2008,3,9,4,0,0),
+d(2008,10,5,5,0,0),
+d(2009,3,8,4,0,0),
+d(2009,10,4,5,0,0),
+d(2010,3,14,4,0,0),
+d(2010,10,3,5,0,0),
+d(2011,3,13,4,0,0),
+d(2011,10,2,5,0,0),
+d(2012,3,11,4,0,0),
+d(2012,10,7,5,0,0),
+d(2013,3,10,4,0,0),
+d(2013,10,6,5,0,0),
+d(2014,3,9,4,0,0),
+d(2014,10,5,5,0,0),
+d(2015,3,8,4,0,0),
+d(2015,10,4,5,0,0),
+d(2016,3,13,4,0,0),
+d(2016,10,2,5,0,0),
+d(2017,3,12,4,0,0),
+d(2017,10,1,5,0,0),
+d(2018,3,11,4,0,0),
+d(2018,10,7,5,0,0),
+d(2019,3,10,4,0,0),
+d(2019,10,6,5,0,0),
+d(2020,3,8,4,0,0),
+d(2020,10,4,5,0,0),
+d(2021,3,14,4,0,0),
+d(2021,10,3,5,0,0),
+d(2022,3,13,4,0,0),
+d(2022,10,2,5,0,0),
+d(2023,3,12,4,0,0),
+d(2023,10,1,5,0,0),
+d(2024,3,10,4,0,0),
+d(2024,10,6,5,0,0),
+d(2025,3,9,4,0,0),
+d(2025,10,5,5,0,0),
+d(2026,3,8,4,0,0),
+d(2026,10,4,5,0,0),
+d(2027,3,14,4,0,0),
+d(2027,10,3,5,0,0),
+d(2028,3,12,4,0,0),
+d(2028,10,1,5,0,0),
+d(2029,3,11,4,0,0),
+d(2029,10,7,5,0,0),
+d(2030,3,10,4,0,0),
+d(2030,10,6,5,0,0),
+d(2031,3,9,4,0,0),
+d(2031,10,5,5,0,0),
+d(2032,3,14,4,0,0),
+d(2032,10,3,5,0,0),
+d(2033,3,13,4,0,0),
+d(2033,10,2,5,0,0),
+d(2034,3,12,4,0,0),
+d(2034,10,1,5,0,0),
+d(2035,3,11,4,0,0),
+d(2035,10,7,5,0,0),
+d(2036,3,9,4,0,0),
+d(2036,10,5,5,0,0),
+d(2037,3,8,4,0,0),
+d(2037,10,4,5,0,0),
+        ]
+
+    _transition_info = [
+i(-13500,0,'MMT'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-10800,1800,'UYHST'),
+i(-12600,0,'UYT'),
+i(-7200,5400,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-9000,1800,'UYHST'),
+i(-10800,0,'UYT'),
+i(-9000,1800,'UYHST'),
+i(-10800,0,'UYT'),
+i(-9000,1800,'UYHST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-9000,1800,'UYHST'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+i(-10800,0,'UYT'),
+i(-7200,3600,'UYST'),
+        ]
+
+Montevideo = Montevideo()
+
diff --git a/lib/pytz/zoneinfo/America/Montreal.py b/lib/pytz/zoneinfo/America/Montreal.py
new file mode 100755
index 0000000..f780e39
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Montreal.py
@@ -0,0 +1,484 @@
+'''tzinfo timezone information for America/Montreal.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Montreal(DstTzInfo):
+    '''America/Montreal timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Montreal'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,3,25,7,0,0),
+d(1917,4,24,4,0,0),
+d(1918,4,14,7,0,0),
+d(1918,10,31,6,0,0),
+d(1919,3,31,7,30,0),
+d(1919,10,25,6,30,0),
+d(1920,5,2,7,30,0),
+d(1920,10,3,6,30,0),
+d(1921,5,1,7,0,0),
+d(1921,10,2,6,30,0),
+d(1922,4,30,7,0,0),
+d(1922,10,1,6,30,0),
+d(1924,5,17,7,0,0),
+d(1924,9,28,6,30,0),
+d(1925,5,3,7,0,0),
+d(1925,9,27,6,30,0),
+d(1926,5,2,7,0,0),
+d(1926,9,26,6,30,0),
+d(1927,5,1,5,0,0),
+d(1927,9,25,4,0,0),
+d(1928,4,29,5,0,0),
+d(1928,9,30,4,0,0),
+d(1929,4,28,5,0,0),
+d(1929,9,29,4,0,0),
+d(1930,4,27,5,0,0),
+d(1930,9,28,4,0,0),
+d(1931,4,26,5,0,0),
+d(1931,9,27,4,0,0),
+d(1932,5,1,5,0,0),
+d(1932,9,25,4,0,0),
+d(1933,4,30,5,0,0),
+d(1933,10,1,4,0,0),
+d(1934,4,29,5,0,0),
+d(1934,9,30,4,0,0),
+d(1935,4,28,5,0,0),
+d(1935,9,29,4,0,0),
+d(1936,4,26,5,0,0),
+d(1936,9,27,4,0,0),
+d(1937,4,25,5,0,0),
+d(1937,9,26,4,0,0),
+d(1938,4,24,5,0,0),
+d(1938,9,25,4,0,0),
+d(1939,4,30,5,0,0),
+d(1939,9,24,4,0,0),
+d(1940,4,28,5,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1946,4,28,7,0,0),
+d(1946,9,29,6,0,0),
+d(1947,4,27,7,0,0),
+d(1947,9,28,6,0,0),
+d(1948,4,25,7,0,0),
+d(1948,9,26,6,0,0),
+d(1949,4,24,7,0,0),
+d(1949,10,30,6,0,0),
+d(1950,4,30,7,0,0),
+d(1950,10,29,6,0,0),
+d(1951,4,29,7,0,0),
+d(1951,9,30,6,0,0),
+d(1952,4,27,7,0,0),
+d(1952,9,28,6,0,0),
+d(1953,4,26,7,0,0),
+d(1953,9,27,6,0,0),
+d(1954,4,25,7,0,0),
+d(1954,9,26,6,0,0),
+d(1955,4,24,7,0,0),
+d(1955,9,25,6,0,0),
+d(1956,4,29,7,0,0),
+d(1956,9,30,6,0,0),
+d(1957,4,28,7,0,0),
+d(1957,10,27,6,0,0),
+d(1958,4,27,7,0,0),
+d(1958,10,26,6,0,0),
+d(1959,4,26,7,0,0),
+d(1959,10,25,6,0,0),
+d(1960,4,24,7,0,0),
+d(1960,10,30,6,0,0),
+d(1961,4,30,7,0,0),
+d(1961,10,29,6,0,0),
+d(1962,4,29,7,0,0),
+d(1962,10,28,6,0,0),
+d(1963,4,28,7,0,0),
+d(1963,10,27,6,0,0),
+d(1964,4,26,7,0,0),
+d(1964,10,25,6,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,6,0,0),
+d(1966,4,24,7,0,0),
+d(1966,10,30,6,0,0),
+d(1967,4,30,7,0,0),
+d(1967,10,29,6,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,4,28,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,4,27,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Montreal = Montreal()
+
diff --git a/lib/pytz/zoneinfo/America/Montserrat.py b/lib/pytz/zoneinfo/America/Montserrat.py
new file mode 100755
index 0000000..65ba519
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Montserrat.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Montserrat.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Montserrat(DstTzInfo):
+    '''America/Montserrat timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Montserrat'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,7,1,4,9,52),
+        ]
+
+    _transition_info = [
+i(-14940,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+Montserrat = Montserrat()
+
diff --git a/lib/pytz/zoneinfo/America/Nassau.py b/lib/pytz/zoneinfo/America/Nassau.py
new file mode 100755
index 0000000..d4bcdad
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Nassau.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for America/Nassau.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Nassau(DstTzInfo):
+    '''America/Nassau timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Nassau'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,3,2,5,9,24),
+d(1964,4,26,7,0,0),
+d(1964,10,25,6,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,6,0,0),
+d(1966,4,24,7,0,0),
+d(1966,10,30,6,0,0),
+d(1967,4,30,7,0,0),
+d(1967,10,29,6,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,4,28,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,4,27,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,4,1,7,0,0),
+d(2007,10,28,6,0,0),
+d(2008,4,6,7,0,0),
+d(2008,10,26,6,0,0),
+d(2009,4,5,7,0,0),
+d(2009,10,25,6,0,0),
+d(2010,4,4,7,0,0),
+d(2010,10,31,6,0,0),
+d(2011,4,3,7,0,0),
+d(2011,10,30,6,0,0),
+d(2012,4,1,7,0,0),
+d(2012,10,28,6,0,0),
+d(2013,4,7,7,0,0),
+d(2013,10,27,6,0,0),
+d(2014,4,6,7,0,0),
+d(2014,10,26,6,0,0),
+d(2015,4,5,7,0,0),
+d(2015,10,25,6,0,0),
+d(2016,4,3,7,0,0),
+d(2016,10,30,6,0,0),
+d(2017,4,2,7,0,0),
+d(2017,10,29,6,0,0),
+d(2018,4,1,7,0,0),
+d(2018,10,28,6,0,0),
+d(2019,4,7,7,0,0),
+d(2019,10,27,6,0,0),
+d(2020,4,5,7,0,0),
+d(2020,10,25,6,0,0),
+d(2021,4,4,7,0,0),
+d(2021,10,31,6,0,0),
+d(2022,4,3,7,0,0),
+d(2022,10,30,6,0,0),
+d(2023,4,2,7,0,0),
+d(2023,10,29,6,0,0),
+d(2024,4,7,7,0,0),
+d(2024,10,27,6,0,0),
+d(2025,4,6,7,0,0),
+d(2025,10,26,6,0,0),
+d(2026,4,5,7,0,0),
+d(2026,10,25,6,0,0),
+d(2027,4,4,7,0,0),
+d(2027,10,31,6,0,0),
+d(2028,4,2,7,0,0),
+d(2028,10,29,6,0,0),
+d(2029,4,1,7,0,0),
+d(2029,10,28,6,0,0),
+d(2030,4,7,7,0,0),
+d(2030,10,27,6,0,0),
+d(2031,4,6,7,0,0),
+d(2031,10,26,6,0,0),
+d(2032,4,4,7,0,0),
+d(2032,10,31,6,0,0),
+d(2033,4,3,7,0,0),
+d(2033,10,30,6,0,0),
+d(2034,4,2,7,0,0),
+d(2034,10,29,6,0,0),
+d(2035,4,1,7,0,0),
+d(2035,10,28,6,0,0),
+d(2036,4,6,7,0,0),
+d(2036,10,26,6,0,0),
+d(2037,4,5,7,0,0),
+d(2037,10,25,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18540,0,'LMT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Nassau = Nassau()
+
diff --git a/lib/pytz/zoneinfo/America/New_York.py b/lib/pytz/zoneinfo/America/New_York.py
new file mode 100755
index 0000000..9acebd9
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/New_York.py
@@ -0,0 +1,490 @@
+'''tzinfo timezone information for America/New_York.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class New_York(DstTzInfo):
+    '''America/New_York timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/New_York'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,7,0,0),
+d(1918,10,27,6,0,0),
+d(1919,3,30,7,0,0),
+d(1919,10,26,6,0,0),
+d(1920,3,28,7,0,0),
+d(1920,10,31,6,0,0),
+d(1921,4,24,7,0,0),
+d(1921,9,25,6,0,0),
+d(1922,4,30,7,0,0),
+d(1922,9,24,6,0,0),
+d(1923,4,29,7,0,0),
+d(1923,9,30,6,0,0),
+d(1924,4,27,7,0,0),
+d(1924,9,28,6,0,0),
+d(1925,4,26,7,0,0),
+d(1925,9,27,6,0,0),
+d(1926,4,25,7,0,0),
+d(1926,9,26,6,0,0),
+d(1927,4,24,7,0,0),
+d(1927,9,25,6,0,0),
+d(1928,4,29,7,0,0),
+d(1928,9,30,6,0,0),
+d(1929,4,28,7,0,0),
+d(1929,9,29,6,0,0),
+d(1930,4,27,7,0,0),
+d(1930,9,28,6,0,0),
+d(1931,4,26,7,0,0),
+d(1931,9,27,6,0,0),
+d(1932,4,24,7,0,0),
+d(1932,9,25,6,0,0),
+d(1933,4,30,7,0,0),
+d(1933,9,24,6,0,0),
+d(1934,4,29,7,0,0),
+d(1934,9,30,6,0,0),
+d(1935,4,28,7,0,0),
+d(1935,9,29,6,0,0),
+d(1936,4,26,7,0,0),
+d(1936,9,27,6,0,0),
+d(1937,4,25,7,0,0),
+d(1937,9,26,6,0,0),
+d(1938,4,24,7,0,0),
+d(1938,9,25,6,0,0),
+d(1939,4,30,7,0,0),
+d(1939,9,24,6,0,0),
+d(1940,4,28,7,0,0),
+d(1940,9,29,6,0,0),
+d(1941,4,27,7,0,0),
+d(1941,9,28,6,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1946,4,28,7,0,0),
+d(1946,9,29,6,0,0),
+d(1947,4,27,7,0,0),
+d(1947,9,28,6,0,0),
+d(1948,4,25,7,0,0),
+d(1948,9,26,6,0,0),
+d(1949,4,24,7,0,0),
+d(1949,9,25,6,0,0),
+d(1950,4,30,7,0,0),
+d(1950,9,24,6,0,0),
+d(1951,4,29,7,0,0),
+d(1951,9,30,6,0,0),
+d(1952,4,27,7,0,0),
+d(1952,9,28,6,0,0),
+d(1953,4,26,7,0,0),
+d(1953,9,27,6,0,0),
+d(1954,4,25,7,0,0),
+d(1954,9,26,6,0,0),
+d(1955,4,24,7,0,0),
+d(1955,10,30,6,0,0),
+d(1956,4,29,7,0,0),
+d(1956,10,28,6,0,0),
+d(1957,4,28,7,0,0),
+d(1957,10,27,6,0,0),
+d(1958,4,27,7,0,0),
+d(1958,10,26,6,0,0),
+d(1959,4,26,7,0,0),
+d(1959,10,25,6,0,0),
+d(1960,4,24,7,0,0),
+d(1960,10,30,6,0,0),
+d(1961,4,30,7,0,0),
+d(1961,10,29,6,0,0),
+d(1962,4,29,7,0,0),
+d(1962,10,28,6,0,0),
+d(1963,4,28,7,0,0),
+d(1963,10,27,6,0,0),
+d(1964,4,26,7,0,0),
+d(1964,10,25,6,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,6,0,0),
+d(1966,4,24,7,0,0),
+d(1966,10,30,6,0,0),
+d(1967,4,30,7,0,0),
+d(1967,10,29,6,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+New_York = New_York()
+
diff --git a/lib/pytz/zoneinfo/America/Nipigon.py b/lib/pytz/zoneinfo/America/Nipigon.py
new file mode 100755
index 0000000..29b1397
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Nipigon.py
@@ -0,0 +1,288 @@
+'''tzinfo timezone information for America/Nipigon.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Nipigon(DstTzInfo):
+    '''America/Nipigon timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Nipigon'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,7,0,0),
+d(1918,10,31,6,0,0),
+d(1940,9,29,5,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1974,4,28,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,4,27,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Nipigon = Nipigon()
+
diff --git a/lib/pytz/zoneinfo/America/Nome.py b/lib/pytz/zoneinfo/America/Nome.py
new file mode 100755
index 0000000..5889ab2
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Nome.py
@@ -0,0 +1,306 @@
+'''tzinfo timezone information for America/Nome.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Nome(DstTzInfo):
+    '''America/Nome timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Nome'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,2,9,13,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,12,0,0),
+d(1967,4,1,11,0,0),
+d(1969,4,27,13,0,0),
+d(1969,10,26,12,0,0),
+d(1970,4,26,13,0,0),
+d(1970,10,25,12,0,0),
+d(1971,4,25,13,0,0),
+d(1971,10,31,12,0,0),
+d(1972,4,30,13,0,0),
+d(1972,10,29,12,0,0),
+d(1973,4,29,13,0,0),
+d(1973,10,28,12,0,0),
+d(1974,1,6,13,0,0),
+d(1974,10,27,12,0,0),
+d(1975,2,23,13,0,0),
+d(1975,10,26,12,0,0),
+d(1976,4,25,13,0,0),
+d(1976,10,31,12,0,0),
+d(1977,4,24,13,0,0),
+d(1977,10,30,12,0,0),
+d(1978,4,30,13,0,0),
+d(1978,10,29,12,0,0),
+d(1979,4,29,13,0,0),
+d(1979,10,28,12,0,0),
+d(1980,4,27,13,0,0),
+d(1980,10,26,12,0,0),
+d(1981,4,26,13,0,0),
+d(1981,10,25,12,0,0),
+d(1982,4,25,13,0,0),
+d(1982,10,31,12,0,0),
+d(1983,4,24,13,0,0),
+d(1983,10,30,12,0,0),
+d(1983,11,30,9,0,0),
+d(1984,4,29,11,0,0),
+d(1984,10,28,10,0,0),
+d(1985,4,28,11,0,0),
+d(1985,10,27,10,0,0),
+d(1986,4,27,11,0,0),
+d(1986,10,26,10,0,0),
+d(1987,4,5,11,0,0),
+d(1987,10,25,10,0,0),
+d(1988,4,3,11,0,0),
+d(1988,10,30,10,0,0),
+d(1989,4,2,11,0,0),
+d(1989,10,29,10,0,0),
+d(1990,4,1,11,0,0),
+d(1990,10,28,10,0,0),
+d(1991,4,7,11,0,0),
+d(1991,10,27,10,0,0),
+d(1992,4,5,11,0,0),
+d(1992,10,25,10,0,0),
+d(1993,4,4,11,0,0),
+d(1993,10,31,10,0,0),
+d(1994,4,3,11,0,0),
+d(1994,10,30,10,0,0),
+d(1995,4,2,11,0,0),
+d(1995,10,29,10,0,0),
+d(1996,4,7,11,0,0),
+d(1996,10,27,10,0,0),
+d(1997,4,6,11,0,0),
+d(1997,10,26,10,0,0),
+d(1998,4,5,11,0,0),
+d(1998,10,25,10,0,0),
+d(1999,4,4,11,0,0),
+d(1999,10,31,10,0,0),
+d(2000,4,2,11,0,0),
+d(2000,10,29,10,0,0),
+d(2001,4,1,11,0,0),
+d(2001,10,28,10,0,0),
+d(2002,4,7,11,0,0),
+d(2002,10,27,10,0,0),
+d(2003,4,6,11,0,0),
+d(2003,10,26,10,0,0),
+d(2004,4,4,11,0,0),
+d(2004,10,31,10,0,0),
+d(2005,4,3,11,0,0),
+d(2005,10,30,10,0,0),
+d(2006,4,2,11,0,0),
+d(2006,10,29,10,0,0),
+d(2007,3,11,11,0,0),
+d(2007,11,4,10,0,0),
+d(2008,3,9,11,0,0),
+d(2008,11,2,10,0,0),
+d(2009,3,8,11,0,0),
+d(2009,11,1,10,0,0),
+d(2010,3,14,11,0,0),
+d(2010,11,7,10,0,0),
+d(2011,3,13,11,0,0),
+d(2011,11,6,10,0,0),
+d(2012,3,11,11,0,0),
+d(2012,11,4,10,0,0),
+d(2013,3,10,11,0,0),
+d(2013,11,3,10,0,0),
+d(2014,3,9,11,0,0),
+d(2014,11,2,10,0,0),
+d(2015,3,8,11,0,0),
+d(2015,11,1,10,0,0),
+d(2016,3,13,11,0,0),
+d(2016,11,6,10,0,0),
+d(2017,3,12,11,0,0),
+d(2017,11,5,10,0,0),
+d(2018,3,11,11,0,0),
+d(2018,11,4,10,0,0),
+d(2019,3,10,11,0,0),
+d(2019,11,3,10,0,0),
+d(2020,3,8,11,0,0),
+d(2020,11,1,10,0,0),
+d(2021,3,14,11,0,0),
+d(2021,11,7,10,0,0),
+d(2022,3,13,11,0,0),
+d(2022,11,6,10,0,0),
+d(2023,3,12,11,0,0),
+d(2023,11,5,10,0,0),
+d(2024,3,10,11,0,0),
+d(2024,11,3,10,0,0),
+d(2025,3,9,11,0,0),
+d(2025,11,2,10,0,0),
+d(2026,3,8,11,0,0),
+d(2026,11,1,10,0,0),
+d(2027,3,14,11,0,0),
+d(2027,11,7,10,0,0),
+d(2028,3,12,11,0,0),
+d(2028,11,5,10,0,0),
+d(2029,3,11,11,0,0),
+d(2029,11,4,10,0,0),
+d(2030,3,10,11,0,0),
+d(2030,11,3,10,0,0),
+d(2031,3,9,11,0,0),
+d(2031,11,2,10,0,0),
+d(2032,3,14,11,0,0),
+d(2032,11,7,10,0,0),
+d(2033,3,13,11,0,0),
+d(2033,11,6,10,0,0),
+d(2034,3,12,11,0,0),
+d(2034,11,5,10,0,0),
+d(2035,3,11,11,0,0),
+d(2035,11,4,10,0,0),
+d(2036,3,9,11,0,0),
+d(2036,11,2,10,0,0),
+d(2037,3,8,11,0,0),
+d(2037,11,1,10,0,0),
+        ]
+
+    _transition_info = [
+i(-39600,0,'NST'),
+i(-36000,3600,'NWT'),
+i(-36000,3600,'NPT'),
+i(-39600,0,'NST'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-32400,0,'YST'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+        ]
+
+Nome = Nome()
+
diff --git a/lib/pytz/zoneinfo/America/Noronha.py b/lib/pytz/zoneinfo/America/Noronha.py
new file mode 100755
index 0000000..915773c
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Noronha.py
@@ -0,0 +1,98 @@
+'''tzinfo timezone information for America/Noronha.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Noronha(DstTzInfo):
+    '''America/Noronha timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Noronha'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,2,9,40),
+d(1931,10,3,13,0,0),
+d(1932,4,1,1,0,0),
+d(1932,10,3,2,0,0),
+d(1933,4,1,1,0,0),
+d(1949,12,1,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,12,1,2,0,0),
+d(1951,4,1,1,0,0),
+d(1951,12,1,2,0,0),
+d(1952,4,1,1,0,0),
+d(1952,12,1,2,0,0),
+d(1953,3,1,1,0,0),
+d(1963,12,9,2,0,0),
+d(1964,3,1,1,0,0),
+d(1965,1,31,2,0,0),
+d(1965,3,31,1,0,0),
+d(1965,12,1,2,0,0),
+d(1966,3,1,1,0,0),
+d(1966,11,1,2,0,0),
+d(1967,3,1,1,0,0),
+d(1967,11,1,2,0,0),
+d(1968,3,1,1,0,0),
+d(1985,11,2,2,0,0),
+d(1986,3,15,1,0,0),
+d(1986,10,25,2,0,0),
+d(1987,2,14,1,0,0),
+d(1987,10,25,2,0,0),
+d(1988,2,7,1,0,0),
+d(1988,10,16,2,0,0),
+d(1989,1,29,1,0,0),
+d(1989,10,15,2,0,0),
+d(1990,2,11,1,0,0),
+d(1999,10,3,2,0,0),
+d(2000,2,27,1,0,0),
+d(2000,10,8,2,0,0),
+d(2000,10,15,1,0,0),
+d(2001,10,14,2,0,0),
+d(2002,2,17,1,0,0),
+        ]
+
+    _transition_info = [
+i(-7800,0,'LMT'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+        ]
+
+Noronha = Noronha()
+
diff --git a/lib/pytz/zoneinfo/America/North_Dakota/Center.py b/lib/pytz/zoneinfo/America/North_Dakota/Center.py
new file mode 100755
index 0000000..e9460b6
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/North_Dakota/Center.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for America/North_Dakota/Center.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Center(DstTzInfo):
+    '''America/North_Dakota/Center timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/North_Dakota/Center'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,9,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,9,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,9,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,1,6,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,2,23,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,7,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,7,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Center = Center()
+
diff --git a/lib/pytz/zoneinfo/America/North_Dakota/New_Salem.py b/lib/pytz/zoneinfo/America/North_Dakota/New_Salem.py
new file mode 100755
index 0000000..126b5c6
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/North_Dakota/New_Salem.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for America/North_Dakota/New_Salem.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class New_Salem(DstTzInfo):
+    '''America/North_Dakota/New_Salem timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/North_Dakota/New_Salem'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,9,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,9,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,9,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,1,6,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,2,23,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+New_Salem = New_Salem()
+
diff --git a/lib/pytz/zoneinfo/America/North_Dakota/__init__.py b/lib/pytz/zoneinfo/America/North_Dakota/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/America/Panama.py b/lib/pytz/zoneinfo/America/Panama.py
new file mode 100755
index 0000000..d0f9fa7
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Panama.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Panama.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Panama(DstTzInfo):
+    '''America/Panama timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Panama'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1908,4,22,5,19,36),
+        ]
+
+    _transition_info = [
+i(-19200,0,'CMT'),
+i(-18000,0,'EST'),
+        ]
+
+Panama = Panama()
+
diff --git a/lib/pytz/zoneinfo/America/Pangnirtung.py b/lib/pytz/zoneinfo/America/Pangnirtung.py
new file mode 100755
index 0000000..79dfa10
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Pangnirtung.py
@@ -0,0 +1,270 @@
+'''tzinfo timezone information for America/Pangnirtung.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Pangnirtung(DstTzInfo):
+    '''America/Pangnirtung timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Pangnirtung'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,6,0,0),
+d(1918,10,27,5,0,0),
+d(1919,5,25,6,0,0),
+d(1919,11,1,3,0,0),
+d(1942,2,9,6,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,5,0,0),
+d(1965,4,25,4,0,0),
+d(1965,10,31,4,0,0),
+d(1980,4,27,6,0,0),
+d(1980,10,26,5,0,0),
+d(1981,4,26,6,0,0),
+d(1981,10,25,5,0,0),
+d(1982,4,25,6,0,0),
+d(1982,10,31,5,0,0),
+d(1983,4,24,6,0,0),
+d(1983,10,30,5,0,0),
+d(1984,4,29,6,0,0),
+d(1984,10,28,5,0,0),
+d(1985,4,28,6,0,0),
+d(1985,10,27,5,0,0),
+d(1986,4,27,6,0,0),
+d(1986,10,26,5,0,0),
+d(1987,4,5,6,0,0),
+d(1987,10,25,5,0,0),
+d(1988,4,3,6,0,0),
+d(1988,10,30,5,0,0),
+d(1989,4,2,6,0,0),
+d(1989,10,29,5,0,0),
+d(1990,4,1,6,0,0),
+d(1990,10,28,5,0,0),
+d(1991,4,7,6,0,0),
+d(1991,10,27,5,0,0),
+d(1992,4,5,6,0,0),
+d(1992,10,25,5,0,0),
+d(1993,4,4,6,0,0),
+d(1993,10,31,5,0,0),
+d(1994,4,3,6,0,0),
+d(1994,10,30,5,0,0),
+d(1995,4,2,6,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'AWT'),
+i(-10800,3600,'APT'),
+i(-14400,0,'AST'),
+i(-7200,7200,'ADDT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-14400,0,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Pangnirtung = Pangnirtung()
+
diff --git a/lib/pytz/zoneinfo/America/Paramaribo.py b/lib/pytz/zoneinfo/America/Paramaribo.py
new file mode 100755
index 0000000..5238f9d
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Paramaribo.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for America/Paramaribo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Paramaribo(DstTzInfo):
+    '''America/Paramaribo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Paramaribo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,1,1,3,40,40),
+d(1935,1,1,3,40,52),
+d(1945,10,1,3,40,36),
+d(1975,11,20,3,30,0),
+d(1984,10,1,3,30,0),
+        ]
+
+    _transition_info = [
+i(-13260,0,'LMT'),
+i(-13260,0,'PMT'),
+i(-13260,0,'PMT'),
+i(-12600,0,'NEGT'),
+i(-12600,0,'SRT'),
+i(-10800,0,'SRT'),
+        ]
+
+Paramaribo = Paramaribo()
+
diff --git a/lib/pytz/zoneinfo/America/Phoenix.py b/lib/pytz/zoneinfo/America/Phoenix.py
new file mode 100755
index 0000000..1cc351e
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Phoenix.py
@@ -0,0 +1,40 @@
+'''tzinfo timezone information for America/Phoenix.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Phoenix(DstTzInfo):
+    '''America/Phoenix timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Phoenix'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1942,2,9,9,0,0),
+d(1944,1,1,6,1,0),
+d(1944,4,1,7,1,0),
+d(1944,10,1,6,1,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Phoenix = Phoenix()
+
diff --git a/lib/pytz/zoneinfo/America/Port_minus_au_minus_Prince.py b/lib/pytz/zoneinfo/America/Port_minus_au_minus_Prince.py
new file mode 100755
index 0000000..248a981
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Port_minus_au_minus_Prince.py
@@ -0,0 +1,214 @@
+'''tzinfo timezone information for America/Port_minus_au_minus_Prince.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Port_minus_au_minus_Prince(DstTzInfo):
+    '''America/Port_minus_au_minus_Prince timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Port_minus_au_minus_Prince'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,1,24,16,49,0),
+d(1983,5,8,5,0,0),
+d(1983,10,30,4,0,0),
+d(1984,4,29,5,0,0),
+d(1984,10,28,4,0,0),
+d(1985,4,28,5,0,0),
+d(1985,10,27,4,0,0),
+d(1986,4,27,5,0,0),
+d(1986,10,26,4,0,0),
+d(1987,4,26,5,0,0),
+d(1987,10,25,4,0,0),
+d(1988,4,3,6,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,6,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,6,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,6,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,6,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,6,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,6,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,6,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,6,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,6,0,0),
+d(1997,10,26,6,0,0),
+d(2005,4,3,5,0,0),
+d(2005,10,30,4,0,0),
+d(2006,4,2,5,0,0),
+d(2006,10,29,4,0,0),
+d(2007,4,1,5,0,0),
+d(2007,10,28,4,0,0),
+d(2008,4,6,5,0,0),
+d(2008,10,26,4,0,0),
+d(2009,4,5,5,0,0),
+d(2009,10,25,4,0,0),
+d(2010,4,4,5,0,0),
+d(2010,10,31,4,0,0),
+d(2011,4,3,5,0,0),
+d(2011,10,30,4,0,0),
+d(2012,4,1,5,0,0),
+d(2012,10,28,4,0,0),
+d(2013,4,7,5,0,0),
+d(2013,10,27,4,0,0),
+d(2014,4,6,5,0,0),
+d(2014,10,26,4,0,0),
+d(2015,4,5,5,0,0),
+d(2015,10,25,4,0,0),
+d(2016,4,3,5,0,0),
+d(2016,10,30,4,0,0),
+d(2017,4,2,5,0,0),
+d(2017,10,29,4,0,0),
+d(2018,4,1,5,0,0),
+d(2018,10,28,4,0,0),
+d(2019,4,7,5,0,0),
+d(2019,10,27,4,0,0),
+d(2020,4,5,5,0,0),
+d(2020,10,25,4,0,0),
+d(2021,4,4,5,0,0),
+d(2021,10,31,4,0,0),
+d(2022,4,3,5,0,0),
+d(2022,10,30,4,0,0),
+d(2023,4,2,5,0,0),
+d(2023,10,29,4,0,0),
+d(2024,4,7,5,0,0),
+d(2024,10,27,4,0,0),
+d(2025,4,6,5,0,0),
+d(2025,10,26,4,0,0),
+d(2026,4,5,5,0,0),
+d(2026,10,25,4,0,0),
+d(2027,4,4,5,0,0),
+d(2027,10,31,4,0,0),
+d(2028,4,2,5,0,0),
+d(2028,10,29,4,0,0),
+d(2029,4,1,5,0,0),
+d(2029,10,28,4,0,0),
+d(2030,4,7,5,0,0),
+d(2030,10,27,4,0,0),
+d(2031,4,6,5,0,0),
+d(2031,10,26,4,0,0),
+d(2032,4,4,5,0,0),
+d(2032,10,31,4,0,0),
+d(2033,4,3,5,0,0),
+d(2033,10,30,4,0,0),
+d(2034,4,2,5,0,0),
+d(2034,10,29,4,0,0),
+d(2035,4,1,5,0,0),
+d(2035,10,28,4,0,0),
+d(2036,4,6,5,0,0),
+d(2036,10,26,4,0,0),
+d(2037,4,5,5,0,0),
+d(2037,10,25,4,0,0),
+        ]
+
+    _transition_info = [
+i(-17340,0,'PPMT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Port_minus_au_minus_Prince = Port_minus_au_minus_Prince()
+
diff --git a/lib/pytz/zoneinfo/America/Port_of_Spain.py b/lib/pytz/zoneinfo/America/Port_of_Spain.py
new file mode 100755
index 0000000..f1a37eb
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Port_of_Spain.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Port_of_Spain.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Port_of_Spain(DstTzInfo):
+    '''America/Port_of_Spain timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Port_of_Spain'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,3,2,4,6,4),
+        ]
+
+    _transition_info = [
+i(-14760,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+Port_of_Spain = Port_of_Spain()
+
diff --git a/lib/pytz/zoneinfo/America/Porto_Acre.py b/lib/pytz/zoneinfo/America/Porto_Acre.py
new file mode 100755
index 0000000..34dce66
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Porto_Acre.py
@@ -0,0 +1,78 @@
+'''tzinfo timezone information for America/Porto_Acre.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Porto_Acre(DstTzInfo):
+    '''America/Porto_Acre timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Porto_Acre'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,4,31,12),
+d(1931,10,3,16,0,0),
+d(1932,4,1,4,0,0),
+d(1932,10,3,5,0,0),
+d(1933,4,1,4,0,0),
+d(1949,12,1,5,0,0),
+d(1950,4,16,5,0,0),
+d(1950,12,1,5,0,0),
+d(1951,4,1,4,0,0),
+d(1951,12,1,5,0,0),
+d(1952,4,1,4,0,0),
+d(1952,12,1,5,0,0),
+d(1953,3,1,4,0,0),
+d(1963,12,9,5,0,0),
+d(1964,3,1,4,0,0),
+d(1965,1,31,5,0,0),
+d(1965,3,31,4,0,0),
+d(1965,12,1,5,0,0),
+d(1966,3,1,4,0,0),
+d(1966,11,1,5,0,0),
+d(1967,3,1,4,0,0),
+d(1967,11,1,5,0,0),
+d(1968,3,1,4,0,0),
+d(1985,11,2,5,0,0),
+d(1986,3,15,4,0,0),
+d(1986,10,25,5,0,0),
+d(1987,2,14,4,0,0),
+d(1987,10,25,5,0,0),
+d(1988,2,7,4,0,0),
+        ]
+
+    _transition_info = [
+i(-16260,0,'LMT'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+        ]
+
+Porto_Acre = Porto_Acre()
+
diff --git a/lib/pytz/zoneinfo/America/Porto_Velho.py b/lib/pytz/zoneinfo/America/Porto_Velho.py
new file mode 100755
index 0000000..8562089
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Porto_Velho.py
@@ -0,0 +1,78 @@
+'''tzinfo timezone information for America/Porto_Velho.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Porto_Velho(DstTzInfo):
+    '''America/Porto_Velho timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Porto_Velho'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,4,15,36),
+d(1931,10,3,15,0,0),
+d(1932,4,1,3,0,0),
+d(1932,10,3,4,0,0),
+d(1933,4,1,3,0,0),
+d(1949,12,1,4,0,0),
+d(1950,4,16,4,0,0),
+d(1950,12,1,4,0,0),
+d(1951,4,1,3,0,0),
+d(1951,12,1,4,0,0),
+d(1952,4,1,3,0,0),
+d(1952,12,1,4,0,0),
+d(1953,3,1,3,0,0),
+d(1963,12,9,4,0,0),
+d(1964,3,1,3,0,0),
+d(1965,1,31,4,0,0),
+d(1965,3,31,3,0,0),
+d(1965,12,1,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,11,1,4,0,0),
+d(1967,3,1,3,0,0),
+d(1967,11,1,4,0,0),
+d(1968,3,1,3,0,0),
+d(1985,11,2,4,0,0),
+d(1986,3,15,3,0,0),
+d(1986,10,25,4,0,0),
+d(1987,2,14,3,0,0),
+d(1987,10,25,4,0,0),
+d(1988,2,7,3,0,0),
+        ]
+
+    _transition_info = [
+i(-15360,0,'LMT'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+        ]
+
+Porto_Velho = Porto_Velho()
+
diff --git a/lib/pytz/zoneinfo/America/Puerto_Rico.py b/lib/pytz/zoneinfo/America/Puerto_Rico.py
new file mode 100755
index 0000000..ea00f20
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Puerto_Rico.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for America/Puerto_Rico.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Puerto_Rico(DstTzInfo):
+    '''America/Puerto_Rico timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Puerto_Rico'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,5,3,4,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,5,0,0),
+        ]
+
+    _transition_info = [
+i(-14400,0,'AST'),
+i(-10800,3600,'AWT'),
+i(-10800,3600,'APT'),
+i(-14400,0,'AST'),
+        ]
+
+Puerto_Rico = Puerto_Rico()
+
diff --git a/lib/pytz/zoneinfo/America/Rainy_River.py b/lib/pytz/zoneinfo/America/Rainy_River.py
new file mode 100755
index 0000000..9863d58
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Rainy_River.py
@@ -0,0 +1,288 @@
+'''tzinfo timezone information for America/Rainy_River.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rainy_River(DstTzInfo):
+    '''America/Rainy_River timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Rainy_River'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,8,0,0),
+d(1918,10,31,7,0,0),
+d(1940,9,29,6,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1974,4,28,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,4,27,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,7,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,7,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,7,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Rainy_River = Rainy_River()
+
diff --git a/lib/pytz/zoneinfo/America/Rankin_Inlet.py b/lib/pytz/zoneinfo/America/Rankin_Inlet.py
new file mode 100755
index 0000000..033c8bb
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Rankin_Inlet.py
@@ -0,0 +1,270 @@
+'''tzinfo timezone information for America/Rankin_Inlet.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rankin_Inlet(DstTzInfo):
+    '''America/Rankin_Inlet timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Rankin_Inlet'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,5,25,8,0,0),
+d(1919,11,1,5,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1965,4,25,6,0,0),
+d(1965,10,31,6,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,7,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,7,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,7,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-14400,7200,'CDDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Rankin_Inlet = Rankin_Inlet()
+
diff --git a/lib/pytz/zoneinfo/America/Recife.py b/lib/pytz/zoneinfo/America/Recife.py
new file mode 100755
index 0000000..a30a40d
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Recife.py
@@ -0,0 +1,98 @@
+'''tzinfo timezone information for America/Recife.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Recife(DstTzInfo):
+    '''America/Recife timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Recife'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,2,19,36),
+d(1931,10,3,14,0,0),
+d(1932,4,1,2,0,0),
+d(1932,10,3,3,0,0),
+d(1933,4,1,2,0,0),
+d(1949,12,1,3,0,0),
+d(1950,4,16,3,0,0),
+d(1950,12,1,3,0,0),
+d(1951,4,1,2,0,0),
+d(1951,12,1,3,0,0),
+d(1952,4,1,2,0,0),
+d(1952,12,1,3,0,0),
+d(1953,3,1,2,0,0),
+d(1963,12,9,3,0,0),
+d(1964,3,1,2,0,0),
+d(1965,1,31,3,0,0),
+d(1965,3,31,2,0,0),
+d(1965,12,1,3,0,0),
+d(1966,3,1,2,0,0),
+d(1966,11,1,3,0,0),
+d(1967,3,1,2,0,0),
+d(1967,11,1,3,0,0),
+d(1968,3,1,2,0,0),
+d(1985,11,2,3,0,0),
+d(1986,3,15,2,0,0),
+d(1986,10,25,3,0,0),
+d(1987,2,14,2,0,0),
+d(1987,10,25,3,0,0),
+d(1988,2,7,2,0,0),
+d(1988,10,16,3,0,0),
+d(1989,1,29,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,2,11,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,2,27,2,0,0),
+d(2000,10,8,3,0,0),
+d(2000,10,15,2,0,0),
+d(2001,10,14,3,0,0),
+d(2002,2,17,2,0,0),
+        ]
+
+    _transition_info = [
+i(-8400,0,'LMT'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+        ]
+
+Recife = Recife()
+
diff --git a/lib/pytz/zoneinfo/America/Regina.py b/lib/pytz/zoneinfo/America/Regina.py
new file mode 100755
index 0000000..08b11ab
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Regina.py
@@ -0,0 +1,126 @@
+'''tzinfo timezone information for America/Regina.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Regina(DstTzInfo):
+    '''America/Regina timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Regina'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,9,1,6,58,36),
+d(1918,4,14,9,0,0),
+d(1918,10,31,8,0,0),
+d(1930,5,4,7,0,0),
+d(1930,10,5,6,0,0),
+d(1931,5,3,7,0,0),
+d(1931,10,4,6,0,0),
+d(1932,5,1,7,0,0),
+d(1932,10,2,6,0,0),
+d(1933,5,7,7,0,0),
+d(1933,10,1,6,0,0),
+d(1934,5,6,7,0,0),
+d(1934,10,7,6,0,0),
+d(1937,4,11,7,0,0),
+d(1937,10,10,6,0,0),
+d(1938,4,10,7,0,0),
+d(1938,10,2,6,0,0),
+d(1939,4,9,7,0,0),
+d(1939,10,8,6,0,0),
+d(1940,4,14,7,0,0),
+d(1940,10,13,6,0,0),
+d(1941,4,13,7,0,0),
+d(1941,10,12,6,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1946,4,14,9,0,0),
+d(1946,10,13,8,0,0),
+d(1947,4,27,9,0,0),
+d(1947,9,28,8,0,0),
+d(1948,4,25,9,0,0),
+d(1948,9,26,8,0,0),
+d(1949,4,24,9,0,0),
+d(1949,9,25,8,0,0),
+d(1950,4,30,9,0,0),
+d(1950,9,24,8,0,0),
+d(1951,4,29,9,0,0),
+d(1951,9,30,8,0,0),
+d(1952,4,27,9,0,0),
+d(1952,9,28,8,0,0),
+d(1953,4,26,9,0,0),
+d(1953,9,27,8,0,0),
+d(1954,4,25,9,0,0),
+d(1954,9,26,8,0,0),
+d(1955,4,24,9,0,0),
+d(1955,9,25,8,0,0),
+d(1956,4,29,9,0,0),
+d(1956,9,30,8,0,0),
+d(1957,4,28,9,0,0),
+d(1957,9,29,8,0,0),
+d(1959,4,26,9,0,0),
+d(1959,10,25,8,0,0),
+d(1960,4,24,9,0,0),
+        ]
+
+    _transition_info = [
+i(-25140,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+        ]
+
+Regina = Regina()
+
diff --git a/lib/pytz/zoneinfo/America/Rio_Branco.py b/lib/pytz/zoneinfo/America/Rio_Branco.py
new file mode 100755
index 0000000..14b71dd
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Rio_Branco.py
@@ -0,0 +1,78 @@
+'''tzinfo timezone information for America/Rio_Branco.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rio_Branco(DstTzInfo):
+    '''America/Rio_Branco timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Rio_Branco'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,4,31,12),
+d(1931,10,3,16,0,0),
+d(1932,4,1,4,0,0),
+d(1932,10,3,5,0,0),
+d(1933,4,1,4,0,0),
+d(1949,12,1,5,0,0),
+d(1950,4,16,5,0,0),
+d(1950,12,1,5,0,0),
+d(1951,4,1,4,0,0),
+d(1951,12,1,5,0,0),
+d(1952,4,1,4,0,0),
+d(1952,12,1,5,0,0),
+d(1953,3,1,4,0,0),
+d(1963,12,9,5,0,0),
+d(1964,3,1,4,0,0),
+d(1965,1,31,5,0,0),
+d(1965,3,31,4,0,0),
+d(1965,12,1,5,0,0),
+d(1966,3,1,4,0,0),
+d(1966,11,1,5,0,0),
+d(1967,3,1,4,0,0),
+d(1967,11,1,5,0,0),
+d(1968,3,1,4,0,0),
+d(1985,11,2,5,0,0),
+d(1986,3,15,4,0,0),
+d(1986,10,25,5,0,0),
+d(1987,2,14,4,0,0),
+d(1987,10,25,5,0,0),
+d(1988,2,7,4,0,0),
+        ]
+
+    _transition_info = [
+i(-16260,0,'LMT'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+        ]
+
+Rio_Branco = Rio_Branco()
+
diff --git a/lib/pytz/zoneinfo/America/Rosario.py b/lib/pytz/zoneinfo/America/Rosario.py
new file mode 100755
index 0000000..a0aaa92
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Rosario.py
@@ -0,0 +1,132 @@
+'''tzinfo timezone information for America/Rosario.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rosario(DstTzInfo):
+    '''America/Rosario timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Rosario'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,5,1,4,16,48),
+d(1930,12,1,4,0,0),
+d(1931,4,1,3,0,0),
+d(1931,10,15,4,0,0),
+d(1932,3,1,3,0,0),
+d(1932,11,1,4,0,0),
+d(1933,3,1,3,0,0),
+d(1933,11,1,4,0,0),
+d(1934,3,1,3,0,0),
+d(1934,11,1,4,0,0),
+d(1935,3,1,3,0,0),
+d(1935,11,1,4,0,0),
+d(1936,3,1,3,0,0),
+d(1936,11,1,4,0,0),
+d(1937,3,1,3,0,0),
+d(1937,11,1,4,0,0),
+d(1938,3,1,3,0,0),
+d(1938,11,1,4,0,0),
+d(1939,3,1,3,0,0),
+d(1939,11,1,4,0,0),
+d(1940,3,1,3,0,0),
+d(1940,7,1,4,0,0),
+d(1941,6,15,3,0,0),
+d(1941,10,15,4,0,0),
+d(1943,8,1,3,0,0),
+d(1943,10,15,4,0,0),
+d(1946,3,1,3,0,0),
+d(1946,10,1,4,0,0),
+d(1963,10,1,3,0,0),
+d(1963,12,15,4,0,0),
+d(1964,3,1,3,0,0),
+d(1964,10,15,4,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1988,12,1,3,0,0),
+d(1989,3,5,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,3,4,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,3,3,2,0,0),
+d(1991,10,20,4,0,0),
+d(1992,3,1,2,0,0),
+d(1992,10,18,3,0,0),
+d(1993,3,7,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,3,3,3,0,0),
+        ]
+
+    _transition_info = [
+i(-15420,0,'CMT'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-14400,0,'WART'),
+i(-7200,7200,'ARST'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-10800,0,'ARST'),
+i(-10800,0,'ART'),
+        ]
+
+Rosario = Rosario()
+
diff --git a/lib/pytz/zoneinfo/America/Santiago.py b/lib/pytz/zoneinfo/America/Santiago.py
new file mode 100755
index 0000000..120190d
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Santiago.py
@@ -0,0 +1,336 @@
+'''tzinfo timezone information for America/Santiago.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Santiago(DstTzInfo):
+    '''America/Santiago timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Santiago'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1910,1,1,4,42,46),
+d(1916,7,1,5,0,0),
+d(1918,9,1,4,42,46),
+d(1919,7,1,4,0,0),
+d(1927,9,1,4,42,46),
+d(1928,4,1,4,0,0),
+d(1928,9,1,5,0,0),
+d(1929,4,1,4,0,0),
+d(1929,9,1,5,0,0),
+d(1930,4,1,4,0,0),
+d(1930,9,1,5,0,0),
+d(1931,4,1,4,0,0),
+d(1931,9,1,5,0,0),
+d(1932,4,1,4,0,0),
+d(1932,9,1,5,0,0),
+d(1942,6,1,4,0,0),
+d(1942,8,1,5,0,0),
+d(1946,9,1,3,0,0),
+d(1947,5,22,5,0,0),
+d(1968,11,3,4,0,0),
+d(1969,3,30,3,0,0),
+d(1969,11,23,4,0,0),
+d(1970,3,29,3,0,0),
+d(1970,10,11,4,0,0),
+d(1971,3,14,3,0,0),
+d(1971,10,10,4,0,0),
+d(1972,3,12,3,0,0),
+d(1972,10,15,4,0,0),
+d(1973,3,11,3,0,0),
+d(1973,9,30,4,0,0),
+d(1974,3,10,3,0,0),
+d(1974,10,13,4,0,0),
+d(1975,3,9,3,0,0),
+d(1975,10,12,4,0,0),
+d(1976,3,14,3,0,0),
+d(1976,10,10,4,0,0),
+d(1977,3,13,3,0,0),
+d(1977,10,9,4,0,0),
+d(1978,3,12,3,0,0),
+d(1978,10,15,4,0,0),
+d(1979,3,11,3,0,0),
+d(1979,10,14,4,0,0),
+d(1980,3,9,3,0,0),
+d(1980,10,12,4,0,0),
+d(1981,3,15,3,0,0),
+d(1981,10,11,4,0,0),
+d(1982,3,14,3,0,0),
+d(1982,10,10,4,0,0),
+d(1983,3,13,3,0,0),
+d(1983,10,9,4,0,0),
+d(1984,3,11,3,0,0),
+d(1984,10,14,4,0,0),
+d(1985,3,10,3,0,0),
+d(1985,10,13,4,0,0),
+d(1986,3,9,3,0,0),
+d(1986,10,12,4,0,0),
+d(1987,4,12,3,0,0),
+d(1987,10,11,4,0,0),
+d(1988,3,13,3,0,0),
+d(1988,10,2,4,0,0),
+d(1989,3,12,3,0,0),
+d(1989,10,15,4,0,0),
+d(1990,3,18,3,0,0),
+d(1990,9,16,4,0,0),
+d(1991,3,10,3,0,0),
+d(1991,10,13,4,0,0),
+d(1992,3,15,3,0,0),
+d(1992,10,11,4,0,0),
+d(1993,3,14,3,0,0),
+d(1993,10,10,4,0,0),
+d(1994,3,13,3,0,0),
+d(1994,10,9,4,0,0),
+d(1995,3,12,3,0,0),
+d(1995,10,15,4,0,0),
+d(1996,3,10,3,0,0),
+d(1996,10,13,4,0,0),
+d(1997,3,30,3,0,0),
+d(1997,10,12,4,0,0),
+d(1998,3,15,3,0,0),
+d(1998,9,27,4,0,0),
+d(1999,4,4,3,0,0),
+d(1999,10,10,4,0,0),
+d(2000,3,12,3,0,0),
+d(2000,10,15,4,0,0),
+d(2001,3,11,3,0,0),
+d(2001,10,14,4,0,0),
+d(2002,3,10,3,0,0),
+d(2002,10,13,4,0,0),
+d(2003,3,9,3,0,0),
+d(2003,10,12,4,0,0),
+d(2004,3,14,3,0,0),
+d(2004,10,10,4,0,0),
+d(2005,3,13,3,0,0),
+d(2005,10,9,4,0,0),
+d(2006,3,12,3,0,0),
+d(2006,10,15,4,0,0),
+d(2007,3,11,3,0,0),
+d(2007,10,14,4,0,0),
+d(2008,3,9,3,0,0),
+d(2008,10,12,4,0,0),
+d(2009,3,15,3,0,0),
+d(2009,10,11,4,0,0),
+d(2010,3,14,3,0,0),
+d(2010,10,10,4,0,0),
+d(2011,3,13,3,0,0),
+d(2011,10,9,4,0,0),
+d(2012,3,11,3,0,0),
+d(2012,10,14,4,0,0),
+d(2013,3,10,3,0,0),
+d(2013,10,13,4,0,0),
+d(2014,3,9,3,0,0),
+d(2014,10,12,4,0,0),
+d(2015,3,15,3,0,0),
+d(2015,10,11,4,0,0),
+d(2016,3,13,3,0,0),
+d(2016,10,9,4,0,0),
+d(2017,3,12,3,0,0),
+d(2017,10,15,4,0,0),
+d(2018,3,11,3,0,0),
+d(2018,10,14,4,0,0),
+d(2019,3,10,3,0,0),
+d(2019,10,13,4,0,0),
+d(2020,3,15,3,0,0),
+d(2020,10,11,4,0,0),
+d(2021,3,14,3,0,0),
+d(2021,10,10,4,0,0),
+d(2022,3,13,3,0,0),
+d(2022,10,9,4,0,0),
+d(2023,3,12,3,0,0),
+d(2023,10,15,4,0,0),
+d(2024,3,10,3,0,0),
+d(2024,10,13,4,0,0),
+d(2025,3,9,3,0,0),
+d(2025,10,12,4,0,0),
+d(2026,3,15,3,0,0),
+d(2026,10,11,4,0,0),
+d(2027,3,14,3,0,0),
+d(2027,10,10,4,0,0),
+d(2028,3,12,3,0,0),
+d(2028,10,15,4,0,0),
+d(2029,3,11,3,0,0),
+d(2029,10,14,4,0,0),
+d(2030,3,10,3,0,0),
+d(2030,10,13,4,0,0),
+d(2031,3,9,3,0,0),
+d(2031,10,12,4,0,0),
+d(2032,3,14,3,0,0),
+d(2032,10,10,4,0,0),
+d(2033,3,13,3,0,0),
+d(2033,10,9,4,0,0),
+d(2034,3,12,3,0,0),
+d(2034,10,15,4,0,0),
+d(2035,3,11,3,0,0),
+d(2035,10,14,4,0,0),
+d(2036,3,9,3,0,0),
+d(2036,10,12,4,0,0),
+d(2037,3,15,3,0,0),
+d(2037,10,11,4,0,0),
+        ]
+
+    _transition_info = [
+i(-16980,0,'SMT'),
+i(-18000,0,'CLT'),
+i(-16980,0,'SMT'),
+i(-14400,0,'CLT'),
+i(-16980,0,'SMT'),
+i(-14400,2580,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+        ]
+
+Santiago = Santiago()
+
diff --git a/lib/pytz/zoneinfo/America/Santo_Domingo.py b/lib/pytz/zoneinfo/America/Santo_Domingo.py
new file mode 100755
index 0000000..6396373
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Santo_Domingo.py
@@ -0,0 +1,52 @@
+'''tzinfo timezone information for America/Santo_Domingo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Santo_Domingo(DstTzInfo):
+    '''America/Santo_Domingo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Santo_Domingo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1933,4,1,16,40,0),
+d(1966,10,30,5,0,0),
+d(1967,2,28,4,0,0),
+d(1969,10,26,5,0,0),
+d(1970,2,21,4,30,0),
+d(1970,10,25,5,0,0),
+d(1971,1,20,4,30,0),
+d(1971,10,31,5,0,0),
+d(1972,1,21,4,30,0),
+d(1972,10,29,5,0,0),
+d(1973,1,21,4,30,0),
+d(1973,10,28,5,0,0),
+d(1974,1,21,4,30,0),
+d(1974,10,27,5,0,0),
+d(2000,10,29,6,0,0),
+d(2000,12,3,6,0,0),
+        ]
+
+    _transition_info = [
+i(-16800,0,'SDMT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-16200,1800,'EHDT'),
+i(-18000,0,'EST'),
+i(-16200,1800,'EHDT'),
+i(-18000,0,'EST'),
+i(-16200,1800,'EHDT'),
+i(-18000,0,'EST'),
+i(-16200,1800,'EHDT'),
+i(-18000,0,'EST'),
+i(-16200,1800,'EHDT'),
+i(-18000,0,'EST'),
+i(-14400,0,'AST'),
+i(-18000,0,'EST'),
+i(-14400,0,'AST'),
+        ]
+
+Santo_Domingo = Santo_Domingo()
+
diff --git a/lib/pytz/zoneinfo/America/Sao_Paulo.py b/lib/pytz/zoneinfo/America/Sao_Paulo.py
new file mode 100755
index 0000000..d1e8c19
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Sao_Paulo.py
@@ -0,0 +1,276 @@
+'''tzinfo timezone information for America/Sao_Paulo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Sao_Paulo(DstTzInfo):
+    '''America/Sao_Paulo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Sao_Paulo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,3,6,28),
+d(1931,10,3,14,0,0),
+d(1932,4,1,2,0,0),
+d(1932,10,3,3,0,0),
+d(1933,4,1,2,0,0),
+d(1949,12,1,3,0,0),
+d(1950,4,16,3,0,0),
+d(1950,12,1,3,0,0),
+d(1951,4,1,2,0,0),
+d(1951,12,1,3,0,0),
+d(1952,4,1,2,0,0),
+d(1952,12,1,3,0,0),
+d(1953,3,1,2,0,0),
+d(1963,10,23,3,0,0),
+d(1964,3,1,2,0,0),
+d(1965,1,31,3,0,0),
+d(1965,3,31,2,0,0),
+d(1965,12,1,3,0,0),
+d(1966,3,1,2,0,0),
+d(1966,11,1,3,0,0),
+d(1967,3,1,2,0,0),
+d(1967,11,1,3,0,0),
+d(1968,3,1,2,0,0),
+d(1985,11,2,3,0,0),
+d(1986,3,15,2,0,0),
+d(1986,10,25,3,0,0),
+d(1987,2,14,2,0,0),
+d(1987,10,25,3,0,0),
+d(1988,2,7,2,0,0),
+d(1988,10,16,3,0,0),
+d(1989,1,29,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,2,11,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,2,17,2,0,0),
+d(1991,10,20,3,0,0),
+d(1992,2,9,2,0,0),
+d(1992,10,25,3,0,0),
+d(1993,1,31,2,0,0),
+d(1993,10,17,3,0,0),
+d(1994,2,20,2,0,0),
+d(1994,10,16,3,0,0),
+d(1995,2,19,2,0,0),
+d(1995,10,15,3,0,0),
+d(1996,2,11,2,0,0),
+d(1996,10,6,3,0,0),
+d(1997,2,16,2,0,0),
+d(1997,10,6,3,0,0),
+d(1998,3,1,2,0,0),
+d(1998,10,11,3,0,0),
+d(1999,2,21,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,2,27,2,0,0),
+d(2000,10,8,3,0,0),
+d(2001,2,18,2,0,0),
+d(2001,10,14,3,0,0),
+d(2002,2,17,2,0,0),
+d(2002,11,3,3,0,0),
+d(2003,2,16,2,0,0),
+d(2003,10,19,3,0,0),
+d(2004,2,15,2,0,0),
+d(2004,11,2,3,0,0),
+d(2005,2,20,2,0,0),
+d(2005,10,16,3,0,0),
+d(2006,2,19,2,0,0),
+d(2006,11,5,3,0,0),
+d(2007,2,25,2,0,0),
+d(2007,11,4,3,0,0),
+d(2008,2,24,2,0,0),
+d(2008,11,2,3,0,0),
+d(2009,2,22,2,0,0),
+d(2009,11,1,3,0,0),
+d(2010,2,28,2,0,0),
+d(2010,11,7,3,0,0),
+d(2011,2,27,2,0,0),
+d(2011,11,6,3,0,0),
+d(2012,2,26,2,0,0),
+d(2012,11,4,3,0,0),
+d(2013,2,24,2,0,0),
+d(2013,11,3,3,0,0),
+d(2014,2,23,2,0,0),
+d(2014,11,2,3,0,0),
+d(2015,2,22,2,0,0),
+d(2015,11,1,3,0,0),
+d(2016,2,28,2,0,0),
+d(2016,11,6,3,0,0),
+d(2017,2,26,2,0,0),
+d(2017,11,5,3,0,0),
+d(2018,2,25,2,0,0),
+d(2018,11,4,3,0,0),
+d(2019,2,24,2,0,0),
+d(2019,11,3,3,0,0),
+d(2020,2,23,2,0,0),
+d(2020,11,1,3,0,0),
+d(2021,2,28,2,0,0),
+d(2021,11,7,3,0,0),
+d(2022,2,27,2,0,0),
+d(2022,11,6,3,0,0),
+d(2023,2,26,2,0,0),
+d(2023,11,5,3,0,0),
+d(2024,2,25,2,0,0),
+d(2024,11,3,3,0,0),
+d(2025,2,23,2,0,0),
+d(2025,11,2,3,0,0),
+d(2026,2,22,2,0,0),
+d(2026,11,1,3,0,0),
+d(2027,2,28,2,0,0),
+d(2027,11,7,3,0,0),
+d(2028,2,27,2,0,0),
+d(2028,11,5,3,0,0),
+d(2029,2,25,2,0,0),
+d(2029,11,4,3,0,0),
+d(2030,2,24,2,0,0),
+d(2030,11,3,3,0,0),
+d(2031,2,23,2,0,0),
+d(2031,11,2,3,0,0),
+d(2032,2,29,2,0,0),
+d(2032,11,7,3,0,0),
+d(2033,2,27,2,0,0),
+d(2033,11,6,3,0,0),
+d(2034,2,26,2,0,0),
+d(2034,11,5,3,0,0),
+d(2035,2,25,2,0,0),
+d(2035,11,4,3,0,0),
+d(2036,2,24,2,0,0),
+d(2036,11,2,3,0,0),
+d(2037,2,22,2,0,0),
+d(2037,11,1,3,0,0),
+        ]
+
+    _transition_info = [
+i(-11160,0,'LMT'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+        ]
+
+Sao_Paulo = Sao_Paulo()
+
diff --git a/lib/pytz/zoneinfo/America/Scoresbysund.py b/lib/pytz/zoneinfo/America/Scoresbysund.py
new file mode 100755
index 0000000..4beb56c
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Scoresbysund.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for America/Scoresbysund.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Scoresbysund(DstTzInfo):
+    '''America/Scoresbysund timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Scoresbysund'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,7,28,1,27,52),
+d(1980,4,6,4,0,0),
+d(1980,9,28,4,0,0),
+d(1981,3,29,2,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-5280,0,'LMT'),
+i(-7200,0,'CGT'),
+i(-3600,3600,'CGST'),
+i(-7200,0,'CGT'),
+i(0,7200,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+i(0,3600,'EGST'),
+i(-3600,0,'EGT'),
+        ]
+
+Scoresbysund = Scoresbysund()
+
diff --git a/lib/pytz/zoneinfo/America/Shiprock.py b/lib/pytz/zoneinfo/America/Shiprock.py
new file mode 100755
index 0000000..2a3e4d0
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Shiprock.py
@@ -0,0 +1,334 @@
+'''tzinfo timezone information for America/Shiprock.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Shiprock(DstTzInfo):
+    '''America/Shiprock timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Shiprock'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1920,3,28,9,0,0),
+d(1920,10,31,8,0,0),
+d(1921,3,27,9,0,0),
+d(1921,5,22,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1965,4,25,9,0,0),
+d(1965,10,31,8,0,0),
+d(1966,4,24,9,0,0),
+d(1966,10,30,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,9,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,9,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,9,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,1,6,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,2,23,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Shiprock = Shiprock()
+
diff --git a/lib/pytz/zoneinfo/America/St_Johns.py b/lib/pytz/zoneinfo/America/St_Johns.py
new file mode 100755
index 0000000..48fd33d
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/St_Johns.py
@@ -0,0 +1,496 @@
+'''tzinfo timezone information for America/St_Johns.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class St_Johns(DstTzInfo):
+    '''America/St_Johns timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/St_Johns'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,4,8,5,30,52),
+d(1917,9,17,4,30,52),
+d(1918,4,14,5,30,52),
+d(1918,10,31,4,30,52),
+d(1919,5,6,2,30,52),
+d(1919,8,13,1,30,52),
+d(1920,5,3,2,30,52),
+d(1920,11,1,1,30,52),
+d(1921,5,2,2,30,52),
+d(1921,10,31,1,30,52),
+d(1922,5,8,2,30,52),
+d(1922,10,30,1,30,52),
+d(1923,5,7,2,30,52),
+d(1923,10,29,1,30,52),
+d(1924,5,5,2,30,52),
+d(1924,10,27,1,30,52),
+d(1925,5,4,2,30,52),
+d(1925,10,26,1,30,52),
+d(1926,5,3,2,30,52),
+d(1926,11,1,1,30,52),
+d(1927,5,2,2,30,52),
+d(1927,10,31,1,30,52),
+d(1928,5,7,2,30,52),
+d(1928,10,29,1,30,52),
+d(1929,5,6,2,30,52),
+d(1929,10,28,1,30,52),
+d(1930,5,5,2,30,52),
+d(1930,10,27,1,30,52),
+d(1931,5,4,2,30,52),
+d(1931,10,26,1,30,52),
+d(1932,5,2,2,30,52),
+d(1932,10,31,1,30,52),
+d(1933,5,8,2,30,52),
+d(1933,10,30,1,30,52),
+d(1934,5,7,2,30,52),
+d(1934,10,29,1,30,52),
+d(1935,3,30,3,30,52),
+d(1935,5,6,2,30,0),
+d(1935,10,28,1,30,0),
+d(1936,5,11,3,30,0),
+d(1936,10,5,2,30,0),
+d(1937,5,10,3,30,0),
+d(1937,10,4,2,30,0),
+d(1938,5,9,3,30,0),
+d(1938,10,3,2,30,0),
+d(1939,5,15,3,30,0),
+d(1939,10,2,2,30,0),
+d(1940,5,13,3,30,0),
+d(1940,10,7,2,30,0),
+d(1941,5,12,3,30,0),
+d(1941,10,6,2,30,0),
+d(1942,5,11,3,30,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,4,30,0),
+d(1946,5,12,5,30,0),
+d(1946,10,6,4,30,0),
+d(1947,5,11,5,30,0),
+d(1947,10,5,4,30,0),
+d(1948,5,9,5,30,0),
+d(1948,10,3,4,30,0),
+d(1949,5,8,5,30,0),
+d(1949,10,2,4,30,0),
+d(1950,5,14,5,30,0),
+d(1950,10,8,4,30,0),
+d(1951,4,29,5,30,0),
+d(1951,9,30,4,30,0),
+d(1952,4,27,5,30,0),
+d(1952,9,28,4,30,0),
+d(1953,4,26,5,30,0),
+d(1953,9,27,4,30,0),
+d(1954,4,25,5,30,0),
+d(1954,9,26,4,30,0),
+d(1955,4,24,5,30,0),
+d(1955,9,25,4,30,0),
+d(1956,4,29,5,30,0),
+d(1956,9,30,4,30,0),
+d(1957,4,28,5,30,0),
+d(1957,9,29,4,30,0),
+d(1958,4,27,5,30,0),
+d(1958,9,28,4,30,0),
+d(1959,4,26,5,30,0),
+d(1959,9,27,4,30,0),
+d(1960,4,24,5,30,0),
+d(1960,10,30,4,30,0),
+d(1961,4,30,5,30,0),
+d(1961,10,29,4,30,0),
+d(1962,4,29,5,30,0),
+d(1962,10,28,4,30,0),
+d(1963,4,28,5,30,0),
+d(1963,10,27,4,30,0),
+d(1964,4,26,5,30,0),
+d(1964,10,25,4,30,0),
+d(1965,4,25,5,30,0),
+d(1965,10,31,4,30,0),
+d(1966,4,24,5,30,0),
+d(1966,10,30,4,30,0),
+d(1967,4,30,5,30,0),
+d(1967,10,29,4,30,0),
+d(1968,4,28,5,30,0),
+d(1968,10,27,4,30,0),
+d(1969,4,27,5,30,0),
+d(1969,10,26,4,30,0),
+d(1970,4,26,5,30,0),
+d(1970,10,25,4,30,0),
+d(1971,4,25,5,30,0),
+d(1971,10,31,4,30,0),
+d(1972,4,30,5,30,0),
+d(1972,10,29,4,30,0),
+d(1973,4,29,5,30,0),
+d(1973,10,28,4,30,0),
+d(1974,4,28,5,30,0),
+d(1974,10,27,4,30,0),
+d(1975,4,27,5,30,0),
+d(1975,10,26,4,30,0),
+d(1976,4,25,5,30,0),
+d(1976,10,31,4,30,0),
+d(1977,4,24,5,30,0),
+d(1977,10,30,4,30,0),
+d(1978,4,30,5,30,0),
+d(1978,10,29,4,30,0),
+d(1979,4,29,5,30,0),
+d(1979,10,28,4,30,0),
+d(1980,4,27,5,30,0),
+d(1980,10,26,4,30,0),
+d(1981,4,26,5,30,0),
+d(1981,10,25,4,30,0),
+d(1982,4,25,5,30,0),
+d(1982,10,31,4,30,0),
+d(1983,4,24,5,30,0),
+d(1983,10,30,4,30,0),
+d(1984,4,29,5,30,0),
+d(1984,10,28,4,30,0),
+d(1985,4,28,5,30,0),
+d(1985,10,27,4,30,0),
+d(1986,4,27,5,30,0),
+d(1986,10,26,4,30,0),
+d(1987,4,5,3,31,0),
+d(1987,10,25,2,31,0),
+d(1988,4,3,3,31,0),
+d(1988,10,30,1,31,0),
+d(1989,4,2,3,31,0),
+d(1989,10,29,2,31,0),
+d(1990,4,1,3,31,0),
+d(1990,10,28,2,31,0),
+d(1991,4,7,3,31,0),
+d(1991,10,27,2,31,0),
+d(1992,4,5,3,31,0),
+d(1992,10,25,2,31,0),
+d(1993,4,4,3,31,0),
+d(1993,10,31,2,31,0),
+d(1994,4,3,3,31,0),
+d(1994,10,30,2,31,0),
+d(1995,4,2,3,31,0),
+d(1995,10,29,2,31,0),
+d(1996,4,7,3,31,0),
+d(1996,10,27,2,31,0),
+d(1997,4,6,3,31,0),
+d(1997,10,26,2,31,0),
+d(1998,4,5,3,31,0),
+d(1998,10,25,2,31,0),
+d(1999,4,4,3,31,0),
+d(1999,10,31,2,31,0),
+d(2000,4,2,3,31,0),
+d(2000,10,29,2,31,0),
+d(2001,4,1,3,31,0),
+d(2001,10,28,2,31,0),
+d(2002,4,7,3,31,0),
+d(2002,10,27,2,31,0),
+d(2003,4,6,3,31,0),
+d(2003,10,26,2,31,0),
+d(2004,4,4,3,31,0),
+d(2004,10,31,2,31,0),
+d(2005,4,3,3,31,0),
+d(2005,10,30,2,31,0),
+d(2006,4,2,3,31,0),
+d(2006,10,29,2,31,0),
+d(2007,3,11,3,31,0),
+d(2007,11,4,2,31,0),
+d(2008,3,9,3,31,0),
+d(2008,11,2,2,31,0),
+d(2009,3,8,3,31,0),
+d(2009,11,1,2,31,0),
+d(2010,3,14,3,31,0),
+d(2010,11,7,2,31,0),
+d(2011,3,13,3,31,0),
+d(2011,11,6,2,31,0),
+d(2012,3,11,3,31,0),
+d(2012,11,4,2,31,0),
+d(2013,3,10,3,31,0),
+d(2013,11,3,2,31,0),
+d(2014,3,9,3,31,0),
+d(2014,11,2,2,31,0),
+d(2015,3,8,3,31,0),
+d(2015,11,1,2,31,0),
+d(2016,3,13,3,31,0),
+d(2016,11,6,2,31,0),
+d(2017,3,12,3,31,0),
+d(2017,11,5,2,31,0),
+d(2018,3,11,3,31,0),
+d(2018,11,4,2,31,0),
+d(2019,3,10,3,31,0),
+d(2019,11,3,2,31,0),
+d(2020,3,8,3,31,0),
+d(2020,11,1,2,31,0),
+d(2021,3,14,3,31,0),
+d(2021,11,7,2,31,0),
+d(2022,3,13,3,31,0),
+d(2022,11,6,2,31,0),
+d(2023,3,12,3,31,0),
+d(2023,11,5,2,31,0),
+d(2024,3,10,3,31,0),
+d(2024,11,3,2,31,0),
+d(2025,3,9,3,31,0),
+d(2025,11,2,2,31,0),
+d(2026,3,8,3,31,0),
+d(2026,11,1,2,31,0),
+d(2027,3,14,3,31,0),
+d(2027,11,7,2,31,0),
+d(2028,3,12,3,31,0),
+d(2028,11,5,2,31,0),
+d(2029,3,11,3,31,0),
+d(2029,11,4,2,31,0),
+d(2030,3,10,3,31,0),
+d(2030,11,3,2,31,0),
+d(2031,3,9,3,31,0),
+d(2031,11,2,2,31,0),
+d(2032,3,14,3,31,0),
+d(2032,11,7,2,31,0),
+d(2033,3,13,3,31,0),
+d(2033,11,6,2,31,0),
+d(2034,3,12,3,31,0),
+d(2034,11,5,2,31,0),
+d(2035,3,11,3,31,0),
+d(2035,11,4,2,31,0),
+d(2036,3,9,3,31,0),
+d(2036,11,2,2,31,0),
+d(2037,3,8,3,31,0),
+d(2037,11,1,2,31,0),
+        ]
+
+    _transition_info = [
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NWT'),
+i(-9000,3600,'NPT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-5400,7200,'NDDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+        ]
+
+St_Johns = St_Johns()
+
diff --git a/lib/pytz/zoneinfo/America/St_Kitts.py b/lib/pytz/zoneinfo/America/St_Kitts.py
new file mode 100755
index 0000000..6092919
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/St_Kitts.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/St_Kitts.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class St_Kitts(DstTzInfo):
+    '''America/St_Kitts timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/St_Kitts'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,3,2,4,10,52),
+        ]
+
+    _transition_info = [
+i(-15060,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+St_Kitts = St_Kitts()
+
diff --git a/lib/pytz/zoneinfo/America/St_Lucia.py b/lib/pytz/zoneinfo/America/St_Lucia.py
new file mode 100755
index 0000000..ae78513
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/St_Lucia.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/St_Lucia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class St_Lucia(DstTzInfo):
+    '''America/St_Lucia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/St_Lucia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,4,4,0),
+        ]
+
+    _transition_info = [
+i(-14640,0,'CMT'),
+i(-14400,0,'AST'),
+        ]
+
+St_Lucia = St_Lucia()
+
diff --git a/lib/pytz/zoneinfo/America/St_Thomas.py b/lib/pytz/zoneinfo/America/St_Thomas.py
new file mode 100755
index 0000000..4367e35
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/St_Thomas.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/St_Thomas.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class St_Thomas(DstTzInfo):
+    '''America/St_Thomas timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/St_Thomas'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,7,1,4,19,44),
+        ]
+
+    _transition_info = [
+i(-15600,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+St_Thomas = St_Thomas()
+
diff --git a/lib/pytz/zoneinfo/America/St_Vincent.py b/lib/pytz/zoneinfo/America/St_Vincent.py
new file mode 100755
index 0000000..fca39da
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/St_Vincent.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/St_Vincent.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class St_Vincent(DstTzInfo):
+    '''America/St_Vincent timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/St_Vincent'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,4,4,56),
+        ]
+
+    _transition_info = [
+i(-14700,0,'KMT'),
+i(-14400,0,'AST'),
+        ]
+
+St_Vincent = St_Vincent()
+
diff --git a/lib/pytz/zoneinfo/America/Swift_Current.py b/lib/pytz/zoneinfo/America/Swift_Current.py
new file mode 100755
index 0000000..e4bab9f
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Swift_Current.py
@@ -0,0 +1,66 @@
+'''tzinfo timezone information for America/Swift_Current.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Swift_Current(DstTzInfo):
+    '''America/Swift_Current timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Swift_Current'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,9,1,7,11,20),
+d(1918,4,14,9,0,0),
+d(1918,10,31,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1946,4,28,9,0,0),
+d(1946,10,13,8,0,0),
+d(1947,4,27,9,0,0),
+d(1947,9,28,8,0,0),
+d(1948,4,25,9,0,0),
+d(1948,9,26,8,0,0),
+d(1949,4,24,9,0,0),
+d(1949,9,25,8,0,0),
+d(1957,4,28,9,0,0),
+d(1957,10,27,8,0,0),
+d(1959,4,26,9,0,0),
+d(1959,10,25,8,0,0),
+d(1960,4,24,9,0,0),
+d(1960,9,25,8,0,0),
+d(1961,4,30,9,0,0),
+d(1961,9,24,8,0,0),
+d(1972,4,30,9,0,0),
+        ]
+
+    _transition_info = [
+i(-25860,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+        ]
+
+Swift_Current = Swift_Current()
+
diff --git a/lib/pytz/zoneinfo/America/Tegucigalpa.py b/lib/pytz/zoneinfo/America/Tegucigalpa.py
new file mode 100755
index 0000000..3f74d02
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Tegucigalpa.py
@@ -0,0 +1,46 @@
+'''tzinfo timezone information for America/Tegucigalpa.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tegucigalpa(DstTzInfo):
+    '''America/Tegucigalpa timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Tegucigalpa'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1921,4,1,5,48,52),
+d(1987,5,3,6,0,0),
+d(1987,9,27,5,0,0),
+d(1988,5,1,6,0,0),
+d(1988,9,25,5,0,0),
+d(2006,5,7,6,0,0),
+d(2006,8,7,5,0,0),
+d(2007,5,6,6,0,0),
+d(2007,8,6,5,0,0),
+d(2008,5,4,6,0,0),
+d(2008,8,4,5,0,0),
+d(2009,5,3,6,0,0),
+d(2009,8,3,5,0,0),
+        ]
+
+    _transition_info = [
+i(-20940,0,'LMT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Tegucigalpa = Tegucigalpa()
+
diff --git a/lib/pytz/zoneinfo/America/Thule.py b/lib/pytz/zoneinfo/America/Thule.py
new file mode 100755
index 0000000..8a773ab
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Thule.py
@@ -0,0 +1,210 @@
+'''tzinfo timezone information for America/Thule.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Thule(DstTzInfo):
+    '''America/Thule timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Thule'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,7,28,4,35,8),
+d(1991,3,31,6,0,0),
+d(1991,9,29,5,0,0),
+d(1992,3,29,6,0,0),
+d(1992,9,27,5,0,0),
+d(1993,4,4,6,0,0),
+d(1993,10,31,5,0,0),
+d(1994,4,3,6,0,0),
+d(1994,10,30,5,0,0),
+d(1995,4,2,6,0,0),
+d(1995,10,29,5,0,0),
+d(1996,4,7,6,0,0),
+d(1996,10,27,5,0,0),
+d(1997,4,6,6,0,0),
+d(1997,10,26,5,0,0),
+d(1998,4,5,6,0,0),
+d(1998,10,25,5,0,0),
+d(1999,4,4,6,0,0),
+d(1999,10,31,5,0,0),
+d(2000,4,2,6,0,0),
+d(2000,10,29,5,0,0),
+d(2001,4,1,6,0,0),
+d(2001,10,28,5,0,0),
+d(2002,4,7,6,0,0),
+d(2002,10,27,5,0,0),
+d(2003,4,6,6,0,0),
+d(2003,10,26,5,0,0),
+d(2004,4,4,6,0,0),
+d(2004,10,31,5,0,0),
+d(2005,4,3,6,0,0),
+d(2005,10,30,5,0,0),
+d(2006,4,2,6,0,0),
+d(2006,10,29,5,0,0),
+d(2007,3,11,6,0,0),
+d(2007,11,4,5,0,0),
+d(2008,3,9,6,0,0),
+d(2008,11,2,5,0,0),
+d(2009,3,8,6,0,0),
+d(2009,11,1,5,0,0),
+d(2010,3,14,6,0,0),
+d(2010,11,7,5,0,0),
+d(2011,3,13,6,0,0),
+d(2011,11,6,5,0,0),
+d(2012,3,11,6,0,0),
+d(2012,11,4,5,0,0),
+d(2013,3,10,6,0,0),
+d(2013,11,3,5,0,0),
+d(2014,3,9,6,0,0),
+d(2014,11,2,5,0,0),
+d(2015,3,8,6,0,0),
+d(2015,11,1,5,0,0),
+d(2016,3,13,6,0,0),
+d(2016,11,6,5,0,0),
+d(2017,3,12,6,0,0),
+d(2017,11,5,5,0,0),
+d(2018,3,11,6,0,0),
+d(2018,11,4,5,0,0),
+d(2019,3,10,6,0,0),
+d(2019,11,3,5,0,0),
+d(2020,3,8,6,0,0),
+d(2020,11,1,5,0,0),
+d(2021,3,14,6,0,0),
+d(2021,11,7,5,0,0),
+d(2022,3,13,6,0,0),
+d(2022,11,6,5,0,0),
+d(2023,3,12,6,0,0),
+d(2023,11,5,5,0,0),
+d(2024,3,10,6,0,0),
+d(2024,11,3,5,0,0),
+d(2025,3,9,6,0,0),
+d(2025,11,2,5,0,0),
+d(2026,3,8,6,0,0),
+d(2026,11,1,5,0,0),
+d(2027,3,14,6,0,0),
+d(2027,11,7,5,0,0),
+d(2028,3,12,6,0,0),
+d(2028,11,5,5,0,0),
+d(2029,3,11,6,0,0),
+d(2029,11,4,5,0,0),
+d(2030,3,10,6,0,0),
+d(2030,11,3,5,0,0),
+d(2031,3,9,6,0,0),
+d(2031,11,2,5,0,0),
+d(2032,3,14,6,0,0),
+d(2032,11,7,5,0,0),
+d(2033,3,13,6,0,0),
+d(2033,11,6,5,0,0),
+d(2034,3,12,6,0,0),
+d(2034,11,5,5,0,0),
+d(2035,3,11,6,0,0),
+d(2035,11,4,5,0,0),
+d(2036,3,9,6,0,0),
+d(2036,11,2,5,0,0),
+d(2037,3,8,6,0,0),
+d(2037,11,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-16500,0,'LMT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Thule = Thule()
+
diff --git a/lib/pytz/zoneinfo/America/Thunder_Bay.py b/lib/pytz/zoneinfo/America/Thunder_Bay.py
new file mode 100755
index 0000000..699cad2
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Thunder_Bay.py
@@ -0,0 +1,296 @@
+'''tzinfo timezone information for America/Thunder_Bay.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Thunder_Bay(DstTzInfo):
+    '''America/Thunder_Bay timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Thunder_Bay'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1910,1,1,6,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1974,4,28,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,4,27,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Thunder_Bay = Thunder_Bay()
+
diff --git a/lib/pytz/zoneinfo/America/Tijuana.py b/lib/pytz/zoneinfo/America/Tijuana.py
new file mode 100755
index 0000000..79f6a97
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Tijuana.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for America/Tijuana.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tijuana(DstTzInfo):
+    '''America/Tijuana timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Tijuana'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,8,0,0),
+d(1924,1,1,7,0,0),
+d(1927,6,11,7,0,0),
+d(1930,11,15,7,0,0),
+d(1931,4,1,8,0,0),
+d(1931,9,30,7,0,0),
+d(1942,4,24,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,11,12,7,0,0),
+d(1948,4,5,8,0,0),
+d(1949,1,14,7,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,4,1,10,0,0),
+d(2007,10,28,9,0,0),
+d(2008,4,6,10,0,0),
+d(2008,10,26,9,0,0),
+d(2009,4,5,10,0,0),
+d(2009,10,25,9,0,0),
+d(2010,4,4,10,0,0),
+d(2010,10,31,9,0,0),
+d(2011,4,3,10,0,0),
+d(2011,10,30,9,0,0),
+d(2012,4,1,10,0,0),
+d(2012,10,28,9,0,0),
+d(2013,4,7,10,0,0),
+d(2013,10,27,9,0,0),
+d(2014,4,6,10,0,0),
+d(2014,10,26,9,0,0),
+d(2015,4,5,10,0,0),
+d(2015,10,25,9,0,0),
+d(2016,4,3,10,0,0),
+d(2016,10,30,9,0,0),
+d(2017,4,2,10,0,0),
+d(2017,10,29,9,0,0),
+d(2018,4,1,10,0,0),
+d(2018,10,28,9,0,0),
+d(2019,4,7,10,0,0),
+d(2019,10,27,9,0,0),
+d(2020,4,5,10,0,0),
+d(2020,10,25,9,0,0),
+d(2021,4,4,10,0,0),
+d(2021,10,31,9,0,0),
+d(2022,4,3,10,0,0),
+d(2022,10,30,9,0,0),
+d(2023,4,2,10,0,0),
+d(2023,10,29,9,0,0),
+d(2024,4,7,10,0,0),
+d(2024,10,27,9,0,0),
+d(2025,4,6,10,0,0),
+d(2025,10,26,9,0,0),
+d(2026,4,5,10,0,0),
+d(2026,10,25,9,0,0),
+d(2027,4,4,10,0,0),
+d(2027,10,31,9,0,0),
+d(2028,4,2,10,0,0),
+d(2028,10,29,9,0,0),
+d(2029,4,1,10,0,0),
+d(2029,10,28,9,0,0),
+d(2030,4,7,10,0,0),
+d(2030,10,27,9,0,0),
+d(2031,4,6,10,0,0),
+d(2031,10,26,9,0,0),
+d(2032,4,4,10,0,0),
+d(2032,10,31,9,0,0),
+d(2033,4,3,10,0,0),
+d(2033,10,30,9,0,0),
+d(2034,4,2,10,0,0),
+d(2034,10,29,9,0,0),
+d(2035,4,1,10,0,0),
+d(2035,10,28,9,0,0),
+d(2036,4,6,10,0,0),
+d(2036,10,26,9,0,0),
+d(2037,4,5,10,0,0),
+d(2037,10,25,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28080,0,'LMT'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Tijuana = Tijuana()
+
diff --git a/lib/pytz/zoneinfo/America/Toronto.py b/lib/pytz/zoneinfo/America/Toronto.py
new file mode 100755
index 0000000..25d4ae2
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Toronto.py
@@ -0,0 +1,484 @@
+'''tzinfo timezone information for America/Toronto.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Toronto(DstTzInfo):
+    '''America/Toronto timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Toronto'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,7,0,0),
+d(1918,10,31,6,0,0),
+d(1919,3,31,4,30,0),
+d(1919,10,26,4,0,0),
+d(1920,5,2,7,0,0),
+d(1920,9,26,4,0,0),
+d(1921,5,15,7,0,0),
+d(1921,9,15,6,0,0),
+d(1922,5,14,7,0,0),
+d(1922,9,17,6,0,0),
+d(1923,5,13,7,0,0),
+d(1923,9,16,6,0,0),
+d(1924,5,4,7,0,0),
+d(1924,9,21,6,0,0),
+d(1925,5,3,7,0,0),
+d(1925,9,20,6,0,0),
+d(1926,5,2,7,0,0),
+d(1926,9,19,6,0,0),
+d(1927,5,1,7,0,0),
+d(1927,9,25,6,0,0),
+d(1928,4,29,7,0,0),
+d(1928,9,30,6,0,0),
+d(1929,4,28,7,0,0),
+d(1929,9,29,6,0,0),
+d(1930,4,27,7,0,0),
+d(1930,9,28,6,0,0),
+d(1931,4,26,7,0,0),
+d(1931,9,27,6,0,0),
+d(1932,5,1,7,0,0),
+d(1932,9,25,6,0,0),
+d(1933,4,30,7,0,0),
+d(1933,10,1,6,0,0),
+d(1934,4,29,7,0,0),
+d(1934,9,30,6,0,0),
+d(1935,4,28,7,0,0),
+d(1935,9,29,6,0,0),
+d(1936,4,26,7,0,0),
+d(1936,9,27,6,0,0),
+d(1937,4,25,7,0,0),
+d(1937,9,26,6,0,0),
+d(1938,4,24,7,0,0),
+d(1938,9,25,6,0,0),
+d(1939,4,30,7,0,0),
+d(1939,9,24,6,0,0),
+d(1940,4,28,7,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1946,4,28,7,0,0),
+d(1946,9,29,6,0,0),
+d(1947,4,27,5,0,0),
+d(1947,9,28,4,0,0),
+d(1948,4,25,5,0,0),
+d(1948,9,26,4,0,0),
+d(1949,4,24,5,0,0),
+d(1949,11,27,4,0,0),
+d(1950,4,30,7,0,0),
+d(1950,11,26,6,0,0),
+d(1951,4,29,7,0,0),
+d(1951,9,30,6,0,0),
+d(1952,4,27,7,0,0),
+d(1952,9,28,6,0,0),
+d(1953,4,26,7,0,0),
+d(1953,9,27,6,0,0),
+d(1954,4,25,7,0,0),
+d(1954,9,26,6,0,0),
+d(1955,4,24,7,0,0),
+d(1955,9,25,6,0,0),
+d(1956,4,29,7,0,0),
+d(1956,9,30,6,0,0),
+d(1957,4,28,7,0,0),
+d(1957,10,27,6,0,0),
+d(1958,4,27,7,0,0),
+d(1958,10,26,6,0,0),
+d(1959,4,26,7,0,0),
+d(1959,10,25,6,0,0),
+d(1960,4,24,7,0,0),
+d(1960,10,30,6,0,0),
+d(1961,4,30,7,0,0),
+d(1961,10,29,6,0,0),
+d(1962,4,29,7,0,0),
+d(1962,10,28,6,0,0),
+d(1963,4,28,7,0,0),
+d(1963,10,27,6,0,0),
+d(1964,4,26,7,0,0),
+d(1964,10,25,6,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,6,0,0),
+d(1966,4,24,7,0,0),
+d(1966,10,30,6,0,0),
+d(1967,4,30,7,0,0),
+d(1967,10,29,6,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,4,28,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,4,27,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Toronto = Toronto()
+
diff --git a/lib/pytz/zoneinfo/America/Tortola.py b/lib/pytz/zoneinfo/America/Tortola.py
new file mode 100755
index 0000000..485f384
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Tortola.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Tortola.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tortola(DstTzInfo):
+    '''America/Tortola timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Tortola'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,7,1,4,18,28),
+        ]
+
+    _transition_info = [
+i(-15480,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+Tortola = Tortola()
+
diff --git a/lib/pytz/zoneinfo/America/Vancouver.py b/lib/pytz/zoneinfo/America/Vancouver.py
new file mode 100755
index 0000000..89e0aca
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Vancouver.py
@@ -0,0 +1,398 @@
+'''tzinfo timezone information for America/Vancouver.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vancouver(DstTzInfo):
+    '''America/Vancouver timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Vancouver'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,10,0,0),
+d(1918,10,31,9,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1946,4,28,10,0,0),
+d(1946,10,13,9,0,0),
+d(1947,4,27,10,0,0),
+d(1947,9,28,9,0,0),
+d(1948,4,25,10,0,0),
+d(1948,9,26,9,0,0),
+d(1949,4,24,10,0,0),
+d(1949,9,25,9,0,0),
+d(1950,4,30,10,0,0),
+d(1950,9,24,9,0,0),
+d(1951,4,29,10,0,0),
+d(1951,9,30,9,0,0),
+d(1952,4,27,10,0,0),
+d(1952,9,28,9,0,0),
+d(1953,4,26,10,0,0),
+d(1953,9,27,9,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1961,4,30,10,0,0),
+d(1961,9,24,9,0,0),
+d(1962,4,29,10,0,0),
+d(1962,10,28,9,0,0),
+d(1963,4,28,10,0,0),
+d(1963,10,27,9,0,0),
+d(1964,4,26,10,0,0),
+d(1964,10,25,9,0,0),
+d(1965,4,25,10,0,0),
+d(1965,10,31,9,0,0),
+d(1966,4,24,10,0,0),
+d(1966,10,30,9,0,0),
+d(1967,4,30,10,0,0),
+d(1967,10,29,9,0,0),
+d(1968,4,28,10,0,0),
+d(1968,10,27,9,0,0),
+d(1969,4,27,10,0,0),
+d(1969,10,26,9,0,0),
+d(1970,4,26,10,0,0),
+d(1970,10,25,9,0,0),
+d(1971,4,25,10,0,0),
+d(1971,10,31,9,0,0),
+d(1972,4,30,10,0,0),
+d(1972,10,29,9,0,0),
+d(1973,4,29,10,0,0),
+d(1973,10,28,9,0,0),
+d(1974,4,28,10,0,0),
+d(1974,10,27,9,0,0),
+d(1975,4,27,10,0,0),
+d(1975,10,26,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Vancouver = Vancouver()
+
diff --git a/lib/pytz/zoneinfo/America/Virgin.py b/lib/pytz/zoneinfo/America/Virgin.py
new file mode 100755
index 0000000..9d6529a
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Virgin.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for America/Virgin.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Virgin(DstTzInfo):
+    '''America/Virgin timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Virgin'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,7,1,4,19,44),
+        ]
+
+    _transition_info = [
+i(-15600,0,'LMT'),
+i(-14400,0,'AST'),
+        ]
+
+Virgin = Virgin()
+
diff --git a/lib/pytz/zoneinfo/America/Whitehorse.py b/lib/pytz/zoneinfo/America/Whitehorse.py
new file mode 100755
index 0000000..78d1d74
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Whitehorse.py
@@ -0,0 +1,272 @@
+'''tzinfo timezone information for America/Whitehorse.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Whitehorse(DstTzInfo):
+    '''America/Whitehorse timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Whitehorse'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,11,0,0),
+d(1918,10,27,10,0,0),
+d(1919,5,25,11,0,0),
+d(1919,11,1,8,0,0),
+d(1942,2,9,11,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,10,0,0),
+d(1965,4,25,9,0,0),
+d(1965,10,31,9,0,0),
+d(1966,7,1,11,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YWT'),
+i(-28800,3600,'YPT'),
+i(-32400,0,'YST'),
+i(-25200,7200,'YDDT'),
+i(-32400,0,'YST'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Whitehorse = Whitehorse()
+
diff --git a/lib/pytz/zoneinfo/America/Winnipeg.py b/lib/pytz/zoneinfo/America/Winnipeg.py
new file mode 100755
index 0000000..96fa323
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Winnipeg.py
@@ -0,0 +1,392 @@
+'''tzinfo timezone information for America/Winnipeg.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Winnipeg(DstTzInfo):
+    '''America/Winnipeg timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Winnipeg'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,23,6,0,0),
+d(1916,9,17,5,0,0),
+d(1918,4,14,8,0,0),
+d(1918,10,31,7,0,0),
+d(1937,5,16,8,0,0),
+d(1937,9,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,5,12,8,0,0),
+d(1946,10,13,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,5,1,8,0,0),
+d(1950,9,30,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,9,25,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,9,30,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,9,28,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,9,25,7,0,0),
+d(1963,4,28,8,0,0),
+d(1963,9,22,7,0,0),
+d(1966,4,24,8,0,0),
+d(1966,10,30,8,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,8,0,0),
+d(1974,4,28,8,0,0),
+d(1974,10,27,8,0,0),
+d(1975,4,27,8,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,8,0,0),
+d(2006,1,1,6,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Winnipeg = Winnipeg()
+
diff --git a/lib/pytz/zoneinfo/America/Yakutat.py b/lib/pytz/zoneinfo/America/Yakutat.py
new file mode 100755
index 0000000..b98a6af
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Yakutat.py
@@ -0,0 +1,304 @@
+'''tzinfo timezone information for America/Yakutat.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Yakutat(DstTzInfo):
+    '''America/Yakutat timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Yakutat'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,2,9,11,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,10,0,0),
+d(1969,4,27,11,0,0),
+d(1969,10,26,10,0,0),
+d(1970,4,26,11,0,0),
+d(1970,10,25,10,0,0),
+d(1971,4,25,11,0,0),
+d(1971,10,31,10,0,0),
+d(1972,4,30,11,0,0),
+d(1972,10,29,10,0,0),
+d(1973,4,29,11,0,0),
+d(1973,10,28,10,0,0),
+d(1974,1,6,11,0,0),
+d(1974,10,27,10,0,0),
+d(1975,2,23,11,0,0),
+d(1975,10,26,10,0,0),
+d(1976,4,25,11,0,0),
+d(1976,10,31,10,0,0),
+d(1977,4,24,11,0,0),
+d(1977,10,30,10,0,0),
+d(1978,4,30,11,0,0),
+d(1978,10,29,10,0,0),
+d(1979,4,29,11,0,0),
+d(1979,10,28,10,0,0),
+d(1980,4,27,11,0,0),
+d(1980,10,26,10,0,0),
+d(1981,4,26,11,0,0),
+d(1981,10,25,10,0,0),
+d(1982,4,25,11,0,0),
+d(1982,10,31,10,0,0),
+d(1983,4,24,11,0,0),
+d(1983,10,30,10,0,0),
+d(1983,11,30,9,0,0),
+d(1984,4,29,11,0,0),
+d(1984,10,28,10,0,0),
+d(1985,4,28,11,0,0),
+d(1985,10,27,10,0,0),
+d(1986,4,27,11,0,0),
+d(1986,10,26,10,0,0),
+d(1987,4,5,11,0,0),
+d(1987,10,25,10,0,0),
+d(1988,4,3,11,0,0),
+d(1988,10,30,10,0,0),
+d(1989,4,2,11,0,0),
+d(1989,10,29,10,0,0),
+d(1990,4,1,11,0,0),
+d(1990,10,28,10,0,0),
+d(1991,4,7,11,0,0),
+d(1991,10,27,10,0,0),
+d(1992,4,5,11,0,0),
+d(1992,10,25,10,0,0),
+d(1993,4,4,11,0,0),
+d(1993,10,31,10,0,0),
+d(1994,4,3,11,0,0),
+d(1994,10,30,10,0,0),
+d(1995,4,2,11,0,0),
+d(1995,10,29,10,0,0),
+d(1996,4,7,11,0,0),
+d(1996,10,27,10,0,0),
+d(1997,4,6,11,0,0),
+d(1997,10,26,10,0,0),
+d(1998,4,5,11,0,0),
+d(1998,10,25,10,0,0),
+d(1999,4,4,11,0,0),
+d(1999,10,31,10,0,0),
+d(2000,4,2,11,0,0),
+d(2000,10,29,10,0,0),
+d(2001,4,1,11,0,0),
+d(2001,10,28,10,0,0),
+d(2002,4,7,11,0,0),
+d(2002,10,27,10,0,0),
+d(2003,4,6,11,0,0),
+d(2003,10,26,10,0,0),
+d(2004,4,4,11,0,0),
+d(2004,10,31,10,0,0),
+d(2005,4,3,11,0,0),
+d(2005,10,30,10,0,0),
+d(2006,4,2,11,0,0),
+d(2006,10,29,10,0,0),
+d(2007,3,11,11,0,0),
+d(2007,11,4,10,0,0),
+d(2008,3,9,11,0,0),
+d(2008,11,2,10,0,0),
+d(2009,3,8,11,0,0),
+d(2009,11,1,10,0,0),
+d(2010,3,14,11,0,0),
+d(2010,11,7,10,0,0),
+d(2011,3,13,11,0,0),
+d(2011,11,6,10,0,0),
+d(2012,3,11,11,0,0),
+d(2012,11,4,10,0,0),
+d(2013,3,10,11,0,0),
+d(2013,11,3,10,0,0),
+d(2014,3,9,11,0,0),
+d(2014,11,2,10,0,0),
+d(2015,3,8,11,0,0),
+d(2015,11,1,10,0,0),
+d(2016,3,13,11,0,0),
+d(2016,11,6,10,0,0),
+d(2017,3,12,11,0,0),
+d(2017,11,5,10,0,0),
+d(2018,3,11,11,0,0),
+d(2018,11,4,10,0,0),
+d(2019,3,10,11,0,0),
+d(2019,11,3,10,0,0),
+d(2020,3,8,11,0,0),
+d(2020,11,1,10,0,0),
+d(2021,3,14,11,0,0),
+d(2021,11,7,10,0,0),
+d(2022,3,13,11,0,0),
+d(2022,11,6,10,0,0),
+d(2023,3,12,11,0,0),
+d(2023,11,5,10,0,0),
+d(2024,3,10,11,0,0),
+d(2024,11,3,10,0,0),
+d(2025,3,9,11,0,0),
+d(2025,11,2,10,0,0),
+d(2026,3,8,11,0,0),
+d(2026,11,1,10,0,0),
+d(2027,3,14,11,0,0),
+d(2027,11,7,10,0,0),
+d(2028,3,12,11,0,0),
+d(2028,11,5,10,0,0),
+d(2029,3,11,11,0,0),
+d(2029,11,4,10,0,0),
+d(2030,3,10,11,0,0),
+d(2030,11,3,10,0,0),
+d(2031,3,9,11,0,0),
+d(2031,11,2,10,0,0),
+d(2032,3,14,11,0,0),
+d(2032,11,7,10,0,0),
+d(2033,3,13,11,0,0),
+d(2033,11,6,10,0,0),
+d(2034,3,12,11,0,0),
+d(2034,11,5,10,0,0),
+d(2035,3,11,11,0,0),
+d(2035,11,4,10,0,0),
+d(2036,3,9,11,0,0),
+d(2036,11,2,10,0,0),
+d(2037,3,8,11,0,0),
+d(2037,11,1,10,0,0),
+        ]
+
+    _transition_info = [
+i(-32400,0,'YST'),
+i(-28800,3600,'YWT'),
+i(-28800,3600,'YPT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+        ]
+
+Yakutat = Yakutat()
+
diff --git a/lib/pytz/zoneinfo/America/Yellowknife.py b/lib/pytz/zoneinfo/America/Yellowknife.py
new file mode 100755
index 0000000..81494e5
--- /dev/null
+++ b/lib/pytz/zoneinfo/America/Yellowknife.py
@@ -0,0 +1,270 @@
+'''tzinfo timezone information for America/Yellowknife.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Yellowknife(DstTzInfo):
+    '''America/Yellowknife timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'America/Yellowknife'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,5,25,9,0,0),
+d(1919,11,1,6,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,7,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-18000,7200,'MDDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Yellowknife = Yellowknife()
+
diff --git a/lib/pytz/zoneinfo/America/__init__.py b/lib/pytz/zoneinfo/America/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Antarctica/Casey.py b/lib/pytz/zoneinfo/Antarctica/Casey.py
new file mode 100755
index 0000000..b4bcceb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/Casey.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Antarctica/Casey.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Casey(DstTzInfo):
+    '''Antarctica/Casey timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/Casey'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1969,1,1,0,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(28800,0,'WST'),
+        ]
+
+Casey = Casey()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/Davis.py b/lib/pytz/zoneinfo/Antarctica/Davis.py
new file mode 100755
index 0000000..6c1384f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/Davis.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Antarctica/Davis.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Davis(DstTzInfo):
+    '''Antarctica/Davis timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/Davis'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1957,1,13,0,0,0),
+d(1964,10,31,17,0,0),
+d(1969,2,1,0,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(25200,0,'DAVT'),
+i(0,0,'zzz'),
+i(25200,0,'DAVT'),
+        ]
+
+Davis = Davis()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/DumontDUrville.py b/lib/pytz/zoneinfo/Antarctica/DumontDUrville.py
new file mode 100755
index 0000000..14af4df
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/DumontDUrville.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Antarctica/DumontDUrville.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class DumontDUrville(DstTzInfo):
+    '''Antarctica/DumontDUrville timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/DumontDUrville'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1947,1,1,0,0,0),
+d(1952,1,13,14,0,0),
+d(1956,11,1,0,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(36000,0,'PMT'),
+i(0,0,'zzz'),
+i(36000,0,'DDUT'),
+        ]
+
+DumontDUrville = DumontDUrville()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/Mawson.py b/lib/pytz/zoneinfo/Antarctica/Mawson.py
new file mode 100755
index 0000000..ea1bc6c
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/Mawson.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Antarctica/Mawson.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mawson(DstTzInfo):
+    '''Antarctica/Mawson timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/Mawson'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1954,2,13,0,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(21600,0,'MAWT'),
+        ]
+
+Mawson = Mawson()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/McMurdo.py b/lib/pytz/zoneinfo/Antarctica/McMurdo.py
new file mode 100755
index 0000000..f7a5f47
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/McMurdo.py
@@ -0,0 +1,276 @@
+'''tzinfo timezone information for Antarctica/McMurdo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class McMurdo(DstTzInfo):
+    '''Antarctica/McMurdo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/McMurdo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1956,1,1,0,0,0),
+d(1974,11,2,14,0,0),
+d(1975,2,22,14,0,0),
+d(1975,10,25,14,0,0),
+d(1976,3,6,14,0,0),
+d(1976,10,30,14,0,0),
+d(1977,3,5,14,0,0),
+d(1977,10,29,14,0,0),
+d(1978,3,4,14,0,0),
+d(1978,10,28,14,0,0),
+d(1979,3,3,14,0,0),
+d(1979,10,27,14,0,0),
+d(1980,3,1,14,0,0),
+d(1980,10,25,14,0,0),
+d(1981,2,28,14,0,0),
+d(1981,10,24,14,0,0),
+d(1982,3,6,14,0,0),
+d(1982,10,30,14,0,0),
+d(1983,3,5,14,0,0),
+d(1983,10,29,14,0,0),
+d(1984,3,3,14,0,0),
+d(1984,10,27,14,0,0),
+d(1985,3,2,14,0,0),
+d(1985,10,26,14,0,0),
+d(1986,3,1,14,0,0),
+d(1986,10,25,14,0,0),
+d(1987,2,28,14,0,0),
+d(1987,10,24,14,0,0),
+d(1988,3,5,14,0,0),
+d(1988,10,29,14,0,0),
+d(1989,3,4,14,0,0),
+d(1989,10,7,14,0,0),
+d(1990,3,17,14,0,0),
+d(1990,10,6,14,0,0),
+d(1991,3,16,14,0,0),
+d(1991,10,5,14,0,0),
+d(1992,3,14,14,0,0),
+d(1992,10,3,14,0,0),
+d(1993,3,20,14,0,0),
+d(1993,10,2,14,0,0),
+d(1994,3,19,14,0,0),
+d(1994,10,1,14,0,0),
+d(1995,3,18,14,0,0),
+d(1995,9,30,14,0,0),
+d(1996,3,16,14,0,0),
+d(1996,10,5,14,0,0),
+d(1997,3,15,14,0,0),
+d(1997,10,4,14,0,0),
+d(1998,3,14,14,0,0),
+d(1998,10,3,14,0,0),
+d(1999,3,20,14,0,0),
+d(1999,10,2,14,0,0),
+d(2000,3,18,14,0,0),
+d(2000,9,30,14,0,0),
+d(2001,3,17,14,0,0),
+d(2001,10,6,14,0,0),
+d(2002,3,16,14,0,0),
+d(2002,10,5,14,0,0),
+d(2003,3,15,14,0,0),
+d(2003,10,4,14,0,0),
+d(2004,3,20,14,0,0),
+d(2004,10,2,14,0,0),
+d(2005,3,19,14,0,0),
+d(2005,10,1,14,0,0),
+d(2006,3,18,14,0,0),
+d(2006,9,30,14,0,0),
+d(2007,3,17,14,0,0),
+d(2007,10,6,14,0,0),
+d(2008,3,15,14,0,0),
+d(2008,10,4,14,0,0),
+d(2009,3,14,14,0,0),
+d(2009,10,3,14,0,0),
+d(2010,3,20,14,0,0),
+d(2010,10,2,14,0,0),
+d(2011,3,19,14,0,0),
+d(2011,10,1,14,0,0),
+d(2012,3,17,14,0,0),
+d(2012,10,6,14,0,0),
+d(2013,3,16,14,0,0),
+d(2013,10,5,14,0,0),
+d(2014,3,15,14,0,0),
+d(2014,10,4,14,0,0),
+d(2015,3,14,14,0,0),
+d(2015,10,3,14,0,0),
+d(2016,3,19,14,0,0),
+d(2016,10,1,14,0,0),
+d(2017,3,18,14,0,0),
+d(2017,9,30,14,0,0),
+d(2018,3,17,14,0,0),
+d(2018,10,6,14,0,0),
+d(2019,3,16,14,0,0),
+d(2019,10,5,14,0,0),
+d(2020,3,14,14,0,0),
+d(2020,10,3,14,0,0),
+d(2021,3,20,14,0,0),
+d(2021,10,2,14,0,0),
+d(2022,3,19,14,0,0),
+d(2022,10,1,14,0,0),
+d(2023,3,18,14,0,0),
+d(2023,9,30,14,0,0),
+d(2024,3,16,14,0,0),
+d(2024,10,5,14,0,0),
+d(2025,3,15,14,0,0),
+d(2025,10,4,14,0,0),
+d(2026,3,14,14,0,0),
+d(2026,10,3,14,0,0),
+d(2027,3,20,14,0,0),
+d(2027,10,2,14,0,0),
+d(2028,3,18,14,0,0),
+d(2028,9,30,14,0,0),
+d(2029,3,17,14,0,0),
+d(2029,10,6,14,0,0),
+d(2030,3,16,14,0,0),
+d(2030,10,5,14,0,0),
+d(2031,3,15,14,0,0),
+d(2031,10,4,14,0,0),
+d(2032,3,20,14,0,0),
+d(2032,10,2,14,0,0),
+d(2033,3,19,14,0,0),
+d(2033,10,1,14,0,0),
+d(2034,3,18,14,0,0),
+d(2034,9,30,14,0,0),
+d(2035,3,17,14,0,0),
+d(2035,10,6,14,0,0),
+d(2036,3,15,14,0,0),
+d(2036,10,4,14,0,0),
+d(2037,3,14,14,0,0),
+d(2037,10,3,14,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+        ]
+
+McMurdo = McMurdo()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/Palmer.py b/lib/pytz/zoneinfo/Antarctica/Palmer.py
new file mode 100755
index 0000000..3d80c79
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/Palmer.py
@@ -0,0 +1,270 @@
+'''tzinfo timezone information for Antarctica/Palmer.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Palmer(DstTzInfo):
+    '''Antarctica/Palmer timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/Palmer'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1965,1,1,0,0,0),
+d(1965,3,1,3,0,0),
+d(1965,10,15,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,10,15,4,0,0),
+d(1967,4,2,3,0,0),
+d(1967,10,1,4,0,0),
+d(1968,4,7,3,0,0),
+d(1968,10,6,4,0,0),
+d(1969,4,6,3,0,0),
+d(1969,10,5,4,0,0),
+d(1974,1,23,3,0,0),
+d(1974,5,1,2,0,0),
+d(1982,5,1,3,0,0),
+d(1982,10,10,4,0,0),
+d(1983,3,13,3,0,0),
+d(1983,10,9,4,0,0),
+d(1984,3,11,3,0,0),
+d(1984,10,14,4,0,0),
+d(1985,3,10,3,0,0),
+d(1985,10,13,4,0,0),
+d(1986,3,9,3,0,0),
+d(1986,10,12,4,0,0),
+d(1987,4,12,3,0,0),
+d(1987,10,11,4,0,0),
+d(1988,3,13,3,0,0),
+d(1988,10,2,4,0,0),
+d(1989,3,12,3,0,0),
+d(1989,10,15,4,0,0),
+d(1990,3,18,3,0,0),
+d(1990,9,16,4,0,0),
+d(1991,3,10,3,0,0),
+d(1991,10,13,4,0,0),
+d(1992,3,15,3,0,0),
+d(1992,10,11,4,0,0),
+d(1993,3,14,3,0,0),
+d(1993,10,10,4,0,0),
+d(1994,3,13,3,0,0),
+d(1994,10,9,4,0,0),
+d(1995,3,12,3,0,0),
+d(1995,10,15,4,0,0),
+d(1996,3,10,3,0,0),
+d(1996,10,13,4,0,0),
+d(1997,3,30,3,0,0),
+d(1997,10,12,4,0,0),
+d(1998,3,15,3,0,0),
+d(1998,9,27,4,0,0),
+d(1999,4,4,3,0,0),
+d(1999,10,10,4,0,0),
+d(2000,3,12,3,0,0),
+d(2000,10,15,4,0,0),
+d(2001,3,11,3,0,0),
+d(2001,10,14,4,0,0),
+d(2002,3,10,3,0,0),
+d(2002,10,13,4,0,0),
+d(2003,3,9,3,0,0),
+d(2003,10,12,4,0,0),
+d(2004,3,14,3,0,0),
+d(2004,10,10,4,0,0),
+d(2005,3,13,3,0,0),
+d(2005,10,9,4,0,0),
+d(2006,3,12,3,0,0),
+d(2006,10,15,4,0,0),
+d(2007,3,11,3,0,0),
+d(2007,10,14,4,0,0),
+d(2008,3,9,3,0,0),
+d(2008,10,12,4,0,0),
+d(2009,3,15,3,0,0),
+d(2009,10,11,4,0,0),
+d(2010,3,14,3,0,0),
+d(2010,10,10,4,0,0),
+d(2011,3,13,3,0,0),
+d(2011,10,9,4,0,0),
+d(2012,3,11,3,0,0),
+d(2012,10,14,4,0,0),
+d(2013,3,10,3,0,0),
+d(2013,10,13,4,0,0),
+d(2014,3,9,3,0,0),
+d(2014,10,12,4,0,0),
+d(2015,3,15,3,0,0),
+d(2015,10,11,4,0,0),
+d(2016,3,13,3,0,0),
+d(2016,10,9,4,0,0),
+d(2017,3,12,3,0,0),
+d(2017,10,15,4,0,0),
+d(2018,3,11,3,0,0),
+d(2018,10,14,4,0,0),
+d(2019,3,10,3,0,0),
+d(2019,10,13,4,0,0),
+d(2020,3,15,3,0,0),
+d(2020,10,11,4,0,0),
+d(2021,3,14,3,0,0),
+d(2021,10,10,4,0,0),
+d(2022,3,13,3,0,0),
+d(2022,10,9,4,0,0),
+d(2023,3,12,3,0,0),
+d(2023,10,15,4,0,0),
+d(2024,3,10,3,0,0),
+d(2024,10,13,4,0,0),
+d(2025,3,9,3,0,0),
+d(2025,10,12,4,0,0),
+d(2026,3,15,3,0,0),
+d(2026,10,11,4,0,0),
+d(2027,3,14,3,0,0),
+d(2027,10,10,4,0,0),
+d(2028,3,12,3,0,0),
+d(2028,10,15,4,0,0),
+d(2029,3,11,3,0,0),
+d(2029,10,14,4,0,0),
+d(2030,3,10,3,0,0),
+d(2030,10,13,4,0,0),
+d(2031,3,9,3,0,0),
+d(2031,10,12,4,0,0),
+d(2032,3,14,3,0,0),
+d(2032,10,10,4,0,0),
+d(2033,3,13,3,0,0),
+d(2033,10,9,4,0,0),
+d(2034,3,12,3,0,0),
+d(2034,10,15,4,0,0),
+d(2035,3,11,3,0,0),
+d(2035,10,14,4,0,0),
+d(2036,3,9,3,0,0),
+d(2036,10,12,4,0,0),
+d(2037,3,15,3,0,0),
+d(2037,10,11,4,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(-10800,-10800,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,3600,'ARST'),
+i(-14400,0,'ART'),
+i(-10800,0,'ART'),
+i(-7200,3600,'ARST'),
+i(-10800,0,'ART'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+        ]
+
+Palmer = Palmer()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/Rothera.py b/lib/pytz/zoneinfo/Antarctica/Rothera.py
new file mode 100755
index 0000000..ffd20cb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/Rothera.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Antarctica/Rothera.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rothera(DstTzInfo):
+    '''Antarctica/Rothera timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/Rothera'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1976,12,1,0,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(-10800,0,'ROTT'),
+        ]
+
+Rothera = Rothera()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/South_Pole.py b/lib/pytz/zoneinfo/Antarctica/South_Pole.py
new file mode 100755
index 0000000..9cbd0ff
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/South_Pole.py
@@ -0,0 +1,276 @@
+'''tzinfo timezone information for Antarctica/South_Pole.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class South_Pole(DstTzInfo):
+    '''Antarctica/South_Pole timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/South_Pole'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1956,1,1,0,0,0),
+d(1974,11,2,14,0,0),
+d(1975,2,22,14,0,0),
+d(1975,10,25,14,0,0),
+d(1976,3,6,14,0,0),
+d(1976,10,30,14,0,0),
+d(1977,3,5,14,0,0),
+d(1977,10,29,14,0,0),
+d(1978,3,4,14,0,0),
+d(1978,10,28,14,0,0),
+d(1979,3,3,14,0,0),
+d(1979,10,27,14,0,0),
+d(1980,3,1,14,0,0),
+d(1980,10,25,14,0,0),
+d(1981,2,28,14,0,0),
+d(1981,10,24,14,0,0),
+d(1982,3,6,14,0,0),
+d(1982,10,30,14,0,0),
+d(1983,3,5,14,0,0),
+d(1983,10,29,14,0,0),
+d(1984,3,3,14,0,0),
+d(1984,10,27,14,0,0),
+d(1985,3,2,14,0,0),
+d(1985,10,26,14,0,0),
+d(1986,3,1,14,0,0),
+d(1986,10,25,14,0,0),
+d(1987,2,28,14,0,0),
+d(1987,10,24,14,0,0),
+d(1988,3,5,14,0,0),
+d(1988,10,29,14,0,0),
+d(1989,3,4,14,0,0),
+d(1989,10,7,14,0,0),
+d(1990,3,17,14,0,0),
+d(1990,10,6,14,0,0),
+d(1991,3,16,14,0,0),
+d(1991,10,5,14,0,0),
+d(1992,3,14,14,0,0),
+d(1992,10,3,14,0,0),
+d(1993,3,20,14,0,0),
+d(1993,10,2,14,0,0),
+d(1994,3,19,14,0,0),
+d(1994,10,1,14,0,0),
+d(1995,3,18,14,0,0),
+d(1995,9,30,14,0,0),
+d(1996,3,16,14,0,0),
+d(1996,10,5,14,0,0),
+d(1997,3,15,14,0,0),
+d(1997,10,4,14,0,0),
+d(1998,3,14,14,0,0),
+d(1998,10,3,14,0,0),
+d(1999,3,20,14,0,0),
+d(1999,10,2,14,0,0),
+d(2000,3,18,14,0,0),
+d(2000,9,30,14,0,0),
+d(2001,3,17,14,0,0),
+d(2001,10,6,14,0,0),
+d(2002,3,16,14,0,0),
+d(2002,10,5,14,0,0),
+d(2003,3,15,14,0,0),
+d(2003,10,4,14,0,0),
+d(2004,3,20,14,0,0),
+d(2004,10,2,14,0,0),
+d(2005,3,19,14,0,0),
+d(2005,10,1,14,0,0),
+d(2006,3,18,14,0,0),
+d(2006,9,30,14,0,0),
+d(2007,3,17,14,0,0),
+d(2007,10,6,14,0,0),
+d(2008,3,15,14,0,0),
+d(2008,10,4,14,0,0),
+d(2009,3,14,14,0,0),
+d(2009,10,3,14,0,0),
+d(2010,3,20,14,0,0),
+d(2010,10,2,14,0,0),
+d(2011,3,19,14,0,0),
+d(2011,10,1,14,0,0),
+d(2012,3,17,14,0,0),
+d(2012,10,6,14,0,0),
+d(2013,3,16,14,0,0),
+d(2013,10,5,14,0,0),
+d(2014,3,15,14,0,0),
+d(2014,10,4,14,0,0),
+d(2015,3,14,14,0,0),
+d(2015,10,3,14,0,0),
+d(2016,3,19,14,0,0),
+d(2016,10,1,14,0,0),
+d(2017,3,18,14,0,0),
+d(2017,9,30,14,0,0),
+d(2018,3,17,14,0,0),
+d(2018,10,6,14,0,0),
+d(2019,3,16,14,0,0),
+d(2019,10,5,14,0,0),
+d(2020,3,14,14,0,0),
+d(2020,10,3,14,0,0),
+d(2021,3,20,14,0,0),
+d(2021,10,2,14,0,0),
+d(2022,3,19,14,0,0),
+d(2022,10,1,14,0,0),
+d(2023,3,18,14,0,0),
+d(2023,9,30,14,0,0),
+d(2024,3,16,14,0,0),
+d(2024,10,5,14,0,0),
+d(2025,3,15,14,0,0),
+d(2025,10,4,14,0,0),
+d(2026,3,14,14,0,0),
+d(2026,10,3,14,0,0),
+d(2027,3,20,14,0,0),
+d(2027,10,2,14,0,0),
+d(2028,3,18,14,0,0),
+d(2028,9,30,14,0,0),
+d(2029,3,17,14,0,0),
+d(2029,10,6,14,0,0),
+d(2030,3,16,14,0,0),
+d(2030,10,5,14,0,0),
+d(2031,3,15,14,0,0),
+d(2031,10,4,14,0,0),
+d(2032,3,20,14,0,0),
+d(2032,10,2,14,0,0),
+d(2033,3,19,14,0,0),
+d(2033,10,1,14,0,0),
+d(2034,3,18,14,0,0),
+d(2034,9,30,14,0,0),
+d(2035,3,17,14,0,0),
+d(2035,10,6,14,0,0),
+d(2036,3,15,14,0,0),
+d(2036,10,4,14,0,0),
+d(2037,3,14,14,0,0),
+d(2037,10,3,14,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+        ]
+
+South_Pole = South_Pole()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/Syowa.py b/lib/pytz/zoneinfo/Antarctica/Syowa.py
new file mode 100755
index 0000000..8941832
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/Syowa.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Antarctica/Syowa.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Syowa(DstTzInfo):
+    '''Antarctica/Syowa timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/Syowa'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1957,1,29,0,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(10800,0,'SYOT'),
+        ]
+
+Syowa = Syowa()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/Vostok.py b/lib/pytz/zoneinfo/Antarctica/Vostok.py
new file mode 100755
index 0000000..6e2e41e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Antarctica/Vostok.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Antarctica/Vostok.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vostok(DstTzInfo):
+    '''Antarctica/Vostok timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Antarctica/Vostok'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1957,12,16,0,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(21600,0,'VOST'),
+        ]
+
+Vostok = Vostok()
+
diff --git a/lib/pytz/zoneinfo/Antarctica/__init__.py b/lib/pytz/zoneinfo/Antarctica/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Arctic/Longyearbyen.py b/lib/pytz/zoneinfo/Arctic/Longyearbyen.py
new file mode 100755
index 0000000..71577cb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Arctic/Longyearbyen.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Arctic/Longyearbyen.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Longyearbyen(DstTzInfo):
+    '''Arctic/Longyearbyen timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Arctic/Longyearbyen'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,22,0,0,0),
+d(1916,9,29,22,0,0),
+d(1940,8,10,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,10,1,1,0,0),
+d(1959,3,15,1,0,0),
+d(1959,9,20,1,0,0),
+d(1960,3,20,1,0,0),
+d(1960,9,18,1,0,0),
+d(1961,3,19,1,0,0),
+d(1961,9,17,1,0,0),
+d(1962,3,18,1,0,0),
+d(1962,9,16,1,0,0),
+d(1963,3,17,1,0,0),
+d(1963,9,15,1,0,0),
+d(1964,3,15,1,0,0),
+d(1964,9,20,1,0,0),
+d(1965,4,25,1,0,0),
+d(1965,9,19,1,0,0),
+d(1979,12,31,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Longyearbyen = Longyearbyen()
+
diff --git a/lib/pytz/zoneinfo/Arctic/__init__.py b/lib/pytz/zoneinfo/Arctic/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Asia/Aden.py b/lib/pytz/zoneinfo/Asia/Aden.py
new file mode 100755
index 0000000..0d0ac64
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Aden.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Asia/Aden.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Aden(DstTzInfo):
+    '''Asia/Aden timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Aden'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1949,12,31,20,59,12),
+        ]
+
+    _transition_info = [
+i(10860,0,'LMT'),
+i(10800,0,'AST'),
+        ]
+
+Aden = Aden()
+
diff --git a/lib/pytz/zoneinfo/Asia/Almaty.py b/lib/pytz/zoneinfo/Asia/Almaty.py
new file mode 100755
index 0000000..9d0df82
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Almaty.py
@@ -0,0 +1,120 @@
+'''tzinfo timezone information for Asia/Almaty.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Almaty(DstTzInfo):
+    '''Asia/Almaty timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Almaty'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,18,52,12),
+d(1930,6,20,19,0,0),
+d(1981,3,31,18,0,0),
+d(1981,9,30,17,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,17,0,0),
+d(1983,3,31,18,0,0),
+d(1983,9,30,17,0,0),
+d(1984,3,31,18,0,0),
+d(1984,9,29,20,0,0),
+d(1985,3,30,20,0,0),
+d(1985,9,28,20,0,0),
+d(1986,3,29,20,0,0),
+d(1986,9,27,20,0,0),
+d(1987,3,28,20,0,0),
+d(1987,9,26,20,0,0),
+d(1988,3,26,20,0,0),
+d(1988,9,24,20,0,0),
+d(1989,3,25,20,0,0),
+d(1989,9,23,20,0,0),
+d(1990,3,24,20,0,0),
+d(1990,9,29,20,0,0),
+d(1990,12,31,18,0,0),
+d(1992,3,28,17,0,0),
+d(1992,9,26,16,0,0),
+d(1993,3,27,20,0,0),
+d(1993,9,25,20,0,0),
+d(1994,3,26,20,0,0),
+d(1994,9,24,20,0,0),
+d(1995,3,25,20,0,0),
+d(1995,9,23,20,0,0),
+d(1996,3,30,20,0,0),
+d(1996,10,26,20,0,0),
+d(1997,3,29,20,0,0),
+d(1997,10,25,20,0,0),
+d(1998,3,28,20,0,0),
+d(1998,10,24,20,0,0),
+d(1999,3,27,20,0,0),
+d(1999,10,30,20,0,0),
+d(2000,3,25,20,0,0),
+d(2000,10,28,20,0,0),
+d(2001,3,24,20,0,0),
+d(2001,10,27,20,0,0),
+d(2002,3,30,20,0,0),
+d(2002,10,26,20,0,0),
+d(2003,3,29,20,0,0),
+d(2003,10,25,20,0,0),
+d(2004,3,27,20,0,0),
+d(2004,10,30,20,0,0),
+d(2005,3,14,18,0,0),
+        ]
+
+    _transition_info = [
+i(18480,0,'LMT'),
+i(18000,0,'ALMT'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(25200,3600,'ALMST'),
+i(21600,0,'ALMT'),
+i(21600,0,'ALMT'),
+        ]
+
+Almaty = Almaty()
+
diff --git a/lib/pytz/zoneinfo/Asia/Amman.py b/lib/pytz/zoneinfo/Asia/Amman.py
new file mode 100755
index 0000000..4aa1b33
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Amman.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for Asia/Amman.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Amman(DstTzInfo):
+    '''Asia/Amman timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Amman'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1930,12,31,21,36,16),
+d(1973,6,5,22,0,0),
+d(1973,9,30,21,0,0),
+d(1974,4,30,22,0,0),
+d(1974,9,30,21,0,0),
+d(1975,4,30,22,0,0),
+d(1975,9,30,21,0,0),
+d(1976,4,30,22,0,0),
+d(1976,10,31,21,0,0),
+d(1977,4,30,22,0,0),
+d(1977,9,30,21,0,0),
+d(1978,4,29,22,0,0),
+d(1978,9,29,21,0,0),
+d(1985,3,31,22,0,0),
+d(1985,9,30,21,0,0),
+d(1986,4,3,22,0,0),
+d(1986,10,2,21,0,0),
+d(1987,4,2,22,0,0),
+d(1987,10,1,21,0,0),
+d(1988,3,31,22,0,0),
+d(1988,10,6,21,0,0),
+d(1989,5,7,22,0,0),
+d(1989,10,5,21,0,0),
+d(1990,4,26,22,0,0),
+d(1990,10,4,21,0,0),
+d(1991,4,16,22,0,0),
+d(1991,9,26,21,0,0),
+d(1992,4,9,22,0,0),
+d(1992,10,1,21,0,0),
+d(1993,4,1,22,0,0),
+d(1993,9,30,21,0,0),
+d(1994,3,31,22,0,0),
+d(1994,9,15,21,0,0),
+d(1995,4,6,22,0,0),
+d(1995,9,14,22,0,0),
+d(1996,4,4,22,0,0),
+d(1996,9,19,22,0,0),
+d(1997,4,3,22,0,0),
+d(1997,9,18,22,0,0),
+d(1998,4,2,22,0,0),
+d(1998,9,17,22,0,0),
+d(1999,6,30,22,0,0),
+d(1999,9,29,22,0,0),
+d(2000,3,29,22,0,0),
+d(2000,9,27,22,0,0),
+d(2001,3,28,22,0,0),
+d(2001,9,26,22,0,0),
+d(2002,3,27,22,0,0),
+d(2002,9,25,22,0,0),
+d(2003,3,26,22,0,0),
+d(2003,10,23,22,0,0),
+d(2004,3,24,22,0,0),
+d(2004,10,14,22,0,0),
+d(2005,3,30,22,0,0),
+d(2005,9,29,22,0,0),
+d(2006,3,29,22,0,0),
+d(2006,10,26,22,0,0),
+d(2007,3,28,22,0,0),
+d(2007,10,25,22,0,0),
+d(2008,3,26,22,0,0),
+d(2008,10,30,22,0,0),
+d(2009,3,25,22,0,0),
+d(2009,10,29,22,0,0),
+d(2010,3,24,22,0,0),
+d(2010,10,28,22,0,0),
+d(2011,3,30,22,0,0),
+d(2011,10,27,22,0,0),
+d(2012,3,28,22,0,0),
+d(2012,10,25,22,0,0),
+d(2013,3,27,22,0,0),
+d(2013,10,24,22,0,0),
+d(2014,3,26,22,0,0),
+d(2014,10,30,22,0,0),
+d(2015,3,25,22,0,0),
+d(2015,10,29,22,0,0),
+d(2016,3,30,22,0,0),
+d(2016,10,27,22,0,0),
+d(2017,3,29,22,0,0),
+d(2017,10,26,22,0,0),
+d(2018,3,28,22,0,0),
+d(2018,10,25,22,0,0),
+d(2019,3,27,22,0,0),
+d(2019,10,24,22,0,0),
+d(2020,3,25,22,0,0),
+d(2020,10,29,22,0,0),
+d(2021,3,24,22,0,0),
+d(2021,10,28,22,0,0),
+d(2022,3,30,22,0,0),
+d(2022,10,27,22,0,0),
+d(2023,3,29,22,0,0),
+d(2023,10,26,22,0,0),
+d(2024,3,27,22,0,0),
+d(2024,10,24,22,0,0),
+d(2025,3,26,22,0,0),
+d(2025,10,30,22,0,0),
+d(2026,3,25,22,0,0),
+d(2026,10,29,22,0,0),
+d(2027,3,24,22,0,0),
+d(2027,10,28,22,0,0),
+d(2028,3,29,22,0,0),
+d(2028,10,26,22,0,0),
+d(2029,3,28,22,0,0),
+d(2029,10,25,22,0,0),
+d(2030,3,27,22,0,0),
+d(2030,10,24,22,0,0),
+d(2031,3,26,22,0,0),
+d(2031,10,30,22,0,0),
+d(2032,3,24,22,0,0),
+d(2032,10,28,22,0,0),
+d(2033,3,30,22,0,0),
+d(2033,10,27,22,0,0),
+d(2034,3,29,22,0,0),
+d(2034,10,26,22,0,0),
+d(2035,3,28,22,0,0),
+d(2035,10,25,22,0,0),
+d(2036,3,26,22,0,0),
+d(2036,10,30,22,0,0),
+d(2037,3,25,22,0,0),
+d(2037,10,29,22,0,0),
+        ]
+
+    _transition_info = [
+i(8640,0,'LMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Amman = Amman()
+
diff --git a/lib/pytz/zoneinfo/Asia/Anadyr.py b/lib/pytz/zoneinfo/Asia/Anadyr.py
new file mode 100755
index 0000000..37b50af
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Anadyr.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Anadyr.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Anadyr(DstTzInfo):
+    '''Asia/Anadyr timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Anadyr'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,12,10,4),
+d(1930,6,20,12,0,0),
+d(1981,3,31,11,0,0),
+d(1981,9,30,10,0,0),
+d(1982,3,31,11,0,0),
+d(1982,9,30,11,0,0),
+d(1983,3,31,12,0,0),
+d(1983,9,30,11,0,0),
+d(1984,3,31,12,0,0),
+d(1984,9,29,14,0,0),
+d(1985,3,30,14,0,0),
+d(1985,9,28,14,0,0),
+d(1986,3,29,14,0,0),
+d(1986,9,27,14,0,0),
+d(1987,3,28,14,0,0),
+d(1987,9,26,14,0,0),
+d(1988,3,26,14,0,0),
+d(1988,9,24,14,0,0),
+d(1989,3,25,14,0,0),
+d(1989,9,23,14,0,0),
+d(1990,3,24,14,0,0),
+d(1990,9,29,14,0,0),
+d(1991,3,30,14,0,0),
+d(1991,9,28,15,0,0),
+d(1992,1,18,15,0,0),
+d(1992,3,28,11,0,0),
+d(1992,9,26,10,0,0),
+d(1993,3,27,14,0,0),
+d(1993,9,25,14,0,0),
+d(1994,3,26,14,0,0),
+d(1994,9,24,14,0,0),
+d(1995,3,25,14,0,0),
+d(1995,9,23,14,0,0),
+d(1996,3,30,14,0,0),
+d(1996,10,26,14,0,0),
+d(1997,3,29,14,0,0),
+d(1997,10,25,14,0,0),
+d(1998,3,28,14,0,0),
+d(1998,10,24,14,0,0),
+d(1999,3,27,14,0,0),
+d(1999,10,30,14,0,0),
+d(2000,3,25,14,0,0),
+d(2000,10,28,14,0,0),
+d(2001,3,24,14,0,0),
+d(2001,10,27,14,0,0),
+d(2002,3,30,14,0,0),
+d(2002,10,26,14,0,0),
+d(2003,3,29,14,0,0),
+d(2003,10,25,14,0,0),
+d(2004,3,27,14,0,0),
+d(2004,10,30,14,0,0),
+d(2005,3,26,14,0,0),
+d(2005,10,29,14,0,0),
+d(2006,3,25,14,0,0),
+d(2006,10,28,14,0,0),
+d(2007,3,24,14,0,0),
+d(2007,10,27,14,0,0),
+d(2008,3,29,14,0,0),
+d(2008,10,25,14,0,0),
+d(2009,3,28,14,0,0),
+d(2009,10,24,14,0,0),
+d(2010,3,27,14,0,0),
+d(2010,10,30,14,0,0),
+d(2011,3,26,14,0,0),
+d(2011,10,29,14,0,0),
+d(2012,3,24,14,0,0),
+d(2012,10,27,14,0,0),
+d(2013,3,30,14,0,0),
+d(2013,10,26,14,0,0),
+d(2014,3,29,14,0,0),
+d(2014,10,25,14,0,0),
+d(2015,3,28,14,0,0),
+d(2015,10,24,14,0,0),
+d(2016,3,26,14,0,0),
+d(2016,10,29,14,0,0),
+d(2017,3,25,14,0,0),
+d(2017,10,28,14,0,0),
+d(2018,3,24,14,0,0),
+d(2018,10,27,14,0,0),
+d(2019,3,30,14,0,0),
+d(2019,10,26,14,0,0),
+d(2020,3,28,14,0,0),
+d(2020,10,24,14,0,0),
+d(2021,3,27,14,0,0),
+d(2021,10,30,14,0,0),
+d(2022,3,26,14,0,0),
+d(2022,10,29,14,0,0),
+d(2023,3,25,14,0,0),
+d(2023,10,28,14,0,0),
+d(2024,3,30,14,0,0),
+d(2024,10,26,14,0,0),
+d(2025,3,29,14,0,0),
+d(2025,10,25,14,0,0),
+d(2026,3,28,14,0,0),
+d(2026,10,24,14,0,0),
+d(2027,3,27,14,0,0),
+d(2027,10,30,14,0,0),
+d(2028,3,25,14,0,0),
+d(2028,10,28,14,0,0),
+d(2029,3,24,14,0,0),
+d(2029,10,27,14,0,0),
+d(2030,3,30,14,0,0),
+d(2030,10,26,14,0,0),
+d(2031,3,29,14,0,0),
+d(2031,10,25,14,0,0),
+d(2032,3,27,14,0,0),
+d(2032,10,30,14,0,0),
+d(2033,3,26,14,0,0),
+d(2033,10,29,14,0,0),
+d(2034,3,25,14,0,0),
+d(2034,10,28,14,0,0),
+d(2035,3,24,14,0,0),
+d(2035,10,27,14,0,0),
+d(2036,3,29,14,0,0),
+d(2036,10,25,14,0,0),
+d(2037,3,28,14,0,0),
+d(2037,10,24,14,0,0),
+        ]
+
+    _transition_info = [
+i(42600,0,'LMT'),
+i(43200,0,'ANAT'),
+i(46800,0,'ANAT'),
+i(50400,3600,'ANAST'),
+i(46800,0,'ANAT'),
+i(46800,0,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(43200,0,'ANAST'),
+i(39600,0,'ANAT'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+i(46800,3600,'ANAST'),
+i(43200,0,'ANAT'),
+        ]
+
+Anadyr = Anadyr()
+
diff --git a/lib/pytz/zoneinfo/Asia/Aqtau.py b/lib/pytz/zoneinfo/Asia/Aqtau.py
new file mode 100755
index 0000000..319f007
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Aqtau.py
@@ -0,0 +1,122 @@
+'''tzinfo timezone information for Asia/Aqtau.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Aqtau(DstTzInfo):
+    '''Asia/Aqtau timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Aqtau'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,20,38,56),
+d(1930,6,20,20,0,0),
+d(1962,12,31,19,0,0),
+d(1981,9,30,19,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,18,0,0),
+d(1983,3,31,19,0,0),
+d(1983,9,30,18,0,0),
+d(1984,3,31,19,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,21,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,21,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,21,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,21,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,21,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,21,0,0),
+d(1990,9,29,21,0,0),
+d(1990,12,31,19,0,0),
+d(1991,12,15,19,0,0),
+d(1992,3,28,18,0,0),
+d(1992,9,26,17,0,0),
+d(1993,3,27,21,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,21,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,21,0,0),
+d(1995,9,23,22,0,0),
+d(1996,3,30,22,0,0),
+d(1996,10,26,22,0,0),
+d(1997,3,29,22,0,0),
+d(1997,10,25,22,0,0),
+d(1998,3,28,22,0,0),
+d(1998,10,24,22,0,0),
+d(1999,3,27,22,0,0),
+d(1999,10,30,22,0,0),
+d(2000,3,25,22,0,0),
+d(2000,10,28,22,0,0),
+d(2001,3,24,22,0,0),
+d(2001,10,27,22,0,0),
+d(2002,3,30,22,0,0),
+d(2002,10,26,22,0,0),
+d(2003,3,29,22,0,0),
+d(2003,10,25,22,0,0),
+d(2004,3,27,22,0,0),
+d(2004,10,30,22,0,0),
+d(2005,3,14,20,0,0),
+        ]
+
+    _transition_info = [
+i(12060,0,'LMT'),
+i(14400,0,'FORT'),
+i(18000,0,'FORT'),
+i(18000,0,'SHET'),
+i(21600,0,'SHET'),
+i(21600,0,'SHEST'),
+i(18000,0,'SHET'),
+i(21600,3600,'SHEST'),
+i(18000,0,'SHET'),
+i(21600,3600,'SHEST'),
+i(18000,0,'SHET'),
+i(21600,3600,'SHEST'),
+i(18000,0,'SHET'),
+i(21600,3600,'SHEST'),
+i(18000,0,'SHET'),
+i(21600,3600,'SHEST'),
+i(18000,0,'SHET'),
+i(21600,3600,'SHEST'),
+i(18000,0,'SHET'),
+i(21600,3600,'SHEST'),
+i(18000,0,'SHET'),
+i(21600,3600,'SHEST'),
+i(18000,0,'SHET'),
+i(18000,0,'SHET'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(18000,0,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,3600,'AQTST'),
+i(14400,0,'AQTT'),
+i(18000,0,'AQTT'),
+        ]
+
+Aqtau = Aqtau()
+
diff --git a/lib/pytz/zoneinfo/Asia/Aqtobe.py b/lib/pytz/zoneinfo/Asia/Aqtobe.py
new file mode 100755
index 0000000..2169a72
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Aqtobe.py
@@ -0,0 +1,122 @@
+'''tzinfo timezone information for Asia/Aqtobe.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Aqtobe(DstTzInfo):
+    '''Asia/Aqtobe timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Aqtobe'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,20,11,20),
+d(1930,6,20,20,0,0),
+d(1981,3,31,19,0,0),
+d(1981,9,30,18,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,18,0,0),
+d(1983,3,31,19,0,0),
+d(1983,9,30,18,0,0),
+d(1984,3,31,19,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,21,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,21,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,21,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,21,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,21,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,21,0,0),
+d(1990,9,29,21,0,0),
+d(1990,12,31,19,0,0),
+d(1991,12,15,19,0,0),
+d(1992,3,28,18,0,0),
+d(1992,9,26,17,0,0),
+d(1993,3,27,21,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,21,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,21,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,21,0,0),
+d(1996,10,26,21,0,0),
+d(1997,3,29,21,0,0),
+d(1997,10,25,21,0,0),
+d(1998,3,28,21,0,0),
+d(1998,10,24,21,0,0),
+d(1999,3,27,21,0,0),
+d(1999,10,30,21,0,0),
+d(2000,3,25,21,0,0),
+d(2000,10,28,21,0,0),
+d(2001,3,24,21,0,0),
+d(2001,10,27,21,0,0),
+d(2002,3,30,21,0,0),
+d(2002,10,26,21,0,0),
+d(2003,3,29,21,0,0),
+d(2003,10,25,21,0,0),
+d(2004,3,27,21,0,0),
+d(2004,10,30,21,0,0),
+d(2005,3,14,19,0,0),
+        ]
+
+    _transition_info = [
+i(13740,0,'LMT'),
+i(14400,0,'AKTT'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(21600,0,'AKTT'),
+i(21600,0,'AKTST'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(18000,0,'AKTT'),
+i(21600,3600,'AKTST'),
+i(18000,0,'AKTT'),
+i(18000,0,'AKTT'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(21600,3600,'AQTST'),
+i(18000,0,'AQTT'),
+i(18000,0,'AQTT'),
+        ]
+
+Aqtobe = Aqtobe()
+
diff --git a/lib/pytz/zoneinfo/Asia/Ashgabat.py b/lib/pytz/zoneinfo/Asia/Ashgabat.py
new file mode 100755
index 0000000..92137c8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Ashgabat.py
@@ -0,0 +1,72 @@
+'''tzinfo timezone information for Asia/Ashgabat.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ashgabat(DstTzInfo):
+    '''Asia/Ashgabat timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Ashgabat'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,20,6,28),
+d(1930,6,20,20,0,0),
+d(1981,3,31,19,0,0),
+d(1981,9,30,18,0,0),
+d(1982,3,31,19,0,0),
+d(1982,9,30,18,0,0),
+d(1983,3,31,19,0,0),
+d(1983,9,30,18,0,0),
+d(1984,3,31,19,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,21,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,21,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,21,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,21,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,21,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,21,0,0),
+d(1990,9,29,21,0,0),
+d(1991,3,30,21,0,0),
+d(1991,9,28,22,0,0),
+d(1991,10,26,20,0,0),
+d(1992,1,18,22,0,0),
+        ]
+
+    _transition_info = [
+i(14040,0,'LMT'),
+i(14400,0,'ASHT'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(18000,0,'ASHST'),
+i(14400,0,'ASHT'),
+i(14400,0,'TMT'),
+i(18000,0,'TMT'),
+        ]
+
+Ashgabat = Ashgabat()
+
diff --git a/lib/pytz/zoneinfo/Asia/Ashkhabad.py b/lib/pytz/zoneinfo/Asia/Ashkhabad.py
new file mode 100755
index 0000000..a99394d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Ashkhabad.py
@@ -0,0 +1,72 @@
+'''tzinfo timezone information for Asia/Ashkhabad.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ashkhabad(DstTzInfo):
+    '''Asia/Ashkhabad timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Ashkhabad'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,20,6,28),
+d(1930,6,20,20,0,0),
+d(1981,3,31,19,0,0),
+d(1981,9,30,18,0,0),
+d(1982,3,31,19,0,0),
+d(1982,9,30,18,0,0),
+d(1983,3,31,19,0,0),
+d(1983,9,30,18,0,0),
+d(1984,3,31,19,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,21,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,21,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,21,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,21,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,21,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,21,0,0),
+d(1990,9,29,21,0,0),
+d(1991,3,30,21,0,0),
+d(1991,9,28,22,0,0),
+d(1991,10,26,20,0,0),
+d(1992,1,18,22,0,0),
+        ]
+
+    _transition_info = [
+i(14040,0,'LMT'),
+i(14400,0,'ASHT'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(21600,3600,'ASHST'),
+i(18000,0,'ASHT'),
+i(18000,0,'ASHST'),
+i(14400,0,'ASHT'),
+i(14400,0,'TMT'),
+i(18000,0,'TMT'),
+        ]
+
+Ashkhabad = Ashkhabad()
+
diff --git a/lib/pytz/zoneinfo/Asia/Baghdad.py b/lib/pytz/zoneinfo/Asia/Baghdad.py
new file mode 100755
index 0000000..8492cb2
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Baghdad.py
@@ -0,0 +1,246 @@
+'''tzinfo timezone information for Asia/Baghdad.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Baghdad(DstTzInfo):
+    '''Asia/Baghdad timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Baghdad'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,12,31,21,2,24),
+d(1982,4,30,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,30,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,30,20,0,0),
+d(1985,3,31,21,0,0),
+d(1985,9,28,22,0,0),
+d(1986,3,29,22,0,0),
+d(1986,9,27,22,0,0),
+d(1987,3,28,22,0,0),
+d(1987,9,26,22,0,0),
+d(1988,3,26,22,0,0),
+d(1988,9,24,22,0,0),
+d(1989,3,25,22,0,0),
+d(1989,9,23,22,0,0),
+d(1990,3,24,22,0,0),
+d(1990,9,29,22,0,0),
+d(1991,4,1,0,0,0),
+d(1991,10,1,0,0,0),
+d(1992,4,1,0,0,0),
+d(1992,10,1,0,0,0),
+d(1993,4,1,0,0,0),
+d(1993,10,1,0,0,0),
+d(1994,4,1,0,0,0),
+d(1994,10,1,0,0,0),
+d(1995,4,1,0,0,0),
+d(1995,10,1,0,0,0),
+d(1996,4,1,0,0,0),
+d(1996,10,1,0,0,0),
+d(1997,4,1,0,0,0),
+d(1997,10,1,0,0,0),
+d(1998,4,1,0,0,0),
+d(1998,10,1,0,0,0),
+d(1999,4,1,0,0,0),
+d(1999,10,1,0,0,0),
+d(2000,4,1,0,0,0),
+d(2000,10,1,0,0,0),
+d(2001,4,1,0,0,0),
+d(2001,10,1,0,0,0),
+d(2002,4,1,0,0,0),
+d(2002,10,1,0,0,0),
+d(2003,4,1,0,0,0),
+d(2003,10,1,0,0,0),
+d(2004,4,1,0,0,0),
+d(2004,10,1,0,0,0),
+d(2005,4,1,0,0,0),
+d(2005,10,1,0,0,0),
+d(2006,4,1,0,0,0),
+d(2006,10,1,0,0,0),
+d(2007,4,1,0,0,0),
+d(2007,10,1,0,0,0),
+d(2008,4,1,0,0,0),
+d(2008,10,1,0,0,0),
+d(2009,4,1,0,0,0),
+d(2009,10,1,0,0,0),
+d(2010,4,1,0,0,0),
+d(2010,10,1,0,0,0),
+d(2011,4,1,0,0,0),
+d(2011,10,1,0,0,0),
+d(2012,4,1,0,0,0),
+d(2012,10,1,0,0,0),
+d(2013,4,1,0,0,0),
+d(2013,10,1,0,0,0),
+d(2014,4,1,0,0,0),
+d(2014,10,1,0,0,0),
+d(2015,4,1,0,0,0),
+d(2015,10,1,0,0,0),
+d(2016,4,1,0,0,0),
+d(2016,10,1,0,0,0),
+d(2017,4,1,0,0,0),
+d(2017,10,1,0,0,0),
+d(2018,4,1,0,0,0),
+d(2018,10,1,0,0,0),
+d(2019,4,1,0,0,0),
+d(2019,10,1,0,0,0),
+d(2020,4,1,0,0,0),
+d(2020,10,1,0,0,0),
+d(2021,4,1,0,0,0),
+d(2021,10,1,0,0,0),
+d(2022,4,1,0,0,0),
+d(2022,10,1,0,0,0),
+d(2023,4,1,0,0,0),
+d(2023,10,1,0,0,0),
+d(2024,4,1,0,0,0),
+d(2024,10,1,0,0,0),
+d(2025,4,1,0,0,0),
+d(2025,10,1,0,0,0),
+d(2026,4,1,0,0,0),
+d(2026,10,1,0,0,0),
+d(2027,4,1,0,0,0),
+d(2027,10,1,0,0,0),
+d(2028,4,1,0,0,0),
+d(2028,10,1,0,0,0),
+d(2029,4,1,0,0,0),
+d(2029,10,1,0,0,0),
+d(2030,4,1,0,0,0),
+d(2030,10,1,0,0,0),
+d(2031,4,1,0,0,0),
+d(2031,10,1,0,0,0),
+d(2032,4,1,0,0,0),
+d(2032,10,1,0,0,0),
+d(2033,4,1,0,0,0),
+d(2033,10,1,0,0,0),
+d(2034,4,1,0,0,0),
+d(2034,10,1,0,0,0),
+d(2035,4,1,0,0,0),
+d(2035,10,1,0,0,0),
+d(2036,4,1,0,0,0),
+d(2036,10,1,0,0,0),
+d(2037,4,1,0,0,0),
+d(2037,10,1,0,0,0),
+        ]
+
+    _transition_info = [
+i(10680,0,'BMT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+i(14400,3600,'ADT'),
+i(10800,0,'AST'),
+        ]
+
+Baghdad = Baghdad()
+
diff --git a/lib/pytz/zoneinfo/Asia/Bahrain.py b/lib/pytz/zoneinfo/Asia/Bahrain.py
new file mode 100755
index 0000000..116d489
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Bahrain.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Asia/Bahrain.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bahrain(DstTzInfo):
+    '''Asia/Bahrain timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Bahrain'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,20,37,40),
+d(1972,5,31,20,0,0),
+        ]
+
+    _transition_info = [
+i(12120,0,'LMT'),
+i(14400,0,'GST'),
+i(10800,0,'AST'),
+        ]
+
+Bahrain = Bahrain()
+
diff --git a/lib/pytz/zoneinfo/Asia/Baku.py b/lib/pytz/zoneinfo/Asia/Baku.py
new file mode 100755
index 0000000..9efeb81
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Baku.py
@@ -0,0 +1,244 @@
+'''tzinfo timezone information for Asia/Baku.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Baku(DstTzInfo):
+    '''Asia/Baku timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Baku'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,20,40,36),
+d(1957,2,28,21,0,0),
+d(1981,3,31,20,0,0),
+d(1981,9,30,19,0,0),
+d(1982,3,31,20,0,0),
+d(1982,9,30,19,0,0),
+d(1983,3,31,20,0,0),
+d(1983,9,30,19,0,0),
+d(1984,3,31,20,0,0),
+d(1984,9,29,22,0,0),
+d(1985,3,30,22,0,0),
+d(1985,9,28,22,0,0),
+d(1986,3,29,22,0,0),
+d(1986,9,27,22,0,0),
+d(1987,3,28,22,0,0),
+d(1987,9,26,22,0,0),
+d(1988,3,26,22,0,0),
+d(1988,9,24,22,0,0),
+d(1989,3,25,22,0,0),
+d(1989,9,23,22,0,0),
+d(1990,3,24,22,0,0),
+d(1990,9,29,22,0,0),
+d(1991,3,30,22,0,0),
+d(1991,8,29,20,0,0),
+d(1991,9,28,23,0,0),
+d(1992,3,28,20,0,0),
+d(1992,9,26,19,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1996,12,31,20,0,0),
+d(1997,3,30,0,0,0),
+d(1997,10,26,0,0,0),
+d(1998,3,29,0,0,0),
+d(1998,10,25,0,0,0),
+d(1999,3,28,0,0,0),
+d(1999,10,31,0,0,0),
+d(2000,3,26,0,0,0),
+d(2000,10,29,0,0,0),
+d(2001,3,25,0,0,0),
+d(2001,10,28,0,0,0),
+d(2002,3,31,0,0,0),
+d(2002,10,27,0,0,0),
+d(2003,3,30,0,0,0),
+d(2003,10,26,0,0,0),
+d(2004,3,28,0,0,0),
+d(2004,10,31,0,0,0),
+d(2005,3,27,0,0,0),
+d(2005,10,30,0,0,0),
+d(2006,3,26,0,0,0),
+d(2006,10,29,0,0,0),
+d(2007,3,25,0,0,0),
+d(2007,10,28,0,0,0),
+d(2008,3,30,0,0,0),
+d(2008,10,26,0,0,0),
+d(2009,3,29,0,0,0),
+d(2009,10,25,0,0,0),
+d(2010,3,28,0,0,0),
+d(2010,10,31,0,0,0),
+d(2011,3,27,0,0,0),
+d(2011,10,30,0,0,0),
+d(2012,3,25,0,0,0),
+d(2012,10,28,0,0,0),
+d(2013,3,31,0,0,0),
+d(2013,10,27,0,0,0),
+d(2014,3,30,0,0,0),
+d(2014,10,26,0,0,0),
+d(2015,3,29,0,0,0),
+d(2015,10,25,0,0,0),
+d(2016,3,27,0,0,0),
+d(2016,10,30,0,0,0),
+d(2017,3,26,0,0,0),
+d(2017,10,29,0,0,0),
+d(2018,3,25,0,0,0),
+d(2018,10,28,0,0,0),
+d(2019,3,31,0,0,0),
+d(2019,10,27,0,0,0),
+d(2020,3,29,0,0,0),
+d(2020,10,25,0,0,0),
+d(2021,3,28,0,0,0),
+d(2021,10,31,0,0,0),
+d(2022,3,27,0,0,0),
+d(2022,10,30,0,0,0),
+d(2023,3,26,0,0,0),
+d(2023,10,29,0,0,0),
+d(2024,3,31,0,0,0),
+d(2024,10,27,0,0,0),
+d(2025,3,30,0,0,0),
+d(2025,10,26,0,0,0),
+d(2026,3,29,0,0,0),
+d(2026,10,25,0,0,0),
+d(2027,3,28,0,0,0),
+d(2027,10,31,0,0,0),
+d(2028,3,26,0,0,0),
+d(2028,10,29,0,0,0),
+d(2029,3,25,0,0,0),
+d(2029,10,28,0,0,0),
+d(2030,3,31,0,0,0),
+d(2030,10,27,0,0,0),
+d(2031,3,30,0,0,0),
+d(2031,10,26,0,0,0),
+d(2032,3,28,0,0,0),
+d(2032,10,31,0,0,0),
+d(2033,3,27,0,0,0),
+d(2033,10,30,0,0,0),
+d(2034,3,26,0,0,0),
+d(2034,10,29,0,0,0),
+d(2035,3,25,0,0,0),
+d(2035,10,28,0,0,0),
+d(2036,3,30,0,0,0),
+d(2036,10,26,0,0,0),
+d(2037,3,29,0,0,0),
+d(2037,10,25,0,0,0),
+        ]
+
+    _transition_info = [
+i(11940,0,'LMT'),
+i(10800,0,'BAKT'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(18000,3600,'BAKST'),
+i(14400,0,'BAKT'),
+i(14400,0,'BAKST'),
+i(14400,0,'AZST'),
+i(10800,0,'AZT'),
+i(14400,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+i(18000,3600,'AZST'),
+i(14400,0,'AZT'),
+        ]
+
+Baku = Baku()
+
diff --git a/lib/pytz/zoneinfo/Asia/Bangkok.py b/lib/pytz/zoneinfo/Asia/Bangkok.py
new file mode 100755
index 0000000..e133e80
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Bangkok.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Asia/Bangkok.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bangkok(DstTzInfo):
+    '''Asia/Bangkok timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Bangkok'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,3,31,17,17,56),
+        ]
+
+    _transition_info = [
+i(24120,0,'BMT'),
+i(25200,0,'ICT'),
+        ]
+
+Bangkok = Bangkok()
+
diff --git a/lib/pytz/zoneinfo/Asia/Beirut.py b/lib/pytz/zoneinfo/Asia/Beirut.py
new file mode 100755
index 0000000..5bfad43
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Beirut.py
@@ -0,0 +1,300 @@
+'''tzinfo timezone information for Asia/Beirut.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Beirut(DstTzInfo):
+    '''Asia/Beirut timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Beirut'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,3,27,22,0,0),
+d(1920,10,24,21,0,0),
+d(1921,4,2,22,0,0),
+d(1921,10,2,21,0,0),
+d(1922,3,25,22,0,0),
+d(1922,10,7,21,0,0),
+d(1923,4,21,22,0,0),
+d(1923,9,15,21,0,0),
+d(1957,4,30,22,0,0),
+d(1957,9,30,21,0,0),
+d(1958,4,30,22,0,0),
+d(1958,9,30,21,0,0),
+d(1959,4,30,22,0,0),
+d(1959,9,30,21,0,0),
+d(1960,4,30,22,0,0),
+d(1960,9,30,21,0,0),
+d(1961,4,30,22,0,0),
+d(1961,9,30,21,0,0),
+d(1972,6,21,22,0,0),
+d(1972,9,30,21,0,0),
+d(1973,4,30,22,0,0),
+d(1973,9,30,21,0,0),
+d(1974,4,30,22,0,0),
+d(1974,9,30,21,0,0),
+d(1975,4,30,22,0,0),
+d(1975,9,30,21,0,0),
+d(1976,4,30,22,0,0),
+d(1976,9,30,21,0,0),
+d(1977,4,30,22,0,0),
+d(1977,9,30,21,0,0),
+d(1978,4,29,22,0,0),
+d(1978,9,29,21,0,0),
+d(1984,4,30,22,0,0),
+d(1984,10,15,21,0,0),
+d(1985,4,30,22,0,0),
+d(1985,10,15,21,0,0),
+d(1986,4,30,22,0,0),
+d(1986,10,15,21,0,0),
+d(1987,4,30,22,0,0),
+d(1987,10,15,21,0,0),
+d(1988,5,31,22,0,0),
+d(1988,10,15,21,0,0),
+d(1989,5,9,22,0,0),
+d(1989,10,15,21,0,0),
+d(1990,4,30,22,0,0),
+d(1990,10,15,21,0,0),
+d(1991,4,30,22,0,0),
+d(1991,10,15,21,0,0),
+d(1992,4,30,22,0,0),
+d(1992,10,3,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,22,0,0),
+d(1996,9,28,21,0,0),
+d(1997,3,29,22,0,0),
+d(1997,9,27,21,0,0),
+d(1998,3,28,22,0,0),
+d(1998,9,26,21,0,0),
+d(1999,3,27,22,0,0),
+d(1999,10,30,21,0,0),
+d(2000,3,25,22,0,0),
+d(2000,10,28,21,0,0),
+d(2001,3,24,22,0,0),
+d(2001,10,27,21,0,0),
+d(2002,3,30,22,0,0),
+d(2002,10,26,21,0,0),
+d(2003,3,29,22,0,0),
+d(2003,10,25,21,0,0),
+d(2004,3,27,22,0,0),
+d(2004,10,30,21,0,0),
+d(2005,3,26,22,0,0),
+d(2005,10,29,21,0,0),
+d(2006,3,25,22,0,0),
+d(2006,10,28,21,0,0),
+d(2007,3,24,22,0,0),
+d(2007,10,27,21,0,0),
+d(2008,3,29,22,0,0),
+d(2008,10,25,21,0,0),
+d(2009,3,28,22,0,0),
+d(2009,10,24,21,0,0),
+d(2010,3,27,22,0,0),
+d(2010,10,30,21,0,0),
+d(2011,3,26,22,0,0),
+d(2011,10,29,21,0,0),
+d(2012,3,24,22,0,0),
+d(2012,10,27,21,0,0),
+d(2013,3,30,22,0,0),
+d(2013,10,26,21,0,0),
+d(2014,3,29,22,0,0),
+d(2014,10,25,21,0,0),
+d(2015,3,28,22,0,0),
+d(2015,10,24,21,0,0),
+d(2016,3,26,22,0,0),
+d(2016,10,29,21,0,0),
+d(2017,3,25,22,0,0),
+d(2017,10,28,21,0,0),
+d(2018,3,24,22,0,0),
+d(2018,10,27,21,0,0),
+d(2019,3,30,22,0,0),
+d(2019,10,26,21,0,0),
+d(2020,3,28,22,0,0),
+d(2020,10,24,21,0,0),
+d(2021,3,27,22,0,0),
+d(2021,10,30,21,0,0),
+d(2022,3,26,22,0,0),
+d(2022,10,29,21,0,0),
+d(2023,3,25,22,0,0),
+d(2023,10,28,21,0,0),
+d(2024,3,30,22,0,0),
+d(2024,10,26,21,0,0),
+d(2025,3,29,22,0,0),
+d(2025,10,25,21,0,0),
+d(2026,3,28,22,0,0),
+d(2026,10,24,21,0,0),
+d(2027,3,27,22,0,0),
+d(2027,10,30,21,0,0),
+d(2028,3,25,22,0,0),
+d(2028,10,28,21,0,0),
+d(2029,3,24,22,0,0),
+d(2029,10,27,21,0,0),
+d(2030,3,30,22,0,0),
+d(2030,10,26,21,0,0),
+d(2031,3,29,22,0,0),
+d(2031,10,25,21,0,0),
+d(2032,3,27,22,0,0),
+d(2032,10,30,21,0,0),
+d(2033,3,26,22,0,0),
+d(2033,10,29,21,0,0),
+d(2034,3,25,22,0,0),
+d(2034,10,28,21,0,0),
+d(2035,3,24,22,0,0),
+d(2035,10,27,21,0,0),
+d(2036,3,29,22,0,0),
+d(2036,10,25,21,0,0),
+d(2037,3,28,22,0,0),
+d(2037,10,24,21,0,0),
+        ]
+
+    _transition_info = [
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Beirut = Beirut()
+
diff --git a/lib/pytz/zoneinfo/Asia/Bishkek.py b/lib/pytz/zoneinfo/Asia/Bishkek.py
new file mode 100755
index 0000000..e5eb11b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Bishkek.py
@@ -0,0 +1,124 @@
+'''tzinfo timezone information for Asia/Bishkek.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bishkek(DstTzInfo):
+    '''Asia/Bishkek timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Bishkek'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,19,1,36),
+d(1930,6,20,19,0,0),
+d(1981,3,31,18,0,0),
+d(1981,9,30,17,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,17,0,0),
+d(1983,3,31,18,0,0),
+d(1983,9,30,17,0,0),
+d(1984,3,31,18,0,0),
+d(1984,9,29,20,0,0),
+d(1985,3,30,20,0,0),
+d(1985,9,28,20,0,0),
+d(1986,3,29,20,0,0),
+d(1986,9,27,20,0,0),
+d(1987,3,28,20,0,0),
+d(1987,9,26,20,0,0),
+d(1988,3,26,20,0,0),
+d(1988,9,24,20,0,0),
+d(1989,3,25,20,0,0),
+d(1989,9,23,20,0,0),
+d(1990,3,24,20,0,0),
+d(1990,9,29,20,0,0),
+d(1991,3,30,20,0,0),
+d(1991,8,30,20,0,0),
+d(1992,4,11,19,0,0),
+d(1992,9,26,18,0,0),
+d(1993,4,10,19,0,0),
+d(1993,9,25,18,0,0),
+d(1994,4,9,19,0,0),
+d(1994,9,24,18,0,0),
+d(1995,4,8,19,0,0),
+d(1995,9,23,18,0,0),
+d(1996,4,6,19,0,0),
+d(1996,9,28,18,0,0),
+d(1997,3,29,21,30,0),
+d(1997,10,25,20,30,0),
+d(1998,3,28,21,30,0),
+d(1998,10,24,20,30,0),
+d(1999,3,27,21,30,0),
+d(1999,10,30,20,30,0),
+d(2000,3,25,21,30,0),
+d(2000,10,28,20,30,0),
+d(2001,3,24,21,30,0),
+d(2001,10,27,20,30,0),
+d(2002,3,30,21,30,0),
+d(2002,10,26,20,30,0),
+d(2003,3,29,21,30,0),
+d(2003,10,25,20,30,0),
+d(2004,3,27,21,30,0),
+d(2004,10,30,20,30,0),
+d(2005,3,26,21,30,0),
+d(2005,8,11,18,0,0),
+        ]
+
+    _transition_info = [
+i(17880,0,'LMT'),
+i(18000,0,'FRUT'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(25200,3600,'FRUST'),
+i(21600,0,'FRUT'),
+i(21600,0,'FRUST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(18000,0,'KGT'),
+i(21600,3600,'KGST'),
+i(21600,0,'KGT'),
+        ]
+
+Bishkek = Bishkek()
+
diff --git a/lib/pytz/zoneinfo/Asia/Brunei.py b/lib/pytz/zoneinfo/Asia/Brunei.py
new file mode 100755
index 0000000..fbbc5a0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Brunei.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Asia/Brunei.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Brunei(DstTzInfo):
+    '''Asia/Brunei timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Brunei'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1926,2,28,16,20,20),
+d(1932,12,31,16,30,0),
+        ]
+
+    _transition_info = [
+i(27600,0,'LMT'),
+i(27000,0,'BNT'),
+i(28800,0,'BNT'),
+        ]
+
+Brunei = Brunei()
+
diff --git a/lib/pytz/zoneinfo/Asia/Calcutta.py b/lib/pytz/zoneinfo/Asia/Calcutta.py
new file mode 100755
index 0000000..08e3f93
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Calcutta.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Asia/Calcutta.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Calcutta(DstTzInfo):
+    '''Asia/Calcutta timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Calcutta'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,9,30,18,6,40),
+d(1942,5,14,17,30,0),
+d(1942,8,31,18,30,0),
+d(1945,10,14,17,30,0),
+        ]
+
+    _transition_info = [
+i(21180,0,'HMT'),
+i(23400,0,'BURT'),
+i(19800,0,'IST'),
+i(23400,3600,'IST'),
+i(19800,0,'IST'),
+        ]
+
+Calcutta = Calcutta()
+
diff --git a/lib/pytz/zoneinfo/Asia/Choibalsan.py b/lib/pytz/zoneinfo/Asia/Choibalsan.py
new file mode 100755
index 0000000..406dc4a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Choibalsan.py
@@ -0,0 +1,236 @@
+'''tzinfo timezone information for Asia/Choibalsan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Choibalsan(DstTzInfo):
+    '''Asia/Choibalsan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Choibalsan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,7,31,16,22,0),
+d(1977,12,31,17,0,0),
+d(1983,3,31,16,0,0),
+d(1983,9,30,14,0,0),
+d(1984,3,31,15,0,0),
+d(1984,9,29,14,0,0),
+d(1985,3,30,15,0,0),
+d(1985,9,28,14,0,0),
+d(1986,3,29,15,0,0),
+d(1986,9,27,14,0,0),
+d(1987,3,28,15,0,0),
+d(1987,9,26,14,0,0),
+d(1988,3,26,15,0,0),
+d(1988,9,24,14,0,0),
+d(1989,3,25,15,0,0),
+d(1989,9,23,14,0,0),
+d(1990,3,24,15,0,0),
+d(1990,9,29,14,0,0),
+d(1991,3,30,15,0,0),
+d(1991,9,28,14,0,0),
+d(1992,3,28,15,0,0),
+d(1992,9,26,14,0,0),
+d(1993,3,27,15,0,0),
+d(1993,9,25,14,0,0),
+d(1994,3,26,15,0,0),
+d(1994,9,24,14,0,0),
+d(1995,3,25,15,0,0),
+d(1995,9,23,14,0,0),
+d(1996,3,30,15,0,0),
+d(1996,9,28,14,0,0),
+d(1997,3,29,15,0,0),
+d(1997,9,27,14,0,0),
+d(1998,3,28,15,0,0),
+d(1998,9,26,14,0,0),
+d(2001,4,27,17,0,0),
+d(2001,9,28,16,0,0),
+d(2002,3,29,17,0,0),
+d(2002,9,27,16,0,0),
+d(2003,3,28,17,0,0),
+d(2003,9,26,16,0,0),
+d(2004,3,26,17,0,0),
+d(2004,9,24,16,0,0),
+d(2005,3,25,17,0,0),
+d(2005,9,23,16,0,0),
+d(2006,3,24,17,0,0),
+d(2006,9,29,16,0,0),
+d(2007,3,30,17,0,0),
+d(2007,9,28,16,0,0),
+d(2008,3,28,17,0,0),
+d(2008,9,26,16,0,0),
+d(2009,3,27,17,0,0),
+d(2009,9,25,16,0,0),
+d(2010,3,26,17,0,0),
+d(2010,9,24,16,0,0),
+d(2011,3,25,17,0,0),
+d(2011,9,23,16,0,0),
+d(2012,3,30,17,0,0),
+d(2012,9,28,16,0,0),
+d(2013,3,29,17,0,0),
+d(2013,9,27,16,0,0),
+d(2014,3,28,17,0,0),
+d(2014,9,26,16,0,0),
+d(2015,3,27,17,0,0),
+d(2015,9,25,16,0,0),
+d(2016,3,25,17,0,0),
+d(2016,9,23,16,0,0),
+d(2017,3,24,17,0,0),
+d(2017,9,29,16,0,0),
+d(2018,3,30,17,0,0),
+d(2018,9,28,16,0,0),
+d(2019,3,29,17,0,0),
+d(2019,9,27,16,0,0),
+d(2020,3,27,17,0,0),
+d(2020,9,25,16,0,0),
+d(2021,3,26,17,0,0),
+d(2021,9,24,16,0,0),
+d(2022,3,25,17,0,0),
+d(2022,9,23,16,0,0),
+d(2023,3,24,17,0,0),
+d(2023,9,29,16,0,0),
+d(2024,3,29,17,0,0),
+d(2024,9,27,16,0,0),
+d(2025,3,28,17,0,0),
+d(2025,9,26,16,0,0),
+d(2026,3,27,17,0,0),
+d(2026,9,25,16,0,0),
+d(2027,3,26,17,0,0),
+d(2027,9,24,16,0,0),
+d(2028,3,24,17,0,0),
+d(2028,9,29,16,0,0),
+d(2029,3,30,17,0,0),
+d(2029,9,28,16,0,0),
+d(2030,3,29,17,0,0),
+d(2030,9,27,16,0,0),
+d(2031,3,28,17,0,0),
+d(2031,9,26,16,0,0),
+d(2032,3,26,17,0,0),
+d(2032,9,24,16,0,0),
+d(2033,3,25,17,0,0),
+d(2033,9,23,16,0,0),
+d(2034,3,24,17,0,0),
+d(2034,9,29,16,0,0),
+d(2035,3,30,17,0,0),
+d(2035,9,28,16,0,0),
+d(2036,3,28,17,0,0),
+d(2036,9,26,16,0,0),
+d(2037,3,27,17,0,0),
+d(2037,9,25,16,0,0),
+        ]
+
+    _transition_info = [
+i(27480,0,'LMT'),
+i(25200,0,'ULAT'),
+i(28800,0,'ULAT'),
+i(36000,7200,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+i(36000,3600,'CHOST'),
+i(32400,0,'CHOT'),
+        ]
+
+Choibalsan = Choibalsan()
+
diff --git a/lib/pytz/zoneinfo/Asia/Chongqing.py b/lib/pytz/zoneinfo/Asia/Chongqing.py
new file mode 100755
index 0000000..40f8f62
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Chongqing.py
@@ -0,0 +1,48 @@
+'''tzinfo timezone information for Asia/Chongqing.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Chongqing(DstTzInfo):
+    '''Asia/Chongqing timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Chongqing'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,12,31,16,53,40),
+d(1980,4,30,17,0,0),
+d(1986,5,3,16,0,0),
+d(1986,9,13,15,0,0),
+d(1987,4,11,16,0,0),
+d(1987,9,12,15,0,0),
+d(1988,4,9,16,0,0),
+d(1988,9,10,15,0,0),
+d(1989,4,15,16,0,0),
+d(1989,9,16,15,0,0),
+d(1990,4,14,16,0,0),
+d(1990,9,15,15,0,0),
+d(1991,4,13,16,0,0),
+d(1991,9,14,15,0,0),
+        ]
+
+    _transition_info = [
+i(25560,0,'LMT'),
+i(25200,0,'LONT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+Chongqing = Chongqing()
+
diff --git a/lib/pytz/zoneinfo/Asia/Chungking.py b/lib/pytz/zoneinfo/Asia/Chungking.py
new file mode 100755
index 0000000..7f118ab
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Chungking.py
@@ -0,0 +1,48 @@
+'''tzinfo timezone information for Asia/Chungking.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Chungking(DstTzInfo):
+    '''Asia/Chungking timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Chungking'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,12,31,16,53,40),
+d(1980,4,30,17,0,0),
+d(1986,5,3,16,0,0),
+d(1986,9,13,15,0,0),
+d(1987,4,11,16,0,0),
+d(1987,9,12,15,0,0),
+d(1988,4,9,16,0,0),
+d(1988,9,10,15,0,0),
+d(1989,4,15,16,0,0),
+d(1989,9,16,15,0,0),
+d(1990,4,14,16,0,0),
+d(1990,9,15,15,0,0),
+d(1991,4,13,16,0,0),
+d(1991,9,14,15,0,0),
+        ]
+
+    _transition_info = [
+i(25560,0,'LMT'),
+i(25200,0,'LONT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+Chungking = Chungking()
+
diff --git a/lib/pytz/zoneinfo/Asia/Colombo.py b/lib/pytz/zoneinfo/Asia/Colombo.py
new file mode 100755
index 0000000..2ac7c70
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Colombo.py
@@ -0,0 +1,34 @@
+'''tzinfo timezone information for Asia/Colombo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Colombo(DstTzInfo):
+    '''Asia/Colombo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Colombo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,12,31,18,40,28),
+d(1942,1,4,18,30,0),
+d(1942,8,31,18,0,0),
+d(1945,10,15,19,30,0),
+d(1996,5,24,18,30,0),
+d(1996,10,25,18,0,0),
+d(2006,4,14,18,30,0),
+        ]
+
+    _transition_info = [
+i(19200,0,'MMT'),
+i(19800,0,'IST'),
+i(21600,1800,'IHST'),
+i(23400,3600,'IST'),
+i(19800,0,'IST'),
+i(23400,0,'LKT'),
+i(21600,0,'LKT'),
+i(19800,0,'IST'),
+        ]
+
+Colombo = Colombo()
+
diff --git a/lib/pytz/zoneinfo/Asia/Dacca.py b/lib/pytz/zoneinfo/Asia/Dacca.py
new file mode 100755
index 0000000..3093a3a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Dacca.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for Asia/Dacca.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dacca(DstTzInfo):
+    '''Asia/Dacca timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Dacca'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,9,30,18,6,40),
+d(1942,5,14,17,30,0),
+d(1942,8,31,18,30,0),
+d(1951,9,29,17,30,0),
+d(1971,3,25,18,0,0),
+        ]
+
+    _transition_info = [
+i(21180,0,'HMT'),
+i(23400,0,'BURT'),
+i(19800,0,'IST'),
+i(23400,0,'BURT'),
+i(21600,0,'DACT'),
+i(21600,0,'BDT'),
+        ]
+
+Dacca = Dacca()
+
diff --git a/lib/pytz/zoneinfo/Asia/Damascus.py b/lib/pytz/zoneinfo/Asia/Damascus.py
new file mode 100755
index 0000000..98164e0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Damascus.py
@@ -0,0 +1,322 @@
+'''tzinfo timezone information for Asia/Damascus.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Damascus(DstTzInfo):
+    '''Asia/Damascus timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Damascus'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,21,34,48),
+d(1920,4,18,0,0,0),
+d(1920,10,2,23,0,0),
+d(1921,4,17,0,0,0),
+d(1921,10,1,23,0,0),
+d(1922,4,16,0,0,0),
+d(1922,9,30,23,0,0),
+d(1923,4,15,0,0,0),
+d(1923,10,6,23,0,0),
+d(1962,4,29,0,0,0),
+d(1962,9,30,23,0,0),
+d(1963,5,1,0,0,0),
+d(1963,9,29,23,0,0),
+d(1964,5,1,0,0,0),
+d(1964,9,30,23,0,0),
+d(1965,5,1,0,0,0),
+d(1965,9,29,23,0,0),
+d(1966,4,24,0,0,0),
+d(1966,9,30,23,0,0),
+d(1967,5,1,0,0,0),
+d(1967,9,30,23,0,0),
+d(1968,5,1,0,0,0),
+d(1968,9,30,23,0,0),
+d(1969,5,1,0,0,0),
+d(1969,9,30,23,0,0),
+d(1970,5,1,0,0,0),
+d(1970,9,30,23,0,0),
+d(1971,5,1,0,0,0),
+d(1971,9,30,23,0,0),
+d(1972,5,1,0,0,0),
+d(1972,9,30,23,0,0),
+d(1973,5,1,0,0,0),
+d(1973,9,30,23,0,0),
+d(1974,5,1,0,0,0),
+d(1974,9,30,23,0,0),
+d(1975,5,1,0,0,0),
+d(1975,9,30,23,0,0),
+d(1976,5,1,0,0,0),
+d(1976,9,30,23,0,0),
+d(1977,5,1,0,0,0),
+d(1977,8,31,23,0,0),
+d(1978,5,1,0,0,0),
+d(1978,8,31,23,0,0),
+d(1983,4,9,0,0,0),
+d(1983,9,30,23,0,0),
+d(1984,4,9,0,0,0),
+d(1984,9,30,23,0,0),
+d(1986,2,16,0,0,0),
+d(1986,10,8,23,0,0),
+d(1987,3,1,0,0,0),
+d(1987,10,30,23,0,0),
+d(1988,3,15,0,0,0),
+d(1988,10,30,23,0,0),
+d(1989,3,31,0,0,0),
+d(1989,9,30,23,0,0),
+d(1990,4,1,0,0,0),
+d(1990,9,29,23,0,0),
+d(1991,3,31,22,0,0),
+d(1991,9,30,21,0,0),
+d(1992,4,7,22,0,0),
+d(1992,9,30,21,0,0),
+d(1993,3,25,22,0,0),
+d(1993,9,24,21,0,0),
+d(1994,3,31,22,0,0),
+d(1994,9,30,21,0,0),
+d(1995,3,31,22,0,0),
+d(1995,9,30,21,0,0),
+d(1996,3,31,22,0,0),
+d(1996,9,30,21,0,0),
+d(1997,3,30,22,0,0),
+d(1997,9,30,21,0,0),
+d(1998,3,29,22,0,0),
+d(1998,9,30,21,0,0),
+d(1999,3,31,22,0,0),
+d(1999,9,30,21,0,0),
+d(2000,3,31,22,0,0),
+d(2000,9,30,21,0,0),
+d(2001,3,31,22,0,0),
+d(2001,9,30,21,0,0),
+d(2002,3,31,22,0,0),
+d(2002,9,30,21,0,0),
+d(2003,3,31,22,0,0),
+d(2003,9,30,21,0,0),
+d(2004,3,31,22,0,0),
+d(2004,9,30,21,0,0),
+d(2005,3,31,22,0,0),
+d(2005,9,30,21,0,0),
+d(2006,3,31,22,0,0),
+d(2006,9,21,21,0,0),
+d(2007,3,31,22,0,0),
+d(2007,9,30,21,0,0),
+d(2008,3,31,22,0,0),
+d(2008,9,30,21,0,0),
+d(2009,3,31,22,0,0),
+d(2009,9,30,21,0,0),
+d(2010,3,31,22,0,0),
+d(2010,9,30,21,0,0),
+d(2011,3,31,22,0,0),
+d(2011,9,30,21,0,0),
+d(2012,3,31,22,0,0),
+d(2012,9,30,21,0,0),
+d(2013,3,31,22,0,0),
+d(2013,9,30,21,0,0),
+d(2014,3,31,22,0,0),
+d(2014,9,30,21,0,0),
+d(2015,3,31,22,0,0),
+d(2015,9,30,21,0,0),
+d(2016,3,31,22,0,0),
+d(2016,9,30,21,0,0),
+d(2017,3,31,22,0,0),
+d(2017,9,30,21,0,0),
+d(2018,3,31,22,0,0),
+d(2018,9,30,21,0,0),
+d(2019,3,31,22,0,0),
+d(2019,9,30,21,0,0),
+d(2020,3,31,22,0,0),
+d(2020,9,30,21,0,0),
+d(2021,3,31,22,0,0),
+d(2021,9,30,21,0,0),
+d(2022,3,31,22,0,0),
+d(2022,9,30,21,0,0),
+d(2023,3,31,22,0,0),
+d(2023,9,30,21,0,0),
+d(2024,3,31,22,0,0),
+d(2024,9,30,21,0,0),
+d(2025,3,31,22,0,0),
+d(2025,9,30,21,0,0),
+d(2026,3,31,22,0,0),
+d(2026,9,30,21,0,0),
+d(2027,3,31,22,0,0),
+d(2027,9,30,21,0,0),
+d(2028,3,31,22,0,0),
+d(2028,9,30,21,0,0),
+d(2029,3,31,22,0,0),
+d(2029,9,30,21,0,0),
+d(2030,3,31,22,0,0),
+d(2030,9,30,21,0,0),
+d(2031,3,31,22,0,0),
+d(2031,9,30,21,0,0),
+d(2032,3,31,22,0,0),
+d(2032,9,30,21,0,0),
+d(2033,3,31,22,0,0),
+d(2033,9,30,21,0,0),
+d(2034,3,31,22,0,0),
+d(2034,9,30,21,0,0),
+d(2035,3,31,22,0,0),
+d(2035,9,30,21,0,0),
+d(2036,3,31,22,0,0),
+d(2036,9,30,21,0,0),
+d(2037,3,31,22,0,0),
+d(2037,9,30,21,0,0),
+        ]
+
+    _transition_info = [
+i(8700,0,'LMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Damascus = Damascus()
+
diff --git a/lib/pytz/zoneinfo/Asia/Dhaka.py b/lib/pytz/zoneinfo/Asia/Dhaka.py
new file mode 100755
index 0000000..7ccd4d5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Dhaka.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for Asia/Dhaka.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dhaka(DstTzInfo):
+    '''Asia/Dhaka timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Dhaka'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,9,30,18,6,40),
+d(1942,5,14,17,30,0),
+d(1942,8,31,18,30,0),
+d(1951,9,29,17,30,0),
+d(1971,3,25,18,0,0),
+        ]
+
+    _transition_info = [
+i(21180,0,'HMT'),
+i(23400,0,'BURT'),
+i(19800,0,'IST'),
+i(23400,0,'BURT'),
+i(21600,0,'DACT'),
+i(21600,0,'BDT'),
+        ]
+
+Dhaka = Dhaka()
+
diff --git a/lib/pytz/zoneinfo/Asia/Dili.py b/lib/pytz/zoneinfo/Asia/Dili.py
new file mode 100755
index 0000000..75b8df6
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Dili.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for Asia/Dili.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dili(DstTzInfo):
+    '''Asia/Dili timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Dili'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,15,37,40),
+d(1942,2,21,15,0,0),
+d(1945,7,31,15,0,0),
+d(1976,5,2,15,0,0),
+d(2000,9,16,16,0,0),
+        ]
+
+    _transition_info = [
+i(30120,0,'LMT'),
+i(28800,0,'TLT'),
+i(32400,0,'JST'),
+i(32400,0,'TLT'),
+i(28800,0,'CIT'),
+i(32400,0,'TLT'),
+        ]
+
+Dili = Dili()
+
diff --git a/lib/pytz/zoneinfo/Asia/Dubai.py b/lib/pytz/zoneinfo/Asia/Dubai.py
new file mode 100755
index 0000000..7bb7471
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Dubai.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Asia/Dubai.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dubai(DstTzInfo):
+    '''Asia/Dubai timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Dubai'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,20,18,48),
+        ]
+
+    _transition_info = [
+i(13260,0,'LMT'),
+i(14400,0,'GST'),
+        ]
+
+Dubai = Dubai()
+
diff --git a/lib/pytz/zoneinfo/Asia/Dushanbe.py b/lib/pytz/zoneinfo/Asia/Dushanbe.py
new file mode 100755
index 0000000..4c2eb7c
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Dushanbe.py
@@ -0,0 +1,68 @@
+'''tzinfo timezone information for Asia/Dushanbe.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dushanbe(DstTzInfo):
+    '''Asia/Dushanbe timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Dushanbe'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,19,24,48),
+d(1930,6,20,19,0,0),
+d(1981,3,31,18,0,0),
+d(1981,9,30,17,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,17,0,0),
+d(1983,3,31,18,0,0),
+d(1983,9,30,17,0,0),
+d(1984,3,31,18,0,0),
+d(1984,9,29,20,0,0),
+d(1985,3,30,20,0,0),
+d(1985,9,28,20,0,0),
+d(1986,3,29,20,0,0),
+d(1986,9,27,20,0,0),
+d(1987,3,28,20,0,0),
+d(1987,9,26,20,0,0),
+d(1988,3,26,20,0,0),
+d(1988,9,24,20,0,0),
+d(1989,3,25,20,0,0),
+d(1989,9,23,20,0,0),
+d(1990,3,24,20,0,0),
+d(1990,9,29,20,0,0),
+d(1991,3,30,20,0,0),
+d(1991,9,8,21,0,0),
+        ]
+
+    _transition_info = [
+i(16500,0,'LMT'),
+i(18000,0,'DUST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(25200,3600,'DUSST'),
+i(21600,0,'DUST'),
+i(21600,0,'DUSST'),
+i(18000,0,'TJT'),
+        ]
+
+Dushanbe = Dushanbe()
+
diff --git a/lib/pytz/zoneinfo/Asia/Gaza.py b/lib/pytz/zoneinfo/Asia/Gaza.py
new file mode 100755
index 0000000..4069e22
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Gaza.py
@@ -0,0 +1,308 @@
+'''tzinfo timezone information for Asia/Gaza.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Gaza(DstTzInfo):
+    '''Asia/Gaza timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Gaza'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1940,5,31,22,0,0),
+d(1942,10,31,21,0,0),
+d(1943,4,1,0,0,0),
+d(1943,10,31,21,0,0),
+d(1944,3,31,22,0,0),
+d(1944,10,31,21,0,0),
+d(1945,4,15,22,0,0),
+d(1945,10,31,23,0,0),
+d(1946,4,16,0,0,0),
+d(1946,10,31,21,0,0),
+d(1957,5,9,22,0,0),
+d(1957,9,30,21,0,0),
+d(1958,4,30,22,0,0),
+d(1958,9,30,21,0,0),
+d(1959,4,30,23,0,0),
+d(1959,9,30,0,0,0),
+d(1960,4,30,23,0,0),
+d(1960,9,30,0,0,0),
+d(1961,4,30,23,0,0),
+d(1961,9,30,0,0,0),
+d(1962,4,30,23,0,0),
+d(1962,9,30,0,0,0),
+d(1963,4,30,23,0,0),
+d(1963,9,30,0,0,0),
+d(1964,4,30,23,0,0),
+d(1964,9,30,0,0,0),
+d(1965,4,30,23,0,0),
+d(1965,9,30,0,0,0),
+d(1966,4,30,23,0,0),
+d(1966,10,1,0,0,0),
+d(1967,4,30,23,0,0),
+d(1967,6,4,21,0,0),
+d(1974,7,6,22,0,0),
+d(1974,10,12,21,0,0),
+d(1975,4,19,22,0,0),
+d(1975,8,30,21,0,0),
+d(1985,4,13,22,0,0),
+d(1985,9,14,21,0,0),
+d(1986,5,17,22,0,0),
+d(1986,9,6,21,0,0),
+d(1987,4,14,22,0,0),
+d(1987,9,12,21,0,0),
+d(1988,4,8,22,0,0),
+d(1988,9,2,21,0,0),
+d(1989,4,29,22,0,0),
+d(1989,9,2,21,0,0),
+d(1990,3,24,22,0,0),
+d(1990,8,25,21,0,0),
+d(1991,3,23,22,0,0),
+d(1991,8,31,21,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,5,21,0,0),
+d(1993,4,1,22,0,0),
+d(1993,9,4,21,0,0),
+d(1994,3,31,22,0,0),
+d(1994,8,27,21,0,0),
+d(1995,3,30,22,0,0),
+d(1995,9,2,21,0,0),
+d(1995,12,31,22,0,0),
+d(1996,4,4,22,0,0),
+d(1996,9,19,22,0,0),
+d(1997,4,3,22,0,0),
+d(1997,9,18,22,0,0),
+d(1998,4,2,22,0,0),
+d(1998,9,17,22,0,0),
+d(1998,12,31,22,0,0),
+d(1999,4,15,22,0,0),
+d(1999,10,14,21,0,0),
+d(2000,4,20,22,0,0),
+d(2000,10,19,21,0,0),
+d(2001,4,19,22,0,0),
+d(2001,10,18,21,0,0),
+d(2002,4,18,22,0,0),
+d(2002,10,17,21,0,0),
+d(2003,4,17,22,0,0),
+d(2003,10,16,21,0,0),
+d(2004,4,15,22,0,0),
+d(2004,9,30,22,0,0),
+d(2005,4,14,22,0,0),
+d(2005,10,3,23,0,0),
+d(2006,3,31,22,0,0),
+d(2006,9,21,21,0,0),
+d(2007,3,31,22,0,0),
+d(2007,10,18,21,0,0),
+d(2008,3,31,22,0,0),
+d(2008,10,16,21,0,0),
+d(2009,3,31,22,0,0),
+d(2009,10,15,21,0,0),
+d(2010,3,31,22,0,0),
+d(2010,10,14,21,0,0),
+d(2011,3,31,22,0,0),
+d(2011,10,20,21,0,0),
+d(2012,3,31,22,0,0),
+d(2012,10,18,21,0,0),
+d(2013,3,31,22,0,0),
+d(2013,10,17,21,0,0),
+d(2014,3,31,22,0,0),
+d(2014,10,16,21,0,0),
+d(2015,3,31,22,0,0),
+d(2015,10,15,21,0,0),
+d(2016,3,31,22,0,0),
+d(2016,10,20,21,0,0),
+d(2017,3,31,22,0,0),
+d(2017,10,19,21,0,0),
+d(2018,3,31,22,0,0),
+d(2018,10,18,21,0,0),
+d(2019,3,31,22,0,0),
+d(2019,10,17,21,0,0),
+d(2020,3,31,22,0,0),
+d(2020,10,15,21,0,0),
+d(2021,3,31,22,0,0),
+d(2021,10,14,21,0,0),
+d(2022,3,31,22,0,0),
+d(2022,10,20,21,0,0),
+d(2023,3,31,22,0,0),
+d(2023,10,19,21,0,0),
+d(2024,3,31,22,0,0),
+d(2024,10,17,21,0,0),
+d(2025,3,31,22,0,0),
+d(2025,10,16,21,0,0),
+d(2026,3,31,22,0,0),
+d(2026,10,15,21,0,0),
+d(2027,3,31,22,0,0),
+d(2027,10,14,21,0,0),
+d(2028,3,31,22,0,0),
+d(2028,10,19,21,0,0),
+d(2029,3,31,22,0,0),
+d(2029,10,18,21,0,0),
+d(2030,3,31,22,0,0),
+d(2030,10,17,21,0,0),
+d(2031,3,31,22,0,0),
+d(2031,10,16,21,0,0),
+d(2032,3,31,22,0,0),
+d(2032,10,14,21,0,0),
+d(2033,3,31,22,0,0),
+d(2033,10,20,21,0,0),
+d(2034,3,31,22,0,0),
+d(2034,10,19,21,0,0),
+d(2035,3,31,22,0,0),
+d(2035,10,18,21,0,0),
+d(2036,3,31,22,0,0),
+d(2036,10,16,21,0,0),
+d(2037,3,31,22,0,0),
+d(2037,10,15,21,0,0),
+        ]
+
+    _transition_info = [
+i(7200,0,'EET'),
+i(10800,3600,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Gaza = Gaza()
+
diff --git a/lib/pytz/zoneinfo/Asia/Harbin.py b/lib/pytz/zoneinfo/Asia/Harbin.py
new file mode 100755
index 0000000..8694138
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Harbin.py
@@ -0,0 +1,54 @@
+'''tzinfo timezone information for Asia/Harbin.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Harbin(DstTzInfo):
+    '''Asia/Harbin timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Harbin'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,12,31,15,33,16),
+d(1932,2,29,15,30,0),
+d(1939,12,31,16,0,0),
+d(1966,4,30,15,0,0),
+d(1980,4,30,15,30,0),
+d(1986,5,3,16,0,0),
+d(1986,9,13,15,0,0),
+d(1987,4,11,16,0,0),
+d(1987,9,12,15,0,0),
+d(1988,4,9,16,0,0),
+d(1988,9,10,15,0,0),
+d(1989,4,15,16,0,0),
+d(1989,9,16,15,0,0),
+d(1990,4,14,16,0,0),
+d(1990,9,15,15,0,0),
+d(1991,4,13,16,0,0),
+d(1991,9,14,15,0,0),
+        ]
+
+    _transition_info = [
+i(30420,0,'LMT'),
+i(30600,0,'CHAT'),
+i(28800,0,'CST'),
+i(32400,0,'CHAT'),
+i(30600,0,'CHAT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+Harbin = Harbin()
+
diff --git a/lib/pytz/zoneinfo/Asia/Hong_Kong.py b/lib/pytz/zoneinfo/Asia/Hong_Kong.py
new file mode 100755
index 0000000..a17dfbe
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Hong_Kong.py
@@ -0,0 +1,158 @@
+'''tzinfo timezone information for Asia/Hong_Kong.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Hong_Kong(DstTzInfo):
+    '''Asia/Hong_Kong timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Hong_Kong'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1904,10,29,16,23,24),
+d(1946,4,19,19,30,0),
+d(1946,11,30,18,30,0),
+d(1947,4,12,19,30,0),
+d(1947,12,29,18,30,0),
+d(1948,5,1,19,30,0),
+d(1948,10,30,18,30,0),
+d(1949,4,2,19,30,0),
+d(1949,10,29,18,30,0),
+d(1950,4,1,19,30,0),
+d(1950,10,28,18,30,0),
+d(1951,3,31,19,30,0),
+d(1951,10,27,18,30,0),
+d(1952,4,5,19,30,0),
+d(1952,10,25,18,30,0),
+d(1953,4,4,19,30,0),
+d(1953,10,31,18,30,0),
+d(1954,3,20,19,30,0),
+d(1954,10,30,18,30,0),
+d(1955,3,19,19,30,0),
+d(1955,11,5,18,30,0),
+d(1956,3,17,19,30,0),
+d(1956,11,3,18,30,0),
+d(1957,3,23,19,30,0),
+d(1957,11,2,18,30,0),
+d(1958,3,22,19,30,0),
+d(1958,11,1,18,30,0),
+d(1959,3,21,19,30,0),
+d(1959,10,31,18,30,0),
+d(1960,3,19,19,30,0),
+d(1960,11,5,18,30,0),
+d(1961,3,18,19,30,0),
+d(1961,11,4,18,30,0),
+d(1962,3,17,19,30,0),
+d(1962,11,3,18,30,0),
+d(1963,3,23,19,30,0),
+d(1963,11,2,18,30,0),
+d(1964,3,21,19,30,0),
+d(1964,10,31,18,30,0),
+d(1965,4,17,19,30,0),
+d(1965,10,16,18,30,0),
+d(1966,4,16,19,30,0),
+d(1966,10,15,18,30,0),
+d(1967,4,15,19,30,0),
+d(1967,10,21,18,30,0),
+d(1968,4,20,19,30,0),
+d(1968,10,19,18,30,0),
+d(1969,4,19,19,30,0),
+d(1969,10,18,18,30,0),
+d(1970,4,18,19,30,0),
+d(1970,10,17,18,30,0),
+d(1971,4,17,19,30,0),
+d(1971,10,16,18,30,0),
+d(1972,4,15,19,30,0),
+d(1972,10,21,18,30,0),
+d(1973,4,21,19,30,0),
+d(1973,10,20,18,30,0),
+d(1974,4,20,19,30,0),
+d(1974,10,19,18,30,0),
+d(1975,4,19,19,30,0),
+d(1975,10,18,18,30,0),
+d(1976,4,17,19,30,0),
+d(1976,10,16,18,30,0),
+d(1977,4,16,19,30,0),
+d(1977,10,15,18,30,0),
+d(1979,5,12,19,30,0),
+d(1979,10,20,18,30,0),
+d(1980,5,10,19,30,0),
+d(1980,10,18,18,30,0),
+        ]
+
+    _transition_info = [
+i(27420,0,'LMT'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+        ]
+
+Hong_Kong = Hong_Kong()
+
diff --git a/lib/pytz/zoneinfo/Asia/Hovd.py b/lib/pytz/zoneinfo/Asia/Hovd.py
new file mode 100755
index 0000000..06d2433
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Hovd.py
@@ -0,0 +1,236 @@
+'''tzinfo timezone information for Asia/Hovd.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Hovd(DstTzInfo):
+    '''Asia/Hovd timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Hovd'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,7,31,17,53,24),
+d(1977,12,31,18,0,0),
+d(1983,3,31,17,0,0),
+d(1983,9,30,16,0,0),
+d(1984,3,31,17,0,0),
+d(1984,9,29,16,0,0),
+d(1985,3,30,17,0,0),
+d(1985,9,28,16,0,0),
+d(1986,3,29,17,0,0),
+d(1986,9,27,16,0,0),
+d(1987,3,28,17,0,0),
+d(1987,9,26,16,0,0),
+d(1988,3,26,17,0,0),
+d(1988,9,24,16,0,0),
+d(1989,3,25,17,0,0),
+d(1989,9,23,16,0,0),
+d(1990,3,24,17,0,0),
+d(1990,9,29,16,0,0),
+d(1991,3,30,17,0,0),
+d(1991,9,28,16,0,0),
+d(1992,3,28,17,0,0),
+d(1992,9,26,16,0,0),
+d(1993,3,27,17,0,0),
+d(1993,9,25,16,0,0),
+d(1994,3,26,17,0,0),
+d(1994,9,24,16,0,0),
+d(1995,3,25,17,0,0),
+d(1995,9,23,16,0,0),
+d(1996,3,30,17,0,0),
+d(1996,9,28,16,0,0),
+d(1997,3,29,17,0,0),
+d(1997,9,27,16,0,0),
+d(1998,3,28,17,0,0),
+d(1998,9,26,16,0,0),
+d(2001,4,27,19,0,0),
+d(2001,9,28,18,0,0),
+d(2002,3,29,19,0,0),
+d(2002,9,27,18,0,0),
+d(2003,3,28,19,0,0),
+d(2003,9,26,18,0,0),
+d(2004,3,26,19,0,0),
+d(2004,9,24,18,0,0),
+d(2005,3,25,19,0,0),
+d(2005,9,23,18,0,0),
+d(2006,3,24,19,0,0),
+d(2006,9,29,18,0,0),
+d(2007,3,30,19,0,0),
+d(2007,9,28,18,0,0),
+d(2008,3,28,19,0,0),
+d(2008,9,26,18,0,0),
+d(2009,3,27,19,0,0),
+d(2009,9,25,18,0,0),
+d(2010,3,26,19,0,0),
+d(2010,9,24,18,0,0),
+d(2011,3,25,19,0,0),
+d(2011,9,23,18,0,0),
+d(2012,3,30,19,0,0),
+d(2012,9,28,18,0,0),
+d(2013,3,29,19,0,0),
+d(2013,9,27,18,0,0),
+d(2014,3,28,19,0,0),
+d(2014,9,26,18,0,0),
+d(2015,3,27,19,0,0),
+d(2015,9,25,18,0,0),
+d(2016,3,25,19,0,0),
+d(2016,9,23,18,0,0),
+d(2017,3,24,19,0,0),
+d(2017,9,29,18,0,0),
+d(2018,3,30,19,0,0),
+d(2018,9,28,18,0,0),
+d(2019,3,29,19,0,0),
+d(2019,9,27,18,0,0),
+d(2020,3,27,19,0,0),
+d(2020,9,25,18,0,0),
+d(2021,3,26,19,0,0),
+d(2021,9,24,18,0,0),
+d(2022,3,25,19,0,0),
+d(2022,9,23,18,0,0),
+d(2023,3,24,19,0,0),
+d(2023,9,29,18,0,0),
+d(2024,3,29,19,0,0),
+d(2024,9,27,18,0,0),
+d(2025,3,28,19,0,0),
+d(2025,9,26,18,0,0),
+d(2026,3,27,19,0,0),
+d(2026,9,25,18,0,0),
+d(2027,3,26,19,0,0),
+d(2027,9,24,18,0,0),
+d(2028,3,24,19,0,0),
+d(2028,9,29,18,0,0),
+d(2029,3,30,19,0,0),
+d(2029,9,28,18,0,0),
+d(2030,3,29,19,0,0),
+d(2030,9,27,18,0,0),
+d(2031,3,28,19,0,0),
+d(2031,9,26,18,0,0),
+d(2032,3,26,19,0,0),
+d(2032,9,24,18,0,0),
+d(2033,3,25,19,0,0),
+d(2033,9,23,18,0,0),
+d(2034,3,24,19,0,0),
+d(2034,9,29,18,0,0),
+d(2035,3,30,19,0,0),
+d(2035,9,28,18,0,0),
+d(2036,3,28,19,0,0),
+d(2036,9,26,18,0,0),
+d(2037,3,27,19,0,0),
+d(2037,9,25,18,0,0),
+        ]
+
+    _transition_info = [
+i(22020,0,'LMT'),
+i(21600,0,'HOVT'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+i(28800,3600,'HOVST'),
+i(25200,0,'HOVT'),
+        ]
+
+Hovd = Hovd()
+
diff --git a/lib/pytz/zoneinfo/Asia/Irkutsk.py b/lib/pytz/zoneinfo/Asia/Irkutsk.py
new file mode 100755
index 0000000..8836f46
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Irkutsk.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Irkutsk.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Irkutsk(DstTzInfo):
+    '''Asia/Irkutsk timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Irkutsk'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,1,24,17,2,40),
+d(1930,6,20,17,0,0),
+d(1981,3,31,16,0,0),
+d(1981,9,30,15,0,0),
+d(1982,3,31,16,0,0),
+d(1982,9,30,15,0,0),
+d(1983,3,31,16,0,0),
+d(1983,9,30,15,0,0),
+d(1984,3,31,16,0,0),
+d(1984,9,29,18,0,0),
+d(1985,3,30,18,0,0),
+d(1985,9,28,18,0,0),
+d(1986,3,29,18,0,0),
+d(1986,9,27,18,0,0),
+d(1987,3,28,18,0,0),
+d(1987,9,26,18,0,0),
+d(1988,3,26,18,0,0),
+d(1988,9,24,18,0,0),
+d(1989,3,25,18,0,0),
+d(1989,9,23,18,0,0),
+d(1990,3,24,18,0,0),
+d(1990,9,29,18,0,0),
+d(1991,3,30,18,0,0),
+d(1991,9,28,19,0,0),
+d(1992,1,18,19,0,0),
+d(1992,3,28,15,0,0),
+d(1992,9,26,14,0,0),
+d(1993,3,27,18,0,0),
+d(1993,9,25,18,0,0),
+d(1994,3,26,18,0,0),
+d(1994,9,24,18,0,0),
+d(1995,3,25,18,0,0),
+d(1995,9,23,18,0,0),
+d(1996,3,30,18,0,0),
+d(1996,10,26,18,0,0),
+d(1997,3,29,18,0,0),
+d(1997,10,25,18,0,0),
+d(1998,3,28,18,0,0),
+d(1998,10,24,18,0,0),
+d(1999,3,27,18,0,0),
+d(1999,10,30,18,0,0),
+d(2000,3,25,18,0,0),
+d(2000,10,28,18,0,0),
+d(2001,3,24,18,0,0),
+d(2001,10,27,18,0,0),
+d(2002,3,30,18,0,0),
+d(2002,10,26,18,0,0),
+d(2003,3,29,18,0,0),
+d(2003,10,25,18,0,0),
+d(2004,3,27,18,0,0),
+d(2004,10,30,18,0,0),
+d(2005,3,26,18,0,0),
+d(2005,10,29,18,0,0),
+d(2006,3,25,18,0,0),
+d(2006,10,28,18,0,0),
+d(2007,3,24,18,0,0),
+d(2007,10,27,18,0,0),
+d(2008,3,29,18,0,0),
+d(2008,10,25,18,0,0),
+d(2009,3,28,18,0,0),
+d(2009,10,24,18,0,0),
+d(2010,3,27,18,0,0),
+d(2010,10,30,18,0,0),
+d(2011,3,26,18,0,0),
+d(2011,10,29,18,0,0),
+d(2012,3,24,18,0,0),
+d(2012,10,27,18,0,0),
+d(2013,3,30,18,0,0),
+d(2013,10,26,18,0,0),
+d(2014,3,29,18,0,0),
+d(2014,10,25,18,0,0),
+d(2015,3,28,18,0,0),
+d(2015,10,24,18,0,0),
+d(2016,3,26,18,0,0),
+d(2016,10,29,18,0,0),
+d(2017,3,25,18,0,0),
+d(2017,10,28,18,0,0),
+d(2018,3,24,18,0,0),
+d(2018,10,27,18,0,0),
+d(2019,3,30,18,0,0),
+d(2019,10,26,18,0,0),
+d(2020,3,28,18,0,0),
+d(2020,10,24,18,0,0),
+d(2021,3,27,18,0,0),
+d(2021,10,30,18,0,0),
+d(2022,3,26,18,0,0),
+d(2022,10,29,18,0,0),
+d(2023,3,25,18,0,0),
+d(2023,10,28,18,0,0),
+d(2024,3,30,18,0,0),
+d(2024,10,26,18,0,0),
+d(2025,3,29,18,0,0),
+d(2025,10,25,18,0,0),
+d(2026,3,28,18,0,0),
+d(2026,10,24,18,0,0),
+d(2027,3,27,18,0,0),
+d(2027,10,30,18,0,0),
+d(2028,3,25,18,0,0),
+d(2028,10,28,18,0,0),
+d(2029,3,24,18,0,0),
+d(2029,10,27,18,0,0),
+d(2030,3,30,18,0,0),
+d(2030,10,26,18,0,0),
+d(2031,3,29,18,0,0),
+d(2031,10,25,18,0,0),
+d(2032,3,27,18,0,0),
+d(2032,10,30,18,0,0),
+d(2033,3,26,18,0,0),
+d(2033,10,29,18,0,0),
+d(2034,3,25,18,0,0),
+d(2034,10,28,18,0,0),
+d(2035,3,24,18,0,0),
+d(2035,10,27,18,0,0),
+d(2036,3,29,18,0,0),
+d(2036,10,25,18,0,0),
+d(2037,3,28,18,0,0),
+d(2037,10,24,18,0,0),
+        ]
+
+    _transition_info = [
+i(25020,0,'IMT'),
+i(25200,0,'IRKT'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(28800,0,'IRKST'),
+i(25200,0,'IRKT'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+i(32400,3600,'IRKST'),
+i(28800,0,'IRKT'),
+        ]
+
+Irkutsk = Irkutsk()
+
diff --git a/lib/pytz/zoneinfo/Asia/Istanbul.py b/lib/pytz/zoneinfo/Asia/Istanbul.py
new file mode 100755
index 0000000..fb5f8b6
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Istanbul.py
@@ -0,0 +1,362 @@
+'''tzinfo timezone information for Asia/Istanbul.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Istanbul(DstTzInfo):
+    '''Asia/Istanbul timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Istanbul'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1910,9,30,22,3,4),
+d(1916,4,30,22,0,0),
+d(1916,9,30,21,0,0),
+d(1920,3,27,22,0,0),
+d(1920,10,24,21,0,0),
+d(1921,4,2,22,0,0),
+d(1921,10,2,21,0,0),
+d(1922,3,25,22,0,0),
+d(1922,10,7,21,0,0),
+d(1924,5,12,22,0,0),
+d(1924,9,30,21,0,0),
+d(1925,4,30,22,0,0),
+d(1925,9,30,21,0,0),
+d(1940,6,29,22,0,0),
+d(1940,10,4,21,0,0),
+d(1940,11,30,22,0,0),
+d(1941,9,20,21,0,0),
+d(1942,3,31,22,0,0),
+d(1942,10,31,21,0,0),
+d(1945,4,1,22,0,0),
+d(1945,10,7,21,0,0),
+d(1946,5,31,22,0,0),
+d(1946,9,30,21,0,0),
+d(1947,4,19,22,0,0),
+d(1947,10,4,21,0,0),
+d(1948,4,17,22,0,0),
+d(1948,10,2,21,0,0),
+d(1949,4,9,22,0,0),
+d(1949,10,1,21,0,0),
+d(1950,4,18,22,0,0),
+d(1950,10,7,21,0,0),
+d(1951,4,21,22,0,0),
+d(1951,10,7,21,0,0),
+d(1962,7,14,22,0,0),
+d(1962,10,7,21,0,0),
+d(1964,5,14,22,0,0),
+d(1964,9,30,21,0,0),
+d(1970,5,2,22,0,0),
+d(1970,10,3,21,0,0),
+d(1971,5,1,22,0,0),
+d(1971,10,2,21,0,0),
+d(1972,5,6,22,0,0),
+d(1972,10,7,21,0,0),
+d(1973,6,2,23,0,0),
+d(1973,11,4,0,0,0),
+d(1974,3,31,0,0,0),
+d(1974,11,3,2,0,0),
+d(1975,3,29,22,0,0),
+d(1975,10,25,21,0,0),
+d(1976,5,31,22,0,0),
+d(1976,10,30,21,0,0),
+d(1977,4,2,22,0,0),
+d(1977,10,15,21,0,0),
+d(1978,4,1,22,0,0),
+d(1978,10,14,21,0,0),
+d(1979,10,14,20,0,0),
+d(1980,4,6,0,0,0),
+d(1980,10,12,20,0,0),
+d(1981,3,29,0,0,0),
+d(1981,10,11,20,0,0),
+d(1982,3,28,0,0,0),
+d(1982,10,10,20,0,0),
+d(1983,7,30,21,0,0),
+d(1983,10,1,20,0,0),
+d(1985,4,19,21,0,0),
+d(1985,9,27,21,0,0),
+d(1986,3,30,0,0,0),
+d(1986,9,28,0,0,0),
+d(1987,3,29,0,0,0),
+d(1987,9,27,0,0,0),
+d(1988,3,27,0,0,0),
+d(1988,9,25,0,0,0),
+d(1989,3,26,0,0,0),
+d(1989,9,24,0,0,0),
+d(1990,3,25,0,0,0),
+d(1990,9,30,0,0,0),
+d(1990,12,31,22,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(7020,0,'IMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(14400,7200,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Istanbul = Istanbul()
+
diff --git a/lib/pytz/zoneinfo/Asia/Jakarta.py b/lib/pytz/zoneinfo/Asia/Jakarta.py
new file mode 100755
index 0000000..27a4211
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Jakarta.py
@@ -0,0 +1,34 @@
+'''tzinfo timezone information for Asia/Jakarta.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jakarta(DstTzInfo):
+    '''Asia/Jakarta timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Jakarta'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1923,12,31,16,40,0),
+d(1932,10,31,16,40,0),
+d(1942,3,22,16,30,0),
+d(1945,7,31,15,0,0),
+d(1948,4,30,16,30,0),
+d(1950,4,30,16,0,0),
+d(1963,12,31,16,30,0),
+        ]
+
+    _transition_info = [
+i(25620,0,'JMT'),
+i(26400,0,'JAVT'),
+i(27000,0,'WIT'),
+i(32400,0,'JST'),
+i(27000,0,'WIT'),
+i(28800,0,'WIT'),
+i(27000,0,'WIT'),
+i(25200,0,'WIT'),
+        ]
+
+Jakarta = Jakarta()
+
diff --git a/lib/pytz/zoneinfo/Asia/Jayapura.py b/lib/pytz/zoneinfo/Asia/Jayapura.py
new file mode 100755
index 0000000..c876078
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Jayapura.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Asia/Jayapura.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jayapura(DstTzInfo):
+    '''Asia/Jayapura timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Jayapura'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1932,10,31,14,37,12),
+d(1943,12,31,15,0,0),
+d(1963,12,31,14,30,0),
+        ]
+
+    _transition_info = [
+i(33780,0,'LMT'),
+i(32400,0,'EIT'),
+i(34200,0,'CST'),
+i(32400,0,'EIT'),
+        ]
+
+Jayapura = Jayapura()
+
diff --git a/lib/pytz/zoneinfo/Asia/Jerusalem.py b/lib/pytz/zoneinfo/Asia/Jerusalem.py
new file mode 100755
index 0000000..cf3af69
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Jerusalem.py
@@ -0,0 +1,304 @@
+'''tzinfo timezone information for Asia/Jerusalem.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jerusalem(DstTzInfo):
+    '''Asia/Jerusalem timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Jerusalem'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,12,31,21,39,20),
+d(1940,5,31,22,0,0),
+d(1942,10,31,21,0,0),
+d(1943,4,1,0,0,0),
+d(1943,10,31,21,0,0),
+d(1944,3,31,22,0,0),
+d(1944,10,31,21,0,0),
+d(1945,4,15,22,0,0),
+d(1945,10,31,23,0,0),
+d(1946,4,16,0,0,0),
+d(1946,10,31,21,0,0),
+d(1948,5,22,22,0,0),
+d(1948,8,31,20,0,0),
+d(1948,10,31,23,0,0),
+d(1949,4,30,22,0,0),
+d(1949,10,31,23,0,0),
+d(1950,4,15,22,0,0),
+d(1950,9,15,0,0,0),
+d(1951,3,31,22,0,0),
+d(1951,11,11,0,0,0),
+d(1952,4,20,0,0,0),
+d(1952,10,19,0,0,0),
+d(1953,4,12,0,0,0),
+d(1953,9,13,0,0,0),
+d(1954,6,12,22,0,0),
+d(1954,9,11,21,0,0),
+d(1955,6,11,0,0,0),
+d(1955,9,10,21,0,0),
+d(1956,6,2,22,0,0),
+d(1956,9,30,0,0,0),
+d(1957,4,29,0,0,0),
+d(1957,9,21,21,0,0),
+d(1974,7,6,22,0,0),
+d(1974,10,12,21,0,0),
+d(1975,4,19,22,0,0),
+d(1975,8,30,21,0,0),
+d(1985,4,13,22,0,0),
+d(1985,9,14,21,0,0),
+d(1986,5,17,22,0,0),
+d(1986,9,6,21,0,0),
+d(1987,4,14,22,0,0),
+d(1987,9,12,21,0,0),
+d(1988,4,8,22,0,0),
+d(1988,9,2,21,0,0),
+d(1989,4,29,22,0,0),
+d(1989,9,2,21,0,0),
+d(1990,3,24,22,0,0),
+d(1990,8,25,21,0,0),
+d(1991,3,23,22,0,0),
+d(1991,8,31,21,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,5,21,0,0),
+d(1993,4,1,22,0,0),
+d(1993,9,4,21,0,0),
+d(1994,3,31,22,0,0),
+d(1994,8,27,21,0,0),
+d(1995,3,30,22,0,0),
+d(1995,9,2,21,0,0),
+d(1996,3,14,22,0,0),
+d(1996,9,15,21,0,0),
+d(1997,3,20,22,0,0),
+d(1997,9,13,21,0,0),
+d(1998,3,19,22,0,0),
+d(1998,9,5,21,0,0),
+d(1999,4,2,0,0,0),
+d(1999,9,2,23,0,0),
+d(2000,4,14,0,0,0),
+d(2000,10,5,22,0,0),
+d(2001,4,8,23,0,0),
+d(2001,9,23,22,0,0),
+d(2002,3,28,23,0,0),
+d(2002,10,6,22,0,0),
+d(2003,3,27,23,0,0),
+d(2003,10,2,22,0,0),
+d(2004,4,6,23,0,0),
+d(2004,9,21,22,0,0),
+d(2005,4,1,0,0,0),
+d(2005,10,8,23,0,0),
+d(2006,3,31,0,0,0),
+d(2006,9,30,23,0,0),
+d(2007,3,30,0,0,0),
+d(2007,9,15,23,0,0),
+d(2008,3,28,0,0,0),
+d(2008,10,4,23,0,0),
+d(2009,3,27,0,0,0),
+d(2009,9,26,23,0,0),
+d(2010,3,26,0,0,0),
+d(2010,9,11,23,0,0),
+d(2011,4,1,0,0,0),
+d(2011,10,1,23,0,0),
+d(2012,3,30,0,0,0),
+d(2012,9,22,23,0,0),
+d(2013,3,29,0,0,0),
+d(2013,9,7,23,0,0),
+d(2014,3,28,0,0,0),
+d(2014,9,27,23,0,0),
+d(2015,3,27,0,0,0),
+d(2015,9,19,23,0,0),
+d(2016,4,1,0,0,0),
+d(2016,10,8,23,0,0),
+d(2017,3,31,0,0,0),
+d(2017,9,23,23,0,0),
+d(2018,3,30,0,0,0),
+d(2018,9,15,23,0,0),
+d(2019,3,29,0,0,0),
+d(2019,10,5,23,0,0),
+d(2020,3,27,0,0,0),
+d(2020,9,26,23,0,0),
+d(2021,3,26,0,0,0),
+d(2021,9,11,23,0,0),
+d(2022,4,1,0,0,0),
+d(2022,10,1,23,0,0),
+d(2023,3,31,0,0,0),
+d(2023,9,23,23,0,0),
+d(2024,3,29,0,0,0),
+d(2024,10,5,23,0,0),
+d(2025,3,28,0,0,0),
+d(2025,9,27,23,0,0),
+d(2026,3,27,0,0,0),
+d(2026,9,19,23,0,0),
+d(2027,3,26,0,0,0),
+d(2027,10,9,23,0,0),
+d(2028,3,31,0,0,0),
+d(2028,9,23,23,0,0),
+d(2029,3,30,0,0,0),
+d(2029,9,15,23,0,0),
+d(2030,3,29,0,0,0),
+d(2030,10,5,23,0,0),
+d(2031,3,28,0,0,0),
+d(2031,9,20,23,0,0),
+d(2032,3,26,0,0,0),
+d(2032,9,11,23,0,0),
+d(2033,4,1,0,0,0),
+d(2033,10,1,23,0,0),
+d(2034,3,31,0,0,0),
+d(2034,9,16,23,0,0),
+d(2035,3,30,0,0,0),
+d(2035,10,6,23,0,0),
+d(2036,3,28,0,0,0),
+d(2036,9,27,23,0,0),
+d(2037,3,27,0,0,0),
+d(2037,9,12,23,0,0),
+        ]
+
+    _transition_info = [
+i(8460,0,'JMT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(14400,7200,'IDDT'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+        ]
+
+Jerusalem = Jerusalem()
+
diff --git a/lib/pytz/zoneinfo/Asia/Kabul.py b/lib/pytz/zoneinfo/Asia/Kabul.py
new file mode 100755
index 0000000..c19ff5f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Kabul.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Asia/Kabul.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kabul(DstTzInfo):
+    '''Asia/Kabul timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Kabul'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1944,12,31,20,0,0),
+        ]
+
+    _transition_info = [
+i(14400,0,'AFT'),
+i(16200,0,'AFT'),
+        ]
+
+Kabul = Kabul()
+
diff --git a/lib/pytz/zoneinfo/Asia/Kamchatka.py b/lib/pytz/zoneinfo/Asia/Kamchatka.py
new file mode 100755
index 0000000..7b6b946
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Kamchatka.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Kamchatka.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kamchatka(DstTzInfo):
+    '''Asia/Kamchatka timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Kamchatka'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,11,9,13,25,24),
+d(1930,6,20,13,0,0),
+d(1981,3,31,12,0,0),
+d(1981,9,30,11,0,0),
+d(1982,3,31,12,0,0),
+d(1982,9,30,11,0,0),
+d(1983,3,31,12,0,0),
+d(1983,9,30,11,0,0),
+d(1984,3,31,12,0,0),
+d(1984,9,29,14,0,0),
+d(1985,3,30,14,0,0),
+d(1985,9,28,14,0,0),
+d(1986,3,29,14,0,0),
+d(1986,9,27,14,0,0),
+d(1987,3,28,14,0,0),
+d(1987,9,26,14,0,0),
+d(1988,3,26,14,0,0),
+d(1988,9,24,14,0,0),
+d(1989,3,25,14,0,0),
+d(1989,9,23,14,0,0),
+d(1990,3,24,14,0,0),
+d(1990,9,29,14,0,0),
+d(1991,3,30,14,0,0),
+d(1991,9,28,15,0,0),
+d(1992,1,18,15,0,0),
+d(1992,3,28,11,0,0),
+d(1992,9,26,10,0,0),
+d(1993,3,27,14,0,0),
+d(1993,9,25,14,0,0),
+d(1994,3,26,14,0,0),
+d(1994,9,24,14,0,0),
+d(1995,3,25,14,0,0),
+d(1995,9,23,14,0,0),
+d(1996,3,30,14,0,0),
+d(1996,10,26,14,0,0),
+d(1997,3,29,14,0,0),
+d(1997,10,25,14,0,0),
+d(1998,3,28,14,0,0),
+d(1998,10,24,14,0,0),
+d(1999,3,27,14,0,0),
+d(1999,10,30,14,0,0),
+d(2000,3,25,14,0,0),
+d(2000,10,28,14,0,0),
+d(2001,3,24,14,0,0),
+d(2001,10,27,14,0,0),
+d(2002,3,30,14,0,0),
+d(2002,10,26,14,0,0),
+d(2003,3,29,14,0,0),
+d(2003,10,25,14,0,0),
+d(2004,3,27,14,0,0),
+d(2004,10,30,14,0,0),
+d(2005,3,26,14,0,0),
+d(2005,10,29,14,0,0),
+d(2006,3,25,14,0,0),
+d(2006,10,28,14,0,0),
+d(2007,3,24,14,0,0),
+d(2007,10,27,14,0,0),
+d(2008,3,29,14,0,0),
+d(2008,10,25,14,0,0),
+d(2009,3,28,14,0,0),
+d(2009,10,24,14,0,0),
+d(2010,3,27,14,0,0),
+d(2010,10,30,14,0,0),
+d(2011,3,26,14,0,0),
+d(2011,10,29,14,0,0),
+d(2012,3,24,14,0,0),
+d(2012,10,27,14,0,0),
+d(2013,3,30,14,0,0),
+d(2013,10,26,14,0,0),
+d(2014,3,29,14,0,0),
+d(2014,10,25,14,0,0),
+d(2015,3,28,14,0,0),
+d(2015,10,24,14,0,0),
+d(2016,3,26,14,0,0),
+d(2016,10,29,14,0,0),
+d(2017,3,25,14,0,0),
+d(2017,10,28,14,0,0),
+d(2018,3,24,14,0,0),
+d(2018,10,27,14,0,0),
+d(2019,3,30,14,0,0),
+d(2019,10,26,14,0,0),
+d(2020,3,28,14,0,0),
+d(2020,10,24,14,0,0),
+d(2021,3,27,14,0,0),
+d(2021,10,30,14,0,0),
+d(2022,3,26,14,0,0),
+d(2022,10,29,14,0,0),
+d(2023,3,25,14,0,0),
+d(2023,10,28,14,0,0),
+d(2024,3,30,14,0,0),
+d(2024,10,26,14,0,0),
+d(2025,3,29,14,0,0),
+d(2025,10,25,14,0,0),
+d(2026,3,28,14,0,0),
+d(2026,10,24,14,0,0),
+d(2027,3,27,14,0,0),
+d(2027,10,30,14,0,0),
+d(2028,3,25,14,0,0),
+d(2028,10,28,14,0,0),
+d(2029,3,24,14,0,0),
+d(2029,10,27,14,0,0),
+d(2030,3,30,14,0,0),
+d(2030,10,26,14,0,0),
+d(2031,3,29,14,0,0),
+d(2031,10,25,14,0,0),
+d(2032,3,27,14,0,0),
+d(2032,10,30,14,0,0),
+d(2033,3,26,14,0,0),
+d(2033,10,29,14,0,0),
+d(2034,3,25,14,0,0),
+d(2034,10,28,14,0,0),
+d(2035,3,24,14,0,0),
+d(2035,10,27,14,0,0),
+d(2036,3,29,14,0,0),
+d(2036,10,25,14,0,0),
+d(2037,3,28,14,0,0),
+d(2037,10,24,14,0,0),
+        ]
+
+    _transition_info = [
+i(38100,0,'LMT'),
+i(39600,0,'PETT'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(43200,0,'PETST'),
+i(39600,0,'PETT'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+i(46800,3600,'PETST'),
+i(43200,0,'PETT'),
+        ]
+
+Kamchatka = Kamchatka()
+
diff --git a/lib/pytz/zoneinfo/Asia/Karachi.py b/lib/pytz/zoneinfo/Asia/Karachi.py
new file mode 100755
index 0000000..838f06b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Karachi.py
@@ -0,0 +1,34 @@
+'''tzinfo timezone information for Asia/Karachi.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Karachi(DstTzInfo):
+    '''Asia/Karachi timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Karachi'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,12,31,19,31,48),
+d(1942,8,31,18,30,0),
+d(1945,10,14,17,30,0),
+d(1951,9,29,18,30,0),
+d(1971,3,25,19,0,0),
+d(2002,4,6,19,1,0),
+d(2002,10,5,18,1,0),
+        ]
+
+    _transition_info = [
+i(16080,0,'LMT'),
+i(19800,0,'IST'),
+i(23400,3600,'IST'),
+i(19800,0,'IST'),
+i(18000,0,'KART'),
+i(18000,0,'PKT'),
+i(21600,3600,'PKST'),
+i(18000,0,'PKT'),
+        ]
+
+Karachi = Karachi()
+
diff --git a/lib/pytz/zoneinfo/Asia/Kashgar.py b/lib/pytz/zoneinfo/Asia/Kashgar.py
new file mode 100755
index 0000000..27616b0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Kashgar.py
@@ -0,0 +1,50 @@
+'''tzinfo timezone information for Asia/Kashgar.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kashgar(DstTzInfo):
+    '''Asia/Kashgar timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Kashgar'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,12,31,18,56,4),
+d(1939,12,31,18,30,0),
+d(1980,4,30,19,0,0),
+d(1986,5,3,16,0,0),
+d(1986,9,13,15,0,0),
+d(1987,4,11,16,0,0),
+d(1987,9,12,15,0,0),
+d(1988,4,9,16,0,0),
+d(1988,9,10,15,0,0),
+d(1989,4,15,16,0,0),
+d(1989,9,16,15,0,0),
+d(1990,4,14,16,0,0),
+d(1990,9,15,15,0,0),
+d(1991,4,13,16,0,0),
+d(1991,9,14,15,0,0),
+        ]
+
+    _transition_info = [
+i(18240,0,'LMT'),
+i(19800,0,'KAST'),
+i(18000,0,'KAST'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+Kashgar = Kashgar()
+
diff --git a/lib/pytz/zoneinfo/Asia/Katmandu.py b/lib/pytz/zoneinfo/Asia/Katmandu.py
new file mode 100755
index 0000000..2f8d1f1
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Katmandu.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Asia/Katmandu.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Katmandu(DstTzInfo):
+    '''Asia/Katmandu timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Katmandu'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,18,18,44),
+d(1985,12,31,18,30,0),
+        ]
+
+    _transition_info = [
+i(20460,0,'LMT'),
+i(19800,0,'IST'),
+i(20700,0,'NPT'),
+        ]
+
+Katmandu = Katmandu()
+
diff --git a/lib/pytz/zoneinfo/Asia/Krasnoyarsk.py b/lib/pytz/zoneinfo/Asia/Krasnoyarsk.py
new file mode 100755
index 0000000..5cecf76
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Krasnoyarsk.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Krasnoyarsk.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Krasnoyarsk(DstTzInfo):
+    '''Asia/Krasnoyarsk timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Krasnoyarsk'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,1,5,17,48,40),
+d(1930,6,20,18,0,0),
+d(1981,3,31,17,0,0),
+d(1981,9,30,16,0,0),
+d(1982,3,31,17,0,0),
+d(1982,9,30,16,0,0),
+d(1983,3,31,17,0,0),
+d(1983,9,30,16,0,0),
+d(1984,3,31,17,0,0),
+d(1984,9,29,19,0,0),
+d(1985,3,30,19,0,0),
+d(1985,9,28,19,0,0),
+d(1986,3,29,19,0,0),
+d(1986,9,27,19,0,0),
+d(1987,3,28,19,0,0),
+d(1987,9,26,19,0,0),
+d(1988,3,26,19,0,0),
+d(1988,9,24,19,0,0),
+d(1989,3,25,19,0,0),
+d(1989,9,23,19,0,0),
+d(1990,3,24,19,0,0),
+d(1990,9,29,19,0,0),
+d(1991,3,30,19,0,0),
+d(1991,9,28,20,0,0),
+d(1992,1,18,20,0,0),
+d(1992,3,28,16,0,0),
+d(1992,9,26,15,0,0),
+d(1993,3,27,19,0,0),
+d(1993,9,25,19,0,0),
+d(1994,3,26,19,0,0),
+d(1994,9,24,19,0,0),
+d(1995,3,25,19,0,0),
+d(1995,9,23,19,0,0),
+d(1996,3,30,19,0,0),
+d(1996,10,26,19,0,0),
+d(1997,3,29,19,0,0),
+d(1997,10,25,19,0,0),
+d(1998,3,28,19,0,0),
+d(1998,10,24,19,0,0),
+d(1999,3,27,19,0,0),
+d(1999,10,30,19,0,0),
+d(2000,3,25,19,0,0),
+d(2000,10,28,19,0,0),
+d(2001,3,24,19,0,0),
+d(2001,10,27,19,0,0),
+d(2002,3,30,19,0,0),
+d(2002,10,26,19,0,0),
+d(2003,3,29,19,0,0),
+d(2003,10,25,19,0,0),
+d(2004,3,27,19,0,0),
+d(2004,10,30,19,0,0),
+d(2005,3,26,19,0,0),
+d(2005,10,29,19,0,0),
+d(2006,3,25,19,0,0),
+d(2006,10,28,19,0,0),
+d(2007,3,24,19,0,0),
+d(2007,10,27,19,0,0),
+d(2008,3,29,19,0,0),
+d(2008,10,25,19,0,0),
+d(2009,3,28,19,0,0),
+d(2009,10,24,19,0,0),
+d(2010,3,27,19,0,0),
+d(2010,10,30,19,0,0),
+d(2011,3,26,19,0,0),
+d(2011,10,29,19,0,0),
+d(2012,3,24,19,0,0),
+d(2012,10,27,19,0,0),
+d(2013,3,30,19,0,0),
+d(2013,10,26,19,0,0),
+d(2014,3,29,19,0,0),
+d(2014,10,25,19,0,0),
+d(2015,3,28,19,0,0),
+d(2015,10,24,19,0,0),
+d(2016,3,26,19,0,0),
+d(2016,10,29,19,0,0),
+d(2017,3,25,19,0,0),
+d(2017,10,28,19,0,0),
+d(2018,3,24,19,0,0),
+d(2018,10,27,19,0,0),
+d(2019,3,30,19,0,0),
+d(2019,10,26,19,0,0),
+d(2020,3,28,19,0,0),
+d(2020,10,24,19,0,0),
+d(2021,3,27,19,0,0),
+d(2021,10,30,19,0,0),
+d(2022,3,26,19,0,0),
+d(2022,10,29,19,0,0),
+d(2023,3,25,19,0,0),
+d(2023,10,28,19,0,0),
+d(2024,3,30,19,0,0),
+d(2024,10,26,19,0,0),
+d(2025,3,29,19,0,0),
+d(2025,10,25,19,0,0),
+d(2026,3,28,19,0,0),
+d(2026,10,24,19,0,0),
+d(2027,3,27,19,0,0),
+d(2027,10,30,19,0,0),
+d(2028,3,25,19,0,0),
+d(2028,10,28,19,0,0),
+d(2029,3,24,19,0,0),
+d(2029,10,27,19,0,0),
+d(2030,3,30,19,0,0),
+d(2030,10,26,19,0,0),
+d(2031,3,29,19,0,0),
+d(2031,10,25,19,0,0),
+d(2032,3,27,19,0,0),
+d(2032,10,30,19,0,0),
+d(2033,3,26,19,0,0),
+d(2033,10,29,19,0,0),
+d(2034,3,25,19,0,0),
+d(2034,10,28,19,0,0),
+d(2035,3,24,19,0,0),
+d(2035,10,27,19,0,0),
+d(2036,3,29,19,0,0),
+d(2036,10,25,19,0,0),
+d(2037,3,28,19,0,0),
+d(2037,10,24,19,0,0),
+        ]
+
+    _transition_info = [
+i(22260,0,'LMT'),
+i(21600,0,'KRAT'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(25200,0,'KRAST'),
+i(21600,0,'KRAT'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+i(28800,3600,'KRAST'),
+i(25200,0,'KRAT'),
+        ]
+
+Krasnoyarsk = Krasnoyarsk()
+
diff --git a/lib/pytz/zoneinfo/Asia/Kuala_Lumpur.py b/lib/pytz/zoneinfo/Asia/Kuala_Lumpur.py
new file mode 100755
index 0000000..99f1d82
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Kuala_Lumpur.py
@@ -0,0 +1,34 @@
+'''tzinfo timezone information for Asia/Kuala_Lumpur.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kuala_Lumpur(DstTzInfo):
+    '''Asia/Kuala_Lumpur timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Kuala_Lumpur'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,5,31,17,4,35),
+d(1932,12,31,17,0,0),
+d(1935,12,31,16,40,0),
+d(1941,8,31,16,40,0),
+d(1942,2,15,16,30,0),
+d(1945,9,11,15,0,0),
+d(1981,12,31,16,30,0),
+        ]
+
+    _transition_info = [
+i(24900,0,'SMT'),
+i(25200,0,'MALT'),
+i(26400,1200,'MALST'),
+i(26400,0,'MALT'),
+i(27000,0,'MALT'),
+i(32400,0,'JST'),
+i(27000,0,'MALT'),
+i(28800,0,'MYT'),
+        ]
+
+Kuala_Lumpur = Kuala_Lumpur()
+
diff --git a/lib/pytz/zoneinfo/Asia/Kuching.py b/lib/pytz/zoneinfo/Asia/Kuching.py
new file mode 100755
index 0000000..e6e7b99
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Kuching.py
@@ -0,0 +1,58 @@
+'''tzinfo timezone information for Asia/Kuching.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kuching(DstTzInfo):
+    '''Asia/Kuching timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Kuching'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1926,2,28,16,38,40),
+d(1932,12,31,16,30,0),
+d(1935,9,13,16,0,0),
+d(1935,12,13,15,40,0),
+d(1936,9,13,16,0,0),
+d(1936,12,13,15,40,0),
+d(1937,9,13,16,0,0),
+d(1937,12,13,15,40,0),
+d(1938,9,13,16,0,0),
+d(1938,12,13,15,40,0),
+d(1939,9,13,16,0,0),
+d(1939,12,13,15,40,0),
+d(1940,9,13,16,0,0),
+d(1940,12,13,15,40,0),
+d(1941,9,13,16,0,0),
+d(1941,12,13,15,40,0),
+d(1942,2,15,16,0,0),
+d(1945,9,11,15,0,0),
+d(1981,12,31,16,0,0),
+        ]
+
+    _transition_info = [
+i(26460,0,'LMT'),
+i(27000,0,'BORT'),
+i(28800,0,'BORT'),
+i(30000,1200,'BORTST'),
+i(28800,0,'BORT'),
+i(30000,1200,'BORTST'),
+i(28800,0,'BORT'),
+i(30000,1200,'BORTST'),
+i(28800,0,'BORT'),
+i(30000,1200,'BORTST'),
+i(28800,0,'BORT'),
+i(30000,1200,'BORTST'),
+i(28800,0,'BORT'),
+i(30000,1200,'BORTST'),
+i(28800,0,'BORT'),
+i(30000,1200,'BORTST'),
+i(28800,0,'BORT'),
+i(32400,0,'JST'),
+i(28800,0,'BORT'),
+i(28800,0,'MYT'),
+        ]
+
+Kuching = Kuching()
+
diff --git a/lib/pytz/zoneinfo/Asia/Kuwait.py b/lib/pytz/zoneinfo/Asia/Kuwait.py
new file mode 100755
index 0000000..011d226
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Kuwait.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Asia/Kuwait.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kuwait(DstTzInfo):
+    '''Asia/Kuwait timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Kuwait'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1949,12,31,20,48,4),
+        ]
+
+    _transition_info = [
+i(11520,0,'LMT'),
+i(10800,0,'AST'),
+        ]
+
+Kuwait = Kuwait()
+
diff --git a/lib/pytz/zoneinfo/Asia/Macao.py b/lib/pytz/zoneinfo/Asia/Macao.py
new file mode 100755
index 0000000..858c849
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Macao.py
@@ -0,0 +1,104 @@
+'''tzinfo timezone information for Asia/Macao.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Macao(DstTzInfo):
+    '''Asia/Macao timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Macao'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,16,25,40),
+d(1961,3,18,19,30,0),
+d(1961,11,4,18,30,0),
+d(1962,3,17,19,30,0),
+d(1962,11,3,18,30,0),
+d(1963,3,16,16,0,0),
+d(1963,11,2,18,30,0),
+d(1964,3,21,19,30,0),
+d(1964,10,31,18,30,0),
+d(1965,3,20,16,0,0),
+d(1965,10,30,15,0,0),
+d(1966,4,16,19,30,0),
+d(1966,10,15,18,30,0),
+d(1967,4,15,19,30,0),
+d(1967,10,21,18,30,0),
+d(1968,4,20,19,30,0),
+d(1968,10,19,18,30,0),
+d(1969,4,19,19,30,0),
+d(1969,10,18,18,30,0),
+d(1970,4,18,19,30,0),
+d(1970,10,17,18,30,0),
+d(1971,4,17,19,30,0),
+d(1971,10,16,18,30,0),
+d(1972,4,15,16,0,0),
+d(1972,10,14,15,0,0),
+d(1973,4,14,16,0,0),
+d(1973,10,20,15,0,0),
+d(1974,4,20,16,0,0),
+d(1974,10,19,18,30,0),
+d(1975,4,19,19,30,0),
+d(1975,10,18,18,30,0),
+d(1976,4,17,19,30,0),
+d(1976,10,16,18,30,0),
+d(1977,4,16,19,30,0),
+d(1977,10,15,18,30,0),
+d(1978,4,15,16,0,0),
+d(1978,10,14,15,0,0),
+d(1979,4,14,16,0,0),
+d(1979,10,20,15,0,0),
+d(1980,4,19,16,0,0),
+d(1980,10,18,15,0,0),
+d(1999,12,19,16,0,0),
+        ]
+
+    _transition_info = [
+i(27240,0,'LMT'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(28800,0,'CST'),
+        ]
+
+Macao = Macao()
+
diff --git a/lib/pytz/zoneinfo/Asia/Macau.py b/lib/pytz/zoneinfo/Asia/Macau.py
new file mode 100755
index 0000000..6865e5f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Macau.py
@@ -0,0 +1,104 @@
+'''tzinfo timezone information for Asia/Macau.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Macau(DstTzInfo):
+    '''Asia/Macau timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Macau'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,12,31,16,25,40),
+d(1961,3,18,19,30,0),
+d(1961,11,4,18,30,0),
+d(1962,3,17,19,30,0),
+d(1962,11,3,18,30,0),
+d(1963,3,16,16,0,0),
+d(1963,11,2,18,30,0),
+d(1964,3,21,19,30,0),
+d(1964,10,31,18,30,0),
+d(1965,3,20,16,0,0),
+d(1965,10,30,15,0,0),
+d(1966,4,16,19,30,0),
+d(1966,10,15,18,30,0),
+d(1967,4,15,19,30,0),
+d(1967,10,21,18,30,0),
+d(1968,4,20,19,30,0),
+d(1968,10,19,18,30,0),
+d(1969,4,19,19,30,0),
+d(1969,10,18,18,30,0),
+d(1970,4,18,19,30,0),
+d(1970,10,17,18,30,0),
+d(1971,4,17,19,30,0),
+d(1971,10,16,18,30,0),
+d(1972,4,15,16,0,0),
+d(1972,10,14,15,0,0),
+d(1973,4,14,16,0,0),
+d(1973,10,20,15,0,0),
+d(1974,4,20,16,0,0),
+d(1974,10,19,18,30,0),
+d(1975,4,19,19,30,0),
+d(1975,10,18,18,30,0),
+d(1976,4,17,19,30,0),
+d(1976,10,16,18,30,0),
+d(1977,4,16,19,30,0),
+d(1977,10,15,18,30,0),
+d(1978,4,15,16,0,0),
+d(1978,10,14,15,0,0),
+d(1979,4,14,16,0,0),
+d(1979,10,20,15,0,0),
+d(1980,4,19,16,0,0),
+d(1980,10,18,15,0,0),
+d(1999,12,19,16,0,0),
+        ]
+
+    _transition_info = [
+i(27240,0,'LMT'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(32400,3600,'MOST'),
+i(28800,0,'MOT'),
+i(28800,0,'CST'),
+        ]
+
+Macau = Macau()
+
diff --git a/lib/pytz/zoneinfo/Asia/Magadan.py b/lib/pytz/zoneinfo/Asia/Magadan.py
new file mode 100755
index 0000000..673bc1d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Magadan.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Magadan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Magadan(DstTzInfo):
+    '''Asia/Magadan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Magadan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,13,56,48),
+d(1930,6,20,14,0,0),
+d(1981,3,31,13,0,0),
+d(1981,9,30,12,0,0),
+d(1982,3,31,13,0,0),
+d(1982,9,30,12,0,0),
+d(1983,3,31,13,0,0),
+d(1983,9,30,12,0,0),
+d(1984,3,31,13,0,0),
+d(1984,9,29,15,0,0),
+d(1985,3,30,15,0,0),
+d(1985,9,28,15,0,0),
+d(1986,3,29,15,0,0),
+d(1986,9,27,15,0,0),
+d(1987,3,28,15,0,0),
+d(1987,9,26,15,0,0),
+d(1988,3,26,15,0,0),
+d(1988,9,24,15,0,0),
+d(1989,3,25,15,0,0),
+d(1989,9,23,15,0,0),
+d(1990,3,24,15,0,0),
+d(1990,9,29,15,0,0),
+d(1991,3,30,15,0,0),
+d(1991,9,28,16,0,0),
+d(1992,1,18,16,0,0),
+d(1992,3,28,12,0,0),
+d(1992,9,26,11,0,0),
+d(1993,3,27,15,0,0),
+d(1993,9,25,15,0,0),
+d(1994,3,26,15,0,0),
+d(1994,9,24,15,0,0),
+d(1995,3,25,15,0,0),
+d(1995,9,23,15,0,0),
+d(1996,3,30,15,0,0),
+d(1996,10,26,15,0,0),
+d(1997,3,29,15,0,0),
+d(1997,10,25,15,0,0),
+d(1998,3,28,15,0,0),
+d(1998,10,24,15,0,0),
+d(1999,3,27,15,0,0),
+d(1999,10,30,15,0,0),
+d(2000,3,25,15,0,0),
+d(2000,10,28,15,0,0),
+d(2001,3,24,15,0,0),
+d(2001,10,27,15,0,0),
+d(2002,3,30,15,0,0),
+d(2002,10,26,15,0,0),
+d(2003,3,29,15,0,0),
+d(2003,10,25,15,0,0),
+d(2004,3,27,15,0,0),
+d(2004,10,30,15,0,0),
+d(2005,3,26,15,0,0),
+d(2005,10,29,15,0,0),
+d(2006,3,25,15,0,0),
+d(2006,10,28,15,0,0),
+d(2007,3,24,15,0,0),
+d(2007,10,27,15,0,0),
+d(2008,3,29,15,0,0),
+d(2008,10,25,15,0,0),
+d(2009,3,28,15,0,0),
+d(2009,10,24,15,0,0),
+d(2010,3,27,15,0,0),
+d(2010,10,30,15,0,0),
+d(2011,3,26,15,0,0),
+d(2011,10,29,15,0,0),
+d(2012,3,24,15,0,0),
+d(2012,10,27,15,0,0),
+d(2013,3,30,15,0,0),
+d(2013,10,26,15,0,0),
+d(2014,3,29,15,0,0),
+d(2014,10,25,15,0,0),
+d(2015,3,28,15,0,0),
+d(2015,10,24,15,0,0),
+d(2016,3,26,15,0,0),
+d(2016,10,29,15,0,0),
+d(2017,3,25,15,0,0),
+d(2017,10,28,15,0,0),
+d(2018,3,24,15,0,0),
+d(2018,10,27,15,0,0),
+d(2019,3,30,15,0,0),
+d(2019,10,26,15,0,0),
+d(2020,3,28,15,0,0),
+d(2020,10,24,15,0,0),
+d(2021,3,27,15,0,0),
+d(2021,10,30,15,0,0),
+d(2022,3,26,15,0,0),
+d(2022,10,29,15,0,0),
+d(2023,3,25,15,0,0),
+d(2023,10,28,15,0,0),
+d(2024,3,30,15,0,0),
+d(2024,10,26,15,0,0),
+d(2025,3,29,15,0,0),
+d(2025,10,25,15,0,0),
+d(2026,3,28,15,0,0),
+d(2026,10,24,15,0,0),
+d(2027,3,27,15,0,0),
+d(2027,10,30,15,0,0),
+d(2028,3,25,15,0,0),
+d(2028,10,28,15,0,0),
+d(2029,3,24,15,0,0),
+d(2029,10,27,15,0,0),
+d(2030,3,30,15,0,0),
+d(2030,10,26,15,0,0),
+d(2031,3,29,15,0,0),
+d(2031,10,25,15,0,0),
+d(2032,3,27,15,0,0),
+d(2032,10,30,15,0,0),
+d(2033,3,26,15,0,0),
+d(2033,10,29,15,0,0),
+d(2034,3,25,15,0,0),
+d(2034,10,28,15,0,0),
+d(2035,3,24,15,0,0),
+d(2035,10,27,15,0,0),
+d(2036,3,29,15,0,0),
+d(2036,10,25,15,0,0),
+d(2037,3,28,15,0,0),
+d(2037,10,24,15,0,0),
+        ]
+
+    _transition_info = [
+i(36180,0,'LMT'),
+i(36000,0,'MAGT'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(39600,0,'MAGST'),
+i(36000,0,'MAGT'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+i(43200,3600,'MAGST'),
+i(39600,0,'MAGT'),
+        ]
+
+Magadan = Magadan()
+
diff --git a/lib/pytz/zoneinfo/Asia/Makassar.py b/lib/pytz/zoneinfo/Asia/Makassar.py
new file mode 100755
index 0000000..421845e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Makassar.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Asia/Makassar.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Makassar(DstTzInfo):
+    '''Asia/Makassar timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Makassar'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,16,2,24),
+d(1932,10,31,16,2,24),
+d(1942,2,8,16,0,0),
+d(1945,7,31,15,0,0),
+        ]
+
+    _transition_info = [
+i(28680,0,'LMT'),
+i(28680,0,'MMT'),
+i(28800,0,'CIT'),
+i(32400,0,'JST'),
+i(28800,0,'CIT'),
+        ]
+
+Makassar = Makassar()
+
diff --git a/lib/pytz/zoneinfo/Asia/Manila.py b/lib/pytz/zoneinfo/Asia/Manila.py
new file mode 100755
index 0000000..9d2112b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Manila.py
@@ -0,0 +1,36 @@
+'''tzinfo timezone information for Asia/Manila.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Manila(DstTzInfo):
+    '''Asia/Manila timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Manila'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1936,10,31,16,0,0),
+d(1937,1,31,15,0,0),
+d(1942,4,30,16,0,0),
+d(1944,10,31,15,0,0),
+d(1954,4,11,16,0,0),
+d(1954,6,30,15,0,0),
+d(1978,3,21,16,0,0),
+d(1978,9,20,15,0,0),
+        ]
+
+    _transition_info = [
+i(28800,0,'PHT'),
+i(32400,3600,'PHST'),
+i(28800,0,'PHT'),
+i(32400,0,'JST'),
+i(28800,0,'PHT'),
+i(32400,3600,'PHST'),
+i(28800,0,'PHT'),
+i(32400,3600,'PHST'),
+i(28800,0,'PHT'),
+        ]
+
+Manila = Manila()
+
diff --git a/lib/pytz/zoneinfo/Asia/Muscat.py b/lib/pytz/zoneinfo/Asia/Muscat.py
new file mode 100755
index 0000000..68bdb13
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Muscat.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Asia/Muscat.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Muscat(DstTzInfo):
+    '''Asia/Muscat timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Muscat'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,20,5,40),
+        ]
+
+    _transition_info = [
+i(14040,0,'LMT'),
+i(14400,0,'GST'),
+        ]
+
+Muscat = Muscat()
+
diff --git a/lib/pytz/zoneinfo/Asia/Nicosia.py b/lib/pytz/zoneinfo/Asia/Nicosia.py
new file mode 100755
index 0000000..737050f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Nicosia.py
@@ -0,0 +1,274 @@
+'''tzinfo timezone information for Asia/Nicosia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Nicosia(DstTzInfo):
+    '''Asia/Nicosia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Nicosia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1921,11,13,21,46,32),
+d(1975,4,12,22,0,0),
+d(1975,10,11,21,0,0),
+d(1976,5,14,22,0,0),
+d(1976,10,10,21,0,0),
+d(1977,4,2,22,0,0),
+d(1977,9,24,21,0,0),
+d(1978,4,1,22,0,0),
+d(1978,10,1,21,0,0),
+d(1979,3,31,22,0,0),
+d(1979,9,29,21,0,0),
+d(1980,4,5,22,0,0),
+d(1980,9,27,21,0,0),
+d(1981,3,28,22,0,0),
+d(1981,9,26,21,0,0),
+d(1982,3,27,22,0,0),
+d(1982,9,25,21,0,0),
+d(1983,3,26,22,0,0),
+d(1983,9,24,21,0,0),
+d(1984,3,24,22,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,22,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,22,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,22,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,22,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,22,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,22,0,0),
+d(1990,9,29,21,0,0),
+d(1991,3,30,22,0,0),
+d(1991,9,28,21,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,22,0,0),
+d(1996,9,28,21,0,0),
+d(1997,3,29,22,0,0),
+d(1997,9,27,21,0,0),
+d(1998,3,28,22,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(7980,0,'LMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Nicosia = Nicosia()
+
diff --git a/lib/pytz/zoneinfo/Asia/Novosibirsk.py b/lib/pytz/zoneinfo/Asia/Novosibirsk.py
new file mode 100755
index 0000000..69e9cbe
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Novosibirsk.py
@@ -0,0 +1,256 @@
+'''tzinfo timezone information for Asia/Novosibirsk.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Novosibirsk(DstTzInfo):
+    '''Asia/Novosibirsk timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Novosibirsk'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,14,0,28,20),
+d(1930,6,20,18,0,0),
+d(1981,3,31,17,0,0),
+d(1981,9,30,16,0,0),
+d(1982,3,31,17,0,0),
+d(1982,9,30,16,0,0),
+d(1983,3,31,17,0,0),
+d(1983,9,30,16,0,0),
+d(1984,3,31,17,0,0),
+d(1984,9,29,19,0,0),
+d(1985,3,30,19,0,0),
+d(1985,9,28,19,0,0),
+d(1986,3,29,19,0,0),
+d(1986,9,27,19,0,0),
+d(1987,3,28,19,0,0),
+d(1987,9,26,19,0,0),
+d(1988,3,26,19,0,0),
+d(1988,9,24,19,0,0),
+d(1989,3,25,19,0,0),
+d(1989,9,23,19,0,0),
+d(1990,3,24,19,0,0),
+d(1990,9,29,19,0,0),
+d(1991,3,30,19,0,0),
+d(1991,9,28,20,0,0),
+d(1992,1,18,20,0,0),
+d(1992,3,28,16,0,0),
+d(1992,9,26,15,0,0),
+d(1993,3,27,19,0,0),
+d(1993,5,22,16,0,0),
+d(1993,9,25,20,0,0),
+d(1994,3,26,20,0,0),
+d(1994,9,24,20,0,0),
+d(1995,3,25,20,0,0),
+d(1995,9,23,20,0,0),
+d(1996,3,30,20,0,0),
+d(1996,10,26,20,0,0),
+d(1997,3,29,20,0,0),
+d(1997,10,25,20,0,0),
+d(1998,3,28,20,0,0),
+d(1998,10,24,20,0,0),
+d(1999,3,27,20,0,0),
+d(1999,10,30,20,0,0),
+d(2000,3,25,20,0,0),
+d(2000,10,28,20,0,0),
+d(2001,3,24,20,0,0),
+d(2001,10,27,20,0,0),
+d(2002,3,30,20,0,0),
+d(2002,10,26,20,0,0),
+d(2003,3,29,20,0,0),
+d(2003,10,25,20,0,0),
+d(2004,3,27,20,0,0),
+d(2004,10,30,20,0,0),
+d(2005,3,26,20,0,0),
+d(2005,10,29,20,0,0),
+d(2006,3,25,20,0,0),
+d(2006,10,28,20,0,0),
+d(2007,3,24,20,0,0),
+d(2007,10,27,20,0,0),
+d(2008,3,29,20,0,0),
+d(2008,10,25,20,0,0),
+d(2009,3,28,20,0,0),
+d(2009,10,24,20,0,0),
+d(2010,3,27,20,0,0),
+d(2010,10,30,20,0,0),
+d(2011,3,26,20,0,0),
+d(2011,10,29,20,0,0),
+d(2012,3,24,20,0,0),
+d(2012,10,27,20,0,0),
+d(2013,3,30,20,0,0),
+d(2013,10,26,20,0,0),
+d(2014,3,29,20,0,0),
+d(2014,10,25,20,0,0),
+d(2015,3,28,20,0,0),
+d(2015,10,24,20,0,0),
+d(2016,3,26,20,0,0),
+d(2016,10,29,20,0,0),
+d(2017,3,25,20,0,0),
+d(2017,10,28,20,0,0),
+d(2018,3,24,20,0,0),
+d(2018,10,27,20,0,0),
+d(2019,3,30,20,0,0),
+d(2019,10,26,20,0,0),
+d(2020,3,28,20,0,0),
+d(2020,10,24,20,0,0),
+d(2021,3,27,20,0,0),
+d(2021,10,30,20,0,0),
+d(2022,3,26,20,0,0),
+d(2022,10,29,20,0,0),
+d(2023,3,25,20,0,0),
+d(2023,10,28,20,0,0),
+d(2024,3,30,20,0,0),
+d(2024,10,26,20,0,0),
+d(2025,3,29,20,0,0),
+d(2025,10,25,20,0,0),
+d(2026,3,28,20,0,0),
+d(2026,10,24,20,0,0),
+d(2027,3,27,20,0,0),
+d(2027,10,30,20,0,0),
+d(2028,3,25,20,0,0),
+d(2028,10,28,20,0,0),
+d(2029,3,24,20,0,0),
+d(2029,10,27,20,0,0),
+d(2030,3,30,20,0,0),
+d(2030,10,26,20,0,0),
+d(2031,3,29,20,0,0),
+d(2031,10,25,20,0,0),
+d(2032,3,27,20,0,0),
+d(2032,10,30,20,0,0),
+d(2033,3,26,20,0,0),
+d(2033,10,29,20,0,0),
+d(2034,3,25,20,0,0),
+d(2034,10,28,20,0,0),
+d(2035,3,24,20,0,0),
+d(2035,10,27,20,0,0),
+d(2036,3,29,20,0,0),
+d(2036,10,25,20,0,0),
+d(2037,3,28,20,0,0),
+d(2037,10,24,20,0,0),
+        ]
+
+    _transition_info = [
+i(19920,0,'LMT'),
+i(21600,0,'NOVT'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(25200,0,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVT'),
+i(28800,3600,'NOVST'),
+i(25200,0,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+i(25200,3600,'NOVST'),
+i(21600,0,'NOVT'),
+        ]
+
+Novosibirsk = Novosibirsk()
+
diff --git a/lib/pytz/zoneinfo/Asia/Omsk.py b/lib/pytz/zoneinfo/Asia/Omsk.py
new file mode 100755
index 0000000..3c74a39
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Omsk.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Omsk.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Omsk(DstTzInfo):
+    '''Asia/Omsk timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Omsk'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,11,13,19,6,24),
+d(1930,6,20,19,0,0),
+d(1981,3,31,18,0,0),
+d(1981,9,30,17,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,17,0,0),
+d(1983,3,31,18,0,0),
+d(1983,9,30,17,0,0),
+d(1984,3,31,18,0,0),
+d(1984,9,29,20,0,0),
+d(1985,3,30,20,0,0),
+d(1985,9,28,20,0,0),
+d(1986,3,29,20,0,0),
+d(1986,9,27,20,0,0),
+d(1987,3,28,20,0,0),
+d(1987,9,26,20,0,0),
+d(1988,3,26,20,0,0),
+d(1988,9,24,20,0,0),
+d(1989,3,25,20,0,0),
+d(1989,9,23,20,0,0),
+d(1990,3,24,20,0,0),
+d(1990,9,29,20,0,0),
+d(1991,3,30,20,0,0),
+d(1991,9,28,21,0,0),
+d(1992,1,18,21,0,0),
+d(1992,3,28,17,0,0),
+d(1992,9,26,16,0,0),
+d(1993,3,27,20,0,0),
+d(1993,9,25,20,0,0),
+d(1994,3,26,20,0,0),
+d(1994,9,24,20,0,0),
+d(1995,3,25,20,0,0),
+d(1995,9,23,20,0,0),
+d(1996,3,30,20,0,0),
+d(1996,10,26,20,0,0),
+d(1997,3,29,20,0,0),
+d(1997,10,25,20,0,0),
+d(1998,3,28,20,0,0),
+d(1998,10,24,20,0,0),
+d(1999,3,27,20,0,0),
+d(1999,10,30,20,0,0),
+d(2000,3,25,20,0,0),
+d(2000,10,28,20,0,0),
+d(2001,3,24,20,0,0),
+d(2001,10,27,20,0,0),
+d(2002,3,30,20,0,0),
+d(2002,10,26,20,0,0),
+d(2003,3,29,20,0,0),
+d(2003,10,25,20,0,0),
+d(2004,3,27,20,0,0),
+d(2004,10,30,20,0,0),
+d(2005,3,26,20,0,0),
+d(2005,10,29,20,0,0),
+d(2006,3,25,20,0,0),
+d(2006,10,28,20,0,0),
+d(2007,3,24,20,0,0),
+d(2007,10,27,20,0,0),
+d(2008,3,29,20,0,0),
+d(2008,10,25,20,0,0),
+d(2009,3,28,20,0,0),
+d(2009,10,24,20,0,0),
+d(2010,3,27,20,0,0),
+d(2010,10,30,20,0,0),
+d(2011,3,26,20,0,0),
+d(2011,10,29,20,0,0),
+d(2012,3,24,20,0,0),
+d(2012,10,27,20,0,0),
+d(2013,3,30,20,0,0),
+d(2013,10,26,20,0,0),
+d(2014,3,29,20,0,0),
+d(2014,10,25,20,0,0),
+d(2015,3,28,20,0,0),
+d(2015,10,24,20,0,0),
+d(2016,3,26,20,0,0),
+d(2016,10,29,20,0,0),
+d(2017,3,25,20,0,0),
+d(2017,10,28,20,0,0),
+d(2018,3,24,20,0,0),
+d(2018,10,27,20,0,0),
+d(2019,3,30,20,0,0),
+d(2019,10,26,20,0,0),
+d(2020,3,28,20,0,0),
+d(2020,10,24,20,0,0),
+d(2021,3,27,20,0,0),
+d(2021,10,30,20,0,0),
+d(2022,3,26,20,0,0),
+d(2022,10,29,20,0,0),
+d(2023,3,25,20,0,0),
+d(2023,10,28,20,0,0),
+d(2024,3,30,20,0,0),
+d(2024,10,26,20,0,0),
+d(2025,3,29,20,0,0),
+d(2025,10,25,20,0,0),
+d(2026,3,28,20,0,0),
+d(2026,10,24,20,0,0),
+d(2027,3,27,20,0,0),
+d(2027,10,30,20,0,0),
+d(2028,3,25,20,0,0),
+d(2028,10,28,20,0,0),
+d(2029,3,24,20,0,0),
+d(2029,10,27,20,0,0),
+d(2030,3,30,20,0,0),
+d(2030,10,26,20,0,0),
+d(2031,3,29,20,0,0),
+d(2031,10,25,20,0,0),
+d(2032,3,27,20,0,0),
+d(2032,10,30,20,0,0),
+d(2033,3,26,20,0,0),
+d(2033,10,29,20,0,0),
+d(2034,3,25,20,0,0),
+d(2034,10,28,20,0,0),
+d(2035,3,24,20,0,0),
+d(2035,10,27,20,0,0),
+d(2036,3,29,20,0,0),
+d(2036,10,25,20,0,0),
+d(2037,3,28,20,0,0),
+d(2037,10,24,20,0,0),
+        ]
+
+    _transition_info = [
+i(17640,0,'LMT'),
+i(18000,0,'OMST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(21600,0,'OMSST'),
+i(18000,0,'OMST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+i(25200,3600,'OMSST'),
+i(21600,0,'OMST'),
+        ]
+
+Omsk = Omsk()
+
diff --git a/lib/pytz/zoneinfo/Asia/Oral.py b/lib/pytz/zoneinfo/Asia/Oral.py
new file mode 100755
index 0000000..92010ff
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Oral.py
@@ -0,0 +1,122 @@
+'''tzinfo timezone information for Asia/Oral.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Oral(DstTzInfo):
+    '''Asia/Oral timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Oral'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,20,34,36),
+d(1930,6,20,20,0,0),
+d(1981,3,31,19,0,0),
+d(1981,9,30,18,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,18,0,0),
+d(1983,3,31,19,0,0),
+d(1983,9,30,18,0,0),
+d(1984,3,31,19,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,21,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,21,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,21,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,21,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,21,0,0),
+d(1989,9,23,22,0,0),
+d(1990,3,24,22,0,0),
+d(1990,9,29,22,0,0),
+d(1990,12,31,20,0,0),
+d(1991,12,15,20,0,0),
+d(1992,3,28,19,0,0),
+d(1992,9,26,18,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,22,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,22,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,22,0,0),
+d(1996,3,30,22,0,0),
+d(1996,10,26,22,0,0),
+d(1997,3,29,22,0,0),
+d(1997,10,25,22,0,0),
+d(1998,3,28,22,0,0),
+d(1998,10,24,22,0,0),
+d(1999,3,27,22,0,0),
+d(1999,10,30,22,0,0),
+d(2000,3,25,22,0,0),
+d(2000,10,28,22,0,0),
+d(2001,3,24,22,0,0),
+d(2001,10,27,22,0,0),
+d(2002,3,30,22,0,0),
+d(2002,10,26,22,0,0),
+d(2003,3,29,22,0,0),
+d(2003,10,25,22,0,0),
+d(2004,3,27,22,0,0),
+d(2004,10,30,22,0,0),
+d(2005,3,14,20,0,0),
+        ]
+
+    _transition_info = [
+i(12300,0,'LMT'),
+i(14400,0,'URAT'),
+i(18000,0,'URAT'),
+i(21600,3600,'URAST'),
+i(21600,0,'URAT'),
+i(21600,0,'URAST'),
+i(18000,0,'URAT'),
+i(21600,3600,'URAST'),
+i(18000,0,'URAT'),
+i(21600,3600,'URAST'),
+i(18000,0,'URAT'),
+i(21600,3600,'URAST'),
+i(18000,0,'URAT'),
+i(21600,3600,'URAST'),
+i(18000,0,'URAT'),
+i(21600,3600,'URAST'),
+i(18000,0,'URAT'),
+i(21600,3600,'URAST'),
+i(18000,0,'URAT'),
+i(18000,0,'URAST'),
+i(14400,0,'URAT'),
+i(18000,3600,'URAST'),
+i(14400,0,'URAT'),
+i(14400,0,'URAT'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,3600,'ORAST'),
+i(14400,0,'ORAT'),
+i(18000,0,'ORAT'),
+        ]
+
+Oral = Oral()
+
diff --git a/lib/pytz/zoneinfo/Asia/Phnom_Penh.py b/lib/pytz/zoneinfo/Asia/Phnom_Penh.py
new file mode 100755
index 0000000..e7377c5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Phnom_Penh.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Asia/Phnom_Penh.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Phnom_Penh(DstTzInfo):
+    '''Asia/Phnom_Penh timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Phnom_Penh'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,6,8,17,0,20),
+d(1911,3,10,16,54,40),
+d(1912,4,30,17,0,0),
+d(1931,4,30,16,0,0),
+        ]
+
+    _transition_info = [
+i(25200,0,'LMT'),
+i(25560,0,'SMT'),
+i(25200,0,'ICT'),
+i(28800,0,'ICT'),
+i(25200,0,'ICT'),
+        ]
+
+Phnom_Penh = Phnom_Penh()
+
diff --git a/lib/pytz/zoneinfo/Asia/Pontianak.py b/lib/pytz/zoneinfo/Asia/Pontianak.py
new file mode 100755
index 0000000..0611e9e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Pontianak.py
@@ -0,0 +1,36 @@
+'''tzinfo timezone information for Asia/Pontianak.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Pontianak(DstTzInfo):
+    '''Asia/Pontianak timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Pontianak'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1908,4,30,16,42,40),
+d(1932,10,31,16,42,40),
+d(1942,1,28,16,30,0),
+d(1945,7,31,15,0,0),
+d(1948,4,30,16,30,0),
+d(1950,4,30,16,0,0),
+d(1963,12,31,16,30,0),
+d(1987,12,31,16,0,0),
+        ]
+
+    _transition_info = [
+i(26220,0,'LMT'),
+i(26220,0,'PMT'),
+i(27000,0,'WIT'),
+i(32400,0,'JST'),
+i(27000,0,'WIT'),
+i(28800,0,'WIT'),
+i(27000,0,'WIT'),
+i(28800,0,'CIT'),
+i(25200,0,'WIT'),
+        ]
+
+Pontianak = Pontianak()
+
diff --git a/lib/pytz/zoneinfo/Asia/Pyongyang.py b/lib/pytz/zoneinfo/Asia/Pyongyang.py
new file mode 100755
index 0000000..bf203c3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Pyongyang.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for Asia/Pyongyang.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Pyongyang(DstTzInfo):
+    '''Asia/Pyongyang timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Pyongyang'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1904,11,30,15,30,0),
+d(1927,12,31,15,0,0),
+d(1931,12,31,15,30,0),
+d(1954,3,20,15,0,0),
+d(1961,8,9,16,0,0),
+        ]
+
+    _transition_info = [
+i(30600,0,'KST'),
+i(32400,0,'KST'),
+i(30600,0,'KST'),
+i(32400,0,'KST'),
+i(28800,0,'KST'),
+i(32400,0,'KST'),
+        ]
+
+Pyongyang = Pyongyang()
+
diff --git a/lib/pytz/zoneinfo/Asia/Qatar.py b/lib/pytz/zoneinfo/Asia/Qatar.py
new file mode 100755
index 0000000..746aa5a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Qatar.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Asia/Qatar.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Qatar(DstTzInfo):
+    '''Asia/Qatar timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Qatar'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,20,33,52),
+d(1972,5,31,20,0,0),
+        ]
+
+    _transition_info = [
+i(12360,0,'LMT'),
+i(14400,0,'GST'),
+i(10800,0,'AST'),
+        ]
+
+Qatar = Qatar()
+
diff --git a/lib/pytz/zoneinfo/Asia/Qyzylorda.py b/lib/pytz/zoneinfo/Asia/Qyzylorda.py
new file mode 100755
index 0000000..3dd7460
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Qyzylorda.py
@@ -0,0 +1,124 @@
+'''tzinfo timezone information for Asia/Qyzylorda.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Qyzylorda(DstTzInfo):
+    '''Asia/Qyzylorda timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Qyzylorda'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,19,38,8),
+d(1930,6,20,20,0,0),
+d(1981,3,31,19,0,0),
+d(1981,9,30,18,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,18,0,0),
+d(1983,3,31,19,0,0),
+d(1983,9,30,18,0,0),
+d(1984,3,31,19,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,21,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,21,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,21,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,21,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,21,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,21,0,0),
+d(1990,9,29,21,0,0),
+d(1990,12,31,19,0,0),
+d(1991,12,15,19,0,0),
+d(1992,1,18,21,0,0),
+d(1992,3,28,17,0,0),
+d(1992,9,26,16,0,0),
+d(1993,3,27,20,0,0),
+d(1993,9,25,20,0,0),
+d(1994,3,26,20,0,0),
+d(1994,9,24,20,0,0),
+d(1995,3,25,20,0,0),
+d(1995,9,23,20,0,0),
+d(1996,3,30,20,0,0),
+d(1996,10,26,20,0,0),
+d(1997,3,29,20,0,0),
+d(1997,10,25,20,0,0),
+d(1998,3,28,20,0,0),
+d(1998,10,24,20,0,0),
+d(1999,3,27,20,0,0),
+d(1999,10,30,20,0,0),
+d(2000,3,25,20,0,0),
+d(2000,10,28,20,0,0),
+d(2001,3,24,20,0,0),
+d(2001,10,27,20,0,0),
+d(2002,3,30,20,0,0),
+d(2002,10,26,20,0,0),
+d(2003,3,29,20,0,0),
+d(2003,10,25,20,0,0),
+d(2004,3,27,20,0,0),
+d(2004,10,30,20,0,0),
+d(2005,3,14,18,0,0),
+        ]
+
+    _transition_info = [
+i(15720,0,'LMT'),
+i(14400,0,'KIZT'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(21600,0,'KIZT'),
+i(21600,0,'KIZST'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(18000,0,'KIZT'),
+i(21600,3600,'KIZST'),
+i(18000,0,'KIZT'),
+i(18000,0,'KIZT'),
+i(18000,0,'QYZT'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(25200,3600,'QYZST'),
+i(21600,0,'QYZT'),
+i(21600,0,'QYZT'),
+        ]
+
+Qyzylorda = Qyzylorda()
+
diff --git a/lib/pytz/zoneinfo/Asia/Rangoon.py b/lib/pytz/zoneinfo/Asia/Rangoon.py
new file mode 100755
index 0000000..d8120d8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Rangoon.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Asia/Rangoon.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rangoon(DstTzInfo):
+    '''Asia/Rangoon timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Rangoon'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,17,35,24),
+d(1942,4,30,17,30,0),
+d(1945,5,2,15,0,0),
+        ]
+
+    _transition_info = [
+i(23100,0,'RMT'),
+i(23400,0,'BURT'),
+i(32400,0,'JST'),
+i(23400,0,'MMT'),
+        ]
+
+Rangoon = Rangoon()
+
diff --git a/lib/pytz/zoneinfo/Asia/Riyadh.py b/lib/pytz/zoneinfo/Asia/Riyadh.py
new file mode 100755
index 0000000..fb09cdb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Riyadh.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Asia/Riyadh.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Riyadh(DstTzInfo):
+    '''Asia/Riyadh timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Riyadh'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1949,12,31,20,53,8),
+        ]
+
+    _transition_info = [
+i(11220,0,'LMT'),
+i(10800,0,'AST'),
+        ]
+
+Riyadh = Riyadh()
+
diff --git a/lib/pytz/zoneinfo/Asia/Saigon.py b/lib/pytz/zoneinfo/Asia/Saigon.py
new file mode 100755
index 0000000..a0cfcc7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Saigon.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Asia/Saigon.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Saigon(DstTzInfo):
+    '''Asia/Saigon timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Saigon'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,6,8,16,53,20),
+d(1911,3,10,16,54,40),
+d(1912,4,30,17,0,0),
+d(1931,4,30,16,0,0),
+        ]
+
+    _transition_info = [
+i(25620,0,'LMT'),
+i(25560,0,'SMT'),
+i(25200,0,'ICT'),
+i(28800,0,'ICT'),
+i(25200,0,'ICT'),
+        ]
+
+Saigon = Saigon()
+
diff --git a/lib/pytz/zoneinfo/Asia/Sakhalin.py b/lib/pytz/zoneinfo/Asia/Sakhalin.py
new file mode 100755
index 0000000..45a3672
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Sakhalin.py
@@ -0,0 +1,256 @@
+'''tzinfo timezone information for Asia/Sakhalin.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Sakhalin(DstTzInfo):
+    '''Asia/Sakhalin timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Sakhalin'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,8,22,14,29,12),
+d(1937,12,31,15,0,0),
+d(1945,8,24,15,0,0),
+d(1981,3,31,13,0,0),
+d(1981,9,30,12,0,0),
+d(1982,3,31,13,0,0),
+d(1982,9,30,12,0,0),
+d(1983,3,31,13,0,0),
+d(1983,9,30,12,0,0),
+d(1984,3,31,13,0,0),
+d(1984,9,29,15,0,0),
+d(1985,3,30,15,0,0),
+d(1985,9,28,15,0,0),
+d(1986,3,29,15,0,0),
+d(1986,9,27,15,0,0),
+d(1987,3,28,15,0,0),
+d(1987,9,26,15,0,0),
+d(1988,3,26,15,0,0),
+d(1988,9,24,15,0,0),
+d(1989,3,25,15,0,0),
+d(1989,9,23,15,0,0),
+d(1990,3,24,15,0,0),
+d(1990,9,29,15,0,0),
+d(1991,3,30,15,0,0),
+d(1991,9,28,16,0,0),
+d(1992,1,18,16,0,0),
+d(1992,3,28,12,0,0),
+d(1992,9,26,11,0,0),
+d(1993,3,27,15,0,0),
+d(1993,9,25,15,0,0),
+d(1994,3,26,15,0,0),
+d(1994,9,24,15,0,0),
+d(1995,3,25,15,0,0),
+d(1995,9,23,15,0,0),
+d(1996,3,30,15,0,0),
+d(1996,10,26,15,0,0),
+d(1997,3,29,15,0,0),
+d(1997,10,25,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,24,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,30,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,10,28,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,27,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,26,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,25,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,30,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,29,16,0,0),
+d(2006,3,25,16,0,0),
+d(2006,10,28,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,27,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,25,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,24,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,30,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,29,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,27,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,26,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,25,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,24,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,29,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,10,28,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,27,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,26,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,24,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,30,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,29,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,10,28,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,26,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,25,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,24,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,30,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,10,28,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,27,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,26,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,25,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,30,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,29,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,10,28,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,27,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,25,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,24,16,0,0),
+        ]
+
+    _transition_info = [
+i(34260,0,'LMT'),
+i(32400,0,'CJT'),
+i(32400,0,'JST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(39600,0,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(43200,3600,'SAKST'),
+i(39600,0,'SAKT'),
+i(39600,0,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+i(39600,3600,'SAKST'),
+i(36000,0,'SAKT'),
+        ]
+
+Sakhalin = Sakhalin()
+
diff --git a/lib/pytz/zoneinfo/Asia/Samarkand.py b/lib/pytz/zoneinfo/Asia/Samarkand.py
new file mode 100755
index 0000000..1a039f7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Samarkand.py
@@ -0,0 +1,72 @@
+'''tzinfo timezone information for Asia/Samarkand.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Samarkand(DstTzInfo):
+    '''Asia/Samarkand timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Samarkand'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,19,32,48),
+d(1930,6,20,20,0,0),
+d(1981,3,31,19,0,0),
+d(1981,9,30,18,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,18,0,0),
+d(1983,3,31,19,0,0),
+d(1983,9,30,18,0,0),
+d(1984,3,31,19,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,21,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,21,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,21,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,21,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,21,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,21,0,0),
+d(1990,9,29,21,0,0),
+d(1991,3,30,21,0,0),
+d(1991,8,31,18,0,0),
+d(1991,9,28,21,0,0),
+d(1991,12,31,19,0,0),
+        ]
+
+    _transition_info = [
+i(16020,0,'LMT'),
+i(14400,0,'SAMT'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(21600,0,'TAST'),
+i(21600,0,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(18000,0,'SAMT'),
+i(21600,3600,'SAMST'),
+i(21600,3600,'UZST'),
+i(18000,0,'UZT'),
+i(18000,0,'UZT'),
+        ]
+
+Samarkand = Samarkand()
+
diff --git a/lib/pytz/zoneinfo/Asia/Seoul.py b/lib/pytz/zoneinfo/Asia/Seoul.py
new file mode 100755
index 0000000..07b9c92
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Seoul.py
@@ -0,0 +1,44 @@
+'''tzinfo timezone information for Asia/Seoul.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Seoul(DstTzInfo):
+    '''Asia/Seoul timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Seoul'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1904,11,30,15,30,0),
+d(1927,12,31,15,0,0),
+d(1931,12,31,15,30,0),
+d(1954,3,20,15,0,0),
+d(1960,5,14,16,0,0),
+d(1960,9,12,15,0,0),
+d(1961,8,9,16,0,0),
+d(1968,9,30,15,30,0),
+d(1987,5,9,15,0,0),
+d(1987,10,10,14,0,0),
+d(1988,5,7,15,0,0),
+d(1988,10,8,14,0,0),
+        ]
+
+    _transition_info = [
+i(30600,0,'KST'),
+i(32400,0,'KST'),
+i(30600,0,'KST'),
+i(32400,0,'KST'),
+i(28800,0,'KST'),
+i(32400,3600,'KDT'),
+i(28800,0,'KST'),
+i(30600,0,'KST'),
+i(32400,0,'KST'),
+i(36000,3600,'KDT'),
+i(32400,0,'KST'),
+i(36000,3600,'KDT'),
+i(32400,0,'KST'),
+        ]
+
+Seoul = Seoul()
+
diff --git a/lib/pytz/zoneinfo/Asia/Shanghai.py b/lib/pytz/zoneinfo/Asia/Shanghai.py
new file mode 100755
index 0000000..51f123b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Shanghai.py
@@ -0,0 +1,54 @@
+'''tzinfo timezone information for Asia/Shanghai.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Shanghai(DstTzInfo):
+    '''Asia/Shanghai timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Shanghai'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,12,31,15,54,8),
+d(1940,6,2,16,0,0),
+d(1940,9,30,15,0,0),
+d(1941,3,15,16,0,0),
+d(1941,9,30,15,0,0),
+d(1986,5,3,16,0,0),
+d(1986,9,13,15,0,0),
+d(1987,4,11,16,0,0),
+d(1987,9,12,15,0,0),
+d(1988,4,9,16,0,0),
+d(1988,9,10,15,0,0),
+d(1989,4,15,16,0,0),
+d(1989,9,16,15,0,0),
+d(1990,4,14,16,0,0),
+d(1990,9,15,15,0,0),
+d(1991,4,13,16,0,0),
+d(1991,9,14,15,0,0),
+        ]
+
+    _transition_info = [
+i(29160,0,'LMT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+Shanghai = Shanghai()
+
diff --git a/lib/pytz/zoneinfo/Asia/Singapore.py b/lib/pytz/zoneinfo/Asia/Singapore.py
new file mode 100755
index 0000000..952f4c9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Singapore.py
@@ -0,0 +1,36 @@
+'''tzinfo timezone information for Asia/Singapore.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Singapore(DstTzInfo):
+    '''Asia/Singapore timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Singapore'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,5,31,17,4,35),
+d(1932,12,31,17,0,0),
+d(1935,12,31,16,40,0),
+d(1941,8,31,16,40,0),
+d(1942,2,15,16,30,0),
+d(1945,9,11,15,0,0),
+d(1965,8,8,16,30,0),
+d(1981,12,31,16,30,0),
+        ]
+
+    _transition_info = [
+i(24900,0,'SMT'),
+i(25200,0,'MALT'),
+i(26400,1200,'MALST'),
+i(26400,0,'MALT'),
+i(27000,0,'MALT'),
+i(32400,0,'JST'),
+i(27000,0,'MALT'),
+i(27000,0,'SGT'),
+i(28800,0,'SGT'),
+        ]
+
+Singapore = Singapore()
+
diff --git a/lib/pytz/zoneinfo/Asia/Taipei.py b/lib/pytz/zoneinfo/Asia/Taipei.py
new file mode 100755
index 0000000..ae23e77
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Taipei.py
@@ -0,0 +1,100 @@
+'''tzinfo timezone information for Asia/Taipei.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Taipei(DstTzInfo):
+    '''Asia/Taipei timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Taipei'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1945,4,30,16,0,0),
+d(1945,9,30,15,0,0),
+d(1946,4,30,16,0,0),
+d(1946,9,30,15,0,0),
+d(1947,4,30,16,0,0),
+d(1947,9,30,15,0,0),
+d(1948,4,30,16,0,0),
+d(1948,9,30,15,0,0),
+d(1949,4,30,16,0,0),
+d(1949,9,30,15,0,0),
+d(1950,4,30,16,0,0),
+d(1950,9,30,15,0,0),
+d(1951,4,30,16,0,0),
+d(1951,9,30,15,0,0),
+d(1952,2,29,16,0,0),
+d(1952,10,31,15,0,0),
+d(1953,3,31,16,0,0),
+d(1953,10,31,15,0,0),
+d(1954,3,31,16,0,0),
+d(1954,10,31,15,0,0),
+d(1955,3,31,16,0,0),
+d(1955,9,30,15,0,0),
+d(1956,3,31,16,0,0),
+d(1956,9,30,15,0,0),
+d(1957,3,31,16,0,0),
+d(1957,9,30,15,0,0),
+d(1958,3,31,16,0,0),
+d(1958,9,30,15,0,0),
+d(1959,3,31,16,0,0),
+d(1959,9,30,15,0,0),
+d(1960,5,31,16,0,0),
+d(1960,9,30,15,0,0),
+d(1961,5,31,16,0,0),
+d(1961,9,30,15,0,0),
+d(1974,3,31,16,0,0),
+d(1974,9,30,15,0,0),
+d(1975,3,31,16,0,0),
+d(1975,9,30,15,0,0),
+d(1980,6,29,16,0,0),
+d(1980,9,29,15,0,0),
+        ]
+
+    _transition_info = [
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+Taipei = Taipei()
+
diff --git a/lib/pytz/zoneinfo/Asia/Tashkent.py b/lib/pytz/zoneinfo/Asia/Tashkent.py
new file mode 100755
index 0000000..23ff12e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Tashkent.py
@@ -0,0 +1,72 @@
+'''tzinfo timezone information for Asia/Tashkent.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tashkent(DstTzInfo):
+    '''Asia/Tashkent timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Tashkent'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,19,22,48),
+d(1930,6,20,19,0,0),
+d(1981,3,31,18,0,0),
+d(1981,9,30,17,0,0),
+d(1982,3,31,18,0,0),
+d(1982,9,30,17,0,0),
+d(1983,3,31,18,0,0),
+d(1983,9,30,17,0,0),
+d(1984,3,31,18,0,0),
+d(1984,9,29,20,0,0),
+d(1985,3,30,20,0,0),
+d(1985,9,28,20,0,0),
+d(1986,3,29,20,0,0),
+d(1986,9,27,20,0,0),
+d(1987,3,28,20,0,0),
+d(1987,9,26,20,0,0),
+d(1988,3,26,20,0,0),
+d(1988,9,24,20,0,0),
+d(1989,3,25,20,0,0),
+d(1989,9,23,20,0,0),
+d(1990,3,24,20,0,0),
+d(1990,9,29,20,0,0),
+d(1991,3,30,20,0,0),
+d(1991,8,31,18,0,0),
+d(1991,9,28,21,0,0),
+d(1991,12,31,19,0,0),
+        ]
+
+    _transition_info = [
+i(16620,0,'LMT'),
+i(18000,0,'TAST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(25200,3600,'TASST'),
+i(21600,0,'TAST'),
+i(21600,0,'TASST'),
+i(21600,0,'UZST'),
+i(18000,0,'UZT'),
+i(18000,0,'UZT'),
+        ]
+
+Tashkent = Tashkent()
+
diff --git a/lib/pytz/zoneinfo/Asia/Tbilisi.py b/lib/pytz/zoneinfo/Asia/Tbilisi.py
new file mode 100755
index 0000000..739a751
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Tbilisi.py
@@ -0,0 +1,126 @@
+'''tzinfo timezone information for Asia/Tbilisi.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tbilisi(DstTzInfo):
+    '''Asia/Tbilisi timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Tbilisi'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,21,0,44),
+d(1957,2,28,21,0,0),
+d(1981,3,31,20,0,0),
+d(1981,9,30,19,0,0),
+d(1982,3,31,20,0,0),
+d(1982,9,30,19,0,0),
+d(1983,3,31,20,0,0),
+d(1983,9,30,19,0,0),
+d(1984,3,31,20,0,0),
+d(1984,9,29,22,0,0),
+d(1985,3,30,22,0,0),
+d(1985,9,28,22,0,0),
+d(1986,3,29,22,0,0),
+d(1986,9,27,22,0,0),
+d(1987,3,28,22,0,0),
+d(1987,9,26,22,0,0),
+d(1988,3,26,22,0,0),
+d(1988,9,24,22,0,0),
+d(1989,3,25,22,0,0),
+d(1989,9,23,22,0,0),
+d(1990,3,24,22,0,0),
+d(1990,9,29,22,0,0),
+d(1991,3,30,22,0,0),
+d(1991,4,8,20,0,0),
+d(1991,9,28,23,0,0),
+d(1991,12,31,21,0,0),
+d(1992,3,28,21,0,0),
+d(1992,9,26,20,0,0),
+d(1993,3,27,21,0,0),
+d(1993,9,25,20,0,0),
+d(1994,3,26,21,0,0),
+d(1994,9,24,20,0,0),
+d(1995,3,25,20,0,0),
+d(1995,9,23,19,0,0),
+d(1996,3,30,20,0,0),
+d(1997,3,29,19,0,0),
+d(1997,10,25,19,0,0),
+d(1998,3,28,20,0,0),
+d(1998,10,24,19,0,0),
+d(1999,3,27,20,0,0),
+d(1999,10,30,19,0,0),
+d(2000,3,25,20,0,0),
+d(2000,10,28,19,0,0),
+d(2001,3,24,20,0,0),
+d(2001,10,27,19,0,0),
+d(2002,3,30,20,0,0),
+d(2002,10,26,19,0,0),
+d(2003,3,29,20,0,0),
+d(2003,10,25,19,0,0),
+d(2004,3,27,20,0,0),
+d(2004,6,26,19,0,0),
+d(2004,10,30,23,0,0),
+d(2005,3,26,23,0,0),
+        ]
+
+    _transition_info = [
+i(10740,0,'TBMT'),
+i(10800,0,'TBIT'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(18000,3600,'TBIST'),
+i(14400,0,'TBIT'),
+i(14400,0,'TBIST'),
+i(14400,0,'GEST'),
+i(10800,0,'GET'),
+i(10800,0,'GET'),
+i(14400,3600,'GEST'),
+i(10800,0,'GET'),
+i(14400,3600,'GEST'),
+i(10800,0,'GET'),
+i(14400,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(18000,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(14400,0,'GET'),
+i(18000,3600,'GEST'),
+i(14400,0,'GEST'),
+i(10800,0,'GET'),
+i(14400,0,'GET'),
+        ]
+
+Tbilisi = Tbilisi()
+
diff --git a/lib/pytz/zoneinfo/Asia/Tehran.py b/lib/pytz/zoneinfo/Asia/Tehran.py
new file mode 100755
index 0000000..4da64ae
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Tehran.py
@@ -0,0 +1,100 @@
+'''tzinfo timezone information for Asia/Tehran.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tehran(DstTzInfo):
+    '''Asia/Tehran timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Tehran'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1915,12,31,20,34,16),
+d(1945,12,31,20,34,16),
+d(1977,10,31,20,30,0),
+d(1978,3,20,20,0,0),
+d(1978,10,20,19,0,0),
+d(1978,12,31,20,0,0),
+d(1979,3,20,20,30,0),
+d(1979,9,18,19,30,0),
+d(1980,3,20,20,30,0),
+d(1980,9,22,19,30,0),
+d(1991,5,2,20,30,0),
+d(1991,9,21,19,30,0),
+d(1992,3,21,20,30,0),
+d(1992,9,21,19,30,0),
+d(1993,3,21,20,30,0),
+d(1993,9,21,19,30,0),
+d(1994,3,21,20,30,0),
+d(1994,9,21,19,30,0),
+d(1995,3,21,20,30,0),
+d(1995,9,21,19,30,0),
+d(1996,3,20,20,30,0),
+d(1996,9,20,19,30,0),
+d(1997,3,21,20,30,0),
+d(1997,9,21,19,30,0),
+d(1998,3,21,20,30,0),
+d(1998,9,21,19,30,0),
+d(1999,3,21,20,30,0),
+d(1999,9,21,19,30,0),
+d(2000,3,20,20,30,0),
+d(2000,9,20,19,30,0),
+d(2001,3,21,20,30,0),
+d(2001,9,21,19,30,0),
+d(2002,3,21,20,30,0),
+d(2002,9,21,19,30,0),
+d(2003,3,21,20,30,0),
+d(2003,9,21,19,30,0),
+d(2004,3,20,20,30,0),
+d(2004,9,20,19,30,0),
+d(2005,3,21,20,30,0),
+d(2005,9,21,19,30,0),
+        ]
+
+    _transition_info = [
+i(12360,0,'LMT'),
+i(12360,0,'TMT'),
+i(12600,0,'IRST'),
+i(14400,0,'IRST'),
+i(18000,3600,'IRDT'),
+i(14400,0,'IRST'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+        ]
+
+Tehran = Tehran()
+
diff --git a/lib/pytz/zoneinfo/Asia/Tel_Aviv.py b/lib/pytz/zoneinfo/Asia/Tel_Aviv.py
new file mode 100755
index 0000000..c02fb2d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Tel_Aviv.py
@@ -0,0 +1,304 @@
+'''tzinfo timezone information for Asia/Tel_Aviv.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tel_Aviv(DstTzInfo):
+    '''Asia/Tel_Aviv timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Tel_Aviv'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,12,31,21,39,20),
+d(1940,5,31,22,0,0),
+d(1942,10,31,21,0,0),
+d(1943,4,1,0,0,0),
+d(1943,10,31,21,0,0),
+d(1944,3,31,22,0,0),
+d(1944,10,31,21,0,0),
+d(1945,4,15,22,0,0),
+d(1945,10,31,23,0,0),
+d(1946,4,16,0,0,0),
+d(1946,10,31,21,0,0),
+d(1948,5,22,22,0,0),
+d(1948,8,31,20,0,0),
+d(1948,10,31,23,0,0),
+d(1949,4,30,22,0,0),
+d(1949,10,31,23,0,0),
+d(1950,4,15,22,0,0),
+d(1950,9,15,0,0,0),
+d(1951,3,31,22,0,0),
+d(1951,11,11,0,0,0),
+d(1952,4,20,0,0,0),
+d(1952,10,19,0,0,0),
+d(1953,4,12,0,0,0),
+d(1953,9,13,0,0,0),
+d(1954,6,12,22,0,0),
+d(1954,9,11,21,0,0),
+d(1955,6,11,0,0,0),
+d(1955,9,10,21,0,0),
+d(1956,6,2,22,0,0),
+d(1956,9,30,0,0,0),
+d(1957,4,29,0,0,0),
+d(1957,9,21,21,0,0),
+d(1974,7,6,22,0,0),
+d(1974,10,12,21,0,0),
+d(1975,4,19,22,0,0),
+d(1975,8,30,21,0,0),
+d(1985,4,13,22,0,0),
+d(1985,9,14,21,0,0),
+d(1986,5,17,22,0,0),
+d(1986,9,6,21,0,0),
+d(1987,4,14,22,0,0),
+d(1987,9,12,21,0,0),
+d(1988,4,8,22,0,0),
+d(1988,9,2,21,0,0),
+d(1989,4,29,22,0,0),
+d(1989,9,2,21,0,0),
+d(1990,3,24,22,0,0),
+d(1990,8,25,21,0,0),
+d(1991,3,23,22,0,0),
+d(1991,8,31,21,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,5,21,0,0),
+d(1993,4,1,22,0,0),
+d(1993,9,4,21,0,0),
+d(1994,3,31,22,0,0),
+d(1994,8,27,21,0,0),
+d(1995,3,30,22,0,0),
+d(1995,9,2,21,0,0),
+d(1996,3,14,22,0,0),
+d(1996,9,15,21,0,0),
+d(1997,3,20,22,0,0),
+d(1997,9,13,21,0,0),
+d(1998,3,19,22,0,0),
+d(1998,9,5,21,0,0),
+d(1999,4,2,0,0,0),
+d(1999,9,2,23,0,0),
+d(2000,4,14,0,0,0),
+d(2000,10,5,22,0,0),
+d(2001,4,8,23,0,0),
+d(2001,9,23,22,0,0),
+d(2002,3,28,23,0,0),
+d(2002,10,6,22,0,0),
+d(2003,3,27,23,0,0),
+d(2003,10,2,22,0,0),
+d(2004,4,6,23,0,0),
+d(2004,9,21,22,0,0),
+d(2005,4,1,0,0,0),
+d(2005,10,8,23,0,0),
+d(2006,3,31,0,0,0),
+d(2006,9,30,23,0,0),
+d(2007,3,30,0,0,0),
+d(2007,9,15,23,0,0),
+d(2008,3,28,0,0,0),
+d(2008,10,4,23,0,0),
+d(2009,3,27,0,0,0),
+d(2009,9,26,23,0,0),
+d(2010,3,26,0,0,0),
+d(2010,9,11,23,0,0),
+d(2011,4,1,0,0,0),
+d(2011,10,1,23,0,0),
+d(2012,3,30,0,0,0),
+d(2012,9,22,23,0,0),
+d(2013,3,29,0,0,0),
+d(2013,9,7,23,0,0),
+d(2014,3,28,0,0,0),
+d(2014,9,27,23,0,0),
+d(2015,3,27,0,0,0),
+d(2015,9,19,23,0,0),
+d(2016,4,1,0,0,0),
+d(2016,10,8,23,0,0),
+d(2017,3,31,0,0,0),
+d(2017,9,23,23,0,0),
+d(2018,3,30,0,0,0),
+d(2018,9,15,23,0,0),
+d(2019,3,29,0,0,0),
+d(2019,10,5,23,0,0),
+d(2020,3,27,0,0,0),
+d(2020,9,26,23,0,0),
+d(2021,3,26,0,0,0),
+d(2021,9,11,23,0,0),
+d(2022,4,1,0,0,0),
+d(2022,10,1,23,0,0),
+d(2023,3,31,0,0,0),
+d(2023,9,23,23,0,0),
+d(2024,3,29,0,0,0),
+d(2024,10,5,23,0,0),
+d(2025,3,28,0,0,0),
+d(2025,9,27,23,0,0),
+d(2026,3,27,0,0,0),
+d(2026,9,19,23,0,0),
+d(2027,3,26,0,0,0),
+d(2027,10,9,23,0,0),
+d(2028,3,31,0,0,0),
+d(2028,9,23,23,0,0),
+d(2029,3,30,0,0,0),
+d(2029,9,15,23,0,0),
+d(2030,3,29,0,0,0),
+d(2030,10,5,23,0,0),
+d(2031,3,28,0,0,0),
+d(2031,9,20,23,0,0),
+d(2032,3,26,0,0,0),
+d(2032,9,11,23,0,0),
+d(2033,4,1,0,0,0),
+d(2033,10,1,23,0,0),
+d(2034,3,31,0,0,0),
+d(2034,9,16,23,0,0),
+d(2035,3,30,0,0,0),
+d(2035,10,6,23,0,0),
+d(2036,3,28,0,0,0),
+d(2036,9,27,23,0,0),
+d(2037,3,27,0,0,0),
+d(2037,9,12,23,0,0),
+        ]
+
+    _transition_info = [
+i(8460,0,'JMT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(14400,7200,'IDDT'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+        ]
+
+Tel_Aviv = Tel_Aviv()
+
diff --git a/lib/pytz/zoneinfo/Asia/Thimbu.py b/lib/pytz/zoneinfo/Asia/Thimbu.py
new file mode 100755
index 0000000..adbcb01
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Thimbu.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Asia/Thimbu.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Thimbu(DstTzInfo):
+    '''Asia/Thimbu timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Thimbu'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1947,8,14,18,1,24),
+d(1987,9,30,18,30,0),
+        ]
+
+    _transition_info = [
+i(21540,0,'LMT'),
+i(19800,0,'IST'),
+i(21600,0,'BTT'),
+        ]
+
+Thimbu = Thimbu()
+
diff --git a/lib/pytz/zoneinfo/Asia/Thimphu.py b/lib/pytz/zoneinfo/Asia/Thimphu.py
new file mode 100755
index 0000000..95da5a4
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Thimphu.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Asia/Thimphu.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Thimphu(DstTzInfo):
+    '''Asia/Thimphu timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Thimphu'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1947,8,14,18,1,24),
+d(1987,9,30,18,30,0),
+        ]
+
+    _transition_info = [
+i(21540,0,'LMT'),
+i(19800,0,'IST'),
+i(21600,0,'BTT'),
+        ]
+
+Thimphu = Thimphu()
+
diff --git a/lib/pytz/zoneinfo/Asia/Tokyo.py b/lib/pytz/zoneinfo/Asia/Tokyo.py
new file mode 100755
index 0000000..887d130
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Tokyo.py
@@ -0,0 +1,38 @@
+'''tzinfo timezone information for Asia/Tokyo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tokyo(DstTzInfo):
+    '''Asia/Tokyo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Tokyo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1937,12,31,15,0,0),
+d(1948,5,1,17,0,0),
+d(1948,9,10,16,0,0),
+d(1949,4,2,17,0,0),
+d(1949,9,9,16,0,0),
+d(1950,5,6,17,0,0),
+d(1950,9,8,16,0,0),
+d(1951,5,5,17,0,0),
+d(1951,9,7,16,0,0),
+        ]
+
+    _transition_info = [
+i(32400,0,'CJT'),
+i(32400,0,'JST'),
+i(36000,3600,'JDT'),
+i(32400,0,'JST'),
+i(36000,3600,'JDT'),
+i(32400,0,'JST'),
+i(36000,3600,'JDT'),
+i(32400,0,'JST'),
+i(36000,3600,'JDT'),
+i(32400,0,'JST'),
+        ]
+
+Tokyo = Tokyo()
+
diff --git a/lib/pytz/zoneinfo/Asia/Ujung_Pandang.py b/lib/pytz/zoneinfo/Asia/Ujung_Pandang.py
new file mode 100755
index 0000000..d4b8ba2
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Ujung_Pandang.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Asia/Ujung_Pandang.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ujung_Pandang(DstTzInfo):
+    '''Asia/Ujung_Pandang timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Ujung_Pandang'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,16,2,24),
+d(1932,10,31,16,2,24),
+d(1942,2,8,16,0,0),
+d(1945,7,31,15,0,0),
+        ]
+
+    _transition_info = [
+i(28680,0,'LMT'),
+i(28680,0,'MMT'),
+i(28800,0,'CIT'),
+i(32400,0,'JST'),
+i(28800,0,'CIT'),
+        ]
+
+Ujung_Pandang = Ujung_Pandang()
+
diff --git a/lib/pytz/zoneinfo/Asia/Ulaanbaatar.py b/lib/pytz/zoneinfo/Asia/Ulaanbaatar.py
new file mode 100755
index 0000000..44837d8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Ulaanbaatar.py
@@ -0,0 +1,236 @@
+'''tzinfo timezone information for Asia/Ulaanbaatar.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ulaanbaatar(DstTzInfo):
+    '''Asia/Ulaanbaatar timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Ulaanbaatar'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,7,31,16,52,28),
+d(1977,12,31,17,0,0),
+d(1983,3,31,16,0,0),
+d(1983,9,30,15,0,0),
+d(1984,3,31,16,0,0),
+d(1984,9,29,15,0,0),
+d(1985,3,30,16,0,0),
+d(1985,9,28,15,0,0),
+d(1986,3,29,16,0,0),
+d(1986,9,27,15,0,0),
+d(1987,3,28,16,0,0),
+d(1987,9,26,15,0,0),
+d(1988,3,26,16,0,0),
+d(1988,9,24,15,0,0),
+d(1989,3,25,16,0,0),
+d(1989,9,23,15,0,0),
+d(1990,3,24,16,0,0),
+d(1990,9,29,15,0,0),
+d(1991,3,30,16,0,0),
+d(1991,9,28,15,0,0),
+d(1992,3,28,16,0,0),
+d(1992,9,26,15,0,0),
+d(1993,3,27,16,0,0),
+d(1993,9,25,15,0,0),
+d(1994,3,26,16,0,0),
+d(1994,9,24,15,0,0),
+d(1995,3,25,16,0,0),
+d(1995,9,23,15,0,0),
+d(1996,3,30,16,0,0),
+d(1996,9,28,15,0,0),
+d(1997,3,29,16,0,0),
+d(1997,9,27,15,0,0),
+d(1998,3,28,16,0,0),
+d(1998,9,26,15,0,0),
+d(2001,4,27,18,0,0),
+d(2001,9,28,17,0,0),
+d(2002,3,29,18,0,0),
+d(2002,9,27,17,0,0),
+d(2003,3,28,18,0,0),
+d(2003,9,26,17,0,0),
+d(2004,3,26,18,0,0),
+d(2004,9,24,17,0,0),
+d(2005,3,25,18,0,0),
+d(2005,9,23,17,0,0),
+d(2006,3,24,18,0,0),
+d(2006,9,29,17,0,0),
+d(2007,3,30,18,0,0),
+d(2007,9,28,17,0,0),
+d(2008,3,28,18,0,0),
+d(2008,9,26,17,0,0),
+d(2009,3,27,18,0,0),
+d(2009,9,25,17,0,0),
+d(2010,3,26,18,0,0),
+d(2010,9,24,17,0,0),
+d(2011,3,25,18,0,0),
+d(2011,9,23,17,0,0),
+d(2012,3,30,18,0,0),
+d(2012,9,28,17,0,0),
+d(2013,3,29,18,0,0),
+d(2013,9,27,17,0,0),
+d(2014,3,28,18,0,0),
+d(2014,9,26,17,0,0),
+d(2015,3,27,18,0,0),
+d(2015,9,25,17,0,0),
+d(2016,3,25,18,0,0),
+d(2016,9,23,17,0,0),
+d(2017,3,24,18,0,0),
+d(2017,9,29,17,0,0),
+d(2018,3,30,18,0,0),
+d(2018,9,28,17,0,0),
+d(2019,3,29,18,0,0),
+d(2019,9,27,17,0,0),
+d(2020,3,27,18,0,0),
+d(2020,9,25,17,0,0),
+d(2021,3,26,18,0,0),
+d(2021,9,24,17,0,0),
+d(2022,3,25,18,0,0),
+d(2022,9,23,17,0,0),
+d(2023,3,24,18,0,0),
+d(2023,9,29,17,0,0),
+d(2024,3,29,18,0,0),
+d(2024,9,27,17,0,0),
+d(2025,3,28,18,0,0),
+d(2025,9,26,17,0,0),
+d(2026,3,27,18,0,0),
+d(2026,9,25,17,0,0),
+d(2027,3,26,18,0,0),
+d(2027,9,24,17,0,0),
+d(2028,3,24,18,0,0),
+d(2028,9,29,17,0,0),
+d(2029,3,30,18,0,0),
+d(2029,9,28,17,0,0),
+d(2030,3,29,18,0,0),
+d(2030,9,27,17,0,0),
+d(2031,3,28,18,0,0),
+d(2031,9,26,17,0,0),
+d(2032,3,26,18,0,0),
+d(2032,9,24,17,0,0),
+d(2033,3,25,18,0,0),
+d(2033,9,23,17,0,0),
+d(2034,3,24,18,0,0),
+d(2034,9,29,17,0,0),
+d(2035,3,30,18,0,0),
+d(2035,9,28,17,0,0),
+d(2036,3,28,18,0,0),
+d(2036,9,26,17,0,0),
+d(2037,3,27,18,0,0),
+d(2037,9,25,17,0,0),
+        ]
+
+    _transition_info = [
+i(25680,0,'LMT'),
+i(25200,0,'ULAT'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+        ]
+
+Ulaanbaatar = Ulaanbaatar()
+
diff --git a/lib/pytz/zoneinfo/Asia/Ulan_Bator.py b/lib/pytz/zoneinfo/Asia/Ulan_Bator.py
new file mode 100755
index 0000000..9770b55
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Ulan_Bator.py
@@ -0,0 +1,236 @@
+'''tzinfo timezone information for Asia/Ulan_Bator.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ulan_Bator(DstTzInfo):
+    '''Asia/Ulan_Bator timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Ulan_Bator'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,7,31,16,52,28),
+d(1977,12,31,17,0,0),
+d(1983,3,31,16,0,0),
+d(1983,9,30,15,0,0),
+d(1984,3,31,16,0,0),
+d(1984,9,29,15,0,0),
+d(1985,3,30,16,0,0),
+d(1985,9,28,15,0,0),
+d(1986,3,29,16,0,0),
+d(1986,9,27,15,0,0),
+d(1987,3,28,16,0,0),
+d(1987,9,26,15,0,0),
+d(1988,3,26,16,0,0),
+d(1988,9,24,15,0,0),
+d(1989,3,25,16,0,0),
+d(1989,9,23,15,0,0),
+d(1990,3,24,16,0,0),
+d(1990,9,29,15,0,0),
+d(1991,3,30,16,0,0),
+d(1991,9,28,15,0,0),
+d(1992,3,28,16,0,0),
+d(1992,9,26,15,0,0),
+d(1993,3,27,16,0,0),
+d(1993,9,25,15,0,0),
+d(1994,3,26,16,0,0),
+d(1994,9,24,15,0,0),
+d(1995,3,25,16,0,0),
+d(1995,9,23,15,0,0),
+d(1996,3,30,16,0,0),
+d(1996,9,28,15,0,0),
+d(1997,3,29,16,0,0),
+d(1997,9,27,15,0,0),
+d(1998,3,28,16,0,0),
+d(1998,9,26,15,0,0),
+d(2001,4,27,18,0,0),
+d(2001,9,28,17,0,0),
+d(2002,3,29,18,0,0),
+d(2002,9,27,17,0,0),
+d(2003,3,28,18,0,0),
+d(2003,9,26,17,0,0),
+d(2004,3,26,18,0,0),
+d(2004,9,24,17,0,0),
+d(2005,3,25,18,0,0),
+d(2005,9,23,17,0,0),
+d(2006,3,24,18,0,0),
+d(2006,9,29,17,0,0),
+d(2007,3,30,18,0,0),
+d(2007,9,28,17,0,0),
+d(2008,3,28,18,0,0),
+d(2008,9,26,17,0,0),
+d(2009,3,27,18,0,0),
+d(2009,9,25,17,0,0),
+d(2010,3,26,18,0,0),
+d(2010,9,24,17,0,0),
+d(2011,3,25,18,0,0),
+d(2011,9,23,17,0,0),
+d(2012,3,30,18,0,0),
+d(2012,9,28,17,0,0),
+d(2013,3,29,18,0,0),
+d(2013,9,27,17,0,0),
+d(2014,3,28,18,0,0),
+d(2014,9,26,17,0,0),
+d(2015,3,27,18,0,0),
+d(2015,9,25,17,0,0),
+d(2016,3,25,18,0,0),
+d(2016,9,23,17,0,0),
+d(2017,3,24,18,0,0),
+d(2017,9,29,17,0,0),
+d(2018,3,30,18,0,0),
+d(2018,9,28,17,0,0),
+d(2019,3,29,18,0,0),
+d(2019,9,27,17,0,0),
+d(2020,3,27,18,0,0),
+d(2020,9,25,17,0,0),
+d(2021,3,26,18,0,0),
+d(2021,9,24,17,0,0),
+d(2022,3,25,18,0,0),
+d(2022,9,23,17,0,0),
+d(2023,3,24,18,0,0),
+d(2023,9,29,17,0,0),
+d(2024,3,29,18,0,0),
+d(2024,9,27,17,0,0),
+d(2025,3,28,18,0,0),
+d(2025,9,26,17,0,0),
+d(2026,3,27,18,0,0),
+d(2026,9,25,17,0,0),
+d(2027,3,26,18,0,0),
+d(2027,9,24,17,0,0),
+d(2028,3,24,18,0,0),
+d(2028,9,29,17,0,0),
+d(2029,3,30,18,0,0),
+d(2029,9,28,17,0,0),
+d(2030,3,29,18,0,0),
+d(2030,9,27,17,0,0),
+d(2031,3,28,18,0,0),
+d(2031,9,26,17,0,0),
+d(2032,3,26,18,0,0),
+d(2032,9,24,17,0,0),
+d(2033,3,25,18,0,0),
+d(2033,9,23,17,0,0),
+d(2034,3,24,18,0,0),
+d(2034,9,29,17,0,0),
+d(2035,3,30,18,0,0),
+d(2035,9,28,17,0,0),
+d(2036,3,28,18,0,0),
+d(2036,9,26,17,0,0),
+d(2037,3,27,18,0,0),
+d(2037,9,25,17,0,0),
+        ]
+
+    _transition_info = [
+i(25680,0,'LMT'),
+i(25200,0,'ULAT'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+i(32400,3600,'ULAST'),
+i(28800,0,'ULAT'),
+        ]
+
+Ulan_Bator = Ulan_Bator()
+
diff --git a/lib/pytz/zoneinfo/Asia/Urumqi.py b/lib/pytz/zoneinfo/Asia/Urumqi.py
new file mode 100755
index 0000000..8d0d686
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Urumqi.py
@@ -0,0 +1,48 @@
+'''tzinfo timezone information for Asia/Urumqi.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Urumqi(DstTzInfo):
+    '''Asia/Urumqi timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Urumqi'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,12,31,18,9,40),
+d(1980,4,30,18,0,0),
+d(1986,5,3,16,0,0),
+d(1986,9,13,15,0,0),
+d(1987,4,11,16,0,0),
+d(1987,9,12,15,0,0),
+d(1988,4,9,16,0,0),
+d(1988,9,10,15,0,0),
+d(1989,4,15,16,0,0),
+d(1989,9,16,15,0,0),
+d(1990,4,14,16,0,0),
+d(1990,9,15,15,0,0),
+d(1991,4,13,16,0,0),
+d(1991,9,14,15,0,0),
+        ]
+
+    _transition_info = [
+i(21000,0,'LMT'),
+i(21600,0,'URUT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+Urumqi = Urumqi()
+
diff --git a/lib/pytz/zoneinfo/Asia/Vientiane.py b/lib/pytz/zoneinfo/Asia/Vientiane.py
new file mode 100755
index 0000000..60f57c6
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Vientiane.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Asia/Vientiane.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vientiane(DstTzInfo):
+    '''Asia/Vientiane timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Vientiane'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,6,8,17,9,36),
+d(1911,3,10,16,54,40),
+d(1912,4,30,17,0,0),
+d(1931,4,30,16,0,0),
+        ]
+
+    _transition_info = [
+i(24600,0,'LMT'),
+i(25560,0,'SMT'),
+i(25200,0,'ICT'),
+i(28800,0,'ICT'),
+i(25200,0,'ICT'),
+        ]
+
+Vientiane = Vientiane()
+
diff --git a/lib/pytz/zoneinfo/Asia/Vladivostok.py b/lib/pytz/zoneinfo/Asia/Vladivostok.py
new file mode 100755
index 0000000..95a112c
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Vladivostok.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Vladivostok.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vladivostok(DstTzInfo):
+    '''Asia/Vladivostok timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Vladivostok'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,11,14,15,12,16),
+d(1930,6,20,15,0,0),
+d(1981,3,31,14,0,0),
+d(1981,9,30,13,0,0),
+d(1982,3,31,14,0,0),
+d(1982,9,30,13,0,0),
+d(1983,3,31,14,0,0),
+d(1983,9,30,13,0,0),
+d(1984,3,31,14,0,0),
+d(1984,9,29,16,0,0),
+d(1985,3,30,16,0,0),
+d(1985,9,28,16,0,0),
+d(1986,3,29,16,0,0),
+d(1986,9,27,16,0,0),
+d(1987,3,28,16,0,0),
+d(1987,9,26,16,0,0),
+d(1988,3,26,16,0,0),
+d(1988,9,24,16,0,0),
+d(1989,3,25,16,0,0),
+d(1989,9,23,16,0,0),
+d(1990,3,24,16,0,0),
+d(1990,9,29,16,0,0),
+d(1991,3,30,16,0,0),
+d(1991,9,28,17,0,0),
+d(1992,1,18,17,0,0),
+d(1992,3,28,13,0,0),
+d(1992,9,26,12,0,0),
+d(1993,3,27,16,0,0),
+d(1993,9,25,16,0,0),
+d(1994,3,26,16,0,0),
+d(1994,9,24,16,0,0),
+d(1995,3,25,16,0,0),
+d(1995,9,23,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,26,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,25,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,24,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,30,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,10,28,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,27,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,26,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,25,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,30,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,29,16,0,0),
+d(2006,3,25,16,0,0),
+d(2006,10,28,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,27,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,25,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,24,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,30,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,29,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,27,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,26,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,25,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,24,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,29,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,10,28,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,27,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,26,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,24,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,30,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,29,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,10,28,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,26,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,25,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,24,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,30,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,10,28,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,27,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,26,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,25,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,30,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,29,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,10,28,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,27,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,25,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,24,16,0,0),
+        ]
+
+    _transition_info = [
+i(31680,0,'LMT'),
+i(32400,0,'VLAT'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(36000,0,'VLASST'),
+i(32400,0,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+i(39600,3600,'VLAST'),
+i(36000,0,'VLAT'),
+        ]
+
+Vladivostok = Vladivostok()
+
diff --git a/lib/pytz/zoneinfo/Asia/Yakutsk.py b/lib/pytz/zoneinfo/Asia/Yakutsk.py
new file mode 100755
index 0000000..5283f1f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Yakutsk.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Yakutsk.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Yakutsk(DstTzInfo):
+    '''Asia/Yakutsk timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Yakutsk'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,14,15,21,20),
+d(1930,6,20,16,0,0),
+d(1981,3,31,15,0,0),
+d(1981,9,30,14,0,0),
+d(1982,3,31,15,0,0),
+d(1982,9,30,14,0,0),
+d(1983,3,31,15,0,0),
+d(1983,9,30,14,0,0),
+d(1984,3,31,15,0,0),
+d(1984,9,29,17,0,0),
+d(1985,3,30,17,0,0),
+d(1985,9,28,17,0,0),
+d(1986,3,29,17,0,0),
+d(1986,9,27,17,0,0),
+d(1987,3,28,17,0,0),
+d(1987,9,26,17,0,0),
+d(1988,3,26,17,0,0),
+d(1988,9,24,17,0,0),
+d(1989,3,25,17,0,0),
+d(1989,9,23,17,0,0),
+d(1990,3,24,17,0,0),
+d(1990,9,29,17,0,0),
+d(1991,3,30,17,0,0),
+d(1991,9,28,18,0,0),
+d(1992,1,18,18,0,0),
+d(1992,3,28,14,0,0),
+d(1992,9,26,13,0,0),
+d(1993,3,27,17,0,0),
+d(1993,9,25,17,0,0),
+d(1994,3,26,17,0,0),
+d(1994,9,24,17,0,0),
+d(1995,3,25,17,0,0),
+d(1995,9,23,17,0,0),
+d(1996,3,30,17,0,0),
+d(1996,10,26,17,0,0),
+d(1997,3,29,17,0,0),
+d(1997,10,25,17,0,0),
+d(1998,3,28,17,0,0),
+d(1998,10,24,17,0,0),
+d(1999,3,27,17,0,0),
+d(1999,10,30,17,0,0),
+d(2000,3,25,17,0,0),
+d(2000,10,28,17,0,0),
+d(2001,3,24,17,0,0),
+d(2001,10,27,17,0,0),
+d(2002,3,30,17,0,0),
+d(2002,10,26,17,0,0),
+d(2003,3,29,17,0,0),
+d(2003,10,25,17,0,0),
+d(2004,3,27,17,0,0),
+d(2004,10,30,17,0,0),
+d(2005,3,26,17,0,0),
+d(2005,10,29,17,0,0),
+d(2006,3,25,17,0,0),
+d(2006,10,28,17,0,0),
+d(2007,3,24,17,0,0),
+d(2007,10,27,17,0,0),
+d(2008,3,29,17,0,0),
+d(2008,10,25,17,0,0),
+d(2009,3,28,17,0,0),
+d(2009,10,24,17,0,0),
+d(2010,3,27,17,0,0),
+d(2010,10,30,17,0,0),
+d(2011,3,26,17,0,0),
+d(2011,10,29,17,0,0),
+d(2012,3,24,17,0,0),
+d(2012,10,27,17,0,0),
+d(2013,3,30,17,0,0),
+d(2013,10,26,17,0,0),
+d(2014,3,29,17,0,0),
+d(2014,10,25,17,0,0),
+d(2015,3,28,17,0,0),
+d(2015,10,24,17,0,0),
+d(2016,3,26,17,0,0),
+d(2016,10,29,17,0,0),
+d(2017,3,25,17,0,0),
+d(2017,10,28,17,0,0),
+d(2018,3,24,17,0,0),
+d(2018,10,27,17,0,0),
+d(2019,3,30,17,0,0),
+d(2019,10,26,17,0,0),
+d(2020,3,28,17,0,0),
+d(2020,10,24,17,0,0),
+d(2021,3,27,17,0,0),
+d(2021,10,30,17,0,0),
+d(2022,3,26,17,0,0),
+d(2022,10,29,17,0,0),
+d(2023,3,25,17,0,0),
+d(2023,10,28,17,0,0),
+d(2024,3,30,17,0,0),
+d(2024,10,26,17,0,0),
+d(2025,3,29,17,0,0),
+d(2025,10,25,17,0,0),
+d(2026,3,28,17,0,0),
+d(2026,10,24,17,0,0),
+d(2027,3,27,17,0,0),
+d(2027,10,30,17,0,0),
+d(2028,3,25,17,0,0),
+d(2028,10,28,17,0,0),
+d(2029,3,24,17,0,0),
+d(2029,10,27,17,0,0),
+d(2030,3,30,17,0,0),
+d(2030,10,26,17,0,0),
+d(2031,3,29,17,0,0),
+d(2031,10,25,17,0,0),
+d(2032,3,27,17,0,0),
+d(2032,10,30,17,0,0),
+d(2033,3,26,17,0,0),
+d(2033,10,29,17,0,0),
+d(2034,3,25,17,0,0),
+d(2034,10,28,17,0,0),
+d(2035,3,24,17,0,0),
+d(2035,10,27,17,0,0),
+d(2036,3,29,17,0,0),
+d(2036,10,25,17,0,0),
+d(2037,3,28,17,0,0),
+d(2037,10,24,17,0,0),
+        ]
+
+    _transition_info = [
+i(31140,0,'LMT'),
+i(28800,0,'YAKT'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(32400,0,'YAKST'),
+i(28800,0,'YAKT'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+i(36000,3600,'YAKST'),
+i(32400,0,'YAKT'),
+        ]
+
+Yakutsk = Yakutsk()
+
diff --git a/lib/pytz/zoneinfo/Asia/Yekaterinburg.py b/lib/pytz/zoneinfo/Asia/Yekaterinburg.py
new file mode 100755
index 0000000..bc01842
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Yekaterinburg.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Asia/Yekaterinburg.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Yekaterinburg(DstTzInfo):
+    '''Asia/Yekaterinburg timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Yekaterinburg'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,7,14,23,57,36),
+d(1930,6,20,20,0,0),
+d(1981,3,31,19,0,0),
+d(1981,9,30,18,0,0),
+d(1982,3,31,19,0,0),
+d(1982,9,30,18,0,0),
+d(1983,3,31,19,0,0),
+d(1983,9,30,18,0,0),
+d(1984,3,31,19,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,21,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,21,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,21,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,21,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,21,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,21,0,0),
+d(1990,9,29,21,0,0),
+d(1991,3,30,21,0,0),
+d(1991,9,28,22,0,0),
+d(1992,1,18,22,0,0),
+d(1992,3,28,18,0,0),
+d(1992,9,26,17,0,0),
+d(1993,3,27,21,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,21,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,21,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,21,0,0),
+d(1996,10,26,21,0,0),
+d(1997,3,29,21,0,0),
+d(1997,10,25,21,0,0),
+d(1998,3,28,21,0,0),
+d(1998,10,24,21,0,0),
+d(1999,3,27,21,0,0),
+d(1999,10,30,21,0,0),
+d(2000,3,25,21,0,0),
+d(2000,10,28,21,0,0),
+d(2001,3,24,21,0,0),
+d(2001,10,27,21,0,0),
+d(2002,3,30,21,0,0),
+d(2002,10,26,21,0,0),
+d(2003,3,29,21,0,0),
+d(2003,10,25,21,0,0),
+d(2004,3,27,21,0,0),
+d(2004,10,30,21,0,0),
+d(2005,3,26,21,0,0),
+d(2005,10,29,21,0,0),
+d(2006,3,25,21,0,0),
+d(2006,10,28,21,0,0),
+d(2007,3,24,21,0,0),
+d(2007,10,27,21,0,0),
+d(2008,3,29,21,0,0),
+d(2008,10,25,21,0,0),
+d(2009,3,28,21,0,0),
+d(2009,10,24,21,0,0),
+d(2010,3,27,21,0,0),
+d(2010,10,30,21,0,0),
+d(2011,3,26,21,0,0),
+d(2011,10,29,21,0,0),
+d(2012,3,24,21,0,0),
+d(2012,10,27,21,0,0),
+d(2013,3,30,21,0,0),
+d(2013,10,26,21,0,0),
+d(2014,3,29,21,0,0),
+d(2014,10,25,21,0,0),
+d(2015,3,28,21,0,0),
+d(2015,10,24,21,0,0),
+d(2016,3,26,21,0,0),
+d(2016,10,29,21,0,0),
+d(2017,3,25,21,0,0),
+d(2017,10,28,21,0,0),
+d(2018,3,24,21,0,0),
+d(2018,10,27,21,0,0),
+d(2019,3,30,21,0,0),
+d(2019,10,26,21,0,0),
+d(2020,3,28,21,0,0),
+d(2020,10,24,21,0,0),
+d(2021,3,27,21,0,0),
+d(2021,10,30,21,0,0),
+d(2022,3,26,21,0,0),
+d(2022,10,29,21,0,0),
+d(2023,3,25,21,0,0),
+d(2023,10,28,21,0,0),
+d(2024,3,30,21,0,0),
+d(2024,10,26,21,0,0),
+d(2025,3,29,21,0,0),
+d(2025,10,25,21,0,0),
+d(2026,3,28,21,0,0),
+d(2026,10,24,21,0,0),
+d(2027,3,27,21,0,0),
+d(2027,10,30,21,0,0),
+d(2028,3,25,21,0,0),
+d(2028,10,28,21,0,0),
+d(2029,3,24,21,0,0),
+d(2029,10,27,21,0,0),
+d(2030,3,30,21,0,0),
+d(2030,10,26,21,0,0),
+d(2031,3,29,21,0,0),
+d(2031,10,25,21,0,0),
+d(2032,3,27,21,0,0),
+d(2032,10,30,21,0,0),
+d(2033,3,26,21,0,0),
+d(2033,10,29,21,0,0),
+d(2034,3,25,21,0,0),
+d(2034,10,28,21,0,0),
+d(2035,3,24,21,0,0),
+d(2035,10,27,21,0,0),
+d(2036,3,29,21,0,0),
+d(2036,10,25,21,0,0),
+d(2037,3,28,21,0,0),
+d(2037,10,24,21,0,0),
+        ]
+
+    _transition_info = [
+i(14520,0,'LMT'),
+i(14400,0,'SVET'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(21600,3600,'SVEST'),
+i(18000,0,'SVET'),
+i(18000,0,'SVEST'),
+i(14400,0,'SVET'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+i(21600,3600,'YEKST'),
+i(18000,0,'YEKT'),
+        ]
+
+Yekaterinburg = Yekaterinburg()
+
diff --git a/lib/pytz/zoneinfo/Asia/Yerevan.py b/lib/pytz/zoneinfo/Asia/Yerevan.py
new file mode 100755
index 0000000..edfd048
--- /dev/null
+++ b/lib/pytz/zoneinfo/Asia/Yerevan.py
@@ -0,0 +1,252 @@
+'''tzinfo timezone information for Asia/Yerevan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Yerevan(DstTzInfo):
+    '''Asia/Yerevan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Asia/Yerevan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,21,2,0),
+d(1957,2,28,21,0,0),
+d(1981,3,31,20,0,0),
+d(1981,9,30,19,0,0),
+d(1982,3,31,20,0,0),
+d(1982,9,30,19,0,0),
+d(1983,3,31,20,0,0),
+d(1983,9,30,19,0,0),
+d(1984,3,31,20,0,0),
+d(1984,9,29,22,0,0),
+d(1985,3,30,22,0,0),
+d(1985,9,28,22,0,0),
+d(1986,3,29,22,0,0),
+d(1986,9,27,22,0,0),
+d(1987,3,28,22,0,0),
+d(1987,9,26,22,0,0),
+d(1988,3,26,22,0,0),
+d(1988,9,24,22,0,0),
+d(1989,3,25,22,0,0),
+d(1989,9,23,22,0,0),
+d(1990,3,24,22,0,0),
+d(1990,9,29,22,0,0),
+d(1991,3,30,22,0,0),
+d(1991,9,22,20,0,0),
+d(1991,9,28,23,0,0),
+d(1992,3,28,20,0,0),
+d(1992,9,26,19,0,0),
+d(1993,3,27,23,0,0),
+d(1993,9,25,23,0,0),
+d(1994,3,26,23,0,0),
+d(1994,9,24,23,0,0),
+d(1995,3,25,23,0,0),
+d(1995,9,23,23,0,0),
+d(1996,12,31,20,0,0),
+d(1997,3,29,22,0,0),
+d(1997,10,25,22,0,0),
+d(1998,3,28,22,0,0),
+d(1998,10,24,22,0,0),
+d(1999,3,27,22,0,0),
+d(1999,10,30,22,0,0),
+d(2000,3,25,22,0,0),
+d(2000,10,28,22,0,0),
+d(2001,3,24,22,0,0),
+d(2001,10,27,22,0,0),
+d(2002,3,30,22,0,0),
+d(2002,10,26,22,0,0),
+d(2003,3,29,22,0,0),
+d(2003,10,25,22,0,0),
+d(2004,3,27,22,0,0),
+d(2004,10,30,22,0,0),
+d(2005,3,26,22,0,0),
+d(2005,10,29,22,0,0),
+d(2006,3,25,22,0,0),
+d(2006,10,28,22,0,0),
+d(2007,3,24,22,0,0),
+d(2007,10,27,22,0,0),
+d(2008,3,29,22,0,0),
+d(2008,10,25,22,0,0),
+d(2009,3,28,22,0,0),
+d(2009,10,24,22,0,0),
+d(2010,3,27,22,0,0),
+d(2010,10,30,22,0,0),
+d(2011,3,26,22,0,0),
+d(2011,10,29,22,0,0),
+d(2012,3,24,22,0,0),
+d(2012,10,27,22,0,0),
+d(2013,3,30,22,0,0),
+d(2013,10,26,22,0,0),
+d(2014,3,29,22,0,0),
+d(2014,10,25,22,0,0),
+d(2015,3,28,22,0,0),
+d(2015,10,24,22,0,0),
+d(2016,3,26,22,0,0),
+d(2016,10,29,22,0,0),
+d(2017,3,25,22,0,0),
+d(2017,10,28,22,0,0),
+d(2018,3,24,22,0,0),
+d(2018,10,27,22,0,0),
+d(2019,3,30,22,0,0),
+d(2019,10,26,22,0,0),
+d(2020,3,28,22,0,0),
+d(2020,10,24,22,0,0),
+d(2021,3,27,22,0,0),
+d(2021,10,30,22,0,0),
+d(2022,3,26,22,0,0),
+d(2022,10,29,22,0,0),
+d(2023,3,25,22,0,0),
+d(2023,10,28,22,0,0),
+d(2024,3,30,22,0,0),
+d(2024,10,26,22,0,0),
+d(2025,3,29,22,0,0),
+d(2025,10,25,22,0,0),
+d(2026,3,28,22,0,0),
+d(2026,10,24,22,0,0),
+d(2027,3,27,22,0,0),
+d(2027,10,30,22,0,0),
+d(2028,3,25,22,0,0),
+d(2028,10,28,22,0,0),
+d(2029,3,24,22,0,0),
+d(2029,10,27,22,0,0),
+d(2030,3,30,22,0,0),
+d(2030,10,26,22,0,0),
+d(2031,3,29,22,0,0),
+d(2031,10,25,22,0,0),
+d(2032,3,27,22,0,0),
+d(2032,10,30,22,0,0),
+d(2033,3,26,22,0,0),
+d(2033,10,29,22,0,0),
+d(2034,3,25,22,0,0),
+d(2034,10,28,22,0,0),
+d(2035,3,24,22,0,0),
+d(2035,10,27,22,0,0),
+d(2036,3,29,22,0,0),
+d(2036,10,25,22,0,0),
+d(2037,3,28,22,0,0),
+d(2037,10,24,22,0,0),
+        ]
+
+    _transition_info = [
+i(10680,0,'LMT'),
+i(10800,0,'YERT'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(18000,3600,'YERST'),
+i(14400,0,'YERT'),
+i(14400,0,'YERST'),
+i(14400,0,'AMST'),
+i(10800,0,'AMT'),
+i(14400,3600,'AMST'),
+i(10800,0,'AMT'),
+i(14400,3600,'AMST'),
+i(10800,0,'AMT'),
+i(14400,3600,'AMST'),
+i(10800,0,'AMT'),
+i(14400,3600,'AMST'),
+i(14400,0,'AMT'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+i(18000,3600,'AMST'),
+i(14400,0,'AMT'),
+        ]
+
+Yerevan = Yerevan()
+
diff --git a/lib/pytz/zoneinfo/Asia/__init__.py b/lib/pytz/zoneinfo/Asia/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Atlantic/Azores.py b/lib/pytz/zoneinfo/Atlantic/Azores.py
new file mode 100755
index 0000000..b2864aa
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Azores.py
@@ -0,0 +1,460 @@
+'''tzinfo timezone information for Atlantic/Azores.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Azores(DstTzInfo):
+    '''Atlantic/Azores timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Azores'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,5,24,1,54,32),
+d(1916,6,18,1,0,0),
+d(1916,11,1,2,0,0),
+d(1917,3,1,1,0,0),
+d(1917,10,15,1,0,0),
+d(1918,3,2,1,0,0),
+d(1918,10,15,1,0,0),
+d(1919,3,1,1,0,0),
+d(1919,10,15,1,0,0),
+d(1920,3,1,1,0,0),
+d(1920,10,15,1,0,0),
+d(1921,3,1,1,0,0),
+d(1921,10,15,1,0,0),
+d(1924,4,17,1,0,0),
+d(1924,10,15,1,0,0),
+d(1926,4,18,1,0,0),
+d(1926,10,3,1,0,0),
+d(1927,4,10,1,0,0),
+d(1927,10,2,1,0,0),
+d(1928,4,15,1,0,0),
+d(1928,10,7,1,0,0),
+d(1929,4,21,1,0,0),
+d(1929,10,6,1,0,0),
+d(1931,4,19,1,0,0),
+d(1931,10,4,1,0,0),
+d(1932,4,3,1,0,0),
+d(1932,10,2,1,0,0),
+d(1934,4,8,1,0,0),
+d(1934,10,7,1,0,0),
+d(1935,3,31,1,0,0),
+d(1935,10,6,1,0,0),
+d(1936,4,19,1,0,0),
+d(1936,10,4,1,0,0),
+d(1937,4,4,1,0,0),
+d(1937,10,3,1,0,0),
+d(1938,3,27,1,0,0),
+d(1938,10,2,1,0,0),
+d(1939,4,16,1,0,0),
+d(1939,11,19,1,0,0),
+d(1940,2,25,1,0,0),
+d(1940,10,6,1,0,0),
+d(1941,4,6,1,0,0),
+d(1941,10,6,1,0,0),
+d(1942,3,15,1,0,0),
+d(1942,4,26,0,0,0),
+d(1942,8,16,0,0,0),
+d(1942,10,25,1,0,0),
+d(1943,3,14,1,0,0),
+d(1943,4,18,0,0,0),
+d(1943,8,29,0,0,0),
+d(1943,10,31,1,0,0),
+d(1944,3,12,1,0,0),
+d(1944,4,23,0,0,0),
+d(1944,8,27,0,0,0),
+d(1944,10,29,1,0,0),
+d(1945,3,11,1,0,0),
+d(1945,4,22,0,0,0),
+d(1945,8,26,0,0,0),
+d(1945,10,28,1,0,0),
+d(1946,4,7,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,4,6,4,0,0),
+d(1947,10,5,4,0,0),
+d(1948,4,4,4,0,0),
+d(1948,10,3,4,0,0),
+d(1949,4,3,4,0,0),
+d(1949,10,2,4,0,0),
+d(1951,4,1,4,0,0),
+d(1951,10,7,4,0,0),
+d(1952,4,6,4,0,0),
+d(1952,10,5,4,0,0),
+d(1953,4,5,4,0,0),
+d(1953,10,4,4,0,0),
+d(1954,4,4,4,0,0),
+d(1954,10,3,4,0,0),
+d(1955,4,3,4,0,0),
+d(1955,10,2,4,0,0),
+d(1956,4,1,4,0,0),
+d(1956,10,7,4,0,0),
+d(1957,4,7,4,0,0),
+d(1957,10,6,4,0,0),
+d(1958,4,6,4,0,0),
+d(1958,10,5,4,0,0),
+d(1959,4,5,4,0,0),
+d(1959,10,4,4,0,0),
+d(1960,4,3,4,0,0),
+d(1960,10,2,4,0,0),
+d(1961,4,2,4,0,0),
+d(1961,10,1,4,0,0),
+d(1962,4,1,4,0,0),
+d(1962,10,7,4,0,0),
+d(1963,4,7,4,0,0),
+d(1963,10,6,4,0,0),
+d(1964,4,5,4,0,0),
+d(1964,10,4,4,0,0),
+d(1965,4,4,4,0,0),
+d(1965,10,3,4,0,0),
+d(1966,4,3,4,0,0),
+d(1977,3,27,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,2,0,0),
+d(1980,3,30,1,0,0),
+d(1980,9,28,2,0,0),
+d(1981,3,29,2,0,0),
+d(1981,9,27,2,0,0),
+d(1982,3,28,2,0,0),
+d(1982,9,26,2,0,0),
+d(1983,3,27,3,0,0),
+d(1983,9,25,2,0,0),
+d(1984,3,25,2,0,0),
+d(1984,9,30,2,0,0),
+d(1985,3,31,2,0,0),
+d(1985,9,29,2,0,0),
+d(1986,3,30,2,0,0),
+d(1986,9,28,2,0,0),
+d(1987,3,29,2,0,0),
+d(1987,9,27,2,0,0),
+d(1988,3,27,2,0,0),
+d(1988,9,25,2,0,0),
+d(1989,3,26,2,0,0),
+d(1989,9,24,2,0,0),
+d(1990,3,25,2,0,0),
+d(1990,9,30,2,0,0),
+d(1991,3,31,2,0,0),
+d(1991,9,29,2,0,0),
+d(1992,3,29,2,0,0),
+d(1992,9,27,2,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-6900,0,'HMT'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(0,7200,'AZOMT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(0,7200,'AZOMT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(0,7200,'AZOMT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(0,7200,'AZOMT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,3600,'AZOST'),
+i(-7200,0,'AZOT'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(0,0,'WET'),
+i(0,0,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+i(0,3600,'AZOST'),
+i(-3600,0,'AZOT'),
+        ]
+
+Azores = Azores()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/Bermuda.py b/lib/pytz/zoneinfo/Atlantic/Bermuda.py
new file mode 100755
index 0000000..7ef08fd
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Bermuda.py
@@ -0,0 +1,278 @@
+'''tzinfo timezone information for Atlantic/Bermuda.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bermuda(DstTzInfo):
+    '''Atlantic/Bermuda timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Bermuda'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1930,1,1,6,19,4),
+d(1974,4,28,6,0,0),
+d(1974,10,27,5,0,0),
+d(1975,4,27,6,0,0),
+d(1975,10,26,5,0,0),
+d(1976,4,25,6,0,0),
+d(1976,10,31,5,0,0),
+d(1977,4,24,6,0,0),
+d(1977,10,30,5,0,0),
+d(1978,4,30,6,0,0),
+d(1978,10,29,5,0,0),
+d(1979,4,29,6,0,0),
+d(1979,10,28,5,0,0),
+d(1980,4,27,6,0,0),
+d(1980,10,26,5,0,0),
+d(1981,4,26,6,0,0),
+d(1981,10,25,5,0,0),
+d(1982,4,25,6,0,0),
+d(1982,10,31,5,0,0),
+d(1983,4,24,6,0,0),
+d(1983,10,30,5,0,0),
+d(1984,4,29,6,0,0),
+d(1984,10,28,5,0,0),
+d(1985,4,28,6,0,0),
+d(1985,10,27,5,0,0),
+d(1986,4,27,6,0,0),
+d(1986,10,26,5,0,0),
+d(1987,4,5,6,0,0),
+d(1987,10,25,5,0,0),
+d(1988,4,3,6,0,0),
+d(1988,10,30,5,0,0),
+d(1989,4,2,6,0,0),
+d(1989,10,29,5,0,0),
+d(1990,4,1,6,0,0),
+d(1990,10,28,5,0,0),
+d(1991,4,7,6,0,0),
+d(1991,10,27,5,0,0),
+d(1992,4,5,6,0,0),
+d(1992,10,25,5,0,0),
+d(1993,4,4,6,0,0),
+d(1993,10,31,5,0,0),
+d(1994,4,3,6,0,0),
+d(1994,10,30,5,0,0),
+d(1995,4,2,6,0,0),
+d(1995,10,29,5,0,0),
+d(1996,4,7,6,0,0),
+d(1996,10,27,5,0,0),
+d(1997,4,6,6,0,0),
+d(1997,10,26,5,0,0),
+d(1998,4,5,6,0,0),
+d(1998,10,25,5,0,0),
+d(1999,4,4,6,0,0),
+d(1999,10,31,5,0,0),
+d(2000,4,2,6,0,0),
+d(2000,10,29,5,0,0),
+d(2001,4,1,6,0,0),
+d(2001,10,28,5,0,0),
+d(2002,4,7,6,0,0),
+d(2002,10,27,5,0,0),
+d(2003,4,6,6,0,0),
+d(2003,10,26,5,0,0),
+d(2004,4,4,6,0,0),
+d(2004,10,31,5,0,0),
+d(2005,4,3,6,0,0),
+d(2005,10,30,5,0,0),
+d(2006,4,2,6,0,0),
+d(2006,10,29,5,0,0),
+d(2007,3,11,6,0,0),
+d(2007,11,4,5,0,0),
+d(2008,3,9,6,0,0),
+d(2008,11,2,5,0,0),
+d(2009,3,8,6,0,0),
+d(2009,11,1,5,0,0),
+d(2010,3,14,6,0,0),
+d(2010,11,7,5,0,0),
+d(2011,3,13,6,0,0),
+d(2011,11,6,5,0,0),
+d(2012,3,11,6,0,0),
+d(2012,11,4,5,0,0),
+d(2013,3,10,6,0,0),
+d(2013,11,3,5,0,0),
+d(2014,3,9,6,0,0),
+d(2014,11,2,5,0,0),
+d(2015,3,8,6,0,0),
+d(2015,11,1,5,0,0),
+d(2016,3,13,6,0,0),
+d(2016,11,6,5,0,0),
+d(2017,3,12,6,0,0),
+d(2017,11,5,5,0,0),
+d(2018,3,11,6,0,0),
+d(2018,11,4,5,0,0),
+d(2019,3,10,6,0,0),
+d(2019,11,3,5,0,0),
+d(2020,3,8,6,0,0),
+d(2020,11,1,5,0,0),
+d(2021,3,14,6,0,0),
+d(2021,11,7,5,0,0),
+d(2022,3,13,6,0,0),
+d(2022,11,6,5,0,0),
+d(2023,3,12,6,0,0),
+d(2023,11,5,5,0,0),
+d(2024,3,10,6,0,0),
+d(2024,11,3,5,0,0),
+d(2025,3,9,6,0,0),
+d(2025,11,2,5,0,0),
+d(2026,3,8,6,0,0),
+d(2026,11,1,5,0,0),
+d(2027,3,14,6,0,0),
+d(2027,11,7,5,0,0),
+d(2028,3,12,6,0,0),
+d(2028,11,5,5,0,0),
+d(2029,3,11,6,0,0),
+d(2029,11,4,5,0,0),
+d(2030,3,10,6,0,0),
+d(2030,11,3,5,0,0),
+d(2031,3,9,6,0,0),
+d(2031,11,2,5,0,0),
+d(2032,3,14,6,0,0),
+d(2032,11,7,5,0,0),
+d(2033,3,13,6,0,0),
+d(2033,11,6,5,0,0),
+d(2034,3,12,6,0,0),
+d(2034,11,5,5,0,0),
+d(2035,3,11,6,0,0),
+d(2035,11,4,5,0,0),
+d(2036,3,9,6,0,0),
+d(2036,11,2,5,0,0),
+d(2037,3,8,6,0,0),
+d(2037,11,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-15540,0,'LMT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Bermuda = Bermuda()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/Canary.py b/lib/pytz/zoneinfo/Atlantic/Canary.py
new file mode 100755
index 0000000..e605028
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Canary.py
@@ -0,0 +1,256 @@
+'''tzinfo timezone information for Atlantic/Canary.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Canary(DstTzInfo):
+    '''Atlantic/Canary timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Canary'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,3,1,1,1,36),
+d(1946,9,30,2,0,0),
+d(1980,4,6,0,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-3720,0,'LMT'),
+i(-3600,0,'CANT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+        ]
+
+Canary = Canary()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/Cape_Verde.py b/lib/pytz/zoneinfo/Atlantic/Cape_Verde.py
new file mode 100755
index 0000000..8cb51e7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Cape_Verde.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Atlantic/Cape_Verde.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cape_Verde(DstTzInfo):
+    '''Atlantic/Cape_Verde timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Cape_Verde'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1907,1,1,1,34,4),
+d(1942,9,1,2,0,0),
+d(1945,10,15,1,0,0),
+d(1975,11,25,4,0,0),
+        ]
+
+    _transition_info = [
+i(-5640,0,'LMT'),
+i(-7200,0,'CVT'),
+i(-3600,3600,'CVST'),
+i(-7200,0,'CVT'),
+i(-3600,0,'CVT'),
+        ]
+
+Cape_Verde = Cape_Verde()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/Faeroe.py b/lib/pytz/zoneinfo/Atlantic/Faeroe.py
new file mode 100755
index 0000000..4eb16fa
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Faeroe.py
@@ -0,0 +1,250 @@
+'''tzinfo timezone information for Atlantic/Faeroe.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Faeroe(DstTzInfo):
+    '''Atlantic/Faeroe timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Faeroe'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1908,1,11,0,27,4),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-1620,0,'LMT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+        ]
+
+Faeroe = Faeroe()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/Jan_Mayen.py b/lib/pytz/zoneinfo/Atlantic/Jan_Mayen.py
new file mode 100755
index 0000000..6ba6990
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Jan_Mayen.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Atlantic/Jan_Mayen.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jan_Mayen(DstTzInfo):
+    '''Atlantic/Jan_Mayen timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Jan_Mayen'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,22,0,0,0),
+d(1916,9,29,22,0,0),
+d(1940,8,10,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,10,1,1,0,0),
+d(1959,3,15,1,0,0),
+d(1959,9,20,1,0,0),
+d(1960,3,20,1,0,0),
+d(1960,9,18,1,0,0),
+d(1961,3,19,1,0,0),
+d(1961,9,17,1,0,0),
+d(1962,3,18,1,0,0),
+d(1962,9,16,1,0,0),
+d(1963,3,17,1,0,0),
+d(1963,9,15,1,0,0),
+d(1964,3,15,1,0,0),
+d(1964,9,20,1,0,0),
+d(1965,4,25,1,0,0),
+d(1965,9,19,1,0,0),
+d(1979,12,31,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Jan_Mayen = Jan_Mayen()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/Madeira.py b/lib/pytz/zoneinfo/Atlantic/Madeira.py
new file mode 100755
index 0000000..ace6fc0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Madeira.py
@@ -0,0 +1,460 @@
+'''tzinfo timezone information for Atlantic/Madeira.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Madeira(DstTzInfo):
+    '''Atlantic/Madeira timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Madeira'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,5,24,1,7,36),
+d(1916,6,18,0,0,0),
+d(1916,11,1,1,0,0),
+d(1917,3,1,0,0,0),
+d(1917,10,15,0,0,0),
+d(1918,3,2,0,0,0),
+d(1918,10,15,0,0,0),
+d(1919,3,1,0,0,0),
+d(1919,10,15,0,0,0),
+d(1920,3,1,0,0,0),
+d(1920,10,15,0,0,0),
+d(1921,3,1,0,0,0),
+d(1921,10,15,0,0,0),
+d(1924,4,17,0,0,0),
+d(1924,10,15,0,0,0),
+d(1926,4,18,0,0,0),
+d(1926,10,3,0,0,0),
+d(1927,4,10,0,0,0),
+d(1927,10,2,0,0,0),
+d(1928,4,15,0,0,0),
+d(1928,10,7,0,0,0),
+d(1929,4,21,0,0,0),
+d(1929,10,6,0,0,0),
+d(1931,4,19,0,0,0),
+d(1931,10,4,0,0,0),
+d(1932,4,3,0,0,0),
+d(1932,10,2,0,0,0),
+d(1934,4,8,0,0,0),
+d(1934,10,7,0,0,0),
+d(1935,3,31,0,0,0),
+d(1935,10,6,0,0,0),
+d(1936,4,19,0,0,0),
+d(1936,10,4,0,0,0),
+d(1937,4,4,0,0,0),
+d(1937,10,3,0,0,0),
+d(1938,3,27,0,0,0),
+d(1938,10,2,0,0,0),
+d(1939,4,16,0,0,0),
+d(1939,11,19,0,0,0),
+d(1940,2,25,0,0,0),
+d(1940,10,6,0,0,0),
+d(1941,4,6,0,0,0),
+d(1941,10,6,0,0,0),
+d(1942,3,15,0,0,0),
+d(1942,4,25,23,0,0),
+d(1942,8,15,23,0,0),
+d(1942,10,25,0,0,0),
+d(1943,3,14,0,0,0),
+d(1943,4,17,23,0,0),
+d(1943,8,28,23,0,0),
+d(1943,10,31,0,0,0),
+d(1944,3,12,0,0,0),
+d(1944,4,22,23,0,0),
+d(1944,8,26,23,0,0),
+d(1944,10,29,0,0,0),
+d(1945,3,11,0,0,0),
+d(1945,4,21,23,0,0),
+d(1945,8,25,23,0,0),
+d(1945,10,28,0,0,0),
+d(1946,4,7,0,0,0),
+d(1946,10,6,0,0,0),
+d(1947,4,6,3,0,0),
+d(1947,10,5,3,0,0),
+d(1948,4,4,3,0,0),
+d(1948,10,3,3,0,0),
+d(1949,4,3,3,0,0),
+d(1949,10,2,3,0,0),
+d(1951,4,1,3,0,0),
+d(1951,10,7,3,0,0),
+d(1952,4,6,3,0,0),
+d(1952,10,5,3,0,0),
+d(1953,4,5,3,0,0),
+d(1953,10,4,3,0,0),
+d(1954,4,4,3,0,0),
+d(1954,10,3,3,0,0),
+d(1955,4,3,3,0,0),
+d(1955,10,2,3,0,0),
+d(1956,4,1,3,0,0),
+d(1956,10,7,3,0,0),
+d(1957,4,7,3,0,0),
+d(1957,10,6,3,0,0),
+d(1958,4,6,3,0,0),
+d(1958,10,5,3,0,0),
+d(1959,4,5,3,0,0),
+d(1959,10,4,3,0,0),
+d(1960,4,3,3,0,0),
+d(1960,10,2,3,0,0),
+d(1961,4,2,3,0,0),
+d(1961,10,1,3,0,0),
+d(1962,4,1,3,0,0),
+d(1962,10,7,3,0,0),
+d(1963,4,7,3,0,0),
+d(1963,10,6,3,0,0),
+d(1964,4,5,3,0,0),
+d(1964,10,4,3,0,0),
+d(1965,4,4,3,0,0),
+d(1965,10,3,3,0,0),
+d(1966,4,3,3,0,0),
+d(1977,3,27,0,0,0),
+d(1977,9,25,0,0,0),
+d(1978,4,2,0,0,0),
+d(1978,10,1,0,0,0),
+d(1979,4,1,0,0,0),
+d(1979,9,30,1,0,0),
+d(1980,3,30,0,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,2,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-4080,0,'FMT'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(3600,7200,'MADMT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(3600,7200,'MADMT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(3600,7200,'MADMT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(3600,7200,'MADMT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,3600,'MADST'),
+i(-3600,0,'MADT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+        ]
+
+Madeira = Madeira()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/Reykjavik.py b/lib/pytz/zoneinfo/Atlantic/Reykjavik.py
new file mode 100755
index 0000000..0d9922b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Reykjavik.py
@@ -0,0 +1,148 @@
+'''tzinfo timezone information for Atlantic/Reykjavik.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Reykjavik(DstTzInfo):
+    '''Atlantic/Reykjavik timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Reykjavik'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1908,1,1,1,27,48),
+d(1917,2,20,0,0,0),
+d(1917,10,21,1,0,0),
+d(1918,2,20,0,0,0),
+d(1918,11,16,1,0,0),
+d(1939,4,30,0,0,0),
+d(1939,11,29,2,0,0),
+d(1940,2,25,3,0,0),
+d(1940,11,3,2,0,0),
+d(1941,3,2,2,0,0),
+d(1941,11,2,2,0,0),
+d(1942,3,8,2,0,0),
+d(1942,10,25,2,0,0),
+d(1943,3,7,2,0,0),
+d(1943,10,24,2,0,0),
+d(1944,3,5,2,0,0),
+d(1944,10,22,2,0,0),
+d(1945,3,4,2,0,0),
+d(1945,10,28,2,0,0),
+d(1946,3,3,2,0,0),
+d(1946,10,27,2,0,0),
+d(1947,4,6,2,0,0),
+d(1947,10,26,2,0,0),
+d(1948,4,4,2,0,0),
+d(1948,10,24,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,2,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,1,2,0,0),
+d(1951,10,28,2,0,0),
+d(1952,4,6,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,5,2,0,0),
+d(1953,10,25,2,0,0),
+d(1954,4,4,2,0,0),
+d(1954,10,24,2,0,0),
+d(1955,4,3,2,0,0),
+d(1955,10,23,2,0,0),
+d(1956,4,1,2,0,0),
+d(1956,10,28,2,0,0),
+d(1957,4,7,2,0,0),
+d(1957,10,27,2,0,0),
+d(1958,4,6,2,0,0),
+d(1958,10,26,2,0,0),
+d(1959,4,5,2,0,0),
+d(1959,10,25,2,0,0),
+d(1960,4,3,2,0,0),
+d(1960,10,23,2,0,0),
+d(1961,4,2,2,0,0),
+d(1961,10,22,2,0,0),
+d(1962,4,1,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,4,7,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,4,5,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,4,4,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,4,3,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,4,2,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,4,7,2,0,0),
+        ]
+
+    _transition_info = [
+i(-5280,0,'RMT'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,0,'GMT'),
+        ]
+
+Reykjavik = Reykjavik()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/South_Georgia.py b/lib/pytz/zoneinfo/Atlantic/South_Georgia.py
new file mode 100755
index 0000000..73e393c
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/South_Georgia.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Atlantic/South_Georgia.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class South_Georgia(StaticTzInfo):
+    '''Atlantic/South_Georgia timezone definition. See datetime.tzinfo for details'''
+    zone = 'Atlantic/South_Georgia'
+    _utcoffset = timedelta(seconds=-7200)
+    _tzname = 'GST'
+
+South_Georgia = South_Georgia()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/St_Helena.py b/lib/pytz/zoneinfo/Atlantic/St_Helena.py
new file mode 100755
index 0000000..3d37283
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/St_Helena.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Atlantic/St_Helena.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class St_Helena(DstTzInfo):
+    '''Atlantic/St_Helena timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/St_Helena'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1951,1,1,0,22,48),
+        ]
+
+    _transition_info = [
+i(-1380,0,'JMT'),
+i(0,0,'GMT'),
+        ]
+
+St_Helena = St_Helena()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/Stanley.py b/lib/pytz/zoneinfo/Atlantic/Stanley.py
new file mode 100755
index 0000000..3e1ccfc
--- /dev/null
+++ b/lib/pytz/zoneinfo/Atlantic/Stanley.py
@@ -0,0 +1,266 @@
+'''tzinfo timezone information for Atlantic/Stanley.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Stanley(DstTzInfo):
+    '''Atlantic/Stanley timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Atlantic/Stanley'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,3,12,3,51,24),
+d(1937,9,26,4,0,0),
+d(1938,3,20,3,0,0),
+d(1938,9,25,4,0,0),
+d(1939,3,19,3,0,0),
+d(1939,10,1,4,0,0),
+d(1940,3,24,3,0,0),
+d(1940,9,29,4,0,0),
+d(1941,3,23,3,0,0),
+d(1941,9,28,4,0,0),
+d(1942,3,22,3,0,0),
+d(1942,9,27,4,0,0),
+d(1943,1,1,3,0,0),
+d(1983,5,1,4,0,0),
+d(1983,9,25,3,0,0),
+d(1984,4,29,2,0,0),
+d(1984,9,16,3,0,0),
+d(1985,4,28,2,0,0),
+d(1985,9,15,3,0,0),
+d(1986,4,20,3,0,0),
+d(1986,9,14,4,0,0),
+d(1987,4,19,3,0,0),
+d(1987,9,13,4,0,0),
+d(1988,4,17,3,0,0),
+d(1988,9,11,4,0,0),
+d(1989,4,16,3,0,0),
+d(1989,9,10,4,0,0),
+d(1990,4,22,3,0,0),
+d(1990,9,9,4,0,0),
+d(1991,4,21,3,0,0),
+d(1991,9,15,4,0,0),
+d(1992,4,19,3,0,0),
+d(1992,9,13,4,0,0),
+d(1993,4,18,3,0,0),
+d(1993,9,12,4,0,0),
+d(1994,4,17,3,0,0),
+d(1994,9,11,4,0,0),
+d(1995,4,16,3,0,0),
+d(1995,9,10,4,0,0),
+d(1996,4,21,3,0,0),
+d(1996,9,15,4,0,0),
+d(1997,4,20,3,0,0),
+d(1997,9,14,4,0,0),
+d(1998,4,19,3,0,0),
+d(1998,9,13,4,0,0),
+d(1999,4,18,3,0,0),
+d(1999,9,12,4,0,0),
+d(2000,4,16,3,0,0),
+d(2000,9,10,4,0,0),
+d(2001,4,15,5,0,0),
+d(2001,9,2,6,0,0),
+d(2002,4,21,5,0,0),
+d(2002,9,1,6,0,0),
+d(2003,4,20,5,0,0),
+d(2003,9,7,6,0,0),
+d(2004,4,18,5,0,0),
+d(2004,9,5,6,0,0),
+d(2005,4,17,5,0,0),
+d(2005,9,4,6,0,0),
+d(2006,4,16,5,0,0),
+d(2006,9,3,6,0,0),
+d(2007,4,15,5,0,0),
+d(2007,9,2,6,0,0),
+d(2008,4,20,5,0,0),
+d(2008,9,7,6,0,0),
+d(2009,4,19,5,0,0),
+d(2009,9,6,6,0,0),
+d(2010,4,18,5,0,0),
+d(2010,9,5,6,0,0),
+d(2011,4,17,5,0,0),
+d(2011,9,4,6,0,0),
+d(2012,4,15,5,0,0),
+d(2012,9,2,6,0,0),
+d(2013,4,21,5,0,0),
+d(2013,9,1,6,0,0),
+d(2014,4,20,5,0,0),
+d(2014,9,7,6,0,0),
+d(2015,4,19,5,0,0),
+d(2015,9,6,6,0,0),
+d(2016,4,17,5,0,0),
+d(2016,9,4,6,0,0),
+d(2017,4,16,5,0,0),
+d(2017,9,3,6,0,0),
+d(2018,4,15,5,0,0),
+d(2018,9,2,6,0,0),
+d(2019,4,21,5,0,0),
+d(2019,9,1,6,0,0),
+d(2020,4,19,5,0,0),
+d(2020,9,6,6,0,0),
+d(2021,4,18,5,0,0),
+d(2021,9,5,6,0,0),
+d(2022,4,17,5,0,0),
+d(2022,9,4,6,0,0),
+d(2023,4,16,5,0,0),
+d(2023,9,3,6,0,0),
+d(2024,4,21,5,0,0),
+d(2024,9,1,6,0,0),
+d(2025,4,20,5,0,0),
+d(2025,9,7,6,0,0),
+d(2026,4,19,5,0,0),
+d(2026,9,6,6,0,0),
+d(2027,4,18,5,0,0),
+d(2027,9,5,6,0,0),
+d(2028,4,16,5,0,0),
+d(2028,9,3,6,0,0),
+d(2029,4,15,5,0,0),
+d(2029,9,2,6,0,0),
+d(2030,4,21,5,0,0),
+d(2030,9,1,6,0,0),
+d(2031,4,20,5,0,0),
+d(2031,9,7,6,0,0),
+d(2032,4,18,5,0,0),
+d(2032,9,5,6,0,0),
+d(2033,4,17,5,0,0),
+d(2033,9,4,6,0,0),
+d(2034,4,16,5,0,0),
+d(2034,9,3,6,0,0),
+d(2035,4,15,5,0,0),
+d(2035,9,2,6,0,0),
+d(2036,4,20,5,0,0),
+d(2036,9,7,6,0,0),
+d(2037,4,19,5,0,0),
+d(2037,9,6,6,0,0),
+        ]
+
+    _transition_info = [
+i(-13860,0,'SMT'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,0,'FKT'),
+i(-7200,3600,'FKST'),
+i(-10800,0,'FKT'),
+i(-7200,3600,'FKST'),
+i(-10800,0,'FKT'),
+i(-10800,0,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+i(-14400,0,'FKT'),
+i(-10800,3600,'FKST'),
+        ]
+
+Stanley = Stanley()
+
diff --git a/lib/pytz/zoneinfo/Atlantic/__init__.py b/lib/pytz/zoneinfo/Atlantic/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Australia/ACT.py b/lib/pytz/zoneinfo/Australia/ACT.py
new file mode 100755
index 0000000..26b8052
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/ACT.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/ACT.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class ACT(DstTzInfo):
+    '''Australia/ACT timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/ACT'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,4,3,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,5,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,15,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,24,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,3,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+d(1992,10,24,16,0,0),
+d(1993,3,6,16,0,0),
+d(1993,10,30,16,0,0),
+d(1994,3,5,16,0,0),
+d(1994,10,29,16,0,0),
+d(1995,3,4,16,0,0),
+d(1995,10,28,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,26,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,25,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,24,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,30,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,27,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,26,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,25,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,30,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,29,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,10,28,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,27,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,25,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,24,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,30,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,29,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,27,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,26,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,25,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,24,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,29,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,10,28,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,27,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,26,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,24,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,30,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,29,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,10,28,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,26,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,25,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,24,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,30,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,10,28,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,27,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,26,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,25,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,30,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,29,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,10,28,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,27,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,25,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,24,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+ACT = ACT()
+
diff --git a/lib/pytz/zoneinfo/Australia/Adelaide.py b/lib/pytz/zoneinfo/Australia/Adelaide.py
new file mode 100755
index 0000000..3b4056f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Adelaide.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/Adelaide.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Adelaide(DstTzInfo):
+    '''Australia/Adelaide timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Adelaide'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,31,0),
+d(1917,3,24,15,30,0),
+d(1941,12,31,16,30,0),
+d(1942,3,28,15,30,0),
+d(1942,9,26,16,30,0),
+d(1943,3,27,15,30,0),
+d(1943,10,2,16,30,0),
+d(1944,3,25,15,30,0),
+d(1971,10,30,16,30,0),
+d(1972,2,26,16,30,0),
+d(1972,10,28,16,30,0),
+d(1973,3,3,16,30,0),
+d(1973,10,27,16,30,0),
+d(1974,3,2,16,30,0),
+d(1974,10,26,16,30,0),
+d(1975,3,1,16,30,0),
+d(1975,10,25,16,30,0),
+d(1976,3,6,16,30,0),
+d(1976,10,30,16,30,0),
+d(1977,3,5,16,30,0),
+d(1977,10,29,16,30,0),
+d(1978,3,4,16,30,0),
+d(1978,10,28,16,30,0),
+d(1979,3,3,16,30,0),
+d(1979,10,27,16,30,0),
+d(1980,3,1,16,30,0),
+d(1980,10,25,16,30,0),
+d(1981,2,28,16,30,0),
+d(1981,10,24,16,30,0),
+d(1982,3,6,16,30,0),
+d(1982,10,30,16,30,0),
+d(1983,3,5,16,30,0),
+d(1983,10,29,16,30,0),
+d(1984,3,3,16,30,0),
+d(1984,10,27,16,30,0),
+d(1985,3,2,16,30,0),
+d(1985,10,26,16,30,0),
+d(1986,3,15,16,30,0),
+d(1986,10,18,16,30,0),
+d(1987,3,14,16,30,0),
+d(1987,10,24,16,30,0),
+d(1988,3,19,16,30,0),
+d(1988,10,29,16,30,0),
+d(1989,3,18,16,30,0),
+d(1989,10,28,16,30,0),
+d(1990,3,17,16,30,0),
+d(1990,10,27,16,30,0),
+d(1991,3,2,16,30,0),
+d(1991,10,26,16,30,0),
+d(1992,3,21,16,30,0),
+d(1992,10,24,16,30,0),
+d(1993,3,6,16,30,0),
+d(1993,10,30,16,30,0),
+d(1994,3,19,16,30,0),
+d(1994,10,29,16,30,0),
+d(1995,3,25,16,30,0),
+d(1995,10,28,16,30,0),
+d(1996,3,30,16,30,0),
+d(1996,10,26,16,30,0),
+d(1997,3,29,16,30,0),
+d(1997,10,25,16,30,0),
+d(1998,3,28,16,30,0),
+d(1998,10,24,16,30,0),
+d(1999,3,27,16,30,0),
+d(1999,10,30,16,30,0),
+d(2000,3,25,16,30,0),
+d(2000,10,28,16,30,0),
+d(2001,3,24,16,30,0),
+d(2001,10,27,16,30,0),
+d(2002,3,30,16,30,0),
+d(2002,10,26,16,30,0),
+d(2003,3,29,16,30,0),
+d(2003,10,25,16,30,0),
+d(2004,3,27,16,30,0),
+d(2004,10,30,16,30,0),
+d(2005,3,26,16,30,0),
+d(2005,10,29,16,30,0),
+d(2006,4,1,16,30,0),
+d(2006,10,28,16,30,0),
+d(2007,3,24,16,30,0),
+d(2007,10,27,16,30,0),
+d(2008,3,29,16,30,0),
+d(2008,10,25,16,30,0),
+d(2009,3,28,16,30,0),
+d(2009,10,24,16,30,0),
+d(2010,3,27,16,30,0),
+d(2010,10,30,16,30,0),
+d(2011,3,26,16,30,0),
+d(2011,10,29,16,30,0),
+d(2012,3,24,16,30,0),
+d(2012,10,27,16,30,0),
+d(2013,3,30,16,30,0),
+d(2013,10,26,16,30,0),
+d(2014,3,29,16,30,0),
+d(2014,10,25,16,30,0),
+d(2015,3,28,16,30,0),
+d(2015,10,24,16,30,0),
+d(2016,3,26,16,30,0),
+d(2016,10,29,16,30,0),
+d(2017,3,25,16,30,0),
+d(2017,10,28,16,30,0),
+d(2018,3,24,16,30,0),
+d(2018,10,27,16,30,0),
+d(2019,3,30,16,30,0),
+d(2019,10,26,16,30,0),
+d(2020,3,28,16,30,0),
+d(2020,10,24,16,30,0),
+d(2021,3,27,16,30,0),
+d(2021,10,30,16,30,0),
+d(2022,3,26,16,30,0),
+d(2022,10,29,16,30,0),
+d(2023,3,25,16,30,0),
+d(2023,10,28,16,30,0),
+d(2024,3,30,16,30,0),
+d(2024,10,26,16,30,0),
+d(2025,3,29,16,30,0),
+d(2025,10,25,16,30,0),
+d(2026,3,28,16,30,0),
+d(2026,10,24,16,30,0),
+d(2027,3,27,16,30,0),
+d(2027,10,30,16,30,0),
+d(2028,3,25,16,30,0),
+d(2028,10,28,16,30,0),
+d(2029,3,24,16,30,0),
+d(2029,10,27,16,30,0),
+d(2030,3,30,16,30,0),
+d(2030,10,26,16,30,0),
+d(2031,3,29,16,30,0),
+d(2031,10,25,16,30,0),
+d(2032,3,27,16,30,0),
+d(2032,10,30,16,30,0),
+d(2033,3,26,16,30,0),
+d(2033,10,29,16,30,0),
+d(2034,3,25,16,30,0),
+d(2034,10,28,16,30,0),
+d(2035,3,24,16,30,0),
+d(2035,10,27,16,30,0),
+d(2036,3,29,16,30,0),
+d(2036,10,25,16,30,0),
+d(2037,3,28,16,30,0),
+d(2037,10,24,16,30,0),
+        ]
+
+    _transition_info = [
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+        ]
+
+Adelaide = Adelaide()
+
diff --git a/lib/pytz/zoneinfo/Australia/Brisbane.py b/lib/pytz/zoneinfo/Australia/Brisbane.py
new file mode 100755
index 0000000..31303d9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Brisbane.py
@@ -0,0 +1,52 @@
+'''tzinfo timezone information for Australia/Brisbane.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Brisbane(DstTzInfo):
+    '''Australia/Brisbane timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Brisbane'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,3,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+        ]
+
+Brisbane = Brisbane()
+
diff --git a/lib/pytz/zoneinfo/Australia/Broken_Hill.py b/lib/pytz/zoneinfo/Australia/Broken_Hill.py
new file mode 100755
index 0000000..dfd7164
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Broken_Hill.py
@@ -0,0 +1,304 @@
+'''tzinfo timezone information for Australia/Broken_Hill.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Broken_Hill(DstTzInfo):
+    '''Australia/Broken_Hill timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Broken_Hill'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,31,0),
+d(1917,3,24,15,30,0),
+d(1941,12,31,16,30,0),
+d(1942,3,28,15,30,0),
+d(1942,9,26,16,30,0),
+d(1943,3,27,15,30,0),
+d(1943,10,2,16,30,0),
+d(1944,3,25,15,30,0),
+d(1971,10,30,16,30,0),
+d(1972,2,26,16,30,0),
+d(1972,10,28,16,30,0),
+d(1973,3,3,16,30,0),
+d(1973,10,27,16,30,0),
+d(1974,3,2,16,30,0),
+d(1974,10,26,16,30,0),
+d(1975,3,1,16,30,0),
+d(1975,10,25,16,30,0),
+d(1976,3,6,16,30,0),
+d(1976,10,30,16,30,0),
+d(1977,3,5,16,30,0),
+d(1977,10,29,16,30,0),
+d(1978,3,4,16,30,0),
+d(1978,10,28,16,30,0),
+d(1979,3,3,16,30,0),
+d(1979,10,27,16,30,0),
+d(1980,3,1,16,30,0),
+d(1980,10,25,16,30,0),
+d(1981,2,28,16,30,0),
+d(1981,10,24,16,30,0),
+d(1982,4,3,16,30,0),
+d(1982,10,30,16,30,0),
+d(1983,3,5,16,30,0),
+d(1983,10,29,16,30,0),
+d(1984,3,3,16,30,0),
+d(1984,10,27,16,30,0),
+d(1985,3,2,16,30,0),
+d(1985,10,26,16,30,0),
+d(1986,3,15,16,30,0),
+d(1986,10,18,16,30,0),
+d(1987,3,14,16,30,0),
+d(1987,10,24,16,30,0),
+d(1988,3,19,16,30,0),
+d(1988,10,29,16,30,0),
+d(1989,3,18,16,30,0),
+d(1989,10,28,16,30,0),
+d(1990,3,3,16,30,0),
+d(1990,10,27,16,30,0),
+d(1991,3,2,16,30,0),
+d(1991,10,26,16,30,0),
+d(1992,2,29,16,30,0),
+d(1992,10,24,16,30,0),
+d(1993,3,6,16,30,0),
+d(1993,10,30,16,30,0),
+d(1994,3,5,16,30,0),
+d(1994,10,29,16,30,0),
+d(1995,3,4,16,30,0),
+d(1995,10,28,16,30,0),
+d(1996,3,30,16,30,0),
+d(1996,10,26,16,30,0),
+d(1997,3,29,16,30,0),
+d(1997,10,25,16,30,0),
+d(1998,3,28,16,30,0),
+d(1998,10,24,16,30,0),
+d(1999,3,27,16,30,0),
+d(1999,10,30,16,30,0),
+d(1999,12,31,13,30,0),
+d(2000,3,25,16,30,0),
+d(2000,10,28,16,30,0),
+d(2001,3,24,16,30,0),
+d(2001,10,27,16,30,0),
+d(2002,3,30,16,30,0),
+d(2002,10,26,16,30,0),
+d(2003,3,29,16,30,0),
+d(2003,10,25,16,30,0),
+d(2004,3,27,16,30,0),
+d(2004,10,30,16,30,0),
+d(2005,3,26,16,30,0),
+d(2005,10,29,16,30,0),
+d(2006,4,1,16,30,0),
+d(2006,10,28,16,30,0),
+d(2007,3,24,16,30,0),
+d(2007,10,27,16,30,0),
+d(2008,3,29,16,30,0),
+d(2008,10,25,16,30,0),
+d(2009,3,28,16,30,0),
+d(2009,10,24,16,30,0),
+d(2010,3,27,16,30,0),
+d(2010,10,30,16,30,0),
+d(2011,3,26,16,30,0),
+d(2011,10,29,16,30,0),
+d(2012,3,24,16,30,0),
+d(2012,10,27,16,30,0),
+d(2013,3,30,16,30,0),
+d(2013,10,26,16,30,0),
+d(2014,3,29,16,30,0),
+d(2014,10,25,16,30,0),
+d(2015,3,28,16,30,0),
+d(2015,10,24,16,30,0),
+d(2016,3,26,16,30,0),
+d(2016,10,29,16,30,0),
+d(2017,3,25,16,30,0),
+d(2017,10,28,16,30,0),
+d(2018,3,24,16,30,0),
+d(2018,10,27,16,30,0),
+d(2019,3,30,16,30,0),
+d(2019,10,26,16,30,0),
+d(2020,3,28,16,30,0),
+d(2020,10,24,16,30,0),
+d(2021,3,27,16,30,0),
+d(2021,10,30,16,30,0),
+d(2022,3,26,16,30,0),
+d(2022,10,29,16,30,0),
+d(2023,3,25,16,30,0),
+d(2023,10,28,16,30,0),
+d(2024,3,30,16,30,0),
+d(2024,10,26,16,30,0),
+d(2025,3,29,16,30,0),
+d(2025,10,25,16,30,0),
+d(2026,3,28,16,30,0),
+d(2026,10,24,16,30,0),
+d(2027,3,27,16,30,0),
+d(2027,10,30,16,30,0),
+d(2028,3,25,16,30,0),
+d(2028,10,28,16,30,0),
+d(2029,3,24,16,30,0),
+d(2029,10,27,16,30,0),
+d(2030,3,30,16,30,0),
+d(2030,10,26,16,30,0),
+d(2031,3,29,16,30,0),
+d(2031,10,25,16,30,0),
+d(2032,3,27,16,30,0),
+d(2032,10,30,16,30,0),
+d(2033,3,26,16,30,0),
+d(2033,10,29,16,30,0),
+d(2034,3,25,16,30,0),
+d(2034,10,28,16,30,0),
+d(2035,3,24,16,30,0),
+d(2035,10,27,16,30,0),
+d(2036,3,29,16,30,0),
+d(2036,10,25,16,30,0),
+d(2037,3,28,16,30,0),
+d(2037,10,24,16,30,0),
+        ]
+
+    _transition_info = [
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+        ]
+
+Broken_Hill = Broken_Hill()
+
diff --git a/lib/pytz/zoneinfo/Australia/Canberra.py b/lib/pytz/zoneinfo/Australia/Canberra.py
new file mode 100755
index 0000000..492137f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Canberra.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/Canberra.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Canberra(DstTzInfo):
+    '''Australia/Canberra timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Canberra'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,4,3,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,5,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,15,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,24,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,3,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+d(1992,10,24,16,0,0),
+d(1993,3,6,16,0,0),
+d(1993,10,30,16,0,0),
+d(1994,3,5,16,0,0),
+d(1994,10,29,16,0,0),
+d(1995,3,4,16,0,0),
+d(1995,10,28,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,26,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,25,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,24,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,30,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,27,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,26,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,25,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,30,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,29,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,10,28,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,27,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,25,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,24,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,30,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,29,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,27,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,26,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,25,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,24,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,29,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,10,28,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,27,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,26,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,24,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,30,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,29,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,10,28,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,26,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,25,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,24,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,30,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,10,28,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,27,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,26,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,25,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,30,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,29,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,10,28,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,27,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,25,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,24,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+Canberra = Canberra()
+
diff --git a/lib/pytz/zoneinfo/Australia/Currie.py b/lib/pytz/zoneinfo/Australia/Currie.py
new file mode 100755
index 0000000..604b2f7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Currie.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/Currie.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Currie(DstTzInfo):
+    '''Australia/Currie timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Currie'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,9,30,16,0,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,3,27,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,26,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,1,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,24,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,17,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,30,16,0,0),
+d(1991,10,5,16,0,0),
+d(1992,3,28,16,0,0),
+d(1992,10,3,16,0,0),
+d(1993,3,27,16,0,0),
+d(1993,10,2,16,0,0),
+d(1994,3,26,16,0,0),
+d(1994,10,1,16,0,0),
+d(1995,3,25,16,0,0),
+d(1995,9,30,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,5,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,4,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,3,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,2,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,6,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,5,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,4,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,2,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,1,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,9,30,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,6,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,4,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,3,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,2,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,1,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,6,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,5,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,4,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,3,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,1,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,9,30,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,6,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,5,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,3,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,2,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,1,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,9,30,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,5,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,4,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,3,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,2,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,9,30,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,6,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,5,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,4,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,2,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,1,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,9,30,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,6,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,4,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,3,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+Currie = Currie()
+
diff --git a/lib/pytz/zoneinfo/Australia/Darwin.py b/lib/pytz/zoneinfo/Australia/Darwin.py
new file mode 100755
index 0000000..d5113c8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Darwin.py
@@ -0,0 +1,36 @@
+'''tzinfo timezone information for Australia/Darwin.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Darwin(DstTzInfo):
+    '''Australia/Darwin timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Darwin'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,31,0),
+d(1917,3,24,15,30,0),
+d(1941,12,31,16,30,0),
+d(1942,3,28,15,30,0),
+d(1942,9,26,16,30,0),
+d(1943,3,27,15,30,0),
+d(1943,10,2,16,30,0),
+d(1944,3,25,15,30,0),
+        ]
+
+    _transition_info = [
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+        ]
+
+Darwin = Darwin()
+
diff --git a/lib/pytz/zoneinfo/Australia/Hobart.py b/lib/pytz/zoneinfo/Australia/Hobart.py
new file mode 100755
index 0000000..6363731
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Hobart.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for Australia/Hobart.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Hobart(DstTzInfo):
+    '''Australia/Hobart timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Hobart'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,9,30,16,0,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1967,9,30,16,0,0),
+d(1968,3,30,16,0,0),
+d(1968,10,26,16,0,0),
+d(1969,3,8,16,0,0),
+d(1969,10,25,16,0,0),
+d(1970,3,7,16,0,0),
+d(1970,10,24,16,0,0),
+d(1971,3,13,16,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,3,27,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,26,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,1,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,24,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,17,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,30,16,0,0),
+d(1991,10,5,16,0,0),
+d(1992,3,28,16,0,0),
+d(1992,10,3,16,0,0),
+d(1993,3,27,16,0,0),
+d(1993,10,2,16,0,0),
+d(1994,3,26,16,0,0),
+d(1994,10,1,16,0,0),
+d(1995,3,25,16,0,0),
+d(1995,9,30,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,5,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,4,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,3,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,2,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,6,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,5,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,4,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,2,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,1,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,9,30,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,6,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,4,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,3,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,2,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,1,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,6,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,5,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,4,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,3,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,1,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,9,30,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,6,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,5,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,3,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,2,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,1,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,9,30,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,5,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,4,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,3,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,2,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,9,30,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,6,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,5,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,4,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,2,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,1,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,9,30,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,6,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,4,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,3,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+Hobart = Hobart()
+
diff --git a/lib/pytz/zoneinfo/Australia/LHI.py b/lib/pytz/zoneinfo/Australia/LHI.py
new file mode 100755
index 0000000..9eabe24
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/LHI.py
@@ -0,0 +1,248 @@
+'''tzinfo timezone information for Australia/LHI.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class LHI(DstTzInfo):
+    '''Australia/LHI timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/LHI'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1981,2,28,14,0,0),
+d(1981,10,24,15,30,0),
+d(1982,3,6,14,30,0),
+d(1982,10,30,15,30,0),
+d(1983,3,5,14,30,0),
+d(1983,10,29,15,30,0),
+d(1984,3,3,14,30,0),
+d(1984,10,27,15,30,0),
+d(1985,3,2,14,30,0),
+d(1985,10,26,15,30,0),
+d(1986,3,15,15,0,0),
+d(1986,10,18,15,30,0),
+d(1987,3,14,15,0,0),
+d(1987,10,24,15,30,0),
+d(1988,3,19,15,0,0),
+d(1988,10,29,15,30,0),
+d(1989,3,18,15,0,0),
+d(1989,10,28,15,30,0),
+d(1990,3,3,15,0,0),
+d(1990,10,27,15,30,0),
+d(1991,3,2,15,0,0),
+d(1991,10,26,15,30,0),
+d(1992,2,29,15,0,0),
+d(1992,10,24,15,30,0),
+d(1993,3,6,15,0,0),
+d(1993,10,30,15,30,0),
+d(1994,3,5,15,0,0),
+d(1994,10,29,15,30,0),
+d(1995,3,4,15,0,0),
+d(1995,10,28,15,30,0),
+d(1996,3,30,15,0,0),
+d(1996,10,26,15,30,0),
+d(1997,3,29,15,0,0),
+d(1997,10,25,15,30,0),
+d(1998,3,28,15,0,0),
+d(1998,10,24,15,30,0),
+d(1999,3,27,15,0,0),
+d(1999,10,30,15,30,0),
+d(2000,3,25,15,0,0),
+d(2000,8,26,15,30,0),
+d(2001,3,24,15,0,0),
+d(2001,10,27,15,30,0),
+d(2002,3,30,15,0,0),
+d(2002,10,26,15,30,0),
+d(2003,3,29,15,0,0),
+d(2003,10,25,15,30,0),
+d(2004,3,27,15,0,0),
+d(2004,10,30,15,30,0),
+d(2005,3,26,15,0,0),
+d(2005,10,29,15,30,0),
+d(2006,4,1,15,0,0),
+d(2006,10,28,15,30,0),
+d(2007,3,24,15,0,0),
+d(2007,10,27,15,30,0),
+d(2008,3,29,15,0,0),
+d(2008,10,25,15,30,0),
+d(2009,3,28,15,0,0),
+d(2009,10,24,15,30,0),
+d(2010,3,27,15,0,0),
+d(2010,10,30,15,30,0),
+d(2011,3,26,15,0,0),
+d(2011,10,29,15,30,0),
+d(2012,3,24,15,0,0),
+d(2012,10,27,15,30,0),
+d(2013,3,30,15,0,0),
+d(2013,10,26,15,30,0),
+d(2014,3,29,15,0,0),
+d(2014,10,25,15,30,0),
+d(2015,3,28,15,0,0),
+d(2015,10,24,15,30,0),
+d(2016,3,26,15,0,0),
+d(2016,10,29,15,30,0),
+d(2017,3,25,15,0,0),
+d(2017,10,28,15,30,0),
+d(2018,3,24,15,0,0),
+d(2018,10,27,15,30,0),
+d(2019,3,30,15,0,0),
+d(2019,10,26,15,30,0),
+d(2020,3,28,15,0,0),
+d(2020,10,24,15,30,0),
+d(2021,3,27,15,0,0),
+d(2021,10,30,15,30,0),
+d(2022,3,26,15,0,0),
+d(2022,10,29,15,30,0),
+d(2023,3,25,15,0,0),
+d(2023,10,28,15,30,0),
+d(2024,3,30,15,0,0),
+d(2024,10,26,15,30,0),
+d(2025,3,29,15,0,0),
+d(2025,10,25,15,30,0),
+d(2026,3,28,15,0,0),
+d(2026,10,24,15,30,0),
+d(2027,3,27,15,0,0),
+d(2027,10,30,15,30,0),
+d(2028,3,25,15,0,0),
+d(2028,10,28,15,30,0),
+d(2029,3,24,15,0,0),
+d(2029,10,27,15,30,0),
+d(2030,3,30,15,0,0),
+d(2030,10,26,15,30,0),
+d(2031,3,29,15,0,0),
+d(2031,10,25,15,30,0),
+d(2032,3,27,15,0,0),
+d(2032,10,30,15,30,0),
+d(2033,3,26,15,0,0),
+d(2033,10,29,15,30,0),
+d(2034,3,25,15,0,0),
+d(2034,10,28,15,30,0),
+d(2035,3,24,15,0,0),
+d(2035,10,27,15,30,0),
+d(2036,3,29,15,0,0),
+d(2036,10,25,15,30,0),
+d(2037,3,28,15,0,0),
+d(2037,10,24,15,30,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(37800,0,'LHST'),
+i(41400,3600,'LHST'),
+i(37800,0,'LHST'),
+i(41400,3600,'LHST'),
+i(37800,0,'LHST'),
+i(41400,3600,'LHST'),
+i(37800,0,'LHST'),
+i(41400,3600,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+        ]
+
+LHI = LHI()
+
diff --git a/lib/pytz/zoneinfo/Australia/Lindeman.py b/lib/pytz/zoneinfo/Australia/Lindeman.py
new file mode 100755
index 0000000..8b43a9e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Lindeman.py
@@ -0,0 +1,62 @@
+'''tzinfo timezone information for Australia/Lindeman.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Lindeman(DstTzInfo):
+    '''Australia/Lindeman timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Lindeman'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,3,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+d(1992,6,30,14,0,0),
+d(1992,10,24,16,0,0),
+d(1993,3,6,16,0,0),
+d(1993,10,30,16,0,0),
+d(1994,3,5,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+        ]
+
+Lindeman = Lindeman()
+
diff --git a/lib/pytz/zoneinfo/Australia/Lord_Howe.py b/lib/pytz/zoneinfo/Australia/Lord_Howe.py
new file mode 100755
index 0000000..95acf6b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Lord_Howe.py
@@ -0,0 +1,248 @@
+'''tzinfo timezone information for Australia/Lord_Howe.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Lord_Howe(DstTzInfo):
+    '''Australia/Lord_Howe timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Lord_Howe'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1981,2,28,14,0,0),
+d(1981,10,24,15,30,0),
+d(1982,3,6,14,30,0),
+d(1982,10,30,15,30,0),
+d(1983,3,5,14,30,0),
+d(1983,10,29,15,30,0),
+d(1984,3,3,14,30,0),
+d(1984,10,27,15,30,0),
+d(1985,3,2,14,30,0),
+d(1985,10,26,15,30,0),
+d(1986,3,15,15,0,0),
+d(1986,10,18,15,30,0),
+d(1987,3,14,15,0,0),
+d(1987,10,24,15,30,0),
+d(1988,3,19,15,0,0),
+d(1988,10,29,15,30,0),
+d(1989,3,18,15,0,0),
+d(1989,10,28,15,30,0),
+d(1990,3,3,15,0,0),
+d(1990,10,27,15,30,0),
+d(1991,3,2,15,0,0),
+d(1991,10,26,15,30,0),
+d(1992,2,29,15,0,0),
+d(1992,10,24,15,30,0),
+d(1993,3,6,15,0,0),
+d(1993,10,30,15,30,0),
+d(1994,3,5,15,0,0),
+d(1994,10,29,15,30,0),
+d(1995,3,4,15,0,0),
+d(1995,10,28,15,30,0),
+d(1996,3,30,15,0,0),
+d(1996,10,26,15,30,0),
+d(1997,3,29,15,0,0),
+d(1997,10,25,15,30,0),
+d(1998,3,28,15,0,0),
+d(1998,10,24,15,30,0),
+d(1999,3,27,15,0,0),
+d(1999,10,30,15,30,0),
+d(2000,3,25,15,0,0),
+d(2000,8,26,15,30,0),
+d(2001,3,24,15,0,0),
+d(2001,10,27,15,30,0),
+d(2002,3,30,15,0,0),
+d(2002,10,26,15,30,0),
+d(2003,3,29,15,0,0),
+d(2003,10,25,15,30,0),
+d(2004,3,27,15,0,0),
+d(2004,10,30,15,30,0),
+d(2005,3,26,15,0,0),
+d(2005,10,29,15,30,0),
+d(2006,4,1,15,0,0),
+d(2006,10,28,15,30,0),
+d(2007,3,24,15,0,0),
+d(2007,10,27,15,30,0),
+d(2008,3,29,15,0,0),
+d(2008,10,25,15,30,0),
+d(2009,3,28,15,0,0),
+d(2009,10,24,15,30,0),
+d(2010,3,27,15,0,0),
+d(2010,10,30,15,30,0),
+d(2011,3,26,15,0,0),
+d(2011,10,29,15,30,0),
+d(2012,3,24,15,0,0),
+d(2012,10,27,15,30,0),
+d(2013,3,30,15,0,0),
+d(2013,10,26,15,30,0),
+d(2014,3,29,15,0,0),
+d(2014,10,25,15,30,0),
+d(2015,3,28,15,0,0),
+d(2015,10,24,15,30,0),
+d(2016,3,26,15,0,0),
+d(2016,10,29,15,30,0),
+d(2017,3,25,15,0,0),
+d(2017,10,28,15,30,0),
+d(2018,3,24,15,0,0),
+d(2018,10,27,15,30,0),
+d(2019,3,30,15,0,0),
+d(2019,10,26,15,30,0),
+d(2020,3,28,15,0,0),
+d(2020,10,24,15,30,0),
+d(2021,3,27,15,0,0),
+d(2021,10,30,15,30,0),
+d(2022,3,26,15,0,0),
+d(2022,10,29,15,30,0),
+d(2023,3,25,15,0,0),
+d(2023,10,28,15,30,0),
+d(2024,3,30,15,0,0),
+d(2024,10,26,15,30,0),
+d(2025,3,29,15,0,0),
+d(2025,10,25,15,30,0),
+d(2026,3,28,15,0,0),
+d(2026,10,24,15,30,0),
+d(2027,3,27,15,0,0),
+d(2027,10,30,15,30,0),
+d(2028,3,25,15,0,0),
+d(2028,10,28,15,30,0),
+d(2029,3,24,15,0,0),
+d(2029,10,27,15,30,0),
+d(2030,3,30,15,0,0),
+d(2030,10,26,15,30,0),
+d(2031,3,29,15,0,0),
+d(2031,10,25,15,30,0),
+d(2032,3,27,15,0,0),
+d(2032,10,30,15,30,0),
+d(2033,3,26,15,0,0),
+d(2033,10,29,15,30,0),
+d(2034,3,25,15,0,0),
+d(2034,10,28,15,30,0),
+d(2035,3,24,15,0,0),
+d(2035,10,27,15,30,0),
+d(2036,3,29,15,0,0),
+d(2036,10,25,15,30,0),
+d(2037,3,28,15,0,0),
+d(2037,10,24,15,30,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(37800,0,'LHST'),
+i(41400,3600,'LHST'),
+i(37800,0,'LHST'),
+i(41400,3600,'LHST'),
+i(37800,0,'LHST'),
+i(41400,3600,'LHST'),
+i(37800,0,'LHST'),
+i(41400,3600,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+i(37800,0,'LHST'),
+i(39600,1800,'LHST'),
+        ]
+
+Lord_Howe = Lord_Howe()
+
diff --git a/lib/pytz/zoneinfo/Australia/Melbourne.py b/lib/pytz/zoneinfo/Australia/Melbourne.py
new file mode 100755
index 0000000..a6cde24
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Melbourne.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/Melbourne.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Melbourne(DstTzInfo):
+    '''Australia/Melbourne timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Melbourne'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,3,6,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,5,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,15,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,17,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,17,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+d(1992,10,24,16,0,0),
+d(1993,3,6,16,0,0),
+d(1993,10,30,16,0,0),
+d(1994,3,5,16,0,0),
+d(1994,10,29,16,0,0),
+d(1995,3,25,16,0,0),
+d(1995,10,28,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,26,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,25,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,24,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,30,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,27,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,26,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,25,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,30,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,29,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,10,28,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,27,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,25,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,24,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,30,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,29,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,27,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,26,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,25,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,24,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,29,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,10,28,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,27,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,26,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,24,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,30,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,29,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,10,28,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,26,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,25,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,24,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,30,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,10,28,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,27,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,26,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,25,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,30,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,29,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,10,28,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,27,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,25,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,24,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+Melbourne = Melbourne()
+
diff --git a/lib/pytz/zoneinfo/Australia/NSW.py b/lib/pytz/zoneinfo/Australia/NSW.py
new file mode 100755
index 0000000..6a821df
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/NSW.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/NSW.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class NSW(DstTzInfo):
+    '''Australia/NSW timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/NSW'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,4,3,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,5,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,15,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,24,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,3,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+d(1992,10,24,16,0,0),
+d(1993,3,6,16,0,0),
+d(1993,10,30,16,0,0),
+d(1994,3,5,16,0,0),
+d(1994,10,29,16,0,0),
+d(1995,3,4,16,0,0),
+d(1995,10,28,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,26,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,25,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,24,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,30,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,27,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,26,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,25,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,30,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,29,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,10,28,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,27,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,25,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,24,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,30,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,29,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,27,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,26,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,25,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,24,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,29,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,10,28,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,27,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,26,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,24,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,30,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,29,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,10,28,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,26,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,25,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,24,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,30,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,10,28,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,27,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,26,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,25,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,30,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,29,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,10,28,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,27,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,25,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,24,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+NSW = NSW()
+
diff --git a/lib/pytz/zoneinfo/Australia/North.py b/lib/pytz/zoneinfo/Australia/North.py
new file mode 100755
index 0000000..5ce0f27
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/North.py
@@ -0,0 +1,36 @@
+'''tzinfo timezone information for Australia/North.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class North(DstTzInfo):
+    '''Australia/North timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/North'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,31,0),
+d(1917,3,24,15,30,0),
+d(1941,12,31,16,30,0),
+d(1942,3,28,15,30,0),
+d(1942,9,26,16,30,0),
+d(1943,3,27,15,30,0),
+d(1943,10,2,16,30,0),
+d(1944,3,25,15,30,0),
+        ]
+
+    _transition_info = [
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+        ]
+
+North = North()
+
diff --git a/lib/pytz/zoneinfo/Australia/Perth.py b/lib/pytz/zoneinfo/Australia/Perth.py
new file mode 100755
index 0000000..6da6f97
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Perth.py
@@ -0,0 +1,56 @@
+'''tzinfo timezone information for Australia/Perth.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Perth(DstTzInfo):
+    '''Australia/Perth timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Perth'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,16,1,0),
+d(1917,3,24,17,0,0),
+d(1941,12,31,18,0,0),
+d(1942,3,28,17,0,0),
+d(1942,9,26,18,0,0),
+d(1943,3,27,17,0,0),
+d(1974,10,26,18,0,0),
+d(1975,3,1,18,0,0),
+d(1983,10,29,18,0,0),
+d(1984,3,3,18,0,0),
+d(1991,11,16,18,0,0),
+d(1992,2,29,18,0,0),
+d(2006,12,2,18,0,0),
+d(2007,3,24,18,0,0),
+d(2007,10,27,18,0,0),
+d(2008,3,29,18,0,0),
+d(2008,10,25,18,0,0),
+d(2009,3,28,18,0,0),
+        ]
+
+    _transition_info = [
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+        ]
+
+Perth = Perth()
+
diff --git a/lib/pytz/zoneinfo/Australia/Queensland.py b/lib/pytz/zoneinfo/Australia/Queensland.py
new file mode 100755
index 0000000..248d5f5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Queensland.py
@@ -0,0 +1,52 @@
+'''tzinfo timezone information for Australia/Queensland.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Queensland(DstTzInfo):
+    '''Australia/Queensland timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Queensland'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,3,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+        ]
+
+Queensland = Queensland()
+
diff --git a/lib/pytz/zoneinfo/Australia/South.py b/lib/pytz/zoneinfo/Australia/South.py
new file mode 100755
index 0000000..040489b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/South.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/South.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class South(DstTzInfo):
+    '''Australia/South timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/South'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,31,0),
+d(1917,3,24,15,30,0),
+d(1941,12,31,16,30,0),
+d(1942,3,28,15,30,0),
+d(1942,9,26,16,30,0),
+d(1943,3,27,15,30,0),
+d(1943,10,2,16,30,0),
+d(1944,3,25,15,30,0),
+d(1971,10,30,16,30,0),
+d(1972,2,26,16,30,0),
+d(1972,10,28,16,30,0),
+d(1973,3,3,16,30,0),
+d(1973,10,27,16,30,0),
+d(1974,3,2,16,30,0),
+d(1974,10,26,16,30,0),
+d(1975,3,1,16,30,0),
+d(1975,10,25,16,30,0),
+d(1976,3,6,16,30,0),
+d(1976,10,30,16,30,0),
+d(1977,3,5,16,30,0),
+d(1977,10,29,16,30,0),
+d(1978,3,4,16,30,0),
+d(1978,10,28,16,30,0),
+d(1979,3,3,16,30,0),
+d(1979,10,27,16,30,0),
+d(1980,3,1,16,30,0),
+d(1980,10,25,16,30,0),
+d(1981,2,28,16,30,0),
+d(1981,10,24,16,30,0),
+d(1982,3,6,16,30,0),
+d(1982,10,30,16,30,0),
+d(1983,3,5,16,30,0),
+d(1983,10,29,16,30,0),
+d(1984,3,3,16,30,0),
+d(1984,10,27,16,30,0),
+d(1985,3,2,16,30,0),
+d(1985,10,26,16,30,0),
+d(1986,3,15,16,30,0),
+d(1986,10,18,16,30,0),
+d(1987,3,14,16,30,0),
+d(1987,10,24,16,30,0),
+d(1988,3,19,16,30,0),
+d(1988,10,29,16,30,0),
+d(1989,3,18,16,30,0),
+d(1989,10,28,16,30,0),
+d(1990,3,17,16,30,0),
+d(1990,10,27,16,30,0),
+d(1991,3,2,16,30,0),
+d(1991,10,26,16,30,0),
+d(1992,3,21,16,30,0),
+d(1992,10,24,16,30,0),
+d(1993,3,6,16,30,0),
+d(1993,10,30,16,30,0),
+d(1994,3,19,16,30,0),
+d(1994,10,29,16,30,0),
+d(1995,3,25,16,30,0),
+d(1995,10,28,16,30,0),
+d(1996,3,30,16,30,0),
+d(1996,10,26,16,30,0),
+d(1997,3,29,16,30,0),
+d(1997,10,25,16,30,0),
+d(1998,3,28,16,30,0),
+d(1998,10,24,16,30,0),
+d(1999,3,27,16,30,0),
+d(1999,10,30,16,30,0),
+d(2000,3,25,16,30,0),
+d(2000,10,28,16,30,0),
+d(2001,3,24,16,30,0),
+d(2001,10,27,16,30,0),
+d(2002,3,30,16,30,0),
+d(2002,10,26,16,30,0),
+d(2003,3,29,16,30,0),
+d(2003,10,25,16,30,0),
+d(2004,3,27,16,30,0),
+d(2004,10,30,16,30,0),
+d(2005,3,26,16,30,0),
+d(2005,10,29,16,30,0),
+d(2006,4,1,16,30,0),
+d(2006,10,28,16,30,0),
+d(2007,3,24,16,30,0),
+d(2007,10,27,16,30,0),
+d(2008,3,29,16,30,0),
+d(2008,10,25,16,30,0),
+d(2009,3,28,16,30,0),
+d(2009,10,24,16,30,0),
+d(2010,3,27,16,30,0),
+d(2010,10,30,16,30,0),
+d(2011,3,26,16,30,0),
+d(2011,10,29,16,30,0),
+d(2012,3,24,16,30,0),
+d(2012,10,27,16,30,0),
+d(2013,3,30,16,30,0),
+d(2013,10,26,16,30,0),
+d(2014,3,29,16,30,0),
+d(2014,10,25,16,30,0),
+d(2015,3,28,16,30,0),
+d(2015,10,24,16,30,0),
+d(2016,3,26,16,30,0),
+d(2016,10,29,16,30,0),
+d(2017,3,25,16,30,0),
+d(2017,10,28,16,30,0),
+d(2018,3,24,16,30,0),
+d(2018,10,27,16,30,0),
+d(2019,3,30,16,30,0),
+d(2019,10,26,16,30,0),
+d(2020,3,28,16,30,0),
+d(2020,10,24,16,30,0),
+d(2021,3,27,16,30,0),
+d(2021,10,30,16,30,0),
+d(2022,3,26,16,30,0),
+d(2022,10,29,16,30,0),
+d(2023,3,25,16,30,0),
+d(2023,10,28,16,30,0),
+d(2024,3,30,16,30,0),
+d(2024,10,26,16,30,0),
+d(2025,3,29,16,30,0),
+d(2025,10,25,16,30,0),
+d(2026,3,28,16,30,0),
+d(2026,10,24,16,30,0),
+d(2027,3,27,16,30,0),
+d(2027,10,30,16,30,0),
+d(2028,3,25,16,30,0),
+d(2028,10,28,16,30,0),
+d(2029,3,24,16,30,0),
+d(2029,10,27,16,30,0),
+d(2030,3,30,16,30,0),
+d(2030,10,26,16,30,0),
+d(2031,3,29,16,30,0),
+d(2031,10,25,16,30,0),
+d(2032,3,27,16,30,0),
+d(2032,10,30,16,30,0),
+d(2033,3,26,16,30,0),
+d(2033,10,29,16,30,0),
+d(2034,3,25,16,30,0),
+d(2034,10,28,16,30,0),
+d(2035,3,24,16,30,0),
+d(2035,10,27,16,30,0),
+d(2036,3,29,16,30,0),
+d(2036,10,25,16,30,0),
+d(2037,3,28,16,30,0),
+d(2037,10,24,16,30,0),
+        ]
+
+    _transition_info = [
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+        ]
+
+South = South()
+
diff --git a/lib/pytz/zoneinfo/Australia/Sydney.py b/lib/pytz/zoneinfo/Australia/Sydney.py
new file mode 100755
index 0000000..0aba017
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Sydney.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/Sydney.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Sydney(DstTzInfo):
+    '''Australia/Sydney timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Sydney'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,4,3,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,5,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,15,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,24,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,3,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+d(1992,10,24,16,0,0),
+d(1993,3,6,16,0,0),
+d(1993,10,30,16,0,0),
+d(1994,3,5,16,0,0),
+d(1994,10,29,16,0,0),
+d(1995,3,4,16,0,0),
+d(1995,10,28,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,26,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,25,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,24,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,30,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,27,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,26,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,25,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,30,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,29,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,10,28,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,27,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,25,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,24,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,30,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,29,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,27,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,26,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,25,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,24,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,29,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,10,28,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,27,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,26,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,24,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,30,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,29,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,10,28,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,26,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,25,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,24,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,30,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,10,28,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,27,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,26,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,25,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,30,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,29,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,10,28,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,27,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,25,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,24,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+Sydney = Sydney()
+
diff --git a/lib/pytz/zoneinfo/Australia/Tasmania.py b/lib/pytz/zoneinfo/Australia/Tasmania.py
new file mode 100755
index 0000000..a16d293
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Tasmania.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for Australia/Tasmania.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tasmania(DstTzInfo):
+    '''Australia/Tasmania timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Tasmania'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,9,30,16,0,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1967,9,30,16,0,0),
+d(1968,3,30,16,0,0),
+d(1968,10,26,16,0,0),
+d(1969,3,8,16,0,0),
+d(1969,10,25,16,0,0),
+d(1970,3,7,16,0,0),
+d(1970,10,24,16,0,0),
+d(1971,3,13,16,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,3,27,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,26,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,1,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,24,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,17,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,30,16,0,0),
+d(1991,10,5,16,0,0),
+d(1992,3,28,16,0,0),
+d(1992,10,3,16,0,0),
+d(1993,3,27,16,0,0),
+d(1993,10,2,16,0,0),
+d(1994,3,26,16,0,0),
+d(1994,10,1,16,0,0),
+d(1995,3,25,16,0,0),
+d(1995,9,30,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,5,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,4,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,3,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,2,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,6,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,5,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,4,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,2,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,1,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,9,30,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,6,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,4,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,3,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,2,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,1,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,6,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,5,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,4,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,3,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,1,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,9,30,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,6,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,5,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,3,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,2,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,1,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,9,30,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,5,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,4,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,3,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,2,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,9,30,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,6,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,5,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,4,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,2,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,1,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,9,30,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,6,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,4,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,3,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+Tasmania = Tasmania()
+
diff --git a/lib/pytz/zoneinfo/Australia/Victoria.py b/lib/pytz/zoneinfo/Australia/Victoria.py
new file mode 100755
index 0000000..7ce55b5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Victoria.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Australia/Victoria.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Victoria(DstTzInfo):
+    '''Australia/Victoria timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Victoria'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,1,0),
+d(1917,3,24,15,0,0),
+d(1941,12,31,16,0,0),
+d(1942,3,28,15,0,0),
+d(1942,9,26,16,0,0),
+d(1943,3,27,15,0,0),
+d(1943,10,2,16,0,0),
+d(1944,3,25,15,0,0),
+d(1971,10,30,16,0,0),
+d(1972,2,26,16,0,0),
+d(1972,10,28,16,0,0),
+d(1973,3,3,16,0,0),
+d(1973,10,27,16,0,0),
+d(1974,3,2,16,0,0),
+d(1974,10,26,16,0,0),
+d(1975,3,1,16,0,0),
+d(1975,10,25,16,0,0),
+d(1976,3,6,16,0,0),
+d(1976,10,30,16,0,0),
+d(1977,3,5,16,0,0),
+d(1977,10,29,16,0,0),
+d(1978,3,4,16,0,0),
+d(1978,10,28,16,0,0),
+d(1979,3,3,16,0,0),
+d(1979,10,27,16,0,0),
+d(1980,3,1,16,0,0),
+d(1980,10,25,16,0,0),
+d(1981,2,28,16,0,0),
+d(1981,10,24,16,0,0),
+d(1982,3,6,16,0,0),
+d(1982,10,30,16,0,0),
+d(1983,3,5,16,0,0),
+d(1983,10,29,16,0,0),
+d(1984,3,3,16,0,0),
+d(1984,10,27,16,0,0),
+d(1985,3,2,16,0,0),
+d(1985,10,26,16,0,0),
+d(1986,3,15,16,0,0),
+d(1986,10,18,16,0,0),
+d(1987,3,14,16,0,0),
+d(1987,10,17,16,0,0),
+d(1988,3,19,16,0,0),
+d(1988,10,29,16,0,0),
+d(1989,3,18,16,0,0),
+d(1989,10,28,16,0,0),
+d(1990,3,17,16,0,0),
+d(1990,10,27,16,0,0),
+d(1991,3,2,16,0,0),
+d(1991,10,26,16,0,0),
+d(1992,2,29,16,0,0),
+d(1992,10,24,16,0,0),
+d(1993,3,6,16,0,0),
+d(1993,10,30,16,0,0),
+d(1994,3,5,16,0,0),
+d(1994,10,29,16,0,0),
+d(1995,3,25,16,0,0),
+d(1995,10,28,16,0,0),
+d(1996,3,30,16,0,0),
+d(1996,10,26,16,0,0),
+d(1997,3,29,16,0,0),
+d(1997,10,25,16,0,0),
+d(1998,3,28,16,0,0),
+d(1998,10,24,16,0,0),
+d(1999,3,27,16,0,0),
+d(1999,10,30,16,0,0),
+d(2000,3,25,16,0,0),
+d(2000,8,26,16,0,0),
+d(2001,3,24,16,0,0),
+d(2001,10,27,16,0,0),
+d(2002,3,30,16,0,0),
+d(2002,10,26,16,0,0),
+d(2003,3,29,16,0,0),
+d(2003,10,25,16,0,0),
+d(2004,3,27,16,0,0),
+d(2004,10,30,16,0,0),
+d(2005,3,26,16,0,0),
+d(2005,10,29,16,0,0),
+d(2006,4,1,16,0,0),
+d(2006,10,28,16,0,0),
+d(2007,3,24,16,0,0),
+d(2007,10,27,16,0,0),
+d(2008,3,29,16,0,0),
+d(2008,10,25,16,0,0),
+d(2009,3,28,16,0,0),
+d(2009,10,24,16,0,0),
+d(2010,3,27,16,0,0),
+d(2010,10,30,16,0,0),
+d(2011,3,26,16,0,0),
+d(2011,10,29,16,0,0),
+d(2012,3,24,16,0,0),
+d(2012,10,27,16,0,0),
+d(2013,3,30,16,0,0),
+d(2013,10,26,16,0,0),
+d(2014,3,29,16,0,0),
+d(2014,10,25,16,0,0),
+d(2015,3,28,16,0,0),
+d(2015,10,24,16,0,0),
+d(2016,3,26,16,0,0),
+d(2016,10,29,16,0,0),
+d(2017,3,25,16,0,0),
+d(2017,10,28,16,0,0),
+d(2018,3,24,16,0,0),
+d(2018,10,27,16,0,0),
+d(2019,3,30,16,0,0),
+d(2019,10,26,16,0,0),
+d(2020,3,28,16,0,0),
+d(2020,10,24,16,0,0),
+d(2021,3,27,16,0,0),
+d(2021,10,30,16,0,0),
+d(2022,3,26,16,0,0),
+d(2022,10,29,16,0,0),
+d(2023,3,25,16,0,0),
+d(2023,10,28,16,0,0),
+d(2024,3,30,16,0,0),
+d(2024,10,26,16,0,0),
+d(2025,3,29,16,0,0),
+d(2025,10,25,16,0,0),
+d(2026,3,28,16,0,0),
+d(2026,10,24,16,0,0),
+d(2027,3,27,16,0,0),
+d(2027,10,30,16,0,0),
+d(2028,3,25,16,0,0),
+d(2028,10,28,16,0,0),
+d(2029,3,24,16,0,0),
+d(2029,10,27,16,0,0),
+d(2030,3,30,16,0,0),
+d(2030,10,26,16,0,0),
+d(2031,3,29,16,0,0),
+d(2031,10,25,16,0,0),
+d(2032,3,27,16,0,0),
+d(2032,10,30,16,0,0),
+d(2033,3,26,16,0,0),
+d(2033,10,29,16,0,0),
+d(2034,3,25,16,0,0),
+d(2034,10,28,16,0,0),
+d(2035,3,24,16,0,0),
+d(2035,10,27,16,0,0),
+d(2036,3,29,16,0,0),
+d(2036,10,25,16,0,0),
+d(2037,3,28,16,0,0),
+d(2037,10,24,16,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+i(36000,0,'EST'),
+i(39600,3600,'EST'),
+        ]
+
+Victoria = Victoria()
+
diff --git a/lib/pytz/zoneinfo/Australia/West.py b/lib/pytz/zoneinfo/Australia/West.py
new file mode 100755
index 0000000..90dc4d7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/West.py
@@ -0,0 +1,56 @@
+'''tzinfo timezone information for Australia/West.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class West(DstTzInfo):
+    '''Australia/West timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/West'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,16,1,0),
+d(1917,3,24,17,0,0),
+d(1941,12,31,18,0,0),
+d(1942,3,28,17,0,0),
+d(1942,9,26,18,0,0),
+d(1943,3,27,17,0,0),
+d(1974,10,26,18,0,0),
+d(1975,3,1,18,0,0),
+d(1983,10,29,18,0,0),
+d(1984,3,3,18,0,0),
+d(1991,11,16,18,0,0),
+d(1992,2,29,18,0,0),
+d(2006,12,2,18,0,0),
+d(2007,3,24,18,0,0),
+d(2007,10,27,18,0,0),
+d(2008,3,29,18,0,0),
+d(2008,10,25,18,0,0),
+d(2009,3,28,18,0,0),
+        ]
+
+    _transition_info = [
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+i(32400,3600,'WST'),
+i(28800,0,'WST'),
+        ]
+
+West = West()
+
diff --git a/lib/pytz/zoneinfo/Australia/Yancowinna.py b/lib/pytz/zoneinfo/Australia/Yancowinna.py
new file mode 100755
index 0000000..5a0883e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Australia/Yancowinna.py
@@ -0,0 +1,304 @@
+'''tzinfo timezone information for Australia/Yancowinna.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Yancowinna(DstTzInfo):
+    '''Australia/Yancowinna timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Australia/Yancowinna'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,14,31,0),
+d(1917,3,24,15,30,0),
+d(1941,12,31,16,30,0),
+d(1942,3,28,15,30,0),
+d(1942,9,26,16,30,0),
+d(1943,3,27,15,30,0),
+d(1943,10,2,16,30,0),
+d(1944,3,25,15,30,0),
+d(1971,10,30,16,30,0),
+d(1972,2,26,16,30,0),
+d(1972,10,28,16,30,0),
+d(1973,3,3,16,30,0),
+d(1973,10,27,16,30,0),
+d(1974,3,2,16,30,0),
+d(1974,10,26,16,30,0),
+d(1975,3,1,16,30,0),
+d(1975,10,25,16,30,0),
+d(1976,3,6,16,30,0),
+d(1976,10,30,16,30,0),
+d(1977,3,5,16,30,0),
+d(1977,10,29,16,30,0),
+d(1978,3,4,16,30,0),
+d(1978,10,28,16,30,0),
+d(1979,3,3,16,30,0),
+d(1979,10,27,16,30,0),
+d(1980,3,1,16,30,0),
+d(1980,10,25,16,30,0),
+d(1981,2,28,16,30,0),
+d(1981,10,24,16,30,0),
+d(1982,4,3,16,30,0),
+d(1982,10,30,16,30,0),
+d(1983,3,5,16,30,0),
+d(1983,10,29,16,30,0),
+d(1984,3,3,16,30,0),
+d(1984,10,27,16,30,0),
+d(1985,3,2,16,30,0),
+d(1985,10,26,16,30,0),
+d(1986,3,15,16,30,0),
+d(1986,10,18,16,30,0),
+d(1987,3,14,16,30,0),
+d(1987,10,24,16,30,0),
+d(1988,3,19,16,30,0),
+d(1988,10,29,16,30,0),
+d(1989,3,18,16,30,0),
+d(1989,10,28,16,30,0),
+d(1990,3,3,16,30,0),
+d(1990,10,27,16,30,0),
+d(1991,3,2,16,30,0),
+d(1991,10,26,16,30,0),
+d(1992,2,29,16,30,0),
+d(1992,10,24,16,30,0),
+d(1993,3,6,16,30,0),
+d(1993,10,30,16,30,0),
+d(1994,3,5,16,30,0),
+d(1994,10,29,16,30,0),
+d(1995,3,4,16,30,0),
+d(1995,10,28,16,30,0),
+d(1996,3,30,16,30,0),
+d(1996,10,26,16,30,0),
+d(1997,3,29,16,30,0),
+d(1997,10,25,16,30,0),
+d(1998,3,28,16,30,0),
+d(1998,10,24,16,30,0),
+d(1999,3,27,16,30,0),
+d(1999,10,30,16,30,0),
+d(1999,12,31,13,30,0),
+d(2000,3,25,16,30,0),
+d(2000,10,28,16,30,0),
+d(2001,3,24,16,30,0),
+d(2001,10,27,16,30,0),
+d(2002,3,30,16,30,0),
+d(2002,10,26,16,30,0),
+d(2003,3,29,16,30,0),
+d(2003,10,25,16,30,0),
+d(2004,3,27,16,30,0),
+d(2004,10,30,16,30,0),
+d(2005,3,26,16,30,0),
+d(2005,10,29,16,30,0),
+d(2006,4,1,16,30,0),
+d(2006,10,28,16,30,0),
+d(2007,3,24,16,30,0),
+d(2007,10,27,16,30,0),
+d(2008,3,29,16,30,0),
+d(2008,10,25,16,30,0),
+d(2009,3,28,16,30,0),
+d(2009,10,24,16,30,0),
+d(2010,3,27,16,30,0),
+d(2010,10,30,16,30,0),
+d(2011,3,26,16,30,0),
+d(2011,10,29,16,30,0),
+d(2012,3,24,16,30,0),
+d(2012,10,27,16,30,0),
+d(2013,3,30,16,30,0),
+d(2013,10,26,16,30,0),
+d(2014,3,29,16,30,0),
+d(2014,10,25,16,30,0),
+d(2015,3,28,16,30,0),
+d(2015,10,24,16,30,0),
+d(2016,3,26,16,30,0),
+d(2016,10,29,16,30,0),
+d(2017,3,25,16,30,0),
+d(2017,10,28,16,30,0),
+d(2018,3,24,16,30,0),
+d(2018,10,27,16,30,0),
+d(2019,3,30,16,30,0),
+d(2019,10,26,16,30,0),
+d(2020,3,28,16,30,0),
+d(2020,10,24,16,30,0),
+d(2021,3,27,16,30,0),
+d(2021,10,30,16,30,0),
+d(2022,3,26,16,30,0),
+d(2022,10,29,16,30,0),
+d(2023,3,25,16,30,0),
+d(2023,10,28,16,30,0),
+d(2024,3,30,16,30,0),
+d(2024,10,26,16,30,0),
+d(2025,3,29,16,30,0),
+d(2025,10,25,16,30,0),
+d(2026,3,28,16,30,0),
+d(2026,10,24,16,30,0),
+d(2027,3,27,16,30,0),
+d(2027,10,30,16,30,0),
+d(2028,3,25,16,30,0),
+d(2028,10,28,16,30,0),
+d(2029,3,24,16,30,0),
+d(2029,10,27,16,30,0),
+d(2030,3,30,16,30,0),
+d(2030,10,26,16,30,0),
+d(2031,3,29,16,30,0),
+d(2031,10,25,16,30,0),
+d(2032,3,27,16,30,0),
+d(2032,10,30,16,30,0),
+d(2033,3,26,16,30,0),
+d(2033,10,29,16,30,0),
+d(2034,3,25,16,30,0),
+d(2034,10,28,16,30,0),
+d(2035,3,24,16,30,0),
+d(2035,10,27,16,30,0),
+d(2036,3,29,16,30,0),
+d(2036,10,25,16,30,0),
+d(2037,3,28,16,30,0),
+d(2037,10,24,16,30,0),
+        ]
+
+    _transition_info = [
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+i(34200,0,'CST'),
+i(37800,3600,'CST'),
+        ]
+
+Yancowinna = Yancowinna()
+
diff --git a/lib/pytz/zoneinfo/Australia/__init__.py b/lib/pytz/zoneinfo/Australia/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Brazil/Acre.py b/lib/pytz/zoneinfo/Brazil/Acre.py
new file mode 100755
index 0000000..e1f86e9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Brazil/Acre.py
@@ -0,0 +1,78 @@
+'''tzinfo timezone information for Brazil/Acre.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Acre(DstTzInfo):
+    '''Brazil/Acre timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Brazil/Acre'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,4,31,12),
+d(1931,10,3,16,0,0),
+d(1932,4,1,4,0,0),
+d(1932,10,3,5,0,0),
+d(1933,4,1,4,0,0),
+d(1949,12,1,5,0,0),
+d(1950,4,16,5,0,0),
+d(1950,12,1,5,0,0),
+d(1951,4,1,4,0,0),
+d(1951,12,1,5,0,0),
+d(1952,4,1,4,0,0),
+d(1952,12,1,5,0,0),
+d(1953,3,1,4,0,0),
+d(1963,12,9,5,0,0),
+d(1964,3,1,4,0,0),
+d(1965,1,31,5,0,0),
+d(1965,3,31,4,0,0),
+d(1965,12,1,5,0,0),
+d(1966,3,1,4,0,0),
+d(1966,11,1,5,0,0),
+d(1967,3,1,4,0,0),
+d(1967,11,1,5,0,0),
+d(1968,3,1,4,0,0),
+d(1985,11,2,5,0,0),
+d(1986,3,15,4,0,0),
+d(1986,10,25,5,0,0),
+d(1987,2,14,4,0,0),
+d(1987,10,25,5,0,0),
+d(1988,2,7,4,0,0),
+        ]
+
+    _transition_info = [
+i(-16260,0,'LMT'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+i(-14400,3600,'ACST'),
+i(-18000,0,'ACT'),
+        ]
+
+Acre = Acre()
+
diff --git a/lib/pytz/zoneinfo/Brazil/DeNoronha.py b/lib/pytz/zoneinfo/Brazil/DeNoronha.py
new file mode 100755
index 0000000..240aac5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Brazil/DeNoronha.py
@@ -0,0 +1,98 @@
+'''tzinfo timezone information for Brazil/DeNoronha.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class DeNoronha(DstTzInfo):
+    '''Brazil/DeNoronha timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Brazil/DeNoronha'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,2,9,40),
+d(1931,10,3,13,0,0),
+d(1932,4,1,1,0,0),
+d(1932,10,3,2,0,0),
+d(1933,4,1,1,0,0),
+d(1949,12,1,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,12,1,2,0,0),
+d(1951,4,1,1,0,0),
+d(1951,12,1,2,0,0),
+d(1952,4,1,1,0,0),
+d(1952,12,1,2,0,0),
+d(1953,3,1,1,0,0),
+d(1963,12,9,2,0,0),
+d(1964,3,1,1,0,0),
+d(1965,1,31,2,0,0),
+d(1965,3,31,1,0,0),
+d(1965,12,1,2,0,0),
+d(1966,3,1,1,0,0),
+d(1966,11,1,2,0,0),
+d(1967,3,1,1,0,0),
+d(1967,11,1,2,0,0),
+d(1968,3,1,1,0,0),
+d(1985,11,2,2,0,0),
+d(1986,3,15,1,0,0),
+d(1986,10,25,2,0,0),
+d(1987,2,14,1,0,0),
+d(1987,10,25,2,0,0),
+d(1988,2,7,1,0,0),
+d(1988,10,16,2,0,0),
+d(1989,1,29,1,0,0),
+d(1989,10,15,2,0,0),
+d(1990,2,11,1,0,0),
+d(1999,10,3,2,0,0),
+d(2000,2,27,1,0,0),
+d(2000,10,8,2,0,0),
+d(2000,10,15,1,0,0),
+d(2001,10,14,2,0,0),
+d(2002,2,17,1,0,0),
+        ]
+
+    _transition_info = [
+i(-7800,0,'LMT'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+i(-3600,3600,'FNST'),
+i(-7200,0,'FNT'),
+        ]
+
+DeNoronha = DeNoronha()
+
diff --git a/lib/pytz/zoneinfo/Brazil/East.py b/lib/pytz/zoneinfo/Brazil/East.py
new file mode 100755
index 0000000..0e0c712
--- /dev/null
+++ b/lib/pytz/zoneinfo/Brazil/East.py
@@ -0,0 +1,276 @@
+'''tzinfo timezone information for Brazil/East.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class East(DstTzInfo):
+    '''Brazil/East timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Brazil/East'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,3,6,28),
+d(1931,10,3,14,0,0),
+d(1932,4,1,2,0,0),
+d(1932,10,3,3,0,0),
+d(1933,4,1,2,0,0),
+d(1949,12,1,3,0,0),
+d(1950,4,16,3,0,0),
+d(1950,12,1,3,0,0),
+d(1951,4,1,2,0,0),
+d(1951,12,1,3,0,0),
+d(1952,4,1,2,0,0),
+d(1952,12,1,3,0,0),
+d(1953,3,1,2,0,0),
+d(1963,10,23,3,0,0),
+d(1964,3,1,2,0,0),
+d(1965,1,31,3,0,0),
+d(1965,3,31,2,0,0),
+d(1965,12,1,3,0,0),
+d(1966,3,1,2,0,0),
+d(1966,11,1,3,0,0),
+d(1967,3,1,2,0,0),
+d(1967,11,1,3,0,0),
+d(1968,3,1,2,0,0),
+d(1985,11,2,3,0,0),
+d(1986,3,15,2,0,0),
+d(1986,10,25,3,0,0),
+d(1987,2,14,2,0,0),
+d(1987,10,25,3,0,0),
+d(1988,2,7,2,0,0),
+d(1988,10,16,3,0,0),
+d(1989,1,29,2,0,0),
+d(1989,10,15,3,0,0),
+d(1990,2,11,2,0,0),
+d(1990,10,21,3,0,0),
+d(1991,2,17,2,0,0),
+d(1991,10,20,3,0,0),
+d(1992,2,9,2,0,0),
+d(1992,10,25,3,0,0),
+d(1993,1,31,2,0,0),
+d(1993,10,17,3,0,0),
+d(1994,2,20,2,0,0),
+d(1994,10,16,3,0,0),
+d(1995,2,19,2,0,0),
+d(1995,10,15,3,0,0),
+d(1996,2,11,2,0,0),
+d(1996,10,6,3,0,0),
+d(1997,2,16,2,0,0),
+d(1997,10,6,3,0,0),
+d(1998,3,1,2,0,0),
+d(1998,10,11,3,0,0),
+d(1999,2,21,2,0,0),
+d(1999,10,3,3,0,0),
+d(2000,2,27,2,0,0),
+d(2000,10,8,3,0,0),
+d(2001,2,18,2,0,0),
+d(2001,10,14,3,0,0),
+d(2002,2,17,2,0,0),
+d(2002,11,3,3,0,0),
+d(2003,2,16,2,0,0),
+d(2003,10,19,3,0,0),
+d(2004,2,15,2,0,0),
+d(2004,11,2,3,0,0),
+d(2005,2,20,2,0,0),
+d(2005,10,16,3,0,0),
+d(2006,2,19,2,0,0),
+d(2006,11,5,3,0,0),
+d(2007,2,25,2,0,0),
+d(2007,11,4,3,0,0),
+d(2008,2,24,2,0,0),
+d(2008,11,2,3,0,0),
+d(2009,2,22,2,0,0),
+d(2009,11,1,3,0,0),
+d(2010,2,28,2,0,0),
+d(2010,11,7,3,0,0),
+d(2011,2,27,2,0,0),
+d(2011,11,6,3,0,0),
+d(2012,2,26,2,0,0),
+d(2012,11,4,3,0,0),
+d(2013,2,24,2,0,0),
+d(2013,11,3,3,0,0),
+d(2014,2,23,2,0,0),
+d(2014,11,2,3,0,0),
+d(2015,2,22,2,0,0),
+d(2015,11,1,3,0,0),
+d(2016,2,28,2,0,0),
+d(2016,11,6,3,0,0),
+d(2017,2,26,2,0,0),
+d(2017,11,5,3,0,0),
+d(2018,2,25,2,0,0),
+d(2018,11,4,3,0,0),
+d(2019,2,24,2,0,0),
+d(2019,11,3,3,0,0),
+d(2020,2,23,2,0,0),
+d(2020,11,1,3,0,0),
+d(2021,2,28,2,0,0),
+d(2021,11,7,3,0,0),
+d(2022,2,27,2,0,0),
+d(2022,11,6,3,0,0),
+d(2023,2,26,2,0,0),
+d(2023,11,5,3,0,0),
+d(2024,2,25,2,0,0),
+d(2024,11,3,3,0,0),
+d(2025,2,23,2,0,0),
+d(2025,11,2,3,0,0),
+d(2026,2,22,2,0,0),
+d(2026,11,1,3,0,0),
+d(2027,2,28,2,0,0),
+d(2027,11,7,3,0,0),
+d(2028,2,27,2,0,0),
+d(2028,11,5,3,0,0),
+d(2029,2,25,2,0,0),
+d(2029,11,4,3,0,0),
+d(2030,2,24,2,0,0),
+d(2030,11,3,3,0,0),
+d(2031,2,23,2,0,0),
+d(2031,11,2,3,0,0),
+d(2032,2,29,2,0,0),
+d(2032,11,7,3,0,0),
+d(2033,2,27,2,0,0),
+d(2033,11,6,3,0,0),
+d(2034,2,26,2,0,0),
+d(2034,11,5,3,0,0),
+d(2035,2,25,2,0,0),
+d(2035,11,4,3,0,0),
+d(2036,2,24,2,0,0),
+d(2036,11,2,3,0,0),
+d(2037,2,22,2,0,0),
+d(2037,11,1,3,0,0),
+        ]
+
+    _transition_info = [
+i(-11160,0,'LMT'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+i(-10800,0,'BRT'),
+i(-7200,3600,'BRST'),
+        ]
+
+East = East()
+
diff --git a/lib/pytz/zoneinfo/Brazil/West.py b/lib/pytz/zoneinfo/Brazil/West.py
new file mode 100755
index 0000000..b18d931
--- /dev/null
+++ b/lib/pytz/zoneinfo/Brazil/West.py
@@ -0,0 +1,82 @@
+'''tzinfo timezone information for Brazil/West.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class West(DstTzInfo):
+    '''Brazil/West timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Brazil/West'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,1,1,4,0,4),
+d(1931,10,3,15,0,0),
+d(1932,4,1,3,0,0),
+d(1932,10,3,4,0,0),
+d(1933,4,1,3,0,0),
+d(1949,12,1,4,0,0),
+d(1950,4,16,4,0,0),
+d(1950,12,1,4,0,0),
+d(1951,4,1,3,0,0),
+d(1951,12,1,4,0,0),
+d(1952,4,1,3,0,0),
+d(1952,12,1,4,0,0),
+d(1953,3,1,3,0,0),
+d(1963,12,9,4,0,0),
+d(1964,3,1,3,0,0),
+d(1965,1,31,4,0,0),
+d(1965,3,31,3,0,0),
+d(1965,12,1,4,0,0),
+d(1966,3,1,3,0,0),
+d(1966,11,1,4,0,0),
+d(1967,3,1,3,0,0),
+d(1967,11,1,4,0,0),
+d(1968,3,1,3,0,0),
+d(1985,11,2,4,0,0),
+d(1986,3,15,3,0,0),
+d(1986,10,25,4,0,0),
+d(1987,2,14,3,0,0),
+d(1987,10,25,4,0,0),
+d(1988,2,7,3,0,0),
+d(1993,10,17,4,0,0),
+d(1994,2,20,3,0,0),
+        ]
+
+    _transition_info = [
+i(-14400,0,'LMT'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+i(-10800,3600,'AMST'),
+i(-14400,0,'AMT'),
+        ]
+
+West = West()
+
diff --git a/lib/pytz/zoneinfo/Brazil/__init__.py b/lib/pytz/zoneinfo/Brazil/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/CET.py b/lib/pytz/zoneinfo/CET.py
new file mode 100755
index 0000000..939f09e
--- /dev/null
+++ b/lib/pytz/zoneinfo/CET.py
@@ -0,0 +1,288 @@
+'''tzinfo timezone information for CET.'''
+from lib.pytz.tzinfo import DstTzInfo
+from lib.pytz.tzinfo import memorized_datetime as d
+from lib.pytz.tzinfo import memorized_ttinfo as i
+
+class CET(DstTzInfo):
+    '''CET timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'CET'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1940,4,1,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+CET = CET()
+
diff --git a/lib/pytz/zoneinfo/CST6CDT.py b/lib/pytz/zoneinfo/CST6CDT.py
new file mode 100755
index 0000000..ba53cff
--- /dev/null
+++ b/lib/pytz/zoneinfo/CST6CDT.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for CST6CDT.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class CST6CDT(DstTzInfo):
+    '''CST6CDT timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'CST6CDT'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,7,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,7,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,7,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,7,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,7,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,7,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,7,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,7,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,7,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+CST6CDT = CST6CDT()
+
diff --git a/lib/pytz/zoneinfo/Canada/Atlantic.py b/lib/pytz/zoneinfo/Canada/Atlantic.py
new file mode 100755
index 0000000..22c41c5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/Atlantic.py
@@ -0,0 +1,476 @@
+'''tzinfo timezone information for Canada/Atlantic.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Atlantic(DstTzInfo):
+    '''Canada/Atlantic timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/Atlantic'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1902,6,15,4,14,24),
+d(1916,4,1,4,0,0),
+d(1916,10,1,3,0,0),
+d(1918,4,14,6,0,0),
+d(1918,10,31,5,0,0),
+d(1920,5,9,4,0,0),
+d(1920,8,29,3,0,0),
+d(1921,5,6,4,0,0),
+d(1921,9,5,3,0,0),
+d(1922,4,30,4,0,0),
+d(1922,9,5,3,0,0),
+d(1923,5,6,4,0,0),
+d(1923,9,4,3,0,0),
+d(1924,5,4,4,0,0),
+d(1924,9,15,3,0,0),
+d(1925,5,3,4,0,0),
+d(1925,9,28,3,0,0),
+d(1926,5,16,4,0,0),
+d(1926,9,13,3,0,0),
+d(1927,5,1,4,0,0),
+d(1927,9,26,3,0,0),
+d(1928,5,13,4,0,0),
+d(1928,9,9,3,0,0),
+d(1929,5,12,4,0,0),
+d(1929,9,3,3,0,0),
+d(1930,5,11,4,0,0),
+d(1930,9,15,3,0,0),
+d(1931,5,10,4,0,0),
+d(1931,9,28,3,0,0),
+d(1932,5,1,4,0,0),
+d(1932,9,26,3,0,0),
+d(1933,4,30,4,0,0),
+d(1933,10,2,3,0,0),
+d(1934,5,20,4,0,0),
+d(1934,9,16,3,0,0),
+d(1935,6,2,4,0,0),
+d(1935,9,30,3,0,0),
+d(1936,6,1,4,0,0),
+d(1936,9,14,3,0,0),
+d(1937,5,2,4,0,0),
+d(1937,9,27,3,0,0),
+d(1938,5,1,4,0,0),
+d(1938,9,26,3,0,0),
+d(1939,5,28,4,0,0),
+d(1939,9,25,3,0,0),
+d(1940,5,5,4,0,0),
+d(1940,9,30,3,0,0),
+d(1941,5,4,4,0,0),
+d(1941,9,29,3,0,0),
+d(1942,2,9,6,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,5,0,0),
+d(1946,4,28,6,0,0),
+d(1946,9,29,5,0,0),
+d(1947,4,27,6,0,0),
+d(1947,9,28,5,0,0),
+d(1948,4,25,6,0,0),
+d(1948,9,26,5,0,0),
+d(1949,4,24,6,0,0),
+d(1949,9,25,5,0,0),
+d(1951,4,29,6,0,0),
+d(1951,9,30,5,0,0),
+d(1952,4,27,6,0,0),
+d(1952,9,28,5,0,0),
+d(1953,4,26,6,0,0),
+d(1953,9,27,5,0,0),
+d(1954,4,25,6,0,0),
+d(1954,9,26,5,0,0),
+d(1956,4,29,6,0,0),
+d(1956,9,30,5,0,0),
+d(1957,4,28,6,0,0),
+d(1957,9,29,5,0,0),
+d(1958,4,27,6,0,0),
+d(1958,9,28,5,0,0),
+d(1959,4,26,6,0,0),
+d(1959,9,27,5,0,0),
+d(1962,4,29,6,0,0),
+d(1962,10,28,5,0,0),
+d(1963,4,28,6,0,0),
+d(1963,10,27,5,0,0),
+d(1964,4,26,6,0,0),
+d(1964,10,25,5,0,0),
+d(1965,4,25,6,0,0),
+d(1965,10,31,5,0,0),
+d(1966,4,24,6,0,0),
+d(1966,10,30,5,0,0),
+d(1967,4,30,6,0,0),
+d(1967,10,29,5,0,0),
+d(1968,4,28,6,0,0),
+d(1968,10,27,5,0,0),
+d(1969,4,27,6,0,0),
+d(1969,10,26,5,0,0),
+d(1970,4,26,6,0,0),
+d(1970,10,25,5,0,0),
+d(1971,4,25,6,0,0),
+d(1971,10,31,5,0,0),
+d(1972,4,30,6,0,0),
+d(1972,10,29,5,0,0),
+d(1973,4,29,6,0,0),
+d(1973,10,28,5,0,0),
+d(1974,4,28,6,0,0),
+d(1974,10,27,5,0,0),
+d(1975,4,27,6,0,0),
+d(1975,10,26,5,0,0),
+d(1976,4,25,6,0,0),
+d(1976,10,31,5,0,0),
+d(1977,4,24,6,0,0),
+d(1977,10,30,5,0,0),
+d(1978,4,30,6,0,0),
+d(1978,10,29,5,0,0),
+d(1979,4,29,6,0,0),
+d(1979,10,28,5,0,0),
+d(1980,4,27,6,0,0),
+d(1980,10,26,5,0,0),
+d(1981,4,26,6,0,0),
+d(1981,10,25,5,0,0),
+d(1982,4,25,6,0,0),
+d(1982,10,31,5,0,0),
+d(1983,4,24,6,0,0),
+d(1983,10,30,5,0,0),
+d(1984,4,29,6,0,0),
+d(1984,10,28,5,0,0),
+d(1985,4,28,6,0,0),
+d(1985,10,27,5,0,0),
+d(1986,4,27,6,0,0),
+d(1986,10,26,5,0,0),
+d(1987,4,5,6,0,0),
+d(1987,10,25,5,0,0),
+d(1988,4,3,6,0,0),
+d(1988,10,30,5,0,0),
+d(1989,4,2,6,0,0),
+d(1989,10,29,5,0,0),
+d(1990,4,1,6,0,0),
+d(1990,10,28,5,0,0),
+d(1991,4,7,6,0,0),
+d(1991,10,27,5,0,0),
+d(1992,4,5,6,0,0),
+d(1992,10,25,5,0,0),
+d(1993,4,4,6,0,0),
+d(1993,10,31,5,0,0),
+d(1994,4,3,6,0,0),
+d(1994,10,30,5,0,0),
+d(1995,4,2,6,0,0),
+d(1995,10,29,5,0,0),
+d(1996,4,7,6,0,0),
+d(1996,10,27,5,0,0),
+d(1997,4,6,6,0,0),
+d(1997,10,26,5,0,0),
+d(1998,4,5,6,0,0),
+d(1998,10,25,5,0,0),
+d(1999,4,4,6,0,0),
+d(1999,10,31,5,0,0),
+d(2000,4,2,6,0,0),
+d(2000,10,29,5,0,0),
+d(2001,4,1,6,0,0),
+d(2001,10,28,5,0,0),
+d(2002,4,7,6,0,0),
+d(2002,10,27,5,0,0),
+d(2003,4,6,6,0,0),
+d(2003,10,26,5,0,0),
+d(2004,4,4,6,0,0),
+d(2004,10,31,5,0,0),
+d(2005,4,3,6,0,0),
+d(2005,10,30,5,0,0),
+d(2006,4,2,6,0,0),
+d(2006,10,29,5,0,0),
+d(2007,3,11,6,0,0),
+d(2007,11,4,5,0,0),
+d(2008,3,9,6,0,0),
+d(2008,11,2,5,0,0),
+d(2009,3,8,6,0,0),
+d(2009,11,1,5,0,0),
+d(2010,3,14,6,0,0),
+d(2010,11,7,5,0,0),
+d(2011,3,13,6,0,0),
+d(2011,11,6,5,0,0),
+d(2012,3,11,6,0,0),
+d(2012,11,4,5,0,0),
+d(2013,3,10,6,0,0),
+d(2013,11,3,5,0,0),
+d(2014,3,9,6,0,0),
+d(2014,11,2,5,0,0),
+d(2015,3,8,6,0,0),
+d(2015,11,1,5,0,0),
+d(2016,3,13,6,0,0),
+d(2016,11,6,5,0,0),
+d(2017,3,12,6,0,0),
+d(2017,11,5,5,0,0),
+d(2018,3,11,6,0,0),
+d(2018,11,4,5,0,0),
+d(2019,3,10,6,0,0),
+d(2019,11,3,5,0,0),
+d(2020,3,8,6,0,0),
+d(2020,11,1,5,0,0),
+d(2021,3,14,6,0,0),
+d(2021,11,7,5,0,0),
+d(2022,3,13,6,0,0),
+d(2022,11,6,5,0,0),
+d(2023,3,12,6,0,0),
+d(2023,11,5,5,0,0),
+d(2024,3,10,6,0,0),
+d(2024,11,3,5,0,0),
+d(2025,3,9,6,0,0),
+d(2025,11,2,5,0,0),
+d(2026,3,8,6,0,0),
+d(2026,11,1,5,0,0),
+d(2027,3,14,6,0,0),
+d(2027,11,7,5,0,0),
+d(2028,3,12,6,0,0),
+d(2028,11,5,5,0,0),
+d(2029,3,11,6,0,0),
+d(2029,11,4,5,0,0),
+d(2030,3,10,6,0,0),
+d(2030,11,3,5,0,0),
+d(2031,3,9,6,0,0),
+d(2031,11,2,5,0,0),
+d(2032,3,14,6,0,0),
+d(2032,11,7,5,0,0),
+d(2033,3,13,6,0,0),
+d(2033,11,6,5,0,0),
+d(2034,3,12,6,0,0),
+d(2034,11,5,5,0,0),
+d(2035,3,11,6,0,0),
+d(2035,11,4,5,0,0),
+d(2036,3,9,6,0,0),
+d(2036,11,2,5,0,0),
+d(2037,3,8,6,0,0),
+d(2037,11,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-15240,0,'LMT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'AWT'),
+i(-10800,3600,'APT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+i(-10800,3600,'ADT'),
+i(-14400,0,'AST'),
+        ]
+
+Atlantic = Atlantic()
+
diff --git a/lib/pytz/zoneinfo/Canada/Central.py b/lib/pytz/zoneinfo/Canada/Central.py
new file mode 100755
index 0000000..f268839
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/Central.py
@@ -0,0 +1,392 @@
+'''tzinfo timezone information for Canada/Central.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Central(DstTzInfo):
+    '''Canada/Central timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/Central'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,23,6,0,0),
+d(1916,9,17,5,0,0),
+d(1918,4,14,8,0,0),
+d(1918,10,31,7,0,0),
+d(1937,5,16,8,0,0),
+d(1937,9,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,5,12,8,0,0),
+d(1946,10,13,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,5,1,8,0,0),
+d(1950,9,30,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,9,25,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,9,30,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,9,28,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,9,25,7,0,0),
+d(1963,4,28,8,0,0),
+d(1963,9,22,7,0,0),
+d(1966,4,24,8,0,0),
+d(1966,10,30,8,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,8,0,0),
+d(1974,4,28,8,0,0),
+d(1974,10,27,8,0,0),
+d(1975,4,27,8,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,8,0,0),
+d(2006,1,1,6,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Central = Central()
+
diff --git a/lib/pytz/zoneinfo/Canada/East_minus_Saskatchewan.py b/lib/pytz/zoneinfo/Canada/East_minus_Saskatchewan.py
new file mode 100755
index 0000000..950907d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/East_minus_Saskatchewan.py
@@ -0,0 +1,126 @@
+'''tzinfo timezone information for Canada/East_minus_Saskatchewan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class East_minus_Saskatchewan(DstTzInfo):
+    '''Canada/East_minus_Saskatchewan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/East_minus_Saskatchewan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,9,1,6,58,36),
+d(1918,4,14,9,0,0),
+d(1918,10,31,8,0,0),
+d(1930,5,4,7,0,0),
+d(1930,10,5,6,0,0),
+d(1931,5,3,7,0,0),
+d(1931,10,4,6,0,0),
+d(1932,5,1,7,0,0),
+d(1932,10,2,6,0,0),
+d(1933,5,7,7,0,0),
+d(1933,10,1,6,0,0),
+d(1934,5,6,7,0,0),
+d(1934,10,7,6,0,0),
+d(1937,4,11,7,0,0),
+d(1937,10,10,6,0,0),
+d(1938,4,10,7,0,0),
+d(1938,10,2,6,0,0),
+d(1939,4,9,7,0,0),
+d(1939,10,8,6,0,0),
+d(1940,4,14,7,0,0),
+d(1940,10,13,6,0,0),
+d(1941,4,13,7,0,0),
+d(1941,10,12,6,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1946,4,14,9,0,0),
+d(1946,10,13,8,0,0),
+d(1947,4,27,9,0,0),
+d(1947,9,28,8,0,0),
+d(1948,4,25,9,0,0),
+d(1948,9,26,8,0,0),
+d(1949,4,24,9,0,0),
+d(1949,9,25,8,0,0),
+d(1950,4,30,9,0,0),
+d(1950,9,24,8,0,0),
+d(1951,4,29,9,0,0),
+d(1951,9,30,8,0,0),
+d(1952,4,27,9,0,0),
+d(1952,9,28,8,0,0),
+d(1953,4,26,9,0,0),
+d(1953,9,27,8,0,0),
+d(1954,4,25,9,0,0),
+d(1954,9,26,8,0,0),
+d(1955,4,24,9,0,0),
+d(1955,9,25,8,0,0),
+d(1956,4,29,9,0,0),
+d(1956,9,30,8,0,0),
+d(1957,4,28,9,0,0),
+d(1957,9,29,8,0,0),
+d(1959,4,26,9,0,0),
+d(1959,10,25,8,0,0),
+d(1960,4,24,9,0,0),
+        ]
+
+    _transition_info = [
+i(-25140,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+        ]
+
+East_minus_Saskatchewan = East_minus_Saskatchewan()
+
diff --git a/lib/pytz/zoneinfo/Canada/Eastern.py b/lib/pytz/zoneinfo/Canada/Eastern.py
new file mode 100755
index 0000000..4c30c5f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/Eastern.py
@@ -0,0 +1,484 @@
+'''tzinfo timezone information for Canada/Eastern.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Eastern(DstTzInfo):
+    '''Canada/Eastern timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/Eastern'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,7,0,0),
+d(1918,10,31,6,0,0),
+d(1919,3,31,4,30,0),
+d(1919,10,26,4,0,0),
+d(1920,5,2,7,0,0),
+d(1920,9,26,4,0,0),
+d(1921,5,15,7,0,0),
+d(1921,9,15,6,0,0),
+d(1922,5,14,7,0,0),
+d(1922,9,17,6,0,0),
+d(1923,5,13,7,0,0),
+d(1923,9,16,6,0,0),
+d(1924,5,4,7,0,0),
+d(1924,9,21,6,0,0),
+d(1925,5,3,7,0,0),
+d(1925,9,20,6,0,0),
+d(1926,5,2,7,0,0),
+d(1926,9,19,6,0,0),
+d(1927,5,1,7,0,0),
+d(1927,9,25,6,0,0),
+d(1928,4,29,7,0,0),
+d(1928,9,30,6,0,0),
+d(1929,4,28,7,0,0),
+d(1929,9,29,6,0,0),
+d(1930,4,27,7,0,0),
+d(1930,9,28,6,0,0),
+d(1931,4,26,7,0,0),
+d(1931,9,27,6,0,0),
+d(1932,5,1,7,0,0),
+d(1932,9,25,6,0,0),
+d(1933,4,30,7,0,0),
+d(1933,10,1,6,0,0),
+d(1934,4,29,7,0,0),
+d(1934,9,30,6,0,0),
+d(1935,4,28,7,0,0),
+d(1935,9,29,6,0,0),
+d(1936,4,26,7,0,0),
+d(1936,9,27,6,0,0),
+d(1937,4,25,7,0,0),
+d(1937,9,26,6,0,0),
+d(1938,4,24,7,0,0),
+d(1938,9,25,6,0,0),
+d(1939,4,30,7,0,0),
+d(1939,9,24,6,0,0),
+d(1940,4,28,7,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1946,4,28,7,0,0),
+d(1946,9,29,6,0,0),
+d(1947,4,27,5,0,0),
+d(1947,9,28,4,0,0),
+d(1948,4,25,5,0,0),
+d(1948,9,26,4,0,0),
+d(1949,4,24,5,0,0),
+d(1949,11,27,4,0,0),
+d(1950,4,30,7,0,0),
+d(1950,11,26,6,0,0),
+d(1951,4,29,7,0,0),
+d(1951,9,30,6,0,0),
+d(1952,4,27,7,0,0),
+d(1952,9,28,6,0,0),
+d(1953,4,26,7,0,0),
+d(1953,9,27,6,0,0),
+d(1954,4,25,7,0,0),
+d(1954,9,26,6,0,0),
+d(1955,4,24,7,0,0),
+d(1955,9,25,6,0,0),
+d(1956,4,29,7,0,0),
+d(1956,9,30,6,0,0),
+d(1957,4,28,7,0,0),
+d(1957,10,27,6,0,0),
+d(1958,4,27,7,0,0),
+d(1958,10,26,6,0,0),
+d(1959,4,26,7,0,0),
+d(1959,10,25,6,0,0),
+d(1960,4,24,7,0,0),
+d(1960,10,30,6,0,0),
+d(1961,4,30,7,0,0),
+d(1961,10,29,6,0,0),
+d(1962,4,29,7,0,0),
+d(1962,10,28,6,0,0),
+d(1963,4,28,7,0,0),
+d(1963,10,27,6,0,0),
+d(1964,4,26,7,0,0),
+d(1964,10,25,6,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,6,0,0),
+d(1966,4,24,7,0,0),
+d(1966,10,30,6,0,0),
+d(1967,4,30,7,0,0),
+d(1967,10,29,6,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,4,28,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,4,27,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Eastern = Eastern()
+
diff --git a/lib/pytz/zoneinfo/Canada/Mountain.py b/lib/pytz/zoneinfo/Canada/Mountain.py
new file mode 100755
index 0000000..91afe38
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/Mountain.py
@@ -0,0 +1,328 @@
+'''tzinfo timezone information for Canada/Mountain.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mountain(DstTzInfo):
+    '''Canada/Mountain timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/Mountain'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,9,1,7,33,52),
+d(1918,4,14,9,0,0),
+d(1918,10,31,8,0,0),
+d(1919,4,13,9,0,0),
+d(1919,5,27,8,0,0),
+d(1920,4,25,9,0,0),
+d(1920,10,31,8,0,0),
+d(1921,4,24,9,0,0),
+d(1921,9,25,8,0,0),
+d(1922,4,30,9,0,0),
+d(1922,9,24,8,0,0),
+d(1923,4,29,9,0,0),
+d(1923,9,30,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1947,4,27,9,0,0),
+d(1947,9,28,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,4,28,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,4,27,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-27240,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Mountain = Mountain()
+
diff --git a/lib/pytz/zoneinfo/Canada/Newfoundland.py b/lib/pytz/zoneinfo/Canada/Newfoundland.py
new file mode 100755
index 0000000..2829f60
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/Newfoundland.py
@@ -0,0 +1,496 @@
+'''tzinfo timezone information for Canada/Newfoundland.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Newfoundland(DstTzInfo):
+    '''Canada/Newfoundland timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/Newfoundland'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,4,8,5,30,52),
+d(1917,9,17,4,30,52),
+d(1918,4,14,5,30,52),
+d(1918,10,31,4,30,52),
+d(1919,5,6,2,30,52),
+d(1919,8,13,1,30,52),
+d(1920,5,3,2,30,52),
+d(1920,11,1,1,30,52),
+d(1921,5,2,2,30,52),
+d(1921,10,31,1,30,52),
+d(1922,5,8,2,30,52),
+d(1922,10,30,1,30,52),
+d(1923,5,7,2,30,52),
+d(1923,10,29,1,30,52),
+d(1924,5,5,2,30,52),
+d(1924,10,27,1,30,52),
+d(1925,5,4,2,30,52),
+d(1925,10,26,1,30,52),
+d(1926,5,3,2,30,52),
+d(1926,11,1,1,30,52),
+d(1927,5,2,2,30,52),
+d(1927,10,31,1,30,52),
+d(1928,5,7,2,30,52),
+d(1928,10,29,1,30,52),
+d(1929,5,6,2,30,52),
+d(1929,10,28,1,30,52),
+d(1930,5,5,2,30,52),
+d(1930,10,27,1,30,52),
+d(1931,5,4,2,30,52),
+d(1931,10,26,1,30,52),
+d(1932,5,2,2,30,52),
+d(1932,10,31,1,30,52),
+d(1933,5,8,2,30,52),
+d(1933,10,30,1,30,52),
+d(1934,5,7,2,30,52),
+d(1934,10,29,1,30,52),
+d(1935,3,30,3,30,52),
+d(1935,5,6,2,30,0),
+d(1935,10,28,1,30,0),
+d(1936,5,11,3,30,0),
+d(1936,10,5,2,30,0),
+d(1937,5,10,3,30,0),
+d(1937,10,4,2,30,0),
+d(1938,5,9,3,30,0),
+d(1938,10,3,2,30,0),
+d(1939,5,15,3,30,0),
+d(1939,10,2,2,30,0),
+d(1940,5,13,3,30,0),
+d(1940,10,7,2,30,0),
+d(1941,5,12,3,30,0),
+d(1941,10,6,2,30,0),
+d(1942,5,11,3,30,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,4,30,0),
+d(1946,5,12,5,30,0),
+d(1946,10,6,4,30,0),
+d(1947,5,11,5,30,0),
+d(1947,10,5,4,30,0),
+d(1948,5,9,5,30,0),
+d(1948,10,3,4,30,0),
+d(1949,5,8,5,30,0),
+d(1949,10,2,4,30,0),
+d(1950,5,14,5,30,0),
+d(1950,10,8,4,30,0),
+d(1951,4,29,5,30,0),
+d(1951,9,30,4,30,0),
+d(1952,4,27,5,30,0),
+d(1952,9,28,4,30,0),
+d(1953,4,26,5,30,0),
+d(1953,9,27,4,30,0),
+d(1954,4,25,5,30,0),
+d(1954,9,26,4,30,0),
+d(1955,4,24,5,30,0),
+d(1955,9,25,4,30,0),
+d(1956,4,29,5,30,0),
+d(1956,9,30,4,30,0),
+d(1957,4,28,5,30,0),
+d(1957,9,29,4,30,0),
+d(1958,4,27,5,30,0),
+d(1958,9,28,4,30,0),
+d(1959,4,26,5,30,0),
+d(1959,9,27,4,30,0),
+d(1960,4,24,5,30,0),
+d(1960,10,30,4,30,0),
+d(1961,4,30,5,30,0),
+d(1961,10,29,4,30,0),
+d(1962,4,29,5,30,0),
+d(1962,10,28,4,30,0),
+d(1963,4,28,5,30,0),
+d(1963,10,27,4,30,0),
+d(1964,4,26,5,30,0),
+d(1964,10,25,4,30,0),
+d(1965,4,25,5,30,0),
+d(1965,10,31,4,30,0),
+d(1966,4,24,5,30,0),
+d(1966,10,30,4,30,0),
+d(1967,4,30,5,30,0),
+d(1967,10,29,4,30,0),
+d(1968,4,28,5,30,0),
+d(1968,10,27,4,30,0),
+d(1969,4,27,5,30,0),
+d(1969,10,26,4,30,0),
+d(1970,4,26,5,30,0),
+d(1970,10,25,4,30,0),
+d(1971,4,25,5,30,0),
+d(1971,10,31,4,30,0),
+d(1972,4,30,5,30,0),
+d(1972,10,29,4,30,0),
+d(1973,4,29,5,30,0),
+d(1973,10,28,4,30,0),
+d(1974,4,28,5,30,0),
+d(1974,10,27,4,30,0),
+d(1975,4,27,5,30,0),
+d(1975,10,26,4,30,0),
+d(1976,4,25,5,30,0),
+d(1976,10,31,4,30,0),
+d(1977,4,24,5,30,0),
+d(1977,10,30,4,30,0),
+d(1978,4,30,5,30,0),
+d(1978,10,29,4,30,0),
+d(1979,4,29,5,30,0),
+d(1979,10,28,4,30,0),
+d(1980,4,27,5,30,0),
+d(1980,10,26,4,30,0),
+d(1981,4,26,5,30,0),
+d(1981,10,25,4,30,0),
+d(1982,4,25,5,30,0),
+d(1982,10,31,4,30,0),
+d(1983,4,24,5,30,0),
+d(1983,10,30,4,30,0),
+d(1984,4,29,5,30,0),
+d(1984,10,28,4,30,0),
+d(1985,4,28,5,30,0),
+d(1985,10,27,4,30,0),
+d(1986,4,27,5,30,0),
+d(1986,10,26,4,30,0),
+d(1987,4,5,3,31,0),
+d(1987,10,25,2,31,0),
+d(1988,4,3,3,31,0),
+d(1988,10,30,1,31,0),
+d(1989,4,2,3,31,0),
+d(1989,10,29,2,31,0),
+d(1990,4,1,3,31,0),
+d(1990,10,28,2,31,0),
+d(1991,4,7,3,31,0),
+d(1991,10,27,2,31,0),
+d(1992,4,5,3,31,0),
+d(1992,10,25,2,31,0),
+d(1993,4,4,3,31,0),
+d(1993,10,31,2,31,0),
+d(1994,4,3,3,31,0),
+d(1994,10,30,2,31,0),
+d(1995,4,2,3,31,0),
+d(1995,10,29,2,31,0),
+d(1996,4,7,3,31,0),
+d(1996,10,27,2,31,0),
+d(1997,4,6,3,31,0),
+d(1997,10,26,2,31,0),
+d(1998,4,5,3,31,0),
+d(1998,10,25,2,31,0),
+d(1999,4,4,3,31,0),
+d(1999,10,31,2,31,0),
+d(2000,4,2,3,31,0),
+d(2000,10,29,2,31,0),
+d(2001,4,1,3,31,0),
+d(2001,10,28,2,31,0),
+d(2002,4,7,3,31,0),
+d(2002,10,27,2,31,0),
+d(2003,4,6,3,31,0),
+d(2003,10,26,2,31,0),
+d(2004,4,4,3,31,0),
+d(2004,10,31,2,31,0),
+d(2005,4,3,3,31,0),
+d(2005,10,30,2,31,0),
+d(2006,4,2,3,31,0),
+d(2006,10,29,2,31,0),
+d(2007,3,11,3,31,0),
+d(2007,11,4,2,31,0),
+d(2008,3,9,3,31,0),
+d(2008,11,2,2,31,0),
+d(2009,3,8,3,31,0),
+d(2009,11,1,2,31,0),
+d(2010,3,14,3,31,0),
+d(2010,11,7,2,31,0),
+d(2011,3,13,3,31,0),
+d(2011,11,6,2,31,0),
+d(2012,3,11,3,31,0),
+d(2012,11,4,2,31,0),
+d(2013,3,10,3,31,0),
+d(2013,11,3,2,31,0),
+d(2014,3,9,3,31,0),
+d(2014,11,2,2,31,0),
+d(2015,3,8,3,31,0),
+d(2015,11,1,2,31,0),
+d(2016,3,13,3,31,0),
+d(2016,11,6,2,31,0),
+d(2017,3,12,3,31,0),
+d(2017,11,5,2,31,0),
+d(2018,3,11,3,31,0),
+d(2018,11,4,2,31,0),
+d(2019,3,10,3,31,0),
+d(2019,11,3,2,31,0),
+d(2020,3,8,3,31,0),
+d(2020,11,1,2,31,0),
+d(2021,3,14,3,31,0),
+d(2021,11,7,2,31,0),
+d(2022,3,13,3,31,0),
+d(2022,11,6,2,31,0),
+d(2023,3,12,3,31,0),
+d(2023,11,5,2,31,0),
+d(2024,3,10,3,31,0),
+d(2024,11,3,2,31,0),
+d(2025,3,9,3,31,0),
+d(2025,11,2,2,31,0),
+d(2026,3,8,3,31,0),
+d(2026,11,1,2,31,0),
+d(2027,3,14,3,31,0),
+d(2027,11,7,2,31,0),
+d(2028,3,12,3,31,0),
+d(2028,11,5,2,31,0),
+d(2029,3,11,3,31,0),
+d(2029,11,4,2,31,0),
+d(2030,3,10,3,31,0),
+d(2030,11,3,2,31,0),
+d(2031,3,9,3,31,0),
+d(2031,11,2,2,31,0),
+d(2032,3,14,3,31,0),
+d(2032,11,7,2,31,0),
+d(2033,3,13,3,31,0),
+d(2033,11,6,2,31,0),
+d(2034,3,12,3,31,0),
+d(2034,11,5,2,31,0),
+d(2035,3,11,3,31,0),
+d(2035,11,4,2,31,0),
+d(2036,3,9,3,31,0),
+d(2036,11,2,2,31,0),
+d(2037,3,8,3,31,0),
+d(2037,11,1,2,31,0),
+        ]
+
+    _transition_info = [
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-9060,3600,'NDT'),
+i(-12660,0,'NST'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NWT'),
+i(-9000,3600,'NPT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-5400,7200,'NDDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+i(-9000,3600,'NDT'),
+i(-12600,0,'NST'),
+        ]
+
+Newfoundland = Newfoundland()
+
diff --git a/lib/pytz/zoneinfo/Canada/Pacific.py b/lib/pytz/zoneinfo/Canada/Pacific.py
new file mode 100755
index 0000000..1fd0d95
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/Pacific.py
@@ -0,0 +1,398 @@
+'''tzinfo timezone information for Canada/Pacific.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Pacific(DstTzInfo):
+    '''Canada/Pacific timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/Pacific'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,10,0,0),
+d(1918,10,31,9,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1946,4,28,10,0,0),
+d(1946,10,13,9,0,0),
+d(1947,4,27,10,0,0),
+d(1947,9,28,9,0,0),
+d(1948,4,25,10,0,0),
+d(1948,9,26,9,0,0),
+d(1949,4,24,10,0,0),
+d(1949,9,25,9,0,0),
+d(1950,4,30,10,0,0),
+d(1950,9,24,9,0,0),
+d(1951,4,29,10,0,0),
+d(1951,9,30,9,0,0),
+d(1952,4,27,10,0,0),
+d(1952,9,28,9,0,0),
+d(1953,4,26,10,0,0),
+d(1953,9,27,9,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1961,4,30,10,0,0),
+d(1961,9,24,9,0,0),
+d(1962,4,29,10,0,0),
+d(1962,10,28,9,0,0),
+d(1963,4,28,10,0,0),
+d(1963,10,27,9,0,0),
+d(1964,4,26,10,0,0),
+d(1964,10,25,9,0,0),
+d(1965,4,25,10,0,0),
+d(1965,10,31,9,0,0),
+d(1966,4,24,10,0,0),
+d(1966,10,30,9,0,0),
+d(1967,4,30,10,0,0),
+d(1967,10,29,9,0,0),
+d(1968,4,28,10,0,0),
+d(1968,10,27,9,0,0),
+d(1969,4,27,10,0,0),
+d(1969,10,26,9,0,0),
+d(1970,4,26,10,0,0),
+d(1970,10,25,9,0,0),
+d(1971,4,25,10,0,0),
+d(1971,10,31,9,0,0),
+d(1972,4,30,10,0,0),
+d(1972,10,29,9,0,0),
+d(1973,4,29,10,0,0),
+d(1973,10,28,9,0,0),
+d(1974,4,28,10,0,0),
+d(1974,10,27,9,0,0),
+d(1975,4,27,10,0,0),
+d(1975,10,26,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Pacific = Pacific()
+
diff --git a/lib/pytz/zoneinfo/Canada/Saskatchewan.py b/lib/pytz/zoneinfo/Canada/Saskatchewan.py
new file mode 100755
index 0000000..33c7cc0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/Saskatchewan.py
@@ -0,0 +1,126 @@
+'''tzinfo timezone information for Canada/Saskatchewan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Saskatchewan(DstTzInfo):
+    '''Canada/Saskatchewan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/Saskatchewan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,9,1,6,58,36),
+d(1918,4,14,9,0,0),
+d(1918,10,31,8,0,0),
+d(1930,5,4,7,0,0),
+d(1930,10,5,6,0,0),
+d(1931,5,3,7,0,0),
+d(1931,10,4,6,0,0),
+d(1932,5,1,7,0,0),
+d(1932,10,2,6,0,0),
+d(1933,5,7,7,0,0),
+d(1933,10,1,6,0,0),
+d(1934,5,6,7,0,0),
+d(1934,10,7,6,0,0),
+d(1937,4,11,7,0,0),
+d(1937,10,10,6,0,0),
+d(1938,4,10,7,0,0),
+d(1938,10,2,6,0,0),
+d(1939,4,9,7,0,0),
+d(1939,10,8,6,0,0),
+d(1940,4,14,7,0,0),
+d(1940,10,13,6,0,0),
+d(1941,4,13,7,0,0),
+d(1941,10,12,6,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1946,4,14,9,0,0),
+d(1946,10,13,8,0,0),
+d(1947,4,27,9,0,0),
+d(1947,9,28,8,0,0),
+d(1948,4,25,9,0,0),
+d(1948,9,26,8,0,0),
+d(1949,4,24,9,0,0),
+d(1949,9,25,8,0,0),
+d(1950,4,30,9,0,0),
+d(1950,9,24,8,0,0),
+d(1951,4,29,9,0,0),
+d(1951,9,30,8,0,0),
+d(1952,4,27,9,0,0),
+d(1952,9,28,8,0,0),
+d(1953,4,26,9,0,0),
+d(1953,9,27,8,0,0),
+d(1954,4,25,9,0,0),
+d(1954,9,26,8,0,0),
+d(1955,4,24,9,0,0),
+d(1955,9,25,8,0,0),
+d(1956,4,29,9,0,0),
+d(1956,9,30,8,0,0),
+d(1957,4,28,9,0,0),
+d(1957,9,29,8,0,0),
+d(1959,4,26,9,0,0),
+d(1959,10,25,8,0,0),
+d(1960,4,24,9,0,0),
+        ]
+
+    _transition_info = [
+i(-25140,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+        ]
+
+Saskatchewan = Saskatchewan()
+
diff --git a/lib/pytz/zoneinfo/Canada/Yukon.py b/lib/pytz/zoneinfo/Canada/Yukon.py
new file mode 100755
index 0000000..a69a95d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Canada/Yukon.py
@@ -0,0 +1,272 @@
+'''tzinfo timezone information for Canada/Yukon.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Yukon(DstTzInfo):
+    '''Canada/Yukon timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Canada/Yukon'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,14,11,0,0),
+d(1918,10,27,10,0,0),
+d(1919,5,25,11,0,0),
+d(1919,11,1,8,0,0),
+d(1942,2,9,11,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,10,0,0),
+d(1965,4,25,9,0,0),
+d(1965,10,31,9,0,0),
+d(1966,7,1,11,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YDT'),
+i(-32400,0,'YST'),
+i(-28800,3600,'YWT'),
+i(-28800,3600,'YPT'),
+i(-32400,0,'YST'),
+i(-25200,7200,'YDDT'),
+i(-32400,0,'YST'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Yukon = Yukon()
+
diff --git a/lib/pytz/zoneinfo/Canada/__init__.py b/lib/pytz/zoneinfo/Canada/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Chile/Continental.py b/lib/pytz/zoneinfo/Chile/Continental.py
new file mode 100755
index 0000000..b240aa5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Chile/Continental.py
@@ -0,0 +1,336 @@
+'''tzinfo timezone information for Chile/Continental.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Continental(DstTzInfo):
+    '''Chile/Continental timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Chile/Continental'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1910,1,1,4,42,46),
+d(1916,7,1,5,0,0),
+d(1918,9,1,4,42,46),
+d(1919,7,1,4,0,0),
+d(1927,9,1,4,42,46),
+d(1928,4,1,4,0,0),
+d(1928,9,1,5,0,0),
+d(1929,4,1,4,0,0),
+d(1929,9,1,5,0,0),
+d(1930,4,1,4,0,0),
+d(1930,9,1,5,0,0),
+d(1931,4,1,4,0,0),
+d(1931,9,1,5,0,0),
+d(1932,4,1,4,0,0),
+d(1932,9,1,5,0,0),
+d(1942,6,1,4,0,0),
+d(1942,8,1,5,0,0),
+d(1946,9,1,3,0,0),
+d(1947,5,22,5,0,0),
+d(1968,11,3,4,0,0),
+d(1969,3,30,3,0,0),
+d(1969,11,23,4,0,0),
+d(1970,3,29,3,0,0),
+d(1970,10,11,4,0,0),
+d(1971,3,14,3,0,0),
+d(1971,10,10,4,0,0),
+d(1972,3,12,3,0,0),
+d(1972,10,15,4,0,0),
+d(1973,3,11,3,0,0),
+d(1973,9,30,4,0,0),
+d(1974,3,10,3,0,0),
+d(1974,10,13,4,0,0),
+d(1975,3,9,3,0,0),
+d(1975,10,12,4,0,0),
+d(1976,3,14,3,0,0),
+d(1976,10,10,4,0,0),
+d(1977,3,13,3,0,0),
+d(1977,10,9,4,0,0),
+d(1978,3,12,3,0,0),
+d(1978,10,15,4,0,0),
+d(1979,3,11,3,0,0),
+d(1979,10,14,4,0,0),
+d(1980,3,9,3,0,0),
+d(1980,10,12,4,0,0),
+d(1981,3,15,3,0,0),
+d(1981,10,11,4,0,0),
+d(1982,3,14,3,0,0),
+d(1982,10,10,4,0,0),
+d(1983,3,13,3,0,0),
+d(1983,10,9,4,0,0),
+d(1984,3,11,3,0,0),
+d(1984,10,14,4,0,0),
+d(1985,3,10,3,0,0),
+d(1985,10,13,4,0,0),
+d(1986,3,9,3,0,0),
+d(1986,10,12,4,0,0),
+d(1987,4,12,3,0,0),
+d(1987,10,11,4,0,0),
+d(1988,3,13,3,0,0),
+d(1988,10,2,4,0,0),
+d(1989,3,12,3,0,0),
+d(1989,10,15,4,0,0),
+d(1990,3,18,3,0,0),
+d(1990,9,16,4,0,0),
+d(1991,3,10,3,0,0),
+d(1991,10,13,4,0,0),
+d(1992,3,15,3,0,0),
+d(1992,10,11,4,0,0),
+d(1993,3,14,3,0,0),
+d(1993,10,10,4,0,0),
+d(1994,3,13,3,0,0),
+d(1994,10,9,4,0,0),
+d(1995,3,12,3,0,0),
+d(1995,10,15,4,0,0),
+d(1996,3,10,3,0,0),
+d(1996,10,13,4,0,0),
+d(1997,3,30,3,0,0),
+d(1997,10,12,4,0,0),
+d(1998,3,15,3,0,0),
+d(1998,9,27,4,0,0),
+d(1999,4,4,3,0,0),
+d(1999,10,10,4,0,0),
+d(2000,3,12,3,0,0),
+d(2000,10,15,4,0,0),
+d(2001,3,11,3,0,0),
+d(2001,10,14,4,0,0),
+d(2002,3,10,3,0,0),
+d(2002,10,13,4,0,0),
+d(2003,3,9,3,0,0),
+d(2003,10,12,4,0,0),
+d(2004,3,14,3,0,0),
+d(2004,10,10,4,0,0),
+d(2005,3,13,3,0,0),
+d(2005,10,9,4,0,0),
+d(2006,3,12,3,0,0),
+d(2006,10,15,4,0,0),
+d(2007,3,11,3,0,0),
+d(2007,10,14,4,0,0),
+d(2008,3,9,3,0,0),
+d(2008,10,12,4,0,0),
+d(2009,3,15,3,0,0),
+d(2009,10,11,4,0,0),
+d(2010,3,14,3,0,0),
+d(2010,10,10,4,0,0),
+d(2011,3,13,3,0,0),
+d(2011,10,9,4,0,0),
+d(2012,3,11,3,0,0),
+d(2012,10,14,4,0,0),
+d(2013,3,10,3,0,0),
+d(2013,10,13,4,0,0),
+d(2014,3,9,3,0,0),
+d(2014,10,12,4,0,0),
+d(2015,3,15,3,0,0),
+d(2015,10,11,4,0,0),
+d(2016,3,13,3,0,0),
+d(2016,10,9,4,0,0),
+d(2017,3,12,3,0,0),
+d(2017,10,15,4,0,0),
+d(2018,3,11,3,0,0),
+d(2018,10,14,4,0,0),
+d(2019,3,10,3,0,0),
+d(2019,10,13,4,0,0),
+d(2020,3,15,3,0,0),
+d(2020,10,11,4,0,0),
+d(2021,3,14,3,0,0),
+d(2021,10,10,4,0,0),
+d(2022,3,13,3,0,0),
+d(2022,10,9,4,0,0),
+d(2023,3,12,3,0,0),
+d(2023,10,15,4,0,0),
+d(2024,3,10,3,0,0),
+d(2024,10,13,4,0,0),
+d(2025,3,9,3,0,0),
+d(2025,10,12,4,0,0),
+d(2026,3,15,3,0,0),
+d(2026,10,11,4,0,0),
+d(2027,3,14,3,0,0),
+d(2027,10,10,4,0,0),
+d(2028,3,12,3,0,0),
+d(2028,10,15,4,0,0),
+d(2029,3,11,3,0,0),
+d(2029,10,14,4,0,0),
+d(2030,3,10,3,0,0),
+d(2030,10,13,4,0,0),
+d(2031,3,9,3,0,0),
+d(2031,10,12,4,0,0),
+d(2032,3,14,3,0,0),
+d(2032,10,10,4,0,0),
+d(2033,3,13,3,0,0),
+d(2033,10,9,4,0,0),
+d(2034,3,12,3,0,0),
+d(2034,10,15,4,0,0),
+d(2035,3,11,3,0,0),
+d(2035,10,14,4,0,0),
+d(2036,3,9,3,0,0),
+d(2036,10,12,4,0,0),
+d(2037,3,15,3,0,0),
+d(2037,10,11,4,0,0),
+        ]
+
+    _transition_info = [
+i(-16980,0,'SMT'),
+i(-18000,0,'CLT'),
+i(-16980,0,'SMT'),
+i(-14400,0,'CLT'),
+i(-16980,0,'SMT'),
+i(-14400,2580,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,3600,'CLST'),
+i(-18000,0,'CLT'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+i(-14400,0,'CLT'),
+i(-10800,3600,'CLST'),
+        ]
+
+Continental = Continental()
+
diff --git a/lib/pytz/zoneinfo/Chile/EasterIsland.py b/lib/pytz/zoneinfo/Chile/EasterIsland.py
new file mode 100755
index 0000000..fc17b26
--- /dev/null
+++ b/lib/pytz/zoneinfo/Chile/EasterIsland.py
@@ -0,0 +1,308 @@
+'''tzinfo timezone information for Chile/EasterIsland.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class EasterIsland(DstTzInfo):
+    '''Chile/EasterIsland timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Chile/EasterIsland'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1932,9,1,7,17,28),
+d(1942,6,1,4,0,0),
+d(1942,8,1,5,0,0),
+d(1946,9,1,3,0,0),
+d(1968,11,3,4,0,0),
+d(1969,3,30,3,0,0),
+d(1969,11,23,4,0,0),
+d(1970,3,29,3,0,0),
+d(1970,10,11,4,0,0),
+d(1971,3,14,3,0,0),
+d(1971,10,10,4,0,0),
+d(1972,3,12,3,0,0),
+d(1972,10,15,4,0,0),
+d(1973,3,11,3,0,0),
+d(1973,9,30,4,0,0),
+d(1974,3,10,3,0,0),
+d(1974,10,13,4,0,0),
+d(1975,3,9,3,0,0),
+d(1975,10,12,4,0,0),
+d(1976,3,14,3,0,0),
+d(1976,10,10,4,0,0),
+d(1977,3,13,3,0,0),
+d(1977,10,9,4,0,0),
+d(1978,3,12,3,0,0),
+d(1978,10,15,4,0,0),
+d(1979,3,11,3,0,0),
+d(1979,10,14,4,0,0),
+d(1980,3,9,3,0,0),
+d(1980,10,12,4,0,0),
+d(1981,3,15,3,0,0),
+d(1981,10,11,4,0,0),
+d(1982,1,19,3,0,0),
+d(1982,3,14,3,0,0),
+d(1982,10,10,4,0,0),
+d(1983,3,13,3,0,0),
+d(1983,10,9,4,0,0),
+d(1984,3,11,3,0,0),
+d(1984,10,14,4,0,0),
+d(1985,3,10,3,0,0),
+d(1985,10,13,4,0,0),
+d(1986,3,9,3,0,0),
+d(1986,10,12,4,0,0),
+d(1987,4,12,3,0,0),
+d(1987,10,11,4,0,0),
+d(1988,3,13,3,0,0),
+d(1988,10,2,4,0,0),
+d(1989,3,12,3,0,0),
+d(1989,10,15,4,0,0),
+d(1990,3,18,3,0,0),
+d(1990,9,16,4,0,0),
+d(1991,3,10,3,0,0),
+d(1991,10,13,4,0,0),
+d(1992,3,15,3,0,0),
+d(1992,10,11,4,0,0),
+d(1993,3,14,3,0,0),
+d(1993,10,10,4,0,0),
+d(1994,3,13,3,0,0),
+d(1994,10,9,4,0,0),
+d(1995,3,12,3,0,0),
+d(1995,10,15,4,0,0),
+d(1996,3,10,3,0,0),
+d(1996,10,13,4,0,0),
+d(1997,3,30,3,0,0),
+d(1997,10,12,4,0,0),
+d(1998,3,15,3,0,0),
+d(1998,9,27,4,0,0),
+d(1999,4,4,3,0,0),
+d(1999,10,10,4,0,0),
+d(2000,3,12,3,0,0),
+d(2000,10,15,4,0,0),
+d(2001,3,11,3,0,0),
+d(2001,10,14,4,0,0),
+d(2002,3,10,3,0,0),
+d(2002,10,13,4,0,0),
+d(2003,3,9,3,0,0),
+d(2003,10,12,4,0,0),
+d(2004,3,14,3,0,0),
+d(2004,10,10,4,0,0),
+d(2005,3,13,3,0,0),
+d(2005,10,9,4,0,0),
+d(2006,3,12,3,0,0),
+d(2006,10,15,4,0,0),
+d(2007,3,11,3,0,0),
+d(2007,10,14,4,0,0),
+d(2008,3,9,3,0,0),
+d(2008,10,12,4,0,0),
+d(2009,3,15,3,0,0),
+d(2009,10,11,4,0,0),
+d(2010,3,14,3,0,0),
+d(2010,10,10,4,0,0),
+d(2011,3,13,3,0,0),
+d(2011,10,9,4,0,0),
+d(2012,3,11,3,0,0),
+d(2012,10,14,4,0,0),
+d(2013,3,10,3,0,0),
+d(2013,10,13,4,0,0),
+d(2014,3,9,3,0,0),
+d(2014,10,12,4,0,0),
+d(2015,3,15,3,0,0),
+d(2015,10,11,4,0,0),
+d(2016,3,13,3,0,0),
+d(2016,10,9,4,0,0),
+d(2017,3,12,3,0,0),
+d(2017,10,15,4,0,0),
+d(2018,3,11,3,0,0),
+d(2018,10,14,4,0,0),
+d(2019,3,10,3,0,0),
+d(2019,10,13,4,0,0),
+d(2020,3,15,3,0,0),
+d(2020,10,11,4,0,0),
+d(2021,3,14,3,0,0),
+d(2021,10,10,4,0,0),
+d(2022,3,13,3,0,0),
+d(2022,10,9,4,0,0),
+d(2023,3,12,3,0,0),
+d(2023,10,15,4,0,0),
+d(2024,3,10,3,0,0),
+d(2024,10,13,4,0,0),
+d(2025,3,9,3,0,0),
+d(2025,10,12,4,0,0),
+d(2026,3,15,3,0,0),
+d(2026,10,11,4,0,0),
+d(2027,3,14,3,0,0),
+d(2027,10,10,4,0,0),
+d(2028,3,12,3,0,0),
+d(2028,10,15,4,0,0),
+d(2029,3,11,3,0,0),
+d(2029,10,14,4,0,0),
+d(2030,3,10,3,0,0),
+d(2030,10,13,4,0,0),
+d(2031,3,9,3,0,0),
+d(2031,10,12,4,0,0),
+d(2032,3,14,3,0,0),
+d(2032,10,10,4,0,0),
+d(2033,3,13,3,0,0),
+d(2033,10,9,4,0,0),
+d(2034,3,12,3,0,0),
+d(2034,10,15,4,0,0),
+d(2035,3,11,3,0,0),
+d(2035,10,14,4,0,0),
+d(2036,3,9,3,0,0),
+d(2036,10,12,4,0,0),
+d(2037,3,15,3,0,0),
+d(2037,10,11,4,0,0),
+        ]
+
+    _transition_info = [
+i(-26220,0,'MMT'),
+i(-21600,4620,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-18000,7200,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+        ]
+
+EasterIsland = EasterIsland()
+
diff --git a/lib/pytz/zoneinfo/Chile/__init__.py b/lib/pytz/zoneinfo/Chile/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Cuba.py b/lib/pytz/zoneinfo/Cuba.py
new file mode 100755
index 0000000..5665bc4
--- /dev/null
+++ b/lib/pytz/zoneinfo/Cuba.py
@@ -0,0 +1,330 @@
+'''tzinfo timezone information for Cuba.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Cuba(DstTzInfo):
+    '''Cuba timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Cuba'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1925,7,19,17,29,36),
+d(1928,6,10,5,0,0),
+d(1928,10,10,4,0,0),
+d(1940,6,2,5,0,0),
+d(1940,9,1,4,0,0),
+d(1941,6,1,5,0,0),
+d(1941,9,7,4,0,0),
+d(1942,6,7,5,0,0),
+d(1942,9,6,4,0,0),
+d(1945,6,3,5,0,0),
+d(1945,9,2,4,0,0),
+d(1946,6,2,5,0,0),
+d(1946,9,1,4,0,0),
+d(1965,6,1,5,0,0),
+d(1965,9,30,4,0,0),
+d(1966,5,29,5,0,0),
+d(1966,10,2,4,0,0),
+d(1967,4,8,5,0,0),
+d(1967,9,10,4,0,0),
+d(1968,4,14,5,0,0),
+d(1968,9,8,4,0,0),
+d(1969,4,27,5,0,0),
+d(1969,10,26,4,0,0),
+d(1970,4,26,5,0,0),
+d(1970,10,25,4,0,0),
+d(1971,4,25,5,0,0),
+d(1971,10,31,4,0,0),
+d(1972,4,30,5,0,0),
+d(1972,10,8,4,0,0),
+d(1973,4,29,5,0,0),
+d(1973,10,8,4,0,0),
+d(1974,4,28,5,0,0),
+d(1974,10,8,4,0,0),
+d(1975,4,27,5,0,0),
+d(1975,10,26,4,0,0),
+d(1976,4,25,5,0,0),
+d(1976,10,31,4,0,0),
+d(1977,4,24,5,0,0),
+d(1977,10,30,4,0,0),
+d(1978,5,7,5,0,0),
+d(1978,10,8,4,0,0),
+d(1979,3,18,5,0,0),
+d(1979,10,14,4,0,0),
+d(1980,3,16,5,0,0),
+d(1980,10,12,4,0,0),
+d(1981,5,10,5,0,0),
+d(1981,10,11,4,0,0),
+d(1982,5,9,5,0,0),
+d(1982,10,10,4,0,0),
+d(1983,5,8,5,0,0),
+d(1983,10,9,4,0,0),
+d(1984,5,6,5,0,0),
+d(1984,10,14,4,0,0),
+d(1985,5,5,5,0,0),
+d(1985,10,13,4,0,0),
+d(1986,3,16,5,0,0),
+d(1986,10,12,4,0,0),
+d(1987,3,15,5,0,0),
+d(1987,10,11,4,0,0),
+d(1988,3,20,5,0,0),
+d(1988,10,9,4,0,0),
+d(1989,3,19,5,0,0),
+d(1989,10,8,4,0,0),
+d(1990,4,1,5,0,0),
+d(1990,10,14,4,0,0),
+d(1991,4,7,5,0,0),
+d(1991,10,13,5,0,0),
+d(1992,4,5,5,0,0),
+d(1992,10,11,5,0,0),
+d(1993,4,4,5,0,0),
+d(1993,10,10,5,0,0),
+d(1994,4,3,5,0,0),
+d(1994,10,9,5,0,0),
+d(1995,4,2,5,0,0),
+d(1995,10,8,5,0,0),
+d(1996,4,7,5,0,0),
+d(1996,10,6,5,0,0),
+d(1997,4,6,5,0,0),
+d(1997,10,12,5,0,0),
+d(1998,3,29,5,0,0),
+d(1998,10,25,5,0,0),
+d(1999,3,28,5,0,0),
+d(1999,10,31,5,0,0),
+d(2000,4,2,5,0,0),
+d(2000,10,29,5,0,0),
+d(2001,4,1,5,0,0),
+d(2001,10,28,5,0,0),
+d(2002,4,7,5,0,0),
+d(2002,10,27,5,0,0),
+d(2003,4,6,5,0,0),
+d(2003,10,26,5,0,0),
+d(2004,4,4,5,0,0),
+d(2006,10,29,5,0,0),
+d(2007,4,1,5,0,0),
+d(2007,10,28,5,0,0),
+d(2008,4,6,5,0,0),
+d(2008,10,26,5,0,0),
+d(2009,4,5,5,0,0),
+d(2009,10,25,5,0,0),
+d(2010,4,4,5,0,0),
+d(2010,10,31,5,0,0),
+d(2011,4,3,5,0,0),
+d(2011,10,30,5,0,0),
+d(2012,4,1,5,0,0),
+d(2012,10,28,5,0,0),
+d(2013,4,7,5,0,0),
+d(2013,10,27,5,0,0),
+d(2014,4,6,5,0,0),
+d(2014,10,26,5,0,0),
+d(2015,4,5,5,0,0),
+d(2015,10,25,5,0,0),
+d(2016,4,3,5,0,0),
+d(2016,10,30,5,0,0),
+d(2017,4,2,5,0,0),
+d(2017,10,29,5,0,0),
+d(2018,4,1,5,0,0),
+d(2018,10,28,5,0,0),
+d(2019,4,7,5,0,0),
+d(2019,10,27,5,0,0),
+d(2020,4,5,5,0,0),
+d(2020,10,25,5,0,0),
+d(2021,4,4,5,0,0),
+d(2021,10,31,5,0,0),
+d(2022,4,3,5,0,0),
+d(2022,10,30,5,0,0),
+d(2023,4,2,5,0,0),
+d(2023,10,29,5,0,0),
+d(2024,4,7,5,0,0),
+d(2024,10,27,5,0,0),
+d(2025,4,6,5,0,0),
+d(2025,10,26,5,0,0),
+d(2026,4,5,5,0,0),
+d(2026,10,25,5,0,0),
+d(2027,4,4,5,0,0),
+d(2027,10,31,5,0,0),
+d(2028,4,2,5,0,0),
+d(2028,10,29,5,0,0),
+d(2029,4,1,5,0,0),
+d(2029,10,28,5,0,0),
+d(2030,4,7,5,0,0),
+d(2030,10,27,5,0,0),
+d(2031,4,6,5,0,0),
+d(2031,10,26,5,0,0),
+d(2032,4,4,5,0,0),
+d(2032,10,31,5,0,0),
+d(2033,4,3,5,0,0),
+d(2033,10,30,5,0,0),
+d(2034,4,2,5,0,0),
+d(2034,10,29,5,0,0),
+d(2035,4,1,5,0,0),
+d(2035,10,28,5,0,0),
+d(2036,4,6,5,0,0),
+d(2036,10,26,5,0,0),
+d(2037,4,5,5,0,0),
+d(2037,10,25,5,0,0),
+        ]
+
+    _transition_info = [
+i(-19800,0,'HMT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+i(-14400,3600,'CDT'),
+i(-18000,0,'CST'),
+        ]
+
+Cuba = Cuba()
+
diff --git a/lib/pytz/zoneinfo/EET.py b/lib/pytz/zoneinfo/EET.py
new file mode 100755
index 0000000..9f22313
--- /dev/null
+++ b/lib/pytz/zoneinfo/EET.py
@@ -0,0 +1,264 @@
+'''tzinfo timezone information for EET.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class EET(DstTzInfo):
+    '''EET timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'EET'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+EET = EET()
+
diff --git a/lib/pytz/zoneinfo/EST.py b/lib/pytz/zoneinfo/EST.py
new file mode 100755
index 0000000..cf96578
--- /dev/null
+++ b/lib/pytz/zoneinfo/EST.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for EST.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class EST(StaticTzInfo):
+    '''EST timezone definition. See datetime.tzinfo for details'''
+    zone = 'EST'
+    _utcoffset = timedelta(seconds=-18000)
+    _tzname = 'EST'
+
+EST = EST()
+
diff --git a/lib/pytz/zoneinfo/EST5EDT.py b/lib/pytz/zoneinfo/EST5EDT.py
new file mode 100755
index 0000000..f84da28
--- /dev/null
+++ b/lib/pytz/zoneinfo/EST5EDT.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for EST5EDT.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class EST5EDT(DstTzInfo):
+    '''EST5EDT timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'EST5EDT'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,7,0,0),
+d(1918,10,27,6,0,0),
+d(1919,3,30,7,0,0),
+d(1919,10,26,6,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1967,4,30,7,0,0),
+d(1967,10,29,6,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+EST5EDT = EST5EDT()
+
diff --git a/lib/pytz/zoneinfo/Egypt.py b/lib/pytz/zoneinfo/Egypt.py
new file mode 100755
index 0000000..99c41c8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Egypt.py
@@ -0,0 +1,368 @@
+'''tzinfo timezone information for Egypt.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Egypt(DstTzInfo):
+    '''Egypt timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Egypt'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1940,7,14,22,0,0),
+d(1940,9,30,21,0,0),
+d(1941,4,14,22,0,0),
+d(1941,9,15,21,0,0),
+d(1942,3,31,22,0,0),
+d(1942,10,26,21,0,0),
+d(1943,3,31,22,0,0),
+d(1943,10,31,21,0,0),
+d(1944,3,31,22,0,0),
+d(1944,10,31,21,0,0),
+d(1945,4,15,22,0,0),
+d(1945,10,31,21,0,0),
+d(1957,5,9,22,0,0),
+d(1957,9,30,21,0,0),
+d(1958,4,30,22,0,0),
+d(1958,9,30,21,0,0),
+d(1959,4,30,23,0,0),
+d(1959,9,30,0,0,0),
+d(1960,4,30,23,0,0),
+d(1960,9,30,0,0,0),
+d(1961,4,30,23,0,0),
+d(1961,9,30,0,0,0),
+d(1962,4,30,23,0,0),
+d(1962,9,30,0,0,0),
+d(1963,4,30,23,0,0),
+d(1963,9,30,0,0,0),
+d(1964,4,30,23,0,0),
+d(1964,9,30,0,0,0),
+d(1965,4,30,23,0,0),
+d(1965,9,30,0,0,0),
+d(1966,4,30,23,0,0),
+d(1966,10,1,0,0,0),
+d(1967,4,30,23,0,0),
+d(1967,10,1,0,0,0),
+d(1968,4,30,23,0,0),
+d(1968,10,1,0,0,0),
+d(1969,4,30,23,0,0),
+d(1969,10,1,0,0,0),
+d(1970,4,30,23,0,0),
+d(1970,10,1,0,0,0),
+d(1971,4,30,23,0,0),
+d(1971,10,1,0,0,0),
+d(1972,4,30,23,0,0),
+d(1972,10,1,0,0,0),
+d(1973,4,30,23,0,0),
+d(1973,10,1,0,0,0),
+d(1974,4,30,23,0,0),
+d(1974,10,1,0,0,0),
+d(1975,4,30,23,0,0),
+d(1975,10,1,0,0,0),
+d(1976,4,30,23,0,0),
+d(1976,10,1,0,0,0),
+d(1977,4,30,23,0,0),
+d(1977,10,1,0,0,0),
+d(1978,4,30,23,0,0),
+d(1978,10,1,0,0,0),
+d(1979,4,30,23,0,0),
+d(1979,10,1,0,0,0),
+d(1980,4,30,23,0,0),
+d(1980,10,1,0,0,0),
+d(1981,4,30,23,0,0),
+d(1981,10,1,0,0,0),
+d(1982,7,24,23,0,0),
+d(1982,10,1,0,0,0),
+d(1983,7,11,23,0,0),
+d(1983,10,1,0,0,0),
+d(1984,4,30,23,0,0),
+d(1984,10,1,0,0,0),
+d(1985,4,30,23,0,0),
+d(1985,10,1,0,0,0),
+d(1986,4,30,23,0,0),
+d(1986,10,1,0,0,0),
+d(1987,4,30,23,0,0),
+d(1987,10,1,0,0,0),
+d(1988,4,30,23,0,0),
+d(1988,10,1,0,0,0),
+d(1989,5,5,23,0,0),
+d(1989,10,1,0,0,0),
+d(1990,4,30,23,0,0),
+d(1990,10,1,0,0,0),
+d(1991,4,30,23,0,0),
+d(1991,10,1,0,0,0),
+d(1992,4,30,23,0,0),
+d(1992,10,1,0,0,0),
+d(1993,4,30,23,0,0),
+d(1993,10,1,0,0,0),
+d(1994,4,30,23,0,0),
+d(1994,10,1,0,0,0),
+d(1995,4,27,22,0,0),
+d(1995,9,28,21,0,0),
+d(1996,4,25,22,0,0),
+d(1996,9,26,21,0,0),
+d(1997,4,24,22,0,0),
+d(1997,9,25,21,0,0),
+d(1998,4,23,22,0,0),
+d(1998,9,24,21,0,0),
+d(1999,4,29,22,0,0),
+d(1999,9,30,21,0,0),
+d(2000,4,27,22,0,0),
+d(2000,9,28,21,0,0),
+d(2001,4,26,22,0,0),
+d(2001,9,27,21,0,0),
+d(2002,4,25,22,0,0),
+d(2002,9,26,21,0,0),
+d(2003,4,24,22,0,0),
+d(2003,9,25,21,0,0),
+d(2004,4,29,22,0,0),
+d(2004,9,30,21,0,0),
+d(2005,4,28,22,0,0),
+d(2005,9,29,21,0,0),
+d(2006,4,27,22,0,0),
+d(2006,9,21,21,0,0),
+d(2007,4,26,22,0,0),
+d(2007,9,27,21,0,0),
+d(2008,4,24,22,0,0),
+d(2008,9,25,21,0,0),
+d(2009,4,23,22,0,0),
+d(2009,9,24,21,0,0),
+d(2010,4,29,22,0,0),
+d(2010,9,30,21,0,0),
+d(2011,4,28,22,0,0),
+d(2011,9,29,21,0,0),
+d(2012,4,26,22,0,0),
+d(2012,9,27,21,0,0),
+d(2013,4,25,22,0,0),
+d(2013,9,26,21,0,0),
+d(2014,4,24,22,0,0),
+d(2014,9,25,21,0,0),
+d(2015,4,23,22,0,0),
+d(2015,9,24,21,0,0),
+d(2016,4,28,22,0,0),
+d(2016,9,29,21,0,0),
+d(2017,4,27,22,0,0),
+d(2017,9,28,21,0,0),
+d(2018,4,26,22,0,0),
+d(2018,9,27,21,0,0),
+d(2019,4,25,22,0,0),
+d(2019,9,26,21,0,0),
+d(2020,4,23,22,0,0),
+d(2020,9,24,21,0,0),
+d(2021,4,29,22,0,0),
+d(2021,9,30,21,0,0),
+d(2022,4,28,22,0,0),
+d(2022,9,29,21,0,0),
+d(2023,4,27,22,0,0),
+d(2023,9,28,21,0,0),
+d(2024,4,25,22,0,0),
+d(2024,9,26,21,0,0),
+d(2025,4,24,22,0,0),
+d(2025,9,25,21,0,0),
+d(2026,4,23,22,0,0),
+d(2026,9,24,21,0,0),
+d(2027,4,29,22,0,0),
+d(2027,9,30,21,0,0),
+d(2028,4,27,22,0,0),
+d(2028,9,28,21,0,0),
+d(2029,4,26,22,0,0),
+d(2029,9,27,21,0,0),
+d(2030,4,25,22,0,0),
+d(2030,9,26,21,0,0),
+d(2031,4,24,22,0,0),
+d(2031,9,25,21,0,0),
+d(2032,4,29,22,0,0),
+d(2032,9,30,21,0,0),
+d(2033,4,28,22,0,0),
+d(2033,9,29,21,0,0),
+d(2034,4,27,22,0,0),
+d(2034,9,28,21,0,0),
+d(2035,4,26,22,0,0),
+d(2035,9,27,21,0,0),
+d(2036,4,24,22,0,0),
+d(2036,9,25,21,0,0),
+d(2037,4,23,22,0,0),
+d(2037,9,24,21,0,0),
+        ]
+
+    _transition_info = [
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Egypt = Egypt()
+
diff --git a/lib/pytz/zoneinfo/Eire.py b/lib/pytz/zoneinfo/Eire.py
new file mode 100755
index 0000000..eb7f4ab
--- /dev/null
+++ b/lib/pytz/zoneinfo/Eire.py
@@ -0,0 +1,478 @@
+'''tzinfo timezone information for Eire.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Eire(DstTzInfo):
+    '''Eire timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Eire'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,25,21),
+d(1916,10,1,2,25,21),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1921,12,6,0,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1946,10,6,1,0,0),
+d(1947,3,16,2,0,0),
+d(1947,11,2,1,0,0),
+d(1948,4,18,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-1500,0,'DMT'),
+i(2100,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(3600,0,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+        ]
+
+Eire = Eire()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT.py b/lib/pytz/zoneinfo/Etc/GMT.py
new file mode 100755
index 0000000..b91f301
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT(StaticTzInfo):
+    '''Etc/GMT timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+GMT = GMT()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT0.py b/lib/pytz/zoneinfo/Etc/GMT0.py
new file mode 100755
index 0000000..ce857ca
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT0.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT0.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT0(StaticTzInfo):
+    '''Etc/GMT0 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT0'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+GMT0 = GMT0()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_0.py b/lib/pytz/zoneinfo/Etc/GMT_minus_0.py
new file mode 100755
index 0000000..fb143c9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_0.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_0.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_0(StaticTzInfo):
+    '''Etc/GMT_minus_0 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_0'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+GMT_minus_0 = GMT_minus_0()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_1.py b/lib/pytz/zoneinfo/Etc/GMT_minus_1.py
new file mode 100755
index 0000000..b280ae9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_1.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_1.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_1(StaticTzInfo):
+    '''Etc/GMT_minus_1 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_1'
+    _utcoffset = timedelta(seconds=3600)
+    _tzname = 'GMT-1'
+
+GMT_minus_1 = GMT_minus_1()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_10.py b/lib/pytz/zoneinfo/Etc/GMT_minus_10.py
new file mode 100755
index 0000000..4c97903
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_10.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_10.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_10(StaticTzInfo):
+    '''Etc/GMT_minus_10 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_10'
+    _utcoffset = timedelta(seconds=36000)
+    _tzname = 'GMT-10'
+
+GMT_minus_10 = GMT_minus_10()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_11.py b/lib/pytz/zoneinfo/Etc/GMT_minus_11.py
new file mode 100755
index 0000000..4f7d9d4
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_11.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_11.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_11(StaticTzInfo):
+    '''Etc/GMT_minus_11 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_11'
+    _utcoffset = timedelta(seconds=39600)
+    _tzname = 'GMT-11'
+
+GMT_minus_11 = GMT_minus_11()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_12.py b/lib/pytz/zoneinfo/Etc/GMT_minus_12.py
new file mode 100755
index 0000000..c542dbf
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_12.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_12.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_12(StaticTzInfo):
+    '''Etc/GMT_minus_12 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_12'
+    _utcoffset = timedelta(seconds=43200)
+    _tzname = 'GMT-12'
+
+GMT_minus_12 = GMT_minus_12()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_13.py b/lib/pytz/zoneinfo/Etc/GMT_minus_13.py
new file mode 100755
index 0000000..78e23fa
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_13.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_13.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_13(StaticTzInfo):
+    '''Etc/GMT_minus_13 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_13'
+    _utcoffset = timedelta(seconds=46800)
+    _tzname = 'GMT-13'
+
+GMT_minus_13 = GMT_minus_13()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_14.py b/lib/pytz/zoneinfo/Etc/GMT_minus_14.py
new file mode 100755
index 0000000..b20f985
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_14.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_14.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_14(StaticTzInfo):
+    '''Etc/GMT_minus_14 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_14'
+    _utcoffset = timedelta(seconds=50400)
+    _tzname = 'GMT-14'
+
+GMT_minus_14 = GMT_minus_14()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_2.py b/lib/pytz/zoneinfo/Etc/GMT_minus_2.py
new file mode 100755
index 0000000..98aeabb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_2.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_2.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_2(StaticTzInfo):
+    '''Etc/GMT_minus_2 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_2'
+    _utcoffset = timedelta(seconds=7200)
+    _tzname = 'GMT-2'
+
+GMT_minus_2 = GMT_minus_2()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_3.py b/lib/pytz/zoneinfo/Etc/GMT_minus_3.py
new file mode 100755
index 0000000..a2d4cd5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_3.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_3.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_3(StaticTzInfo):
+    '''Etc/GMT_minus_3 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_3'
+    _utcoffset = timedelta(seconds=10800)
+    _tzname = 'GMT-3'
+
+GMT_minus_3 = GMT_minus_3()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_4.py b/lib/pytz/zoneinfo/Etc/GMT_minus_4.py
new file mode 100755
index 0000000..09575ac
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_4.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_4.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_4(StaticTzInfo):
+    '''Etc/GMT_minus_4 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_4'
+    _utcoffset = timedelta(seconds=14400)
+    _tzname = 'GMT-4'
+
+GMT_minus_4 = GMT_minus_4()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_5.py b/lib/pytz/zoneinfo/Etc/GMT_minus_5.py
new file mode 100755
index 0000000..4d93e31
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_5.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_5.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_5(StaticTzInfo):
+    '''Etc/GMT_minus_5 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_5'
+    _utcoffset = timedelta(seconds=18000)
+    _tzname = 'GMT-5'
+
+GMT_minus_5 = GMT_minus_5()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_6.py b/lib/pytz/zoneinfo/Etc/GMT_minus_6.py
new file mode 100755
index 0000000..02612da
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_6.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_6.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_6(StaticTzInfo):
+    '''Etc/GMT_minus_6 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_6'
+    _utcoffset = timedelta(seconds=21600)
+    _tzname = 'GMT-6'
+
+GMT_minus_6 = GMT_minus_6()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_7.py b/lib/pytz/zoneinfo/Etc/GMT_minus_7.py
new file mode 100755
index 0000000..b675a69
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_7.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_7.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_7(StaticTzInfo):
+    '''Etc/GMT_minus_7 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_7'
+    _utcoffset = timedelta(seconds=25200)
+    _tzname = 'GMT-7'
+
+GMT_minus_7 = GMT_minus_7()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_8.py b/lib/pytz/zoneinfo/Etc/GMT_minus_8.py
new file mode 100755
index 0000000..3457820
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_8.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_8.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_8(StaticTzInfo):
+    '''Etc/GMT_minus_8 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_8'
+    _utcoffset = timedelta(seconds=28800)
+    _tzname = 'GMT-8'
+
+GMT_minus_8 = GMT_minus_8()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_minus_9.py b/lib/pytz/zoneinfo/Etc/GMT_minus_9.py
new file mode 100755
index 0000000..2ab33c5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_minus_9.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_minus_9.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_9(StaticTzInfo):
+    '''Etc/GMT_minus_9 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_minus_9'
+    _utcoffset = timedelta(seconds=32400)
+    _tzname = 'GMT-9'
+
+GMT_minus_9 = GMT_minus_9()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_0.py b/lib/pytz/zoneinfo/Etc/GMT_plus_0.py
new file mode 100755
index 0000000..342e2a5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_0.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_0.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_0(StaticTzInfo):
+    '''Etc/GMT_plus_0 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_0'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+GMT_plus_0 = GMT_plus_0()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_1.py b/lib/pytz/zoneinfo/Etc/GMT_plus_1.py
new file mode 100755
index 0000000..9b62d1e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_1.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_1.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_1(StaticTzInfo):
+    '''Etc/GMT_plus_1 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_1'
+    _utcoffset = timedelta(seconds=-3600)
+    _tzname = 'GMT+1'
+
+GMT_plus_1 = GMT_plus_1()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_10.py b/lib/pytz/zoneinfo/Etc/GMT_plus_10.py
new file mode 100755
index 0000000..cf7943b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_10.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_10.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_10(StaticTzInfo):
+    '''Etc/GMT_plus_10 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_10'
+    _utcoffset = timedelta(seconds=-36000)
+    _tzname = 'GMT+10'
+
+GMT_plus_10 = GMT_plus_10()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_11.py b/lib/pytz/zoneinfo/Etc/GMT_plus_11.py
new file mode 100755
index 0000000..fb9e3e0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_11.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_11.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_11(StaticTzInfo):
+    '''Etc/GMT_plus_11 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_11'
+    _utcoffset = timedelta(seconds=-39600)
+    _tzname = 'GMT+11'
+
+GMT_plus_11 = GMT_plus_11()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_12.py b/lib/pytz/zoneinfo/Etc/GMT_plus_12.py
new file mode 100755
index 0000000..fcf2a23
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_12.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_12.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_12(StaticTzInfo):
+    '''Etc/GMT_plus_12 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_12'
+    _utcoffset = timedelta(seconds=-43200)
+    _tzname = 'GMT+12'
+
+GMT_plus_12 = GMT_plus_12()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_2.py b/lib/pytz/zoneinfo/Etc/GMT_plus_2.py
new file mode 100755
index 0000000..672dbb2
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_2.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_2.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_2(StaticTzInfo):
+    '''Etc/GMT_plus_2 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_2'
+    _utcoffset = timedelta(seconds=-7200)
+    _tzname = 'GMT+2'
+
+GMT_plus_2 = GMT_plus_2()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_3.py b/lib/pytz/zoneinfo/Etc/GMT_plus_3.py
new file mode 100755
index 0000000..1d7f383
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_3.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_3.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_3(StaticTzInfo):
+    '''Etc/GMT_plus_3 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_3'
+    _utcoffset = timedelta(seconds=-10800)
+    _tzname = 'GMT+3'
+
+GMT_plus_3 = GMT_plus_3()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_4.py b/lib/pytz/zoneinfo/Etc/GMT_plus_4.py
new file mode 100755
index 0000000..8f19967
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_4.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_4.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_4(StaticTzInfo):
+    '''Etc/GMT_plus_4 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_4'
+    _utcoffset = timedelta(seconds=-14400)
+    _tzname = 'GMT+4'
+
+GMT_plus_4 = GMT_plus_4()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_5.py b/lib/pytz/zoneinfo/Etc/GMT_plus_5.py
new file mode 100755
index 0000000..e101563
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_5.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_5.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_5(StaticTzInfo):
+    '''Etc/GMT_plus_5 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_5'
+    _utcoffset = timedelta(seconds=-18000)
+    _tzname = 'GMT+5'
+
+GMT_plus_5 = GMT_plus_5()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_6.py b/lib/pytz/zoneinfo/Etc/GMT_plus_6.py
new file mode 100755
index 0000000..ee30aba
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_6.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_6.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_6(StaticTzInfo):
+    '''Etc/GMT_plus_6 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_6'
+    _utcoffset = timedelta(seconds=-21600)
+    _tzname = 'GMT+6'
+
+GMT_plus_6 = GMT_plus_6()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_7.py b/lib/pytz/zoneinfo/Etc/GMT_plus_7.py
new file mode 100755
index 0000000..e56b828
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_7.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_7.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_7(StaticTzInfo):
+    '''Etc/GMT_plus_7 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_7'
+    _utcoffset = timedelta(seconds=-25200)
+    _tzname = 'GMT+7'
+
+GMT_plus_7 = GMT_plus_7()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_8.py b/lib/pytz/zoneinfo/Etc/GMT_plus_8.py
new file mode 100755
index 0000000..63856c9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_8.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_8.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_8(StaticTzInfo):
+    '''Etc/GMT_plus_8 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_8'
+    _utcoffset = timedelta(seconds=-28800)
+    _tzname = 'GMT+8'
+
+GMT_plus_8 = GMT_plus_8()
+
diff --git a/lib/pytz/zoneinfo/Etc/GMT_plus_9.py b/lib/pytz/zoneinfo/Etc/GMT_plus_9.py
new file mode 100755
index 0000000..6964c54
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/GMT_plus_9.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/GMT_plus_9.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_9(StaticTzInfo):
+    '''Etc/GMT_plus_9 timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/GMT_plus_9'
+    _utcoffset = timedelta(seconds=-32400)
+    _tzname = 'GMT+9'
+
+GMT_plus_9 = GMT_plus_9()
+
diff --git a/lib/pytz/zoneinfo/Etc/Greenwich.py b/lib/pytz/zoneinfo/Etc/Greenwich.py
new file mode 100755
index 0000000..74ecf64
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/Greenwich.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/Greenwich.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Greenwich(StaticTzInfo):
+    '''Etc/Greenwich timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/Greenwich'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+Greenwich = Greenwich()
+
diff --git a/lib/pytz/zoneinfo/Etc/UCT.py b/lib/pytz/zoneinfo/Etc/UCT.py
new file mode 100755
index 0000000..3c83081
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/UCT.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/UCT.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class UCT(StaticTzInfo):
+    '''Etc/UCT timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/UCT'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'UCT'
+
+UCT = UCT()
+
diff --git a/lib/pytz/zoneinfo/Etc/UTC.py b/lib/pytz/zoneinfo/Etc/UTC.py
new file mode 100755
index 0000000..80eb784
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/UTC.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/UTC.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class UTC(StaticTzInfo):
+    '''Etc/UTC timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/UTC'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'UTC'
+
+UTC = UTC()
+
diff --git a/lib/pytz/zoneinfo/Etc/Universal.py b/lib/pytz/zoneinfo/Etc/Universal.py
new file mode 100755
index 0000000..bddf3c4
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/Universal.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/Universal.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Universal(StaticTzInfo):
+    '''Etc/Universal timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/Universal'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'UTC'
+
+Universal = Universal()
+
diff --git a/lib/pytz/zoneinfo/Etc/Zulu.py b/lib/pytz/zoneinfo/Etc/Zulu.py
new file mode 100755
index 0000000..d569a82
--- /dev/null
+++ b/lib/pytz/zoneinfo/Etc/Zulu.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Etc/Zulu.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Zulu(StaticTzInfo):
+    '''Etc/Zulu timezone definition. See datetime.tzinfo for details'''
+    zone = 'Etc/Zulu'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'UTC'
+
+Zulu = Zulu()
+
diff --git a/lib/pytz/zoneinfo/Etc/__init__.py b/lib/pytz/zoneinfo/Etc/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Europe/Amsterdam.py b/lib/pytz/zoneinfo/Europe/Amsterdam.py
new file mode 100755
index 0000000..b210f20
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Amsterdam.py
@@ -0,0 +1,380 @@
+'''tzinfo timezone information for Europe/Amsterdam.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Amsterdam(DstTzInfo):
+    '''Europe/Amsterdam timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Amsterdam'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,23,40,28),
+d(1916,9,30,22,40,28),
+d(1917,4,16,1,40,28),
+d(1917,9,17,1,40,28),
+d(1918,4,1,1,40,28),
+d(1918,9,30,1,40,28),
+d(1919,4,7,1,40,28),
+d(1919,9,29,1,40,28),
+d(1920,4,5,1,40,28),
+d(1920,9,27,1,40,28),
+d(1921,4,4,1,40,28),
+d(1921,9,26,1,40,28),
+d(1922,3,26,1,40,28),
+d(1922,10,8,1,40,28),
+d(1923,6,1,1,40,28),
+d(1923,10,7,1,40,28),
+d(1924,3,30,1,40,28),
+d(1924,10,5,1,40,28),
+d(1925,6,5,1,40,28),
+d(1925,10,4,1,40,28),
+d(1926,5,15,1,40,28),
+d(1926,10,3,1,40,28),
+d(1927,5,15,1,40,28),
+d(1927,10,2,1,40,28),
+d(1928,5,15,1,40,28),
+d(1928,10,7,1,40,28),
+d(1929,5,15,1,40,28),
+d(1929,10,6,1,40,28),
+d(1930,5,15,1,40,28),
+d(1930,10,5,1,40,28),
+d(1931,5,15,1,40,28),
+d(1931,10,4,1,40,28),
+d(1932,5,22,1,40,28),
+d(1932,10,2,1,40,28),
+d(1933,5,15,1,40,28),
+d(1933,10,8,1,40,28),
+d(1934,5,15,1,40,28),
+d(1934,10,7,1,40,28),
+d(1935,5,15,1,40,28),
+d(1935,10,6,1,40,28),
+d(1936,5,15,1,40,28),
+d(1936,10,4,1,40,28),
+d(1937,5,22,1,40,28),
+d(1937,6,30,22,40,28),
+d(1937,10,3,1,40,0),
+d(1938,5,15,1,40,0),
+d(1938,10,2,1,40,0),
+d(1939,5,15,1,40,0),
+d(1939,10,8,1,40,0),
+d(1940,5,15,23,40,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,16,1,0,0),
+d(1976,12,31,23,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(1200,0,'AMT'),
+i(4800,3600,'NST'),
+i(4800,3600,'NEST'),
+i(1200,0,'NET'),
+i(4800,3600,'NEST'),
+i(1200,0,'NET'),
+i(4800,3600,'NEST'),
+i(1200,0,'NET'),
+i(7200,6000,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Amsterdam = Amsterdam()
+
diff --git a/lib/pytz/zoneinfo/Europe/Andorra.py b/lib/pytz/zoneinfo/Europe/Andorra.py
new file mode 100755
index 0000000..2f5d03d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Andorra.py
@@ -0,0 +1,234 @@
+'''tzinfo timezone information for Europe/Andorra.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Andorra(DstTzInfo):
+    '''Europe/Andorra timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Andorra'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1946,9,30,0,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'WET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Andorra = Andorra()
+
diff --git a/lib/pytz/zoneinfo/Europe/Athens.py b/lib/pytz/zoneinfo/Europe/Athens.py
new file mode 100755
index 0000000..c76b196
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Athens.py
@@ -0,0 +1,294 @@
+'''tzinfo timezone information for Europe/Athens.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Athens(DstTzInfo):
+    '''Europe/Athens timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Athens'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,7,27,22,26,8),
+d(1932,7,6,22,0,0),
+d(1932,8,31,21,0,0),
+d(1941,4,6,22,0,0),
+d(1941,4,29,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,23,0,0),
+d(1943,10,3,22,0,0),
+d(1944,4,3,23,0,0),
+d(1952,6,30,22,0,0),
+d(1952,11,1,21,0,0),
+d(1975,4,11,22,0,0),
+d(1975,11,25,22,0,0),
+d(1976,4,11,0,0,0),
+d(1976,10,10,0,0,0),
+d(1977,4,3,0,0,0),
+d(1977,9,26,0,0,0),
+d(1978,4,2,0,0,0),
+d(1978,9,24,1,0,0),
+d(1979,4,1,7,0,0),
+d(1979,9,28,23,0,0),
+d(1980,3,31,22,0,0),
+d(1980,9,27,21,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(5700,0,'AMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Athens = Athens()
+
diff --git a/lib/pytz/zoneinfo/Europe/Belfast.py b/lib/pytz/zoneinfo/Europe/Belfast.py
new file mode 100755
index 0000000..fa9c7b8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Belfast.py
@@ -0,0 +1,504 @@
+'''tzinfo timezone information for Europe/Belfast.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Belfast(DstTzInfo):
+    '''Europe/Belfast timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Belfast'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,0,0),
+d(1916,10,1,2,0,0),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,1,0,0),
+d(1941,8,10,1,0,0),
+d(1942,4,5,1,0,0),
+d(1942,8,9,1,0,0),
+d(1943,4,4,1,0,0),
+d(1943,8,15,1,0,0),
+d(1944,4,2,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,7,15,1,0,0),
+d(1945,10,7,2,0,0),
+d(1946,4,14,2,0,0),
+d(1946,10,6,2,0,0),
+d(1947,3,16,2,0,0),
+d(1947,4,13,1,0,0),
+d(1947,8,10,1,0,0),
+d(1947,11,2,2,0,0),
+d(1948,3,14,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(3600,0,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+        ]
+
+Belfast = Belfast()
+
diff --git a/lib/pytz/zoneinfo/Europe/Belgrade.py b/lib/pytz/zoneinfo/Europe/Belgrade.py
new file mode 100755
index 0000000..9d36375
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Belgrade.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for Europe/Belgrade.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Belgrade(DstTzInfo):
+    '''Europe/Belgrade timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Belgrade'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,4,18,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,5,8,1,0,0),
+d(1945,9,16,1,0,0),
+d(1982,11,26,23,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Belgrade = Belgrade()
+
diff --git a/lib/pytz/zoneinfo/Europe/Berlin.py b/lib/pytz/zoneinfo/Europe/Berlin.py
new file mode 100755
index 0000000..bf588a1
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Berlin.py
@@ -0,0 +1,306 @@
+'''tzinfo timezone information for Europe/Berlin.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Berlin(DstTzInfo):
+    '''Europe/Berlin timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Berlin'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1940,4,1,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,5,24,0,0,0),
+d(1945,9,24,0,0,0),
+d(1945,11,18,1,0,0),
+d(1946,4,14,1,0,0),
+d(1946,10,7,1,0,0),
+d(1947,4,6,1,0,0),
+d(1947,5,11,1,0,0),
+d(1947,6,29,0,0,0),
+d(1947,10,5,1,0,0),
+d(1948,4,18,1,0,0),
+d(1948,10,3,1,0,0),
+d(1949,4,10,1,0,0),
+d(1949,10,2,1,0,0),
+d(1979,12,31,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(10800,7200,'CEMT'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(10800,7200,'CEMT'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Berlin = Berlin()
+
diff --git a/lib/pytz/zoneinfo/Europe/Bratislava.py b/lib/pytz/zoneinfo/Europe/Bratislava.py
new file mode 100755
index 0000000..db606b7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Bratislava.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Europe/Bratislava.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bratislava(DstTzInfo):
+    '''Europe/Bratislava timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Bratislava'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1940,4,1,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,8,1,0,0),
+d(1945,11,18,1,0,0),
+d(1946,5,6,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,4,20,1,0,0),
+d(1947,10,5,1,0,0),
+d(1948,4,18,1,0,0),
+d(1948,10,3,1,0,0),
+d(1949,4,9,1,0,0),
+d(1949,10,2,1,0,0),
+d(1978,12,31,23,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Bratislava = Bratislava()
+
diff --git a/lib/pytz/zoneinfo/Europe/Brussels.py b/lib/pytz/zoneinfo/Europe/Brussels.py
new file mode 100755
index 0000000..51a28a3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Brussels.py
@@ -0,0 +1,390 @@
+'''tzinfo timezone information for Europe/Brussels.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Brussels(DstTzInfo):
+    '''Europe/Brussels timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Brussels'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1914,11,8,0,0,0),
+d(1916,4,30,23,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1918,11,11,11,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,4,23,0,0),
+d(1920,2,14,23,0,0),
+d(1920,10,23,23,0,0),
+d(1921,3,14,23,0,0),
+d(1921,10,25,23,0,0),
+d(1922,3,25,23,0,0),
+d(1922,10,7,23,0,0),
+d(1923,4,21,23,0,0),
+d(1923,10,6,23,0,0),
+d(1924,3,29,23,0,0),
+d(1924,10,4,23,0,0),
+d(1925,4,4,23,0,0),
+d(1925,10,3,23,0,0),
+d(1926,4,17,23,0,0),
+d(1926,10,2,23,0,0),
+d(1927,4,9,23,0,0),
+d(1927,10,1,23,0,0),
+d(1928,4,14,23,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,3,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,3,26,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,8,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,3,31,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,4,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,3,27,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1940,5,20,2,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,9,2,22,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,16,1,0,0),
+d(1946,5,19,1,0,0),
+d(1946,10,7,1,0,0),
+d(1976,12,31,23,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'WET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Brussels = Brussels()
+
diff --git a/lib/pytz/zoneinfo/Europe/Bucharest.py b/lib/pytz/zoneinfo/Europe/Bucharest.py
new file mode 100755
index 0000000..c565d9e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Bucharest.py
@@ -0,0 +1,294 @@
+'''tzinfo timezone information for Europe/Bucharest.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Bucharest(DstTzInfo):
+    '''Europe/Bucharest timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Bucharest'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1931,7,23,22,15,36),
+d(1932,5,20,22,0,0),
+d(1932,10,1,22,0,0),
+d(1933,4,1,22,0,0),
+d(1933,9,30,22,0,0),
+d(1934,4,7,22,0,0),
+d(1934,10,6,22,0,0),
+d(1935,4,6,22,0,0),
+d(1935,10,5,22,0,0),
+d(1936,4,4,22,0,0),
+d(1936,10,3,22,0,0),
+d(1937,4,3,22,0,0),
+d(1937,10,2,22,0,0),
+d(1938,4,2,22,0,0),
+d(1938,10,1,22,0,0),
+d(1939,4,1,22,0,0),
+d(1939,9,30,22,0,0),
+d(1979,5,26,22,0,0),
+d(1979,9,29,21,0,0),
+d(1980,4,5,21,0,0),
+d(1980,9,27,22,0,0),
+d(1981,3,29,0,0,0),
+d(1981,9,27,0,0,0),
+d(1982,3,28,0,0,0),
+d(1982,9,26,0,0,0),
+d(1983,3,27,0,0,0),
+d(1983,9,25,0,0,0),
+d(1984,3,25,0,0,0),
+d(1984,9,30,0,0,0),
+d(1985,3,31,0,0,0),
+d(1985,9,29,0,0,0),
+d(1986,3,30,0,0,0),
+d(1986,9,28,0,0,0),
+d(1987,3,29,0,0,0),
+d(1987,9,27,0,0,0),
+d(1988,3,27,0,0,0),
+d(1988,9,25,0,0,0),
+d(1989,3,26,0,0,0),
+d(1989,9,24,0,0,0),
+d(1990,3,25,0,0,0),
+d(1990,9,30,0,0,0),
+d(1990,12,31,22,0,0),
+d(1991,3,30,22,0,0),
+d(1991,9,28,22,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,22,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,22,0,0),
+d(1993,12,31,22,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,22,0,0),
+d(1996,10,26,21,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(6240,0,'BMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Bucharest = Bucharest()
+
diff --git a/lib/pytz/zoneinfo/Europe/Budapest.py b/lib/pytz/zoneinfo/Europe/Budapest.py
new file mode 100755
index 0000000..3421346
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Budapest.py
@@ -0,0 +1,326 @@
+'''tzinfo timezone information for Europe/Budapest.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Budapest(DstTzInfo):
+    '''Europe/Budapest timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Budapest'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1917,12,31,23,0,0),
+d(1918,4,1,2,0,0),
+d(1918,9,29,1,0,0),
+d(1919,4,15,2,0,0),
+d(1919,9,15,1,0,0),
+d(1920,4,5,2,0,0),
+d(1920,9,30,1,0,0),
+d(1941,4,6,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,5,1,22,0,0),
+d(1945,11,2,22,0,0),
+d(1946,3,31,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,4,6,1,0,0),
+d(1947,10,5,1,0,0),
+d(1948,4,4,1,0,0),
+d(1948,10,3,1,0,0),
+d(1949,4,10,1,0,0),
+d(1949,10,2,1,0,0),
+d(1950,4,17,1,0,0),
+d(1950,10,23,1,0,0),
+d(1954,5,22,23,0,0),
+d(1954,10,2,22,0,0),
+d(1955,5,22,23,0,0),
+d(1955,10,2,22,0,0),
+d(1956,6,2,23,0,0),
+d(1956,9,29,22,0,0),
+d(1957,6,2,0,0,0),
+d(1957,9,29,1,0,0),
+d(1980,4,6,0,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Budapest = Budapest()
+
diff --git a/lib/pytz/zoneinfo/Europe/Chisinau.py b/lib/pytz/zoneinfo/Europe/Chisinau.py
new file mode 100755
index 0000000..a433db3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Chisinau.py
@@ -0,0 +1,300 @@
+'''tzinfo timezone information for Europe/Chisinau.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Chisinau(DstTzInfo):
+    '''Europe/Chisinau timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Chisinau'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,2,14,22,5,0),
+d(1931,7,23,22,15,36),
+d(1932,5,20,22,0,0),
+d(1932,10,1,22,0,0),
+d(1933,4,1,22,0,0),
+d(1933,9,30,22,0,0),
+d(1934,4,7,22,0,0),
+d(1934,10,6,22,0,0),
+d(1935,4,6,22,0,0),
+d(1935,10,5,22,0,0),
+d(1936,4,4,22,0,0),
+d(1936,10,3,22,0,0),
+d(1937,4,3,22,0,0),
+d(1937,10,2,22,0,0),
+d(1938,4,2,22,0,0),
+d(1938,10,1,22,0,0),
+d(1939,4,1,22,0,0),
+d(1939,9,30,22,0,0),
+d(1940,8,14,22,0,0),
+d(1941,7,16,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,8,23,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1989,12,31,21,0,0),
+d(1990,5,5,21,0,0),
+d(1991,3,31,0,0,0),
+d(1991,9,29,0,0,0),
+d(1991,12,31,22,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,22,0,0),
+d(1996,10,26,21,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(6900,0,'CMT'),
+i(6240,0,'BMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'MSK'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Chisinau = Chisinau()
+
diff --git a/lib/pytz/zoneinfo/Europe/Copenhagen.py b/lib/pytz/zoneinfo/Europe/Copenhagen.py
new file mode 100755
index 0000000..9a0f2b6
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Copenhagen.py
@@ -0,0 +1,286 @@
+'''tzinfo timezone information for Europe/Copenhagen.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Copenhagen(DstTzInfo):
+    '''Europe/Copenhagen timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Copenhagen'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,14,22,0,0),
+d(1916,9,30,21,0,0),
+d(1940,5,14,23,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,8,15,1,0,0),
+d(1946,5,1,1,0,0),
+d(1946,9,1,1,0,0),
+d(1947,5,4,1,0,0),
+d(1947,8,10,1,0,0),
+d(1948,5,9,1,0,0),
+d(1948,8,8,1,0,0),
+d(1979,12,31,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Copenhagen = Copenhagen()
+
diff --git a/lib/pytz/zoneinfo/Europe/Dublin.py b/lib/pytz/zoneinfo/Europe/Dublin.py
new file mode 100755
index 0000000..845c206
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Dublin.py
@@ -0,0 +1,478 @@
+'''tzinfo timezone information for Europe/Dublin.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Dublin(DstTzInfo):
+    '''Europe/Dublin timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Dublin'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,25,21),
+d(1916,10,1,2,25,21),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1921,12,6,0,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1946,10,6,1,0,0),
+d(1947,3,16,2,0,0),
+d(1947,11,2,1,0,0),
+d(1948,4,18,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-1500,0,'DMT'),
+i(2100,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(3600,0,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+i(3600,3600,'IST'),
+i(0,0,'GMT'),
+        ]
+
+Dublin = Dublin()
+
diff --git a/lib/pytz/zoneinfo/Europe/Gibraltar.py b/lib/pytz/zoneinfo/Europe/Gibraltar.py
new file mode 100755
index 0000000..b0598e8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Gibraltar.py
@@ -0,0 +1,414 @@
+'''tzinfo timezone information for Europe/Gibraltar.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Gibraltar(DstTzInfo):
+    '''Europe/Gibraltar timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Gibraltar'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,0,0),
+d(1916,10,1,2,0,0),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,1,0,0),
+d(1941,8,10,1,0,0),
+d(1942,4,5,1,0,0),
+d(1942,8,9,1,0,0),
+d(1943,4,4,1,0,0),
+d(1943,8,15,1,0,0),
+d(1944,4,2,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,7,15,1,0,0),
+d(1945,10,7,2,0,0),
+d(1946,4,14,2,0,0),
+d(1946,10,6,2,0,0),
+d(1947,3,16,2,0,0),
+d(1947,4,13,1,0,0),
+d(1947,8,10,1,0,0),
+d(1947,11,2,2,0,0),
+d(1948,3,14,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Gibraltar = Gibraltar()
+
diff --git a/lib/pytz/zoneinfo/Europe/Guernsey.py b/lib/pytz/zoneinfo/Europe/Guernsey.py
new file mode 100755
index 0000000..7e1b9af
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Guernsey.py
@@ -0,0 +1,504 @@
+'''tzinfo timezone information for Europe/Guernsey.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Guernsey(DstTzInfo):
+    '''Europe/Guernsey timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Guernsey'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,0,0),
+d(1916,10,1,2,0,0),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,1,0,0),
+d(1941,8,10,1,0,0),
+d(1942,4,5,1,0,0),
+d(1942,8,9,1,0,0),
+d(1943,4,4,1,0,0),
+d(1943,8,15,1,0,0),
+d(1944,4,2,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,7,15,1,0,0),
+d(1945,10,7,2,0,0),
+d(1946,4,14,2,0,0),
+d(1946,10,6,2,0,0),
+d(1947,3,16,2,0,0),
+d(1947,4,13,1,0,0),
+d(1947,8,10,1,0,0),
+d(1947,11,2,2,0,0),
+d(1948,3,14,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(3600,0,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+        ]
+
+Guernsey = Guernsey()
+
diff --git a/lib/pytz/zoneinfo/Europe/Helsinki.py b/lib/pytz/zoneinfo/Europe/Helsinki.py
new file mode 100755
index 0000000..eefbebb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Helsinki.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Europe/Helsinki.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Helsinki(DstTzInfo):
+    '''Europe/Helsinki timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Helsinki'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1921,4,30,22,20,8),
+d(1942,4,2,22,0,0),
+d(1942,10,2,21,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(6000,0,'HMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Helsinki = Helsinki()
+
diff --git a/lib/pytz/zoneinfo/Europe/Isle_of_Man.py b/lib/pytz/zoneinfo/Europe/Isle_of_Man.py
new file mode 100755
index 0000000..b5667de
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Isle_of_Man.py
@@ -0,0 +1,504 @@
+'''tzinfo timezone information for Europe/Isle_of_Man.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Isle_of_Man(DstTzInfo):
+    '''Europe/Isle_of_Man timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Isle_of_Man'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,0,0),
+d(1916,10,1,2,0,0),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,1,0,0),
+d(1941,8,10,1,0,0),
+d(1942,4,5,1,0,0),
+d(1942,8,9,1,0,0),
+d(1943,4,4,1,0,0),
+d(1943,8,15,1,0,0),
+d(1944,4,2,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,7,15,1,0,0),
+d(1945,10,7,2,0,0),
+d(1946,4,14,2,0,0),
+d(1946,10,6,2,0,0),
+d(1947,3,16,2,0,0),
+d(1947,4,13,1,0,0),
+d(1947,8,10,1,0,0),
+d(1947,11,2,2,0,0),
+d(1948,3,14,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(3600,0,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+        ]
+
+Isle_of_Man = Isle_of_Man()
+
diff --git a/lib/pytz/zoneinfo/Europe/Istanbul.py b/lib/pytz/zoneinfo/Europe/Istanbul.py
new file mode 100755
index 0000000..7f02cca
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Istanbul.py
@@ -0,0 +1,362 @@
+'''tzinfo timezone information for Europe/Istanbul.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Istanbul(DstTzInfo):
+    '''Europe/Istanbul timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Istanbul'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1910,9,30,22,3,4),
+d(1916,4,30,22,0,0),
+d(1916,9,30,21,0,0),
+d(1920,3,27,22,0,0),
+d(1920,10,24,21,0,0),
+d(1921,4,2,22,0,0),
+d(1921,10,2,21,0,0),
+d(1922,3,25,22,0,0),
+d(1922,10,7,21,0,0),
+d(1924,5,12,22,0,0),
+d(1924,9,30,21,0,0),
+d(1925,4,30,22,0,0),
+d(1925,9,30,21,0,0),
+d(1940,6,29,22,0,0),
+d(1940,10,4,21,0,0),
+d(1940,11,30,22,0,0),
+d(1941,9,20,21,0,0),
+d(1942,3,31,22,0,0),
+d(1942,10,31,21,0,0),
+d(1945,4,1,22,0,0),
+d(1945,10,7,21,0,0),
+d(1946,5,31,22,0,0),
+d(1946,9,30,21,0,0),
+d(1947,4,19,22,0,0),
+d(1947,10,4,21,0,0),
+d(1948,4,17,22,0,0),
+d(1948,10,2,21,0,0),
+d(1949,4,9,22,0,0),
+d(1949,10,1,21,0,0),
+d(1950,4,18,22,0,0),
+d(1950,10,7,21,0,0),
+d(1951,4,21,22,0,0),
+d(1951,10,7,21,0,0),
+d(1962,7,14,22,0,0),
+d(1962,10,7,21,0,0),
+d(1964,5,14,22,0,0),
+d(1964,9,30,21,0,0),
+d(1970,5,2,22,0,0),
+d(1970,10,3,21,0,0),
+d(1971,5,1,22,0,0),
+d(1971,10,2,21,0,0),
+d(1972,5,6,22,0,0),
+d(1972,10,7,21,0,0),
+d(1973,6,2,23,0,0),
+d(1973,11,4,0,0,0),
+d(1974,3,31,0,0,0),
+d(1974,11,3,2,0,0),
+d(1975,3,29,22,0,0),
+d(1975,10,25,21,0,0),
+d(1976,5,31,22,0,0),
+d(1976,10,30,21,0,0),
+d(1977,4,2,22,0,0),
+d(1977,10,15,21,0,0),
+d(1978,4,1,22,0,0),
+d(1978,10,14,21,0,0),
+d(1979,10,14,20,0,0),
+d(1980,4,6,0,0,0),
+d(1980,10,12,20,0,0),
+d(1981,3,29,0,0,0),
+d(1981,10,11,20,0,0),
+d(1982,3,28,0,0,0),
+d(1982,10,10,20,0,0),
+d(1983,7,30,21,0,0),
+d(1983,10,1,20,0,0),
+d(1985,4,19,21,0,0),
+d(1985,9,27,21,0,0),
+d(1986,3,30,0,0,0),
+d(1986,9,28,0,0,0),
+d(1987,3,29,0,0,0),
+d(1987,9,27,0,0,0),
+d(1988,3,27,0,0,0),
+d(1988,9,25,0,0,0),
+d(1989,3,26,0,0,0),
+d(1989,9,24,0,0,0),
+d(1990,3,25,0,0,0),
+d(1990,9,30,0,0,0),
+d(1990,12,31,22,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(7020,0,'IMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(14400,7200,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Istanbul = Istanbul()
+
diff --git a/lib/pytz/zoneinfo/Europe/Jersey.py b/lib/pytz/zoneinfo/Europe/Jersey.py
new file mode 100755
index 0000000..4c5bd16
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Jersey.py
@@ -0,0 +1,504 @@
+'''tzinfo timezone information for Europe/Jersey.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jersey(DstTzInfo):
+    '''Europe/Jersey timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Jersey'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,0,0),
+d(1916,10,1,2,0,0),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,1,0,0),
+d(1941,8,10,1,0,0),
+d(1942,4,5,1,0,0),
+d(1942,8,9,1,0,0),
+d(1943,4,4,1,0,0),
+d(1943,8,15,1,0,0),
+d(1944,4,2,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,7,15,1,0,0),
+d(1945,10,7,2,0,0),
+d(1946,4,14,2,0,0),
+d(1946,10,6,2,0,0),
+d(1947,3,16,2,0,0),
+d(1947,4,13,1,0,0),
+d(1947,8,10,1,0,0),
+d(1947,11,2,2,0,0),
+d(1948,3,14,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(3600,0,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+        ]
+
+Jersey = Jersey()
+
diff --git a/lib/pytz/zoneinfo/Europe/Kaliningrad.py b/lib/pytz/zoneinfo/Europe/Kaliningrad.py
new file mode 100755
index 0000000..a0fe042
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Kaliningrad.py
@@ -0,0 +1,280 @@
+'''tzinfo timezone information for Europe/Kaliningrad.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kaliningrad(DstTzInfo):
+    '''Europe/Kaliningrad timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Kaliningrad'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1940,4,1,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1944,12,31,23,0,0),
+d(1945,4,28,22,0,0),
+d(1945,10,31,21,0,0),
+d(1945,12,31,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1990,3,24,23,0,0),
+d(1990,9,29,23,0,0),
+d(1991,3,30,23,0,0),
+d(1991,9,29,0,0,0),
+d(1992,3,28,21,0,0),
+d(1992,9,26,20,0,0),
+d(1993,3,28,0,0,0),
+d(1993,9,26,0,0,0),
+d(1994,3,27,0,0,0),
+d(1994,9,25,0,0,0),
+d(1995,3,26,0,0,0),
+d(1995,9,24,0,0,0),
+d(1996,3,31,0,0,0),
+d(1996,10,27,0,0,0),
+d(1997,3,30,0,0,0),
+d(1997,10,26,0,0,0),
+d(1998,3,29,0,0,0),
+d(1998,10,25,0,0,0),
+d(1999,3,28,0,0,0),
+d(1999,10,31,0,0,0),
+d(2000,3,26,0,0,0),
+d(2000,10,29,0,0,0),
+d(2001,3,25,0,0,0),
+d(2001,10,28,0,0,0),
+d(2002,3,31,0,0,0),
+d(2002,10,27,0,0,0),
+d(2003,3,30,0,0,0),
+d(2003,10,26,0,0,0),
+d(2004,3,28,0,0,0),
+d(2004,10,31,0,0,0),
+d(2005,3,27,0,0,0),
+d(2005,10,30,0,0,0),
+d(2006,3,26,0,0,0),
+d(2006,10,29,0,0,0),
+d(2007,3,25,0,0,0),
+d(2007,10,28,0,0,0),
+d(2008,3,30,0,0,0),
+d(2008,10,26,0,0,0),
+d(2009,3,29,0,0,0),
+d(2009,10,25,0,0,0),
+d(2010,3,28,0,0,0),
+d(2010,10,31,0,0,0),
+d(2011,3,27,0,0,0),
+d(2011,10,30,0,0,0),
+d(2012,3,25,0,0,0),
+d(2012,10,28,0,0,0),
+d(2013,3,31,0,0,0),
+d(2013,10,27,0,0,0),
+d(2014,3,30,0,0,0),
+d(2014,10,26,0,0,0),
+d(2015,3,29,0,0,0),
+d(2015,10,25,0,0,0),
+d(2016,3,27,0,0,0),
+d(2016,10,30,0,0,0),
+d(2017,3,26,0,0,0),
+d(2017,10,29,0,0,0),
+d(2018,3,25,0,0,0),
+d(2018,10,28,0,0,0),
+d(2019,3,31,0,0,0),
+d(2019,10,27,0,0,0),
+d(2020,3,29,0,0,0),
+d(2020,10,25,0,0,0),
+d(2021,3,28,0,0,0),
+d(2021,10,31,0,0,0),
+d(2022,3,27,0,0,0),
+d(2022,10,30,0,0,0),
+d(2023,3,26,0,0,0),
+d(2023,10,29,0,0,0),
+d(2024,3,31,0,0,0),
+d(2024,10,27,0,0,0),
+d(2025,3,30,0,0,0),
+d(2025,10,26,0,0,0),
+d(2026,3,29,0,0,0),
+d(2026,10,25,0,0,0),
+d(2027,3,28,0,0,0),
+d(2027,10,31,0,0,0),
+d(2028,3,26,0,0,0),
+d(2028,10,29,0,0,0),
+d(2029,3,25,0,0,0),
+d(2029,10,28,0,0,0),
+d(2030,3,31,0,0,0),
+d(2030,10,27,0,0,0),
+d(2031,3,30,0,0,0),
+d(2031,10,26,0,0,0),
+d(2032,3,28,0,0,0),
+d(2032,10,31,0,0,0),
+d(2033,3,27,0,0,0),
+d(2033,10,30,0,0,0),
+d(2034,3,26,0,0,0),
+d(2034,10,29,0,0,0),
+d(2035,3,25,0,0,0),
+d(2035,10,28,0,0,0),
+d(2036,3,30,0,0,0),
+d(2036,10,26,0,0,0),
+d(2037,3,29,0,0,0),
+d(2037,10,25,0,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,0,'CET'),
+i(10800,3600,'CEST'),
+i(7200,0,'CET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Kaliningrad = Kaliningrad()
+
diff --git a/lib/pytz/zoneinfo/Europe/Kiev.py b/lib/pytz/zoneinfo/Europe/Kiev.py
new file mode 100755
index 0000000..6219010
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Kiev.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for Europe/Kiev.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kiev(DstTzInfo):
+    '''Europe/Kiev timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Kiev'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,21,57,56),
+d(1930,6,20,22,0,0),
+d(1941,9,19,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1943,11,5,23,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1989,12,31,21,0,0),
+d(1990,6,30,23,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(7320,0,'KMT'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(7200,-3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'MSK'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Kiev = Kiev()
+
diff --git a/lib/pytz/zoneinfo/Europe/Lisbon.py b/lib/pytz/zoneinfo/Europe/Lisbon.py
new file mode 100755
index 0000000..a522a5e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Lisbon.py
@@ -0,0 +1,462 @@
+'''tzinfo timezone information for Europe/Lisbon.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Lisbon(DstTzInfo):
+    '''Europe/Lisbon timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Lisbon'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,0,36,32),
+d(1916,6,17,23,0,0),
+d(1916,11,1,0,0,0),
+d(1917,2,28,23,0,0),
+d(1917,10,14,23,0,0),
+d(1918,3,1,23,0,0),
+d(1918,10,14,23,0,0),
+d(1919,2,28,23,0,0),
+d(1919,10,14,23,0,0),
+d(1920,2,29,23,0,0),
+d(1920,10,14,23,0,0),
+d(1921,2,28,23,0,0),
+d(1921,10,14,23,0,0),
+d(1924,4,16,23,0,0),
+d(1924,10,14,23,0,0),
+d(1926,4,17,23,0,0),
+d(1926,10,2,23,0,0),
+d(1927,4,9,23,0,0),
+d(1927,10,1,23,0,0),
+d(1928,4,14,23,0,0),
+d(1928,10,6,23,0,0),
+d(1929,4,20,23,0,0),
+d(1929,10,5,23,0,0),
+d(1931,4,18,23,0,0),
+d(1931,10,3,23,0,0),
+d(1932,4,2,23,0,0),
+d(1932,10,1,23,0,0),
+d(1934,4,7,23,0,0),
+d(1934,10,6,23,0,0),
+d(1935,3,30,23,0,0),
+d(1935,10,5,23,0,0),
+d(1936,4,18,23,0,0),
+d(1936,10,3,23,0,0),
+d(1937,4,3,23,0,0),
+d(1937,10,2,23,0,0),
+d(1938,3,26,23,0,0),
+d(1938,10,1,23,0,0),
+d(1939,4,15,23,0,0),
+d(1939,11,18,23,0,0),
+d(1940,2,24,23,0,0),
+d(1940,10,5,23,0,0),
+d(1941,4,5,23,0,0),
+d(1941,10,5,23,0,0),
+d(1942,3,14,23,0,0),
+d(1942,4,25,22,0,0),
+d(1942,8,15,22,0,0),
+d(1942,10,24,23,0,0),
+d(1943,3,13,23,0,0),
+d(1943,4,17,22,0,0),
+d(1943,8,28,22,0,0),
+d(1943,10,30,23,0,0),
+d(1944,3,11,23,0,0),
+d(1944,4,22,22,0,0),
+d(1944,8,26,22,0,0),
+d(1944,10,28,23,0,0),
+d(1945,3,10,23,0,0),
+d(1945,4,21,22,0,0),
+d(1945,8,25,22,0,0),
+d(1945,10,27,23,0,0),
+d(1946,4,6,23,0,0),
+d(1946,10,5,23,0,0),
+d(1947,4,6,2,0,0),
+d(1947,10,5,2,0,0),
+d(1948,4,4,2,0,0),
+d(1948,10,3,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,2,2,0,0),
+d(1951,4,1,2,0,0),
+d(1951,10,7,2,0,0),
+d(1952,4,6,2,0,0),
+d(1952,10,5,2,0,0),
+d(1953,4,5,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,4,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,3,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,1,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,7,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,6,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,5,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,3,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,4,2,2,0,0),
+d(1961,10,1,2,0,0),
+d(1962,4,1,2,0,0),
+d(1962,10,7,2,0,0),
+d(1963,4,7,2,0,0),
+d(1963,10,6,2,0,0),
+d(1964,4,5,2,0,0),
+d(1964,10,4,2,0,0),
+d(1965,4,4,2,0,0),
+d(1965,10,3,2,0,0),
+d(1966,4,3,2,0,0),
+d(1976,9,26,0,0,0),
+d(1977,3,27,0,0,0),
+d(1977,9,25,0,0,0),
+d(1978,4,2,0,0,0),
+d(1978,10,1,0,0,0),
+d(1979,4,1,0,0,0),
+d(1979,9,30,1,0,0),
+d(1980,3,30,0,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,2,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-2220,0,'LMT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,0,'CET'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+        ]
+
+Lisbon = Lisbon()
+
diff --git a/lib/pytz/zoneinfo/Europe/Ljubljana.py b/lib/pytz/zoneinfo/Europe/Ljubljana.py
new file mode 100755
index 0000000..adf954f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Ljubljana.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for Europe/Ljubljana.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Ljubljana(DstTzInfo):
+    '''Europe/Ljubljana timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Ljubljana'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,4,18,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,5,8,1,0,0),
+d(1945,9,16,1,0,0),
+d(1982,11,26,23,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Ljubljana = Ljubljana()
+
diff --git a/lib/pytz/zoneinfo/Europe/London.py b/lib/pytz/zoneinfo/Europe/London.py
new file mode 100755
index 0000000..9eff598
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/London.py
@@ -0,0 +1,504 @@
+'''tzinfo timezone information for Europe/London.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class London(DstTzInfo):
+    '''Europe/London timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/London'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,0,0),
+d(1916,10,1,2,0,0),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,1,0,0),
+d(1941,8,10,1,0,0),
+d(1942,4,5,1,0,0),
+d(1942,8,9,1,0,0),
+d(1943,4,4,1,0,0),
+d(1943,8,15,1,0,0),
+d(1944,4,2,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,7,15,1,0,0),
+d(1945,10,7,2,0,0),
+d(1946,4,14,2,0,0),
+d(1946,10,6,2,0,0),
+d(1947,3,16,2,0,0),
+d(1947,4,13,1,0,0),
+d(1947,8,10,1,0,0),
+d(1947,11,2,2,0,0),
+d(1948,3,14,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(3600,0,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+        ]
+
+London = London()
+
diff --git a/lib/pytz/zoneinfo/Europe/Luxembourg.py b/lib/pytz/zoneinfo/Europe/Luxembourg.py
new file mode 100755
index 0000000..89884ec
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Luxembourg.py
@@ -0,0 +1,388 @@
+'''tzinfo timezone information for Europe/Luxembourg.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Luxembourg(DstTzInfo):
+    '''Europe/Luxembourg timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Luxembourg'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1904,5,31,23,35,24),
+d(1916,5,14,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,28,22,0,0),
+d(1917,9,16,23,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1918,11,24,23,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,5,2,0,0),
+d(1920,2,14,23,0,0),
+d(1920,10,24,1,0,0),
+d(1921,3,14,23,0,0),
+d(1921,10,26,1,0,0),
+d(1922,3,25,23,0,0),
+d(1922,10,8,0,0,0),
+d(1923,4,21,23,0,0),
+d(1923,10,7,1,0,0),
+d(1924,3,29,23,0,0),
+d(1924,10,5,0,0,0),
+d(1925,4,5,23,0,0),
+d(1925,10,4,0,0,0),
+d(1926,4,17,23,0,0),
+d(1926,10,3,0,0,0),
+d(1927,4,9,23,0,0),
+d(1927,10,2,0,0,0),
+d(1928,4,14,23,0,0),
+d(1928,10,7,0,0,0),
+d(1929,4,20,23,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,3,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,3,26,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,8,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,3,31,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,4,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,3,27,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1940,5,14,2,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,9,18,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,16,1,0,0),
+d(1946,5,19,1,0,0),
+d(1946,10,7,1,0,0),
+d(1976,12,31,23,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(1500,0,'LMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEST'),
+i(3600,0,'WET'),
+i(7200,3600,'WEST'),
+i(3600,0,'WET'),
+i(7200,3600,'WEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Luxembourg = Luxembourg()
+
diff --git a/lib/pytz/zoneinfo/Europe/Madrid.py b/lib/pytz/zoneinfo/Europe/Madrid.py
new file mode 100755
index 0000000..9d86ecf
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Madrid.py
@@ -0,0 +1,346 @@
+'''tzinfo timezone information for Europe/Madrid.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Madrid(DstTzInfo):
+    '''Europe/Madrid timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Madrid'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,5,5,23,0,0),
+d(1917,10,6,23,0,0),
+d(1918,4,15,23,0,0),
+d(1918,10,6,23,0,0),
+d(1919,4,5,23,0,0),
+d(1919,10,6,23,0,0),
+d(1924,4,16,23,0,0),
+d(1924,10,4,23,0,0),
+d(1926,4,17,23,0,0),
+d(1926,10,2,23,0,0),
+d(1927,4,9,23,0,0),
+d(1927,10,1,23,0,0),
+d(1928,4,14,23,0,0),
+d(1928,10,6,23,0,0),
+d(1929,4,20,23,0,0),
+d(1929,10,5,23,0,0),
+d(1937,5,22,23,0,0),
+d(1937,10,2,23,0,0),
+d(1938,3,22,23,0,0),
+d(1938,10,1,23,0,0),
+d(1939,4,15,23,0,0),
+d(1939,10,7,23,0,0),
+d(1940,3,16,23,0,0),
+d(1942,5,2,22,0,0),
+d(1942,9,1,22,0,0),
+d(1943,4,17,22,0,0),
+d(1943,10,3,22,0,0),
+d(1944,4,15,22,0,0),
+d(1944,10,10,22,0,0),
+d(1945,4,14,22,0,0),
+d(1945,9,29,23,0,0),
+d(1946,4,13,22,0,0),
+d(1946,9,29,22,0,0),
+d(1949,4,30,22,0,0),
+d(1949,9,29,23,0,0),
+d(1974,4,13,22,0,0),
+d(1974,10,5,23,0,0),
+d(1975,4,19,22,0,0),
+d(1975,10,4,23,0,0),
+d(1976,3,27,22,0,0),
+d(1976,9,25,23,0,0),
+d(1977,4,2,22,0,0),
+d(1977,9,24,23,0,0),
+d(1978,4,2,22,0,0),
+d(1978,9,30,23,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Madrid = Madrid()
+
diff --git a/lib/pytz/zoneinfo/Europe/Malta.py b/lib/pytz/zoneinfo/Europe/Malta.py
new file mode 100755
index 0000000..e361bfc
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Malta.py
@@ -0,0 +1,356 @@
+'''tzinfo timezone information for Europe/Malta.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Malta(DstTzInfo):
+    '''Europe/Malta timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Malta'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,6,2,23,0,0),
+d(1916,9,30,23,0,0),
+d(1917,3,31,23,0,0),
+d(1917,9,29,23,0,0),
+d(1918,3,9,23,0,0),
+d(1918,10,5,23,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,4,23,0,0),
+d(1920,3,20,23,0,0),
+d(1920,9,18,23,0,0),
+d(1940,6,14,23,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,14,23,0,0),
+d(1946,3,17,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,3,15,23,0,0),
+d(1947,10,4,23,0,0),
+d(1948,2,29,1,0,0),
+d(1948,10,3,1,0,0),
+d(1966,5,21,23,0,0),
+d(1966,9,24,22,0,0),
+d(1967,5,27,23,0,0),
+d(1967,9,23,22,0,0),
+d(1968,5,25,23,0,0),
+d(1968,9,21,22,0,0),
+d(1969,5,31,23,0,0),
+d(1969,9,27,22,0,0),
+d(1970,5,30,23,0,0),
+d(1970,9,26,22,0,0),
+d(1971,5,22,23,0,0),
+d(1971,9,25,23,0,0),
+d(1972,5,27,23,0,0),
+d(1972,9,30,22,0,0),
+d(1973,3,30,23,0,0),
+d(1973,9,28,23,0,0),
+d(1974,4,20,23,0,0),
+d(1974,9,15,23,0,0),
+d(1975,4,20,1,0,0),
+d(1975,9,21,0,0,0),
+d(1976,4,18,1,0,0),
+d(1976,9,19,0,0,0),
+d(1977,4,17,1,0,0),
+d(1977,9,18,0,0,0),
+d(1978,4,16,1,0,0),
+d(1978,9,17,0,0,0),
+d(1979,4,15,1,0,0),
+d(1979,9,16,0,0,0),
+d(1980,3,31,1,0,0),
+d(1980,9,21,0,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Malta = Malta()
+
diff --git a/lib/pytz/zoneinfo/Europe/Mariehamn.py b/lib/pytz/zoneinfo/Europe/Mariehamn.py
new file mode 100755
index 0000000..cd8bb70
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Mariehamn.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Europe/Mariehamn.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mariehamn(DstTzInfo):
+    '''Europe/Mariehamn timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Mariehamn'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1921,4,30,22,20,8),
+d(1942,4,2,22,0,0),
+d(1942,10,2,21,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(6000,0,'HMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Mariehamn = Mariehamn()
+
diff --git a/lib/pytz/zoneinfo/Europe/Minsk.py b/lib/pytz/zoneinfo/Europe/Minsk.py
new file mode 100755
index 0000000..2a1bb6d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Minsk.py
@@ -0,0 +1,262 @@
+'''tzinfo timezone information for Europe/Minsk.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Minsk(DstTzInfo):
+    '''Europe/Minsk timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Minsk'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,22,10,0),
+d(1930,6,20,22,0,0),
+d(1941,6,27,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,7,2,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1989,12,31,21,0,0),
+d(1991,3,30,23,0,0),
+d(1991,9,29,0,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,22,0,0),
+d(1993,3,28,0,0,0),
+d(1993,9,26,0,0,0),
+d(1994,3,27,0,0,0),
+d(1994,9,25,0,0,0),
+d(1995,3,26,0,0,0),
+d(1995,9,24,0,0,0),
+d(1996,3,31,0,0,0),
+d(1996,10,27,0,0,0),
+d(1997,3,30,0,0,0),
+d(1997,10,26,0,0,0),
+d(1998,3,29,0,0,0),
+d(1998,10,25,0,0,0),
+d(1999,3,28,0,0,0),
+d(1999,10,31,0,0,0),
+d(2000,3,26,0,0,0),
+d(2000,10,29,0,0,0),
+d(2001,3,25,0,0,0),
+d(2001,10,28,0,0,0),
+d(2002,3,31,0,0,0),
+d(2002,10,27,0,0,0),
+d(2003,3,30,0,0,0),
+d(2003,10,26,0,0,0),
+d(2004,3,28,0,0,0),
+d(2004,10,31,0,0,0),
+d(2005,3,27,0,0,0),
+d(2005,10,30,0,0,0),
+d(2006,3,26,0,0,0),
+d(2006,10,29,0,0,0),
+d(2007,3,25,0,0,0),
+d(2007,10,28,0,0,0),
+d(2008,3,30,0,0,0),
+d(2008,10,26,0,0,0),
+d(2009,3,29,0,0,0),
+d(2009,10,25,0,0,0),
+d(2010,3,28,0,0,0),
+d(2010,10,31,0,0,0),
+d(2011,3,27,0,0,0),
+d(2011,10,30,0,0,0),
+d(2012,3,25,0,0,0),
+d(2012,10,28,0,0,0),
+d(2013,3,31,0,0,0),
+d(2013,10,27,0,0,0),
+d(2014,3,30,0,0,0),
+d(2014,10,26,0,0,0),
+d(2015,3,29,0,0,0),
+d(2015,10,25,0,0,0),
+d(2016,3,27,0,0,0),
+d(2016,10,30,0,0,0),
+d(2017,3,26,0,0,0),
+d(2017,10,29,0,0,0),
+d(2018,3,25,0,0,0),
+d(2018,10,28,0,0,0),
+d(2019,3,31,0,0,0),
+d(2019,10,27,0,0,0),
+d(2020,3,29,0,0,0),
+d(2020,10,25,0,0,0),
+d(2021,3,28,0,0,0),
+d(2021,10,31,0,0,0),
+d(2022,3,27,0,0,0),
+d(2022,10,30,0,0,0),
+d(2023,3,26,0,0,0),
+d(2023,10,29,0,0,0),
+d(2024,3,31,0,0,0),
+d(2024,10,27,0,0,0),
+d(2025,3,30,0,0,0),
+d(2025,10,26,0,0,0),
+d(2026,3,29,0,0,0),
+d(2026,10,25,0,0,0),
+d(2027,3,28,0,0,0),
+d(2027,10,31,0,0,0),
+d(2028,3,26,0,0,0),
+d(2028,10,29,0,0,0),
+d(2029,3,25,0,0,0),
+d(2029,10,28,0,0,0),
+d(2030,3,31,0,0,0),
+d(2030,10,27,0,0,0),
+d(2031,3,30,0,0,0),
+d(2031,10,26,0,0,0),
+d(2032,3,28,0,0,0),
+d(2032,10,31,0,0,0),
+d(2033,3,27,0,0,0),
+d(2033,10,30,0,0,0),
+d(2034,3,26,0,0,0),
+d(2034,10,29,0,0,0),
+d(2035,3,25,0,0,0),
+d(2035,10,28,0,0,0),
+d(2036,3,30,0,0,0),
+d(2036,10,26,0,0,0),
+d(2037,3,29,0,0,0),
+d(2037,10,25,0,0,0),
+        ]
+
+    _transition_info = [
+i(6600,0,'MMT'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(7200,-3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Minsk = Minsk()
+
diff --git a/lib/pytz/zoneinfo/Europe/Monaco.py b/lib/pytz/zoneinfo/Europe/Monaco.py
new file mode 100755
index 0000000..4884ef2
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Monaco.py
@@ -0,0 +1,388 @@
+'''tzinfo timezone information for Europe/Monaco.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Monaco(DstTzInfo):
+    '''Europe/Monaco timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Monaco'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,3,10,23,50,39),
+d(1916,6,14,23,0,0),
+d(1916,10,1,23,0,0),
+d(1917,3,24,23,0,0),
+d(1917,10,7,23,0,0),
+d(1918,3,9,23,0,0),
+d(1918,10,6,23,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,5,23,0,0),
+d(1920,2,14,23,0,0),
+d(1920,10,23,23,0,0),
+d(1921,3,14,23,0,0),
+d(1921,10,25,23,0,0),
+d(1922,3,25,23,0,0),
+d(1922,10,7,23,0,0),
+d(1923,5,26,23,0,0),
+d(1923,10,6,23,0,0),
+d(1924,3,29,23,0,0),
+d(1924,10,4,23,0,0),
+d(1925,4,4,23,0,0),
+d(1925,10,3,23,0,0),
+d(1926,4,17,23,0,0),
+d(1926,10,2,23,0,0),
+d(1927,4,9,23,0,0),
+d(1927,10,1,23,0,0),
+d(1928,4,14,23,0,0),
+d(1928,10,6,23,0,0),
+d(1929,4,20,23,0,0),
+d(1929,10,5,23,0,0),
+d(1930,4,12,23,0,0),
+d(1930,10,4,23,0,0),
+d(1931,4,18,23,0,0),
+d(1931,10,3,23,0,0),
+d(1932,4,2,23,0,0),
+d(1932,10,1,23,0,0),
+d(1933,3,25,23,0,0),
+d(1933,10,7,23,0,0),
+d(1934,4,7,23,0,0),
+d(1934,10,6,23,0,0),
+d(1935,3,30,23,0,0),
+d(1935,10,5,23,0,0),
+d(1936,4,18,23,0,0),
+d(1936,10,3,23,0,0),
+d(1937,4,3,23,0,0),
+d(1937,10,2,23,0,0),
+d(1938,3,26,23,0,0),
+d(1938,10,1,23,0,0),
+d(1939,4,15,23,0,0),
+d(1939,11,18,23,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,23,0,0),
+d(1941,10,5,22,0,0),
+d(1942,3,8,23,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,7,23,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,16,1,0,0),
+d(1976,3,28,0,0,0),
+d(1976,9,25,23,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(540,0,'PMT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Monaco = Monaco()
+
diff --git a/lib/pytz/zoneinfo/Europe/Moscow.py b/lib/pytz/zoneinfo/Europe/Moscow.py
new file mode 100755
index 0000000..943112d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Moscow.py
@@ -0,0 +1,278 @@
+'''tzinfo timezone information for Europe/Moscow.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Moscow(DstTzInfo):
+    '''Europe/Moscow timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Moscow'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,7,2,21,30,0),
+d(1917,7,1,20,29,12),
+d(1917,12,27,20,29,12),
+d(1918,5,31,19,29,12),
+d(1918,9,15,20,29,12),
+d(1919,5,31,19,29,12),
+d(1919,6,30,21,29,12),
+d(1919,8,15,20,0,0),
+d(1921,2,14,20,0,0),
+d(1921,3,20,19,0,0),
+d(1921,8,31,19,0,0),
+d(1921,9,30,20,0,0),
+d(1922,9,30,21,0,0),
+d(1930,6,20,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1990,3,24,23,0,0),
+d(1990,9,29,23,0,0),
+d(1991,3,30,23,0,0),
+d(1991,9,29,0,0,0),
+d(1992,1,19,0,0,0),
+d(1992,3,28,20,0,0),
+d(1992,9,26,19,0,0),
+d(1993,3,27,23,0,0),
+d(1993,9,25,23,0,0),
+d(1994,3,26,23,0,0),
+d(1994,9,24,23,0,0),
+d(1995,3,25,23,0,0),
+d(1995,9,23,23,0,0),
+d(1996,3,30,23,0,0),
+d(1996,10,26,23,0,0),
+d(1997,3,29,23,0,0),
+d(1997,10,25,23,0,0),
+d(1998,3,28,23,0,0),
+d(1998,10,24,23,0,0),
+d(1999,3,27,23,0,0),
+d(1999,10,30,23,0,0),
+d(2000,3,25,23,0,0),
+d(2000,10,28,23,0,0),
+d(2001,3,24,23,0,0),
+d(2001,10,27,23,0,0),
+d(2002,3,30,23,0,0),
+d(2002,10,26,23,0,0),
+d(2003,3,29,23,0,0),
+d(2003,10,25,23,0,0),
+d(2004,3,27,23,0,0),
+d(2004,10,30,23,0,0),
+d(2005,3,26,23,0,0),
+d(2005,10,29,23,0,0),
+d(2006,3,25,23,0,0),
+d(2006,10,28,23,0,0),
+d(2007,3,24,23,0,0),
+d(2007,10,27,23,0,0),
+d(2008,3,29,23,0,0),
+d(2008,10,25,23,0,0),
+d(2009,3,28,23,0,0),
+d(2009,10,24,23,0,0),
+d(2010,3,27,23,0,0),
+d(2010,10,30,23,0,0),
+d(2011,3,26,23,0,0),
+d(2011,10,29,23,0,0),
+d(2012,3,24,23,0,0),
+d(2012,10,27,23,0,0),
+d(2013,3,30,23,0,0),
+d(2013,10,26,23,0,0),
+d(2014,3,29,23,0,0),
+d(2014,10,25,23,0,0),
+d(2015,3,28,23,0,0),
+d(2015,10,24,23,0,0),
+d(2016,3,26,23,0,0),
+d(2016,10,29,23,0,0),
+d(2017,3,25,23,0,0),
+d(2017,10,28,23,0,0),
+d(2018,3,24,23,0,0),
+d(2018,10,27,23,0,0),
+d(2019,3,30,23,0,0),
+d(2019,10,26,23,0,0),
+d(2020,3,28,23,0,0),
+d(2020,10,24,23,0,0),
+d(2021,3,27,23,0,0),
+d(2021,10,30,23,0,0),
+d(2022,3,26,23,0,0),
+d(2022,10,29,23,0,0),
+d(2023,3,25,23,0,0),
+d(2023,10,28,23,0,0),
+d(2024,3,30,23,0,0),
+d(2024,10,26,23,0,0),
+d(2025,3,29,23,0,0),
+d(2025,10,25,23,0,0),
+d(2026,3,28,23,0,0),
+d(2026,10,24,23,0,0),
+d(2027,3,27,23,0,0),
+d(2027,10,30,23,0,0),
+d(2028,3,25,23,0,0),
+d(2028,10,28,23,0,0),
+d(2029,3,24,23,0,0),
+d(2029,10,27,23,0,0),
+d(2030,3,30,23,0,0),
+d(2030,10,26,23,0,0),
+d(2031,3,29,23,0,0),
+d(2031,10,25,23,0,0),
+d(2032,3,27,23,0,0),
+d(2032,10,30,23,0,0),
+d(2033,3,26,23,0,0),
+d(2033,10,29,23,0,0),
+d(2034,3,25,23,0,0),
+d(2034,10,28,23,0,0),
+d(2035,3,24,23,0,0),
+d(2035,10,27,23,0,0),
+d(2036,3,29,23,0,0),
+d(2036,10,25,23,0,0),
+d(2037,3,28,23,0,0),
+d(2037,10,24,23,0,0),
+        ]
+
+    _transition_info = [
+i(9000,0,'MMT'),
+i(9060,0,'MMT'),
+i(12660,3600,'MST'),
+i(9060,0,'MMT'),
+i(16260,7200,'MDST'),
+i(12660,3600,'MST'),
+i(16260,7200,'MDST'),
+i(14400,5340,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(18000,7200,'MSD'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+        ]
+
+Moscow = Moscow()
+
diff --git a/lib/pytz/zoneinfo/Europe/Nicosia.py b/lib/pytz/zoneinfo/Europe/Nicosia.py
new file mode 100755
index 0000000..0eb3bc8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Nicosia.py
@@ -0,0 +1,274 @@
+'''tzinfo timezone information for Europe/Nicosia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Nicosia(DstTzInfo):
+    '''Europe/Nicosia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Nicosia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1921,11,13,21,46,32),
+d(1975,4,12,22,0,0),
+d(1975,10,11,21,0,0),
+d(1976,5,14,22,0,0),
+d(1976,10,10,21,0,0),
+d(1977,4,2,22,0,0),
+d(1977,9,24,21,0,0),
+d(1978,4,1,22,0,0),
+d(1978,10,1,21,0,0),
+d(1979,3,31,22,0,0),
+d(1979,9,29,21,0,0),
+d(1980,4,5,22,0,0),
+d(1980,9,27,21,0,0),
+d(1981,3,28,22,0,0),
+d(1981,9,26,21,0,0),
+d(1982,3,27,22,0,0),
+d(1982,9,25,21,0,0),
+d(1983,3,26,22,0,0),
+d(1983,9,24,21,0,0),
+d(1984,3,24,22,0,0),
+d(1984,9,29,21,0,0),
+d(1985,3,30,22,0,0),
+d(1985,9,28,21,0,0),
+d(1986,3,29,22,0,0),
+d(1986,9,27,21,0,0),
+d(1987,3,28,22,0,0),
+d(1987,9,26,21,0,0),
+d(1988,3,26,22,0,0),
+d(1988,9,24,21,0,0),
+d(1989,3,25,22,0,0),
+d(1989,9,23,21,0,0),
+d(1990,3,24,22,0,0),
+d(1990,9,29,21,0,0),
+d(1991,3,30,22,0,0),
+d(1991,9,28,21,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,22,0,0),
+d(1996,9,28,21,0,0),
+d(1997,3,29,22,0,0),
+d(1997,9,27,21,0,0),
+d(1998,3,28,22,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(7980,0,'LMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Nicosia = Nicosia()
+
diff --git a/lib/pytz/zoneinfo/Europe/Oslo.py b/lib/pytz/zoneinfo/Europe/Oslo.py
new file mode 100755
index 0000000..f2e4794
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Oslo.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Europe/Oslo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Oslo(DstTzInfo):
+    '''Europe/Oslo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Oslo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,22,0,0,0),
+d(1916,9,29,22,0,0),
+d(1940,8,10,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,10,1,1,0,0),
+d(1959,3,15,1,0,0),
+d(1959,9,20,1,0,0),
+d(1960,3,20,1,0,0),
+d(1960,9,18,1,0,0),
+d(1961,3,19,1,0,0),
+d(1961,9,17,1,0,0),
+d(1962,3,18,1,0,0),
+d(1962,9,16,1,0,0),
+d(1963,3,17,1,0,0),
+d(1963,9,15,1,0,0),
+d(1964,3,15,1,0,0),
+d(1964,9,20,1,0,0),
+d(1965,4,25,1,0,0),
+d(1965,9,19,1,0,0),
+d(1979,12,31,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Oslo = Oslo()
+
diff --git a/lib/pytz/zoneinfo/Europe/Paris.py b/lib/pytz/zoneinfo/Europe/Paris.py
new file mode 100755
index 0000000..59892b4
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Paris.py
@@ -0,0 +1,386 @@
+'''tzinfo timezone information for Europe/Paris.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Paris(DstTzInfo):
+    '''Europe/Paris timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Paris'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,3,10,23,51,39),
+d(1916,6,14,23,0,0),
+d(1916,10,1,23,0,0),
+d(1917,3,24,23,0,0),
+d(1917,10,7,23,0,0),
+d(1918,3,9,23,0,0),
+d(1918,10,6,23,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,5,23,0,0),
+d(1920,2,14,23,0,0),
+d(1920,10,23,23,0,0),
+d(1921,3,14,23,0,0),
+d(1921,10,25,23,0,0),
+d(1922,3,25,23,0,0),
+d(1922,10,7,23,0,0),
+d(1923,5,26,23,0,0),
+d(1923,10,6,23,0,0),
+d(1924,3,29,23,0,0),
+d(1924,10,4,23,0,0),
+d(1925,4,4,23,0,0),
+d(1925,10,3,23,0,0),
+d(1926,4,17,23,0,0),
+d(1926,10,2,23,0,0),
+d(1927,4,9,23,0,0),
+d(1927,10,1,23,0,0),
+d(1928,4,14,23,0,0),
+d(1928,10,6,23,0,0),
+d(1929,4,20,23,0,0),
+d(1929,10,5,23,0,0),
+d(1930,4,12,23,0,0),
+d(1930,10,4,23,0,0),
+d(1931,4,18,23,0,0),
+d(1931,10,3,23,0,0),
+d(1932,4,2,23,0,0),
+d(1932,10,1,23,0,0),
+d(1933,3,25,23,0,0),
+d(1933,10,7,23,0,0),
+d(1934,4,7,23,0,0),
+d(1934,10,6,23,0,0),
+d(1935,3,30,23,0,0),
+d(1935,10,5,23,0,0),
+d(1936,4,18,23,0,0),
+d(1936,10,3,23,0,0),
+d(1937,4,3,23,0,0),
+d(1937,10,2,23,0,0),
+d(1938,3,26,23,0,0),
+d(1938,10,1,23,0,0),
+d(1939,4,15,23,0,0),
+d(1939,11,18,23,0,0),
+d(1940,2,25,2,0,0),
+d(1940,6,14,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,8,24,22,0,0),
+d(1944,10,7,23,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,16,1,0,0),
+d(1976,3,28,0,0,0),
+d(1976,9,25,23,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(540,0,'PMT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,3600,'WEMT'),
+i(3600,0,'WEST'),
+i(7200,3600,'WEMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Paris = Paris()
+
diff --git a/lib/pytz/zoneinfo/Europe/Podgorica.py b/lib/pytz/zoneinfo/Europe/Podgorica.py
new file mode 100755
index 0000000..9be71d9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Podgorica.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for Europe/Podgorica.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Podgorica(DstTzInfo):
+    '''Europe/Podgorica timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Podgorica'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,4,18,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,5,8,1,0,0),
+d(1945,9,16,1,0,0),
+d(1982,11,26,23,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Podgorica = Podgorica()
+
diff --git a/lib/pytz/zoneinfo/Europe/Prague.py b/lib/pytz/zoneinfo/Europe/Prague.py
new file mode 100755
index 0000000..9c7f982
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Prague.py
@@ -0,0 +1,302 @@
+'''tzinfo timezone information for Europe/Prague.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Prague(DstTzInfo):
+    '''Europe/Prague timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Prague'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1940,4,1,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,8,1,0,0),
+d(1945,11,18,1,0,0),
+d(1946,5,6,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,4,20,1,0,0),
+d(1947,10,5,1,0,0),
+d(1948,4,18,1,0,0),
+d(1948,10,3,1,0,0),
+d(1949,4,9,1,0,0),
+d(1949,10,2,1,0,0),
+d(1978,12,31,23,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Prague = Prague()
+
diff --git a/lib/pytz/zoneinfo/Europe/Riga.py b/lib/pytz/zoneinfo/Europe/Riga.py
new file mode 100755
index 0000000..45b5972
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Riga.py
@@ -0,0 +1,274 @@
+'''tzinfo timezone information for Europe/Riga.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Riga(DstTzInfo):
+    '''Europe/Riga timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Riga'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,4,15,0,23,36),
+d(1918,9,16,0,23,36),
+d(1919,4,1,0,23,36),
+d(1919,5,22,0,23,36),
+d(1926,5,10,22,23,36),
+d(1940,8,4,22,0,0),
+d(1941,6,30,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1944,10,12,23,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,24,0,0,0),
+d(1990,3,25,0,0,0),
+d(1990,9,30,0,0,0),
+d(1991,3,31,0,0,0),
+d(1991,9,29,0,0,0),
+d(1992,3,29,0,0,0),
+d(1992,9,27,0,0,0),
+d(1993,3,28,0,0,0),
+d(1993,9,26,0,0,0),
+d(1994,3,27,0,0,0),
+d(1994,9,25,0,0,0),
+d(1995,3,26,0,0,0),
+d(1995,9,24,0,0,0),
+d(1996,3,31,0,0,0),
+d(1996,9,29,0,0,0),
+d(1997,1,20,22,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,2,28,22,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(5760,0,'RMT'),
+i(9360,3600,'LST'),
+i(5760,0,'RMT'),
+i(9360,3600,'LST'),
+i(5760,0,'RMT'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(7200,-3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Riga = Riga()
+
diff --git a/lib/pytz/zoneinfo/Europe/Rome.py b/lib/pytz/zoneinfo/Europe/Rome.py
new file mode 100755
index 0000000..758a6ed
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Rome.py
@@ -0,0 +1,360 @@
+'''tzinfo timezone information for Europe/Rome.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rome(DstTzInfo):
+    '''Europe/Rome timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Rome'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,6,2,23,0,0),
+d(1916,9,30,23,0,0),
+d(1917,3,31,23,0,0),
+d(1917,9,29,23,0,0),
+d(1918,3,9,23,0,0),
+d(1918,10,5,23,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,4,23,0,0),
+d(1920,3,20,23,0,0),
+d(1920,9,18,23,0,0),
+d(1940,6,14,23,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,6,30,22,0,0),
+d(1944,9,16,23,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,14,23,0,0),
+d(1946,3,17,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,3,15,23,0,0),
+d(1947,10,4,23,0,0),
+d(1948,2,29,1,0,0),
+d(1948,10,3,1,0,0),
+d(1966,5,21,23,0,0),
+d(1966,9,24,22,0,0),
+d(1967,5,27,23,0,0),
+d(1967,9,23,22,0,0),
+d(1968,5,25,23,0,0),
+d(1968,9,21,22,0,0),
+d(1969,5,31,23,0,0),
+d(1969,9,27,22,0,0),
+d(1970,5,30,23,0,0),
+d(1970,9,26,22,0,0),
+d(1971,5,22,23,0,0),
+d(1971,9,25,23,0,0),
+d(1972,5,27,23,0,0),
+d(1972,9,30,22,0,0),
+d(1973,6,2,23,0,0),
+d(1973,9,29,22,0,0),
+d(1974,5,25,23,0,0),
+d(1974,9,28,22,0,0),
+d(1975,5,31,23,0,0),
+d(1975,9,27,23,0,0),
+d(1976,5,29,23,0,0),
+d(1976,9,25,23,0,0),
+d(1977,5,21,23,0,0),
+d(1977,9,24,23,0,0),
+d(1978,5,27,23,0,0),
+d(1978,9,30,23,0,0),
+d(1979,5,26,23,0,0),
+d(1979,9,29,23,0,0),
+d(1979,12,31,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Rome = Rome()
+
diff --git a/lib/pytz/zoneinfo/Europe/Samara.py b/lib/pytz/zoneinfo/Europe/Samara.py
new file mode 100755
index 0000000..cb67e77
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Samara.py
@@ -0,0 +1,256 @@
+'''tzinfo timezone information for Europe/Samara.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Samara(DstTzInfo):
+    '''Europe/Samara timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Samara'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,6,30,22,39,24),
+d(1930,6,20,21,0,0),
+d(1935,1,26,20,0,0),
+d(1981,3,31,20,0,0),
+d(1981,9,30,19,0,0),
+d(1982,3,31,20,0,0),
+d(1982,9,30,19,0,0),
+d(1983,3,31,20,0,0),
+d(1983,9,30,19,0,0),
+d(1984,3,31,20,0,0),
+d(1984,9,29,22,0,0),
+d(1985,3,30,22,0,0),
+d(1985,9,28,22,0,0),
+d(1986,3,29,22,0,0),
+d(1986,9,27,22,0,0),
+d(1987,3,28,22,0,0),
+d(1987,9,26,22,0,0),
+d(1988,3,26,22,0,0),
+d(1988,9,24,22,0,0),
+d(1989,3,25,22,0,0),
+d(1989,9,23,23,0,0),
+d(1990,3,24,23,0,0),
+d(1990,9,29,23,0,0),
+d(1991,3,30,23,0,0),
+d(1991,9,29,0,0,0),
+d(1991,10,20,0,0,0),
+d(1992,3,28,19,0,0),
+d(1992,9,26,18,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,22,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,22,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,22,0,0),
+d(1996,3,30,22,0,0),
+d(1996,10,26,22,0,0),
+d(1997,3,29,22,0,0),
+d(1997,10,25,22,0,0),
+d(1998,3,28,22,0,0),
+d(1998,10,24,22,0,0),
+d(1999,3,27,22,0,0),
+d(1999,10,30,22,0,0),
+d(2000,3,25,22,0,0),
+d(2000,10,28,22,0,0),
+d(2001,3,24,22,0,0),
+d(2001,10,27,22,0,0),
+d(2002,3,30,22,0,0),
+d(2002,10,26,22,0,0),
+d(2003,3,29,22,0,0),
+d(2003,10,25,22,0,0),
+d(2004,3,27,22,0,0),
+d(2004,10,30,22,0,0),
+d(2005,3,26,22,0,0),
+d(2005,10,29,22,0,0),
+d(2006,3,25,22,0,0),
+d(2006,10,28,22,0,0),
+d(2007,3,24,22,0,0),
+d(2007,10,27,22,0,0),
+d(2008,3,29,22,0,0),
+d(2008,10,25,22,0,0),
+d(2009,3,28,22,0,0),
+d(2009,10,24,22,0,0),
+d(2010,3,27,22,0,0),
+d(2010,10,30,22,0,0),
+d(2011,3,26,22,0,0),
+d(2011,10,29,22,0,0),
+d(2012,3,24,22,0,0),
+d(2012,10,27,22,0,0),
+d(2013,3,30,22,0,0),
+d(2013,10,26,22,0,0),
+d(2014,3,29,22,0,0),
+d(2014,10,25,22,0,0),
+d(2015,3,28,22,0,0),
+d(2015,10,24,22,0,0),
+d(2016,3,26,22,0,0),
+d(2016,10,29,22,0,0),
+d(2017,3,25,22,0,0),
+d(2017,10,28,22,0,0),
+d(2018,3,24,22,0,0),
+d(2018,10,27,22,0,0),
+d(2019,3,30,22,0,0),
+d(2019,10,26,22,0,0),
+d(2020,3,28,22,0,0),
+d(2020,10,24,22,0,0),
+d(2021,3,27,22,0,0),
+d(2021,10,30,22,0,0),
+d(2022,3,26,22,0,0),
+d(2022,10,29,22,0,0),
+d(2023,3,25,22,0,0),
+d(2023,10,28,22,0,0),
+d(2024,3,30,22,0,0),
+d(2024,10,26,22,0,0),
+d(2025,3,29,22,0,0),
+d(2025,10,25,22,0,0),
+d(2026,3,28,22,0,0),
+d(2026,10,24,22,0,0),
+d(2027,3,27,22,0,0),
+d(2027,10,30,22,0,0),
+d(2028,3,25,22,0,0),
+d(2028,10,28,22,0,0),
+d(2029,3,24,22,0,0),
+d(2029,10,27,22,0,0),
+d(2030,3,30,22,0,0),
+d(2030,10,26,22,0,0),
+d(2031,3,29,22,0,0),
+d(2031,10,25,22,0,0),
+d(2032,3,27,22,0,0),
+d(2032,10,30,22,0,0),
+d(2033,3,26,22,0,0),
+d(2033,10,29,22,0,0),
+d(2034,3,25,22,0,0),
+d(2034,10,28,22,0,0),
+d(2035,3,24,22,0,0),
+d(2035,10,27,22,0,0),
+d(2036,3,29,22,0,0),
+d(2036,10,25,22,0,0),
+d(2037,3,28,22,0,0),
+d(2037,10,24,22,0,0),
+        ]
+
+    _transition_info = [
+i(12060,0,'LMT'),
+i(10800,0,'SAMT'),
+i(14400,0,'SAMT'),
+i(14400,0,'KUYT'),
+i(18000,3600,'KUYST'),
+i(14400,0,'KUYT'),
+i(18000,3600,'KUYST'),
+i(14400,0,'KUYT'),
+i(18000,3600,'KUYST'),
+i(14400,0,'KUYT'),
+i(18000,3600,'KUYST'),
+i(14400,0,'KUYT'),
+i(18000,3600,'KUYST'),
+i(14400,0,'KUYT'),
+i(18000,3600,'KUYST'),
+i(14400,0,'KUYT'),
+i(18000,3600,'KUYST'),
+i(14400,0,'KUYT'),
+i(18000,3600,'KUYST'),
+i(14400,0,'KUYT'),
+i(14400,0,'KUYST'),
+i(10800,0,'KUYT'),
+i(14400,3600,'KUYST'),
+i(10800,0,'KUYT'),
+i(10800,0,'KUYST'),
+i(10800,0,'KUYT'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+i(18000,3600,'SAMST'),
+i(14400,0,'SAMT'),
+        ]
+
+Samara = Samara()
+
diff --git a/lib/pytz/zoneinfo/Europe/San_Marino.py b/lib/pytz/zoneinfo/Europe/San_Marino.py
new file mode 100755
index 0000000..dae6253
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/San_Marino.py
@@ -0,0 +1,360 @@
+'''tzinfo timezone information for Europe/San_Marino.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class San_Marino(DstTzInfo):
+    '''Europe/San_Marino timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/San_Marino'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,6,2,23,0,0),
+d(1916,9,30,23,0,0),
+d(1917,3,31,23,0,0),
+d(1917,9,29,23,0,0),
+d(1918,3,9,23,0,0),
+d(1918,10,5,23,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,4,23,0,0),
+d(1920,3,20,23,0,0),
+d(1920,9,18,23,0,0),
+d(1940,6,14,23,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,6,30,22,0,0),
+d(1944,9,16,23,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,14,23,0,0),
+d(1946,3,17,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,3,15,23,0,0),
+d(1947,10,4,23,0,0),
+d(1948,2,29,1,0,0),
+d(1948,10,3,1,0,0),
+d(1966,5,21,23,0,0),
+d(1966,9,24,22,0,0),
+d(1967,5,27,23,0,0),
+d(1967,9,23,22,0,0),
+d(1968,5,25,23,0,0),
+d(1968,9,21,22,0,0),
+d(1969,5,31,23,0,0),
+d(1969,9,27,22,0,0),
+d(1970,5,30,23,0,0),
+d(1970,9,26,22,0,0),
+d(1971,5,22,23,0,0),
+d(1971,9,25,23,0,0),
+d(1972,5,27,23,0,0),
+d(1972,9,30,22,0,0),
+d(1973,6,2,23,0,0),
+d(1973,9,29,22,0,0),
+d(1974,5,25,23,0,0),
+d(1974,9,28,22,0,0),
+d(1975,5,31,23,0,0),
+d(1975,9,27,23,0,0),
+d(1976,5,29,23,0,0),
+d(1976,9,25,23,0,0),
+d(1977,5,21,23,0,0),
+d(1977,9,24,23,0,0),
+d(1978,5,27,23,0,0),
+d(1978,9,30,23,0,0),
+d(1979,5,26,23,0,0),
+d(1979,9,29,23,0,0),
+d(1979,12,31,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+San_Marino = San_Marino()
+
diff --git a/lib/pytz/zoneinfo/Europe/Sarajevo.py b/lib/pytz/zoneinfo/Europe/Sarajevo.py
new file mode 100755
index 0000000..2b7d754
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Sarajevo.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for Europe/Sarajevo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Sarajevo(DstTzInfo):
+    '''Europe/Sarajevo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Sarajevo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,4,18,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,5,8,1,0,0),
+d(1945,9,16,1,0,0),
+d(1982,11,26,23,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Sarajevo = Sarajevo()
+
diff --git a/lib/pytz/zoneinfo/Europe/Simferopol.py b/lib/pytz/zoneinfo/Europe/Simferopol.py
new file mode 100755
index 0000000..63b47f9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Simferopol.py
@@ -0,0 +1,266 @@
+'''tzinfo timezone information for Europe/Simferopol.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Simferopol(DstTzInfo):
+    '''Europe/Simferopol timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Simferopol'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,21,44,0),
+d(1930,6,20,22,0,0),
+d(1941,10,31,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,4,12,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1989,12,31,21,0,0),
+d(1990,6,30,23,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,4,30,21,0,0),
+d(1994,9,24,20,0,0),
+d(1995,3,25,21,0,0),
+d(1995,9,23,20,0,0),
+d(1996,3,30,21,0,0),
+d(1996,3,31,0,0,0),
+d(1996,10,27,0,0,0),
+d(1996,12,31,21,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(8160,0,'SMT'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(7200,-3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'MSK'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(14400,7200,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Simferopol = Simferopol()
+
diff --git a/lib/pytz/zoneinfo/Europe/Skopje.py b/lib/pytz/zoneinfo/Europe/Skopje.py
new file mode 100755
index 0000000..c37e032
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Skopje.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for Europe/Skopje.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Skopje(DstTzInfo):
+    '''Europe/Skopje timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Skopje'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,4,18,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,5,8,1,0,0),
+d(1945,9,16,1,0,0),
+d(1982,11,26,23,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Skopje = Skopje()
+
diff --git a/lib/pytz/zoneinfo/Europe/Sofia.py b/lib/pytz/zoneinfo/Europe/Sofia.py
new file mode 100755
index 0000000..528daf7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Sofia.py
@@ -0,0 +1,270 @@
+'''tzinfo timezone information for Europe/Sofia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Sofia(DstTzInfo):
+    '''Europe/Sofia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Sofia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,2,0,0),
+d(1979,3,31,21,0,0),
+d(1979,9,30,22,0,0),
+d(1980,4,5,21,0,0),
+d(1980,9,28,22,0,0),
+d(1981,4,4,21,0,0),
+d(1981,9,26,23,0,0),
+d(1982,4,3,21,0,0),
+d(1982,9,26,0,0,0),
+d(1983,3,27,0,0,0),
+d(1983,9,25,0,0,0),
+d(1984,3,25,0,0,0),
+d(1984,9,30,0,0,0),
+d(1985,3,31,0,0,0),
+d(1985,9,29,0,0,0),
+d(1986,3,30,0,0,0),
+d(1986,9,28,0,0,0),
+d(1987,3,29,0,0,0),
+d(1987,9,27,0,0,0),
+d(1988,3,27,0,0,0),
+d(1988,9,25,0,0,0),
+d(1989,3,26,0,0,0),
+d(1989,9,24,0,0,0),
+d(1990,3,25,0,0,0),
+d(1990,9,30,0,0,0),
+d(1990,12,31,22,0,0),
+d(1991,3,30,22,0,0),
+d(1991,9,28,21,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,22,0,0),
+d(1996,10,26,21,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(7200,0,'EET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Sofia = Sofia()
+
diff --git a/lib/pytz/zoneinfo/Europe/Stockholm.py b/lib/pytz/zoneinfo/Europe/Stockholm.py
new file mode 100755
index 0000000..f9abbe6
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Stockholm.py
@@ -0,0 +1,256 @@
+'''tzinfo timezone information for Europe/Stockholm.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Stockholm(DstTzInfo):
+    '''Europe/Stockholm timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Stockholm'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,14,22,0,0),
+d(1916,9,30,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Stockholm = Stockholm()
+
diff --git a/lib/pytz/zoneinfo/Europe/Tallinn.py b/lib/pytz/zoneinfo/Europe/Tallinn.py
new file mode 100755
index 0000000..95e569a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Tallinn.py
@@ -0,0 +1,268 @@
+'''tzinfo timezone information for Europe/Tallinn.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tallinn(DstTzInfo):
+    '''Europe/Tallinn timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Tallinn'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,1,31,22,21,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1919,6,30,23,0,0),
+d(1921,4,30,22,21,0),
+d(1940,8,5,22,0,0),
+d(1941,9,14,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,9,21,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,24,0,0,0),
+d(1990,3,25,0,0,0),
+d(1990,9,30,0,0,0),
+d(1991,3,31,0,0,0),
+d(1991,9,29,0,0,0),
+d(1992,3,29,0,0,0),
+d(1992,9,27,0,0,0),
+d(1993,3,28,0,0,0),
+d(1993,9,26,0,0,0),
+d(1994,3,27,0,0,0),
+d(1994,9,25,0,0,0),
+d(1995,3,26,0,0,0),
+d(1995,9,24,0,0,0),
+d(1996,3,31,0,0,0),
+d(1996,10,27,0,0,0),
+d(1997,3,30,0,0,0),
+d(1997,10,26,0,0,0),
+d(1998,3,29,0,0,0),
+d(1998,9,21,21,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(1999,10,31,22,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(5940,0,'TMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(5940,0,'TMT'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(7200,-3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Tallinn = Tallinn()
+
diff --git a/lib/pytz/zoneinfo/Europe/Tirane.py b/lib/pytz/zoneinfo/Europe/Tirane.py
new file mode 100755
index 0000000..4dba9c2
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Tirane.py
@@ -0,0 +1,286 @@
+'''tzinfo timezone information for Europe/Tirane.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tirane(DstTzInfo):
+    '''Europe/Tirane timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Tirane'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1913,12,31,22,40,40),
+d(1940,6,15,23,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,4,10,1,0,0),
+d(1974,5,3,23,0,0),
+d(1974,10,1,22,0,0),
+d(1975,4,30,23,0,0),
+d(1975,10,1,22,0,0),
+d(1976,5,1,23,0,0),
+d(1976,10,2,22,0,0),
+d(1977,5,7,23,0,0),
+d(1977,10,1,22,0,0),
+d(1978,5,5,23,0,0),
+d(1978,9,30,22,0,0),
+d(1979,5,4,23,0,0),
+d(1979,9,29,22,0,0),
+d(1980,5,2,23,0,0),
+d(1980,10,3,22,0,0),
+d(1981,4,25,23,0,0),
+d(1981,9,26,22,0,0),
+d(1982,5,1,23,0,0),
+d(1982,10,2,22,0,0),
+d(1983,4,17,23,0,0),
+d(1983,9,30,22,0,0),
+d(1984,3,31,23,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(4740,0,'LMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Tirane = Tirane()
+
diff --git a/lib/pytz/zoneinfo/Europe/Tiraspol.py b/lib/pytz/zoneinfo/Europe/Tiraspol.py
new file mode 100755
index 0000000..7663b8c
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Tiraspol.py
@@ -0,0 +1,300 @@
+'''tzinfo timezone information for Europe/Tiraspol.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tiraspol(DstTzInfo):
+    '''Europe/Tiraspol timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Tiraspol'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,2,14,22,5,0),
+d(1931,7,23,22,15,36),
+d(1932,5,20,22,0,0),
+d(1932,10,1,22,0,0),
+d(1933,4,1,22,0,0),
+d(1933,9,30,22,0,0),
+d(1934,4,7,22,0,0),
+d(1934,10,6,22,0,0),
+d(1935,4,6,22,0,0),
+d(1935,10,5,22,0,0),
+d(1936,4,4,22,0,0),
+d(1936,10,3,22,0,0),
+d(1937,4,3,22,0,0),
+d(1937,10,2,22,0,0),
+d(1938,4,2,22,0,0),
+d(1938,10,1,22,0,0),
+d(1939,4,1,22,0,0),
+d(1939,9,30,22,0,0),
+d(1940,8,14,22,0,0),
+d(1941,7,16,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,8,23,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1989,12,31,21,0,0),
+d(1990,5,5,21,0,0),
+d(1991,3,31,0,0,0),
+d(1991,9,29,0,0,0),
+d(1991,12,31,22,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,25,22,0,0),
+d(1995,9,23,21,0,0),
+d(1996,3,30,22,0,0),
+d(1996,10,26,21,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(6900,0,'CMT'),
+i(6240,0,'BMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'MSK'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Tiraspol = Tiraspol()
+
diff --git a/lib/pytz/zoneinfo/Europe/Uzhgorod.py b/lib/pytz/zoneinfo/Europe/Uzhgorod.py
new file mode 100755
index 0000000..9da017f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Uzhgorod.py
@@ -0,0 +1,262 @@
+'''tzinfo timezone information for Europe/Uzhgorod.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Uzhgorod(DstTzInfo):
+    '''Europe/Uzhgorod timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Uzhgorod'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1940,4,1,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,9,30,22,0,0),
+d(1944,10,25,22,0,0),
+d(1945,6,28,23,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1989,12,31,21,0,0),
+d(1990,6,30,23,0,0),
+d(1991,3,31,2,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'MSK'),
+i(3600,0,'CET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Uzhgorod = Uzhgorod()
+
diff --git a/lib/pytz/zoneinfo/Europe/Vaduz.py b/lib/pytz/zoneinfo/Europe/Vaduz.py
new file mode 100755
index 0000000..c4af9b3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Vaduz.py
@@ -0,0 +1,248 @@
+'''tzinfo timezone information for Europe/Vaduz.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vaduz(DstTzInfo):
+    '''Europe/Vaduz timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Vaduz'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Vaduz = Vaduz()
+
diff --git a/lib/pytz/zoneinfo/Europe/Vatican.py b/lib/pytz/zoneinfo/Europe/Vatican.py
new file mode 100755
index 0000000..1806de2
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Vatican.py
@@ -0,0 +1,360 @@
+'''tzinfo timezone information for Europe/Vatican.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vatican(DstTzInfo):
+    '''Europe/Vatican timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Vatican'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,6,2,23,0,0),
+d(1916,9,30,23,0,0),
+d(1917,3,31,23,0,0),
+d(1917,9,29,23,0,0),
+d(1918,3,9,23,0,0),
+d(1918,10,5,23,0,0),
+d(1919,3,1,23,0,0),
+d(1919,10,4,23,0,0),
+d(1920,3,20,23,0,0),
+d(1920,9,18,23,0,0),
+d(1940,6,14,23,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,6,30,22,0,0),
+d(1944,9,16,23,0,0),
+d(1945,4,2,1,0,0),
+d(1945,9,14,23,0,0),
+d(1946,3,17,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,3,15,23,0,0),
+d(1947,10,4,23,0,0),
+d(1948,2,29,1,0,0),
+d(1948,10,3,1,0,0),
+d(1966,5,21,23,0,0),
+d(1966,9,24,22,0,0),
+d(1967,5,27,23,0,0),
+d(1967,9,23,22,0,0),
+d(1968,5,25,23,0,0),
+d(1968,9,21,22,0,0),
+d(1969,5,31,23,0,0),
+d(1969,9,27,22,0,0),
+d(1970,5,30,23,0,0),
+d(1970,9,26,22,0,0),
+d(1971,5,22,23,0,0),
+d(1971,9,25,23,0,0),
+d(1972,5,27,23,0,0),
+d(1972,9,30,22,0,0),
+d(1973,6,2,23,0,0),
+d(1973,9,29,22,0,0),
+d(1974,5,25,23,0,0),
+d(1974,9,28,22,0,0),
+d(1975,5,31,23,0,0),
+d(1975,9,27,23,0,0),
+d(1976,5,29,23,0,0),
+d(1976,9,25,23,0,0),
+d(1977,5,21,23,0,0),
+d(1977,9,24,23,0,0),
+d(1978,5,27,23,0,0),
+d(1978,9,30,23,0,0),
+d(1979,5,26,23,0,0),
+d(1979,9,29,23,0,0),
+d(1979,12,31,23,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Vatican = Vatican()
+
diff --git a/lib/pytz/zoneinfo/Europe/Vienna.py b/lib/pytz/zoneinfo/Europe/Vienna.py
new file mode 100755
index 0000000..5933d9d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Vienna.py
@@ -0,0 +1,300 @@
+'''tzinfo timezone information for Europe/Vienna.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vienna(DstTzInfo):
+    '''Europe/Vienna timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Vienna'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1919,12,31,23,0,0),
+d(1920,4,5,1,0,0),
+d(1920,9,13,1,0,0),
+d(1940,4,1,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,4,12,1,0,0),
+d(1945,12,31,23,0,0),
+d(1946,4,14,1,0,0),
+d(1946,10,6,1,0,0),
+d(1947,4,6,1,0,0),
+d(1947,10,5,1,0,0),
+d(1948,4,18,1,0,0),
+d(1948,10,3,1,0,0),
+d(1980,4,5,23,0,0),
+d(1980,9,27,22,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Vienna = Vienna()
+
diff --git a/lib/pytz/zoneinfo/Europe/Vilnius.py b/lib/pytz/zoneinfo/Europe/Vilnius.py
new file mode 100755
index 0000000..51e3f43
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Vilnius.py
@@ -0,0 +1,262 @@
+'''tzinfo timezone information for Europe/Vilnius.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Vilnius(DstTzInfo):
+    '''Europe/Vilnius timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Vilnius'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,12,31,22,36,0),
+d(1919,10,9,22,24,24),
+d(1920,7,11,23,0,0),
+d(1920,10,8,22,0,0),
+d(1940,8,2,23,0,0),
+d(1941,6,23,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,7,31,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1990,3,24,23,0,0),
+d(1990,9,29,23,0,0),
+d(1991,3,30,23,0,0),
+d(1991,9,29,0,0,0),
+d(1992,3,29,0,0,0),
+d(1992,9,27,0,0,0),
+d(1993,3,28,0,0,0),
+d(1993,9,26,0,0,0),
+d(1994,3,27,0,0,0),
+d(1994,9,25,0,0,0),
+d(1995,3,26,0,0,0),
+d(1995,9,24,0,0,0),
+d(1996,3,31,0,0,0),
+d(1996,10,27,0,0,0),
+d(1997,3,30,0,0,0),
+d(1997,10,26,0,0,0),
+d(1997,12,31,22,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2002,12,31,22,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(5040,0,'WMT'),
+i(5760,0,'KMT'),
+i(3600,0,'CET'),
+i(7200,0,'EET'),
+i(3600,0,'CET'),
+i(10800,0,'MSK'),
+i(7200,-3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(7200,0,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Vilnius = Vilnius()
+
diff --git a/lib/pytz/zoneinfo/Europe/Volgograd.py b/lib/pytz/zoneinfo/Europe/Volgograd.py
new file mode 100755
index 0000000..8204bdc
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Volgograd.py
@@ -0,0 +1,254 @@
+'''tzinfo timezone information for Europe/Volgograd.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Volgograd(DstTzInfo):
+    '''Europe/Volgograd timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Volgograd'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1920,1,2,21,2,20),
+d(1925,4,5,21,0,0),
+d(1930,6,20,21,0,0),
+d(1961,11,10,20,0,0),
+d(1981,3,31,20,0,0),
+d(1981,9,30,19,0,0),
+d(1982,3,31,20,0,0),
+d(1982,9,30,19,0,0),
+d(1983,3,31,20,0,0),
+d(1983,9,30,19,0,0),
+d(1984,3,31,20,0,0),
+d(1984,9,29,22,0,0),
+d(1985,3,30,22,0,0),
+d(1985,9,28,22,0,0),
+d(1986,3,29,22,0,0),
+d(1986,9,27,22,0,0),
+d(1987,3,28,22,0,0),
+d(1987,9,26,22,0,0),
+d(1988,3,26,22,0,0),
+d(1988,9,24,22,0,0),
+d(1989,3,25,22,0,0),
+d(1989,9,23,23,0,0),
+d(1990,3,24,23,0,0),
+d(1990,9,29,23,0,0),
+d(1991,3,30,23,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,19,0,0),
+d(1993,3,27,23,0,0),
+d(1993,9,25,23,0,0),
+d(1994,3,26,23,0,0),
+d(1994,9,24,23,0,0),
+d(1995,3,25,23,0,0),
+d(1995,9,23,23,0,0),
+d(1996,3,30,23,0,0),
+d(1996,10,26,23,0,0),
+d(1997,3,29,23,0,0),
+d(1997,10,25,23,0,0),
+d(1998,3,28,23,0,0),
+d(1998,10,24,23,0,0),
+d(1999,3,27,23,0,0),
+d(1999,10,30,23,0,0),
+d(2000,3,25,23,0,0),
+d(2000,10,28,23,0,0),
+d(2001,3,24,23,0,0),
+d(2001,10,27,23,0,0),
+d(2002,3,30,23,0,0),
+d(2002,10,26,23,0,0),
+d(2003,3,29,23,0,0),
+d(2003,10,25,23,0,0),
+d(2004,3,27,23,0,0),
+d(2004,10,30,23,0,0),
+d(2005,3,26,23,0,0),
+d(2005,10,29,23,0,0),
+d(2006,3,25,23,0,0),
+d(2006,10,28,23,0,0),
+d(2007,3,24,23,0,0),
+d(2007,10,27,23,0,0),
+d(2008,3,29,23,0,0),
+d(2008,10,25,23,0,0),
+d(2009,3,28,23,0,0),
+d(2009,10,24,23,0,0),
+d(2010,3,27,23,0,0),
+d(2010,10,30,23,0,0),
+d(2011,3,26,23,0,0),
+d(2011,10,29,23,0,0),
+d(2012,3,24,23,0,0),
+d(2012,10,27,23,0,0),
+d(2013,3,30,23,0,0),
+d(2013,10,26,23,0,0),
+d(2014,3,29,23,0,0),
+d(2014,10,25,23,0,0),
+d(2015,3,28,23,0,0),
+d(2015,10,24,23,0,0),
+d(2016,3,26,23,0,0),
+d(2016,10,29,23,0,0),
+d(2017,3,25,23,0,0),
+d(2017,10,28,23,0,0),
+d(2018,3,24,23,0,0),
+d(2018,10,27,23,0,0),
+d(2019,3,30,23,0,0),
+d(2019,10,26,23,0,0),
+d(2020,3,28,23,0,0),
+d(2020,10,24,23,0,0),
+d(2021,3,27,23,0,0),
+d(2021,10,30,23,0,0),
+d(2022,3,26,23,0,0),
+d(2022,10,29,23,0,0),
+d(2023,3,25,23,0,0),
+d(2023,10,28,23,0,0),
+d(2024,3,30,23,0,0),
+d(2024,10,26,23,0,0),
+d(2025,3,29,23,0,0),
+d(2025,10,25,23,0,0),
+d(2026,3,28,23,0,0),
+d(2026,10,24,23,0,0),
+d(2027,3,27,23,0,0),
+d(2027,10,30,23,0,0),
+d(2028,3,25,23,0,0),
+d(2028,10,28,23,0,0),
+d(2029,3,24,23,0,0),
+d(2029,10,27,23,0,0),
+d(2030,3,30,23,0,0),
+d(2030,10,26,23,0,0),
+d(2031,3,29,23,0,0),
+d(2031,10,25,23,0,0),
+d(2032,3,27,23,0,0),
+d(2032,10,30,23,0,0),
+d(2033,3,26,23,0,0),
+d(2033,10,29,23,0,0),
+d(2034,3,25,23,0,0),
+d(2034,10,28,23,0,0),
+d(2035,3,24,23,0,0),
+d(2035,10,27,23,0,0),
+d(2036,3,29,23,0,0),
+d(2036,10,25,23,0,0),
+d(2037,3,28,23,0,0),
+d(2037,10,24,23,0,0),
+        ]
+
+    _transition_info = [
+i(10680,0,'LMT'),
+i(10800,0,'TSAT'),
+i(10800,0,'STAT'),
+i(14400,0,'STAT'),
+i(14400,0,'VOLT'),
+i(18000,3600,'VOLST'),
+i(14400,0,'VOLT'),
+i(18000,3600,'VOLST'),
+i(14400,0,'VOLT'),
+i(18000,3600,'VOLST'),
+i(14400,0,'VOLT'),
+i(18000,3600,'VOLST'),
+i(14400,0,'VOLT'),
+i(18000,3600,'VOLST'),
+i(14400,0,'VOLT'),
+i(18000,3600,'VOLST'),
+i(14400,0,'VOLT'),
+i(18000,3600,'VOLST'),
+i(14400,0,'VOLT'),
+i(18000,3600,'VOLST'),
+i(14400,0,'VOLT'),
+i(14400,0,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,0,'VOLT'),
+i(14400,0,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+i(14400,3600,'VOLST'),
+i(10800,0,'VOLT'),
+        ]
+
+Volgograd = Volgograd()
+
diff --git a/lib/pytz/zoneinfo/Europe/Warsaw.py b/lib/pytz/zoneinfo/Europe/Warsaw.py
new file mode 100755
index 0000000..93f05b3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Warsaw.py
@@ -0,0 +1,354 @@
+'''tzinfo timezone information for Europe/Warsaw.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Warsaw(DstTzInfo):
+    '''Europe/Warsaw timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Warsaw'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1915,8,4,22,36,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1919,4,15,0,0,0),
+d(1919,9,16,0,0,0),
+d(1922,5,31,22,0,0),
+d(1940,6,23,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,9,30,22,0,0),
+d(1944,10,4,0,0,0),
+d(1945,4,28,23,0,0),
+d(1945,10,31,22,0,0),
+d(1946,4,13,23,0,0),
+d(1946,10,7,1,0,0),
+d(1947,5,4,1,0,0),
+d(1947,10,5,1,0,0),
+d(1948,4,18,1,0,0),
+d(1948,10,3,1,0,0),
+d(1949,4,10,1,0,0),
+d(1949,10,2,1,0,0),
+d(1957,6,2,0,0,0),
+d(1957,9,29,0,0,0),
+d(1958,3,30,0,0,0),
+d(1958,9,28,0,0,0),
+d(1959,5,31,0,0,0),
+d(1959,10,4,0,0,0),
+d(1960,4,3,0,0,0),
+d(1960,10,2,0,0,0),
+d(1961,5,28,0,0,0),
+d(1961,10,1,0,0,0),
+d(1962,5,27,0,0,0),
+d(1962,9,30,0,0,0),
+d(1963,5,26,0,0,0),
+d(1963,9,29,0,0,0),
+d(1964,5,31,0,0,0),
+d(1964,9,27,0,0,0),
+d(1976,12,31,23,0,0),
+d(1977,4,3,0,0,0),
+d(1977,9,25,0,0,0),
+d(1978,4,2,0,0,0),
+d(1978,10,1,0,0,0),
+d(1979,4,1,0,0,0),
+d(1979,9,30,0,0,0),
+d(1980,4,6,0,0,0),
+d(1980,9,28,0,0,0),
+d(1981,3,29,0,0,0),
+d(1981,9,27,0,0,0),
+d(1982,3,28,0,0,0),
+d(1982,9,26,0,0,0),
+d(1983,3,27,0,0,0),
+d(1983,9,25,0,0,0),
+d(1984,3,25,0,0,0),
+d(1984,9,30,0,0,0),
+d(1985,3,31,0,0,0),
+d(1985,9,29,0,0,0),
+d(1986,3,30,0,0,0),
+d(1986,9,28,0,0,0),
+d(1987,3,29,0,0,0),
+d(1987,9,27,0,0,0),
+d(1987,12,31,23,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(5040,0,'WMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Warsaw = Warsaw()
+
diff --git a/lib/pytz/zoneinfo/Europe/Zagreb.py b/lib/pytz/zoneinfo/Europe/Zagreb.py
new file mode 100755
index 0000000..18d5f3a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Zagreb.py
@@ -0,0 +1,258 @@
+'''tzinfo timezone information for Europe/Zagreb.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Zagreb(DstTzInfo):
+    '''Europe/Zagreb timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Zagreb'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1941,4,18,22,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1945,5,8,1,0,0),
+d(1945,9,16,1,0,0),
+d(1982,11,26,23,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Zagreb = Zagreb()
+
diff --git a/lib/pytz/zoneinfo/Europe/Zaporozhye.py b/lib/pytz/zoneinfo/Europe/Zaporozhye.py
new file mode 100755
index 0000000..51d0917
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Zaporozhye.py
@@ -0,0 +1,262 @@
+'''tzinfo timezone information for Europe/Zaporozhye.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Zaporozhye(DstTzInfo):
+    '''Europe/Zaporozhye timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Zaporozhye'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1924,5,1,21,40,0),
+d(1930,6,20,22,0,0),
+d(1941,8,24,21,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1943,10,24,23,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1990,3,24,23,0,0),
+d(1990,9,29,23,0,0),
+d(1991,3,30,23,0,0),
+d(1991,9,28,21,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,26,21,0,0),
+d(1993,3,27,22,0,0),
+d(1993,9,25,21,0,0),
+d(1994,3,26,22,0,0),
+d(1994,9,24,21,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(8400,0,'CUT'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(7200,-3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Zaporozhye = Zaporozhye()
+
diff --git a/lib/pytz/zoneinfo/Europe/Zurich.py b/lib/pytz/zoneinfo/Europe/Zurich.py
new file mode 100755
index 0000000..62ee715
--- /dev/null
+++ b/lib/pytz/zoneinfo/Europe/Zurich.py
@@ -0,0 +1,260 @@
+'''tzinfo timezone information for Europe/Zurich.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Zurich(DstTzInfo):
+    '''Europe/Zurich timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Europe/Zurich'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1940,11,1,23,0,0),
+d(1940,12,30,22,0,0),
+d(1941,5,4,1,0,0),
+d(1941,10,4,22,0,0),
+d(1942,5,3,1,0,0),
+d(1942,10,3,22,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Zurich = Zurich()
+
diff --git a/lib/pytz/zoneinfo/Europe/__init__.py b/lib/pytz/zoneinfo/Europe/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/GB.py b/lib/pytz/zoneinfo/GB.py
new file mode 100755
index 0000000..559ae59
--- /dev/null
+++ b/lib/pytz/zoneinfo/GB.py
@@ -0,0 +1,504 @@
+'''tzinfo timezone information for GB.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class GB(DstTzInfo):
+    '''GB timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'GB'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,0,0),
+d(1916,10,1,2,0,0),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,1,0,0),
+d(1941,8,10,1,0,0),
+d(1942,4,5,1,0,0),
+d(1942,8,9,1,0,0),
+d(1943,4,4,1,0,0),
+d(1943,8,15,1,0,0),
+d(1944,4,2,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,7,15,1,0,0),
+d(1945,10,7,2,0,0),
+d(1946,4,14,2,0,0),
+d(1946,10,6,2,0,0),
+d(1947,3,16,2,0,0),
+d(1947,4,13,1,0,0),
+d(1947,8,10,1,0,0),
+d(1947,11,2,2,0,0),
+d(1948,3,14,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(3600,0,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+        ]
+
+GB = GB()
+
diff --git a/lib/pytz/zoneinfo/GB_minus_Eire.py b/lib/pytz/zoneinfo/GB_minus_Eire.py
new file mode 100755
index 0000000..629bd90
--- /dev/null
+++ b/lib/pytz/zoneinfo/GB_minus_Eire.py
@@ -0,0 +1,504 @@
+'''tzinfo timezone information for GB_minus_Eire.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class GB_minus_Eire(DstTzInfo):
+    '''GB_minus_Eire timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'GB_minus_Eire'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,5,21,2,0,0),
+d(1916,10,1,2,0,0),
+d(1917,4,8,2,0,0),
+d(1917,9,17,2,0,0),
+d(1918,3,24,2,0,0),
+d(1918,9,30,2,0,0),
+d(1919,3,30,2,0,0),
+d(1919,9,29,2,0,0),
+d(1920,3,28,2,0,0),
+d(1920,10,25,2,0,0),
+d(1921,4,3,2,0,0),
+d(1921,10,3,2,0,0),
+d(1922,3,26,2,0,0),
+d(1922,10,8,2,0,0),
+d(1923,4,22,2,0,0),
+d(1923,9,16,2,0,0),
+d(1924,4,13,2,0,0),
+d(1924,9,21,2,0,0),
+d(1925,4,19,2,0,0),
+d(1925,10,4,2,0,0),
+d(1926,4,18,2,0,0),
+d(1926,10,3,2,0,0),
+d(1927,4,10,2,0,0),
+d(1927,10,2,2,0,0),
+d(1928,4,22,2,0,0),
+d(1928,10,7,2,0,0),
+d(1929,4,21,2,0,0),
+d(1929,10,6,2,0,0),
+d(1930,4,13,2,0,0),
+d(1930,10,5,2,0,0),
+d(1931,4,19,2,0,0),
+d(1931,10,4,2,0,0),
+d(1932,4,17,2,0,0),
+d(1932,10,2,2,0,0),
+d(1933,4,9,2,0,0),
+d(1933,10,8,2,0,0),
+d(1934,4,22,2,0,0),
+d(1934,10,7,2,0,0),
+d(1935,4,14,2,0,0),
+d(1935,10,6,2,0,0),
+d(1936,4,19,2,0,0),
+d(1936,10,4,2,0,0),
+d(1937,4,18,2,0,0),
+d(1937,10,3,2,0,0),
+d(1938,4,10,2,0,0),
+d(1938,10,2,2,0,0),
+d(1939,4,16,2,0,0),
+d(1939,11,19,2,0,0),
+d(1940,2,25,2,0,0),
+d(1941,5,4,1,0,0),
+d(1941,8,10,1,0,0),
+d(1942,4,5,1,0,0),
+d(1942,8,9,1,0,0),
+d(1943,4,4,1,0,0),
+d(1943,8,15,1,0,0),
+d(1944,4,2,1,0,0),
+d(1944,9,17,1,0,0),
+d(1945,4,2,1,0,0),
+d(1945,7,15,1,0,0),
+d(1945,10,7,2,0,0),
+d(1946,4,14,2,0,0),
+d(1946,10,6,2,0,0),
+d(1947,3,16,2,0,0),
+d(1947,4,13,1,0,0),
+d(1947,8,10,1,0,0),
+d(1947,11,2,2,0,0),
+d(1948,3,14,2,0,0),
+d(1948,10,31,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,16,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,15,2,0,0),
+d(1951,10,21,2,0,0),
+d(1952,4,20,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,19,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,11,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,17,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,22,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,14,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,20,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,19,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,10,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,3,26,2,0,0),
+d(1961,10,29,2,0,0),
+d(1962,3,25,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,3,31,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,3,22,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,3,21,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,3,20,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,3,19,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,2,18,2,0,0),
+d(1968,10,26,23,0,0),
+d(1971,10,31,2,0,0),
+d(1972,3,19,2,0,0),
+d(1972,10,29,2,0,0),
+d(1973,3,18,2,0,0),
+d(1973,10,28,2,0,0),
+d(1974,3,17,2,0,0),
+d(1974,10,27,2,0,0),
+d(1975,3,16,2,0,0),
+d(1975,10,26,2,0,0),
+d(1976,3,21,2,0,0),
+d(1976,10,24,2,0,0),
+d(1977,3,20,2,0,0),
+d(1977,10,23,2,0,0),
+d(1978,3,19,2,0,0),
+d(1978,10,29,2,0,0),
+d(1979,3,18,2,0,0),
+d(1979,10,28,2,0,0),
+d(1980,3,16,2,0,0),
+d(1980,10,26,2,0,0),
+d(1981,3,29,1,0,0),
+d(1981,10,25,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,10,24,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,10,23,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,10,28,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,10,27,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,10,26,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,10,25,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,10,23,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,10,29,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,10,28,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,10,27,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,10,25,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,10,24,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,10,23,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,10,22,1,0,0),
+d(1996,1,1,0,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(7200,7200,'BDST'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(3600,0,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+i(3600,3600,'BST'),
+i(0,0,'GMT'),
+        ]
+
+GB_minus_Eire = GB_minus_Eire()
+
diff --git a/lib/pytz/zoneinfo/GMT.py b/lib/pytz/zoneinfo/GMT.py
new file mode 100755
index 0000000..d9252ca
--- /dev/null
+++ b/lib/pytz/zoneinfo/GMT.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for GMT.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT(StaticTzInfo):
+    '''GMT timezone definition. See datetime.tzinfo for details'''
+    zone = 'GMT'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+GMT = GMT()
+
diff --git a/lib/pytz/zoneinfo/GMT0.py b/lib/pytz/zoneinfo/GMT0.py
new file mode 100755
index 0000000..c67b155
--- /dev/null
+++ b/lib/pytz/zoneinfo/GMT0.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for GMT0.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT0(StaticTzInfo):
+    '''GMT0 timezone definition. See datetime.tzinfo for details'''
+    zone = 'GMT0'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+GMT0 = GMT0()
+
diff --git a/lib/pytz/zoneinfo/GMT_minus_0.py b/lib/pytz/zoneinfo/GMT_minus_0.py
new file mode 100755
index 0000000..1504d56
--- /dev/null
+++ b/lib/pytz/zoneinfo/GMT_minus_0.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for GMT_minus_0.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_minus_0(StaticTzInfo):
+    '''GMT_minus_0 timezone definition. See datetime.tzinfo for details'''
+    zone = 'GMT_minus_0'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+GMT_minus_0 = GMT_minus_0()
+
diff --git a/lib/pytz/zoneinfo/GMT_plus_0.py b/lib/pytz/zoneinfo/GMT_plus_0.py
new file mode 100755
index 0000000..543f856
--- /dev/null
+++ b/lib/pytz/zoneinfo/GMT_plus_0.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for GMT_plus_0.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class GMT_plus_0(StaticTzInfo):
+    '''GMT_plus_0 timezone definition. See datetime.tzinfo for details'''
+    zone = 'GMT_plus_0'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+GMT_plus_0 = GMT_plus_0()
+
diff --git a/lib/pytz/zoneinfo/Greenwich.py b/lib/pytz/zoneinfo/Greenwich.py
new file mode 100755
index 0000000..46174f7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Greenwich.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Greenwich.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Greenwich(StaticTzInfo):
+    '''Greenwich timezone definition. See datetime.tzinfo for details'''
+    zone = 'Greenwich'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'GMT'
+
+Greenwich = Greenwich()
+
diff --git a/lib/pytz/zoneinfo/HST.py b/lib/pytz/zoneinfo/HST.py
new file mode 100755
index 0000000..ee3d5d2
--- /dev/null
+++ b/lib/pytz/zoneinfo/HST.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for HST.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class HST(StaticTzInfo):
+    '''HST timezone definition. See datetime.tzinfo for details'''
+    zone = 'HST'
+    _utcoffset = timedelta(seconds=-36000)
+    _tzname = 'HST'
+
+HST = HST()
+
diff --git a/lib/pytz/zoneinfo/Hongkong.py b/lib/pytz/zoneinfo/Hongkong.py
new file mode 100755
index 0000000..a9aa0c4
--- /dev/null
+++ b/lib/pytz/zoneinfo/Hongkong.py
@@ -0,0 +1,158 @@
+'''tzinfo timezone information for Hongkong.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Hongkong(DstTzInfo):
+    '''Hongkong timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Hongkong'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1904,10,29,16,23,24),
+d(1946,4,19,19,30,0),
+d(1946,11,30,18,30,0),
+d(1947,4,12,19,30,0),
+d(1947,12,29,18,30,0),
+d(1948,5,1,19,30,0),
+d(1948,10,30,18,30,0),
+d(1949,4,2,19,30,0),
+d(1949,10,29,18,30,0),
+d(1950,4,1,19,30,0),
+d(1950,10,28,18,30,0),
+d(1951,3,31,19,30,0),
+d(1951,10,27,18,30,0),
+d(1952,4,5,19,30,0),
+d(1952,10,25,18,30,0),
+d(1953,4,4,19,30,0),
+d(1953,10,31,18,30,0),
+d(1954,3,20,19,30,0),
+d(1954,10,30,18,30,0),
+d(1955,3,19,19,30,0),
+d(1955,11,5,18,30,0),
+d(1956,3,17,19,30,0),
+d(1956,11,3,18,30,0),
+d(1957,3,23,19,30,0),
+d(1957,11,2,18,30,0),
+d(1958,3,22,19,30,0),
+d(1958,11,1,18,30,0),
+d(1959,3,21,19,30,0),
+d(1959,10,31,18,30,0),
+d(1960,3,19,19,30,0),
+d(1960,11,5,18,30,0),
+d(1961,3,18,19,30,0),
+d(1961,11,4,18,30,0),
+d(1962,3,17,19,30,0),
+d(1962,11,3,18,30,0),
+d(1963,3,23,19,30,0),
+d(1963,11,2,18,30,0),
+d(1964,3,21,19,30,0),
+d(1964,10,31,18,30,0),
+d(1965,4,17,19,30,0),
+d(1965,10,16,18,30,0),
+d(1966,4,16,19,30,0),
+d(1966,10,15,18,30,0),
+d(1967,4,15,19,30,0),
+d(1967,10,21,18,30,0),
+d(1968,4,20,19,30,0),
+d(1968,10,19,18,30,0),
+d(1969,4,19,19,30,0),
+d(1969,10,18,18,30,0),
+d(1970,4,18,19,30,0),
+d(1970,10,17,18,30,0),
+d(1971,4,17,19,30,0),
+d(1971,10,16,18,30,0),
+d(1972,4,15,19,30,0),
+d(1972,10,21,18,30,0),
+d(1973,4,21,19,30,0),
+d(1973,10,20,18,30,0),
+d(1974,4,20,19,30,0),
+d(1974,10,19,18,30,0),
+d(1975,4,19,19,30,0),
+d(1975,10,18,18,30,0),
+d(1976,4,17,19,30,0),
+d(1976,10,16,18,30,0),
+d(1977,4,16,19,30,0),
+d(1977,10,15,18,30,0),
+d(1979,5,12,19,30,0),
+d(1979,10,20,18,30,0),
+d(1980,5,10,19,30,0),
+d(1980,10,18,18,30,0),
+        ]
+
+    _transition_info = [
+i(27420,0,'LMT'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+i(32400,3600,'HKST'),
+i(28800,0,'HKT'),
+        ]
+
+Hongkong = Hongkong()
+
diff --git a/lib/pytz/zoneinfo/Iceland.py b/lib/pytz/zoneinfo/Iceland.py
new file mode 100755
index 0000000..e62b596
--- /dev/null
+++ b/lib/pytz/zoneinfo/Iceland.py
@@ -0,0 +1,148 @@
+'''tzinfo timezone information for Iceland.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Iceland(DstTzInfo):
+    '''Iceland timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Iceland'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1908,1,1,1,27,48),
+d(1917,2,20,0,0,0),
+d(1917,10,21,1,0,0),
+d(1918,2,20,0,0,0),
+d(1918,11,16,1,0,0),
+d(1939,4,30,0,0,0),
+d(1939,11,29,2,0,0),
+d(1940,2,25,3,0,0),
+d(1940,11,3,2,0,0),
+d(1941,3,2,2,0,0),
+d(1941,11,2,2,0,0),
+d(1942,3,8,2,0,0),
+d(1942,10,25,2,0,0),
+d(1943,3,7,2,0,0),
+d(1943,10,24,2,0,0),
+d(1944,3,5,2,0,0),
+d(1944,10,22,2,0,0),
+d(1945,3,4,2,0,0),
+d(1945,10,28,2,0,0),
+d(1946,3,3,2,0,0),
+d(1946,10,27,2,0,0),
+d(1947,4,6,2,0,0),
+d(1947,10,26,2,0,0),
+d(1948,4,4,2,0,0),
+d(1948,10,24,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,30,2,0,0),
+d(1950,4,2,2,0,0),
+d(1950,10,22,2,0,0),
+d(1951,4,1,2,0,0),
+d(1951,10,28,2,0,0),
+d(1952,4,6,2,0,0),
+d(1952,10,26,2,0,0),
+d(1953,4,5,2,0,0),
+d(1953,10,25,2,0,0),
+d(1954,4,4,2,0,0),
+d(1954,10,24,2,0,0),
+d(1955,4,3,2,0,0),
+d(1955,10,23,2,0,0),
+d(1956,4,1,2,0,0),
+d(1956,10,28,2,0,0),
+d(1957,4,7,2,0,0),
+d(1957,10,27,2,0,0),
+d(1958,4,6,2,0,0),
+d(1958,10,26,2,0,0),
+d(1959,4,5,2,0,0),
+d(1959,10,25,2,0,0),
+d(1960,4,3,2,0,0),
+d(1960,10,23,2,0,0),
+d(1961,4,2,2,0,0),
+d(1961,10,22,2,0,0),
+d(1962,4,1,2,0,0),
+d(1962,10,28,2,0,0),
+d(1963,4,7,2,0,0),
+d(1963,10,27,2,0,0),
+d(1964,4,5,2,0,0),
+d(1964,10,25,2,0,0),
+d(1965,4,4,2,0,0),
+d(1965,10,24,2,0,0),
+d(1966,4,3,2,0,0),
+d(1966,10,23,2,0,0),
+d(1967,4,2,2,0,0),
+d(1967,10,29,2,0,0),
+d(1968,4,7,2,0,0),
+        ]
+
+    _transition_info = [
+i(-5280,0,'RMT'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,3600,'ISST'),
+i(-3600,0,'IST'),
+i(0,0,'GMT'),
+        ]
+
+Iceland = Iceland()
+
diff --git a/lib/pytz/zoneinfo/Indian/Antananarivo.py b/lib/pytz/zoneinfo/Indian/Antananarivo.py
new file mode 100755
index 0000000..05663b9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Antananarivo.py
@@ -0,0 +1,26 @@
+'''tzinfo timezone information for Indian/Antananarivo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Antananarivo(DstTzInfo):
+    '''Indian/Antananarivo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Antananarivo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,6,30,20,49,56),
+d(1954,2,27,20,0,0),
+d(1954,5,29,20,0,0),
+        ]
+
+    _transition_info = [
+i(11400,0,'LMT'),
+i(10800,0,'EAT'),
+i(14400,3600,'EAST'),
+i(10800,0,'EAT'),
+        ]
+
+Antananarivo = Antananarivo()
+
diff --git a/lib/pytz/zoneinfo/Indian/Chagos.py b/lib/pytz/zoneinfo/Indian/Chagos.py
new file mode 100755
index 0000000..3ea9728
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Chagos.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Indian/Chagos.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Chagos(DstTzInfo):
+    '''Indian/Chagos timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Chagos'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,12,31,19,10,20),
+d(1995,12,31,19,0,0),
+        ]
+
+    _transition_info = [
+i(17400,0,'LMT'),
+i(18000,0,'IOT'),
+i(21600,0,'IOT'),
+        ]
+
+Chagos = Chagos()
+
diff --git a/lib/pytz/zoneinfo/Indian/Christmas.py b/lib/pytz/zoneinfo/Indian/Christmas.py
new file mode 100755
index 0000000..a6a2e0b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Christmas.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Indian/Christmas.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Christmas(StaticTzInfo):
+    '''Indian/Christmas timezone definition. See datetime.tzinfo for details'''
+    zone = 'Indian/Christmas'
+    _utcoffset = timedelta(seconds=25200)
+    _tzname = 'CXT'
+
+Christmas = Christmas()
+
diff --git a/lib/pytz/zoneinfo/Indian/Cocos.py b/lib/pytz/zoneinfo/Indian/Cocos.py
new file mode 100755
index 0000000..5ffe470
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Cocos.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Indian/Cocos.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Cocos(StaticTzInfo):
+    '''Indian/Cocos timezone definition. See datetime.tzinfo for details'''
+    zone = 'Indian/Cocos'
+    _utcoffset = timedelta(seconds=23400)
+    _tzname = 'CCT'
+
+Cocos = Cocos()
+
diff --git a/lib/pytz/zoneinfo/Indian/Comoro.py b/lib/pytz/zoneinfo/Indian/Comoro.py
new file mode 100755
index 0000000..98c6948
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Comoro.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Indian/Comoro.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Comoro(DstTzInfo):
+    '''Indian/Comoro timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Comoro'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,6,30,21,6,56),
+        ]
+
+    _transition_info = [
+i(10380,0,'LMT'),
+i(10800,0,'EAT'),
+        ]
+
+Comoro = Comoro()
+
diff --git a/lib/pytz/zoneinfo/Indian/Kerguelen.py b/lib/pytz/zoneinfo/Indian/Kerguelen.py
new file mode 100755
index 0000000..edc6ab2
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Kerguelen.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Indian/Kerguelen.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kerguelen(DstTzInfo):
+    '''Indian/Kerguelen timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Kerguelen'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1950,1,1,0,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'zzz'),
+i(18000,0,'TFT'),
+        ]
+
+Kerguelen = Kerguelen()
+
diff --git a/lib/pytz/zoneinfo/Indian/Mahe.py b/lib/pytz/zoneinfo/Indian/Mahe.py
new file mode 100755
index 0000000..0bd7ee3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Mahe.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Indian/Mahe.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mahe(DstTzInfo):
+    '''Indian/Mahe timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Mahe'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,5,31,20,18,12),
+        ]
+
+    _transition_info = [
+i(13320,0,'LMT'),
+i(14400,0,'SCT'),
+        ]
+
+Mahe = Mahe()
+
diff --git a/lib/pytz/zoneinfo/Indian/Maldives.py b/lib/pytz/zoneinfo/Indian/Maldives.py
new file mode 100755
index 0000000..3f84d43
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Maldives.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Indian/Maldives.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Maldives(DstTzInfo):
+    '''Indian/Maldives timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Maldives'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1959,12,31,19,6,0),
+        ]
+
+    _transition_info = [
+i(17640,0,'MMT'),
+i(18000,0,'MVT'),
+        ]
+
+Maldives = Maldives()
+
diff --git a/lib/pytz/zoneinfo/Indian/Mauritius.py b/lib/pytz/zoneinfo/Indian/Mauritius.py
new file mode 100755
index 0000000..0e170a6
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Mauritius.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Indian/Mauritius.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mauritius(DstTzInfo):
+    '''Indian/Mauritius timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Mauritius'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1906,12,31,20,10,0),
+        ]
+
+    _transition_info = [
+i(13800,0,'LMT'),
+i(14400,0,'MUT'),
+        ]
+
+Mauritius = Mauritius()
+
diff --git a/lib/pytz/zoneinfo/Indian/Mayotte.py b/lib/pytz/zoneinfo/Indian/Mayotte.py
new file mode 100755
index 0000000..20df3bb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Mayotte.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Indian/Mayotte.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mayotte(DstTzInfo):
+    '''Indian/Mayotte timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Mayotte'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,6,30,20,59,4),
+        ]
+
+    _transition_info = [
+i(10860,0,'LMT'),
+i(10800,0,'EAT'),
+        ]
+
+Mayotte = Mayotte()
+
diff --git a/lib/pytz/zoneinfo/Indian/Reunion.py b/lib/pytz/zoneinfo/Indian/Reunion.py
new file mode 100755
index 0000000..11fb08f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Indian/Reunion.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Indian/Reunion.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Reunion(DstTzInfo):
+    '''Indian/Reunion timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Indian/Reunion'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,5,31,20,18,8),
+        ]
+
+    _transition_info = [
+i(13320,0,'LMT'),
+i(14400,0,'RET'),
+        ]
+
+Reunion = Reunion()
+
diff --git a/lib/pytz/zoneinfo/Indian/__init__.py b/lib/pytz/zoneinfo/Indian/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Iran.py b/lib/pytz/zoneinfo/Iran.py
new file mode 100755
index 0000000..3ea0482
--- /dev/null
+++ b/lib/pytz/zoneinfo/Iran.py
@@ -0,0 +1,100 @@
+'''tzinfo timezone information for Iran.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Iran(DstTzInfo):
+    '''Iran timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Iran'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1915,12,31,20,34,16),
+d(1945,12,31,20,34,16),
+d(1977,10,31,20,30,0),
+d(1978,3,20,20,0,0),
+d(1978,10,20,19,0,0),
+d(1978,12,31,20,0,0),
+d(1979,3,20,20,30,0),
+d(1979,9,18,19,30,0),
+d(1980,3,20,20,30,0),
+d(1980,9,22,19,30,0),
+d(1991,5,2,20,30,0),
+d(1991,9,21,19,30,0),
+d(1992,3,21,20,30,0),
+d(1992,9,21,19,30,0),
+d(1993,3,21,20,30,0),
+d(1993,9,21,19,30,0),
+d(1994,3,21,20,30,0),
+d(1994,9,21,19,30,0),
+d(1995,3,21,20,30,0),
+d(1995,9,21,19,30,0),
+d(1996,3,20,20,30,0),
+d(1996,9,20,19,30,0),
+d(1997,3,21,20,30,0),
+d(1997,9,21,19,30,0),
+d(1998,3,21,20,30,0),
+d(1998,9,21,19,30,0),
+d(1999,3,21,20,30,0),
+d(1999,9,21,19,30,0),
+d(2000,3,20,20,30,0),
+d(2000,9,20,19,30,0),
+d(2001,3,21,20,30,0),
+d(2001,9,21,19,30,0),
+d(2002,3,21,20,30,0),
+d(2002,9,21,19,30,0),
+d(2003,3,21,20,30,0),
+d(2003,9,21,19,30,0),
+d(2004,3,20,20,30,0),
+d(2004,9,20,19,30,0),
+d(2005,3,21,20,30,0),
+d(2005,9,21,19,30,0),
+        ]
+
+    _transition_info = [
+i(12360,0,'LMT'),
+i(12360,0,'TMT'),
+i(12600,0,'IRST'),
+i(14400,0,'IRST'),
+i(18000,3600,'IRDT'),
+i(14400,0,'IRST'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+i(16200,3600,'IRDT'),
+i(12600,0,'IRST'),
+        ]
+
+Iran = Iran()
+
diff --git a/lib/pytz/zoneinfo/Israel.py b/lib/pytz/zoneinfo/Israel.py
new file mode 100755
index 0000000..14b0bbb
--- /dev/null
+++ b/lib/pytz/zoneinfo/Israel.py
@@ -0,0 +1,304 @@
+'''tzinfo timezone information for Israel.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Israel(DstTzInfo):
+    '''Israel timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Israel'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1917,12,31,21,39,20),
+d(1940,5,31,22,0,0),
+d(1942,10,31,21,0,0),
+d(1943,4,1,0,0,0),
+d(1943,10,31,21,0,0),
+d(1944,3,31,22,0,0),
+d(1944,10,31,21,0,0),
+d(1945,4,15,22,0,0),
+d(1945,10,31,23,0,0),
+d(1946,4,16,0,0,0),
+d(1946,10,31,21,0,0),
+d(1948,5,22,22,0,0),
+d(1948,8,31,20,0,0),
+d(1948,10,31,23,0,0),
+d(1949,4,30,22,0,0),
+d(1949,10,31,23,0,0),
+d(1950,4,15,22,0,0),
+d(1950,9,15,0,0,0),
+d(1951,3,31,22,0,0),
+d(1951,11,11,0,0,0),
+d(1952,4,20,0,0,0),
+d(1952,10,19,0,0,0),
+d(1953,4,12,0,0,0),
+d(1953,9,13,0,0,0),
+d(1954,6,12,22,0,0),
+d(1954,9,11,21,0,0),
+d(1955,6,11,0,0,0),
+d(1955,9,10,21,0,0),
+d(1956,6,2,22,0,0),
+d(1956,9,30,0,0,0),
+d(1957,4,29,0,0,0),
+d(1957,9,21,21,0,0),
+d(1974,7,6,22,0,0),
+d(1974,10,12,21,0,0),
+d(1975,4,19,22,0,0),
+d(1975,8,30,21,0,0),
+d(1985,4,13,22,0,0),
+d(1985,9,14,21,0,0),
+d(1986,5,17,22,0,0),
+d(1986,9,6,21,0,0),
+d(1987,4,14,22,0,0),
+d(1987,9,12,21,0,0),
+d(1988,4,8,22,0,0),
+d(1988,9,2,21,0,0),
+d(1989,4,29,22,0,0),
+d(1989,9,2,21,0,0),
+d(1990,3,24,22,0,0),
+d(1990,8,25,21,0,0),
+d(1991,3,23,22,0,0),
+d(1991,8,31,21,0,0),
+d(1992,3,28,22,0,0),
+d(1992,9,5,21,0,0),
+d(1993,4,1,22,0,0),
+d(1993,9,4,21,0,0),
+d(1994,3,31,22,0,0),
+d(1994,8,27,21,0,0),
+d(1995,3,30,22,0,0),
+d(1995,9,2,21,0,0),
+d(1996,3,14,22,0,0),
+d(1996,9,15,21,0,0),
+d(1997,3,20,22,0,0),
+d(1997,9,13,21,0,0),
+d(1998,3,19,22,0,0),
+d(1998,9,5,21,0,0),
+d(1999,4,2,0,0,0),
+d(1999,9,2,23,0,0),
+d(2000,4,14,0,0,0),
+d(2000,10,5,22,0,0),
+d(2001,4,8,23,0,0),
+d(2001,9,23,22,0,0),
+d(2002,3,28,23,0,0),
+d(2002,10,6,22,0,0),
+d(2003,3,27,23,0,0),
+d(2003,10,2,22,0,0),
+d(2004,4,6,23,0,0),
+d(2004,9,21,22,0,0),
+d(2005,4,1,0,0,0),
+d(2005,10,8,23,0,0),
+d(2006,3,31,0,0,0),
+d(2006,9,30,23,0,0),
+d(2007,3,30,0,0,0),
+d(2007,9,15,23,0,0),
+d(2008,3,28,0,0,0),
+d(2008,10,4,23,0,0),
+d(2009,3,27,0,0,0),
+d(2009,9,26,23,0,0),
+d(2010,3,26,0,0,0),
+d(2010,9,11,23,0,0),
+d(2011,4,1,0,0,0),
+d(2011,10,1,23,0,0),
+d(2012,3,30,0,0,0),
+d(2012,9,22,23,0,0),
+d(2013,3,29,0,0,0),
+d(2013,9,7,23,0,0),
+d(2014,3,28,0,0,0),
+d(2014,9,27,23,0,0),
+d(2015,3,27,0,0,0),
+d(2015,9,19,23,0,0),
+d(2016,4,1,0,0,0),
+d(2016,10,8,23,0,0),
+d(2017,3,31,0,0,0),
+d(2017,9,23,23,0,0),
+d(2018,3,30,0,0,0),
+d(2018,9,15,23,0,0),
+d(2019,3,29,0,0,0),
+d(2019,10,5,23,0,0),
+d(2020,3,27,0,0,0),
+d(2020,9,26,23,0,0),
+d(2021,3,26,0,0,0),
+d(2021,9,11,23,0,0),
+d(2022,4,1,0,0,0),
+d(2022,10,1,23,0,0),
+d(2023,3,31,0,0,0),
+d(2023,9,23,23,0,0),
+d(2024,3,29,0,0,0),
+d(2024,10,5,23,0,0),
+d(2025,3,28,0,0,0),
+d(2025,9,27,23,0,0),
+d(2026,3,27,0,0,0),
+d(2026,9,19,23,0,0),
+d(2027,3,26,0,0,0),
+d(2027,10,9,23,0,0),
+d(2028,3,31,0,0,0),
+d(2028,9,23,23,0,0),
+d(2029,3,30,0,0,0),
+d(2029,9,15,23,0,0),
+d(2030,3,29,0,0,0),
+d(2030,10,5,23,0,0),
+d(2031,3,28,0,0,0),
+d(2031,9,20,23,0,0),
+d(2032,3,26,0,0,0),
+d(2032,9,11,23,0,0),
+d(2033,4,1,0,0,0),
+d(2033,10,1,23,0,0),
+d(2034,3,31,0,0,0),
+d(2034,9,16,23,0,0),
+d(2035,3,30,0,0,0),
+d(2035,10,6,23,0,0),
+d(2036,3,28,0,0,0),
+d(2036,9,27,23,0,0),
+d(2037,3,27,0,0,0),
+d(2037,9,12,23,0,0),
+        ]
+
+    _transition_info = [
+i(8460,0,'JMT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(14400,7200,'IDDT'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+i(10800,3600,'IDT'),
+i(7200,0,'IST'),
+        ]
+
+Israel = Israel()
+
diff --git a/lib/pytz/zoneinfo/Jamaica.py b/lib/pytz/zoneinfo/Jamaica.py
new file mode 100755
index 0000000..f166a37
--- /dev/null
+++ b/lib/pytz/zoneinfo/Jamaica.py
@@ -0,0 +1,62 @@
+'''tzinfo timezone information for Jamaica.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Jamaica(DstTzInfo):
+    '''Jamaica timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Jamaica'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,2,1,5,7,12),
+d(1974,4,28,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18420,0,'KMT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Jamaica = Jamaica()
+
diff --git a/lib/pytz/zoneinfo/Japan.py b/lib/pytz/zoneinfo/Japan.py
new file mode 100755
index 0000000..e303007
--- /dev/null
+++ b/lib/pytz/zoneinfo/Japan.py
@@ -0,0 +1,38 @@
+'''tzinfo timezone information for Japan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Japan(DstTzInfo):
+    '''Japan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Japan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1937,12,31,15,0,0),
+d(1948,5,1,17,0,0),
+d(1948,9,10,16,0,0),
+d(1949,4,2,17,0,0),
+d(1949,9,9,16,0,0),
+d(1950,5,6,17,0,0),
+d(1950,9,8,16,0,0),
+d(1951,5,5,17,0,0),
+d(1951,9,7,16,0,0),
+        ]
+
+    _transition_info = [
+i(32400,0,'CJT'),
+i(32400,0,'JST'),
+i(36000,3600,'JDT'),
+i(32400,0,'JST'),
+i(36000,3600,'JDT'),
+i(32400,0,'JST'),
+i(36000,3600,'JDT'),
+i(32400,0,'JST'),
+i(36000,3600,'JDT'),
+i(32400,0,'JST'),
+        ]
+
+Japan = Japan()
+
diff --git a/lib/pytz/zoneinfo/Kwajalein.py b/lib/pytz/zoneinfo/Kwajalein.py
new file mode 100755
index 0000000..edab84d
--- /dev/null
+++ b/lib/pytz/zoneinfo/Kwajalein.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Kwajalein.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kwajalein(DstTzInfo):
+    '''Kwajalein timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Kwajalein'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1969,9,30,13,0,0),
+d(1993,8,20,12,0,0),
+        ]
+
+    _transition_info = [
+i(39600,0,'MHT'),
+i(-43200,0,'KWAT'),
+i(43200,0,'MHT'),
+        ]
+
+Kwajalein = Kwajalein()
+
diff --git a/lib/pytz/zoneinfo/Libya.py b/lib/pytz/zoneinfo/Libya.py
new file mode 100755
index 0000000..3ab8dbc
--- /dev/null
+++ b/lib/pytz/zoneinfo/Libya.py
@@ -0,0 +1,78 @@
+'''tzinfo timezone information for Libya.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Libya(DstTzInfo):
+    '''Libya timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Libya'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1919,12,31,23,7,16),
+d(1951,10,14,1,0,0),
+d(1951,12,31,22,0,0),
+d(1953,10,9,1,0,0),
+d(1953,12,31,22,0,0),
+d(1955,9,29,23,0,0),
+d(1955,12,31,22,0,0),
+d(1958,12,31,23,0,0),
+d(1981,12,31,22,0,0),
+d(1982,3,31,23,0,0),
+d(1982,9,30,22,0,0),
+d(1983,3,31,23,0,0),
+d(1983,9,30,22,0,0),
+d(1984,3,31,23,0,0),
+d(1984,9,30,22,0,0),
+d(1985,4,5,23,0,0),
+d(1985,9,30,22,0,0),
+d(1986,4,3,23,0,0),
+d(1986,10,2,22,0,0),
+d(1987,3,31,23,0,0),
+d(1987,9,30,22,0,0),
+d(1988,3,31,23,0,0),
+d(1988,9,30,22,0,0),
+d(1989,3,31,23,0,0),
+d(1989,9,30,22,0,0),
+d(1990,5,3,23,0,0),
+d(1996,9,29,22,0,0),
+d(1997,4,3,23,0,0),
+d(1997,10,3,22,0,0),
+        ]
+
+    _transition_info = [
+i(3180,0,'LMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,0,'EET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,0,'EET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,0,'EET'),
+        ]
+
+Libya = Libya()
+
diff --git a/lib/pytz/zoneinfo/MET.py b/lib/pytz/zoneinfo/MET.py
new file mode 100755
index 0000000..0900920
--- /dev/null
+++ b/lib/pytz/zoneinfo/MET.py
@@ -0,0 +1,288 @@
+'''tzinfo timezone information for MET.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class MET(DstTzInfo):
+    '''MET timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'MET'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1940,4,1,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,10,2,1,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+i(7200,3600,'MEST'),
+i(3600,0,'MET'),
+        ]
+
+MET = MET()
+
diff --git a/lib/pytz/zoneinfo/MST.py b/lib/pytz/zoneinfo/MST.py
new file mode 100755
index 0000000..6a9cc94
--- /dev/null
+++ b/lib/pytz/zoneinfo/MST.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for MST.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class MST(StaticTzInfo):
+    '''MST timezone definition. See datetime.tzinfo for details'''
+    zone = 'MST'
+    _utcoffset = timedelta(seconds=-25200)
+    _tzname = 'MST'
+
+MST = MST()
+
diff --git a/lib/pytz/zoneinfo/MST7MDT.py b/lib/pytz/zoneinfo/MST7MDT.py
new file mode 100755
index 0000000..baad8be
--- /dev/null
+++ b/lib/pytz/zoneinfo/MST7MDT.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for MST7MDT.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class MST7MDT(DstTzInfo):
+    '''MST7MDT timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'MST7MDT'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,9,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,9,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,9,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,1,6,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,2,23,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+MST7MDT = MST7MDT()
+
diff --git a/lib/pytz/zoneinfo/Mexico/BajaNorte.py b/lib/pytz/zoneinfo/Mexico/BajaNorte.py
new file mode 100755
index 0000000..75dfe70
--- /dev/null
+++ b/lib/pytz/zoneinfo/Mexico/BajaNorte.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for Mexico/BajaNorte.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class BajaNorte(DstTzInfo):
+    '''Mexico/BajaNorte timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Mexico/BajaNorte'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,8,0,0),
+d(1924,1,1,7,0,0),
+d(1927,6,11,7,0,0),
+d(1930,11,15,7,0,0),
+d(1931,4,1,8,0,0),
+d(1931,9,30,7,0,0),
+d(1942,4,24,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,11,12,7,0,0),
+d(1948,4,5,8,0,0),
+d(1949,1,14,7,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,4,1,10,0,0),
+d(2007,10,28,9,0,0),
+d(2008,4,6,10,0,0),
+d(2008,10,26,9,0,0),
+d(2009,4,5,10,0,0),
+d(2009,10,25,9,0,0),
+d(2010,4,4,10,0,0),
+d(2010,10,31,9,0,0),
+d(2011,4,3,10,0,0),
+d(2011,10,30,9,0,0),
+d(2012,4,1,10,0,0),
+d(2012,10,28,9,0,0),
+d(2013,4,7,10,0,0),
+d(2013,10,27,9,0,0),
+d(2014,4,6,10,0,0),
+d(2014,10,26,9,0,0),
+d(2015,4,5,10,0,0),
+d(2015,10,25,9,0,0),
+d(2016,4,3,10,0,0),
+d(2016,10,30,9,0,0),
+d(2017,4,2,10,0,0),
+d(2017,10,29,9,0,0),
+d(2018,4,1,10,0,0),
+d(2018,10,28,9,0,0),
+d(2019,4,7,10,0,0),
+d(2019,10,27,9,0,0),
+d(2020,4,5,10,0,0),
+d(2020,10,25,9,0,0),
+d(2021,4,4,10,0,0),
+d(2021,10,31,9,0,0),
+d(2022,4,3,10,0,0),
+d(2022,10,30,9,0,0),
+d(2023,4,2,10,0,0),
+d(2023,10,29,9,0,0),
+d(2024,4,7,10,0,0),
+d(2024,10,27,9,0,0),
+d(2025,4,6,10,0,0),
+d(2025,10,26,9,0,0),
+d(2026,4,5,10,0,0),
+d(2026,10,25,9,0,0),
+d(2027,4,4,10,0,0),
+d(2027,10,31,9,0,0),
+d(2028,4,2,10,0,0),
+d(2028,10,29,9,0,0),
+d(2029,4,1,10,0,0),
+d(2029,10,28,9,0,0),
+d(2030,4,7,10,0,0),
+d(2030,10,27,9,0,0),
+d(2031,4,6,10,0,0),
+d(2031,10,26,9,0,0),
+d(2032,4,4,10,0,0),
+d(2032,10,31,9,0,0),
+d(2033,4,3,10,0,0),
+d(2033,10,30,9,0,0),
+d(2034,4,2,10,0,0),
+d(2034,10,29,9,0,0),
+d(2035,4,1,10,0,0),
+d(2035,10,28,9,0,0),
+d(2036,4,6,10,0,0),
+d(2036,10,26,9,0,0),
+d(2037,4,5,10,0,0),
+d(2037,10,25,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28080,0,'LMT'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+BajaNorte = BajaNorte()
+
diff --git a/lib/pytz/zoneinfo/Mexico/BajaSur.py b/lib/pytz/zoneinfo/Mexico/BajaSur.py
new file mode 100755
index 0000000..22da053
--- /dev/null
+++ b/lib/pytz/zoneinfo/Mexico/BajaSur.py
@@ -0,0 +1,206 @@
+'''tzinfo timezone information for Mexico/BajaSur.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class BajaSur(DstTzInfo):
+    '''Mexico/BajaSur timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Mexico/BajaSur'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,7,0,0),
+d(1927,6,11,6,0,0),
+d(1930,11,15,6,0,0),
+d(1931,5,2,6,0,0),
+d(1931,10,1,6,0,0),
+d(1932,4,1,7,0,0),
+d(1942,4,24,6,0,0),
+d(1949,1,14,7,0,0),
+d(1970,1,1,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,5,6,9,0,0),
+d(2001,9,30,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,4,1,9,0,0),
+d(2007,10,28,8,0,0),
+d(2008,4,6,9,0,0),
+d(2008,10,26,8,0,0),
+d(2009,4,5,9,0,0),
+d(2009,10,25,8,0,0),
+d(2010,4,4,9,0,0),
+d(2010,10,31,8,0,0),
+d(2011,4,3,9,0,0),
+d(2011,10,30,8,0,0),
+d(2012,4,1,9,0,0),
+d(2012,10,28,8,0,0),
+d(2013,4,7,9,0,0),
+d(2013,10,27,8,0,0),
+d(2014,4,6,9,0,0),
+d(2014,10,26,8,0,0),
+d(2015,4,5,9,0,0),
+d(2015,10,25,8,0,0),
+d(2016,4,3,9,0,0),
+d(2016,10,30,8,0,0),
+d(2017,4,2,9,0,0),
+d(2017,10,29,8,0,0),
+d(2018,4,1,9,0,0),
+d(2018,10,28,8,0,0),
+d(2019,4,7,9,0,0),
+d(2019,10,27,8,0,0),
+d(2020,4,5,9,0,0),
+d(2020,10,25,8,0,0),
+d(2021,4,4,9,0,0),
+d(2021,10,31,8,0,0),
+d(2022,4,3,9,0,0),
+d(2022,10,30,8,0,0),
+d(2023,4,2,9,0,0),
+d(2023,10,29,8,0,0),
+d(2024,4,7,9,0,0),
+d(2024,10,27,8,0,0),
+d(2025,4,6,9,0,0),
+d(2025,10,26,8,0,0),
+d(2026,4,5,9,0,0),
+d(2026,10,25,8,0,0),
+d(2027,4,4,9,0,0),
+d(2027,10,31,8,0,0),
+d(2028,4,2,9,0,0),
+d(2028,10,29,8,0,0),
+d(2029,4,1,9,0,0),
+d(2029,10,28,8,0,0),
+d(2030,4,7,9,0,0),
+d(2030,10,27,8,0,0),
+d(2031,4,6,9,0,0),
+d(2031,10,26,8,0,0),
+d(2032,4,4,9,0,0),
+d(2032,10,31,8,0,0),
+d(2033,4,3,9,0,0),
+d(2033,10,30,8,0,0),
+d(2034,4,2,9,0,0),
+d(2034,10,29,8,0,0),
+d(2035,4,1,9,0,0),
+d(2035,10,28,8,0,0),
+d(2036,4,6,9,0,0),
+d(2036,10,26,8,0,0),
+d(2037,4,5,9,0,0),
+d(2037,10,25,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25560,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-28800,0,'PST'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+BajaSur = BajaSur()
+
diff --git a/lib/pytz/zoneinfo/Mexico/General.py b/lib/pytz/zoneinfo/Mexico/General.py
new file mode 100755
index 0000000..9a22461
--- /dev/null
+++ b/lib/pytz/zoneinfo/Mexico/General.py
@@ -0,0 +1,216 @@
+'''tzinfo timezone information for Mexico/General.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class General(DstTzInfo):
+    '''Mexico/General timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Mexico/General'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1922,1,1,7,0,0),
+d(1927,6,11,6,0,0),
+d(1930,11,15,6,0,0),
+d(1931,5,2,6,0,0),
+d(1931,10,1,6,0,0),
+d(1932,4,1,7,0,0),
+d(1939,2,5,6,0,0),
+d(1939,6,25,5,0,0),
+d(1940,12,9,6,0,0),
+d(1941,4,1,5,0,0),
+d(1943,12,16,6,0,0),
+d(1944,5,1,5,0,0),
+d(1950,2,12,6,0,0),
+d(1950,7,30,5,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,5,6,8,0,0),
+d(2001,9,30,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,4,1,8,0,0),
+d(2007,10,28,7,0,0),
+d(2008,4,6,8,0,0),
+d(2008,10,26,7,0,0),
+d(2009,4,5,8,0,0),
+d(2009,10,25,7,0,0),
+d(2010,4,4,8,0,0),
+d(2010,10,31,7,0,0),
+d(2011,4,3,8,0,0),
+d(2011,10,30,7,0,0),
+d(2012,4,1,8,0,0),
+d(2012,10,28,7,0,0),
+d(2013,4,7,8,0,0),
+d(2013,10,27,7,0,0),
+d(2014,4,6,8,0,0),
+d(2014,10,26,7,0,0),
+d(2015,4,5,8,0,0),
+d(2015,10,25,7,0,0),
+d(2016,4,3,8,0,0),
+d(2016,10,30,7,0,0),
+d(2017,4,2,8,0,0),
+d(2017,10,29,7,0,0),
+d(2018,4,1,8,0,0),
+d(2018,10,28,7,0,0),
+d(2019,4,7,8,0,0),
+d(2019,10,27,7,0,0),
+d(2020,4,5,8,0,0),
+d(2020,10,25,7,0,0),
+d(2021,4,4,8,0,0),
+d(2021,10,31,7,0,0),
+d(2022,4,3,8,0,0),
+d(2022,10,30,7,0,0),
+d(2023,4,2,8,0,0),
+d(2023,10,29,7,0,0),
+d(2024,4,7,8,0,0),
+d(2024,10,27,7,0,0),
+d(2025,4,6,8,0,0),
+d(2025,10,26,7,0,0),
+d(2026,4,5,8,0,0),
+d(2026,10,25,7,0,0),
+d(2027,4,4,8,0,0),
+d(2027,10,31,7,0,0),
+d(2028,4,2,8,0,0),
+d(2028,10,29,7,0,0),
+d(2029,4,1,8,0,0),
+d(2029,10,28,7,0,0),
+d(2030,4,7,8,0,0),
+d(2030,10,27,7,0,0),
+d(2031,4,6,8,0,0),
+d(2031,10,26,7,0,0),
+d(2032,4,4,8,0,0),
+d(2032,10,31,7,0,0),
+d(2033,4,3,8,0,0),
+d(2033,10,30,7,0,0),
+d(2034,4,2,8,0,0),
+d(2034,10,29,7,0,0),
+d(2035,4,1,8,0,0),
+d(2035,10,28,7,0,0),
+d(2036,4,6,8,0,0),
+d(2036,10,26,7,0,0),
+d(2037,4,5,8,0,0),
+d(2037,10,25,7,0,0),
+        ]
+
+    _transition_info = [
+i(-23820,0,'LMT'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-25200,0,'MST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+General = General()
+
diff --git a/lib/pytz/zoneinfo/Mexico/__init__.py b/lib/pytz/zoneinfo/Mexico/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/NZ.py b/lib/pytz/zoneinfo/NZ.py
new file mode 100755
index 0000000..8e80f81
--- /dev/null
+++ b/lib/pytz/zoneinfo/NZ.py
@@ -0,0 +1,330 @@
+'''tzinfo timezone information for NZ.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class NZ(DstTzInfo):
+    '''NZ timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'NZ'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,11,5,14,30,0),
+d(1928,3,3,13,30,0),
+d(1928,10,13,14,30,0),
+d(1929,3,16,14,0,0),
+d(1929,10,12,14,30,0),
+d(1930,3,15,14,0,0),
+d(1930,10,11,14,30,0),
+d(1931,3,14,14,0,0),
+d(1931,10,10,14,30,0),
+d(1932,3,19,14,0,0),
+d(1932,10,8,14,30,0),
+d(1933,3,18,14,0,0),
+d(1933,10,7,14,30,0),
+d(1934,4,28,14,0,0),
+d(1934,9,29,14,30,0),
+d(1935,4,27,14,0,0),
+d(1935,9,28,14,30,0),
+d(1936,4,25,14,0,0),
+d(1936,9,26,14,30,0),
+d(1937,4,24,14,0,0),
+d(1937,9,25,14,30,0),
+d(1938,4,23,14,0,0),
+d(1938,9,24,14,30,0),
+d(1939,4,29,14,0,0),
+d(1939,9,23,14,30,0),
+d(1940,4,27,14,0,0),
+d(1940,9,28,14,30,0),
+d(1945,12,31,12,0,0),
+d(1974,11,2,14,0,0),
+d(1975,2,22,14,0,0),
+d(1975,10,25,14,0,0),
+d(1976,3,6,14,0,0),
+d(1976,10,30,14,0,0),
+d(1977,3,5,14,0,0),
+d(1977,10,29,14,0,0),
+d(1978,3,4,14,0,0),
+d(1978,10,28,14,0,0),
+d(1979,3,3,14,0,0),
+d(1979,10,27,14,0,0),
+d(1980,3,1,14,0,0),
+d(1980,10,25,14,0,0),
+d(1981,2,28,14,0,0),
+d(1981,10,24,14,0,0),
+d(1982,3,6,14,0,0),
+d(1982,10,30,14,0,0),
+d(1983,3,5,14,0,0),
+d(1983,10,29,14,0,0),
+d(1984,3,3,14,0,0),
+d(1984,10,27,14,0,0),
+d(1985,3,2,14,0,0),
+d(1985,10,26,14,0,0),
+d(1986,3,1,14,0,0),
+d(1986,10,25,14,0,0),
+d(1987,2,28,14,0,0),
+d(1987,10,24,14,0,0),
+d(1988,3,5,14,0,0),
+d(1988,10,29,14,0,0),
+d(1989,3,4,14,0,0),
+d(1989,10,7,14,0,0),
+d(1990,3,17,14,0,0),
+d(1990,10,6,14,0,0),
+d(1991,3,16,14,0,0),
+d(1991,10,5,14,0,0),
+d(1992,3,14,14,0,0),
+d(1992,10,3,14,0,0),
+d(1993,3,20,14,0,0),
+d(1993,10,2,14,0,0),
+d(1994,3,19,14,0,0),
+d(1994,10,1,14,0,0),
+d(1995,3,18,14,0,0),
+d(1995,9,30,14,0,0),
+d(1996,3,16,14,0,0),
+d(1996,10,5,14,0,0),
+d(1997,3,15,14,0,0),
+d(1997,10,4,14,0,0),
+d(1998,3,14,14,0,0),
+d(1998,10,3,14,0,0),
+d(1999,3,20,14,0,0),
+d(1999,10,2,14,0,0),
+d(2000,3,18,14,0,0),
+d(2000,9,30,14,0,0),
+d(2001,3,17,14,0,0),
+d(2001,10,6,14,0,0),
+d(2002,3,16,14,0,0),
+d(2002,10,5,14,0,0),
+d(2003,3,15,14,0,0),
+d(2003,10,4,14,0,0),
+d(2004,3,20,14,0,0),
+d(2004,10,2,14,0,0),
+d(2005,3,19,14,0,0),
+d(2005,10,1,14,0,0),
+d(2006,3,18,14,0,0),
+d(2006,9,30,14,0,0),
+d(2007,3,17,14,0,0),
+d(2007,10,6,14,0,0),
+d(2008,3,15,14,0,0),
+d(2008,10,4,14,0,0),
+d(2009,3,14,14,0,0),
+d(2009,10,3,14,0,0),
+d(2010,3,20,14,0,0),
+d(2010,10,2,14,0,0),
+d(2011,3,19,14,0,0),
+d(2011,10,1,14,0,0),
+d(2012,3,17,14,0,0),
+d(2012,10,6,14,0,0),
+d(2013,3,16,14,0,0),
+d(2013,10,5,14,0,0),
+d(2014,3,15,14,0,0),
+d(2014,10,4,14,0,0),
+d(2015,3,14,14,0,0),
+d(2015,10,3,14,0,0),
+d(2016,3,19,14,0,0),
+d(2016,10,1,14,0,0),
+d(2017,3,18,14,0,0),
+d(2017,9,30,14,0,0),
+d(2018,3,17,14,0,0),
+d(2018,10,6,14,0,0),
+d(2019,3,16,14,0,0),
+d(2019,10,5,14,0,0),
+d(2020,3,14,14,0,0),
+d(2020,10,3,14,0,0),
+d(2021,3,20,14,0,0),
+d(2021,10,2,14,0,0),
+d(2022,3,19,14,0,0),
+d(2022,10,1,14,0,0),
+d(2023,3,18,14,0,0),
+d(2023,9,30,14,0,0),
+d(2024,3,16,14,0,0),
+d(2024,10,5,14,0,0),
+d(2025,3,15,14,0,0),
+d(2025,10,4,14,0,0),
+d(2026,3,14,14,0,0),
+d(2026,10,3,14,0,0),
+d(2027,3,20,14,0,0),
+d(2027,10,2,14,0,0),
+d(2028,3,18,14,0,0),
+d(2028,9,30,14,0,0),
+d(2029,3,17,14,0,0),
+d(2029,10,6,14,0,0),
+d(2030,3,16,14,0,0),
+d(2030,10,5,14,0,0),
+d(2031,3,15,14,0,0),
+d(2031,10,4,14,0,0),
+d(2032,3,20,14,0,0),
+d(2032,10,2,14,0,0),
+d(2033,3,19,14,0,0),
+d(2033,10,1,14,0,0),
+d(2034,3,18,14,0,0),
+d(2034,9,30,14,0,0),
+d(2035,3,17,14,0,0),
+d(2035,10,6,14,0,0),
+d(2036,3,15,14,0,0),
+d(2036,10,4,14,0,0),
+d(2037,3,14,14,0,0),
+d(2037,10,3,14,0,0),
+        ]
+
+    _transition_info = [
+i(41400,0,'NZMT'),
+i(45000,3600,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+        ]
+
+NZ = NZ()
+
diff --git a/lib/pytz/zoneinfo/NZ_minus_CHAT.py b/lib/pytz/zoneinfo/NZ_minus_CHAT.py
new file mode 100755
index 0000000..4cbbb3e
--- /dev/null
+++ b/lib/pytz/zoneinfo/NZ_minus_CHAT.py
@@ -0,0 +1,276 @@
+'''tzinfo timezone information for NZ_minus_CHAT.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class NZ_minus_CHAT(DstTzInfo):
+    '''NZ_minus_CHAT timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'NZ_minus_CHAT'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1956,12,31,11,46,12),
+d(1974,11,2,14,0,0),
+d(1975,2,22,14,0,0),
+d(1975,10,25,14,0,0),
+d(1976,3,6,14,0,0),
+d(1976,10,30,14,0,0),
+d(1977,3,5,14,0,0),
+d(1977,10,29,14,0,0),
+d(1978,3,4,14,0,0),
+d(1978,10,28,14,0,0),
+d(1979,3,3,14,0,0),
+d(1979,10,27,14,0,0),
+d(1980,3,1,14,0,0),
+d(1980,10,25,14,0,0),
+d(1981,2,28,14,0,0),
+d(1981,10,24,14,0,0),
+d(1982,3,6,14,0,0),
+d(1982,10,30,14,0,0),
+d(1983,3,5,14,0,0),
+d(1983,10,29,14,0,0),
+d(1984,3,3,14,0,0),
+d(1984,10,27,14,0,0),
+d(1985,3,2,14,0,0),
+d(1985,10,26,14,0,0),
+d(1986,3,1,14,0,0),
+d(1986,10,25,14,0,0),
+d(1987,2,28,14,0,0),
+d(1987,10,24,14,0,0),
+d(1988,3,5,14,0,0),
+d(1988,10,29,14,0,0),
+d(1989,3,4,14,0,0),
+d(1989,10,7,14,0,0),
+d(1990,3,17,14,0,0),
+d(1990,10,6,14,0,0),
+d(1991,3,16,14,0,0),
+d(1991,10,5,14,0,0),
+d(1992,3,14,14,0,0),
+d(1992,10,3,14,0,0),
+d(1993,3,20,14,0,0),
+d(1993,10,2,14,0,0),
+d(1994,3,19,14,0,0),
+d(1994,10,1,14,0,0),
+d(1995,3,18,14,0,0),
+d(1995,9,30,14,0,0),
+d(1996,3,16,14,0,0),
+d(1996,10,5,14,0,0),
+d(1997,3,15,14,0,0),
+d(1997,10,4,14,0,0),
+d(1998,3,14,14,0,0),
+d(1998,10,3,14,0,0),
+d(1999,3,20,14,0,0),
+d(1999,10,2,14,0,0),
+d(2000,3,18,14,0,0),
+d(2000,9,30,14,0,0),
+d(2001,3,17,14,0,0),
+d(2001,10,6,14,0,0),
+d(2002,3,16,14,0,0),
+d(2002,10,5,14,0,0),
+d(2003,3,15,14,0,0),
+d(2003,10,4,14,0,0),
+d(2004,3,20,14,0,0),
+d(2004,10,2,14,0,0),
+d(2005,3,19,14,0,0),
+d(2005,10,1,14,0,0),
+d(2006,3,18,14,0,0),
+d(2006,9,30,14,0,0),
+d(2007,3,17,14,0,0),
+d(2007,10,6,14,0,0),
+d(2008,3,15,14,0,0),
+d(2008,10,4,14,0,0),
+d(2009,3,14,14,0,0),
+d(2009,10,3,14,0,0),
+d(2010,3,20,14,0,0),
+d(2010,10,2,14,0,0),
+d(2011,3,19,14,0,0),
+d(2011,10,1,14,0,0),
+d(2012,3,17,14,0,0),
+d(2012,10,6,14,0,0),
+d(2013,3,16,14,0,0),
+d(2013,10,5,14,0,0),
+d(2014,3,15,14,0,0),
+d(2014,10,4,14,0,0),
+d(2015,3,14,14,0,0),
+d(2015,10,3,14,0,0),
+d(2016,3,19,14,0,0),
+d(2016,10,1,14,0,0),
+d(2017,3,18,14,0,0),
+d(2017,9,30,14,0,0),
+d(2018,3,17,14,0,0),
+d(2018,10,6,14,0,0),
+d(2019,3,16,14,0,0),
+d(2019,10,5,14,0,0),
+d(2020,3,14,14,0,0),
+d(2020,10,3,14,0,0),
+d(2021,3,20,14,0,0),
+d(2021,10,2,14,0,0),
+d(2022,3,19,14,0,0),
+d(2022,10,1,14,0,0),
+d(2023,3,18,14,0,0),
+d(2023,9,30,14,0,0),
+d(2024,3,16,14,0,0),
+d(2024,10,5,14,0,0),
+d(2025,3,15,14,0,0),
+d(2025,10,4,14,0,0),
+d(2026,3,14,14,0,0),
+d(2026,10,3,14,0,0),
+d(2027,3,20,14,0,0),
+d(2027,10,2,14,0,0),
+d(2028,3,18,14,0,0),
+d(2028,9,30,14,0,0),
+d(2029,3,17,14,0,0),
+d(2029,10,6,14,0,0),
+d(2030,3,16,14,0,0),
+d(2030,10,5,14,0,0),
+d(2031,3,15,14,0,0),
+d(2031,10,4,14,0,0),
+d(2032,3,20,14,0,0),
+d(2032,10,2,14,0,0),
+d(2033,3,19,14,0,0),
+d(2033,10,1,14,0,0),
+d(2034,3,18,14,0,0),
+d(2034,9,30,14,0,0),
+d(2035,3,17,14,0,0),
+d(2035,10,6,14,0,0),
+d(2036,3,15,14,0,0),
+d(2036,10,4,14,0,0),
+d(2037,3,14,14,0,0),
+d(2037,10,3,14,0,0),
+        ]
+
+    _transition_info = [
+i(44040,0,'LMT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+        ]
+
+NZ_minus_CHAT = NZ_minus_CHAT()
+
diff --git a/lib/pytz/zoneinfo/Navajo.py b/lib/pytz/zoneinfo/Navajo.py
new file mode 100755
index 0000000..793142e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Navajo.py
@@ -0,0 +1,334 @@
+'''tzinfo timezone information for Navajo.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Navajo(DstTzInfo):
+    '''Navajo timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Navajo'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1920,3,28,9,0,0),
+d(1920,10,31,8,0,0),
+d(1921,3,27,9,0,0),
+d(1921,5,22,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1965,4,25,9,0,0),
+d(1965,10,31,8,0,0),
+d(1966,4,24,9,0,0),
+d(1966,10,30,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,9,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,9,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,9,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,1,6,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,2,23,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Navajo = Navajo()
+
diff --git a/lib/pytz/zoneinfo/PRC.py b/lib/pytz/zoneinfo/PRC.py
new file mode 100755
index 0000000..872a94d
--- /dev/null
+++ b/lib/pytz/zoneinfo/PRC.py
@@ -0,0 +1,54 @@
+'''tzinfo timezone information for PRC.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class PRC(DstTzInfo):
+    '''PRC timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'PRC'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,12,31,15,54,8),
+d(1940,6,2,16,0,0),
+d(1940,9,30,15,0,0),
+d(1941,3,15,16,0,0),
+d(1941,9,30,15,0,0),
+d(1986,5,3,16,0,0),
+d(1986,9,13,15,0,0),
+d(1987,4,11,16,0,0),
+d(1987,9,12,15,0,0),
+d(1988,4,9,16,0,0),
+d(1988,9,10,15,0,0),
+d(1989,4,15,16,0,0),
+d(1989,9,16,15,0,0),
+d(1990,4,14,16,0,0),
+d(1990,9,15,15,0,0),
+d(1991,4,13,16,0,0),
+d(1991,9,14,15,0,0),
+        ]
+
+    _transition_info = [
+i(29160,0,'LMT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+PRC = PRC()
+
diff --git a/lib/pytz/zoneinfo/PST8PDT.py b/lib/pytz/zoneinfo/PST8PDT.py
new file mode 100755
index 0000000..b4ef54d
--- /dev/null
+++ b/lib/pytz/zoneinfo/PST8PDT.py
@@ -0,0 +1,318 @@
+'''tzinfo timezone information for PST8PDT.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class PST8PDT(DstTzInfo):
+    '''PST8PDT timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'PST8PDT'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,10,0,0),
+d(1918,10,27,9,0,0),
+d(1919,3,30,10,0,0),
+d(1919,10,26,9,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1967,4,30,10,0,0),
+d(1967,10,29,9,0,0),
+d(1968,4,28,10,0,0),
+d(1968,10,27,9,0,0),
+d(1969,4,27,10,0,0),
+d(1969,10,26,9,0,0),
+d(1970,4,26,10,0,0),
+d(1970,10,25,9,0,0),
+d(1971,4,25,10,0,0),
+d(1971,10,31,9,0,0),
+d(1972,4,30,10,0,0),
+d(1972,10,29,9,0,0),
+d(1973,4,29,10,0,0),
+d(1973,10,28,9,0,0),
+d(1974,1,6,10,0,0),
+d(1974,10,27,9,0,0),
+d(1975,2,23,10,0,0),
+d(1975,10,26,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+PST8PDT = PST8PDT()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Apia.py b/lib/pytz/zoneinfo/Pacific/Apia.py
new file mode 100755
index 0000000..05cb54a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Apia.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Pacific/Apia.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Apia(DstTzInfo):
+    '''Pacific/Apia timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Apia'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,1,1,11,26,56),
+d(1950,1,1,11,30,0),
+        ]
+
+    _transition_info = [
+i(-41220,0,'LMT'),
+i(-41400,0,'SAMT'),
+i(-39600,0,'WST'),
+        ]
+
+Apia = Apia()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Auckland.py b/lib/pytz/zoneinfo/Pacific/Auckland.py
new file mode 100755
index 0000000..a257d22
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Auckland.py
@@ -0,0 +1,330 @@
+'''tzinfo timezone information for Pacific/Auckland.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Auckland(DstTzInfo):
+    '''Pacific/Auckland timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Auckland'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1927,11,5,14,30,0),
+d(1928,3,3,13,30,0),
+d(1928,10,13,14,30,0),
+d(1929,3,16,14,0,0),
+d(1929,10,12,14,30,0),
+d(1930,3,15,14,0,0),
+d(1930,10,11,14,30,0),
+d(1931,3,14,14,0,0),
+d(1931,10,10,14,30,0),
+d(1932,3,19,14,0,0),
+d(1932,10,8,14,30,0),
+d(1933,3,18,14,0,0),
+d(1933,10,7,14,30,0),
+d(1934,4,28,14,0,0),
+d(1934,9,29,14,30,0),
+d(1935,4,27,14,0,0),
+d(1935,9,28,14,30,0),
+d(1936,4,25,14,0,0),
+d(1936,9,26,14,30,0),
+d(1937,4,24,14,0,0),
+d(1937,9,25,14,30,0),
+d(1938,4,23,14,0,0),
+d(1938,9,24,14,30,0),
+d(1939,4,29,14,0,0),
+d(1939,9,23,14,30,0),
+d(1940,4,27,14,0,0),
+d(1940,9,28,14,30,0),
+d(1945,12,31,12,0,0),
+d(1974,11,2,14,0,0),
+d(1975,2,22,14,0,0),
+d(1975,10,25,14,0,0),
+d(1976,3,6,14,0,0),
+d(1976,10,30,14,0,0),
+d(1977,3,5,14,0,0),
+d(1977,10,29,14,0,0),
+d(1978,3,4,14,0,0),
+d(1978,10,28,14,0,0),
+d(1979,3,3,14,0,0),
+d(1979,10,27,14,0,0),
+d(1980,3,1,14,0,0),
+d(1980,10,25,14,0,0),
+d(1981,2,28,14,0,0),
+d(1981,10,24,14,0,0),
+d(1982,3,6,14,0,0),
+d(1982,10,30,14,0,0),
+d(1983,3,5,14,0,0),
+d(1983,10,29,14,0,0),
+d(1984,3,3,14,0,0),
+d(1984,10,27,14,0,0),
+d(1985,3,2,14,0,0),
+d(1985,10,26,14,0,0),
+d(1986,3,1,14,0,0),
+d(1986,10,25,14,0,0),
+d(1987,2,28,14,0,0),
+d(1987,10,24,14,0,0),
+d(1988,3,5,14,0,0),
+d(1988,10,29,14,0,0),
+d(1989,3,4,14,0,0),
+d(1989,10,7,14,0,0),
+d(1990,3,17,14,0,0),
+d(1990,10,6,14,0,0),
+d(1991,3,16,14,0,0),
+d(1991,10,5,14,0,0),
+d(1992,3,14,14,0,0),
+d(1992,10,3,14,0,0),
+d(1993,3,20,14,0,0),
+d(1993,10,2,14,0,0),
+d(1994,3,19,14,0,0),
+d(1994,10,1,14,0,0),
+d(1995,3,18,14,0,0),
+d(1995,9,30,14,0,0),
+d(1996,3,16,14,0,0),
+d(1996,10,5,14,0,0),
+d(1997,3,15,14,0,0),
+d(1997,10,4,14,0,0),
+d(1998,3,14,14,0,0),
+d(1998,10,3,14,0,0),
+d(1999,3,20,14,0,0),
+d(1999,10,2,14,0,0),
+d(2000,3,18,14,0,0),
+d(2000,9,30,14,0,0),
+d(2001,3,17,14,0,0),
+d(2001,10,6,14,0,0),
+d(2002,3,16,14,0,0),
+d(2002,10,5,14,0,0),
+d(2003,3,15,14,0,0),
+d(2003,10,4,14,0,0),
+d(2004,3,20,14,0,0),
+d(2004,10,2,14,0,0),
+d(2005,3,19,14,0,0),
+d(2005,10,1,14,0,0),
+d(2006,3,18,14,0,0),
+d(2006,9,30,14,0,0),
+d(2007,3,17,14,0,0),
+d(2007,10,6,14,0,0),
+d(2008,3,15,14,0,0),
+d(2008,10,4,14,0,0),
+d(2009,3,14,14,0,0),
+d(2009,10,3,14,0,0),
+d(2010,3,20,14,0,0),
+d(2010,10,2,14,0,0),
+d(2011,3,19,14,0,0),
+d(2011,10,1,14,0,0),
+d(2012,3,17,14,0,0),
+d(2012,10,6,14,0,0),
+d(2013,3,16,14,0,0),
+d(2013,10,5,14,0,0),
+d(2014,3,15,14,0,0),
+d(2014,10,4,14,0,0),
+d(2015,3,14,14,0,0),
+d(2015,10,3,14,0,0),
+d(2016,3,19,14,0,0),
+d(2016,10,1,14,0,0),
+d(2017,3,18,14,0,0),
+d(2017,9,30,14,0,0),
+d(2018,3,17,14,0,0),
+d(2018,10,6,14,0,0),
+d(2019,3,16,14,0,0),
+d(2019,10,5,14,0,0),
+d(2020,3,14,14,0,0),
+d(2020,10,3,14,0,0),
+d(2021,3,20,14,0,0),
+d(2021,10,2,14,0,0),
+d(2022,3,19,14,0,0),
+d(2022,10,1,14,0,0),
+d(2023,3,18,14,0,0),
+d(2023,9,30,14,0,0),
+d(2024,3,16,14,0,0),
+d(2024,10,5,14,0,0),
+d(2025,3,15,14,0,0),
+d(2025,10,4,14,0,0),
+d(2026,3,14,14,0,0),
+d(2026,10,3,14,0,0),
+d(2027,3,20,14,0,0),
+d(2027,10,2,14,0,0),
+d(2028,3,18,14,0,0),
+d(2028,9,30,14,0,0),
+d(2029,3,17,14,0,0),
+d(2029,10,6,14,0,0),
+d(2030,3,16,14,0,0),
+d(2030,10,5,14,0,0),
+d(2031,3,15,14,0,0),
+d(2031,10,4,14,0,0),
+d(2032,3,20,14,0,0),
+d(2032,10,2,14,0,0),
+d(2033,3,19,14,0,0),
+d(2033,10,1,14,0,0),
+d(2034,3,18,14,0,0),
+d(2034,9,30,14,0,0),
+d(2035,3,17,14,0,0),
+d(2035,10,6,14,0,0),
+d(2036,3,15,14,0,0),
+d(2036,10,4,14,0,0),
+d(2037,3,14,14,0,0),
+d(2037,10,3,14,0,0),
+        ]
+
+    _transition_info = [
+i(41400,0,'NZMT'),
+i(45000,3600,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(41400,0,'NZMT'),
+i(43200,1800,'NZST'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+i(43200,0,'NZST'),
+i(46800,3600,'NZDT'),
+        ]
+
+Auckland = Auckland()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Chatham.py b/lib/pytz/zoneinfo/Pacific/Chatham.py
new file mode 100755
index 0000000..8b78fdd
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Chatham.py
@@ -0,0 +1,276 @@
+'''tzinfo timezone information for Pacific/Chatham.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Chatham(DstTzInfo):
+    '''Pacific/Chatham timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Chatham'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1956,12,31,11,46,12),
+d(1974,11,2,14,0,0),
+d(1975,2,22,14,0,0),
+d(1975,10,25,14,0,0),
+d(1976,3,6,14,0,0),
+d(1976,10,30,14,0,0),
+d(1977,3,5,14,0,0),
+d(1977,10,29,14,0,0),
+d(1978,3,4,14,0,0),
+d(1978,10,28,14,0,0),
+d(1979,3,3,14,0,0),
+d(1979,10,27,14,0,0),
+d(1980,3,1,14,0,0),
+d(1980,10,25,14,0,0),
+d(1981,2,28,14,0,0),
+d(1981,10,24,14,0,0),
+d(1982,3,6,14,0,0),
+d(1982,10,30,14,0,0),
+d(1983,3,5,14,0,0),
+d(1983,10,29,14,0,0),
+d(1984,3,3,14,0,0),
+d(1984,10,27,14,0,0),
+d(1985,3,2,14,0,0),
+d(1985,10,26,14,0,0),
+d(1986,3,1,14,0,0),
+d(1986,10,25,14,0,0),
+d(1987,2,28,14,0,0),
+d(1987,10,24,14,0,0),
+d(1988,3,5,14,0,0),
+d(1988,10,29,14,0,0),
+d(1989,3,4,14,0,0),
+d(1989,10,7,14,0,0),
+d(1990,3,17,14,0,0),
+d(1990,10,6,14,0,0),
+d(1991,3,16,14,0,0),
+d(1991,10,5,14,0,0),
+d(1992,3,14,14,0,0),
+d(1992,10,3,14,0,0),
+d(1993,3,20,14,0,0),
+d(1993,10,2,14,0,0),
+d(1994,3,19,14,0,0),
+d(1994,10,1,14,0,0),
+d(1995,3,18,14,0,0),
+d(1995,9,30,14,0,0),
+d(1996,3,16,14,0,0),
+d(1996,10,5,14,0,0),
+d(1997,3,15,14,0,0),
+d(1997,10,4,14,0,0),
+d(1998,3,14,14,0,0),
+d(1998,10,3,14,0,0),
+d(1999,3,20,14,0,0),
+d(1999,10,2,14,0,0),
+d(2000,3,18,14,0,0),
+d(2000,9,30,14,0,0),
+d(2001,3,17,14,0,0),
+d(2001,10,6,14,0,0),
+d(2002,3,16,14,0,0),
+d(2002,10,5,14,0,0),
+d(2003,3,15,14,0,0),
+d(2003,10,4,14,0,0),
+d(2004,3,20,14,0,0),
+d(2004,10,2,14,0,0),
+d(2005,3,19,14,0,0),
+d(2005,10,1,14,0,0),
+d(2006,3,18,14,0,0),
+d(2006,9,30,14,0,0),
+d(2007,3,17,14,0,0),
+d(2007,10,6,14,0,0),
+d(2008,3,15,14,0,0),
+d(2008,10,4,14,0,0),
+d(2009,3,14,14,0,0),
+d(2009,10,3,14,0,0),
+d(2010,3,20,14,0,0),
+d(2010,10,2,14,0,0),
+d(2011,3,19,14,0,0),
+d(2011,10,1,14,0,0),
+d(2012,3,17,14,0,0),
+d(2012,10,6,14,0,0),
+d(2013,3,16,14,0,0),
+d(2013,10,5,14,0,0),
+d(2014,3,15,14,0,0),
+d(2014,10,4,14,0,0),
+d(2015,3,14,14,0,0),
+d(2015,10,3,14,0,0),
+d(2016,3,19,14,0,0),
+d(2016,10,1,14,0,0),
+d(2017,3,18,14,0,0),
+d(2017,9,30,14,0,0),
+d(2018,3,17,14,0,0),
+d(2018,10,6,14,0,0),
+d(2019,3,16,14,0,0),
+d(2019,10,5,14,0,0),
+d(2020,3,14,14,0,0),
+d(2020,10,3,14,0,0),
+d(2021,3,20,14,0,0),
+d(2021,10,2,14,0,0),
+d(2022,3,19,14,0,0),
+d(2022,10,1,14,0,0),
+d(2023,3,18,14,0,0),
+d(2023,9,30,14,0,0),
+d(2024,3,16,14,0,0),
+d(2024,10,5,14,0,0),
+d(2025,3,15,14,0,0),
+d(2025,10,4,14,0,0),
+d(2026,3,14,14,0,0),
+d(2026,10,3,14,0,0),
+d(2027,3,20,14,0,0),
+d(2027,10,2,14,0,0),
+d(2028,3,18,14,0,0),
+d(2028,9,30,14,0,0),
+d(2029,3,17,14,0,0),
+d(2029,10,6,14,0,0),
+d(2030,3,16,14,0,0),
+d(2030,10,5,14,0,0),
+d(2031,3,15,14,0,0),
+d(2031,10,4,14,0,0),
+d(2032,3,20,14,0,0),
+d(2032,10,2,14,0,0),
+d(2033,3,19,14,0,0),
+d(2033,10,1,14,0,0),
+d(2034,3,18,14,0,0),
+d(2034,9,30,14,0,0),
+d(2035,3,17,14,0,0),
+d(2035,10,6,14,0,0),
+d(2036,3,15,14,0,0),
+d(2036,10,4,14,0,0),
+d(2037,3,14,14,0,0),
+d(2037,10,3,14,0,0),
+        ]
+
+    _transition_info = [
+i(44040,0,'LMT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+i(45900,0,'CHAST'),
+i(49500,3600,'CHADT'),
+        ]
+
+Chatham = Chatham()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Easter.py b/lib/pytz/zoneinfo/Pacific/Easter.py
new file mode 100755
index 0000000..b265b32
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Easter.py
@@ -0,0 +1,308 @@
+'''tzinfo timezone information for Pacific/Easter.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Easter(DstTzInfo):
+    '''Pacific/Easter timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Easter'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1932,9,1,7,17,28),
+d(1942,6,1,4,0,0),
+d(1942,8,1,5,0,0),
+d(1946,9,1,3,0,0),
+d(1968,11,3,4,0,0),
+d(1969,3,30,3,0,0),
+d(1969,11,23,4,0,0),
+d(1970,3,29,3,0,0),
+d(1970,10,11,4,0,0),
+d(1971,3,14,3,0,0),
+d(1971,10,10,4,0,0),
+d(1972,3,12,3,0,0),
+d(1972,10,15,4,0,0),
+d(1973,3,11,3,0,0),
+d(1973,9,30,4,0,0),
+d(1974,3,10,3,0,0),
+d(1974,10,13,4,0,0),
+d(1975,3,9,3,0,0),
+d(1975,10,12,4,0,0),
+d(1976,3,14,3,0,0),
+d(1976,10,10,4,0,0),
+d(1977,3,13,3,0,0),
+d(1977,10,9,4,0,0),
+d(1978,3,12,3,0,0),
+d(1978,10,15,4,0,0),
+d(1979,3,11,3,0,0),
+d(1979,10,14,4,0,0),
+d(1980,3,9,3,0,0),
+d(1980,10,12,4,0,0),
+d(1981,3,15,3,0,0),
+d(1981,10,11,4,0,0),
+d(1982,1,19,3,0,0),
+d(1982,3,14,3,0,0),
+d(1982,10,10,4,0,0),
+d(1983,3,13,3,0,0),
+d(1983,10,9,4,0,0),
+d(1984,3,11,3,0,0),
+d(1984,10,14,4,0,0),
+d(1985,3,10,3,0,0),
+d(1985,10,13,4,0,0),
+d(1986,3,9,3,0,0),
+d(1986,10,12,4,0,0),
+d(1987,4,12,3,0,0),
+d(1987,10,11,4,0,0),
+d(1988,3,13,3,0,0),
+d(1988,10,2,4,0,0),
+d(1989,3,12,3,0,0),
+d(1989,10,15,4,0,0),
+d(1990,3,18,3,0,0),
+d(1990,9,16,4,0,0),
+d(1991,3,10,3,0,0),
+d(1991,10,13,4,0,0),
+d(1992,3,15,3,0,0),
+d(1992,10,11,4,0,0),
+d(1993,3,14,3,0,0),
+d(1993,10,10,4,0,0),
+d(1994,3,13,3,0,0),
+d(1994,10,9,4,0,0),
+d(1995,3,12,3,0,0),
+d(1995,10,15,4,0,0),
+d(1996,3,10,3,0,0),
+d(1996,10,13,4,0,0),
+d(1997,3,30,3,0,0),
+d(1997,10,12,4,0,0),
+d(1998,3,15,3,0,0),
+d(1998,9,27,4,0,0),
+d(1999,4,4,3,0,0),
+d(1999,10,10,4,0,0),
+d(2000,3,12,3,0,0),
+d(2000,10,15,4,0,0),
+d(2001,3,11,3,0,0),
+d(2001,10,14,4,0,0),
+d(2002,3,10,3,0,0),
+d(2002,10,13,4,0,0),
+d(2003,3,9,3,0,0),
+d(2003,10,12,4,0,0),
+d(2004,3,14,3,0,0),
+d(2004,10,10,4,0,0),
+d(2005,3,13,3,0,0),
+d(2005,10,9,4,0,0),
+d(2006,3,12,3,0,0),
+d(2006,10,15,4,0,0),
+d(2007,3,11,3,0,0),
+d(2007,10,14,4,0,0),
+d(2008,3,9,3,0,0),
+d(2008,10,12,4,0,0),
+d(2009,3,15,3,0,0),
+d(2009,10,11,4,0,0),
+d(2010,3,14,3,0,0),
+d(2010,10,10,4,0,0),
+d(2011,3,13,3,0,0),
+d(2011,10,9,4,0,0),
+d(2012,3,11,3,0,0),
+d(2012,10,14,4,0,0),
+d(2013,3,10,3,0,0),
+d(2013,10,13,4,0,0),
+d(2014,3,9,3,0,0),
+d(2014,10,12,4,0,0),
+d(2015,3,15,3,0,0),
+d(2015,10,11,4,0,0),
+d(2016,3,13,3,0,0),
+d(2016,10,9,4,0,0),
+d(2017,3,12,3,0,0),
+d(2017,10,15,4,0,0),
+d(2018,3,11,3,0,0),
+d(2018,10,14,4,0,0),
+d(2019,3,10,3,0,0),
+d(2019,10,13,4,0,0),
+d(2020,3,15,3,0,0),
+d(2020,10,11,4,0,0),
+d(2021,3,14,3,0,0),
+d(2021,10,10,4,0,0),
+d(2022,3,13,3,0,0),
+d(2022,10,9,4,0,0),
+d(2023,3,12,3,0,0),
+d(2023,10,15,4,0,0),
+d(2024,3,10,3,0,0),
+d(2024,10,13,4,0,0),
+d(2025,3,9,3,0,0),
+d(2025,10,12,4,0,0),
+d(2026,3,15,3,0,0),
+d(2026,10,11,4,0,0),
+d(2027,3,14,3,0,0),
+d(2027,10,10,4,0,0),
+d(2028,3,12,3,0,0),
+d(2028,10,15,4,0,0),
+d(2029,3,11,3,0,0),
+d(2029,10,14,4,0,0),
+d(2030,3,10,3,0,0),
+d(2030,10,13,4,0,0),
+d(2031,3,9,3,0,0),
+d(2031,10,12,4,0,0),
+d(2032,3,14,3,0,0),
+d(2032,10,10,4,0,0),
+d(2033,3,13,3,0,0),
+d(2033,10,9,4,0,0),
+d(2034,3,12,3,0,0),
+d(2034,10,15,4,0,0),
+d(2035,3,11,3,0,0),
+d(2035,10,14,4,0,0),
+d(2036,3,9,3,0,0),
+d(2036,10,12,4,0,0),
+d(2037,3,15,3,0,0),
+d(2037,10,11,4,0,0),
+        ]
+
+    _transition_info = [
+i(-26220,0,'MMT'),
+i(-21600,4620,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-25200,0,'EAST'),
+i(-21600,3600,'EASST'),
+i(-18000,7200,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+i(-21600,0,'EAST'),
+i(-18000,3600,'EASST'),
+        ]
+
+Easter = Easter()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Efate.py b/lib/pytz/zoneinfo/Pacific/Efate.py
new file mode 100755
index 0000000..5142191
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Efate.py
@@ -0,0 +1,62 @@
+'''tzinfo timezone information for Pacific/Efate.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Efate(DstTzInfo):
+    '''Pacific/Efate timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Efate'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,12,12,46,44),
+d(1983,9,24,13,0,0),
+d(1984,3,24,12,0,0),
+d(1984,10,22,13,0,0),
+d(1985,3,23,12,0,0),
+d(1985,9,28,13,0,0),
+d(1986,3,22,12,0,0),
+d(1986,9,27,13,0,0),
+d(1987,3,28,12,0,0),
+d(1987,9,26,13,0,0),
+d(1988,3,26,12,0,0),
+d(1988,9,24,13,0,0),
+d(1989,3,25,12,0,0),
+d(1989,9,23,13,0,0),
+d(1990,3,24,12,0,0),
+d(1990,9,22,13,0,0),
+d(1991,3,23,12,0,0),
+d(1991,9,28,13,0,0),
+d(1992,1,25,12,0,0),
+d(1992,10,24,13,0,0),
+d(1993,1,23,12,0,0),
+        ]
+
+    _transition_info = [
+i(40380,0,'LMT'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+i(43200,3600,'VUST'),
+i(39600,0,'VUT'),
+        ]
+
+Efate = Efate()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Enderbury.py b/lib/pytz/zoneinfo/Pacific/Enderbury.py
new file mode 100755
index 0000000..4c7d28f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Enderbury.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Pacific/Enderbury.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Enderbury(DstTzInfo):
+    '''Pacific/Enderbury timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Enderbury'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1979,10,1,12,0,0),
+d(1995,1,1,11,0,0),
+        ]
+
+    _transition_info = [
+i(-43200,0,'PHOT'),
+i(-39600,0,'PHOT'),
+i(46800,0,'PHOT'),
+        ]
+
+Enderbury = Enderbury()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Fakaofo.py b/lib/pytz/zoneinfo/Pacific/Fakaofo.py
new file mode 100755
index 0000000..6d39db7
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Fakaofo.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Fakaofo.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Fakaofo(StaticTzInfo):
+    '''Pacific/Fakaofo timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Fakaofo'
+    _utcoffset = timedelta(seconds=-36000)
+    _tzname = 'TKT'
+
+Fakaofo = Fakaofo()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Fiji.py b/lib/pytz/zoneinfo/Pacific/Fiji.py
new file mode 100755
index 0000000..8f416d9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Fiji.py
@@ -0,0 +1,30 @@
+'''tzinfo timezone information for Pacific/Fiji.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Fiji(DstTzInfo):
+    '''Pacific/Fiji timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Fiji'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1915,10,25,12,6,20),
+d(1998,10,31,14,0,0),
+d(1999,2,27,14,0,0),
+d(1999,11,6,14,0,0),
+d(2000,2,26,14,0,0),
+        ]
+
+    _transition_info = [
+i(42840,0,'LMT'),
+i(43200,0,'FJT'),
+i(46800,3600,'FJST'),
+i(43200,0,'FJT'),
+i(46800,3600,'FJST'),
+i(43200,0,'FJT'),
+        ]
+
+Fiji = Fiji()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Funafuti.py b/lib/pytz/zoneinfo/Pacific/Funafuti.py
new file mode 100755
index 0000000..9801538
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Funafuti.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Funafuti.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Funafuti(StaticTzInfo):
+    '''Pacific/Funafuti timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Funafuti'
+    _utcoffset = timedelta(seconds=43200)
+    _tzname = 'TVT'
+
+Funafuti = Funafuti()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Galapagos.py b/lib/pytz/zoneinfo/Pacific/Galapagos.py
new file mode 100755
index 0000000..9102a8e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Galapagos.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Pacific/Galapagos.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Galapagos(DstTzInfo):
+    '''Pacific/Galapagos timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Galapagos'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1931,1,1,5,58,24),
+d(1986,1,1,5,0,0),
+        ]
+
+    _transition_info = [
+i(-21480,0,'LMT'),
+i(-18000,0,'ECT'),
+i(-21600,0,'GALT'),
+        ]
+
+Galapagos = Galapagos()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Gambier.py b/lib/pytz/zoneinfo/Pacific/Gambier.py
new file mode 100755
index 0000000..fd04b89
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Gambier.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Pacific/Gambier.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Gambier(DstTzInfo):
+    '''Pacific/Gambier timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Gambier'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,10,1,8,59,48),
+        ]
+
+    _transition_info = [
+i(-32400,0,'LMT'),
+i(-32400,0,'GAMT'),
+        ]
+
+Gambier = Gambier()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Guadalcanal.py b/lib/pytz/zoneinfo/Pacific/Guadalcanal.py
new file mode 100755
index 0000000..e88689c
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Guadalcanal.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Pacific/Guadalcanal.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Guadalcanal(DstTzInfo):
+    '''Pacific/Guadalcanal timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Guadalcanal'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,9,30,13,20,12),
+        ]
+
+    _transition_info = [
+i(38400,0,'LMT'),
+i(39600,0,'SBT'),
+        ]
+
+Guadalcanal = Guadalcanal()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Guam.py b/lib/pytz/zoneinfo/Pacific/Guam.py
new file mode 100755
index 0000000..7ea7b70
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Guam.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Pacific/Guam.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Guam(DstTzInfo):
+    '''Pacific/Guam timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Guam'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(2000,12,22,14,0,0),
+        ]
+
+    _transition_info = [
+i(36000,0,'GST'),
+i(36000,0,'ChST'),
+        ]
+
+Guam = Guam()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Honolulu.py b/lib/pytz/zoneinfo/Pacific/Honolulu.py
new file mode 100755
index 0000000..e32cc01
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Honolulu.py
@@ -0,0 +1,32 @@
+'''tzinfo timezone information for Pacific/Honolulu.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Honolulu(DstTzInfo):
+    '''Pacific/Honolulu timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Honolulu'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1933,4,30,12,30,0),
+d(1933,5,21,11,30,0),
+d(1942,2,9,12,30,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,11,30,0),
+d(1947,6,8,12,30,0),
+        ]
+
+    _transition_info = [
+i(-37800,0,'HST'),
+i(-34200,3600,'HDT'),
+i(-37800,0,'HST'),
+i(-34200,3600,'HWT'),
+i(-34200,3600,'HPT'),
+i(-37800,0,'HST'),
+i(-36000,0,'HST'),
+        ]
+
+Honolulu = Honolulu()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Johnston.py b/lib/pytz/zoneinfo/Pacific/Johnston.py
new file mode 100755
index 0000000..a4a2957
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Johnston.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Johnston.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Johnston(StaticTzInfo):
+    '''Pacific/Johnston timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Johnston'
+    _utcoffset = timedelta(seconds=-36000)
+    _tzname = 'HST'
+
+Johnston = Johnston()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Kiritimati.py b/lib/pytz/zoneinfo/Pacific/Kiritimati.py
new file mode 100755
index 0000000..f1e4564
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Kiritimati.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Pacific/Kiritimati.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kiritimati(DstTzInfo):
+    '''Pacific/Kiritimati timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Kiritimati'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1979,10,1,10,40,0),
+d(1995,1,1,10,0,0),
+        ]
+
+    _transition_info = [
+i(-38400,0,'LINT'),
+i(-36000,0,'LINT'),
+i(50400,0,'LINT'),
+        ]
+
+Kiritimati = Kiritimati()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Kosrae.py b/lib/pytz/zoneinfo/Pacific/Kosrae.py
new file mode 100755
index 0000000..76e694c
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Kosrae.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Pacific/Kosrae.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kosrae(DstTzInfo):
+    '''Pacific/Kosrae timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Kosrae'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1969,9,30,13,0,0),
+d(1998,12,31,12,0,0),
+        ]
+
+    _transition_info = [
+i(39600,0,'KOST'),
+i(43200,0,'KOST'),
+i(39600,0,'KOST'),
+        ]
+
+Kosrae = Kosrae()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Kwajalein.py b/lib/pytz/zoneinfo/Pacific/Kwajalein.py
new file mode 100755
index 0000000..65c4b03
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Kwajalein.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Pacific/Kwajalein.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Kwajalein(DstTzInfo):
+    '''Pacific/Kwajalein timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Kwajalein'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1969,9,30,13,0,0),
+d(1993,8,20,12,0,0),
+        ]
+
+    _transition_info = [
+i(39600,0,'MHT'),
+i(-43200,0,'KWAT'),
+i(43200,0,'MHT'),
+        ]
+
+Kwajalein = Kwajalein()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Majuro.py b/lib/pytz/zoneinfo/Pacific/Majuro.py
new file mode 100755
index 0000000..e2c0990
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Majuro.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Pacific/Majuro.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Majuro(DstTzInfo):
+    '''Pacific/Majuro timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Majuro'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1969,9,30,13,0,0),
+        ]
+
+    _transition_info = [
+i(39600,0,'MHT'),
+i(43200,0,'MHT'),
+        ]
+
+Majuro = Majuro()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Marquesas.py b/lib/pytz/zoneinfo/Pacific/Marquesas.py
new file mode 100755
index 0000000..943211a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Marquesas.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Pacific/Marquesas.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Marquesas(DstTzInfo):
+    '''Pacific/Marquesas timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Marquesas'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,10,1,9,18,0),
+        ]
+
+    _transition_info = [
+i(-33480,0,'LMT'),
+i(-34200,0,'MART'),
+        ]
+
+Marquesas = Marquesas()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Midway.py b/lib/pytz/zoneinfo/Pacific/Midway.py
new file mode 100755
index 0000000..04570f0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Midway.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Pacific/Midway.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Midway(DstTzInfo):
+    '''Pacific/Midway timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Midway'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1956,6,3,11,0,0),
+d(1956,9,2,10,0,0),
+d(1967,4,1,11,0,0),
+d(1983,11,30,11,0,0),
+        ]
+
+    _transition_info = [
+i(-39600,0,'NST'),
+i(-36000,3600,'NDT'),
+i(-39600,0,'NST'),
+i(-39600,0,'BST'),
+i(-39600,0,'SST'),
+        ]
+
+Midway = Midway()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Nauru.py b/lib/pytz/zoneinfo/Pacific/Nauru.py
new file mode 100755
index 0000000..97ddde3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Nauru.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Pacific/Nauru.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Nauru(DstTzInfo):
+    '''Pacific/Nauru timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Nauru'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1921,1,14,12,52,20),
+d(1942,3,14,12,30,0),
+d(1944,8,14,15,0,0),
+d(1979,4,30,12,30,0),
+        ]
+
+    _transition_info = [
+i(40080,0,'LMT'),
+i(41400,0,'NRT'),
+i(32400,0,'JST'),
+i(41400,0,'NRT'),
+i(43200,0,'NRT'),
+        ]
+
+Nauru = Nauru()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Niue.py b/lib/pytz/zoneinfo/Pacific/Niue.py
new file mode 100755
index 0000000..6449e84
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Niue.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Pacific/Niue.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Niue(DstTzInfo):
+    '''Pacific/Niue timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Niue'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1951,1,1,11,20,0),
+d(1978,10,1,11,30,0),
+        ]
+
+    _transition_info = [
+i(-40800,0,'NUT'),
+i(-41400,0,'NUT'),
+i(-39600,0,'NUT'),
+        ]
+
+Niue = Niue()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Norfolk.py b/lib/pytz/zoneinfo/Pacific/Norfolk.py
new file mode 100755
index 0000000..8eda51a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Norfolk.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Pacific/Norfolk.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Norfolk(DstTzInfo):
+    '''Pacific/Norfolk timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Norfolk'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1950,12,31,12,48,0),
+        ]
+
+    _transition_info = [
+i(40320,0,'NMT'),
+i(41400,0,'NFT'),
+        ]
+
+Norfolk = Norfolk()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Noumea.py b/lib/pytz/zoneinfo/Pacific/Noumea.py
new file mode 100755
index 0000000..32efeea
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Noumea.py
@@ -0,0 +1,34 @@
+'''tzinfo timezone information for Pacific/Noumea.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Noumea(DstTzInfo):
+    '''Pacific/Noumea timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Noumea'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,12,12,54,12),
+d(1977,12,3,13,0,0),
+d(1978,2,26,12,0,0),
+d(1978,12,2,13,0,0),
+d(1979,2,26,12,0,0),
+d(1996,11,30,15,0,0),
+d(1997,3,1,15,0,0),
+        ]
+
+    _transition_info = [
+i(39960,0,'LMT'),
+i(39600,0,'NCT'),
+i(43200,3600,'NCST'),
+i(39600,0,'NCT'),
+i(43200,3600,'NCST'),
+i(39600,0,'NCT'),
+i(43200,3600,'NCST'),
+i(39600,0,'NCT'),
+        ]
+
+Noumea = Noumea()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Pago_Pago.py b/lib/pytz/zoneinfo/Pacific/Pago_Pago.py
new file mode 100755
index 0000000..d0fa9c0
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Pago_Pago.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Pacific/Pago_Pago.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Pago_Pago(DstTzInfo):
+    '''Pacific/Pago_Pago timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Pago_Pago'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,1,1,11,22,48),
+d(1950,1,1,11,30,0),
+d(1967,4,1,11,0,0),
+d(1983,11,30,11,0,0),
+        ]
+
+    _transition_info = [
+i(-40980,0,'LMT'),
+i(-41400,0,'SAMT'),
+i(-39600,0,'NST'),
+i(-39600,0,'BST'),
+i(-39600,0,'SST'),
+        ]
+
+Pago_Pago = Pago_Pago()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Palau.py b/lib/pytz/zoneinfo/Pacific/Palau.py
new file mode 100755
index 0000000..b873d88
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Palau.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Palau.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Palau(StaticTzInfo):
+    '''Pacific/Palau timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Palau'
+    _utcoffset = timedelta(seconds=32400)
+    _tzname = 'PWT'
+
+Palau = Palau()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Pitcairn.py b/lib/pytz/zoneinfo/Pacific/Pitcairn.py
new file mode 100755
index 0000000..125b8a8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Pitcairn.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Pacific/Pitcairn.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Pitcairn(DstTzInfo):
+    '''Pacific/Pitcairn timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Pitcairn'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1998,4,27,8,30,0),
+        ]
+
+    _transition_info = [
+i(-30600,0,'PNT'),
+i(-28800,0,'PST'),
+        ]
+
+Pitcairn = Pitcairn()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Ponape.py b/lib/pytz/zoneinfo/Pacific/Ponape.py
new file mode 100755
index 0000000..4cd6ad8
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Ponape.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Ponape.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Ponape(StaticTzInfo):
+    '''Pacific/Ponape timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Ponape'
+    _utcoffset = timedelta(seconds=39600)
+    _tzname = 'PONT'
+
+Ponape = Ponape()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Port_Moresby.py b/lib/pytz/zoneinfo/Pacific/Port_Moresby.py
new file mode 100755
index 0000000..8510d85
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Port_Moresby.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Port_Moresby.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Port_Moresby(StaticTzInfo):
+    '''Pacific/Port_Moresby timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Port_Moresby'
+    _utcoffset = timedelta(seconds=36000)
+    _tzname = 'PGT'
+
+Port_Moresby = Port_Moresby()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Rarotonga.py b/lib/pytz/zoneinfo/Pacific/Rarotonga.py
new file mode 100755
index 0000000..d6106e9
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Rarotonga.py
@@ -0,0 +1,72 @@
+'''tzinfo timezone information for Pacific/Rarotonga.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Rarotonga(DstTzInfo):
+    '''Pacific/Rarotonga timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Rarotonga'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1978,11,12,10,30,0),
+d(1979,3,4,9,30,0),
+d(1979,10,28,10,0,0),
+d(1980,3,2,9,30,0),
+d(1980,10,26,10,0,0),
+d(1981,3,1,9,30,0),
+d(1981,10,25,10,0,0),
+d(1982,3,7,9,30,0),
+d(1982,10,31,10,0,0),
+d(1983,3,6,9,30,0),
+d(1983,10,30,10,0,0),
+d(1984,3,4,9,30,0),
+d(1984,10,28,10,0,0),
+d(1985,3,3,9,30,0),
+d(1985,10,27,10,0,0),
+d(1986,3,2,9,30,0),
+d(1986,10,26,10,0,0),
+d(1987,3,1,9,30,0),
+d(1987,10,25,10,0,0),
+d(1988,3,6,9,30,0),
+d(1988,10,30,10,0,0),
+d(1989,3,5,9,30,0),
+d(1989,10,29,10,0,0),
+d(1990,3,4,9,30,0),
+d(1990,10,28,10,0,0),
+d(1991,3,3,9,30,0),
+        ]
+
+    _transition_info = [
+i(-37800,0,'CKT'),
+i(-34200,3600,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+i(-34200,1800,'CKHST'),
+i(-36000,0,'CKT'),
+        ]
+
+Rarotonga = Rarotonga()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Saipan.py b/lib/pytz/zoneinfo/Pacific/Saipan.py
new file mode 100755
index 0000000..9c1e93e
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Saipan.py
@@ -0,0 +1,24 @@
+'''tzinfo timezone information for Pacific/Saipan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Saipan(DstTzInfo):
+    '''Pacific/Saipan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Saipan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1969,9,30,15,0,0),
+d(2000,12,22,14,0,0),
+        ]
+
+    _transition_info = [
+i(32400,0,'MPT'),
+i(36000,0,'MPT'),
+i(36000,0,'ChST'),
+        ]
+
+Saipan = Saipan()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Samoa.py b/lib/pytz/zoneinfo/Pacific/Samoa.py
new file mode 100755
index 0000000..91f1ab5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Samoa.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for Pacific/Samoa.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Samoa(DstTzInfo):
+    '''Pacific/Samoa timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Samoa'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,1,1,11,22,48),
+d(1950,1,1,11,30,0),
+d(1967,4,1,11,0,0),
+d(1983,11,30,11,0,0),
+        ]
+
+    _transition_info = [
+i(-40980,0,'LMT'),
+i(-41400,0,'SAMT'),
+i(-39600,0,'NST'),
+i(-39600,0,'BST'),
+i(-39600,0,'SST'),
+        ]
+
+Samoa = Samoa()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Tahiti.py b/lib/pytz/zoneinfo/Pacific/Tahiti.py
new file mode 100755
index 0000000..e930a5b
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Tahiti.py
@@ -0,0 +1,22 @@
+'''tzinfo timezone information for Pacific/Tahiti.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tahiti(DstTzInfo):
+    '''Pacific/Tahiti timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Tahiti'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,10,1,9,58,16),
+        ]
+
+    _transition_info = [
+i(-35880,0,'LMT'),
+i(-36000,0,'TAHT'),
+        ]
+
+Tahiti = Tahiti()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Tarawa.py b/lib/pytz/zoneinfo/Pacific/Tarawa.py
new file mode 100755
index 0000000..70a1ea4
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Tarawa.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Tarawa.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Tarawa(StaticTzInfo):
+    '''Pacific/Tarawa timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Tarawa'
+    _utcoffset = timedelta(seconds=43200)
+    _tzname = 'GILT'
+
+Tarawa = Tarawa()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Tongatapu.py b/lib/pytz/zoneinfo/Pacific/Tongatapu.py
new file mode 100755
index 0000000..85e3d25
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Tongatapu.py
@@ -0,0 +1,34 @@
+'''tzinfo timezone information for Pacific/Tongatapu.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Tongatapu(DstTzInfo):
+    '''Pacific/Tongatapu timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Pacific/Tongatapu'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1940,12,31,11,40,0),
+d(1999,10,6,13,0,0),
+d(2000,3,18,13,0,0),
+d(2000,11,4,13,0,0),
+d(2001,1,27,12,0,0),
+d(2001,11,3,13,0,0),
+d(2002,1,26,12,0,0),
+        ]
+
+    _transition_info = [
+i(44400,0,'TOT'),
+i(46800,0,'TOT'),
+i(50400,3600,'TOST'),
+i(46800,0,'TOT'),
+i(50400,3600,'TOST'),
+i(46800,0,'TOT'),
+i(50400,3600,'TOST'),
+i(46800,0,'TOT'),
+        ]
+
+Tongatapu = Tongatapu()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Truk.py b/lib/pytz/zoneinfo/Pacific/Truk.py
new file mode 100755
index 0000000..e6631a2
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Truk.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Truk.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Truk(StaticTzInfo):
+    '''Pacific/Truk timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Truk'
+    _utcoffset = timedelta(seconds=36000)
+    _tzname = 'TRUT'
+
+Truk = Truk()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Wake.py b/lib/pytz/zoneinfo/Pacific/Wake.py
new file mode 100755
index 0000000..a7e296c
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Wake.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Wake.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Wake(StaticTzInfo):
+    '''Pacific/Wake timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Wake'
+    _utcoffset = timedelta(seconds=43200)
+    _tzname = 'WAKT'
+
+Wake = Wake()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Wallis.py b/lib/pytz/zoneinfo/Pacific/Wallis.py
new file mode 100755
index 0000000..76f5251
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Wallis.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Wallis.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Wallis(StaticTzInfo):
+    '''Pacific/Wallis timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Wallis'
+    _utcoffset = timedelta(seconds=43200)
+    _tzname = 'WFT'
+
+Wallis = Wallis()
+
diff --git a/lib/pytz/zoneinfo/Pacific/Yap.py b/lib/pytz/zoneinfo/Pacific/Yap.py
new file mode 100755
index 0000000..98152b5
--- /dev/null
+++ b/lib/pytz/zoneinfo/Pacific/Yap.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Pacific/Yap.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Yap(StaticTzInfo):
+    '''Pacific/Yap timezone definition. See datetime.tzinfo for details'''
+    zone = 'Pacific/Yap'
+    _utcoffset = timedelta(seconds=36000)
+    _tzname = 'TRUT'
+
+Yap = Yap()
+
diff --git a/lib/pytz/zoneinfo/Pacific/__init__.py b/lib/pytz/zoneinfo/Pacific/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/Poland.py b/lib/pytz/zoneinfo/Poland.py
new file mode 100755
index 0000000..f3b95d3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Poland.py
@@ -0,0 +1,354 @@
+'''tzinfo timezone information for Poland.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Poland(DstTzInfo):
+    '''Poland timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Poland'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1915,8,4,22,36,0),
+d(1916,4,30,22,0,0),
+d(1916,9,30,23,0,0),
+d(1917,4,16,1,0,0),
+d(1917,9,17,1,0,0),
+d(1918,4,15,1,0,0),
+d(1918,9,16,1,0,0),
+d(1919,4,15,0,0,0),
+d(1919,9,16,0,0,0),
+d(1922,5,31,22,0,0),
+d(1940,6,23,1,0,0),
+d(1942,11,2,1,0,0),
+d(1943,3,29,1,0,0),
+d(1943,10,4,1,0,0),
+d(1944,4,3,1,0,0),
+d(1944,9,30,22,0,0),
+d(1944,10,4,0,0,0),
+d(1945,4,28,23,0,0),
+d(1945,10,31,22,0,0),
+d(1946,4,13,23,0,0),
+d(1946,10,7,1,0,0),
+d(1947,5,4,1,0,0),
+d(1947,10,5,1,0,0),
+d(1948,4,18,1,0,0),
+d(1948,10,3,1,0,0),
+d(1949,4,10,1,0,0),
+d(1949,10,2,1,0,0),
+d(1957,6,2,0,0,0),
+d(1957,9,29,0,0,0),
+d(1958,3,30,0,0,0),
+d(1958,9,28,0,0,0),
+d(1959,5,31,0,0,0),
+d(1959,10,4,0,0,0),
+d(1960,4,3,0,0,0),
+d(1960,10,2,0,0,0),
+d(1961,5,28,0,0,0),
+d(1961,10,1,0,0,0),
+d(1962,5,27,0,0,0),
+d(1962,9,30,0,0,0),
+d(1963,5,26,0,0,0),
+d(1963,9,29,0,0,0),
+d(1964,5,31,0,0,0),
+d(1964,9,27,0,0,0),
+d(1976,12,31,23,0,0),
+d(1977,4,3,0,0,0),
+d(1977,9,25,0,0,0),
+d(1978,4,2,0,0,0),
+d(1978,10,1,0,0,0),
+d(1979,4,1,0,0,0),
+d(1979,9,30,0,0,0),
+d(1980,4,6,0,0,0),
+d(1980,9,28,0,0,0),
+d(1981,3,29,0,0,0),
+d(1981,9,27,0,0,0),
+d(1982,3,28,0,0,0),
+d(1982,9,26,0,0,0),
+d(1983,3,27,0,0,0),
+d(1983,9,25,0,0,0),
+d(1984,3,25,0,0,0),
+d(1984,9,30,0,0,0),
+d(1985,3,31,0,0,0),
+d(1985,9,29,0,0,0),
+d(1986,3,30,0,0,0),
+d(1986,9,28,0,0,0),
+d(1987,3,29,0,0,0),
+d(1987,9,27,0,0,0),
+d(1987,12,31,23,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(5040,0,'WMT'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+        ]
+
+Poland = Poland()
+
diff --git a/lib/pytz/zoneinfo/Portugal.py b/lib/pytz/zoneinfo/Portugal.py
new file mode 100755
index 0000000..24cb480
--- /dev/null
+++ b/lib/pytz/zoneinfo/Portugal.py
@@ -0,0 +1,462 @@
+'''tzinfo timezone information for Portugal.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Portugal(DstTzInfo):
+    '''Portugal timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Portugal'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1912,1,1,0,36,32),
+d(1916,6,17,23,0,0),
+d(1916,11,1,0,0,0),
+d(1917,2,28,23,0,0),
+d(1917,10,14,23,0,0),
+d(1918,3,1,23,0,0),
+d(1918,10,14,23,0,0),
+d(1919,2,28,23,0,0),
+d(1919,10,14,23,0,0),
+d(1920,2,29,23,0,0),
+d(1920,10,14,23,0,0),
+d(1921,2,28,23,0,0),
+d(1921,10,14,23,0,0),
+d(1924,4,16,23,0,0),
+d(1924,10,14,23,0,0),
+d(1926,4,17,23,0,0),
+d(1926,10,2,23,0,0),
+d(1927,4,9,23,0,0),
+d(1927,10,1,23,0,0),
+d(1928,4,14,23,0,0),
+d(1928,10,6,23,0,0),
+d(1929,4,20,23,0,0),
+d(1929,10,5,23,0,0),
+d(1931,4,18,23,0,0),
+d(1931,10,3,23,0,0),
+d(1932,4,2,23,0,0),
+d(1932,10,1,23,0,0),
+d(1934,4,7,23,0,0),
+d(1934,10,6,23,0,0),
+d(1935,3,30,23,0,0),
+d(1935,10,5,23,0,0),
+d(1936,4,18,23,0,0),
+d(1936,10,3,23,0,0),
+d(1937,4,3,23,0,0),
+d(1937,10,2,23,0,0),
+d(1938,3,26,23,0,0),
+d(1938,10,1,23,0,0),
+d(1939,4,15,23,0,0),
+d(1939,11,18,23,0,0),
+d(1940,2,24,23,0,0),
+d(1940,10,5,23,0,0),
+d(1941,4,5,23,0,0),
+d(1941,10,5,23,0,0),
+d(1942,3,14,23,0,0),
+d(1942,4,25,22,0,0),
+d(1942,8,15,22,0,0),
+d(1942,10,24,23,0,0),
+d(1943,3,13,23,0,0),
+d(1943,4,17,22,0,0),
+d(1943,8,28,22,0,0),
+d(1943,10,30,23,0,0),
+d(1944,3,11,23,0,0),
+d(1944,4,22,22,0,0),
+d(1944,8,26,22,0,0),
+d(1944,10,28,23,0,0),
+d(1945,3,10,23,0,0),
+d(1945,4,21,22,0,0),
+d(1945,8,25,22,0,0),
+d(1945,10,27,23,0,0),
+d(1946,4,6,23,0,0),
+d(1946,10,5,23,0,0),
+d(1947,4,6,2,0,0),
+d(1947,10,5,2,0,0),
+d(1948,4,4,2,0,0),
+d(1948,10,3,2,0,0),
+d(1949,4,3,2,0,0),
+d(1949,10,2,2,0,0),
+d(1951,4,1,2,0,0),
+d(1951,10,7,2,0,0),
+d(1952,4,6,2,0,0),
+d(1952,10,5,2,0,0),
+d(1953,4,5,2,0,0),
+d(1953,10,4,2,0,0),
+d(1954,4,4,2,0,0),
+d(1954,10,3,2,0,0),
+d(1955,4,3,2,0,0),
+d(1955,10,2,2,0,0),
+d(1956,4,1,2,0,0),
+d(1956,10,7,2,0,0),
+d(1957,4,7,2,0,0),
+d(1957,10,6,2,0,0),
+d(1958,4,6,2,0,0),
+d(1958,10,5,2,0,0),
+d(1959,4,5,2,0,0),
+d(1959,10,4,2,0,0),
+d(1960,4,3,2,0,0),
+d(1960,10,2,2,0,0),
+d(1961,4,2,2,0,0),
+d(1961,10,1,2,0,0),
+d(1962,4,1,2,0,0),
+d(1962,10,7,2,0,0),
+d(1963,4,7,2,0,0),
+d(1963,10,6,2,0,0),
+d(1964,4,5,2,0,0),
+d(1964,10,4,2,0,0),
+d(1965,4,4,2,0,0),
+d(1965,10,3,2,0,0),
+d(1966,4,3,2,0,0),
+d(1976,9,26,0,0,0),
+d(1977,3,27,0,0,0),
+d(1977,9,25,0,0,0),
+d(1978,4,2,0,0,0),
+d(1978,10,1,0,0,0),
+d(1979,4,1,0,0,0),
+d(1979,9,30,1,0,0),
+d(1980,3,30,0,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,2,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(-2220,0,'LMT'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(7200,7200,'WEMT'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,0,'CET'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(7200,3600,'CEST'),
+i(3600,0,'CET'),
+i(3600,0,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+        ]
+
+Portugal = Portugal()
+
diff --git a/lib/pytz/zoneinfo/ROC.py b/lib/pytz/zoneinfo/ROC.py
new file mode 100755
index 0000000..6aad5b5
--- /dev/null
+++ b/lib/pytz/zoneinfo/ROC.py
@@ -0,0 +1,100 @@
+'''tzinfo timezone information for ROC.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class ROC(DstTzInfo):
+    '''ROC timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'ROC'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1945,4,30,16,0,0),
+d(1945,9,30,15,0,0),
+d(1946,4,30,16,0,0),
+d(1946,9,30,15,0,0),
+d(1947,4,30,16,0,0),
+d(1947,9,30,15,0,0),
+d(1948,4,30,16,0,0),
+d(1948,9,30,15,0,0),
+d(1949,4,30,16,0,0),
+d(1949,9,30,15,0,0),
+d(1950,4,30,16,0,0),
+d(1950,9,30,15,0,0),
+d(1951,4,30,16,0,0),
+d(1951,9,30,15,0,0),
+d(1952,2,29,16,0,0),
+d(1952,10,31,15,0,0),
+d(1953,3,31,16,0,0),
+d(1953,10,31,15,0,0),
+d(1954,3,31,16,0,0),
+d(1954,10,31,15,0,0),
+d(1955,3,31,16,0,0),
+d(1955,9,30,15,0,0),
+d(1956,3,31,16,0,0),
+d(1956,9,30,15,0,0),
+d(1957,3,31,16,0,0),
+d(1957,9,30,15,0,0),
+d(1958,3,31,16,0,0),
+d(1958,9,30,15,0,0),
+d(1959,3,31,16,0,0),
+d(1959,9,30,15,0,0),
+d(1960,5,31,16,0,0),
+d(1960,9,30,15,0,0),
+d(1961,5,31,16,0,0),
+d(1961,9,30,15,0,0),
+d(1974,3,31,16,0,0),
+d(1974,9,30,15,0,0),
+d(1975,3,31,16,0,0),
+d(1975,9,30,15,0,0),
+d(1980,6,29,16,0,0),
+d(1980,9,29,15,0,0),
+        ]
+
+    _transition_info = [
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+i(32400,3600,'CDT'),
+i(28800,0,'CST'),
+        ]
+
+ROC = ROC()
+
diff --git a/lib/pytz/zoneinfo/ROK.py b/lib/pytz/zoneinfo/ROK.py
new file mode 100755
index 0000000..6c86771
--- /dev/null
+++ b/lib/pytz/zoneinfo/ROK.py
@@ -0,0 +1,44 @@
+'''tzinfo timezone information for ROK.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class ROK(DstTzInfo):
+    '''ROK timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'ROK'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1904,11,30,15,30,0),
+d(1927,12,31,15,0,0),
+d(1931,12,31,15,30,0),
+d(1954,3,20,15,0,0),
+d(1960,5,14,16,0,0),
+d(1960,9,12,15,0,0),
+d(1961,8,9,16,0,0),
+d(1968,9,30,15,30,0),
+d(1987,5,9,15,0,0),
+d(1987,10,10,14,0,0),
+d(1988,5,7,15,0,0),
+d(1988,10,8,14,0,0),
+        ]
+
+    _transition_info = [
+i(30600,0,'KST'),
+i(32400,0,'KST'),
+i(30600,0,'KST'),
+i(32400,0,'KST'),
+i(28800,0,'KST'),
+i(32400,3600,'KDT'),
+i(28800,0,'KST'),
+i(30600,0,'KST'),
+i(32400,0,'KST'),
+i(36000,3600,'KDT'),
+i(32400,0,'KST'),
+i(36000,3600,'KDT'),
+i(32400,0,'KST'),
+        ]
+
+ROK = ROK()
+
diff --git a/lib/pytz/zoneinfo/Singapore.py b/lib/pytz/zoneinfo/Singapore.py
new file mode 100755
index 0000000..a578031
--- /dev/null
+++ b/lib/pytz/zoneinfo/Singapore.py
@@ -0,0 +1,36 @@
+'''tzinfo timezone information for Singapore.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Singapore(DstTzInfo):
+    '''Singapore timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Singapore'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,5,31,17,4,35),
+d(1932,12,31,17,0,0),
+d(1935,12,31,16,40,0),
+d(1941,8,31,16,40,0),
+d(1942,2,15,16,30,0),
+d(1945,9,11,15,0,0),
+d(1965,8,8,16,30,0),
+d(1981,12,31,16,30,0),
+        ]
+
+    _transition_info = [
+i(24900,0,'SMT'),
+i(25200,0,'MALT'),
+i(26400,1200,'MALST'),
+i(26400,0,'MALT'),
+i(27000,0,'MALT'),
+i(32400,0,'JST'),
+i(27000,0,'MALT'),
+i(27000,0,'SGT'),
+i(28800,0,'SGT'),
+        ]
+
+Singapore = Singapore()
+
diff --git a/lib/pytz/zoneinfo/Turkey.py b/lib/pytz/zoneinfo/Turkey.py
new file mode 100755
index 0000000..70303e3
--- /dev/null
+++ b/lib/pytz/zoneinfo/Turkey.py
@@ -0,0 +1,362 @@
+'''tzinfo timezone information for Turkey.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Turkey(DstTzInfo):
+    '''Turkey timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'Turkey'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1910,9,30,22,3,4),
+d(1916,4,30,22,0,0),
+d(1916,9,30,21,0,0),
+d(1920,3,27,22,0,0),
+d(1920,10,24,21,0,0),
+d(1921,4,2,22,0,0),
+d(1921,10,2,21,0,0),
+d(1922,3,25,22,0,0),
+d(1922,10,7,21,0,0),
+d(1924,5,12,22,0,0),
+d(1924,9,30,21,0,0),
+d(1925,4,30,22,0,0),
+d(1925,9,30,21,0,0),
+d(1940,6,29,22,0,0),
+d(1940,10,4,21,0,0),
+d(1940,11,30,22,0,0),
+d(1941,9,20,21,0,0),
+d(1942,3,31,22,0,0),
+d(1942,10,31,21,0,0),
+d(1945,4,1,22,0,0),
+d(1945,10,7,21,0,0),
+d(1946,5,31,22,0,0),
+d(1946,9,30,21,0,0),
+d(1947,4,19,22,0,0),
+d(1947,10,4,21,0,0),
+d(1948,4,17,22,0,0),
+d(1948,10,2,21,0,0),
+d(1949,4,9,22,0,0),
+d(1949,10,1,21,0,0),
+d(1950,4,18,22,0,0),
+d(1950,10,7,21,0,0),
+d(1951,4,21,22,0,0),
+d(1951,10,7,21,0,0),
+d(1962,7,14,22,0,0),
+d(1962,10,7,21,0,0),
+d(1964,5,14,22,0,0),
+d(1964,9,30,21,0,0),
+d(1970,5,2,22,0,0),
+d(1970,10,3,21,0,0),
+d(1971,5,1,22,0,0),
+d(1971,10,2,21,0,0),
+d(1972,5,6,22,0,0),
+d(1972,10,7,21,0,0),
+d(1973,6,2,23,0,0),
+d(1973,11,4,0,0,0),
+d(1974,3,31,0,0,0),
+d(1974,11,3,2,0,0),
+d(1975,3,29,22,0,0),
+d(1975,10,25,21,0,0),
+d(1976,5,31,22,0,0),
+d(1976,10,30,21,0,0),
+d(1977,4,2,22,0,0),
+d(1977,10,15,21,0,0),
+d(1978,4,1,22,0,0),
+d(1978,10,14,21,0,0),
+d(1979,10,14,20,0,0),
+d(1980,4,6,0,0,0),
+d(1980,10,12,20,0,0),
+d(1981,3,29,0,0,0),
+d(1981,10,11,20,0,0),
+d(1982,3,28,0,0,0),
+d(1982,10,10,20,0,0),
+d(1983,7,30,21,0,0),
+d(1983,10,1,20,0,0),
+d(1985,4,19,21,0,0),
+d(1985,9,27,21,0,0),
+d(1986,3,30,0,0,0),
+d(1986,9,28,0,0,0),
+d(1987,3,29,0,0,0),
+d(1987,9,27,0,0,0),
+d(1988,3,27,0,0,0),
+d(1988,9,25,0,0,0),
+d(1989,3,26,0,0,0),
+d(1989,9,24,0,0,0),
+d(1990,3,25,0,0,0),
+d(1990,9,30,0,0,0),
+d(1990,12,31,22,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(7020,0,'IMT'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(14400,7200,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(14400,3600,'TRST'),
+i(10800,0,'TRT'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+i(10800,3600,'EEST'),
+i(7200,0,'EET'),
+        ]
+
+Turkey = Turkey()
+
diff --git a/lib/pytz/zoneinfo/UCT.py b/lib/pytz/zoneinfo/UCT.py
new file mode 100755
index 0000000..1d62aff
--- /dev/null
+++ b/lib/pytz/zoneinfo/UCT.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for UCT.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class UCT(StaticTzInfo):
+    '''UCT timezone definition. See datetime.tzinfo for details'''
+    zone = 'UCT'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'UCT'
+
+UCT = UCT()
+
diff --git a/lib/pytz/zoneinfo/US/Alaska.py b/lib/pytz/zoneinfo/US/Alaska.py
new file mode 100755
index 0000000..c004f98
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Alaska.py
@@ -0,0 +1,306 @@
+'''tzinfo timezone information for US/Alaska.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Alaska(DstTzInfo):
+    '''US/Alaska timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Alaska'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,2,9,12,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,11,0,0),
+d(1967,4,1,10,0,0),
+d(1969,4,27,12,0,0),
+d(1969,10,26,11,0,0),
+d(1970,4,26,12,0,0),
+d(1970,10,25,11,0,0),
+d(1971,4,25,12,0,0),
+d(1971,10,31,11,0,0),
+d(1972,4,30,12,0,0),
+d(1972,10,29,11,0,0),
+d(1973,4,29,12,0,0),
+d(1973,10,28,11,0,0),
+d(1974,1,6,12,0,0),
+d(1974,10,27,11,0,0),
+d(1975,2,23,12,0,0),
+d(1975,10,26,11,0,0),
+d(1976,4,25,12,0,0),
+d(1976,10,31,11,0,0),
+d(1977,4,24,12,0,0),
+d(1977,10,30,11,0,0),
+d(1978,4,30,12,0,0),
+d(1978,10,29,11,0,0),
+d(1979,4,29,12,0,0),
+d(1979,10,28,11,0,0),
+d(1980,4,27,12,0,0),
+d(1980,10,26,11,0,0),
+d(1981,4,26,12,0,0),
+d(1981,10,25,11,0,0),
+d(1982,4,25,12,0,0),
+d(1982,10,31,11,0,0),
+d(1983,4,24,12,0,0),
+d(1983,10,30,11,0,0),
+d(1983,11,30,9,0,0),
+d(1984,4,29,11,0,0),
+d(1984,10,28,10,0,0),
+d(1985,4,28,11,0,0),
+d(1985,10,27,10,0,0),
+d(1986,4,27,11,0,0),
+d(1986,10,26,10,0,0),
+d(1987,4,5,11,0,0),
+d(1987,10,25,10,0,0),
+d(1988,4,3,11,0,0),
+d(1988,10,30,10,0,0),
+d(1989,4,2,11,0,0),
+d(1989,10,29,10,0,0),
+d(1990,4,1,11,0,0),
+d(1990,10,28,10,0,0),
+d(1991,4,7,11,0,0),
+d(1991,10,27,10,0,0),
+d(1992,4,5,11,0,0),
+d(1992,10,25,10,0,0),
+d(1993,4,4,11,0,0),
+d(1993,10,31,10,0,0),
+d(1994,4,3,11,0,0),
+d(1994,10,30,10,0,0),
+d(1995,4,2,11,0,0),
+d(1995,10,29,10,0,0),
+d(1996,4,7,11,0,0),
+d(1996,10,27,10,0,0),
+d(1997,4,6,11,0,0),
+d(1997,10,26,10,0,0),
+d(1998,4,5,11,0,0),
+d(1998,10,25,10,0,0),
+d(1999,4,4,11,0,0),
+d(1999,10,31,10,0,0),
+d(2000,4,2,11,0,0),
+d(2000,10,29,10,0,0),
+d(2001,4,1,11,0,0),
+d(2001,10,28,10,0,0),
+d(2002,4,7,11,0,0),
+d(2002,10,27,10,0,0),
+d(2003,4,6,11,0,0),
+d(2003,10,26,10,0,0),
+d(2004,4,4,11,0,0),
+d(2004,10,31,10,0,0),
+d(2005,4,3,11,0,0),
+d(2005,10,30,10,0,0),
+d(2006,4,2,11,0,0),
+d(2006,10,29,10,0,0),
+d(2007,3,11,11,0,0),
+d(2007,11,4,10,0,0),
+d(2008,3,9,11,0,0),
+d(2008,11,2,10,0,0),
+d(2009,3,8,11,0,0),
+d(2009,11,1,10,0,0),
+d(2010,3,14,11,0,0),
+d(2010,11,7,10,0,0),
+d(2011,3,13,11,0,0),
+d(2011,11,6,10,0,0),
+d(2012,3,11,11,0,0),
+d(2012,11,4,10,0,0),
+d(2013,3,10,11,0,0),
+d(2013,11,3,10,0,0),
+d(2014,3,9,11,0,0),
+d(2014,11,2,10,0,0),
+d(2015,3,8,11,0,0),
+d(2015,11,1,10,0,0),
+d(2016,3,13,11,0,0),
+d(2016,11,6,10,0,0),
+d(2017,3,12,11,0,0),
+d(2017,11,5,10,0,0),
+d(2018,3,11,11,0,0),
+d(2018,11,4,10,0,0),
+d(2019,3,10,11,0,0),
+d(2019,11,3,10,0,0),
+d(2020,3,8,11,0,0),
+d(2020,11,1,10,0,0),
+d(2021,3,14,11,0,0),
+d(2021,11,7,10,0,0),
+d(2022,3,13,11,0,0),
+d(2022,11,6,10,0,0),
+d(2023,3,12,11,0,0),
+d(2023,11,5,10,0,0),
+d(2024,3,10,11,0,0),
+d(2024,11,3,10,0,0),
+d(2025,3,9,11,0,0),
+d(2025,11,2,10,0,0),
+d(2026,3,8,11,0,0),
+d(2026,11,1,10,0,0),
+d(2027,3,14,11,0,0),
+d(2027,11,7,10,0,0),
+d(2028,3,12,11,0,0),
+d(2028,11,5,10,0,0),
+d(2029,3,11,11,0,0),
+d(2029,11,4,10,0,0),
+d(2030,3,10,11,0,0),
+d(2030,11,3,10,0,0),
+d(2031,3,9,11,0,0),
+d(2031,11,2,10,0,0),
+d(2032,3,14,11,0,0),
+d(2032,11,7,10,0,0),
+d(2033,3,13,11,0,0),
+d(2033,11,6,10,0,0),
+d(2034,3,12,11,0,0),
+d(2034,11,5,10,0,0),
+d(2035,3,11,11,0,0),
+d(2035,11,4,10,0,0),
+d(2036,3,9,11,0,0),
+d(2036,11,2,10,0,0),
+d(2037,3,8,11,0,0),
+d(2037,11,1,10,0,0),
+        ]
+
+    _transition_info = [
+i(-36000,0,'CAT'),
+i(-32400,3600,'CAWT'),
+i(-32400,3600,'CAPT'),
+i(-36000,0,'CAT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-36000,0,'AHST'),
+i(-32400,3600,'AHDT'),
+i(-32400,0,'YST'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+i(-28800,3600,'AKDT'),
+i(-32400,0,'AKST'),
+        ]
+
+Alaska = Alaska()
+
diff --git a/lib/pytz/zoneinfo/US/Aleutian.py b/lib/pytz/zoneinfo/US/Aleutian.py
new file mode 100755
index 0000000..64f7fdc
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Aleutian.py
@@ -0,0 +1,306 @@
+'''tzinfo timezone information for US/Aleutian.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Aleutian(DstTzInfo):
+    '''US/Aleutian timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Aleutian'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1942,2,9,13,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,12,0,0),
+d(1967,4,1,11,0,0),
+d(1969,4,27,13,0,0),
+d(1969,10,26,12,0,0),
+d(1970,4,26,13,0,0),
+d(1970,10,25,12,0,0),
+d(1971,4,25,13,0,0),
+d(1971,10,31,12,0,0),
+d(1972,4,30,13,0,0),
+d(1972,10,29,12,0,0),
+d(1973,4,29,13,0,0),
+d(1973,10,28,12,0,0),
+d(1974,1,6,13,0,0),
+d(1974,10,27,12,0,0),
+d(1975,2,23,13,0,0),
+d(1975,10,26,12,0,0),
+d(1976,4,25,13,0,0),
+d(1976,10,31,12,0,0),
+d(1977,4,24,13,0,0),
+d(1977,10,30,12,0,0),
+d(1978,4,30,13,0,0),
+d(1978,10,29,12,0,0),
+d(1979,4,29,13,0,0),
+d(1979,10,28,12,0,0),
+d(1980,4,27,13,0,0),
+d(1980,10,26,12,0,0),
+d(1981,4,26,13,0,0),
+d(1981,10,25,12,0,0),
+d(1982,4,25,13,0,0),
+d(1982,10,31,12,0,0),
+d(1983,4,24,13,0,0),
+d(1983,10,30,12,0,0),
+d(1983,11,30,10,0,0),
+d(1984,4,29,12,0,0),
+d(1984,10,28,11,0,0),
+d(1985,4,28,12,0,0),
+d(1985,10,27,11,0,0),
+d(1986,4,27,12,0,0),
+d(1986,10,26,11,0,0),
+d(1987,4,5,12,0,0),
+d(1987,10,25,11,0,0),
+d(1988,4,3,12,0,0),
+d(1988,10,30,11,0,0),
+d(1989,4,2,12,0,0),
+d(1989,10,29,11,0,0),
+d(1990,4,1,12,0,0),
+d(1990,10,28,11,0,0),
+d(1991,4,7,12,0,0),
+d(1991,10,27,11,0,0),
+d(1992,4,5,12,0,0),
+d(1992,10,25,11,0,0),
+d(1993,4,4,12,0,0),
+d(1993,10,31,11,0,0),
+d(1994,4,3,12,0,0),
+d(1994,10,30,11,0,0),
+d(1995,4,2,12,0,0),
+d(1995,10,29,11,0,0),
+d(1996,4,7,12,0,0),
+d(1996,10,27,11,0,0),
+d(1997,4,6,12,0,0),
+d(1997,10,26,11,0,0),
+d(1998,4,5,12,0,0),
+d(1998,10,25,11,0,0),
+d(1999,4,4,12,0,0),
+d(1999,10,31,11,0,0),
+d(2000,4,2,12,0,0),
+d(2000,10,29,11,0,0),
+d(2001,4,1,12,0,0),
+d(2001,10,28,11,0,0),
+d(2002,4,7,12,0,0),
+d(2002,10,27,11,0,0),
+d(2003,4,6,12,0,0),
+d(2003,10,26,11,0,0),
+d(2004,4,4,12,0,0),
+d(2004,10,31,11,0,0),
+d(2005,4,3,12,0,0),
+d(2005,10,30,11,0,0),
+d(2006,4,2,12,0,0),
+d(2006,10,29,11,0,0),
+d(2007,3,11,12,0,0),
+d(2007,11,4,11,0,0),
+d(2008,3,9,12,0,0),
+d(2008,11,2,11,0,0),
+d(2009,3,8,12,0,0),
+d(2009,11,1,11,0,0),
+d(2010,3,14,12,0,0),
+d(2010,11,7,11,0,0),
+d(2011,3,13,12,0,0),
+d(2011,11,6,11,0,0),
+d(2012,3,11,12,0,0),
+d(2012,11,4,11,0,0),
+d(2013,3,10,12,0,0),
+d(2013,11,3,11,0,0),
+d(2014,3,9,12,0,0),
+d(2014,11,2,11,0,0),
+d(2015,3,8,12,0,0),
+d(2015,11,1,11,0,0),
+d(2016,3,13,12,0,0),
+d(2016,11,6,11,0,0),
+d(2017,3,12,12,0,0),
+d(2017,11,5,11,0,0),
+d(2018,3,11,12,0,0),
+d(2018,11,4,11,0,0),
+d(2019,3,10,12,0,0),
+d(2019,11,3,11,0,0),
+d(2020,3,8,12,0,0),
+d(2020,11,1,11,0,0),
+d(2021,3,14,12,0,0),
+d(2021,11,7,11,0,0),
+d(2022,3,13,12,0,0),
+d(2022,11,6,11,0,0),
+d(2023,3,12,12,0,0),
+d(2023,11,5,11,0,0),
+d(2024,3,10,12,0,0),
+d(2024,11,3,11,0,0),
+d(2025,3,9,12,0,0),
+d(2025,11,2,11,0,0),
+d(2026,3,8,12,0,0),
+d(2026,11,1,11,0,0),
+d(2027,3,14,12,0,0),
+d(2027,11,7,11,0,0),
+d(2028,3,12,12,0,0),
+d(2028,11,5,11,0,0),
+d(2029,3,11,12,0,0),
+d(2029,11,4,11,0,0),
+d(2030,3,10,12,0,0),
+d(2030,11,3,11,0,0),
+d(2031,3,9,12,0,0),
+d(2031,11,2,11,0,0),
+d(2032,3,14,12,0,0),
+d(2032,11,7,11,0,0),
+d(2033,3,13,12,0,0),
+d(2033,11,6,11,0,0),
+d(2034,3,12,12,0,0),
+d(2034,11,5,11,0,0),
+d(2035,3,11,12,0,0),
+d(2035,11,4,11,0,0),
+d(2036,3,9,12,0,0),
+d(2036,11,2,11,0,0),
+d(2037,3,8,12,0,0),
+d(2037,11,1,11,0,0),
+        ]
+
+    _transition_info = [
+i(-39600,0,'NST'),
+i(-36000,3600,'NWT'),
+i(-36000,3600,'NPT'),
+i(-39600,0,'NST'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-39600,0,'BST'),
+i(-36000,3600,'BDT'),
+i(-36000,0,'AHST'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+i(-32400,3600,'HADT'),
+i(-36000,0,'HAST'),
+        ]
+
+Aleutian = Aleutian()
+
diff --git a/lib/pytz/zoneinfo/US/Arizona.py b/lib/pytz/zoneinfo/US/Arizona.py
new file mode 100755
index 0000000..d4ffa5a
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Arizona.py
@@ -0,0 +1,40 @@
+'''tzinfo timezone information for US/Arizona.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Arizona(DstTzInfo):
+    '''US/Arizona timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Arizona'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1942,2,9,9,0,0),
+d(1944,1,1,6,1,0),
+d(1944,4,1,7,1,0),
+d(1944,10,1,6,1,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Arizona = Arizona()
+
diff --git a/lib/pytz/zoneinfo/US/Central.py b/lib/pytz/zoneinfo/US/Central.py
new file mode 100755
index 0000000..b7776be
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Central.py
@@ -0,0 +1,490 @@
+'''tzinfo timezone information for US/Central.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Central(DstTzInfo):
+    '''US/Central timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Central'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1920,6,13,8,0,0),
+d(1920,10,31,7,0,0),
+d(1921,3,27,8,0,0),
+d(1921,10,30,7,0,0),
+d(1922,4,30,8,0,0),
+d(1922,9,24,7,0,0),
+d(1923,4,29,8,0,0),
+d(1923,9,30,7,0,0),
+d(1924,4,27,8,0,0),
+d(1924,9,28,7,0,0),
+d(1925,4,26,8,0,0),
+d(1925,9,27,7,0,0),
+d(1926,4,25,8,0,0),
+d(1926,9,26,7,0,0),
+d(1927,4,24,8,0,0),
+d(1927,9,25,7,0,0),
+d(1928,4,29,8,0,0),
+d(1928,9,30,7,0,0),
+d(1929,4,28,8,0,0),
+d(1929,9,29,7,0,0),
+d(1930,4,27,8,0,0),
+d(1930,9,28,7,0,0),
+d(1931,4,26,8,0,0),
+d(1931,9,27,7,0,0),
+d(1932,4,24,8,0,0),
+d(1932,9,25,7,0,0),
+d(1933,4,30,8,0,0),
+d(1933,9,24,7,0,0),
+d(1934,4,29,8,0,0),
+d(1934,9,30,7,0,0),
+d(1935,4,28,8,0,0),
+d(1935,9,29,7,0,0),
+d(1936,3,1,8,0,0),
+d(1936,11,15,7,0,0),
+d(1937,4,25,8,0,0),
+d(1937,9,26,7,0,0),
+d(1938,4,24,8,0,0),
+d(1938,9,25,7,0,0),
+d(1939,4,30,8,0,0),
+d(1939,9,24,7,0,0),
+d(1940,4,28,8,0,0),
+d(1940,9,29,7,0,0),
+d(1941,4,27,8,0,0),
+d(1941,9,28,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,4,28,8,0,0),
+d(1946,9,29,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,10,30,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,10,28,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,10,27,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,10,26,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,10,30,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,10,29,7,0,0),
+d(1962,4,29,8,0,0),
+d(1962,10,28,7,0,0),
+d(1963,4,28,8,0,0),
+d(1963,10,27,7,0,0),
+d(1964,4,26,8,0,0),
+d(1964,10,25,7,0,0),
+d(1965,4,25,8,0,0),
+d(1965,10,31,7,0,0),
+d(1966,4,24,8,0,0),
+d(1966,10,30,7,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,7,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,7,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,7,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,7,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,7,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,7,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(1992,4,5,8,0,0),
+d(1992,10,25,7,0,0),
+d(1993,4,4,8,0,0),
+d(1993,10,31,7,0,0),
+d(1994,4,3,8,0,0),
+d(1994,10,30,7,0,0),
+d(1995,4,2,8,0,0),
+d(1995,10,29,7,0,0),
+d(1996,4,7,8,0,0),
+d(1996,10,27,7,0,0),
+d(1997,4,6,8,0,0),
+d(1997,10,26,7,0,0),
+d(1998,4,5,8,0,0),
+d(1998,10,25,7,0,0),
+d(1999,4,4,8,0,0),
+d(1999,10,31,7,0,0),
+d(2000,4,2,8,0,0),
+d(2000,10,29,7,0,0),
+d(2001,4,1,8,0,0),
+d(2001,10,28,7,0,0),
+d(2002,4,7,8,0,0),
+d(2002,10,27,7,0,0),
+d(2003,4,6,8,0,0),
+d(2003,10,26,7,0,0),
+d(2004,4,4,8,0,0),
+d(2004,10,31,7,0,0),
+d(2005,4,3,8,0,0),
+d(2005,10,30,7,0,0),
+d(2006,4,2,8,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Central = Central()
+
diff --git a/lib/pytz/zoneinfo/US/East_minus_Indiana.py b/lib/pytz/zoneinfo/US/East_minus_Indiana.py
new file mode 100755
index 0000000..f1d6c37
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/East_minus_Indiana.py
@@ -0,0 +1,216 @@
+'''tzinfo timezone information for US/East_minus_Indiana.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class East_minus_Indiana(DstTzInfo):
+    '''US/East_minus_Indiana timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/East_minus_Indiana'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1941,6,22,8,0,0),
+d(1941,9,28,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1946,4,28,8,0,0),
+d(1946,9,29,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+East_minus_Indiana = East_minus_Indiana()
+
diff --git a/lib/pytz/zoneinfo/US/Eastern.py b/lib/pytz/zoneinfo/US/Eastern.py
new file mode 100755
index 0000000..7399d28
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Eastern.py
@@ -0,0 +1,490 @@
+'''tzinfo timezone information for US/Eastern.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Eastern(DstTzInfo):
+    '''US/Eastern timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Eastern'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,7,0,0),
+d(1918,10,27,6,0,0),
+d(1919,3,30,7,0,0),
+d(1919,10,26,6,0,0),
+d(1920,3,28,7,0,0),
+d(1920,10,31,6,0,0),
+d(1921,4,24,7,0,0),
+d(1921,9,25,6,0,0),
+d(1922,4,30,7,0,0),
+d(1922,9,24,6,0,0),
+d(1923,4,29,7,0,0),
+d(1923,9,30,6,0,0),
+d(1924,4,27,7,0,0),
+d(1924,9,28,6,0,0),
+d(1925,4,26,7,0,0),
+d(1925,9,27,6,0,0),
+d(1926,4,25,7,0,0),
+d(1926,9,26,6,0,0),
+d(1927,4,24,7,0,0),
+d(1927,9,25,6,0,0),
+d(1928,4,29,7,0,0),
+d(1928,9,30,6,0,0),
+d(1929,4,28,7,0,0),
+d(1929,9,29,6,0,0),
+d(1930,4,27,7,0,0),
+d(1930,9,28,6,0,0),
+d(1931,4,26,7,0,0),
+d(1931,9,27,6,0,0),
+d(1932,4,24,7,0,0),
+d(1932,9,25,6,0,0),
+d(1933,4,30,7,0,0),
+d(1933,9,24,6,0,0),
+d(1934,4,29,7,0,0),
+d(1934,9,30,6,0,0),
+d(1935,4,28,7,0,0),
+d(1935,9,29,6,0,0),
+d(1936,4,26,7,0,0),
+d(1936,9,27,6,0,0),
+d(1937,4,25,7,0,0),
+d(1937,9,26,6,0,0),
+d(1938,4,24,7,0,0),
+d(1938,9,25,6,0,0),
+d(1939,4,30,7,0,0),
+d(1939,9,24,6,0,0),
+d(1940,4,28,7,0,0),
+d(1940,9,29,6,0,0),
+d(1941,4,27,7,0,0),
+d(1941,9,28,6,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1946,4,28,7,0,0),
+d(1946,9,29,6,0,0),
+d(1947,4,27,7,0,0),
+d(1947,9,28,6,0,0),
+d(1948,4,25,7,0,0),
+d(1948,9,26,6,0,0),
+d(1949,4,24,7,0,0),
+d(1949,9,25,6,0,0),
+d(1950,4,30,7,0,0),
+d(1950,9,24,6,0,0),
+d(1951,4,29,7,0,0),
+d(1951,9,30,6,0,0),
+d(1952,4,27,7,0,0),
+d(1952,9,28,6,0,0),
+d(1953,4,26,7,0,0),
+d(1953,9,27,6,0,0),
+d(1954,4,25,7,0,0),
+d(1954,9,26,6,0,0),
+d(1955,4,24,7,0,0),
+d(1955,10,30,6,0,0),
+d(1956,4,29,7,0,0),
+d(1956,10,28,6,0,0),
+d(1957,4,28,7,0,0),
+d(1957,10,27,6,0,0),
+d(1958,4,27,7,0,0),
+d(1958,10,26,6,0,0),
+d(1959,4,26,7,0,0),
+d(1959,10,25,6,0,0),
+d(1960,4,24,7,0,0),
+d(1960,10,30,6,0,0),
+d(1961,4,30,7,0,0),
+d(1961,10,29,6,0,0),
+d(1962,4,29,7,0,0),
+d(1962,10,28,6,0,0),
+d(1963,4,28,7,0,0),
+d(1963,10,27,6,0,0),
+d(1964,4,26,7,0,0),
+d(1964,10,25,6,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,6,0,0),
+d(1966,4,24,7,0,0),
+d(1966,10,30,6,0,0),
+d(1967,4,30,7,0,0),
+d(1967,10,29,6,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Eastern = Eastern()
+
diff --git a/lib/pytz/zoneinfo/US/Hawaii.py b/lib/pytz/zoneinfo/US/Hawaii.py
new file mode 100755
index 0000000..626ac1b
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Hawaii.py
@@ -0,0 +1,32 @@
+'''tzinfo timezone information for US/Hawaii.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Hawaii(DstTzInfo):
+    '''US/Hawaii timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Hawaii'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1933,4,30,12,30,0),
+d(1933,5,21,11,30,0),
+d(1942,2,9,12,30,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,11,30,0),
+d(1947,6,8,12,30,0),
+        ]
+
+    _transition_info = [
+i(-37800,0,'HST'),
+i(-34200,3600,'HDT'),
+i(-37800,0,'HST'),
+i(-34200,3600,'HWT'),
+i(-34200,3600,'HPT'),
+i(-37800,0,'HST'),
+i(-36000,0,'HST'),
+        ]
+
+Hawaii = Hawaii()
+
diff --git a/lib/pytz/zoneinfo/US/Indiana_minus_Starke.py b/lib/pytz/zoneinfo/US/Indiana_minus_Starke.py
new file mode 100755
index 0000000..7646443
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Indiana_minus_Starke.py
@@ -0,0 +1,326 @@
+'''tzinfo timezone information for US/Indiana_minus_Starke.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Indiana_minus_Starke(DstTzInfo):
+    '''US/Indiana_minus_Starke timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Indiana_minus_Starke'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,8,0,0),
+d(1918,10,27,7,0,0),
+d(1919,3,30,8,0,0),
+d(1919,10,26,7,0,0),
+d(1942,2,9,8,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,7,0,0),
+d(1947,4,27,8,0,0),
+d(1947,9,28,7,0,0),
+d(1948,4,25,8,0,0),
+d(1948,9,26,7,0,0),
+d(1949,4,24,8,0,0),
+d(1949,9,25,7,0,0),
+d(1950,4,30,8,0,0),
+d(1950,9,24,7,0,0),
+d(1951,4,29,8,0,0),
+d(1951,9,30,7,0,0),
+d(1952,4,27,8,0,0),
+d(1952,9,28,7,0,0),
+d(1953,4,26,8,0,0),
+d(1953,9,27,7,0,0),
+d(1954,4,25,8,0,0),
+d(1954,9,26,7,0,0),
+d(1955,4,24,8,0,0),
+d(1955,10,30,7,0,0),
+d(1956,4,29,8,0,0),
+d(1956,10,28,7,0,0),
+d(1957,4,28,8,0,0),
+d(1957,9,29,7,0,0),
+d(1958,4,27,8,0,0),
+d(1958,9,28,7,0,0),
+d(1959,4,26,8,0,0),
+d(1959,10,25,7,0,0),
+d(1960,4,24,8,0,0),
+d(1960,10,30,7,0,0),
+d(1961,4,30,8,0,0),
+d(1961,10,29,7,0,0),
+d(1962,4,29,8,0,0),
+d(1963,10,27,7,0,0),
+d(1967,4,30,8,0,0),
+d(1967,10,29,7,0,0),
+d(1968,4,28,8,0,0),
+d(1968,10,27,7,0,0),
+d(1969,4,27,8,0,0),
+d(1969,10,26,7,0,0),
+d(1970,4,26,8,0,0),
+d(1970,10,25,7,0,0),
+d(1971,4,25,8,0,0),
+d(1971,10,31,7,0,0),
+d(1972,4,30,8,0,0),
+d(1972,10,29,7,0,0),
+d(1973,4,29,8,0,0),
+d(1973,10,28,7,0,0),
+d(1974,1,6,8,0,0),
+d(1974,10,27,7,0,0),
+d(1975,2,23,8,0,0),
+d(1975,10,26,7,0,0),
+d(1976,4,25,8,0,0),
+d(1976,10,31,7,0,0),
+d(1977,4,24,8,0,0),
+d(1977,10,30,7,0,0),
+d(1978,4,30,8,0,0),
+d(1978,10,29,7,0,0),
+d(1979,4,29,8,0,0),
+d(1979,10,28,7,0,0),
+d(1980,4,27,8,0,0),
+d(1980,10,26,7,0,0),
+d(1981,4,26,8,0,0),
+d(1981,10,25,7,0,0),
+d(1982,4,25,8,0,0),
+d(1982,10,31,7,0,0),
+d(1983,4,24,8,0,0),
+d(1983,10,30,7,0,0),
+d(1984,4,29,8,0,0),
+d(1984,10,28,7,0,0),
+d(1985,4,28,8,0,0),
+d(1985,10,27,7,0,0),
+d(1986,4,27,8,0,0),
+d(1986,10,26,7,0,0),
+d(1987,4,5,8,0,0),
+d(1987,10,25,7,0,0),
+d(1988,4,3,8,0,0),
+d(1988,10,30,7,0,0),
+d(1989,4,2,8,0,0),
+d(1989,10,29,7,0,0),
+d(1990,4,1,8,0,0),
+d(1990,10,28,7,0,0),
+d(1991,4,7,8,0,0),
+d(1991,10,27,7,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,7,0,0),
+d(2007,3,11,8,0,0),
+d(2007,11,4,7,0,0),
+d(2008,3,9,8,0,0),
+d(2008,11,2,7,0,0),
+d(2009,3,8,8,0,0),
+d(2009,11,1,7,0,0),
+d(2010,3,14,8,0,0),
+d(2010,11,7,7,0,0),
+d(2011,3,13,8,0,0),
+d(2011,11,6,7,0,0),
+d(2012,3,11,8,0,0),
+d(2012,11,4,7,0,0),
+d(2013,3,10,8,0,0),
+d(2013,11,3,7,0,0),
+d(2014,3,9,8,0,0),
+d(2014,11,2,7,0,0),
+d(2015,3,8,8,0,0),
+d(2015,11,1,7,0,0),
+d(2016,3,13,8,0,0),
+d(2016,11,6,7,0,0),
+d(2017,3,12,8,0,0),
+d(2017,11,5,7,0,0),
+d(2018,3,11,8,0,0),
+d(2018,11,4,7,0,0),
+d(2019,3,10,8,0,0),
+d(2019,11,3,7,0,0),
+d(2020,3,8,8,0,0),
+d(2020,11,1,7,0,0),
+d(2021,3,14,8,0,0),
+d(2021,11,7,7,0,0),
+d(2022,3,13,8,0,0),
+d(2022,11,6,7,0,0),
+d(2023,3,12,8,0,0),
+d(2023,11,5,7,0,0),
+d(2024,3,10,8,0,0),
+d(2024,11,3,7,0,0),
+d(2025,3,9,8,0,0),
+d(2025,11,2,7,0,0),
+d(2026,3,8,8,0,0),
+d(2026,11,1,7,0,0),
+d(2027,3,14,8,0,0),
+d(2027,11,7,7,0,0),
+d(2028,3,12,8,0,0),
+d(2028,11,5,7,0,0),
+d(2029,3,11,8,0,0),
+d(2029,11,4,7,0,0),
+d(2030,3,10,8,0,0),
+d(2030,11,3,7,0,0),
+d(2031,3,9,8,0,0),
+d(2031,11,2,7,0,0),
+d(2032,3,14,8,0,0),
+d(2032,11,7,7,0,0),
+d(2033,3,13,8,0,0),
+d(2033,11,6,7,0,0),
+d(2034,3,12,8,0,0),
+d(2034,11,5,7,0,0),
+d(2035,3,11,8,0,0),
+d(2035,11,4,7,0,0),
+d(2036,3,9,8,0,0),
+d(2036,11,2,7,0,0),
+d(2037,3,8,8,0,0),
+d(2037,11,1,7,0,0),
+        ]
+
+    _transition_info = [
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CWT'),
+i(-18000,3600,'CPT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-18000,0,'EST'),
+i(-18000,0,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+i(-18000,3600,'CDT'),
+i(-21600,0,'CST'),
+        ]
+
+Indiana_minus_Starke = Indiana_minus_Starke()
+
diff --git a/lib/pytz/zoneinfo/US/Michigan.py b/lib/pytz/zoneinfo/US/Michigan.py
new file mode 100755
index 0000000..e4126b5
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Michigan.py
@@ -0,0 +1,298 @@
+'''tzinfo timezone information for US/Michigan.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Michigan(DstTzInfo):
+    '''US/Michigan timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Michigan'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1905,1,1,5,32,11),
+d(1915,5,15,8,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1948,4,25,7,0,0),
+d(1948,9,26,6,0,0),
+d(1967,6,14,7,0,0),
+d(1967,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,4,27,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-19920,0,'LMT'),
+i(-21600,0,'CST'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+Michigan = Michigan()
+
diff --git a/lib/pytz/zoneinfo/US/Mountain.py b/lib/pytz/zoneinfo/US/Mountain.py
new file mode 100755
index 0000000..ab6b1b6
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Mountain.py
@@ -0,0 +1,334 @@
+'''tzinfo timezone information for US/Mountain.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Mountain(DstTzInfo):
+    '''US/Mountain timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Mountain'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,9,0,0),
+d(1918,10,27,8,0,0),
+d(1919,3,30,9,0,0),
+d(1919,10,26,8,0,0),
+d(1920,3,28,9,0,0),
+d(1920,10,31,8,0,0),
+d(1921,3,27,9,0,0),
+d(1921,5,22,8,0,0),
+d(1942,2,9,9,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,8,0,0),
+d(1965,4,25,9,0,0),
+d(1965,10,31,8,0,0),
+d(1966,4,24,9,0,0),
+d(1966,10,30,8,0,0),
+d(1967,4,30,9,0,0),
+d(1967,10,29,8,0,0),
+d(1968,4,28,9,0,0),
+d(1968,10,27,8,0,0),
+d(1969,4,27,9,0,0),
+d(1969,10,26,8,0,0),
+d(1970,4,26,9,0,0),
+d(1970,10,25,8,0,0),
+d(1971,4,25,9,0,0),
+d(1971,10,31,8,0,0),
+d(1972,4,30,9,0,0),
+d(1972,10,29,8,0,0),
+d(1973,4,29,9,0,0),
+d(1973,10,28,8,0,0),
+d(1974,1,6,9,0,0),
+d(1974,10,27,8,0,0),
+d(1975,2,23,9,0,0),
+d(1975,10,26,8,0,0),
+d(1976,4,25,9,0,0),
+d(1976,10,31,8,0,0),
+d(1977,4,24,9,0,0),
+d(1977,10,30,8,0,0),
+d(1978,4,30,9,0,0),
+d(1978,10,29,8,0,0),
+d(1979,4,29,9,0,0),
+d(1979,10,28,8,0,0),
+d(1980,4,27,9,0,0),
+d(1980,10,26,8,0,0),
+d(1981,4,26,9,0,0),
+d(1981,10,25,8,0,0),
+d(1982,4,25,9,0,0),
+d(1982,10,31,8,0,0),
+d(1983,4,24,9,0,0),
+d(1983,10,30,8,0,0),
+d(1984,4,29,9,0,0),
+d(1984,10,28,8,0,0),
+d(1985,4,28,9,0,0),
+d(1985,10,27,8,0,0),
+d(1986,4,27,9,0,0),
+d(1986,10,26,8,0,0),
+d(1987,4,5,9,0,0),
+d(1987,10,25,8,0,0),
+d(1988,4,3,9,0,0),
+d(1988,10,30,8,0,0),
+d(1989,4,2,9,0,0),
+d(1989,10,29,8,0,0),
+d(1990,4,1,9,0,0),
+d(1990,10,28,8,0,0),
+d(1991,4,7,9,0,0),
+d(1991,10,27,8,0,0),
+d(1992,4,5,9,0,0),
+d(1992,10,25,8,0,0),
+d(1993,4,4,9,0,0),
+d(1993,10,31,8,0,0),
+d(1994,4,3,9,0,0),
+d(1994,10,30,8,0,0),
+d(1995,4,2,9,0,0),
+d(1995,10,29,8,0,0),
+d(1996,4,7,9,0,0),
+d(1996,10,27,8,0,0),
+d(1997,4,6,9,0,0),
+d(1997,10,26,8,0,0),
+d(1998,4,5,9,0,0),
+d(1998,10,25,8,0,0),
+d(1999,4,4,9,0,0),
+d(1999,10,31,8,0,0),
+d(2000,4,2,9,0,0),
+d(2000,10,29,8,0,0),
+d(2001,4,1,9,0,0),
+d(2001,10,28,8,0,0),
+d(2002,4,7,9,0,0),
+d(2002,10,27,8,0,0),
+d(2003,4,6,9,0,0),
+d(2003,10,26,8,0,0),
+d(2004,4,4,9,0,0),
+d(2004,10,31,8,0,0),
+d(2005,4,3,9,0,0),
+d(2005,10,30,8,0,0),
+d(2006,4,2,9,0,0),
+d(2006,10,29,8,0,0),
+d(2007,3,11,9,0,0),
+d(2007,11,4,8,0,0),
+d(2008,3,9,9,0,0),
+d(2008,11,2,8,0,0),
+d(2009,3,8,9,0,0),
+d(2009,11,1,8,0,0),
+d(2010,3,14,9,0,0),
+d(2010,11,7,8,0,0),
+d(2011,3,13,9,0,0),
+d(2011,11,6,8,0,0),
+d(2012,3,11,9,0,0),
+d(2012,11,4,8,0,0),
+d(2013,3,10,9,0,0),
+d(2013,11,3,8,0,0),
+d(2014,3,9,9,0,0),
+d(2014,11,2,8,0,0),
+d(2015,3,8,9,0,0),
+d(2015,11,1,8,0,0),
+d(2016,3,13,9,0,0),
+d(2016,11,6,8,0,0),
+d(2017,3,12,9,0,0),
+d(2017,11,5,8,0,0),
+d(2018,3,11,9,0,0),
+d(2018,11,4,8,0,0),
+d(2019,3,10,9,0,0),
+d(2019,11,3,8,0,0),
+d(2020,3,8,9,0,0),
+d(2020,11,1,8,0,0),
+d(2021,3,14,9,0,0),
+d(2021,11,7,8,0,0),
+d(2022,3,13,9,0,0),
+d(2022,11,6,8,0,0),
+d(2023,3,12,9,0,0),
+d(2023,11,5,8,0,0),
+d(2024,3,10,9,0,0),
+d(2024,11,3,8,0,0),
+d(2025,3,9,9,0,0),
+d(2025,11,2,8,0,0),
+d(2026,3,8,9,0,0),
+d(2026,11,1,8,0,0),
+d(2027,3,14,9,0,0),
+d(2027,11,7,8,0,0),
+d(2028,3,12,9,0,0),
+d(2028,11,5,8,0,0),
+d(2029,3,11,9,0,0),
+d(2029,11,4,8,0,0),
+d(2030,3,10,9,0,0),
+d(2030,11,3,8,0,0),
+d(2031,3,9,9,0,0),
+d(2031,11,2,8,0,0),
+d(2032,3,14,9,0,0),
+d(2032,11,7,8,0,0),
+d(2033,3,13,9,0,0),
+d(2033,11,6,8,0,0),
+d(2034,3,12,9,0,0),
+d(2034,11,5,8,0,0),
+d(2035,3,11,9,0,0),
+d(2035,11,4,8,0,0),
+d(2036,3,9,9,0,0),
+d(2036,11,2,8,0,0),
+d(2037,3,8,9,0,0),
+d(2037,11,1,8,0,0),
+        ]
+
+    _transition_info = [
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MWT'),
+i(-21600,3600,'MPT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+i(-21600,3600,'MDT'),
+i(-25200,0,'MST'),
+        ]
+
+Mountain = Mountain()
+
diff --git a/lib/pytz/zoneinfo/US/Pacific.py b/lib/pytz/zoneinfo/US/Pacific.py
new file mode 100755
index 0000000..f41984b
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Pacific.py
@@ -0,0 +1,390 @@
+'''tzinfo timezone information for US/Pacific.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Pacific(DstTzInfo):
+    '''US/Pacific timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Pacific'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,10,0,0),
+d(1918,10,27,9,0,0),
+d(1919,3,30,10,0,0),
+d(1919,10,26,9,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1948,3,14,10,0,0),
+d(1949,1,1,9,0,0),
+d(1950,4,30,10,0,0),
+d(1950,9,24,9,0,0),
+d(1951,4,29,10,0,0),
+d(1951,9,30,9,0,0),
+d(1952,4,27,10,0,0),
+d(1952,9,28,9,0,0),
+d(1953,4,26,10,0,0),
+d(1953,9,27,9,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1961,4,30,10,0,0),
+d(1961,9,24,9,0,0),
+d(1962,4,29,10,0,0),
+d(1962,10,28,9,0,0),
+d(1963,4,28,10,0,0),
+d(1963,10,27,9,0,0),
+d(1964,4,26,10,0,0),
+d(1964,10,25,9,0,0),
+d(1965,4,25,10,0,0),
+d(1965,10,31,9,0,0),
+d(1966,4,24,10,0,0),
+d(1966,10,30,9,0,0),
+d(1967,4,30,10,0,0),
+d(1967,10,29,9,0,0),
+d(1968,4,28,10,0,0),
+d(1968,10,27,9,0,0),
+d(1969,4,27,10,0,0),
+d(1969,10,26,9,0,0),
+d(1970,4,26,10,0,0),
+d(1970,10,25,9,0,0),
+d(1971,4,25,10,0,0),
+d(1971,10,31,9,0,0),
+d(1972,4,30,10,0,0),
+d(1972,10,29,9,0,0),
+d(1973,4,29,10,0,0),
+d(1973,10,28,9,0,0),
+d(1974,1,6,10,0,0),
+d(1974,10,27,9,0,0),
+d(1975,2,23,10,0,0),
+d(1975,10,26,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Pacific = Pacific()
+
diff --git a/lib/pytz/zoneinfo/US/Pacific_minus_New.py b/lib/pytz/zoneinfo/US/Pacific_minus_New.py
new file mode 100755
index 0000000..38c25ef
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Pacific_minus_New.py
@@ -0,0 +1,390 @@
+'''tzinfo timezone information for US/Pacific_minus_New.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Pacific_minus_New(DstTzInfo):
+    '''US/Pacific_minus_New timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Pacific_minus_New'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,10,0,0),
+d(1918,10,27,9,0,0),
+d(1919,3,30,10,0,0),
+d(1919,10,26,9,0,0),
+d(1942,2,9,10,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,9,0,0),
+d(1948,3,14,10,0,0),
+d(1949,1,1,9,0,0),
+d(1950,4,30,10,0,0),
+d(1950,9,24,9,0,0),
+d(1951,4,29,10,0,0),
+d(1951,9,30,9,0,0),
+d(1952,4,27,10,0,0),
+d(1952,9,28,9,0,0),
+d(1953,4,26,10,0,0),
+d(1953,9,27,9,0,0),
+d(1954,4,25,10,0,0),
+d(1954,9,26,9,0,0),
+d(1955,4,24,10,0,0),
+d(1955,9,25,9,0,0),
+d(1956,4,29,10,0,0),
+d(1956,9,30,9,0,0),
+d(1957,4,28,10,0,0),
+d(1957,9,29,9,0,0),
+d(1958,4,27,10,0,0),
+d(1958,9,28,9,0,0),
+d(1959,4,26,10,0,0),
+d(1959,9,27,9,0,0),
+d(1960,4,24,10,0,0),
+d(1960,9,25,9,0,0),
+d(1961,4,30,10,0,0),
+d(1961,9,24,9,0,0),
+d(1962,4,29,10,0,0),
+d(1962,10,28,9,0,0),
+d(1963,4,28,10,0,0),
+d(1963,10,27,9,0,0),
+d(1964,4,26,10,0,0),
+d(1964,10,25,9,0,0),
+d(1965,4,25,10,0,0),
+d(1965,10,31,9,0,0),
+d(1966,4,24,10,0,0),
+d(1966,10,30,9,0,0),
+d(1967,4,30,10,0,0),
+d(1967,10,29,9,0,0),
+d(1968,4,28,10,0,0),
+d(1968,10,27,9,0,0),
+d(1969,4,27,10,0,0),
+d(1969,10,26,9,0,0),
+d(1970,4,26,10,0,0),
+d(1970,10,25,9,0,0),
+d(1971,4,25,10,0,0),
+d(1971,10,31,9,0,0),
+d(1972,4,30,10,0,0),
+d(1972,10,29,9,0,0),
+d(1973,4,29,10,0,0),
+d(1973,10,28,9,0,0),
+d(1974,1,6,10,0,0),
+d(1974,10,27,9,0,0),
+d(1975,2,23,10,0,0),
+d(1975,10,26,9,0,0),
+d(1976,4,25,10,0,0),
+d(1976,10,31,9,0,0),
+d(1977,4,24,10,0,0),
+d(1977,10,30,9,0,0),
+d(1978,4,30,10,0,0),
+d(1978,10,29,9,0,0),
+d(1979,4,29,10,0,0),
+d(1979,10,28,9,0,0),
+d(1980,4,27,10,0,0),
+d(1980,10,26,9,0,0),
+d(1981,4,26,10,0,0),
+d(1981,10,25,9,0,0),
+d(1982,4,25,10,0,0),
+d(1982,10,31,9,0,0),
+d(1983,4,24,10,0,0),
+d(1983,10,30,9,0,0),
+d(1984,4,29,10,0,0),
+d(1984,10,28,9,0,0),
+d(1985,4,28,10,0,0),
+d(1985,10,27,9,0,0),
+d(1986,4,27,10,0,0),
+d(1986,10,26,9,0,0),
+d(1987,4,5,10,0,0),
+d(1987,10,25,9,0,0),
+d(1988,4,3,10,0,0),
+d(1988,10,30,9,0,0),
+d(1989,4,2,10,0,0),
+d(1989,10,29,9,0,0),
+d(1990,4,1,10,0,0),
+d(1990,10,28,9,0,0),
+d(1991,4,7,10,0,0),
+d(1991,10,27,9,0,0),
+d(1992,4,5,10,0,0),
+d(1992,10,25,9,0,0),
+d(1993,4,4,10,0,0),
+d(1993,10,31,9,0,0),
+d(1994,4,3,10,0,0),
+d(1994,10,30,9,0,0),
+d(1995,4,2,10,0,0),
+d(1995,10,29,9,0,0),
+d(1996,4,7,10,0,0),
+d(1996,10,27,9,0,0),
+d(1997,4,6,10,0,0),
+d(1997,10,26,9,0,0),
+d(1998,4,5,10,0,0),
+d(1998,10,25,9,0,0),
+d(1999,4,4,10,0,0),
+d(1999,10,31,9,0,0),
+d(2000,4,2,10,0,0),
+d(2000,10,29,9,0,0),
+d(2001,4,1,10,0,0),
+d(2001,10,28,9,0,0),
+d(2002,4,7,10,0,0),
+d(2002,10,27,9,0,0),
+d(2003,4,6,10,0,0),
+d(2003,10,26,9,0,0),
+d(2004,4,4,10,0,0),
+d(2004,10,31,9,0,0),
+d(2005,4,3,10,0,0),
+d(2005,10,30,9,0,0),
+d(2006,4,2,10,0,0),
+d(2006,10,29,9,0,0),
+d(2007,3,11,10,0,0),
+d(2007,11,4,9,0,0),
+d(2008,3,9,10,0,0),
+d(2008,11,2,9,0,0),
+d(2009,3,8,10,0,0),
+d(2009,11,1,9,0,0),
+d(2010,3,14,10,0,0),
+d(2010,11,7,9,0,0),
+d(2011,3,13,10,0,0),
+d(2011,11,6,9,0,0),
+d(2012,3,11,10,0,0),
+d(2012,11,4,9,0,0),
+d(2013,3,10,10,0,0),
+d(2013,11,3,9,0,0),
+d(2014,3,9,10,0,0),
+d(2014,11,2,9,0,0),
+d(2015,3,8,10,0,0),
+d(2015,11,1,9,0,0),
+d(2016,3,13,10,0,0),
+d(2016,11,6,9,0,0),
+d(2017,3,12,10,0,0),
+d(2017,11,5,9,0,0),
+d(2018,3,11,10,0,0),
+d(2018,11,4,9,0,0),
+d(2019,3,10,10,0,0),
+d(2019,11,3,9,0,0),
+d(2020,3,8,10,0,0),
+d(2020,11,1,9,0,0),
+d(2021,3,14,10,0,0),
+d(2021,11,7,9,0,0),
+d(2022,3,13,10,0,0),
+d(2022,11,6,9,0,0),
+d(2023,3,12,10,0,0),
+d(2023,11,5,9,0,0),
+d(2024,3,10,10,0,0),
+d(2024,11,3,9,0,0),
+d(2025,3,9,10,0,0),
+d(2025,11,2,9,0,0),
+d(2026,3,8,10,0,0),
+d(2026,11,1,9,0,0),
+d(2027,3,14,10,0,0),
+d(2027,11,7,9,0,0),
+d(2028,3,12,10,0,0),
+d(2028,11,5,9,0,0),
+d(2029,3,11,10,0,0),
+d(2029,11,4,9,0,0),
+d(2030,3,10,10,0,0),
+d(2030,11,3,9,0,0),
+d(2031,3,9,10,0,0),
+d(2031,11,2,9,0,0),
+d(2032,3,14,10,0,0),
+d(2032,11,7,9,0,0),
+d(2033,3,13,10,0,0),
+d(2033,11,6,9,0,0),
+d(2034,3,12,10,0,0),
+d(2034,11,5,9,0,0),
+d(2035,3,11,10,0,0),
+d(2035,11,4,9,0,0),
+d(2036,3,9,10,0,0),
+d(2036,11,2,9,0,0),
+d(2037,3,8,10,0,0),
+d(2037,11,1,9,0,0),
+        ]
+
+    _transition_info = [
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PWT'),
+i(-25200,3600,'PPT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+i(-25200,3600,'PDT'),
+i(-28800,0,'PST'),
+        ]
+
+Pacific_minus_New = Pacific_minus_New()
+
diff --git a/lib/pytz/zoneinfo/US/Samoa.py b/lib/pytz/zoneinfo/US/Samoa.py
new file mode 100755
index 0000000..66c6b09
--- /dev/null
+++ b/lib/pytz/zoneinfo/US/Samoa.py
@@ -0,0 +1,28 @@
+'''tzinfo timezone information for US/Samoa.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class Samoa(DstTzInfo):
+    '''US/Samoa timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'US/Samoa'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1911,1,1,11,22,48),
+d(1950,1,1,11,30,0),
+d(1967,4,1,11,0,0),
+d(1983,11,30,11,0,0),
+        ]
+
+    _transition_info = [
+i(-40980,0,'LMT'),
+i(-41400,0,'SAMT'),
+i(-39600,0,'NST'),
+i(-39600,0,'BST'),
+i(-39600,0,'SST'),
+        ]
+
+Samoa = Samoa()
+
diff --git a/lib/pytz/zoneinfo/US/__init__.py b/lib/pytz/zoneinfo/US/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/UTC.py b/lib/pytz/zoneinfo/UTC.py
new file mode 100755
index 0000000..fdb8433
--- /dev/null
+++ b/lib/pytz/zoneinfo/UTC.py
@@ -0,0 +1,2 @@
+'''tzinfo timezone information for UTC.'''
+from pytz import UTC
diff --git a/lib/pytz/zoneinfo/Universal.py b/lib/pytz/zoneinfo/Universal.py
new file mode 100755
index 0000000..0ed335f
--- /dev/null
+++ b/lib/pytz/zoneinfo/Universal.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Universal.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Universal(StaticTzInfo):
+    '''Universal timezone definition. See datetime.tzinfo for details'''
+    zone = 'Universal'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'UTC'
+
+Universal = Universal()
+
diff --git a/lib/pytz/zoneinfo/WET.py b/lib/pytz/zoneinfo/WET.py
new file mode 100755
index 0000000..a721990
--- /dev/null
+++ b/lib/pytz/zoneinfo/WET.py
@@ -0,0 +1,264 @@
+'''tzinfo timezone information for WET.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class WET(DstTzInfo):
+    '''WET timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'WET'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1977,4,3,1,0,0),
+d(1977,9,25,1,0,0),
+d(1978,4,2,1,0,0),
+d(1978,10,1,1,0,0),
+d(1979,4,1,1,0,0),
+d(1979,9,30,1,0,0),
+d(1980,4,6,1,0,0),
+d(1980,9,28,1,0,0),
+d(1981,3,29,1,0,0),
+d(1981,9,27,1,0,0),
+d(1982,3,28,1,0,0),
+d(1982,9,26,1,0,0),
+d(1983,3,27,1,0,0),
+d(1983,9,25,1,0,0),
+d(1984,3,25,1,0,0),
+d(1984,9,30,1,0,0),
+d(1985,3,31,1,0,0),
+d(1985,9,29,1,0,0),
+d(1986,3,30,1,0,0),
+d(1986,9,28,1,0,0),
+d(1987,3,29,1,0,0),
+d(1987,9,27,1,0,0),
+d(1988,3,27,1,0,0),
+d(1988,9,25,1,0,0),
+d(1989,3,26,1,0,0),
+d(1989,9,24,1,0,0),
+d(1990,3,25,1,0,0),
+d(1990,9,30,1,0,0),
+d(1991,3,31,1,0,0),
+d(1991,9,29,1,0,0),
+d(1992,3,29,1,0,0),
+d(1992,9,27,1,0,0),
+d(1993,3,28,1,0,0),
+d(1993,9,26,1,0,0),
+d(1994,3,27,1,0,0),
+d(1994,9,25,1,0,0),
+d(1995,3,26,1,0,0),
+d(1995,9,24,1,0,0),
+d(1996,3,31,1,0,0),
+d(1996,10,27,1,0,0),
+d(1997,3,30,1,0,0),
+d(1997,10,26,1,0,0),
+d(1998,3,29,1,0,0),
+d(1998,10,25,1,0,0),
+d(1999,3,28,1,0,0),
+d(1999,10,31,1,0,0),
+d(2000,3,26,1,0,0),
+d(2000,10,29,1,0,0),
+d(2001,3,25,1,0,0),
+d(2001,10,28,1,0,0),
+d(2002,3,31,1,0,0),
+d(2002,10,27,1,0,0),
+d(2003,3,30,1,0,0),
+d(2003,10,26,1,0,0),
+d(2004,3,28,1,0,0),
+d(2004,10,31,1,0,0),
+d(2005,3,27,1,0,0),
+d(2005,10,30,1,0,0),
+d(2006,3,26,1,0,0),
+d(2006,10,29,1,0,0),
+d(2007,3,25,1,0,0),
+d(2007,10,28,1,0,0),
+d(2008,3,30,1,0,0),
+d(2008,10,26,1,0,0),
+d(2009,3,29,1,0,0),
+d(2009,10,25,1,0,0),
+d(2010,3,28,1,0,0),
+d(2010,10,31,1,0,0),
+d(2011,3,27,1,0,0),
+d(2011,10,30,1,0,0),
+d(2012,3,25,1,0,0),
+d(2012,10,28,1,0,0),
+d(2013,3,31,1,0,0),
+d(2013,10,27,1,0,0),
+d(2014,3,30,1,0,0),
+d(2014,10,26,1,0,0),
+d(2015,3,29,1,0,0),
+d(2015,10,25,1,0,0),
+d(2016,3,27,1,0,0),
+d(2016,10,30,1,0,0),
+d(2017,3,26,1,0,0),
+d(2017,10,29,1,0,0),
+d(2018,3,25,1,0,0),
+d(2018,10,28,1,0,0),
+d(2019,3,31,1,0,0),
+d(2019,10,27,1,0,0),
+d(2020,3,29,1,0,0),
+d(2020,10,25,1,0,0),
+d(2021,3,28,1,0,0),
+d(2021,10,31,1,0,0),
+d(2022,3,27,1,0,0),
+d(2022,10,30,1,0,0),
+d(2023,3,26,1,0,0),
+d(2023,10,29,1,0,0),
+d(2024,3,31,1,0,0),
+d(2024,10,27,1,0,0),
+d(2025,3,30,1,0,0),
+d(2025,10,26,1,0,0),
+d(2026,3,29,1,0,0),
+d(2026,10,25,1,0,0),
+d(2027,3,28,1,0,0),
+d(2027,10,31,1,0,0),
+d(2028,3,26,1,0,0),
+d(2028,10,29,1,0,0),
+d(2029,3,25,1,0,0),
+d(2029,10,28,1,0,0),
+d(2030,3,31,1,0,0),
+d(2030,10,27,1,0,0),
+d(2031,3,30,1,0,0),
+d(2031,10,26,1,0,0),
+d(2032,3,28,1,0,0),
+d(2032,10,31,1,0,0),
+d(2033,3,27,1,0,0),
+d(2033,10,30,1,0,0),
+d(2034,3,26,1,0,0),
+d(2034,10,29,1,0,0),
+d(2035,3,25,1,0,0),
+d(2035,10,28,1,0,0),
+d(2036,3,30,1,0,0),
+d(2036,10,26,1,0,0),
+d(2037,3,29,1,0,0),
+d(2037,10,25,1,0,0),
+        ]
+
+    _transition_info = [
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+i(3600,3600,'WEST'),
+i(0,0,'WET'),
+        ]
+
+WET = WET()
+
diff --git a/lib/pytz/zoneinfo/W_minus_SU.py b/lib/pytz/zoneinfo/W_minus_SU.py
new file mode 100755
index 0000000..a897cbd
--- /dev/null
+++ b/lib/pytz/zoneinfo/W_minus_SU.py
@@ -0,0 +1,278 @@
+'''tzinfo timezone information for W_minus_SU.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class W_minus_SU(DstTzInfo):
+    '''W_minus_SU timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'W_minus_SU'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1916,7,2,21,30,0),
+d(1917,7,1,20,29,12),
+d(1917,12,27,20,29,12),
+d(1918,5,31,19,29,12),
+d(1918,9,15,20,29,12),
+d(1919,5,31,19,29,12),
+d(1919,6,30,21,29,12),
+d(1919,8,15,20,0,0),
+d(1921,2,14,20,0,0),
+d(1921,3,20,19,0,0),
+d(1921,8,31,19,0,0),
+d(1921,9,30,20,0,0),
+d(1922,9,30,21,0,0),
+d(1930,6,20,22,0,0),
+d(1981,3,31,21,0,0),
+d(1981,9,30,20,0,0),
+d(1982,3,31,21,0,0),
+d(1982,9,30,20,0,0),
+d(1983,3,31,21,0,0),
+d(1983,9,30,20,0,0),
+d(1984,3,31,21,0,0),
+d(1984,9,29,23,0,0),
+d(1985,3,30,23,0,0),
+d(1985,9,28,23,0,0),
+d(1986,3,29,23,0,0),
+d(1986,9,27,23,0,0),
+d(1987,3,28,23,0,0),
+d(1987,9,26,23,0,0),
+d(1988,3,26,23,0,0),
+d(1988,9,24,23,0,0),
+d(1989,3,25,23,0,0),
+d(1989,9,23,23,0,0),
+d(1990,3,24,23,0,0),
+d(1990,9,29,23,0,0),
+d(1991,3,30,23,0,0),
+d(1991,9,29,0,0,0),
+d(1992,1,19,0,0,0),
+d(1992,3,28,20,0,0),
+d(1992,9,26,19,0,0),
+d(1993,3,27,23,0,0),
+d(1993,9,25,23,0,0),
+d(1994,3,26,23,0,0),
+d(1994,9,24,23,0,0),
+d(1995,3,25,23,0,0),
+d(1995,9,23,23,0,0),
+d(1996,3,30,23,0,0),
+d(1996,10,26,23,0,0),
+d(1997,3,29,23,0,0),
+d(1997,10,25,23,0,0),
+d(1998,3,28,23,0,0),
+d(1998,10,24,23,0,0),
+d(1999,3,27,23,0,0),
+d(1999,10,30,23,0,0),
+d(2000,3,25,23,0,0),
+d(2000,10,28,23,0,0),
+d(2001,3,24,23,0,0),
+d(2001,10,27,23,0,0),
+d(2002,3,30,23,0,0),
+d(2002,10,26,23,0,0),
+d(2003,3,29,23,0,0),
+d(2003,10,25,23,0,0),
+d(2004,3,27,23,0,0),
+d(2004,10,30,23,0,0),
+d(2005,3,26,23,0,0),
+d(2005,10,29,23,0,0),
+d(2006,3,25,23,0,0),
+d(2006,10,28,23,0,0),
+d(2007,3,24,23,0,0),
+d(2007,10,27,23,0,0),
+d(2008,3,29,23,0,0),
+d(2008,10,25,23,0,0),
+d(2009,3,28,23,0,0),
+d(2009,10,24,23,0,0),
+d(2010,3,27,23,0,0),
+d(2010,10,30,23,0,0),
+d(2011,3,26,23,0,0),
+d(2011,10,29,23,0,0),
+d(2012,3,24,23,0,0),
+d(2012,10,27,23,0,0),
+d(2013,3,30,23,0,0),
+d(2013,10,26,23,0,0),
+d(2014,3,29,23,0,0),
+d(2014,10,25,23,0,0),
+d(2015,3,28,23,0,0),
+d(2015,10,24,23,0,0),
+d(2016,3,26,23,0,0),
+d(2016,10,29,23,0,0),
+d(2017,3,25,23,0,0),
+d(2017,10,28,23,0,0),
+d(2018,3,24,23,0,0),
+d(2018,10,27,23,0,0),
+d(2019,3,30,23,0,0),
+d(2019,10,26,23,0,0),
+d(2020,3,28,23,0,0),
+d(2020,10,24,23,0,0),
+d(2021,3,27,23,0,0),
+d(2021,10,30,23,0,0),
+d(2022,3,26,23,0,0),
+d(2022,10,29,23,0,0),
+d(2023,3,25,23,0,0),
+d(2023,10,28,23,0,0),
+d(2024,3,30,23,0,0),
+d(2024,10,26,23,0,0),
+d(2025,3,29,23,0,0),
+d(2025,10,25,23,0,0),
+d(2026,3,28,23,0,0),
+d(2026,10,24,23,0,0),
+d(2027,3,27,23,0,0),
+d(2027,10,30,23,0,0),
+d(2028,3,25,23,0,0),
+d(2028,10,28,23,0,0),
+d(2029,3,24,23,0,0),
+d(2029,10,27,23,0,0),
+d(2030,3,30,23,0,0),
+d(2030,10,26,23,0,0),
+d(2031,3,29,23,0,0),
+d(2031,10,25,23,0,0),
+d(2032,3,27,23,0,0),
+d(2032,10,30,23,0,0),
+d(2033,3,26,23,0,0),
+d(2033,10,29,23,0,0),
+d(2034,3,25,23,0,0),
+d(2034,10,28,23,0,0),
+d(2035,3,24,23,0,0),
+d(2035,10,27,23,0,0),
+d(2036,3,29,23,0,0),
+d(2036,10,25,23,0,0),
+d(2037,3,28,23,0,0),
+d(2037,10,24,23,0,0),
+        ]
+
+    _transition_info = [
+i(9000,0,'MMT'),
+i(9060,0,'MMT'),
+i(12660,3600,'MST'),
+i(9060,0,'MMT'),
+i(16260,7200,'MDST'),
+i(12660,3600,'MST'),
+i(16260,7200,'MDST'),
+i(14400,5340,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(18000,7200,'MSD'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(10800,0,'EEST'),
+i(7200,0,'EET'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+i(14400,3600,'MSD'),
+i(10800,0,'MSK'),
+        ]
+
+W_minus_SU = W_minus_SU()
+
diff --git a/lib/pytz/zoneinfo/Zulu.py b/lib/pytz/zoneinfo/Zulu.py
new file mode 100755
index 0000000..4d6142a
--- /dev/null
+++ b/lib/pytz/zoneinfo/Zulu.py
@@ -0,0 +1,12 @@
+'''tzinfo timezone information for Zulu.'''
+from pytz.tzinfo import StaticTzInfo
+from pytz.tzinfo import memorized_timedelta as timedelta
+
+class Zulu(StaticTzInfo):
+    '''Zulu timezone definition. See datetime.tzinfo for details'''
+    zone = 'Zulu'
+    _utcoffset = timedelta(seconds=0)
+    _tzname = 'UTC'
+
+Zulu = Zulu()
+
diff --git a/lib/pytz/zoneinfo/__init__.py b/lib/pytz/zoneinfo/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/pytz/zoneinfo/posixrules.py b/lib/pytz/zoneinfo/posixrules.py
new file mode 100755
index 0000000..dd34e6e
--- /dev/null
+++ b/lib/pytz/zoneinfo/posixrules.py
@@ -0,0 +1,490 @@
+'''tzinfo timezone information for posixrules.'''
+from pytz.tzinfo import DstTzInfo
+from pytz.tzinfo import memorized_datetime as d
+from pytz.tzinfo import memorized_ttinfo as i
+
+class posixrules(DstTzInfo):
+    '''posixrules timezone definition. See datetime.tzinfo for details'''
+
+    zone = 'posixrules'
+
+    _utc_transition_times = [
+d(1,1,1,0,0,0),
+d(1918,3,31,7,0,0),
+d(1918,10,27,6,0,0),
+d(1919,3,30,7,0,0),
+d(1919,10,26,6,0,0),
+d(1920,3,28,7,0,0),
+d(1920,10,31,6,0,0),
+d(1921,4,24,7,0,0),
+d(1921,9,25,6,0,0),
+d(1922,4,30,7,0,0),
+d(1922,9,24,6,0,0),
+d(1923,4,29,7,0,0),
+d(1923,9,30,6,0,0),
+d(1924,4,27,7,0,0),
+d(1924,9,28,6,0,0),
+d(1925,4,26,7,0,0),
+d(1925,9,27,6,0,0),
+d(1926,4,25,7,0,0),
+d(1926,9,26,6,0,0),
+d(1927,4,24,7,0,0),
+d(1927,9,25,6,0,0),
+d(1928,4,29,7,0,0),
+d(1928,9,30,6,0,0),
+d(1929,4,28,7,0,0),
+d(1929,9,29,6,0,0),
+d(1930,4,27,7,0,0),
+d(1930,9,28,6,0,0),
+d(1931,4,26,7,0,0),
+d(1931,9,27,6,0,0),
+d(1932,4,24,7,0,0),
+d(1932,9,25,6,0,0),
+d(1933,4,30,7,0,0),
+d(1933,9,24,6,0,0),
+d(1934,4,29,7,0,0),
+d(1934,9,30,6,0,0),
+d(1935,4,28,7,0,0),
+d(1935,9,29,6,0,0),
+d(1936,4,26,7,0,0),
+d(1936,9,27,6,0,0),
+d(1937,4,25,7,0,0),
+d(1937,9,26,6,0,0),
+d(1938,4,24,7,0,0),
+d(1938,9,25,6,0,0),
+d(1939,4,30,7,0,0),
+d(1939,9,24,6,0,0),
+d(1940,4,28,7,0,0),
+d(1940,9,29,6,0,0),
+d(1941,4,27,7,0,0),
+d(1941,9,28,6,0,0),
+d(1942,2,9,7,0,0),
+d(1945,8,14,23,0,0),
+d(1945,9,30,6,0,0),
+d(1946,4,28,7,0,0),
+d(1946,9,29,6,0,0),
+d(1947,4,27,7,0,0),
+d(1947,9,28,6,0,0),
+d(1948,4,25,7,0,0),
+d(1948,9,26,6,0,0),
+d(1949,4,24,7,0,0),
+d(1949,9,25,6,0,0),
+d(1950,4,30,7,0,0),
+d(1950,9,24,6,0,0),
+d(1951,4,29,7,0,0),
+d(1951,9,30,6,0,0),
+d(1952,4,27,7,0,0),
+d(1952,9,28,6,0,0),
+d(1953,4,26,7,0,0),
+d(1953,9,27,6,0,0),
+d(1954,4,25,7,0,0),
+d(1954,9,26,6,0,0),
+d(1955,4,24,7,0,0),
+d(1955,10,30,6,0,0),
+d(1956,4,29,7,0,0),
+d(1956,10,28,6,0,0),
+d(1957,4,28,7,0,0),
+d(1957,10,27,6,0,0),
+d(1958,4,27,7,0,0),
+d(1958,10,26,6,0,0),
+d(1959,4,26,7,0,0),
+d(1959,10,25,6,0,0),
+d(1960,4,24,7,0,0),
+d(1960,10,30,6,0,0),
+d(1961,4,30,7,0,0),
+d(1961,10,29,6,0,0),
+d(1962,4,29,7,0,0),
+d(1962,10,28,6,0,0),
+d(1963,4,28,7,0,0),
+d(1963,10,27,6,0,0),
+d(1964,4,26,7,0,0),
+d(1964,10,25,6,0,0),
+d(1965,4,25,7,0,0),
+d(1965,10,31,6,0,0),
+d(1966,4,24,7,0,0),
+d(1966,10,30,6,0,0),
+d(1967,4,30,7,0,0),
+d(1967,10,29,6,0,0),
+d(1968,4,28,7,0,0),
+d(1968,10,27,6,0,0),
+d(1969,4,27,7,0,0),
+d(1969,10,26,6,0,0),
+d(1970,4,26,7,0,0),
+d(1970,10,25,6,0,0),
+d(1971,4,25,7,0,0),
+d(1971,10,31,6,0,0),
+d(1972,4,30,7,0,0),
+d(1972,10,29,6,0,0),
+d(1973,4,29,7,0,0),
+d(1973,10,28,6,0,0),
+d(1974,1,6,7,0,0),
+d(1974,10,27,6,0,0),
+d(1975,2,23,7,0,0),
+d(1975,10,26,6,0,0),
+d(1976,4,25,7,0,0),
+d(1976,10,31,6,0,0),
+d(1977,4,24,7,0,0),
+d(1977,10,30,6,0,0),
+d(1978,4,30,7,0,0),
+d(1978,10,29,6,0,0),
+d(1979,4,29,7,0,0),
+d(1979,10,28,6,0,0),
+d(1980,4,27,7,0,0),
+d(1980,10,26,6,0,0),
+d(1981,4,26,7,0,0),
+d(1981,10,25,6,0,0),
+d(1982,4,25,7,0,0),
+d(1982,10,31,6,0,0),
+d(1983,4,24,7,0,0),
+d(1983,10,30,6,0,0),
+d(1984,4,29,7,0,0),
+d(1984,10,28,6,0,0),
+d(1985,4,28,7,0,0),
+d(1985,10,27,6,0,0),
+d(1986,4,27,7,0,0),
+d(1986,10,26,6,0,0),
+d(1987,4,5,7,0,0),
+d(1987,10,25,6,0,0),
+d(1988,4,3,7,0,0),
+d(1988,10,30,6,0,0),
+d(1989,4,2,7,0,0),
+d(1989,10,29,6,0,0),
+d(1990,4,1,7,0,0),
+d(1990,10,28,6,0,0),
+d(1991,4,7,7,0,0),
+d(1991,10,27,6,0,0),
+d(1992,4,5,7,0,0),
+d(1992,10,25,6,0,0),
+d(1993,4,4,7,0,0),
+d(1993,10,31,6,0,0),
+d(1994,4,3,7,0,0),
+d(1994,10,30,6,0,0),
+d(1995,4,2,7,0,0),
+d(1995,10,29,6,0,0),
+d(1996,4,7,7,0,0),
+d(1996,10,27,6,0,0),
+d(1997,4,6,7,0,0),
+d(1997,10,26,6,0,0),
+d(1998,4,5,7,0,0),
+d(1998,10,25,6,0,0),
+d(1999,4,4,7,0,0),
+d(1999,10,31,6,0,0),
+d(2000,4,2,7,0,0),
+d(2000,10,29,6,0,0),
+d(2001,4,1,7,0,0),
+d(2001,10,28,6,0,0),
+d(2002,4,7,7,0,0),
+d(2002,10,27,6,0,0),
+d(2003,4,6,7,0,0),
+d(2003,10,26,6,0,0),
+d(2004,4,4,7,0,0),
+d(2004,10,31,6,0,0),
+d(2005,4,3,7,0,0),
+d(2005,10,30,6,0,0),
+d(2006,4,2,7,0,0),
+d(2006,10,29,6,0,0),
+d(2007,3,11,7,0,0),
+d(2007,11,4,6,0,0),
+d(2008,3,9,7,0,0),
+d(2008,11,2,6,0,0),
+d(2009,3,8,7,0,0),
+d(2009,11,1,6,0,0),
+d(2010,3,14,7,0,0),
+d(2010,11,7,6,0,0),
+d(2011,3,13,7,0,0),
+d(2011,11,6,6,0,0),
+d(2012,3,11,7,0,0),
+d(2012,11,4,6,0,0),
+d(2013,3,10,7,0,0),
+d(2013,11,3,6,0,0),
+d(2014,3,9,7,0,0),
+d(2014,11,2,6,0,0),
+d(2015,3,8,7,0,0),
+d(2015,11,1,6,0,0),
+d(2016,3,13,7,0,0),
+d(2016,11,6,6,0,0),
+d(2017,3,12,7,0,0),
+d(2017,11,5,6,0,0),
+d(2018,3,11,7,0,0),
+d(2018,11,4,6,0,0),
+d(2019,3,10,7,0,0),
+d(2019,11,3,6,0,0),
+d(2020,3,8,7,0,0),
+d(2020,11,1,6,0,0),
+d(2021,3,14,7,0,0),
+d(2021,11,7,6,0,0),
+d(2022,3,13,7,0,0),
+d(2022,11,6,6,0,0),
+d(2023,3,12,7,0,0),
+d(2023,11,5,6,0,0),
+d(2024,3,10,7,0,0),
+d(2024,11,3,6,0,0),
+d(2025,3,9,7,0,0),
+d(2025,11,2,6,0,0),
+d(2026,3,8,7,0,0),
+d(2026,11,1,6,0,0),
+d(2027,3,14,7,0,0),
+d(2027,11,7,6,0,0),
+d(2028,3,12,7,0,0),
+d(2028,11,5,6,0,0),
+d(2029,3,11,7,0,0),
+d(2029,11,4,6,0,0),
+d(2030,3,10,7,0,0),
+d(2030,11,3,6,0,0),
+d(2031,3,9,7,0,0),
+d(2031,11,2,6,0,0),
+d(2032,3,14,7,0,0),
+d(2032,11,7,6,0,0),
+d(2033,3,13,7,0,0),
+d(2033,11,6,6,0,0),
+d(2034,3,12,7,0,0),
+d(2034,11,5,6,0,0),
+d(2035,3,11,7,0,0),
+d(2035,11,4,6,0,0),
+d(2036,3,9,7,0,0),
+d(2036,11,2,6,0,0),
+d(2037,3,8,7,0,0),
+d(2037,11,1,6,0,0),
+        ]
+
+    _transition_info = [
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EWT'),
+i(-14400,3600,'EPT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+i(-14400,3600,'EDT'),
+i(-18000,0,'EST'),
+        ]
+
+posixrules = posixrules()
+
diff --git a/lib/requests/__init__.py b/lib/requests/__init__.py
new file mode 100755
index 0000000..2e33412
--- /dev/null
+++ b/lib/requests/__init__.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+
+#   __
+#  /__)  _  _     _   _ _/   _
+# / (   (- (/ (/ (- _)  /  _)
+#          /
+
+"""
+requests HTTP library
+~~~~~~~~~~~~~~~~~~~~~
+
+Requests is an HTTP library, written in Python, for human beings. Basic GET
+usage:
+
+   >>> import requests
+   >>> r = requests.get('http://python.org')
+   >>> r.status_code
+   200
+   >>> 'Python is a programming language' in r.content
+   True
+
+... or POST:
+
+   >>> payload = dict(key1='value1', key2='value2')
+   >>> r = requests.post("http://httpbin.org/post", data=payload)
+   >>> print r.text
+   {
+     ...
+     "form": {
+       "key2": "value2",
+       "key1": "value1"
+     },
+     ...
+   }
+
+The other HTTP methods are supported - see `requests.api`. Full documentation
+is at <http://python-requests.org>.
+
+:copyright: (c) 2012 by Kenneth Reitz.
+:license: ISC, see LICENSE for more details.
+
+"""
+
+__title__ = 'requests'
+__version__ = '0.14.1'
+__build__ = 0x001401
+__author__ = 'Kenneth Reitz'
+__license__ = 'ISC'
+__copyright__ = 'Copyright 2012 Kenneth Reitz'
+
+
+from . import utils
+from .models import Request, Response
+from .api import request, get, head, post, patch, put, delete, options
+from .sessions import session, Session
+from .status_codes import codes
+from .exceptions import (
+    RequestException, Timeout, URLRequired,
+    TooManyRedirects, HTTPError, ConnectionError
+)
diff --git a/lib/requests/__init__.pyc b/lib/requests/__init__.pyc
new file mode 100644
index 0000000..3869393
Binary files /dev/null and b/lib/requests/__init__.pyc differ
diff --git a/lib/requests/_oauth.py b/lib/requests/_oauth.py
new file mode 100755
index 0000000..055154d
--- /dev/null
+++ b/lib/requests/_oauth.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests._oauth
+~~~~~~~~~~~~~~~
+
+This module contains the path hack necessary for oauthlib to be vendored into
+requests while allowing upstream changes.
+"""
+
+import os
+import sys
+
+try:
+    from oauthlib.oauth1 import rfc5849
+    from oauthlib.common import extract_params
+    from oauthlib.oauth1.rfc5849 import (Client, SIGNATURE_HMAC, SIGNATURE_TYPE_AUTH_HEADER)
+except ImportError:
+    from .packages import oauthlib
+    sys.modules['oauthlib'] = oauthlib
+    from oauthlib.oauth1 import rfc5849
+    from oauthlib.common import extract_params
+    from oauthlib.oauth1.rfc5849 import (Client, SIGNATURE_HMAC, SIGNATURE_TYPE_AUTH_HEADER)
diff --git a/lib/requests/_oauth.pyc b/lib/requests/_oauth.pyc
new file mode 100644
index 0000000..0b9643e
Binary files /dev/null and b/lib/requests/_oauth.pyc differ
diff --git a/lib/requests/api.py b/lib/requests/api.py
new file mode 100755
index 0000000..ded7935
--- /dev/null
+++ b/lib/requests/api.py
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.api
+~~~~~~~~~~~~
+
+This module implements the Requests API.
+
+:copyright: (c) 2012 by Kenneth Reitz.
+:license: ISC, see LICENSE for more details.
+
+"""
+
+from . import sessions
+from .safe_mode import catch_exceptions_if_in_safe_mode
+
+
+ at catch_exceptions_if_in_safe_mode
+def request(method, url, **kwargs):
+    """Constructs and sends a :class:`Request <Request>`.
+    Returns :class:`Response <Response>` object.
+
+    :param method: method for the new :class:`Request` object.
+    :param url: URL for the new :class:`Request` object.
+    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
+    :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`.
+    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
+    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
+    :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload.
+    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
+    :param timeout: (optional) Float describing the timeout of the request.
+    :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
+    :param return_response: (optional) If False, an un-sent Request object will returned.
+    :param session: (optional) A :class:`Session` object to be used for the request.
+    :param config: (optional) A configuration dictionary. See ``request.defaults`` for allowed keys and their default values.
+    :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided.
+    :param prefetch: (optional) if ``True``, the response content will be immediately downloaded.
+    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
+    """
+
+    # if this session was passed in, leave it open (and retain pooled connections);
+    # if we're making it just for this call, then close it when we're done.
+    adhoc_session = False
+    session = kwargs.pop('session', None)
+    if session is None:
+        session = sessions.session()
+        adhoc_session = True
+
+    try:
+        return session.request(method=method, url=url, **kwargs)
+    finally:
+        if adhoc_session:
+            session.close()
+
+
+def get(url, **kwargs):
+    """Sends a GET request. Returns :class:`Response` object.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    """
+
+    kwargs.setdefault('allow_redirects', True)
+    return request('get', url, **kwargs)
+
+
+def options(url, **kwargs):
+    """Sends a OPTIONS request. Returns :class:`Response` object.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    """
+
+    kwargs.setdefault('allow_redirects', True)
+    return request('options', url, **kwargs)
+
+
+def head(url, **kwargs):
+    """Sends a HEAD request. Returns :class:`Response` object.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    """
+
+    kwargs.setdefault('allow_redirects', False)
+    return request('head', url, **kwargs)
+
+
+def post(url, data=None, **kwargs):
+    """Sends a POST request. Returns :class:`Response` object.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    """
+
+    return request('post', url, data=data, **kwargs)
+
+
+def put(url, data=None, **kwargs):
+    """Sends a PUT request. Returns :class:`Response` object.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    """
+
+    return request('put', url, data=data, **kwargs)
+
+
+def patch(url, data=None, **kwargs):
+    """Sends a PATCH request. Returns :class:`Response` object.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    """
+
+    return request('patch', url,  data=data, **kwargs)
+
+
+def delete(url, **kwargs):
+    """Sends a DELETE request. Returns :class:`Response` object.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    """
+
+    return request('delete', url, **kwargs)
diff --git a/lib/requests/api.pyc b/lib/requests/api.pyc
new file mode 100644
index 0000000..e1f009b
Binary files /dev/null and b/lib/requests/api.pyc differ
diff --git a/lib/requests/async.py b/lib/requests/async.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/requests/auth.py b/lib/requests/auth.py
new file mode 100755
index 0000000..65568f5
--- /dev/null
+++ b/lib/requests/auth.py
@@ -0,0 +1,382 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.auth
+~~~~~~~~~~~~~
+
+This module contains the authentication handlers for Requests.
+"""
+
+import os
+import re
+import time
+import hashlib
+import logging
+
+from base64 import b64encode
+
+from .compat import urlparse, str
+from .utils import parse_dict_header
+
+try:
+    from ._oauth import (Client, SIGNATURE_HMAC, SIGNATURE_TYPE_AUTH_HEADER, extract_params)
+
+except (ImportError, SyntaxError):
+    SIGNATURE_HMAC = None
+    SIGNATURE_TYPE_AUTH_HEADER = None
+
+try:
+    import kerberos as k
+except ImportError as exc:
+    k = None
+
+log = logging.getLogger(__name__)
+
+CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'
+CONTENT_TYPE_MULTI_PART = 'multipart/form-data'
+
+
+def _basic_auth_str(username, password):
+    """Returns a Basic Auth string."""
+
+    return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1')
+
+
+class AuthBase(object):
+    """Base class that all auth implementations derive from"""
+
+    def __call__(self, r):
+        raise NotImplementedError('Auth hooks must be callable.')
+
+
+class OAuth1(AuthBase):
+    """Signs the request using OAuth 1 (RFC5849)"""
+    def __init__(self, client_key,
+            client_secret=None,
+            resource_owner_key=None,
+            resource_owner_secret=None,
+            callback_uri=None,
+            signature_method=SIGNATURE_HMAC,
+            signature_type=SIGNATURE_TYPE_AUTH_HEADER,
+            rsa_key=None, verifier=None):
+
+        try:
+            signature_type = signature_type.upper()
+        except AttributeError:
+            pass
+
+        self.client = Client(client_key, client_secret, resource_owner_key,
+            resource_owner_secret, callback_uri, signature_method,
+            signature_type, rsa_key, verifier)
+
+    def __call__(self, r):
+        """Add OAuth parameters to the request.
+
+        Parameters may be included from the body if the content-type is
+        urlencoded, if no content type is set an educated guess is made.
+        """
+        # split(";") because Content-Type may be "multipart/form-data; boundary=xxxxx"
+        contenttype = r.headers.get('Content-Type', '').split(";")[0].lower()
+        # extract_params will not give params unless the body is a properly
+        # formatted string, a dictionary or a list of 2-tuples.
+        decoded_body = extract_params(r.data)
+
+        # extract_params can only check the present r.data and does not know
+        # of r.files, thus an extra check is performed. We know that
+        # if files are present the request will not have
+        # Content-type: x-www-form-urlencoded. We guess it will have
+        # a mimetype of multipart/form-data and if this is not the case
+        # we assume the correct header will be set later.
+        _oauth_signed = True
+        if r.files and contenttype == CONTENT_TYPE_MULTI_PART:
+            # Omit body data in the signing and since it will always
+            # be empty (cant add paras to body if multipart) and we wish
+            # to preserve body.
+            r.url, r.headers, _ = self.client.sign(
+                unicode(r.full_url), unicode(r.method), None, r.headers)
+        elif decoded_body is not None and contenttype in (CONTENT_TYPE_FORM_URLENCODED, ''):
+            # Normal signing
+            if not contenttype:
+                r.headers['Content-Type'] = CONTENT_TYPE_FORM_URLENCODED
+            r.url, r.headers, r.data = self.client.sign(
+                unicode(r.full_url), unicode(r.method), r.data, r.headers)
+        else:
+            _oauth_signed = False
+        if _oauth_signed:
+            # Both flows add params to the URL by using r.full_url,
+            # so this prevents adding it again later
+            r.params = {}
+
+            # Having the authorization header, key or value, in unicode will
+            # result in UnicodeDecodeErrors when the request is concatenated
+            # by httplib. This can easily be seen when attaching files.
+            # Note that simply encoding the value is not enough since Python
+            # saves the type of first key set. Thus we remove and re-add.
+            # >>> d = {u'a':u'foo'}
+            # >>> d['a'] = 'foo'
+            # >>> d
+            # { u'a' : 'foo' }
+            u_header = unicode('Authorization')
+            if u_header in r.headers:
+                auth_header = r.headers[u_header].encode('utf-8')
+                del r.headers[u_header]
+                r.headers['Authorization'] = auth_header
+
+        return r
+
+
+class HTTPBasicAuth(AuthBase):
+    """Attaches HTTP Basic Authentication to the given Request object."""
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+
+    def __call__(self, r):
+        r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
+        return r
+
+
+class HTTPProxyAuth(HTTPBasicAuth):
+    """Attaches HTTP Proxy Authenetication to a given Request object."""
+    def __call__(self, r):
+        r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password)
+        return r
+
+
+class HTTPDigestAuth(AuthBase):
+    """Attaches HTTP Digest Authentication to the given Request object."""
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+        self.last_nonce = ''
+        self.nonce_count = 0
+        self.chal = {}
+
+    def build_digest_header(self, method, url):
+
+        realm = self.chal['realm']
+        nonce = self.chal['nonce']
+        qop = self.chal.get('qop')
+        algorithm = self.chal.get('algorithm', 'MD5')
+        opaque = self.chal.get('opaque', None)
+
+        algorithm = algorithm.upper()
+        # lambdas assume digest modules are imported at the top level
+        if algorithm == 'MD5':
+            def md5_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.md5(x).hexdigest()
+            hash_utf8 = md5_utf8
+        elif algorithm == 'SHA':
+            def sha_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.sha1(x).hexdigest()
+            hash_utf8 = sha_utf8
+        # XXX MD5-sess
+        KD = lambda s, d: hash_utf8("%s:%s" % (s, d))
+
+        if hash_utf8 is None:
+            return None
+
+        # XXX not implemented yet
+        entdig = None
+        p_parsed = urlparse(url)
+        path = p_parsed.path
+        if p_parsed.query:
+            path += '?' + p_parsed.query
+
+        A1 = '%s:%s:%s' % (self.username, realm, self.password)
+        A2 = '%s:%s' % (method, path)
+
+        if qop == 'auth':
+            if nonce == self.last_nonce:
+                self.nonce_count += 1
+            else:
+                self.nonce_count = 1
+
+            ncvalue = '%08x' % self.nonce_count
+            s = str(self.nonce_count).encode('utf-8')
+            s += nonce.encode('utf-8')
+            s += time.ctime().encode('utf-8')
+            s += os.urandom(8)
+
+            cnonce = (hashlib.sha1(s).hexdigest()[:16])
+            noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, hash_utf8(A2))
+            respdig = KD(hash_utf8(A1), noncebit)
+        elif qop is None:
+            respdig = KD(hash_utf8(A1), "%s:%s" % (nonce, hash_utf8(A2)))
+        else:
+            # XXX handle auth-int.
+            return None
+
+        self.last_nonce = nonce
+
+        # XXX should the partial digests be encoded too?
+        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
+           'response="%s"' % (self.username, realm, nonce, path, respdig)
+        if opaque:
+            base += ', opaque="%s"' % opaque
+        if entdig:
+            base += ', digest="%s"' % entdig
+            base += ', algorithm="%s"' % algorithm
+        if qop:
+            base += ', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce)
+
+        return 'Digest %s' % (base)
+
+    def handle_401(self, r):
+        """Takes the given response and tries digest-auth, if needed."""
+
+        num_401_calls = r.request.hooks['response'].count(self.handle_401)
+
+        s_auth = r.headers.get('www-authenticate', '')
+
+        if 'digest' in s_auth.lower() and num_401_calls < 2:
+
+            self.chal = parse_dict_header(s_auth.replace('Digest ', ''))
+
+            # Consume content and release the original connection
+            # to allow our new request to reuse the same one.
+            r.content
+            r.raw.release_conn()
+
+            r.request.headers['Authorization'] = self.build_digest_header(r.request.method, r.request.url)
+            r.request.send(anyway=True)
+            _r = r.request.response
+            _r.history.append(r)
+
+            return _r
+
+        return r
+
+    def __call__(self, r):
+        # If we have a saved nonce, skip the 401
+        if self.last_nonce:
+            r.headers['Authorization'] = self.build_digest_header(r.method, r.url)
+        r.register_hook('response', self.handle_401)
+        return r
+
+
+def _negotiate_value(r):
+    """Extracts the gssapi authentication token from the appropriate header"""
+
+    authreq = r.headers.get('www-authenticate', None)
+
+    if authreq:
+        rx = re.compile('(?:.*,)*\s*Negotiate\s*([^,]*),?', re.I)
+        mo = rx.search(authreq)
+        if mo:
+            return mo.group(1)
+
+    return None
+
+
+class HTTPKerberosAuth(AuthBase):
+    """Attaches HTTP GSSAPI/Kerberos Authentication to the given Request object."""
+    def __init__(self, require_mutual_auth=True):
+        if k is None:
+            raise Exception("Kerberos libraries unavailable")
+        self.context = None
+        self.require_mutual_auth = require_mutual_auth
+
+    def generate_request_header(self, r):
+        """Generates the gssapi authentication token with kerberos"""
+
+        host = urlparse(r.url).netloc
+        tail, _, head = host.rpartition(':')
+        domain = tail if tail else head
+
+        result, self.context = k.authGSSClientInit("HTTP@%s" % domain)
+
+        if result < 1:
+            raise Exception("authGSSClientInit failed")
+
+        result = k.authGSSClientStep(self.context, _negotiate_value(r))
+
+        if result < 0:
+            raise Exception("authGSSClientStep failed")
+
+        response = k.authGSSClientResponse(self.context)
+
+        return "Negotiate %s" % response
+
+    def authenticate_user(self, r):
+        """Handles user authentication with gssapi/kerberos"""
+
+        auth_header = self.generate_request_header(r)
+        log.debug("authenticate_user(): Authorization header: %s" % auth_header)
+        r.request.headers['Authorization'] = auth_header
+        r.request.send(anyway=True)
+        _r = r.request.response
+        _r.history.append(r)
+        log.debug("authenticate_user(): returning %s" % _r)
+        return _r
+
+    def handle_401(self, r):
+        """Handles 401's, attempts to use gssapi/kerberos authentication"""
+
+        log.debug("handle_401(): Handling: 401")
+        if _negotiate_value(r) is not None:
+            _r = self.authenticate_user(r)
+            log.debug("handle_401(): returning %s" % _r)
+            return _r
+        else:
+            log.debug("handle_401(): Kerberos is not supported")
+            log.debug("handle_401(): returning %s" % r)
+            return r
+
+    def handle_other(self, r):
+        """Handles all responses with the exception of 401s.
+
+        This is necessary so that we can authenticate responses if requested"""
+
+        log.debug("handle_other(): Handling: %d" % r.status_code)
+        self.deregister(r)
+        if self.require_mutual_auth:
+            if _negotiate_value(r) is not None:
+                log.debug("handle_other(): Authenticating the server")
+                _r = self.authenticate_server(r)
+                log.debug("handle_other(): returning %s" % _r)
+                return _r
+            else:
+                log.error("handle_other(): Mutual authentication failed")
+                raise Exception("Mutual authentication failed")
+        else:
+            log.debug("handle_other(): returning %s" % r)
+            return r
+
+    def authenticate_server(self, r):
+        """Uses GSSAPI to authenticate the server"""
+
+        log.debug("authenticate_server(): Authenticate header: %s" % _negotiate_value(r))
+        result = k.authGSSClientStep(self.context, _negotiate_value(r))
+        if  result < 1:
+            raise Exception("authGSSClientStep failed")
+        _r = r.request.response
+        log.debug("authenticate_server(): returning %s" % _r)
+        return _r
+
+    def handle_response(self, r):
+        """Takes the given response and tries kerberos-auth, as needed."""
+
+        if r.status_code == 401:
+            _r = self.handle_401(r)
+            log.debug("handle_response returning %s" % _r)
+            return _r
+        else:
+            _r = self.handle_other(r)
+            log.debug("handle_response returning %s" % _r)
+            return _r
+
+        log.debug("handle_response returning %s" % r)
+        return r
+
+    def deregister(self, r):
+        """Deregisters the response handler"""
+        r.request.deregister_hook('response', self.handle_response)
+
+    def __call__(self, r):
+        r.register_hook('response', self.handle_response)
+        return r
diff --git a/lib/requests/auth.pyc b/lib/requests/auth.pyc
new file mode 100644
index 0000000..a34bbe9
Binary files /dev/null and b/lib/requests/auth.pyc differ
diff --git a/lib/requests/cacert.pem b/lib/requests/cacert.pem
new file mode 100755
index 0000000..7da8447
--- /dev/null
+++ b/lib/requests/cacert.pem
@@ -0,0 +1,3338 @@
+##
+## ca-bundle.crt -- Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Wed Jan 18 00:04:16 2012
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt).  This file can be found in the mozilla source tree:
+## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is the Netscape security libraries.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1994-2000
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.81 $ $Date: 2012/01/17 22:02:37 $
+
+GTE CyberTrust Global Root
+==========================
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
+Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
+A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
+MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
+Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
+IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
+sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
+HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
+AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
+M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
+NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
+
+Thawte Server CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
+AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
+b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
+BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
+c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
+A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
+ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
+/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
+1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
+GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
+GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
+-----END CERTIFICATE-----
+
+Thawte Premium Server CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
+AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
+ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
+AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
+VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
+aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
+cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
+aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
+Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
+qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
+SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
+8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
+UCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+
+Equifax Secure CA
+=================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
+ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
+MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
+B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
+fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
+8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
+CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
+spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
+zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
+BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
+70+sB3c4
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 1
+=======================================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
+MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
+NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
+o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
+ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
+kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
+RbyhkwS7hp86W0N6w4pl
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 3
+=======================================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
+MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
+VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
+xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
+AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
+up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
+mPnHfxsb1gYgAlihw6ID
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
+TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
+WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
+Tqj/ZA1k
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
+FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
+lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
+1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
+Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
+-----END CERTIFICATE-----
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+ValiCert Class 1 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
+MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
+GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
+DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
+lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
+icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
+Orf1LXLI
+-----END CERTIFICATE-----
+
+ValiCert Class 2 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
+CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
+ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
+SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
+UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
+W9ViH0Pd
+-----END CERTIFICATE-----
+
+RSA Root Certificate 1
+======================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
+3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
+BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
+3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
+V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
+on+jjBXu
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Verisign Class 4 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
+tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
+8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
+Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
+Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
+mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
+RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
+UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+Entrust.net Secure Server CA
+============================
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
+cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
+ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
+A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
+eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
+dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
+aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
+gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
+ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
+CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
+dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
+NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
+HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
+BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
+Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
+n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
+AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
+gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
+AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
+oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
+o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
+2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
+OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+Equifax Secure Global eBusiness CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
+bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
+HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
+b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
+PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
+qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
+hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
+BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
+MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
+I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
+NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 1
+=============================
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
+LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
+ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
+IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
+1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
+IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
+MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
+Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
+AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
+lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 2
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
+ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
+MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
+DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
+2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
+BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
+JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
+uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
+jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
+78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
+V+GRMOrN
+-----END CERTIFICATE-----
+
+AddTrust Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+RSA Security 2048 v3
+====================
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
+MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
+BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
+Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
+WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
+KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
+FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
+v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
+0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
+VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
+nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
+pKnXwiJPZ9d37CAFYd4=
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
+v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
+DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
+sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
+8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
+o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
+GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
+VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
+3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
+Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
+fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
+f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
+qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
+RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
+gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
+6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
+FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
+Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
+B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
+aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
+T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
+JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
+zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
+ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
+1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
+GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
+Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
+cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
+-----END CERTIFICATE-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
+ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
+HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
+bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
+vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
+jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
+C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
+vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
+22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
+HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
+dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
+BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
+EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
+MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
+nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
+-----END CERTIFICATE-----
+
+UTN DATACorp SGC Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
+BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
+MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
+HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
+dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
+raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
+wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
+9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
+33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
+DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
+BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
+LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
+DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
+I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
+EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
+DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+NetLock Notary (Class A) Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
+EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
+ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
+DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
+EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
+VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
+cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
+D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
+z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
+/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
+tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
+4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
+A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
+Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
+bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
+LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
+ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
+IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
+IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
+b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
+bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
+Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
+bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
+ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
+ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
+CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
+KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
+8CgHrTwXZoi1/baI
+-----END CERTIFICATE-----
+
+NetLock Business (Class B) Root
+===============================
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
+VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
+VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
+bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
+VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
+o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
+1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
+HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
+RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
+dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
+ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
+c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
+YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
+Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
+bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
+IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
+YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
+cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
+43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
+stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+
+NetLock Express (Class C) Root
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
+BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
+ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
+W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
+euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
+DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
+RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
+YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
+IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
+aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
+ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
+emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
+IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
+UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
+YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
+xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
+gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+Firmaprofesional Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
+GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
+Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
+ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
+MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
+OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
+ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
+j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
+lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
+3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
+NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
+KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
+AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
+ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
+u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
+wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
+7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
+VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
+-----END CERTIFICATE-----
+
+Wells Fargo Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
+bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
+MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
+x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
+E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
+OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
+sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
+YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
+BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
+ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
+m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
+OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
+x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
+tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
+MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
+MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
+NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
+AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
+b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
+7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
+cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
+WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
+haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
+MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
+MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
+jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
+MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
+VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
+vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
+OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
+1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
+nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
+x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 1
+==============================================
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
+MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
+acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
+MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
+U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
+TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
+aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
+yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
+Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
+8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
+W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
+BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
+sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
+q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
+B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
+nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
+MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
+dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
+LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
+x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
+QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
+5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
+AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
+Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
+9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
+UrbnBEI=
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+IGC/A
+=====
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
+VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
+Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
+MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
+EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
+STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
+TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
+So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
+HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
+frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
+tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
+egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
+iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
+q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
+MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
+lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
+0mBWWg==
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
+======================================
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
+AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
+LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
+HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
+U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
+IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
+yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
+2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
+4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
+2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
+8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
+HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
+Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
+5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
+czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
+ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
+BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
+cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
+AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
+EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
+/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
+MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
+3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
+eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
+/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
+RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
+Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 2 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
+MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
+IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
+xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
+Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
+SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
+dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
+KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
+TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
+JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
+vQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 3 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
+MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
+yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
+6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
+uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
+2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
+O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
+yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
+IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
+092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
+5A==
+-----END CERTIFICATE-----
+
+TC TrustCenter Universal CA I
+=============================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
+IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
+MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
+VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
+JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
+qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
+xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
+ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
+gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
+BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
+1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
+vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
+ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
+7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+ComSign Secured CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
+AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
+NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
+QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
+49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
+7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
+kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
+9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
+AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
+U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
+j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
+AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
+BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
+FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
+51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
+OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+Buypass Class 2 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
+MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
+cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
+0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
+0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
+uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
+1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
+7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
+fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
+wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+Buypass Class 3 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
+MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
+ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
+n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
+AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
+1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
+pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
+EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
+htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
+el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
+-----END CERTIFICATE-----
+
+EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
+==========================================================================
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
+QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
+Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
+IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
+X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
+gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
+eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
+TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
+Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
+uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
+qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
+ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
+Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
+Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
+FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
+zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
+XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
+bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
+RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
+1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
+2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
+Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
+AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+============================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+CA Disig
+========
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
+QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
+MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
+bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
+GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
+Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
+hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
+ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
+gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
+AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
+aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
+ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
+BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
+WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
+mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
+CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
+ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
+4Z7CRneC9VkGjCFMhwnN5ag=
+-----END CERTIFICATE-----
+
+Juur-SK
+=======
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
+c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
+DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
+SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
+aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
+TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
+UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
+Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
+MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
+HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
+AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
+cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
+AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
+cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
+A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
+ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
+abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
+IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
+Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
+yyqcjg==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+ACEDICOM Root
+=============
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
+T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
+MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
+A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
+WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
+YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
+MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
+m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
+HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
+xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
+3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
+2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
+TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
+4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
+9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
+aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
+eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
+zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
+ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
+KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
+nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
+I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
+MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
+tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
+CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
+bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
+D/xwzoiQ
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
+===================================================
+-----BEGIN CERTIFICATE-----
+MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
+ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
+MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
+cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
+aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
+8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
+jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
+JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
+9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
+SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
+F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
+D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
+Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
+fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+TC TrustCenter Universal CA III
+===============================
+-----BEGIN CERTIFICATE-----
+MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
+IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
+Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
+QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
+KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
+QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
+juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
+CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
+M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
+A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
+g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
+KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
+BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
+CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
+woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+Certinomis - Autorité Racine
+=============================
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
+LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
+A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
+JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
+wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
+Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
+2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
+jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
+c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
+lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
+xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
+530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
+4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
+WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
+R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
+nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
+CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
+JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
+qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
+WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
+wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
+vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+Root CA Generalitat Valenciana
+==============================
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
+ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
+IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
+WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
+CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
+F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
+ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
+D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
+JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
+AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
+dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
+ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
+AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
+YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
+AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
+AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
+YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
+AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
+OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
+dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
+BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
+b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
+TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
+Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
+NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
+iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----END CERTIFICATE-----
+
+A-Trust-nQual-03
+================
+-----BEGIN CERTIFICATE-----
+MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
+Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
+a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
+dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
+RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
+ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
+c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
+zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
+yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
+SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
+iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
+cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
+eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
+ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
+sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
+JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
+mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
+ahq97BvIxYSazQ==
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
diff --git a/lib/requests/certs.py b/lib/requests/certs.py
new file mode 100755
index 0000000..42df2f8
--- /dev/null
+++ b/lib/requests/certs.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+ceritfi.py
+~~~~~~~~~~
+
+This module returns the installation location of cacert.pem.
+"""
+
+import os
+try:
+    import certifi
+except ImportError:
+    certifi = None
+
+
+def where():
+
+    if certifi:
+        return certifi.where()
+    else:
+        f = os.path.split(__file__)[0]
+        return os.path.join(f, 'cacert.pem')
+
+if __name__ == '__main__':
+    print(where())
diff --git a/lib/requests/certs.pyc b/lib/requests/certs.pyc
new file mode 100644
index 0000000..127f37d
Binary files /dev/null and b/lib/requests/certs.pyc differ
diff --git a/lib/requests/compat.py b/lib/requests/compat.py
new file mode 100755
index 0000000..aa62406
--- /dev/null
+++ b/lib/requests/compat.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+
+"""
+pythoncompat
+"""
+
+
+import sys
+
+# -------
+# Pythons
+# -------
+
+# Syntax sugar.
+_ver = sys.version_info
+
+#: Python 2.x?
+is_py2 = (_ver[0] == 2)
+
+#: Python 3.x?
+is_py3 = (_ver[0] == 3)
+
+#: Python 3.0.x
+is_py30 = (is_py3 and _ver[1] == 0)
+
+#: Python 3.1.x
+is_py31 = (is_py3 and _ver[1] == 1)
+
+#: Python 3.2.x
+is_py32 = (is_py3 and _ver[1] == 2)
+
+#: Python 3.3.x
+is_py33 = (is_py3 and _ver[1] == 3)
+
+#: Python 3.4.x
+is_py34 = (is_py3 and _ver[1] == 4)
+
+#: Python 2.7.x
+is_py27 = (is_py2 and _ver[1] == 7)
+
+#: Python 2.6.x
+is_py26 = (is_py2 and _ver[1] == 6)
+
+#: Python 2.5.x
+is_py25 = (is_py2 and _ver[1] == 5)
+
+#: Python 2.4.x
+is_py24 = (is_py2 and _ver[1] == 4)   # I'm assuming this is not by choice.
+
+
+# ---------
+# Platforms
+# ---------
+
+
+# Syntax sugar.
+_ver = sys.version.lower()
+
+is_pypy = ('pypy' in _ver)
+is_jython = ('jython' in _ver)
+is_ironpython = ('iron' in _ver)
+
+# Assume CPython, if nothing else.
+is_cpython = not any((is_pypy, is_jython, is_ironpython))
+
+# Windows-based system.
+is_windows = 'win32' in str(sys.platform).lower()
+
+# Standard Linux 2+ system.
+is_linux = ('linux' in str(sys.platform).lower())
+is_osx = ('darwin' in str(sys.platform).lower())
+is_hpux = ('hpux' in str(sys.platform).lower())   # Complete guess.
+is_solaris = ('solar==' in str(sys.platform).lower())   # Complete guess.
+
+try:
+    import simplejson as json
+except ImportError:
+    import json
+
+# ---------
+# Specifics
+# ---------
+
+
+if is_py2:
+    from urllib import quote, unquote, quote_plus, unquote_plus, urlencode
+    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag
+    from urllib2 import parse_http_list
+    import cookielib
+    from Cookie import Morsel
+    from StringIO import StringIO
+    try:
+        import cchardet as chardet
+    except ImportError:
+        from .packages import chardet
+    from .packages.urllib3.packages.ordered_dict import OrderedDict
+
+    builtin_str = str
+    bytes = str
+    str = unicode
+    basestring = basestring
+    numeric_types = (int, long, float)
+
+
+
+elif is_py3:
+    from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag
+    from urllib.request import parse_http_list
+    from http import cookiejar as cookielib
+    from http.cookies import Morsel
+    from io import StringIO
+    from .packages import chardet2 as chardet
+    from collections import OrderedDict
+
+    builtin_str = str
+    str = str
+    bytes = bytes
+    basestring = (str, bytes)
+    numeric_types = (int, float)
diff --git a/lib/requests/compat.pyc b/lib/requests/compat.pyc
new file mode 100644
index 0000000..91a1d18
Binary files /dev/null and b/lib/requests/compat.pyc differ
diff --git a/lib/requests/cookies.py b/lib/requests/cookies.py
new file mode 100755
index 0000000..c3c2deb
--- /dev/null
+++ b/lib/requests/cookies.py
@@ -0,0 +1,377 @@
+# -*- coding: utf-8 -*-
+
+"""
+Compatibility code to be able to use `cookielib.CookieJar` with requests.
+
+requests.utils imports from here, so be careful with imports.
+"""
+
+import collections
+from .compat import cookielib, urlparse, Morsel
+
+try:
+    import threading
+    # grr, pyflakes: this fixes "redefinition of unused 'threading'"
+    threading
+except ImportError:
+    import dummy_threading as threading
+
+
+class MockRequest(object):
+    """Wraps a `requests.Request` to mimic a `urllib2.Request`.
+
+    The code in `cookielib.CookieJar` expects this interface in order to correctly
+    manage cookie policies, i.e., determine whether a cookie can be set, given the
+    domains of the request and the cookie.
+
+    The original request object is read-only. The client is responsible for collecting
+    the new headers via `get_new_headers()` and interpreting them appropriately. You
+    probably want `get_cookie_header`, defined below.
+    """
+
+    def __init__(self, request):
+        self._r = request
+        self._new_headers = {}
+
+    def get_type(self):
+        return urlparse(self._r.full_url).scheme
+
+    def get_host(self):
+        return urlparse(self._r.full_url).netloc
+
+    def get_origin_req_host(self):
+        if self._r.response.history:
+            r = self._r.response.history[0]
+            return urlparse(r.url).netloc
+        else:
+            return self.get_host()
+
+    def get_full_url(self):
+        return self._r.full_url
+
+    def is_unverifiable(self):
+        # unverifiable == redirected
+        return bool(self._r.response.history)
+
+    def has_header(self, name):
+        return name in self._r.headers or name in self._new_headers
+
+    def get_header(self, name, default=None):
+        return self._r.headers.get(name, self._new_headers.get(name, default))
+
+    def add_header(self, key, val):
+        """cookielib has no legitimate use for this method; add it back if you find one."""
+        raise NotImplementedError("Cookie headers should be added with add_unredirected_header()")
+
+    def add_unredirected_header(self, name, value):
+        self._new_headers[name] = value
+
+    def get_new_headers(self):
+        return self._new_headers
+
+    @property
+    def unverifiable(self):
+        return self.is_unverifiable()
+
+
+class MockResponse(object):
+    """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.
+
+    ...what? Basically, expose the parsed HTTP headers from the server response
+    the way `cookielib` expects to see them.
+    """
+
+    def __init__(self, headers):
+        """Make a MockResponse for `cookielib` to read.
+
+        :param headers: a httplib.HTTPMessage or analogous carrying the headers
+        """
+        self._headers = headers
+
+    def info(self):
+        return self._headers
+
+    def getheaders(self, name):
+        self._headers.getheaders(name)
+
+
+def extract_cookies_to_jar(jar, request, response):
+    """Extract the cookies from the response into a CookieJar.
+
+    :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)
+    :param request: our own requests.Request object
+    :param response: urllib3.HTTPResponse object
+    """
+    # the _original_response field is the wrapped httplib.HTTPResponse object,
+    req = MockRequest(request)
+    # pull out the HTTPMessage with the headers and put it in the mock:
+    res = MockResponse(response._original_response.msg)
+    jar.extract_cookies(res, req)
+
+
+def get_cookie_header(jar, request):
+    """Produce an appropriate Cookie header string to be sent with `request`, or None."""
+    r = MockRequest(request)
+    jar.add_cookie_header(r)
+    return r.get_new_headers().get('Cookie')
+
+
+def remove_cookie_by_name(cookiejar, name, domain=None, path=None):
+    """Unsets a cookie by name, by default over all domains and paths.
+
+    Wraps CookieJar.clear(), is O(n).
+    """
+    clearables = []
+    for cookie in cookiejar:
+        if cookie.name == name:
+            if domain is None or domain == cookie.domain:
+                if path is None or path == cookie.path:
+                    clearables.append((cookie.domain, cookie.path, cookie.name))
+
+    for domain, path, name in clearables:
+        cookiejar.clear(domain, path, name)
+
+
+class CookieConflictError(RuntimeError):
+    """There are two cookies that meet the criteria specified in the cookie jar.
+    Use .get and .set and include domain and path args in order to be more specific."""
+
+
+class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):
+    """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface.
+
+    This is the CookieJar we create by default for requests and sessions that
+    don't specify one, since some clients may expect response.cookies and
+    session.cookies to support dict operations.
+
+    Don't use the dict interface internally; it's just for compatibility with
+    with external client code. All `requests` code should work out of the box
+    with externally provided instances of CookieJar, e.g., LWPCookieJar and
+    FileCookieJar.
+
+    Caution: dictionary operations that are normally O(1) may be O(n).
+
+    Unlike a regular CookieJar, this class is pickleable.
+    """
+
+    def get(self, name, default=None, domain=None, path=None):
+        """Dict-like get() that also supports optional domain and path args in
+        order to resolve naming collisions from using one cookie jar over
+        multiple domains. Caution: operation is O(n), not O(1)."""
+        try:
+            return self._find_no_duplicates(name, domain, path)
+        except KeyError:
+            return default
+
+    def set(self, name, value, **kwargs):
+        """Dict-like set() that also supports optional domain and path args in
+        order to resolve naming collisions from using one cookie jar over
+        multiple domains."""
+        # support client code that unsets cookies by assignment of a None value:
+        if value is None:
+            remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path'))
+            return
+
+        if isinstance(value, Morsel):
+            c = morsel_to_cookie(value)
+        else:
+            c = create_cookie(name, value, **kwargs)
+        self.set_cookie(c)
+        return c
+
+    def keys(self):
+        """Dict-like keys() that returns a list of names of cookies from the jar.
+        See values() and items()."""
+        keys = []
+        for cookie in iter(self):
+            keys.append(cookie.name)
+        return keys
+
+    def values(self):
+        """Dict-like values() that returns a list of values of cookies from the jar.
+        See keys() and items()."""
+        values = []
+        for cookie in iter(self):
+            values.append(cookie.value)
+        return values
+
+    def items(self):
+        """Dict-like items() that returns a list of name-value tuples from the jar.
+        See keys() and values(). Allows client-code to call "dict(RequestsCookieJar)
+        and get a vanilla python dict of key value pairs."""
+        items = []
+        for cookie in iter(self):
+            items.append((cookie.name, cookie.value))
+        return items
+
+    def list_domains(self):
+        """Utility method to list all the domains in the jar."""
+        domains = []
+        for cookie in iter(self):
+            if cookie.domain not in domains:
+                domains.append(cookie.domain)
+        return domains
+
+    def list_paths(self):
+        """Utility method to list all the paths in the jar."""
+        paths = []
+        for cookie in iter(self):
+            if cookie.path not in paths:
+                paths.append(cookie.path)
+        return paths
+
+    def multiple_domains(self):
+        """Returns True if there are multiple domains in the jar.
+        Returns False otherwise."""
+        domains = []
+        for cookie in iter(self):
+            if cookie.domain is not None and cookie.domain in domains:
+                return True
+            domains.append(cookie.domain)
+        return False  # there is only one domain in jar
+
+    def get_dict(self, domain=None, path=None):
+        """Takes as an argument an optional domain and path and returns a plain old
+        Python dict of name-value pairs of cookies that meet the requirements."""
+        dictionary = {}
+        for cookie in iter(self):
+            if (domain is None or cookie.domain == domain) and (path is None
+                                                or cookie.path == path):
+                dictionary[cookie.name] = cookie.value
+        return dictionary
+
+    def __getitem__(self, name):
+        """Dict-like __getitem__() for compatibility with client code. Throws exception
+        if there are more than one cookie with name. In that case, use the more
+        explicit get() method instead. Caution: operation is O(n), not O(1)."""
+        return self._find_no_duplicates(name)
+
+    def __setitem__(self, name, value):
+        """Dict-like __setitem__ for compatibility with client code. Throws exception
+        if there is already a cookie of that name in the jar. In that case, use the more
+        explicit set() method instead."""
+        self.set(name, value)
+
+    def __delitem__(self, name):
+        """Deletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name()."""
+        remove_cookie_by_name(self, name)
+
+    def _find(self, name, domain=None, path=None):
+        """Requests uses this method internally to get cookie values. Takes as args name
+        and optional domain and path. Returns a cookie.value. If there are conflicting cookies,
+        _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown
+        if there are conflicting cookies."""
+        for cookie in iter(self):
+            if cookie.name == name:
+                if domain is None or cookie.domain == domain:
+                    if path is None or cookie.path == path:
+                        return cookie.value
+
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
+
+    def _find_no_duplicates(self, name, domain=None, path=None):
+        """__get_item__ and get call _find_no_duplicates -- never used in Requests internally.
+        Takes as args name and optional domain and path. Returns a cookie.value.
+        Throws KeyError if cookie is not found and CookieConflictError if there are
+        multiple cookies that match name and optionally domain and path."""
+        toReturn = None
+        for cookie in iter(self):
+            if cookie.name == name:
+                if domain is None or cookie.domain == domain:
+                    if path is None or cookie.path == path:
+                        if toReturn is not None:  # if there are multiple cookies that meet passed in criteria
+                            raise CookieConflictError('There are multiple cookies with name, %r' % (name))
+                        toReturn = cookie.value  # we will eventually return this as long as no cookie conflict
+
+        if toReturn:
+            return toReturn
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
+
+    def __getstate__(self):
+        """Unlike a normal CookieJar, this class is pickleable."""
+        state = self.__dict__.copy()
+        # remove the unpickleable RLock object
+        state.pop('_cookies_lock')
+        return state
+
+    def __setstate__(self, state):
+        """Unlike a normal CookieJar, this class is pickleable."""
+        self.__dict__.update(state)
+        if '_cookies_lock' not in self.__dict__:
+            self._cookies_lock = threading.RLock()
+
+    def copy(self):
+        """This is not implemented. Calling this will throw an exception."""
+        raise NotImplementedError
+
+
+def create_cookie(name, value, **kwargs):
+    """Make a cookie from underspecified parameters.
+
+    By default, the pair of `name` and `value` will be set for the domain ''
+    and sent on every request (this is sometimes called a "supercookie").
+    """
+    result = dict(
+        version=0,
+        name=name,
+        value=value,
+        port=None,
+        domain='',
+        path='/',
+        secure=False,
+        expires=None,
+        discard=True,
+        comment=None,
+        comment_url=None,
+        rest={'HttpOnly': None},
+        rfc2109=False,)
+
+    badargs = set(kwargs) - set(result)
+    if badargs:
+        err = 'create_cookie() got unexpected keyword arguments: %s'
+        raise TypeError(err % list(badargs))
+
+    result.update(kwargs)
+    result['port_specified'] = bool(result['port'])
+    result['domain_specified'] = bool(result['domain'])
+    result['domain_initial_dot'] = result['domain'].startswith('.')
+    result['path_specified'] = bool(result['path'])
+
+    return cookielib.Cookie(**result)
+
+
+def morsel_to_cookie(morsel):
+    """Convert a Morsel object into a Cookie containing the one k/v pair."""
+    c = create_cookie(
+        name=morsel.key,
+        value=morsel.value,
+        version=morsel['version'] or 0,
+        port=None,
+        port_specified=False,
+        domain=morsel['domain'],
+        domain_specified=bool(morsel['domain']),
+        domain_initial_dot=morsel['domain'].startswith('.'),
+        path=morsel['path'],
+        path_specified=bool(morsel['path']),
+        secure=bool(morsel['secure']),
+        expires=morsel['max-age'] or morsel['expires'],
+        discard=False,
+        comment=morsel['comment'],
+        comment_url=bool(morsel['comment']),
+        rest={'HttpOnly': morsel['httponly']},
+        rfc2109=False,)
+    return c
+
+
+def cookiejar_from_dict(cookie_dict, cookiejar=None):
+    """Returns a CookieJar from a key/value dictionary.
+
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
+    """
+    if cookiejar is None:
+        cookiejar = RequestsCookieJar()
+
+    if cookie_dict is not None:
+        for name in cookie_dict:
+            cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))
+    return cookiejar
diff --git a/lib/requests/cookies.pyc b/lib/requests/cookies.pyc
new file mode 100644
index 0000000..1f5459d
Binary files /dev/null and b/lib/requests/cookies.pyc differ
diff --git a/lib/requests/defaults.py b/lib/requests/defaults.py
new file mode 100755
index 0000000..91d038b
--- /dev/null
+++ b/lib/requests/defaults.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.defaults
+~~~~~~~~~~~~~~~~~
+
+This module provides the Requests configuration defaults.
+
+Configurations:
+
+:base_headers: Default HTTP headers.
+:verbose: Stream to write request logging to.
+:max_redirects: Maximum number of redirects allowed within a request.s
+:keep_alive: Reuse HTTP Connections?
+:max_retries: The number of times a request should be retried in the event of a connection failure.
+:danger_mode: If true, Requests will raise errors immediately.
+:safe_mode: If true, Requests will catch all errors.
+:strict_mode: If true, Requests will do its best to follow RFCs (e.g. POST redirects).
+:pool_maxsize: The maximium size of an HTTP connection pool.
+:pool_connections: The number of active HTTP connection pools to use.
+:encode_uri: If true, URIs will automatically be percent-encoded.
+:trust_env: If true, the surrouding environment will be trusted (environ, netrc).
+:store_cookies: If false, the received cookies as part of the HTTP response would be ignored.
+
+"""
+
+SCHEMAS = ['http', 'https']
+
+from .utils import default_user_agent
+
+defaults = dict()
+
+defaults['base_headers'] = {
+    'User-Agent': default_user_agent(),
+    'Accept-Encoding': ', '.join(('gzip', 'deflate', 'compress')),
+    'Accept': '*/*'
+}
+
+defaults['verbose'] = None
+defaults['max_redirects'] = 30
+defaults['pool_connections'] = 10
+defaults['pool_maxsize'] = 10
+defaults['max_retries'] = 0
+defaults['danger_mode'] = False
+defaults['safe_mode'] = False
+defaults['strict_mode'] = False
+defaults['keep_alive'] = True
+defaults['encode_uri'] = True
+defaults['trust_env'] = True
+defaults['store_cookies'] = True
diff --git a/lib/requests/defaults.pyc b/lib/requests/defaults.pyc
new file mode 100644
index 0000000..09d94b6
Binary files /dev/null and b/lib/requests/defaults.pyc differ
diff --git a/lib/requests/exceptions.py b/lib/requests/exceptions.py
new file mode 100755
index 0000000..6759af5
--- /dev/null
+++ b/lib/requests/exceptions.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.exceptions
+~~~~~~~~~~~~~~~~~~~
+
+This module contains the set of Requests' exceptions.
+
+"""
+
+
+class RequestException(RuntimeError):
+    """There was an ambiguous exception that occurred while handling your
+    request."""
+
+
+class HTTPError(RequestException):
+    """An HTTP error occurred."""
+    response = None
+
+
+class ConnectionError(RequestException):
+    """A Connection error occurred."""
+
+
+class SSLError(ConnectionError):
+    """An SSL error occurred."""
+
+
+class Timeout(RequestException):
+    """The request timed out."""
+
+
+class URLRequired(RequestException):
+    """A valid URL is required to make a request."""
+
+
+class TooManyRedirects(RequestException):
+    """Too many redirects."""
+
+
+class MissingSchema(RequestException, ValueError):
+    """The URL schema (e.g. http or https) is missing."""
+
+
+class InvalidSchema(RequestException, ValueError):
+    """See defaults.py for valid schemas."""
+
+
+class InvalidURL(RequestException, ValueError):
+    """ The URL provided was somehow invalid. """
diff --git a/lib/requests/exceptions.pyc b/lib/requests/exceptions.pyc
new file mode 100644
index 0000000..3758992
Binary files /dev/null and b/lib/requests/exceptions.pyc differ
diff --git a/lib/requests/hooks.py b/lib/requests/hooks.py
new file mode 100755
index 0000000..9a35fb1
--- /dev/null
+++ b/lib/requests/hooks.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.hooks
+~~~~~~~~~~~~~~
+
+This module provides the capabilities for the Requests hooks system.
+
+Available hooks:
+
+``args``:
+    A dictionary of the arguments being sent to Request().
+
+``pre_request``:
+    The Request object, directly after being created.
+
+``pre_send``:
+    The Request object, directly before being sent.
+
+``post_request``:
+    The Request object, directly after being sent.
+
+``response``:
+    The response generated from a Request.
+
+"""
+
+
+HOOKS = ('args', 'pre_request', 'pre_send', 'post_request', 'response')
+
+
+def dispatch_hook(key, hooks, hook_data):
+    """Dispatches a hook dictionary on a given piece of data."""
+
+    hooks = hooks or dict()
+
+    if key in hooks:
+        hooks = hooks.get(key)
+
+        if hasattr(hooks, '__call__'):
+            hooks = [hooks]
+
+        for hook in hooks:
+            _hook_data = hook(hook_data)
+            if _hook_data is not None:
+                hook_data = _hook_data
+
+    return hook_data
diff --git a/lib/requests/hooks.pyc b/lib/requests/hooks.pyc
new file mode 100644
index 0000000..a5c8777
Binary files /dev/null and b/lib/requests/hooks.pyc differ
diff --git a/lib/requests/models.py b/lib/requests/models.py
new file mode 100755
index 0000000..f3d7d76
--- /dev/null
+++ b/lib/requests/models.py
@@ -0,0 +1,907 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.models
+~~~~~~~~~~~~~~~
+
+This module contains the primary objects that power Requests.
+"""
+
+import os
+import socket
+from datetime import datetime
+from io import BytesIO
+
+from .hooks import dispatch_hook, HOOKS
+from .structures import CaseInsensitiveDict
+from .status_codes import codes
+
+from .auth import HTTPBasicAuth, HTTPProxyAuth
+from .cookies import cookiejar_from_dict, extract_cookies_to_jar, get_cookie_header
+from .packages.urllib3.exceptions import MaxRetryError, LocationParseError
+from .packages.urllib3.exceptions import TimeoutError
+from .packages.urllib3.exceptions import SSLError as _SSLError
+from .packages.urllib3.exceptions import HTTPError as _HTTPError
+from .packages.urllib3 import connectionpool, poolmanager
+from .packages.urllib3.filepost import encode_multipart_formdata
+from .defaults import SCHEMAS
+from .exceptions import (
+    ConnectionError, HTTPError, RequestException, Timeout, TooManyRedirects,
+    URLRequired, SSLError, MissingSchema, InvalidSchema, InvalidURL)
+from .utils import (
+    get_encoding_from_headers, stream_untransfer, guess_filename, requote_uri,
+    stream_decode_response_unicode, get_netrc_auth, get_environ_proxies,
+    to_key_val_list, DEFAULT_CA_BUNDLE_PATH, parse_header_links, iter_slices,
+    guess_json_utf)
+from .compat import (
+    cookielib, urlparse, urlunparse, urljoin, urlsplit, urlencode, str, bytes,
+    StringIO, is_py2, chardet, json, builtin_str, urldefrag)
+
+REDIRECT_STATI = (codes.moved, codes.found, codes.other, codes.temporary_moved)
+CONTENT_CHUNK_SIZE = 10 * 1024
+
+
+class Request(object):
+    """The :class:`Request <Request>` object. It carries out all functionality
+    of Requests. Recommended interface is with the Requests functions.
+    """
+
+    def __init__(self,
+        url=None,
+        headers=dict(),
+        files=None,
+        method=None,
+        data=dict(),
+        params=dict(),
+        auth=None,
+        cookies=None,
+        timeout=None,
+        redirect=False,
+        allow_redirects=False,
+        proxies=None,
+        hooks=None,
+        config=None,
+        prefetch=True,
+        _poolmanager=None,
+        verify=None,
+        session=None,
+        cert=None):
+
+        #: Dictionary of configurations for this request.
+        self.config = dict(config or [])
+
+        #: Float describes the timeout of the request.
+        #  (Use socket.setdefaulttimeout() as fallback)
+        self.timeout = timeout
+
+        #: Request URL.
+        #: Accept objects that have string representations.
+        try:
+            self.url = unicode(url)
+        except NameError:
+            # We're on Python 3.
+            self.url = str(url)
+        except UnicodeDecodeError:
+            self.url = url
+
+        #: Dictionary of HTTP Headers to attach to the :class:`Request <Request>`.
+        self.headers = dict(headers or [])
+
+        #: Dictionary of files to multipart upload (``{filename: content}``).
+        self.files = None
+
+        #: HTTP Method to use.
+        self.method = method
+
+        #: Dictionary, bytes or file stream of request body data to attach to the
+        #: :class:`Request <Request>`.
+        self.data = None
+
+        #: Dictionary or byte of querystring data to attach to the
+        #: :class:`Request <Request>`. The dictionary values can be lists for representing
+        #: multivalued query parameters.
+        self.params = None
+
+        #: True if :class:`Request <Request>` is part of a redirect chain (disables history
+        #: and HTTPError storage).
+        self.redirect = redirect
+
+        #: Set to True if full redirects are allowed (e.g. re-POST-ing of data at new ``Location``)
+        self.allow_redirects = allow_redirects
+
+        # Dictionary mapping protocol to the URL of the proxy (e.g. {'http': 'foo.bar:3128'})
+        self.proxies = dict(proxies or [])
+
+        for proxy_type, uri_ref in list(self.proxies.items()):
+            if not uri_ref:
+                del self.proxies[proxy_type]
+
+        # If no proxies are given, allow configuration by environment variables
+        # HTTP_PROXY and HTTPS_PROXY.
+        if not self.proxies and self.config.get('trust_env'):
+            self.proxies = get_environ_proxies()
+
+        self.data = data
+        self.params = params
+        self.files = files
+
+        #: :class:`Response <Response>` instance, containing
+        #: content and metadata of HTTP Response, once :attr:`sent <send>`.
+        self.response = Response()
+
+        #: Authentication tuple or object to attach to :class:`Request <Request>`.
+        self.auth = auth
+
+        #: CookieJar to attach to :class:`Request <Request>`.
+        if isinstance(cookies, cookielib.CookieJar):
+            self.cookies = cookies
+        else:
+            self.cookies = cookiejar_from_dict(cookies)
+
+        #: True if Request has been sent.
+        self.sent = False
+
+        #: Event-handling hooks.
+        self.hooks = {}
+
+        for event in HOOKS:
+            self.hooks[event] = []
+
+        hooks = hooks or {}
+
+        for (k, v) in list(hooks.items()):
+            self.register_hook(event=k, hook=v)
+
+        #: Session.
+        self.session = session
+
+        #: SSL Verification.
+        self.verify = verify
+
+        #: SSL Certificate
+        self.cert = cert
+
+        #: Prefetch response content
+        self.prefetch = prefetch
+
+        if headers:
+            headers = CaseInsensitiveDict(self.headers)
+        else:
+            headers = CaseInsensitiveDict()
+
+        # Add configured base headers.
+        for (k, v) in list(self.config.get('base_headers', {}).items()):
+            if k not in headers:
+                headers[k] = v
+
+        self.headers = headers
+        self._poolmanager = _poolmanager
+
+    def __repr__(self):
+        return '<Request [%s]>' % (self.method)
+
+    def _build_response(self, resp):
+        """Build internal :class:`Response <Response>` object
+        from given response.
+        """
+
+        def build(resp):
+
+            response = Response()
+
+            # Pass settings over.
+            response.config = self.config
+
+            if resp:
+
+                # Fallback to None if there's no status_code, for whatever reason.
+                response.status_code = getattr(resp, 'status', None)
+
+                # Make headers case-insensitive.
+                response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {}))
+
+                # Set encoding.
+                response.encoding = get_encoding_from_headers(response.headers)
+
+                # Add new cookies from the server. Don't if configured not to
+                if self.config.get('store_cookies'):
+                    extract_cookies_to_jar(self.cookies, self, resp)
+
+                # Save cookies in Response.
+                response.cookies = self.cookies
+
+                # Save cookies in Session.
+                for cookie in self.cookies:
+                    self.session.cookies.set_cookie(cookie)
+
+                # No exceptions were harmed in the making of this request.
+                response.error = getattr(resp, 'error', None)
+
+            # Save original response for later.
+            response.raw = resp
+            if isinstance(self.full_url, bytes):
+                response.url = self.full_url.decode('utf-8')
+            else:
+                response.url = self.full_url
+
+            return response
+
+        history = []
+
+        r = build(resp)
+
+        if r.status_code in REDIRECT_STATI and not self.redirect:
+
+            while (('location' in r.headers) and
+                   ((r.status_code is codes.see_other) or (self.allow_redirects))):
+
+                r.content  # Consume socket so it can be released
+
+                if not len(history) < self.config.get('max_redirects'):
+                    raise TooManyRedirects()
+
+                # Release the connection back into the pool.
+                r.raw.release_conn()
+
+                history.append(r)
+
+                url = r.headers['location']
+                data = self.data
+                files = self.files
+
+                # Handle redirection without scheme (see: RFC 1808 Section 4)
+                if url.startswith('//'):
+                    parsed_rurl = urlparse(r.url)
+                    url = '%s:%s' % (parsed_rurl.scheme, url)
+
+                # Facilitate non-RFC2616-compliant 'location' headers
+                # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource')
+                if not urlparse(url).netloc:
+                    url = urljoin(r.url,
+                                  # Compliant with RFC3986, we percent
+                                  # encode the url.
+                                  requote_uri(url))
+
+                # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4
+                if r.status_code is codes.see_other:
+                    method = 'GET'
+                    data = None
+                    files = None
+                else:
+                    method = self.method
+
+                # Do what the browsers do if strict_mode is off...
+                if (not self.config.get('strict_mode')):
+
+                    if r.status_code in (codes.moved, codes.found) and self.method == 'POST':
+                        method = 'GET'
+                        data = None
+                        files = None
+
+                    if (r.status_code == 303) and self.method != 'HEAD':
+                        method = 'GET'
+                        data = None
+                        files = None
+
+                # Remove the cookie headers that were sent.
+                headers = self.headers
+                try:
+                    del headers['Cookie']
+                except KeyError:
+                    pass
+
+                request = Request(
+                    url=url,
+                    headers=headers,
+                    files=files,
+                    method=method,
+                    params=self.session.params,
+                    auth=self.auth,
+                    cookies=self.cookies,
+                    redirect=True,
+                    data=data,
+                    config=self.config,
+                    timeout=self.timeout,
+                    _poolmanager=self._poolmanager,
+                    proxies=self.proxies,
+                    verify=self.verify,
+                    session=self.session,
+                    cert=self.cert,
+                    prefetch=self.prefetch,
+                )
+
+                request.send()
+                r = request.response
+
+            r.history = history
+
+        self.response = r
+        self.response.request = self
+
+    @staticmethod
+    def _encode_params(data):
+        """Encode parameters in a piece of data.
+
+        Will successfully encode parameters when passed as a dict or a list of
+        2-tuples. Order is retained if data is a list of 2-tuples but abritrary
+        if parameters are supplied as a dict.
+        """
+
+        if isinstance(data, (str, bytes)):
+            return data
+        elif hasattr(data, 'read'):
+            return data
+        elif hasattr(data, '__iter__'):
+            result = []
+            for k, vs in to_key_val_list(data):
+                for v in isinstance(vs, list) and vs or [vs]:
+                    if v is not None:
+                        result.append(
+                            (k.encode('utf-8') if isinstance(k, str) else k,
+                             v.encode('utf-8') if isinstance(v, str) else v))
+            return urlencode(result, doseq=True)
+        else:
+            return data
+
+    def _encode_files(self, files):
+        """Build the body for a multipart/form-data request.
+
+        Will successfully encode files when passed as a dict or a list of
+        2-tuples. Order is retained if data is a list of 2-tuples but abritrary
+        if parameters are supplied as a dict.
+
+        """
+        if (not files) or isinstance(self.data, str):
+            return None
+
+        new_fields = []
+        fields = to_key_val_list(self.data)
+        files = to_key_val_list(files)
+
+        for field, val in fields:
+            if isinstance(val, list):
+                for v in val:
+                    new_fields.append((field, builtin_str(v)))
+            else:
+                new_fields.append((field, builtin_str(val)))
+
+        for (k, v) in files:
+            # support for explicit filename
+            if isinstance(v, (tuple, list)):
+                fn, fp = v
+            else:
+                fn = guess_filename(v) or k
+                fp = v
+            if isinstance(fp, str):
+                fp = StringIO(fp)
+            if isinstance(fp, bytes):
+                fp = BytesIO(fp)
+            new_fields.append((k, (fn, fp.read())))
+
+        body, content_type = encode_multipart_formdata(new_fields)
+
+        return body, content_type
+
+    @property
+    def full_url(self):
+        """Build the actual URL to use."""
+
+        if not self.url:
+            raise URLRequired()
+
+        url = self.url
+
+        # Support for unicode domain names and paths.
+        scheme, netloc, path, params, query, fragment = urlparse(url)
+
+        if not scheme:
+            raise MissingSchema("Invalid URL %r: No schema supplied" % url)
+
+        if not scheme in SCHEMAS:
+            raise InvalidSchema("Invalid scheme %r" % scheme)
+
+        try:
+            netloc = netloc.encode('idna').decode('utf-8')
+        except UnicodeError:
+            raise InvalidURL('URL has an invalid label.')
+
+        if not path:
+            path = '/'
+
+        if is_py2:
+            if isinstance(scheme, str):
+                scheme = scheme.encode('utf-8')
+            if isinstance(netloc, str):
+                netloc = netloc.encode('utf-8')
+            if isinstance(path, str):
+                path = path.encode('utf-8')
+            if isinstance(params, str):
+                params = params.encode('utf-8')
+            if isinstance(query, str):
+                query = query.encode('utf-8')
+            if isinstance(fragment, str):
+                fragment = fragment.encode('utf-8')
+
+        enc_params = self._encode_params(self.params)
+        if enc_params:
+            if query:
+                query = '%s&%s' % (query, enc_params)
+            else:
+                query = enc_params
+
+        url = (urlunparse([scheme, netloc, path, params, query, fragment]))
+
+        if self.config.get('encode_uri', True):
+            url = requote_uri(url)
+
+        return url
+
+    @property
+    def path_url(self):
+        """Build the path URL to use."""
+
+        url = []
+
+        p = urlsplit(self.full_url)
+
+        # Proxies use full URLs.
+        if p.scheme in self.proxies:
+            url_base, frag = urldefrag(self.full_url)
+            return url_base
+
+
+        path = p.path
+        if not path:
+            path = '/'
+
+        url.append(path)
+
+        query = p.query
+        if query:
+            url.append('?')
+            url.append(query)
+
+        return ''.join(url)
+
+    def register_hook(self, event, hook):
+        """Properly register a hook."""
+        if callable(hook):
+            self.hooks[event].append(hook)
+        elif hasattr(hook, '__iter__'):
+            self.hooks[event].extend(h for h in hook if callable(h))
+
+    def deregister_hook(self, event, hook):
+        """Deregister a previously registered hook.
+        Returns True if the hook existed, False if not.
+        """
+
+        try:
+            self.hooks[event].remove(hook)
+            return True
+        except ValueError:
+            return False
+
+    def send(self, anyway=False, prefetch=None):
+        """Sends the request. Returns True if successful, False if not.
+        If there was an HTTPError during transmission,
+        self.response.status_code will contain the HTTPError code.
+
+        Once a request is successfully sent, `sent` will equal True.
+
+        :param anyway: If True, request will be sent, even if it has
+        already been sent.
+
+        :param prefetch: If not None, will override the request's own setting
+        for prefetch.
+        """
+
+        # Build the URL
+        url = self.full_url
+
+        # Pre-request hook.
+        r = dispatch_hook('pre_request', self.hooks, self)
+        self.__dict__.update(r.__dict__)
+
+        # Logging
+        if self.config.get('verbose'):
+            self.config.get('verbose').write('%s   %s   %s\n' % (
+                datetime.now().isoformat(), self.method, url
+            ))
+
+        # Use .netrc auth if none was provided.
+        if not self.auth and self.config.get('trust_env'):
+            self.auth = get_netrc_auth(url)
+
+        if self.auth:
+            if isinstance(self.auth, tuple) and len(self.auth) == 2:
+                # special-case basic HTTP auth
+                self.auth = HTTPBasicAuth(*self.auth)
+
+            # Allow auth to make its changes.
+            r = self.auth(self)
+
+            # Update self to reflect the auth changes.
+            self.__dict__.update(r.__dict__)
+
+        # Nottin' on you.
+        body = None
+        content_type = None
+
+        # Multi-part file uploads.
+        if self.files:
+            (body, content_type) = self._encode_files(self.files)
+        else:
+            if self.data:
+
+                body = self._encode_params(self.data)
+                if isinstance(self.data, str) or isinstance(self.data, builtin_str) or hasattr(self.data, 'read'):
+                    content_type = None
+                else:
+                    content_type = 'application/x-www-form-urlencoded'
+
+        # Add content-type if it wasn't explicitly provided.
+        if (content_type) and (not 'content-type' in self.headers):
+            self.headers['Content-Type'] = content_type
+
+        _p = urlparse(url)
+        no_proxy = filter(lambda x: x.strip(), self.proxies.get('no', '').split(','))
+        proxy = self.proxies.get(_p.scheme)
+
+        if proxy and not any(map(_p.hostname.endswith, no_proxy)):
+            conn = poolmanager.proxy_from_url(proxy)
+            _proxy = urlparse(proxy)
+            if '@' in _proxy.netloc:
+                auth, url = _proxy.netloc.split('@', 1)
+                self.proxy_auth = HTTPProxyAuth(*auth.split(':', 1))
+                r = self.proxy_auth(self)
+                self.__dict__.update(r.__dict__)
+        else:
+            # Check to see if keep_alive is allowed.
+            try:
+                if self.config.get('keep_alive'):
+                    conn = self._poolmanager.connection_from_url(url)
+                else:
+                    conn = connectionpool.connection_from_url(url)
+                    self.headers['Connection'] = 'close'
+            except LocationParseError as e:
+                raise InvalidURL(e)
+
+        if url.startswith('https') and self.verify:
+
+            cert_loc = None
+
+            # Allow self-specified cert location.
+            if self.verify is not True:
+                cert_loc = self.verify
+
+            # Look for configuration.
+            if not cert_loc and self.config.get('trust_env'):
+                cert_loc = os.environ.get('REQUESTS_CA_BUNDLE')
+
+            # Curl compatibility.
+            if not cert_loc and self.config.get('trust_env'):
+                cert_loc = os.environ.get('CURL_CA_BUNDLE')
+
+            if not cert_loc:
+                cert_loc = DEFAULT_CA_BUNDLE_PATH
+
+            if not cert_loc:
+                raise Exception("Could not find a suitable SSL CA certificate bundle.")
+
+            conn.cert_reqs = 'CERT_REQUIRED'
+            conn.ca_certs = cert_loc
+        else:
+            conn.cert_reqs = 'CERT_NONE'
+            conn.ca_certs = None
+
+        if self.cert:
+            if len(self.cert) == 2:
+                conn.cert_file = self.cert[0]
+                conn.key_file = self.cert[1]
+            else:
+                conn.cert_file = self.cert
+
+        if not self.sent or anyway:
+
+            # Skip if 'cookie' header is explicitly set.
+            if 'cookie' not in self.headers:
+                cookie_header = get_cookie_header(self.cookies, self)
+                if cookie_header is not None:
+                    self.headers['Cookie'] = cookie_header
+
+            # Pre-send hook.
+            r = dispatch_hook('pre_send', self.hooks, self)
+            self.__dict__.update(r.__dict__)
+
+            # catch urllib3 exceptions and throw Requests exceptions
+            try:
+                # Send the request.
+                r = conn.urlopen(
+                    method=self.method,
+                    url=self.path_url,
+                    body=body,
+                    headers=self.headers,
+                    redirect=False,
+                    assert_same_host=False,
+                    preload_content=False,
+                    decode_content=False,
+                    retries=self.config.get('max_retries', 0),
+                    timeout=self.timeout,
+                )
+                self.sent = True
+
+            except socket.error as sockerr:
+                raise ConnectionError(sockerr)
+
+            except MaxRetryError as e:
+                raise ConnectionError(e)
+
+            except (_SSLError, _HTTPError) as e:
+                if isinstance(e, _SSLError):
+                    raise SSLError(e)
+                elif isinstance(e, TimeoutError):
+                    raise Timeout(e)
+                else:
+                    raise Timeout('Request timed out.')
+
+            # build_response can throw TooManyRedirects
+            self._build_response(r)
+
+            # Response manipulation hook.
+            self.response = dispatch_hook('response', self.hooks, self.response)
+
+            # Post-request hook.
+            r = dispatch_hook('post_request', self.hooks, self)
+            self.__dict__.update(r.__dict__)
+
+            # If prefetch is True, mark content as consumed.
+            if prefetch is None:
+                prefetch = self.prefetch
+            if prefetch:
+                # Save the response.
+                self.response.content
+
+            if self.config.get('danger_mode'):
+                self.response.raise_for_status()
+
+            return self.sent
+
+
+class Response(object):
+    """The core :class:`Response <Response>` object. All
+    :class:`Request <Request>` objects contain a
+    :class:`response <Response>` attribute, which is an instance
+    of this class.
+    """
+
+    def __init__(self):
+
+        self._content = False
+        self._content_consumed = False
+
+        #: Integer Code of responded HTTP Status.
+        self.status_code = None
+
+        #: Case-insensitive Dictionary of Response Headers.
+        #: For example, ``headers['content-encoding']`` will return the
+        #: value of a ``'Content-Encoding'`` response header.
+        self.headers = CaseInsensitiveDict()
+
+        #: File-like object representation of response (for advanced usage).
+        self.raw = None
+
+        #: Final URL location of Response.
+        self.url = None
+
+        #: Resulting :class:`HTTPError` of request, if one occurred.
+        self.error = None
+
+        #: Encoding to decode with when accessing r.text.
+        self.encoding = None
+
+        #: A list of :class:`Response <Response>` objects from
+        #: the history of the Request. Any redirect responses will end
+        #: up here. The list is sorted from the oldest to the most recent request.
+        self.history = []
+
+        #: The :class:`Request <Request>` that created the Response.
+        self.request = None
+
+        #: A CookieJar of Cookies the server sent back.
+        self.cookies = None
+
+        #: Dictionary of configurations for this request.
+        self.config = {}
+
+    def __repr__(self):
+        return '<Response [%s]>' % (self.status_code)
+
+    def __bool__(self):
+        """Returns true if :attr:`status_code` is 'OK'."""
+        return self.ok
+
+    def __nonzero__(self):
+        """Returns true if :attr:`status_code` is 'OK'."""
+        return self.ok
+
+    @property
+    def ok(self):
+        try:
+            self.raise_for_status()
+        except RequestException:
+            return False
+        return True
+
+    def iter_content(self, chunk_size=1, decode_unicode=False):
+        """Iterates over the response data.  This avoids reading the content
+        at once into memory for large responses.  The chunk size is the number
+        of bytes it should read into memory.  This is not necessarily the
+        length of each item returned as decoding can take place.
+        """
+        if self._content_consumed:
+            # simulate reading small chunks of the content
+            return iter_slices(self._content, chunk_size)
+
+        def generate():
+            while 1:
+                chunk = self.raw.read(chunk_size)
+                if not chunk:
+                    break
+                yield chunk
+            self._content_consumed = True
+
+        gen = stream_untransfer(generate(), self)
+
+        if decode_unicode:
+            gen = stream_decode_response_unicode(gen, self)
+
+        return gen
+
+    def iter_lines(self, chunk_size=10 * 1024, decode_unicode=None):
+        """Iterates over the response data, one line at a time.  This
+        avoids reading the content at once into memory for large
+        responses.
+        """
+
+        pending = None
+
+        for chunk in self.iter_content(
+            chunk_size=chunk_size,
+            decode_unicode=decode_unicode):
+
+            if pending is not None:
+                chunk = pending + chunk
+            lines = chunk.splitlines()
+
+            if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]:
+                pending = lines.pop()
+            else:
+                pending = None
+
+            for line in lines:
+                yield line
+
+        if pending is not None:
+            yield pending
+
+    @property
+    def content(self):
+        """Content of the response, in bytes."""
+
+        if self._content is False:
+            # Read the contents.
+            try:
+                if self._content_consumed:
+                    raise RuntimeError(
+                        'The content for this response was already consumed')
+
+                if self.status_code is 0:
+                    self._content = None
+                else:
+                    self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()
+
+            except AttributeError:
+                self._content = None
+
+        self._content_consumed = True
+        # don't need to release the connection; that's been handled by urllib3
+        # since we exhausted the data.
+        return self._content
+
+    @property
+    def text(self):
+        """Content of the response, in unicode.
+
+        if Response.encoding is None and chardet module is available, encoding
+        will be guessed.
+        """
+
+        # Try charset from content-type
+        content = None
+        encoding = self.encoding
+
+        if not self.content:
+            return str('')
+
+        # Fallback to auto-detected encoding.
+        if self.encoding is None:
+            if chardet is not None:
+                encoding = chardet.detect(self.content)['encoding']
+
+        # Decode unicode from given encoding.
+        try:
+            content = str(self.content, encoding, errors='replace')
+        except (LookupError, TypeError):
+            # A LookupError is raised if the encoding was not found which could
+            # indicate a misspelling or similar mistake.
+            #
+            # A TypeError can be raised if encoding is None
+            #
+            # So we try blindly encoding.
+            content = str(self.content, errors='replace')
+
+        return content
+
+    @property
+    def json(self):
+        """Returns the json-encoded content of a response, if any."""
+
+        if not self.encoding and len(self.content) > 3:
+            # No encoding set. JSON RFC 4627 section 3 states we should expect
+            # UTF-8, -16 or -32. Detect which one to use; If the detection or
+            # decoding fails, fall back to `self.text` (using chardet to make
+            # a best guess).
+            encoding = guess_json_utf(self.content)
+            if encoding is not None:
+                try:
+                    return json.loads(self.content.decode(encoding))
+                except (ValueError, UnicodeDecodeError):
+                    pass
+        try:
+            return json.loads(self.text or self.content)
+        except ValueError:
+            return None
+
+    @property
+    def links(self):
+        """Returns the parsed header links of the response, if any."""
+
+        header = self.headers['link']
+
+        # l = MultiDict()
+        l = {}
+
+        if header:
+            links = parse_header_links(header)
+
+            for link in links:
+                key = link.get('rel') or link.get('url')
+                l[key] = link
+
+        return l
+
+    @property
+    def reason(self):
+        """The HTTP Reason for the response."""
+        return self.raw.reason
+
+    def raise_for_status(self, allow_redirects=True):
+        """Raises stored :class:`HTTPError` or :class:`URLError`, if one occurred."""
+
+        if self.error:
+            raise self.error
+
+        http_error_msg = ''
+        if 300 <= self.status_code < 400 and not allow_redirects:
+            http_error_msg = '%s Redirection: %s' % (self.status_code, self.reason)
+
+        elif 400 <= self.status_code < 500:
+            http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason)
+
+        elif 500 <= self.status_code < 600:
+            http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason)
+
+        if http_error_msg:
+            http_error = HTTPError(http_error_msg)
+            http_error.response = self
+            raise http_error
diff --git a/lib/requests/models.pyc b/lib/requests/models.pyc
new file mode 100644
index 0000000..c995f81
Binary files /dev/null and b/lib/requests/models.pyc differ
diff --git a/lib/requests/packages/__init__.py b/lib/requests/packages/__init__.py
new file mode 100755
index 0000000..d62c4b7
--- /dev/null
+++ b/lib/requests/packages/__init__.py
@@ -0,0 +1,3 @@
+from __future__ import absolute_import
+
+from . import urllib3
diff --git a/lib/requests/packages/__init__.pyc b/lib/requests/packages/__init__.pyc
new file mode 100644
index 0000000..cdf4f24
Binary files /dev/null and b/lib/requests/packages/__init__.pyc differ
diff --git a/lib/requests/packages/chardet/__init__.py b/lib/requests/packages/chardet/__init__.py
new file mode 100755
index 0000000..b1872fe
--- /dev/null
+++ b/lib/requests/packages/chardet/__init__.py
@@ -0,0 +1,26 @@
+######################## BEGIN LICENSE BLOCK ########################
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+__version__ = "1.0.1"
+
+def detect(aBuf):
+    import universaldetector
+    u = universaldetector.UniversalDetector()
+    u.reset()
+    u.feed(aBuf)
+    u.close()
+    return u.result
diff --git a/lib/requests/packages/chardet/__init__.pyc b/lib/requests/packages/chardet/__init__.pyc
new file mode 100644
index 0000000..c0192a8
Binary files /dev/null and b/lib/requests/packages/chardet/__init__.pyc differ
diff --git a/lib/requests/packages/chardet/big5freq.py b/lib/requests/packages/chardet/big5freq.py
new file mode 100755
index 0000000..c1b0f3c
--- /dev/null
+++ b/lib/requests/packages/chardet/big5freq.py
@@ -0,0 +1,923 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Big5 frequency table
+# by Taiwan's Mandarin Promotion Council 
+# <http://www.edu.tw:81/mandr/>
+# 
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+# 
+# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+# 
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+#Char to FreqOrder table
+BIG5_TABLE_SIZE = 5376
+
+Big5CharToFreqOrder = ( \
+   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16
+3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32
+1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48
+  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64
+3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80
+4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96
+5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112
+ 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128
+ 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144
+ 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160
+2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176
+1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192
+3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208
+ 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240
+3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256
+2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272
+ 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288
+3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304
+1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320
+5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336
+ 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352
+5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368
+1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384
+  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400
+ 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416
+3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432
+3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448
+ 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464
+2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480
+2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496
+ 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512
+ 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528
+3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544
+1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560
+1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576
+1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592
+2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608
+ 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624
+4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640
+1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656
+5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672
+2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688
+ 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704
+  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720
+ 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736
+ 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752
+5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768
+ 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784
+1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800
+ 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816
+ 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832
+5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848
+1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864
+ 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880
+3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896
+4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912
+3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928
+ 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944
+ 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960
+1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976
+4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992
+3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
+3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
+2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
+5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056
+3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
+5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
+1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
+2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
+1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
+  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
+1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
+4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
+3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
+ 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
+ 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232
+ 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
+2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
+5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
+1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
+2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
+1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
+1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
+5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
+5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
+5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
+3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
+4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
+4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
+2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
+5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
+3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
+ 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
+5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520
+5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
+1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
+2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
+3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
+4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
+5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
+3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
+4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
+1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
+1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680
+4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
+1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
+ 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
+1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
+1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
+3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
+ 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
+5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
+2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
+1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
+1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856
+5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
+ 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
+4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
+ 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
+2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
+ 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
+1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
+1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
+ 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
+4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
+4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
+1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
+3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
+5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
+5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096
+1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
+2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
+1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
+3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
+2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
+3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
+2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
+4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
+4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
+3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
+  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
+3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
+ 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
+3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
+4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
+3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
+1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
+5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
+ 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
+5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
+1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
+ 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
+4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464
+4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
+ 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
+2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
+2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528
+3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
+1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
+4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
+2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
+1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
+1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
+2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
+3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
+1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
+5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688
+1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
+4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720
+1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
+ 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
+1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
+4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
+4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
+2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
+1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
+4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
+ 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
+5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
+2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
+3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
+4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
+ 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
+5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
+5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
+1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
+4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
+4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
+2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040
+3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
+3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
+2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
+1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
+4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
+3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
+3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
+2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
+4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184
+5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
+3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
+2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
+3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
+1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
+2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
+3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
+4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312
+2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
+2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
+5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
+1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
+2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
+1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
+3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
+4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440
+2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
+3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
+3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
+2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
+4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
+2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
+3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
+4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
+5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
+3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
+ 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
+1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632
+4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
+1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
+4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680
+5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
+ 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
+5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
+5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
+2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
+3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
+2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
+2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
+ 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
+1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
+4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
+3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
+3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
+ 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
+2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
+ 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
+2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
+4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
+1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
+4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
+1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
+3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
+ 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
+3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
+5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
+5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
+3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
+3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
+1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
+2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
+5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
+1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
+1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
+3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
+ 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
+1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
+4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
+5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
+2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
+3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
+ 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
+1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
+2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
+2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
+5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
+5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
+5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
+2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
+2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
+1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
+4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
+3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
+3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
+4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
+4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
+2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
+2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
+5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
+4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
+5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
+4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
+ 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
+ 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
+1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
+3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
+4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
+1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
+5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
+2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
+2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
+3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
+5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
+1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
+3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
+5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
+1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
+5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
+2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
+3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
+2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
+3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
+3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
+3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
+4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
+ 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
+2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
+4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
+3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
+5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
+1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
+5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
+ 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
+1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
+ 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
+4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
+1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
+4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
+1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
+ 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
+3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
+4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
+5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
+ 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
+3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
+ 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
+2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376  #last 512
+#Everything below is of no interest for detection purpose
+2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392
+2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408
+5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424
+5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440
+5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456
+5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472
+5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488
+5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504
+5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520
+5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536
+5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552
+5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568
+5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584
+5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600
+6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616
+6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632
+6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648
+6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664
+6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680
+6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696
+6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712
+6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728
+6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744
+6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760
+6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776
+6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792
+6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808
+6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824
+6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840
+6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856
+6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872
+6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888
+6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904
+6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920
+6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936
+6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952
+6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968
+6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984
+6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000
+6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016
+6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032
+6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048
+6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064
+6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080
+6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096
+6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112
+6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128
+6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144
+6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160
+6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176
+6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192
+6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208
+6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224
+6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240
+6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256
+3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272
+6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288
+6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304
+3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320
+6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336
+6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352
+6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368
+6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384
+6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400
+6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416
+6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432
+4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448
+6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464
+6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480
+3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496
+6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512
+6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528
+6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544
+6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560
+6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576
+6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592
+6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608
+6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624
+6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640
+6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656
+6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672
+7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688
+7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704
+7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720
+7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736
+7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752
+7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768
+7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784
+7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800
+7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816
+7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832
+7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848
+7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864
+7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880
+7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896
+7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912
+7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928
+7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944
+7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960
+7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976
+7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992
+7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008
+7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024
+7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040
+7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056
+7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072
+7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088
+7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104
+7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120
+7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136
+7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152
+7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168
+7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184
+7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200
+7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216
+7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232
+7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248
+7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264
+7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280
+7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296
+7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312
+7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328
+7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344
+7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360
+7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376
+7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392
+7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408
+7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424
+7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440
+3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456
+7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472
+7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488
+7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504
+7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520
+4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536
+7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552
+7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568
+7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584
+7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600
+7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616
+7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632
+7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648
+7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664
+7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680
+7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696
+7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712
+8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728
+8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744
+8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760
+8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776
+8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792
+8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808
+8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824
+8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840
+8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856
+8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872
+8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888
+8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904
+8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920
+8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936
+8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952
+8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968
+8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984
+8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000
+8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016
+8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032
+8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048
+8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064
+8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080
+8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096
+8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112
+8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128
+8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144
+8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160
+8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176
+8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192
+8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208
+8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224
+8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240
+8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256
+8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272
+8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288
+8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304
+8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320
+8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336
+8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352
+8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368
+8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384
+8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400
+8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416
+8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432
+8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448
+8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464
+8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480
+8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496
+8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512
+8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528
+8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544
+8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560
+8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576
+8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592
+8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608
+8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624
+8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640
+8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656
+8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672
+8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688
+4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704
+8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720
+8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736
+8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752
+8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768
+9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784
+9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800
+9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816
+9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832
+9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848
+9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864
+9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880
+9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896
+9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912
+9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928
+9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944
+9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960
+9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976
+9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992
+9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008
+9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024
+9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040
+9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056
+9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072
+9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088
+9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104
+9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120
+9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136
+9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152
+9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168
+9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184
+9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200
+9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216
+9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232
+9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248
+9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264
+9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280
+9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296
+9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312
+9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328
+9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344
+9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360
+9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376
+3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392
+9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408
+9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424
+9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440
+4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456
+9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472
+9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488
+9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504
+9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520
+9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536
+9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552
+9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568
+9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584
+9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600
+9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616
+9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632
+9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648
+9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664
+9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680
+9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696
+9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712
+9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728
+9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744
+9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760
+9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776
+9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792
+9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808
+9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824
+10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840
+10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856
+10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872
+10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888
+10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904
+10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920
+10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936
+10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952
+10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968
+4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984
+10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000
+10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016
+10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032
+10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048
+10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064
+10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080
+10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096
+10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112
+4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128
+10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144
+10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160
+10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176
+10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192
+10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208
+10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224
+10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240
+10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256
+10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272
+10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288
+10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304
+10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320
+10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336
+10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352
+10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368
+10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384
+10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400
+4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416
+10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432
+10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448
+10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464
+10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480
+10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496
+10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512
+10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528
+10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544
+10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560
+10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576
+10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592
+10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608
+10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624
+10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640
+10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656
+10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672
+10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688
+10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704
+10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720
+10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736
+10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752
+10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768
+10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784
+10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800
+10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816
+10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832
+10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848
+10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864
+10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880
+10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896
+11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912
+11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928
+11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944
+4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960
+11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976
+11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992
+11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008
+11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024
+11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040
+11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056
+11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072
+11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088
+11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104
+11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120
+11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136
+11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152
+11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168
+11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184
+11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200
+11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216
+11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232
+11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248
+11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264
+11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280
+11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296
+11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312
+11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328
+11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344
+11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360
+11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376
+11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392
+11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408
+11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424
+11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440
+11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456
+11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472
+4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488
+11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504
+11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520
+11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536
+11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552
+11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568
+11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584
+11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600
+11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616
+11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632
+11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648
+11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664
+11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680
+11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696
+11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712
+11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728
+11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744
+11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760
+11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776
+11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792
+11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808
+11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824
+11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840
+11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856
+11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872
+11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888
+11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904
+11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920
+11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936
+12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952
+12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968
+12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984
+12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000
+12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016
+12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032
+12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048
+12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064
+12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080
+12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096
+12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112
+12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128
+12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144
+12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160
+12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176
+4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192
+4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208
+4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224
+12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240
+12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256
+12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272
+12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288
+12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304
+12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320
+12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336
+12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352
+12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368
+12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384
+12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400
+12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416
+12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432
+12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448
+12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464
+12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480
+12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496
+12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512
+12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528
+12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544
+12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560
+12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576
+12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592
+12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608
+12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624
+12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640
+12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656
+12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672
+12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688
+12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704
+12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720
+12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736
+12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752
+12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768
+12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784
+12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800
+12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816
+12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832
+12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848
+12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864
+12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880
+12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896
+12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912
+12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928
+12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944
+12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960
+12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976
+4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992
+13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008
+13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024
+13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040
+13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056
+13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072
+13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088
+13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104
+4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120
+13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136
+13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152
+13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168
+13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184
+13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200
+13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216
+13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232
+13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248
+13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264
+13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280
+13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296
+13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312
+13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328
+13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344
+13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360
+5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376
+13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392
+13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408
+13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424
+13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440
+13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456
+13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472
+13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488
+13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504
+13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520
+13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536
+13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552
+13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568
+13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584
+13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600
+13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616
+13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632
+13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648
+13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664
+13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680
+13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696
+13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712
+13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728
+13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744
+13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760
+13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776
+13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792
+13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808
+13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824
+13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840
+13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856
+13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872
+13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888
+13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904
+13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920
+13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936
+13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952
+13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968
+13968,13969,13970,13971,13972) #13973
diff --git a/lib/requests/packages/chardet/big5prober.py b/lib/requests/packages/chardet/big5prober.py
new file mode 100755
index 0000000..e6b52aa
--- /dev/null
+++ b/lib/requests/packages/chardet/big5prober.py
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from mbcharsetprober import MultiByteCharSetProber
+from codingstatemachine import CodingStateMachine
+from chardistribution import Big5DistributionAnalysis
+from mbcssm import Big5SMModel
+
+class Big5Prober(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(Big5SMModel)
+        self._mDistributionAnalyzer = Big5DistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "Big5"
diff --git a/lib/requests/packages/chardet/chardistribution.py b/lib/requests/packages/chardet/chardistribution.py
new file mode 100755
index 0000000..b893341
--- /dev/null
+++ b/lib/requests/packages/chardet/chardistribution.py
@@ -0,0 +1,200 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants
+from euctwfreq import EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO
+from euckrfreq import EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO
+from gb2312freq import GB2312CharToFreqOrder, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO
+from big5freq import Big5CharToFreqOrder, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO
+from jisfreq import JISCharToFreqOrder, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO
+
+ENOUGH_DATA_THRESHOLD = 1024
+SURE_YES = 0.99
+SURE_NO = 0.01
+
+class CharDistributionAnalysis:
+    def __init__(self):
+        self._mCharToFreqOrder = None # Mapping table to get frequency order from char order (get from GetOrder())
+        self._mTableSize = None # Size of above table
+        self._mTypicalDistributionRatio = None # This is a constant value which varies from language to language, used in calculating confidence.  See http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html for further detail.
+        self.reset()
+        
+    def reset(self):
+        """reset analyser, clear any state"""
+        self._mDone = constants.False # If this flag is set to constants.True, detection is done and conclusion has been made
+        self._mTotalChars = 0 # Total characters encountered
+        self._mFreqChars = 0 # The number of characters whose frequency order is less than 512
+
+    def feed(self, aStr, aCharLen):
+        """feed a character with known length"""
+        if aCharLen == 2:
+            # we only care about 2-bytes character in our distribution analysis
+            order = self.get_order(aStr)
+        else:
+            order = -1
+        if order >= 0:
+            self._mTotalChars += 1
+            # order is valid
+            if order < self._mTableSize:
+                if 512 > self._mCharToFreqOrder[order]:
+                    self._mFreqChars += 1
+
+    def get_confidence(self):
+        """return confidence based on existing data"""
+        # if we didn't receive any character in our consideration range, return negative answer
+        if self._mTotalChars <= 0:
+            return SURE_NO
+
+        if self._mTotalChars != self._mFreqChars:
+            r = self._mFreqChars / ((self._mTotalChars - self._mFreqChars) * self._mTypicalDistributionRatio)
+            if r < SURE_YES:
+                return r
+
+        # normalize confidence (we don't want to be 100% sure)
+        return SURE_YES
+
+    def got_enough_data(self):
+        # It is not necessary to receive all data to draw conclusion. For charset detection,
+        # certain amount of data is enough
+        return self._mTotalChars > ENOUGH_DATA_THRESHOLD
+
+    def get_order(self, aStr):
+        # We do not handle characters based on the original encoding string, but 
+        # convert this encoding string to a number, here called order.
+        # This allows multiple encodings of a language to share one frequency table.
+        return -1
+    
+class EUCTWDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = EUCTWCharToFreqOrder
+        self._mTableSize = EUCTW_TABLE_SIZE
+        self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aStr):
+        # for euc-TW encoding, we are interested 
+        #   first  byte range: 0xc4 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if aStr[0] >= '\xC4':
+            return 94 * (ord(aStr[0]) - 0xC4) + ord(aStr[1]) - 0xA1
+        else:
+            return -1
+
+class EUCKRDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = EUCKRCharToFreqOrder
+        self._mTableSize = EUCKR_TABLE_SIZE
+        self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aStr):
+        # for euc-KR encoding, we are interested 
+        #   first  byte range: 0xb0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if aStr[0] >= '\xB0':
+            return 94 * (ord(aStr[0]) - 0xB0) + ord(aStr[1]) - 0xA1
+        else:
+            return -1;
+
+class GB2312DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = GB2312CharToFreqOrder
+        self._mTableSize = GB2312_TABLE_SIZE
+        self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aStr):
+        # for GB2312 encoding, we are interested 
+        #  first  byte range: 0xb0 -- 0xfe
+        #  second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if (aStr[0] >= '\xB0') and (aStr[1] >= '\xA1'):
+            return 94 * (ord(aStr[0]) - 0xB0) + ord(aStr[1]) - 0xA1
+        else:
+            return -1;
+
+class Big5DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = Big5CharToFreqOrder
+        self._mTableSize = BIG5_TABLE_SIZE
+        self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aStr):
+        # for big5 encoding, we are interested 
+        #   first  byte range: 0xa4 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if aStr[0] >= '\xA4':
+            if aStr[1] >= '\xA1':
+                return 157 * (ord(aStr[0]) - 0xA4) + ord(aStr[1]) - 0xA1 + 63
+            else:
+                return 157 * (ord(aStr[0]) - 0xA4) + ord(aStr[1]) - 0x40
+        else:
+            return -1
+
+class SJISDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = JISCharToFreqOrder
+        self._mTableSize = JIS_TABLE_SIZE
+        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aStr):
+        # for sjis encoding, we are interested 
+        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe
+        # no validation needed here. State machine has done that
+        if (aStr[0] >= '\x81') and (aStr[0] <= '\x9F'):
+            order = 188 * (ord(aStr[0]) - 0x81)
+        elif (aStr[0] >= '\xE0') and (aStr[0] <= '\xEF'):
+            order = 188 * (ord(aStr[0]) - 0xE0 + 31)
+        else:
+            return -1;
+        order = order + ord(aStr[1]) - 0x40
+        if aStr[1] > '\x7F':
+            order =- 1
+        return order
+
+class EUCJPDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = JISCharToFreqOrder
+        self._mTableSize = JIS_TABLE_SIZE
+        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aStr):
+        # for euc-JP encoding, we are interested 
+        #   first  byte range: 0xa0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if aStr[0] >= '\xA0':
+            return 94 * (ord(aStr[0]) - 0xA1) + ord(aStr[1]) - 0xa1
+        else:
+            return -1
diff --git a/lib/requests/packages/chardet/charsetgroupprober.py b/lib/requests/packages/chardet/charsetgroupprober.py
new file mode 100755
index 0000000..5188069
--- /dev/null
+++ b/lib/requests/packages/chardet/charsetgroupprober.py
@@ -0,0 +1,96 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, sys
+from charsetprober import CharSetProber
+
+class CharSetGroupProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mActiveNum = 0
+        self._mProbers = []
+        self._mBestGuessProber = None
+        
+    def reset(self):
+        CharSetProber.reset(self)
+        self._mActiveNum = 0
+        for prober in self._mProbers:
+            if prober:
+                prober.reset()
+                prober.active = constants.True
+                self._mActiveNum += 1
+        self._mBestGuessProber = None
+
+    def get_charset_name(self):
+        if not self._mBestGuessProber:
+            self.get_confidence()
+            if not self._mBestGuessProber: return None
+#                self._mBestGuessProber = self._mProbers[0]
+        return self._mBestGuessProber.get_charset_name()
+
+    def feed(self, aBuf):
+        for prober in self._mProbers:
+            if not prober: continue
+            if not prober.active: continue
+            st = prober.feed(aBuf)
+            if not st: continue
+            if st == constants.eFoundIt:
+                self._mBestGuessProber = prober
+                return self.get_state()
+            elif st == constants.eNotMe:
+                prober.active = constants.False
+                self._mActiveNum -= 1
+                if self._mActiveNum <= 0:
+                    self._mState = constants.eNotMe
+                    return self.get_state()
+        return self.get_state()
+
+    def get_confidence(self):
+        st = self.get_state()
+        if st == constants.eFoundIt:
+            return 0.99
+        elif st == constants.eNotMe:
+            return 0.01
+        bestConf = 0.0
+        self._mBestGuessProber = None
+        for prober in self._mProbers:
+            if not prober: continue
+            if not prober.active:
+                if constants._debug:
+                    sys.stderr.write(prober.get_charset_name() + ' not active\n')
+                continue
+            cf = prober.get_confidence()
+            if constants._debug:
+                sys.stderr.write('%s confidence = %s\n' % (prober.get_charset_name(), cf))
+            if bestConf < cf:
+                bestConf = cf
+                self._mBestGuessProber = prober
+        if not self._mBestGuessProber: return 0.0
+        return bestConf
+#        else:
+#            self._mBestGuessProber = self._mProbers[0]
+#            return self._mBestGuessProber.get_confidence()
diff --git a/lib/requests/packages/chardet/charsetprober.py b/lib/requests/packages/chardet/charsetprober.py
new file mode 100755
index 0000000..3ac1683
--- /dev/null
+++ b/lib/requests/packages/chardet/charsetprober.py
@@ -0,0 +1,60 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, re
+
+class CharSetProber:
+    def __init__(self):
+        pass
+        
+    def reset(self):
+        self._mState = constants.eDetecting
+    
+    def get_charset_name(self):
+        return None
+
+    def feed(self, aBuf):
+        pass
+
+    def get_state(self):
+        return self._mState
+
+    def get_confidence(self):
+        return 0.0
+
+    def filter_high_bit_only(self, aBuf):
+        aBuf = re.sub(r'([\x00-\x7F])+', ' ', aBuf)
+        return aBuf
+    
+    def filter_without_english_letters(self, aBuf):
+        aBuf = re.sub(r'([A-Za-z])+', ' ', aBuf)
+        return aBuf
+        
+    def filter_with_english_letters(self, aBuf):
+        # TODO
+        return aBuf
diff --git a/lib/requests/packages/chardet/codingstatemachine.py b/lib/requests/packages/chardet/codingstatemachine.py
new file mode 100755
index 0000000..452d3b0
--- /dev/null
+++ b/lib/requests/packages/chardet/codingstatemachine.py
@@ -0,0 +1,56 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from constants import eStart, eError, eItsMe
+
+class CodingStateMachine:
+    def __init__(self, sm):
+        self._mModel = sm
+        self._mCurrentBytePos = 0
+        self._mCurrentCharLen = 0
+        self.reset()
+
+    def reset(self):
+        self._mCurrentState = eStart
+
+    def next_state(self, c):
+        # for each byte we get its class
+        # if it is first byte, we also get byte length
+        byteCls = self._mModel['classTable'][ord(c)]
+        if self._mCurrentState == eStart:
+            self._mCurrentBytePos = 0
+            self._mCurrentCharLen = self._mModel['charLenTable'][byteCls]
+        # from byte's class and stateTable, we get its next state
+        self._mCurrentState = self._mModel['stateTable'][self._mCurrentState * self._mModel['classFactor'] + byteCls]
+        self._mCurrentBytePos += 1
+        return self._mCurrentState
+
+    def get_current_charlen(self):
+        return self._mCurrentCharLen
+
+    def get_coding_state_machine(self):
+        return self._mModel['name']
diff --git a/lib/requests/packages/chardet/constants.py b/lib/requests/packages/chardet/constants.py
new file mode 100755
index 0000000..e94e226
--- /dev/null
+++ b/lib/requests/packages/chardet/constants.py
@@ -0,0 +1,47 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+_debug = 0
+
+eDetecting = 0
+eFoundIt = 1
+eNotMe = 2
+
+eStart = 0
+eError = 1
+eItsMe = 2
+
+SHORTCUT_THRESHOLD = 0.95
+
+import __builtin__
+if not hasattr(__builtin__, 'False'):
+    False = 0
+    True = 1
+else:
+    False = __builtin__.False
+    True = __builtin__.True
diff --git a/lib/requests/packages/chardet/escprober.py b/lib/requests/packages/chardet/escprober.py
new file mode 100755
index 0000000..572ed7b
--- /dev/null
+++ b/lib/requests/packages/chardet/escprober.py
@@ -0,0 +1,79 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, sys
+from escsm import HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, ISO2022KRSMModel
+from charsetprober import CharSetProber
+from codingstatemachine import CodingStateMachine
+
+class EscCharSetProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mCodingSM = [ \
+            CodingStateMachine(HZSMModel),
+            CodingStateMachine(ISO2022CNSMModel),
+            CodingStateMachine(ISO2022JPSMModel),
+            CodingStateMachine(ISO2022KRSMModel)
+            ]
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        for codingSM in self._mCodingSM:
+            if not codingSM: continue
+            codingSM.active = constants.True
+            codingSM.reset()
+        self._mActiveSM = len(self._mCodingSM)
+        self._mDetectedCharset = None
+
+    def get_charset_name(self):
+        return self._mDetectedCharset
+
+    def get_confidence(self):
+        if self._mDetectedCharset:
+            return 0.99
+        else:
+            return 0.00
+
+    def feed(self, aBuf):
+        for c in aBuf:
+            for codingSM in self._mCodingSM:
+                if not codingSM: continue
+                if not codingSM.active: continue
+                codingState = codingSM.next_state(c)
+                if codingState == constants.eError:
+                    codingSM.active = constants.False
+                    self._mActiveSM -= 1
+                    if self._mActiveSM <= 0:
+                        self._mState = constants.eNotMe
+                        return self.get_state()
+                elif codingState == constants.eItsMe:
+                    self._mState = constants.eFoundIt
+                    self._mDetectedCharset = codingSM.get_coding_state_machine()
+                    return self.get_state()
+                
+        return self.get_state()
diff --git a/lib/requests/packages/chardet/escsm.py b/lib/requests/packages/chardet/escsm.py
new file mode 100755
index 0000000..9fa2295
--- /dev/null
+++ b/lib/requests/packages/chardet/escsm.py
@@ -0,0 +1,240 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from constants import eStart, eError, eItsMe
+
+HZ_cls = ( \
+1,0,0,0,0,0,0,0,  # 00 - 07 
+0,0,0,0,0,0,0,0,  # 08 - 0f 
+0,0,0,0,0,0,0,0,  # 10 - 17 
+0,0,0,1,0,0,0,0,  # 18 - 1f 
+0,0,0,0,0,0,0,0,  # 20 - 27 
+0,0,0,0,0,0,0,0,  # 28 - 2f 
+0,0,0,0,0,0,0,0,  # 30 - 37 
+0,0,0,0,0,0,0,0,  # 38 - 3f 
+0,0,0,0,0,0,0,0,  # 40 - 47 
+0,0,0,0,0,0,0,0,  # 48 - 4f 
+0,0,0,0,0,0,0,0,  # 50 - 57 
+0,0,0,0,0,0,0,0,  # 58 - 5f 
+0,0,0,0,0,0,0,0,  # 60 - 67 
+0,0,0,0,0,0,0,0,  # 68 - 6f 
+0,0,0,0,0,0,0,0,  # 70 - 77 
+0,0,0,4,0,5,2,0,  # 78 - 7f 
+1,1,1,1,1,1,1,1,  # 80 - 87 
+1,1,1,1,1,1,1,1,  # 88 - 8f 
+1,1,1,1,1,1,1,1,  # 90 - 97 
+1,1,1,1,1,1,1,1,  # 98 - 9f 
+1,1,1,1,1,1,1,1,  # a0 - a7 
+1,1,1,1,1,1,1,1,  # a8 - af 
+1,1,1,1,1,1,1,1,  # b0 - b7 
+1,1,1,1,1,1,1,1,  # b8 - bf 
+1,1,1,1,1,1,1,1,  # c0 - c7 
+1,1,1,1,1,1,1,1,  # c8 - cf 
+1,1,1,1,1,1,1,1,  # d0 - d7 
+1,1,1,1,1,1,1,1,  # d8 - df 
+1,1,1,1,1,1,1,1,  # e0 - e7 
+1,1,1,1,1,1,1,1,  # e8 - ef 
+1,1,1,1,1,1,1,1,  # f0 - f7 
+1,1,1,1,1,1,1,1,  # f8 - ff 
+)
+
+HZ_st = ( \
+eStart,eError,     3,eStart,eStart,eStart,eError,eError,# 00-07 
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f 
+eItsMe,eItsMe,eError,eError,eStart,eStart,     4,eError,# 10-17 
+     5,eError,     6,eError,     5,     5,     4,eError,# 18-1f 
+     4,eError,     4,     4,     4,eError,     4,eError,# 20-27 
+     4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f 
+)
+
+HZCharLenTable = (0, 0, 0, 0, 0, 0)
+
+HZSMModel = {'classTable': HZ_cls,
+             'classFactor': 6,
+             'stateTable': HZ_st,
+             'charLenTable': HZCharLenTable,
+             'name': "HZ-GB-2312"}
+
+ISO2022CN_cls = ( \
+2,0,0,0,0,0,0,0,  # 00 - 07 
+0,0,0,0,0,0,0,0,  # 08 - 0f 
+0,0,0,0,0,0,0,0,  # 10 - 17 
+0,0,0,1,0,0,0,0,  # 18 - 1f 
+0,0,0,0,0,0,0,0,  # 20 - 27 
+0,3,0,0,0,0,0,0,  # 28 - 2f 
+0,0,0,0,0,0,0,0,  # 30 - 37 
+0,0,0,0,0,0,0,0,  # 38 - 3f 
+0,0,0,4,0,0,0,0,  # 40 - 47 
+0,0,0,0,0,0,0,0,  # 48 - 4f 
+0,0,0,0,0,0,0,0,  # 50 - 57 
+0,0,0,0,0,0,0,0,  # 58 - 5f 
+0,0,0,0,0,0,0,0,  # 60 - 67 
+0,0,0,0,0,0,0,0,  # 68 - 6f 
+0,0,0,0,0,0,0,0,  # 70 - 77 
+0,0,0,0,0,0,0,0,  # 78 - 7f 
+2,2,2,2,2,2,2,2,  # 80 - 87 
+2,2,2,2,2,2,2,2,  # 88 - 8f 
+2,2,2,2,2,2,2,2,  # 90 - 97 
+2,2,2,2,2,2,2,2,  # 98 - 9f 
+2,2,2,2,2,2,2,2,  # a0 - a7 
+2,2,2,2,2,2,2,2,  # a8 - af 
+2,2,2,2,2,2,2,2,  # b0 - b7 
+2,2,2,2,2,2,2,2,  # b8 - bf 
+2,2,2,2,2,2,2,2,  # c0 - c7 
+2,2,2,2,2,2,2,2,  # c8 - cf 
+2,2,2,2,2,2,2,2,  # d0 - d7 
+2,2,2,2,2,2,2,2,  # d8 - df 
+2,2,2,2,2,2,2,2,  # e0 - e7 
+2,2,2,2,2,2,2,2,  # e8 - ef 
+2,2,2,2,2,2,2,2,  # f0 - f7 
+2,2,2,2,2,2,2,2,  # f8 - ff 
+)
+
+ISO2022CN_st = ( \
+eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 
+eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f 
+eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 
+eItsMe,eItsMe,eItsMe,eError,eError,eError,     4,eError,# 18-1f 
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 
+     5,     6,eError,eError,eError,eError,eError,eError,# 28-2f 
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 
+eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f 
+)
+
+ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022CNSMModel = {'classTable': ISO2022CN_cls,
+                    'classFactor': 9,
+                    'stateTable': ISO2022CN_st,
+                    'charLenTable': ISO2022CNCharLenTable,
+                    'name': "ISO-2022-CN"}
+
+ISO2022JP_cls = ( \
+2,0,0,0,0,0,0,0,  # 00 - 07 
+0,0,0,0,0,0,2,2,  # 08 - 0f 
+0,0,0,0,0,0,0,0,  # 10 - 17 
+0,0,0,1,0,0,0,0,  # 18 - 1f 
+0,0,0,0,7,0,0,0,  # 20 - 27 
+3,0,0,0,0,0,0,0,  # 28 - 2f 
+0,0,0,0,0,0,0,0,  # 30 - 37 
+0,0,0,0,0,0,0,0,  # 38 - 3f 
+6,0,4,0,8,0,0,0,  # 40 - 47 
+0,9,5,0,0,0,0,0,  # 48 - 4f 
+0,0,0,0,0,0,0,0,  # 50 - 57 
+0,0,0,0,0,0,0,0,  # 58 - 5f 
+0,0,0,0,0,0,0,0,  # 60 - 67 
+0,0,0,0,0,0,0,0,  # 68 - 6f 
+0,0,0,0,0,0,0,0,  # 70 - 77 
+0,0,0,0,0,0,0,0,  # 78 - 7f 
+2,2,2,2,2,2,2,2,  # 80 - 87 
+2,2,2,2,2,2,2,2,  # 88 - 8f 
+2,2,2,2,2,2,2,2,  # 90 - 97 
+2,2,2,2,2,2,2,2,  # 98 - 9f 
+2,2,2,2,2,2,2,2,  # a0 - a7 
+2,2,2,2,2,2,2,2,  # a8 - af 
+2,2,2,2,2,2,2,2,  # b0 - b7 
+2,2,2,2,2,2,2,2,  # b8 - bf 
+2,2,2,2,2,2,2,2,  # c0 - c7 
+2,2,2,2,2,2,2,2,  # c8 - cf 
+2,2,2,2,2,2,2,2,  # d0 - d7 
+2,2,2,2,2,2,2,2,  # d8 - df 
+2,2,2,2,2,2,2,2,  # e0 - e7 
+2,2,2,2,2,2,2,2,  # e8 - ef 
+2,2,2,2,2,2,2,2,  # f0 - f7 
+2,2,2,2,2,2,2,2,  # f8 - ff 
+)
+
+ISO2022JP_st = ( \
+eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 
+eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f 
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 
+eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f 
+eError,     5,eError,eError,eError,     4,eError,eError,# 20-27 
+eError,eError,eError,     6,eItsMe,eError,eItsMe,eError,# 28-2f 
+eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f 
+eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 
+)
+
+ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022JPSMModel = {'classTable': ISO2022JP_cls,
+                    'classFactor': 10,
+                    'stateTable': ISO2022JP_st,
+                    'charLenTable': ISO2022JPCharLenTable,
+                    'name': "ISO-2022-JP"}
+
+ISO2022KR_cls = ( \
+2,0,0,0,0,0,0,0,  # 00 - 07 
+0,0,0,0,0,0,0,0,  # 08 - 0f 
+0,0,0,0,0,0,0,0,  # 10 - 17 
+0,0,0,1,0,0,0,0,  # 18 - 1f 
+0,0,0,0,3,0,0,0,  # 20 - 27 
+0,4,0,0,0,0,0,0,  # 28 - 2f 
+0,0,0,0,0,0,0,0,  # 30 - 37 
+0,0,0,0,0,0,0,0,  # 38 - 3f 
+0,0,0,5,0,0,0,0,  # 40 - 47 
+0,0,0,0,0,0,0,0,  # 48 - 4f 
+0,0,0,0,0,0,0,0,  # 50 - 57 
+0,0,0,0,0,0,0,0,  # 58 - 5f 
+0,0,0,0,0,0,0,0,  # 60 - 67 
+0,0,0,0,0,0,0,0,  # 68 - 6f 
+0,0,0,0,0,0,0,0,  # 70 - 77 
+0,0,0,0,0,0,0,0,  # 78 - 7f 
+2,2,2,2,2,2,2,2,  # 80 - 87 
+2,2,2,2,2,2,2,2,  # 88 - 8f 
+2,2,2,2,2,2,2,2,  # 90 - 97 
+2,2,2,2,2,2,2,2,  # 98 - 9f 
+2,2,2,2,2,2,2,2,  # a0 - a7 
+2,2,2,2,2,2,2,2,  # a8 - af 
+2,2,2,2,2,2,2,2,  # b0 - b7 
+2,2,2,2,2,2,2,2,  # b8 - bf 
+2,2,2,2,2,2,2,2,  # c0 - c7 
+2,2,2,2,2,2,2,2,  # c8 - cf 
+2,2,2,2,2,2,2,2,  # d0 - d7 
+2,2,2,2,2,2,2,2,  # d8 - df 
+2,2,2,2,2,2,2,2,  # e0 - e7 
+2,2,2,2,2,2,2,2,  # e8 - ef 
+2,2,2,2,2,2,2,2,  # f0 - f7 
+2,2,2,2,2,2,2,2,  # f8 - ff 
+)
+
+ISO2022KR_st = ( \
+eStart,     3,eError,eStart,eStart,eStart,eError,eError,# 00-07 
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f 
+eItsMe,eItsMe,eError,eError,eError,     4,eError,eError,# 10-17 
+eError,eError,eError,eError,     5,eError,eError,eError,# 18-1f 
+eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 
+)
+
+ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0)
+
+ISO2022KRSMModel = {'classTable': ISO2022KR_cls,
+                    'classFactor': 6,
+                    'stateTable': ISO2022KR_st,
+                    'charLenTable': ISO2022KRCharLenTable,
+                    'name': "ISO-2022-KR"}
diff --git a/lib/requests/packages/chardet/eucjpprober.py b/lib/requests/packages/chardet/eucjpprober.py
new file mode 100755
index 0000000..46a8b38
--- /dev/null
+++ b/lib/requests/packages/chardet/eucjpprober.py
@@ -0,0 +1,85 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, sys
+from constants import eStart, eError, eItsMe
+from mbcharsetprober import MultiByteCharSetProber
+from codingstatemachine import CodingStateMachine
+from chardistribution import EUCJPDistributionAnalysis
+from jpcntx import EUCJPContextAnalysis
+from mbcssm import EUCJPSMModel
+
+class EUCJPProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCJPSMModel)
+        self._mDistributionAnalyzer = EUCJPDistributionAnalysis()
+        self._mContextAnalyzer = EUCJPContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        MultiByteCharSetProber.reset(self)
+        self._mContextAnalyzer.reset()
+        
+    def get_charset_name(self):
+        return "EUC-JP"
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mContextAnalyzer.feed(self._mLastChar, charLen)
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mContextAnalyzer.feed(aBuf[i-1:i+1], charLen)
+                    self._mDistributionAnalyzer.feed(aBuf[i-1:i+1], charLen)
+                    
+        self._mLastChar[0] = aBuf[aLen - 1]
+        
+        if self.get_state() == constants.eDetecting:
+            if self._mContextAnalyzer.got_enough_data() and \
+                   (self.get_confidence() > constants.SHORTCUT_THRESHOLD):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        contxtCf = self._mContextAnalyzer.get_confidence()
+        distribCf = self._mDistributionAnalyzer.get_confidence()
+        return max(contxtCf, distribCf)
diff --git a/lib/requests/packages/chardet/euckrfreq.py b/lib/requests/packages/chardet/euckrfreq.py
new file mode 100755
index 0000000..1463fa1
--- /dev/null
+++ b/lib/requests/packages/chardet/euckrfreq.py
@@ -0,0 +1,594 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+
+# 128  --> 0.79
+# 256  --> 0.92
+# 512  --> 0.986
+# 1024 --> 0.99944
+# 2048 --> 0.99999
+#
+# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
+# Random Distribution Ration = 512 / (2350-512) = 0.279.
+# 
+# Typical Distribution Ratio  
+
+EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
+
+EUCKR_TABLE_SIZE = 2352
+
+# Char to FreqOrder table , 
+EUCKRCharToFreqOrder = ( \
+  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,
+1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
+1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,
+ 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
+ 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,
+ 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,
+1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
+ 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
+ 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
+1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,
+1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
+1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
+1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
+1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
+ 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
+1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
+1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
+1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
+1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
+ 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
+1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
+ 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
+ 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
+1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
+ 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
+1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,
+ 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
+   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
+1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
+1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,
+1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,
+1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,
+ 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
+1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,
+ 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
+ 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,
+1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
+1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
+1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
+1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
+1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
+1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
+  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
+ 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,
+ 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
+1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
+ 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
+1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,
+ 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,
+ 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
+2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,
+ 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,
+ 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
+2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,
+2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
+2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
+ 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
+ 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
+2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
+ 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
+1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
+2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,
+1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
+2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
+2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
+1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
+ 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
+2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
+2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
+  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,
+ 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
+2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,
+1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
+2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,
+2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
+2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,
+2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
+2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,
+2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,
+1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
+2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
+2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
+2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
+2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
+2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,
+1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
+1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
+2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,
+1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,
+2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
+1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,
+ 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
+2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,
+ 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
+2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
+ 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,
+2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,
+2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,
+ 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
+2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,
+1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
+ 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
+1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
+2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
+1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
+2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
+ 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
+2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
+1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
+2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
+1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
+2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
+1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
+ 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
+2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
+2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
+ 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
+ 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,
+1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
+1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
+ 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
+2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
+2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
+ 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,
+ 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
+ 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
+2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
+  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
+ 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
+2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
+2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
+ 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,
+2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
+1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
+ 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,
+2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
+2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
+2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
+   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,
+ 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
+ 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
+2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,
+2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
+2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
+1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
+2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
+ 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256
+#Everything below is of no interest for detection purpose
+2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,
+2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,
+2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,
+2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704,
+2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,
+2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734,
+2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,
+2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,
+2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,
+2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793,
+2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,
+2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,
+2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,
+2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,
+1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869,
+2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883,
+2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,
+2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,
+2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331,
+2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945,
+2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,
+2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,
+2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,
+2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,
+3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021,
+3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,
+3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052,
+3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,
+3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080,
+3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,
+3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110,
+3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124,
+3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,
+3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,
+3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,
+3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,
+3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,
+3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,
+3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,
+3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,
+3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,
+3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279,
+3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,
+3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,
+3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,
+3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,
+3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,
+3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,
+3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389,
+3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,
+3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338,
+3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432,
+3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446,
+3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191,
+3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471,
+3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,
+1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499,
+1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513,
+3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525,
+3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,
+3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,
+3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,
+3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587,
+3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,
+3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,
+3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632,
+3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,
+3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663,
+3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,
+3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,
+3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583,
+1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722,
+3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,
+3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753,
+3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767,
+3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782,
+3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796,
+3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810,
+3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591,
+1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836,
+3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851,
+3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866,
+3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880,
+3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895,
+1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905,
+3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,
+3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934,
+3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603,
+3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,
+3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978,
+3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993,
+3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,
+4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024,
+4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,
+1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,
+4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069,
+4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083,
+4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,
+4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113,
+4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610,
+4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142,
+4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,
+4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,
+4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,
+4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,
+4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220,
+4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234,
+4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249,
+4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,
+4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279,
+4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294,
+4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,
+4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,
+4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341,
+4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,
+4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371,
+4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,
+4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,
+4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418,
+4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432,
+4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446,
+4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461,
+4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,
+4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491,
+4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,
+4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623,
+4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536,
+4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551,
+4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,
+4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581,
+4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627,
+4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,
+4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,
+4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,
+4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657,
+4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,
+4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687,
+1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700,
+4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715,
+4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,
+4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633,
+4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758,
+4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773,
+4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788,
+4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803,
+4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817,
+4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,
+4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,
+4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,
+4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,
+4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893,
+4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,
+4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923,
+4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938,
+4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,
+4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,
+4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645,
+4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,
+5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078,
+5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028,
+1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042,
+5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056,
+5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,
+5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,
+5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,
+5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118,
+1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132,
+5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,
+5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,
+5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,
+5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,
+5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206,
+1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218,
+5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,
+5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249,
+5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262,
+5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,
+5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,
+5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308,
+5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323,
+5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338,
+5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,
+5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,
+5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,
+5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400,
+5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415,
+5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,
+5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445,
+5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,
+5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,
+5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491,
+5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,
+5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,
+5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,
+5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554,
+5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,
+1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,
+5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600,
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615,
+5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,
+5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,
+5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,
+1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673,
+5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,
+5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703,
+5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716,
+5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729,
+5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744,
+1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758,
+5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773,
+1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786,
+5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801,
+5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,
+5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,
+5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,
+5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862,
+5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876,
+5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889,
+5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,
+5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687,
+5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,
+5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963,
+5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,
+5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,
+5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,
+6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,
+6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,
+6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,
+6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,
+6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086,
+6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,
+6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,
+6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133,
+6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147,
+6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,
+6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,
+6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194,
+6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,
+6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225,
+6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,
+6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256,
+6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271,  #1024
+6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,
+6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699,
+6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,
+6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,
+6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347,
+6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,
+6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,
+6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,
+6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,
+6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425,
+6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440,
+6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,
+6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,
+6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,
+6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266,
+6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,
+6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,
+6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,
+1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,
+6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,
+6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,
+6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613,
+6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629,
+6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644,
+1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659,
+6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,
+1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689,
+6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,
+6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,
+6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,
+1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748,
+6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763,
+6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,
+6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794,
+6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711,
+6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825,
+6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840,
+6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,
+6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872,
+6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888,
+6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903,
+6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918,
+6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,
+6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,
+6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,
+6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981,
+6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996,
+6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,
+7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,
+7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,
+7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,
+7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,
+7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,
+7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,
+7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,
+7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,
+7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,
+7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170,
+7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,
+7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,
+7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216,
+7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232,
+7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248,
+7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,
+7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,
+7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,
+7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312,
+7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,
+7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,
+7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,
+7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,
+7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,
+7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,
+7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423,
+7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,
+7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,
+7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,
+7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,
+7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,
+7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,
+7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,
+7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,
+7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,
+7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,
+7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,
+7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,
+7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,
+7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,
+7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,
+7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,
+7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,
+7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,
+7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,
+7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,
+7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,
+7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,
+7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,
+7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,
+7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,
+7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,
+7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,
+7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,
+7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,
+7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,
+7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,
+7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,
+7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,
+7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,
+7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,
+7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,
+8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,
+8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031,
+8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,
+8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,
+8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,
+8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,
+8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,
+8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127,
+8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,
+8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,
+8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,
+8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,
+8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,
+8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,
+8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,
+8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,
+8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,
+8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,
+8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,
+8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,
+8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,
+8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,
+8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,
+8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,
+8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,
+8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,
+8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,
+8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,
+8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,
+8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,
+8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,
+8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,
+8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,
+8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,
+8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,
+8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,
+8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,
+8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,
+8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,
+8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,
+8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,
+8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,
+8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,
+8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,
+8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,
+8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,
+8736,8737,8738,8739,8740,8741)
diff --git a/lib/requests/packages/chardet/euckrprober.py b/lib/requests/packages/chardet/euckrprober.py
new file mode 100755
index 0000000..bd697eb
--- /dev/null
+++ b/lib/requests/packages/chardet/euckrprober.py
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from mbcharsetprober import MultiByteCharSetProber
+from codingstatemachine import CodingStateMachine
+from chardistribution import EUCKRDistributionAnalysis
+from mbcssm import EUCKRSMModel
+
+class EUCKRProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCKRSMModel)
+        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "EUC-KR"
diff --git a/lib/requests/packages/chardet/euctwfreq.py b/lib/requests/packages/chardet/euctwfreq.py
new file mode 100755
index 0000000..c057209
--- /dev/null
+++ b/lib/requests/packages/chardet/euctwfreq.py
@@ -0,0 +1,426 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# EUCTW frequency table
+# Converted from big5 work 
+# by Taiwan's Mandarin Promotion Council 
+# <http:#www.edu.tw:81/mandr/>
+
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+#
+# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+# 
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+# Char to FreqOrder table , 
+EUCTW_TABLE_SIZE = 8102
+
+EUCTWCharToFreqOrder = ( \
+   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110, # 2742
+3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643, # 2758
+1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931, # 2774
+  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790
+3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806
+4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604, # 2822
+7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80, # 2838
+ 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591, # 2854
+ 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870
+ 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886
+2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732, # 2902
+1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918
+3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934
+ 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246, # 2950
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966
+3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897, # 2982
+2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300, # 2998
+ 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014
+3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030
+1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046
+7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212, # 3062
+ 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876, # 3078
+7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029, # 3094
+1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305, # 3110
+  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788, # 3126
+ 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142
+3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794, # 3158
+3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707, # 3174
+ 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190
+2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346, # 3206
+2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222
+ 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238
+ 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254
+3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270
+1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286
+1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302
+1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7, # 3318
+2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334
+ 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350
+4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366
+1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382
+7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398
+2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414
+ 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430
+  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446
+ 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592, # 3462
+ 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478
+7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258, # 3494
+ 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510
+1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372, # 3526
+ 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542
+ 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558
+7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574
+1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590
+ 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606
+3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622
+4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638
+3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654
+ 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670
+ 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686
+1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702
+4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680, # 3718
+3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734
+3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750
+2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766
+7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809, # 3782
+3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798
+7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814
+1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830
+2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846
+1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862
+  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878
+1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894
+4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910
+3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926
+ 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942
+ 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816, # 3958
+ 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974
+2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990
+7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006
+1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022
+2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038
+1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054
+1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070
+7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086
+7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102
+7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118
+3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134
+4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150
+1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166
+7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182
+2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198
+7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214
+3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230
+3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473, # 4246
+7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262
+2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278
+7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294
+ 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310
+4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326
+2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342
+7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358
+3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374
+2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390
+2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366, # 4406
+ 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422
+2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438
+1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454
+1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470
+2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486
+1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502
+7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518
+7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534
+2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550
+4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566
+1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122, # 4582
+7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598
+ 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614
+4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630
+ 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646
+2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662
+ 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678
+1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694
+1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710
+ 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726
+3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742
+3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758
+1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774
+3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790
+7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806
+7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545, # 4822
+1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838
+2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854
+1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870
+3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886
+2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902
+3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918
+2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934
+4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950
+4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966
+3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982
+  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998
+3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014
+ 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030
+3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046
+3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062
+3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078
+1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094
+7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110
+ 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126
+7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142
+1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158
+ 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174
+4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730, # 5190
+3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206
+ 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222
+2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238
+2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686, # 5254
+3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270
+1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286
+4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302
+2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318
+1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334
+1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350
+2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366
+3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382
+1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398
+7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141, # 5414
+1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430
+4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625, # 5446
+1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462
+ 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478
+1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494
+3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510
+3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526
+2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542
+1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558
+4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574
+ 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590
+7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606
+2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622
+3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638
+4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654
+ 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670
+7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686
+7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702
+1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718
+4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734
+3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750
+2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590, # 5766
+3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782
+3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798
+2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814
+1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830
+4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846
+3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862
+3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878
+2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894
+4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977, # 5910
+7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926
+3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942
+2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958
+3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974
+1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990
+2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006
+3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022
+4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090, # 6038
+2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054
+2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070
+7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086
+1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102
+2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118
+1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134
+3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150
+4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838, # 6166
+2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182
+3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198
+3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214
+2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230
+4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246
+2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262
+3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278
+4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294
+7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310
+3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326
+ 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342
+1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632, # 6358
+4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374
+1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390
+4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769, # 6406
+7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422
+ 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438
+7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454
+2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470
+1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486
+1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502
+3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518
+ 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534
+ 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550
+ 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566
+3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582
+2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598
+ 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614
+7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630
+1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646
+3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662
+7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678
+1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694
+7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710
+4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726
+1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742
+2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758
+2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774
+4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790
+ 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806
+ 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822
+3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838
+3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854
+1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870
+2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886
+7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902
+1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918
+1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934
+3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950
+ 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966
+1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982
+4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998
+7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014
+2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030
+3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046
+ 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062
+1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078
+2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094
+2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110
+7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126
+7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142
+7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158
+2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174
+2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190
+1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206
+4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222
+3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238
+3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254
+4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270
+4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286
+2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302
+2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318
+7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334
+4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350
+7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366
+2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382
+1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398
+3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414
+4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430
+2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446
+ 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462
+2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478
+1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494
+2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510
+2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526
+4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542
+7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558
+1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574
+3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590
+7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606
+1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622
+8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638
+2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654
+8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670
+2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686
+2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702
+8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718
+8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734
+8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750
+ 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766
+8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782
+4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798
+3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814
+8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830
+1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846
+8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862
+ 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878
+1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894
+ 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910
+4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926
+1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942
+4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958
+1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974
+ 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990
+3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006
+4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022
+8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038
+ 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054
+3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070
+ 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086
+2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102
+#Everything below is of no interest for detection purpose
+2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118
+2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134
+8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150
+8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166
+8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182
+8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198
+8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214
+8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230
+8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246
+8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262
+8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278
+8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294
+8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310
+8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326
+8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342
+8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358
+8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374
+8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390
+8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406
+8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422
+8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438
+8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454
+8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470
+8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486
+8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502
+8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518
+8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534
+8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550
+8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566
+8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582
+8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598
+8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614
+8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630
+8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646
+8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662
+8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678
+8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694
+8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710
+8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726
+8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742
diff --git a/lib/requests/packages/chardet/euctwprober.py b/lib/requests/packages/chardet/euctwprober.py
new file mode 100755
index 0000000..b073f13
--- /dev/null
+++ b/lib/requests/packages/chardet/euctwprober.py
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from mbcharsetprober import MultiByteCharSetProber
+from codingstatemachine import CodingStateMachine
+from chardistribution import EUCTWDistributionAnalysis
+from mbcssm import EUCTWSMModel
+
+class EUCTWProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCTWSMModel)
+        self._mDistributionAnalyzer = EUCTWDistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "EUC-TW"
diff --git a/lib/requests/packages/chardet/gb2312freq.py b/lib/requests/packages/chardet/gb2312freq.py
new file mode 100755
index 0000000..7a4d5a1
--- /dev/null
+++ b/lib/requests/packages/chardet/gb2312freq.py
@@ -0,0 +1,471 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# GB2312 most frequently used character table
+#
+# Char to FreqOrder table , from hz6763
+
+# 512  --> 0.79  -- 0.79
+# 1024 --> 0.92  -- 0.13
+# 2048 --> 0.98  -- 0.06
+# 6768 --> 1.00  -- 0.02
+#
+# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
+# Random Distribution Ration = 512 / (3755 - 512) = 0.157
+# 
+# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
+
+GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
+
+GB2312_TABLE_SIZE = 3760
+
+GB2312CharToFreqOrder = ( \
+1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
+2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
+2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
+ 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
+1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
+1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
+ 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
+1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,
+2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
+3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
+ 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
+1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
+ 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
+2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,
+ 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
+2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
+1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
+3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,
+ 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
+1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
+ 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
+2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
+1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,
+3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
+1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
+2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
+1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
+ 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
+3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,
+3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
+ 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
+3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,
+ 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,
+1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
+3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
+2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,
+1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
+ 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
+1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,
+4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
+ 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
+3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,
+3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,
+ 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
+1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,
+2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
+1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
+1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
+ 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
+3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
+3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,
+4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
+ 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
+3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,
+1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
+1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
+4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
+ 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
+ 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,
+3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
+1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
+ 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,
+1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
+2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,
+ 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
+ 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,
+ 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
+3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
+4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,
+3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
+ 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
+2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
+2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,
+2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,
+ 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
+2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
+ 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,
+ 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
+ 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
+3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
+2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
+2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,
+1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
+  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
+2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
+  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
+ 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
+1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
+1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,
+ 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
+ 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
+1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
+2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
+3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
+2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
+2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
+2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
+3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
+1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,
+1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
+2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
+1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
+3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,
+1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
+1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
+3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
+ 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
+2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
+1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
+4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
+1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
+1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
+3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
+1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
+  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
+ 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,
+1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,
+ 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
+1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
+1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
+ 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
+3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
+4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
+3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
+2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
+2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
+1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
+3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
+2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
+1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
+1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,
+ 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
+2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
+2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
+3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
+4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
+3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
+ 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
+3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
+2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
+1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,
+ 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,
+ 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
+3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,
+4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
+2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
+1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
+1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
+ 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
+1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,
+3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
+ 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
+ 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,
+1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,
+  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
+1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,
+ 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
+2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
+ 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
+2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
+2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
+1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
+1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
+2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
+ 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
+1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
+1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
+2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
+2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,
+3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
+1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
+4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
+ 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
+ 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
+3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,
+1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,
+ 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,
+3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
+1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
+4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
+1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
+2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
+1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
+ 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
+1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
+3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,
+ 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
+2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
+ 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
+1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
+1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,
+1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
+3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
+2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
+3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
+3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
+3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
+ 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
+2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
+ 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
+2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
+  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
+1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,
+ 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
+ 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
+1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
+3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
+3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,
+1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,
+1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
+3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
+2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
+2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
+1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,
+3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
+ 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
+4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
+1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
+2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,
+3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
+3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
+1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,
+ 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
+ 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
+2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
+ 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,
+1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,
+ 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
+1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,
+1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
+1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
+1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,
+1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
+ 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
+ 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  # last 512
+#Everything below is of no interest for detection purpose
+5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636,
+5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874,
+5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278,
+3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806,
+4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827,
+5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512,
+5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578,
+4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828,
+4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105,
+4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189,
+4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561,
+3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226,
+6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778,
+4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039,
+6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404,
+4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213,
+4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739,
+4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328,
+5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592,
+3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424,
+4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270,
+3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232,
+4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456,
+4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121,
+6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971,
+6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409,
+5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519,
+4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367,
+6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834,
+4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460,
+5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464,
+5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709,
+5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906,
+6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530,
+3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262,
+6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920,
+4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190,
+5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318,
+6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538,
+6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697,
+4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544,
+5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016,
+4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638,
+5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006,
+5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071,
+4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552,
+4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556,
+5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432,
+4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632,
+4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885,
+5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336,
+4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729,
+4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854,
+4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332,
+5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004,
+5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419,
+4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293,
+3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580,
+4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339,
+6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341,
+5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493,
+5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046,
+4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904,
+6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728,
+5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350,
+6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233,
+4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944,
+5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413,
+5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700,
+3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999,
+5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694,
+6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571,
+4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359,
+6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178,
+4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421,
+4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330,
+6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855,
+3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587,
+6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803,
+4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791,
+3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304,
+3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445,
+3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506,
+4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856,
+2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057,
+5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777,
+4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369,
+5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028,
+5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914,
+5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175,
+4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681,
+5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534,
+4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912,
+5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054,
+1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336,
+3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666,
+4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375,
+4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113,
+6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614,
+4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173,
+5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197,
+3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271,
+5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423,
+5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529,
+5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921,
+3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837,
+5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922,
+5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187,
+3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382,
+5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628,
+5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683,
+5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053,
+6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928,
+4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662,
+6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663,
+4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554,
+3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191,
+4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013,
+5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932,
+5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055,
+5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829,
+3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096,
+3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660,
+6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199,
+6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748,
+5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402,
+6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957,
+6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668,
+6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763,
+6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407,
+6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051,
+5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429,
+6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791,
+6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028,
+3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305,
+3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159,
+4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683,
+4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372,
+3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514,
+5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544,
+5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472,
+5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716,
+5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905,
+5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327,
+4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030,
+5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281,
+6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224,
+5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327,
+4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062,
+4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354,
+6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065,
+3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953,
+4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681,
+4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708,
+5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442,
+6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387,
+6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237,
+4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713,
+6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547,
+5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957,
+5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337,
+5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074,
+5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685,
+5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455,
+4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722,
+5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615,
+5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093,
+5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989,
+5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094,
+6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212,
+4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967,
+5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733,
+4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260,
+4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864,
+6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353,
+4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095,
+6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287,
+3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504,
+5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539,
+6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750,
+6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864,
+6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213,
+5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573,
+6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252,
+6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970,
+3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703,
+5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978,
+4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767)
+
diff --git a/lib/requests/packages/chardet/gb2312prober.py b/lib/requests/packages/chardet/gb2312prober.py
new file mode 100755
index 0000000..91eb392
--- /dev/null
+++ b/lib/requests/packages/chardet/gb2312prober.py
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from mbcharsetprober import MultiByteCharSetProber
+from codingstatemachine import CodingStateMachine
+from chardistribution import GB2312DistributionAnalysis
+from mbcssm import GB2312SMModel
+
+class GB2312Prober(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(GB2312SMModel)
+        self._mDistributionAnalyzer = GB2312DistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "GB2312"
diff --git a/lib/requests/packages/chardet/hebrewprober.py b/lib/requests/packages/chardet/hebrewprober.py
new file mode 100755
index 0000000..a2b1eaa
--- /dev/null
+++ b/lib/requests/packages/chardet/hebrewprober.py
@@ -0,0 +1,269 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Shy Shalom
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from charsetprober import CharSetProber
+import constants
+
+# This prober doesn't actually recognize a language or a charset.
+# It is a helper prober for the use of the Hebrew model probers
+
+### General ideas of the Hebrew charset recognition ###
+#
+# Four main charsets exist in Hebrew:
+# "ISO-8859-8" - Visual Hebrew
+# "windows-1255" - Logical Hebrew 
+# "ISO-8859-8-I" - Logical Hebrew
+# "x-mac-hebrew" - ?? Logical Hebrew ??
+#
+# Both "ISO" charsets use a completely identical set of code points, whereas
+# "windows-1255" and "x-mac-hebrew" are two different proper supersets of 
+# these code points. windows-1255 defines additional characters in the range
+# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific 
+# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
+# x-mac-hebrew defines similar additional code points but with a different 
+# mapping.
+#
+# As far as an average Hebrew text with no diacritics is concerned, all four 
+# charsets are identical with respect to code points. Meaning that for the 
+# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters 
+# (including final letters).
+#
+# The dominant difference between these charsets is their directionality.
+# "Visual" directionality means that the text is ordered as if the renderer is
+# not aware of a BIDI rendering algorithm. The renderer sees the text and 
+# draws it from left to right. The text itself when ordered naturally is read 
+# backwards. A buffer of Visual Hebrew generally looks like so:
+# "[last word of first line spelled backwards] [whole line ordered backwards
+# and spelled backwards] [first word of first line spelled backwards] 
+# [end of line] [last word of second line] ... etc' "
+# adding punctuation marks, numbers and English text to visual text is
+# naturally also "visual" and from left to right.
+# 
+# "Logical" directionality means the text is ordered "naturally" according to
+# the order it is read. It is the responsibility of the renderer to display 
+# the text from right to left. A BIDI algorithm is used to place general 
+# punctuation marks, numbers and English text in the text.
+#
+# Texts in x-mac-hebrew are almost impossible to find on the Internet. From 
+# what little evidence I could find, it seems that its general directionality
+# is Logical.
+#
+# To sum up all of the above, the Hebrew probing mechanism knows about two
+# charsets:
+# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
+#    backwards while line order is natural. For charset recognition purposes
+#    the line order is unimportant (In fact, for this implementation, even 
+#    word order is unimportant).
+# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
+#
+# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be 
+#    specifically identified.
+# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
+#    that contain special punctuation marks or diacritics is displayed with
+#    some unconverted characters showing as question marks. This problem might
+#    be corrected using another model prober for x-mac-hebrew. Due to the fact
+#    that x-mac-hebrew texts are so rare, writing another model prober isn't 
+#    worth the effort and performance hit.
+#
+#### The Prober ####
+#
+# The prober is divided between two SBCharSetProbers and a HebrewProber,
+# all of which are managed, created, fed data, inquired and deleted by the
+# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
+# fact some kind of Hebrew, Logical or Visual. The final decision about which
+# one is it is made by the HebrewProber by combining final-letter scores
+# with the scores of the two SBCharSetProbers to produce a final answer.
+#
+# The SBCSGroupProber is responsible for stripping the original text of HTML
+# tags, English characters, numbers, low-ASCII punctuation characters, spaces
+# and new lines. It reduces any sequence of such characters to a single space.
+# The buffer fed to each prober in the SBCS group prober is pure text in
+# high-ASCII.
+# The two SBCharSetProbers (model probers) share the same language model:
+# Win1255Model.
+# The first SBCharSetProber uses the model normally as any other
+# SBCharSetProber does, to recognize windows-1255, upon which this model was
+# built. The second SBCharSetProber is told to make the pair-of-letter
+# lookup in the language model backwards. This in practice exactly simulates
+# a visual Hebrew model using the windows-1255 logical Hebrew model.
+#
+# The HebrewProber is not using any language model. All it does is look for
+# final-letter evidence suggesting the text is either logical Hebrew or visual
+# Hebrew. Disjointed from the model probers, the results of the HebrewProber
+# alone are meaningless. HebrewProber always returns 0.00 as confidence
+# since it never identifies a charset by itself. Instead, the pointer to the
+# HebrewProber is passed to the model probers as a helper "Name Prober".
+# When the Group prober receives a positive identification from any prober,
+# it asks for the name of the charset identified. If the prober queried is a
+# Hebrew model prober, the model prober forwards the call to the
+# HebrewProber to make the final decision. In the HebrewProber, the
+# decision is made according to the final-letters scores maintained and Both
+# model probers scores. The answer is returned in the form of the name of the
+# charset identified, either "windows-1255" or "ISO-8859-8".
+
+# windows-1255 / ISO-8859-8 code points of interest
+FINAL_KAF = '\xea'
+NORMAL_KAF = '\xeb'
+FINAL_MEM = '\xed'
+NORMAL_MEM = '\xee'
+FINAL_NUN = '\xef'
+NORMAL_NUN = '\xf0'
+FINAL_PE = '\xf3'
+NORMAL_PE = '\xf4'
+FINAL_TSADI = '\xf5'
+NORMAL_TSADI = '\xf6'
+
+# Minimum Visual vs Logical final letter score difference.
+# If the difference is below this, don't rely solely on the final letter score distance.
+MIN_FINAL_CHAR_DISTANCE = 5
+
+# Minimum Visual vs Logical model score difference.
+# If the difference is below this, don't rely at all on the model score distance.
+MIN_MODEL_DISTANCE = 0.01
+
+VISUAL_HEBREW_NAME = "ISO-8859-8"
+LOGICAL_HEBREW_NAME = "windows-1255"
+
+class HebrewProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mLogicalProber = None
+        self._mVisualProber = None
+        self.reset()
+
+    def reset(self):
+        self._mFinalCharLogicalScore = 0
+        self._mFinalCharVisualScore = 0
+        # The two last characters seen in the previous buffer,
+        # mPrev and mBeforePrev are initialized to space in order to simulate a word 
+        # delimiter at the beginning of the data
+        self._mPrev = ' '
+        self._mBeforePrev = ' '
+        # These probers are owned by the group prober.
+        
+    def set_model_probers(self, logicalProber, visualProber):
+        self._mLogicalProber = logicalProber
+        self._mVisualProber = visualProber
+
+    def is_final(self, c):
+        return c in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, FINAL_TSADI]
+
+    def is_non_final(self, c):
+        # The normal Tsadi is not a good Non-Final letter due to words like 
+        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This 
+        # apostrophe is converted to a space in FilterWithoutEnglishLetters causing 
+        # the Non-Final tsadi to appear at an end of a word even though this is not 
+        # the case in the original text.
+        # The letters Pe and Kaf rarely display a related behavior of not being a 
+        # good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for 
+        # example legally end with a Non-Final Pe or Kaf. However, the benefit of 
+        # these letters as Non-Final letters outweighs the damage since these words 
+        # are quite rare.
+        return c in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE]
+    
+    def feed(self, aBuf):
+        # Final letter analysis for logical-visual decision.
+        # Look for evidence that the received buffer is either logical Hebrew or 
+        # visual Hebrew.
+        # The following cases are checked:
+        # 1) A word longer than 1 letter, ending with a final letter. This is an 
+        #    indication that the text is laid out "naturally" since the final letter 
+        #    really appears at the end. +1 for logical score.
+        # 2) A word longer than 1 letter, ending with a Non-Final letter. In normal
+        #    Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with
+        #    the Non-Final form of that letter. Exceptions to this rule are mentioned
+        #    above in isNonFinal(). This is an indication that the text is laid out
+        #    backwards. +1 for visual score
+        # 3) A word longer than 1 letter, starting with a final letter. Final letters 
+        #    should not appear at the beginning of a word. This is an indication that 
+        #    the text is laid out backwards. +1 for visual score.
+        # 
+        # The visual score and logical score are accumulated throughout the text and 
+        # are finally checked against each other in GetCharSetName().
+        # No checking for final letters in the middle of words is done since that case
+        # is not an indication for either Logical or Visual text.
+        # 
+        # We automatically filter out all 7-bit characters (replace them with spaces)
+        # so the word boundary detection works properly. [MAP]
+
+        if self.get_state() == constants.eNotMe:
+            # Both model probers say it's not them. No reason to continue.
+            return constants.eNotMe
+
+        aBuf = self.filter_high_bit_only(aBuf)
+        
+        for cur in aBuf:
+            if cur == ' ':
+                # We stand on a space - a word just ended
+                if self._mBeforePrev != ' ':
+                    # next-to-last char was not a space so self._mPrev is not a 1 letter word
+                    if self.is_final(self._mPrev):
+                        # case (1) [-2:not space][-1:final letter][cur:space]
+                        self._mFinalCharLogicalScore += 1
+                    elif self.is_non_final(self._mPrev):
+                        # case (2) [-2:not space][-1:Non-Final letter][cur:space]
+                        self._mFinalCharVisualScore += 1
+            else:
+                # Not standing on a space
+                if (self._mBeforePrev == ' ') and (self.is_final(self._mPrev)) and (cur != ' '):
+                    # case (3) [-2:space][-1:final letter][cur:not space]
+                    self._mFinalCharVisualScore += 1
+            self._mBeforePrev = self._mPrev
+            self._mPrev = cur
+
+        # Forever detecting, till the end or until both model probers return eNotMe (handled above)
+        return constants.eDetecting
+
+    def get_charset_name(self):
+        # Make the decision: is it Logical or Visual?
+        # If the final letter score distance is dominant enough, rely on it.
+        finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore
+        if finalsub >= MIN_FINAL_CHAR_DISTANCE:
+            return LOGICAL_HEBREW_NAME
+        if finalsub <= -MIN_FINAL_CHAR_DISTANCE:
+            return VISUAL_HEBREW_NAME
+
+        # It's not dominant enough, try to rely on the model scores instead.
+        modelsub = self._mLogicalProber.get_confidence() - self._mVisualProber.get_confidence()
+        if modelsub > MIN_MODEL_DISTANCE:
+            return LOGICAL_HEBREW_NAME
+        if modelsub < -MIN_MODEL_DISTANCE:
+            return VISUAL_HEBREW_NAME
+
+        # Still no good, back to final letter distance, maybe it'll save the day.
+        if finalsub < 0.0:
+            return VISUAL_HEBREW_NAME
+
+        # (finalsub > 0 - Logical) or (don't know what to do) default to Logical.
+        return LOGICAL_HEBREW_NAME
+
+    def get_state(self):
+        # Remain active as long as any of the model probers are active.
+        if (self._mLogicalProber.get_state() == constants.eNotMe) and \
+           (self._mVisualProber.get_state() == constants.eNotMe):
+            return constants.eNotMe
+        return constants.eDetecting
diff --git a/lib/requests/packages/chardet/jisfreq.py b/lib/requests/packages/chardet/jisfreq.py
new file mode 100755
index 0000000..5fe4a5c
--- /dev/null
+++ b/lib/requests/packages/chardet/jisfreq.py
@@ -0,0 +1,567 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+#
+# Japanese frequency table, applied to both S-JIS and EUC-JP
+# They are sorted in order. 
+
+# 128  --> 0.77094
+# 256  --> 0.85710
+# 512  --> 0.92635
+# 1024 --> 0.97130
+# 2048 --> 0.99431
+#
+# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
+# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
+# 
+# Typical Distribution Ratio, 25% of IDR 
+
+JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
+
+# Char to FreqOrder table , 
+JIS_TABLE_SIZE = 4368
+
+JISCharToFreqOrder = ( \
+  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16
+3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32
+1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48
+2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64
+2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80
+5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96
+1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112
+5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128
+5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144
+5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160
+5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176
+5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192
+5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208
+1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224
+1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240
+1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256
+2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272
+3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288
+3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304
+   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320
+  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336
+1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352
+ 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368
+5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384
+ 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400
+  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416
+  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432
+ 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448
+  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464
+5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480
+5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496
+5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512
+4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528
+5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544
+5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560
+5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576
+5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592
+5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608
+5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624
+5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640
+5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656
+5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672
+3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688
+5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704
+5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720
+5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736
+5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752
+5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768
+5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784
+5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800
+5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816
+5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832
+5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848
+5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864
+5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880
+5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912
+5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928
+5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944
+5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960
+5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976
+5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992
+5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
+5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
+5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
+5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
+5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
+5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
+5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
+5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
+5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
+5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
+5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
+5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
+5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
+5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
+5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
+5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
+5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
+5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
+6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
+6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
+6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
+6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
+6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
+6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
+6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
+6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
+4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
+ 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
+ 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
+1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488
+1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
+ 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
+3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
+3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
+ 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
+3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
+3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
+ 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
+2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
+ 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
+3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
+1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
+ 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
+1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
+ 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
+2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
+2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
+2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
+2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
+1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
+1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
+1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
+1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
+2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
+1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
+2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
+1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
+1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
+1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
+1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
+1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
+1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
+ 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
+ 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
+1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
+2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
+2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
+2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
+3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
+3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
+ 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
+3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
+1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176
+ 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
+2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
+1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
+ 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
+3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
+4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
+2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
+1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
+2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
+1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
+ 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
+ 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
+1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
+2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
+2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
+2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
+3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
+1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
+2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
+ 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
+ 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
+ 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
+1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544
+2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
+ 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
+1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
+1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
+ 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
+1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
+1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
+1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
+ 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
+2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
+ 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
+2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
+3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
+2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
+1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
+6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800
+1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
+2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
+1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
+ 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
+  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
+3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
+3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
+1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
+1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
+1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
+1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
+ 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
+ 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
+2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
+ 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
+3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
+2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
+ 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
+1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
+2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
+ 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
+1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
+ 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
+4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
+2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
+1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
+ 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
+1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
+2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
+ 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
+6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
+1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
+1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
+2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
+3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
+ 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
+3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
+1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
+ 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
+1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
+ 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
+3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
+ 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
+2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
+ 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
+4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
+2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
+1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
+1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
+1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
+ 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
+1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
+3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
+1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
+3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
+ 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
+ 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
+ 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
+2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
+1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
+ 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
+1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
+ 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
+1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
+ 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
+ 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
+ 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872
+1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
+1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
+2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
+4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
+ 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952
+1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
+ 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
+1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
+3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
+1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
+2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
+2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
+1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
+1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
+2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
+ 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
+2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
+1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
+1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
+1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192
+1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
+3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
+2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
+2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
+ 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
+3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
+3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
+1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
+2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
+1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
+2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512
+#Everything below is of no interest for detection purpose
+2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384
+6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400
+6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416
+6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432
+6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448
+4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464
+4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480
+3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496
+3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512
+4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528
+3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544
+6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560
+4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576
+6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592
+6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608
+6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624
+6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640
+6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656
+6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672
+3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688
+3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704
+6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720
+2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736
+4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752
+4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768
+4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784
+6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800
+3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816
+4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832
+4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848
+6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864
+4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880
+6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896
+3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912
+2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928
+4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944
+2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960
+6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976
+4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992
+6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008
+6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024
+6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040
+4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056
+6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072
+2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088
+6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104
+4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120
+6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136
+4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152
+4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168
+6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184
+6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200
+6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216
+3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232
+1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248
+3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264
+3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280
+4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296
+6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312
+3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328
+6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344
+3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360
+3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376
+2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392
+6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408
+6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424
+3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440
+6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456
+3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472
+6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488
+6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504
+6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520
+4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536
+6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552
+4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568
+3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584
+3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600
+6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616
+6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632
+4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648
+6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664
+6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680
+6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696
+6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712
+6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728
+6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744
+4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760
+4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776
+3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792
+6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808
+4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824
+2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840
+6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856
+6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872
+4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888
+2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904
+4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920
+2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936
+4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952
+4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968
+4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984
+6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000
+3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016
+6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032
+3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048
+6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064
+2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080
+3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096
+7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112
+2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128
+3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144
+3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160
+3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176
+3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192
+7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208
+7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224
+7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240
+7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256
+7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272
+4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288
+3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304
+3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320
+4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336
+3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352
+3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368
+7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384
+4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400
+7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416
+7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432
+7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448
+7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464
+7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480
+4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496
+4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512
+7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528
+3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544
+4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560
+7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576
+7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592
+4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608
+3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624
+3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640
+7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656
+4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672
+4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688
+4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704
+4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720
+4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736
+4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752
+7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768
+7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784
+7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800
+7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816
+7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832
+2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848
+3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864
+7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880
+7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896
+3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912
+4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928
+3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944
+3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960
+2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976
+7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992
+7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008
+4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024
+3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040
+3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056
+7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072
+7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088
+7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104
+4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120
+7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136
+2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152
+3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168
+4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184
+7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200
+4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216
+4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232
+7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248
+7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264
+5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280
+7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296
+7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312
+7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328
+7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344
+7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360
+5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376
+5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392
+7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408
+3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424
+7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440
+7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456
+3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472
+7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488
+7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504
+1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520
+3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536
+4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552
+2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568
+3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584
+2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600
+5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616
+4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632
+4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648
+5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664
+7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680
+7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696
+7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712
+7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728
+3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744
+7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760
+3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776
+7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792
+4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808
+7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824
+7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840
+7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856
+7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872
+7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888
+7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904
+7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920
+7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936
+7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952
+7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968
+7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984
+7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000
+8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016
+8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032
+8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048
+8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064
+8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080
+8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096
+8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112
+8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128
+8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144
+8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160
+8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176
+8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192
+8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208
+8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224
+8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240
+8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256
+8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272
diff --git a/lib/requests/packages/chardet/jpcntx.py b/lib/requests/packages/chardet/jpcntx.py
new file mode 100755
index 0000000..93db4a9
--- /dev/null
+++ b/lib/requests/packages/chardet/jpcntx.py
@@ -0,0 +1,210 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants
+
+NUM_OF_CATEGORY = 6
+DONT_KNOW = -1
+ENOUGH_REL_THRESHOLD = 100
+MAX_REL_THRESHOLD = 1000
+MINIMUM_DATA_THRESHOLD = 4
+
+# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
+jp2CharContext = ( \
+(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
+(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),
+(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
+(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),
+(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),
+(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),
+(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),
+(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),
+(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),
+(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),
+(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),
+(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),
+(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),
+(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),
+(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),
+(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),
+(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),
+(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),
+(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),
+(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),
+(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),
+(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),
+(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),
+(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),
+(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),
+(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),
+(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),
+(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),
+(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
+(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),
+(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),
+(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),
+(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),
+(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),
+(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),
+(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),
+(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),
+(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),
+(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),
+(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),
+(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),
+(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),
+(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2),
+(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),
+(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),
+(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),
+(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),
+(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),
+(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),
+(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),
+(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),
+(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3),
+(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),
+(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),
+(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3),
+(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),
+(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),
+(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),
+(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),
+(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),
+(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),
+(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),
+(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2),
+(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),
+(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),
+(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),
+(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),
+(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),
+(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),
+(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),
+(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),
+(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),
+(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),
+(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),
+)
+
+class JapaneseContextAnalysis:
+    def __init__(self):
+        self.reset()
+        
+    def reset(self):
+        self._mTotalRel = 0 # total sequence received
+        self._mRelSample = [0] * NUM_OF_CATEGORY # category counters, each interger counts sequence in its category
+        self._mNeedToSkipCharNum = 0 # if last byte in current buffer is not the last byte of a character, we need to know how many bytes to skip in next buffer
+        self._mLastCharOrder = -1 # The order of previous char
+        self._mDone = constants.False # If this flag is set to constants.True, detection is done and conclusion has been made
+
+    def feed(self, aBuf, aLen):
+        if self._mDone: return
+        
+        # The buffer we got is byte oriented, and a character may span in more than one
+        # buffers. In case the last one or two byte in last buffer is not complete, we 
+        # record how many byte needed to complete that character and skip these bytes here.
+        # We can choose to record those bytes as well and analyse the character once it 
+        # is complete, but since a character will not make much difference, by simply skipping
+        # this character will simply our logic and improve performance.
+        i = self._mNeedToSkipCharNum
+        while i < aLen:
+            order, charLen = self.get_order(aBuf[i:i+2])
+            i += charLen
+            if i > aLen:
+                self._mNeedToSkipCharNum = i - aLen
+                self._mLastCharOrder = -1
+            else:
+                if (order != -1) and (self._mLastCharOrder != -1):
+                    self._mTotalRel += 1
+                    if self._mTotalRel > MAX_REL_THRESHOLD:
+                        self._mDone = constants.True
+                        break
+                    self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1
+                self._mLastCharOrder = order
+
+    def got_enough_data(self):
+        return self._mTotalRel > ENOUGH_REL_THRESHOLD
+    
+    def get_confidence(self):
+        # This is just one way to calculate confidence. It works well for me.
+        if self._mTotalRel > MINIMUM_DATA_THRESHOLD:
+            return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel
+        else:
+            return DONT_KNOW
+
+    def get_order(self, aStr):
+        return -1, 1
+        
+class SJISContextAnalysis(JapaneseContextAnalysis):
+    def get_order(self, aStr):
+        if not aStr: return -1, 1
+        # find out current char's byte length
+        if ((aStr[0] >= '\x81') and (aStr[0] <= '\x9F')) or \
+           ((aStr[0] >= '\xE0') and (aStr[0] <= '\xFC')):
+            charLen = 2
+        else:
+            charLen = 1
+
+        # return its order if it is hiragana
+        if len(aStr) > 1:
+            if (aStr[0] == '\202') and \
+               (aStr[1] >= '\x9F') and \
+               (aStr[1] <= '\xF1'):
+                return ord(aStr[1]) - 0x9F, charLen
+
+        return -1, charLen
+
+class EUCJPContextAnalysis(JapaneseContextAnalysis):
+    def get_order(self, aStr):
+        if not aStr: return -1, 1
+        # find out current char's byte length
+        if (aStr[0] == '\x8E') or \
+           ((aStr[0] >= '\xA1') and (aStr[0] <= '\xFE')):
+            charLen = 2
+        elif aStr[0] == '\x8F':
+            charLen = 3
+        else:
+            charLen = 1
+
+        # return its order if it is hiragana
+        if len(aStr) > 1:
+            if (aStr[0] == '\xA4') and \
+               (aStr[1] >= '\xA1') and \
+               (aStr[1] <= '\xF3'):
+                return ord(aStr[1]) - 0xA1, charLen
+
+        return -1, charLen
diff --git a/lib/requests/packages/chardet/langbulgarianmodel.py b/lib/requests/packages/chardet/langbulgarianmodel.py
new file mode 100755
index 0000000..bf5641e
--- /dev/null
+++ b/lib/requests/packages/chardet/langbulgarianmodel.py
@@ -0,0 +1,228 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+# this table is modified base on win1251BulgarianCharToOrderMap, so 
+# only number <64 is sure valid
+
+Latin5_BulgarianCharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,  # 80
+210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,  # 90
+ 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238,  # a0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # b0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56,  # c0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # d0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16,  # e0
+ 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253,  # f0
+)
+
+win1251BulgarianCharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220,  # 80
+221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229,  # 90
+ 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240,  # a0
+ 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250,  # b0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # c0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56,  # d0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # e0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16,  # f0
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 96.9392%
+# first 1024 sequences:3.0618%
+# rest  sequences:     0.2992%
+# negative sequences:  0.0020% 
+BulgarianLangModel = ( \
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,
+3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,
+0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,
+0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,
+0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,
+0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,
+0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,
+2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,
+3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,
+1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,
+3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,
+1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,
+2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,
+2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,
+3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,
+1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,
+2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,
+2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,
+1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,
+2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,
+2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,
+2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,
+1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,
+2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,
+1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,
+3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,
+1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,
+3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,
+1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,
+2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,
+1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,
+2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,
+1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,
+2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,
+1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,
+2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,
+1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,
+0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,
+1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,
+1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
+1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,
+0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,
+1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,
+1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+)
+
+Latin5BulgarianModel = { \
+  'charToOrderMap': Latin5_BulgarianCharToOrderMap,
+  'precedenceMatrix': BulgarianLangModel,
+  'mTypicalPositiveRatio': 0.969392,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "ISO-8859-5"
+}
+
+Win1251BulgarianModel = { \
+  'charToOrderMap': win1251BulgarianCharToOrderMap,
+  'precedenceMatrix': BulgarianLangModel,
+  'mTypicalPositiveRatio': 0.969392,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "windows-1251"
+}
diff --git a/lib/requests/packages/chardet/langcyrillicmodel.py b/lib/requests/packages/chardet/langcyrillicmodel.py
new file mode 100755
index 0000000..e604cc7
--- /dev/null
+++ b/lib/requests/packages/chardet/langcyrillicmodel.py
@@ -0,0 +1,329 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants
+
+# KOI8-R language model
+# Character Mapping Table:
+KOI8R_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,  # 80
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,  # 90
+223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237,  # a0
+238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,  # b0
+ 27,  3, 21, 28, 13,  2, 39, 19, 26,  4, 23, 11,  8, 12,  5,  1,  # c0
+ 15, 16,  9,  7,  6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54,  # d0
+ 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34,  # e0
+ 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70,  # f0
+)
+
+win1251_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+)
+
+latin5_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+macCyrillic_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,
+)
+
+IBM855_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,
+206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,
+  3, 37, 21, 44, 28, 58, 13, 41,  2, 48, 39, 53, 19, 46,218,219,
+220,221,222,223,224, 26, 55,  4, 42,225,226,227,228, 23, 60,229,
+230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,
+  8, 49, 12, 38,  5, 31,  1, 34, 15,244,245,246,247, 35, 16,248,
+ 43,  9, 45,  7, 32,  6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,
+250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,
+)
+
+IBM866_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 97.6601%
+# first 1024 sequences: 2.3389%
+# rest  sequences:      0.1237%
+# negative sequences:   0.0009% 
+RussianLangModel = ( \
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,
+1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1,
+1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,
+2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1,
+1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,
+3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1,
+1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,
+2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2,
+1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1,
+1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1,
+1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1,
+1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
+3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2,
+1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,
+2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1,
+1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0,
+2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1,
+1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,
+1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1,
+1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,
+3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,
+3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,
+1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,
+1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,
+0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,
+1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,
+1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,
+0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1,
+1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2,
+2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,
+1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0,
+1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,
+2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,
+1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1,
+1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1,
+1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
+0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1,
+0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,
+0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
+0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+)
+
+Koi8rModel = { \
+  'charToOrderMap': KOI8R_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "KOI8-R"
+}
+
+Win1251CyrillicModel = { \
+  'charToOrderMap': win1251_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "windows-1251"
+}
+
+Latin5CyrillicModel = { \
+  'charToOrderMap': latin5_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "ISO-8859-5"
+}
+
+MacCyrillicModel = { \
+  'charToOrderMap': macCyrillic_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "MacCyrillic"
+};
+
+Ibm866Model = { \
+  'charToOrderMap': IBM866_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "IBM866"
+}
+
+Ibm855Model = { \
+  'charToOrderMap': IBM855_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "IBM855"
+}
diff --git a/lib/requests/packages/chardet/langgreekmodel.py b/lib/requests/packages/chardet/langgreekmodel.py
new file mode 100755
index 0000000..ec6d49e
--- /dev/null
+++ b/lib/requests/packages/chardet/langgreekmodel.py
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin7_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+win1253_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 98.2851%
+# first 1024 sequences:1.7001%
+# rest  sequences:     0.0359%
+# negative sequences:  0.0148% 
+GreekLangModel = ( \
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0,
+2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0,
+2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0,
+2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0,
+0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0,
+3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0,
+2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0,
+0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0,
+0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2,
+0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,
+0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2,
+0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0,
+0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2,
+0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2,
+0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0,
+0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0,
+0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,
+0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2,
+0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2,
+0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,
+0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,
+0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,
+0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,
+0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0,
+0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin7GreekModel = { \
+  'charToOrderMap': Latin7_CharToOrderMap,
+  'precedenceMatrix': GreekLangModel,
+  'mTypicalPositiveRatio': 0.982851,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "ISO-8859-7"
+}
+
+Win1253GreekModel = { \
+  'charToOrderMap': win1253_CharToOrderMap,
+  'precedenceMatrix': GreekLangModel,
+  'mTypicalPositiveRatio': 0.982851,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "windows-1253"
+}
diff --git a/lib/requests/packages/chardet/langhebrewmodel.py b/lib/requests/packages/chardet/langhebrewmodel.py
new file mode 100755
index 0000000..a8bcc65
--- /dev/null
+++ b/lib/requests/packages/chardet/langhebrewmodel.py
@@ -0,0 +1,201 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Simon Montagu
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Shoshannah Forbes - original C code (?)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Windows-1255 language model
+# Character Mapping Table:
+win1255_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85,  # 40
+ 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253,  # 50
+253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49,  # 60
+ 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253,  # 70
+124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,
+215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,
+ 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,
+106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,
+ 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,
+238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,
+  9,  8, 20, 16,  3,  2, 24, 14, 22,  1, 25, 15,  4, 11,  6, 23,
+ 12, 19, 13, 26, 18, 27, 21, 17,  7, 10,  5,251,252,128, 96,253,
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 98.4004%
+# first 1024 sequences: 1.5981%
+# rest  sequences:      0.087%
+# negative sequences:   0.0015% 
+HebrewLangModel = ( \
+0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0,
+3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,
+1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,
+1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3,
+1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2,
+1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2,
+0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1,
+0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,
+0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2,
+0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2,
+0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2,
+0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2,
+0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2,
+0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2,
+0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
+1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2,
+0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3,
+0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,
+0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0,
+0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,
+0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1,
+1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1,
+1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1,
+2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
+0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1,
+0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,
+)
+
+Win1255HebrewModel = { \
+  'charToOrderMap': win1255_CharToOrderMap,
+  'precedenceMatrix': HebrewLangModel,
+  'mTypicalPositiveRatio': 0.984004,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "windows-1255"
+}
diff --git a/lib/requests/packages/chardet/langhungarianmodel.py b/lib/requests/packages/chardet/langhungarianmodel.py
new file mode 100755
index 0000000..d635f03
--- /dev/null
+++ b/lib/requests/packages/chardet/langhungarianmodel.py
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin2_HungarianCharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,
+175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205,
+ 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,
+ 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,
+245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+win1250HungarianCharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
+177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,
+ 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,
+ 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,
+245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 94.7368%
+# first 1024 sequences:5.2623%
+# rest  sequences:     0.8894%
+# negative sequences:  0.0009% 
+HungarianLangModel = ( \
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2,
+3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2,
+0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0,
+1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0,
+1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1,
+3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0,
+2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1,
+2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1,
+2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1,
+2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,
+1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1,
+1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1,
+3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0,
+1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,
+1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1,
+2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1,
+2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0,
+2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,
+3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1,
+1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0,
+1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,
+1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1,
+2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,
+1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0,
+2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1,
+2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1,
+1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,
+1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,
+0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1,
+2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1,
+2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,
+1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,
+1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,
+2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0,
+2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1,
+2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,
+1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,
+0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin2HungarianModel = { \
+  'charToOrderMap': Latin2_HungarianCharToOrderMap,
+  'precedenceMatrix': HungarianLangModel,
+  'mTypicalPositiveRatio': 0.947368,
+  'keepEnglishLetter': constants.True,
+  'charsetName': "ISO-8859-2"
+}
+
+Win1250HungarianModel = { \
+  'charToOrderMap': win1250HungarianCharToOrderMap,
+  'precedenceMatrix': HungarianLangModel,
+  'mTypicalPositiveRatio': 0.947368,
+  'keepEnglishLetter': constants.True,
+  'charsetName': "windows-1250"
+}
diff --git a/lib/requests/packages/chardet/langthaimodel.py b/lib/requests/packages/chardet/langthaimodel.py
new file mode 100755
index 0000000..96ec054
--- /dev/null
+++ b/lib/requests/packages/chardet/langthaimodel.py
@@ -0,0 +1,200 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# The following result for thai was collected from a limited sample (1M). 
+
+# Character Mapping Table:
+TIS620CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111,  # 40
+188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253,  # 50
+253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82,  # 60
+ 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253,  # 70
+209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,
+223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,
+236,  5, 30,237, 24,238, 75,  8, 26, 52, 34, 51,119, 47, 58, 57,
+ 49, 53, 55, 43, 20, 19, 44, 14, 48,  3, 17, 25, 39, 62, 31, 54,
+ 45,  9, 16,  2, 61, 15,239, 12, 42, 46, 18, 21, 76,  4, 66, 63,
+ 22, 10,  1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,
+ 11, 28, 41, 29, 33,245, 50, 37,  6,  7, 67, 77, 38, 93,246,247,
+ 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 92.6386%
+# first 1024 sequences:7.3177%
+# rest  sequences:     1.0230%
+# negative sequences:  0.0436% 
+ThaiLangModel = ( \
+0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3,
+0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2,
+3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3,
+0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2,
+3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2,
+3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1,
+3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1,
+3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1,
+2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1,
+3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2,
+1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3,
+3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0,
+1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2,
+0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3,
+0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1,
+2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2,
+0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2,
+3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0,
+2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1,
+2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1,
+3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0,
+3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1,
+3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1,
+3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1,
+1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2,
+0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3,
+0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,
+3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0,
+3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1,
+1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,
+3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1,
+3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2,
+0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0,
+0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0,
+1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1,
+1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,
+3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1,
+0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0,
+3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0,
+0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1,
+0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0,
+0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1,
+0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,
+0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0,
+0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1,
+0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0,
+0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0,
+0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
+3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1,
+2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
+0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0,
+3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,
+1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,
+1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+TIS620ThaiModel = { \
+  'charToOrderMap': TIS620CharToOrderMap,
+  'precedenceMatrix': ThaiLangModel,
+  'mTypicalPositiveRatio': 0.926386,
+  'keepEnglishLetter': constants.False,
+  'charsetName': "TIS-620"
+}
diff --git a/lib/requests/packages/chardet/latin1prober.py b/lib/requests/packages/chardet/latin1prober.py
new file mode 100755
index 0000000..b46129b
--- /dev/null
+++ b/lib/requests/packages/chardet/latin1prober.py
@@ -0,0 +1,136 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from charsetprober import CharSetProber
+import constants
+import operator
+
+FREQ_CAT_NUM = 4
+
+UDF = 0 # undefined
+OTH = 1 # other
+ASC = 2 # ascii capital letter
+ASS = 3 # ascii small letter
+ACV = 4 # accent capital vowel
+ACO = 5 # accent capital other
+ASV = 6 # accent small vowel
+ASO = 7 # accent small other
+CLASS_NUM = 8 # total classes
+
+Latin1_CharToClass = ( \
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F
+  OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47
+  ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F
+  ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57
+  ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F
+  OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67
+  ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F
+  ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77
+  ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F
+  OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87
+  OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F
+  UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97
+  OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF
+  ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7
+  ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF
+  ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7
+  ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF
+  ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7
+  ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF
+  ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7
+  ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF
+)
+
+# 0 : illegal 
+# 1 : very unlikely 
+# 2 : normal 
+# 3 : very likely
+Latin1ClassModel = ( \
+# UDF OTH ASC ASS ACV ACO ASV ASO
+   0,  0,  0,  0,  0,  0,  0,  0,  # UDF
+   0,  3,  3,  3,  3,  3,  3,  3,  # OTH
+   0,  3,  3,  3,  3,  3,  3,  3,  # ASC
+   0,  3,  3,  3,  1,  1,  3,  3,  # ASS
+   0,  3,  3,  3,  1,  2,  1,  2,  # ACV
+   0,  3,  3,  3,  3,  3,  3,  3,  # ACO
+   0,  3,  1,  3,  1,  1,  1,  3,  # ASV
+   0,  3,  1,  3,  1,  1,  3,  3,  # ASO
+)
+
+class Latin1Prober(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self.reset()
+
+    def reset(self):
+        self._mLastCharClass = OTH
+        self._mFreqCounter = [0] * FREQ_CAT_NUM
+        CharSetProber.reset(self)
+
+    def get_charset_name(self):
+        return "windows-1252"
+
+    def feed(self, aBuf):
+        aBuf = self.filter_with_english_letters(aBuf)
+        for c in aBuf:
+            charClass = Latin1_CharToClass[ord(c)]
+            freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + charClass]
+            if freq == 0:
+                self._mState = constants.eNotMe
+                break
+            self._mFreqCounter[freq] += 1
+            self._mLastCharClass = charClass
+
+        return self.get_state()
+
+    def get_confidence(self):
+        if self.get_state() == constants.eNotMe:
+            return 0.01
+  
+        total = reduce(operator.add, self._mFreqCounter)
+        if total < 0.01:
+            confidence = 0.0
+        else:
+            confidence = (self._mFreqCounter[3] / total) - (self._mFreqCounter[1] * 20.0 / total)
+        if confidence < 0.0:
+            confidence = 0.0
+        # lower the confidence of latin1 so that other more accurate detector 
+        # can take priority.
+        confidence = confidence * 0.5
+        return confidence
diff --git a/lib/requests/packages/chardet/mbcharsetprober.py b/lib/requests/packages/chardet/mbcharsetprober.py
new file mode 100755
index 0000000..a813144
--- /dev/null
+++ b/lib/requests/packages/chardet/mbcharsetprober.py
@@ -0,0 +1,82 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, sys
+from constants import eStart, eError, eItsMe
+from charsetprober import CharSetProber
+
+class MultiByteCharSetProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mDistributionAnalyzer = None
+        self._mCodingSM = None
+        self._mLastChar = ['\x00', '\x00']
+
+    def reset(self):
+        CharSetProber.reset(self)
+        if self._mCodingSM:
+            self._mCodingSM.reset()
+        if self._mDistributionAnalyzer:
+            self._mDistributionAnalyzer.reset()
+        self._mLastChar = ['\x00', '\x00']
+
+    def get_charset_name(self):
+        pass
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mDistributionAnalyzer.feed(aBuf[i-1:i+1], charLen)
+                    
+        self._mLastChar[0] = aBuf[aLen - 1]
+        
+        if self.get_state() == constants.eDetecting:
+            if self._mDistributionAnalyzer.got_enough_data() and \
+               (self.get_confidence() > constants.SHORTCUT_THRESHOLD):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        return self._mDistributionAnalyzer.get_confidence()
diff --git a/lib/requests/packages/chardet/mbcsgroupprober.py b/lib/requests/packages/chardet/mbcsgroupprober.py
new file mode 100755
index 0000000..941cc3e
--- /dev/null
+++ b/lib/requests/packages/chardet/mbcsgroupprober.py
@@ -0,0 +1,50 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from charsetgroupprober import CharSetGroupProber
+from utf8prober import UTF8Prober
+from sjisprober import SJISProber
+from eucjpprober import EUCJPProber
+from gb2312prober import GB2312Prober
+from euckrprober import EUCKRProber
+from big5prober import Big5Prober
+from euctwprober import EUCTWProber
+
+class MBCSGroupProber(CharSetGroupProber):
+    def __init__(self):
+        CharSetGroupProber.__init__(self)
+        self._mProbers = [ \
+            UTF8Prober(),
+            SJISProber(),
+            EUCJPProber(),
+            GB2312Prober(),
+            EUCKRProber(),
+            Big5Prober(),
+            EUCTWProber()]
+        self.reset()
diff --git a/lib/requests/packages/chardet/mbcssm.py b/lib/requests/packages/chardet/mbcssm.py
new file mode 100755
index 0000000..e46c1ff
--- /dev/null
+++ b/lib/requests/packages/chardet/mbcssm.py
@@ -0,0 +1,514 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from constants import eStart, eError, eItsMe
+
+# BIG5 
+
+BIG5_cls = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    1,1,1,1,1,1,1,1,  # 30 - 37 
+    1,1,1,1,1,1,1,1,  # 38 - 3f 
+    2,2,2,2,2,2,2,2,  # 40 - 47 
+    2,2,2,2,2,2,2,2,  # 48 - 4f 
+    2,2,2,2,2,2,2,2,  # 50 - 57 
+    2,2,2,2,2,2,2,2,  # 58 - 5f 
+    2,2,2,2,2,2,2,2,  # 60 - 67 
+    2,2,2,2,2,2,2,2,  # 68 - 6f 
+    2,2,2,2,2,2,2,2,  # 70 - 77 
+    2,2,2,2,2,2,2,1,  # 78 - 7f 
+    4,4,4,4,4,4,4,4,  # 80 - 87 
+    4,4,4,4,4,4,4,4,  # 88 - 8f 
+    4,4,4,4,4,4,4,4,  # 90 - 97 
+    4,4,4,4,4,4,4,4,  # 98 - 9f 
+    4,3,3,3,3,3,3,3,  # a0 - a7 
+    3,3,3,3,3,3,3,3,  # a8 - af 
+    3,3,3,3,3,3,3,3,  # b0 - b7 
+    3,3,3,3,3,3,3,3,  # b8 - bf 
+    3,3,3,3,3,3,3,3,  # c0 - c7 
+    3,3,3,3,3,3,3,3,  # c8 - cf 
+    3,3,3,3,3,3,3,3,  # d0 - d7 
+    3,3,3,3,3,3,3,3,  # d8 - df 
+    3,3,3,3,3,3,3,3,  # e0 - e7 
+    3,3,3,3,3,3,3,3,  # e8 - ef 
+    3,3,3,3,3,3,3,3,  # f0 - f7 
+    3,3,3,3,3,3,3,0)  # f8 - ff 
+
+BIG5_st = ( \
+    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07 
+    eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f 
+    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart)#10-17 
+
+Big5CharLenTable = (0, 1, 1, 2, 0)
+
+Big5SMModel = {'classTable': BIG5_cls,
+               'classFactor': 5,
+               'stateTable': BIG5_st,
+               'charLenTable': Big5CharLenTable,
+               'name': 'Big5'}
+
+# EUC-JP
+
+EUCJP_cls = ( \
+    4,4,4,4,4,4,4,4,  # 00 - 07 
+    4,4,4,4,4,4,5,5,  # 08 - 0f 
+    4,4,4,4,4,4,4,4,  # 10 - 17 
+    4,4,4,5,4,4,4,4,  # 18 - 1f 
+    4,4,4,4,4,4,4,4,  # 20 - 27 
+    4,4,4,4,4,4,4,4,  # 28 - 2f 
+    4,4,4,4,4,4,4,4,  # 30 - 37 
+    4,4,4,4,4,4,4,4,  # 38 - 3f 
+    4,4,4,4,4,4,4,4,  # 40 - 47 
+    4,4,4,4,4,4,4,4,  # 48 - 4f 
+    4,4,4,4,4,4,4,4,  # 50 - 57 
+    4,4,4,4,4,4,4,4,  # 58 - 5f 
+    4,4,4,4,4,4,4,4,  # 60 - 67 
+    4,4,4,4,4,4,4,4,  # 68 - 6f 
+    4,4,4,4,4,4,4,4,  # 70 - 77 
+    4,4,4,4,4,4,4,4,  # 78 - 7f 
+    5,5,5,5,5,5,5,5,  # 80 - 87 
+    5,5,5,5,5,5,1,3,  # 88 - 8f 
+    5,5,5,5,5,5,5,5,  # 90 - 97 
+    5,5,5,5,5,5,5,5,  # 98 - 9f 
+    5,2,2,2,2,2,2,2,  # a0 - a7 
+    2,2,2,2,2,2,2,2,  # a8 - af 
+    2,2,2,2,2,2,2,2,  # b0 - b7 
+    2,2,2,2,2,2,2,2,  # b8 - bf 
+    2,2,2,2,2,2,2,2,  # c0 - c7 
+    2,2,2,2,2,2,2,2,  # c8 - cf 
+    2,2,2,2,2,2,2,2,  # d0 - d7 
+    2,2,2,2,2,2,2,2,  # d8 - df 
+    0,0,0,0,0,0,0,0,  # e0 - e7 
+    0,0,0,0,0,0,0,0,  # e8 - ef 
+    0,0,0,0,0,0,0,0,  # f0 - f7 
+    0,0,0,0,0,0,0,5)  # f8 - ff 
+
+EUCJP_st = ( \
+          3,     4,     3,     5,eStart,eError,eError,eError,#00-07 
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f 
+     eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 
+     eError,eError,eStart,eError,eError,eError,     3,eError,#18-1f 
+          3,eError,eError,eError,eStart,eStart,eStart,eStart)#20-27 
+
+EUCJPCharLenTable = (2, 2, 2, 3, 1, 0)
+
+EUCJPSMModel = {'classTable': EUCJP_cls,
+                'classFactor': 6,
+                'stateTable': EUCJP_st,
+                'charLenTable': EUCJPCharLenTable,
+                'name': 'EUC-JP'}
+
+# EUC-KR
+
+EUCKR_cls  = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07 
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    1,1,1,1,1,1,1,1,  # 30 - 37 
+    1,1,1,1,1,1,1,1,  # 38 - 3f 
+    1,1,1,1,1,1,1,1,  # 40 - 47 
+    1,1,1,1,1,1,1,1,  # 48 - 4f 
+    1,1,1,1,1,1,1,1,  # 50 - 57 
+    1,1,1,1,1,1,1,1,  # 58 - 5f 
+    1,1,1,1,1,1,1,1,  # 60 - 67 
+    1,1,1,1,1,1,1,1,  # 68 - 6f 
+    1,1,1,1,1,1,1,1,  # 70 - 77 
+    1,1,1,1,1,1,1,1,  # 78 - 7f 
+    0,0,0,0,0,0,0,0,  # 80 - 87 
+    0,0,0,0,0,0,0,0,  # 88 - 8f 
+    0,0,0,0,0,0,0,0,  # 90 - 97 
+    0,0,0,0,0,0,0,0,  # 98 - 9f 
+    0,2,2,2,2,2,2,2,  # a0 - a7 
+    2,2,2,2,2,3,3,3,  # a8 - af 
+    2,2,2,2,2,2,2,2,  # b0 - b7 
+    2,2,2,2,2,2,2,2,  # b8 - bf 
+    2,2,2,2,2,2,2,2,  # c0 - c7 
+    2,3,2,2,2,2,2,2,  # c8 - cf 
+    2,2,2,2,2,2,2,2,  # d0 - d7 
+    2,2,2,2,2,2,2,2,  # d8 - df 
+    2,2,2,2,2,2,2,2,  # e0 - e7 
+    2,2,2,2,2,2,2,2,  # e8 - ef 
+    2,2,2,2,2,2,2,2,  # f0 - f7 
+    2,2,2,2,2,2,2,0)  # f8 - ff 
+
+EUCKR_st = (
+    eError,eStart,     3,eError,eError,eError,eError,eError,#00-07 
+    eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart)#08-0f 
+
+EUCKRCharLenTable = (0, 1, 2, 0)
+
+EUCKRSMModel = {'classTable': EUCKR_cls,
+                'classFactor': 4,
+                'stateTable': EUCKR_st,
+                'charLenTable': EUCKRCharLenTable,
+                'name': 'EUC-KR'}
+
+# EUC-TW
+
+EUCTW_cls = ( \
+    2,2,2,2,2,2,2,2,  # 00 - 07 
+    2,2,2,2,2,2,0,0,  # 08 - 0f 
+    2,2,2,2,2,2,2,2,  # 10 - 17 
+    2,2,2,0,2,2,2,2,  # 18 - 1f 
+    2,2,2,2,2,2,2,2,  # 20 - 27 
+    2,2,2,2,2,2,2,2,  # 28 - 2f 
+    2,2,2,2,2,2,2,2,  # 30 - 37 
+    2,2,2,2,2,2,2,2,  # 38 - 3f 
+    2,2,2,2,2,2,2,2,  # 40 - 47 
+    2,2,2,2,2,2,2,2,  # 48 - 4f 
+    2,2,2,2,2,2,2,2,  # 50 - 57 
+    2,2,2,2,2,2,2,2,  # 58 - 5f 
+    2,2,2,2,2,2,2,2,  # 60 - 67 
+    2,2,2,2,2,2,2,2,  # 68 - 6f 
+    2,2,2,2,2,2,2,2,  # 70 - 77 
+    2,2,2,2,2,2,2,2,  # 78 - 7f 
+    0,0,0,0,0,0,0,0,  # 80 - 87 
+    0,0,0,0,0,0,6,0,  # 88 - 8f 
+    0,0,0,0,0,0,0,0,  # 90 - 97 
+    0,0,0,0,0,0,0,0,  # 98 - 9f 
+    0,3,4,4,4,4,4,4,  # a0 - a7 
+    5,5,1,1,1,1,1,1,  # a8 - af 
+    1,1,1,1,1,1,1,1,  # b0 - b7 
+    1,1,1,1,1,1,1,1,  # b8 - bf 
+    1,1,3,1,3,3,3,3,  # c0 - c7 
+    3,3,3,3,3,3,3,3,  # c8 - cf 
+    3,3,3,3,3,3,3,3,  # d0 - d7 
+    3,3,3,3,3,3,3,3,  # d8 - df 
+    3,3,3,3,3,3,3,3,  # e0 - e7 
+    3,3,3,3,3,3,3,3,  # e8 - ef 
+    3,3,3,3,3,3,3,3,  # f0 - f7 
+    3,3,3,3,3,3,3,0)  # f8 - ff 
+
+EUCTW_st = ( \
+    eError,eError,eStart,     3,     3,     3,     4,eError,#00-07 
+    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f 
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 
+    eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f 
+         5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 
+    eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart)#28-2f 
+
+EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3)
+
+EUCTWSMModel = {'classTable': EUCTW_cls,
+                'classFactor': 7,
+                'stateTable': EUCTW_st,
+                'charLenTable': EUCTWCharLenTable,
+                'name': 'x-euc-tw'}
+
+# GB2312
+
+GB2312_cls = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07 
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    3,3,3,3,3,3,3,3,  # 30 - 37 
+    3,3,1,1,1,1,1,1,  # 38 - 3f 
+    2,2,2,2,2,2,2,2,  # 40 - 47 
+    2,2,2,2,2,2,2,2,  # 48 - 4f 
+    2,2,2,2,2,2,2,2,  # 50 - 57 
+    2,2,2,2,2,2,2,2,  # 58 - 5f 
+    2,2,2,2,2,2,2,2,  # 60 - 67 
+    2,2,2,2,2,2,2,2,  # 68 - 6f 
+    2,2,2,2,2,2,2,2,  # 70 - 77 
+    2,2,2,2,2,2,2,4,  # 78 - 7f 
+    5,6,6,6,6,6,6,6,  # 80 - 87 
+    6,6,6,6,6,6,6,6,  # 88 - 8f 
+    6,6,6,6,6,6,6,6,  # 90 - 97 
+    6,6,6,6,6,6,6,6,  # 98 - 9f 
+    6,6,6,6,6,6,6,6,  # a0 - a7 
+    6,6,6,6,6,6,6,6,  # a8 - af 
+    6,6,6,6,6,6,6,6,  # b0 - b7 
+    6,6,6,6,6,6,6,6,  # b8 - bf 
+    6,6,6,6,6,6,6,6,  # c0 - c7 
+    6,6,6,6,6,6,6,6,  # c8 - cf 
+    6,6,6,6,6,6,6,6,  # d0 - d7 
+    6,6,6,6,6,6,6,6,  # d8 - df 
+    6,6,6,6,6,6,6,6,  # e0 - e7 
+    6,6,6,6,6,6,6,6,  # e8 - ef 
+    6,6,6,6,6,6,6,6,  # f0 - f7 
+    6,6,6,6,6,6,6,0)  # f8 - ff 
+
+GB2312_st = ( \
+    eError,eStart,eStart,eStart,eStart,eStart,     3,eError,#00-07 
+    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f 
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 
+         4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f 
+    eError,eError,     5,eError,eError,eError,eItsMe,eError,#20-27 
+    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart)#28-2f 
+
+# To be accurate, the length of class 6 can be either 2 or 4. 
+# But it is not necessary to discriminate between the two since 
+# it is used for frequency analysis only, and we are validing 
+# each code range there as well. So it is safe to set it to be 
+# 2 here. 
+GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2)
+
+GB2312SMModel = {'classTable': GB2312_cls,
+                  'classFactor': 7,
+                  'stateTable': GB2312_st,
+                  'charLenTable': GB2312CharLenTable,
+                  'name': 'GB2312'}
+
+# Shift_JIS
+
+SJIS_cls = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07 
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    1,1,1,1,1,1,1,1,  # 30 - 37 
+    1,1,1,1,1,1,1,1,  # 38 - 3f 
+    2,2,2,2,2,2,2,2,  # 40 - 47 
+    2,2,2,2,2,2,2,2,  # 48 - 4f 
+    2,2,2,2,2,2,2,2,  # 50 - 57 
+    2,2,2,2,2,2,2,2,  # 58 - 5f 
+    2,2,2,2,2,2,2,2,  # 60 - 67 
+    2,2,2,2,2,2,2,2,  # 68 - 6f 
+    2,2,2,2,2,2,2,2,  # 70 - 77 
+    2,2,2,2,2,2,2,1,  # 78 - 7f 
+    3,3,3,3,3,3,3,3,  # 80 - 87 
+    3,3,3,3,3,3,3,3,  # 88 - 8f 
+    3,3,3,3,3,3,3,3,  # 90 - 97 
+    3,3,3,3,3,3,3,3,  # 98 - 9f 
+    #0xa0 is illegal in sjis encoding, but some pages does 
+    #contain such byte. We need to be more error forgiven.
+    2,2,2,2,2,2,2,2,  # a0 - a7     
+    2,2,2,2,2,2,2,2,  # a8 - af 
+    2,2,2,2,2,2,2,2,  # b0 - b7 
+    2,2,2,2,2,2,2,2,  # b8 - bf 
+    2,2,2,2,2,2,2,2,  # c0 - c7 
+    2,2,2,2,2,2,2,2,  # c8 - cf 
+    2,2,2,2,2,2,2,2,  # d0 - d7 
+    2,2,2,2,2,2,2,2,  # d8 - df 
+    3,3,3,3,3,3,3,3,  # e0 - e7 
+    3,3,3,3,3,4,4,4,  # e8 - ef 
+    4,4,4,4,4,4,4,4,  # f0 - f7 
+    4,4,4,4,4,0,0,0)  # f8 - ff 
+
+SJIS_st = ( \
+    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07 
+    eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f 
+    eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart)#10-17 
+
+SJISCharLenTable = (0, 1, 1, 2, 0, 0)
+
+SJISSMModel = {'classTable': SJIS_cls,
+               'classFactor': 6,
+               'stateTable': SJIS_st,
+               'charLenTable': SJISCharLenTable,
+               'name': 'Shift_JIS'}
+
+# UCS2-BE
+
+UCS2BE_cls = ( \
+    0,0,0,0,0,0,0,0,  # 00 - 07 
+    0,0,1,0,0,2,0,0,  # 08 - 0f 
+    0,0,0,0,0,0,0,0,  # 10 - 17 
+    0,0,0,3,0,0,0,0,  # 18 - 1f 
+    0,0,0,0,0,0,0,0,  # 20 - 27 
+    0,3,3,3,3,3,0,0,  # 28 - 2f 
+    0,0,0,0,0,0,0,0,  # 30 - 37 
+    0,0,0,0,0,0,0,0,  # 38 - 3f 
+    0,0,0,0,0,0,0,0,  # 40 - 47 
+    0,0,0,0,0,0,0,0,  # 48 - 4f 
+    0,0,0,0,0,0,0,0,  # 50 - 57 
+    0,0,0,0,0,0,0,0,  # 58 - 5f 
+    0,0,0,0,0,0,0,0,  # 60 - 67 
+    0,0,0,0,0,0,0,0,  # 68 - 6f 
+    0,0,0,0,0,0,0,0,  # 70 - 77 
+    0,0,0,0,0,0,0,0,  # 78 - 7f 
+    0,0,0,0,0,0,0,0,  # 80 - 87 
+    0,0,0,0,0,0,0,0,  # 88 - 8f 
+    0,0,0,0,0,0,0,0,  # 90 - 97 
+    0,0,0,0,0,0,0,0,  # 98 - 9f 
+    0,0,0,0,0,0,0,0,  # a0 - a7 
+    0,0,0,0,0,0,0,0,  # a8 - af 
+    0,0,0,0,0,0,0,0,  # b0 - b7 
+    0,0,0,0,0,0,0,0,  # b8 - bf 
+    0,0,0,0,0,0,0,0,  # c0 - c7 
+    0,0,0,0,0,0,0,0,  # c8 - cf 
+    0,0,0,0,0,0,0,0,  # d0 - d7 
+    0,0,0,0,0,0,0,0,  # d8 - df 
+    0,0,0,0,0,0,0,0,  # e0 - e7 
+    0,0,0,0,0,0,0,0,  # e8 - ef 
+    0,0,0,0,0,0,0,0,  # f0 - f7 
+    0,0,0,0,0,0,4,5)  # f8 - ff 
+
+UCS2BE_st  = ( \
+          5,     7,     7,eError,     4,     3,eError,eError,#00-07 
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f 
+     eItsMe,eItsMe,     6,     6,     6,     6,eError,eError,#10-17 
+          6,     6,     6,     6,     6,eItsMe,     6,     6,#18-1f 
+          6,     6,     6,     6,     5,     7,     7,eError,#20-27 
+          5,     8,     6,     6,eError,     6,     6,     6,#28-2f 
+          6,     6,     6,     6,eError,eError,eStart,eStart)#30-37 
+
+UCS2BECharLenTable = (2, 2, 2, 0, 2, 2)
+
+UCS2BESMModel = {'classTable': UCS2BE_cls,
+                 'classFactor': 6,
+                 'stateTable': UCS2BE_st,
+                 'charLenTable': UCS2BECharLenTable,
+                 'name': 'UTF-16BE'}
+
+# UCS2-LE
+
+UCS2LE_cls = ( \
+    0,0,0,0,0,0,0,0,  # 00 - 07 
+    0,0,1,0,0,2,0,0,  # 08 - 0f 
+    0,0,0,0,0,0,0,0,  # 10 - 17 
+    0,0,0,3,0,0,0,0,  # 18 - 1f 
+    0,0,0,0,0,0,0,0,  # 20 - 27 
+    0,3,3,3,3,3,0,0,  # 28 - 2f 
+    0,0,0,0,0,0,0,0,  # 30 - 37 
+    0,0,0,0,0,0,0,0,  # 38 - 3f 
+    0,0,0,0,0,0,0,0,  # 40 - 47 
+    0,0,0,0,0,0,0,0,  # 48 - 4f 
+    0,0,0,0,0,0,0,0,  # 50 - 57 
+    0,0,0,0,0,0,0,0,  # 58 - 5f 
+    0,0,0,0,0,0,0,0,  # 60 - 67 
+    0,0,0,0,0,0,0,0,  # 68 - 6f 
+    0,0,0,0,0,0,0,0,  # 70 - 77 
+    0,0,0,0,0,0,0,0,  # 78 - 7f 
+    0,0,0,0,0,0,0,0,  # 80 - 87 
+    0,0,0,0,0,0,0,0,  # 88 - 8f 
+    0,0,0,0,0,0,0,0,  # 90 - 97 
+    0,0,0,0,0,0,0,0,  # 98 - 9f 
+    0,0,0,0,0,0,0,0,  # a0 - a7 
+    0,0,0,0,0,0,0,0,  # a8 - af 
+    0,0,0,0,0,0,0,0,  # b0 - b7 
+    0,0,0,0,0,0,0,0,  # b8 - bf 
+    0,0,0,0,0,0,0,0,  # c0 - c7 
+    0,0,0,0,0,0,0,0,  # c8 - cf 
+    0,0,0,0,0,0,0,0,  # d0 - d7 
+    0,0,0,0,0,0,0,0,  # d8 - df 
+    0,0,0,0,0,0,0,0,  # e0 - e7 
+    0,0,0,0,0,0,0,0,  # e8 - ef 
+    0,0,0,0,0,0,0,0,  # f0 - f7 
+    0,0,0,0,0,0,4,5)  # f8 - ff 
+
+UCS2LE_st = ( \
+          6,     6,     7,     6,     4,     3,eError,eError,#00-07 
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f 
+     eItsMe,eItsMe,     5,     5,     5,eError,eItsMe,eError,#10-17 
+          5,     5,     5,eError,     5,eError,     6,     6,#18-1f 
+          7,     6,     8,     8,     5,     5,     5,eError,#20-27 
+          5,     5,     5,eError,eError,eError,     5,     5,#28-2f 
+          5,     5,     5,eError,     5,eError,eStart,eStart)#30-37 
+
+UCS2LECharLenTable = (2, 2, 2, 2, 2, 2)
+
+UCS2LESMModel = {'classTable': UCS2LE_cls,
+                 'classFactor': 6,
+                 'stateTable': UCS2LE_st,
+                 'charLenTable': UCS2LECharLenTable,
+                 'name': 'UTF-16LE'}
+
+# UTF-8
+
+UTF8_cls = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    1,1,1,1,1,1,1,1,  # 30 - 37 
+    1,1,1,1,1,1,1,1,  # 38 - 3f 
+    1,1,1,1,1,1,1,1,  # 40 - 47 
+    1,1,1,1,1,1,1,1,  # 48 - 4f 
+    1,1,1,1,1,1,1,1,  # 50 - 57 
+    1,1,1,1,1,1,1,1,  # 58 - 5f 
+    1,1,1,1,1,1,1,1,  # 60 - 67 
+    1,1,1,1,1,1,1,1,  # 68 - 6f 
+    1,1,1,1,1,1,1,1,  # 70 - 77 
+    1,1,1,1,1,1,1,1,  # 78 - 7f 
+    2,2,2,2,3,3,3,3,  # 80 - 87 
+    4,4,4,4,4,4,4,4,  # 88 - 8f 
+    4,4,4,4,4,4,4,4,  # 90 - 97 
+    4,4,4,4,4,4,4,4,  # 98 - 9f 
+    5,5,5,5,5,5,5,5,  # a0 - a7 
+    5,5,5,5,5,5,5,5,  # a8 - af 
+    5,5,5,5,5,5,5,5,  # b0 - b7 
+    5,5,5,5,5,5,5,5,  # b8 - bf 
+    0,0,6,6,6,6,6,6,  # c0 - c7 
+    6,6,6,6,6,6,6,6,  # c8 - cf 
+    6,6,6,6,6,6,6,6,  # d0 - d7 
+    6,6,6,6,6,6,6,6,  # d8 - df 
+    7,8,8,8,8,8,8,8,  # e0 - e7 
+    8,8,8,8,8,9,8,8,  # e8 - ef 
+    10,11,11,11,11,11,11,11,  # f0 - f7 
+    12,13,13,13,14,15,0,0)   # f8 - ff 
+
+UTF8_st = ( \
+    eError,eStart,eError,eError,eError,eError,     12,   10,#00-07 
+         9,     11,     8,     7,     6,     5,     4,    3,#08-0f 
+    eError,eError,eError,eError,eError,eError,eError,eError,#10-17 
+    eError,eError,eError,eError,eError,eError,eError,eError,#18-1f 
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f 
+    eError,eError,     5,     5,     5,     5,eError,eError,#30-37 
+    eError,eError,eError,eError,eError,eError,eError,eError,#38-3f 
+    eError,eError,eError,     5,     5,     5,eError,eError,#40-47 
+    eError,eError,eError,eError,eError,eError,eError,eError,#48-4f 
+    eError,eError,     7,     7,     7,     7,eError,eError,#50-57 
+    eError,eError,eError,eError,eError,eError,eError,eError,#58-5f 
+    eError,eError,eError,eError,     7,     7,eError,eError,#60-67 
+    eError,eError,eError,eError,eError,eError,eError,eError,#68-6f 
+    eError,eError,     9,     9,     9,     9,eError,eError,#70-77 
+    eError,eError,eError,eError,eError,eError,eError,eError,#78-7f 
+    eError,eError,eError,eError,eError,     9,eError,eError,#80-87 
+    eError,eError,eError,eError,eError,eError,eError,eError,#88-8f 
+    eError,eError,    12,    12,    12,    12,eError,eError,#90-97 
+    eError,eError,eError,eError,eError,eError,eError,eError,#98-9f 
+    eError,eError,eError,eError,eError,    12,eError,eError,#a0-a7 
+    eError,eError,eError,eError,eError,eError,eError,eError,#a8-af 
+    eError,eError,    12,    12,    12,eError,eError,eError,#b0-b7 
+    eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf 
+    eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 
+    eError,eError,eError,eError,eError,eError,eError,eError)#c8-cf 
+
+UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
+
+UTF8SMModel = {'classTable': UTF8_cls,
+               'classFactor': 16,
+               'stateTable': UTF8_st,
+               'charLenTable': UTF8CharLenTable,
+               'name': 'UTF-8'}
diff --git a/lib/requests/packages/chardet/sbcharsetprober.py b/lib/requests/packages/chardet/sbcharsetprober.py
new file mode 100755
index 0000000..da07116
--- /dev/null
+++ b/lib/requests/packages/chardet/sbcharsetprober.py
@@ -0,0 +1,106 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, sys
+from charsetprober import CharSetProber
+
+SAMPLE_SIZE = 64
+SB_ENOUGH_REL_THRESHOLD = 1024
+POSITIVE_SHORTCUT_THRESHOLD = 0.95
+NEGATIVE_SHORTCUT_THRESHOLD = 0.05
+SYMBOL_CAT_ORDER = 250
+NUMBER_OF_SEQ_CAT = 4
+POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1
+#NEGATIVE_CAT = 0
+ 
+class SingleByteCharSetProber(CharSetProber):
+    def __init__(self, model, reversed=constants.False, nameProber=None):
+        CharSetProber.__init__(self)
+        self._mModel = model
+        self._mReversed = reversed # TRUE if we need to reverse every pair in the model lookup
+        self._mNameProber = nameProber # Optional auxiliary prober for name decision
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        self._mLastOrder = 255 # char order of last character
+        self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT
+        self._mTotalSeqs = 0
+        self._mTotalChar = 0
+        self._mFreqChar = 0 # characters that fall in our sampling range
+
+    def get_charset_name(self):
+        if self._mNameProber:
+            return self._mNameProber.get_charset_name()
+        else:
+            return self._mModel['charsetName']
+
+    def feed(self, aBuf):
+        if not self._mModel['keepEnglishLetter']:
+            aBuf = self.filter_without_english_letters(aBuf)
+        aLen = len(aBuf)
+        if not aLen:
+            return self.get_state()
+        for c in aBuf:
+            order = self._mModel['charToOrderMap'][ord(c)]
+            if order < SYMBOL_CAT_ORDER:
+                self._mTotalChar += 1
+            if order < SAMPLE_SIZE:
+                self._mFreqChar += 1
+                if self._mLastOrder < SAMPLE_SIZE:
+                    self._mTotalSeqs += 1
+                    if not self._mReversed:
+                        self._mSeqCounters[self._mModel['precedenceMatrix'][(self._mLastOrder * SAMPLE_SIZE) + order]] += 1
+                    else: # reverse the order of the letters in the lookup
+                        self._mSeqCounters[self._mModel['precedenceMatrix'][(order * SAMPLE_SIZE) + self._mLastOrder]] += 1
+            self._mLastOrder = order
+
+        if self.get_state() == constants.eDetecting:
+            if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD:
+                cf = self.get_confidence()
+                if cf > POSITIVE_SHORTCUT_THRESHOLD:
+                    if constants._debug:
+                        sys.stderr.write('%s confidence = %s, we have a winner\n' % (self._mModel['charsetName'], cf))
+                    self._mState = constants.eFoundIt
+                elif cf < NEGATIVE_SHORTCUT_THRESHOLD:
+                    if constants._debug:
+                        sys.stderr.write('%s confidence = %s, below negative shortcut threshhold %s\n' % (self._mModel['charsetName'], cf, NEGATIVE_SHORTCUT_THRESHOLD))
+                    self._mState = constants.eNotMe
+
+        return self.get_state()
+
+    def get_confidence(self):
+        r = 0.01
+        if self._mTotalSeqs > 0:
+#            print self._mSeqCounters[POSITIVE_CAT], self._mTotalSeqs, self._mModel['mTypicalPositiveRatio']
+            r = (1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs / self._mModel['mTypicalPositiveRatio']
+#            print r, self._mFreqChar, self._mTotalChar
+            r = r * self._mFreqChar / self._mTotalChar
+            if r >= 1.0:
+                r = 0.99
+        return r
diff --git a/lib/requests/packages/chardet/sbcsgroupprober.py b/lib/requests/packages/chardet/sbcsgroupprober.py
new file mode 100755
index 0000000..d19160c
--- /dev/null
+++ b/lib/requests/packages/chardet/sbcsgroupprober.py
@@ -0,0 +1,64 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, sys
+from charsetgroupprober import CharSetGroupProber
+from sbcharsetprober import SingleByteCharSetProber
+from langcyrillicmodel import Win1251CyrillicModel, Koi8rModel, Latin5CyrillicModel, MacCyrillicModel, Ibm866Model, Ibm855Model
+from langgreekmodel import Latin7GreekModel, Win1253GreekModel
+from langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel
+from langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel
+from langthaimodel import TIS620ThaiModel
+from langhebrewmodel import Win1255HebrewModel
+from hebrewprober import HebrewProber
+
+class SBCSGroupProber(CharSetGroupProber):
+    def __init__(self):
+        CharSetGroupProber.__init__(self)
+        self._mProbers = [ \
+            SingleByteCharSetProber(Win1251CyrillicModel),
+            SingleByteCharSetProber(Koi8rModel),
+            SingleByteCharSetProber(Latin5CyrillicModel),
+            SingleByteCharSetProber(MacCyrillicModel),
+            SingleByteCharSetProber(Ibm866Model),
+            SingleByteCharSetProber(Ibm855Model),
+            SingleByteCharSetProber(Latin7GreekModel),
+            SingleByteCharSetProber(Win1253GreekModel),
+            SingleByteCharSetProber(Latin5BulgarianModel),
+            SingleByteCharSetProber(Win1251BulgarianModel),
+            SingleByteCharSetProber(Latin2HungarianModel),
+            SingleByteCharSetProber(Win1250HungarianModel),
+            SingleByteCharSetProber(TIS620ThaiModel),
+            ]
+        hebrewProber = HebrewProber()
+        logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, constants.False, hebrewProber)
+        visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, constants.True, hebrewProber)
+        hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber)
+        self._mProbers.extend([hebrewProber, logicalHebrewProber, visualHebrewProber])
+
+        self.reset()
diff --git a/lib/requests/packages/chardet/sjisprober.py b/lib/requests/packages/chardet/sjisprober.py
new file mode 100755
index 0000000..fea2690
--- /dev/null
+++ b/lib/requests/packages/chardet/sjisprober.py
@@ -0,0 +1,85 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from mbcharsetprober import MultiByteCharSetProber
+from codingstatemachine import CodingStateMachine
+from chardistribution import SJISDistributionAnalysis
+from jpcntx import SJISContextAnalysis
+from mbcssm import SJISSMModel
+import constants, sys
+from constants import eStart, eError, eItsMe
+
+class SJISProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(SJISSMModel)
+        self._mDistributionAnalyzer = SJISDistributionAnalysis()
+        self._mContextAnalyzer = SJISContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        MultiByteCharSetProber.reset(self)
+        self._mContextAnalyzer.reset()
+        
+    def get_charset_name(self):
+        return "SHIFT_JIS"
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mContextAnalyzer.feed(self._mLastChar[2 - charLen :], charLen)
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mContextAnalyzer.feed(aBuf[i + 1 - charLen : i + 3 - charLen], charLen)
+                    self._mDistributionAnalyzer.feed(aBuf[i - 1 : i + 1], charLen)
+                    
+        self._mLastChar[0] = aBuf[aLen - 1]
+        
+        if self.get_state() == constants.eDetecting:
+            if self._mContextAnalyzer.got_enough_data() and \
+                   (self.get_confidence() > constants.SHORTCUT_THRESHOLD):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        contxtCf = self._mContextAnalyzer.get_confidence()
+        distribCf = self._mDistributionAnalyzer.get_confidence()
+        return max(contxtCf, distribCf)
diff --git a/lib/requests/packages/chardet/universaldetector.py b/lib/requests/packages/chardet/universaldetector.py
new file mode 100755
index 0000000..809df22
--- /dev/null
+++ b/lib/requests/packages/chardet/universaldetector.py
@@ -0,0 +1,154 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, sys
+from latin1prober import Latin1Prober # windows-1252
+from mbcsgroupprober import MBCSGroupProber # multi-byte character sets
+from sbcsgroupprober import SBCSGroupProber # single-byte character sets
+from escprober import EscCharSetProber # ISO-2122, etc.
+import re
+
+MINIMUM_THRESHOLD = 0.20
+ePureAscii = 0
+eEscAscii = 1
+eHighbyte = 2
+
+class UniversalDetector:
+    def __init__(self):
+        self._highBitDetector = re.compile(r'[\x80-\xFF]')
+        self._escDetector = re.compile(r'(\033|~{)')
+        self._mEscCharSetProber = None
+        self._mCharSetProbers = []
+        self.reset()
+
+    def reset(self):
+        self.result = {'encoding': None, 'confidence': 0.0}
+        self.done = constants.False
+        self._mStart = constants.True
+        self._mGotData = constants.False
+        self._mInputState = ePureAscii
+        self._mLastChar = ''
+        if self._mEscCharSetProber:
+            self._mEscCharSetProber.reset()
+        for prober in self._mCharSetProbers:
+            prober.reset()
+
+    def feed(self, aBuf):
+        if self.done: return
+
+        aLen = len(aBuf)
+        if not aLen: return
+        
+        if not self._mGotData:
+            # If the data starts with BOM, we know it is UTF
+            if aBuf[:3] == '\xEF\xBB\xBF':
+                # EF BB BF  UTF-8 with BOM
+                self.result = {'encoding': "UTF-8", 'confidence': 1.0}
+            elif aBuf[:4] == '\xFF\xFE\x00\x00':
+                # FF FE 00 00  UTF-32, little-endian BOM
+                self.result = {'encoding': "UTF-32LE", 'confidence': 1.0}
+            elif aBuf[:4] == '\x00\x00\xFE\xFF': 
+                # 00 00 FE FF  UTF-32, big-endian BOM
+                self.result = {'encoding': "UTF-32BE", 'confidence': 1.0}
+            elif aBuf[:4] == '\xFE\xFF\x00\x00':
+                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)
+                self.result = {'encoding': "X-ISO-10646-UCS-4-3412", 'confidence': 1.0}
+            elif aBuf[:4] == '\x00\x00\xFF\xFE':
+                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)
+                self.result = {'encoding': "X-ISO-10646-UCS-4-2143", 'confidence': 1.0}
+            elif aBuf[:2] == '\xFF\xFE':
+                # FF FE  UTF-16, little endian BOM
+                self.result = {'encoding': "UTF-16LE", 'confidence': 1.0}
+            elif aBuf[:2] == '\xFE\xFF':
+                # FE FF  UTF-16, big endian BOM
+                self.result = {'encoding': "UTF-16BE", 'confidence': 1.0}
+
+        self._mGotData = constants.True
+        if self.result['encoding'] and (self.result['confidence'] > 0.0):
+            self.done = constants.True
+            return
+
+        if self._mInputState == ePureAscii:
+            if self._highBitDetector.search(aBuf):
+                self._mInputState = eHighbyte
+            elif (self._mInputState == ePureAscii) and self._escDetector.search(self._mLastChar + aBuf):
+                self._mInputState = eEscAscii
+
+        self._mLastChar = aBuf[-1]
+
+        if self._mInputState == eEscAscii:
+            if not self._mEscCharSetProber:
+                self._mEscCharSetProber = EscCharSetProber()
+            if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt:
+                self.result = {'encoding': self._mEscCharSetProber.get_charset_name(),
+                               'confidence': self._mEscCharSetProber.get_confidence()}
+                self.done = constants.True
+        elif self._mInputState == eHighbyte:
+            if not self._mCharSetProbers:
+                self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), Latin1Prober()]
+            for prober in self._mCharSetProbers:
+                if prober.feed(aBuf) == constants.eFoundIt:
+                    self.result = {'encoding': prober.get_charset_name(),
+                                   'confidence': prober.get_confidence()}
+                    self.done = constants.True
+                    break
+
+    def close(self):
+        if self.done: return
+        if not self._mGotData:
+            if constants._debug:
+                sys.stderr.write('no data received!\n')
+            return
+        self.done = constants.True
+        
+        if self._mInputState == ePureAscii:
+            self.result = {'encoding': 'ascii', 'confidence': 1.0}
+            return self.result
+
+        if self._mInputState == eHighbyte:
+            proberConfidence = None
+            maxProberConfidence = 0.0
+            maxProber = None
+            for prober in self._mCharSetProbers:
+                if not prober: continue
+                proberConfidence = prober.get_confidence()
+                if proberConfidence > maxProberConfidence:
+                    maxProberConfidence = proberConfidence
+                    maxProber = prober
+            if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD):
+                self.result = {'encoding': maxProber.get_charset_name(),
+                               'confidence': maxProber.get_confidence()}
+                return self.result
+
+        if constants._debug:
+            sys.stderr.write('no probers hit minimum threshhold\n')
+            for prober in self._mCharSetProbers[0].mProbers:
+                if not prober: continue
+                sys.stderr.write('%s confidence = %s\n' % \
+                                 (prober.get_charset_name(), \
+                                  prober.get_confidence()))
diff --git a/lib/requests/packages/chardet/utf8prober.py b/lib/requests/packages/chardet/utf8prober.py
new file mode 100755
index 0000000..c1792bb
--- /dev/null
+++ b/lib/requests/packages/chardet/utf8prober.py
@@ -0,0 +1,76 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import constants, sys
+from constants import eStart, eError, eItsMe
+from charsetprober import CharSetProber
+from codingstatemachine import CodingStateMachine
+from mbcssm import UTF8SMModel
+
+ONE_CHAR_PROB = 0.5
+
+class UTF8Prober(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(UTF8SMModel)
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        self._mCodingSM.reset()
+        self._mNumOfMBChar = 0
+
+    def get_charset_name(self):
+        return "utf-8"
+
+    def feed(self, aBuf):
+        for c in aBuf:
+            codingState = self._mCodingSM.next_state(c)
+            if codingState == eError:
+                self._mState = constants.eNotMe
+                break
+            elif codingState == eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == eStart:
+                if self._mCodingSM.get_current_charlen() >= 2:
+                    self._mNumOfMBChar += 1
+
+        if self.get_state() == constants.eDetecting:
+            if self.get_confidence() > constants.SHORTCUT_THRESHOLD:
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        unlike = 0.99
+        if self._mNumOfMBChar < 6:
+            for i in range(0, self._mNumOfMBChar):
+                unlike = unlike * ONE_CHAR_PROB
+            return 1.0 - unlike
+        else:
+            return unlike
diff --git a/lib/requests/packages/chardet2/__init__.py b/lib/requests/packages/chardet2/__init__.py
new file mode 100755
index 0000000..96e9ef8
--- /dev/null
+++ b/lib/requests/packages/chardet2/__init__.py
@@ -0,0 +1,26 @@
+######################## BEGIN LICENSE BLOCK ########################
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+__version__ = "2.0.1"
+
+def detect(aBuf):
+    from . import universaldetector
+    u = universaldetector.UniversalDetector()
+    u.reset()
+    u.feed(aBuf)
+    u.close()
+    return u.result
diff --git a/lib/requests/packages/chardet2/big5freq.py b/lib/requests/packages/chardet2/big5freq.py
new file mode 100755
index 0000000..c1b0f3c
--- /dev/null
+++ b/lib/requests/packages/chardet2/big5freq.py
@@ -0,0 +1,923 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Big5 frequency table
+# by Taiwan's Mandarin Promotion Council 
+# <http://www.edu.tw:81/mandr/>
+# 
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+# 
+# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+# 
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+#Char to FreqOrder table
+BIG5_TABLE_SIZE = 5376
+
+Big5CharToFreqOrder = ( \
+   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16
+3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32
+1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48
+  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64
+3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80
+4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96
+5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112
+ 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128
+ 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144
+ 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160
+2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176
+1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192
+3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208
+ 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240
+3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256
+2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272
+ 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288
+3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304
+1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320
+5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336
+ 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352
+5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368
+1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384
+  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400
+ 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416
+3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432
+3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448
+ 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464
+2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480
+2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496
+ 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512
+ 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528
+3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544
+1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560
+1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576
+1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592
+2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608
+ 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624
+4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640
+1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656
+5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672
+2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688
+ 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704
+  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720
+ 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736
+ 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752
+5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768
+ 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784
+1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800
+ 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816
+ 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832
+5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848
+1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864
+ 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880
+3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896
+4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912
+3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928
+ 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944
+ 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960
+1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976
+4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992
+3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
+3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
+2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
+5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056
+3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
+5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
+1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
+2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
+1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
+  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
+1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
+4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
+3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
+ 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
+ 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232
+ 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
+2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
+5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
+1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
+2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
+1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
+1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
+5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
+5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
+5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
+3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
+4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
+4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
+2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
+5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
+3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
+ 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
+5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520
+5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
+1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
+2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
+3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
+4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
+5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
+3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
+4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
+1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
+1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680
+4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
+1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
+ 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
+1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
+1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
+3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
+ 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
+5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
+2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
+1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
+1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856
+5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
+ 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
+4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
+ 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
+2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
+ 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
+1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
+1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
+ 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
+4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
+4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
+1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
+3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
+5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
+5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096
+1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
+2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
+1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
+3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
+2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
+3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
+2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
+4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
+4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
+3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
+  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
+3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
+ 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
+3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
+4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
+3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
+1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
+5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
+ 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
+5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
+1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
+ 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
+4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464
+4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
+ 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
+2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
+2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528
+3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
+1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
+4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
+2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
+1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
+1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
+2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
+3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
+1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
+5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688
+1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
+4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720
+1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
+ 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
+1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
+4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
+4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
+2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
+1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
+4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
+ 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
+5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
+2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
+3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
+4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
+ 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
+5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
+5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
+1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
+4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
+4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
+2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040
+3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
+3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
+2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
+1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
+4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
+3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
+3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
+2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
+4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184
+5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
+3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
+2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
+3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
+1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
+2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
+3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
+4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312
+2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
+2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
+5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
+1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
+2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
+1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
+3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
+4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440
+2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
+3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
+3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
+2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
+4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
+2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
+3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
+4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
+5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
+3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
+ 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
+1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632
+4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
+1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
+4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680
+5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
+ 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
+5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
+5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
+2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
+3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
+2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
+2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
+ 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
+1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
+4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
+3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
+3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
+ 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
+2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
+ 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
+2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
+4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
+1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
+4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
+1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
+3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
+ 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
+3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
+5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
+5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
+3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
+3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
+1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
+2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
+5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
+1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
+1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
+3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
+ 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
+1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
+4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
+5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
+2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
+3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
+ 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
+1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
+2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
+2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
+5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
+5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
+5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
+2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
+2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
+1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
+4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
+3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
+3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
+4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
+4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
+2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
+2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
+5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
+4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
+5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
+4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
+ 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
+ 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
+1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
+3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
+4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
+1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
+5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
+2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
+2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
+3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
+5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
+1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
+3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
+5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
+1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
+5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
+2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
+3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
+2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
+3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
+3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
+3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
+4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
+ 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
+2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
+4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
+3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
+5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
+1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
+5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
+ 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
+1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
+ 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
+4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
+1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
+4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
+1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
+ 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
+3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
+4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
+5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
+ 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
+3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
+ 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
+2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376  #last 512
+#Everything below is of no interest for detection purpose
+2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392
+2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408
+5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424
+5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440
+5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456
+5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472
+5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488
+5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504
+5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520
+5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536
+5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552
+5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568
+5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584
+5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600
+6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616
+6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632
+6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648
+6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664
+6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680
+6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696
+6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712
+6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728
+6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744
+6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760
+6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776
+6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792
+6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808
+6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824
+6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840
+6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856
+6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872
+6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888
+6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904
+6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920
+6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936
+6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952
+6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968
+6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984
+6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000
+6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016
+6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032
+6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048
+6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064
+6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080
+6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096
+6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112
+6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128
+6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144
+6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160
+6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176
+6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192
+6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208
+6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224
+6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240
+6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256
+3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272
+6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288
+6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304
+3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320
+6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336
+6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352
+6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368
+6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384
+6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400
+6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416
+6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432
+4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448
+6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464
+6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480
+3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496
+6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512
+6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528
+6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544
+6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560
+6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576
+6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592
+6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608
+6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624
+6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640
+6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656
+6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672
+7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688
+7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704
+7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720
+7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736
+7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752
+7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768
+7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784
+7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800
+7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816
+7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832
+7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848
+7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864
+7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880
+7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896
+7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912
+7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928
+7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944
+7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960
+7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976
+7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992
+7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008
+7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024
+7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040
+7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056
+7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072
+7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088
+7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104
+7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120
+7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136
+7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152
+7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168
+7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184
+7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200
+7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216
+7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232
+7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248
+7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264
+7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280
+7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296
+7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312
+7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328
+7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344
+7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360
+7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376
+7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392
+7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408
+7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424
+7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440
+3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456
+7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472
+7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488
+7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504
+7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520
+4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536
+7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552
+7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568
+7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584
+7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600
+7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616
+7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632
+7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648
+7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664
+7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680
+7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696
+7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712
+8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728
+8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744
+8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760
+8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776
+8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792
+8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808
+8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824
+8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840
+8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856
+8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872
+8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888
+8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904
+8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920
+8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936
+8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952
+8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968
+8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984
+8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000
+8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016
+8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032
+8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048
+8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064
+8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080
+8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096
+8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112
+8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128
+8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144
+8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160
+8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176
+8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192
+8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208
+8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224
+8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240
+8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256
+8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272
+8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288
+8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304
+8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320
+8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336
+8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352
+8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368
+8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384
+8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400
+8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416
+8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432
+8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448
+8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464
+8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480
+8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496
+8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512
+8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528
+8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544
+8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560
+8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576
+8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592
+8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608
+8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624
+8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640
+8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656
+8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672
+8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688
+4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704
+8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720
+8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736
+8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752
+8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768
+9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784
+9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800
+9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816
+9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832
+9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848
+9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864
+9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880
+9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896
+9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912
+9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928
+9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944
+9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960
+9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976
+9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992
+9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008
+9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024
+9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040
+9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056
+9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072
+9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088
+9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104
+9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120
+9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136
+9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152
+9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168
+9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184
+9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200
+9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216
+9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232
+9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248
+9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264
+9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280
+9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296
+9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312
+9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328
+9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344
+9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360
+9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376
+3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392
+9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408
+9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424
+9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440
+4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456
+9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472
+9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488
+9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504
+9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520
+9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536
+9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552
+9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568
+9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584
+9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600
+9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616
+9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632
+9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648
+9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664
+9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680
+9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696
+9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712
+9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728
+9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744
+9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760
+9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776
+9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792
+9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808
+9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824
+10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840
+10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856
+10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872
+10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888
+10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904
+10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920
+10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936
+10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952
+10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968
+4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984
+10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000
+10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016
+10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032
+10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048
+10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064
+10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080
+10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096
+10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112
+4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128
+10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144
+10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160
+10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176
+10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192
+10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208
+10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224
+10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240
+10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256
+10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272
+10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288
+10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304
+10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320
+10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336
+10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352
+10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368
+10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384
+10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400
+4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416
+10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432
+10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448
+10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464
+10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480
+10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496
+10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512
+10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528
+10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544
+10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560
+10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576
+10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592
+10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608
+10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624
+10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640
+10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656
+10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672
+10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688
+10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704
+10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720
+10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736
+10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752
+10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768
+10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784
+10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800
+10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816
+10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832
+10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848
+10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864
+10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880
+10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896
+11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912
+11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928
+11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944
+4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960
+11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976
+11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992
+11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008
+11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024
+11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040
+11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056
+11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072
+11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088
+11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104
+11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120
+11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136
+11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152
+11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168
+11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184
+11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200
+11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216
+11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232
+11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248
+11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264
+11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280
+11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296
+11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312
+11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328
+11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344
+11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360
+11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376
+11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392
+11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408
+11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424
+11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440
+11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456
+11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472
+4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488
+11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504
+11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520
+11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536
+11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552
+11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568
+11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584
+11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600
+11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616
+11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632
+11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648
+11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664
+11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680
+11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696
+11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712
+11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728
+11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744
+11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760
+11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776
+11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792
+11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808
+11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824
+11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840
+11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856
+11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872
+11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888
+11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904
+11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920
+11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936
+12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952
+12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968
+12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984
+12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000
+12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016
+12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032
+12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048
+12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064
+12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080
+12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096
+12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112
+12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128
+12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144
+12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160
+12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176
+4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192
+4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208
+4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224
+12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240
+12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256
+12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272
+12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288
+12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304
+12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320
+12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336
+12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352
+12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368
+12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384
+12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400
+12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416
+12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432
+12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448
+12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464
+12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480
+12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496
+12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512
+12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528
+12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544
+12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560
+12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576
+12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592
+12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608
+12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624
+12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640
+12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656
+12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672
+12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688
+12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704
+12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720
+12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736
+12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752
+12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768
+12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784
+12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800
+12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816
+12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832
+12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848
+12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864
+12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880
+12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896
+12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912
+12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928
+12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944
+12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960
+12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976
+4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992
+13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008
+13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024
+13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040
+13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056
+13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072
+13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088
+13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104
+4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120
+13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136
+13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152
+13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168
+13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184
+13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200
+13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216
+13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232
+13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248
+13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264
+13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280
+13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296
+13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312
+13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328
+13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344
+13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360
+5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376
+13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392
+13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408
+13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424
+13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440
+13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456
+13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472
+13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488
+13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504
+13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520
+13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536
+13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552
+13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568
+13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584
+13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600
+13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616
+13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632
+13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648
+13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664
+13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680
+13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696
+13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712
+13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728
+13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744
+13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760
+13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776
+13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792
+13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808
+13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824
+13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840
+13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856
+13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872
+13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888
+13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904
+13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920
+13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936
+13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952
+13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968
+13968,13969,13970,13971,13972) #13973
diff --git a/lib/requests/packages/chardet2/big5prober.py b/lib/requests/packages/chardet2/big5prober.py
new file mode 100755
index 0000000..d5b317d
--- /dev/null
+++ b/lib/requests/packages/chardet2/big5prober.py
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import Big5DistributionAnalysis
+from .mbcssm import Big5SMModel
+
+class Big5Prober(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(Big5SMModel)
+        self._mDistributionAnalyzer = Big5DistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "Big5"
diff --git a/lib/requests/packages/chardet2/chardistribution.py b/lib/requests/packages/chardet2/chardistribution.py
new file mode 100755
index 0000000..2c63061
--- /dev/null
+++ b/lib/requests/packages/chardet2/chardistribution.py
@@ -0,0 +1,200 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+from .euctwfreq import EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO
+from .euckrfreq import EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO
+from .gb2312freq import GB2312CharToFreqOrder, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO
+from .big5freq import Big5CharToFreqOrder, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO
+from .jisfreq import JISCharToFreqOrder, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO
+
+ENOUGH_DATA_THRESHOLD = 1024
+SURE_YES = 0.99
+SURE_NO = 0.01
+
+class CharDistributionAnalysis:
+    def __init__(self):
+        self._mCharToFreqOrder = None # Mapping table to get frequency order from char order (get from GetOrder())
+        self._mTableSize = None # Size of above table
+        self._mTypicalDistributionRatio = None # This is a constant value which varies from language to language, used in calculating confidence.  See http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html for further detail.
+        self.reset()
+        
+    def reset(self):
+        """reset analyser, clear any state"""
+        self._mDone = False # If this flag is set to True, detection is done and conclusion has been made
+        self._mTotalChars = 0 # Total characters encountered
+        self._mFreqChars = 0 # The number of characters whose frequency order is less than 512
+
+    def feed(self, aBuf, aCharLen):
+        """feed a character with known length"""
+        if aCharLen == 2:
+            # we only care about 2-bytes character in our distribution analysis
+            order = self.get_order(aBuf)
+        else:
+            order = -1
+        if order >= 0:
+            self._mTotalChars += 1
+            # order is valid
+            if order < self._mTableSize:
+                if 512 > self._mCharToFreqOrder[order]:
+                    self._mFreqChars += 1
+
+    def get_confidence(self):
+        """return confidence based on existing data"""
+        # if we didn't receive any character in our consideration range, return negative answer
+        if self._mTotalChars <= 0:
+            return SURE_NO
+
+        if self._mTotalChars != self._mFreqChars:
+            r = self._mFreqChars / ((self._mTotalChars - self._mFreqChars) * self._mTypicalDistributionRatio)
+            if r < SURE_YES:
+                return r
+
+        # normalize confidence (we don't want to be 100% sure)
+        return SURE_YES
+
+    def got_enough_data(self):
+        # It is not necessary to receive all data to draw conclusion. For charset detection,
+        # certain amount of data is enough
+        return self._mTotalChars > ENOUGH_DATA_THRESHOLD
+
+    def get_order(self, aBuf):
+        # We do not handle characters based on the original encoding string, but 
+        # convert this encoding string to a number, here called order.
+        # This allows multiple encodings of a language to share one frequency table.
+        return -1
+    
+class EUCTWDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = EUCTWCharToFreqOrder
+        self._mTableSize = EUCTW_TABLE_SIZE
+        self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for euc-TW encoding, we are interested 
+        #   first  byte range: 0xc4 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if aBuf[0] >= 0xC4:
+            return 94 * (aBuf[0] - 0xC4) + aBuf[1] - 0xA1
+        else:
+            return -1
+
+class EUCKRDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = EUCKRCharToFreqOrder
+        self._mTableSize = EUCKR_TABLE_SIZE
+        self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for euc-KR encoding, we are interested 
+        #   first  byte range: 0xb0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if aBuf[0] >= 0xB0:
+            return 94 * (aBuf[0] - 0xB0) + aBuf[1] - 0xA1
+        else:
+            return -1;
+
+class GB2312DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = GB2312CharToFreqOrder
+        self._mTableSize = GB2312_TABLE_SIZE
+        self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for GB2312 encoding, we are interested 
+        #  first  byte range: 0xb0 -- 0xfe
+        #  second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if (aBuf[0] >= 0xB0) and (aBuf[1] >= 0xA1):
+            return 94 * (aBuf[0] - 0xB0) + aBuf[1] - 0xA1
+        else:
+            return -1;
+
+class Big5DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = Big5CharToFreqOrder
+        self._mTableSize = BIG5_TABLE_SIZE
+        self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for big5 encoding, we are interested 
+        #   first  byte range: 0xa4 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if aBuf[0] >= 0xA4:
+            if aBuf[1] >= 0xA1:
+                return 157 * (aBuf[0] - 0xA4) + aBuf[1] - 0xA1 + 63
+            else:
+                return 157 * (aBuf[0] - 0xA4) + aBuf[1] - 0x40
+        else:
+            return -1
+
+class SJISDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = JISCharToFreqOrder
+        self._mTableSize = JIS_TABLE_SIZE
+        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for sjis encoding, we are interested 
+        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe
+        # no validation needed here. State machine has done that
+        if (aBuf[0] >= 0x81) and (aBuf[0] <= 0x9F):
+            order = 188 * (aBuf[0] - 0x81)
+        elif (aBuf[0] >= 0xE0) and (aBuf[0] <= 0xEF):
+            order = 188 * (aBuf[0] - 0xE0 + 31)
+        else:
+            return -1;
+        order = order + aBuf[1] - 0x40
+        if aBuf[1] > 0x7F:
+            order =- 1
+        return order
+
+class EUCJPDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = JISCharToFreqOrder
+        self._mTableSize = JIS_TABLE_SIZE
+        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for euc-JP encoding, we are interested 
+        #   first  byte range: 0xa0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        if aBuf[0] >= 0xA0:
+            return 94 * (aBuf[0] - 0xA1) + aBuf[1] - 0xa1
+        else:
+            return -1
diff --git a/lib/requests/packages/chardet2/charsetgroupprober.py b/lib/requests/packages/chardet2/charsetgroupprober.py
new file mode 100755
index 0000000..4376772
--- /dev/null
+++ b/lib/requests/packages/chardet2/charsetgroupprober.py
@@ -0,0 +1,97 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .charsetprober import CharSetProber
+
+class CharSetGroupProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mActiveNum = 0
+        self._mProbers = []
+        self._mBestGuessProber = None
+        
+    def reset(self):
+        CharSetProber.reset(self)
+        self._mActiveNum = 0
+        for prober in self._mProbers:
+            if prober:
+                prober.reset()
+                prober.active = True
+                self._mActiveNum += 1
+        self._mBestGuessProber = None
+
+    def get_charset_name(self):
+        if not self._mBestGuessProber:
+            self.get_confidence()
+            if not self._mBestGuessProber: return None
+#                self._mBestGuessProber = self._mProbers[0]
+        return self._mBestGuessProber.get_charset_name()
+
+    def feed(self, aBuf):
+        for prober in self._mProbers:
+            if not prober: continue
+            if not prober.active: continue
+            st = prober.feed(aBuf)
+            if not st: continue
+            if st == constants.eFoundIt:
+                self._mBestGuessProber = prober
+                return self.get_state()
+            elif st == constants.eNotMe:
+                prober.active = False
+                self._mActiveNum -= 1
+                if self._mActiveNum <= 0:
+                    self._mState = constants.eNotMe
+                    return self.get_state()
+        return self.get_state()
+
+    def get_confidence(self):
+        st = self.get_state()
+        if st == constants.eFoundIt:
+            return 0.99
+        elif st == constants.eNotMe:
+            return 0.01
+        bestConf = 0.0
+        self._mBestGuessProber = None
+        for prober in self._mProbers:
+            if not prober: continue
+            if not prober.active:
+                if constants._debug:
+                    sys.stderr.write(prober.get_charset_name() + ' not active\n')
+                continue
+            cf = prober.get_confidence()
+            if constants._debug:
+                sys.stderr.write('%s confidence = %s\n' % (prober.get_charset_name(), cf))
+            if bestConf < cf:
+                bestConf = cf
+                self._mBestGuessProber = prober
+        if not self._mBestGuessProber: return 0.0
+        return bestConf
+#        else:
+#            self._mBestGuessProber = self._mProbers[0]
+#            return self._mBestGuessProber.get_confidence()
diff --git a/lib/requests/packages/chardet2/charsetprober.py b/lib/requests/packages/chardet2/charsetprober.py
new file mode 100755
index 0000000..450c95e
--- /dev/null
+++ b/lib/requests/packages/chardet2/charsetprober.py
@@ -0,0 +1,61 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import re
+
+class CharSetProber:
+    def __init__(self):
+        pass
+        
+    def reset(self):
+        self._mState = constants.eDetecting
+    
+    def get_charset_name(self):
+        return None
+
+    def feed(self, aBuf):
+        pass
+
+    def get_state(self):
+        return self._mState
+
+    def get_confidence(self):
+        return 0.0
+
+    def filter_high_bit_only(self, aBuf):
+        aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf)
+        return aBuf
+    
+    def filter_without_english_letters(self, aBuf):
+        aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf)
+        return aBuf
+        
+    def filter_with_english_letters(self, aBuf):
+        # TODO
+        return aBuf
diff --git a/lib/requests/packages/chardet2/codingstatemachine.py b/lib/requests/packages/chardet2/codingstatemachine.py
new file mode 100755
index 0000000..66d766f
--- /dev/null
+++ b/lib/requests/packages/chardet2/codingstatemachine.py
@@ -0,0 +1,57 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .constants import eStart, eError, eItsMe
+
+class CodingStateMachine:
+    def __init__(self, sm):
+        self._mModel = sm
+        self._mCurrentBytePos = 0
+        self._mCurrentCharLen = 0
+        self.reset()
+
+    def reset(self):
+        self._mCurrentState = eStart
+
+    def next_state(self, c):
+        # for each byte we get its class
+        # if it is first byte, we also get byte length
+        # PY3K: aBuf is a byte stream, so c is an int, not a byte
+        byteCls = self._mModel['classTable'][c]
+        if self._mCurrentState == eStart:
+            self._mCurrentBytePos = 0
+            self._mCurrentCharLen = self._mModel['charLenTable'][byteCls]
+        # from byte's class and stateTable, we get its next state
+        self._mCurrentState = self._mModel['stateTable'][self._mCurrentState * self._mModel['classFactor'] + byteCls]
+        self._mCurrentBytePos += 1
+        return self._mCurrentState
+
+    def get_current_charlen(self):
+        return self._mCurrentCharLen
+
+    def get_coding_state_machine(self):
+        return self._mModel['name']
diff --git a/lib/requests/packages/chardet2/constants.py b/lib/requests/packages/chardet2/constants.py
new file mode 100755
index 0000000..a3d27de
--- /dev/null
+++ b/lib/requests/packages/chardet2/constants.py
@@ -0,0 +1,39 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+_debug = 0
+
+eDetecting = 0
+eFoundIt = 1
+eNotMe = 2
+
+eStart = 0
+eError = 1
+eItsMe = 2
+
+SHORTCUT_THRESHOLD = 0.95
diff --git a/lib/requests/packages/chardet2/escprober.py b/lib/requests/packages/chardet2/escprober.py
new file mode 100755
index 0000000..cfc833b
--- /dev/null
+++ b/lib/requests/packages/chardet2/escprober.py
@@ -0,0 +1,81 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .escsm import HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, ISO2022KRSMModel
+from .charsetprober import CharSetProber
+from .codingstatemachine import CodingStateMachine
+
+class EscCharSetProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mCodingSM = [ \
+            CodingStateMachine(HZSMModel),
+            CodingStateMachine(ISO2022CNSMModel),
+            CodingStateMachine(ISO2022JPSMModel),
+            CodingStateMachine(ISO2022KRSMModel)
+            ]
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        for codingSM in self._mCodingSM:
+            if not codingSM: continue
+            codingSM.active = True
+            codingSM.reset()
+        self._mActiveSM = len(self._mCodingSM)
+        self._mDetectedCharset = None
+
+    def get_charset_name(self):
+        return self._mDetectedCharset
+
+    def get_confidence(self):
+        if self._mDetectedCharset:
+            return 0.99
+        else:
+            return 0.00
+
+    def feed(self, aBuf):
+        for c in aBuf:
+            # PY3K: aBuf is a byte array, so c is an int, not a byte
+            for codingSM in self._mCodingSM:
+                if not codingSM: continue
+                if not codingSM.active: continue
+                codingState = codingSM.next_state(c)
+                if codingState == constants.eError:
+                    codingSM.active = False
+                    self._mActiveSM -= 1
+                    if self._mActiveSM <= 0:
+                        self._mState = constants.eNotMe
+                        return self.get_state()
+                elif codingState == constants.eItsMe:
+                    self._mState = constants.eFoundIt
+                    self._mDetectedCharset = codingSM.get_coding_state_machine()
+                    return self.get_state()
+                
+        return self.get_state()
diff --git a/lib/requests/packages/chardet2/escsm.py b/lib/requests/packages/chardet2/escsm.py
new file mode 100755
index 0000000..689d9bb
--- /dev/null
+++ b/lib/requests/packages/chardet2/escsm.py
@@ -0,0 +1,240 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .constants import eStart, eError, eItsMe
+
+HZ_cls = ( \
+1,0,0,0,0,0,0,0,  # 00 - 07 
+0,0,0,0,0,0,0,0,  # 08 - 0f 
+0,0,0,0,0,0,0,0,  # 10 - 17 
+0,0,0,1,0,0,0,0,  # 18 - 1f 
+0,0,0,0,0,0,0,0,  # 20 - 27 
+0,0,0,0,0,0,0,0,  # 28 - 2f 
+0,0,0,0,0,0,0,0,  # 30 - 37 
+0,0,0,0,0,0,0,0,  # 38 - 3f 
+0,0,0,0,0,0,0,0,  # 40 - 47 
+0,0,0,0,0,0,0,0,  # 48 - 4f 
+0,0,0,0,0,0,0,0,  # 50 - 57 
+0,0,0,0,0,0,0,0,  # 58 - 5f 
+0,0,0,0,0,0,0,0,  # 60 - 67 
+0,0,0,0,0,0,0,0,  # 68 - 6f 
+0,0,0,0,0,0,0,0,  # 70 - 77 
+0,0,0,4,0,5,2,0,  # 78 - 7f 
+1,1,1,1,1,1,1,1,  # 80 - 87 
+1,1,1,1,1,1,1,1,  # 88 - 8f 
+1,1,1,1,1,1,1,1,  # 90 - 97 
+1,1,1,1,1,1,1,1,  # 98 - 9f 
+1,1,1,1,1,1,1,1,  # a0 - a7 
+1,1,1,1,1,1,1,1,  # a8 - af 
+1,1,1,1,1,1,1,1,  # b0 - b7 
+1,1,1,1,1,1,1,1,  # b8 - bf 
+1,1,1,1,1,1,1,1,  # c0 - c7 
+1,1,1,1,1,1,1,1,  # c8 - cf 
+1,1,1,1,1,1,1,1,  # d0 - d7 
+1,1,1,1,1,1,1,1,  # d8 - df 
+1,1,1,1,1,1,1,1,  # e0 - e7 
+1,1,1,1,1,1,1,1,  # e8 - ef 
+1,1,1,1,1,1,1,1,  # f0 - f7 
+1,1,1,1,1,1,1,1,  # f8 - ff 
+)
+
+HZ_st = ( \
+eStart,eError,     3,eStart,eStart,eStart,eError,eError,# 00-07 
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f 
+eItsMe,eItsMe,eError,eError,eStart,eStart,     4,eError,# 10-17 
+     5,eError,     6,eError,     5,     5,     4,eError,# 18-1f 
+     4,eError,     4,     4,     4,eError,     4,eError,# 20-27 
+     4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f 
+)
+
+HZCharLenTable = (0, 0, 0, 0, 0, 0)
+
+HZSMModel = {'classTable': HZ_cls,
+             'classFactor': 6,
+             'stateTable': HZ_st,
+             'charLenTable': HZCharLenTable,
+             'name': "HZ-GB-2312"}
+
+ISO2022CN_cls = ( \
+2,0,0,0,0,0,0,0,  # 00 - 07 
+0,0,0,0,0,0,0,0,  # 08 - 0f 
+0,0,0,0,0,0,0,0,  # 10 - 17 
+0,0,0,1,0,0,0,0,  # 18 - 1f 
+0,0,0,0,0,0,0,0,  # 20 - 27 
+0,3,0,0,0,0,0,0,  # 28 - 2f 
+0,0,0,0,0,0,0,0,  # 30 - 37 
+0,0,0,0,0,0,0,0,  # 38 - 3f 
+0,0,0,4,0,0,0,0,  # 40 - 47 
+0,0,0,0,0,0,0,0,  # 48 - 4f 
+0,0,0,0,0,0,0,0,  # 50 - 57 
+0,0,0,0,0,0,0,0,  # 58 - 5f 
+0,0,0,0,0,0,0,0,  # 60 - 67 
+0,0,0,0,0,0,0,0,  # 68 - 6f 
+0,0,0,0,0,0,0,0,  # 70 - 77 
+0,0,0,0,0,0,0,0,  # 78 - 7f 
+2,2,2,2,2,2,2,2,  # 80 - 87 
+2,2,2,2,2,2,2,2,  # 88 - 8f 
+2,2,2,2,2,2,2,2,  # 90 - 97 
+2,2,2,2,2,2,2,2,  # 98 - 9f 
+2,2,2,2,2,2,2,2,  # a0 - a7 
+2,2,2,2,2,2,2,2,  # a8 - af 
+2,2,2,2,2,2,2,2,  # b0 - b7 
+2,2,2,2,2,2,2,2,  # b8 - bf 
+2,2,2,2,2,2,2,2,  # c0 - c7 
+2,2,2,2,2,2,2,2,  # c8 - cf 
+2,2,2,2,2,2,2,2,  # d0 - d7 
+2,2,2,2,2,2,2,2,  # d8 - df 
+2,2,2,2,2,2,2,2,  # e0 - e7 
+2,2,2,2,2,2,2,2,  # e8 - ef 
+2,2,2,2,2,2,2,2,  # f0 - f7 
+2,2,2,2,2,2,2,2,  # f8 - ff 
+)
+
+ISO2022CN_st = ( \
+eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 
+eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f 
+eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 
+eItsMe,eItsMe,eItsMe,eError,eError,eError,     4,eError,# 18-1f 
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 
+     5,     6,eError,eError,eError,eError,eError,eError,# 28-2f 
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 
+eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f 
+)
+
+ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022CNSMModel = {'classTable': ISO2022CN_cls,
+                    'classFactor': 9,
+                    'stateTable': ISO2022CN_st,
+                    'charLenTable': ISO2022CNCharLenTable,
+                    'name': "ISO-2022-CN"}
+
+ISO2022JP_cls = ( \
+2,0,0,0,0,0,0,0,  # 00 - 07 
+0,0,0,0,0,0,2,2,  # 08 - 0f 
+0,0,0,0,0,0,0,0,  # 10 - 17 
+0,0,0,1,0,0,0,0,  # 18 - 1f 
+0,0,0,0,7,0,0,0,  # 20 - 27 
+3,0,0,0,0,0,0,0,  # 28 - 2f 
+0,0,0,0,0,0,0,0,  # 30 - 37 
+0,0,0,0,0,0,0,0,  # 38 - 3f 
+6,0,4,0,8,0,0,0,  # 40 - 47 
+0,9,5,0,0,0,0,0,  # 48 - 4f 
+0,0,0,0,0,0,0,0,  # 50 - 57 
+0,0,0,0,0,0,0,0,  # 58 - 5f 
+0,0,0,0,0,0,0,0,  # 60 - 67 
+0,0,0,0,0,0,0,0,  # 68 - 6f 
+0,0,0,0,0,0,0,0,  # 70 - 77 
+0,0,0,0,0,0,0,0,  # 78 - 7f 
+2,2,2,2,2,2,2,2,  # 80 - 87 
+2,2,2,2,2,2,2,2,  # 88 - 8f 
+2,2,2,2,2,2,2,2,  # 90 - 97 
+2,2,2,2,2,2,2,2,  # 98 - 9f 
+2,2,2,2,2,2,2,2,  # a0 - a7 
+2,2,2,2,2,2,2,2,  # a8 - af 
+2,2,2,2,2,2,2,2,  # b0 - b7 
+2,2,2,2,2,2,2,2,  # b8 - bf 
+2,2,2,2,2,2,2,2,  # c0 - c7 
+2,2,2,2,2,2,2,2,  # c8 - cf 
+2,2,2,2,2,2,2,2,  # d0 - d7 
+2,2,2,2,2,2,2,2,  # d8 - df 
+2,2,2,2,2,2,2,2,  # e0 - e7 
+2,2,2,2,2,2,2,2,  # e8 - ef 
+2,2,2,2,2,2,2,2,  # f0 - f7 
+2,2,2,2,2,2,2,2,  # f8 - ff 
+)
+
+ISO2022JP_st = ( \
+eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 
+eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f 
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 
+eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f 
+eError,     5,eError,eError,eError,     4,eError,eError,# 20-27 
+eError,eError,eError,     6,eItsMe,eError,eItsMe,eError,# 28-2f 
+eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f 
+eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 
+)
+
+ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022JPSMModel = {'classTable': ISO2022JP_cls,
+                    'classFactor': 10,
+                    'stateTable': ISO2022JP_st,
+                    'charLenTable': ISO2022JPCharLenTable,
+                    'name': "ISO-2022-JP"}
+
+ISO2022KR_cls = ( \
+2,0,0,0,0,0,0,0,  # 00 - 07 
+0,0,0,0,0,0,0,0,  # 08 - 0f 
+0,0,0,0,0,0,0,0,  # 10 - 17 
+0,0,0,1,0,0,0,0,  # 18 - 1f 
+0,0,0,0,3,0,0,0,  # 20 - 27 
+0,4,0,0,0,0,0,0,  # 28 - 2f 
+0,0,0,0,0,0,0,0,  # 30 - 37 
+0,0,0,0,0,0,0,0,  # 38 - 3f 
+0,0,0,5,0,0,0,0,  # 40 - 47 
+0,0,0,0,0,0,0,0,  # 48 - 4f 
+0,0,0,0,0,0,0,0,  # 50 - 57 
+0,0,0,0,0,0,0,0,  # 58 - 5f 
+0,0,0,0,0,0,0,0,  # 60 - 67 
+0,0,0,0,0,0,0,0,  # 68 - 6f 
+0,0,0,0,0,0,0,0,  # 70 - 77 
+0,0,0,0,0,0,0,0,  # 78 - 7f 
+2,2,2,2,2,2,2,2,  # 80 - 87 
+2,2,2,2,2,2,2,2,  # 88 - 8f 
+2,2,2,2,2,2,2,2,  # 90 - 97 
+2,2,2,2,2,2,2,2,  # 98 - 9f 
+2,2,2,2,2,2,2,2,  # a0 - a7 
+2,2,2,2,2,2,2,2,  # a8 - af 
+2,2,2,2,2,2,2,2,  # b0 - b7 
+2,2,2,2,2,2,2,2,  # b8 - bf 
+2,2,2,2,2,2,2,2,  # c0 - c7 
+2,2,2,2,2,2,2,2,  # c8 - cf 
+2,2,2,2,2,2,2,2,  # d0 - d7 
+2,2,2,2,2,2,2,2,  # d8 - df 
+2,2,2,2,2,2,2,2,  # e0 - e7 
+2,2,2,2,2,2,2,2,  # e8 - ef 
+2,2,2,2,2,2,2,2,  # f0 - f7 
+2,2,2,2,2,2,2,2,  # f8 - ff 
+)
+
+ISO2022KR_st = ( \
+eStart,     3,eError,eStart,eStart,eStart,eError,eError,# 00-07 
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f 
+eItsMe,eItsMe,eError,eError,eError,     4,eError,eError,# 10-17 
+eError,eError,eError,eError,     5,eError,eError,eError,# 18-1f 
+eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 
+)
+
+ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0)
+
+ISO2022KRSMModel = {'classTable': ISO2022KR_cls,
+                    'classFactor': 6,
+                    'stateTable': ISO2022KR_st,
+                    'charLenTable': ISO2022KRCharLenTable,
+                    'name': "ISO-2022-KR"}
diff --git a/lib/requests/packages/chardet2/eucjpprober.py b/lib/requests/packages/chardet2/eucjpprober.py
new file mode 100755
index 0000000..d7739f2
--- /dev/null
+++ b/lib/requests/packages/chardet2/eucjpprober.py
@@ -0,0 +1,87 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .constants import eStart, eError, eItsMe
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCJPDistributionAnalysis
+from .jpcntx import EUCJPContextAnalysis
+from .mbcssm import EUCJPSMModel
+
+class EUCJPProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCJPSMModel)
+        self._mDistributionAnalyzer = EUCJPDistributionAnalysis()
+        self._mContextAnalyzer = EUCJPContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        MultiByteCharSetProber.reset(self)
+        self._mContextAnalyzer.reset()
+        
+    def get_charset_name(self):
+        return "EUC-JP"
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mContextAnalyzer.feed(self._mLastChar, charLen)
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mContextAnalyzer.feed(aBuf[i-1:i+1], charLen)
+                    self._mDistributionAnalyzer.feed(aBuf[i-1:i+1], charLen)
+                    
+        self._mLastChar[0] = aBuf[aLen - 1]
+        
+        if self.get_state() == constants.eDetecting:
+            if self._mContextAnalyzer.got_enough_data() and \
+                   (self.get_confidence() > constants.SHORTCUT_THRESHOLD):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        contxtCf = self._mContextAnalyzer.get_confidence()
+        distribCf = self._mDistributionAnalyzer.get_confidence()
+        return max(contxtCf, distribCf)
diff --git a/lib/requests/packages/chardet2/euckrfreq.py b/lib/requests/packages/chardet2/euckrfreq.py
new file mode 100755
index 0000000..1463fa1
--- /dev/null
+++ b/lib/requests/packages/chardet2/euckrfreq.py
@@ -0,0 +1,594 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+
+# 128  --> 0.79
+# 256  --> 0.92
+# 512  --> 0.986
+# 1024 --> 0.99944
+# 2048 --> 0.99999
+#
+# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
+# Random Distribution Ration = 512 / (2350-512) = 0.279.
+# 
+# Typical Distribution Ratio  
+
+EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
+
+EUCKR_TABLE_SIZE = 2352
+
+# Char to FreqOrder table , 
+EUCKRCharToFreqOrder = ( \
+  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,
+1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
+1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,
+ 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
+ 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,
+ 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,
+1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
+ 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
+ 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
+1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,
+1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
+1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
+1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
+1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
+ 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
+1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
+1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
+1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
+1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
+ 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
+1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
+ 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
+ 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
+1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
+ 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
+1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,
+ 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
+   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
+1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
+1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,
+1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,
+1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,
+ 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
+1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,
+ 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
+ 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,
+1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
+1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
+1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
+1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
+1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
+1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
+  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
+ 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,
+ 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
+1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
+ 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
+1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,
+ 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,
+ 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
+2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,
+ 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,
+ 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
+2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,
+2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
+2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
+ 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
+ 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
+2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
+ 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
+1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
+2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,
+1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
+2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
+2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
+1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
+ 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
+2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
+2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
+  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,
+ 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
+2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,
+1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
+2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,
+2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
+2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,
+2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
+2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,
+2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,
+1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
+2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
+2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
+2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
+2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
+2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,
+1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
+1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
+2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,
+1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,
+2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
+1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,
+ 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
+2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,
+ 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
+2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
+ 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,
+2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,
+2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,
+ 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
+2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,
+1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
+ 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
+1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
+2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
+1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
+2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
+ 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
+2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
+1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
+2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
+1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
+2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
+1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
+ 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
+2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
+2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
+ 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
+ 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,
+1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
+1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
+ 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
+2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
+2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
+ 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,
+ 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
+ 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
+2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
+  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
+ 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
+2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
+2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
+ 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,
+2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
+1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
+ 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,
+2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
+2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
+2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
+   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,
+ 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
+ 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
+2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,
+2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
+2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
+1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
+2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
+ 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256
+#Everything below is of no interest for detection purpose
+2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,
+2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,
+2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,
+2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704,
+2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,
+2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734,
+2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,
+2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,
+2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,
+2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793,
+2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,
+2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,
+2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,
+2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,
+1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869,
+2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883,
+2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,
+2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,
+2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331,
+2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945,
+2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,
+2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,
+2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,
+2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,
+3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021,
+3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,
+3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052,
+3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,
+3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080,
+3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,
+3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110,
+3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124,
+3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,
+3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,
+3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,
+3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,
+3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,
+3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,
+3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,
+3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,
+3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,
+3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279,
+3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,
+3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,
+3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,
+3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,
+3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,
+3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,
+3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389,
+3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,
+3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338,
+3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432,
+3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446,
+3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191,
+3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471,
+3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,
+1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499,
+1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513,
+3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525,
+3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,
+3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,
+3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,
+3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587,
+3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,
+3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,
+3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632,
+3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,
+3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663,
+3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,
+3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,
+3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583,
+1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722,
+3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,
+3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753,
+3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767,
+3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782,
+3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796,
+3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810,
+3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591,
+1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836,
+3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851,
+3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866,
+3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880,
+3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895,
+1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905,
+3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,
+3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934,
+3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603,
+3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,
+3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978,
+3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993,
+3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,
+4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024,
+4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,
+1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,
+4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069,
+4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083,
+4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,
+4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113,
+4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610,
+4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142,
+4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,
+4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,
+4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,
+4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,
+4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220,
+4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234,
+4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249,
+4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,
+4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279,
+4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294,
+4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,
+4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,
+4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341,
+4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,
+4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371,
+4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,
+4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,
+4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418,
+4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432,
+4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446,
+4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461,
+4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,
+4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491,
+4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,
+4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623,
+4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536,
+4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551,
+4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,
+4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581,
+4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627,
+4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,
+4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,
+4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,
+4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657,
+4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,
+4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687,
+1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700,
+4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715,
+4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,
+4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633,
+4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758,
+4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773,
+4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788,
+4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803,
+4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817,
+4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,
+4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,
+4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,
+4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,
+4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893,
+4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,
+4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923,
+4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938,
+4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,
+4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,
+4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645,
+4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,
+5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078,
+5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028,
+1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042,
+5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056,
+5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,
+5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,
+5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,
+5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118,
+1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132,
+5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,
+5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,
+5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,
+5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,
+5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206,
+1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218,
+5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,
+5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249,
+5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262,
+5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,
+5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,
+5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308,
+5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323,
+5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338,
+5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,
+5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,
+5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,
+5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400,
+5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415,
+5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,
+5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445,
+5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,
+5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,
+5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491,
+5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,
+5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,
+5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,
+5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554,
+5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,
+1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,
+5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600,
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615,
+5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,
+5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,
+5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,
+1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673,
+5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,
+5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703,
+5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716,
+5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729,
+5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744,
+1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758,
+5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773,
+1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786,
+5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801,
+5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,
+5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,
+5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,
+5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862,
+5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876,
+5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889,
+5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,
+5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687,
+5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,
+5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963,
+5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,
+5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,
+5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,
+6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,
+6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,
+6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,
+6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,
+6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086,
+6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,
+6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,
+6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133,
+6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147,
+6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,
+6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,
+6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194,
+6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,
+6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225,
+6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,
+6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256,
+6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271,  #1024
+6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,
+6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699,
+6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,
+6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,
+6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347,
+6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,
+6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,
+6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,
+6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,
+6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425,
+6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440,
+6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,
+6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,
+6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,
+6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266,
+6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,
+6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,
+6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,
+1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,
+6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,
+6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,
+6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613,
+6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629,
+6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644,
+1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659,
+6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,
+1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689,
+6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,
+6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,
+6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,
+1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748,
+6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763,
+6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,
+6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794,
+6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711,
+6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825,
+6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840,
+6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,
+6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872,
+6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888,
+6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903,
+6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918,
+6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,
+6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,
+6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,
+6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981,
+6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996,
+6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,
+7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,
+7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,
+7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,
+7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,
+7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,
+7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,
+7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,
+7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,
+7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,
+7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170,
+7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,
+7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,
+7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216,
+7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232,
+7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248,
+7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,
+7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,
+7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,
+7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312,
+7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,
+7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,
+7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,
+7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,
+7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,
+7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,
+7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423,
+7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,
+7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,
+7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,
+7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,
+7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,
+7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,
+7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,
+7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,
+7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,
+7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,
+7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,
+7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,
+7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,
+7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,
+7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,
+7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,
+7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,
+7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,
+7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,
+7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,
+7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,
+7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,
+7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,
+7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,
+7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,
+7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,
+7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,
+7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,
+7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,
+7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,
+7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,
+7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,
+7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,
+7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,
+7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,
+7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,
+8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,
+8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031,
+8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,
+8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,
+8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,
+8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,
+8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,
+8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127,
+8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,
+8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,
+8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,
+8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,
+8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,
+8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,
+8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,
+8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,
+8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,
+8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,
+8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,
+8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,
+8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,
+8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,
+8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,
+8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,
+8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,
+8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,
+8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,
+8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,
+8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,
+8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,
+8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,
+8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,
+8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,
+8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,
+8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,
+8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,
+8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,
+8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,
+8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,
+8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,
+8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,
+8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,
+8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,
+8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,
+8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,
+8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,
+8736,8737,8738,8739,8740,8741)
diff --git a/lib/requests/packages/chardet2/euckrprober.py b/lib/requests/packages/chardet2/euckrprober.py
new file mode 100755
index 0000000..2b9ba77
--- /dev/null
+++ b/lib/requests/packages/chardet2/euckrprober.py
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCKRDistributionAnalysis
+from .mbcssm import EUCKRSMModel
+
+class EUCKRProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCKRSMModel)
+        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "EUC-KR"
diff --git a/lib/requests/packages/chardet2/euctwfreq.py b/lib/requests/packages/chardet2/euctwfreq.py
new file mode 100755
index 0000000..c057209
--- /dev/null
+++ b/lib/requests/packages/chardet2/euctwfreq.py
@@ -0,0 +1,426 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# EUCTW frequency table
+# Converted from big5 work 
+# by Taiwan's Mandarin Promotion Council 
+# <http:#www.edu.tw:81/mandr/>
+
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+#
+# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+# 
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+# Char to FreqOrder table , 
+EUCTW_TABLE_SIZE = 8102
+
+EUCTWCharToFreqOrder = ( \
+   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110, # 2742
+3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643, # 2758
+1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931, # 2774
+  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790
+3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806
+4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604, # 2822
+7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80, # 2838
+ 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591, # 2854
+ 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870
+ 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886
+2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732, # 2902
+1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918
+3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934
+ 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246, # 2950
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966
+3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897, # 2982
+2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300, # 2998
+ 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014
+3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030
+1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046
+7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212, # 3062
+ 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876, # 3078
+7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029, # 3094
+1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305, # 3110
+  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788, # 3126
+ 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142
+3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794, # 3158
+3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707, # 3174
+ 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190
+2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346, # 3206
+2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222
+ 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238
+ 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254
+3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270
+1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286
+1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302
+1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7, # 3318
+2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334
+ 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350
+4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366
+1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382
+7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398
+2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414
+ 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430
+  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446
+ 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592, # 3462
+ 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478
+7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258, # 3494
+ 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510
+1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372, # 3526
+ 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542
+ 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558
+7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574
+1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590
+ 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606
+3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622
+4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638
+3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654
+ 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670
+ 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686
+1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702
+4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680, # 3718
+3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734
+3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750
+2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766
+7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809, # 3782
+3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798
+7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814
+1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830
+2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846
+1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862
+  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878
+1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894
+4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910
+3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926
+ 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942
+ 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816, # 3958
+ 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974
+2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990
+7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006
+1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022
+2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038
+1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054
+1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070
+7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086
+7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102
+7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118
+3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134
+4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150
+1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166
+7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182
+2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198
+7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214
+3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230
+3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473, # 4246
+7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262
+2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278
+7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294
+ 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310
+4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326
+2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342
+7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358
+3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374
+2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390
+2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366, # 4406
+ 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422
+2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438
+1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454
+1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470
+2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486
+1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502
+7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518
+7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534
+2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550
+4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566
+1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122, # 4582
+7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598
+ 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614
+4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630
+ 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646
+2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662
+ 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678
+1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694
+1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710
+ 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726
+3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742
+3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758
+1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774
+3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790
+7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806
+7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545, # 4822
+1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838
+2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854
+1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870
+3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886
+2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902
+3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918
+2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934
+4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950
+4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966
+3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982
+  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998
+3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014
+ 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030
+3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046
+3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062
+3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078
+1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094
+7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110
+ 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126
+7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142
+1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158
+ 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174
+4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730, # 5190
+3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206
+ 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222
+2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238
+2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686, # 5254
+3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270
+1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286
+4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302
+2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318
+1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334
+1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350
+2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366
+3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382
+1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398
+7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141, # 5414
+1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430
+4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625, # 5446
+1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462
+ 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478
+1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494
+3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510
+3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526
+2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542
+1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558
+4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574
+ 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590
+7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606
+2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622
+3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638
+4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654
+ 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670
+7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686
+7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702
+1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718
+4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734
+3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750
+2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590, # 5766
+3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782
+3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798
+2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814
+1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830
+4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846
+3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862
+3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878
+2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894
+4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977, # 5910
+7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926
+3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942
+2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958
+3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974
+1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990
+2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006
+3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022
+4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090, # 6038
+2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054
+2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070
+7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086
+1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102
+2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118
+1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134
+3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150
+4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838, # 6166
+2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182
+3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198
+3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214
+2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230
+4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246
+2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262
+3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278
+4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294
+7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310
+3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326
+ 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342
+1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632, # 6358
+4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374
+1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390
+4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769, # 6406
+7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422
+ 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438
+7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454
+2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470
+1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486
+1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502
+3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518
+ 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534
+ 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550
+ 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566
+3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582
+2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598
+ 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614
+7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630
+1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646
+3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662
+7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678
+1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694
+7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710
+4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726
+1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742
+2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758
+2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774
+4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790
+ 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806
+ 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822
+3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838
+3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854
+1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870
+2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886
+7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902
+1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918
+1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934
+3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950
+ 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966
+1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982
+4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998
+7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014
+2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030
+3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046
+ 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062
+1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078
+2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094
+2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110
+7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126
+7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142
+7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158
+2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174
+2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190
+1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206
+4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222
+3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238
+3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254
+4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270
+4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286
+2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302
+2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318
+7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334
+4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350
+7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366
+2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382
+1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398
+3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414
+4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430
+2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446
+ 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462
+2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478
+1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494
+2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510
+2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526
+4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542
+7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558
+1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574
+3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590
+7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606
+1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622
+8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638
+2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654
+8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670
+2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686
+2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702
+8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718
+8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734
+8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750
+ 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766
+8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782
+4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798
+3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814
+8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830
+1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846
+8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862
+ 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878
+1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894
+ 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910
+4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926
+1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942
+4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958
+1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974
+ 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990
+3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006
+4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022
+8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038
+ 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054
+3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070
+ 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086
+2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102
+#Everything below is of no interest for detection purpose
+2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118
+2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134
+8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150
+8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166
+8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182
+8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198
+8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214
+8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230
+8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246
+8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262
+8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278
+8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294
+8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310
+8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326
+8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342
+8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358
+8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374
+8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390
+8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406
+8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422
+8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438
+8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454
+8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470
+8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486
+8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502
+8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518
+8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534
+8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550
+8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566
+8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582
+8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598
+8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614
+8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630
+8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646
+8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662
+8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678
+8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694
+8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710
+8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726
+8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742
diff --git a/lib/requests/packages/chardet2/euctwprober.py b/lib/requests/packages/chardet2/euctwprober.py
new file mode 100755
index 0000000..e601adf
--- /dev/null
+++ b/lib/requests/packages/chardet2/euctwprober.py
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCTWDistributionAnalysis
+from .mbcssm import EUCTWSMModel
+
+class EUCTWProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCTWSMModel)
+        self._mDistributionAnalyzer = EUCTWDistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "EUC-TW"
diff --git a/lib/requests/packages/chardet2/gb2312freq.py b/lib/requests/packages/chardet2/gb2312freq.py
new file mode 100755
index 0000000..7a4d5a1
--- /dev/null
+++ b/lib/requests/packages/chardet2/gb2312freq.py
@@ -0,0 +1,471 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# GB2312 most frequently used character table
+#
+# Char to FreqOrder table , from hz6763
+
+# 512  --> 0.79  -- 0.79
+# 1024 --> 0.92  -- 0.13
+# 2048 --> 0.98  -- 0.06
+# 6768 --> 1.00  -- 0.02
+#
+# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
+# Random Distribution Ration = 512 / (3755 - 512) = 0.157
+# 
+# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
+
+GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
+
+GB2312_TABLE_SIZE = 3760
+
+GB2312CharToFreqOrder = ( \
+1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
+2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
+2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
+ 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
+1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
+1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
+ 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
+1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,
+2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
+3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
+ 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
+1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
+ 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
+2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,
+ 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
+2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
+1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
+3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,
+ 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
+1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
+ 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
+2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
+1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,
+3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
+1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
+2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
+1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
+ 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
+3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,
+3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
+ 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
+3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,
+ 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,
+1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
+3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
+2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,
+1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
+ 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
+1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,
+4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
+ 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
+3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,
+3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,
+ 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
+1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,
+2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
+1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
+1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
+ 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
+3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
+3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,
+4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
+ 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
+3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,
+1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
+1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
+4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
+ 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
+ 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,
+3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
+1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
+ 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,
+1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
+2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,
+ 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
+ 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,
+ 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
+3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
+4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,
+3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
+ 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
+2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
+2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,
+2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,
+ 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
+2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
+ 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,
+ 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
+ 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
+3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
+2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
+2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,
+1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
+  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
+2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
+  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
+ 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
+1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
+1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,
+ 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
+ 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
+1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
+2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
+3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
+2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
+2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
+2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
+3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
+1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,
+1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
+2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
+1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
+3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,
+1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
+1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
+3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
+ 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
+2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
+1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
+4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
+1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
+1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
+3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
+1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
+  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
+ 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,
+1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,
+ 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
+1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
+1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
+ 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
+3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
+4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
+3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
+2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
+2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
+1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
+3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
+2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
+1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
+1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,
+ 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
+2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
+2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
+3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
+4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
+3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
+ 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
+3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
+2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
+1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,
+ 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,
+ 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
+3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,
+4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
+2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
+1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
+1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
+ 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
+1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,
+3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
+ 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
+ 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,
+1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,
+  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
+1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,
+ 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
+2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
+ 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
+2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
+2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
+1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
+1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
+2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
+ 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
+1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
+1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
+2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
+2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,
+3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
+1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
+4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
+ 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
+ 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
+3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,
+1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,
+ 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,
+3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
+1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
+4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
+1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
+2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
+1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
+ 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
+1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
+3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,
+ 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
+2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
+ 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
+1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
+1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,
+1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
+3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
+2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
+3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
+3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
+3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
+ 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
+2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
+ 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
+2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
+  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
+1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,
+ 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
+ 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
+1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
+3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
+3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,
+1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,
+1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
+3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
+2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
+2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
+1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,
+3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
+ 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
+4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
+1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
+2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,
+3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
+3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
+1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,
+ 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
+ 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
+2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
+ 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,
+1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,
+ 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
+1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,
+1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
+1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
+1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,
+1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
+ 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
+ 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  # last 512
+#Everything below is of no interest for detection purpose
+5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636,
+5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874,
+5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278,
+3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806,
+4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827,
+5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512,
+5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578,
+4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828,
+4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105,
+4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189,
+4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561,
+3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226,
+6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778,
+4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039,
+6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404,
+4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213,
+4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739,
+4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328,
+5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592,
+3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424,
+4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270,
+3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232,
+4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456,
+4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121,
+6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971,
+6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409,
+5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519,
+4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367,
+6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834,
+4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460,
+5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464,
+5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709,
+5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906,
+6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530,
+3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262,
+6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920,
+4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190,
+5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318,
+6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538,
+6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697,
+4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544,
+5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016,
+4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638,
+5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006,
+5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071,
+4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552,
+4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556,
+5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432,
+4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632,
+4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885,
+5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336,
+4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729,
+4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854,
+4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332,
+5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004,
+5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419,
+4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293,
+3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580,
+4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339,
+6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341,
+5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493,
+5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046,
+4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904,
+6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728,
+5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350,
+6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233,
+4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944,
+5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413,
+5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700,
+3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999,
+5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694,
+6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571,
+4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359,
+6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178,
+4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421,
+4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330,
+6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855,
+3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587,
+6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803,
+4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791,
+3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304,
+3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445,
+3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506,
+4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856,
+2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057,
+5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777,
+4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369,
+5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028,
+5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914,
+5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175,
+4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681,
+5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534,
+4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912,
+5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054,
+1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336,
+3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666,
+4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375,
+4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113,
+6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614,
+4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173,
+5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197,
+3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271,
+5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423,
+5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529,
+5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921,
+3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837,
+5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922,
+5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187,
+3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382,
+5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628,
+5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683,
+5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053,
+6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928,
+4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662,
+6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663,
+4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554,
+3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191,
+4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013,
+5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932,
+5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055,
+5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829,
+3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096,
+3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660,
+6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199,
+6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748,
+5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402,
+6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957,
+6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668,
+6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763,
+6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407,
+6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051,
+5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429,
+6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791,
+6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028,
+3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305,
+3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159,
+4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683,
+4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372,
+3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514,
+5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544,
+5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472,
+5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716,
+5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905,
+5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327,
+4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030,
+5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281,
+6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224,
+5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327,
+4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062,
+4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354,
+6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065,
+3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953,
+4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681,
+4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708,
+5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442,
+6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387,
+6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237,
+4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713,
+6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547,
+5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957,
+5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337,
+5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074,
+5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685,
+5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455,
+4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722,
+5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615,
+5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093,
+5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989,
+5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094,
+6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212,
+4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967,
+5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733,
+4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260,
+4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864,
+6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353,
+4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095,
+6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287,
+3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504,
+5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539,
+6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750,
+6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864,
+6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213,
+5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573,
+6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252,
+6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970,
+3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703,
+5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978,
+4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767)
+
diff --git a/lib/requests/packages/chardet2/gb2312prober.py b/lib/requests/packages/chardet2/gb2312prober.py
new file mode 100755
index 0000000..643fe25
--- /dev/null
+++ b/lib/requests/packages/chardet2/gb2312prober.py
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import GB2312DistributionAnalysis
+from .mbcssm import GB2312SMModel
+
+class GB2312Prober(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(GB2312SMModel)
+        self._mDistributionAnalyzer = GB2312DistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "GB2312"
diff --git a/lib/requests/packages/chardet2/hebrewprober.py b/lib/requests/packages/chardet2/hebrewprober.py
new file mode 100755
index 0000000..42bf98d
--- /dev/null
+++ b/lib/requests/packages/chardet2/hebrewprober.py
@@ -0,0 +1,269 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Shy Shalom
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from . import constants
+
+# This prober doesn't actually recognize a language or a charset.
+# It is a helper prober for the use of the Hebrew model probers
+
+### General ideas of the Hebrew charset recognition ###
+#
+# Four main charsets exist in Hebrew:
+# "ISO-8859-8" - Visual Hebrew
+# "windows-1255" - Logical Hebrew 
+# "ISO-8859-8-I" - Logical Hebrew
+# "x-mac-hebrew" - ?? Logical Hebrew ??
+#
+# Both "ISO" charsets use a completely identical set of code points, whereas
+# "windows-1255" and "x-mac-hebrew" are two different proper supersets of 
+# these code points. windows-1255 defines additional characters in the range
+# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific 
+# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
+# x-mac-hebrew defines similar additional code points but with a different 
+# mapping.
+#
+# As far as an average Hebrew text with no diacritics is concerned, all four 
+# charsets are identical with respect to code points. Meaning that for the 
+# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters 
+# (including final letters).
+#
+# The dominant difference between these charsets is their directionality.
+# "Visual" directionality means that the text is ordered as if the renderer is
+# not aware of a BIDI rendering algorithm. The renderer sees the text and 
+# draws it from left to right. The text itself when ordered naturally is read 
+# backwards. A buffer of Visual Hebrew generally looks like so:
+# "[last word of first line spelled backwards] [whole line ordered backwards
+# and spelled backwards] [first word of first line spelled backwards] 
+# [end of line] [last word of second line] ... etc' "
+# adding punctuation marks, numbers and English text to visual text is
+# naturally also "visual" and from left to right.
+# 
+# "Logical" directionality means the text is ordered "naturally" according to
+# the order it is read. It is the responsibility of the renderer to display 
+# the text from right to left. A BIDI algorithm is used to place general 
+# punctuation marks, numbers and English text in the text.
+#
+# Texts in x-mac-hebrew are almost impossible to find on the Internet. From 
+# what little evidence I could find, it seems that its general directionality
+# is Logical.
+#
+# To sum up all of the above, the Hebrew probing mechanism knows about two
+# charsets:
+# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
+#    backwards while line order is natural. For charset recognition purposes
+#    the line order is unimportant (In fact, for this implementation, even 
+#    word order is unimportant).
+# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
+#
+# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be 
+#    specifically identified.
+# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
+#    that contain special punctuation marks or diacritics is displayed with
+#    some unconverted characters showing as question marks. This problem might
+#    be corrected using another model prober for x-mac-hebrew. Due to the fact
+#    that x-mac-hebrew texts are so rare, writing another model prober isn't 
+#    worth the effort and performance hit.
+#
+#### The Prober ####
+#
+# The prober is divided between two SBCharSetProbers and a HebrewProber,
+# all of which are managed, created, fed data, inquired and deleted by the
+# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
+# fact some kind of Hebrew, Logical or Visual. The final decision about which
+# one is it is made by the HebrewProber by combining final-letter scores
+# with the scores of the two SBCharSetProbers to produce a final answer.
+#
+# The SBCSGroupProber is responsible for stripping the original text of HTML
+# tags, English characters, numbers, low-ASCII punctuation characters, spaces
+# and new lines. It reduces any sequence of such characters to a single space.
+# The buffer fed to each prober in the SBCS group prober is pure text in
+# high-ASCII.
+# The two SBCharSetProbers (model probers) share the same language model:
+# Win1255Model.
+# The first SBCharSetProber uses the model normally as any other
+# SBCharSetProber does, to recognize windows-1255, upon which this model was
+# built. The second SBCharSetProber is told to make the pair-of-letter
+# lookup in the language model backwards. This in practice exactly simulates
+# a visual Hebrew model using the windows-1255 logical Hebrew model.
+#
+# The HebrewProber is not using any language model. All it does is look for
+# final-letter evidence suggesting the text is either logical Hebrew or visual
+# Hebrew. Disjointed from the model probers, the results of the HebrewProber
+# alone are meaningless. HebrewProber always returns 0.00 as confidence
+# since it never identifies a charset by itself. Instead, the pointer to the
+# HebrewProber is passed to the model probers as a helper "Name Prober".
+# When the Group prober receives a positive identification from any prober,
+# it asks for the name of the charset identified. If the prober queried is a
+# Hebrew model prober, the model prober forwards the call to the
+# HebrewProber to make the final decision. In the HebrewProber, the
+# decision is made according to the final-letters scores maintained and Both
+# model probers scores. The answer is returned in the form of the name of the
+# charset identified, either "windows-1255" or "ISO-8859-8".
+
+# windows-1255 / ISO-8859-8 code points of interest
+FINAL_KAF = '\xea'
+NORMAL_KAF = '\xeb'
+FINAL_MEM = '\xed'
+NORMAL_MEM = '\xee'
+FINAL_NUN = '\xef'
+NORMAL_NUN = '\xf0'
+FINAL_PE = '\xf3'
+NORMAL_PE = '\xf4'
+FINAL_TSADI = '\xf5'
+NORMAL_TSADI = '\xf6'
+
+# Minimum Visual vs Logical final letter score difference.
+# If the difference is below this, don't rely solely on the final letter score distance.
+MIN_FINAL_CHAR_DISTANCE = 5
+
+# Minimum Visual vs Logical model score difference.
+# If the difference is below this, don't rely at all on the model score distance.
+MIN_MODEL_DISTANCE = 0.01
+
+VISUAL_HEBREW_NAME = "ISO-8859-8"
+LOGICAL_HEBREW_NAME = "windows-1255"
+
+class HebrewProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mLogicalProber = None
+        self._mVisualProber = None
+        self.reset()
+
+    def reset(self):
+        self._mFinalCharLogicalScore = 0
+        self._mFinalCharVisualScore = 0
+        # The two last characters seen in the previous buffer,
+        # mPrev and mBeforePrev are initialized to space in order to simulate a word 
+        # delimiter at the beginning of the data
+        self._mPrev = ' '
+        self._mBeforePrev = ' '
+        # These probers are owned by the group prober.
+        
+    def set_model_probers(self, logicalProber, visualProber):
+        self._mLogicalProber = logicalProber
+        self._mVisualProber = visualProber
+
+    def is_final(self, c):
+        return c in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, FINAL_TSADI]
+
+    def is_non_final(self, c):
+        # The normal Tsadi is not a good Non-Final letter due to words like 
+        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This 
+        # apostrophe is converted to a space in FilterWithoutEnglishLetters causing 
+        # the Non-Final tsadi to appear at an end of a word even though this is not 
+        # the case in the original text.
+        # The letters Pe and Kaf rarely display a related behavior of not being a 
+        # good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for 
+        # example legally end with a Non-Final Pe or Kaf. However, the benefit of 
+        # these letters as Non-Final letters outweighs the damage since these words 
+        # are quite rare.
+        return c in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE]
+    
+    def feed(self, aBuf):
+        # Final letter analysis for logical-visual decision.
+        # Look for evidence that the received buffer is either logical Hebrew or 
+        # visual Hebrew.
+        # The following cases are checked:
+        # 1) A word longer than 1 letter, ending with a final letter. This is an 
+        #    indication that the text is laid out "naturally" since the final letter 
+        #    really appears at the end. +1 for logical score.
+        # 2) A word longer than 1 letter, ending with a Non-Final letter. In normal
+        #    Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with
+        #    the Non-Final form of that letter. Exceptions to this rule are mentioned
+        #    above in isNonFinal(). This is an indication that the text is laid out
+        #    backwards. +1 for visual score
+        # 3) A word longer than 1 letter, starting with a final letter. Final letters 
+        #    should not appear at the beginning of a word. This is an indication that 
+        #    the text is laid out backwards. +1 for visual score.
+        # 
+        # The visual score and logical score are accumulated throughout the text and 
+        # are finally checked against each other in GetCharSetName().
+        # No checking for final letters in the middle of words is done since that case
+        # is not an indication for either Logical or Visual text.
+        # 
+        # We automatically filter out all 7-bit characters (replace them with spaces)
+        # so the word boundary detection works properly. [MAP]
+
+        if self.get_state() == constants.eNotMe:
+            # Both model probers say it's not them. No reason to continue.
+            return constants.eNotMe
+
+        aBuf = self.filter_high_bit_only(aBuf)
+        
+        for cur in aBuf:
+            if cur == ' ':
+                # We stand on a space - a word just ended
+                if self._mBeforePrev != ' ':
+                    # next-to-last char was not a space so self._mPrev is not a 1 letter word
+                    if self.is_final(self._mPrev):
+                        # case (1) [-2:not space][-1:final letter][cur:space]
+                        self._mFinalCharLogicalScore += 1
+                    elif self.is_non_final(self._mPrev):
+                        # case (2) [-2:not space][-1:Non-Final letter][cur:space]
+                        self._mFinalCharVisualScore += 1
+            else:
+                # Not standing on a space
+                if (self._mBeforePrev == ' ') and (self.is_final(self._mPrev)) and (cur != ' '):
+                    # case (3) [-2:space][-1:final letter][cur:not space]
+                    self._mFinalCharVisualScore += 1
+            self._mBeforePrev = self._mPrev
+            self._mPrev = cur
+
+        # Forever detecting, till the end or until both model probers return eNotMe (handled above)
+        return constants.eDetecting
+
+    def get_charset_name(self):
+        # Make the decision: is it Logical or Visual?
+        # If the final letter score distance is dominant enough, rely on it.
+        finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore
+        if finalsub >= MIN_FINAL_CHAR_DISTANCE:
+            return LOGICAL_HEBREW_NAME
+        if finalsub <= -MIN_FINAL_CHAR_DISTANCE:
+            return VISUAL_HEBREW_NAME
+
+        # It's not dominant enough, try to rely on the model scores instead.
+        modelsub = self._mLogicalProber.get_confidence() - self._mVisualProber.get_confidence()
+        if modelsub > MIN_MODEL_DISTANCE:
+            return LOGICAL_HEBREW_NAME
+        if modelsub < -MIN_MODEL_DISTANCE:
+            return VISUAL_HEBREW_NAME
+
+        # Still no good, back to final letter distance, maybe it'll save the day.
+        if finalsub < 0.0:
+            return VISUAL_HEBREW_NAME
+
+        # (finalsub > 0 - Logical) or (don't know what to do) default to Logical.
+        return LOGICAL_HEBREW_NAME
+
+    def get_state(self):
+        # Remain active as long as any of the model probers are active.
+        if (self._mLogicalProber.get_state() == constants.eNotMe) and \
+           (self._mVisualProber.get_state() == constants.eNotMe):
+            return constants.eNotMe
+        return constants.eDetecting
diff --git a/lib/requests/packages/chardet2/jisfreq.py b/lib/requests/packages/chardet2/jisfreq.py
new file mode 100755
index 0000000..5fe4a5c
--- /dev/null
+++ b/lib/requests/packages/chardet2/jisfreq.py
@@ -0,0 +1,567 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+#
+# Japanese frequency table, applied to both S-JIS and EUC-JP
+# They are sorted in order. 
+
+# 128  --> 0.77094
+# 256  --> 0.85710
+# 512  --> 0.92635
+# 1024 --> 0.97130
+# 2048 --> 0.99431
+#
+# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
+# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
+# 
+# Typical Distribution Ratio, 25% of IDR 
+
+JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
+
+# Char to FreqOrder table , 
+JIS_TABLE_SIZE = 4368
+
+JISCharToFreqOrder = ( \
+  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16
+3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32
+1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48
+2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64
+2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80
+5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96
+1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112
+5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128
+5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144
+5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160
+5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176
+5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192
+5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208
+1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224
+1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240
+1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256
+2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272
+3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288
+3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304
+   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320
+  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336
+1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352
+ 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368
+5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384
+ 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400
+  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416
+  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432
+ 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448
+  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464
+5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480
+5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496
+5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512
+4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528
+5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544
+5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560
+5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576
+5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592
+5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608
+5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624
+5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640
+5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656
+5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672
+3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688
+5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704
+5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720
+5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736
+5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752
+5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768
+5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784
+5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800
+5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816
+5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832
+5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848
+5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864
+5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880
+5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912
+5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928
+5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944
+5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960
+5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976
+5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992
+5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
+5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
+5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
+5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
+5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
+5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
+5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
+5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
+5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
+5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
+5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
+5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
+5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
+5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
+5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
+5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
+5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
+5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
+6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
+6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
+6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
+6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
+6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
+6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
+6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
+6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
+4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
+ 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
+ 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
+1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488
+1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
+ 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
+3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
+3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
+ 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
+3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
+3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
+ 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
+2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
+ 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
+3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
+1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
+ 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
+1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
+ 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
+2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
+2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
+2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
+2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
+1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
+1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
+1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
+1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
+2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
+1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
+2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
+1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
+1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
+1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
+1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
+1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
+1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
+ 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
+ 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
+1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
+2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
+2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
+2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
+3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
+3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
+ 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
+3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
+1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176
+ 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
+2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
+1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
+ 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
+3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
+4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
+2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
+1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
+2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
+1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
+ 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
+ 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
+1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
+2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
+2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
+2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
+3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
+1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
+2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
+ 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
+ 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
+ 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
+1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544
+2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
+ 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
+1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
+1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
+ 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
+1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
+1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
+1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
+ 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
+2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
+ 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
+2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
+3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
+2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
+1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
+6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800
+1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
+2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
+1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
+ 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
+  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
+3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
+3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
+1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
+1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
+1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
+1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
+ 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
+ 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
+2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
+ 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
+3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
+2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
+ 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
+1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
+2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
+ 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
+1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
+ 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
+4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
+2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
+1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
+ 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
+1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
+2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
+ 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
+6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
+1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
+1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
+2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
+3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
+ 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
+3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
+1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
+ 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
+1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
+ 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
+3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
+ 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
+2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
+ 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
+4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
+2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
+1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
+1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
+1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
+ 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
+1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
+3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
+1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
+3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
+ 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
+ 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
+ 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
+2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
+1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
+ 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
+1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
+ 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
+1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
+ 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
+ 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
+ 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872
+1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
+1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
+2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
+4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
+ 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952
+1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
+ 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
+1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
+3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
+1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
+2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
+2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
+1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
+1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
+2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
+ 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
+2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
+1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
+1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
+1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192
+1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
+3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
+2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
+2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
+ 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
+3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
+3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
+1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
+2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
+1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
+2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512
+#Everything below is of no interest for detection purpose
+2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384
+6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400
+6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416
+6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432
+6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448
+4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464
+4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480
+3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496
+3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512
+4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528
+3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544
+6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560
+4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576
+6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592
+6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608
+6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624
+6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640
+6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656
+6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672
+3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688
+3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704
+6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720
+2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736
+4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752
+4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768
+4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784
+6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800
+3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816
+4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832
+4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848
+6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864
+4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880
+6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896
+3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912
+2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928
+4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944
+2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960
+6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976
+4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992
+6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008
+6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024
+6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040
+4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056
+6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072
+2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088
+6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104
+4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120
+6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136
+4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152
+4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168
+6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184
+6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200
+6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216
+3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232
+1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248
+3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264
+3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280
+4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296
+6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312
+3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328
+6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344
+3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360
+3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376
+2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392
+6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408
+6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424
+3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440
+6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456
+3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472
+6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488
+6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504
+6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520
+4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536
+6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552
+4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568
+3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584
+3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600
+6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616
+6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632
+4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648
+6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664
+6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680
+6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696
+6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712
+6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728
+6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744
+4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760
+4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776
+3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792
+6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808
+4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824
+2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840
+6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856
+6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872
+4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888
+2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904
+4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920
+2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936
+4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952
+4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968
+4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984
+6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000
+3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016
+6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032
+3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048
+6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064
+2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080
+3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096
+7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112
+2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128
+3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144
+3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160
+3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176
+3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192
+7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208
+7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224
+7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240
+7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256
+7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272
+4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288
+3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304
+3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320
+4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336
+3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352
+3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368
+7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384
+4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400
+7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416
+7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432
+7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448
+7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464
+7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480
+4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496
+4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512
+7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528
+3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544
+4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560
+7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576
+7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592
+4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608
+3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624
+3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640
+7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656
+4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672
+4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688
+4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704
+4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720
+4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736
+4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752
+7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768
+7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784
+7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800
+7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816
+7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832
+2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848
+3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864
+7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880
+7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896
+3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912
+4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928
+3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944
+3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960
+2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976
+7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992
+7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008
+4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024
+3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040
+3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056
+7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072
+7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088
+7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104
+4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120
+7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136
+2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152
+3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168
+4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184
+7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200
+4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216
+4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232
+7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248
+7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264
+5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280
+7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296
+7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312
+7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328
+7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344
+7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360
+5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376
+5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392
+7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408
+3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424
+7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440
+7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456
+3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472
+7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488
+7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504
+1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520
+3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536
+4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552
+2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568
+3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584
+2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600
+5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616
+4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632
+4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648
+5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664
+7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680
+7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696
+7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712
+7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728
+3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744
+7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760
+3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776
+7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792
+4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808
+7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824
+7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840
+7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856
+7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872
+7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888
+7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904
+7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920
+7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936
+7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952
+7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968
+7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984
+7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000
+8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016
+8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032
+8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048
+8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064
+8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080
+8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096
+8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112
+8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128
+8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144
+8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160
+8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176
+8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192
+8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208
+8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224
+8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240
+8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256
+8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272
diff --git a/lib/requests/packages/chardet2/jpcntx.py b/lib/requests/packages/chardet2/jpcntx.py
new file mode 100755
index 0000000..3abfe7b
--- /dev/null
+++ b/lib/requests/packages/chardet2/jpcntx.py
@@ -0,0 +1,210 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+
+NUM_OF_CATEGORY = 6
+DONT_KNOW = -1
+ENOUGH_REL_THRESHOLD = 100
+MAX_REL_THRESHOLD = 1000
+MINIMUM_DATA_THRESHOLD = 4
+
+# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
+jp2CharContext = ( \
+(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
+(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),
+(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
+(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),
+(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),
+(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),
+(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),
+(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),
+(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),
+(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),
+(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),
+(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),
+(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),
+(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),
+(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),
+(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),
+(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),
+(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),
+(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),
+(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),
+(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),
+(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),
+(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),
+(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),
+(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),
+(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),
+(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),
+(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),
+(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
+(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),
+(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),
+(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),
+(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),
+(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),
+(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),
+(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),
+(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),
+(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),
+(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),
+(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),
+(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),
+(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),
+(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2),
+(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),
+(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),
+(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),
+(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),
+(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),
+(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),
+(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),
+(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),
+(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3),
+(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),
+(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),
+(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3),
+(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),
+(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),
+(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),
+(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),
+(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),
+(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),
+(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),
+(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2),
+(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),
+(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),
+(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),
+(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),
+(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),
+(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),
+(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),
+(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),
+(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),
+(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),
+(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),
+)
+
+class JapaneseContextAnalysis:
+    def __init__(self):
+        self.reset()
+        
+    def reset(self):
+        self._mTotalRel = 0 # total sequence received
+        self._mRelSample = [0] * NUM_OF_CATEGORY # category counters, each interger counts sequence in its category
+        self._mNeedToSkipCharNum = 0 # if last byte in current buffer is not the last byte of a character, we need to know how many bytes to skip in next buffer
+        self._mLastCharOrder = -1 # The order of previous char
+        self._mDone = False # If this flag is set to True, detection is done and conclusion has been made
+
+    def feed(self, aBuf, aLen):
+        if self._mDone: return
+        
+        # The buffer we got is byte oriented, and a character may span in more than one
+        # buffers. In case the last one or two byte in last buffer is not complete, we 
+        # record how many byte needed to complete that character and skip these bytes here.
+        # We can choose to record those bytes as well and analyse the character once it 
+        # is complete, but since a character will not make much difference, by simply skipping
+        # this character will simply our logic and improve performance.
+        i = self._mNeedToSkipCharNum
+        while i < aLen:
+            order, charLen = self.get_order(aBuf[i:i+2])
+            i += charLen
+            if i > aLen:
+                self._mNeedToSkipCharNum = i - aLen
+                self._mLastCharOrder = -1
+            else:
+                if (order != -1) and (self._mLastCharOrder != -1):
+                    self._mTotalRel += 1
+                    if self._mTotalRel > MAX_REL_THRESHOLD:
+                        self._mDone = True
+                        break
+                    self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1
+                self._mLastCharOrder = order
+
+    def got_enough_data(self):
+        return self._mTotalRel > ENOUGH_REL_THRESHOLD
+    
+    def get_confidence(self):
+        # This is just one way to calculate confidence. It works well for me.
+        if self._mTotalRel > MINIMUM_DATA_THRESHOLD:
+            return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel
+        else:
+            return DONT_KNOW
+
+    def get_order(self, aBuf):
+        return -1, 1
+        
+class SJISContextAnalysis(JapaneseContextAnalysis):
+    def get_order(self, aBuf):
+        if not aBuf: return -1, 1
+        # find out current char's byte length
+        if ((aBuf[0] >= 0x81) and (aBuf[0] <= 0x9F)) or \
+           ((aBuf[0] >= 0xE0) and (aBuf[0] <= 0xFC)):
+            charLen = 2
+        else:
+            charLen = 1
+
+        # return its order if it is hiragana
+        if len(aBuf) > 1:
+            if (aBuf[0] == 202) and \
+               (aBuf[1] >= 0x9F) and \
+               (aBuf[1] <= 0xF1):
+                return aBuf[1] - 0x9F, charLen
+
+        return -1, charLen
+
+class EUCJPContextAnalysis(JapaneseContextAnalysis):
+    def get_order(self, aBuf):
+        if not aBuf: return -1, 1
+        # find out current char's byte length
+        if (aBuf[0] == 0x8E) or \
+           ((aBuf[0] >= 0xA1) and (aBuf[0] <= 0xFE)):
+            charLen = 2
+        elif aBuf[0] == 0x8F:
+            charLen = 3
+        else:
+            charLen = 1
+
+        # return its order if it is hiragana
+        if len(aBuf) > 1:
+            if (aBuf[0] == 0xA4) and \
+               (aBuf[1] >= 0xA1) and \
+               (aBuf[1] <= 0xF3):
+                return aBuf[1] - 0xA1, charLen
+
+        return -1, charLen
diff --git a/lib/requests/packages/chardet2/langbulgarianmodel.py b/lib/requests/packages/chardet2/langbulgarianmodel.py
new file mode 100755
index 0000000..c6c3c95
--- /dev/null
+++ b/lib/requests/packages/chardet2/langbulgarianmodel.py
@@ -0,0 +1,228 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+# this table is modified base on win1251BulgarianCharToOrderMap, so 
+# only number <64 is sure valid
+
+Latin5_BulgarianCharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,  # 80
+210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,  # 90
+ 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238,  # a0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # b0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56,  # c0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # d0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16,  # e0
+ 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253,  # f0
+)
+
+win1251BulgarianCharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220,  # 80
+221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229,  # 90
+ 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240,  # a0
+ 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250,  # b0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # c0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56,  # d0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # e0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16,  # f0
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 96.9392%
+# first 1024 sequences:3.0618%
+# rest  sequences:     0.2992%
+# negative sequences:  0.0020% 
+BulgarianLangModel = ( \
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,
+3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,
+0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,
+0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,
+0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,
+0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,
+0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,
+2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,
+3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,
+1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,
+3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,
+1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,
+2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,
+2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,
+3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,
+1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,
+2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,
+2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,
+1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,
+2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,
+2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,
+2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,
+1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,
+2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,
+1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,
+3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,
+1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,
+3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,
+1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,
+2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,
+1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,
+2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,
+1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,
+2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,
+1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,
+2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,
+1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,
+0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,
+1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,
+1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
+1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,
+0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,
+1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,
+1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+)
+
+Latin5BulgarianModel = { \
+  'charToOrderMap': Latin5_BulgarianCharToOrderMap,
+  'precedenceMatrix': BulgarianLangModel,
+  'mTypicalPositiveRatio': 0.969392,
+  'keepEnglishLetter': False,
+  'charsetName': "ISO-8859-5"
+}
+
+Win1251BulgarianModel = { \
+  'charToOrderMap': win1251BulgarianCharToOrderMap,
+  'precedenceMatrix': BulgarianLangModel,
+  'mTypicalPositiveRatio': 0.969392,
+  'keepEnglishLetter': False,
+  'charsetName': "windows-1251"
+}
diff --git a/lib/requests/packages/chardet2/langcyrillicmodel.py b/lib/requests/packages/chardet2/langcyrillicmodel.py
new file mode 100755
index 0000000..ab051f2
--- /dev/null
+++ b/lib/requests/packages/chardet2/langcyrillicmodel.py
@@ -0,0 +1,329 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+
+# KOI8-R language model
+# Character Mapping Table:
+KOI8R_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,  # 80
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,  # 90
+223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237,  # a0
+238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,  # b0
+ 27,  3, 21, 28, 13,  2, 39, 19, 26,  4, 23, 11,  8, 12,  5,  1,  # c0
+ 15, 16,  9,  7,  6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54,  # d0
+ 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34,  # e0
+ 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70,  # f0
+)
+
+win1251_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+)
+
+latin5_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+macCyrillic_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,
+)
+
+IBM855_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,
+206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,
+  3, 37, 21, 44, 28, 58, 13, 41,  2, 48, 39, 53, 19, 46,218,219,
+220,221,222,223,224, 26, 55,  4, 42,225,226,227,228, 23, 60,229,
+230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,
+  8, 49, 12, 38,  5, 31,  1, 34, 15,244,245,246,247, 35, 16,248,
+ 43,  9, 45,  7, 32,  6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,
+250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,
+)
+
+IBM866_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 97.6601%
+# first 1024 sequences: 2.3389%
+# rest  sequences:      0.1237%
+# negative sequences:   0.0009% 
+RussianLangModel = ( \
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,
+1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1,
+1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,
+2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1,
+1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,
+3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1,
+1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,
+2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2,
+1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1,
+1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1,
+1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1,
+1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
+3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2,
+1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,
+2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1,
+1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0,
+2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1,
+1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,
+1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1,
+1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,
+3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,
+3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,
+1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,
+1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,
+0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,
+1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,
+1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,
+0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1,
+1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2,
+2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,
+1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0,
+1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,
+2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,
+1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1,
+1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1,
+1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
+0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1,
+0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,
+0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
+0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+)
+
+Koi8rModel = { \
+  'charToOrderMap': KOI8R_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "KOI8-R"
+}
+
+Win1251CyrillicModel = { \
+  'charToOrderMap': win1251_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "windows-1251"
+}
+
+Latin5CyrillicModel = { \
+  'charToOrderMap': latin5_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "ISO-8859-5"
+}
+
+MacCyrillicModel = { \
+  'charToOrderMap': macCyrillic_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "MacCyrillic"
+};
+
+Ibm866Model = { \
+  'charToOrderMap': IBM866_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "IBM866"
+}
+
+Ibm855Model = { \
+  'charToOrderMap': IBM855_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "IBM855"
+}
diff --git a/lib/requests/packages/chardet2/langgreekmodel.py b/lib/requests/packages/chardet2/langgreekmodel.py
new file mode 100755
index 0000000..496df03
--- /dev/null
+++ b/lib/requests/packages/chardet2/langgreekmodel.py
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin7_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+win1253_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 98.2851%
+# first 1024 sequences:1.7001%
+# rest  sequences:     0.0359%
+# negative sequences:  0.0148% 
+GreekLangModel = ( \
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0,
+2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0,
+2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0,
+2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0,
+0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0,
+3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0,
+2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0,
+0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0,
+0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2,
+0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,
+0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2,
+0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0,
+0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2,
+0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2,
+0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0,
+0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0,
+0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,
+0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2,
+0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2,
+0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,
+0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,
+0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,
+0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,
+0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0,
+0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin7GreekModel = { \
+  'charToOrderMap': Latin7_CharToOrderMap,
+  'precedenceMatrix': GreekLangModel,
+  'mTypicalPositiveRatio': 0.982851,
+  'keepEnglishLetter': False,
+  'charsetName': "ISO-8859-7"
+}
+
+Win1253GreekModel = { \
+  'charToOrderMap': win1253_CharToOrderMap,
+  'precedenceMatrix': GreekLangModel,
+  'mTypicalPositiveRatio': 0.982851,
+  'keepEnglishLetter': False,
+  'charsetName': "windows-1253"
+}
diff --git a/lib/requests/packages/chardet2/langhebrewmodel.py b/lib/requests/packages/chardet2/langhebrewmodel.py
new file mode 100755
index 0000000..de5415e
--- /dev/null
+++ b/lib/requests/packages/chardet2/langhebrewmodel.py
@@ -0,0 +1,201 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Simon Montagu
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Shoshannah Forbes - original C code (?)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Windows-1255 language model
+# Character Mapping Table:
+win1255_CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85,  # 40
+ 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253,  # 50
+253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49,  # 60
+ 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253,  # 70
+124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,
+215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,
+ 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,
+106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,
+ 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,
+238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,
+  9,  8, 20, 16,  3,  2, 24, 14, 22,  1, 25, 15,  4, 11,  6, 23,
+ 12, 19, 13, 26, 18, 27, 21, 17,  7, 10,  5,251,252,128, 96,253,
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 98.4004%
+# first 1024 sequences: 1.5981%
+# rest  sequences:      0.087%
+# negative sequences:   0.0015% 
+HebrewLangModel = ( \
+0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0,
+3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,
+1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,
+1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3,
+1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2,
+1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2,
+0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1,
+0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,
+0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2,
+0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2,
+0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2,
+0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2,
+0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2,
+0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2,
+0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
+1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2,
+0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3,
+0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,
+0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0,
+0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,
+0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1,
+1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1,
+1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1,
+2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
+0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1,
+0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,
+)
+
+Win1255HebrewModel = { \
+  'charToOrderMap': win1255_CharToOrderMap,
+  'precedenceMatrix': HebrewLangModel,
+  'mTypicalPositiveRatio': 0.984004,
+  'keepEnglishLetter': False,
+  'charsetName': "windows-1255"
+}
diff --git a/lib/requests/packages/chardet2/langhungarianmodel.py b/lib/requests/packages/chardet2/langhungarianmodel.py
new file mode 100755
index 0000000..a81f5c4
--- /dev/null
+++ b/lib/requests/packages/chardet2/langhungarianmodel.py
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin2_HungarianCharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,
+175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205,
+ 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,
+ 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,
+245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+win1250HungarianCharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
+177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,
+ 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,
+ 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,
+245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 94.7368%
+# first 1024 sequences:5.2623%
+# rest  sequences:     0.8894%
+# negative sequences:  0.0009% 
+HungarianLangModel = ( \
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2,
+3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2,
+0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0,
+1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0,
+1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1,
+3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0,
+2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1,
+2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1,
+2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1,
+2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,
+1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1,
+1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1,
+3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0,
+1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,
+1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1,
+2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1,
+2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0,
+2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,
+3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1,
+1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0,
+1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,
+1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1,
+2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,
+1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0,
+2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1,
+2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1,
+1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,
+1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,
+0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1,
+2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1,
+2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,
+1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,
+1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,
+2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0,
+2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1,
+2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,
+1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,
+0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin2HungarianModel = { \
+  'charToOrderMap': Latin2_HungarianCharToOrderMap,
+  'precedenceMatrix': HungarianLangModel,
+  'mTypicalPositiveRatio': 0.947368,
+  'keepEnglishLetter': True,
+  'charsetName': "ISO-8859-2"
+}
+
+Win1250HungarianModel = { \
+  'charToOrderMap': win1250HungarianCharToOrderMap,
+  'precedenceMatrix': HungarianLangModel,
+  'mTypicalPositiveRatio': 0.947368,
+  'keepEnglishLetter': True,
+  'charsetName': "windows-1250"
+}
diff --git a/lib/requests/packages/chardet2/langthaimodel.py b/lib/requests/packages/chardet2/langthaimodel.py
new file mode 100755
index 0000000..eba92d0
--- /dev/null
+++ b/lib/requests/packages/chardet2/langthaimodel.py
@@ -0,0 +1,200 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# The following result for thai was collected from a limited sample (1M). 
+
+# Character Mapping Table:
+TIS620CharToOrderMap = ( \
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111,  # 40
+188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253,  # 50
+253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82,  # 60
+ 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253,  # 70
+209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,
+223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,
+236,  5, 30,237, 24,238, 75,  8, 26, 52, 34, 51,119, 47, 58, 57,
+ 49, 53, 55, 43, 20, 19, 44, 14, 48,  3, 17, 25, 39, 62, 31, 54,
+ 45,  9, 16,  2, 61, 15,239, 12, 42, 46, 18, 21, 76,  4, 66, 63,
+ 22, 10,  1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,
+ 11, 28, 41, 29, 33,245, 50, 37,  6,  7, 67, 77, 38, 93,246,247,
+ 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,
+)
+
+# Model Table: 
+# total sequences: 100%
+# first 512 sequences: 92.6386%
+# first 1024 sequences:7.3177%
+# rest  sequences:     1.0230%
+# negative sequences:  0.0436% 
+ThaiLangModel = ( \
+0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3,
+0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2,
+3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3,
+0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2,
+3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2,
+3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1,
+3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1,
+3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1,
+2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1,
+3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2,
+1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3,
+3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0,
+1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2,
+0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3,
+0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1,
+2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2,
+0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2,
+3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0,
+2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1,
+2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1,
+3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0,
+3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1,
+3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1,
+3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1,
+1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2,
+0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3,
+0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,
+3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0,
+3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1,
+1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,
+3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1,
+3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2,
+0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0,
+0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0,
+1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1,
+1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,
+3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1,
+0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0,
+3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0,
+0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1,
+0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0,
+0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1,
+0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,
+0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0,
+0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1,
+0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0,
+0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0,
+0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
+3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1,
+2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
+0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0,
+3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,
+1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,
+1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+TIS620ThaiModel = { \
+  'charToOrderMap': TIS620CharToOrderMap,
+  'precedenceMatrix': ThaiLangModel,
+  'mTypicalPositiveRatio': 0.926386,
+  'keepEnglishLetter': False,
+  'charsetName': "TIS-620"
+}
diff --git a/lib/requests/packages/chardet2/latin1prober.py b/lib/requests/packages/chardet2/latin1prober.py
new file mode 100755
index 0000000..6ecc022
--- /dev/null
+++ b/lib/requests/packages/chardet2/latin1prober.py
@@ -0,0 +1,135 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from . import constants
+
+FREQ_CAT_NUM = 4
+
+UDF = 0 # undefined
+OTH = 1 # other
+ASC = 2 # ascii capital letter
+ASS = 3 # ascii small letter
+ACV = 4 # accent capital vowel
+ACO = 5 # accent capital other
+ASV = 6 # accent small vowel
+ASO = 7 # accent small other
+CLASS_NUM = 8 # total classes
+
+Latin1_CharToClass = ( \
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F
+  OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47
+  ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F
+  ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57
+  ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F
+  OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67
+  ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F
+  ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77
+  ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F
+  OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87
+  OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F
+  UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97
+  OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7
+  OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF
+  ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7
+  ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF
+  ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7
+  ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF
+  ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7
+  ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF
+  ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7
+  ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF
+)
+
+# 0 : illegal 
+# 1 : very unlikely 
+# 2 : normal 
+# 3 : very likely
+Latin1ClassModel = ( \
+# UDF OTH ASC ASS ACV ACO ASV ASO
+   0,  0,  0,  0,  0,  0,  0,  0,  # UDF
+   0,  3,  3,  3,  3,  3,  3,  3,  # OTH
+   0,  3,  3,  3,  3,  3,  3,  3,  # ASC
+   0,  3,  3,  3,  1,  1,  3,  3,  # ASS
+   0,  3,  3,  3,  1,  2,  1,  2,  # ACV
+   0,  3,  3,  3,  3,  3,  3,  3,  # ACO
+   0,  3,  1,  3,  1,  1,  1,  3,  # ASV
+   0,  3,  1,  3,  1,  1,  3,  3,  # ASO
+)
+
+class Latin1Prober(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self.reset()
+
+    def reset(self):
+        self._mLastCharClass = OTH
+        self._mFreqCounter = [0] * FREQ_CAT_NUM
+        CharSetProber.reset(self)
+
+    def get_charset_name(self):
+        return "windows-1252"
+
+    def feed(self, aBuf):
+        aBuf = self.filter_with_english_letters(aBuf)
+        for c in aBuf:
+            charClass = Latin1_CharToClass[c]
+            freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + charClass]
+            if freq == 0:
+                self._mState = constants.eNotMe
+                break
+            self._mFreqCounter[freq] += 1
+            self._mLastCharClass = charClass
+
+        return self.get_state()
+
+    def get_confidence(self):
+        if self.get_state() == constants.eNotMe:
+            return 0.01
+  
+        total = sum(self._mFreqCounter)
+        if total < 0.01:
+            confidence = 0.0
+        else:
+            confidence = (self._mFreqCounter[3] / total) - (self._mFreqCounter[1] * 20.0 / total)
+        if confidence < 0.0:
+            confidence = 0.0
+        # lower the confidence of latin1 so that other more accurate detector 
+        # can take priority.
+        confidence = confidence * 0.5
+        return confidence
diff --git a/lib/requests/packages/chardet2/mbcharsetprober.py b/lib/requests/packages/chardet2/mbcharsetprober.py
new file mode 100755
index 0000000..ab9abcb
--- /dev/null
+++ b/lib/requests/packages/chardet2/mbcharsetprober.py
@@ -0,0 +1,83 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .constants import eStart, eError, eItsMe
+from .charsetprober import CharSetProber
+
+class MultiByteCharSetProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mDistributionAnalyzer = None
+        self._mCodingSM = None
+        self._mLastChar = [0, 0]
+
+    def reset(self):
+        CharSetProber.reset(self)
+        if self._mCodingSM:
+            self._mCodingSM.reset()
+        if self._mDistributionAnalyzer:
+            self._mDistributionAnalyzer.reset()
+        self._mLastChar = [0, 0]
+
+    def get_charset_name(self):
+        pass
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mDistributionAnalyzer.feed(aBuf[i-1:i+1], charLen)
+                    
+        self._mLastChar[0] = aBuf[aLen - 1]
+        
+        if self.get_state() == constants.eDetecting:
+            if self._mDistributionAnalyzer.got_enough_data() and \
+               (self.get_confidence() > constants.SHORTCUT_THRESHOLD):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        return self._mDistributionAnalyzer.get_confidence()
diff --git a/lib/requests/packages/chardet2/mbcsgroupprober.py b/lib/requests/packages/chardet2/mbcsgroupprober.py
new file mode 100755
index 0000000..6c6b048
--- /dev/null
+++ b/lib/requests/packages/chardet2/mbcsgroupprober.py
@@ -0,0 +1,50 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetgroupprober import CharSetGroupProber
+from .utf8prober import UTF8Prober
+from .sjisprober import SJISProber
+from .eucjpprober import EUCJPProber
+from .gb2312prober import GB2312Prober
+from .euckrprober import EUCKRProber
+from .big5prober import Big5Prober
+from .euctwprober import EUCTWProber
+
+class MBCSGroupProber(CharSetGroupProber):
+    def __init__(self):
+        CharSetGroupProber.__init__(self)
+        self._mProbers = [ \
+            UTF8Prober(),
+            SJISProber(),
+            EUCJPProber(),
+            GB2312Prober(),
+            EUCKRProber(),
+            Big5Prober(),
+            EUCTWProber()]
+        self.reset()
diff --git a/lib/requests/packages/chardet2/mbcssm.py b/lib/requests/packages/chardet2/mbcssm.py
new file mode 100755
index 0000000..4f2922d
--- /dev/null
+++ b/lib/requests/packages/chardet2/mbcssm.py
@@ -0,0 +1,514 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .constants import eStart, eError, eItsMe
+
+# BIG5 
+
+BIG5_cls = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    1,1,1,1,1,1,1,1,  # 30 - 37 
+    1,1,1,1,1,1,1,1,  # 38 - 3f 
+    2,2,2,2,2,2,2,2,  # 40 - 47 
+    2,2,2,2,2,2,2,2,  # 48 - 4f 
+    2,2,2,2,2,2,2,2,  # 50 - 57 
+    2,2,2,2,2,2,2,2,  # 58 - 5f 
+    2,2,2,2,2,2,2,2,  # 60 - 67 
+    2,2,2,2,2,2,2,2,  # 68 - 6f 
+    2,2,2,2,2,2,2,2,  # 70 - 77 
+    2,2,2,2,2,2,2,1,  # 78 - 7f 
+    4,4,4,4,4,4,4,4,  # 80 - 87 
+    4,4,4,4,4,4,4,4,  # 88 - 8f 
+    4,4,4,4,4,4,4,4,  # 90 - 97 
+    4,4,4,4,4,4,4,4,  # 98 - 9f 
+    4,3,3,3,3,3,3,3,  # a0 - a7 
+    3,3,3,3,3,3,3,3,  # a8 - af 
+    3,3,3,3,3,3,3,3,  # b0 - b7 
+    3,3,3,3,3,3,3,3,  # b8 - bf 
+    3,3,3,3,3,3,3,3,  # c0 - c7 
+    3,3,3,3,3,3,3,3,  # c8 - cf 
+    3,3,3,3,3,3,3,3,  # d0 - d7 
+    3,3,3,3,3,3,3,3,  # d8 - df 
+    3,3,3,3,3,3,3,3,  # e0 - e7 
+    3,3,3,3,3,3,3,3,  # e8 - ef 
+    3,3,3,3,3,3,3,3,  # f0 - f7 
+    3,3,3,3,3,3,3,0)  # f8 - ff 
+
+BIG5_st = ( \
+    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07 
+    eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f 
+    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart)#10-17 
+
+Big5CharLenTable = (0, 1, 1, 2, 0)
+
+Big5SMModel = {'classTable': BIG5_cls,
+               'classFactor': 5,
+               'stateTable': BIG5_st,
+               'charLenTable': Big5CharLenTable,
+               'name': 'Big5'}
+
+# EUC-JP
+
+EUCJP_cls = ( \
+    4,4,4,4,4,4,4,4,  # 00 - 07 
+    4,4,4,4,4,4,5,5,  # 08 - 0f 
+    4,4,4,4,4,4,4,4,  # 10 - 17 
+    4,4,4,5,4,4,4,4,  # 18 - 1f 
+    4,4,4,4,4,4,4,4,  # 20 - 27 
+    4,4,4,4,4,4,4,4,  # 28 - 2f 
+    4,4,4,4,4,4,4,4,  # 30 - 37 
+    4,4,4,4,4,4,4,4,  # 38 - 3f 
+    4,4,4,4,4,4,4,4,  # 40 - 47 
+    4,4,4,4,4,4,4,4,  # 48 - 4f 
+    4,4,4,4,4,4,4,4,  # 50 - 57 
+    4,4,4,4,4,4,4,4,  # 58 - 5f 
+    4,4,4,4,4,4,4,4,  # 60 - 67 
+    4,4,4,4,4,4,4,4,  # 68 - 6f 
+    4,4,4,4,4,4,4,4,  # 70 - 77 
+    4,4,4,4,4,4,4,4,  # 78 - 7f 
+    5,5,5,5,5,5,5,5,  # 80 - 87 
+    5,5,5,5,5,5,1,3,  # 88 - 8f 
+    5,5,5,5,5,5,5,5,  # 90 - 97 
+    5,5,5,5,5,5,5,5,  # 98 - 9f 
+    5,2,2,2,2,2,2,2,  # a0 - a7 
+    2,2,2,2,2,2,2,2,  # a8 - af 
+    2,2,2,2,2,2,2,2,  # b0 - b7 
+    2,2,2,2,2,2,2,2,  # b8 - bf 
+    2,2,2,2,2,2,2,2,  # c0 - c7 
+    2,2,2,2,2,2,2,2,  # c8 - cf 
+    2,2,2,2,2,2,2,2,  # d0 - d7 
+    2,2,2,2,2,2,2,2,  # d8 - df 
+    0,0,0,0,0,0,0,0,  # e0 - e7 
+    0,0,0,0,0,0,0,0,  # e8 - ef 
+    0,0,0,0,0,0,0,0,  # f0 - f7 
+    0,0,0,0,0,0,0,5)  # f8 - ff 
+
+EUCJP_st = ( \
+          3,     4,     3,     5,eStart,eError,eError,eError,#00-07 
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f 
+     eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 
+     eError,eError,eStart,eError,eError,eError,     3,eError,#18-1f 
+          3,eError,eError,eError,eStart,eStart,eStart,eStart)#20-27 
+
+EUCJPCharLenTable = (2, 2, 2, 3, 1, 0)
+
+EUCJPSMModel = {'classTable': EUCJP_cls,
+                'classFactor': 6,
+                'stateTable': EUCJP_st,
+                'charLenTable': EUCJPCharLenTable,
+                'name': 'EUC-JP'}
+
+# EUC-KR
+
+EUCKR_cls  = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07 
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    1,1,1,1,1,1,1,1,  # 30 - 37 
+    1,1,1,1,1,1,1,1,  # 38 - 3f 
+    1,1,1,1,1,1,1,1,  # 40 - 47 
+    1,1,1,1,1,1,1,1,  # 48 - 4f 
+    1,1,1,1,1,1,1,1,  # 50 - 57 
+    1,1,1,1,1,1,1,1,  # 58 - 5f 
+    1,1,1,1,1,1,1,1,  # 60 - 67 
+    1,1,1,1,1,1,1,1,  # 68 - 6f 
+    1,1,1,1,1,1,1,1,  # 70 - 77 
+    1,1,1,1,1,1,1,1,  # 78 - 7f 
+    0,0,0,0,0,0,0,0,  # 80 - 87 
+    0,0,0,0,0,0,0,0,  # 88 - 8f 
+    0,0,0,0,0,0,0,0,  # 90 - 97 
+    0,0,0,0,0,0,0,0,  # 98 - 9f 
+    0,2,2,2,2,2,2,2,  # a0 - a7 
+    2,2,2,2,2,3,3,3,  # a8 - af 
+    2,2,2,2,2,2,2,2,  # b0 - b7 
+    2,2,2,2,2,2,2,2,  # b8 - bf 
+    2,2,2,2,2,2,2,2,  # c0 - c7 
+    2,3,2,2,2,2,2,2,  # c8 - cf 
+    2,2,2,2,2,2,2,2,  # d0 - d7 
+    2,2,2,2,2,2,2,2,  # d8 - df 
+    2,2,2,2,2,2,2,2,  # e0 - e7 
+    2,2,2,2,2,2,2,2,  # e8 - ef 
+    2,2,2,2,2,2,2,2,  # f0 - f7 
+    2,2,2,2,2,2,2,0)  # f8 - ff 
+
+EUCKR_st = (
+    eError,eStart,     3,eError,eError,eError,eError,eError,#00-07 
+    eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart)#08-0f 
+
+EUCKRCharLenTable = (0, 1, 2, 0)
+
+EUCKRSMModel = {'classTable': EUCKR_cls,
+                'classFactor': 4,
+                'stateTable': EUCKR_st,
+                'charLenTable': EUCKRCharLenTable,
+                'name': 'EUC-KR'}
+
+# EUC-TW
+
+EUCTW_cls = ( \
+    2,2,2,2,2,2,2,2,  # 00 - 07 
+    2,2,2,2,2,2,0,0,  # 08 - 0f 
+    2,2,2,2,2,2,2,2,  # 10 - 17 
+    2,2,2,0,2,2,2,2,  # 18 - 1f 
+    2,2,2,2,2,2,2,2,  # 20 - 27 
+    2,2,2,2,2,2,2,2,  # 28 - 2f 
+    2,2,2,2,2,2,2,2,  # 30 - 37 
+    2,2,2,2,2,2,2,2,  # 38 - 3f 
+    2,2,2,2,2,2,2,2,  # 40 - 47 
+    2,2,2,2,2,2,2,2,  # 48 - 4f 
+    2,2,2,2,2,2,2,2,  # 50 - 57 
+    2,2,2,2,2,2,2,2,  # 58 - 5f 
+    2,2,2,2,2,2,2,2,  # 60 - 67 
+    2,2,2,2,2,2,2,2,  # 68 - 6f 
+    2,2,2,2,2,2,2,2,  # 70 - 77 
+    2,2,2,2,2,2,2,2,  # 78 - 7f 
+    0,0,0,0,0,0,0,0,  # 80 - 87 
+    0,0,0,0,0,0,6,0,  # 88 - 8f 
+    0,0,0,0,0,0,0,0,  # 90 - 97 
+    0,0,0,0,0,0,0,0,  # 98 - 9f 
+    0,3,4,4,4,4,4,4,  # a0 - a7 
+    5,5,1,1,1,1,1,1,  # a8 - af 
+    1,1,1,1,1,1,1,1,  # b0 - b7 
+    1,1,1,1,1,1,1,1,  # b8 - bf 
+    1,1,3,1,3,3,3,3,  # c0 - c7 
+    3,3,3,3,3,3,3,3,  # c8 - cf 
+    3,3,3,3,3,3,3,3,  # d0 - d7 
+    3,3,3,3,3,3,3,3,  # d8 - df 
+    3,3,3,3,3,3,3,3,  # e0 - e7 
+    3,3,3,3,3,3,3,3,  # e8 - ef 
+    3,3,3,3,3,3,3,3,  # f0 - f7 
+    3,3,3,3,3,3,3,0)  # f8 - ff 
+
+EUCTW_st = ( \
+    eError,eError,eStart,     3,     3,     3,     4,eError,#00-07 
+    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f 
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 
+    eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f 
+         5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 
+    eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart)#28-2f 
+
+EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3)
+
+EUCTWSMModel = {'classTable': EUCTW_cls,
+                'classFactor': 7,
+                'stateTable': EUCTW_st,
+                'charLenTable': EUCTWCharLenTable,
+                'name': 'x-euc-tw'}
+
+# GB2312
+
+GB2312_cls = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07 
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    3,3,3,3,3,3,3,3,  # 30 - 37 
+    3,3,1,1,1,1,1,1,  # 38 - 3f 
+    2,2,2,2,2,2,2,2,  # 40 - 47 
+    2,2,2,2,2,2,2,2,  # 48 - 4f 
+    2,2,2,2,2,2,2,2,  # 50 - 57 
+    2,2,2,2,2,2,2,2,  # 58 - 5f 
+    2,2,2,2,2,2,2,2,  # 60 - 67 
+    2,2,2,2,2,2,2,2,  # 68 - 6f 
+    2,2,2,2,2,2,2,2,  # 70 - 77 
+    2,2,2,2,2,2,2,4,  # 78 - 7f 
+    5,6,6,6,6,6,6,6,  # 80 - 87 
+    6,6,6,6,6,6,6,6,  # 88 - 8f 
+    6,6,6,6,6,6,6,6,  # 90 - 97 
+    6,6,6,6,6,6,6,6,  # 98 - 9f 
+    6,6,6,6,6,6,6,6,  # a0 - a7 
+    6,6,6,6,6,6,6,6,  # a8 - af 
+    6,6,6,6,6,6,6,6,  # b0 - b7 
+    6,6,6,6,6,6,6,6,  # b8 - bf 
+    6,6,6,6,6,6,6,6,  # c0 - c7 
+    6,6,6,6,6,6,6,6,  # c8 - cf 
+    6,6,6,6,6,6,6,6,  # d0 - d7 
+    6,6,6,6,6,6,6,6,  # d8 - df 
+    6,6,6,6,6,6,6,6,  # e0 - e7 
+    6,6,6,6,6,6,6,6,  # e8 - ef 
+    6,6,6,6,6,6,6,6,  # f0 - f7 
+    6,6,6,6,6,6,6,0)  # f8 - ff 
+
+GB2312_st = ( \
+    eError,eStart,eStart,eStart,eStart,eStart,     3,eError,#00-07 
+    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f 
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 
+         4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f 
+    eError,eError,     5,eError,eError,eError,eItsMe,eError,#20-27 
+    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart)#28-2f 
+
+# To be accurate, the length of class 6 can be either 2 or 4. 
+# But it is not necessary to discriminate between the two since 
+# it is used for frequency analysis only, and we are validing 
+# each code range there as well. So it is safe to set it to be 
+# 2 here. 
+GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2)
+
+GB2312SMModel = {'classTable': GB2312_cls,
+                  'classFactor': 7,
+                  'stateTable': GB2312_st,
+                  'charLenTable': GB2312CharLenTable,
+                  'name': 'GB2312'}
+
+# Shift_JIS
+
+SJIS_cls = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07 
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    1,1,1,1,1,1,1,1,  # 30 - 37 
+    1,1,1,1,1,1,1,1,  # 38 - 3f 
+    2,2,2,2,2,2,2,2,  # 40 - 47 
+    2,2,2,2,2,2,2,2,  # 48 - 4f 
+    2,2,2,2,2,2,2,2,  # 50 - 57 
+    2,2,2,2,2,2,2,2,  # 58 - 5f 
+    2,2,2,2,2,2,2,2,  # 60 - 67 
+    2,2,2,2,2,2,2,2,  # 68 - 6f 
+    2,2,2,2,2,2,2,2,  # 70 - 77 
+    2,2,2,2,2,2,2,1,  # 78 - 7f 
+    3,3,3,3,3,3,3,3,  # 80 - 87 
+    3,3,3,3,3,3,3,3,  # 88 - 8f 
+    3,3,3,3,3,3,3,3,  # 90 - 97 
+    3,3,3,3,3,3,3,3,  # 98 - 9f 
+    #0xa0 is illegal in sjis encoding, but some pages does 
+    #contain such byte. We need to be more error forgiven.
+    2,2,2,2,2,2,2,2,  # a0 - a7     
+    2,2,2,2,2,2,2,2,  # a8 - af 
+    2,2,2,2,2,2,2,2,  # b0 - b7 
+    2,2,2,2,2,2,2,2,  # b8 - bf 
+    2,2,2,2,2,2,2,2,  # c0 - c7 
+    2,2,2,2,2,2,2,2,  # c8 - cf 
+    2,2,2,2,2,2,2,2,  # d0 - d7 
+    2,2,2,2,2,2,2,2,  # d8 - df 
+    3,3,3,3,3,3,3,3,  # e0 - e7 
+    3,3,3,3,3,4,4,4,  # e8 - ef 
+    4,4,4,4,4,4,4,4,  # f0 - f7 
+    4,4,4,4,4,0,0,0)  # f8 - ff 
+
+SJIS_st = ( \
+    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07 
+    eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f 
+    eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart)#10-17 
+
+SJISCharLenTable = (0, 1, 1, 2, 0, 0)
+
+SJISSMModel = {'classTable': SJIS_cls,
+               'classFactor': 6,
+               'stateTable': SJIS_st,
+               'charLenTable': SJISCharLenTable,
+               'name': 'Shift_JIS'}
+
+# UCS2-BE
+
+UCS2BE_cls = ( \
+    0,0,0,0,0,0,0,0,  # 00 - 07 
+    0,0,1,0,0,2,0,0,  # 08 - 0f 
+    0,0,0,0,0,0,0,0,  # 10 - 17 
+    0,0,0,3,0,0,0,0,  # 18 - 1f 
+    0,0,0,0,0,0,0,0,  # 20 - 27 
+    0,3,3,3,3,3,0,0,  # 28 - 2f 
+    0,0,0,0,0,0,0,0,  # 30 - 37 
+    0,0,0,0,0,0,0,0,  # 38 - 3f 
+    0,0,0,0,0,0,0,0,  # 40 - 47 
+    0,0,0,0,0,0,0,0,  # 48 - 4f 
+    0,0,0,0,0,0,0,0,  # 50 - 57 
+    0,0,0,0,0,0,0,0,  # 58 - 5f 
+    0,0,0,0,0,0,0,0,  # 60 - 67 
+    0,0,0,0,0,0,0,0,  # 68 - 6f 
+    0,0,0,0,0,0,0,0,  # 70 - 77 
+    0,0,0,0,0,0,0,0,  # 78 - 7f 
+    0,0,0,0,0,0,0,0,  # 80 - 87 
+    0,0,0,0,0,0,0,0,  # 88 - 8f 
+    0,0,0,0,0,0,0,0,  # 90 - 97 
+    0,0,0,0,0,0,0,0,  # 98 - 9f 
+    0,0,0,0,0,0,0,0,  # a0 - a7 
+    0,0,0,0,0,0,0,0,  # a8 - af 
+    0,0,0,0,0,0,0,0,  # b0 - b7 
+    0,0,0,0,0,0,0,0,  # b8 - bf 
+    0,0,0,0,0,0,0,0,  # c0 - c7 
+    0,0,0,0,0,0,0,0,  # c8 - cf 
+    0,0,0,0,0,0,0,0,  # d0 - d7 
+    0,0,0,0,0,0,0,0,  # d8 - df 
+    0,0,0,0,0,0,0,0,  # e0 - e7 
+    0,0,0,0,0,0,0,0,  # e8 - ef 
+    0,0,0,0,0,0,0,0,  # f0 - f7 
+    0,0,0,0,0,0,4,5)  # f8 - ff 
+
+UCS2BE_st  = ( \
+          5,     7,     7,eError,     4,     3,eError,eError,#00-07 
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f 
+     eItsMe,eItsMe,     6,     6,     6,     6,eError,eError,#10-17 
+          6,     6,     6,     6,     6,eItsMe,     6,     6,#18-1f 
+          6,     6,     6,     6,     5,     7,     7,eError,#20-27 
+          5,     8,     6,     6,eError,     6,     6,     6,#28-2f 
+          6,     6,     6,     6,eError,eError,eStart,eStart)#30-37 
+
+UCS2BECharLenTable = (2, 2, 2, 0, 2, 2)
+
+UCS2BESMModel = {'classTable': UCS2BE_cls,
+                 'classFactor': 6,
+                 'stateTable': UCS2BE_st,
+                 'charLenTable': UCS2BECharLenTable,
+                 'name': 'UTF-16BE'}
+
+# UCS2-LE
+
+UCS2LE_cls = ( \
+    0,0,0,0,0,0,0,0,  # 00 - 07 
+    0,0,1,0,0,2,0,0,  # 08 - 0f 
+    0,0,0,0,0,0,0,0,  # 10 - 17 
+    0,0,0,3,0,0,0,0,  # 18 - 1f 
+    0,0,0,0,0,0,0,0,  # 20 - 27 
+    0,3,3,3,3,3,0,0,  # 28 - 2f 
+    0,0,0,0,0,0,0,0,  # 30 - 37 
+    0,0,0,0,0,0,0,0,  # 38 - 3f 
+    0,0,0,0,0,0,0,0,  # 40 - 47 
+    0,0,0,0,0,0,0,0,  # 48 - 4f 
+    0,0,0,0,0,0,0,0,  # 50 - 57 
+    0,0,0,0,0,0,0,0,  # 58 - 5f 
+    0,0,0,0,0,0,0,0,  # 60 - 67 
+    0,0,0,0,0,0,0,0,  # 68 - 6f 
+    0,0,0,0,0,0,0,0,  # 70 - 77 
+    0,0,0,0,0,0,0,0,  # 78 - 7f 
+    0,0,0,0,0,0,0,0,  # 80 - 87 
+    0,0,0,0,0,0,0,0,  # 88 - 8f 
+    0,0,0,0,0,0,0,0,  # 90 - 97 
+    0,0,0,0,0,0,0,0,  # 98 - 9f 
+    0,0,0,0,0,0,0,0,  # a0 - a7 
+    0,0,0,0,0,0,0,0,  # a8 - af 
+    0,0,0,0,0,0,0,0,  # b0 - b7 
+    0,0,0,0,0,0,0,0,  # b8 - bf 
+    0,0,0,0,0,0,0,0,  # c0 - c7 
+    0,0,0,0,0,0,0,0,  # c8 - cf 
+    0,0,0,0,0,0,0,0,  # d0 - d7 
+    0,0,0,0,0,0,0,0,  # d8 - df 
+    0,0,0,0,0,0,0,0,  # e0 - e7 
+    0,0,0,0,0,0,0,0,  # e8 - ef 
+    0,0,0,0,0,0,0,0,  # f0 - f7 
+    0,0,0,0,0,0,4,5)  # f8 - ff 
+
+UCS2LE_st = ( \
+          6,     6,     7,     6,     4,     3,eError,eError,#00-07 
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f 
+     eItsMe,eItsMe,     5,     5,     5,eError,eItsMe,eError,#10-17 
+          5,     5,     5,eError,     5,eError,     6,     6,#18-1f 
+          7,     6,     8,     8,     5,     5,     5,eError,#20-27 
+          5,     5,     5,eError,eError,eError,     5,     5,#28-2f 
+          5,     5,     5,eError,     5,eError,eStart,eStart)#30-37 
+
+UCS2LECharLenTable = (2, 2, 2, 2, 2, 2)
+
+UCS2LESMModel = {'classTable': UCS2LE_cls,
+                 'classFactor': 6,
+                 'stateTable': UCS2LE_st,
+                 'charLenTable': UCS2LECharLenTable,
+                 'name': 'UTF-16LE'}
+
+# UTF-8
+
+UTF8_cls = ( \
+    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f 
+    1,1,1,1,1,1,1,1,  # 10 - 17 
+    1,1,1,0,1,1,1,1,  # 18 - 1f 
+    1,1,1,1,1,1,1,1,  # 20 - 27 
+    1,1,1,1,1,1,1,1,  # 28 - 2f 
+    1,1,1,1,1,1,1,1,  # 30 - 37 
+    1,1,1,1,1,1,1,1,  # 38 - 3f 
+    1,1,1,1,1,1,1,1,  # 40 - 47 
+    1,1,1,1,1,1,1,1,  # 48 - 4f 
+    1,1,1,1,1,1,1,1,  # 50 - 57 
+    1,1,1,1,1,1,1,1,  # 58 - 5f 
+    1,1,1,1,1,1,1,1,  # 60 - 67 
+    1,1,1,1,1,1,1,1,  # 68 - 6f 
+    1,1,1,1,1,1,1,1,  # 70 - 77 
+    1,1,1,1,1,1,1,1,  # 78 - 7f 
+    2,2,2,2,3,3,3,3,  # 80 - 87 
+    4,4,4,4,4,4,4,4,  # 88 - 8f 
+    4,4,4,4,4,4,4,4,  # 90 - 97 
+    4,4,4,4,4,4,4,4,  # 98 - 9f 
+    5,5,5,5,5,5,5,5,  # a0 - a7 
+    5,5,5,5,5,5,5,5,  # a8 - af 
+    5,5,5,5,5,5,5,5,  # b0 - b7 
+    5,5,5,5,5,5,5,5,  # b8 - bf 
+    0,0,6,6,6,6,6,6,  # c0 - c7 
+    6,6,6,6,6,6,6,6,  # c8 - cf 
+    6,6,6,6,6,6,6,6,  # d0 - d7 
+    6,6,6,6,6,6,6,6,  # d8 - df 
+    7,8,8,8,8,8,8,8,  # e0 - e7 
+    8,8,8,8,8,9,8,8,  # e8 - ef 
+    10,11,11,11,11,11,11,11,  # f0 - f7 
+    12,13,13,13,14,15,0,0)   # f8 - ff 
+
+UTF8_st = ( \
+    eError,eStart,eError,eError,eError,eError,     12,   10,#00-07 
+         9,     11,     8,     7,     6,     5,     4,    3,#08-0f 
+    eError,eError,eError,eError,eError,eError,eError,eError,#10-17 
+    eError,eError,eError,eError,eError,eError,eError,eError,#18-1f 
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f 
+    eError,eError,     5,     5,     5,     5,eError,eError,#30-37 
+    eError,eError,eError,eError,eError,eError,eError,eError,#38-3f 
+    eError,eError,eError,     5,     5,     5,eError,eError,#40-47 
+    eError,eError,eError,eError,eError,eError,eError,eError,#48-4f 
+    eError,eError,     7,     7,     7,     7,eError,eError,#50-57 
+    eError,eError,eError,eError,eError,eError,eError,eError,#58-5f 
+    eError,eError,eError,eError,     7,     7,eError,eError,#60-67 
+    eError,eError,eError,eError,eError,eError,eError,eError,#68-6f 
+    eError,eError,     9,     9,     9,     9,eError,eError,#70-77 
+    eError,eError,eError,eError,eError,eError,eError,eError,#78-7f 
+    eError,eError,eError,eError,eError,     9,eError,eError,#80-87 
+    eError,eError,eError,eError,eError,eError,eError,eError,#88-8f 
+    eError,eError,    12,    12,    12,    12,eError,eError,#90-97 
+    eError,eError,eError,eError,eError,eError,eError,eError,#98-9f 
+    eError,eError,eError,eError,eError,    12,eError,eError,#a0-a7 
+    eError,eError,eError,eError,eError,eError,eError,eError,#a8-af 
+    eError,eError,    12,    12,    12,eError,eError,eError,#b0-b7 
+    eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf 
+    eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 
+    eError,eError,eError,eError,eError,eError,eError,eError)#c8-cf 
+
+UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
+
+UTF8SMModel = {'classTable': UTF8_cls,
+               'classFactor': 16,
+               'stateTable': UTF8_st,
+               'charLenTable': UTF8CharLenTable,
+               'name': 'UTF-8'}
diff --git a/lib/requests/packages/chardet2/sbcharsetprober.py b/lib/requests/packages/chardet2/sbcharsetprober.py
new file mode 100755
index 0000000..1866090
--- /dev/null
+++ b/lib/requests/packages/chardet2/sbcharsetprober.py
@@ -0,0 +1,107 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .charsetprober import CharSetProber
+
+SAMPLE_SIZE = 64
+SB_ENOUGH_REL_THRESHOLD = 1024
+POSITIVE_SHORTCUT_THRESHOLD = 0.95
+NEGATIVE_SHORTCUT_THRESHOLD = 0.05
+SYMBOL_CAT_ORDER = 250
+NUMBER_OF_SEQ_CAT = 4
+POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1
+#NEGATIVE_CAT = 0
+ 
+class SingleByteCharSetProber(CharSetProber):
+    def __init__(self, model, reversed=False, nameProber=None):
+        CharSetProber.__init__(self)
+        self._mModel = model
+        self._mReversed = reversed # TRUE if we need to reverse every pair in the model lookup
+        self._mNameProber = nameProber # Optional auxiliary prober for name decision
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        self._mLastOrder = 255 # char order of last character
+        self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT
+        self._mTotalSeqs = 0
+        self._mTotalChar = 0
+        self._mFreqChar = 0 # characters that fall in our sampling range
+
+    def get_charset_name(self):
+        if self._mNameProber:
+            return self._mNameProber.get_charset_name()
+        else:
+            return self._mModel['charsetName']
+
+    def feed(self, aBuf):
+        if not self._mModel['keepEnglishLetter']:
+            aBuf = self.filter_without_english_letters(aBuf)
+        aLen = len(aBuf)
+        if not aLen:
+            return self.get_state()
+        for c in aBuf:
+            order = self._mModel['charToOrderMap'][c]
+            if order < SYMBOL_CAT_ORDER:
+                self._mTotalChar += 1
+            if order < SAMPLE_SIZE:
+                self._mFreqChar += 1
+                if self._mLastOrder < SAMPLE_SIZE:
+                    self._mTotalSeqs += 1
+                    if not self._mReversed:
+                        self._mSeqCounters[self._mModel['precedenceMatrix'][(self._mLastOrder * SAMPLE_SIZE) + order]] += 1
+                    else: # reverse the order of the letters in the lookup
+                        self._mSeqCounters[self._mModel['precedenceMatrix'][(order * SAMPLE_SIZE) + self._mLastOrder]] += 1
+            self._mLastOrder = order
+
+        if self.get_state() == constants.eDetecting:
+            if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD:
+                cf = self.get_confidence()
+                if cf > POSITIVE_SHORTCUT_THRESHOLD:
+                    if constants._debug:
+                        sys.stderr.write('%s confidence = %s, we have a winner\n' % (self._mModel['charsetName'], cf))
+                    self._mState = constants.eFoundIt
+                elif cf < NEGATIVE_SHORTCUT_THRESHOLD:
+                    if constants._debug:
+                        sys.stderr.write('%s confidence = %s, below negative shortcut threshhold %s\n' % (self._mModel['charsetName'], cf, NEGATIVE_SHORTCUT_THRESHOLD))
+                    self._mState = constants.eNotMe
+
+        return self.get_state()
+
+    def get_confidence(self):
+        r = 0.01
+        if self._mTotalSeqs > 0:
+#            print self._mSeqCounters[POSITIVE_CAT], self._mTotalSeqs, self._mModel['mTypicalPositiveRatio']
+            r = (1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs / self._mModel['mTypicalPositiveRatio']
+#            print r, self._mFreqChar, self._mTotalChar
+            r = r * self._mFreqChar / self._mTotalChar
+            if r >= 1.0:
+                r = 0.99
+        return r
diff --git a/lib/requests/packages/chardet2/sbcsgroupprober.py b/lib/requests/packages/chardet2/sbcsgroupprober.py
new file mode 100755
index 0000000..139334a
--- /dev/null
+++ b/lib/requests/packages/chardet2/sbcsgroupprober.py
@@ -0,0 +1,65 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .charsetgroupprober import CharSetGroupProber
+from .sbcharsetprober import SingleByteCharSetProber
+from .langcyrillicmodel import Win1251CyrillicModel, Koi8rModel, Latin5CyrillicModel, MacCyrillicModel, Ibm866Model, Ibm855Model
+from .langgreekmodel import Latin7GreekModel, Win1253GreekModel
+from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel
+from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel
+from .langthaimodel import TIS620ThaiModel
+from .langhebrewmodel import Win1255HebrewModel
+from .hebrewprober import HebrewProber
+
+class SBCSGroupProber(CharSetGroupProber):
+    def __init__(self):
+        CharSetGroupProber.__init__(self)
+        self._mProbers = [ \
+            SingleByteCharSetProber(Win1251CyrillicModel),
+            SingleByteCharSetProber(Koi8rModel),
+            SingleByteCharSetProber(Latin5CyrillicModel),
+            SingleByteCharSetProber(MacCyrillicModel),
+            SingleByteCharSetProber(Ibm866Model),
+            SingleByteCharSetProber(Ibm855Model),
+            SingleByteCharSetProber(Latin7GreekModel),
+            SingleByteCharSetProber(Win1253GreekModel),
+            SingleByteCharSetProber(Latin5BulgarianModel),
+            SingleByteCharSetProber(Win1251BulgarianModel),
+            SingleByteCharSetProber(Latin2HungarianModel),
+            SingleByteCharSetProber(Win1250HungarianModel),
+            SingleByteCharSetProber(TIS620ThaiModel),
+            ]
+        hebrewProber = HebrewProber()
+        logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, False, hebrewProber)
+        visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, hebrewProber)
+        hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber)
+        self._mProbers.extend([hebrewProber, logicalHebrewProber, visualHebrewProber])
+
+        self.reset()
diff --git a/lib/requests/packages/chardet2/sjisprober.py b/lib/requests/packages/chardet2/sjisprober.py
new file mode 100755
index 0000000..349e9c4
--- /dev/null
+++ b/lib/requests/packages/chardet2/sjisprober.py
@@ -0,0 +1,86 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import SJISDistributionAnalysis
+from .jpcntx import SJISContextAnalysis
+from .mbcssm import SJISSMModel
+from . import constants
+import sys
+from .constants import eStart, eError, eItsMe
+
+class SJISProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(SJISSMModel)
+        self._mDistributionAnalyzer = SJISDistributionAnalysis()
+        self._mContextAnalyzer = SJISContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        MultiByteCharSetProber.reset(self)
+        self._mContextAnalyzer.reset()
+        
+    def get_charset_name(self):
+        return "SHIFT_JIS"
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mContextAnalyzer.feed(self._mLastChar[2 - charLen :], charLen)
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mContextAnalyzer.feed(aBuf[i + 1 - charLen : i + 3 - charLen], charLen)
+                    self._mDistributionAnalyzer.feed(aBuf[i - 1 : i + 1], charLen)
+                    
+        self._mLastChar[0] = aBuf[aLen - 1]
+        
+        if self.get_state() == constants.eDetecting:
+            if self._mContextAnalyzer.got_enough_data() and \
+                   (self.get_confidence() > constants.SHORTCUT_THRESHOLD):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        contxtCf = self._mContextAnalyzer.get_confidence()
+        distribCf = self._mDistributionAnalyzer.get_confidence()
+        return max(contxtCf, distribCf)
diff --git a/lib/requests/packages/chardet2/test.py b/lib/requests/packages/chardet2/test.py
new file mode 100755
index 0000000..f3a3929
--- /dev/null
+++ b/lib/requests/packages/chardet2/test.py
@@ -0,0 +1,21 @@
+from __future__ import print_function
+import sys, glob
+sys.path.insert(0, '..')
+from chardet.universaldetector import UniversalDetector
+
+count = 0
+u = UniversalDetector()
+for f in glob.glob(sys.argv[1]):
+    print(f.ljust(60), end=' ')
+    u.reset()
+    for line in open(f, 'rb'):
+        u.feed(line)
+        if u.done: break
+    u.close()
+    result = u.result
+    if result['encoding']:
+        print(result['encoding'], 'with confidence', result['confidence'])
+    else:
+        print('******** no result')
+    count += 1
+print(count, 'tests')
diff --git a/lib/requests/packages/chardet2/universaldetector.py b/lib/requests/packages/chardet2/universaldetector.py
new file mode 100755
index 0000000..0820d59
--- /dev/null
+++ b/lib/requests/packages/chardet2/universaldetector.py
@@ -0,0 +1,155 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .latin1prober import Latin1Prober # windows-1252
+from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets
+from .sbcsgroupprober import SBCSGroupProber # single-byte character sets
+from .escprober import EscCharSetProber # ISO-2122, etc.
+import re
+
+MINIMUM_THRESHOLD = 0.20
+ePureAscii = 0
+eEscAscii = 1
+eHighbyte = 2
+
+class UniversalDetector:
+    def __init__(self):
+        self._highBitDetector = re.compile(b'[\x80-\xFF]')
+        self._escDetector = re.compile(b'(\033|~{)')
+        self._mEscCharSetProber = None
+        self._mCharSetProbers = []
+        self.reset()
+
+    def reset(self):
+        self.result = {'encoding': None, 'confidence': 0.0}
+        self.done = False
+        self._mStart = True
+        self._mGotData = False
+        self._mInputState = ePureAscii
+        self._mLastChar = b''
+        if self._mEscCharSetProber:
+            self._mEscCharSetProber.reset()
+        for prober in self._mCharSetProbers:
+            prober.reset()
+
+    def feed(self, aBuf):
+        if self.done: return
+
+        aLen = len(aBuf)
+        if not aLen: return
+        
+        if not self._mGotData:
+            # If the data starts with BOM, we know it is UTF
+            if aBuf[:3] == '\xEF\xBB\xBF':
+                # EF BB BF  UTF-8 with BOM
+                self.result = {'encoding': "UTF-8", 'confidence': 1.0}
+            elif aBuf[:4] == '\xFF\xFE\x00\x00':
+                # FF FE 00 00  UTF-32, little-endian BOM
+                self.result = {'encoding': "UTF-32LE", 'confidence': 1.0}
+            elif aBuf[:4] == '\x00\x00\xFE\xFF': 
+                # 00 00 FE FF  UTF-32, big-endian BOM
+                self.result = {'encoding': "UTF-32BE", 'confidence': 1.0}
+            elif aBuf[:4] == '\xFE\xFF\x00\x00':
+                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)
+                self.result = {'encoding': "X-ISO-10646-UCS-4-3412", 'confidence': 1.0}
+            elif aBuf[:4] == '\x00\x00\xFF\xFE':
+                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)
+                self.result = {'encoding': "X-ISO-10646-UCS-4-2143", 'confidence': 1.0}
+            elif aBuf[:2] == '\xFF\xFE':
+                # FF FE  UTF-16, little endian BOM
+                self.result = {'encoding': "UTF-16LE", 'confidence': 1.0}
+            elif aBuf[:2] == '\xFE\xFF':
+                # FE FF  UTF-16, big endian BOM
+                self.result = {'encoding': "UTF-16BE", 'confidence': 1.0}
+
+        self._mGotData = True
+        if self.result['encoding'] and (self.result['confidence'] > 0.0):
+            self.done = True
+            return
+
+        if self._mInputState == ePureAscii:
+            if self._highBitDetector.search(aBuf):
+                self._mInputState = eHighbyte
+            elif (self._mInputState == ePureAscii) and self._escDetector.search(self._mLastChar + aBuf):
+                self._mInputState = eEscAscii
+
+        self._mLastChar = aBuf[-1:]
+
+        if self._mInputState == eEscAscii:
+            if not self._mEscCharSetProber:
+                self._mEscCharSetProber = EscCharSetProber()
+            if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt:
+                self.result = {'encoding': self._mEscCharSetProber.get_charset_name(),
+                               'confidence': self._mEscCharSetProber.get_confidence()}
+                self.done = True
+        elif self._mInputState == eHighbyte:
+            if not self._mCharSetProbers:
+                self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), Latin1Prober()]
+            for prober in self._mCharSetProbers:
+                if prober.feed(aBuf) == constants.eFoundIt:
+                    self.result = {'encoding': prober.get_charset_name(),
+                                   'confidence': prober.get_confidence()}
+                    self.done = True
+                    break
+
+    def close(self):
+        if self.done: return
+        if not self._mGotData:
+            if constants._debug:
+                sys.stderr.write('no data received!\n')
+            return
+        self.done = True
+        
+        if self._mInputState == ePureAscii:
+            self.result = {'encoding': 'ascii', 'confidence': 1.0}
+            return self.result
+
+        if self._mInputState == eHighbyte:
+            proberConfidence = None
+            maxProberConfidence = 0.0
+            maxProber = None
+            for prober in self._mCharSetProbers:
+                if not prober: continue
+                proberConfidence = prober.get_confidence()
+                if proberConfidence > maxProberConfidence:
+                    maxProberConfidence = proberConfidence
+                    maxProber = prober
+            if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD):
+                self.result = {'encoding': maxProber.get_charset_name(),
+                               'confidence': maxProber.get_confidence()}
+                return self.result
+
+        if constants._debug:
+            sys.stderr.write('no probers hit minimum threshhold\n')
+            for prober in self._mCharSetProbers[0].mProbers:
+                if not prober: continue
+                sys.stderr.write('%s confidence = %s\n' % \
+                                 (prober.get_charset_name(), \
+                                  prober.get_confidence()))
diff --git a/lib/requests/packages/chardet2/utf8prober.py b/lib/requests/packages/chardet2/utf8prober.py
new file mode 100755
index 0000000..12db07c
--- /dev/null
+++ b/lib/requests/packages/chardet2/utf8prober.py
@@ -0,0 +1,77 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .constants import eStart, eError, eItsMe
+from .charsetprober import CharSetProber
+from .codingstatemachine import CodingStateMachine
+from .mbcssm import UTF8SMModel
+
+ONE_CHAR_PROB = 0.5
+
+class UTF8Prober(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(UTF8SMModel)
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        self._mCodingSM.reset()
+        self._mNumOfMBChar = 0
+
+    def get_charset_name(self):
+        return "utf-8"
+
+    def feed(self, aBuf):
+        for c in aBuf:
+            codingState = self._mCodingSM.next_state(c)
+            if codingState == eError:
+                self._mState = constants.eNotMe
+                break
+            elif codingState == eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == eStart:
+                if self._mCodingSM.get_current_charlen() >= 2:
+                    self._mNumOfMBChar += 1
+
+        if self.get_state() == constants.eDetecting:
+            if self.get_confidence() > constants.SHORTCUT_THRESHOLD:
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        unlike = 0.99
+        if self._mNumOfMBChar < 6:
+            for i in range(0, self._mNumOfMBChar):
+                unlike = unlike * ONE_CHAR_PROB
+            return 1.0 - unlike
+        else:
+            return unlike
diff --git a/lib/requests/packages/oauthlib/__init__.py b/lib/requests/packages/oauthlib/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/requests/packages/oauthlib/common.py b/lib/requests/packages/oauthlib/common.py
new file mode 100755
index 0000000..70fb6a0
--- /dev/null
+++ b/lib/requests/packages/oauthlib/common.py
@@ -0,0 +1,229 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+"""
+oauthlib.common
+~~~~~~~~~~~~~~
+
+This module provides data structures and utilities common
+to all implementations of OAuth.
+"""
+
+import random
+import re
+import string
+import time
+import urllib
+import urlparse
+
+UNICODE_ASCII_CHARACTER_SET = (string.ascii_letters.decode('ascii') +
+    string.digits.decode('ascii'))
+
+always_safe = (u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+               u'abcdefghijklmnopqrstuvwxyz'
+               u'0123456789' u'_.-')
+
+
+def quote(s, safe=u'/'):
+    encoded = s.encode("utf-8")
+    quoted = urllib.quote(encoded, safe)
+    return quoted.decode("utf-8")
+
+
+def unquote(s):
+    encoded = s.encode("utf-8")
+    unquoted = urllib.unquote(encoded)
+    return unquoted.decode("utf-8")
+
+
+def urlencode(params):
+    utf8_params = encode_params_utf8(params)
+    urlencoded = urllib.urlencode(utf8_params)
+    return urlencoded.decode("utf-8")
+
+
+def encode_params_utf8(params):
+    """Ensures that all parameters in a list of 2-element tuples are encoded to
+    bytestrings using UTF-8
+    """
+    encoded = []
+    for k, v in params:
+        encoded.append((
+            k.encode('utf-8') if isinstance(k, unicode) else k,
+            v.encode('utf-8') if isinstance(v, unicode) else v))
+    return encoded
+
+
+def decode_params_utf8(params):
+    """Ensures that all parameters in a list of 2-element tuples are decoded to
+    unicode using UTF-8.
+    """
+    decoded = []
+    for k, v in params:
+        decoded.append((
+            k.decode('utf-8') if isinstance(k, str) else k,
+            v.decode('utf-8') if isinstance(v, str) else v))
+    return decoded
+
+
+urlencoded = set(always_safe) | set(u'=&;%+~')
+
+
+def urldecode(query):
+    """Decode a query string in x-www-form-urlencoded format into a sequence
+    of two-element tuples.
+
+    Unlike urlparse.parse_qsl(..., strict_parsing=True) urldecode will enforce
+    correct formatting of the query string by validation. If validation fails
+    a ValueError will be raised. urllib.parse_qsl will only raise errors if
+    any of name-value pairs omits the equals sign.
+    """
+    # Check if query contains invalid characters
+    if query and not set(query) <= urlencoded:
+        raise ValueError('Invalid characters in query string.')
+
+    # Check for correctly hex encoded values using a regular expression
+    # All encoded values begin with % followed by two hex characters
+    # correct = %00, %A0, %0A, %FF
+    # invalid = %G0, %5H, %PO
+    invalid_hex = u'%[^0-9A-Fa-f]|%[0-9A-Fa-f][^0-9A-Fa-f]'
+    if len(re.findall(invalid_hex, query)):
+        raise ValueError('Invalid hex encoding in query string.')
+
+    query = query.decode('utf-8') if isinstance(query, str) else query
+    # We want to allow queries such as "c2" whereas urlparse.parse_qsl
+    # with the strict_parsing flag will not.
+    params = urlparse.parse_qsl(query, keep_blank_values=True)
+
+    # unicode all the things
+    return decode_params_utf8(params)
+
+
+def extract_params(raw):
+    """Extract parameters and return them as a list of 2-tuples.
+
+    Will successfully extract parameters from urlencoded query strings,
+    dicts, or lists of 2-tuples. Empty strings/dicts/lists will return an
+    empty list of parameters. Any other input will result in a return
+    value of None.
+    """
+    if isinstance(raw, basestring):
+        try:
+            params = urldecode(raw)
+        except ValueError:
+            params = None
+    elif hasattr(raw, '__iter__'):
+        try:
+            dict(raw)
+        except ValueError:
+            params = None
+        except TypeError:
+            params = None
+        else:
+            params = list(raw.items() if isinstance(raw, dict) else raw)
+            params = decode_params_utf8(params)
+    else:
+        params = None
+
+    return params
+
+
+def generate_nonce():
+    """Generate pseudorandom nonce that is unlikely to repeat.
+
+    Per `section 3.3`_ of the OAuth 1 RFC 5849 spec.
+    Per `section 3.2.1`_ of the MAC Access Authentication spec.
+
+    A random 64-bit number is appended to the epoch timestamp for both
+    randomness and to decrease the likelihood of collisions.
+
+    .. _`section 3.2.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-3.2.1
+    .. _`section 3.3`: http://tools.ietf.org/html/rfc5849#section-3.3
+    """
+    return unicode(unicode(random.getrandbits(64)) + generate_timestamp())
+
+
+def generate_timestamp():
+    """Get seconds since epoch (UTC).
+
+    Per `section 3.3`_ of the OAuth 1 RFC 5849 spec.
+    Per `section 3.2.1`_ of the MAC Access Authentication spec.
+
+    .. _`section 3.2.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-3.2.1
+    .. _`section 3.3`: http://tools.ietf.org/html/rfc5849#section-3.3
+    """
+    return unicode(int(time.time()))
+
+
+def generate_token(length=30, chars=UNICODE_ASCII_CHARACTER_SET):
+    """Generates a non-guessable OAuth token
+
+    OAuth (1 and 2) does not specify the format of tokens except that they
+    should be strings of random characters. Tokens should not be guessable
+    and entropy when generating the random characters is important. Which is
+    why SystemRandom is used instead of the default random.choice method.
+    """
+    rand = random.SystemRandom()
+    return u''.join(rand.choice(chars) for x in range(length))
+
+
+def add_params_to_qs(query, params):
+    """Extend a query with a list of two-tuples."""
+    queryparams = urlparse.parse_qsl(query, keep_blank_values=True)
+    queryparams.extend(params)
+    return urlencode(queryparams)
+
+
+def add_params_to_uri(uri, params):
+    """Add a list of two-tuples to the uri query components."""
+    sch, net, path, par, query, fra = urlparse.urlparse(uri)
+    query = add_params_to_qs(query, params)
+    return urlparse.urlunparse((sch, net, path, par, query, fra))
+
+def safe_string_equals(a, b):
+    """ Near-constant time string comparison. 
+
+    Used in order to avoid timing attacks on sensitive information such
+    as secret keys during request verification (`rootLabs`_).
+
+    .. _`rootLabs`: http://rdist.root.org/2010/01/07/timing-independent-array-comparison/
+    
+    """
+    if len(a) != len(b):
+        return False
+
+    result = 0
+    for x, y in zip(a, b):
+        result |= ord(x) ^ ord(y)
+    return result == 0
+
+class Request(object):
+    """A malleable representation of a signable HTTP request.
+
+    Body argument may contain any data, but parameters will only be decoded if
+    they are one of:
+
+    * urlencoded query string
+    * dict
+    * list of 2-tuples
+
+    Anything else will be treated as raw body data to be passed through
+    unmolested.
+    """
+
+    def __init__(self, uri, http_method=u'GET', body=None, headers=None):
+        self.uri = uri
+        self.http_method = http_method
+        self.headers = headers or {}
+        self.body = body
+        self.decoded_body = extract_params(body)
+        self.oauth_params = []
+
+    @property
+    def uri_query(self):
+        return urlparse.urlparse(self.uri).query
+
+    @property
+    def uri_query_params(self):
+        return urlparse.parse_qsl(self.uri_query, keep_blank_values=True,
+                                  strict_parsing=True)
diff --git a/lib/requests/packages/oauthlib/oauth1/__init__.py b/lib/requests/packages/oauthlib/oauth1/__init__.py
new file mode 100755
index 0000000..ef692b5
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth1/__init__.py
@@ -0,0 +1,13 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+"""
+oauthlib.oauth1
+~~~~~~~~~~~~~~
+
+This module is a wrapper for the most recent implementation of OAuth 1.0 Client
+and Server classes.
+"""
+
+from .rfc5849 import Client, Server
+
diff --git a/lib/requests/packages/oauthlib/oauth1/rfc5849/__init__.py b/lib/requests/packages/oauthlib/oauth1/rfc5849/__init__.py
new file mode 100755
index 0000000..da3988d
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth1/rfc5849/__init__.py
@@ -0,0 +1,889 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+"""
+oauthlib.oauth1.rfc5849
+~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for signing and checking OAuth 1.0 RFC 5849 requests.
+"""
+
+import logging
+import time
+import urlparse
+
+from oauthlib.common import Request, urlencode, generate_nonce
+from oauthlib.common import generate_timestamp
+from . import parameters, signature, utils
+
+logger = logging.getLogger(__name__)
+
+SIGNATURE_HMAC = u"HMAC-SHA1"
+SIGNATURE_RSA = u"RSA-SHA1"
+SIGNATURE_PLAINTEXT = u"PLAINTEXT"
+SIGNATURE_METHODS = (SIGNATURE_HMAC, SIGNATURE_RSA, SIGNATURE_PLAINTEXT)
+
+SIGNATURE_TYPE_AUTH_HEADER = u'AUTH_HEADER'
+SIGNATURE_TYPE_QUERY = u'QUERY'
+SIGNATURE_TYPE_BODY = u'BODY'
+
+CONTENT_TYPE_FORM_URLENCODED = u'application/x-www-form-urlencoded'
+
+
+class Client(object):
+    """A client used to sign OAuth 1.0 RFC 5849 requests"""
+    def __init__(self, client_key,
+            client_secret=None,
+            resource_owner_key=None,
+            resource_owner_secret=None,
+            callback_uri=None,
+            signature_method=SIGNATURE_HMAC,
+            signature_type=SIGNATURE_TYPE_AUTH_HEADER,
+            rsa_key=None, verifier=None):
+        self.client_key = client_key
+        self.client_secret = client_secret
+        self.resource_owner_key = resource_owner_key
+        self.resource_owner_secret = resource_owner_secret
+        self.signature_method = signature_method
+        self.signature_type = signature_type
+        self.callback_uri = callback_uri
+        self.rsa_key = rsa_key
+        self.verifier = verifier
+
+        if self.signature_method == SIGNATURE_RSA and self.rsa_key is None:
+            raise ValueError('rsa_key is required when using RSA signature method.')
+
+    def get_oauth_signature(self, request):
+        """Get an OAuth signature to be used in signing a request
+        """
+        if self.signature_method == SIGNATURE_PLAINTEXT:
+            # fast-path
+            return signature.sign_plaintext(self.client_secret,
+                self.resource_owner_secret)
+
+        uri, headers, body = self._render(request)
+
+        collected_params = signature.collect_parameters(
+            uri_query=urlparse.urlparse(uri).query,
+            body=body,
+            headers=headers)
+        logger.debug("Collected params: {0}".format(collected_params))
+
+        normalized_params = signature.normalize_parameters(collected_params)
+        normalized_uri = signature.normalize_base_string_uri(request.uri)
+        logger.debug("Normalized params: {0}".format(normalized_params))
+        logger.debug("Normalized URI: {0}".format(normalized_uri))
+
+        base_string = signature.construct_base_string(request.http_method,
+            normalized_uri, normalized_params)
+
+        logger.debug("Base signing string: {0}".format(base_string))
+
+        if self.signature_method == SIGNATURE_HMAC:
+            sig = signature.sign_hmac_sha1(base_string, self.client_secret,
+                self.resource_owner_secret)
+        elif self.signature_method == SIGNATURE_RSA:
+            sig = signature.sign_rsa_sha1(base_string, self.rsa_key)
+        else:
+            sig = signature.sign_plaintext(self.client_secret,
+                self.resource_owner_secret)
+
+        logger.debug("Signature: {0}".format(sig))
+        return sig
+
+    def get_oauth_params(self):
+        """Get the basic OAuth parameters to be used in generating a signature.
+        """
+        params = [
+            (u'oauth_nonce', generate_nonce()),
+            (u'oauth_timestamp', generate_timestamp()),
+            (u'oauth_version', u'1.0'),
+            (u'oauth_signature_method', self.signature_method),
+            (u'oauth_consumer_key', self.client_key),
+        ]
+        if self.resource_owner_key:
+            params.append((u'oauth_token', self.resource_owner_key))
+        if self.callback_uri:
+            params.append((u'oauth_callback', self.callback_uri))
+        if self.verifier:
+            params.append((u'oauth_verifier', self.verifier))
+
+        return params
+
+    def _render(self, request, formencode=False):
+        """Render a signed request according to signature type
+
+        Returns a 3-tuple containing the request URI, headers, and body.
+
+        If the formencode argument is True and the body contains parameters, it
+        is escaped and returned as a valid formencoded string.
+        """
+        # TODO what if there are body params on a header-type auth?
+        # TODO what if there are query params on a body-type auth?
+
+        uri, headers, body = request.uri, request.headers, request.body
+
+        # TODO: right now these prepare_* methods are very narrow in scope--they
+        # only affect their little thing. In some cases (for example, with
+        # header auth) it might be advantageous to allow these methods to touch
+        # other parts of the request, like the headers—so the prepare_headers
+        # method could also set the Content-Type header to x-www-form-urlencoded
+        # like the spec requires. This would be a fundamental change though, and
+        # I'm not sure how I feel about it.
+        if self.signature_type == SIGNATURE_TYPE_AUTH_HEADER:
+            headers = parameters.prepare_headers(request.oauth_params, request.headers)
+        elif self.signature_type == SIGNATURE_TYPE_BODY and request.decoded_body is not None:
+            body = parameters.prepare_form_encoded_body(request.oauth_params, request.decoded_body)
+            if formencode:
+                body = urlencode(body)
+            headers['Content-Type'] = u'application/x-www-form-urlencoded'
+        elif self.signature_type == SIGNATURE_TYPE_QUERY:
+            uri = parameters.prepare_request_uri_query(request.oauth_params, request.uri)
+        else:
+            raise ValueError('Unknown signature type specified.')
+
+        return uri, headers, body
+
+    def sign(self, uri, http_method=u'GET', body=None, headers=None):
+        """Sign a request
+
+        Signs an HTTP request with the specified parts.
+
+        Returns a 3-tuple of the signed request's URI, headers, and body.
+        Note that http_method is not returned as it is unaffected by the OAuth
+        signing process.
+
+        The body argument may be a dict, a list of 2-tuples, or a formencoded
+        string. The Content-Type header must be 'application/x-www-form-urlencoded'
+        if it is present.
+
+        If the body argument is not one of the above, it will be returned
+        verbatim as it is unaffected by the OAuth signing process. Attempting to
+        sign a request with non-formencoded data using the OAuth body signature
+        type is invalid and will raise an exception.
+
+        If the body does contain parameters, it will be returned as a properly-
+        formatted formencoded string.
+
+        All string data MUST be unicode. This includes strings inside body
+        dicts, for example.
+        """
+        # normalize request data
+        request = Request(uri, http_method, body, headers)
+
+        # sanity check
+        content_type = request.headers.get('Content-Type', None)
+        multipart = content_type and content_type.startswith('multipart/')
+        should_have_params = content_type == CONTENT_TYPE_FORM_URLENCODED
+        has_params = request.decoded_body is not None
+        # 3.4.1.3.1.  Parameter Sources
+        # [Parameters are collected from the HTTP request entity-body, but only
+        # if [...]:
+        #    *  The entity-body is single-part.
+        if multipart and has_params:
+            raise ValueError("Headers indicate a multipart body but body contains parameters.")
+        #    *  The entity-body follows the encoding requirements of the
+        #       "application/x-www-form-urlencoded" content-type as defined by
+        #       [W3C.REC-html40-19980424].
+        elif should_have_params and not has_params:
+            raise ValueError("Headers indicate a formencoded body but body was not decodable.")
+        #    *  The HTTP request entity-header includes the "Content-Type"
+        #       header field set to "application/x-www-form-urlencoded".
+        elif not should_have_params and has_params:
+            raise ValueError("Body contains parameters but Content-Type header was not set.")
+
+        # 3.5.2.  Form-Encoded Body
+        # Protocol parameters can be transmitted in the HTTP request entity-
+        # body, but only if the following REQUIRED conditions are met:
+        # o  The entity-body is single-part.
+        # o  The entity-body follows the encoding requirements of the
+        #    "application/x-www-form-urlencoded" content-type as defined by
+        #    [W3C.REC-html40-19980424].
+        # o  The HTTP request entity-header includes the "Content-Type" header
+        #    field set to "application/x-www-form-urlencoded".
+        elif self.signature_type == SIGNATURE_TYPE_BODY and not (
+                should_have_params and has_params and not multipart):
+            raise ValueError('Body signatures may only be used with form-urlencoded content')
+
+        # generate the basic OAuth parameters
+        request.oauth_params = self.get_oauth_params()
+
+        # generate the signature
+        request.oauth_params.append((u'oauth_signature', self.get_oauth_signature(request)))
+
+        # render the signed request and return it
+        return self._render(request, formencode=True)
+
+
+class Server(object):
+    """A server base class used to verify OAuth 1.0 RFC 5849 requests
+
+    OAuth providers should inherit from Server and implement the methods
+    and properties outlined below. Further details are provided in the
+    documentation for each method and property.
+
+    Methods used to check the format of input parameters. Common tests include
+    length, character set, membership, range or pattern. These tests are
+    referred to as `whitelisting or blacklisting`_. Whitelisting is better
+    but blacklisting can be usefull to spot malicious activity.
+    The following have methods a default implementation:
+
+    - check_client_key
+    - check_request_token
+    - check_access_token
+    - check_nonce
+    - check_verifier
+    - check_realm
+
+    The methods above default to whitelist input parameters, checking that they
+    are alphanumerical and between a minimum and maximum length. Rather than
+    overloading the methods a few properties can be used to configure these
+    methods.
+
+    @ safe_characters -> (character set)
+    @ client_key_length -> (min, max)
+    @ request_token_length -> (min, max)
+    @ access_token_length -> (min, max)
+    @ nonce_length -> (min, max)
+    @ verifier_length -> (min, max)
+    @ realms -> [list, of, realms]
+
+    Methods used to validate input parameters. These checks usually hit either
+    persistent or temporary storage such as databases or the filesystem. See
+    each methods documentation for detailed usage.
+    The following methods must be implemented:
+
+    - validate_client
+    - validate_request_token
+    - validate_access_token
+    - validate_nonce_and_timestamp
+    - validate_redirect_uri
+    - validate_requested_realm
+    - validate_realm
+    - validate_verifier
+
+    Method used to retrieve sensitive information from storage.
+    The following methods must be implemented:
+
+    - get_client_secret
+    - get_request_token_secret
+    - get_access_token_secret
+    - get_rsa_key
+
+    To prevent timing attacks it is necessary to not exit early even if the
+    client key or resource owner key is invalid. Instead dummy values should
+    be used during the remaining verification process. It is very important
+    that the dummy client and token are valid input parameters to the methods
+    get_client_secret, get_rsa_key and get_(access/request)_token_secret and
+    that the running time of those methods when given a dummy value remain
+    equivalent to the running time when given a valid client/resource owner.
+    The following properties must be implemented:
+
+    @ dummy_client
+    @ dummy_request_token
+    @ dummy_access_token
+
+    .. _`whitelisting or blacklisting`: http://www.schneier.com/blog/archives/2011/01/whitelisting_vs.html
+    """
+
+    def __init__(self):
+        pass
+
+    @property
+    def allowed_signature_methods(self):
+        return SIGNATURE_METHODS
+
+    @property
+    def safe_characters(self):
+        return set(utils.UNICODE_ASCII_CHARACTER_SET)
+
+    @property
+    def client_key_length(self):
+        return 20, 30
+
+    @property
+    def request_token_length(self):
+        return 20, 30
+
+    @property
+    def access_token_length(self):
+        return 20, 30
+
+    @property
+    def timestamp_lifetime(self):
+        return 600
+
+    @property
+    def nonce_length(self):
+        return 20, 30
+
+    @property
+    def verifier_length(self):
+        return 20, 30
+
+    @property
+    def realms(self):
+        return []
+
+    @property
+    def enforce_ssl(self):
+        return True
+
+    def check_client_key(self, client_key):
+        """Check that the client key only contains safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.client_key_length
+        return (set(client_key) <= self.safe_characters and
+                lower <= len(client_key) <= upper)
+
+    def check_request_token(self, request_token):
+        """Checks that the request token contains only safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.request_token_length
+        return (set(request_token) <= self.safe_characters and
+                lower <= len(request_token) <= upper)
+
+    def check_access_token(self, request_token):
+        """Checks that the token contains only safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.access_token_length
+        return (set(request_token) <= self.safe_characters and
+                lower <= len(request_token) <= upper)
+
+    def check_nonce(self, nonce):
+        """Checks that the nonce only contains only safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.nonce_length
+        return (set(nonce) <= self.safe_characters and
+                lower <= len(nonce) <= upper)
+
+    def check_verifier(self, verifier):
+        """Checks that the verifier contains only safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.verifier_length
+        return (set(verifier) <= self.safe_characters and
+                lower <= len(verifier) <= upper)
+
+    def check_realm(self, realm):
+        """Check that the realm is one of a set allowed realms.
+        """
+        return realm in self.realms
+
+    def get_client_secret(self, client_key):
+        """Retrieves the client secret associated with the client key.
+
+        This method must allow the use of a dummy client_key value.
+        Fetching the secret using the dummy key must take the same amount of
+        time as fetching a secret for a valid client.
+
+        Note that the returned key must be in plaintext.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    @property
+    def dummy_client(self):
+        """Dummy client used when an invalid client key is supplied.
+
+        The dummy client should be associated with either a client secret,
+        a rsa key or both depending on which signature methods are supported.
+        Providers should make sure that
+
+        get_client_secret(dummy_client)
+        get_rsa_key(dummy_client)
+
+        return a valid secret or key for the dummy client.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_request_token_secret(self, client_key, request_token):
+        """Retrieves the shared secret associated with the request token.
+
+        This method must allow the use of a dummy values and the running time
+        must be roughly equivalent to that of the running time of valid values.
+
+        Note that the returned key must be in plaintext.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_access_token_secret(self, client_key, access_token):
+        """Retrieves the shared secret associated with the access token.
+
+        This method must allow the use of a dummy values and the running time
+        must be roughly equivalent to that of the running time of valid values.
+
+        Note that the returned key must be in plaintext.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    @property
+    def dummy_request_token(self):
+        """Dummy request token used when an invalid token was supplied.
+
+        The dummy request token should be associated with a request token
+        secret such that get_request_token_secret(.., dummy_request_token)
+        returns a valid secret.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    @property
+    def dummy_access_token(self):
+        """Dummy access token used when an invalid token was supplied.
+
+        The dummy access token should be associated with an access token
+        secret such that get_access_token_secret(.., dummy_access_token)
+        returns a valid secret.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_rsa_key(self, client_key):
+        """Retrieves a previously stored client provided RSA key.
+
+        This method must allow the use of a dummy client_key value. Fetching
+        the rsa key using the dummy key must take the same aount of time
+        as fetching a key for a valid client.
+
+        Note that the key must be returned in plaintext.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_signature_type_and_params(self, request):
+        """Extracts parameters from query, headers and body. Signature type
+        is set to the source in which parameters were found.
+        """
+        header_params = signature.collect_parameters(headers=request.headers,
+                exclude_oauth_signature=False)
+        body_params = signature.collect_parameters(body=request.body,
+                exclude_oauth_signature=False)
+        query_params = signature.collect_parameters(uri_query=request.uri_query,
+                exclude_oauth_signature=False)
+
+        params = []
+        params.extend(header_params)
+        params.extend(body_params)
+        params.extend(query_params)
+        signature_types_with_oauth_params = filter(lambda s: s[2], (
+            (SIGNATURE_TYPE_AUTH_HEADER, params,
+                utils.filter_oauth_params(header_params)),
+            (SIGNATURE_TYPE_BODY, params,
+                utils.filter_oauth_params(body_params)),
+            (SIGNATURE_TYPE_QUERY, params,
+                utils.filter_oauth_params(query_params))
+        ))
+
+        if len(signature_types_with_oauth_params) > 1:
+            raise ValueError('oauth_ params must come from only 1 signature type but were found in %s' % ', '.join(
+                [s[0] for s in signature_types_with_oauth_params]))
+        try:
+            signature_type, params, oauth_params = signature_types_with_oauth_params[0]
+        except IndexError:
+            raise ValueError('oauth_ params are missing. Could not determine signature type.')
+
+        return signature_type, params, oauth_params
+
+    def validate_client_key(self, client_key):
+        """Validates that supplied client key is a registered and valid client.
+
+        Note that if the dummy client is supplied it should validate in same
+        or nearly the same amount of time as a valid one.
+
+        Bad:
+
+            if client_key == self.dummy_client:
+                return False
+            else:
+                return storage.has_client(client_key)
+
+        Good:
+
+            return storage.has_client(client_key) and client_key != self.dummy_client
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_request_token(self, client_key, request_token):
+        """Validates that supplied request token is registered and valid.
+
+        Note that if the dummy request_token is supplied it should validate in
+        the same nearly the same amount of time as a valid one.
+
+        Bad:
+
+            if request_token == self.dummy_request_token:
+                return False
+            else:
+                return storage.has_request_token(request_token)
+
+        Good:
+
+            return (storage.has_request_token(request_token) and
+                    request_token != self.dummy_request_token)
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_access_token(self, client_key, access_token):
+        """Validates that supplied access token is registered and valid.
+
+        Note that if the dummy access token is supplied it should validate in
+        the same or nearly the same amount of time as a valid one.
+
+        Bad:
+
+            if access_token == self.dummy_access_token:
+                return False
+            else:
+                return storage.has_access_token(access_token)
+
+        Good:
+
+            return (storage.has_access_token(access_token) and
+                    access_token != self.dummy_access_token)
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_timestamp_and_nonce(self, client_key, timestamp, nonce,
+        request_token=None, access_token=None):
+        """Validates that the nonce has not been used before.
+
+        Per `Section 3.3`_ of the spec.
+
+        "A nonce is a random string, uniquely generated by the client to allow
+        the server to verify that a request has never been made before and
+        helps prevent replay attacks when requests are made over a non-secure
+        channel.  The nonce value MUST be unique across all requests with the
+        same timestamp, client credentials, and token combinations."
+
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc5849#section-3.3
+
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_redirect_uri(self, client_key, redirect_uri):
+        """Validates the client supplied redirection URI.
+
+        It is highly recommended that OAuth providers require their clients
+        to register all redirection URIs prior to using them in requests and
+        register them as absolute URIs. See `CWE-601`_ for more information
+        about open redirection attacks.
+
+        By requiring registration of all redirection URIs it should be
+        straightforward for the provider to verify whether the supplied
+        redirect_uri is valid or not.
+
+        .. _`CWE-601`: http://cwe.mitre.org/top25/index.html#CWE-601
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+
+    def validate_requested_realm(self, client_key, realm):
+        """Validates that the client may request access to the realm.
+
+        This method is invoked when obtaining a request token and should
+        tie a realm to the request token and after user authorization
+        this realm restriction should transfer to the access token.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_realm(self, client_key, access_token, uri=None,
+            required_realm=None):
+        """Validates access to the request realm.
+
+        How providers choose to use the realm parameter is outside the OAuth
+        specification but it is commonly used to restrict access to a subset
+        of protected resources such as "photos".
+
+        required_realm is a convenience parameter which can be used to provide
+        a per view method pre-defined list of allowed realms.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_verifier(self, client_key, request_token, verifier):
+        """Validates a verification code.
+
+        OAuth providers issue a verification code to clients after the
+        resource owner authorizes access. This code is used by the client to
+        obtain token credentials and the provider must verify that the
+        verifier is valid and associated with the client as well as the
+        resource owner.
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def verify_request(self, uri, http_method=u'GET', body=None,
+            headers=None, require_resource_owner=True, require_verifier=False,
+            require_realm=False, required_realm=None):
+        """Verifies a request ensuring that the following is true:
+
+        Per `section 3.2`_ of the spec.
+
+        - all mandated OAuth parameters are supplied
+        - parameters are only supplied in one source which may be the URI
+          query, the Authorization header or the body
+        - all parameters are checked and validated, see comments and the
+          methods and properties of this class for further details.
+        - the supplied signature is verified against a recalculated one
+
+        A ValueError will be raised if any parameter is missing,
+        supplied twice or invalid. A HTTP 400 Response should be returned
+        upon catching an exception.
+
+        A HTTP 401 Response should be returned if verify_request returns False.
+
+        `Timing attacks`_ are prevented through the use of dummy credentials to
+        create near constant time verification even if an invalid credential
+        is used. Early exit on invalid credentials would enable attackers
+        to perform `enumeration attacks`_. Near constant time string comparison
+        is used to prevent secret key guessing. Note that timing attacks can
+        only be prevented through near constant time execution, not by adding
+        a random delay which would only require more samples to be gathered.
+
+        .. _`section 3.2`: http://tools.ietf.org/html/rfc5849#section-3.2
+        .. _`Timing attacks`: http://rdist.root.org/2010/07/19/exploiting-remote-timing-attacks/
+        .. _`enumeration attacks`: http://www.sans.edu/research/security-laboratory/article/attacks-browsing
+        """
+        # Only include body data from x-www-form-urlencoded requests
+        headers = headers or {}
+        if (u"Content-Type" in headers and
+                headers[u"Content-Type"] == CONTENT_TYPE_FORM_URLENCODED):
+            request = Request(uri, http_method, body, headers)
+        else:
+            request = Request(uri, http_method, u'', headers)
+
+        if self.enforce_ssl and not request.uri.lower().startswith("https://"):
+            raise ValueError("Insecure transport, only HTTPS is allowed.")
+
+        signature_type, params, oauth_params = self.get_signature_type_and_params(request)
+
+        # The server SHOULD return a 400 (Bad Request) status code when
+        # receiving a request with duplicated protocol parameters.
+        if len(dict(oauth_params)) != len(oauth_params):
+            raise ValueError("Duplicate OAuth entries.")
+
+        oauth_params = dict(oauth_params)
+        request_signature = oauth_params.get(u'oauth_signature')
+        client_key = oauth_params.get(u'oauth_consumer_key')
+        resource_owner_key = oauth_params.get(u'oauth_token')
+        nonce = oauth_params.get(u'oauth_nonce')
+        timestamp = oauth_params.get(u'oauth_timestamp')
+        callback_uri = oauth_params.get(u'oauth_callback')
+        verifier = oauth_params.get(u'oauth_verifier')
+        signature_method = oauth_params.get(u'oauth_signature_method')
+        realm = dict(params).get(u'realm')
+
+        # The server SHOULD return a 400 (Bad Request) status code when
+        # receiving a request with missing parameters.
+        if not all((request_signature, client_key, nonce,
+                    timestamp, signature_method)):
+            raise ValueError("Missing OAuth parameters.")
+
+        # OAuth does not mandate a particular signature method, as each
+        # implementation can have its own unique requirements.  Servers are
+        # free to implement and document their own custom methods.
+        # Recommending any particular method is beyond the scope of this
+        # specification.  Implementers should review the Security
+        # Considerations section (`Section 4`_) before deciding on which
+        # method to support.
+        # .. _`Section 4`: http://tools.ietf.org/html/rfc5849#section-4
+        if not signature_method in self.allowed_signature_methods:
+            raise ValueError("Invalid signature method.")
+
+        # Servers receiving an authenticated request MUST validate it by:
+        #   If the "oauth_version" parameter is present, ensuring its value is
+        #   "1.0".
+        if u'oauth_version' in oauth_params and oauth_params[u'oauth_version'] != u'1.0':
+            raise ValueError("Invalid OAuth version.")
+
+        # The timestamp value MUST be a positive integer. Unless otherwise
+        # specified by the server's documentation, the timestamp is expressed
+        # in the number of seconds since January 1, 1970 00:00:00 GMT.
+        if len(timestamp) != 10:
+            raise ValueError("Invalid timestamp size")
+        try:
+            ts = int(timestamp)
+
+        except ValueError:
+            raise ValueError("Timestamp must be an integer")
+
+        else:
+            # To avoid the need to retain an infinite number of nonce values for
+            # future checks, servers MAY choose to restrict the time period after
+            # which a request with an old timestamp is rejected.
+            if time.time() - ts > self.timestamp_lifetime:
+                raise ValueError("Request too old, over 10 minutes.")
+
+        # Provider specific validation of parameters, used to enforce
+        # restrictions such as character set and length.
+        if not self.check_client_key(client_key):
+            raise ValueError("Invalid client key.")
+
+        if not resource_owner_key and require_resource_owner:
+            raise ValueError("Missing resource owner.")
+
+        if (require_resource_owner and not require_verifier and
+            not self.check_access_token(resource_owner_key)):
+            raise ValueError("Invalid resource owner key.")
+
+        if (require_resource_owner and require_verifier and
+            not self.check_request_token(resource_owner_key)):
+            raise ValueError("Invalid resource owner key.")
+
+        if not self.check_nonce(nonce):
+            raise ValueError("Invalid nonce.")
+
+        if realm and not self.check_realm(realm):
+            raise ValueError("Invalid realm. Allowed are %s" % self.realms)
+
+        if not verifier and require_verifier:
+            raise ValueError("Missing verifier.")
+
+        if require_verifier and not self.check_verifier(verifier):
+            raise ValueError("Invalid verifier.")
+
+        # Servers receiving an authenticated request MUST validate it by:
+        #   If using the "HMAC-SHA1" or "RSA-SHA1" signature methods, ensuring
+        #   that the combination of nonce/timestamp/token (if present)
+        #   received from the client has not been used before in a previous
+        #   request (the server MAY reject requests with stale timestamps as
+        #   described in `Section 3.3`_).
+        # .._`Section 3.3`: http://tools.ietf.org/html/rfc5849#section-3.3
+        #
+        # We check this before validating client and resource owner for
+        # increased security and performance, both gained by doing less work.
+        if require_verifier:
+            token = {"request_token": resource_owner_key}
+        else:
+            token = {"access_token": resource_owner_key}
+        if not self.validate_timestamp_and_nonce(client_key, timestamp,
+                nonce, **token):
+                return False
+
+        # The server SHOULD return a 401 (Unauthorized) status code when
+        # receiving a request with invalid client credentials.
+        # Note: This is postponed in order to avoid timing attacks, instead
+        # a dummy client is assigned and used to maintain near constant
+        # time request verification.
+        #
+        # Note that early exit would enable client enumeration
+        valid_client = self.validate_client_key(client_key)
+        if not valid_client:
+            client_key = self.dummy_client
+
+        # Ensure a valid redirection uri is used
+        valid_redirect = self.validate_redirect_uri(client_key, callback_uri)
+
+        # The server SHOULD return a 401 (Unauthorized) status code when
+        # receiving a request with invalid or expired token.
+        # Note: This is postponed in order to avoid timing attacks, instead
+        # a dummy token is assigned and used to maintain near constant
+        # time request verification.
+        #
+        # Note that early exit would enable resource owner enumeration
+        if resource_owner_key:
+            if require_verifier:
+                valid_resource_owner = self.validate_request_token(
+                    client_key, resource_owner_key)
+            else:
+                valid_resource_owner = self.validate_access_token(
+                    client_key, resource_owner_key)
+            if not valid_resource_owner:
+                resource_owner_key = self.dummy_resource_owner
+        else:
+            valid_resource_owner = True
+
+        # Note that `realm`_ is only used in authorization headers and how
+        # it should be interepreted is not included in the OAuth spec.
+        # However they could be seen as a scope or realm to which the
+        # client has access and as such every client should be checked
+        # to ensure it is authorized access to that scope or realm.
+        # .. _`realm`: http://tools.ietf.org/html/rfc2617#section-1.2
+        #
+        # Note that early exit would enable client realm access enumeration.
+        #
+        # The require_realm indicates this is the first step in the OAuth
+        # workflow where a client requests access to a specific realm.
+        #
+        # Clients obtaining an access token will not supply a realm and it will
+        # not be checked. Instead the previously requested realm should be
+        # transferred from the request token to the access token.
+        #
+        # Access to protected resources will always validate the realm but note
+        # that the realm is now tied to the access token and not provided by
+        # the client.
+        if require_realm and not resource_owner_key:
+            valid_realm = self.validate_requested_realm(client_key, realm)
+        elif require_verifier:
+            valid_realm = True
+        else:
+            valid_realm = self.validate_realm(client_key, resource_owner_key,
+                    uri=request.uri, required_realm=required_realm)
+
+        # The server MUST verify (Section 3.2) the validity of the request,
+        # ensure that the resource owner has authorized the provisioning of
+        # token credentials to the client, and ensure that the temporary
+        # credentials have not expired or been used before.  The server MUST
+        # also verify the verification code received from the client.
+        # .. _`Section 3.2`: http://tools.ietf.org/html/rfc5849#section-3.2
+        #
+        # Note that early exit would enable resource owner authorization
+        # verifier enumertion.
+        if verifier:
+            valid_verifier = self.validate_verifier(client_key,
+                resource_owner_key, verifier)
+        else:
+            valid_verifier = True
+
+        # Parameters to Client depend on signature method which may vary
+        # for each request. Note that HMAC-SHA1 and PLAINTEXT share parameters
+
+        request.params = filter(lambda x: x[0] != "oauth_signature", params)
+        request.signature = request_signature
+
+        # ---- RSA Signature verification ----
+        if signature_method == SIGNATURE_RSA:
+            # The server verifies the signature per `[RFC3447] section 8.2.2`_
+            # .. _`[RFC3447] section 8.2.2`: http://tools.ietf.org/html/rfc3447#section-8.2.1
+            rsa_key = self.get_rsa_key(client_key)
+            valid_signature = signature.verify_rsa_sha1(request, rsa_key)
+
+        # ---- HMAC or Plaintext Signature verification ----
+        else:
+            # Servers receiving an authenticated request MUST validate it by:
+            #   Recalculating the request signature independently as described in
+            #   `Section 3.4`_ and comparing it to the value received from the
+            #   client via the "oauth_signature" parameter.
+            # .. _`Section 3.4`: http://tools.ietf.org/html/rfc5849#section-3.4
+            client_secret = self.get_client_secret(client_key)
+            if require_verifier:
+                resource_owner_secret = self.get_request_token_secret(
+                    client_key, resource_owner_key)
+            else:
+                resource_owner_secret = self.get_access_token_secret(
+                    client_key, resource_owner_key)
+
+            if signature_method == SIGNATURE_HMAC:
+                valid_signature = signature.verify_hmac_sha1(request,
+                    client_secret, resource_owner_secret)
+            else:
+                valid_signature = signature.verify_plaintext(request,
+                    client_secret, resource_owner_secret)
+
+        # We delay checking validity until the very end, using dummy values for
+        # calculations and fetching secrets/keys to ensure the flow of every
+        # request remains almost identical regardless of whether valid values
+        # have been supplied. This ensures near constant time execution and
+        # prevents malicious users from guessing sensitive information
+        v = all((valid_client, valid_resource_owner, valid_realm,
+                    valid_redirect, valid_verifier, valid_signature))
+        logger = logging.getLogger("oauthlib")
+        if not v:
+            logger.info("[Failure] OAuthLib request verification failed.")
+            logger.info("Valid client:\t%s" % valid_client)
+            logger.info("Valid token:\t%s\t(Required: %s" % (valid_resource_owner, require_resource_owner))
+            logger.info("Valid realm:\t%s\t(Required: %s)" % (valid_realm, require_realm))
+            logger.info("Valid callback:\t%s" % valid_redirect)
+            logger.info("Valid verifier:\t%s\t(Required: %s)" % (valid_verifier, require_verifier))
+            logger.info("Valid signature:\t%s" % valid_signature)
+        return v
diff --git a/lib/requests/packages/oauthlib/oauth1/rfc5849/parameters.py b/lib/requests/packages/oauthlib/oauth1/rfc5849/parameters.py
new file mode 100755
index 0000000..dee23a4
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth1/rfc5849/parameters.py
@@ -0,0 +1,134 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+"""
+oauthlib.parameters
+~~~~~~~~~~~~~~~~~~~
+
+This module contains methods related to `section 3.5`_ of the OAuth 1.0a spec.
+
+.. _`section 3.5`: http://tools.ietf.org/html/rfc5849#section-3.5
+"""
+
+from urlparse import urlparse, urlunparse
+from . import utils
+from oauthlib.common import extract_params, urlencode
+
+
+# TODO: do we need filter_params now that oauth_params are handled by Request?
+#       We can easily pass in just oauth protocol params.
+ at utils.filter_params
+def prepare_headers(oauth_params, headers=None, realm=None):
+    """**Prepare the Authorization header.**
+    Per `section 3.5.1`_ of the spec.
+
+    Protocol parameters can be transmitted using the HTTP "Authorization"
+    header field as defined by `RFC2617`_ with the auth-scheme name set to
+    "OAuth" (case insensitive).
+
+    For example::
+
+        Authorization: OAuth realm="Example",
+            oauth_consumer_key="0685bd9184jfhq22",
+            oauth_token="ad180jjd733klru7",
+            oauth_signature_method="HMAC-SHA1",
+            oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+            oauth_timestamp="137131200",
+            oauth_nonce="4572616e48616d6d65724c61686176",
+            oauth_version="1.0"
+
+
+    .. _`section 3.5.1`: http://tools.ietf.org/html/rfc5849#section-3.5.1
+    .. _`RFC2617`: http://tools.ietf.org/html/rfc2617
+    """
+    headers = headers or {}
+
+    # Protocol parameters SHALL be included in the "Authorization" header
+    # field as follows:
+    authorization_header_parameters_parts = []
+    for oauth_parameter_name, value in oauth_params:
+        # 1.  Parameter names and values are encoded per Parameter Encoding
+        #     (`Section 3.6`_)
+        #
+        # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+        escaped_name = utils.escape(oauth_parameter_name)
+        escaped_value = utils.escape(value)
+
+        # 2.  Each parameter's name is immediately followed by an "=" character
+        #     (ASCII code 61), a """ character (ASCII code 34), the parameter
+        #     value (MAY be empty), and another """ character (ASCII code 34).
+        part = u'{0}="{1}"'.format(escaped_name, escaped_value)
+
+        authorization_header_parameters_parts.append(part)
+
+    # 3.  Parameters are separated by a "," character (ASCII code 44) and
+    #     OPTIONAL linear whitespace per `RFC2617`_.
+    #
+    # .. _`RFC2617`: http://tools.ietf.org/html/rfc2617
+    authorization_header_parameters = ', '.join(
+        authorization_header_parameters_parts)
+
+    # 4.  The OPTIONAL "realm" parameter MAY be added and interpreted per
+    #     `RFC2617 section 1.2`_.
+    #
+    # .. _`RFC2617 section 1.2`: http://tools.ietf.org/html/rfc2617#section-1.2
+    if realm:
+        # NOTE: realm should *not* be escaped
+        authorization_header_parameters = (u'realm="%s", ' % realm +
+            authorization_header_parameters)
+
+    # the auth-scheme name set to "OAuth" (case insensitive).
+    authorization_header = u'OAuth %s' % authorization_header_parameters
+
+    # contribute the Authorization header to the given headers
+    full_headers = {}
+    full_headers.update(headers)
+    full_headers[u'Authorization'] = authorization_header
+    return full_headers
+
+
+def _append_params(oauth_params, params):
+    """Append OAuth params to an existing set of parameters.
+
+    Both params and oauth_params is must be lists of 2-tuples.
+
+    Per `section 3.5.2`_ and `3.5.3`_ of the spec.
+
+    .. _`section 3.5.2`: http://tools.ietf.org/html/rfc5849#section-3.5.2
+    .. _`3.5.3`: http://tools.ietf.org/html/rfc5849#section-3.5.3
+
+    """
+    merged = list(params)
+    merged.extend(oauth_params)
+    # The request URI / entity-body MAY include other request-specific
+    # parameters, in which case, the protocol parameters SHOULD be appended
+    # following the request-specific parameters, properly separated by an "&"
+    # character (ASCII code 38)
+    merged.sort(key=lambda i: i[0].startswith('oauth_'))
+    return merged
+
+
+def prepare_form_encoded_body(oauth_params, body):
+    """Prepare the Form-Encoded Body.
+
+    Per `section 3.5.2`_ of the spec.
+
+    .. _`section 3.5.2`: http://tools.ietf.org/html/rfc5849#section-3.5.2
+
+    """
+    # append OAuth params to the existing body
+    return _append_params(oauth_params, body)
+
+
+def prepare_request_uri_query(oauth_params, uri):
+    """Prepare the Request URI Query.
+
+    Per `section 3.5.3`_ of the spec.
+
+    .. _`section 3.5.3`: http://tools.ietf.org/html/rfc5849#section-3.5.3
+
+    """
+    # append OAuth params to the existing set of query components
+    sch, net, path, par, query, fra = urlparse(uri)
+    query = urlencode(_append_params(oauth_params, extract_params(query) or []))
+    return urlunparse((sch, net, path, par, query, fra))
diff --git a/lib/requests/packages/oauthlib/oauth1/rfc5849/signature.py b/lib/requests/packages/oauthlib/oauth1/rfc5849/signature.py
new file mode 100755
index 0000000..dbd43aa
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth1/rfc5849/signature.py
@@ -0,0 +1,551 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+"""
+oauthlib.oauth1.rfc5849.signature
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module represents a direct implementation of `section 3.4`_ of the spec.
+
+Terminology:
+ * Client: software interfacing with an OAuth API
+ * Server: the API provider
+ * Resource Owner: the user who is granting authorization to the client
+
+Steps for signing a request:
+
+1. Collect parameters from the uri query, auth header, & body
+2. Normalize those parameters
+3. Normalize the uri
+4. Pass the normalized uri, normalized parameters, and http method to
+   construct the base string
+5. Pass the base string and any keys needed to a signing function
+
+.. _`section 3.4`: http://tools.ietf.org/html/rfc5849#section-3.4
+"""
+import binascii
+import hashlib
+import hmac
+import urlparse
+from . import utils
+from oauthlib.common import extract_params, safe_string_equals
+
+
+def construct_base_string(http_method, base_string_uri,
+        normalized_encoded_request_parameters):
+    """**String Construction**
+    Per `section 3.4.1.1`_ of the spec.
+
+    For example, the HTTP request::
+
+        POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
+        Host: example.com
+        Content-Type: application/x-www-form-urlencoded
+        Authorization: OAuth realm="Example",
+            oauth_consumer_key="9djdj82h48djs9d2",
+            oauth_token="kkk9d7dh3k39sjv7",
+            oauth_signature_method="HMAC-SHA1",
+            oauth_timestamp="137131201",
+            oauth_nonce="7d8f3e4a",
+            oauth_signature="bYT5CMsGcbgUdFHObYMEfcx6bsw%3D"
+
+        c2&a3=2+q
+
+    is represented by the following signature base string (line breaks
+    are for display purposes only)::
+
+        POST&http%3A%2F%2Fexample.com%2Frequest&a2%3Dr%2520b%26a3%3D2%2520q
+        %26a3%3Da%26b5%3D%253D%25253D%26c%2540%3D%26c2%3D%26oauth_consumer_
+        key%3D9djdj82h48djs9d2%26oauth_nonce%3D7d8f3e4a%26oauth_signature_m
+        ethod%3DHMAC-SHA1%26oauth_timestamp%3D137131201%26oauth_token%3Dkkk
+        9d7dh3k39sjv7
+
+    .. _`section 3.4.1.1`: http://tools.ietf.org/html/rfc5849#section-3.4.1.1
+    """
+
+    # The signature base string is constructed by concatenating together,
+    # in order, the following HTTP request elements:
+
+    # 1.  The HTTP request method in uppercase.  For example: "HEAD",
+    #     "GET", "POST", etc.  If the request uses a custom HTTP method, it
+    #     MUST be encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    base_string = utils.escape(http_method.upper())
+
+    # 2.  An "&" character (ASCII code 38).
+    base_string += u'&'
+
+    # 3.  The base string URI from `Section 3.4.1.2`_, after being encoded
+    #     (`Section 3.6`_).
+    #
+    # .. _`Section 3.4.1.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.2
+    # .. _`Section 3.4.6`: http://tools.ietf.org/html/rfc5849#section-3.4.6
+    base_string += utils.escape(base_string_uri)
+
+    # 4.  An "&" character (ASCII code 38).
+    base_string += u'&'
+
+    # 5.  The request parameters as normalized in `Section 3.4.1.3.2`_, after
+    #     being encoded (`Section 3.6`).
+    #
+    # .. _`Section 3.4.1.3.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2
+    # .. _`Section 3.4.6`: http://tools.ietf.org/html/rfc5849#section-3.4.6
+    base_string += utils.escape(normalized_encoded_request_parameters)
+
+    return base_string
+
+
+def normalize_base_string_uri(uri):
+    """**Base String URI**
+    Per `section 3.4.1.2`_ of the spec.
+
+    For example, the HTTP request::
+
+        GET /r%20v/X?id=123 HTTP/1.1
+        Host: EXAMPLE.COM:80
+
+    is represented by the base string URI: "http://example.com/r%20v/X".
+
+    In another example, the HTTPS request::
+
+        GET /?q=1 HTTP/1.1
+        Host: www.example.net:8080
+
+    is represented by the base string URI: "https://www.example.net:8080/".
+
+    .. _`section 3.4.1.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.2
+    """
+    if not isinstance(uri, unicode):
+        raise ValueError('uri must be a unicode object.')
+
+    # FIXME: urlparse does not support unicode
+    scheme, netloc, path, params, query, fragment = urlparse.urlparse(uri)
+
+    # The scheme, authority, and path of the request resource URI `RFC3986`
+    # are included by constructing an "http" or "https" URI representing
+    # the request resource (without the query or fragment) as follows:
+    #
+    # .. _`RFC2616`: http://tools.ietf.org/html/rfc3986
+
+    # 1.  The scheme and host MUST be in lowercase.
+    scheme = scheme.lower()
+    netloc = netloc.lower()
+
+    # 2.  The host and port values MUST match the content of the HTTP
+    #     request "Host" header field.
+    # TODO: enforce this constraint
+
+    # 3.  The port MUST be included if it is not the default port for the
+    #     scheme, and MUST be excluded if it is the default.  Specifically,
+    #     the port MUST be excluded when making an HTTP request `RFC2616`_
+    #     to port 80 or when making an HTTPS request `RFC2818`_ to port 443.
+    #     All other non-default port numbers MUST be included.
+    #
+    # .. _`RFC2616`: http://tools.ietf.org/html/rfc2616
+    # .. _`RFC2818`: http://tools.ietf.org/html/rfc2818
+    default_ports = (
+        (u'http', u'80'),
+        (u'https', u'443'),
+    )
+    if u':' in netloc:
+        host, port = netloc.split(u':', 1)
+        if (scheme, port) in default_ports:
+            netloc = host
+
+    return urlparse.urlunparse((scheme, netloc, path, u'', u'', u''))
+
+
+# ** Request Parameters **
+#
+#    Per `section 3.4.1.3`_ of the spec.
+#
+#    In order to guarantee a consistent and reproducible representation of
+#    the request parameters, the parameters are collected and decoded to
+#    their original decoded form.  They are then sorted and encoded in a
+#    particular manner that is often different from their original
+#    encoding scheme, and concatenated into a single string.
+#
+#    .. _`section 3.4.1.3`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3
+
+def collect_parameters(uri_query='', body=[], headers=None,
+        exclude_oauth_signature=True):
+    """**Parameter Sources**
+
+    Parameters starting with `oauth_` will be unescaped.
+
+    Body parameters must be supplied as a dict, a list of 2-tuples, or a
+    formencoded query string.
+
+    Headers must be supplied as a dict.
+
+    Per `section 3.4.1.3.1`_ of the spec.
+
+    For example, the HTTP request::
+
+        POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
+        Host: example.com
+        Content-Type: application/x-www-form-urlencoded
+        Authorization: OAuth realm="Example",
+            oauth_consumer_key="9djdj82h48djs9d2",
+            oauth_token="kkk9d7dh3k39sjv7",
+            oauth_signature_method="HMAC-SHA1",
+            oauth_timestamp="137131201",
+            oauth_nonce="7d8f3e4a",
+            oauth_signature="djosJKDKJSD8743243%2Fjdk33klY%3D"
+
+        c2&a3=2+q
+
+    contains the following (fully decoded) parameters used in the
+    signature base sting::
+
+        +------------------------+------------------+
+        |          Name          |       Value      |
+        +------------------------+------------------+
+        |           b5           |       =%3D       |
+        |           a3           |         a        |
+        |           c@           |                  |
+        |           a2           |        r b       |
+        |   oauth_consumer_key   | 9djdj82h48djs9d2 |
+        |       oauth_token      | kkk9d7dh3k39sjv7 |
+        | oauth_signature_method |     HMAC-SHA1    |
+        |     oauth_timestamp    |     137131201    |
+        |       oauth_nonce      |     7d8f3e4a     |
+        |           c2           |                  |
+        |           a3           |        2 q       |
+        +------------------------+------------------+
+
+    Note that the value of "b5" is "=%3D" and not "==".  Both "c@" and
+    "c2" have empty values.  While the encoding rules specified in this
+    specification for the purpose of constructing the signature base
+    string exclude the use of a "+" character (ASCII code 43) to
+    represent an encoded space character (ASCII code 32), this practice
+    is widely used in "application/x-www-form-urlencoded" encoded values,
+    and MUST be properly decoded, as demonstrated by one of the "a3"
+    parameter instances (the "a3" parameter is used twice in this
+    request).
+
+    .. _`section 3.4.1.3.1`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
+    """
+    headers = headers or {}
+    params = []
+
+    # The parameters from the following sources are collected into a single
+    # list of name/value pairs:
+
+    # *  The query component of the HTTP request URI as defined by
+    #    `RFC3986, Section 3.4`_.  The query component is parsed into a list
+    #    of name/value pairs by treating it as an
+    #    "application/x-www-form-urlencoded" string, separating the names
+    #    and values and decoding them as defined by
+    #    `W3C.REC-html40-19980424`_, Section 17.13.4.
+    #
+    # .. _`RFC3986, Section 3.4`: http://tools.ietf.org/html/rfc3986#section-3.4
+    # .. _`W3C.REC-html40-19980424`: http://tools.ietf.org/html/rfc5849#ref-W3C.REC-html40-19980424
+    if uri_query:
+        params.extend(urlparse.parse_qsl(uri_query, keep_blank_values=True))
+
+    # *  The OAuth HTTP "Authorization" header field (`Section 3.5.1`_) if
+    #    present.  The header's content is parsed into a list of name/value
+    #    pairs excluding the "realm" parameter if present.  The parameter
+    #    values are decoded as defined by `Section 3.5.1`_.
+    #
+    # .. _`Section 3.5.1`: http://tools.ietf.org/html/rfc5849#section-3.5.1
+    if headers:
+        headers_lower = dict((k.lower(), v) for k, v in headers.items())
+        authorization_header = headers_lower.get(u'authorization')
+        if authorization_header is not None:
+            params.extend([i for i in utils.parse_authorization_header(
+                authorization_header) if i[0] != u'realm'])
+
+    # *  The HTTP request entity-body, but only if all of the following
+    #    conditions are met:
+    #     *  The entity-body is single-part.
+    #
+    #     *  The entity-body follows the encoding requirements of the
+    #        "application/x-www-form-urlencoded" content-type as defined by
+    #        `W3C.REC-html40-19980424`_.
+
+    #     *  The HTTP request entity-header includes the "Content-Type"
+    #        header field set to "application/x-www-form-urlencoded".
+    #
+    # .._`W3C.REC-html40-19980424`: http://tools.ietf.org/html/rfc5849#ref-W3C.REC-html40-19980424
+
+    # TODO: enforce header param inclusion conditions
+    bodyparams = extract_params(body) or []
+    params.extend(bodyparams)
+
+    # ensure all oauth params are unescaped
+    unescaped_params = []
+    for k, v in params:
+        if k.startswith(u'oauth_'):
+            v = utils.unescape(v)
+        unescaped_params.append((k, v))
+
+    # The "oauth_signature" parameter MUST be excluded from the signature
+    # base string if present.
+    if exclude_oauth_signature:
+        unescaped_params = filter(lambda i: i[0] != u'oauth_signature',
+            unescaped_params)
+
+    return unescaped_params
+
+
+def normalize_parameters(params):
+    """**Parameters Normalization**
+    Per `section 3.4.1.3.2`_ of the spec.
+
+    For example, the list of parameters from the previous section would
+    be normalized as follows:
+
+    Encoded::
+
+    +------------------------+------------------+
+    |          Name          |       Value      |
+    +------------------------+------------------+
+    |           b5           |     %3D%253D     |
+    |           a3           |         a        |
+    |          c%40          |                  |
+    |           a2           |       r%20b      |
+    |   oauth_consumer_key   | 9djdj82h48djs9d2 |
+    |       oauth_token      | kkk9d7dh3k39sjv7 |
+    | oauth_signature_method |     HMAC-SHA1    |
+    |     oauth_timestamp    |     137131201    |
+    |       oauth_nonce      |     7d8f3e4a     |
+    |           c2           |                  |
+    |           a3           |       2%20q      |
+    +------------------------+------------------+
+
+    Sorted::
+
+    +------------------------+------------------+
+    |          Name          |       Value      |
+    +------------------------+------------------+
+    |           a2           |       r%20b      |
+    |           a3           |       2%20q      |
+    |           a3           |         a        |
+    |           b5           |     %3D%253D     |
+    |          c%40          |                  |
+    |           c2           |                  |
+    |   oauth_consumer_key   | 9djdj82h48djs9d2 |
+    |       oauth_nonce      |     7d8f3e4a     |
+    | oauth_signature_method |     HMAC-SHA1    |
+    |     oauth_timestamp    |     137131201    |
+    |       oauth_token      | kkk9d7dh3k39sjv7 |
+    +------------------------+------------------+
+
+    Concatenated Pairs::
+
+    +-------------------------------------+
+    |              Name=Value             |
+    +-------------------------------------+
+    |               a2=r%20b              |
+    |               a3=2%20q              |
+    |                 a3=a                |
+    |             b5=%3D%253D             |
+    |                c%40=                |
+    |                 c2=                 |
+    | oauth_consumer_key=9djdj82h48djs9d2 |
+    |         oauth_nonce=7d8f3e4a        |
+    |   oauth_signature_method=HMAC-SHA1  |
+    |      oauth_timestamp=137131201      |
+    |     oauth_token=kkk9d7dh3k39sjv7    |
+    +-------------------------------------+
+
+    and concatenated together into a single string (line breaks are for
+    display purposes only)::
+
+        a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=&oauth_consumer_key=9dj
+        dj82h48djs9d2&oauth_nonce=7d8f3e4a&oauth_signature_method=HMAC-SHA1
+        &oauth_timestamp=137131201&oauth_token=kkk9d7dh3k39sjv7
+
+    .. _`section 3.4.1.3.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2
+    """
+
+    # The parameters collected in `Section 3.4.1.3`_ are normalized into a
+    # single string as follows:
+    #
+    # .. _`Section 3.4.1.3`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3
+
+    # 1.  First, the name and value of each parameter are encoded
+    #     (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    key_values = [(utils.escape(k), utils.escape(v)) for k, v in params]
+
+    # 2.  The parameters are sorted by name, using ascending byte value
+    #     ordering.  If two or more parameters share the same name, they
+    #     are sorted by their value.
+    key_values.sort()
+
+    # 3.  The name of each parameter is concatenated to its corresponding
+    #     value using an "=" character (ASCII code 61) as a separator, even
+    #     if the value is empty.
+    parameter_parts = [u'{0}={1}'.format(k, v) for k, v in key_values]
+
+    # 4.  The sorted name/value pairs are concatenated together into a
+    #     single string by using an "&" character (ASCII code 38) as
+    #     separator.
+    return u'&'.join(parameter_parts)
+
+
+def sign_hmac_sha1(base_string, client_secret, resource_owner_secret):
+    """**HMAC-SHA1**
+
+    The "HMAC-SHA1" signature method uses the HMAC-SHA1 signature
+    algorithm as defined in `RFC2104`_::
+
+        digest = HMAC-SHA1 (key, text)
+
+    Per `section 3.4.2`_ of the spec.
+
+    .. _`RFC2104`: http://tools.ietf.org/html/rfc2104
+    .. _`section 3.4.2`: http://tools.ietf.org/html/rfc5849#section-3.4.2
+    """
+
+    # The HMAC-SHA1 function variables are used in following way:
+
+    # text is set to the value of the signature base string from
+    # `Section 3.4.1.1`_.
+    #
+    # .. _`Section 3.4.1.1`: http://tools.ietf.org/html/rfc5849#section-3.4.1.1
+    text = base_string
+
+    # key is set to the concatenated values of:
+    # 1.  The client shared-secret, after being encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    key = utils.escape(client_secret or u'')
+
+    # 2.  An "&" character (ASCII code 38), which MUST be included
+    #     even when either secret is empty.
+    key += u'&'
+
+    # 3.  The token shared-secret, after being encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    key += utils.escape(resource_owner_secret or u'')
+
+    # FIXME: HMAC does not support unicode!
+    key_utf8 = key.encode('utf-8')
+    text_utf8 = text.encode('utf-8')
+    signature = hmac.new(key_utf8, text_utf8, hashlib.sha1)
+
+    # digest  is used to set the value of the "oauth_signature" protocol
+    #         parameter, after the result octet string is base64-encoded
+    #         per `RFC2045, Section 6.8`.
+    #
+    # .. _`RFC2045, Section 6.8`: http://tools.ietf.org/html/rfc2045#section-6.8
+    return binascii.b2a_base64(signature.digest())[:-1].decode('utf-8')
+
+
+def sign_rsa_sha1(base_string, rsa_private_key):
+    """**RSA-SHA1**
+
+    Per `section 3.4.3`_ of the spec.
+
+    The "RSA-SHA1" signature method uses the RSASSA-PKCS1-v1_5 signature
+    algorithm as defined in `RFC3447, Section 8.2`_ (also known as
+    PKCS#1), using SHA-1 as the hash function for EMSA-PKCS1-v1_5.  To
+    use this method, the client MUST have established client credentials
+    with the server that included its RSA public key (in a manner that is
+    beyond the scope of this specification).
+
+    NOTE: this method requires the python-rsa library.
+
+    .. _`section 3.4.3`: http://tools.ietf.org/html/rfc5849#section-3.4.3
+    .. _`RFC3447, Section 8.2`: http://tools.ietf.org/html/rfc3447#section-8.2
+
+    """
+    # TODO: finish RSA documentation
+    from Crypto.PublicKey import RSA
+    from Crypto.Signature import PKCS1_v1_5
+    from Crypto.Hash import SHA
+    key = RSA.importKey(rsa_private_key)
+    h = SHA.new(base_string)
+    p = PKCS1_v1_5.new(key)
+    return binascii.b2a_base64(p.sign(h))[:-1].decode('utf-8')
+
+
+def sign_plaintext(client_secret, resource_owner_secret):
+    """Sign a request using plaintext.
+
+    Per `section 3.4.4`_ of the spec.
+
+    The "PLAINTEXT" method does not employ a signature algorithm.  It
+    MUST be used with a transport-layer mechanism such as TLS or SSL (or
+    sent over a secure channel with equivalent protections).  It does not
+    utilize the signature base string or the "oauth_timestamp" and
+    "oauth_nonce" parameters.
+
+    .. _`section 3.4.4`: http://tools.ietf.org/html/rfc5849#section-3.4.4
+
+    """
+
+    # The "oauth_signature" protocol parameter is set to the concatenated
+    # value of:
+
+    # 1.  The client shared-secret, after being encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    signature = utils.escape(client_secret or u'')
+
+    # 2.  An "&" character (ASCII code 38), which MUST be included even
+    #     when either secret is empty.
+    signature += u'&'
+
+    # 3.  The token shared-secret, after being encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    signature += utils.escape(resource_owner_secret or u'')
+
+    return signature
+
+
+def verify_hmac_sha1(request, client_secret=None, 
+    resource_owner_secret=None):
+    """Verify a HMAC-SHA1 signature.
+
+    Per `section 3.4`_ of the spec.
+
+    .. _`section 3.4`: http://tools.ietf.org/html/rfc5849#section-3.4
+    """
+    norm_params = normalize_parameters(request.params)
+    uri = normalize_base_string_uri(request.uri)
+    base_string = construct_base_string(request.http_method, uri, norm_params)
+    signature = sign_hmac_sha1(base_string, client_secret,
+        resource_owner_secret)
+    return safe_string_equals(signature, request.signature)
+
+
+def verify_rsa_sha1(request, rsa_public_key):
+    """Verify a RSASSA-PKCS #1 v1.5 base64 encoded signature.
+
+    Per `section 3.4.3`_ of the spec.
+
+    Note this method requires the PyCrypto library.
+
+    .. _`section 3.4.3`: http://tools.ietf.org/html/rfc5849#section-3.4.3
+
+    """
+    from Crypto.PublicKey import RSA
+    from Crypto.Signature import PKCS1_v1_5
+    from Crypto.Hash import SHA
+    key = RSA.importKey(rsa_public_key)
+    norm_params = normalize_parameters(request.params)
+    uri = normalize_base_string_uri(request.uri)
+    message = construct_base_string(request.http_method, uri, norm_params)
+    h = SHA.new(message)
+    p = PKCS1_v1_5.new(key)
+    sig = binascii.a2b_base64(request.signature)
+    return p.verify(h, sig)
+
+
+def verify_plaintext(request, client_secret=None, resource_owner_secret=None):
+    """Verify a PLAINTEXT signature.
+
+    Per `section 3.4`_ of the spec.
+
+    .. _`section 3.4`: http://tools.ietf.org/html/rfc5849#section-3.4
+    """
+    signature = sign_plaintext(client_secret, resource_owner_secret)
+    return safe_string_equals(signature, request.signature)
diff --git a/lib/requests/packages/oauthlib/oauth1/rfc5849/utils.py b/lib/requests/packages/oauthlib/oauth1/rfc5849/utils.py
new file mode 100755
index 0000000..8fb0e77
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth1/rfc5849/utils.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+
+"""
+oauthlib.utils
+~~~~~~~~~~~~~~
+
+This module contains utility methods used by various parts of the OAuth
+spec.
+"""
+
+import string
+import urllib2
+
+from oauthlib.common import quote, unquote
+
+UNICODE_ASCII_CHARACTER_SET = (string.ascii_letters.decode('ascii') +
+    string.digits.decode('ascii'))
+
+
+def filter_params(target):
+    """Decorator which filters params to remove non-oauth_* parameters
+
+    Assumes the decorated method takes a params dict or list of tuples as its
+    first argument.
+    """
+    def wrapper(params, *args, **kwargs):
+        params = filter_oauth_params(params)
+        return target(params, *args, **kwargs)
+
+    wrapper.__doc__ = target.__doc__
+    return wrapper
+
+
+def filter_oauth_params(params):
+    """Removes all non oauth parameters from a dict or a list of params."""
+    is_oauth = lambda kv: kv[0].startswith(u"oauth_")
+    if isinstance(params, dict):
+        return filter(is_oauth, params.items())
+    else:
+        return filter(is_oauth, params)
+
+
+def escape(u):
+    """Escape a unicode string in an OAuth-compatible fashion.
+
+    Per `section 3.6`_ of the spec.
+
+    .. _`section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+
+    """
+    if not isinstance(u, unicode):
+        raise ValueError('Only unicode objects are escapable.')
+    # Letters, digits, and the characters '_.-' are already treated as safe
+    # by urllib.quote(). We need to add '~' to fully support rfc5849.
+    return quote(u, safe='~')
+
+
+def unescape(u):
+    if not isinstance(u, unicode):
+        raise ValueError('Only unicode objects are unescapable.')
+    return unquote(u)
+
+
+def urlencode(query):
+    """Encode a sequence of two-element tuples or dictionary into a URL query string.
+
+    Operates using an OAuth-safe escape() method, in contrast to urllib.urlencode.
+    """
+    # Convert dictionaries to list of tuples
+    if isinstance(query, dict):
+        query = query.items()
+    return u"&".join([u'='.join([escape(k), escape(v)]) for k, v in query])
+
+
+def parse_keqv_list(l):
+    """A unicode-safe version of urllib2.parse_keqv_list"""
+    encoded_list = [u.encode('utf-8') for u in l]
+    encoded_parsed = urllib2.parse_keqv_list(encoded_list)
+    return dict((k.decode('utf-8'),
+        v.decode('utf-8')) for k, v in encoded_parsed.items())
+
+
+def parse_http_list(u):
+    """A unicode-safe version of urllib2.parse_http_list"""
+    encoded_str = u.encode('utf-8')
+    encoded_list = urllib2.parse_http_list(encoded_str)
+    return [s.decode('utf-8') for s in encoded_list]
+
+
+def parse_authorization_header(authorization_header):
+    """Parse an OAuth authorization header into a list of 2-tuples"""
+    auth_scheme = u'OAuth '
+    if authorization_header.startswith(auth_scheme):
+        authorization_header = authorization_header.replace(auth_scheme, u'', 1)
+    items = parse_http_list(authorization_header)
+    try:
+        return parse_keqv_list(items).items()
+    except ValueError:
+        raise ValueError('Malformed authorization header')
diff --git a/lib/requests/packages/oauthlib/oauth2/__init__.py b/lib/requests/packages/oauthlib/oauth2/__init__.py
new file mode 100755
index 0000000..0e8933c
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth2/__init__.py
@@ -0,0 +1,13 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+"""
+oauthlib.oauth2
+~~~~~~~~~~~~~~
+
+This module is a wrapper for the most recent implementation of OAuth 2.0 Client
+and Server classes.
+"""
+
+from .draft25 import Client, Server
+
diff --git a/lib/requests/packages/oauthlib/oauth2/draft25/__init__.py b/lib/requests/packages/oauthlib/oauth2/draft25/__init__.py
new file mode 100755
index 0000000..7c90573
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth2/draft25/__init__.py
@@ -0,0 +1,497 @@
+"""
+oauthlib.oauth2.draft_25
+~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for signing and checking OAuth 2.0 draft 25 requests.
+"""
+from tokens import prepare_bearer_uri, prepare_bearer_headers
+from tokens import prepare_bearer_body, prepare_mac_header
+from parameters import prepare_grant_uri, prepare_token_request
+from parameters import parse_authorization_code_response
+from parameters import parse_implicit_response, parse_token_response
+
+
+AUTH_HEADER = u'auth_header'
+URI_QUERY = u'query'
+BODY = u'body'
+
+
+class Client(object):
+
+    def __init__(self, client_id,
+            default_redirect_uri=None,
+            token_type=None,
+            access_token=None,
+            refresh_token=None):
+        """Initialize a client with commonly used attributes."""
+
+        self.client_id = client_id
+        self.default_redirect_uri = default_redirect_uri
+        self.token_type = token_type
+        self.access_token = access_token
+        self.refresh_token = refresh_token
+        self.token_types = {
+            u'bearer': self._add_bearer_token,
+            u'mac': self._add_mac_token
+        }
+
+    def add_token(self, uri, http_method=u'GET', body=None, headers=None,
+            token_placement=AUTH_HEADER):
+        """Add token to the request uri, body or authorization header.
+
+        The access token type provides the client with the information
+        required to successfully utilize the access token to make a protected
+        resource request (along with type-specific attributes).  The client
+        MUST NOT use an access token if it does not understand the token
+        type.
+
+        For example, the "bearer" token type defined in
+        [I-D.ietf-oauth-v2-bearer] is utilized by simply including the access
+        token string in the request:
+
+        GET /resource/1 HTTP/1.1
+        Host: example.com
+        Authorization: Bearer mF_9.B5f-4.1JqM
+
+        while the "mac" token type defined in [I-D.ietf-oauth-v2-http-mac] is
+        utilized by issuing a MAC key together with the access token which is
+        used to sign certain components of the HTTP requests:
+
+        GET /resource/1 HTTP/1.1
+        Host: example.com
+        Authorization: MAC id="h480djs93hd8",
+                            nonce="274312:dj83hs9s",
+                            mac="kDZvddkndxvhGRXZhvuDjEWhGeE="
+
+        .. _`I-D.ietf-oauth-v2-bearer`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#ref-I-D.ietf-oauth-v2-bearer
+        .. _`I-D.ietf-oauth-v2-http-mac`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#ref-I-D.ietf-oauth-v2-http-mac
+        """
+        return self.token_types[self.token_type](uri, http_method, body,
+                    headers, token_placement)
+
+    def prepare_refresh_body(self, body=u'', refresh_token=None, scope=None):
+        """Prepare an access token request, using a refresh token.
+
+        If the authorization server issued a refresh token to the client, the
+        client makes a refresh request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format in the HTTP request entity-body:
+
+        grant_type
+                REQUIRED.  Value MUST be set to "refresh_token".
+        refresh_token
+                REQUIRED.  The refresh token issued to the client.
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                Section 3.3.  The requested scope MUST NOT include any scope
+                not originally granted by the resource owner, and if omitted is
+                treated as equal to the scope originally granted by the
+                resource owner.
+        """
+        refresh_token = refresh_token or self.refresh_token
+        return prepare_token_request(u'refresh_token', body=body, scope=scope,
+                refresh_token=refresh_token)
+
+    def _add_bearer_token(self, uri, http_method=u'GET', body=None,
+            headers=None, token_placement=AUTH_HEADER):
+        """Add a bearer token to the request uri, body or authorization header."""
+        if token_placement == AUTH_HEADER:
+            headers = prepare_bearer_headers(self.token, headers)
+
+        if token_placement == URI_QUERY:
+            uri = prepare_bearer_uri(self.token, uri)
+
+        if token_placement == BODY:
+            body = prepare_bearer_body(self.token, body)
+
+        return uri, headers, body
+
+    def _add_mac_token(self, uri, http_method=u'GET', body=None,
+            headers=None, token_placement=AUTH_HEADER):
+        """Add a MAC token to the request authorization header."""
+        headers = prepare_mac_header(self.token, uri, self.key, http_method,
+                        headers=headers, body=body, ext=self.ext,
+                        hash_algorithm=self.hash_algorithm)
+        return uri, headers, body
+
+    def _populate_attributes(self, response):
+        """Add commonly used values such as access_token to self."""
+
+        if u'access_token' in response:
+            self.access_token = response.get(u'access_token')
+
+        if u'refresh_token' in response:
+            self.refresh_token = response.get(u'refresh_token')
+
+        if u'token_type' in response:
+            self.token_type = response.get(u'token_type')
+
+        if u'expires_in' in response:
+            self.expires_in = response.get(u'expires_in')
+
+        if u'code' in response:
+            self.code = response.get(u'code')
+
+    def prepare_request_uri(self, *args, **kwargs):
+        """Abstract method used to create request URIs."""
+        raise NotImplementedError("Must be implemented by inheriting classes.")
+
+    def prepare_request_body(self, *args, **kwargs):
+        """Abstract method used to create request bodies."""
+        raise NotImplementedError("Must be implemented by inheriting classes.")
+
+    def parse_request_uri_response(self, *args, **kwargs):
+        """Abstract method used to parse redirection responses."""
+
+    def parse_request_body_response(self, *args, **kwargs):
+        """Abstract method used to parse JSON responses."""
+
+
+class WebApplicationClient(Client):
+    """A client utilizing the authorization code grant workflow.
+
+    A web application is a confidential client running on a web
+    server.  Resource owners access the client via an HTML user
+    interface rendered in a user-agent on the device used by the
+    resource owner.  The client credentials as well as any access
+    token issued to the client are stored on the web server and are
+    not exposed to or accessible by the resource owner.
+
+    The authorization code grant type is used to obtain both access
+    tokens and refresh tokens and is optimized for confidential clients.
+    As a redirection-based flow, the client must be capable of
+    interacting with the resource owner's user-agent (typically a web
+    browser) and capable of receiving incoming requests (via redirection)
+    from the authorization server.
+    """
+
+    def prepare_request_uri(self, uri, redirect_uri=None, scope=None,
+            state=None, **kwargs):
+        """Prepare the authorization code request URI
+
+        The client constructs the request URI by adding the following
+        parameters to the query component of the authorization endpoint URI
+        using the "application/x-www-form-urlencoded" format as defined by
+        [`W3C.REC-html401-19991224`_]:
+
+        response_type
+                REQUIRED.  Value MUST be set to "code".
+        client_id
+                REQUIRED.  The client identifier as described in `Section 2.2`_.
+        redirect_uri
+                OPTIONAL.  As described in `Section 3.1.2`_.
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                `Section 3.3`_.
+        state
+                RECOMMENDED.  An opaque value used by the client to maintain
+                state between the request and callback.  The authorization
+                server includes this value when redirecting the user-agent back
+                to the client.  The parameter SHOULD be used for preventing
+                cross-site request forgery as described in `Section 10.12`_.
+
+        .. _`W3C.REC-html401-19991224`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#ref-W3C.REC-html401-19991224
+        .. _`Section 2.2`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-2.2
+        .. _`Section 3.1.2`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-3.1.2
+        .. _`Section 3.3`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-3.3
+        .. _`Section 10.12`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-10.12
+        """
+        redirect_uri = redirect_uri or self.default_redirect_uri
+        return prepare_grant_uri(uri, self.client_id, u'code',
+                redirect_uri=redirect_uri, scope=scope, state=state, **kwargs)
+
+    def prepare_request_body(self, code, body=u'', redirect_uri=None, **kwargs):
+        """Prepare the access token request body.
+
+        The client makes a request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format in the HTTP request entity-body:
+
+        grant_type
+                REQUIRED.  Value MUST be set to "authorization_code".
+        code
+                REQUIRED.  The authorization code received from the
+                authorization server.
+        redirect_uri
+                REQUIRED, if the "redirect_uri" parameter was included in the
+                authorization request as described in Section 4.1.1, and their
+                values MUST be identical.
+
+        .. _`Section 4.1.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-4.1.1
+        """
+        redirect_uri = redirect_uri or self.default_redirect_uri
+        code = code or self.code
+        return prepare_token_request(u'authorization_code', code=code, body=body,
+                                         redirect_uri=redirect_uri, **kwargs)
+
+    def parse_request_uri_response(self, uri, state=None):
+        """Parse the URI query for code and state.
+
+        If the resource owner grants the access request, the authorization
+        server issues an authorization code and delivers it to the client by
+        adding the following parameters to the query component of the
+        redirection URI using the "application/x-www-form-urlencoded" format:
+
+        code
+                REQUIRED.  The authorization code generated by the
+                authorization server.  The authorization code MUST expire
+                shortly after it is issued to mitigate the risk of leaks.  A
+                maximum authorization code lifetime of 10 minutes is
+                RECOMMENDED.  The client MUST NOT use the authorization code
+                more than once.  If an authorization code is used more than
+                once, the authorization server MUST deny the request and SHOULD
+                revoke (when possible) all tokens previously issued based on
+                that authorization code.  The authorization code is bound to
+                the client identifier and redirection URI.
+        state
+                REQUIRED if the "state" parameter was present in the client
+                authorization request.  The exact value received from the
+                client.
+        """
+        response = parse_authorization_code_response(uri, state=state)
+        self._populate_attributes(response)
+        return response
+
+    def parse_request_body_response(self, body, scope=None):
+        """Parse the JSON response body.
+
+        If the access token request is valid and authorized, the
+        authorization server issues an access token and optional refresh
+        token as described in `Section 5.1`_.  If the request client
+        authentication failed or is invalid, the authorization server returns
+        an error response as described in `Section 5.2`_.
+
+        .. `Section 5.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-5.1
+        .. `Section 5.2`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-5.2
+        """
+        response = parse_token_response(body, scope=scope)
+        self._populate_attributes(response)
+        return response
+
+
+class UserAgentClient(Client):
+    """A public client utilizing the implicit code grant workflow.
+
+    A user-agent-based application is a public client in which the
+    client code is downloaded from a web server and executes within a
+    user-agent (e.g. web browser) on the device used by the resource
+    owner.  Protocol data and credentials are easily accessible (and
+    often visible) to the resource owner.  Since such applications
+    reside within the user-agent, they can make seamless use of the
+    user-agent capabilities when requesting authorization.
+
+    The implicit grant type is used to obtain access tokens (it does not
+    support the issuance of refresh tokens) and is optimized for public
+    clients known to operate a particular redirection URI.  These clients
+    are typically implemented in a browser using a scripting language
+    such as JavaScript.
+
+    As a redirection-based flow, the client must be capable of
+    interacting with the resource owner's user-agent (typically a web
+    browser) and capable of receiving incoming requests (via redirection)
+    from the authorization server.
+
+    Unlike the authorization code grant type in which the client makes
+    separate requests for authorization and access token, the client
+    receives the access token as the result of the authorization request.
+
+    The implicit grant type does not include client authentication, and
+    relies on the presence of the resource owner and the registration of
+    the redirection URI.  Because the access token is encoded into the
+    redirection URI, it may be exposed to the resource owner and other
+    applications residing on the same device.
+    """
+
+    def prepare_request_uri(self, uri, redirect_uri=None, scope=None,
+            state=None, **kwargs):
+        """Prepare the implicit grant request URI.
+
+        The client constructs the request URI by adding the following
+        parameters to the query component of the authorization endpoint URI
+        using the "application/x-www-form-urlencoded" format:
+
+        response_type
+                REQUIRED.  Value MUST be set to "token".
+        client_id
+                REQUIRED.  The client identifier as described in Section 2.2.
+        redirect_uri
+                OPTIONAL.  As described in Section 3.1.2.
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                Section 3.3.
+        state
+                RECOMMENDED.  An opaque value used by the client to maintain
+                state between the request and callback.  The authorization
+                server includes this value when redirecting the user-agent back
+                to the client.  The parameter SHOULD be used for preventing
+                cross-site request forgery as described in Section 10.12.
+        """
+        redirect_uri = redirect_uri or self.default_redirect_uri
+        return prepare_grant_uri(uri, self.client_id, u'token',
+                redirect_uri=redirect_uri, state=state, scope=scope, **kwargs)
+
+    def parse_request_uri_response(self, uri, state=None, scope=None):
+        """Parse the response URI fragment.
+
+        If the resource owner grants the access request, the authorization
+        server issues an access token and delivers it to the client by adding
+        the following parameters to the fragment component of the redirection
+        URI using the "application/x-www-form-urlencoded" format:
+
+        access_token
+                REQUIRED.  The access token issued by the authorization server.
+        token_type
+                REQUIRED.  The type of the token issued as described in
+                `Section 7.1`_.  Value is case insensitive.
+        expires_in
+                RECOMMENDED.  The lifetime in seconds of the access token.  For
+                example, the value "3600" denotes that the access token will
+                expire in one hour from the time the response was generated.
+                If omitted, the authorization server SHOULD provide the
+                expiration time via other means or document the default value.
+        scope
+                OPTIONAL, if identical to the scope requested by the client,
+                otherwise REQUIRED.  The scope of the access token as described
+                by `Section 3.3`_.
+        state
+                REQUIRED if the "state" parameter was present in the client
+                authorization request.  The exact value received from the
+                client.
+
+        .. _`Section 7.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-7.1
+        .. _`Section 3.3`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-3.3
+        """
+        response = parse_implicit_response(uri, state=state, scope=scope)
+        self._populate_attributes(response)
+        return response
+
+
+class NativeApplicationClient(Client):
+    """A public client utilizing the client credentials grant workflow.
+
+    A native application is a public client installed and executed on
+    the device used by the resource owner.  Protocol data and
+    credentials are accessible to the resource owner.  It is assumed
+    that any client authentication credentials included in the
+    application can be extracted.  On the other hand, dynamically
+    issued credentials such as access tokens or refresh tokens can
+    receive an acceptable level of protection.  At a minimum, these
+    credentials are protected from hostile servers with which the
+    application may interact with.  On some platforms these
+    credentials might be protected from other applications residing on
+    the same device.
+
+    The client can request an access token using only its client
+    credentials (or other supported means of authentication) when the
+    client is requesting access to the protected resources under its
+    control, or those of another resource owner which has been previously
+    arranged with the authorization server (the method of which is beyond
+    the scope of this specification).
+
+    The client credentials grant type MUST only be used by confidential
+    clients.
+
+    Since the client authentication is used as the authorization grant,
+    no additional authorization request is needed.
+    """
+
+    def prepare_request_body(self, body=u'', scope=None, **kwargs):
+        """Add the client credentials to the request body.
+
+        The client makes a request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format in the HTTP request entity-body:
+
+        grant_type
+                REQUIRED.  Value MUST be set to "client_credentials".
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                `Section 3.3`_.
+
+        .. _`Section 3.3`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-3.3
+        """
+        return prepare_token_request(u'client_credentials', body=body,
+                                     scope=scope, **kwargs)
+
+    def parse_request_body_response(self, body, scope=None):
+        """Parse the JSON response body.
+
+        If the access token request is valid and authorized, the
+        authorization server issues an access token as described in
+        `Section 5.1`_.  A refresh token SHOULD NOT be included.  If the request
+        failed client authentication or is invalid, the authorization server
+        returns an error response as described in `Section 5.2`_.
+
+        .. `Section 5.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-5.1
+        .. `Section 5.2`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-5.2
+        """
+        response = parse_token_response(body, scope=scope)
+        self._populate_attributes(response)
+        return response
+
+
+class PasswordCredentialsClient(Client):
+    """A public client using the resource owner password and username directly.
+
+    The resource owner password credentials grant type is suitable in
+    cases where the resource owner has a trust relationship with the
+    client, such as the device operating system or a highly privileged
+    application.  The authorization server should take special care when
+    enabling this grant type, and only allow it when other flows are not
+    viable.
+
+    The grant type is suitable for clients capable of obtaining the
+    resource owner's credentials (username and password, typically using
+    an interactive form).  It is also used to migrate existing clients
+    using direct authentication schemes such as HTTP Basic or Digest
+    authentication to OAuth by converting the stored credentials to an
+    access token.
+
+    The method through which the client obtains the resource owner
+    credentials is beyond the scope of this specification.  The client
+    MUST discard the credentials once an access token has been obtained.
+    """
+
+    def prepare_request_body(self, username, password, body=u'', scope=None,
+            **kwargs):
+        """Add the resource owner password and username to the request body.
+
+        The client makes a request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format in the HTTP request entity-body:
+
+        grant_type
+                REQUIRED.  Value MUST be set to "password".
+        username
+                REQUIRED.  The resource owner username.
+        password
+                REQUIRED.  The resource owner password.
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                `Section 3.3`_.
+
+        .. _`Section 3.3`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-3.3
+        """
+        return prepare_token_request(u'password', body=body, username=username,
+                password=password, scope=scope, **kwargs)
+
+    def parse_request_body_response(self, body, scope=None):
+        """Parse the JSON response body.
+
+        If the access token request is valid and authorized, the
+        authorization server issues an access token and optional refresh
+        token as described in `Section 5.1`_.  If the request failed client
+        authentication or is invalid, the authorization server returns an
+        error response as described in `Section 5.2`_.
+
+        .. `Section 5.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-5.1
+        .. `Section 5.2`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-5.2
+        """
+        response = parse_token_response(body, scope=scope)
+        self._populate_attributes(response)
+        return response
+
+
+class Server(object):
+    pass
diff --git a/lib/requests/packages/oauthlib/oauth2/draft25/parameters.py b/lib/requests/packages/oauthlib/oauth2/draft25/parameters.py
new file mode 100755
index 0000000..ecc9f63
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth2/draft25/parameters.py
@@ -0,0 +1,256 @@
+"""
+oauthlib.oauth2_draft28.parameters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module contains methods related to `Section 4`_ of the OAuth 2 draft.
+
+.. _`Section 4`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-4
+"""
+
+import json
+import urlparse
+from oauthlib.common import add_params_to_uri, add_params_to_qs
+
+
+def prepare_grant_uri(uri, client_id, response_type, redirect_uri=None,
+            scope=None, state=None, **kwargs):
+    """Prepare the authorization grant request URI.
+
+    The client constructs the request URI by adding the following
+    parameters to the query component of the authorization endpoint URI
+    using the "application/x-www-form-urlencoded" format as defined by
+    [W3C.REC-html401-19991224]:
+
+    response_type
+            REQUIRED.  Value MUST be set to "code".
+    client_id
+            REQUIRED.  The client identifier as described in `Section 2.2`_.
+    redirect_uri
+            OPTIONAL.  As described in `Section 3.1.2`_.
+    scope
+            OPTIONAL.  The scope of the access request as described by
+            `Section 3.3`_.
+    state
+            RECOMMENDED.  An opaque value used by the client to maintain
+            state between the request and callback.  The authorization
+            server includes this value when redirecting the user-agent back
+            to the client.  The parameter SHOULD be used for preventing
+            cross-site request forgery as described in `Section 10.12`_.
+
+    GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
+        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
+    Host: server.example.com
+
+    .. _`W3C.REC-html401-19991224`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#ref-W3C.REC-html401-19991224
+    .. _`Section 2.2`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-2.2
+    .. _`Section 3.1.2`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-3.1.2
+    .. _`Section 3.3`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-3.3
+    .. _`section 10.12`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-10.12
+    """
+    params = [((u'response_type', response_type)),
+              ((u'client_id', client_id))]
+
+    if redirect_uri:
+        params.append((u'redirect_uri', redirect_uri))
+    if scope:
+        params.append((u'scope', scope))
+    if state:
+        params.append((u'state', state))
+
+    for k in kwargs:
+        params.append((unicode(k), kwargs[k]))
+
+    return add_params_to_uri(uri, params)
+
+
+def prepare_token_request(grant_type, body=u'', **kwargs):
+    """Prepare the access token request.
+
+    The client makes a request to the token endpoint by adding the
+    following parameters using the "application/x-www-form-urlencoded"
+    format in the HTTP request entity-body:
+
+    grant_type
+            REQUIRED.  Value MUST be set to "authorization_code".
+    code
+            REQUIRED.  The authorization code received from the
+            authorization server.
+    redirect_uri
+            REQUIRED, if the "redirect_uri" parameter was included in the
+            authorization request as described in `Section 4.1.1`_, and their
+            values MUST be identical.
+
+    grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
+    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
+
+    .. _`Section 4.1.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-4.1.1
+    """
+    params = [(u'grant_type', grant_type)]
+    for k in kwargs:
+        params.append((unicode(k), kwargs[k]))
+
+    return add_params_to_qs(body, params)
+
+
+def parse_authorization_code_response(uri, state=None):
+    """Parse authorization grant response URI into a dict.
+
+    If the resource owner grants the access request, the authorization
+    server issues an authorization code and delivers it to the client by
+    adding the following parameters to the query component of the
+    redirection URI using the "application/x-www-form-urlencoded" format:
+
+    code
+            REQUIRED.  The authorization code generated by the
+            authorization server.  The authorization code MUST expire
+            shortly after it is issued to mitigate the risk of leaks.  A
+            maximum authorization code lifetime of 10 minutes is
+            RECOMMENDED.  The client MUST NOT use the authorization code
+            more than once.  If an authorization code is used more than
+            once, the authorization server MUST deny the request and SHOULD
+            revoke (when possible) all tokens previously issued based on
+            that authorization code.  The authorization code is bound to
+            the client identifier and redirection URI.
+    state
+            REQUIRED if the "state" parameter was present in the client
+            authorization request.  The exact value received from the
+            client.
+
+    For example, the authorization server redirects the user-agent by
+    sending the following HTTP response:
+
+    HTTP/1.1 302 Found
+    Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
+            &state=xyz
+
+    """
+    query = urlparse.urlparse(uri).query
+    params = dict(urlparse.parse_qsl(query))
+
+    if not u'code' in params:
+        raise KeyError("Missing code parameter in response.")
+
+    if state and params.get(u'state', None) != state:
+        raise ValueError("Mismatching or missing state in response.")
+
+    return params
+
+
+def parse_implicit_response(uri, state=None, scope=None):
+    """Parse the implicit token response URI into a dict.
+
+    If the resource owner grants the access request, the authorization
+    server issues an access token and delivers it to the client by adding
+    the following parameters to the fragment component of the redirection
+    URI using the "application/x-www-form-urlencoded" format:
+
+    access_token
+            REQUIRED.  The access token issued by the authorization server.
+    token_type
+            REQUIRED.  The type of the token issued as described in
+            Section 7.1.  Value is case insensitive.
+    expires_in
+            RECOMMENDED.  The lifetime in seconds of the access token.  For
+            example, the value "3600" denotes that the access token will
+            expire in one hour from the time the response was generated.
+            If omitted, the authorization server SHOULD provide the
+            expiration time via other means or document the default value.
+    scope
+            OPTIONAL, if identical to the scope requested by the client,
+            otherwise REQUIRED.  The scope of the access token as described
+            by Section 3.3.
+    state
+            REQUIRED if the "state" parameter was present in the client
+            authorization request.  The exact value received from the
+            client.
+
+    HTTP/1.1 302 Found
+    Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
+            &state=xyz&token_type=example&expires_in=3600
+    """
+    fragment = urlparse.urlparse(uri).fragment
+    params = dict(urlparse.parse_qsl(fragment, keep_blank_values=True))
+    validate_token_parameters(params, scope)
+
+    if state and params.get(u'state', None) != state:
+        raise ValueError("Mismatching or missing state in params.")
+
+    return params
+
+
+def parse_token_response(body, scope=None):
+    """Parse the JSON token response body into a dict.
+
+    The authorization server issues an access token and optional refresh
+    token, and constructs the response by adding the following parameters
+    to the entity body of the HTTP response with a 200 (OK) status code:
+
+    access_token
+            REQUIRED.  The access token issued by the authorization server.
+    token_type
+            REQUIRED.  The type of the token issued as described in
+            `Section 7.1`_.  Value is case insensitive.
+    expires_in
+            RECOMMENDED.  The lifetime in seconds of the access token.  For
+            example, the value "3600" denotes that the access token will
+            expire in one hour from the time the response was generated.
+            If omitted, the authorization server SHOULD provide the
+            expiration time via other means or document the default value.
+    refresh_token
+            OPTIONAL.  The refresh token which can be used to obtain new
+            access tokens using the same authorization grant as described
+            in `Section 6`_.
+    scope
+            OPTIONAL, if identical to the scope requested by the client,
+            otherwise REQUIRED.  The scope of the access token as described
+            by `Section 3.3`_.
+
+    The parameters are included in the entity body of the HTTP response
+    using the "application/json" media type as defined by [`RFC4627`_].  The
+    parameters are serialized into a JSON structure by adding each
+    parameter at the highest structure level.  Parameter names and string
+    values are included as JSON strings.  Numerical values are included
+    as JSON numbers.  The order of parameters does not matter and can
+    vary.
+
+    For example:
+
+        HTTP/1.1 200 OK
+        Content-Type: application/json;charset=UTF-8
+        Cache-Control: no-store
+        Pragma: no-cache
+
+        {
+        "access_token":"2YotnFZFEjr1zCsicMWpAA",
+        "token_type":"example",
+        "expires_in":3600,
+        "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
+        "example_parameter":"example_value"
+        }
+
+    .. _`Section 7.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-7.1
+    .. _`Section 6`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-6
+    .. _`Section 3.3`: http://tools.ietf.org/html/draft-ietf-oauth-v2-28#section-3.3
+    .. _`RFC4627`: http://tools.ietf.org/html/rfc4627
+    """
+    params = json.loads(body)
+    validate_token_parameters(params, scope)
+    return params
+
+
+def validate_token_parameters(params, scope=None):
+    """Ensures token precence, token type, expiration and scope in params."""
+
+    if not u'access_token' in params:
+        raise KeyError("Missing access token parameter.")
+
+    if not u'token_type' in params:
+        raise KeyError("Missing token type parameter.")
+
+    # If the issued access token scope is different from the one requested by
+    # the client, the authorization server MUST include the "scope" response
+    # parameter to inform the client of the actual scope granted.
+    # http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-3.3
+    new_scope = params.get(u'scope', None)
+    if scope and new_scope and scope != new_scope:
+        raise Warning("Scope has changed to %s." % new_scope)
diff --git a/lib/requests/packages/oauthlib/oauth2/draft25/tokens.py b/lib/requests/packages/oauthlib/oauth2/draft25/tokens.py
new file mode 100755
index 0000000..74491fb
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth2/draft25/tokens.py
@@ -0,0 +1,132 @@
+from __future__ import absolute_import
+"""
+oauthlib.oauth2.draft25.tokens
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module contains methods for adding two types of access tokens to requests.
+
+- Bearer http://tools.ietf.org/html/draft-ietf-oauth-saml2-bearer-08
+- MAC http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-00
+
+"""
+from binascii import b2a_base64
+import hashlib
+import hmac
+from urlparse import urlparse
+
+from oauthlib.common import add_params_to_uri, add_params_to_qs
+from . import utils
+
+
+def prepare_mac_header(token, uri, key, http_method, nonce=None, headers=None,
+        body=None, ext=u'', hash_algorithm=u'hmac-sha-1'):
+    """Add an `MAC Access Authentication`_ signature to headers.
+
+    Unlike OAuth 1, this HMAC signature does not require inclusion of the request
+    payload/body, neither does it use a combination of client_secret and
+    token_secret but rather a mac_key provided together with the access token.
+
+    Currently two algorithms are supported, "hmac-sha-1" and "hmac-sha-256",
+    `extension algorithms`_ are not supported.
+
+    Example MAC Authorization header, linebreaks added for clarity
+
+    Authorization: MAC id="h480djs93hd8",
+                       nonce="1336363200:dj83hs9s",
+                       mac="bhCQXTVyfj5cmA9uKkPFx1zeOXM="
+
+    .. _`MAC Access Authentication`: http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01
+    .. _`extension algorithms`: http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-7.1
+
+    :param uri: Request URI.
+    :param headers: Request headers as a dictionary.
+    :param http_method: HTTP Request method.
+    :param key: MAC given provided by token endpoint.
+    :param algorithm: HMAC algorithm provided by token endpoint.
+    :return: headers dictionary with the authorization field added.
+    """
+    http_method = http_method.upper()
+    host, port = utils.host_from_uri(uri)
+
+    if hash_algorithm.lower() == u'hmac-sha-1':
+        h = hashlib.sha1
+    else:
+        h = hashlib.sha256
+
+    nonce = nonce or u'{0}:{1}'.format(utils.generate_nonce(), utils.generate_timestamp())
+    sch, net, path, par, query, fra = urlparse(uri)
+
+    if query:
+        request_uri = path + u'?' + query
+    else:
+        request_uri = path
+
+    # Hash the body/payload
+    if body is not None:
+        bodyhash = b2a_base64(h(body).digest())[:-1].decode('utf-8')
+    else:
+        bodyhash = u''
+
+    # Create the normalized base string
+    base = []
+    base.append(nonce)
+    base.append(http_method.upper())
+    base.append(request_uri)
+    base.append(host)
+    base.append(port)
+    base.append(bodyhash)
+    base.append(ext)
+    base_string = '\n'.join(base) + u'\n'
+
+    # hmac struggles with unicode strings - http://bugs.python.org/issue5285
+    if isinstance(key, unicode):
+        key = key.encode('utf-8')
+    sign = hmac.new(key, base_string, h)
+    sign = b2a_base64(sign.digest())[:-1].decode('utf-8')
+
+    header = []
+    header.append(u'MAC id="%s"' % token)
+    header.append(u'nonce="%s"' % nonce)
+    if bodyhash:
+        header.append(u'bodyhash="%s"' % bodyhash)
+    if ext:
+        header.append(u'ext="%s"' % ext)
+    header.append(u'mac="%s"' % sign)
+
+    headers = headers or {}
+    headers[u'Authorization'] = u', '.join(header)
+    return headers
+
+
+def prepare_bearer_uri(token, uri):
+    """Add a `Bearer Token`_ to the request URI.
+    Not recommended, use only if client can't use authorization header or body.
+
+    http://www.example.com/path?access_token=h480djs93hd8
+
+    .. _`Bearer Token`: http://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-18
+    """
+    return add_params_to_uri(uri, [((u'access_token', token))])
+
+
+def prepare_bearer_headers(token, headers=None):
+    """Add a `Bearer Token`_ to the request URI.
+    Recommended method of passing bearer tokens.
+
+    Authorization: Bearer h480djs93hd8
+
+    .. _`Bearer Token`: http://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-18
+    """
+    headers = headers or {}
+    headers[u'Authorization'] = u'Bearer %s' % token
+    return headers
+
+
+def prepare_bearer_body(token, body=u''):
+    """Add a `Bearer Token`_ to the request body.
+
+    access_token=h480djs93hd8
+
+    .. _`Bearer Token`: http://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-18
+    """
+    return add_params_to_qs(body, [((u'access_token', token))])
diff --git a/lib/requests/packages/oauthlib/oauth2/draft25/utils.py b/lib/requests/packages/oauthlib/oauth2/draft25/utils.py
new file mode 100755
index 0000000..75d5fcc
--- /dev/null
+++ b/lib/requests/packages/oauthlib/oauth2/draft25/utils.py
@@ -0,0 +1,39 @@
+"""
+oauthlib.utils
+~~~~~~~~~~~~~~
+
+This module contains utility methods used by various parts of the OAuth 2 spec.
+"""
+
+import urllib
+import urlparse
+
+
+def host_from_uri(uri):
+    """Extract hostname and port from URI.
+
+    Will use default port for HTTP and HTTPS if none is present in the URI.
+    """
+    default_ports = {
+        u'HTTP': u'80',
+        u'HTTPS': u'443',
+    }
+
+    sch, netloc, path, par, query, fra = urlparse.urlparse(uri)
+    if u':' in netloc:
+        netloc, port = netloc.split(u':', 1)
+    else:
+        port = default_ports.get(sch.upper())
+
+    return netloc, port
+
+
+def escape(u):
+    """Escape a string in an OAuth-compatible fashion.
+
+    TODO: verify whether this can in fact be used for OAuth 2
+
+    """
+    if not isinstance(u, unicode):
+        raise ValueError('Only unicode objects are escapable.')
+    return urllib.quote(u.encode('utf-8'), safe='~')
diff --git a/lib/requests/packages/urllib3/__init__.py b/lib/requests/packages/urllib3/__init__.py
new file mode 100755
index 0000000..55de87e
--- /dev/null
+++ b/lib/requests/packages/urllib3/__init__.py
@@ -0,0 +1,58 @@
+# urllib3/__init__.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""
+urllib3 - Thread-safe connection pooling and re-using.
+"""
+
+__author__ = 'Andrey Petrov (andrey.petrov at shazow.net)'
+__license__ = 'MIT'
+__version__ = 'dev'
+
+
+from .connectionpool import (
+    HTTPConnectionPool,
+    HTTPSConnectionPool,
+    connection_from_url
+)
+
+from . import exceptions
+from .filepost import encode_multipart_formdata
+from .poolmanager import PoolManager, ProxyManager, proxy_from_url
+from .response import HTTPResponse
+from .util import make_headers, get_host
+
+
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+try:  # Python 2.7+
+    from logging import NullHandler
+except ImportError:
+    class NullHandler(logging.Handler):
+        def emit(self, record):
+            pass
+
+logging.getLogger(__name__).addHandler(NullHandler())
+
+def add_stderr_logger(level=logging.DEBUG):
+    """
+    Helper for quickly adding a StreamHandler to the logger. Useful for
+    debugging.
+
+    Returns the handler after adding it.
+    """
+    # This method needs to be in this __init__.py to get the __name__ correct
+    # even if urllib3 is vendored within another package.
+    logger = logging.getLogger(__name__)
+    handler = logging.StreamHandler()
+    handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
+    logger.addHandler(handler)
+    logger.setLevel(level)
+    logger.debug('Added an stderr logging handler to logger: %s' % __name__)
+    return handler
+
+# ... Clean up.
+del NullHandler
diff --git a/lib/requests/packages/urllib3/__init__.pyc b/lib/requests/packages/urllib3/__init__.pyc
new file mode 100644
index 0000000..f33df3d
Binary files /dev/null and b/lib/requests/packages/urllib3/__init__.pyc differ
diff --git a/lib/requests/packages/urllib3/_collections.py b/lib/requests/packages/urllib3/_collections.py
new file mode 100755
index 0000000..a052b1d
--- /dev/null
+++ b/lib/requests/packages/urllib3/_collections.py
@@ -0,0 +1,94 @@
+# urllib3/_collections.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+from collections import MutableMapping
+from threading import Lock
+
+try: # Python 2.7+
+    from collections import OrderedDict
+except ImportError:
+    from .packages.ordered_dict import OrderedDict
+
+
+__all__ = ['RecentlyUsedContainer']
+
+
+_Null = object()
+
+
+class RecentlyUsedContainer(MutableMapping):
+    """
+    Provides a thread-safe dict-like container which maintains up to
+    ``maxsize`` keys while throwing away the least-recently-used keys beyond
+    ``maxsize``.
+
+    :param maxsize:
+        Maximum number of recent elements to retain.
+
+    :param dispose_func:
+        Every time an item is evicted from the container,
+        ``dispose_func(value)`` is called.  Callback which will get called
+    """
+
+    ContainerCls = OrderedDict
+
+    def __init__(self, maxsize=10, dispose_func=None):
+        self._maxsize = maxsize
+        self.dispose_func = dispose_func
+
+        self._container = self.ContainerCls()
+        self._lock = Lock()
+
+    def __getitem__(self, key):
+        # Re-insert the item, moving it to the end of the eviction line.
+        with self._lock:
+            item = self._container.pop(key)
+            self._container[key] = item
+            return item
+
+    def __setitem__(self, key, value):
+        evicted_value = _Null
+        with self._lock:
+            # Possibly evict the existing value of 'key'
+            evicted_value = self._container.get(key, _Null)
+            self._container[key] = value
+
+            # If we didn't evict an existing value, we might have to evict the
+            # least recently used item from the beginning of the container.
+            if len(self._container) > self._maxsize:
+                _key, evicted_value = self._container.popitem(last=False)
+
+        if self.dispose_func and evicted_value is not _Null:
+            self.dispose_func(evicted_value)
+
+    def __delitem__(self, key):
+        with self._lock:
+            value = self._container.pop(key)
+
+        if self.dispose_func:
+            self.dispose_func(value)
+
+    def __len__(self):
+        with self._lock:
+            return len(self._container)
+
+    def __iter__(self):
+        raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.')
+
+    def clear(self):
+        with self._lock:
+            # Copy pointers to all values, then wipe the mapping
+            # under Python 2, this copies the list of values twice :-|
+            values = list(self._container.values())
+            self._container.clear()
+
+        if self.dispose_func:
+            for value in values:
+                self.dispose_func(value)
+
+    def keys(self):
+        with self._lock:
+            return self._container.keys()
diff --git a/lib/requests/packages/urllib3/_collections.pyc b/lib/requests/packages/urllib3/_collections.pyc
new file mode 100644
index 0000000..3ad57a1
Binary files /dev/null and b/lib/requests/packages/urllib3/_collections.pyc differ
diff --git a/lib/requests/packages/urllib3/connectionpool.py b/lib/requests/packages/urllib3/connectionpool.py
new file mode 100755
index 0000000..97da544
--- /dev/null
+++ b/lib/requests/packages/urllib3/connectionpool.py
@@ -0,0 +1,562 @@
+# urllib3/connectionpool.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import logging
+import socket
+
+from socket import timeout as SocketTimeout
+
+try: # Python 3
+    from http.client import HTTPConnection, HTTPException
+    from http.client import HTTP_PORT, HTTPS_PORT
+except ImportError:
+    from httplib import HTTPConnection, HTTPException
+    from httplib import HTTP_PORT, HTTPS_PORT
+
+try: # Python 3
+    from queue import LifoQueue, Empty, Full
+except ImportError:
+    from Queue import LifoQueue, Empty, Full
+
+
+try: # Compiled with SSL?
+    HTTPSConnection = object
+    BaseSSLError = None
+    ssl = None
+
+    try: # Python 3
+        from http.client import HTTPSConnection
+    except ImportError:
+        from httplib import HTTPSConnection
+
+    import ssl
+    BaseSSLError = ssl.SSLError
+
+except (ImportError, AttributeError): # Platform-specific: No SSL.
+    pass
+
+
+from .request import RequestMethods
+from .response import HTTPResponse
+from .util import get_host, is_connection_dropped
+from .exceptions import (
+    ClosedPoolError,
+    EmptyPoolError,
+    HostChangedError,
+    MaxRetryError,
+    SSLError,
+    TimeoutError,
+)
+
+from .packages.ssl_match_hostname import match_hostname, CertificateError
+from .packages import six
+
+
+xrange = six.moves.xrange
+
+log = logging.getLogger(__name__)
+
+_Default = object()
+
+port_by_scheme = {
+    'http': HTTP_PORT,
+    'https': HTTPS_PORT,
+}
+
+
+## Connection objects (extension of httplib)
+
+class VerifiedHTTPSConnection(HTTPSConnection):
+    """
+    Based on httplib.HTTPSConnection but wraps the socket with
+    SSL certification.
+    """
+    cert_reqs = None
+    ca_certs = None
+
+    def set_cert(self, key_file=None, cert_file=None,
+                 cert_reqs='CERT_NONE', ca_certs=None):
+        ssl_req_scheme = {
+            'CERT_NONE': ssl.CERT_NONE,
+            'CERT_OPTIONAL': ssl.CERT_OPTIONAL,
+            'CERT_REQUIRED': ssl.CERT_REQUIRED
+        }
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.cert_reqs = ssl_req_scheme.get(cert_reqs) or ssl.CERT_NONE
+        self.ca_certs = ca_certs
+
+    def connect(self):
+        # Add certificate verification
+        sock = socket.create_connection((self.host, self.port), self.timeout)
+
+        # Wrap socket using verification with the root certs in
+        # trusted_root_certs
+        self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file,
+                                    cert_reqs=self.cert_reqs,
+                                    ca_certs=self.ca_certs)
+        if self.ca_certs:
+            match_hostname(self.sock.getpeercert(), self.host)
+
+
+## Pool objects
+
+class ConnectionPool(object):
+    """
+    Base class for all connection pools, such as
+    :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
+    """
+
+    scheme = None
+    QueueCls = LifoQueue
+
+    def __init__(self, host, port=None):
+        self.host = host
+        self.port = port
+
+    def __str__(self):
+        return '%s(host=%r, port=%r)' % (type(self).__name__,
+                                         self.host, self.port)
+
+
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
+    """
+    Thread-safe connection pool for one host.
+
+    :param host:
+        Host used for this HTTP Connection (e.g. "localhost"), passed into
+        :class:`httplib.HTTPConnection`.
+
+    :param port:
+        Port used for this HTTP Connection (None is equivalent to 80), passed
+        into :class:`httplib.HTTPConnection`.
+
+    :param strict:
+        Causes BadStatusLine to be raised if the status line can't be parsed
+        as a valid HTTP/1.0 or 1.1 status line, passed into
+        :class:`httplib.HTTPConnection`.
+
+    :param timeout:
+        Socket timeout for each individual connection, can be a float. None
+        disables timeout.
+
+    :param maxsize:
+        Number of connections to save that can be reused. More than 1 is useful
+        in multithreaded situations. If ``block`` is set to false, more
+        connections will be created but they will not be saved once they've
+        been used.
+
+    :param block:
+        If set to True, no more than ``maxsize`` connections will be used at
+        a time. When no free connections are available, the call will block
+        until a connection has been released. This is a useful side effect for
+        particular multithreaded situations where one does not want to use more
+        than maxsize connections per host to prevent flooding.
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+    """
+
+    scheme = 'http'
+
+    def __init__(self, host, port=None, strict=False, timeout=None, maxsize=1,
+                 block=False, headers=None):
+        super(HTTPConnectionPool, self).__init__(host, port)
+
+        self.strict = strict
+        self.timeout = timeout
+        self.pool = self.QueueCls(maxsize)
+        self.block = block
+        self.headers = headers or {}
+
+        # Fill the queue up so that doing get() on it will block properly
+        for _ in xrange(maxsize):
+            self.pool.put(None)
+
+        # These are mostly for testing and debugging purposes.
+        self.num_connections = 0
+        self.num_requests = 0
+
+    def _new_conn(self):
+        """
+        Return a fresh :class:`httplib.HTTPConnection`.
+        """
+        self.num_connections += 1
+        log.info("Starting new HTTP connection (%d): %s" %
+                 (self.num_connections, self.host))
+        return HTTPConnection(host=self.host, port=self.port)
+
+    def _get_conn(self, timeout=None):
+        """
+        Get a connection. Will return a pooled connection if one is available.
+
+        If no connections are available and :prop:`.block` is ``False``, then a
+        fresh connection is returned.
+
+        :param timeout:
+            Seconds to wait before giving up and raising
+            :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and
+            :prop:`.block` is ``True``.
+        """
+        conn = None
+        try:
+            conn = self.pool.get(block=self.block, timeout=timeout)
+
+        except AttributeError: # self.pool is None
+            raise ClosedPoolError(self, "Pool is closed.")
+
+        except Empty:
+            if self.block:
+                raise EmptyPoolError(self,
+                                     "Pool reached maximum size and no more "
+                                     "connections are allowed.")
+            pass  # Oh well, we'll create a new connection then
+
+        # If this is a persistent connection, check if it got disconnected
+        if conn and is_connection_dropped(conn):
+            log.info("Resetting dropped connection: %s" % self.host)
+            conn.close()
+
+        return conn or self._new_conn()
+
+    def _put_conn(self, conn):
+        """
+        Put a connection back into the pool.
+
+        :param conn:
+            Connection object for the current host and port as returned by
+            :meth:`._new_conn` or :meth:`._get_conn`.
+
+        If the pool is already full, the connection is closed and discarded
+        because we exceeded maxsize. If connections are discarded frequently,
+        then maxsize should be increased.
+
+        If the pool is closed, then the connection will be closed and discarded.
+        """
+        try:
+            self.pool.put(conn, block=False)
+            return # Everything is dandy, done.
+        except AttributeError:
+            # self.pool is None.
+            pass
+        except Full:
+            # This should never happen if self.block == True
+            log.warning("HttpConnectionPool is full, discarding connection: %s"
+                        % self.host)
+
+        # Connection never got put back into the pool, close it.
+        conn.close()
+
+    def _make_request(self, conn, method, url, timeout=_Default,
+                      **httplib_request_kw):
+        """
+        Perform a request on a given httplib connection object taken from our
+        pool.
+        """
+        self.num_requests += 1
+
+        if timeout is _Default:
+            timeout = self.timeout
+
+        conn.timeout = timeout # This only does anything in Py26+
+        conn.request(method, url, **httplib_request_kw)
+
+        # Set timeout
+        sock = getattr(conn, 'sock', False) # AppEngine doesn't have sock attr.
+        if sock:
+            sock.settimeout(timeout)
+
+        try: # Python 2.7+, use buffering of HTTP responses
+            httplib_response = conn.getresponse(buffering=True)
+        except TypeError: # Python 2.6 and older
+            httplib_response = conn.getresponse()
+
+        # AppEngine doesn't have a version attr.
+        http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')
+        log.debug("\"%s %s %s\" %s %s" % (method, url, http_version,
+                                          httplib_response.status,
+                                          httplib_response.length))
+        return httplib_response
+
+    def close(self):
+        """
+        Close all pooled connections and disable the pool.
+        """
+        # Disable access to the pool
+        old_pool, self.pool = self.pool, None
+
+        try:
+            while True:
+                conn = old_pool.get(block=False)
+                if conn:
+                    conn.close()
+
+        except Empty:
+            pass # Done.
+
+    def is_same_host(self, url):
+        """
+        Check if the given ``url`` is a member of the same host as this
+        connection pool.
+        """
+        if url.startswith('/'):
+            return True
+
+        # TODO: Add optional support for socket.gethostbyname checking.
+        scheme, host, port = get_host(url)
+
+        if self.port and not port:
+            # Use explicit default port for comparison when none is given.
+            port = port_by_scheme.get(scheme)
+
+        return (scheme, host, port) == (self.scheme, self.host, self.port)
+
+    def urlopen(self, method, url, body=None, headers=None, retries=3,
+                redirect=True, assert_same_host=True, timeout=_Default,
+                pool_timeout=None, release_conn=None, **response_kw):
+        """
+        Get a connection from the pool and perform an HTTP request. This is the
+        lowest level call for making a request, so you'll need to specify all
+        the raw details.
+
+        .. note::
+
+           More commonly, it's appropriate to use a convenience method provided
+           by :class:`.RequestMethods`, such as :meth:`request`.
+
+        .. note::
+
+           `release_conn` will only behave as expected if
+           `preload_content=False` because we want to make
+           `preload_content=False` the default behaviour someday soon without
+           breaking backwards compatibility.
+
+        :param method:
+            HTTP request method (such as GET, POST, PUT, etc.)
+
+        :param body:
+            Data to send in the request body (useful for creating
+            POST requests, see HTTPConnectionPool.post_url for
+            more convenience).
+
+        :param headers:
+            Dictionary of custom headers to send, such as User-Agent,
+            If-None-Match, etc. If None, pool headers are used. If provided,
+            these headers completely replace any pool-specific headers.
+
+        :param retries:
+            Number of retries to allow before raising a MaxRetryError exception.
+
+        :param redirect:
+            If True, automatically handle redirects (status codes 301, 302,
+            303, 307). Each redirect counts as a retry.
+
+        :param assert_same_host:
+            If ``True``, will make sure that the host of the pool requests is
+            consistent else will raise HostChangedError. When False, you can
+            use the pool on an HTTP proxy and request foreign hosts.
+
+        :param timeout:
+            If specified, overrides the default timeout for this one request.
+
+        :param pool_timeout:
+            If set and the pool is set to block=True, then this method will
+            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
+            connection is available within the time period.
+
+        :param release_conn:
+            If False, then the urlopen call will not release the connection
+            back into the pool once a response is received (but will release if
+            you read the entire contents of the response such as when
+            `preload_content=True`). This is useful if you're not preloading
+            the response's content immediately. You will need to call
+            ``r.release_conn()`` on the response ``r`` to return the connection
+            back into the pool. If None, it takes the value of
+            ``response_kw.get('preload_content', True)``.
+
+        :param \**response_kw:
+            Additional parameters are passed to
+            :meth:`urllib3.response.HTTPResponse.from_httplib`
+        """
+        if headers is None:
+            headers = self.headers
+
+        if retries < 0:
+            raise MaxRetryError(self, url)
+
+        if timeout is _Default:
+            timeout = self.timeout
+
+        if release_conn is None:
+            release_conn = response_kw.get('preload_content', True)
+
+        # Check host
+        if assert_same_host and not self.is_same_host(url):
+            host = "%s://%s" % (self.scheme, self.host)
+            if self.port:
+                host = "%s:%d" % (host, self.port)
+
+            raise HostChangedError(self, url, retries - 1)
+
+        conn = None
+
+        try:
+            # Request a connection from the queue
+            conn = self._get_conn(timeout=pool_timeout)
+
+            # Make the request on the httplib connection object
+            httplib_response = self._make_request(conn, method, url,
+                                                  timeout=timeout,
+                                                  body=body, headers=headers)
+
+            # If we're going to release the connection in ``finally:``, then
+            # the request doesn't need to know about the connection. Otherwise
+            # it will also try to release it and we'll have a double-release
+            # mess.
+            response_conn = not release_conn and conn
+
+            # Import httplib's response into our own wrapper object
+            response = HTTPResponse.from_httplib(httplib_response,
+                                                 pool=self,
+                                                 connection=response_conn,
+                                                 **response_kw)
+
+            # else:
+            #     The connection will be put back into the pool when
+            #     ``response.release_conn()`` is called (implicitly by
+            #     ``response.read()``)
+
+        except Empty as e:
+            # Timed out by queue
+            raise TimeoutError(self, "Request timed out. (pool_timeout=%s)" %
+                               pool_timeout)
+
+        except SocketTimeout as e:
+            # Timed out by socket
+            raise TimeoutError(self, "Request timed out. (timeout=%s)" %
+                               timeout)
+
+        except BaseSSLError as e:
+            # SSL certificate error
+            raise SSLError(e)
+
+        except CertificateError as e:
+            # Name mismatch
+            raise SSLError(e)
+
+        except HTTPException as e:
+            # Connection broken, discard. It will be replaced next _get_conn().
+            conn = None
+            # This is necessary so we can access e below
+            err = e
+
+        finally:
+            if release_conn:
+                # Put the connection back to be reused. If the connection is
+                # expired then it will be None, which will get replaced with a
+                # fresh connection during _get_conn.
+                self._put_conn(conn)
+
+        if not conn:
+            # Try again
+            log.warn("Retrying (%d attempts remain) after connection "
+                     "broken by '%r': %s" % (retries, err, url))
+            return self.urlopen(method, url, body, headers, retries - 1,
+                                redirect, assert_same_host,
+                                timeout=timeout, pool_timeout=pool_timeout,
+                                release_conn=release_conn, **response_kw)
+
+        # Handle redirect?
+        redirect_location = redirect and response.get_redirect_location()
+        if redirect_location:
+            if response.status == 303:
+                method = 'GET'
+            log.info("Redirecting %s -> %s" % (url, redirect_location))
+            return self.urlopen(method, redirect_location, body, headers,
+                                retries - 1, redirect, assert_same_host,
+                                timeout=timeout, pool_timeout=pool_timeout,
+                                release_conn=release_conn, **response_kw)
+
+        return response
+
+
+class HTTPSConnectionPool(HTTPConnectionPool):
+    """
+    Same as :class:`.HTTPConnectionPool`, but HTTPS.
+
+    When Python is compiled with the :mod:`ssl` module, then
+    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,
+    instead of :class:httplib.HTTPSConnection`.
+
+    The ``key_file``, ``cert_file``, ``cert_reqs``, and ``ca_certs`` parameters
+    are only used if :mod:`ssl` is available and are fed into
+    :meth:`ssl.wrap_socket` to upgrade the connection socket into an SSL socket.
+    """
+
+    scheme = 'https'
+
+    def __init__(self, host, port=None,
+                 strict=False, timeout=None, maxsize=1,
+                 block=False, headers=None,
+                 key_file=None, cert_file=None,
+                 cert_reqs='CERT_NONE', ca_certs=None):
+
+        super(HTTPSConnectionPool, self).__init__(host, port,
+                                                  strict, timeout, maxsize,
+                                                  block, headers)
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.cert_reqs = cert_reqs
+        self.ca_certs = ca_certs
+
+    def _new_conn(self):
+        """
+        Return a fresh :class:`httplib.HTTPSConnection`.
+        """
+        self.num_connections += 1
+        log.info("Starting new HTTPS connection (%d): %s"
+                 % (self.num_connections, self.host))
+
+        if not ssl: # Platform-specific: Python compiled without +ssl
+            if not HTTPSConnection or HTTPSConnection is object:
+                raise SSLError("Can't connect to HTTPS URL because the SSL "
+                               "module is not available.")
+
+            return HTTPSConnection(host=self.host, port=self.port)
+
+        connection = VerifiedHTTPSConnection(host=self.host, port=self.port)
+        connection.set_cert(key_file=self.key_file, cert_file=self.cert_file,
+                            cert_reqs=self.cert_reqs, ca_certs=self.ca_certs)
+        return connection
+
+
+def connection_from_url(url, **kw):
+    """
+    Given a url, return an :class:`.ConnectionPool` instance of its host.
+
+    This is a shortcut for not having to parse out the scheme, host, and port
+    of the url before creating an :class:`.ConnectionPool` instance.
+
+    :param url:
+        Absolute URL string that must include the scheme. Port is optional.
+
+    :param \**kw:
+        Passes additional parameters to the constructor of the appropriate
+        :class:`.ConnectionPool`. Useful for specifying things like
+        timeout, maxsize, headers, etc.
+
+    Example: ::
+
+        >>> conn = connection_from_url('http://google.com/')
+        >>> r = conn.request('GET', '/')
+    """
+    scheme, host, port = get_host(url)
+    if scheme == 'https':
+        return HTTPSConnectionPool(host, port=port, **kw)
+    else:
+        return HTTPConnectionPool(host, port=port, **kw)
diff --git a/lib/requests/packages/urllib3/connectionpool.pyc b/lib/requests/packages/urllib3/connectionpool.pyc
new file mode 100644
index 0000000..82bc94b
Binary files /dev/null and b/lib/requests/packages/urllib3/connectionpool.pyc differ
diff --git a/lib/requests/packages/urllib3/contrib/__init__.py b/lib/requests/packages/urllib3/contrib/__init__.py
new file mode 100755
index 0000000..e69de29
diff --git a/lib/requests/packages/urllib3/contrib/ntlmpool.py b/lib/requests/packages/urllib3/contrib/ntlmpool.py
new file mode 100755
index 0000000..bb41fd1
--- /dev/null
+++ b/lib/requests/packages/urllib3/contrib/ntlmpool.py
@@ -0,0 +1,120 @@
+# urllib3/contrib/ntlmpool.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""
+NTLM authenticating pool, contributed by erikcederstran
+
+Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
+"""
+
+try:
+    from http.client import HTTPSConnection
+except ImportError:
+    from httplib import HTTPSConnection
+from logging import getLogger
+from ntlm import ntlm
+
+from urllib3 import HTTPSConnectionPool
+
+
+log = getLogger(__name__)
+
+
+class NTLMConnectionPool(HTTPSConnectionPool):
+    """
+    Implements an NTLM authentication version of an urllib3 connection pool
+    """
+
+    scheme = 'https'
+
+    def __init__(self, user, pw, authurl, *args, **kwargs):
+        """
+        authurl is a random URL on the server that is protected by NTLM.
+        user is the Windows user, probably in the DOMAIN\username format.
+        pw is the password for the user.
+        """
+        super(NTLMConnectionPool, self).__init__(*args, **kwargs)
+        self.authurl = authurl
+        self.rawuser = user
+        user_parts = user.split('\\', 1)
+        self.domain = user_parts[0].upper()
+        self.user = user_parts[1]
+        self.pw = pw
+
+    def _new_conn(self):
+        # Performs the NTLM handshake that secures the connection. The socket
+        # must be kept open while requests are performed.
+        self.num_connections += 1
+        log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s' %
+                  (self.num_connections, self.host, self.authurl))
+
+        headers = {}
+        headers['Connection'] = 'Keep-Alive'
+        req_header = 'Authorization'
+        resp_header = 'www-authenticate'
+
+        conn = HTTPSConnection(host=self.host, port=self.port)
+
+        # Send negotiation message
+        headers[req_header] = (
+            'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser))
+        log.debug('Request headers: %s' % headers)
+        conn.request('GET', self.authurl, None, headers)
+        res = conn.getresponse()
+        reshdr = dict(res.getheaders())
+        log.debug('Response status: %s %s' % (res.status, res.reason))
+        log.debug('Response headers: %s' % reshdr)
+        log.debug('Response data: %s [...]' % res.read(100))
+
+        # Remove the reference to the socket, so that it can not be closed by
+        # the response object (we want to keep the socket open)
+        res.fp = None
+
+        # Server should respond with a challenge message
+        auth_header_values = reshdr[resp_header].split(', ')
+        auth_header_value = None
+        for s in auth_header_values:
+            if s[:5] == 'NTLM ':
+                auth_header_value = s[5:]
+        if auth_header_value is None:
+            raise Exception('Unexpected %s response header: %s' %
+                            (resp_header, reshdr[resp_header]))
+
+        # Send authentication message
+        ServerChallenge, NegotiateFlags = \
+            ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value)
+        auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge,
+                                                         self.user,
+                                                         self.domain,
+                                                         self.pw,
+                                                         NegotiateFlags)
+        headers[req_header] = 'NTLM %s' % auth_msg
+        log.debug('Request headers: %s' % headers)
+        conn.request('GET', self.authurl, None, headers)
+        res = conn.getresponse()
+        log.debug('Response status: %s %s' % (res.status, res.reason))
+        log.debug('Response headers: %s' % dict(res.getheaders()))
+        log.debug('Response data: %s [...]' % res.read()[:100])
+        if res.status != 200:
+            if res.status == 401:
+                raise Exception('Server rejected request: wrong '
+                                'username or password')
+            raise Exception('Wrong server response: %s %s' %
+                            (res.status, res.reason))
+
+        res.fp = None
+        log.debug('Connection established')
+        return conn
+
+    def urlopen(self, method, url, body=None, headers=None, retries=3,
+                redirect=True, assert_same_host=True):
+        if headers is None:
+            headers = {}
+        headers['Connection'] = 'Keep-Alive'
+        return super(NTLMConnectionPool, self).urlopen(method, url, body,
+                                                       headers, retries,
+                                                       redirect,
+                                                       assert_same_host)
diff --git a/lib/requests/packages/urllib3/exceptions.py b/lib/requests/packages/urllib3/exceptions.py
new file mode 100755
index 0000000..99ebb67
--- /dev/null
+++ b/lib/requests/packages/urllib3/exceptions.py
@@ -0,0 +1,77 @@
+# urllib3/exceptions.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+
+## Base Exceptions
+
+class HTTPError(Exception):
+    "Base exception used by this module."
+    pass
+
+
+class PoolError(HTTPError):
+    "Base exception for errors caused within a pool."
+    def __init__(self, pool, message):
+        self.pool = pool
+        HTTPError.__init__(self, "%s: %s" % (pool, message))
+
+
+class SSLError(HTTPError):
+    "Raised when SSL certificate fails in an HTTPS connection."
+    pass
+
+
+class DecodeError(HTTPError):
+    "Raised when automatic decoding based on Content-Type fails."
+    pass
+
+
+## Leaf Exceptions
+
+class MaxRetryError(PoolError):
+    "Raised when the maximum number of retries is exceeded."
+
+    def __init__(self, pool, url):
+        message = "Max retries exceeded with url: %s" % url
+        PoolError.__init__(self, pool, message)
+
+        self.url = url
+
+
+class HostChangedError(PoolError):
+    "Raised when an existing pool gets a request for a foreign host."
+
+    def __init__(self, pool, url, retries=3):
+        message = "Tried to open a foreign host with url: %s" % url
+        PoolError.__init__(self, pool, message)
+
+        self.url = url
+        self.retries = retries
+
+
+class TimeoutError(PoolError):
+    "Raised when a socket timeout occurs."
+    pass
+
+
+class EmptyPoolError(PoolError):
+    "Raised when a pool runs out of connections and no more are allowed."
+    pass
+
+
+class ClosedPoolError(PoolError):
+    "Raised when a request enters a pool after the pool has been closed."
+    pass
+
+
+class LocationParseError(ValueError, HTTPError):
+    "Raised when get_host or similar fails to parse the URL input."
+
+    def __init__(self, location):
+        message = "Failed to parse: %s" % location
+        super(LocationParseError, self).__init__(self, message)
+
+        self.location = location
diff --git a/lib/requests/packages/urllib3/exceptions.pyc b/lib/requests/packages/urllib3/exceptions.pyc
new file mode 100644
index 0000000..dc81f19
Binary files /dev/null and b/lib/requests/packages/urllib3/exceptions.pyc differ
diff --git a/lib/requests/packages/urllib3/filepost.py b/lib/requests/packages/urllib3/filepost.py
new file mode 100755
index 0000000..e679b93
--- /dev/null
+++ b/lib/requests/packages/urllib3/filepost.py
@@ -0,0 +1,91 @@
+# urllib3/filepost.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import codecs
+import mimetypes
+
+from uuid import uuid4
+from io import BytesIO
+
+from .packages import six
+from .packages.six import b
+
+writer = codecs.lookup('utf-8')[3]
+
+
+def choose_boundary():
+    """
+    Our embarassingly-simple replacement for mimetools.choose_boundary.
+    """
+    return uuid4().hex
+
+
+def get_content_type(filename):
+    return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
+
+
+def iter_fields(fields):
+    """
+    Iterate over fields.
+
+    Supports list of (k, v) tuples and dicts.
+    """
+    if isinstance(fields, dict):
+        return ((k, v) for k, v in six.iteritems(fields))
+
+    return ((k, v) for k, v in fields)
+
+
+def encode_multipart_formdata(fields, boundary=None):
+    """
+    Encode a dictionary of ``fields`` using the multipart/form-data mime format.
+
+    :param fields:
+        Dictionary of fields or list of (key, value) field tuples.  The key is
+        treated as the field name, and the value as the body of the form-data
+        bytes. If the value is a tuple of two elements, then the first element
+        is treated as the filename of the form-data section.
+
+        Field names and filenames must be unicode.
+
+    :param boundary:
+        If not specified, then a random boundary will be generated using
+        :func:`mimetools.choose_boundary`.
+    """
+    body = BytesIO()
+    if boundary is None:
+        boundary = choose_boundary()
+
+    for fieldname, value in iter_fields(fields):
+        body.write(b('--%s\r\n' % (boundary)))
+
+        if isinstance(value, tuple):
+            filename, data = value
+            writer(body).write('Content-Disposition: form-data; name="%s"; '
+                               'filename="%s"\r\n' % (fieldname, filename))
+            body.write(b('Content-Type: %s\r\n\r\n' %
+                       (get_content_type(filename))))
+        else:
+            data = value
+            writer(body).write('Content-Disposition: form-data; name="%s"\r\n'
+                               % (fieldname))
+            body.write(b'Content-Type: text/plain\r\n\r\n')
+
+        if isinstance(data, int):
+            data = str(data)  # Backwards compatibility
+
+        if isinstance(data, six.text_type):
+            writer(body).write(data)
+        else:
+            body.write(data)
+
+        body.write(b'\r\n')
+
+    body.write(b('--%s--\r\n' % (boundary)))
+
+    content_type = b('multipart/form-data; boundary=%s' % boundary)
+
+    return body.getvalue(), content_type
diff --git a/lib/requests/packages/urllib3/filepost.pyc b/lib/requests/packages/urllib3/filepost.pyc
new file mode 100644
index 0000000..2ccad30
Binary files /dev/null and b/lib/requests/packages/urllib3/filepost.pyc differ
diff --git a/lib/requests/packages/urllib3/packages/__init__.py b/lib/requests/packages/urllib3/packages/__init__.py
new file mode 100755
index 0000000..37e8351
--- /dev/null
+++ b/lib/requests/packages/urllib3/packages/__init__.py
@@ -0,0 +1,4 @@
+from __future__ import absolute_import
+
+from . import ssl_match_hostname
+
diff --git a/lib/requests/packages/urllib3/packages/__init__.pyc b/lib/requests/packages/urllib3/packages/__init__.pyc
new file mode 100644
index 0000000..e373e5c
Binary files /dev/null and b/lib/requests/packages/urllib3/packages/__init__.pyc differ
diff --git a/lib/requests/packages/urllib3/packages/ordered_dict.py b/lib/requests/packages/urllib3/packages/ordered_dict.py
new file mode 100755
index 0000000..7f8ee15
--- /dev/null
+++ b/lib/requests/packages/urllib3/packages/ordered_dict.py
@@ -0,0 +1,260 @@
+# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
+# Passes Python2.7's test suite and incorporates all the latest updates.
+# Copyright 2009 Raymond Hettinger, released under the MIT License.
+# http://code.activestate.com/recipes/576693/
+
+try:
+    from thread import get_ident as _get_ident
+except ImportError:
+    from dummy_thread import get_ident as _get_ident
+
+try:
+    from _abcoll import KeysView, ValuesView, ItemsView
+except ImportError:
+    pass
+
+
+class OrderedDict(dict):
+    'Dictionary that remembers insertion order'
+    # An inherited dict maps keys to values.
+    # The inherited dict provides __getitem__, __len__, __contains__, and get.
+    # The remaining methods are order-aware.
+    # Big-O running times for all methods are the same as for regular dictionaries.
+
+    # The internal self.__map dictionary maps keys to links in a doubly linked list.
+    # The circular doubly linked list starts and ends with a sentinel element.
+    # The sentinel element never gets deleted (this simplifies the algorithm).
+    # Each link is stored as a list of length three:  [PREV, NEXT, KEY].
+
+    def __init__(self, *args, **kwds):
+        '''Initialize an ordered dictionary.  Signature is the same as for
+        regular dictionaries, but keyword arguments are not recommended
+        because their insertion order is arbitrary.
+
+        '''
+        if len(args) > 1:
+            raise TypeError('expected at most 1 arguments, got %d' % len(args))
+        try:
+            self.__root
+        except AttributeError:
+            self.__root = root = []                     # sentinel node
+            root[:] = [root, root, None]
+            self.__map = {}
+        self.__update(*args, **kwds)
+
+    def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
+        'od.__setitem__(i, y) <==> od[i]=y'
+        # Setting a new item creates a new link which goes at the end of the linked
+        # list, and the inherited dictionary is updated with the new key/value pair.
+        if key not in self:
+            root = self.__root
+            last = root[0]
+            last[1] = root[0] = self.__map[key] = [last, root, key]
+        dict_setitem(self, key, value)
+
+    def __delitem__(self, key, dict_delitem=dict.__delitem__):
+        'od.__delitem__(y) <==> del od[y]'
+        # Deleting an existing item uses self.__map to find the link which is
+        # then removed by updating the links in the predecessor and successor nodes.
+        dict_delitem(self, key)
+        link_prev, link_next, key = self.__map.pop(key)
+        link_prev[1] = link_next
+        link_next[0] = link_prev
+
+    def __iter__(self):
+        'od.__iter__() <==> iter(od)'
+        root = self.__root
+        curr = root[1]
+        while curr is not root:
+            yield curr[2]
+            curr = curr[1]
+
+    def __reversed__(self):
+        'od.__reversed__() <==> reversed(od)'
+        root = self.__root
+        curr = root[0]
+        while curr is not root:
+            yield curr[2]
+            curr = curr[0]
+
+    def clear(self):
+        'od.clear() -> None.  Remove all items from od.'
+        try:
+            for node in self.__map.itervalues():
+                del node[:]
+            root = self.__root
+            root[:] = [root, root, None]
+            self.__map.clear()
+        except AttributeError:
+            pass
+        dict.clear(self)
+
+    def popitem(self, last=True):
+        '''od.popitem() -> (k, v), return and remove a (key, value) pair.
+        Pairs are returned in LIFO order if last is true or FIFO order if false.
+
+        '''
+        if not self:
+            raise KeyError('dictionary is empty')
+        root = self.__root
+        if last:
+            link = root[0]
+            link_prev = link[0]
+            link_prev[1] = root
+            root[0] = link_prev
+        else:
+            link = root[1]
+            link_next = link[1]
+            root[1] = link_next
+            link_next[0] = root
+        key = link[2]
+        del self.__map[key]
+        value = dict.pop(self, key)
+        return key, value
+
+    # -- the following methods do not depend on the internal structure --
+
+    def keys(self):
+        'od.keys() -> list of keys in od'
+        return list(self)
+
+    def values(self):
+        'od.values() -> list of values in od'
+        return [self[key] for key in self]
+
+    def items(self):
+        'od.items() -> list of (key, value) pairs in od'
+        return [(key, self[key]) for key in self]
+
+    def iterkeys(self):
+        'od.iterkeys() -> an iterator over the keys in od'
+        return iter(self)
+
+    def itervalues(self):
+        'od.itervalues -> an iterator over the values in od'
+        for k in self:
+            yield self[k]
+
+    def iteritems(self):
+        'od.iteritems -> an iterator over the (key, value) items in od'
+        for k in self:
+            yield (k, self[k])
+
+    def update(*args, **kwds):
+        '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.
+
+        If E is a dict instance, does:           for k in E: od[k] = E[k]
+        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
+        Or if E is an iterable of items, does:   for k, v in E: od[k] = v
+        In either case, this is followed by:     for k, v in F.items(): od[k] = v
+
+        '''
+        if len(args) > 2:
+            raise TypeError('update() takes at most 2 positional '
+                            'arguments (%d given)' % (len(args),))
+        elif not args:
+            raise TypeError('update() takes at least 1 argument (0 given)')
+        self = args[0]
+        # Make progressively weaker assumptions about "other"
+        other = ()
+        if len(args) == 2:
+            other = args[1]
+        if isinstance(other, dict):
+            for key in other:
+                self[key] = other[key]
+        elif hasattr(other, 'keys'):
+            for key in other.keys():
+                self[key] = other[key]
+        else:
+            for key, value in other:
+                self[key] = value
+        for key, value in kwds.items():
+            self[key] = value
+
+    __update = update  # let subclasses override update without breaking __init__
+
+    __marker = object()
+
+    def pop(self, key, default=__marker):
+        '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+        If key is not found, d is returned if given, otherwise KeyError is raised.
+
+        '''
+        if key in self:
+            result = self[key]
+            del self[key]
+            return result
+        if default is self.__marker:
+            raise KeyError(key)
+        return default
+
+    def setdefault(self, key, default=None):
+        'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
+        if key in self:
+            return self[key]
+        self[key] = default
+        return default
+
+    def __repr__(self, _repr_running={}):
+        'od.__repr__() <==> repr(od)'
+        call_key = id(self), _get_ident()
+        if call_key in _repr_running:
+            return '...'
+        _repr_running[call_key] = 1
+        try:
+            if not self:
+                return '%s()' % (self.__class__.__name__,)
+            return '%s(%r)' % (self.__class__.__name__, self.items())
+        finally:
+            del _repr_running[call_key]
+
+    def __reduce__(self):
+        'Return state information for pickling'
+        items = [[k, self[k]] for k in self]
+        inst_dict = vars(self).copy()
+        for k in vars(OrderedDict()):
+            inst_dict.pop(k, None)
+        if inst_dict:
+            return (self.__class__, (items,), inst_dict)
+        return self.__class__, (items,)
+
+    def copy(self):
+        'od.copy() -> a shallow copy of od'
+        return self.__class__(self)
+
+    @classmethod
+    def fromkeys(cls, iterable, value=None):
+        '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
+        and values equal to v (which defaults to None).
+
+        '''
+        d = cls()
+        for key in iterable:
+            d[key] = value
+        return d
+
+    def __eq__(self, other):
+        '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
+        while comparison to a regular mapping is order-insensitive.
+
+        '''
+        if isinstance(other, OrderedDict):
+            return len(self)==len(other) and self.items() == other.items()
+        return dict.__eq__(self, other)
+
+    def __ne__(self, other):
+        return not self == other
+
+    # -- the following methods are only used in Python 2.7 --
+
+    def viewkeys(self):
+        "od.viewkeys() -> a set-like object providing a view on od's keys"
+        return KeysView(self)
+
+    def viewvalues(self):
+        "od.viewvalues() -> an object providing a view on od's values"
+        return ValuesView(self)
+
+    def viewitems(self):
+        "od.viewitems() -> a set-like object providing a view on od's items"
+        return ItemsView(self)
diff --git a/lib/requests/packages/urllib3/packages/ordered_dict.pyc b/lib/requests/packages/urllib3/packages/ordered_dict.pyc
new file mode 100644
index 0000000..57d3c12
Binary files /dev/null and b/lib/requests/packages/urllib3/packages/ordered_dict.pyc differ
diff --git a/lib/requests/packages/urllib3/packages/six.py b/lib/requests/packages/urllib3/packages/six.py
new file mode 100755
index 0000000..a64f6fb
--- /dev/null
+++ b/lib/requests/packages/urllib3/packages/six.py
@@ -0,0 +1,372 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+#Copyright (c) 2010-2011 Benjamin Peterson
+
+#Permission is hereby granted, free of charge, to any person obtaining a copy of
+#this software and associated documentation files (the "Software"), to deal in
+#the Software without restriction, including without limitation the rights to
+#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+#the Software, and to permit persons to whom the Software is furnished to do so,
+#subject to the following conditions:
+
+#The above copyright notice and this permission notice shall be included in all
+#copies or substantial portions of the Software.
+
+#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin at python.org>"
+__version__ = "1.1.0"
+
+
+# True if we are running on Python 3.
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+    class X(object):
+        def __len__(self):
+            return 1 << 31
+    try:
+        len(X())
+    except OverflowError:
+        # 32-bit
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # 64-bit
+        MAXSIZE = int((1 << 63) - 1)
+    del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)
+        # This is a bit ugly, but it avoids running this again.
+        delattr(tp, self.name)
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+
+class _MovedItems(types.ModuleType):
+    """Lazy loading of moved objects"""
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("winreg", "_winreg"),
+]
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+del attr
+
+moves = sys.modules["six.moves"] = _MovedItems("moves")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+
+    _iterkeys = "keys"
+    _itervalues = "values"
+    _iteritems = "items"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+
+    _iterkeys = "iterkeys"
+    _itervalues = "itervalues"
+    _iteritems = "iteritems"
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+
+    advance_iterator = next
+
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+
+    def advance_iterator(it):
+        return it.next()
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+
+
+def iterkeys(d):
+    """Return an iterator over the keys of a dictionary."""
+    return getattr(d, _iterkeys)()
+
+def itervalues(d):
+    """Return an iterator over the values of a dictionary."""
+    return getattr(d, _itervalues)()
+
+def iteritems(d):
+    """Return an iterator over the (key, value) pairs of a dictionary."""
+    return getattr(d, _iteritems)()
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+    def u(s):
+        return s
+    if sys.version_info[1] <= 1:
+        def int2byte(i):
+            return bytes((i,))
+    else:
+        # This is about 2x faster than the implementation above on 3.2+
+        int2byte = operator.methodcaller("to_bytes", 1, "big")
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+else:
+    def b(s):
+        return s
+    def u(s):
+        return unicode(s, "unicode_escape")
+    int2byte = chr
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+if PY3:
+    import builtins
+    exec_ = getattr(builtins, "exec")
+
+
+    def reraise(tp, value, tb=None):
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+
+    print_ = getattr(builtins, "print")
+    del builtins
+
+else:
+    def exec_(code, globs=None, locs=None):
+        """Execute code in a namespace."""
+        if globs is None:
+            frame = sys._getframe(1)
+            globs = frame.f_globals
+            if locs is None:
+                locs = frame.f_locals
+            del frame
+        elif locs is None:
+            locs = globs
+        exec("""exec code in globs, locs""")
+
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+    def print_(*args, **kwargs):
+        """The new-style print function."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+
+_add_doc(reraise, """Reraise an exception.""")
+
+
+def with_metaclass(meta, base=object):
+    """Create a base class with a metaclass."""
+    return meta("NewBase", (base,), {})
diff --git a/lib/requests/packages/urllib3/packages/six.pyc b/lib/requests/packages/urllib3/packages/six.pyc
new file mode 100644
index 0000000..87485d4
Binary files /dev/null and b/lib/requests/packages/urllib3/packages/six.pyc differ
diff --git a/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py
new file mode 100755
index 0000000..9560b04
--- /dev/null
+++ b/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py
@@ -0,0 +1,61 @@
+"""The match_hostname() function from Python 3.2, essential when using SSL."""
+
+import re
+
+__version__ = '3.2.2'
+
+class CertificateError(ValueError):
+    pass
+
+def _dnsname_to_pat(dn):
+    pats = []
+    for frag in dn.split(r'.'):
+        if frag == '*':
+            # When '*' is a fragment by itself, it matches a non-empty dotless
+            # fragment.
+            pats.append('[^.]+')
+        else:
+            # Otherwise, '*' matches any dotless fragment.
+            frag = re.escape(frag)
+            pats.append(frag.replace(r'\*', '[^.]*'))
+    return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
+
+def match_hostname(cert, hostname):
+    """Verify that *cert* (in decoded format as returned by
+    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 rules
+    are mostly followed, but IP addresses are not accepted for *hostname*.
+
+    CertificateError is raised on failure. On success, the function
+    returns nothing.
+    """
+    if not cert:
+        raise ValueError("empty or no certificate")
+    dnsnames = []
+    san = cert.get('subjectAltName', ())
+    for key, value in san:
+        if key == 'DNS':
+            if _dnsname_to_pat(value).match(hostname):
+                return
+            dnsnames.append(value)
+    if not dnsnames:
+        # The subject is only checked when there is no dNSName entry
+        # in subjectAltName
+        for sub in cert.get('subject', ()):
+            for key, value in sub:
+                # XXX according to RFC 2818, the most specific Common Name
+                # must be used.
+                if key == 'commonName':
+                    if _dnsname_to_pat(value).match(hostname):
+                        return
+                    dnsnames.append(value)
+    if len(dnsnames) > 1:
+        raise CertificateError("hostname %r "
+            "doesn't match either of %s"
+            % (hostname, ', '.join(map(repr, dnsnames))))
+    elif len(dnsnames) == 1:
+        raise CertificateError("hostname %r "
+            "doesn't match %r"
+            % (hostname, dnsnames[0]))
+    else:
+        raise CertificateError("no appropriate commonName or "
+            "subjectAltName fields were found")
diff --git a/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc b/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc
new file mode 100644
index 0000000..c4a1c3f
Binary files /dev/null and b/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc differ
diff --git a/lib/requests/packages/urllib3/poolmanager.py b/lib/requests/packages/urllib3/poolmanager.py
new file mode 100755
index 0000000..8f5b54c
--- /dev/null
+++ b/lib/requests/packages/urllib3/poolmanager.py
@@ -0,0 +1,158 @@
+# urllib3/poolmanager.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import logging
+
+from ._collections import RecentlyUsedContainer
+from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool
+from .connectionpool import connection_from_url, port_by_scheme
+from .request import RequestMethods
+from .util import parse_url
+
+
+__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url']
+
+
+pool_classes_by_scheme = {
+    'http': HTTPConnectionPool,
+    'https': HTTPSConnectionPool,
+}
+
+log = logging.getLogger(__name__)
+
+
+class PoolManager(RequestMethods):
+    """
+    Allows for arbitrary requests while transparently keeping track of
+    necessary connection pools for you.
+
+    :param num_pools:
+        Number of connection pools to cache before discarding the least recently
+        used pool.
+
+    :param \**connection_pool_kw:
+        Additional parameters are used to create fresh
+        :class:`urllib3.connectionpool.ConnectionPool` instances.
+
+    Example: ::
+
+        >>> manager = PoolManager(num_pools=2)
+        >>> r = manager.urlopen("http://google.com/")
+        >>> r = manager.urlopen("http://google.com/mail")
+        >>> r = manager.urlopen("http://yahoo.com/")
+        >>> len(manager.pools)
+        2
+
+    """
+
+    def __init__(self, num_pools=10, **connection_pool_kw):
+        self.connection_pool_kw = connection_pool_kw
+        self.pools = RecentlyUsedContainer(num_pools,
+                                           dispose_func=lambda p: p.close())
+
+    def clear(self):
+        """
+        Empty our store of pools and direct them all to close.
+
+        This will not affect in-flight connections, but they will not be
+        re-used after completion.
+        """
+        self.pools.clear()
+
+    def connection_from_host(self, host, port=None, scheme='http'):
+        """
+        Get a :class:`ConnectionPool` based on the host, port, and scheme.
+
+        If ``port`` isn't given, it will be derived from the ``scheme`` using
+        ``urllib3.connectionpool.port_by_scheme``.
+        """
+        port = port or port_by_scheme.get(scheme, 80)
+
+        pool_key = (scheme, host, port)
+
+        # If the scheme, host, or port doesn't match existing open connections,
+        # open a new ConnectionPool.
+        pool = self.pools.get(pool_key)
+        if pool:
+            return pool
+
+        # Make a fresh ConnectionPool of the desired type
+        pool_cls = pool_classes_by_scheme[scheme]
+        pool = pool_cls(host, port, **self.connection_pool_kw)
+
+        self.pools[pool_key] = pool
+
+        return pool
+
+    def connection_from_url(self, url):
+        """
+        Similar to :func:`urllib3.connectionpool.connection_from_url` but
+        doesn't pass any additional parameters to the
+        :class:`urllib3.connectionpool.ConnectionPool` constructor.
+
+        Additional parameters are taken from the :class:`.PoolManager`
+        constructor.
+        """
+        u = parse_url(url)
+        return self.connection_from_host(u.host, port=u.port, scheme=u.scheme)
+
+    def urlopen(self, method, url, redirect=True, **kw):
+        """
+        Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`
+        with custom cross-host redirect logic and only sends the request-uri
+        portion of the ``url``.
+
+        The given ``url`` parameter must be absolute, such that an appropriate
+        :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it.
+        """
+        u = parse_url(url)
+        conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)
+
+        kw['assert_same_host'] = False
+        kw['redirect'] = False
+
+        response = conn.urlopen(method, u.request_uri, **kw)
+
+        redirect_location = redirect and response.get_redirect_location()
+        if not redirect_location:
+            return response
+
+        if response.status == 303:
+            method = 'GET'
+
+        log.info("Redirecting %s -> %s" % (url, redirect_location))
+        kw['retries'] = kw.get('retries', 3) - 1 # Persist retries countdown
+        return self.urlopen(method, redirect_location, **kw)
+
+
+class ProxyManager(RequestMethods):
+    """
+    Given a ConnectionPool to a proxy, the ProxyManager's ``urlopen`` method
+    will make requests to any url through the defined proxy.
+    """
+
+    def __init__(self, proxy_pool):
+        self.proxy_pool = proxy_pool
+
+    def _set_proxy_headers(self, headers=None):
+        headers = headers or {}
+
+        # Same headers are curl passes for --proxy1.0
+        headers['Accept'] = '*/*'
+        headers['Proxy-Connection'] = 'Keep-Alive'
+
+        return headers
+
+    def urlopen(self, method, url, **kw):
+        "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute."
+        kw['assert_same_host'] = False
+        kw['headers'] = self._set_proxy_headers(kw.get('headers'))
+        return self.proxy_pool.urlopen(method, url, **kw)
+
+
+def proxy_from_url(url, **pool_kw):
+    proxy_pool = connection_from_url(url, **pool_kw)
+    return ProxyManager(proxy_pool)
diff --git a/lib/requests/packages/urllib3/poolmanager.pyc b/lib/requests/packages/urllib3/poolmanager.pyc
new file mode 100644
index 0000000..88ccc43
Binary files /dev/null and b/lib/requests/packages/urllib3/poolmanager.pyc differ
diff --git a/lib/requests/packages/urllib3/request.py b/lib/requests/packages/urllib3/request.py
new file mode 100755
index 0000000..569ac96
--- /dev/null
+++ b/lib/requests/packages/urllib3/request.py
@@ -0,0 +1,128 @@
+# urllib3/request.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+try:
+    from urllib.parse import urlencode
+except ImportError:
+    from urllib import urlencode
+
+from .filepost import encode_multipart_formdata
+
+
+__all__ = ['RequestMethods']
+
+
+class RequestMethods(object):
+    """
+    Convenience mixin for classes who implement a :meth:`urlopen` method, such
+    as :class:`~urllib3.connectionpool.HTTPConnectionPool` and
+    :class:`~urllib3.poolmanager.PoolManager`.
+
+    Provides behavior for making common types of HTTP request methods and
+    decides which type of request field encoding to use.
+
+    Specifically,
+
+    :meth:`.request_encode_url` is for sending requests whose fields are encoded
+    in the URL (such as GET, HEAD, DELETE).
+
+    :meth:`.request_encode_body` is for sending requests whose fields are
+    encoded in the *body* of the request using multipart or www-orm-urlencoded
+    (such as for POST, PUT, PATCH).
+
+    :meth:`.request` is for making any kind of request, it will look up the
+    appropriate encoding format and use one of the above two methods to make
+    the request.
+    """
+
+    _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS'])
+
+    _encode_body_methods = set(['PATCH', 'POST', 'PUT', 'TRACE'])
+
+    def urlopen(self, method, url, body=None, headers=None,
+                encode_multipart=True, multipart_boundary=None,
+                **kw): # Abstract
+        raise NotImplemented("Classes extending RequestMethods must implement "
+                             "their own ``urlopen`` method.")
+
+    def request(self, method, url, fields=None, headers=None, **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the appropriate encoding of
+        ``fields`` based on the ``method`` used.
+
+        This is a convenience method that requires the least amount of manual
+        effort. It can be used in most situations, while still having the option
+        to drop down to more specific methods when necessary, such as
+        :meth:`request_encode_url`, :meth:`request_encode_body`,
+        or even the lowest level :meth:`urlopen`.
+        """
+        method = method.upper()
+
+        if method in self._encode_url_methods:
+            return self.request_encode_url(method, url, fields=fields,
+                                            headers=headers,
+                                            **urlopen_kw)
+        else:
+            return self.request_encode_body(method, url, fields=fields,
+                                             headers=headers,
+                                             **urlopen_kw)
+
+    def request_encode_url(self, method, url, fields=None, **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
+        the url. This is useful for request methods like GET, HEAD, DELETE, etc.
+        """
+        if fields:
+            url += '?' + urlencode(fields)
+        return self.urlopen(method, url, **urlopen_kw)
+
+    def request_encode_body(self, method, url, fields=None, headers=None,
+                            encode_multipart=True, multipart_boundary=None,
+                            **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
+        the body. This is useful for request methods like POST, PUT, PATCH, etc.
+
+        When ``encode_multipart=True`` (default), then
+        :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the
+        payload with the appropriate content type. Otherwise
+        :meth:`urllib.urlencode` is used with the
+        'application/x-www-form-urlencoded' content type.
+
+        Multipart encoding must be used when posting files, and it's reasonably
+        safe to use it in other times too. However, it may break request signing,
+        such as with OAuth.
+
+        Supports an optional ``fields`` parameter of key/value strings AND
+        key/filetuple. A filetuple is a (filename, data) tuple. For example: ::
+
+            fields = {
+                'foo': 'bar',
+                'fakefile': ('foofile.txt', 'contents of foofile'),
+                'realfile': ('barfile.txt', open('realfile').read()),
+                'nonamefile': ('contents of nonamefile field'),
+            }
+
+        When uploading a file, providing a filename (the first parameter of the
+        tuple) is optional but recommended to best mimick behavior of browsers.
+
+        Note that if ``headers`` are supplied, the 'Content-Type' header will be
+        overwritten because it depends on the dynamic random boundary string
+        which is used to compose the body of the request. The random boundary
+        string can be explicitly set with the ``multipart_boundary`` parameter.
+        """
+        if encode_multipart:
+            body, content_type = encode_multipart_formdata(fields or {},
+                                    boundary=multipart_boundary)
+        else:
+            body, content_type = (urlencode(fields or {}),
+                                    'application/x-www-form-urlencoded')
+
+        headers = headers or {}
+        headers.update({'Content-Type': content_type})
+
+        return self.urlopen(method, url, body=body, headers=headers,
+                            **urlopen_kw)
diff --git a/lib/requests/packages/urllib3/request.pyc b/lib/requests/packages/urllib3/request.pyc
new file mode 100644
index 0000000..a48f0c6
Binary files /dev/null and b/lib/requests/packages/urllib3/request.pyc differ
diff --git a/lib/requests/packages/urllib3/response.py b/lib/requests/packages/urllib3/response.py
new file mode 100755
index 0000000..28537d3
--- /dev/null
+++ b/lib/requests/packages/urllib3/response.py
@@ -0,0 +1,202 @@
+# urllib3/response.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import gzip
+import logging
+import zlib
+
+from io import BytesIO
+
+from .exceptions import DecodeError
+from .packages.six import string_types as basestring
+
+
+log = logging.getLogger(__name__)
+
+
+def decode_gzip(data):
+    gzipper = gzip.GzipFile(fileobj=BytesIO(data))
+    return gzipper.read()
+
+
+def decode_deflate(data):
+    try:
+        return zlib.decompress(data)
+    except zlib.error:
+        return zlib.decompress(data, -zlib.MAX_WBITS)
+
+
+class HTTPResponse(object):
+    """
+    HTTP Response container.
+
+    Backwards-compatible to httplib's HTTPResponse but the response ``body`` is
+    loaded and decoded on-demand when the ``data`` property is accessed.
+
+    Extra parameters for behaviour not present in httplib.HTTPResponse:
+
+    :param preload_content:
+        If True, the response's body will be preloaded during construction.
+
+    :param decode_content:
+        If True, attempts to decode specific content-encoding's based on headers
+        (like 'gzip' and 'deflate') will be skipped and raw data will be used
+        instead.
+
+    :param original_response:
+        When this HTTPResponse wrapper is generated from an httplib.HTTPResponse
+        object, it's convenient to include the original for debug purposes. It's
+        otherwise unused.
+    """
+
+    CONTENT_DECODERS = {
+        'gzip': decode_gzip,
+        'deflate': decode_deflate,
+    }
+
+    def __init__(self, body='', headers=None, status=0, version=0, reason=None,
+                 strict=0, preload_content=True, decode_content=True,
+                 original_response=None, pool=None, connection=None):
+        self.headers = headers or {}
+        self.status = status
+        self.version = version
+        self.reason = reason
+        self.strict = strict
+
+        self._decode_content = decode_content
+        self._body = body if body and isinstance(body, basestring) else None
+        self._fp = None
+        self._original_response = original_response
+
+        self._pool = pool
+        self._connection = connection
+
+        if hasattr(body, 'read'):
+            self._fp = body
+
+        if preload_content and not self._body:
+            self._body = self.read(decode_content=decode_content)
+
+    def get_redirect_location(self):
+        """
+        Should we redirect and where to?
+
+        :returns: Truthy redirect location string if we got a redirect status
+            code and valid location. ``None`` if redirect status and no
+            location. ``False`` if not a redirect status code.
+        """
+        if self.status in [301, 302, 303, 307]:
+            return self.headers.get('location')
+
+        return False
+
+    def release_conn(self):
+        if not self._pool or not self._connection:
+            return
+
+        self._pool._put_conn(self._connection)
+        self._connection = None
+
+    @property
+    def data(self):
+        # For backwords-compat with earlier urllib3 0.4 and earlier.
+        if self._body:
+            return self._body
+
+        if self._fp:
+            return self.read(cache_content=True)
+
+    def read(self, amt=None, decode_content=None, cache_content=False):
+        """
+        Similar to :meth:`httplib.HTTPResponse.read`, but with two additional
+        parameters: ``decode_content`` and ``cache_content``.
+
+        :param amt:
+            How much of the content to read. If specified, decoding and caching
+            is skipped because we can't decode partial content nor does it make
+            sense to cache partial content as the full response.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header. (Overridden if ``amt`` is set.)
+
+        :param cache_content:
+            If True, will save the returned data such that the same result is
+            returned despite of the state of the underlying file object. This
+            is useful if you want the ``.data`` property to continue working
+            after having ``.read()`` the file object. (Overridden if ``amt`` is
+            set.)
+        """
+        content_encoding = self.headers.get('content-encoding')
+        decoder = self.CONTENT_DECODERS.get(content_encoding)
+        if decode_content is None:
+            decode_content = self._decode_content
+
+        if self._fp is None:
+            return
+
+        try:
+            if amt is None:
+                # cStringIO doesn't like amt=None
+                data = self._fp.read()
+            else:
+                return self._fp.read(amt)
+
+            try:
+                if decode_content and decoder:
+                    data = decoder(data)
+            except (IOError, zlib.error):
+                raise DecodeError("Received response with content-encoding: %s, but "
+                                  "failed to decode it." % content_encoding)
+
+            if cache_content:
+                self._body = data
+
+            return data
+
+        finally:
+            if self._original_response and self._original_response.isclosed():
+                self.release_conn()
+
+    @classmethod
+    def from_httplib(ResponseCls, r, **response_kw):
+        """
+        Given an :class:`httplib.HTTPResponse` instance ``r``, return a
+        corresponding :class:`urllib3.response.HTTPResponse` object.
+
+        Remaining parameters are passed to the HTTPResponse constructor, along
+        with ``original_response=r``.
+        """
+
+        # Normalize headers between different versions of Python
+        headers = {}
+        for k, v in r.getheaders():
+            # Python 3: Header keys are returned capitalised
+            k = k.lower()
+
+            has_value = headers.get(k)
+            if has_value: # Python 3: Repeating header keys are unmerged.
+                v = ', '.join([has_value, v])
+
+            headers[k] = v
+
+        # HTTPResponse objects in Python 3 don't have a .strict attribute
+        strict = getattr(r, 'strict', 0)
+        return ResponseCls(body=r,
+                           headers=headers,
+                           status=r.status,
+                           version=r.version,
+                           reason=r.reason,
+                           strict=strict,
+                           original_response=r,
+                           **response_kw)
+
+    # Backwards-compatibility methods for httplib.HTTPResponse
+    def getheaders(self):
+        return self.headers
+
+    def getheader(self, name, default=None):
+        return self.headers.get(name, default)
diff --git a/lib/requests/packages/urllib3/response.pyc b/lib/requests/packages/urllib3/response.pyc
new file mode 100644
index 0000000..b2e6396
Binary files /dev/null and b/lib/requests/packages/urllib3/response.pyc differ
diff --git a/lib/requests/packages/urllib3/util.py b/lib/requests/packages/urllib3/util.py
new file mode 100755
index 0000000..8ec990b
--- /dev/null
+++ b/lib/requests/packages/urllib3/util.py
@@ -0,0 +1,252 @@
+# urllib3/util.py
+# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+#
+# This module is part of urllib3 and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+
+from base64 import b64encode
+from collections import namedtuple
+from socket import error as SocketError
+
+try:
+    from select import poll, POLLIN
+except ImportError: # `poll` doesn't exist on OSX and other platforms
+    poll = False
+    try:
+        from select import select
+    except ImportError: # `select` doesn't exist on AppEngine.
+        select = False
+
+from .packages import six
+from .exceptions import LocationParseError
+
+
+class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])):
+    """
+    Datastructure for representing an HTTP URL. Used as a return value for
+    :func:`parse_url`.
+    """
+    slots = ()
+
+    def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None):
+        return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment)
+
+    @property
+    def hostname(self):
+        """For backwards-compatibility with urlparse. We're nice like that."""
+        return self.host
+
+    @property
+    def request_uri(self):
+        """Absolute path including the query string."""
+        uri = self.path or '/'
+
+        if self.query is not None:
+            uri += '?' + self.query
+
+        return uri
+
+
+def split_first(s, delims):
+    """
+    Given a string and an iterable of delimiters, split on the first found
+    delimiter. Return two split parts and the matched delimiter.
+
+    If not found, then the first part is the full input string.
+
+    Example: ::
+
+        >>> split_first('foo/bar?baz', '?/=')
+        ('foo', 'bar?baz', '/')
+        >>> split_first('foo/bar?baz', '123')
+        ('foo/bar?baz', '', None)
+
+    Scales linearly with number of delims. Not ideal for large number of delims.
+    """
+    min_idx = None
+    min_delim = None
+    for d in delims:
+        idx = s.find(d)
+        if idx < 0:
+            continue
+
+        if min_idx is None or idx < min_idx:
+            min_idx = idx
+            min_delim = d
+
+    if min_idx is None or min_idx < 0:
+        return s, '', None
+
+    return s[:min_idx], s[min_idx+1:], min_delim
+
+
+def parse_url(url):
+    """
+    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
+    performed to parse incomplete urls. Fields not provided will be None.
+
+    Partly backwards-compatible with :mod:`urlparse`.
+
+    Example: ::
+
+        >>> parse_url('http://google.com/mail/')
+        Url(scheme='http', host='google.com', port=None, path='/', ...)
+        >>> prase_url('google.com:80')
+        Url(scheme=None, host='google.com', port=80, path=None, ...)
+        >>> prase_url('/foo?bar')
+        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
+    """
+
+    # While this code has overlap with stdlib's urlparse, it is much
+    # simplified for our needs and less annoying.
+    # Additionally, this imeplementations does silly things to be optimal
+    # on CPython.
+
+    scheme = None
+    auth = None
+    host = None
+    port = None
+    path = None
+    fragment = None
+    query = None
+
+    # Scheme
+    if '://' in url:
+        scheme, url = url.split('://', 1)
+
+    # Find the earliest Authority Terminator
+    # (http://tools.ietf.org/html/rfc3986#section-3.2)
+    url, path_, delim = split_first(url, ['/', '?', '#'])
+
+    if delim:
+        # Reassemble the path
+        path = delim + path_
+
+    # Auth
+    if '@' in url:
+        auth, url = url.split('@', 1)
+
+    # IPv6
+    if url and url[0] == '[':
+        host, url = url[1:].split(']', 1)
+
+    # Port
+    if ':' in url:
+        _host, port = url.split(':', 1)
+
+        if not host:
+            host = _host
+
+        if not port.isdigit():
+            raise LocationParseError("Failed to parse: %s" % url)
+
+        port = int(port)
+
+    elif not host and url:
+        host = url
+
+    if not path:
+        return Url(scheme, auth, host, port, path, query, fragment)
+
+    # Fragment
+    if '#' in path:
+        path, fragment = path.split('#', 1)
+
+    # Query
+    if '?' in path:
+        path, query = path.split('?', 1)
+
+    return Url(scheme, auth, host, port, path, query, fragment)
+
+
+def get_host(url):
+    """
+    Deprecated. Use :func:`.parse_url` instead.
+    """
+    p = parse_url(url)
+    return p.scheme or 'http', p.hostname, p.port
+
+
+def make_headers(keep_alive=None, accept_encoding=None, user_agent=None,
+                 basic_auth=None):
+    """
+    Shortcuts for generating request headers.
+
+    :param keep_alive:
+        If ``True``, adds 'connection: keep-alive' header.
+
+    :param accept_encoding:
+        Can be a boolean, list, or string.
+        ``True`` translates to 'gzip,deflate'.
+        List will get joined by comma.
+        String will be used as provided.
+
+    :param user_agent:
+        String representing the user-agent you want, such as
+        "python-urllib3/0.6"
+
+    :param basic_auth:
+        Colon-separated username:password string for 'authorization: basic ...'
+        auth header.
+
+    Example: ::
+
+        >>> make_headers(keep_alive=True, user_agent="Batman/1.0")
+        {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
+        >>> make_headers(accept_encoding=True)
+        {'accept-encoding': 'gzip,deflate'}
+    """
+    headers = {}
+    if accept_encoding:
+        if isinstance(accept_encoding, str):
+            pass
+        elif isinstance(accept_encoding, list):
+            accept_encoding = ','.join(accept_encoding)
+        else:
+            accept_encoding = 'gzip,deflate'
+        headers['accept-encoding'] = accept_encoding
+
+    if user_agent:
+        headers['user-agent'] = user_agent
+
+    if keep_alive:
+        headers['connection'] = 'keep-alive'
+
+    if basic_auth:
+        headers['authorization'] = 'Basic ' + \
+            b64encode(six.b(basic_auth)).decode('utf-8')
+
+    return headers
+
+
+def is_connection_dropped(conn):
+    """
+    Returns True if the connection is dropped and should be closed.
+
+    :param conn:
+        :class:`httplib.HTTPConnection` object.
+
+    Note: For platforms like AppEngine, this will always return ``False`` to
+    let the platform handle connection recycling transparently for us.
+    """
+    sock = getattr(conn, 'sock', False)
+    if not sock: # Platform-specific: AppEngine
+        return False
+
+    if not poll: # Platform-specific
+        if not select: # Platform-specific: AppEngine
+            return False
+
+        try:
+            return select([sock], [], [], 0.0)[0]
+        except SocketError:
+            return True
+
+    # This version is better on platforms that support it.
+    p = poll()
+    p.register(sock, POLLIN)
+    for (fno, ev) in p.poll(0.0):
+        if fno == sock.fileno():
+            # Either data is buffered (bad), or the connection is dropped.
+            return True
diff --git a/lib/requests/packages/urllib3/util.pyc b/lib/requests/packages/urllib3/util.pyc
new file mode 100644
index 0000000..27791dc
Binary files /dev/null and b/lib/requests/packages/urllib3/util.pyc differ
diff --git a/lib/requests/safe_mode.py b/lib/requests/safe_mode.py
new file mode 100755
index 0000000..0fb8d70
--- /dev/null
+++ b/lib/requests/safe_mode.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.safe_mode
+~~~~~~~~~~~~
+
+This module contains a decorator that implements safe_mode.
+
+:copyright: (c) 2012 by Kenneth Reitz.
+:license: ISC, see LICENSE for more details.
+
+"""
+
+from .models import Response
+from .packages.urllib3.response import HTTPResponse
+from .exceptions import RequestException, ConnectionError, HTTPError
+import socket
+
+
+def catch_exceptions_if_in_safe_mode(function):
+    """New implementation of safe_mode. We catch all exceptions at the API level
+    and then return a blank Response object with the error field filled. This decorator
+    wraps request() in api.py.
+    """
+
+    def wrapped(method, url, **kwargs):
+        # if save_mode, we catch exceptions and fill error field
+        if (kwargs.get('config') and kwargs.get('config').get('safe_mode')) or (kwargs.get('session')
+                                            and kwargs.get('session').config.get('safe_mode')):
+            try:
+                return function(method, url, **kwargs)
+            except (RequestException, ConnectionError, HTTPError,
+                    socket.timeout, socket.gaierror) as e:
+                r = Response()
+                r.error = e
+                r.raw = HTTPResponse()  # otherwise, tests fail
+                r.status_code = 0  # with this status_code, content returns None
+                return r
+        return function(method, url, **kwargs)
+    return wrapped
diff --git a/lib/requests/safe_mode.pyc b/lib/requests/safe_mode.pyc
new file mode 100644
index 0000000..41e4bba
Binary files /dev/null and b/lib/requests/safe_mode.pyc differ
diff --git a/lib/requests/sessions.py b/lib/requests/sessions.py
new file mode 100755
index 0000000..f0d4f3c
--- /dev/null
+++ b/lib/requests/sessions.py
@@ -0,0 +1,328 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.session
+~~~~~~~~~~~~~~~~
+
+This module provides a Session object to manage and persist settings across
+requests (cookies, auth, proxies).
+
+"""
+
+from copy import deepcopy
+from .compat import cookielib
+from .cookies import cookiejar_from_dict, remove_cookie_by_name
+from .defaults import defaults
+from .models import Request
+from .hooks import dispatch_hook
+from .utils import header_expand, from_key_val_list
+from .packages.urllib3.poolmanager import PoolManager
+
+
+def merge_kwargs(local_kwarg, default_kwarg):
+    """Merges kwarg dictionaries.
+
+    If a local key in the dictionary is set to None, it will be removed.
+    """
+
+    if default_kwarg is None:
+        return local_kwarg
+
+    if isinstance(local_kwarg, str):
+        return local_kwarg
+
+    if local_kwarg is None:
+        return default_kwarg
+
+    # Bypass if not a dictionary (e.g. timeout)
+    if not hasattr(default_kwarg, 'items'):
+        return local_kwarg
+
+    default_kwarg = from_key_val_list(default_kwarg)
+    local_kwarg = from_key_val_list(local_kwarg)
+
+    # Update new values.
+    kwargs = default_kwarg.copy()
+    kwargs.update(local_kwarg)
+
+    # Remove keys that are set to None.
+    for (k, v) in local_kwarg.items():
+        if v is None:
+            del kwargs[k]
+
+    return kwargs
+
+
+class Session(object):
+    """A Requests session."""
+
+    __attrs__ = [
+        'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks',
+        'params', 'config', 'verify', 'cert', 'prefetch']
+
+    def __init__(self,
+        headers=None,
+        cookies=None,
+        auth=None,
+        timeout=None,
+        proxies=None,
+        hooks=None,
+        params=None,
+        config=None,
+        prefetch=True,
+        verify=True,
+        cert=None):
+
+        self.headers = from_key_val_list(headers or [])
+        self.auth = auth
+        self.timeout = timeout
+        self.proxies = from_key_val_list(proxies or [])
+        self.hooks = from_key_val_list(hooks or {})
+        self.params = from_key_val_list(params or [])
+        self.config = from_key_val_list(config or {})
+        self.prefetch = prefetch
+        self.verify = verify
+        self.cert = cert
+
+        for (k, v) in list(defaults.items()):
+            self.config.setdefault(k, deepcopy(v))
+
+        self.init_poolmanager()
+
+        # Set up a CookieJar to be used by default
+        if isinstance(cookies, cookielib.CookieJar):
+            self.cookies = cookies
+        else:
+            self.cookies = cookiejar_from_dict(cookies)
+
+    def init_poolmanager(self):
+        self.poolmanager = PoolManager(
+            num_pools=self.config.get('pool_connections'),
+            maxsize=self.config.get('pool_maxsize')
+        )
+
+    def __repr__(self):
+        return '<requests-client at 0x%x>' % (id(self))
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
+    def close(self):
+        """Dispose of any internal state.
+
+        Currently, this just closes the PoolManager, which closes pooled
+        connections.
+        """
+        self.poolmanager.clear()
+
+    def request(self, method, url,
+        params=None,
+        data=None,
+        headers=None,
+        cookies=None,
+        files=None,
+        auth=None,
+        timeout=None,
+        allow_redirects=True,
+        proxies=None,
+        hooks=None,
+        return_response=True,
+        config=None,
+        prefetch=None,
+        verify=None,
+        cert=None):
+
+        """Constructs and sends a :class:`Request <Request>`.
+        Returns :class:`Response <Response>` object.
+
+        :param method: method for the new :class:`Request` object.
+        :param url: URL for the new :class:`Request` object.
+        :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
+        :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`.
+        :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
+        :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
+        :param files: (optional) Dictionary of 'filename': file-like-objects for multipart encoding upload.
+        :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth.
+        :param timeout: (optional) Float describing the timeout of the request.
+        :param allow_redirects: (optional) Boolean. Set to True by default.
+        :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
+        :param return_response: (optional) If False, an un-sent Request object will returned.
+        :param config: (optional) A configuration dictionary. See ``request.defaults`` for allowed keys and their default values.
+        :param prefetch: (optional) whether to immediately download the response content. Defaults to ``True``.
+        :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided.
+        :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
+        """
+
+        method = str(method).upper()
+
+        # Default empty dicts for dict params.
+        data = [] if data is None else data
+        files = [] if files is None else files
+        headers = {} if headers is None else headers
+        params = {} if params is None else params
+        hooks = {} if hooks is None else hooks
+        prefetch = prefetch if prefetch is not None else self.prefetch
+
+        # use session's hooks as defaults
+        for key, cb in list(self.hooks.items()):
+            hooks.setdefault(key, cb)
+
+        # Expand header values.
+        if headers:
+            for k, v in list(headers.items() or {}):
+                headers[k] = header_expand(v)
+
+        args = dict(
+            method=method,
+            url=url,
+            data=data,
+            params=from_key_val_list(params),
+            headers=from_key_val_list(headers),
+            cookies=cookies,
+            files=files,
+            auth=auth,
+            hooks=from_key_val_list(hooks),
+            timeout=timeout,
+            allow_redirects=allow_redirects,
+            proxies=from_key_val_list(proxies),
+            config=from_key_val_list(config),
+            prefetch=prefetch,
+            verify=verify,
+            cert=cert,
+            _poolmanager=self.poolmanager
+        )
+
+        # merge session cookies into passed-in ones
+        dead_cookies = None
+        # passed-in cookies must become a CookieJar:
+        if not isinstance(cookies, cookielib.CookieJar):
+            args['cookies'] = cookiejar_from_dict(cookies)
+            # support unsetting cookies that have been passed in with None values
+            # this is only meaningful when `cookies` is a dict ---
+            # for a real CookieJar, the client should use session.cookies.clear()
+            if cookies is not None:
+                dead_cookies = [name for name in cookies if cookies[name] is None]
+        # merge the session's cookies into the passed-in cookies:
+        for cookie in self.cookies:
+            args['cookies'].set_cookie(cookie)
+        # remove the unset cookies from the jar we'll be using with the current request
+        # (but not from the session's own store of cookies):
+        if dead_cookies is not None:
+            for name in dead_cookies:
+                remove_cookie_by_name(args['cookies'], name)
+
+        # Merge local kwargs with session kwargs.
+        for attr in self.__attrs__:
+            # we already merged cookies:
+            if attr == 'cookies':
+                continue
+
+            session_val = getattr(self, attr, None)
+            local_val = args.get(attr)
+            args[attr] = merge_kwargs(local_val, session_val)
+
+        # Arguments manipulation hook.
+        args = dispatch_hook('args', args['hooks'], args)
+
+        # Create the (empty) response.
+        r = Request(**args)
+
+        # Give the response some context.
+        r.session = self
+
+        # Don't send if asked nicely.
+        if not return_response:
+            return r
+
+        # Send the HTTP Request.
+        r.send(prefetch=prefetch)
+
+        # Return the response.
+        return r.response
+
+    def get(self, url, **kwargs):
+        """Sends a GET request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        kwargs.setdefault('allow_redirects', True)
+        return self.request('get', url, **kwargs)
+
+    def options(self, url, **kwargs):
+        """Sends a OPTIONS request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        kwargs.setdefault('allow_redirects', True)
+        return self.request('options', url, **kwargs)
+
+    def head(self, url, **kwargs):
+        """Sends a HEAD request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        kwargs.setdefault('allow_redirects', False)
+        return self.request('head', url, **kwargs)
+
+    def post(self, url, data=None, **kwargs):
+        """Sends a POST request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        return self.request('post', url, data=data, **kwargs)
+
+    def put(self, url, data=None, **kwargs):
+        """Sends a PUT request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        return self.request('put', url, data=data, **kwargs)
+
+    def patch(self, url, data=None, **kwargs):
+        """Sends a PATCH request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        return self.request('patch', url,  data=data, **kwargs)
+
+    def delete(self, url, **kwargs):
+        """Sends a DELETE request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        return self.request('delete', url, **kwargs)
+
+    def __getstate__(self):
+        return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__)
+
+    def __setstate__(self, state):
+        for attr, value in state.items():
+            setattr(self, attr, value)
+
+        self.init_poolmanager()
+
+
+def session(**kwargs):
+    """Returns a :class:`Session` for context-management."""
+
+    return Session(**kwargs)
diff --git a/lib/requests/sessions.pyc b/lib/requests/sessions.pyc
new file mode 100644
index 0000000..a074f0b
Binary files /dev/null and b/lib/requests/sessions.pyc differ
diff --git a/lib/requests/status_codes.py b/lib/requests/status_codes.py
new file mode 100755
index 0000000..e25ecdb
--- /dev/null
+++ b/lib/requests/status_codes.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+
+from .structures import LookupDict
+
+_codes = {
+
+    # Informational.
+    100: ('continue',),
+    101: ('switching_protocols',),
+    102: ('processing',),
+    103: ('checkpoint',),
+    122: ('uri_too_long', 'request_uri_too_long'),
+    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/'),
+    201: ('created',),
+    202: ('accepted',),
+    203: ('non_authoritative_info', 'non_authoritative_information'),
+    204: ('no_content',),
+    205: ('reset_content', 'reset'),
+    206: ('partial_content', 'partial'),
+    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
+    208: ('im_used',),
+
+    # Redirection.
+    300: ('multiple_choices',),
+    301: ('moved_permanently', 'moved', '\\o-'),
+    302: ('found',),
+    303: ('see_other', 'other'),
+    304: ('not_modified',),
+    305: ('use_proxy',),
+    306: ('switch_proxy',),
+    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
+    308: ('resume_incomplete', 'resume'),
+
+    # Client Error.
+    400: ('bad_request', 'bad'),
+    401: ('unauthorized',),
+    402: ('payment_required', 'payment'),
+    403: ('forbidden',),
+    404: ('not_found', '-o-'),
+    405: ('method_not_allowed', 'not_allowed'),
+    406: ('not_acceptable',),
+    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
+    408: ('request_timeout', 'timeout'),
+    409: ('conflict',),
+    410: ('gone',),
+    411: ('length_required',),
+    412: ('precondition_failed', 'precondition'),
+    413: ('request_entity_too_large',),
+    414: ('request_uri_too_large',),
+    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
+    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
+    417: ('expectation_failed',),
+    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
+    422: ('unprocessable_entity', 'unprocessable'),
+    423: ('locked',),
+    424: ('failed_dependency', 'dependency'),
+    425: ('unordered_collection', 'unordered'),
+    426: ('upgrade_required', 'upgrade'),
+    428: ('precondition_required', 'precondition'),
+    429: ('too_many_requests', 'too_many'),
+    431: ('header_fields_too_large', 'fields_too_large'),
+    444: ('no_response', 'none'),
+    449: ('retry_with', 'retry'),
+    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
+    499: ('client_closed_request',),
+
+    # Server Error.
+    500: ('internal_server_error', 'server_error', '/o\\'),
+    501: ('not_implemented',),
+    502: ('bad_gateway',),
+    503: ('service_unavailable', 'unavailable'),
+    504: ('gateway_timeout',),
+    505: ('http_version_not_supported', 'http_version'),
+    506: ('variant_also_negotiates',),
+    507: ('insufficient_storage',),
+    509: ('bandwidth_limit_exceeded', 'bandwidth'),
+    510: ('not_extended',),
+}
+
+codes = LookupDict(name='status_codes')
+
+for (code, titles) in list(_codes.items()):
+    for title in titles:
+        setattr(codes, title, code)
+        if not title.startswith('\\'):
+            setattr(codes, title.upper(), code)
diff --git a/lib/requests/status_codes.pyc b/lib/requests/status_codes.pyc
new file mode 100644
index 0000000..43d9d43
Binary files /dev/null and b/lib/requests/status_codes.pyc differ
diff --git a/lib/requests/structures.py b/lib/requests/structures.py
new file mode 100755
index 0000000..3fda984
--- /dev/null
+++ b/lib/requests/structures.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.structures
+~~~~~~~~~~~~~~~~~~~
+
+Data structures that power Requests.
+
+"""
+
+
+class CaseInsensitiveDict(dict):
+    """Case-insensitive Dictionary
+
+    For example, ``headers['content-encoding']`` will return the
+    value of a ``'Content-Encoding'`` response header."""
+
+    @property
+    def lower_keys(self):
+        if not hasattr(self, '_lower_keys') or not self._lower_keys:
+            self._lower_keys = dict((k.lower(), k) for k in list(self.keys()))
+        return self._lower_keys
+
+    def _clear_lower_keys(self):
+        if hasattr(self, '_lower_keys'):
+            self._lower_keys.clear()
+
+    def __setitem__(self, key, value):
+        dict.__setitem__(self, key, value)
+        self._clear_lower_keys()
+
+    def __delitem__(self, key):
+        dict.__delitem__(self, self.lower_keys.get(key.lower(), key))
+        self._lower_keys.clear()
+
+    def __contains__(self, key):
+        return key.lower() in self.lower_keys
+
+    def __getitem__(self, key):
+        # We allow fall-through here, so values default to None
+        if key in self:
+            return dict.__getitem__(self, self.lower_keys[key.lower()])
+
+    def get(self, key, default=None):
+        if key in self:
+            return self[key]
+        else:
+            return default
+
+
+class LookupDict(dict):
+    """Dictionary lookup object."""
+
+    def __init__(self, name=None):
+        self.name = name
+        super(LookupDict, self).__init__()
+
+    def __repr__(self):
+        return '<lookup \'%s\'>' % (self.name)
+
+    def __getitem__(self, key):
+        # We allow fall-through here, so values default to None
+
+        return self.__dict__.get(key, None)
+
+    def get(self, key, default=None):
+        return self.__dict__.get(key, default)
diff --git a/lib/requests/structures.pyc b/lib/requests/structures.pyc
new file mode 100644
index 0000000..88999cf
Binary files /dev/null and b/lib/requests/structures.pyc differ
diff --git a/lib/requests/utils.py b/lib/requests/utils.py
new file mode 100755
index 0000000..ec9f4d2
--- /dev/null
+++ b/lib/requests/utils.py
@@ -0,0 +1,616 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.utils
+~~~~~~~~~~~~~~
+
+This module provides utility functions that are used within Requests
+that are also useful for external consumption.
+
+"""
+
+import cgi
+import codecs
+import os
+import platform
+import re
+import sys
+import zlib
+from netrc import netrc, NetrcParseError
+
+from . import __version__
+from .compat import parse_http_list as _parse_list_header
+from .compat import quote, quote_plus, urlparse, basestring, bytes, str, OrderedDict
+from .cookies import RequestsCookieJar, cookiejar_from_dict
+
+_hush_pyflakes = (RequestsCookieJar,)
+
+CERTIFI_BUNDLE_PATH = None
+try:
+    # see if requests's own CA certificate bundle is installed
+    from . import certs
+    CERTIFI_BUNDLE_PATH = certs.where()
+except ImportError:
+    pass
+
+NETRC_FILES = ('.netrc', '_netrc')
+
+# common paths for the OS's CA certificate bundle
+POSSIBLE_CA_BUNDLE_PATHS = [
+        # Red Hat, CentOS, Fedora and friends (provided by the ca-certificates package):
+        '/etc/pki/tls/certs/ca-bundle.crt',
+        # Ubuntu, Debian, and friends (provided by the ca-certificates package):
+        '/etc/ssl/certs/ca-certificates.crt',
+        # FreeBSD (provided by the ca_root_nss package):
+        '/usr/local/share/certs/ca-root-nss.crt',
+        # openSUSE (provided by the ca-certificates package), the 'certs' directory is the
+        # preferred way but may not be supported by the SSL module, thus it has 'ca-bundle.pem'
+        # as a fallback (which is generated from pem files in the 'certs' directory):
+        '/etc/ssl/ca-bundle.pem',
+]
+
+
+def get_os_ca_bundle_path():
+    """Try to pick an available CA certificate bundle provided by the OS."""
+    for path in POSSIBLE_CA_BUNDLE_PATHS:
+        if os.path.exists(path):
+            return path
+    return None
+
+# if certifi is installed, use its CA bundle;
+# otherwise, try and use the OS bundle
+DEFAULT_CA_BUNDLE_PATH = CERTIFI_BUNDLE_PATH or get_os_ca_bundle_path()
+
+
+def dict_to_sequence(d):
+    """Returns an internal sequence dictionary update."""
+
+    if hasattr(d, 'items'):
+        d = d.items()
+
+    return d
+
+
+def get_netrc_auth(url):
+    """Returns the Requests tuple auth for a given url from netrc."""
+
+    try:
+        locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES)
+        netrc_path = None
+
+        for loc in locations:
+            if os.path.exists(loc) and not netrc_path:
+                netrc_path = loc
+
+        # Abort early if there isn't one.
+        if netrc_path is None:
+            return netrc_path
+
+        ri = urlparse(url)
+
+        # Strip port numbers from netloc
+        host = ri.netloc.split(':')[0]
+
+        try:
+            _netrc = netrc(netrc_path).authenticators(host)
+            if _netrc:
+                # Return with login / password
+                login_i = (0 if _netrc[0] else 1)
+                return (_netrc[login_i], _netrc[2])
+        except (NetrcParseError, IOError):
+            # If there was a parsing error or a permissions issue reading the file,
+            # we'll just skip netrc auth
+            pass
+
+    # AppEngine hackiness.
+    except (ImportError, AttributeError):
+        pass
+
+
+def guess_filename(obj):
+    """Tries to guess the filename of the given object."""
+    name = getattr(obj, 'name', None)
+    if name and name[0] != '<' and name[-1] != '>':
+        return name
+
+
+def from_key_val_list(value):
+    """Take an object and test to see if it can be represented as a
+    dictionary. Unless it can not be represented as such, return an
+    OrderedDict, e.g.,
+
+    ::
+
+        >>> from_key_val_list([('key', 'val')])
+        OrderedDict([('key', 'val')])
+        >>> from_key_val_list('string')
+        ValueError: need more than 1 value to unpack
+        >>> from_key_val_list({'key': 'val'})
+        OrderedDict([('key', 'val')])
+    """
+    if value is None:
+        return None
+
+    if isinstance(value, (str, bytes, bool, int)):
+        raise ValueError('cannot encode objects that are not 2-tuples')
+
+    return OrderedDict(value)
+
+
+def to_key_val_list(value):
+    """Take an object and test to see if it can be represented as a
+    dictionary. If it can be, return a list of tuples, e.g.,
+
+    ::
+
+        >>> to_key_val_list([('key', 'val')])
+        [('key', 'val')]
+        >>> to_key_val_list({'key': 'val'})
+        [('key', 'val')]
+        >>> to_key_val_list('string')
+        ValueError: cannot encode objects that are not 2-tuples.
+    """
+    if value is None:
+        return None
+
+    if isinstance(value, (str, bytes, bool, int)):
+        raise ValueError('cannot encode objects that are not 2-tuples')
+
+    if isinstance(value, dict):
+        value = value.items()
+
+    return list(value)
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def parse_list_header(value):
+    """Parse lists as described by RFC 2068 Section 2.
+
+    In particular, parse comma-separated lists where the elements of
+    the list may include quoted-strings.  A quoted-string could
+    contain a comma.  A non-quoted string could have quotes in the
+    middle.  Quotes are removed automatically after parsing.
+
+    It basically works like :func:`parse_set_header` just that items
+    may appear multiple times and case sensitivity is preserved.
+
+    The return value is a standard :class:`list`:
+
+    >>> parse_list_header('token, "quoted value"')
+    ['token', 'quoted value']
+
+    To create a header from the :class:`list` again, use the
+    :func:`dump_header` function.
+
+    :param value: a string with a list header.
+    :return: :class:`list`
+    """
+    result = []
+    for item in _parse_list_header(value):
+        if item[:1] == item[-1:] == '"':
+            item = unquote_header_value(item[1:-1])
+        result.append(item)
+    return result
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def parse_dict_header(value):
+    """Parse lists of key, value pairs as described by RFC 2068 Section 2 and
+    convert them into a python dict:
+
+    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
+    >>> type(d) is dict
+    True
+    >>> sorted(d.items())
+    [('bar', 'as well'), ('foo', 'is a fish')]
+
+    If there is no value for a key it will be `None`:
+
+    >>> parse_dict_header('key_without_value')
+    {'key_without_value': None}
+
+    To create a header from the :class:`dict` again, use the
+    :func:`dump_header` function.
+
+    :param value: a string with a dict header.
+    :return: :class:`dict`
+    """
+    result = {}
+    for item in _parse_list_header(value):
+        if '=' not in item:
+            result[item] = None
+            continue
+        name, value = item.split('=', 1)
+        if value[:1] == value[-1:] == '"':
+            value = unquote_header_value(value[1:-1])
+        result[name] = value
+    return result
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def unquote_header_value(value, is_filename=False):
+    r"""Unquotes a header value.  (Reversal of :func:`quote_header_value`).
+    This does not use the real unquoting but what browsers are actually
+    using for quoting.
+
+    :param value: the header value to unquote.
+    """
+    if value and value[0] == value[-1] == '"':
+        # this is not the real unquoting, but fixing this so that the
+        # RFC is met will result in bugs with internet explorer and
+        # probably some other browsers as well.  IE for example is
+        # uploading files with "C:\foo\bar.txt" as filename
+        value = value[1:-1]
+
+        # if this is a filename and the starting characters look like
+        # a UNC path, then just return the value without quotes.  Using the
+        # replace sequence below on a UNC path has the effect of turning
+        # the leading double slash into a single slash and then
+        # _fix_ie_filename() doesn't work correctly.  See #458.
+        if not is_filename or value[:2] != '\\\\':
+            return value.replace('\\\\', '\\').replace('\\"', '"')
+    return value
+
+
+def header_expand(headers):
+    """Returns an HTTP Header value string from a dictionary.
+
+    Example expansion::
+
+        {'text/x-dvi': {'q': '.8', 'mxb': '100000', 'mxt': '5.0'}, 'text/x-c': {}}
+        # Accept: text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c
+
+        (('text/x-dvi', {'q': '.8', 'mxb': '100000', 'mxt': '5.0'}), ('text/x-c', {}))
+        # Accept: text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c
+    """
+
+    collector = []
+
+    if isinstance(headers, dict):
+        headers = list(headers.items())
+    elif isinstance(headers, basestring):
+        return headers
+    elif isinstance(headers, str):
+        # As discussed in https://github.com/kennethreitz/requests/issues/400
+        # latin-1 is the most conservative encoding used on the web. Anyone
+        # who needs more can encode to a byte-string before calling
+        return headers.encode("latin-1")
+    elif headers is None:
+        return headers
+
+    for i, (value, params) in enumerate(headers):
+
+        _params = []
+
+        for (p_k, p_v) in list(params.items()):
+
+            _params.append('%s=%s' % (p_k, p_v))
+
+        collector.append(value)
+        collector.append('; ')
+
+        if len(params):
+
+            collector.append('; '.join(_params))
+
+            if not len(headers) == i + 1:
+                collector.append(', ')
+
+    # Remove trailing separators.
+    if collector[-1] in (', ', '; '):
+        del collector[-1]
+
+    return ''.join(collector)
+
+
+def dict_from_cookiejar(cj):
+    """Returns a key/value dictionary from a CookieJar.
+
+    :param cj: CookieJar object to extract cookies from.
+    """
+
+    cookie_dict = {}
+
+    for cookie in cj:
+        cookie_dict[cookie.name] = cookie.value
+
+    return cookie_dict
+
+
+def add_dict_to_cookiejar(cj, cookie_dict):
+    """Returns a CookieJar from a key/value dictionary.
+
+    :param cj: CookieJar to insert cookies into.
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
+    """
+
+    cj2 = cookiejar_from_dict(cookie_dict)
+    for cookie in cj2:
+        cj.set_cookie(cookie)
+    return cj
+
+
+def get_encodings_from_content(content):
+    """Returns encodings from given content string.
+
+    :param content: bytestring to extract encodings from.
+    """
+
+    charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I)
+
+    return charset_re.findall(content)
+
+
+def get_encoding_from_headers(headers):
+    """Returns encodings from given HTTP Header Dict.
+
+    :param headers: dictionary to extract encoding from.
+    """
+
+    content_type = headers.get('content-type')
+
+    if not content_type:
+        return None
+
+    content_type, params = cgi.parse_header(content_type)
+
+    if 'charset' in params:
+        return params['charset'].strip("'\"")
+
+    if 'text' in content_type:
+        return 'ISO-8859-1'
+
+
+def stream_decode_response_unicode(iterator, r):
+    """Stream decodes a iterator."""
+
+    if r.encoding is None:
+        for item in iterator:
+            yield item
+        return
+
+    decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace')
+    for chunk in iterator:
+        rv = decoder.decode(chunk)
+        if rv:
+            yield rv
+    rv = decoder.decode('', final=True)
+    if rv:
+        yield rv
+
+
+def iter_slices(string, slice_length):
+    """Iterate over slices of a string."""
+    pos = 0
+    while pos < len(string):
+        yield string[pos:pos + slice_length]
+        pos += slice_length
+
+
+def get_unicode_from_response(r):
+    """Returns the requested content back in unicode.
+
+    :param r: Response object to get unicode content from.
+
+    Tried:
+
+    1. charset from content-type
+
+    2. every encodings from ``<meta ... charset=XXX>``
+
+    3. fall back and replace all unicode characters
+
+    """
+
+    tried_encodings = []
+
+    # Try charset from content-type
+    encoding = get_encoding_from_headers(r.headers)
+
+    if encoding:
+        try:
+            return str(r.content, encoding)
+        except UnicodeError:
+            tried_encodings.append(encoding)
+
+    # Fall back:
+    try:
+        return str(r.content, encoding, errors='replace')
+    except TypeError:
+        return r.content
+
+
+def stream_decompress(iterator, mode='gzip'):
+    """
+    Stream decodes an iterator over compressed data
+
+    :param iterator: An iterator over compressed data
+    :param mode: 'gzip' or 'deflate'
+    :return: An iterator over decompressed data
+    """
+
+    if mode not in ['gzip', 'deflate']:
+        raise ValueError('stream_decompress mode must be gzip or deflate')
+
+    zlib_mode = 16 + zlib.MAX_WBITS if mode == 'gzip' else -zlib.MAX_WBITS
+    dec = zlib.decompressobj(zlib_mode)
+    try:
+        for chunk in iterator:
+            rv = dec.decompress(chunk)
+            if rv:
+                yield rv
+    except zlib.error:
+        # If there was an error decompressing, just return the raw chunk
+        yield chunk
+        # Continue to return the rest of the raw data
+        for chunk in iterator:
+            yield chunk
+    else:
+        # Make sure everything has been returned from the decompression object
+        buf = dec.decompress(bytes())
+        rv = buf + dec.flush()
+        if rv:
+            yield rv
+
+
+def stream_untransfer(gen, resp):
+    ce = resp.headers.get('content-encoding', '').lower()
+    if 'gzip' in ce:
+        gen = stream_decompress(gen, mode='gzip')
+    elif 'deflate' in ce:
+        gen = stream_decompress(gen, mode='deflate')
+
+    return gen
+
+
+# The unreserved URI characters (RFC 3986)
+UNRESERVED_SET = frozenset(
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+    + "0123456789-._~")
+
+
+def unquote_unreserved(uri):
+    """Un-escape any percent-escape sequences in a URI that are unreserved
+    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
+    """
+    try:
+        parts = uri.split('%')
+        for i in range(1, len(parts)):
+            h = parts[i][0:2]
+            if len(h) == 2 and h.isalnum():
+                c = chr(int(h, 16))
+                if c in UNRESERVED_SET:
+                    parts[i] = c + parts[i][2:]
+                else:
+                    parts[i] = '%' + parts[i]
+            else:
+                parts[i] = '%' + parts[i]
+        return ''.join(parts)
+    except ValueError:
+        return uri
+
+
+def requote_uri(uri):
+    """Re-quote the given URI.
+
+    This function passes the given URI through an unquote/quote cycle to
+    ensure that it is fully and consistently quoted.
+    """
+    # Unquote only the unreserved characters
+    # Then quote only illegal characters (do not quote reserved, unreserved,
+    # or '%')
+    return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~")
+
+
+def get_environ_proxies():
+    """Return a dict of environment proxies."""
+
+    proxy_keys = [
+        'all',
+        'http',
+        'https',
+        'ftp',
+        'socks',
+        'no'
+    ]
+
+    get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper())
+    proxies = [(key, get_proxy(key + '_proxy')) for key in proxy_keys]
+    return dict([(key, val) for (key, val) in proxies if val])
+
+
+def default_user_agent():
+    """Return a string representing the default user agent."""
+    _implementation = platform.python_implementation()
+
+    if _implementation == 'CPython':
+        _implementation_version = platform.python_version()
+    elif _implementation == 'PyPy':
+        _implementation_version = '%s.%s.%s' % (
+                                                sys.pypy_version_info.major,
+                                                sys.pypy_version_info.minor,
+                                                sys.pypy_version_info.micro
+                                            )
+        if sys.pypy_version_info.releaselevel != 'final':
+            _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel])
+    elif _implementation == 'Jython':
+        _implementation_version = platform.python_version()  # Complete Guess
+    elif _implementation == 'IronPython':
+        _implementation_version = platform.python_version()  # Complete Guess
+    else:
+        _implementation_version = 'Unknown'
+
+    return " ".join([
+            'python-requests/%s' % __version__,
+            '%s/%s' % (_implementation, _implementation_version),
+            '%s/%s' % (platform.system(), platform.release()),
+        ])
+
+
+def parse_header_links(value):
+    """Return a dict of parsed link headers proxies.
+
+    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"
+
+    """
+
+    links = []
+
+    replace_chars = " '\""
+
+    for val in value.split(","):
+        try:
+            url, params = val.split(";", 1)
+        except ValueError:
+            url, params = val, ''
+
+        link = {}
+
+        link["url"] = url.strip("<> '\"")
+
+        for param in params.split(";"):
+            try:
+                key,value = param.split("=")
+            except ValueError:
+                break
+
+            link[key.strip(replace_chars)] = value.strip(replace_chars)
+
+        links.append(link)
+
+    return links
+
+
+# Null bytes; no need to recreate these on each call to guess_json_utf
+_null = '\x00'.encode('ascii')  # encoding to ASCII for Python 3
+_null2 = _null * 2
+_null3 = _null * 3
+
+
+def guess_json_utf(data):
+    # JSON always starts with two ASCII characters, so detection is as
+    # easy as counting the nulls and from their location and count
+    # determine the encoding. Also detect a BOM, if present.
+    sample = data[:4]
+    if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE):
+        return 'utf-32'     # BOM included
+    if sample[:3] == codecs.BOM_UTF8:
+        return 'utf-8-sig'  # BOM included, MS style (discouraged)
+    if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE):
+        return 'utf-16'     # BOM included
+    nullcount = sample.count(_null)
+    if nullcount == 0:
+        return 'utf-8'
+    if nullcount == 2:
+        if sample[::2] == _null2:   # 1st and 3rd are null
+            return 'utf-16-be'
+        if sample[1::2] == _null2:  # 2nd and 4th are null
+            return 'utf-16-le'
+        # Did not detect 2 valid UTF-16 ascii-range characters
+    if nullcount == 3:
+        if sample[:3] == _null3:
+            return 'utf-32-be'
+        if sample[1:] == _null3:
+            return 'utf-32-le'
+        # Did not detect a valid UTF-32 ascii-range character
+    return None
diff --git a/lib/requests/utils.pyc b/lib/requests/utils.pyc
new file mode 100644
index 0000000..c7ea8a7
Binary files /dev/null and b/lib/requests/utils.pyc differ
diff --git a/logs/wa.log b/logs/wa.log
new file mode 100644
index 0000000..115f812
--- /dev/null
+++ b/logs/wa.log
@@ -0,0 +1,83 @@
+2014-02-12 14:30:31,385: istsos - INFO - Executing GET on /wa/istsos/operations/initialization: Your istsos has been initializated
+2014-02-12 14:30:31,781: istsos - INFO - Executing GET on /wa/istsos/services: Services list successfully retrived: found [0] services
+2014-02-12 14:30:31,805: istsos - INFO - Executing GET on /wa/istsos/operations/status: Serverstatus request successfully executed
+2014-02-12 14:30:36,767: istsos - INFO - Executing GET on /wa/istsos/services/default/configsections/connection: Information successfully retrived
+2014-02-12 14:31:07,377: istsos - ERROR - Executing POST on /wa/istsos/services: schema "milan" already exists
+
+2014-02-12 14:31:07,538: istsos - INFO - Executing GET on /wa/istsos/services: Services list successfully retrived: found [1] services
+2014-02-12 14:31:09,256: istsos - INFO - Executing GET on /wa/istsos/operations/status: Serverstatus request successfully executed
+2014-02-12 14:31:15,573: istsos - INFO - Executing GET on /wa/istsos/services/default/configsections: List of sections successfully returned
+2014-02-12 14:31:15,754: istsos - INFO - Executing GET on /wa/istsos/services: Services list successfully retrived: found [1] services
+2014-02-12 14:31:19,965: istsos - INFO - Executing DELETE on /wa/istsos/services/milan: Service <milan> correctly deleted
+2014-02-12 14:31:20,008: istsos - INFO - Executing GET on /wa/istsos/services: Services list successfully retrived: found [0] services
+2014-02-12 14:31:20,115: istsos - INFO - Executing GET on /wa/istsos/services: Services list successfully retrived: found [0] services
+2014-02-12 14:31:20,327: istsos - INFO - Executing GET on /wa/istsos/operations/status: Serverstatus request successfully executed
+2014-02-12 14:31:26,323: istsos - INFO - Executing GET on /wa/istsos/services/default/configsections/connection: Information successfully retrived
+2014-02-12 14:31:36,497: istsos - INFO - Executing POST on /wa/istsos/services: New service <istzoz> correctly created
+2014-02-12 14:31:36,510: istsos - INFO - Executing GET on /wa/istsos/services: Services list successfully retrived: found [1] services
+2014-02-12 14:31:36,913: istsos - INFO - Executing GET on /wa/istsos/operations/status: Serverstatus request successfully executed
+2014-02-12 14:31:45,972: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/configsections: List of sections successfully returned
+2014-02-12 14:31:46,038: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/configsections/serviceurl: Information successfully retrived
+2014-02-12 14:32:01,507: istsos - INFO - Executing GET on /wa/istsos/services/default/configsections: List of sections successfully returned
+2014-02-12 14:32:01,884: istsos - INFO - Executing GET on /wa/istsos/operations/status: Serverstatus request successfully executed
+2014-02-12 14:34:06,884: istsos - INFO - Executing GET on /wa/istsos/services/default/configsections: List of sections successfully returned
+2014-02-12 14:34:07,417: istsos - INFO - Executing GET on /wa/istsos/operations/status: Serverstatus request successfully executed
+2014-02-12 14:35:04,159: istsos - ERROR - Executing GET on /wa/istsos/services/istzoz/procedures/T_TRE: Error loading DescribeSensor of 'T_TRE' [STATUS CODE: 200]: 'sml'
+2014-02-12 14:35:04,615: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/procedures: <?xml version="1.0" encoding="UTF-8"?>
+<sos:RegisterSensorResponse
+     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+     xmlns:sos="http://www.opengis.net/sos/1.0">
+<AssignedSensorId>urn:ogc:def:sensor:x-istsos:1.0:30b203f161a2d09448dc7cc9dc97c75d</AssignedSensorId>
+</sos:RegisterSensorResponse>
+2014-02-12 14:35:04,940: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/procedures/T_TRE: Sensor Description successfully loaded
+2014-02-12 14:35:05,215: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/operations/getobservation/offerings/temporary/procedures/T_TRE/observedproperties/urn/eventtime/last: GetObservation requested successfully executed
+2014-02-12 14:35:07,838: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>1 at 2@3 at 4@5 at 6@7 at 8@9 at 10@11 at 12@13 at 14@15 at 16@17 at 18@19 at 20@21 at 22@23 at 24@25 at 26@27 at 28@29 at 30@31 at 32@33 at 34@35 at 36@37 at 38@39 at 40@41 at 42@43 at 44@45 at 46@47 at 48@49 at 50@51 at 52@53 at 54@55 at 56@57 at 58@59 at 60@61 at 62@63 at 64@65 at 66@67 at 68@69 at 70@71 at 72@73 at 74@75 at 76@77 at 78@79 at 80@ [...]
+2014-02-12 14:35:10,489: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>248 at 249@250 at 251@252 at 253@254 at 255@256 at 257@258 at 259@260 at 261@262 at 263@264 at 265@266 at 267@268 at 269@270 at 271@272 at 273@274 at 275@276 at 277@278 at 279@280 at 281@282 at 283@284 at 285@286 at 287@288 at 289@290 at 291@292 at 293@294 at 295@296 at 297@298 at 299@300 at 301@302 at 303@304 at 305 [...]
+2014-02-12 14:35:12,729: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>968 at 969@970 at 971@972 at 973@974 at 975@976 at 977@978 at 979@980 at 981@982 at 983@984 at 985@986 at 987@988 at 989@990 at 991@992 at 993@994 at 995@996 at 997@998 at 999@1000 at 1001@1002 at 1003@1004 at 1005@1006 at 1007@1008 at 1009@1010 at 1011@1012 at 1013@1014 at 1015@1016 at 1017@1018 at 1019@102 [...]
+2014-02-12 14:35:14,148: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/configsections: List of sections successfully returned
+2014-02-12 14:35:14,617: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/procedures/operations/getlist: Procedures of service <istzoz> successfully retrived
+2014-02-12 14:35:15,506: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>1736 at 1737@1738 at 1739@1740 at 1741@1742 at 1743@1744 at 1745@1746 at 1747@1748 at 1749@1750 at 1751@1752 at 1753@1754 at 1755@1756 at 1757@1758 at 1759@1760 at 1761@1762 at 1763@1764 at 1765@1766 at 1767@1768 at 1769@1770 at 1771@1772 at 1773@1774 at 1775@1776 at 1777@1778 at 1779@1780 at 1781@1 [...]
+2014-02-12 14:35:17,058: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/configsections: List of sections successfully returned
+2014-02-12 14:35:18,045: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>2552 at 2553@2554 at 2555@2556 at 2557@2558 at 2559@2560 at 2561@2562 at 2563@2564 at 2565@2566 at 2567@2568 at 2569@2570 at 2571@2572 at 2573@2574 at 2575@2576 at 2577@2578 at 2579@2580 at 2581@2582 at 2583@2584 at 2585@2586 at 2587@2588 at 2589@2590 at 2591@2592 at 2593@2594 at 2595@2596 at 2597@2 [...]
+2014-02-12 14:35:18,212: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/procedures/T_TRE: Sensor Description successfully loaded
+2014-02-12 14:35:18,708: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/systemtypes: System type of service <istzoz> successfully retrived
+2014-02-12 14:35:18,736: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/epsgs: List of valid EPSG codes of service <istzoz> successfully retrived
+2014-02-12 14:35:20,733: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>3416 at 3417@3418 at 3419@3420 at 3421@3422 at 3423@3424 at 3425@3426 at 3427@3428 at 3429@3430 at 3431@3432 at 3433@3434 at 3435@3436 at 3437@3438 at 3439@3440 at 3441@3442 at 3443@3444 at 3445@3446 at 3447@3448 at 3449@3450 at 3451@3452 at 3453@3454 at 3455@3456 at 3457@3458 at 3459@3460 at 3461@3 [...]
+2014-02-12 14:35:23,365: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>4328 at 4329@4330 at 4331@4332 at 4333@4334 at 4335@4336 at 4337@4338 at 4339@4340 at 4341@4342 at 4343@4344 at 4345@4346 at 4347@4348 at 4349@4350 at 4351@4352 at 4353@4354 at 4355@4356 at 4357@4358 at 4359@4360 at 4361@4362 at 4363@4364 at 4365@4366 at 4367@4368 at 4369@4370 at 4371@4372 at 4373@4 [...]
+2014-02-12 14:35:26,197: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>5288 at 5289@5290 at 5291@5292 at 5293@5294 at 5295@5296 at 5297@5298 at 5299@5300 at 5301@5302 at 5303@5304 at 5305@5306 at 5307@5308 at 5309@5310 at 5311@5312 at 5313@5314 at 5315@5316 at 5317@5318 at 5319@5320 at 5321@5322 at 5323@5324 at 5325@5326 at 5327@5328 at 5329@5330 at 5331@5332 at 5333@5 [...]
+2014-02-12 14:35:28,994: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>6296 at 6297@6298 at 6299@6300 at 6301@6302 at 6303@6304 at 6305@6306 at 6307@6308 at 6309@6310 at 6311@6312 at 6313@6314 at 6315@6316 at 6317@6318 at 6319@6320 at 6321@6322 at 6323@6324 at 6325@6326 at 6327@6328 at 6329@6330 at 6331@6332 at 6333@6334 at 6335@6336 at 6337@6338 at 6339@6340 at 6341@6 [...]
+2014-02-12 14:35:34,513: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>7352 at 7353@7354 at 7355@7356 at 7357@7358 at 7359@7360 at 7361@7362 at 7363@7364 at 7365@7366 at 7367@7368 at 7369@7370 at 7371@7372 at 7373@7374 at 7375@7376 at 7377@7378 at 7379@7380 at 7381@7382 at 7383@7384 at 7385@7386 at 7387@7388 at 7389@7390 at 7391@7392 at 7393@7394 at 7395@7396 at 7397@7 [...]
+2014-02-12 14:35:41,060: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>10221 at 10222@10223 at 10224@10225 at 10226@10227 at 10228@10229 at 10230@10231 at 10232@10233 at 10234@10235 at 10236@10237 at 10238@10239 at 10240@10241 at 10242@10243 at 10244@10245 at 10246@10247 at 10248@10249 at 10250@10251 at 10252@10253 at 10254@10255 at 10256@10257 at 10258@102 [...]
+2014-02-12 14:35:47,207: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>13677 at 13678@13679 at 13680@13681 at 13682@13683 at 13684@13685 at 13686@13687 at 13688@13689 at 13690@13691 at 13692@13693 at 13694@13695 at 13696@13697 at 13698@13699 at 13700@13701 at 13702@13703 at 13704@13705 at 13706@13707 at 13708@13709 at 13710@13711 at 13712@13713 at 13714@137 [...]
+2014-02-12 14:35:53,449: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>17258 at 17259@17260 at 17261@17262 at 17263@17264 at 17265@17266 at 17267@17268 at 17269@17270 at 17271@17272 at 17273@17274 at 17275@17276 at 17277@17278 at 17279@17280 at 17281@17282 at 17283@17284 at 17285@17286 at 17287@17288 at 17289@17290 at 17291@17292 at 17293@17294 at 17295@172 [...]
+2014-02-12 14:35:59,007: istsos - INFO - Executing GET on /wa/istsos/services: Services list successfully retrived: found [1] services
+2014-02-12 14:35:59,270: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>21001 at 21002@21003 at 21004@21005 at 21006@21007 at 21008@21009 at 21010@21011 at 21012@21013 at 21014@21015 at 21016@21017 at 21018@21019 at 21020@21021 at 21022@21023 at 21024@21025 at 21026@21027 at 21028@21029 at 21030@21031 at 21032@21033 at 21034@21035 at 21036@21037 at 21038@210 [...]
+2014-02-12 14:35:59,593: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/offerings/operations/getlist: Offerings names of service "istzoz" successfully retrived
+2014-02-12 14:36:01,025: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/offerings/temporary/procedures/operations/memberslist: Offerings names of service <istzoz> successfully retrived
+2014-02-12 14:36:02,495: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/configsections: List of sections successfully returned
+2014-02-12 14:36:02,578: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/procedures/T_TRE: Sensor Description successfully loaded
+2014-02-12 14:36:04,082: istsos - INFO - Executing GET on /wa/istsos/services/istzoz/operations/getobservation/offerings/temporary/procedures/T_TRE/observedproperties/urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature/eventtime/2008-08-09T00:00:00+02:00/2008-08-16T00:00:00+02:00: GetObservation requested successfully executed
+2014-02-12 14:36:05,126: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>24889 at 24890@24891 at 24892@24893 at 24894@24895 at 24896@24897 at 24898@24899 at 24900@24901 at 24902@24903 at 24904@24905 at 24906@24907 at 24908@24909 at 24910@24911 at 24912@24913 at 24914@24915 at 24916@24917 at 24918@24919 at 24920@24921 at 24922@24923 at 24924@24925 at 24926@249 [...]
+2014-02-12 14:36:11,738: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>28921 at 28922@28923 at 28924@28925 at 28926@28927 at 28928@28929 at 28930@28931 at 28932@28933 at 28934@28935 at 28936@28937 at 28938@28939 at 28940@28941 at 28942@28943 at 28944@28945 at 28946@28947 at 28948@28949 at 28950@28951 at 28952@28953 at 28954@28955 at 28956@28957 at 28958@289 [...]
+2014-02-12 14:36:18,383: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>33097 at 33098@33099 at 33100@33101 at 33102@33103 at 33104@33105 at 33106@33107 at 33108@33109 at 33110@33111 at 33112@33113 at 33114@33115 at 33116@33117 at 33118@33119 at 33120@33121 at 33122@33123 at 33124@33125 at 33126@33127 at 33128@33129 at 33130@33131 at 33132@33133 at 33134@331 [...]
+2014-02-12 14:36:26,001: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>37417 at 37418@37419 at 37420@37421 at 37422@37423 at 37424@37425 at 37426@37427 at 37428@37429 at 37430@37431 at 37432@37433 at 37434@37435 at 37436@37437 at 37438@37439 at 37440@37441 at 37442@37443 at 37444@37445 at 37446@37447 at 37448@37449 at 37450@37451 at 37452@37453 at 37454@374 [...]
+2014-02-12 14:36:34,499: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>41881 at 41882@41883 at 41884@41885 at 41886@41887 at 41888@41889 at 41890@41891 at 41892@41893 at 41894@41895 at 41896@41897 at 41898@41899 at 41900@41901 at 41902@41903 at 41904@41905 at 41906@41907 at 41908@41909 at 41910@41911 at 41912@41913 at 41914@41915 at 41916@41917 at 41918@419 [...]
+2014-02-12 14:36:41,795: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>46489 at 46490@46491 at 46492@46493 at 46494@46495 at 46496@46497 at 46498@46499 at 46500@46501 at 46502@46503 at 46504@46505 at 46506@46507 at 46508@46509 at 46510@46511 at 46512@46513 at 46514@46515 at 46516@46517 at 46518@46519 at 46520@46521 at 46522@46523 at 46524@46525 at 46526@465 [...]
+2014-02-12 14:36:49,628: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>51241 at 51242@51243 at 51244@51245 at 51246@51247 at 51248@51249 at 51250@51251 at 51252@51253 at 51254@51255 at 51256@51257 at 51258@51259 at 51260@51261 at 51262@51263 at 51264@51265 at 51266@51267 at 51268@51269 at 51270@51271 at 51272@51273 at 51274@51275 at 51276@51277 at 51278@512 [...]
+2014-02-12 14:36:58,017: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>56137 at 56138@56139 at 56140@56141 at 56142@56143 at 56144@56145 at 56146@56147 at 56148@56149 at 56150@56151 at 56152@56153 at 56154@56155 at 56156@56157 at 56158@56159 at 56160@56161 at 56162@56163 at 56164@56165 at 56166@56167 at 56168@56169 at 56170@56171 at 56172@56173 at 56174@561 [...]
+2014-02-12 14:37:05,196: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>61177 at 61178@61179 at 61180@61181 at 61182@61183 at 61184@61185 at 61186@61187 at 61188@61189 at 61190@61191 at 61192@61193 at 61194@61195 at 61196@61197 at 61198@61199 at 61200@61201 at 61202@61203 at 61204@61205 at 61206@61207 at 61208@61209 at 61210@61211 at 61212@61213 at 61214@612 [...]
+2014-02-12 14:37:14,545: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>66360 at 66361@66362 at 66363@66364 at 66365@66366 at 66367@66368 at 66369@66370 at 66371@66372 at 66373@66374 at 66375@66376 at 66377@66378 at 66379@66380 at 66381@66382 at 66383@66384 at 66385@66386 at 66387@66388 at 66389@66390 at 66391@66392 at 66393@66394 at 66395@66396 at 66397@663 [...]
+2014-02-12 14:37:23,026: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>71688 at 71689@71690 at 71691@71692 at 71693@71694 at 71695@71696 at 71697@71698 at 71699@71700 at 71701@71702 at 71703@71704 at 71705@71706 at 71707@71708 at 71709@71710 at 71711@71712 at 71713@71714 at 71715@71716 at 71717@71718 at 71719@71720 at 71721@71722 at 71723@71724 at 71725@717 [...]
+2014-02-12 14:37:30,323: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>77160 at 77161@77162 at 77163@77164 at 77165@77166 at 77167@77168 at 77169@77170 at 77171@77172 at 77173@77174 at 77175@77176 at 77177@77178 at 77179@77180 at 77181@77182 at 77183@77184 at 77185@77186 at 77187@77188 at 77189@77190 at 77191@77192 at 77193@77194 at 77195@77196 at 77197@771 [...]
+2014-02-12 14:37:36,587: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>82776 at 82777@82778 at 82779@82780 at 82781@82782 at 82783@82784 at 82785@82786 at 82787@82788 at 82789@82790 at 82791@82792 at 82793@82794 at 82795@82796 at 82797@82798 at 82799@82800 at 82801@82802 at 82803@82804 at 82805@82806 at 82807@82808 at 82809@82810 at 82811@82812 at 82813@828 [...]
+2014-02-12 14:37:44,556: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>88535 at 88536@88537 at 88538@88539 at 88540@88541 at 88542@88543 at 88544@88545 at 88546@88547 at 88548@88549 at 88550@88551 at 88552@88553 at 88554@88555 at 88556@88557 at 88558@88559 at 88560@88561 at 88562@88563 at 88564@88565 at 88566@88567 at 88568@88569 at 88570@88571 at 88572@885 [...]
+2014-02-12 14:37:51,702: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>94439 at 94440@94441 at 94442@94443 at 94444@94445 at 94446@94447 at 94448@94449 at 94450@94451 at 94452@94453 at 94454@94455 at 94456@94457 at 94458@94459 at 94460@94461 at 94462@94463 at 94464@94465 at 94466@94467 at 94468@94469 at 94470@94471 at 94472@94473 at 94474@94475 at 94476@944 [...]
+2014-02-12 14:38:00,437: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>100486 at 100487@100488 at 100489@100490 at 100491@100492 at 100493@100494 at 100495@100496 at 100497@100498 at 100499@100500 at 100501@100502 at 100503@100504 at 100505@100506 at 100507@100508 at 100509@100510 at 100511@100512 at 100513@100514 at 100515@100516 at 100517@100518@ [...]
+2014-02-12 14:38:08,742: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>106678 at 106679@106680 at 106681@106682 at 106683@106684 at 106685@106686 at 106687@106688 at 106689@106690 at 106691@106692 at 106693@106694 at 106695@106696 at 106697@106698 at 106699@106700 at 106701@106702 at 106703@106704 at 106705@106706 at 106707@106708 at 106709@106710@ [...]
+2014-02-12 14:38:17,535: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>113014 at 113015@113016 at 113017@113018 at 113019@113020 at 113021@113022 at 113023@113024 at 113025@113026 at 113027@113028 at 113029@113030 at 113031@113032 at 113033@113034 at 113035@113036 at 113037@113038 at 113039@113040 at 113041@113042 at 113043@113044 at 113045@113046@ [...]
+2014-02-12 14:38:26,363: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>119494 at 119495@119496 at 119497@119498 at 119499@119500 at 119501@119502 at 119503@119504 at 119505@119506 at 119507@119508 at 119509@119510 at 119511@119512 at 119513@119514 at 119515@119516 at 119517@119518 at 119519@119520 at 119521@119522 at 119523@119524 at 119525@119526@ [...]
+2014-02-12 14:38:34,421: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>126118 at 126119@126120 at 126121@126122 at 126123@126124 at 126125@126126 at 126127@126128 at 126129@126130 at 126131@126132 at 126133@126134 at 126135@126136 at 126137@126138 at 126139@126140 at 126141@126142 at 126143@126144 at 126145@126146 at 126147@126148 at 126149@126150@ [...]
+2014-02-12 14:38:45,032: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>132886 at 132887@132888 at 132889@132890 at 132891@132892 at 132893@132894 at 132895@132896 at 132897@132898 at 132899@132900 at 132901@132902 at 132903@132904 at 132905@132906 at 132907@132908 at 132909@132910 at 132911@132912 at 132913@132914 at 132915@132916 at 132917@132918@ [...]
+2014-02-12 14:38:53,289: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>139798 at 139799@139800 at 139801@139802 at 139803@139804 at 139805@139806 at 139807@139808 at 139809@139810 at 139811@139812 at 139813@139814 at 139815@139816 at 139817@139818 at 139819@139820 at 139821@139822 at 139823@139824 at 139825@139826 at 139827@139828 at 139829@139830@ [...]
+2014-02-12 14:40:12,866: istsos - INFO - Executing POST on /wa/istsos/services/istzoz/operations/insertobservation: <?xml version="1.0" encoding="UTF-8"?>  <sos:InsertObservationResponse xmlns:sos="http://www.opengis.net/sos/1.0">    <sos:AssignedObservationId>146854 at 146855@146856 at 146857@146858 at 146859@146860 at 146861@146862 at 146863@146864 at 146865@146866 at 146867@146868 at 146869@146870 at 146871@146872 at 146873@146874 at 146875@146876 at 146877@146878 at 146879@146880 at 146881@146882 at 146883@146884 at 146885@146886@ [...]
diff --git a/makecheck.py b/makecheck.py
new file mode 100755
index 0000000..2223a65
--- /dev/null
+++ b/makecheck.py
@@ -0,0 +1,395 @@
+# -*- coding: utf-8 -*-
+import sys
+import time
+from os import path
+sys.path.insert(0, path.abspath(path.dirname(__file__)))
+
+import test.walib.istsos.services.configsections as conf
+import test.walib.istsos.services.dataqualities as data
+import test.walib.istsos.services.epsgs as eps
+import test.walib.istsos.services.observedproperties as obsprop
+import test.walib.istsos.services.offerings as offer
+import test.walib.istsos.services.operations as oper
+import test.walib.istsos.services.procedures as proc
+import test.walib.istsos.services.services as ser
+import test.walib.istsos.services.systemtypes as syst
+import test.walib.istsos.services.uoms as uom
+import test.istsoslib.sosRequests as sos
+import lib.argparse as argparse
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+
+def run_tests(arg):
+    passed = []
+    failed = []
+    start_time = time.time()
+    
+    f = open(path.abspath(path.dirname(__file__))+'/logs/test.log', 'w')
+        
+    verb = arg['v']
+
+    ms = 'UNIT TESTING'   
+    print ms
+    f.write('\n'+ms+'\n=================================')
+    
+    ms = 'CREATING TESTING ENVIRONMENT'   
+    if verb: print '|---' + ms
+    f.write('\n'+ms+'\n=================================')
+    
+    #=======================================================================    
+    # CREATE A TEST ENVIRONMENT
+    #=======================================================================
+    #----- SET SOS SERVER CONFIGURATION ---------
+    config = {
+        "getobservation": {
+            "maxgoperiod": "200", 
+            "aggregatenodataqi": "-100", 
+            "defaultqi": "100", 
+            "aggregatenodata": "-999.9",
+            "correct_qi" : "110",
+            "stat_qi" : "200",
+            "transactional_log" : "True"
+            }, 
+        "urn": {
+            "process": "urn:ogc:def:process:x-istsos:1.0:", 
+            "property": "urn:ogc:def:property:x-istsos:1.0:", 
+            "offering": "urn:ogc:def:offering:x-istsos:1.0:", 
+            "sensor": "urn:ogc:def:sensor:x-istsos:1.0:", 
+            "phenomena": "urn:ogc:def:phenomenon:x-istsos:1.0:", 
+            "feature": "urn:ogc:def:feature:x-istsos:1.0:", 
+            "sensorType": "urn:ogc:def:sensorType:x-istsos:1.0:", 
+            "dataType": "urn:ogc:def:dataType:x-istsos:1.0:", 
+            "role": "urn:role:x-istsos:1.0:", 
+            "refsystem": "urn:ogc:crs:EPSG:", 
+            "time": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "keywords": "urn:ogc:def:keywords:x-istsos:1.0:", 
+            "identifier": "urn:ogc:def:identifier:x-istsos:1.0:", 
+            "parameter": "urn:ogc:def:parameter:x-istsos:1.0:", 
+            "procedure": "urn:ogc:def:procedure:x-istsos:1.0:"
+            }, 
+        "connection": { 
+            "dbname": arg['dbname'], 
+            "host": arg['host'], 
+            "user": arg['user'], 
+            "password": arg['password'], 
+            "port": arg['port']
+            }, 
+        "identification": {
+            "title": "IST Sensor Observation Service 1", 
+            "abstract": "hydro-meteorological monitoring network", 
+            "urnversion": "1.0", 
+            "authority": "x-istsos", 
+            "fees": "NONE", 
+            "keywords": "SOS,IST,SUPSI", 
+            "accessconstrains": "NONE"
+            }, 
+        "serviceurl": {
+            "url": "http://localhost/istsos/test"
+            }, 
+        "provider": {
+            "contactcountry": "Switzerland", 
+            "providername": "Istituto Scienze della Terra", 
+            "contactposition": "Data manager", 
+            "contactvoice": "+41586666200", 
+            "contactadminarea": "Canton Ticino", 
+            "contactemail": "geoservice at supsi.ch", 
+            "contactdeliverypoint": "Campus Trevano", 
+            "contactname": "Team Geomatica", 
+            "contactpostalcode": "6952", 
+            "contactcity": "Canobbio", 
+            "providersite": "http://www.supsi.ch/ist", 
+            "contactfax": "+41000000000000"
+            }, 
+        "geo": {
+            "zaxisname": "altitude", 
+            "xaxisname": "easting", 
+            "yaxisname": "northing", 
+            "allowedepsg": "4326,3857", 
+            "istsosepsg": "21781"
+            }
+        } 
+    address = 'http://localhost/istsos/wa/istsos/services/default/configsections'
+    res = tput.PUT("", config, address)
+    if not res['success']:
+        raise SystemError("Unable to configure the SOS server: %s" % res['message'])
+    ms = 'server configuration set'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    
+    #----- CREATE A SOS SERVICE ---------
+    service = {
+        "service": "test"
+    }
+    address = 'http://localhost/istsos/wa/istsos/services'
+    res = tpost.POST("",service,address)
+    if not res['success']:
+        if res['message'].find("already exists"):
+            deladdress = 'http://localhost/istsos/wa/istsos/services/test'
+            delres = tdelete.DELETE("",deladdress)
+            if delres['success']:
+                res = tpost.POST("",service,address)
+                if not res['success']:
+                    raise SystemError("Unable to create a new SOS service: %s" % res['message'])
+            else:
+                raise SystemError("Unable to delete existing test SOS service: %s" % res['message'])
+        else:
+            raise SystemError("Unable to create a new SOS service: %s" % res['message'])
+    ms = 'service test created'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    #----- ADD UNIT OF MEASURE ------
+    tuom = {
+        "name": "test", 
+        "description": "test unit of measure"
+        }
+    address = 'http://localhost/istsos/wa/istsos/services/test/uoms'
+    res = tpost.POST("",tuom,address)
+    if not res['success']:
+        raise SystemError("Unable to create a new SOS unit of measure: %s" % res['message'])
+    ms = 'unit of measure test created'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    #----- ADD OBSERVED PROPERTY ------
+    opr = {
+        "definition": "urn:ogc:def:parameter:x-istsos:1.0:test", 
+        #"procedures": [], 
+        "constraint": [],
+        "name": "test", 
+        "description": "test observed property"
+        }
+    address = 'http://localhost/istsos/wa/istsos/services/test/observedproperties'
+    res = tpost.POST("",opr,address)
+    if not res['success']:
+        raise SystemError("Unable to create a new SOS observed property: %s" % res['message'])
+    ms = 'observed property test created'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    #----- ADD PROCEDURE ------
+    tproc = {
+        'capabilities': [],
+        'characteristics': '',
+        'classification': [
+            {'definition': 'urn:ogc:def:classifier:x-istsos:1.0:systemType',
+             'name': 'System Type',
+             'value': 'insitu-fixed-point'},
+            {'definition': 'urn:ogc:def:classifier:x-istsos:1.0:sensorType',
+             'name': 'Sensor Type',
+             'value': 'test_type'}],
+        'contacts': [],
+        'description': 'test procedure',
+        'documentation': [],
+        'history': [],
+        'identification': [],
+        'inputs': [],
+        'interfaces': '',
+        'keywords': 'A,B,C',
+        'location': 
+            {'crs': 
+                {'properties': 
+                    {'name': '4326'}, 
+                'type': 'name'},
+            'geometry': 
+                {'coordinates': ['1', '1', '1'], 
+                'type': 'Point'},
+            'properties': 
+                {'name': 'test'},
+            'type': 'Feature'},
+         'outputs': [
+             {'constraint': 
+                 {'interval': None, 'role': None},
+              'definition': 'urn:ogc:def:parameter:x-istsos:1.0:time:iso8601',
+              'description': '',
+              'name': 'Time',
+              'uom': 'iso8601'},
+             {'constraint': {'min': '0',
+              'role': 'urn:x-ogc:def:classifiers:x-istsos:1.0:qualityIndexCheck:level0'},
+               'definition': 'urn:ogc:def:parameter:x-istsos:1.0:test',
+               'description': 'test opr',
+               'name': 'test',
+               'uom': 'test'}],
+         'system': 'test',
+         'system_id': 'test'}
+    address = 'http://localhost/istsos/wa/istsos/services/test/procedures'
+    res = tpost.POST("",tproc,address)
+    if not res['success']:
+        print res
+        raise SystemError("Unable to create a new SOS procedure: %s" % res['message'])
+    ms = 'procedure test created'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    
+    #=======================================================================
+    # TEST RESTFUL SERVICE REQUESTS
+    #=======================================================================
+    ms = 'TESTING RESTFUL SERVICE REQUESTS\n'   
+    if verb: print '|---' + ms
+    f.write('\n'+ms+'\n=================================')   
+    
+    if verb: print '\t|---TESTING dataqualities \n'
+    dataqualities = data.test_dataqualities(f)
+    if verb:
+        for el in dataqualities: print '\t\t|---' + el
+    for k,v in dataqualities.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING epsg\n'
+    epsgs = eps.test_epsgs(f)
+    if verb:
+        for el in epsgs: print '\t\t|---' + el
+    for k,v in epsgs.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING observedproperties \n'
+    observedproperties = obsprop.test_observedproperties(f)
+    if verb:
+        for el in observedproperties: print '\t\t|---' + el
+    for k,v in observedproperties.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING offerings \n'
+    offerings = offer.test_offerings(f)
+    if verb:
+        for el in observedproperties: print '\t\t|---' + el
+    for k,v in offerings.items():
+        passed.append(k) if v else failed.append(k)
+         
+    if verb: print '\t|---TESTING operations \n'
+    operations = oper.test_operations(f)
+    if verb:
+        for el in operations: print '\t\t|---' + el
+    for k,v in operations.items():
+        passed.append(k) if v else failed.append(k)
+           
+    if verb: print '\t|---TESTING procedures \n'
+    procedures = proc.test_procedures(f)
+    if verb:
+        for el in procedures: print '\t\t|---' + el
+    for k,v in procedures.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING services \n'
+    services = ser.test_services(f)
+    if verb:
+        for el in services: print '\t\t|---' + el
+    for k,v in services.items():
+        passed.append(k) if v else failed.append(k)
+    
+    """        
+    if verb: print '\t|---TESTING systemtypes \n'
+    systemtypes = syst.test_systemtypes(f, v)
+    if verb:
+        for el in systemtypes: print '\t\t|---' + el
+    for k,v in systemtypes.items():
+        passed.append(k) if v else failed.append(k)
+    """
+                
+    if verb: print '\t|---TESTING uoms \n'
+    uoms = uom.test_uoms(f)
+    if verb:
+        for el in uoms: print '\t\t|---' + el
+    for k,v in uoms.items():
+        passed.append(k) if v else failed.append(k)
+           
+    if verb: print '\t|---TESTING configsections \n'
+    configsections = conf.test_configsections(f)
+    if verb:
+        for el in configsections: print '\t\t|---' + el
+    for k,v in configsections.items():
+        passed.append(k) if v else failed.append(k)
+      
+    #=======================================================================
+    # TEST SOS SERVICE REQUESTS
+    #=======================================================================    
+    ms = 'TESTING SOS SERVICE REQUESTS\n'   
+    if verb: print '|---' + ms
+    f.write('\n'+ms+'\n=================================')   
+    
+    if verb: print '\t|---TESTING getCapabilities \n'
+    getCapabilities = sos.getCapabilities(f)
+    if verb:
+        for el in getCapabilities: 
+            print '\t\t|---' + el
+    for k,v in getCapabilities.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING registerSensor \n'
+    registerSensor = sos.registerSensor(f)
+    if verb:
+        for el in registerSensor: 
+            print '\t\t|---' + el
+    for k,v in registerSensor.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING describeSensor \n'
+    describeSensor = sos.describeSensor(f)
+    if verb:
+        for el in describeSensor: 
+            print '\t\t|---' + el
+    for k,v in describeSensor.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING getFeatureOfInterest \n'
+    featureofInterest = sos.getFeatureOfInterest(f)
+    if verb:
+        for el in featureofInterest: 
+            print '\t\t|---' + el
+    for k,v in featureofInterest.items():
+        passed.append(k) if v else failed.append(k)
+           
+    if verb: print '\t|---TESTING insertObservation \n'
+    insertObservation = sos.insertObservation(f)
+    if verb:
+        for el in insertObservation: 
+            print '\t\t|---' + el
+    for k,v in insertObservation.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING getObservation \n'
+    getObservation = sos.getObservation(f)
+    if verb:
+        for el in getObservation: 
+            print '\t\t|---' + el
+    for k,v in getObservation.items():
+        passed.append(k) if v else failed.append(k)
+            
+    # delete sensor
+    f.close()
+    
+    duration = ('%s seconds') %(time.time() - start_time)
+    npassed = len(passed)
+    nfailed = len(failed)
+    #calculate results statistics
+    
+    #=========================================================    
+    # WRITE TEST RESULTS    
+    #=========================================================
+    print "results:"
+    print "--test duration: %s" % duration
+    print "--run tests:     %s" % (npassed+nfailed)
+    print "--passed tests:  %s" % npassed
+    print "--failed tests:  %s" % nfailed
+    if len(failed) >0:    
+        print ""
+        print "failed test list: %s" %("\n -".join(failed))
+
+
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser(
+        description='Import data from a csv file.')
+    """
+    conn = [user,password,host,dbname]
+    """    
+    parser.add_argument('user', action = 'store', help   = 'PostGIS user')
+    parser.add_argument('password', action = 'store', help   = 'PostGIS password')
+    parser.add_argument('host', action = 'store', help   = 'PostGIS host address')
+    parser.add_argument('dbname', action = 'store', help   = 'PostGIS database name')
+    parser.add_argument('-p', action = 'store', default = '5432', dest   = 'port', help   = 'PostGIS connection port')
+    parser.add_argument('-v','--verbose', action = 'store_true', dest   = 'v', help   = 'Activate verbose debug')
+    args = parser.parse_args()
+    #print args.__dict__
+    #exit()
+    run_tests(args.__dict__)
\ No newline at end of file
diff --git a/public.py b/public.py
new file mode 100755
index 0000000..f14fd0d
--- /dev/null
+++ b/public.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# istsos WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import sys
+from os import path
+sys.path.insert(0, path.abspath(path.dirname(__file__)))
+
+import pprint
+import application as app
+pp = pprint.PrettyPrinter(indent=4)
+
+def application(environ, start_response):
+    path = environ['PATH_INFO'].strip()[1:].split("/")
+    if path[0]=='wa':
+        return executeWa(environ, start_response)
+    else:
+        response_body = "istSOS requests not supported in this url"
+        start_response('404 Not Found', 
+            [
+                ('Content-Type', 'text/plain; charset=utf-8'),
+                ('Content-Length', str(len(response_body)))
+            ]
+        )
+        return [response_body.encode('utf-8')]
+
+def executeWa(environ, start_response):
+    
+    method = str(environ['REQUEST_METHOD']).upper()
+    # Data RETRIEVAL
+    if method != "GET":
+        response_body = '{"success": false, "message": "HTTP method %s not supported", "method": "%s"}' % (method,method)
+        start_response('200 OK', 
+            [
+                ('Content-Type', 'application/json; charset=utf-8'),
+                ('Content-Length', str(len(response_body)))
+            ]
+        )
+        return [response_body.encode('utf-8')]
+    else:
+        return app.executeWa(environ, start_response)
diff --git a/runAllTests.py b/runAllTests.py
new file mode 100755
index 0000000..8d1a7f8
--- /dev/null
+++ b/runAllTests.py
@@ -0,0 +1,397 @@
+# -*- coding: utf-8 -*-
+import sys
+import time
+from os import path
+sys.path.insert(0, path.abspath(path.dirname(__file__)))
+
+import test.walib.istsos.services.configsections as conf
+import test.walib.istsos.services.dataqualities as data
+import test.walib.istsos.services.epsgs as eps
+import test.walib.istsos.services.observedproperties as obsprop
+import test.walib.istsos.services.offerings as offer
+import test.walib.istsos.services.operations as oper
+import test.walib.istsos.services.procedures as proc
+import test.walib.istsos.services.services as ser
+import test.walib.istsos.services.systemtypes as syst
+import test.walib.istsos.services.uoms as uom
+import test.istsoslib.sosRequests as sos
+import lib.argparse as argparse
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+
+def run_tests(arg):
+    passed = []
+    failed = []
+    start_time = time.time()
+    
+    f = open(path.abspath(path.dirname(__file__))+'/logs/test.log', 'w')
+        
+    verb = arg['v']
+
+    ms = 'UNIT TESTING'   
+    print ms
+    f.write('\n'+ms+'\n=================================')
+    
+    ms = 'CREATING TESTING ENVIRONMENT'   
+    if verb: print '|---' + ms
+    f.write('\n'+ms+'\n=================================')
+    
+    #=======================================================================    
+    # CREATE A TEST ENVIRONMENT
+    #=======================================================================
+    #----- SET SOS SERVER CONFIGURATION ---------
+    config = {
+        "getobservation": {
+            "maxgoperiod": "200", 
+            "aggregatenodataqi": "-100", 
+            "defaultqi": "100", 
+            "aggregatenodata": "-999.9",
+            "correct_qi" : "110",
+            "stat_qi" : "200",
+            "transactional_log" : "True"
+            }, 
+        "urn": {
+            "process": "urn:ogc:def:process:x-istsos:1.0:", 
+            "property": "urn:ogc:def:property:x-istsos:1.0:", 
+            "offering": "urn:ogc:def:offering:x-istsos:1.0:", 
+            "sensor": "urn:ogc:def:sensor:x-istsos:1.0:", 
+            "phenomena": "urn:ogc:def:phenomenon:x-istsos:1.0:", 
+            "feature": "urn:ogc:def:feature:x-istsos:1.0:", 
+            "sensorType": "urn:ogc:def:sensorType:x-istsos:1.0:", 
+            "dataType": "urn:ogc:def:dataType:x-istsos:1.0:", 
+            "role": "urn:role:x-istsos:1.0:", 
+            "refsystem": "urn:ogc:crs:EPSG:", 
+            "time": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "keywords": "urn:ogc:def:keywords:x-istsos:1.0:", 
+            "identifier": "urn:ogc:def:identifier:x-istsos:1.0:", 
+            "parameter": "urn:ogc:def:parameter:x-istsos:1.0:", 
+            "procedure": "urn:ogc:def:procedure:x-istsos:1.0:"
+            }, 
+        "connection": { 
+            "dbname": arg['dbname'], 
+            "host": arg['host'], 
+            "user": arg['user'], 
+            "password": arg['password'], 
+            "port": arg['port']
+            }, 
+        "identification": {
+            "title": "IST Sensor Observation Service 1", 
+            "abstract": "hydro-meteorological monitoring network", 
+            "urnversion": "1.0", 
+            "authority": "x-istsos", 
+            "fees": "NONE", 
+            "keywords": "SOS,IST,SUPSI", 
+            "accessconstrains": "NONE"
+            }, 
+        "serviceurl": {
+            "url": "http://localhost/istsos/test"
+            }, 
+        "provider": {
+            "contactcountry": "Switzerland", 
+            "providername": "Istituto Scienze della Terra", 
+            "contactposition": "Data manager", 
+            "contactvoice": "+41586666200", 
+            "contactadminarea": "Canton Ticino", 
+            "contactemail": "geoservice at supsi.ch", 
+            "contactdeliverypoint": "Campus Trevano", 
+            "contactname": "Team Geomatica", 
+            "contactpostalcode": "6952", 
+            "contactcity": "Canobbio", 
+            "providersite": "http://www.supsi.ch/ist", 
+            "contactfax": "+41000000000000"
+            }, 
+        "geo": {
+            "zaxisname": "altitude", 
+            "xaxisname": "easting", 
+            "yaxisname": "northing", 
+            "allowedepsg": "4326,3857", 
+            "istsosepsg": "21781"
+            }
+        } 
+    address = 'http://localhost/istsos/wa/istsos/services/default/configsections'
+    res = tput.PUT("", config, address)
+    if not res['success']:
+        raise SystemError("Unable to configure the SOS server: %s" % res['message'])
+    ms = 'server configuration set'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    
+    #----- CREATE A SOS SERVICE ---------
+    service = {
+        "service": "test"
+    }
+    address = 'http://localhost/istsos/wa/istsos/services'
+    res = tpost.POST("",service,address)
+    if not res['success']:
+        if res['message'].find("already exists"):
+            deladdress = 'http://localhost/istsos/wa/istsos/services/test'
+            delres = tdelete.DELETE("",deladdress)
+            if delres['success']:
+                res = tpost.POST("",service,address)
+                if not res['success']:
+                    raise SystemError("Unable to create a new SOS service: %s" % res['message'])
+            else:
+                raise SystemError("Unable to delete existing test SOS service: %s" % res['message'])
+        else:
+            raise SystemError("Unable to create a new SOS service: %s" % res['message'])
+    ms = 'service test created'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    #----- ADD UNIT OF MEASURE ------
+    tuom = {
+        "name": "test", 
+        "description": "test unit of measure"
+        }
+    address = 'http://localhost/istsos/wa/istsos/services/test/uoms'
+    res = tpost.POST("",tuom,address)
+    if not res['success']:
+        raise SystemError("Unable to create a new SOS unit of measure: %s" % res['message'])
+    ms = 'unit of measure test created'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    #----- ADD OBSERVED PROPERTY ------
+    opr = {
+        "definition": "urn:ogc:def:parameter:x-istsos:1.0:test", 
+        #"procedures": [], 
+        "constraint": [],
+        "name": "test", 
+        "description": "test observed property"
+        }
+    address = 'http://localhost/istsos/wa/istsos/services/test/observedproperties'
+    res = tpost.POST("",opr,address)
+    if not res['success']:
+        raise SystemError("Unable to create a new SOS observed property: %s" % res['message'])
+    ms = 'observed property test created'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    #----- ADD PROCEDURE ------
+    tproc = {
+        'capabilities': [],
+        'characteristics': '',
+        'classification': [
+            {'definition': 'urn:ogc:def:classifier:x-istsos:1.0:systemType',
+             'name': 'System Type',
+             'value': 'insitu-fixed-point'},
+            {'definition': 'urn:ogc:def:classifier:x-istsos:1.0:sensorType',
+             'name': 'Sensor Type',
+             'value': 'test_type'}],
+        'contacts': [],
+        'description': 'test procedure',
+        'documentation': [],
+        'history': [],
+        'identification': [],
+        'inputs': [],
+        'interfaces': '',
+        'keywords': 'A,B,C',
+        'location': 
+            {'crs': 
+                {'properties': 
+                    {'name': '4326'}, 
+                'type': 'name'},
+            'geometry': 
+                {'coordinates': ['1', '1', '1'], 
+                'type': 'Point'},
+            'properties': 
+                {'name': 'test'},
+            'type': 'Feature'},
+         'outputs': [
+             {
+                'definition': 'urn:ogc:def:parameter:x-istsos:1.0:time:iso8601',
+                'description': '',
+                'name': 'Time',
+                'uom': 'iso8601'
+             },
+             {
+                 'constraint': {'min': '0', 'role': 'urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable'},
+                 'definition': 'urn:ogc:def:parameter:x-istsos:1.0:test',
+                 'description': 'test opr',
+                 'name': 'test',
+                 'uom': 'test'
+             }
+         ],
+         'system': 'test',
+         'system_id': 'test'}
+    address = 'http://localhost/istsos/wa/istsos/services/test/procedures'
+    res = tpost.POST("",tproc,address)
+    if not res['success']:
+        print res
+        raise SystemError("Unable to create a new SOS procedure: %s" % res['message'])
+    ms = 'procedure test created'
+    if verb: print '\t|---' + ms
+    f.write('\n'+ms)
+    
+    #=======================================================================
+    # TEST RESTFUL SERVICE REQUESTS
+    #=======================================================================
+    ms = 'TESTING RESTFUL SERVICE REQUESTS\n'   
+    if verb: print '|---' + ms
+    f.write('\n'+ms+'\n=================================')   
+    
+    if verb: print '\t|---TESTING dataqualities \n'
+    dataqualities = data.test_dataqualities(f)
+    if verb:
+        for el in dataqualities: print '\t\t|---' + el
+    for k,v in dataqualities.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING epsg\n'
+    epsgs = eps.test_epsgs(f)
+    if verb:
+        for el in epsgs: print '\t\t|---' + el
+    for k,v in epsgs.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING observedproperties \n'
+    observedproperties = obsprop.test_observedproperties(f)
+    if verb:
+        for el in observedproperties: print '\t\t|---' + el
+    for k,v in observedproperties.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING offerings \n'
+    offerings = offer.test_offerings(f)
+    if verb:
+        for el in observedproperties: print '\t\t|---' + el
+    for k,v in offerings.items():
+        passed.append(k) if v else failed.append(k)
+        
+    if verb: print '\t|---TESTING operations \n'
+    operations = oper.test_operations(f)
+    if verb:
+        for el in operations: print '\t\t|---' + el
+    for k,v in operations.items():
+        passed.append(k) if v else failed.append(k)
+           
+    if verb: print '\t|---TESTING procedures \n'
+    procedures = proc.test_procedures(f)
+    if verb:
+        for el in procedures: print '\t\t|---' + el
+    for k,v in procedures.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING services \n'
+    services = ser.test_services(f)
+    if verb:
+        for el in services: print '\t\t|---' + el
+    for k,v in services.items():
+        passed.append(k) if v else failed.append(k)
+    
+    """        
+    if verb: print '\t|---TESTING systemtypes \n'
+    systemtypes = syst.test_systemtypes(f, v)
+    if verb:
+        for el in systemtypes: print '\t\t|---' + el
+    for k,v in systemtypes.items():
+        passed.append(k) if v else failed.append(k)
+    """
+                
+    if verb: print '\t|---TESTING uoms \n'
+    uoms = uom.test_uoms(f)
+    if verb:
+        for el in uoms: print '\t\t|---' + el
+    for k,v in uoms.items():
+        passed.append(k) if v else failed.append(k)
+           
+    if verb: print '\t|---TESTING configsections \n'
+    configsections = conf.test_configsections(f)
+    if verb:
+        for el in configsections: print '\t\t|---' + el
+    for k,v in configsections.items():
+        passed.append(k) if v else failed.append(k)
+      
+    #=======================================================================
+    # TEST SOS SERVICE REQUESTS
+    #=======================================================================    
+    ms = 'TESTING SOS SERVICE REQUESTS\n'   
+    if verb: print '|---' + ms
+    f.write('\n'+ms+'\n=================================')   
+    
+    if verb: print '\t|---TESTING getCapabilities \n'
+    getCapabilities = sos.getCapabilities(f)
+    if verb:
+        for el in getCapabilities: 
+            print '\t\t|---' + el
+    for k,v in getCapabilities.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING registerSensor \n'
+    registerSensor = sos.registerSensor(f)
+    if verb:
+        for el in registerSensor: 
+            print '\t\t|---' + el
+    for k,v in registerSensor.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING describeSensor \n'
+    describeSensor = sos.describeSensor(f)
+    if verb:
+        for el in describeSensor: 
+            print '\t\t|---' + el
+    for k,v in describeSensor.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING getFeatureOfInterest \n'
+    featureofInterest = sos.getFeatureOfInterest(f)
+    if verb:
+        for el in featureofInterest: 
+            print '\t\t|---' + el
+    for k,v in featureofInterest.items():
+        passed.append(k) if v else failed.append(k)
+           
+    if verb: print '\t|---TESTING insertObservation \n'
+    insertObservation = sos.insertObservation(f)
+    if verb:
+        for el in insertObservation: 
+            print '\t\t|---' + el
+    for k,v in insertObservation.items():
+        passed.append(k) if v else failed.append(k)
+            
+    if verb: print '\t|---TESTING getObservation \n'
+    getObservation = sos.getObservation(f)
+    if verb:
+        for el in getObservation: 
+            print '\t\t|---' + el
+    for k,v in getObservation.items():
+        passed.append(k) if v else failed.append(k)
+            
+    # delete sensor
+    f.close()
+    
+    duration = ('%s seconds') %(time.time() - start_time)
+    npassed = len(passed)
+    nfailed = len(failed)
+    #calculate results statistics
+    
+    #=========================================================    
+    # WRITE TEST RESULTS    
+    #=========================================================
+    print "results:"
+    print "--test duration: %s" % duration
+    print "--run tests:     %s" % (npassed+nfailed)
+    print "--passed tests:  %s" % npassed
+    print "--failed tests:  %s" % nfailed
+    if len(failed) >0:    
+        print ""
+        print "failed test list: %s" %("\n -".join(failed))
+
+
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser(
+        description='Import data from a csv file.')
+    """
+    conn = [user,password,host,dbname]
+    """    
+    parser.add_argument('user', action = 'store', help   = 'PostGIS user')
+    parser.add_argument('password', action = 'store', help   = 'PostGIS password')
+    parser.add_argument('host', action = 'store', help   = 'PostGIS host address')
+    parser.add_argument('dbname', action = 'store', help   = 'PostGIS database name')
+    parser.add_argument('-p', action = 'store', default = '5432', dest   = 'port', help   = 'PostGIS connection port')
+    parser.add_argument('-v','--verbose', action = 'store_true', dest   = 'v', help   = 'Activate verbose debug')
+    args = parser.parse_args()
+    #print args.__dict__
+    #exit()
+    run_tests(args.__dict__)
\ No newline at end of file
diff --git a/scheduler.py b/scheduler.py
new file mode 100755
index 0000000..f24f4db
--- /dev/null
+++ b/scheduler.py
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+# Created on Tue Nov 12 17:15:04 2013
+#---------------------------------------------------------------------------
+"""
+description:
+    the scheduler dynamically check if scheduled job for each service
+    are changed, and update the defined job.
+    The scheduled job for a service are instantiated by a file named
+    "serviceName.aps" that includes the jobs according the decoration methods
+    of the python APScheduler library; for example:
+    
+    @sched.interval_schedule(seconds=4)
+    def demo_job4():
+        print 'demo job4'
+    
+    @sched.cron_schedule(second='*/30')
+    def demo_decorated_task():
+        print "I am printed at every minute at the 30th second!"
+    
+"""
+
+#---------------------------------
+import os
+def recursive_glob(rootdir='.', suffix=''):
+    return [( os.path.splitext(filename)[0] ,os.path.join(rootdir, filename) )
+            for rootdir, dirnames, filenames in os.walk(rootdir)
+            for filename in filenames if filename.endswith(suffix)]
+            
+import hashlib
+schedmd5 = {}
+services_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "services")
+
+from lib.apscheduler.scheduler import Scheduler
+sched = Scheduler(daemonic=False)
+sched.start()
+
+#===========================
+#START THE ISTSOS SCHEDULER 
+#===========================
+ at sched.interval_schedule(seconds=5)
+def istsos_job():
+    global schedmd5
+    print "Checking changes"
+    if not schedmd5:
+        print " > Initialization.."
+        for service,scheduler in recursive_glob(rootdir=services_path ,suffix=".aps"):
+            schedmd5[service]=hashlib.md5(open(scheduler).read()).hexdigest()
+            execfile(scheduler)
+    else:
+        for service,scheduler in recursive_glob(rootdir=services_path ,suffix=".aps"):
+            md5_now = hashlib.md5(open(scheduler).read()).hexdigest()
+            if not schedmd5[service] == md5_now:
+                print "  > Change detectd: %s" % service
+                schedmd5[service] = md5_now
+                jobs = sched.get_jobs()
+                for j in jobs[1:]:
+                    print " job: %s" % j.name
+                    if j.name.startswith(service):
+                        sched.unschedule_job(j)
+                execfile(scheduler)
+            
diff --git a/scripts/__init__.py b/scripts/__init__.py
new file mode 100755
index 0000000..ca37bad
--- /dev/null
+++ b/scripts/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+__all__ = [ "csv2istsos","raw2csv","sos2istsos","sos_virtualHQ_importer"]
diff --git a/scripts/constrain2db.py b/scripts/constrain2db.py
new file mode 100755
index 0000000..e2ce231
--- /dev/null
+++ b/scripts/constrain2db.py
@@ -0,0 +1,202 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+# Created on Mon Jan 20 12:05:08 2014
+#---------------------------------------------------------------------------
+"""
+description:
+    usage example:
+        python scripts/constrain2db.py 
+            -f /home/maxi/Desktop/const_csv.txt 
+            -s http://localhost/istsos/wa/istsos/services/demo 
+            -r urn:ogc:def:parameter:x-istsos:1.0:qualityIndex:check:lev1 
+            -v
+"""
+
+import sys
+import os
+from os import path
+import traceback
+import json
+import pprint
+import glob
+
+sys.path.insert(0, path.abspath("."))
+try:
+    import lib.argparse as argparse
+    import lib.requests as requests
+except ImportError as e:
+    print "\nError loading internal libs:\n >> did you run the script from the istSOS root folder?\n\n"
+    raise e
+
+def is_number(s):
+    try:
+        float(s)
+        return True
+    except ValueError:
+        return False
+
+def execute(args):  
+    pp = pprint.PrettyPrinter(indent=2)
+    try:
+    
+        # verbose
+        verbose = args['v']
+        
+        # veryverbose
+        veryverbose = args['vv']
+        if veryverbose:
+            verbose = True
+        
+        # istSOS service
+        service = args['s']
+        
+        # const constraint role
+        role = "urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable"
+        
+        # filename
+        csvfile = args['f']
+        
+        req = requests.session()
+        
+        # Open CSV file
+        fo = open(csvfile, "rw+")
+        
+        #check file validity
+        rlines = [ row.strip().split(",") for row in fo.readlines() if row.strip() is not ""]
+        lines = []
+        for line in rlines:
+            lines.append([c.strip() for c in line ])
+        # load sensor description
+        res = req.get("%s/procedures/operations/getlist" % (service), 
+                      prefetch=True, verify=False)
+        
+        jj = json.loads(res.content)
+        if veryverbose:
+            print "RETRIVING PRECEDURES..."
+            pp.pprint(res.json)
+            print "---------------------"
+        elif verbose:
+            if jj['success'] is False:
+                pp.pprint(res.json)
+                print "---------------------"
+        
+        procedures = dict( ( i["name"], [ j["name"] for j in i["observedproperties"] ] ) for i in jj["data"] )
+        
+        for nr,line in enumerate(lines):
+            line = [ l.strip() for l in line ]
+            if len(line)==4:
+                if not line[0] in procedures.keys():
+                    raise Exception("[line %s]: procedure '%s' not observed by the istsos service!" %(nr,line[0]) )
+                if not "-".join(line[1].split(":")[-2:]) in procedures[line[0]]:
+                    raise Exception("[line %s]: procedure '%s' does not observe property '%s'!" %(nr,line[0],line[1]) )
+                if not (is_number(line[2]) or line[2] is ""):
+                    raise Exception("[line %s]: value '%s' at column 3 should represent min values if present, check it is a number!" %(nr,line[2]) )
+                if not (is_number(line[3]) or line[3] is ""):
+                    raise Exception("[line %s]: value '%s' at column 4 should represent min values if present, check it is a number!" %(nr,line[3]) )
+            else:
+                raise Exception("[line %s]: %s input file must contain 4 row: station name, observed property URI, min, max" %(nr,line))
+        
+        for nr,line in enumerate(lines):
+            if line:
+                # load sensor description
+                res = req.get("%s/procedures/%s" % (service,line[0]), 
+                              prefetch=True, verify=False)
+                
+                ds = json.loads(res.content)
+                if veryverbose:
+                    print "RETRIVING PRECEDURES..."
+                    pp.pprint(res.json)
+                    print "---------------------"
+                elif verbose:
+                    if ds['success'] is False:
+                        pp.pprint(res.json)
+                        print "---------------------"
+                                
+                #update constraints in Json
+                for opr in ds["data"]["outputs"]:
+                    if opr["definition"] == line[1]:
+                        opr["constraint"] = {}
+                        opr["constraint"]["role"]=role
+                        if line[2] and line[3]:
+                            opr["constraint"]["interval"]=[float(line[2]),float(line[3])]
+                        elif not line[2] and line[3]:
+                            opr["constraint"]["max"]=float(line[3])
+                        elif line[2] and not line[3]:
+                            opr["constraint"]["min"]=float(line[2])
+                
+                # send Json request to update constrain on service
+                res = req.put("%s/procedures/%s" % (service,line[0]),
+                            prefetch=True,
+                            verify=False,
+                            data=json.dumps(ds["data"])
+                        )
+                # read response
+                jj = json.loads(res.content)
+                if veryverbose:
+                    print "SAVING PRECEDURE %s..." % line[0]
+                    pp.pprint(json.dumps(ds["data"]))
+                    print "---------------------"
+                
+                print "---------------------"
+                print " > Updated %s procedure success: %s" %(line[0],res.json['success'])
+
+                if verbose:
+                    if jj['success'] is False:
+                        pp.pprint(res.json)
+                
+                print "---------------------"
+                
+                
+    except Exception as e:
+        print "ERROR: %s\n\n" % e
+        traceback.print_exc()
+            
+if __name__ == "__main__":
+    
+    parser = argparse.ArgumentParser(
+        description='Update PROCEDUREs constraints from CSV file with line format: PROCEDURE_NAME,OBSERVED_PROPERTY_URN,MIN,MAX,ROLE')
+    
+    parser.add_argument('-v','--verbose',
+        action = 'store_true',
+        dest   = 'v',
+        help   = 'Activate verbose debug')
+    
+    parser.add_argument('-vv','--veryverbose',
+        action = 'store_true',
+        dest   = 'vv',
+        help   = 'Activate very verbose debug')
+        
+    parser.add_argument('-f','--file',
+        action = 'store',
+        required=True,
+        dest   = 'f',
+        help   = 'CSV file path')
+        
+    parser.add_argument('-s', '--istsos',
+        action='store',
+        required=True,
+        dest='s',
+        help='istSOS WA service address (e.g.: http://localhost/istsos/wa/istsos/services/demo).')
+    
+    
+    args = parser.parse_args()
+    #print args.__dict__
+    execute(args.__dict__)
+
+   
\ No newline at end of file
diff --git a/scripts/converter/__init__.py b/scripts/converter/__init__.py
new file mode 100755
index 0000000..4287ca8
--- /dev/null
+++ b/scripts/converter/__init__.py
@@ -0,0 +1 @@
+#
\ No newline at end of file
diff --git a/scripts/converter/campbell.py b/scripts/converter/campbell.py
new file mode 100755
index 0000000..f3f5cc5
--- /dev/null
+++ b/scripts/converter/campbell.py
@@ -0,0 +1,177 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+"""
+
+Usage example:
+
+# File example: test/scripts/data/in/campbell/LUGANO.dat
+# =====================================
+# 101,2013,276,400,13.86,19.77,13.46,89.1,983
+# 101,2013,276,410,13.86,19.71,13.32,90.8,984
+# 101,2013,276,420,13.86,19.61,13.12,92.1,984
+# 101,2013,276,430,13.86,19.5,12.96,93.8,984
+# 99,2013,276,436,43
+# 101,2013,276,440,13.86,19.37,12.64,94.6,984
+# 101,2013,276,450,13.86,19.22,12.56,95.4,984
+# 101,2013,276,500,13.86,19.08,12.44,95.6,984
+# 101,2013,276,510,13.86,18.94,12.4,96.2,984
+# 101,2013,276,520,13.86,18.8,12.23,96.4,984
+# =====================================
+
+lugano = CampbellImporter('T_LUGANO', {
+        "tz": "+02:00",
+        "rowid": "99",
+        "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall",
+        "column": 6,
+        "date": [1,2,3,4]
+    }, 'http://localhost/istsos', 'demo',
+    "test/scripts/data/in", 'LUGANO.dat', 
+    "test/scripts/data/out",
+    debug=True)
+
+lugano.execute();
+    
+"""
+
+from datetime import datetime
+from datetime import timedelta
+from os import path
+from scripts import raw2csv
+
+class CampbellImporter(raw2csv.Converter):
+    
+    
+    def __init__(self, procedureName, config, url, service, 
+                 inputDir, fileNamePattern, outputDir=None, 
+                 qualityIndex=False, exceptionBehaviour={}, 
+                 user=None, password=None, debug=False, 
+                 csvlength=5000, filenamecheck=None, archivefolder = None):
+        """
+        CampbellImporter constructor
+        
+        @param config: procedure specific configuration
+        @type config: C{dictionary}
+        
+        Tick example 1: {
+            "rowid": "99",
+            "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall",
+            "value": "0.2",
+            "date": [1,2,3,4]
+        }
+        
+        Temperature example 2: {
+            "rowid": "101",
+            "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature",
+            "column": 4,
+            "date": [1,2,3]
+        }
+        """
+        self.config = config
+        if not "date" in config:
+            self.config['date']=[1,2,3]
+        raw2csv.Converter.__init__(self, procedureName, url, service,
+            inputDir, fileNamePattern, outputDir,
+            qualityIndex, exceptionBehaviour, user, password, debug, csvlength, filenamecheck, archivefolder)
+    
+    def getDate(self, year, day, hour, second=None):
+        # Parsing date with year, days from 1 January and hours in integers
+        y = int(year)
+        d = int (day)
+        h = m = s = 0
+        dDiff = 1
+        if(len(hour) == 1):
+            m = int(hour[0])
+        elif(len(hour) == 2):
+            m = int(hour[0] + hour[1])
+        elif(len(hour) == 3):
+            h = int(hour[0])
+            m = int(hour[1] + hour[2])
+        elif(len(hour) == 4):
+            h = int(hour[0] + hour[1])
+            if h == 24:
+                h = 0
+                dDiff = 0
+            m = int(hour[2] + hour[3])
+        if second!=None:
+            s = int(second)
+        
+        ret = (datetime(y, 1, 1, h, m, s, 0) + timedelta(days=(d-dDiff)))
+        
+        if "tz" in self.config:
+            ret = self.getDateTimeWithTimeZone(ret, self.config["tz"])
+            
+        return ret
+    
+    def parse(self, fileObj, name):
+        lines = fileObj.readlines()
+        for line in lines:
+            s = line.strip(' \t\n\r')
+            arr = s.split(",")
+            if s != '' and len(arr)>0:
+                
+                date = self.getDate(arr[self.config['date'][0]],arr[self.config['date'][1]],arr[self.config['date'][2]])
+                self.setEndPosition(date)
+                
+                if str(arr[0]) == str(self.config['rowid']):
+                    
+                    if len(self.config['date'])==3:
+                        date = self.getDate(arr[self.config['date'][0]],arr[self.config['date'][1]],arr[self.config['date'][2]])
+                    elif len(self.config['date'])==4:
+                        date = self.getDate(arr[self.config['date'][0]],arr[self.config['date'][1]],arr[self.config['date'][2]],arr[self.config['date'][3]])
+                    else:
+                        raise raw2csv.IstSOSError("Date configuration mismatch.")
+                        
+                    self.setEndPosition(date)
+                    
+                    values = {}
+                    
+                    if "column" in self.config:
+                        values[self.config["observedProperty"]] = arr[self.config["column"]]
+                    else:
+                        values[self.config["observedProperty"]] = float(self.config["value"])
+                    
+                    self.addObservation(
+                        raw2csv.Observation(date, values)
+                    )
+                    
+
+class TLuganoImporter(CampbellImporter):
+    def __init__(self):
+        raw2csv.Converter.__init__(self, 'T_LUGANO', 
+            'http://localhost/istsos', 'demo',
+            path.normpath("%s/test/scripts/data/in" % path.abspath(".")), 'LUGANO.dat', 
+            path.normpath("%s/test/scripts/data/out" % path.abspath(".")),
+            debug=True)
+    def parse(self, fileObj, name):
+        self.customParse(fileObj, name, '101', {
+            "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature": 6
+        })
+        
+class PLuganoImporter(CampbellImporter):
+    def __init__(self):
+        raw2csv.Converter.__init__(self, 'P_LUGANO', 
+            'http://localhost/istsos', 'demo',
+            path.normpath("%s/test/scripts/data/in" % path.abspath(".")), 'LUGANO.dat', 
+            path.normpath("%s/test/scripts/data/out" % path.abspath(".")),
+            debug=True)
+    def parse(self, fileObj, name):
+        self.customParse(fileObj, name, '99', {
+            "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall": "0.2"
+        }, [1,2,3,4])
+
diff --git a/scripts/converter/csv.py b/scripts/converter/csv.py
new file mode 100755
index 0000000..91c9971
--- /dev/null
+++ b/scripts/converter/csv.py
@@ -0,0 +1,279 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2014 Massimiliano Cannata, Milan Antonovic
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+# Created on Tue Dec 17 13:58:05 2013
+#---------------------------------------------------------------------------
+"""
+
+Usage example:
+
+# File example: Calcaccia_A_1304160941.dat
+# =====================================
+# Identificazione: Calcaccia A	SN/TD: 739336/MTO-133	Firmware: FW1.14
+# Valore minimo 0.123 mWS	Valore massimo 0.142 mWS	Valore medio 0.536 mWS	Pressure_Type="rel"	
+# Ora	Data	Pressione [mWS]	Temperatura [°C]	Conducibilità [mS/cm]	Conta-impulsi [mm]	
+# 09:50:00	26.03.2013	0.140	4.4		
+# 10:00:00	26.03.2013	0.137	4.4		
+# 10:10:00	26.03.2013	0.139	4.4		
+# 10:20:00	26.03.2013	0.141	4.4		
+# 10:30:00	26.03.2013	0.139	4.4		
+# 10:40:00	26.03.2013	0.139	4.4		
+# 10:50:00	26.03.2013	0.139	4.5		
+# 11:00:00	26.03.2013	0.139	4.5	
+# =====================================
+
+
+from scripts.converter import csv
+
+# Multi column date
+importer = csv.CsvImporter('T_TRE', {
+        "headrows": 3,
+        "separator": "\t",
+        "filenamedate": {
+            "format": '%y%m%d%H%M',
+            "remove": ['Calcaccia_A_','.dat']
+        },
+        "datetime": {
+            "tz": '+01:00',
+            "time": {
+                "column": 0,
+                "format": '%H:%M:%S'
+            },
+            "date": {
+                "column": 1,
+                "format": '%d.%m.%Y'
+            }
+        },
+        "observations": [{
+            "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature",
+            "column": 2
+        }]
+    },
+    'http://localhost/istsos', 'pippo',
+    "/home/milan/workspace/istsos/google-svn/trunk/test/scripts/data/in/csv", 'Calcaccia_A_*.dat',
+    "/home/milan/workspace/istsos/google-svn/trunk/test/scripts/data/out",
+    True
+)
+csv.execute()
+
+# Single column date
+importer = csv.CsvImporter('T_TRE', {
+        "headrows": 0,
+        "separator": "\t",
+        "filenamedate": {
+            "format": '%y%m%d%H%M',
+            "remove": ['Calcaccia_A_','.dat']
+        },
+        "datetime": {
+            "column": 1,
+            "format": '%d.%m.%Y %H:%M:%S',
+            "tz": '+01:00'
+        },
+        "observations": [{
+            "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature",
+            "column": 3
+        }]
+    },
+    'http://localhost/istsos', 'pippo',
+    "istsos/test/scripts/data/in/csv", 'Calcaccia_A_*.dat',
+    "istsos/test/scripts/data/out",
+    True
+)
+csv.execute()
+
+"""
+
+from scripts import raw2csv
+from datetime import datetime
+from datetime import timedelta
+from lib.pytz import timezone
+import traceback
+
+class CsvImporter(raw2csv.Converter):
+    
+    def __init__(self, procedureName, config, url, service, inputDir, 
+                 fileNamePattern, outputDir=None, qualityIndex=False, 
+                 exceptionBehaviour={}, user=None, password=None, debug=False, 
+                 csvlength=5000, filenamecheck=None, archivefolder = None):
+        
+        self.config = config
+        
+        raw2csv.Converter.__init__(self, procedureName, url, service,
+            inputDir, fileNamePattern, outputDir,
+            qualityIndex, exceptionBehaviour, user, password, debug, csvlength, filenamecheck, archivefolder)
+
+            
+    def parseDate(self, columns):
+        
+        if "column" in self.config["datetime"] and "format" in self.config["datetime"]:
+            d = datetime.strptime(
+                columns[self.config["datetime"]["column"]], 
+                self.config["datetime"]["format"]
+            )
+        else:
+            dt = "%s %s" % (
+                columns[self.config["datetime"]['date']["column"]],
+                columns[self.config["datetime"]['time']["column"]]
+            )
+            frm = "%s %s" % (
+                self.config["datetime"]['date']["format"],
+                self.config["datetime"]['time']["format"]
+            )
+            d = datetime.strptime(dt,frm)
+            
+        #tz = timezone('UTC')
+        #d = d.replace(tzinfo=tz)
+        
+        if "tz" in self.config["datetime"]:
+            d = self.getDateTimeWithTimeZone(d,self.config["datetime"]["tz"])
+        return d
+        
+        
+    def setEndPositionFromFilename(self, fileName):
+        """
+        Extract from file name the EndPosition Date, usefull with irregular 
+        procedures like rain (tipping bucket) that can have no data when it's 
+        not raining.
+        
+        In the config there shall be this type of configuration:
+            
+            "filenamedate": {
+                "format": '%y%m%d%H%M',
+                "tz": '+02:00',
+                "remove": ['Calcaccia_A_','.dat']
+            }
+            
+        """
+        
+        if "filenamedate" in self.config:
+            
+            dt = fileName;
+            for rem in self.config["filenamedate"]["remove"]:
+                dt = dt.replace(rem,'')
+                
+            dt = datetime.strptime(dt,self.config["filenamedate"]["format"])
+            dt = dt.replace(tzinfo=timezone('UTC'))
+            
+            if "tz" in self.config["filenamedate"]:
+                offset = self.config["filenamedate"]["tz"].split(":")
+                dt = dt - timedelta(hours=int(offset[0]), minutes=int(offset[1]))
+            
+            self.setEndPosition(dt)
+            
+        
+
+    def parse(self, fileObj, fileName):
+        
+        cnt = 0
+        for line in fileObj.readlines():
+            cnt = cnt+1
+            # Skipping header rows if present in configuration
+            if "headrows" in self.config and cnt <= self.config['headrows']:
+                continue
+            # Line splitting
+            columns = line.split(self.config['separator'])
+            try:
+                date = self.parseDate(columns)
+                values = {}
+                for obs in self.config["observations"]:
+                    values[obs["observedProperty"]] = columns[obs["column"]]
+                self.addObservation(
+                    raw2csv.Observation(date, values)
+                )
+                self.setEndPosition(date)
+            except Exception as e:
+                print "%s [%s]:%s" % (fileName,cnt,line)
+                print traceback.print_exc()
+                raise e
+                
+        self.setEndPositionFromFilename(fileName)
+                
+
+"""
+
+Usage example:
+    
+# File example: Calcaccia_A_1304160941.dat
+# =====================================
+# Identificazione: Calcaccia A	SN/TD: 739336/MTO-133	Firmware: FW1.14
+# Valore minimo 0.123 mWS	Valore massimo 0.142 mWS	Valore medio 0.536 mWS	Pressure_Type="rel"	
+# Ora	Data	Pressione [mWS]	Temperatura [°C]	Conducibilità [mS/cm]	Conta-impulsi [mm]	
+# 09:50:00	26.03.2013	0.140	4.4		
+# 10:00:00	26.03.2013	0.137	4.4		
+# 10:10:00	26.03.2013	0.139	4.4		
+# 10:20:00	26.03.2013	0.141	4.4		
+# 10:30:00	26.03.2013	0.139	4.4		
+# 10:40:00	26.03.2013	0.139	4.4		
+# 10:50:00	26.03.2013	0.139	4.5		
+# 11:00:00	26.03.2013	0.139	4.5	
+# =====================================
+
+from scripts.converter import csv
+
+# Multi column date
+importer = csv.Offline1Importer('T_TRE', [{
+        "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature",
+        "column": 2
+    }],
+    'http://localhost/istsos', 'pippo',
+    "/home/milan/workspace/istsos/google-svn/trunk/test/scripts/data/in/csv", 'Calcaccia_A_*.dat',
+    "/home/milan/workspace/istsos/google-svn/trunk/test/scripts/data/out",
+    True
+)
+csv.execute()
+"""
+
+class Offline1Importer(CsvImporter):
+    
+    def __init__(self, procedureName, observations, url, service, inputDir, fileNamePattern, outputDir, debug):
+        CsvImporter.__init__(self, procedureName, {
+            "headrows": 3,
+            "separator": "\t",
+            "filenamedate": {
+                "format": '%y%m%d%H%M',
+                "remove": fileNamePattern.split("*")
+            },
+            "datetime": {
+                "tz": '+01:00',
+                "time": {
+                    "column": 0,
+                    "format": '%H:%M:%S'
+                },
+                "date": {
+                    "column": 1,
+                    "format": '%d.%m.%Y'
+                }
+            },
+            "observations": observations
+        }, url, service, inputDir, fileNamePattern, outputDir, debug)
+            
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/scripts/converter/kern.py b/scripts/converter/kern.py
new file mode 100755
index 0000000..2848787
--- /dev/null
+++ b/scripts/converter/kern.py
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2013 Milan Antonovic, Massimiliano Cannata
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+"""
+
+File example:
+=========================================================
+TI	2014	006020	000010	HBTIa	04	Laveggio Segoma
+Q	1	1	0	0	Pegel m
+Q	2	3	0	0	Temperatur
+Q	3	23	0	0	Spannung
+D	6030	1	10	0.427	2	10	8.47	3	10	27.56
+
+=========================================================
+
+Single Observed property usage example:
+    
+sts = KernImporter('WT_LAV_RSV', {
+        "tz": "+02:00",
+        "observations": {
+            "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall",
+            "column": 6
+        }
+    },
+    'http://localhost/istsos', 'pippo',
+    "istsos/test/scripts/data/in", 'HBTIa-04_*',
+    "istsos/test/scripts/data/out",
+    True)
+sts.execute()
+
+
+Multiple Observed property usage example:
+
+sts = KernImporter('WT_LAV_RSV', {
+        "tz": "+02:00",
+        "observations": [{
+            "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall",
+            "column": 6
+        },{
+            "observedProperty": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature",
+            "column": 7
+        }]
+    },
+    'http://localhost/istsos', 'pippo',
+    "istsos/test/scripts/data/in", 'HBTIa-04_*',
+    "istsos/test/scripts/data/out",
+    True)
+sts.execute()
+
+"""
+
+from scripts import raw2csv
+from datetime import datetime
+from datetime import timedelta
+from lib.pytz import timezone
+import traceback
+
+class KernImporter(raw2csv.Converter):
+    def __init__(self, procedureName, config, url, service, inputDir, 
+                 fileNamePattern, outputDir=None, qualityIndex=False, 
+                 exceptionBehaviour={}, user=None, password=None, debug=False, 
+                 csvlength=5000, filenamecheck=None, archivefolder = None):
+        self.config = config        
+        raw2csv.Converter.__init__(self, procedureName, url, service,
+            inputDir, fileNamePattern, outputDir,
+            qualityIndex, exceptionBehaviour, user, password, debug, csvlength, filenamecheck, archivefolder)
+            
+    def minutesdate(self, year, minutes):
+        d1 = datetime(year=int(year),month=1,day=1)
+        d1 = (d1 + timedelta(minutes=int(minutes)))
+        if "tz" in self.config:
+            d1 = self.getDateTimeWithTimeZone(d1, self.config["tz"])
+        return d1
+    
+    def skipFile(self, name):
+        upDate = name.split('.')[0].split('_') # HBTIa-14_12_183730_10
+        year = datetime.strptime(upDate[-3],'%y').year # 12 -> 2012
+        mins = upDate[-2] # 183730
+        
+        upDate = self.minutesdate(year,mins)
+        if self.getDSEndPosition() != None and (
+                isinstance(self.getDSEndPosition(), datetime) and  
+                upDate <= self.getDSEndPosition()):
+            return True
+        return False
+    
+    def parse(self, fileObj, fileName):
+        
+        isHead = False
+        isData = False
+        cnt = 0
+        for line in fileObj.readlines():
+            cnt = cnt+1
+            try:
+                # indica una riga di intestazione con la data di inizio dei dati
+                if line.find('\x01TI')>=0:
+                    line = line.replace('\x01','')
+                    isHead = True
+                else:
+                    isHead = False
+                    
+                # inidica l'inizio di un blocco con i dati
+                if line.find('\x02')>=0:
+                    line = line.replace('\x02','')
+                    isData = True
+                
+                # inidica la fine del blocco con i dati 
+                if line.find('\x03')>=0:
+                    line = line.replace('\x03','')
+                    isData = False
+                    
+                # inidica la fine del file
+                if line.find('\x04')>=0:
+                    line = line.replace('\x04','')
+                    break
+                
+                line = line.split()
+                
+                if isHead:
+                    # Estrazione dell'anno e i minuti dalla riga di intestazione
+                    #          \/       \/
+                    # ['TI', '2012', '183721', '000000', 'HBTIa', '14', 'KERN', 'TL-1', 'SN:557']
+                    year = datetime.strptime(line[1],'%Y').year
+                    startMinutes = line[2]
+                
+                if isData and line[0] in ['D','d','o']:
+                    dataMinutes = line[1]
+
+                    # Controllo del capo d'anno
+                    if int(startMinutes)>int(dataMinutes):
+                        year = year + 1
+                        
+                    d = self.minutesdate(year,dataMinutes)
+                    
+                    #d = datetime(d.year, d.month, d.day, d.hour, d.minute, d.second, 
+                    #    d.microsecond, tzinfo=timezone("CET"))
+                    
+                    self.setEndPosition(d)
+                    
+                    val = {}
+                    
+                    if type(self.config["observations"]) == type([]):
+                        for obs in self.config["observations"]:
+                            val[obs['observedProperty']]=line[obs['column']]
+                    else:
+                        val[self.config["observations"]['observedProperty']]=line[self.config["observations"]['column']]
+                        
+                    self.addObservation(
+                        raw2csv.Observation(d,val)
+                    )
+                   
+            except Exception as e:
+                self.log("%s-%s:%s" % (fileName,cnt,line))
+                self.log(traceback.print_exc())
+                raise e
diff --git a/scripts/converter/sts.py b/scripts/converter/sts.py
new file mode 100755
index 0000000..35a81d7
--- /dev/null
+++ b/scripts/converter/sts.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2013 Milan Antonovic, Massimiliano Cannata
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+"""
+
+ at todo to be enhanced, it is a little bit hardcoded :(
+
+Usage example:
+    
+# File example: test/scripts/data/in/sts/100190_WTemp.csv
+# =====================================
+# 100190 Maggia;WTemp ˚C
+# 2013-11-24 00:00:00;4.67401
+# 2013-11-24 00:10:00;4.67672
+# 2013-11-24 00:20:01;4.67909
+# 2013-11-24 00:30:00;4.67354
+# 2013-11-24 00:40:01;4.68056
+# 2013-11-24 00:50:00;4.67847
+# 2013-11-24 01:00:00;4.67735
+# 2013-11-24 01:10:00;4.67884
+# 2013-11-24 01:20:01;4.67987
+# 2013-11-24 01:30:00;4.68368
+# =====================================
+
+sts = testConverter.StsImporter('A_MAR_MAR2', {
+        "tz": "+04:30"
+    },
+    'http://localhost/istsos', 'pippo', 
+    "test/scripts/data/in", '100640_mWC.csv', 
+    "test/scripts/data/out"
+)
+sts.execute()
+    
+"""
+
+from scripts import raw2csv
+from datetime import datetime
+
+class StsImporter(raw2csv.Converter):
+            
+    def __init__(self, procedureName, config, url, service, inputDir, 
+                 fileNamePattern, outputDir=None, qualityIndex=False, 
+                 exceptionBehaviour={}, user=None, password=None, debug=False, 
+                 csvlength=5000, filenamecheck=None, archivefolder = None):                     
+        self.config = config
+        raw2csv.Converter.__init__(self, procedureName, url, service, inputDir, 
+            fileNamePattern, outputDir, qualityIndex, 
+            exceptionBehaviour, user, password, debug, 
+            csvlength, filenamecheck, archivefolder)
+            
+        
+    def parse(self, fileObj, fileName):
+        
+        skipline = fileName.split("_")[0]
+        
+        dateformat = "%Y-%m-%d %H:%M:%S"
+        
+        # STS procedures have only one observed property
+        op = self.getDefinitions()[1] 
+        
+        for line in fileObj.readlines():
+            
+            if line.find(skipline)==0:
+                continue
+            
+            pair = line.split(";")
+            
+            val = {
+                op: pair[1]
+            }
+            
+            data = datetime.strptime(pair[0], dateformat)
+            if "tz" in self.config:
+                data = self.getDateTimeWithTimeZone(data, self.config["tz"])
+            
+            self.setEndPosition(data)
+            self.addObservation(
+                raw2csv.Observation(data, val)
+            )
\ No newline at end of file
diff --git a/scripts/csv2istsos.py b/scripts/csv2istsos.py
new file mode 100755
index 0000000..79a6cf6
--- /dev/null
+++ b/scripts/csv2istsos.py
@@ -0,0 +1,349 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+'''
+This script 
+'''
+
+import sys
+import os
+from os import path
+import traceback
+import json
+import pprint
+import glob
+from datetime import datetime
+
+#print path.abspath(".")
+#print path.normpath("%s/../" % path.abspath("."))
+    
+sys.path.insert(0, path.abspath("."))
+try:
+    import lib.argparse as argparse
+    import lib.requests as requests
+    import lib.isodate as iso
+    from lib.pytz import timezone
+except ImportError as e:
+    print "\nError loading internal libs:\n >> did you run the script from the istSOS root folder?\n\n"
+    raise e
+
+datacache = {}
+
+def execute (args, logger=None):
+    
+    def log(message):
+        if logger:
+            logger.log(message)
+        else:
+            print message
+    
+    pp = pprint.PrettyPrinter(indent=2)
+    
+    try:
+    
+        # Initializing URLs
+        url = args['u']
+        
+        # Service instance name
+        service = args['s']
+        
+        # Quality index
+        quality = '100'
+        if 'q' in args:
+            quality = args['q']
+        
+        # Procedures
+        procs = args['p']
+        
+        # Working directory, where the CSV files are located
+        wd = args['wd']
+        
+        # File extension
+        ext = '.dat'
+        if 'e' in args:
+            ext = args['e']
+        
+        debug = False
+        if 'v' in args:
+            debug = args['v']
+        
+        test = False
+        if 't' in args:
+            test = args['t']
+        
+        user = None
+        if 'usr' in args:
+            user = args['usr']
+        passw = None
+        if 'pwd' in args:
+            passw = args['pwd']
+            
+        #req = requests.session()
+        req = requests
+        
+        for proc in procs:
+            
+            log("\nProcedure: %s" % proc)
+            
+            # Load procedure description                
+            res = req.get("%s/wa/istsos/services/%s/procedures/%s" % (
+                url,
+                service,
+                proc
+                ), prefetch=True, auth=(user, passw), verify=False)
+                
+            data = res.json
+            #log(pp.pprint(data))
+                
+            if data['success']==False:
+                raise Exception ("Description of procedure %s can not be loaded: %s" % (proc, data['message']))
+            else:
+                if debug:
+                    pp.pprint(data)
+                else:
+                    print " > %s" % data['message']
+            
+            data = data['data']
+            
+            aid = data['assignedSensorId']
+            
+            # Getting observed properties from describeSensor response
+            op = []
+            for out in data['outputs']:
+                op.append(out['definition'])
+            
+            # Load of a getobservation request
+            res = req.get("%s/wa/istsos/services/%s/operations/getobservation/offerings/%s/procedures/%s/observedproperties/%s/eventtime/last" % (
+                url,
+                service,
+                'temporary',
+                proc,
+                ','.join(op)
+                ), prefetch=True, auth=(user, passw), verify=False)
+            
+            data = res.json
+            
+            if data['success']==False:
+                raise Exception ("Last observation of procedure %s can not be loaded: %s" % (proc, data['message']))
+            else:
+                if debug:
+                    pp.pprint(data)
+                else:
+                    print " > %s" % data['message']
+                    
+            data = data['data'][0]
+            data['AssignedSensorId'] = aid
+            
+            # Set values array empty (can contain 1 value if procedure not empty)
+            data['result']['DataArray']['values'] = []
+            
+            # discover json observed property disposition
+            jsonindex = {}
+            for pos in range(0, len(data['result']['DataArray']['field'])):
+                field = data['result']['DataArray']['field'][pos]
+                jsonindex[field['definition']] = pos
+            
+            log ("Searching: %s" % os.path.join(wd, "%s_[0-9]*%s" % (proc,ext)))
+                
+            files = glob.glob(os.path.join(wd, "%s_*%s" % (proc,ext)))
+            files.sort()
+            
+            if debug:
+                print " > %s %s found" % (len(files), "Files" if len(files)>1 else "File")
+                
+            for f in files:
+            
+                # open file
+                file = open(f, 'rU')
+                
+                # loop lines
+                lines = file.readlines()
+                
+                obsindex = lines[0].strip(' \t\n\r').split(",")
+                
+                # Check if all the observedProperties of the procedure are included in the CSV file (quality index is optional)
+                for k, v in jsonindex.iteritems():
+                    if k in obsindex:
+                        continue
+                    elif ':qualityIndex' in k:
+                        continue
+                    else:
+                        raise Exception ("Mandatory observed property %s is not present in the CSV." % k)
+                
+                # loop lines skipping the header
+                for i in range(1, len(lines)):
+                    try:
+                        line = lines[i]
+                        lineArray = line.strip(' \t\n\r').split(",")
+                        
+                        # Creating an empty array where the values will be inserted
+                        observation =  ['']*len(jsonindex)
+                        
+                        for k, v in jsonindex.iteritems():
+                            val = None
+                            if k in obsindex:
+                                val = lineArray[obsindex.index(k)]
+                            elif ':qualityIndex' in k: # Quality index is not present in the CSV so the default value will be set
+                                val = quality
+                                
+                            observation[v] = val
+                            
+                        # attach to object
+                        data['result']['DataArray']['values'].append(observation)
+                        
+                    except Exception as e:
+                        print "Errore alla riga: %s" % i
+                        raise e
+                        
+            log ("Before insert ST:")
+            log (" > Begin: %s" % data["samplingTime"]["beginPosition"])
+            log ("   + End: %s" % data["samplingTime"]["endPosition"])
+            
+            ep = datetime.strptime(
+                os.path.split(f)[1].replace("%s_" % proc, "").replace(ext, ""),"%Y%m%d%H%M%S%f"
+            ).replace(tzinfo=timezone('UTC')) # .isoformat()
+            
+            # @todo: date shall be converted in datetime objects
+            if len(data['result']['DataArray']['values'])>0:
+                bp = iso.parse_datetime(
+                    data['result']['DataArray']['values'][0][jsonindex['urn:ogc:def:parameter:x-istsos:1.0:time:iso8601']]
+                )
+                if bp > iso.parse_datetime(data["samplingTime"]["endPosition"]):
+                    bp = iso.parse_datetime(data["samplingTime"]["endPosition"])
+            else:
+                if ep > iso.parse_datetime(data["samplingTime"]["endPosition"]):
+                    bp = iso.parse_datetime(data["samplingTime"]["endPosition"])
+                else:
+                    raise Exception("Something is wrong with begin position..")
+                    
+            data["samplingTime"] = {
+                "beginPosition": bp.isoformat(),
+			   "endPosition":  ep.isoformat()
+            }
+            
+            #data["result"]["DataArray"]["elementCount"] = str(len(data['result']['DataArray']['values']))
+            
+            log ("Insert ST:")
+            log (" > Begin: %s" % bp.isoformat())
+            log ("   + End: %s" % ep.isoformat())
+            log (" > Values: %s" % len( data['result']['DataArray']['values']))
+                
+            if not test and len(files)>0: # send to wa
+                res = req.post("%s/wa/istsos/services/%s/operations/insertobservation" % (
+                    url,
+                    service), 
+                    prefetch=True,
+                    auth=(user, passw),
+                    verify=False,
+                    data=json.dumps({
+                    "ForceInsert": "true",
+                    "AssignedSensorId": aid,
+                    "Observation": data
+                    })
+                )
+                # read response
+                log (" > Insert observation success: %s" % res.json['success'])
+                if not res.json['success']:
+                    log (res.json['message'])
+                    
+                
+                print "~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~"
+        pass
+        
+    except Exception as e:    
+        print "ERROR: %s\n\n" % e
+        traceback.print_exc()
+        pass
+        
+    pass
+    
+
+    
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser(
+        description='Import data from a csv file.')
+    
+    parser.add_argument('-v','--verbose',
+        action = 'store_true',
+        dest   = 'v',
+        help   = 'Activate verbose debug')
+        
+    parser.add_argument('-t','--test',
+        action = 'store_true',
+        dest   = 't',
+        help   = 'Use to test the command, deactivating the insert observation operations.')
+        
+    parser.add_argument('-p', 
+        action='store',
+        required=True,
+        nargs='+',
+        dest='p',
+        metavar='procedures',
+        help='List of procedures to be aggregated.')
+    
+    parser.add_argument('-q',
+        action = 'store',
+        dest   = 'q',
+        metavar= 'quality index',
+        default= '100',
+        help   = 'The quality index to set for all the measures of the CSV file, if not set into the CSV. (default: %(default)s).')
+        
+    parser.add_argument('-u',
+        action = 'store',
+        dest   = 'u',
+        metavar= 'url',
+        default= 'http://localhost:80/istsos',
+        help   = 'IstSOS Server address IP (or domain name) used for all request. (default: %(default)s).')
+    
+    parser.add_argument('-s',
+        action = 'store',
+        required=True,
+        dest   = 's',
+        metavar= 'service',
+        
+        help   = 'The name of the service instance.')
+    
+    parser.add_argument('-w',
+        action = 'store',
+        required=True,
+        dest   = 'wd',
+        metavar= 'working directory',
+        help   = 'Working directory where the csv files are located.')
+        
+    parser.add_argument('-e',
+        action = 'store',
+        dest   = 'e',
+        metavar= 'file extension',
+        default= '.dat',
+        help   = 'Extension of the CSV file. (default: %(default)s)')
+        
+    parser.add_argument('-usr',
+        action = 'store',
+        dest   = 'usr',
+        metavar= 'user name')
+        
+    parser.add_argument('-pwd',
+        action = 'store',
+        dest   = 'pwd',
+        metavar= 'password')
+
+    args = parser.parse_args()
+    #print args.__dict__
+    execute(args.__dict__)
+
+
diff --git a/scripts/istsos2istsos.py b/scripts/istsos2istsos.py
new file mode 100755
index 0000000..b813f46
--- /dev/null
+++ b/scripts/istsos2istsos.py
@@ -0,0 +1,513 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2014 Milan Antonovic, Massimiliano Cannata
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+"""
+description:
+    
+    
+"""
+
+'''
+Examples:
+    
+1. Simple copy 1 to 1
+
+python scripts/istsos2istsos.py -v -procedure P_BED \
+    -b 2014-01-10T00:00:00+01:00 -e 2014-01-11T00:00:00+01:00 \
+    --surl http://localhost/istsos --ssrv sosraw \
+    --dsrv sos
+    
+
+2. Copy applying an aggregate function SUM of 10 minutes
+
+python scripts/istsos2istsos.py -v -procedure P_BED \
+    -f SUM -r PT10M -val 0 -qi 100 \
+    -b 2014-01-10T00:00:00+01:00 -e 2014-01-11T00:00:00+01:00 \
+    --surl http://localhost/istsos --ssrv sosraw \
+    --dsrv sos
+
+    
+'''
+import sys
+from os import path
+from datetime import timedelta
+import pprint
+import json
+
+sys.path.insert(0, path.abspath("."))
+
+try:
+    import lib.argparse as argparse
+    import lib.requests as requests
+    import lib.isodate as iso
+except ImportError as e:
+    print "\nError loading internal libs:\n >> did you run the script from the istSOS root folder?\n\n"
+    raise e
+    
+fmt = '%Y-%m-%dT%H:%M:%S.%f%z'
+pp = pprint.PrettyPrinter(indent=4)
+
+def execute (args, logger=None):
+    
+    # SCRIPT CONFIGURATION
+    # =========================================================================
+    
+    # Activate and print verbose information
+    debug = args['v'] if args.has_key('v') else False
+        
+    # Procedure name
+    procedure = args['procedure']
+    # Begin date
+    begin = args['begin'] if args.has_key('begin') else "*"
+    # End date
+    end = args['end'] if args.has_key('end') else "*"    
+    # Global User and password valid for all connections
+    suser = duser = auser = args['user'] if args.has_key('user') else None
+    spwd = dpwd = apwd = args['pwd'] if args.has_key('pwd') else None
+    
+    # Activate this will copy also the quality index from source to destination
+    cpqi = args['cpqi'] if args.has_key('cpqi') else False
+    
+    # Aggregating function configuration
+    resolution = args['resolution'] if 'resolution' in args else None
+    function = args['function'] if 'function' in args else None
+    nodataValue = args['nodataValue'] if 'nodataValue' in args else None
+    nodataQI = args['nodataQI'] if 'nodataQI' in args else None
+    
+    # Retroactive aggregation
+    retro = args['retro'] if 'retro' in args else 0
+    
+    # Force using last position as end position during insert sensor operation
+    lm = args['lm'] if 'lm' in args else False
+    
+    # SOURCE istSOS CONFIG ==================================
+    # Location
+    surl = args['surl']
+    # Service instance name
+    ssrv = args['ssrv']
+    # User and password if given this will be used for source istSOS
+    if args.has_key('suser'):
+        suser = args['suser']
+    if args.has_key('spwd'):
+        spwd = args['spwd']
+    
+    # DESTINATION istSOS CONFIG =============================
+    # Location (if not given, same as source will be used)
+    durl = args['durl'] if (args.has_key('durl') and args['durl'] is not None) else surl
+    # Service instance name
+    dsrv = args['dsrv']
+    # User and password if given this will be used for destination istSOS
+    if args.has_key('duser'):
+        duser = args['duser']
+    if args.has_key('dpwd'):
+        dpwd = args['dpwd']
+        
+    # ALTERNATIVE istSOS SERVICE FOR QI EXTRAPOLATION =======
+    # Location (if not given, same as source will be used)
+    aurl = args['aurl'] if (args.has_key('aurl') and args['aurl'] is not None) else None
+    # Service instance name
+    asrv = args['asrv'] if (args.has_key('asrv') and args['asrv'] is not None) else None
+    # User and password if given this will be used for extrapolation QI istSOS
+    if args.has_key('auser'):
+        auser = args['auser']
+    if args.has_key('apwd'):
+        apwd = args['apwd']
+    
+    def log(message):
+        if debug:
+            if logger:
+                logger.log(message)
+            else:
+                print message
+            
+    # PROCESSING STARTS HERE ==================================================
+    
+    log("\nistSOS > 2 > istSOS STARTED:")
+    log("==============================\n")
+    
+    #req = requests.session()
+    req = requests
+    
+    # Load procedure description        
+    log("1. Loading procedure description: %s" % procedure)
+        
+    # Loading describe sensor from source =====================================
+    res = req.get("%s/wa/istsos/services/%s/procedures/%s" % (
+        surl,
+        ssrv,
+        procedure
+        ), prefetch=True, auth=(suser, spwd), verify=False)
+    sdata = res.json
+    if sdata['success']==False:
+        raise Exception ("Description of procedure %s can not be loaded from source service: %s" % (procedure, sdata['message']))
+    else:
+        log("   > DS Source Ok.")
+            
+    # Loading describe sensor from destination ================================
+    res = req.get("%s/wa/istsos/services/%s/procedures/%s" % (
+            durl, dsrv, procedure
+        ), prefetch=True, auth=(duser, dpwd), verify=False)
+    ddata = res.json
+    if ddata['success']==False:
+        raise Exception ("Description of procedure %s can not be loaded from destination service: %s" % (procedure, ddata['message']))
+    else:
+        log("   > DS Destination Ok.")
+        
+    # Load of a getobservation template =======================================
+    res = req.get("%s/wa/istsos/services/%s/operations/getobservation/offerings/%s/procedures/%s/observedproperties/:/eventtime/last?qualityIndex=False" % (
+            durl, dsrv, 'temporary', procedure
+        ),  params={
+            "qualityIndex": cpqi
+        }, prefetch=True, auth=(duser, dpwd), verify=False)
+    dtemplate = res.json
+    if dtemplate['success']==False:
+        raise Exception ("Observation template of procedure %s can not be loaded: %s" % (procedure, dtemplate['message']))
+    else:
+        dtemplate = dtemplate['data'][0]
+        dtemplate['AssignedSensorId'] = ddata['data']['assignedSensorId']
+        dtemplate['result']['DataArray']['values'] = []
+        log("     > GO Template Ok.")
+
+    # Loading describe sensor from QI EXTRAPOLATION service ===================
+    if aurl and asrv:
+        res = req.get("%s/wa/istsos/services/%s/procedures/%s" % (
+                aurl, asrv, procedure
+            ), prefetch=True, auth=(auser, apwd), verify=False)
+        adata = res.json
+        if adata['success']==False:
+            raise Exception ("Description of procedure %s can not be loaded from destination service: %s" % (procedure, adata['message']))
+        else:
+            log("   > DS QI Extrapolation Ok.")
+
+    log("\n2. Identifying processing interval:")
+    
+    
+    # Check if mesaures are present in source procedure, if it is empty an exception is thrown
+    if (not 'constraint' in sdata['data']['outputs'][0] 
+            or not 'interval' in sdata['data']['outputs'][0]['constraint'] ):
+        raise Exception ("There is no data in the source procedure to be copied to the destination procedure.")
+    
+    # Check if the contraint interval contains a valid ISO date begin position
+    try:
+        iso.parse_datetime(sdata['data']['outputs'][0]['constraint']['interval'][0])
+    except Exception:
+        raise Exception ("The date in the source procedure constraint interval (%s) is not valid." % 
+            sdata['data']['outputs'][0]['constraint']['interval'][0])
+    
+    # Check if the contraint interval contains a valid ISO date end position
+    try:
+        iso.parse_datetime(sdata['data']['outputs'][0]['constraint']['interval'][1])
+    except Exception:
+        raise Exception ("The date in the source procedure constraint interval (%s) is not valid." % 
+            sdata['data']['outputs'][0]['constraint']['interval'][1])
+    
+    log("   > Source interval is valid")
+    
+    # Looking for start instant processing 
+    #   If the default value (*) is used, then the endPosition of 
+    #   the "destination" service procedure will be used. But if the destination
+    # procedure is empty , then the begin position of the source will be used
+    start = None
+    stop = None
+    if begin == "*":
+        if ('constraint' in ddata['data']['outputs'][0] 
+            and 'interval' in ddata['data']['outputs'][0]['constraint']):
+                try:
+                    # Using the end position of the destination will be used
+                    start = iso.parse_datetime(ddata['data']['outputs'][0]['constraint']['interval'][1])
+                    # Retroactive aggregation
+                    if retro > 0:
+                        if start-timedelta(minutes=retro) > iso.parse_datetime(ddata['data']['outputs'][0]['constraint']['interval'][0]):
+                            start = start-timedelta(minutes=retro)
+                        else:
+                            start = iso.parse_datetime(ddata['data']['outputs'][0]['constraint']['interval'][0])
+                except Exception:
+                    raise Exception ("The date in the destination procedure constraint interval (%s) is not valid." % 
+                        ddata['data']['outputs'][0]['constraint']['interval'][0])
+        else:
+            # Using the begin position of the source will be used
+            start = iso.parse_datetime(sdata['data']['outputs'][0]['constraint']['interval'][0])           
+    else:
+        start = iso.parse_datetime(begin)
+    
+    if end == "*":
+        stop = iso.parse_datetime(sdata['data']['outputs'][0]['constraint']['interval'][1])   
+    else:
+        stop = iso.parse_datetime(end)
+    
+    log("   > Destination interval is valid")
+    log("   > Start processing: %s" % start)
+    log("   > Stop processing: %s" % stop)
+    if retro > 0:
+        log("   > Retro aggregation: %s minutes" % retro)
+    
+    # Insertion loop step timedelta
+    interval = timedelta(days=15)
+    if start<stop and start+interval>stop:
+        interval = stop-start
+    
+    log("   > Insertion loop step: %s" % interval)
+        
+    if function and resolution:
+        try:
+            iso.duration_isoformat(resolution)
+        except:
+            raise Exception ("The resolution (%s) to apply in the aggrating function is not valid." % resolution)
+        log("   > Function(Resolution) : %s(%s)" % (function,resolution))
+        
+    while start+interval<=stop:        
+        
+        nextStart = start + interval
+        
+        params = {
+            "request": "GetObservation",
+            "service": "SOS",
+            "version": "1.0.0",
+            "observedProperty": ':',
+            "procedure": procedure,
+            "qualityIndex": str(cpqi),
+            "responseFormat": "application/json",
+            "offering": 'temporary',
+            "eventTime": "%s/%s" % (start.isoformat(), nextStart.isoformat())
+        }
+        
+        if function and resolution:
+            
+            params['aggregateFunction'] = function
+            params['aggregateInterval'] = resolution
+            
+            if nodataValue != None:
+                params['aggregateNodata'] = nodataValue
+            if nodataQI != None:
+                params['aggregateNodataQi'] = nodataQI
+        
+        res = req.get("%s/%s" % (surl,ssrv),  params=params, prefetch=True, auth=(suser, spwd), verify=False)
+        
+        # Check if an Exception occured
+        if 'ExceptionReport' in res.content:
+            raise Exception (res.content)
+        
+        smeasures = res.json['ObservationCollection']['member'][0]
+        #pp.pprint(smeasures)
+        
+        log("   > %s measures from: %s to: %s" % (len(smeasures['result']['DataArray']['values']), start.isoformat(), nextStart.isoformat()))
+        
+        dtemplate["samplingTime"] = {
+            "beginPosition": start.isoformat()
+        }
+        if lm and len(smeasures['result']['DataArray']['values'])>0:
+            dtemplate["samplingTime"]["endPosition"] = smeasures['result']['DataArray']['values'][-1][0]
+        else:
+            dtemplate["samplingTime"]["endPosition"] = nextStart.isoformat()
+            
+        dtemplate['result']['DataArray']['values'] = smeasures['result']['DataArray']['values']
+            
+        dtemplate['result']['DataArray']['field'] = smeasures['result']['DataArray']['field']
+        
+        # POST data to WA
+        res = req.post("%s/wa/istsos/services/%s/operations/insertobservation" % (
+            durl,
+            dsrv), 
+            prefetch=True,
+            auth=(duser, dpwd),
+            verify=False,
+            data=json.dumps({
+                "ForceInsert": "true",
+                "AssignedSensorId": ddata['data']['assignedSensorId'],
+                "Observation": dtemplate
+            })
+        )
+        
+        # read response
+        log("     > Insert observation success: %s" % res.json['success'])
+        
+        if not res.json['success']:
+            raise Exception ('Error inserting observation: %s' % res.json['message'])
+        
+        start = nextStart
+        if start<stop and start+interval>stop:
+            interval = stop-start
+        
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser(
+        description='Copy data from an istSOS service to another one, also re-aggregation function are permitted during the data transmission.')
+    
+    # SCRIPT CONFIGURATION
+    # =========================================================================
+    
+    parser.add_argument('-v','--verbose',
+        action = 'store_true',
+        dest   = 'v',
+        help   = 'Activate verbose debug')
+    
+    parser.add_argument('-procedure',
+        action = 'store',
+        dest   = 'procedure',
+        help   = 'Procedure name')
+    
+    parser.add_argument('-b', '--begin',
+        action = 'store',
+        dest   = 'begin',
+        default= '*',
+        metavar= '1978-10-08T03:56:00+01:00',
+        help   = 'Begin position date of the processing in ISO 8601. If the default value (%(default)s) is used, then the endPosition of the \"destination\" service procedure will be used.')
+    
+    parser.add_argument('-e', '--end',
+        action = 'store',
+        dest   = 'end',
+        default= '*',
+        metavar= '2014-01-27T11:27:00+01:00',
+        help   = 'End position date of the processing in ISO 8601. If the default value (%(default)s) is used, then the endPosition of the "source" service procedure will be used.')
+        
+    parser.add_argument('-u', '-user',
+        action = 'store',
+        dest   = 'user',
+        metavar= 'username',
+        help   = 'Global User valid for all connections')
+        
+    parser.add_argument('-p', '-pwd',
+        action = 'store',
+        dest   = 'pwd',
+        metavar= 'password',
+        help   = 'Global Password valid for all connections')
+    
+    parser.add_argument('-cpqi','--copyqualityindex',
+        action = 'store_true',
+        dest   = 'cpqi',
+        help   = 'Activate this will copy also the quality index from source to destination.')
+        
+    parser.add_argument('-f','--function',
+        action = 'store',
+        dest   = 'function',
+        choices=('SUM', 'AVG', 'MAX', 'MIN', 'COUNT'),
+        help   = 'Aggregate function to be applied (choices: %(choices)s).')
+        
+    parser.add_argument('-r','--resolution',
+        action = 'store',
+        dest   = 'resolution',
+        help   = 'The duration (in ISO 8601, eg: PT10M = 10 minutes) of the interval to be used with the aggregate function (-f | --function). If not set, the procedure\'s default resolution will be used (as defined in the describeSensor response).')
+        
+    parser.add_argument('-nv', '--nodataValue',
+        action = 'store',
+        dest   = 'nodataValue',
+        metavar= 'value',
+        default= 0,
+        help   = 'Substitute for nodata observation in aggregation functions (default: %(default)s).')
+        
+    parser.add_argument('-nvqi', '--nodataQI',
+        action = 'store',
+        dest   = 'nodataQI',
+        metavar= 'qi',
+        default= 110,
+        help   = 'Substitute for nodata quality index in aggregation functions (default: %(default)s).')
+        
+    parser.add_argument('--retro',
+        action = 'store',
+        dest   = 'retro',
+        default= 0,
+        type = int,
+        help   = 'Retroactively aggregate of %(default)s minutes in the past from the begin (normally used with begin = *)')
+        
+    parser.add_argument('-lm','--uselastmeasure',
+        action = 'store_true',
+        dest   = 'lm',
+        help   = 'Activate this to use the last measure as end position during copy, otherwise "-e | --end" will be used')
+        
+    # SOURCE istSOS CONFIG ==================================
+        
+    parser.add_argument('--surl',
+        action = 'store',
+        dest   = 'surl',
+        metavar= 'https://example.com/istsos',
+        help   = 'Base url with path of the source istSOS service')
+        
+    parser.add_argument('--ssrv',
+        action = 'store',
+        dest   = 'ssrv',
+        metavar= 'sosraw',
+        help   = 'Source service instance name')
+        
+    parser.add_argument('--suser',
+        action = 'store',
+        dest   = 'suser',
+        metavar= 'username',
+        help   = 'Username, if given this will be used for source istSOS')
+        
+    parser.add_argument('--spwd',
+        action = 'store',
+        dest   = 'spwd',
+        metavar= 'password',
+        help   = 'Password, if given this will be used for source istSOS')
+        
+        
+    # DESTINATION istSOS CONFIG =============================
+        
+    parser.add_argument('--durl',
+        action = 'store',
+        dest   = 'durl',
+        metavar= 'https://example.com/istsos',
+        help   = 'Base url with path of the destination istSOS service (if not given source url surl will be used)')
+        
+    parser.add_argument('--dsrv',
+        action = 'store',
+        dest   = 'dsrv',
+        metavar= 'sos',
+        help   = 'Destination service instance name')
+        
+    parser.add_argument('--duser',
+        action = 'store',
+        dest   = 'duser',
+        metavar= 'username',
+        help   = 'Username, if given this will be used for destination istSOS')
+        
+    parser.add_argument('--dpwd',
+        action = 'store',
+        dest   = 'dpwd',
+        metavar= 'password',
+        help   = 'Password, if given this will be used for destination istSOS')
+        
+       
+    # ALTERNATIVE istSOS SERVICE FOR QI EXTRAPOLATION ======= 
+        
+    parser.add_argument('--aurl',
+        action = 'store',
+        dest   = 'aurl',
+        metavar= 'https://example.com/istsos',
+        help   = 'Base url with path of the QI EXTRAPOLATION istSOS service')
+        
+    parser.add_argument('--asrv',
+        action = 'store',
+        dest   = 'asrv',
+        metavar= 'sosday',
+        help   = 'QI EXTRAPOLATION service instance name')
+        
+    parser.add_argument('--auser',
+        action = 'store',
+        dest   = 'auser',
+        metavar= 'username',
+        help   = 'Username, if given this will be used for istSOS QI EXTRAPOLATION')
+        
+    parser.add_argument('--apwd',
+        action = 'store',
+        dest   = 'apwd',
+        metavar= 'password',
+        help   = 'Password, if given this will be used for istSOS QI EXTRAPOLATION')
+        
+    args = parser.parse_args()
+    execute(args.__dict__)
\ No newline at end of file
diff --git a/scripts/raw2csv.py b/scripts/raw2csv.py
new file mode 100755
index 0000000..d9ddf2a
--- /dev/null
+++ b/scripts/raw2csv.py
@@ -0,0 +1,551 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+"""
+description:
+    
+    Base class to be extended by specialized implementation to 
+    handle different raw source files.
+    
+"""
+
+import sys
+import os
+from os import path
+import glob
+from datetime import datetime
+from datetime import timedelta
+import decimal
+from inspect import stack
+import pprint
+import tempfile
+pp = pprint.PrettyPrinter(indent=4)
+
+try:
+    sys.path.insert(0, path.abspath("."))
+    from lib.pytz import timezone
+    import lib.requests as requests
+    import lib.isodate as iso
+except ImportError as e:
+    print "\nError loading internal libs:\n >> please run the script from the istSOS root folder.\n\n"
+    raise e
+    
+class Converter():
+    def __init__(self, name, url, service, folderIn, pattern, folderOut=None, 
+                 qualityIndex=False, exceptionBehaviour={}, 
+                 user=None, password=None, debug=False, 
+                 csvlength=5000, 
+                 filenamecheck = None, archivefolder = None):
+        """
+        Info:        
+        
+        name: procedure name
+        url: url of the istSOS service
+        service: service instance name
+        folderIn: folder where raw data are stored (file:///home/pippo/rawdata)
+        pattern: name of the raw data file (can contains wildcard *, eg: "T_TRE_*.dat")
+        folderOut: folder where the formatted istSOS type files are created
+        qualityIndex: force a quality index value for all the observed properties
+        exceptionBehaviour: example {
+            "RedundacyError": "overwrite",
+            "StrictTimeSeriesError": "raise"
+        }
+        user and password: if user and password are required
+        ...
+        filenamecheck = {
+            'dateformat': '12_%Y-%m-%d_%H%M%S.dat',
+            'datetz': '+01:00',
+            'replace': ['_P','_M'],
+            'timedelta': timedelta(days=1)
+        }
+        """
+        
+        self.req = requests.session()
+        self.req.config['keep_alive'] = False
+    
+        self.name = name
+        self.url = url
+        self.service = service
+        self.folderIn = folderIn
+        self.pattern = pattern
+        self.folderOut = folderOut if folderOut is not None else tempfile.mkdtemp()
+        self.qualityIndex = qualityIndex
+        self.user = user
+        self.password = password
+        self.auth = (self.user, self.password) if (self.user != None and self.password != None) else None
+
+        self.debugfile = False
+        if debug == 'file':
+            self.debug = True
+            self.debugfile = open(os.path.join(self.folderOut, "log.txt"), "w")
+        else:
+            self.debug = debug
+        
+        self.archivefolder = archivefolder
+        
+        # Used inf the function "skipFile"
+        self.fndtz = '+01:00'
+        self.fntd = self.fnre = self.fndf = None
+        if type(filenamecheck) == type({}):
+            if 'dateformat' in filenamecheck:
+                self.fndf = filenamecheck['dateformat'] 
+            if 'datetz' in filenamecheck:
+                self.fndtz = filenamecheck['datetz'] 
+            if 'replace' in filenamecheck:
+                self.fnre = filenamecheck['replace'] 
+            if 'timedelta' in filenamecheck:
+                if not isinstance(filenamecheck['timedelta'], timedelta):
+                    raise InitializationError("filenamecheck configuration contains a timedelta attribute, it shall be and instance of datetime.timedelta.")
+                self.fntd = filenamecheck['timedelta'] 
+        
+        # >>> year = timedelta(days=365)
+
+        # Array where Observation are stored during the parse operation
+        self.observations = []
+        self.observationsCheck = {}
+        self.describe = None
+        self.endPosition = None
+        
+        if self.debug:
+            self.log("%s initialized." % self.name)
+        
+        
+        # Messages collected during processing
+        self.messages = []
+        self.warnings = []
+        self.exceptions = []
+        
+        # Single loop execution information
+        self.executing = {
+            'file': None
+        }
+                
+        # Load describeSensor from istSOS WALib (http://localhost/istsos/wa/istsos/services/demo/procedures/T_LUGANO)
+        self.loadSensorMetadata()
+    
+    def __del__(self):
+        self.log(" > End of conversion 4 %s. Bye bye.. ;)" % self.name)
+        if self.debugfile:
+            self.debugfile.flush()
+            self.debugfile.close()
+        if self.archivefolder:
+            self.archive() 
+    
+    def log(self, message):
+        if self.debug:
+            print message 
+            if self.debugfile:
+                self.debugfile.write("%s\n" % message)
+                
+    
+    def addMessage(self, message):
+        self.messages.append({
+            "stack": stack(),
+            "text": message
+        })
+        
+    def addWarning(self, message):
+        self.warnings.append({
+            "stack": stack(),
+            "text": message
+        })
+        
+    def addException(self, message):
+        self.exceptions.append({
+            "stack": stack(),
+            "text": message
+        })
+        
+    def parse(self, fileObj, name=None):
+        raise Exception("This function must be overwritten")
+    
+    def skipFile(self, name):
+        """
+        Usually the date of data transmission is inserted into the file name.
+        This function checks if the file is already registered, comparing the 
+        sampling time with the date of trasmission which shall be after 
+        the endPosition.
+        
+        To enable this check, self.fndf
+        
+        Some examples:
+            Filename / Date Format
+            12_2014-01-17_135000_M.dat / 12_%Y-%m-%d_%H%M%S_M.dat
+            
+        """
+        if not self.fndf: # Skip this filename check
+            return False
+            
+        ep = self.getDSEndPosition()
+        if ep == None:
+            return False
+        
+        n = name
+        if type(self.fnre) == type([]):
+            for rep in self.fnre:
+                n = n.replace(rep,'')
+            
+        dt = self.getDateTimeWithTimeZone(
+            datetime.strptime(n, self.fndf), self.fndtz
+        )
+        if self.fntd:
+            dt = dt + self.fntd
+        if not ep == None and ep < dt:
+            return False
+        return True
+    
+    def getDateTimeWithTimeZone(self, dt, tz):
+        dt = dt.replace(tzinfo=timezone('UTC'))
+        offset = tz.split(":")
+        return dt - timedelta(hours=int(offset[0]), minutes=int(offset[1]))
+    
+    def csv2istsos(self):
+        from scripts import csv2istsos
+        csv2istsos.datacache = {
+            self.name: self.describe
+        }
+        csv2istsos.execute({
+            'u': self.url,
+            's': self.service,
+            'wd': self.folderOut,
+            'p': [self.name]
+        },self)
+        
+    def istsos2istsos(self, ssrv, durl=None, function=None, resolution=None, nodataValue=None, nodataQI=None):
+        from scripts import istsos2istsos
+        istsos2istsos.execute({
+            'v': True,
+            'lm': True,
+            'procedure': self.name,
+            'surl': durl if durl is not None else self.url,
+            'ssrv': self.service,
+            'dsrv': ssrv,
+            'function': function if function is not None else None,
+            'resolution': resolution if resolution is not None else None,
+            'nodataValue': nodataValue if nodataValue is not None else None,
+            'nodataQI': nodataQI if nodataQI is not None else None
+        },self)
+    
+    def archive(self):
+        
+        import zipfile
+        
+        # Creating zip archive
+        archive = zipfile.ZipFile(
+            os.path.join(self.archivefolder, "%s_%s.zip" % (
+                self.name,
+                datetime.utcnow().strftime("%Y%m%d%H%M%S"))
+            ), "w") # Open the zip file for writing
+            
+        for root, dirs, files in os.walk(self.folderOut):
+            for f in files:
+                # adding files to zip archive
+                archive.write(os.path.join(root, f),f)
+         
+        archive.close()
+        
+        
+    def execute(self):
+        
+        self.observations = []
+        self.observationsCheck = {}
+        self.endPosition = None
+        
+        # Load and Check folderIn + pattern and sort alfabetically
+        fileArray = self.prepareFiles()
+            
+        for fileObj in fileArray:
+            if self.skipFile(os.path.split(fileObj)[1]):
+                if self.debug:
+                    self.log(" > Skipping file %s" % os.path.split(fileObj)[1])
+                continue
+            if self.debug:
+                self.log(" > Working on file %s" % os.path.split(fileObj)[1])
+            self.executing = {
+                "file": fileObj
+            }
+            dat = open(fileObj,'rU')
+            self.parse(dat,os.path.split(fileObj)[1])
+            dat.close()
+        
+        self.log(" > Parsed %s observations" % len(self.observations))
+        
+        # Validating array of observations
+        self.validate()
+        
+        # Save the CSV file in text/csv;subtype='istSOS/2.0.0'
+        if self.isEmpty(): # The procedure is registered but there are no observations
+            self.save()
+            return True
+        elif isinstance(self.getIOEndPosition(), datetime) and self.getIOEndPosition() > self.getDSEndPosition():
+            self.save()
+            return True
+        else:
+            self.log(" > Nothing to save")     
+            return False
+        
+    
+    def loadSensorMetadata(self):
+        """
+        Uses WALib to get the DescribeSensor document
+        """
+        # Loading the sensor description document using a DescribeSensor request
+        self.log(" > Loading Describe Sensor")
+        
+        res = self.req.get("%s/wa/istsos/services/%s/procedures/%s" % (
+                self.url,
+                self.service,
+                self.name
+            ), 
+            prefetch=True, 
+            auth=self.auth, 
+            verify=False
+        )
+        if res.json['success']==False:
+            raise IstSOSError ("Description of procedure %s can not be loaded: %s" % (self.name, res.json['message']))
+        self.describe = res.json['data']
+        
+        self.obsindex = []
+        for out in self.describe['outputs']:
+            if (out['definition'].find(":qualityIndex")>=0) and (self.qualityIndex==False):
+                continue
+            self.obsindex.append(out['definition'])
+            
+    def getDSBeginPosition(self):
+        if u'constraint' in self.describe['outputs'][0]:
+            return iso.parse_datetime(self.describe['outputs'][0]['constraint']['interval'][0])
+        return None
+        
+    def getDSEndPosition(self):
+        if u'constraint' in self.describe['outputs'][0]:
+            return iso.parse_datetime(self.describe['outputs'][0]['constraint']['interval'][1])
+        return None
+    
+    def isEmpty(self):
+        if self.getDSBeginPosition() == None and self.getDSEndPosition() == None:
+            return True
+        elif self.getDSBeginPosition() == self.getDSEndPosition():
+            return True
+        return False
+    
+    def getDefinitions(self):
+        ret = []
+        for key in self.describe['outputs']:
+            ret.append(key['definition'])
+        return ret
+    
+    def getIOEndPosition(self):
+        return self.endPosition
+        
+    def setEndPosition(self, endPosition):
+        if isinstance(endPosition, datetime) and endPosition.tzinfo is not None:
+            self.endPosition = endPosition
+        else:
+            raise IstSOSError("If you are setting the endPosition you shall use a datetime object with timezone")
+    
+    def prepareFiles(self):
+        """
+        Check if folder exist, and if file exist. And if there is at least one file. > Raise Exception
+        """
+        
+        self.log(" > Checking folder input (%s)" % self.folderIn)
+        
+        if not os.path.isdir(self.folderIn):
+            msg = "Input folder (%s) does not exist" % self.folderIn
+            self.addException(msg)
+            raise FileReaderError ( msg)
+        
+        files = filter(path.isfile, glob.glob(os.path.join(self.folderIn, "%s" % (self.pattern))))
+        files.sort()
+        
+        self.log(" > %s %s found" % (len(files), "Files" if len(files)>1 else "File"))
+            
+        return files
+        
+    def validate(self):
+        pass
+    
+    def addObservation(self, observation):
+        """
+        Validity check and raise exceptions (raise RedundacyError or manage)
+        
+        try:
+            importer.Converter.addObservation(self,observation)
+        except RedundacyError as e:
+            if "RedundacyError" in self.exceptionBehaviour:
+                pass
+            else:
+                raise e
+        pass
+        """
+        # Check if Observed property are observed by this procedure
+        obs = observation.getObservedProperties()
+        for o in obs:
+            if not o in self.obsindex:
+                raise ObservationError("Observation (%s) is not observed by this procedure." % (o))
+        
+        # Check if duplicate dates are present
+        if observation.getEventime() in self.observationsCheck:
+            # If the date is already present and the data added are different then it laounch an exception
+            if str(self.observationsCheck[observation.getEventime()]) != str(observation):
+                msg = "Observation (%s) is already present in the file (%)." % (observation, self.executing['file'])
+                self.addException(msg)
+                raise RedundacyError(msg)
+            else:
+                self.addWarning("Identical observation (%s) has been already processed (file %s), skipping." % (observation, self.executing['file']))
+        else:
+            self.observations.append(observation)
+            self.observationsCheck[observation.getEventime()]=observation
+    
+    def save(self):
+        """
+        Save the collected observation in the text/csv;subtype=istSOS/2.0.0
+        
+        with a file name composed of 
+          - name procedure
+          - underscore _
+          - datetime in UTC
+          - extension (.dat)
+        .astimezone(pytz.utc).isoformat()
+        """
+        self.log("End position: %s" % self.getIOEndPosition())
+        if len(self.observations)>0:
+            if self.getIOEndPosition() == None:
+                f = open(os.path.join(self.folderOut,"%s_%s.dat" %(
+                    self.name,
+                    datetime.strftime(self.observations[-1].getEventime().astimezone(timezone('UTC')), "%Y%m%d%H%M%S%f"))), 'w')
+            else:
+                if self.getIOEndPosition() < self.observations[-1].getEventime():
+                    raise IstSOSError("End position (%s) cannot be before the last observation event time (%s)" % (
+                        self.getIOEndPosition(), self.observations[-1].getEventime()))
+                f = open(os.path.join(self.folderOut,"%s_%s.dat" %(
+                    self.name,
+                    datetime.strftime(self.getIOEndPosition().astimezone(timezone('UTC')), "%Y%m%d%H%M%S%f"))), 'w')
+            f.write("%s\n" % ",".join(self.obsindex))
+            for o in self.observations:
+                f.write("%s\n" % o.csv(",",self.obsindex))
+        else:
+            # End position is used to advance the sampling time in cases where 
+            # there is a "no data" observation (rain)
+            if self.getIOEndPosition() == None:
+                raise IstSOSError("The file has no observations, if this happens, you shall use the setEndPosition function to set the endPosition manually")
+            f = open(os.path.join(self.folderOut,"%s_%s.dat" %(
+                self.name,
+                datetime.strftime(self.getIOEndPosition().astimezone(timezone('UTC')), "%Y%m%d%H%M%S%f"))), 'w')
+            f.write("%s\n" % ",".join(self.obsindex))
+        f.close()
+        
+class InitializationError(Exception):
+    pass
+        
+class RedundacyError(Exception):
+    pass
+
+class IstSOSError(Exception):
+    pass
+
+class FileReaderError(Exception):
+    pass
+
+class ObservationError(Exception):
+    pass
+    
+
+class Observation:
+    "Single Measure"
+    fmt = '%Y-%m-%dT%H:%M:%S.%f%z'
+    def __init__(self, eventime, values):
+        self.setEventime(eventime)
+        self.setValue(values)
+        pass
+
+    def getValue(self):
+        return self.__value
+
+    def setValue(self, values):
+        if type(values) == type({}):
+            self.__value = {}
+            for s in values:
+                v = float(values[s])
+                # Controllo vinculo valore numerico
+                if isinstance(v, (int, long, float, decimal.Decimal)):
+                    self.__value[s]= v
+                else:
+                    raise TypeError, ('Observations.setValue( %s ): it must be Numeric') % values
+                    
+    def getObservedProperties(self):
+        return self.__value.keys()
+                    
+    def getEventime(self):
+        return self.__eventime
+
+    def setEventime(self, eventime):
+        if isinstance(eventime, datetime) and eventime.tzinfo is not None:
+            self.__eventime = eventime
+        else:
+            raise TypeError, ('eventime arg.: it must be a Datetime Object with timezone. [%s]' % eventime)
+        pass
+    
+    def setObservedValue(self,obs,value):
+        self.__value[obs] = value
+
+    def getObservedValue(self,obs):
+        return self.__value[obs]
+
+    def __str__(self):
+        vals = []
+        tmp = self.getValue()
+        for t in tmp:
+            vals.append("%s" % tmp[t])
+        return self.getEventime().strftime(self.fmt) + " | %s" % " | ".join(vals)
+    
+    def __cmp__(self, other):
+        if self.getEventime() > other.getEventime():
+            return 1
+        elif self.getEventime() == other.getEventime():
+            return 0
+        else: # self.setEventime() < other.setEventime():
+            return -1
+
+    def __eq__(self, other):
+        if other == None:
+            return False
+        elif self.getEventime() == other.getEventime():
+            return True
+        else:
+            return False
+
+    def __ne__(self, other):
+        if other == None:
+            return True
+        elif self.getEventime() == other.getEventime():
+            return False
+        else:
+            return True
+            
+    def csv(self, separator=",", pattern=None):
+        vals = []
+        if pattern != None:
+            for p in pattern:
+                if (p.rfind('iso8601') == -1): 
+                    vals.append(str(self.getObservedValue(p)))
+        else:
+            vs = self.getValue()
+            for key, value in vs.items():
+                vals += [str(value)]
+        return "%s%s%s" % (self.getEventime().strftime(self.fmt), separator, separator.join(vals))
diff --git a/scripts/sos2istsos.py b/scripts/sos2istsos.py
new file mode 100755
index 0000000..d75cff4
--- /dev/null
+++ b/scripts/sos2istsos.py
@@ -0,0 +1,622 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+'''
+This script get minimal metadata from an existing SOS and populate an istsos instance
+'''
+
+import sys
+import traceback
+import json
+import pprint
+from datetime import timedelta
+import calendar
+import time
+from StringIO import StringIO
+from os import path
+
+#print path.abspath(".")
+#print path.normpath("%s/../" % path.abspath("."))
+#print path.abspath(path.dirname(__file__))
+#print path.normpath("%s/../../" % path.abspath(__file__))
+
+sys.path.insert(0, path.abspath("."))
+try:
+    import lib.requests as req
+    import lib.argparse as argparse
+    from lib.etree import et
+    import lib.isodate as iso
+except ImportError as e:
+    
+    print "\nError loading internal libs:\n >> did you run the script from the istSOS root folder?\n\n"
+    exit()
+    #raise e
+    
+fmt = '%Y-%m-%dT%H:%M:%S.%f%z'
+fmtshort = '%Y-%m-%dT%H:%M%z'
+
+class Procedure():
+    def __init__(self,name,offering,url,service):
+        self.offering = offering
+        self.url = url
+        self.service = service
+        self.oid = ""
+        self.begin = ""
+        self.end = ""
+        self.template = None
+        self.data = {
+            "system_id": "",
+            "system": "",
+            "classification": [
+                {
+                    "name": "System Type",
+                    "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType",
+                    "value": "insitu-fixed-point"
+                },
+                {
+                    "name": "Sensor Type",
+                    "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType",
+                    "value": "unknown"
+                }
+            ],
+            "outputs": [
+                {
+                    "name": "Time",
+                    "definition": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601",
+                    "uom": "iso8601",
+                    "description":"",
+                    "constraint":{}
+                }
+            ],
+            "description": "",
+            "keywords": "",
+            "identification": [{
+                    "definition":'urn:ogc:def:identifier:OGC:uniqueID',
+                    "name":"uniqueID",
+                    "value":""
+            }],
+            "characteristics": "",
+            "contacts": [{"role":"urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:owner","organizationName":"Istituto scienze della Terra","individualName":"Maurizio Pozzoni","voice":"+41(0)586666200","fax":"+41(0)586666209","email":"ist at supsi.ch","web":"http://www.supsi.ch/ist","deliveryPoint":"Via Trevano, c.p. 72","city":"Canobbio","administrativeArea":"Ticino","postalcode":"6952","country":"Svizzera"}],
+            "documentation": [],
+            "interfaces": "",
+            "inputs": [],
+            "history": [],
+            "capabilities": []
+        }
+        self.data["system"] = name
+        self.data["system_id"] = name
+        self.data["identification"][0]["value"] = "urn:ogc:def:procedure:x-istsos:1.0:%s" % (name)
+    
+    def __str__(self):
+        return "%s" % (self.data["system"])
+    
+    def setSystemType(self, systemType):
+        if systemType in ['virtual','insitu-fixed-point']:
+            self.data['location']['classification'][0]['value'] = systemType
+        else:
+            raise Exception("System type supported virtual, insitu-fixed-point only.")
+    
+    def setFoi(self, name, epsg, point):
+        self.data['location'] = {
+            "type": "Feature",
+            "geometry": {
+                "type": "Point",
+                "coordinates": point
+            },
+            "crs": {
+                "type": "name",
+                "properties": {"name": epsg}
+            },
+            "properties": {"name": name}
+        }
+    
+    def addObservedProperty(self, name, definition, uom):
+        self.data["outputs"].append({
+            "name":name,
+            "definition":"urn:ogc:def:parameter:x-istsos:1.0:%s" % definition,
+            "uom":uom,
+            "description":"",
+            "constraint":{}
+        });
+        
+    def getIoTemplate(self):
+        if not self.template:
+            res = req.get(
+                "%s/wa/istsos/services/%s/operations/getobservation/offerings/%s/procedures/%s/observedproperties/urn/eventtime/last" % (
+                    self.url,
+                    self.service,
+                    self.offering,
+                    self.data["system"]
+                )
+            )
+            try:
+                self.template = res.json['data'][0]
+            except Exception as e:
+                print res.text
+                raise e
+        return self.template #res.json['data'][0]
+
+    
+def parse_and_get_ns(xml):
+    events = "start", "start-ns"
+    root = None
+    ns = {}
+    for event, elem in et.iterparse(xml, events):
+        if event == "start-ns":
+            if elem[0] in ns and ns[elem[0]] != elem[1]:
+                raise KeyError("Duplicate prefix with different URI found.")
+            ns[elem[0]] = "%s" % elem[1]
+        elif event == "start":
+            if root is None:
+                root = elem 
+    return et.ElementTree(root), ns
+   
+def execute (args):  
+    pp = pprint.PrettyPrinter(indent=2)
+    try:
+    
+        debug = args['v']
+        test = args['t']
+        
+        procs = args['p']
+        omit = args['o']
+        procedures = {}
+        
+        src = args['s']
+        dst = args['d']
+        srv = args['n']
+        
+        appendData = False
+        if 'a' in args:
+            appendData = True
+        
+        
+        dfrom = None
+        dto = None
+        if 'from' in args and type('') == type(args['from']):
+            print "From: %s" % args['from']
+            dfrom = iso.parse_datetime(args['from'])
+            appendData = None
+        if 'to' in args and type('') == type(args['to']):
+            print "To: %s" % args['to']
+            dto = iso.parse_datetime(args['to'])
+            appendData = None
+        
+        registerOnly = args['r']
+        
+        virtual = False
+        hq = False
+        
+        
+        # Executing request
+        res = req.get("%s" % (src), params={
+            'service': 'SOS', 
+            'version': '1.0.0',
+            'request': 'GetCapabilities',
+            'section': 'contents'
+        }, prefetch=True, verify=False)
+        
+        # Parsing response
+        gc, gcNs = parse_and_get_ns(StringIO(res.content))
+        
+        # Extract all offerings
+        elOfferings = gc.findall("{%s}Contents/{%s}ObservationOfferingList/{%s}ObservationOffering" % (gcNs['sos'],gcNs['sos'],gcNs['sos']) )
+        
+        for offering in elOfferings:
+            offeringName = offering.find("{%s}name" % (gcNs['gml']) ).text.split(":")[-1]
+            
+            # For each offering get the procedures
+            elProcs = offering.findall("{%s}procedure" % (gcNs['sos']) )
+            for p in elProcs:
+                pname = p.get('{%s}href' % gcNs['xlink'])
+                
+                if (
+                        type(procs) == type([]) and pname not in procs
+                    ) or (
+                        type(omit) == type([]) and pname in omit
+                    ):
+                    continue
+                    
+                #print pname
+                procedures[pname] = Procedure(pname, offeringName, dst, srv)
+                
+                if virtual:
+                    procedures[pname].setSystemType('virtual')
+                               
+                res = req.get("%s" % (src), params={
+                    'service': 'SOS', 
+                    'version': '1.0.0',
+                    'request': 'DescribeSensor',
+                    'outputFormat': 'text/xml;subtype=\'sensorML/1.0.0\'',
+                    'procedure': pname
+                }, prefetch=True, verify=False)
+                
+                ds, dsNs = parse_and_get_ns(StringIO(res.content))
+                
+                #print res.content
+                
+                
+                #print "Root: %s" % ds.getroot().tag
+                if ds.getroot().tag == 'ExceptionReport':
+                    print "Error on DS for %s" % pname
+                    continue
+                    
+                elDescribe = ds.findall("member/{%s}System/{%s}outputs/{%s}OutputList/{%s}output" % (dsNs['sml'],dsNs['sml'],dsNs['sml'],dsNs['sml']) )
+                
+                #print "Outputs found: %s" % len(elDescribe)
+                
+                observedProperties = []
+                for ds in elDescribe:
+                    definition = ds.find("{%s}ObservableProperty" % (dsNs['swe'])).get('definition').replace('urn:ogc:def:parameter:x-ist::','')
+                    #print definition
+                    if definition.find('time:iso8601')<0:
+                        observedProperties.append(definition)
+                
+                res = req.get("%s" % (src), params={
+                    'service': 'SOS', 
+                    'version': '1.0.0',
+                    'request': 'GetObservation',
+                    'offering': offeringName,
+                    'responseFormat': 'text/xml;subtype=\'sensorML/1.0.0\'',
+                    'procedure': pname,
+                    'observedProperty': ",".join(observedProperties)
+                }, prefetch=True, verify=False)
+                              
+                go, goNs = parse_and_get_ns(StringIO(res.content))
+                
+                
+                if go.getroot().tag == 'ExceptionReport':
+                    print "Error on GO for %s:\nparams:%s\n%s" % (pname,{
+                        'service': 'SOS', 
+                        'version': '1.0.0',
+                        'request': 'GetObservation',
+                        'offering': offeringName,
+                        'responseFormat': 'text/xml;subtype=\'sensorML/1.0.0\'',
+                        'procedure': pname,
+                        'observedProperty': ",".join(observedProperties)
+                    },res.content)
+                    continue
+                
+                # Extracting begin and end position
+                begin = go.find("{%s}member/{%s}Observation/{%s}samplingTime/{%s}TimePeriod/{%s}beginPosition" % (
+                    goNs['om'], goNs['om'], goNs['om'], goNs['gml'], goNs['gml'])
+                )
+                end = go.find("{%s}member/{%s}Observation/{%s}samplingTime/{%s}TimePeriod/{%s}endPosition" % (
+                    goNs['om'], goNs['om'], goNs['om'], goNs['gml'], goNs['gml'])
+                )
+                procedures[pname].begin = begin.text
+                procedures[pname].end  = end.text
+                
+                # Extracting Feature of Interest and coordinates
+                foi = go.find("{%s}member/{%s}Observation/{%s}featureOfInterest" % (
+                    goNs['om'], goNs['om'], goNs['om'])
+                )
+                point = foi.find("{%s}Point" % (
+                    goNs['gml'])
+                )
+                coord = point.find("{%s}coordinates" % (
+                    goNs['gml'])
+                )
+                
+                procedures[pname].setFoi(
+                    foi.get('{%s}href' % gcNs['xlink']).split(":")[-1],
+                    point.get('srsName'),
+                    coord.text.split(",")
+                )
+                
+                # Extracting UOM
+                fields = go.findall("{%s}member/{%s}Observation/{%s}result/{%s}DataArray/{%s}elementType/{%s}DataRecord/{%s}field" % (
+                    goNs['om'], goNs['om'], goNs['om'], goNs['swe'], goNs['swe'], goNs['swe'], goNs['swe'])
+                )
+                
+                for field in fields:
+                    if field.get('name')!='Time':
+                        qty = field.find("{%s}Quantity" % (
+                            goNs['swe'])
+                        )
+                        uom = field.find("{%s}Quantity/{%s}uom" % (
+                            goNs['swe'],goNs['swe'])
+                        )                        
+                        procedures[pname].addObservedProperty(
+                            field.get('name'),
+                            qty.get('definition').replace('urn:ogc:def:parameter:x-ist::',''), 
+                            uom.get('code')
+                        )
+                
+                if dfrom:
+                    begin = dfrom
+                    _begin = dfrom
+                else:
+                    begin = iso.parse_datetime(procedures[pname].begin)
+                    _begin = iso.parse_datetime(procedures[pname].begin)
+                    
+                if dto:
+                    end = dto
+                else:
+                    end = iso.parse_datetime(procedures[pname].end)
+                
+                # ~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~
+                # REGISTRATION PROCESS
+                # ~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~
+                
+                # Check if procedure already exist
+                res = req.get("%s/wa/istsos/services/%s/procedures/%s" % (dst,srv,pname))  
+                if not res.json["success"]:
+                    # Registering procedure to istSOS   
+                    res = req.post("%s/wa/istsos/services/%s/procedures" % (dst,srv), 
+                            data=json.dumps(procedures[pname].data)
+                    ) 
+                    if not res.json["success"]:
+                        print json.dumps(procedures[pname].data)
+                        raise Exception("Registering procedure %s failed: \n%s" % (pname, res.json["message"]))
+                    
+                    # Getting details (describe sensor) to get the assignedSensorId
+                    res = req.get("%s/wa/istsos/services/%s/procedures/%s" % (dst,srv,pname))  
+                    
+                    # Getting an InsertObservation template
+                    template = procedures[pname].getIoTemplate()  
+                    
+                else:
+                    # Getting an InsertObservation template
+                    template = procedures[pname].getIoTemplate()  
+                    try:
+                        if appendData and ('endPosition' in template['samplingTime']):
+                            procedures[pname].begin = template['samplingTime']['endPosition']
+                            begin = iso.parse_datetime(template['samplingTime']['endPosition'])     
+                    except Exception as exproc:
+                        print res.text
+                        raise exproc
+                
+                procedures[pname].oid = res.json["data"]["assignedSensorId"]
+                days = int(args['i'])
+                interval = timedelta(days=int(days))
+                
+                
+                if not registerOnly:
+                
+                    if virtual and hq:
+                        # ~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~
+                        # VIRTUAL PROCEDURE CODE INITIALIZATION
+                        # ~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~
+                        pass
+                        
+                    else:
+                        # ~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~
+                        # PROCEDURE OBSERVATIONS MIGRATION
+                        # ~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~
+                        
+                        oOrder = []
+                        
+                        passedLoops = 0
+                        
+                        lastPrint = ""
+                        
+                        startTime = time.time()
+                        
+                        print "%s: %s - %s" % (pname, procedures[pname].begin, procedures[pname].end)
+                        
+                        if begin<end and begin+interval>end:
+                            interval = end-begin
+                        
+                        while (begin+interval)<=end:
+                            loopTotalTime = time.time()
+                                
+                            nextPosition = begin + interval
+                            
+                            passedLoops = passedLoops+1
+                            
+                            t = float(calendar.timegm(end.utctimetuple())-calendar.timegm(_begin.utctimetuple()))
+                            t1 = float(calendar.timegm(nextPosition.utctimetuple())-calendar.timegm(_begin.utctimetuple()))
+                            percentage = round((t1/t)*100,2)
+                            if percentage > 100:
+                                percentage = 100
+                            lastPrint = "%s > %s%% (%s / %s %s days)" % ("\b"*len(lastPrint),percentage, begin.strftime(fmtshort), nextPosition.strftime(fmtshort), days)
+                            
+                            looptime = time.time()
+                            # GetObservation from source SOS
+                            params={
+                                'service': 'SOS', 
+                                'version': '1.0.0',
+                                'request': 'GetObservation',
+                                'eventTime': '%s/%s' % (
+                                        begin.strftime(fmt),
+                                        nextPosition.strftime(fmt)),
+                                'qualityIndex': 'True',
+                                'offering': offeringName,
+                                'responseFormat': 'text/xml;subtype=\'sensorML/1.0.0\'',
+                                'procedure': pname,
+                                'observedProperty': ",".join(observedProperties)
+                            }
+                            try:
+                                res = req.get("%s" % (src), params=params, prefetch=True, verify=False)
+                            except Exception:
+                                res = req.get("%s" % (src), params=params, prefetch=True, verify=False)
+                            
+                            gotime = timedelta(seconds=int(time.time() - looptime))
+                            
+                            if gotime > timedelta(seconds=int(10)):
+                                if days > 1:
+                                    days = int(days/2)
+                                    if days <= 1:
+                                        days = 1 
+                                interval = timedelta(days=days)
+                            elif gotime < timedelta(seconds=int(5)):
+                                days = days + 1
+                                interval = timedelta(days=days)
+                            
+                            lastPrint = "%s - GO: '%s'" % (lastPrint, gotime)
+                            
+                            go, goNs = parse_and_get_ns(StringIO(res.content))
+                            
+                            #print res.text
+                            
+                            if len(oOrder)==0:
+                                fields = go.findall("{%s}member/{%s}Observation/{%s}result/{%s}DataArray/{%s}elementType/{%s}DataRecord/{%s}field" % (
+                                    goNs['om'], goNs['om'], goNs['om'], goNs['swe'], goNs['swe'], goNs['swe'], goNs['swe'])
+                                )
+                                for field in fields:
+                                    oOrder.append(qty.get('definition').replace('urn:ogc:def:parameter:x-ist::',''))
+                            
+                            values = go.find("{%s}member/{%s}Observation/{%s}result/{%s}DataArray/{%s}values" % (
+                                goNs['om'], goNs['om'], goNs['om'], goNs['swe'], goNs['swe'])
+                            )
+                            
+                            if values.text:
+                            
+                                rows = values.text.strip().split("@")
+                                
+                                lastPrint = "%s " % (lastPrint)
+                                
+                                copy = []
+                                
+                                for row in rows:
+                                    copy.append(row.split(","))
+                                
+                                # InsertObservation to istSOS
+                                template['result']['DataArray']['values'] = copy
+                                template['samplingTime'] = {
+                                    "beginPosition": begin.strftime(fmt),
+                                    "endPosition": nextPosition.strftime(fmt)
+                                }
+                                
+                                template[u"AssignedSensorId"] = procedures[pname].oid
+                                
+                                looptime = time.time() 
+                                res = req.post("%s/wa/istsos/services/%s/operations/insertobservation" % (
+                                    dst,
+                                    srv
+                                ),data = json.dumps({
+                                    u"AssignedSensorId": procedures[pname].oid,
+                                    u"ForceInsert": u"true",
+                                    u"Observation": template
+                                }))
+                                iotime = timedelta(seconds=int(time.time() - looptime))
+                                lastPrint = "%s - IO: '%s'" % (lastPrint, iotime)
+                                                    
+                            begin = nextPosition
+                            if begin<end and begin+interval>end:
+                                interval = end-begin
+                                
+                            if percentage < 100:
+                                lastPrint = "%s - Step time: '%s' - Elapsed: %s  " % (
+                                    lastPrint, 
+                                    timedelta(seconds=int(time.time() - loopTotalTime)), 
+                                    timedelta(seconds=int(time.time() - startTime))
+                                )
+                            else:
+                                lastPrint = "%s - Step time: '%s'  " % (
+                                    lastPrint, 
+                                    timedelta(seconds=int(time.time() - loopTotalTime))
+                                )
+                            
+                            sys.stdout.write(lastPrint)
+                            sys.stdout.flush()
+                        
+                        
+                        print " > Completed in %s" % timedelta(seconds=int(time.time() - startTime))
+            
+    except Exception as e:    
+        print "ERROR: %s\n\n" % e
+        traceback.print_exc()
+        
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser(
+        description='Import data from an external SOS to an istSOS instance.')
+    
+    parser.add_argument('-p', 
+        action='store',
+        dest='p',
+        nargs='+',
+        metavar='procedures',
+        default= 'ALL',
+        help='List of procedures to be migrated, (default: %(default)s).')
+        
+    parser.add_argument('-o', 
+        action='store',
+        dest='o',
+        nargs='+',
+        metavar='procedures',
+        help='List of procedures to be omitted.')
+        
+    parser.add_argument('-s',
+        action = 'store',
+        required=True,
+        dest   = 's',
+        metavar= 'surl',
+        help   = 'Source SOS Server address IP (or domain name).')
+        
+    parser.add_argument('-d',
+        action = 'store',
+        required=True,
+        dest   = 'd',
+        metavar= 'durl',
+        help   = 'Destination istSOS Server address IP (or domain name).')
+    
+    parser.add_argument('-n',
+        action = 'store',
+        required=True,
+        dest   = 'n',
+        metavar= 'service',
+        help   = 'The name of the service instance.')
+    
+    parser.add_argument('-r','--registeronly',
+        action = 'store_true',
+        dest   = 'r',
+        help   = 'Add this parameter if you want to register the procedures without migrating the data.')
+    
+    
+    parser.add_argument('-a',
+        action = 'store_true',
+        dest   = 'a',
+        help   = 'Add this parameter, if you want to replace all the dataset instead of appending after existing observations.')
+    
+    parser.add_argument('--from', 
+        action='store',
+        dest='from',
+        default= None,
+        help='Import observations from date (ISODATE Format).')  
+        
+    parser.add_argument('--to', 
+        action='store',
+        dest='to',
+        default= None,
+        help='Import observations to date (ISODATE Format).')  
+        
+    parser.add_argument('-i', 
+        action='store',
+        dest='i',
+        default= '14',
+        help='Days interval, (default: %(default)s).')  
+          
+    parser.add_argument('-v','--verbose',
+        action = 'store_true',
+        dest   = 'v',
+        help   = 'Activate verbose debug')
+        
+    parser.add_argument('-t','--test',
+        action = 'store_true',
+        dest   = 't',
+        help   = 'Use to test the command, deactivating the insert observation operations.')
+        
+
+    args = parser.parse_args()
+    #print args.__dict__
+    execute(args.__dict__)
+
+
+
diff --git a/scripts/sos_virtualHQ_importer.py b/scripts/sos_virtualHQ_importer.py
new file mode 100755
index 0000000..bd47443
--- /dev/null
+++ b/scripts/sos_virtualHQ_importer.py
@@ -0,0 +1,265 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+'''
+This script get creates an HQ virtual procedure from an existing virtual procedure and curve rating file
+
+Usage example: 
+    
+python scripts/sos_virtual_importer.py \
+    -s http://localhost/istsos \
+    -n sos \
+    -vp Q_MAG_LOD \
+    -sp A_MAG_LOD \
+    -so urn:ogc:def:parameter:x-istsos:1.0:river:water:height \
+    -sf test/scripts/data/in/HQ_curves/A_MAG_LOD_HQ.dat
+
+'''
+
+import sys
+import traceback
+import json
+import pprint
+from os import path
+
+print path.abspath(".")
+print path.normpath("%s/../" % path.abspath("."))
+print path.abspath(path.dirname(__file__))
+print path.normpath("%s/../../" % path.abspath(__file__))
+
+sys.path.insert(0, path.abspath("."))
+
+try:
+    import lib.requests as req
+    import lib.argparse as argparse
+except ImportError as e:
+    
+    print "\nError loading internal libs:\n >> did you run the script from the istSOS root folder?\n\n"
+    exit()
+    #raise e
+    
+fmt = '%Y-%m-%dT%H:%M:%S.%f%z'
+fmtshort = '%Y-%m-%dT%H:%M%z'
+
+proc = """{"system_id":"V_TEST",
+           "system":"V_TEST",
+           "description":"",
+           "keywords":"",
+           "identification":[{
+                    "definition":"urn:ogc:def:identifier:OGC:uniqueID",
+                    "name":"uniqueID",
+                    "value":""
+            }],
+           "classification":[
+               {"name":"System Type",
+                "definition":"urn:ogc:def:classifier:x-istsos:1.0:systemType",
+                "value":"virtual"},
+               {"name":"Sensor Type",
+                "definition":"urn:ogc:def:classifier:x-istsos:1.0:sensorType",
+                "value":"virtual"}],
+           "characteristics":"",
+           "contacts":[],
+           "documentation":[],
+           "capabilities":[],
+           "location":{},
+           "interfaces":"",
+           "inputs":[],
+           "outputs":[
+               {"name":"Time",
+                "definition":"urn:ogc:def:parameter:x-istsos:1.0:time:iso8601",
+                "uom":"iso8601",
+                "description":"",
+                "constraint":{}},
+               {"name":"water-discharge",
+                "definition":"urn:ogc:def:parameter:x-istsos:1.0:river:water:discharge",
+                "uom":"m3/s",
+                "description":"",
+                "constraint":{}}],
+            "history":[]}"""
+            
+def RCload(filename):
+    #load HQ virtual procedure conf file to a list of dictionaries
+    cvlist=[]
+    with open(filename) as f:
+        lines = f.readlines()
+        items = [ i.strip().split("|") for i in lines if i.strip()!="" ]
+        fields = items[0]
+        for i in range(1,len(items)):
+            cvdict = {}
+            for f, field in enumerate(fields):
+                cvdict[field]= items[i][f]
+            cvlist.append(cvdict)
+    return cvlist
+    
+def execute (args):  
+    pp = pprint.PrettyPrinter(indent=2)
+    try:
+
+        sosurl = args['s']
+        sosservice = args['n']
+        vproc = args['vproc']
+        sproc = args['sproc']
+        sobs = args['sobs']
+        sfile = args['sfile']
+        #verbose = args['v']
+        
+        # get source procedure
+        #======================
+        spr = req.get("%s/wa/istsos/services/%s/procedures/%s" % (sosurl,sosservice,sproc))
+        if not spr.json["success"]:
+            raise Exception("Getting procedure description for '%s' unsuccessfull" % sproc)
+        
+        # creating the virtual procedure
+        #======================
+        npv = json.loads(proc)
+        
+        #-- set new procedure name        
+        npv['system_id'] = vproc
+        npv['system'] = vproc
+        npv["identification"][0]["value"] = "urn:ogc:def:procedure:x-istsos:1.0:%s" % (vproc)
+        
+        #-- set new procedure systemType
+        for c in npv['classification']:
+            c['value']='virtual'
+            
+        #-- set new procedure FOI
+        npv['location'] = spr.json['data']['location']
+        
+        #-- register new procedure 
+        res = req.post("%s/wa/istsos/services/%s/procedures" % (sosurl,sosservice), 
+                data=json.dumps(npv)
+        )
+        
+        if not res.json["success"]:
+            if res.json["message"].find("already exist")<0:
+                raise Exception("Registering procedure %s failed: \n%s" % (vproc, res.json["message"]))
+            else:
+                cvlist = RCload(sfile)
+                res = req.post("%s/wa/istsos/services/%s/virtualprocedures/%s/ratingcurve" % (sosurl,sosservice,vproc), 
+                    data=json.dumps(cvlist)
+                )
+                if not res.json["success"]:
+                    raise Exception("Saving rating curve %s failed: \n%s" % (vproc, res.json["message"]))
+        else:
+            # loading the virtual procedure code
+            #===================================
+            code = "# -*- coding: utf-8 -*-\n"
+            code += "from istsoslib.responders.GOresponse import VirtualProcessHQ\n"
+            code += "class istvp(VirtualProcessHQ):\n"
+            code += "    # Declaring procedure from witch data will be calculated\n"
+            code += "    procedures = {\n"
+            found = False        
+            for out in spr.json["data"]["outputs"]:
+                if out["definition"]==sobs:
+                    found = True
+            if found:
+                code += """        "%s": "%s"\n""" %(sproc,sobs)
+            else:
+                raise Exception("%s not observed by %s procedure" %(sproc,sobs))
+            code += """    }\n"""
+            
+    
+            scode = {"code":code}        
+            
+            res = req.post("%s/wa/istsos/services/%s/virtualprocedures/%s/code" % (sosurl,sosservice,vproc), 
+                data=json.dumps(scode)
+            )  
+                        
+            if not res.json["success"]:
+                raise Exception("Saving code %s failed: \n%s" % (vproc, res.json["message"]))
+             
+            cvlist = RCload(sfile)
+            print cvlist
+            res = req.post("%s/wa/istsos/services/%s/virtualprocedures/%s/ratingcurve" % (sosurl,sosservice,vproc), 
+                                data=json.dumps(cvlist)
+                        )  
+            if not res.json["success"]:
+                raise Exception("Saving rating curve %s failed: \n%s" % (vproc, res.json["message"]))
+        
+            
+    except Exception as e:    
+        print "ERROR: %s\n\n" % e
+        #traceback.print_exc()
+        
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser(
+        description='Import data from an external SOS to an istSOS instance.')
+
+    parser.add_argument('-s',
+        action = 'store',
+        required=True,
+        dest   = 's',
+        metavar= 'soUrl',
+        help   = 'SOS Server address IP (or domain name).')
+    
+    parser.add_argument('-n',
+        action = 'store',
+        required=True,
+        dest   = 'n',
+        metavar= 'service',
+        help   = 'The name of the service instance.')
+    
+    parser.add_argument('-vp',
+        action = 'store',        
+        required=True,
+        dest = 'vproc',
+        metavar='virtualProcedure',
+        help='Name of the new Virtual Procedure')
+    
+#    parser.add_argument('-vo',
+#        action = 'store',
+#        required=True,
+#        dest = 'vobs',        
+#        metavar='virtualObsProp',
+#        help='Name of virtual observed property')
+    
+    parser.add_argument('-sp',
+        action = 'store',
+        required=True,
+        dest = 'sproc',
+        metavar='sourceProcedure',
+        help='Name of the original Procedure which the virtual relies to')
+        
+    parser.add_argument('-so',
+        action = 'store',
+        required=True,
+        dest = 'sobs',
+        metavar='sourceObsProp',
+        help='Name of original observed property which the virtual relies to')
+    
+    parser.add_argument('-sf',
+        action = 'store',
+        required=False,
+        dest = 'sfile',
+        metavar='sourceFile',
+        default = None,
+        help='Name of rating curve file which the virtual relies to')
+    
+    parser.add_argument('-v','--verbose',
+        action = 'store_true',
+        dest   = 'v',
+        help   = 'Activate verbose debug')
+        
+       
+
+    args = parser.parse_args()
+    #print args.__dict__
+    execute(args.__dict__)
+
+
+
diff --git a/services/default.cfg b/services/default.cfg
new file mode 100755
index 0000000..5f68ed7
--- /dev/null
+++ b/services/default.cfg
@@ -0,0 +1,94 @@
+[serviceType]
+version = 1.0.0
+codespace = http://opengeospatial.net
+value = OGC:SOS
+
+[getobservation]
+correct_qi = 110
+stat_qi = 200
+aggregate_nodata_qi = -100
+default_qi = 100
+aggregate_nodata = -999.9
+maxGoPeriod = 200
+transactional_log = False
+
+[serviceurl]
+url = http://localhost/istsos
+
+[parameters]
+GO_resultModel = om:Observation
+DS_outputFormats = text/xml;subtype="sensorML/1.0.1"
+GC_Section = serviceidentification,serviceprovider,operationsmetadata,contents,all
+GO_responseFormat = text/xml;subtype='sensorML/1.0.0',application/json,text/plain,text/xml,text/x-json
+version = 1.0.0
+GO_timeFormats = ISO 8601 (e.g.: 1997-12-17T07:37:16-08),xsi:type='TimeInstantType',xsi:type='TimePeriodType'
+requests = getcapabilities,describesensor,getobservation,getfeatureofinterest,insertobservation,registersensor
+GO_responseMode = inline
+
+[urn]
+identifier = urn:ogc:def:identifier:x-istsos:1.0:
+offering = urn:ogc:def:offering:x-istsos:1.0:
+parameter = urn:ogc:def:parameter:x-istsos:1.0:
+phenomena = urn:ogc:def:phenomenon:x-istsos:1.0:
+feature = urn:ogc:def:feature:x-istsos:1.0:
+sensorType = urn:ogc:def:sensorType:x-istsos:1.0:
+process = urn:ogc:def:process:x-istsos:1.0:
+role = urn:role:x-istsos:1.0:
+refsystem = urn:ogc:crs:EPSG:
+keywords = urn:ogc:def:keywords:x-istsos:1.0:
+time = urn:ogc:def:parameter:x-istsos:1.0:time:iso8601
+dataType = urn:ogc:def:dataType:x-istsos:1.0:
+property = urn:ogc:def:property:x-istsos:1.0:
+sensor = urn:ogc:def:sensor:x-istsos:1.0:
+procedure = urn:ogc:def:procedure:x-istsos:1.0:
+
+[connection]
+dbname = istsos
+host = localhost
+user = postgres
+password = postgres
+port = 5432
+
+[identification]
+title = IST Sensor Observation Service
+abstract = monitoring network
+urnversion = 1.0
+authority = x-istsos
+fees = NONE
+keywords = SOS,SENSOR,NETWORK
+accessConstrains = NONE
+
+[foiGeometryType]
+Box = surface
+Polygon = surface
+Point = station
+
+[parGeom]
+y = y-position,north,northing,lat,latitude,y
+z = z-position,elevation,quota,z
+x = x-position,east,easting,lon,longitude,x
+
+[provider]
+contactCountry = Switzerland
+providerName = Istitute of Earth Science - SUPSI
+contactAdminArea = Canton Ticino
+contactVoice = +41586666200 
+contactEmail = geoservice at supsi.ch
+contactDeliveryPoint = Campus Trevano
+contactName = Team Geomatica
+contactPostalCode = 6952
+contactFax = +41586666209
+contactCity = Lugano - Canobbio
+providerSite = http://www.supsi.ch/ist
+contactPosition = Data manager
+
+[geo]
+zAxisName = altitude
+xAxisName = easting
+yAxisName = northing
+allowedEPSG = 3857,21781
+istsosepsg = 4326
+
+[initialization]
+level = 42
+
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100755
index 0000000..6cd6606
--- /dev/null
+++ b/test/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+__all__ = [ "istsoslib","admin","walib","delete", "get", "post", "put","script"]
diff --git a/test/_test.py b/test/_test.py
new file mode 100755
index 0000000..0302e99
--- /dev/null
+++ b/test/_test.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+
+class Test():
+
+    def __init__(self, path=None, url='http://localhost/istsos/'):
+        pass
diff --git a/test/admin/__init__.py b/test/admin/__init__.py
new file mode 100755
index 0000000..a9a2c5b
--- /dev/null
+++ b/test/admin/__init__.py
@@ -0,0 +1 @@
+__all__ = []
diff --git a/test/delete.py b/test/delete.py
new file mode 100755
index 0000000..b44a4fd
--- /dev/null
+++ b/test/delete.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+
+import lib.requests as requests
+
+def DELETE(fname, address):
+    
+    #print fname + ', DELETE'
+    
+    res = requests.delete(
+        address,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    return res.json
+    
+def services_name_uoms_name_DELETE(sname, uname):
+    
+    fname = '/istsos/services/{name}/uoms/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/uoms/' + uname
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_DELETE(sname):
+    
+    fname = '/istsos/services/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_procedures_name_DELETE(sname, pname):
+    
+    fname = '/istsos/services/{name}/procedures/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/procedures/' + pname
+    
+    result = DELETE(fname, address)
+    return result
+    
+def operations_log_DELETE():
+
+    fname = '/istsos/operations/log'
+    address = 'http://localhost/istsos/wa/istsos/operations/log'
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_offerings_name_DELETE(sname, oname):
+    
+    fname = '/istsos/services/{name}/offerings/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/' + oname
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_offerings_name_procedures_name_DELETE(sname, oname, pname):
+    
+    fname = '/istsos/services/{name}/offerings/{name}/procedures/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/' + oname + '/procedures/' + pname
+    
+    result = DELETE(fname, address)
+    return result    
+    
+def services_name_observedproperties_name_DELETE(sname, oname):
+    
+    fname = '/istsos/services/{name}/observedproperties/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/observedproperties/' + oname
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_dataqualities_code_DELETE(sname, qualcode):
+    
+    fname = '/istsos/services/{name}/dataqualities/{code}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/dataqualities/' + qualcode
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_configsections_DELETE(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections'
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_configsections_getobservation_DELETE(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/getobservation'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/getobservation'
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_configsections_identification_DELETE(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/identification'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/identification'
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_configsections_geo_DELETE(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/geo'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/geo'
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_configsections_serviceurl_DELETE(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/serviceurl'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/serviceurl'
+    
+    result = DELETE(fname, address)
+    return result
+    
+def services_name_configsections_provider_DELETE(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/provider'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/provider'
+    
+    result = DELETE(fname, address)
+    return result
\ No newline at end of file
diff --git a/test/get.py b/test/get.py
new file mode 100755
index 0000000..04ff6d1
--- /dev/null
+++ b/test/get.py
@@ -0,0 +1,275 @@
+# -*- coding: utf-8 -*-
+
+import lib.requests as requests
+
+def GET(fname, address):
+    
+    #print fname + ', GET'
+    
+    res = requests.get(
+        address,
+        prefetch=True
+    )
+            
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+    
+    return res.json
+    
+def services_name_uoms_GET(sname):
+    
+    fname = '/istsos/services/{name}/uoms'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/uoms'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_uoms_name_GET(sname, uname):
+    
+    fname = '/istsos/services/{name}/uoms/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/uoms/' + uname
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_systemtypes_GET(sname):
+    
+    fname = '/istsos/services/{name}/systemtypes'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/systemtypes'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_GET():
+    
+    fname = '/istsos/services'
+    address = 'http://localhost/istsos/wa/istsos/services'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_GET(sname):
+    
+    fname = '/istsos/services/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_procedures_name_GET(sname, pname):
+    
+    fname = '/istsos/services/{name}/procedures/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/procedures/' + pname
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_procedures_operations_getlist_GET(sname):
+    
+    fname = '/istsos/services/{name}/procedures/operations/getlist'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/procedures/operations/getlist'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_procedures_name_ratingcurve_GET(sname, pname):
+    
+    fname = '/istsos/services/{name}/procedures/{name}/ratingcurve'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/procedures/' + pname + '/ratingcurve'
+    
+    result = GET(fname, address)
+    return result    
+    
+def operations_status_GET():
+    
+    fname = '/istsos/operations/status'
+    address = 'http://localhost/istsos/wa/istsos/operations/status'
+     
+    result = GET(fname, address)
+    return result
+    
+def operations_log_GET():
+    
+    fname = '/istsos/operations/log'
+    address = 'http://localhost/istsos/wa/istsos/operations/log'
+    
+    result = GET(fname, address)
+    return result
+    
+def operations_about_GET():
+    
+    fname = '/istsos/operations/aboutg'
+    address = 'http://localhost/istsos/wa/istsos/operations/about'
+    
+    result = GET(fname, address)
+    return result
+    
+def operations_initialization_GET():
+    
+    fname = '/istsos/operations/initialization'
+    address = 'http://localhost/istsos/wa/istsos/operations/initialization'
+    
+    result = GET(fname, address)
+    return result
+    
+def operations_getobservation_offerings_name_procedures_GET(sname, oname, pname, oprop, start, end):
+    
+    fname = '/istsos/services/{name}/operations/getobservation/offerings/{name}/procedures/{name}/observedproperties/{name}/eventtime/{begin}/{end}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/operations/getobservation/offerings/' + oname + '/procedures/' + pname + '/observedproperties/' + oprop + '/eventtime/' + start + '/' + end
+        
+    result = GET(fname, address)
+    return result
+    
+def services_name_offerings_GET(sname):
+    
+    fname = '/istsos/services/{name}/offerings'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_offerings_name_GET(sname, oname):
+    
+    fname = '/istsos/services/{name}/offerings/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/' + oname
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_offerings_name_procedures_GET(sname, oname):
+    
+    fname = '/istsos/services/{name}/offerings/{name}/procedures'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/' + oname + '/procedures'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_offerings_name_procedures_operations_memberlist_GET(sname, oname):
+    
+    fname = '/istsos/services/{name}/offerings/{name}/procedures/operations/memberslist'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/' + oname + '/procedures/operations/memberslist'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_offerings_name_procedures_operations_nonmemberlist_GET(sname, oname):
+    
+    fname = '/istsos/services/{name}/offerings/{name}/procedures/operations/nonmemberslist'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/' + oname + '/procedures/operations/nonmemberslist'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_offerings_operations_getlist_GET(sname):
+    
+    fname = '/istsos/services/{name}/offerings/operations/getlist'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/operations/getlist'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_observedproperties_GET(sname):
+    
+    fname = '/istsos/services/{name}/observedproperties'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/observedproperties'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_observedproperties_name_GET(sname, oname):
+    
+    fname = '/istsos/services/{name}/observedproperties/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/observedproperties/' + oname
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_epsgs_GET(sname):
+    
+    fname = '/istsos/services/{name}/epsgs'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/epsgs'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_dataqualities_GET(sname):
+    
+    fname = '/istsos/services/{name}/dataqualities'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/dataqualities'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_dataqualities_code_GET(sname, qualcode):
+    
+    fname = '/istsos/services/{name}/dataqualities/{code}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/dataqualities/' + qualcode
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_configsections_GET(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_configsections_getobservation_GET(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/getobservation'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/getobservation'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_configsections_identification_GET(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/identification'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/identification'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_configsections_geo_GET(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/geo'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/geo'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_configsections_connection_GET(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/connection'    
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/connection'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_configsections_connection_operations_validatedb_GET(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/connection/operations/validatedb'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/connection/operations/validatedb'
+
+    result = GET(fname, address)
+    return result
+    
+def services_name_configsections_serviceurl_GET(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/serviceurl'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/serviceurl'
+    
+    result = GET(fname, address)
+    return result
+    
+def services_name_configsections_provider_GET(sname):
+    
+    fname = '/istsos/services/{name/default}/configsections/provider'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/provider'
+    
+    result = GET(fname, address)
+    return result
\ No newline at end of file
diff --git a/test/istsoslib/__init__.py b/test/istsoslib/__init__.py
new file mode 100755
index 0000000..56d0a37
--- /dev/null
+++ b/test/istsoslib/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+__all__ = [ "sosRequests" ]
\ No newline at end of file
diff --git a/test/istsoslib/sosRequests.py b/test/istsoslib/sosRequests.py
new file mode 100755
index 0000000..57db71d
--- /dev/null
+++ b/test/istsoslib/sosRequests.py
@@ -0,0 +1,1037 @@
+# -*- coding: utf-8 -*-
+
+import lib.requests as requests
+import time
+
+def getCapabilities(doc):
+    
+    doc.write('\n\n-----------------getCapabilities----------------------------\n')
+    
+    service = 'test'
+    
+    success_get = False
+    success_post = False
+    combo = False
+    
+    get = 'http://localhost/istsos/' + service + '?request=getCapabilities&sections=serviceidentification,serviceprovider,operationsmetadata,contents&service=SOS&version=1.0.0'
+    
+    post = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:GetCapabilities
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+        xmlns:sos="http://www.opengis.net/sos/1.0"
+        xmlns:gml="http://www.opengis.net/gml/3.2"
+        xmlns:ogc="http://www.opengis.net/ogc"
+        xmlns:om="http://www.opengis.net/om/1.0"
+        version="1.0.0" service="SOS">'
+            <section>serviceidentification</section>
+            <section>serviceprovider</section>
+            <section>operationsmetadata</section>
+            <section>contents</section>
+    </sos:GetCapabilities>'''
+    
+    header = {'Content-Type': 'application/xml'}    
+    
+    get1 = requests.get(get, prefetch=True)
+    time.sleep(1)
+    get2 = requests.get(get, prefetch=True)
+    
+    res1 = requests.post('http://localhost/istsos/' + service, data=post, headers=header, prefetch=True)
+    time.sleep(1)
+    res2 = requests.post('http://localhost/istsos/' + service, data=post, headers=header, prefetch=True)
+    
+    if get1.text == get2.text:
+        doc.write('GET retrieved the same information')
+        success_get = True
+    else:
+        doc.write('GET didn\'t retrieve the correct information')
+        doc.write('\n---------------------GET didn\'t retrieve the correct information--------------------\n')
+        doc.write(get2.text)
+    
+    if res1.text == res2.text:
+        doc.write('POST retrieved the same information')
+        success_post = True
+    else:
+        doc.write('POST didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST didn\'t retrieve the correct information--------------------\n')
+        doc.write(res2.text)
+        
+    if get2.text == res2.text:
+        doc.write('POST and GET retrieved the same information')
+        combo = True
+    else:
+        doc.write('POST and GET didn\'t retrieve the correct information')
+        doc.write('\nPOST and GET didn\'t retrieve the correct information\n')
+        doc.write('\n---------------------GET--------------------\n\n')
+        doc.write(get2.text)
+        doc.write('\n\n---------------------POST--------------------\n\n')
+        doc.write(res2.text)
+
+    result = {
+        'getCapabilities_GET' : success_get,
+        'getCapabilities_POST' : success_post,
+        'getCapabilities_BOTH' : combo
+        }
+        
+    return result
+
+
+
+   
+def describeSensor(doc):
+    
+    doc.write('\n\n-----------------describeSensor-----------------------------\n')
+    
+    service = 'test'
+    procedure = 'test'
+    
+    success_get = False
+    success_post = False
+    combo = False
+    
+    get = 'http://localhost/istsos/' + service + '?request=describeSensor&procedure=' + procedure + '&outputFormat=text/xml%3Bsubtype%3D\'sensorML/1.0.0\'&service=SOS&version=1.0.0'
+    
+    post = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:describeSensor
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+        xmlns:sos="http://www.opengis.net/sos/1.0"
+        xmlns:gml="http://www.opengis.net/gml/3.2"
+        xmlns:ogc="http://www.opengis.net/ogc"
+        xmlns:om="http://www.opengis.net/om/1.0"
+        service="SOS"
+        outputFormat="text/xml;subtype=\'sensorML/1.0.0\'">
+            <procedure>test</procedure>
+    </sos:describeSensor>'''
+    
+    header = {'Content-Type': 'application/xml'}        
+    
+    get1 = requests.get(get, prefetch=True)
+    time.sleep(1)
+    get2 = requests.get(get, prefetch=True)
+    
+    res1 = requests.post('http://localhost/istsos/' + service, data=post, headers=header, prefetch=True)
+    time.sleep(1)
+    res2 = requests.post('http://localhost/istsos/' + service, data=post, headers=header, prefetch=True)
+    
+    if get1.text == get2.text:
+        doc.write('GET retrieved the same information')
+        success_get = True
+    else:
+        doc.write('GET didn\'t retrieve the correct information')
+        doc.write('\n---------------------GET didn\'t retrieve the correct information--------------------\n')
+        doc.write(get2.text)
+    
+    if res1.text == res2.text:
+        doc.write('POST retrieved the same information')
+        success_post = True
+    else:
+        doc.write('POST didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST didn\'t retrieve the correct information--------------------\n')
+        doc.write(res2.text)
+    
+    if get2.text == res2.text:
+        doc.write('POST and GET retrieved the same information')
+        combo = True
+    else:
+        doc.write('POST and GET didn\'t retrieve the correct information')
+        doc.write('\nPOST and GET didn\'t retrieve the correct information\n')
+        doc.write('\n---------------------GET--------------------\n\n')
+        doc.write(get2.text)
+        doc.write('\n\n---------------------POST--------------------\n\n')
+        doc.write(res2.text)
+
+    result = {
+        'describeSensor_GET' : success_get,
+        'describeSensor_POST' : success_post,
+        'describeSensor_BOTH' : combo
+        }
+        
+    return result
+
+
+
+
+
+    
+def getObservation(doc):
+    
+    doc.write('\n\n-----------------getObservation-----------------------------\n')
+    
+    service = 'test'
+    procedure = 'test'
+    offering = 'temporary'
+    obproperty = 'test'
+    
+    success_get = False
+    success_getB = False
+    success_post = False
+    combo = False
+    
+    get = 'http://localhost/istsos/' + service + '?service=SOS&request=GetObservation&offering=' + offering + '&procedure=' + procedure + '&eventTime=2013-01-01T00:00:00+01/2013-01-05T17:00:00+01,2013-01-05T17:30:00+01&observedProperty=' + obproperty + '&responseFormat=text/xml;subtype=\'sensorML/1.0.0\'&service=SOS&version=1.0.0'
+    getBBOX = 'http://localhost/istsos/' + service + '?service=SOS&request=GetObservation&offering=' + offering + '&observedProperty='  + obproperty + '&responseFormat=text/xml;subtype=\'sensorML/1.0.0\'&service=SOS&version=1.0.0&featureOfInterest=&BBOX=[713800,89915 713830,89940(,21781)]&service=SOS&version=1.0.0'
+    
+    post = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:GetObservation
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+       xmlns:sos="http://www.opengis.net/sos/1.0"
+       xmlns:gml="http://www.opengis.net/gml/3.2"
+       xmlns:ogc="http://www.opengis.net/ogc"
+       xmlns:om="http://www.opengis.net/om/1.0" 
+       service="SOS" version='1.0.0'>
+        <offering>urn:ogc:def:offering:x-istsos:1.0:temporary</offering>
+        <procedure>urn:ogc:def:procedure:x-istsos:1.0:test</procedure>
+        <eventTime>
+            <gml:TimePeriod>
+               <gml:beginPosition>2013-01-01T00:00:00+01:00</gml:beginPosition>
+               <gml:endPosition>2013-01-05T00:00:00+01:00</gml:endPosition>
+            </gml:TimePeriod>
+            <gml:TimeInstant>
+               <gml:timePosition>2013-01-05T00:00:00+01:00</gml:timePosition>
+            </gml:TimeInstant>
+        </eventTime>
+        <responseFormat>text/xml;subtype='sensorML/1.0.0'</responseFormat>
+        <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:test</observedProperty>
+    </sos:GetObservation>'''
+    
+    post2 = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:GetObservation
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+       xmlns:sos="http://www.opengis.net/sos/1.0"
+       xmlns:gml="http://www.opengis.net/gml/3.2"
+       xmlns:ogc="http://www.opengis.net/ogc"
+       xmlns:om="http://www.opengis.net/om/1.0" 
+       service="SOS" version='1.0.0'>
+        <offering>urn:ogc:def:offering:x-istsos:1.0:temporary</offering>
+        <procedure>urn:ogc:def:procedure:x-istsos:1.0:test</procedure>
+    
+        <eventTime>
+            <gml:TimeInstant>
+               <gml:timePosition>2013-01-07T00:00:00+01:00</gml:timePosition>
+            </gml:TimeInstant>
+        </eventTime>
+        <responseFormat>text/xml;subtype='sensorML/1.0.0'</responseFormat>
+        <srsName>urn:ogc:crs:EPSG:21781</srsName>
+        <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:test</observedProperty>
+    </sos:GetObservation>'''
+    
+    post4 = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:GetObservation
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+       xmlns:sos="http://www.opengis.net/sos/1.0"
+       xmlns:gml="http://www.opengis.net/gml/3.2"
+       xmlns:ogc="http://www.opengis.net/ogc"
+       xmlns:om="http://www.opengis.net/om/1.0" 
+       service="SOS" version='1.0.0'>
+        <offering>urn:ogc:def:offering:x-istsos:1.0:temporary</offering>
+        <procedure>urn:ogc:def:procedure:x-istsos:1.0:test</procedure>
+        <eventTime>
+            <gml:TimeInstant>
+               <gml:timePosition>2012-10-26T17:00:00+01</gml:timePosition>
+            </gml:TimeInstant>
+        </eventTime>
+        <responseFormat>text/xml;subtype='sensorML/1.0.0'</responseFormat>
+        <observedProperty>urn:ogc:def:parameter:x-istsos:1.0:test</observedProperty>
+    </sos:GetObservation>'''
+    
+    header = {'Content-Type': 'application/xml'}        
+    
+    get1 = requests.get(get, prefetch=True)
+    time.sleep(1)
+    get2 = requests.get(get, prefetch=True)
+    
+    getb1 = requests.get(getBBOX, prefetch=True)
+    time.sleep(1)
+    getb2 = requests.get(getBBOX, prefetch=True)
+    
+    res1 = requests.post('http://localhost/istsos/' + service, data=post, headers=header, prefetch=True)
+    time.sleep(1)
+    res2 = requests.post('http://localhost/istsos/' + service, data=post, headers=header, prefetch=True)
+    
+    res3 = requests.post('http://localhost/istsos/' + service, data=post2, headers=header, prefetch=True)
+    time.sleep(1)
+    res4 = requests.post('http://localhost/istsos/' + service, data=post2, headers=header, prefetch=True)
+
+    res5 = requests.post('http://localhost/istsos/' + service, data=post4, headers=header, prefetch=True)
+    time.sleep(1)
+    res6 = requests.post('http://localhost/istsos/' + service, data=post4, headers=header, prefetch=True)
+    
+    if get1.text == get2.text:
+        doc.write('GET retrieved the same information')
+        success_get = True
+    else:
+        doc.write('GET didn\'t retrieve the correct information')
+        doc.write('\n---------------------GET didn\'t retrieve the correct information--------------------\n')
+        doc.write(get2.text)
+        
+    if getb1.text == getb2.text:
+        doc.write('GET retrieved the same information')
+        success_getB = True
+    else:
+        doc.write('GETB didn\'t retrieve the correct information')
+        doc.write('\n---------------------GETB didn\'t retrieve the correct information--------------------\n')
+        doc.write(getb2.text)
+    
+    if res1.text == res2.text:
+        doc.write('POST retrieved the same information')
+        success_post = True
+    else:
+        doc.write('POST didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST didn\'t retrieve the correct information--------------------\n')
+        doc.write(res2.text)
+        
+    
+    if res3.text == res4.text:
+        doc.write('POST2 retrieved the same information')
+        success_post = True
+    else:
+        doc.write('POST2 didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST2 didn\'t retrieve the correct information--------------------\n')
+        doc.write(res3.text)
+    
+    if res5.text == res6.text:
+        doc.write('POST4 retrieved the same information')
+        success_post = True
+    else:
+        doc.write('POST4 didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST4 didn\'t retrieve the correct information--------------------\n')
+        doc.write(res5.text)
+    
+        
+    if get2.text == getb2.text:
+        doc.write('GET and GETB retrieved the same information')
+        combo = True
+    else:
+        doc.write('GET and GETB didn\'t retrieve the correct information')
+        doc.write('\nGET and GETB didn\'t retrieve the correct information\n')
+        doc.write('\n---------------------GET--------------------\n\n')
+        doc.write(get2.text)
+        doc.write('\n\n---------------------GETB--------------------\n\n')
+        doc.write(getb2.text)
+    
+    if get2.text == res2.text:
+        doc.write('POST and GET retrieved the same information')
+        combo = True
+    else:
+        doc.write('POST and GET didn\'t retrieve the correct information')
+        doc.write('\nPOST and GET didn\'t retrieve the correct information\n')
+        doc.write('\n---------------------GET--------------------\n\n')
+        doc.write(get2.text)
+        doc.write('\n\n---------------------POST--------------------\n\n')
+        doc.write(res2.text)
+        
+    if getb2.text == res2.text:
+        doc.write('POST and GETB retrieved the same information')
+        combo = True
+    else:
+        doc.write('POST and GETB didn\'t retrieve the correct information')
+        doc.write('\nPOST and GETB didn\'t retrieve the correct information\n')
+        doc.write('\n---------------------GETB--------------------\n\n')
+        doc.write(getb2.text)
+        doc.write('\n\n---------------------POST--------------------\n\n')
+        doc.write(res2.text)
+            
+    if get2.text == res4.text:
+        doc.write('POST2 and GET retrieved the same information')
+        combo = True
+    else:
+        doc.write('POST2 and GET didn\'t retrieve the correct information')
+        doc.write('\nPOST2 and GET didn\'t retrieve the correct information\n')
+        doc.write('\n---------------------GET--------------------\n\n')
+        doc.write(get2.text)
+        doc.write('\n\n---------------------POST2--------------------\n\n')
+        doc.write(res4.text)
+            
+    if get2.text == res6.text:
+        doc.write('POST4 and GET retrieved the same information')
+        combo = True
+    else:
+        doc.write('POST4 and GET didn\'t retrieve the correct information')
+        doc.write('\nPOST4 and GET didn\'t retrieve the correct information\n')
+        doc.write('\n---------------------GET--------------------\n\n')
+        doc.write(get2.text)
+        doc.write('\n\n---------------------POST4--------------------\n\n')
+        doc.write(res6.text)
+
+    result = {
+        'getObservation_GET' : success_get,
+        'getObservation_GETB' : success_getB,
+        'getObservation_POST' : success_post,
+        'getObservation_BOTH' : combo
+        }
+        
+    return result
+    
+    
+    
+    
+def registerSensor(doc):
+    
+    doc.write('\n\n-----------------registerSensor-----------------------------\n')
+    
+    service = 'test'
+    
+    success_posts = False
+    success_postc = False
+    
+    header = {'Content-Type': 'application/xml'}
+    
+    post_simple = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:RegisterSensor 
+        service="SOS" 
+        version="1.0.0" 
+        xmlns:sos="http://www.opengis.net/sos/1.0" 
+        xmlns:gml="http://www.opengis.net/gml" 
+        xmlns:om="http://www.opengis.net/om" 
+        xmlns:sml="http://www.opengis.net/sensorML" 
+        xmlns:swe="http://www.opengis.net/swe" 
+        xmlns:xlink="http://www.w3.org/1999/xlink" 
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+        xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosRegisterSensor.xsd">
+      <sos:SensorDescription>
+        <sml:member>
+          <sml:System gml:id="H_TREVANO">
+            <gml:name>H_TREVANO</gml:name>
+            <sml:identification/>
+            <sml:classification>
+              <sml:ClassifierList>
+                <sml:classifier name="System Type">
+                  <sml:Term definition="urn:ogc:def:classifier:x-istsos:1.0:systemType">
+                    <sml:value>insitu-fixed-point</sml:value>
+                  </sml:Term>
+                </sml:classifier>
+                <sml:classifier name="Sensor Type">
+                  <sml:Term definition="urn:ogc:def:classifier:x-istsos:1.0:sensorType">
+                    <sml:value>humidity sensor</sml:value>
+                  </sml:Term>
+                </sml:classifier>
+              </sml:ClassifierList>
+            </sml:classification>
+            <sml:capabilities>
+              <swe:DataRecord/>
+            </sml:capabilities>
+            <gml:location>
+              <gml:Point gml:id="trevano" srsName="EPSG:4326">
+                <gml:coordinates>8.961435,46.028235,350</gml:coordinates>
+              </gml:Point>
+            </gml:location>
+            <sml:outputs>
+              <sml:OutputList>
+                <sml:output name="output data">
+                  <swe:DataRecord definition="urn:ogc:def:dataType:x-istsos:1.0:timeSeries">
+                    <swe:field name="Time">
+                      <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601" gml:id="1">
+                        <swe:uom code="iso8601"/>
+                      </swe:Time>
+                    </swe:field>
+                    <swe:field name="air humidity">
+                      <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity" gml:id="2">
+                        <swe:uom code="%"/>
+                      </swe:Quantity>
+                    </swe:field>
+                  </swe:DataRecord>
+                </sml:output>
+              </sml:OutputList>
+            </sml:outputs>
+          </sml:System>
+        </sml:member>
+      </sos:SensorDescription>
+      <sos:ObservationTemplate>
+        <om:Observation>
+          <om:procedure xlink:href="urn:ogc:object:procedure:x-istsos:1.0:H_TREVANO"/>
+          <om:samplingTime>
+            <gml:TimePeriod>
+              <gml:TimeLength/>
+            </gml:TimePeriod>
+          </om:samplingTime>
+          <om:observedProperty>
+            <swe:CompositPhenomenon dimension="2">
+              <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>
+              <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity"/>
+            </swe:CompositPhenomenon>
+          </om:observedProperty>
+          <om:featureOfInterest xlink:href="trevano">
+            <gml:Point gml:id="trevano" srsName="EPSG:4326">
+              <gml:coordinates>8.961435,46.028235,350</gml:coordinates>
+            </gml:Point>
+          </om:featureOfInterest>
+          <om:result>
+            <swe:DataArray>
+              <swe:elementCount>
+                <swe:value>2</swe:value>
+              </swe:elementCount>
+              <swe:elementType name="SimpleDataArray" xlink:href="urn:ogc:def:dataType:x-istsos:1.0:timeSeriesDataRecord">
+                <swe:DataRecord definition="urn:ogc:def:dataType:x-istsos:1.0:timeSeries">
+                  <swe:field name="Time">
+                    <swe:Time definition="urn:ogc:def:parameter:x-istsos::time:iso8601" gml:id="1">
+                      <swe:uom code="iso8601"/>
+                    </swe:Time>
+                  </swe:field>
+                  <swe:field name="air humidity">
+                    <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity" gml:id="2">
+                      <swe:uom code="%"/>
+                    </swe:Quantity>
+                  </swe:field>
+                </swe:DataRecord>
+              </swe:elementType>
+              <swe:encoding>
+                <swe:TextBlock blockSeparator="@" decimalSeparator="." tokenSeparator=","/>
+              </swe:encoding>
+              <swe:values/>
+            </swe:DataArray>
+          </om:result>
+        </om:Observation>
+      </sos:ObservationTemplate>
+    </sos:RegisterSensor>'''
+
+    post_composite = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:RegisterSensor 
+        service="SOS" 
+        version="1.0.0" 
+        xmlns:sos="http://www.opengis.net/sos/1.0" 
+        xmlns:gml="http://www.opengis.net/gml" 
+        xmlns:om="http://www.opengis.net/om" 
+        xmlns:sml="http://www.opengis.net/sensorML" 
+        xmlns:swe="http://www.opengis.net/swe" 
+        xmlns:xlink="http://www.w3.org/1999/xlink" 
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+      <sos:SensorDescription>
+        <sml:member>
+          <sml:System gml:id="LL_CERESIO">
+            <gml:name>LL_CERESIO</gml:name>
+            <sml:identification>
+              <sml:IdentifierList>
+                <sml:identifier name="Short Name">
+                  <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:shortName">
+                    <sml:value>CHS001</sml:value>
+                  </sml:Term>
+                </sml:identifier>
+                <sml:identifier name="Long Name">
+                  <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:longName">
+                    <sml:value>Capacitive humidity sensors model 001</sml:value>
+                  </sml:Term>
+                </sml:identifier>
+                <sml:identifier name="Manufacturer Name">
+                  <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:manufacturerName">
+                    <sml:value>Technical Department - SUPSI</sml:value>
+                  </sml:Term>
+                </sml:identifier>
+                <sml:identifier name="Model Number">
+                  <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:modelNumber">
+                    <sml:value>TDS-001</sml:value>
+                  </sml:Term>
+                </sml:identifier>
+                <sml:identifier name="Serial Number">
+                  <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:serialNumber">
+                    <sml:value>EXZU70012987712ABC</sml:value>
+                  </sml:Term>
+                </sml:identifier>
+                <sml:identifier name="Device ID">
+                  <sml:Term definition="urn:x-ogc:def:identifier:x-istsos:1.0:deviceID">
+                    <sml:value>TDSCHSMWLLUGANO</sml:value>
+                  </sml:Term>
+                </sml:identifier>
+              </sml:IdentifierList>
+            </sml:identification>
+            <sml:classification>
+              <sml:ClassifierList>
+                <sml:classifier name="System Type">
+                  <sml:Term definition="urn:ogc:def:classifier:x-istsos:1.0:systemType">
+                    <sml:value>insitu-fixed-point</sml:value>
+                  </sml:Term>
+                </sml:classifier>
+                <sml:classifier name="Sensor Type">
+                  <sml:Term definition="urn:ogc:def:classifier:x-istsos:1.0:sensorType">
+                    <sml:value>lake water level</sml:value>
+                  </sml:Term>
+                </sml:classifier>
+              </sml:ClassifierList>
+            </sml:classification>
+            <sml:characteristics xlink:href="http://192.168.56.101/istsos/admin/"/>
+            <sml:capabilities>
+              <swe:DataRecord>
+                <swe:field name="Memory Capacity">
+                  <swe:Quantity definition="urn:x-ogc:def:classifier:x-istsos:1.0:memoryCapacity">
+                    <swe:uom code="Byte"/>
+                    <swe:value>34359738368</swe:value>
+                  </swe:Quantity>
+                </swe:field>
+                <swe:field name="Battery Current">
+                  <swe:Quantity definition="urn:x-ogc:def:phenomenon:x-istsos:1.0:batteryCurrent">
+                    <swe:uom code="A.h"/>
+                    <swe:value>1420000</swe:value>
+                  </swe:Quantity>
+                </swe:field>
+                <swe:field name="Sampling time resolution">
+                  <swe:Quantity definition="urn:x-ogc:def:classifier:x-istsos:1.0:samplingTimeResolution">
+                    <swe:uom code="iso8601"/>
+                    <swe:value>PT20M</swe:value>
+                  </swe:Quantity>
+                </swe:field>
+                <swe:field name="Acquisition time resolution">
+                  <swe:Quantity definition="urn:x-ogc:def:classifier:x-istsos:1.0:acquisitionTimeResolution">
+                    <swe:uom code="iso8601"/>
+                    <swe:value>PT30M</swe:value>
+                  </swe:Quantity>
+                </swe:field>
+              </swe:DataRecord>
+            </sml:capabilities>
+            <sml:contact role="urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:owner">
+              <sml:ResponsibleParty>
+                <sml:individualName>Fausto Gervasoni</sml:individualName>
+                <sml:organizationName>Institute of Earth Science - SUPSI</sml:organizationName>
+                <sml:contactInfo>
+                  <sml:phone>
+                    <sml:voice>+41586666200</sml:voice>
+                    <sml:facsimile>+41586666209</sml:facsimile>
+                  </sml:phone>
+                  <sml:address>
+                    <sml:deliveryPoint>Campus Trevano</sml:deliveryPoint>
+                    <sml:city>Canobbio</sml:city>
+                    <sml:administrativeArea>Ticino</sml:administrativeArea>
+                    <sml:postalCode>6952</sml:postalCode>
+                    <sml:country>Switzerland</sml:country>
+                    <sml:electronicMailAddress>ist at supsi.ch</sml:electronicMailAddress>
+                  </sml:address>
+                  <sml:onlineResource xlink:href="http://www.supsi.ch/ist"/>
+                </sml:contactInfo>
+              </sml:ResponsibleParty>
+            </sml:contact>
+            <sml:contact role="urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:manufacturer">
+              <sml:ResponsibleParty>
+                <sml:individualName>Paolo Rezzonico</sml:individualName>
+                <sml:organizationName>Technical Department - SUPSI</sml:organizationName>
+                <sml:contactInfo>
+                  <sml:phone>
+                    <sml:voice>+41586666200</sml:voice>
+                    <sml:facsimile>+41586666209</sml:facsimile>
+                  </sml:phone>
+                  <sml:address>
+                    <sml:deliveryPoint>Residence Stella alpina</sml:deliveryPoint>
+                    <sml:city>Viganello</sml:city>
+                    <sml:administrativeArea>Ticino</sml:administrativeArea>
+                    <sml:postalCode>6962</sml:postalCode>
+                    <sml:country>Switzerland</sml:country>
+                    <sml:electronicMailAddress>ist at supsi.ch</sml:electronicMailAddress>
+                  </sml:address>
+                  <sml:onlineResource xlink:href="http://www.supsi.ch/ist"/>
+                </sml:contactInfo>
+              </sml:ResponsibleParty>
+            </sml:contact>
+            <sml:contact role="urn:x-ogc:def:classifiers:x-istsos:1.0:contactType:operator">
+              <sml:ResponsibleParty>
+                <sml:individualName>Giacomino Bragaferro</sml:individualName>
+                <sml:organizationName>Ufficio Tecnico Augenthaler</sml:organizationName>
+                <sml:contactInfo>
+                  <sml:phone>
+                    <sml:voice>+41586666200</sml:voice>
+                    <sml:facsimile>+41586666209</sml:facsimile>
+                  </sml:phone>
+                  <sml:address>
+                    <sml:deliveryPoint>Via delle Vigne 6</sml:deliveryPoint>
+                    <sml:city>Bironico</sml:city>
+                    <sml:administrativeArea>Ticino</sml:administrativeArea>
+                    <sml:postalCode>6804</sml:postalCode>
+                    <sml:country>Switzerland</sml:country>
+                    <sml:electronicMailAddress>ist at supsi.ch</sml:electronicMailAddress>
+                  </sml:address>
+                  <sml:onlineResource xlink:href="http://www.supsi.ch/ist"/>
+                </sml:contactInfo>
+              </sml:ResponsibleParty>
+            </sml:contact>
+            <sml:documentation>
+              <sml:Document>
+                <gml:description>User Manual</gml:description>
+                <sml:date>01/01/2013</sml:date>
+                <sml:format>text/html</sml:format>
+                <gml:onlineResource xlink:href="http://goo.gl/0fpAA"/>
+              </sml:Document>
+            </sml:documentation>
+            <gml:location>
+              <gml:Point gml:id="ceresio" srsName="EPSG:4326">
+                <gml:coordinates>8.962662,46.004809,270</gml:coordinates>
+              </gml:Point>
+            </gml:location>
+            <sml:interfaces>
+              <sml:InterfaceList>
+                <sml:interface name="Bluetooth4.0/SDP/RFCOMM/L2CAP"/>
+                <sml:interface name="USB2.0/Mass Storage"/>
+              </sml:InterfaceList>
+            </sml:interfaces>
+            <sml:outputs>
+              <sml:OutputList>
+                <sml:output name="output data">
+                  <swe:DataRecord definition="urn:ogc:def:dataType:x-istsos:1.0:timeSeries">
+                    <swe:field name="Time">
+                      <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601" gml:id="1">
+                        <swe:uom code="iso8601"/>
+                      </swe:Time>
+                    </swe:field>
+                    <swe:field name="lake water level">
+                      <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:lake:water:level" gml:id="2">
+                        <swe:uom code="m"/>
+                      </swe:Quantity>
+                    </swe:field>
+                    <swe:field name="lake water temperature">
+                      <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:lake:water:temperature" gml:id="2">
+                        <swe:uom code="°C"/>
+                      </swe:Quantity>
+                    </swe:field>
+                  </swe:DataRecord>
+                </sml:output>
+              </sml:OutputList>
+            </sml:outputs>
+          </sml:System>
+        </sml:member>
+      </sos:SensorDescription>
+      <sos:ObservationTemplate>
+        <om:Observation>
+          <om:procedure xlink:href="urn:ogc:object:procedure:x-istsos:1.0:LL_CERESIO"/>
+          <om:samplingTime>
+            <gml:TimePeriod>
+              <gml:TimeLength/>
+            </gml:TimePeriod>
+          </om:samplingTime>
+          <om:observedProperty>
+            <swe:CompositPhenomenon dimension="2">
+              <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601"/>
+              <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:lake:water:level"/>
+              <swe:component xlink:href="urn:ogc:def:parameter:x-istsos:1.0:lake:water:temperature"/>
+            </swe:CompositPhenomenon>
+          </om:observedProperty>
+          <om:featureOfInterest xlink:href="ceresio">
+            <gml:Point gml:id="ceresio" srsName="EPSG:4326">
+              <gml:coordinates>8.962662,46.004809,270</gml:coordinates>
+            </gml:Point>
+          </om:featureOfInterest>
+          <om:result>
+            <swe:DataArray>
+              <swe:elementCount>
+                <swe:value>2</swe:value>
+              </swe:elementCount>
+              <swe:elementType name="SimpleDataArray" xlink:href="urn:ogc:def:dataType:x-istsos:1.0:timeSeriesDataRecord">
+                <swe:DataRecord definition="urn:ogc:def:dataType:x-istsos:1.0:timeSeries">
+                  <swe:field name="Time">
+                    <swe:Time definition="urn:ogc:def:parameter:x-istsos:1.0:time:iso8601" gml:id="1">
+                      <swe:uom code="iso8601"/>
+                    </swe:Time>
+                  </swe:field>
+                  <swe:field name="lake water level">
+                    <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:lake:water:level" gml:id="2">
+                      <swe:uom code="m"/>
+                    </swe:Quantity>
+                  </swe:field>
+                  <swe:field name="lake water temperature">
+                    <swe:Quantity definition="urn:ogc:def:parameter:x-istsos:1.0:lake:water:temperature" gml:id="2">
+                      <swe:uom code="°C"/>
+                    </swe:Quantity>
+                  </swe:field>
+                </swe:DataRecord>
+              </swe:elementType>
+              <swe:encoding>
+                <swe:TextBlock blockSeparator="@" decimalSeparator="." tokenSeparator=","/>
+              </swe:encoding>
+              <swe:values/>
+            </swe:DataArray>
+          </om:result>
+        </om:Observation>
+      </sos:ObservationTemplate>
+    </sos:RegisterSensor>'''
+    
+    
+    ress1 = requests.post('http://localhost/istsos/' + service, data=post_simple, headers=header, prefetch=True)
+    time.sleep(1)
+    ress2 = requests.post('http://localhost/istsos/' + service, data=post_simple, headers=header, prefetch=True)
+    
+    resc1 = requests.post('http://localhost/istsos/' + service, data=post_composite, headers=header, prefetch=True)
+    time.sleep(1)
+    resc2 = requests.post('http://localhost/istsos/' + service, data=post_composite, headers=header, prefetch=True)
+    
+    if ress1.text == ress2.text:
+        doc.write('POST Simple retrieved the same information')
+        success_posts = True
+    else:
+        doc.write('POST Simple didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST Simple didn\'t retrieve the correct information--------------------\n')
+        doc.write(ress2.text)    
+    
+    if resc1.text == resc2.text:
+        doc.write('POST Composite retrieved the same information')
+        success_postc = True
+    else:
+        doc.write('POST Composite didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST Composite didn\'t retrieve the correct information--------------------\n')
+        doc.write(resc2.text)
+    
+    result = {
+        'registerSensor_POSTS' : success_posts,
+        'registerSensor_POSTC' : success_postc
+        }
+        
+    return result
+
+
+def insertObservation(doc):
+    
+    doc.write('\n\n-----------------insertObservation--------------------------\n')    
+    
+    service = 'test'
+    
+    success_posts = False
+    success_postc = False
+            
+    header = {'Content-Type': 'application/xml'}
+    
+    post_simple = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:InsertObservation
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+       xmlns:sos="http://www.opengis.net/sos/1.0"
+       xmlns:xlink="http://www.w3.org/1999/xlink"
+       xmlns:sa="http://www.opengis.net/sampling/1.0"
+       xmlns:swe="http://www.opengis.net/swe/1.0.1"
+       xmlns:gml="http://www.opengis.net/gml/3.2"
+       xmlns:ogc="http://www.opengis.net/ogc"
+       xmlns:om="http://www.opengis.net/om/1.0" service="SOS" version="1.0.0" >
+       <AssignedSensorId>urn:ogc:object:sensor:x-ist::???</AssignedSensorId>
+       <om:Observation>
+        <om:procedure xlink:href="urn:ogc:object:procedure:x-ist::thermo1"/>
+        <om:samplingTime>
+          <gml:TimePeriod>
+            <gml:beginPosition>2010-01-01T00:10:00+00:00</gml:beginPosition>
+            <gml:endPosition>2010-01-01T02:00:00+00:00</gml:endPosition>
+          </gml:TimePeriod>
+        </om:samplingTime>
+        <om:observedProperty>
+          <swe:CompositPhenomenon dimension="2">
+            <swe:component xlink:href="urn:ogc:def:parameter:x-ist::time:iso8601"/>  
+            <swe:component xlink:href="urn:ogc:def:property:x-ist::airtemperature" />      
+          </swe:CompositPhenomenon>
+        </om:observedProperty>
+        <om:featureOfInterest xlink:href="urn:ogc:object:feature:x-ist::station:LUGANO"/>
+          <om:result>
+            <swe:DataArray>
+              <swe:elementCount>
+                <swe:Count>
+                  <swe:value>2</swe:value>
+                </swe:Count>
+              </swe:elementCount>
+              <swe:elementType name="SimpleDataArray">
+                  <swe:DataRecord definition="http://mmiws.org/ont/x/timeSeries">
+                    <swe:field name="Time">
+                      <swe:Time definition="urn:ogc:def:parameter:x-ist::time:iso8601"/>
+                    </swe:field>
+                    <swe:field name="airtemperature">
+                      <swe:Quantity definition="urn:ogc:def:property:x-ist::airtemperature">
+                        <swe:uom code="deg"/>
+                      </swe:Quantity>
+                    </swe:field>
+                  </swe:DataRecord>
+              </swe:elementType>
+            <swe:encoding>
+              <swe:TextBlock tokenSeparator="," blockSeparator="@" decimalSeparator="."/>
+            </swe:encoding>
+            <swe:values>
+                2010-01-01T00:10:00+00:00,9.81@
+                2010-01-01T00:20:00+00:00,9.78@
+                2010-01-01T00:30:00+00:00,9.74@
+                2010-01-01T00:40:00+00:00,9.69@
+                2010-01-01T00:50:00+00:00,9.4@
+                2010-01-01T01:00:00+00:00,9.1@
+                2010-01-01T01:10:00+00:00,8.7@
+                2010-01-01T01:20:00+00:00,8.5@
+                2010-01-01T01:30:00+00:00,8.4@
+                2010-01-01T01:40:00+00:00,8.32@
+                2010-01-01T01:50:00+00:00,8.30@
+                2010-01-01T02:00:00+00:00,8.27
+            </swe:values>
+          </swe:DataArray>
+        </om:result>
+      </om:Observation>
+    </sos:InsertObservation>'''
+
+    post_composite = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:InsertObservation
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+       xmlns:sos="http://www.opengis.net/sos/1.0"
+       xmlns:xlink="http://www.w3.org/1999/xlink"
+       xmlns:sa="http://www.opengis.net/sampling/1.0"
+       xmlns:swe="http://www.opengis.net/swe/1.0.1"
+       xmlns:gml="http://www.opengis.net/gml/3.2"
+       xmlns:ogc="http://www.opengis.net/ogc"
+       xmlns:om="http://www.opengis.net/om/1.0" service="SOS" version="1.0.0" >
+       <AssignedSensorId>urn:ogc:object:sensor:x-ist::???</AssignedSensorId>
+       <om:Observation>
+        <om:procedure xlink:href="urn:ogc:object:procedure:x-ist::meteo1"/>
+        <om:samplingTime>
+          <gml:TimePeriod>
+            <gml:beginPosition>2010-02-10T16:10:00+01:00</gml:beginPosition>
+            <gml:endPosition>2010-02-10T18:00:00+01:00</gml:endPosition>
+          </gml:TimePeriod>
+        </om:samplingTime>
+        <om:observedProperty>
+          <swe:CompositPhenomenon dimension="4">
+            <swe:component xlink:href="urn:ogc:def:parameter:x-ist::time:iso8601"/>  
+            <swe:component xlink:href="urn:ogc:def:property:x-ist::airtemperature"/> 
+            <swe:component xlink:href="urn:ogc:def:property:x-ist::rainfall"/> 
+            <swe:component xlink:href="urn:ogc:def:property:x-ist::pressure"/>
+          </swe:CompositPhenomenon>
+        </om:observedProperty>
+        <om:featureOfInterest xlink:href="urn:ogc:object:feature:x-ist::station:LUGANO"/>
+          <om:result>
+            <swe:DataArray>
+              <swe:elementCount>
+                <swe:Count>
+                  <swe:value>5</swe:value>
+                </swe:Count>
+              </swe:elementCount>
+              <swe:elementType name="SimpleDataArray">
+                  <swe:DataRecord definition="http://mmiws.org/ont/x/timeSeries">
+                    <swe:field name="Time">
+                      <swe:Time definition="urn:ogc:def:parameter:x-ist::time:iso8601"/>
+                    </swe:field>
+                    <swe:field name="airtemperature">
+                      <swe:Quantity definition="urn:ogc:def:property:x-ist::airtemperature">
+                        <swe:uom code="deg"/>
+                      </swe:Quantity>
+                    </swe:field>
+                    <swe:field name="rainfall">
+                      <swe:Quantity definition="urn:ogc:def:property:x-ist::rainfall">
+                        <swe:uom code="mm"/>
+                      </swe:Quantity>
+                    </swe:field>
+                    <swe:field name="pressure">
+                      <swe:Quantity definition="urn:ogc:def:property:x-ist::pressure">
+                        <swe:uom code="mbar"/>
+                      </swe:Quantity>
+                    </swe:field>
+                  </swe:DataRecord>
+              </swe:elementType>
+            <swe:encoding>
+              <swe:TextBlock tokenSeparator="," blockSeparator="@" decimalSeparator="."/>
+            </swe:encoding>
+            <swe:values>
+                2010-02-10T16:10:00+01:00,12.8,0.2,940@
+                2010-02-10T16:20:00+01:00,12.7,0.3,948@
+                2010-02-10T16:30:00+01:00,12.5,0.2,949@
+                2010-02-10T16:40:00+01:00,12.3,0.3,950@
+                2010-02-10T16:50:00+01:00,12.2,0.4,949@
+                2010-02-10T17:00:00+01:00,12.1,0.4,947@
+                2010-02-10T17:10:00+01:00,11.8,0.5,948@
+                2010-02-10T17:20:00+01:00,11.6,0.3,944@
+                2010-02-10T17:30:00+01:00,11.7,0.4,943@
+                2010-02-10T17:40:00+01:00,11.4,0.4,944@
+                2010-02-10T17:50:00+01:00,11.4,0.5,944@
+                2010-02-10T18:00:00+01:00,11.3,0.4,945
+            </swe:values>
+          </swe:DataArray>
+        </om:result>
+      </om:Observation>
+    </sos:InsertObservation>'''
+    
+    
+    ress1 = requests.post('http://localhost/istsos/' + service, data=post_simple, headers=header, prefetch=True)
+    time.sleep(1)
+    ress2 = requests.post('http://localhost/istsos/' + service, data=post_simple, headers=header, prefetch=True)
+    
+    resc1 = requests.post('http://localhost/istsos/' + service, data=post_composite, headers=header, prefetch=True)
+    time.sleep(1)
+    resc2 = requests.post('http://localhost/istsos/' + service, data=post_composite, headers=header, prefetch=True)
+    
+    if ress1.text == ress2.text:
+        doc.write('POST Simple retrieved the same information')
+        success_posts = True
+    else:
+        doc.write('POST Simple didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST Simple didn\'t retrieve the correct information--------------------\n')
+        doc.write(ress2.text)    
+    
+    if resc1.text == resc2.text:
+        doc.write('POST Composite retrieved the same information')
+        success_postc = True
+    else:
+        doc.write('POST Composite didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST Composite didn\'t retrieve the correct information--------------------\n')
+        doc.write(resc2.text)
+        
+    result = {
+        'insertObservation_POSTS' : success_posts,
+        'insertObservation_POSTC' : success_postc
+        }
+        
+    return result
+
+def getFeatureOfInterest(doc):
+    
+    doc.write('\n\n-----------------getFeatureOfInterest-----------------------\n')
+    
+    service = 'test'
+    foi = 'test'
+    srs = '4326'
+    
+    success_get = False
+    success_post = False
+    combo = False
+    
+    get = 'http://localhost/istsos/' + service + '?request=getFeatureOfInterest&FeatureOfInterestId=' + foi + '&srsName=' + srs + '&service=SOS&version=1.0.0'
+        
+    post = '''<?xml version="1.0" encoding="UTF-8"?>
+    <sos:getfeatureOfinterest
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+        xmlns:sos="http://www.opengis.net/sos/1.0"
+        xmlns:gml="http://www.opengis.net/gml/3.2"
+        xmlns:ogc="http://www.opengis.net/ogc"
+        xmlns:om="http://www.opengis.net/om/1.0" service="SOS" outputFormat="text/xml;subtype='sensorML/1.0.0'">
+            <FeatureOfInterestId>urn:ogc:def:feature:x-istsos:1.0:Point:test</FeatureOfInterestId>
+            <srsName>4326</srsName>    
+      </sos:getfeatureOfinterest>'''
+    
+    header = {'Content-Type': 'application/xml'}    
+    
+    get1 = requests.get(get, prefetch=True)
+    time.sleep(1)
+    get2 = requests.get(get, prefetch=True)
+    
+    res1 = requests.post('http://localhost/istsos/' + service, data=post, headers=header, prefetch=True)
+    time.sleep(1)
+    res2 = requests.post('http://localhost/istsos/' + service, data=post, headers=header, prefetch=True)
+    
+    if get1.text == get2.text:
+        doc.write('GET retrieved the same information')
+        success_get = True
+    else:
+        doc.write('GET didn\'t retrieve the correct information')
+        doc.write('\n---------------------GET didn\'t retrieve the correct information--------------------\n')
+        doc.write(get2.text)
+    
+    if res1.text == res2.text:
+        doc.write('POST retrieved the same information')
+        success_post = True
+    else:
+        doc.write('POST didn\'t retrieve the correct information')
+        doc.write('\n---------------------POST didn\'t retrieve the correct information--------------------\n')
+        doc.write(res2.text)
+    
+    if get2.text == res2.text:
+        doc.write('POST and GET retrieved the same information')
+        combo = True
+    else:
+        doc.write('POST and GET didn\'t retrieve the correct information')
+        doc.write('\nPOST and GET didn\'t retrieve the correct information\n')
+        doc.write('\n---------------------GET--------------------\n\n')
+        doc.write(get2.text)
+        doc.write('\n\n---------------------POST--------------------\n\n')
+        doc.write(res2.text)
+        
+    result = {
+        'getFeatureOfInterest_GET' : success_get,
+        'getFeatureOfInterest_POST' : success_post,
+        'getFeatureOfInterest_BOTH' : combo
+        }
+        
+    return result
\ No newline at end of file
diff --git a/test/post.py b/test/post.py
new file mode 100755
index 0000000..43e6c0f
--- /dev/null
+++ b/test/post.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+
+import json
+import lib.requests as requests
+
+def POST(fname, spost, address):
+    
+    #print  fname + ', POST'
+    
+    res = requests.post(
+        address,
+        data=json.dumps(spost),
+        prefetch=True
+    )
+             
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+
+    return res.json
+    
+def services_name_uoms_POST(sname, post):
+    
+    fname = '/istsos/services/{name}/uoms'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/uoms'
+    
+    result = POST(fname, post, address)
+    return result
+    
+def services_POST(post):
+    
+    fname = '/istsos/services'
+    address = 'http://localhost/istsos/wa/istsos/services'
+    
+    result = POST(fname, post, address)
+    return result
+    
+def services_name_operations_insertobservation_POST(sname, post):
+    
+    fname = '/istsos/services/{name}/operations/insertobservation'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/operations/insertobservation'
+
+    result = POST(fname, post, address)
+    return result
+    
+def services_name_procedures_POST(sname, post):
+    
+    fname = '/istsos/services/{name}/procedures'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/procedures'
+    
+    result = POST(fname, post, address)
+    return result
+    
+def services_name_procedures_name_ratingcurve_POST(sname, pname, post):
+    
+    fname = '/istsos/services/{name}/procedures/{name}/ratingcurve'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/procedures/' + pname + '/ratingcurve'
+    
+    result = POST(fname, post, address)
+    return result    
+    
+    
+def operations_validatedb_POST(post):
+    
+    fname = '/istsos/operations/validatedb'
+    address = 'http://localhost/istsos/wa/istsos/operations/validatedb'
+    
+    result = POST(fname, post, address)
+    return result
+    
+def services_name_offerings_POST(sname, post):
+    
+    fname = '/istsos/services/{name}/offerings'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings'
+    
+    result = POST(fname, post, address)
+    return result
+    
+def services_name_offerings_name_procedures_name_POST(sname, oname, post):
+    
+    fname = '/istsos/services/{name}/offerings/{name}/procedures/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/' + oname + '/procedures'
+    
+    result = POST(fname, post, address)
+    return result
+    
+def services_name_observedproperties_POST(sname, post):
+    
+    fname = '/istsos/services/{name}/observedproperties'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/observedproperties'
+    
+    result = POST(fname, post, address)
+    return result
+    
+def services_name_dataqualities_POST(sname, post):
+    
+    fname = '/istsos/services/{name}/dataqualities'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/dataqualities'
+    
+    result = POST(fname, post, address)
+    return result
\ No newline at end of file
diff --git a/test/prove.py b/test/prove.py
new file mode 100755
index 0000000..8d7a3b5
--- /dev/null
+++ b/test/prove.py
@@ -0,0 +1,1669 @@
+# -*- coding: utf-8 -*-
+
+import json, pprint
+import lib.requests as requests
+
+
+def run():
+    
+    pp = pprint.PrettyPrinter(indent=2)   
+    
+    
+
+
+def operations_status_GET(pp):
+    print "operations/status, GET \n"
+     
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/operations/status',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def operations_log_GET(pp):
+    print "operations/log, GET"
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/operations/log',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def operations_log_DELETE(pp):
+    print "operations/log, DELETE"
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/operations/log',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def operations_about_GET(pp):
+    print "operations/about, GET"
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/operations/about',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def operations_validatedb_POST(pp):
+    print "operations/validatedb, POST"
+    
+    put = { #not the right object implementation
+        "title": "IST Sensor Observation Service 200000",
+        "abstract": "hydro-meteorological monitoring network",
+        "keywords": "SOS,IST,SUPSI",
+        "fees": "NONE",
+        "accessconstrains": "NONE",
+        "authority":" x-istsos",
+        "urnversion": "1.0"
+    }
+    
+    res = requests.post(
+        'http://localhost/istsos/wa/istsos/operations/validatedb',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def operations_initialization_GET(pp):
+    print "operations/initialization, GET"
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/operations/initialization',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def operations_initialization_PUT(pp):
+    print "operations/initialization, PUT"
+    
+    put = {"level": "2"}
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/operations/initialization',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_GET(pp):
+    print "services, GET"
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_POST(pp):
+    print "services, POST"
+    
+    post = {
+        "path": "gneeeeeeek",
+        "service": "pippo"
+    }
+    
+    res = requests.post(
+        'http://localhost/istsos/wa/istsos/services',
+        data=json.dumps(post),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_GET(pp):
+    print "services/{name}, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_PUT(pp):
+    print "services/{name}, PUT"
+    
+    dbname = "pippo"
+    
+    put = {
+        "service": "gianni", 
+        "dbname": "istsos", 
+        "host": "localhost", 
+        "user": "postgres", 
+        "password": "postgres", 
+        "port": "5432"
+    }
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname,
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_DELETE(pp):
+    print "services/{name}, DELETE"
+    
+    dbname = "test_update"
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_configsections_GET(pp):
+    print "services/{name}/configsections, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_configsections_PUT(pp):
+    print "services/{name}/configsections, PUT"
+    
+    dbname = "demo"
+    
+    put = {
+        "getobservation": {
+            "default": True, 
+            "maxgoperiod": "200", 
+            "aggregatenodataqi": "-100", 
+            "defaultqi": "100", 
+            "aggregatenodata": "-999.9"
+            }, 
+        "urn": {
+            "process": "urn:ogc:def:process:x-istsos:1.0:", 
+            "property": "urn:ogc:def:property:x-istsos:1.0:", 
+            "offering": "urn:ogc:def:offering:x-istsos:1.0:", 
+            "default": True, 
+            "sensor": "urn:ogc:def:sensor:x-istsos:1.0:", 
+            "phenomena": "urn:ogc:def:phenomenon:x-istsos:1.0:", 
+            "feature": "urn:ogc:def:feature:x-istsos:1.0:", 
+            "sensorType": "urn:ogc:def:sensorType:x-istsos:1.0:", 
+            "dataType": "urn:ogc:def:dataType:x-istsos:1.0:", 
+            "role": "urn:role:x-istsos:1.0:", 
+            "refsystem": "urn:ogc:crs:EPSG:", 
+            "time": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "keywords": "urn:ogc:def:keywords:x-istsos:1.0:", 
+            "identifier": "urn:ogc:def:identifier:x-istsos:1.0:", 
+            "parameter": "urn:ogc:def:parameter:x-istsos:1.0:", 
+            "procedure": "urn:ogc:def:procedure:x-istsos:1.0:"
+            }, 
+        "connection": {
+            "default": True, 
+            "dbname": "istsos", 
+            "host": "localhost", 
+            "user": "postgres", 
+            "password": "postgres", 
+            "port": "5432"
+            }, 
+        "identification": {
+            "title": "IST Sensor Observation Service 1", 
+            "default": False, 
+            "abstract": "hydro-meteorological monitoring network", 
+            "urnversion": "1.0", 
+            "authority": "x-istsos", 
+            "fees": "NONE", 
+            "keywords": "SOS,IST,SUPSI", 
+            "accessconstrains": "NONE"
+            }, 
+        "serviceurl": {
+            "default": True, 
+            "url": "http://localhost/istsos/pippo"
+            }, 
+        "provider": {
+            "contactcountry": "Switzerland", 
+            "providername": "Istituto Scienze della Terra", 
+            "default": True, 
+            "contactposition": "Data manager", 
+            "contactvoice": "+41586666200", 
+            "contactadminarea": "Canton Ticino", 
+            "contactemail": "geoservice at supsi.ch", 
+            "contactdeliverypoint": "Campus Trevano", 
+            "contactname": "Team Geomatica", 
+            "contactpostalcode": "6952", 
+            "contactcity": "Canobbio", 
+            "providersite": "http://www.supsi.ch/ist", 
+            "contactfax": "+41586666209"
+            }, 
+        "geo": {
+            "zaxisname": "altitude", 
+            "default": True, 
+            "xaxisname": "easting", 
+            "yaxisname": "northing", 
+            "allowedepsg": "4326,3857", 
+            "istsosepsg": "21781"
+            }
+        }
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_configsections_DELETE(pp):
+    print "services/{name}/configsections, DELETE" #shouldn't work with default as {name}
+    
+    dbname = 'default'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+    
+def services_name_configsections_getobservation_GET(pp):
+    print "services/{name}/configsections/getobservation, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/getobservation',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_configsections_getobservation_PUT(pp):
+    print "services/{name}/configsections/getobservation, PUT"
+    
+    dbname = "demo"
+    
+    put = {
+        "default": False, 
+        "maxgoperiod": "200", 
+        "aggregatenodataqi": "-100", 
+        "defaultqi": "100", 
+        "aggregatenodata": "-999.9"
+        }
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/getobservation',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_configsections_getobservation_DELETE(pp):
+    print "services/{name}/configsections/getobservation, DELETE" #shouldn't work with default as {name}
+    
+    dbname = 'default'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/getobservation',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def services_name_configsections_identification_GET(pp):
+    print "services/{name}/configsections/identification, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/identification',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_configsections_identification_PUT(pp):
+    print "services/{name}/configsections/identification, PUT"
+    
+    dbname = "demo"
+    
+    put = {
+        "title": "IST Sensor Observation Service 1", 
+        "default": False, 
+        "abstract": "hydro-meteorological monitoring network", 
+        "urnversion": "1.0", 
+        "authority": "x-istsos", 
+        "fees": "NONE", 
+        "keywords": "SOS,IST,SUPSI, test", 
+        "accessconstrains": "NONE"}
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/identification',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_configsections_identification_DELETE(pp):
+    print "services/{name}/configsections/identification, DELETE" #shouldn't work with default as {name}
+    
+    dbname = 'default'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/identification',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def services_name_configsections_geo_GET(pp):
+    print "services/{name}/configsections/geo, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/geo',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_configsections_geo_PUT(pp):
+    print "services/{name}/configsections/geo, PUT"
+    
+    dbname = "demo"
+    
+    put = {
+        "zaxisname": "altitude", 
+        "default": False, 
+        "xaxisname": "easting", 
+        "yaxisname": "northing", 
+        "allowedepsg": "4326,3857", 
+        "istsosepsg": "21781"
+        }
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/geo',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_configsections_geo_DELETE(pp):
+    print "services/{name}/configsections/geo, DELETE" #shouldn't work with default as {name}
+    
+    dbname = 'default'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/geo',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def services_name_configsections_connection_GET(pp):
+    print "services/{name}/configsections/connection, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/connection',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_configsections_connection_PUT(pp):
+    print "services/{name}/configsections/connection, PUT"
+    
+    dbname = "demo"
+    
+    put = {
+        "default": False, 
+        "dbname": "istsos", 
+        "host": "localhost", 
+        "user": "postgres", 
+        "password": "postgres", 
+        "port": "5432"
+        }
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/connection',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_configsections_connection_operations_validatedb_GET(pp):
+    print "services/{name}/configsections/connection/operations/validatedb, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/connection/operations/validatedb',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_configsections_serviceurl_GET(pp):
+    print "services/{name}/configsections/serviceurl, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/serviceurl',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_configsections_serviceurl_PUT(pp):
+    print "services/{name}/configsections/serviceurl, PUT"
+    
+    dbname = "demo"
+    
+    put = {"default": False, "url": "http://localhost/istsos/demo"}
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/serviceurl',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_configsections_serviceurl_DELETE(pp):
+    print "services/{name}/configsections/serviceurl, DELETE" #shouldn't work with default as {name}
+    
+    dbname = 'default'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/serviceurl',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def services_name_configsections_provider_GET(pp):
+    print "services/{name}/configsections/provider, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/provider',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_configsections_provider_PUT(pp):
+    print "services/{name}/configsections/provider, PUT"
+    
+    dbname = "demo"
+    
+    put = {
+        "contactcountry": "Switzerland", 
+        "providername": "South Hampton Institute of Technology", 
+        "default": False, 
+        "contactposition": "Data manager", 
+        "contactvoice": "+41586666200", 
+        "contactadminarea": "Canton Ticino", 
+        "contactemail": "geoservice at supsi.ch", 
+        "contactdeliverypoint": "Campus Trevano", 
+        "contactname": "Team Geomatica", 
+        "contactpostalcode": "6952", 
+        "contactcity": "Canobbio", 
+        "providersite": "http://www.supsi.ch/ist", 
+        "contactfax": "+41586666209"
+        }
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/provider',
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_configsections_provider_DELETE(pp):
+    print "services/{name}/configsections/provider, DELETE" #shouldn't work with default as {name}
+    
+    dbname = 'default'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/configsections/provider',
+        prefetch=True
+    )
+    
+    pp.pprint(res.json)
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    print "\n ************************************ \n"
+    
+def services_name_dataqualities_GET(pp):
+    print "services/{name}/dataqualities, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/dataqualities',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_dataqualities_POST(pp):
+    print "services/{name}/dataqualities, POST"
+    
+    dbname = "demo"
+    
+    post = {
+        "code": 42, 
+        "name": "the answer", 
+        "description": "Answer to the Ultimate Question of Life, the Universe, and Everything"}
+    
+    res = requests.post(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/dataqualities',
+        data=json.dumps(post),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_dataqualities_code_GET(pp):
+    print "services/{name}/dataqualities/{code}, GET"
+    
+    dbname = 'demo'
+    qualcode = '42'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/dataqualities/' + qualcode,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_dataqualities_code_PUT(pp):
+    print "services/{name}/dataqualities/{code}, PUT"
+    
+    dbname = "demo"
+    qualcode = '42'
+    
+    put = {
+        "code": 42, 
+        "name": "the answer", 
+        "description": "Answer to the Life, the Universe, and Everything"}
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/dataqualities/' + qualcode,
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_dataqualities_code_DELETE(pp):
+    print "services/{name}/dataqualities/{code}, DELETE"
+    
+    dbname = "demo"
+    qualcode = '42'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/dataqualities/' + qualcode,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_procedures_POST(pp):
+    print "services/{name}/procedures, POST"
+    
+    dbname = "demo"
+    
+    post = {
+        "inputs": [], 
+        "description": "temperature weather station in Usmate Carate", 
+        "classification": [
+            {
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType", 
+            "name": "System Type", 
+            "value": "insitu-fixed-point"
+            }, 
+            {
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType", 
+            "name": "Sensor Type", 
+            "value": "tipping bucket rain gauge"
+            }
+        ], 
+        "characteristics": "", 
+        "interfaces": "", 
+        "keywords": "weather,meteorological,IST", 
+        "contacts": [], 
+        "assignedSensorId": "6ecb65065eccaac8967089df62c81a24", 
+        "documentation": [], 
+        "system": "PIPPO", 
+        "capabilities": [], 
+        "identification": [], 
+        "location": {
+            "geometry": {
+                "type": "Point", 
+                "coordinates": ["8.96127", "46.02723", "344.1"]
+                }, 
+            "crs": {
+                "type": "name", 
+                "properties": {"name": "EPSG:4326"}
+                }, 
+            "type": "Feature", 
+            "properties": {"name": "PIPPO"}
+            }, 
+        "outputs": [
+            {
+            "definition": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "constraint": {
+                "max": "", 
+                "interval": ["2013-01-01T00:10:00.000000+0100", "2013-02-05T00:00:00.000000+0100"], 
+                "role": "", 
+                "valuelist": "", 
+                "min": ""
+                }, 
+            "name": "Time", 
+            "uom": "", 
+            "description": ""
+            }, 
+            {
+            "definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall", 
+            "constraint": {
+                "max": "", 
+                "interval": "", 
+                "role": "", 
+                "valuelist": "", 
+                "min": ""
+                }, 
+            "name": "air-rainfall", 
+            "uom": "mm", 
+            "description": ""
+            }
+        ], 
+        "system_id": "PIPPO", 
+        "history": []
+        }
+    
+    res = requests.post(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/procedures',
+        data=json.dumps(post),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_procedures_name_GET(pp):
+    print "services/{name}/procedures/{name}, GET"
+    
+    dbname = 'demo'
+    pname = 'PIPPO'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/procedures/' + pname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_procedures_name_PUT(pp):
+    print "services/{name}/procedures/{name}, PUT"
+    
+    dbname = "demo"
+    pname = 'PIPPO'
+    
+    put = {
+        "inputs": [], 
+        "description": "temperature weather station in Usmate Carate", 
+        "classification": [
+            {
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType", 
+            "name": "System Type", 
+            "value": "insitu-fixed-point"
+            }, 
+            {
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType", 
+            "name": "Sensor Type", 
+            "value": "tipping bucket rain gauge"
+            }
+        ], 
+        "characteristics": "", 
+        "interfaces": "", 
+        "keywords": "weather,meteorological,IST, test", 
+        "contacts": [], 
+        "assignedSensorId": "6ecb65065eccaac8967089df62c81a24", 
+        "documentation": [], 
+        "system": "PIPPO", 
+        "capabilities": [], 
+        "identification": [], 
+        "location": {
+            "geometry": {
+                "type": "Point", 
+                "coordinates": ["8.96127", "46.02723", "344.1"]
+                }, 
+            "crs": {
+                "type": "name", 
+                "properties": {"name": "EPSG:4326"}
+                }, 
+            "type": "Feature", 
+            "properties": {"name": "PIPPO"}
+            }, 
+        "outputs": [
+            {
+            "definition": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "constraint": {
+                "max": "", 
+                "interval": ["2013-01-01T00:10:00.000000+0100", "2013-02-05T00:00:00.000000+0100"], 
+                "role": "", 
+                "valuelist": "", 
+                "min": ""
+                }, 
+            "name": "Time", 
+            "uom": "", 
+            "description": ""
+            }, 
+            {
+            "definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall", 
+            "constraint": {
+                "max": "", 
+                "interval": "", 
+                "role": "", 
+                "valuelist": "", 
+                "min": ""
+                }, 
+            "name": "air-rainfall", 
+            "uom": "mm", 
+            "description": ""
+            }
+        ], 
+        "system_id": "PIPPO", 
+        "history": []
+        }
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/procedures/' + pname,
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_procedures_name_DELETE(pp):
+    print "services/{name}/procedures/{name}, DELETE"
+    
+    dbname = "demo"
+    pname = 'PIPPO'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/procedures/' + pname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_procedures_operations_getlist_GET(pp):
+    print "services/{name}/procedures/operations/getlist, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/procedures/operations/getlist',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_offerings_GET(pp):
+    print "services/{name}/offerings, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_offerings_POST(pp):
+    print "services/{name}/offerings, POST"
+    
+    dbname = 'demo'
+    
+    post = {
+        "description": "temporary offering to hold self-registered procedures/sensors waiting for service adimistration acceptance", 
+        "expiration": "", 
+        "active": True, 
+        "procedures": 4, 
+        "id": 1, 
+        "name": "piripicchio"
+        }
+    
+    res = requests.post(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings',
+        data=json.dumps(post),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_offerings_name_GET(pp):
+    print "services/{name}/offerings/{name}, GET"
+    
+    dbname = 'demo'
+    oname = 'piripicchio'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings/' + oname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_offerings_name_PUT(pp):
+    print "services/{name}/offerings/{name}, PUT"
+    
+    dbname = "demo"
+    oname = 'piripicchio'
+    
+    put = {
+        "description": "blablabla", 
+        "expiration": "", 
+        "active": True, 
+        "procedures": 0, 
+        "id": 2, 
+        "name": "piripicchio"}
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings/' + oname,
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_offerings_name_DELETE(pp):
+    print "services/{name}/offerings/{name}, DELETE"
+    
+    dbname = "demo"
+    oname = 'piripicchio'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings/' + oname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_offerings_name_procedures_GET(pp):
+    print "services/{name}/offerings/{name}/procedures, GET"
+    
+    dbname = 'demo'
+    oname = 'temporary'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings/' + oname + '/procedures',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_offerings_name_procedures_operations_memberlist_GET(pp):
+    print "services/{name}/offerings/{name}/procedures/operations/membelist, GET"
+    
+    dbname = 'demo'
+    oname = 'temporary'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings/' + oname + '/procedures/operations/memberlist',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_offerings_name_procedures_operations_nonmemberlist_GET(pp):
+    print "services/{name}/offerings/{name}/procedures/operations/nonmemberlist, GET"
+    
+    dbname = 'demo'
+    oname = 'temporary'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings/' + oname + '/procedures/operations/nonmemberlist',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+    
+def services_name_offerings_operations_getlist_GET(pp):
+    print "services/{name}/offerings/operations/getlist, GET"
+    
+    dbname = 'demo'
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/offerings/operations/getlist',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_operations_getobservation_offerings_name_procedures_GET(pp):
+    print "services/{name}/operations/getobservation/offerings/{name}/procedures/..., GET"
+    
+    dbname = 'demo'
+    oname = 'temporary'
+    pname = 'BELLINZONA'
+    obprop = 'urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature'
+    start = '2013-01-01T00:10:00.000000+0100'
+    end = '2013-01-05T00:00:00.000000+0100'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/operations/getobservation/offerings/' + oname + '/procedures/' + pname + '/observedproperties/' + obprop + '/eventtime/' + start + '/' + end,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_operations_insertobservation_POST(pp):
+    print "services/{name}/operations/insertobservation, POST"
+    
+    dbname = 'demo'    
+    
+    post = {
+    "name": "BELLINZONA", 
+    "samplingTime": {
+        "duration": "P34DT23H50M", 
+        "beginPosition": "2013-01-01T00:10:00.000000+0100", 
+        "endPosition": "2013-02-05T00:00:00.000000+0100"
+        }, 
+    "result": {
+        "DataArray": {
+            "elementCount": "3", 
+            "values": [
+                ["2013-01-01T00:20:00.000000+0100", "20", "100"], 
+                ["2013-01-01T00:30:00.000000+0100", "20", "100"], 
+                ["2013-01-01T00:40:00.000000+0100", "20", "100"], 
+                ["2013-01-01T00:50:00.000000+0100", "20", "100"], 
+                ["2013-01-01T01:00:00.000000+0100", "20", "100"]
+            ], 
+            "field": [
+                {
+                "definition": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+                "name": "Time"
+                }, 
+                {
+                "definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature", 
+                "name": "air-temperature", 
+                "uom": "\u00b0C"
+                }, 
+                {"definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature:qualityIndex", 
+                 "name": "air-temperature:qualityIndex", 
+                 "uom": "-"
+                 }
+            ]
+        }
+    }, 
+    "featureOfInterest": {
+        "geom": "<gml:Point srsName='EPSG:21781'><gml:coordinates>722032.159653624286875,118091.771747849488747,176.382462739521088</gml:coordinates></gml:Point>", 
+        "name": "urn:ogc:def:feature:x-istsos:1.0:Point:BELLINZONA"
+        }, 
+    "observedProperty": {
+        "component": [
+            "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature", 
+            "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature:qualityIndex"
+            ], 
+        "CompositePhenomenon": {
+            "dimension": "3", 
+            "id": "comp_5", 
+            "name": "timeSeriesOfObservations"
+            }, 
+        "components": [
+            "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature", 
+            "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature:qualityIndex"
+            ]
+        }, 
+    "procedure": "urn:ogc:def:procedure:x-istsos:1.0:BELLINZONA"
+    }
+    
+    res = requests.post(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/operations/insertobservation',
+        data=json.dumps(post),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_observedproperties_GET(pp):
+    print "services/{name}/observedproperties, GET"
+    
+    dbname = 'demo'
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/observedproperties',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_observedproperties_POST(pp):
+    print "services/{name}/observedproperties, POST"
+    
+    dbname = 'demo'    
+    
+    post = {
+        "definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:LOVEisintheAIR", 
+        "procedures": ["P_LUGANO", "LOCARNO"], 
+        "name": "LoveIsInTheAir", 
+        "description": "liquid precipitation or snow water equivalent"
+        }
+    
+    res = requests.post(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/observedproperties',
+        data=json.dumps(post),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_observedproperties_name_GET(pp):
+    print "services/{name}/observedproperties/{name}, GET"
+    
+    dbname = 'demo'
+    oname = 'urn:ogc:def:parameter:x-istsos:1.0:meteo:air:LOVEisintheAIR'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/observedproperties/' + oname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_observedproperties_name_PUT(pp):
+    print "services/{name}/observedproperties/{name}, PUT"
+    
+    dbname = "demo"
+    oname = 'urn:ogc:def:parameter:x-istsos:1.0:meteo:air:LOVEisintheAIR'
+    
+    put = {
+        "definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:LoveIsInTheAir", 
+        "procedures": [], 
+        "name": "LoveIsInTheAir", 
+        "description": "liquid precipitation or snow water equivalent"}
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/observedproperties/' + oname,
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_observedproperties_name_DELETE(pp):
+    print "services/{name}/observedproperties/{name}, DELETE"
+    
+    dbname = "demo"
+    oname = 'urn:ogc:def:parameter:x-istsos:1.0:meteo:air:LoveIsInTheAir'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/observedproperties/' + oname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_uoms_GET(pp):
+    print "services/{nome}/uoms, GET"
+    
+    dbname = 'demo'    
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/uoms',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_uoms_POST(pp):
+    print "services/{nome}/uoms, POST"
+    
+    dbname = 'demo'
+    
+    post = {
+        "procedures": ["LOCARNO"], 
+        "name": "am",
+        "description": "Love is in the air"
+        }
+    
+    res = requests.post(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/uoms',
+        data=json.dumps(post),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_uoms_name_GET(pp):
+    print "services/{name}/uoms/{name}, GET"
+    
+    dbname = 'demo'
+    oname = 'test'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/uoms/' + oname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_uoms_name_PUT(pp):
+    print "services/{name}/uoms/{name}, PUT"
+    
+    dbname = "demo"
+    oname = 'am'
+    
+    put = {
+        "procedures": [], 
+        "name": "love", 
+        "description": "Love is in the air yesss"
+        }
+    
+    res = requests.put(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/uoms/' + oname,
+        data=json.dumps(put),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_uoms_name_DELETE(pp):
+    print "services/{name}/uoms/{name}, DELETE"
+    
+    dbname = "demo"
+    oname = 'test'
+    
+    res = requests.delete(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/uoms/' + oname,
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)
+    print "\n ************************************ \n"
+    
+def services_name_epsgs_GET(pp):
+    print "services/{name}/epsgs, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/epsgs',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
+    
+def services_name_systemtypes_GET(pp):
+    print "services/{name}/systemtypes, GET"
+    
+    dbname = 'demo'
+    
+    res = requests.get(
+        'http://localhost/istsos/wa/istsos/services/' + dbname + '/systemtypes',
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+        
+    pp.pprint(res.json)   
+    
+    print "\n ************************************ \n"
\ No newline at end of file
diff --git a/test/put.py b/test/put.py
new file mode 100755
index 0000000..1fd2b65
--- /dev/null
+++ b/test/put.py
@@ -0,0 +1,133 @@
+# -*- coding: utf-8 -*-
+
+import json
+import lib.requests as requests
+
+def PUT(fname, sput, address):
+    
+    #print fname + ', PUT'
+    
+    res = requests.put(
+        address,
+        data=json.dumps(sput),
+        prefetch=True
+    )
+    
+    try:
+        res.raise_for_status() # raise exception if som comunication error occured    
+    except Exception as e:
+        print str(e)
+    
+    return res.json
+    
+def services_name_uoms_name_PUT(sname, uname, put):
+    
+    fname = '/istsos/services/{name}/uoms/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/uoms/' + uname
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_PUT(put, sname):
+    
+    fname = '/istsos/services/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_procedures_name_PUT(sname, pname, put):
+    
+    fname = '/istsos/services/{name}/procedures/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/procedures/' + pname
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def operations_initialization_PUT(put):
+    
+    fname = '/istsos/operations/initialization'
+    address = 'http://localhost/istsos/wa/istsos/operations/initialization'
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_offerings_name_PUT(sname, oname, put):
+    
+    fname = '/istsos/services/{name}/offerings/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/offerings/' + oname
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_observedproperties_name_PUT(sname, oname, put):
+    
+    fname = '/istsos/services/{name}/observedproperties/{name}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/observedproperties/' + oname
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_dataqualities_code_PUT(sname, put, qualcode):
+    
+    fname = '/istsos/services/{name}/dataqualities/{code}'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/dataqualities/' + qualcode
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_configsections_PUT(sname, put):
+    
+    fname = '/istsos/services/{name/default}/configsections'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections'
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_configsections_getobservation_PUT(sname, put):
+    
+    fname = '/istsos/services/{name/default}/configsections/getobservation'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/getobservation'
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_configsections_identification_PUT(sname, put):
+    
+    fname = '/istsos/services/{name/default}/configsections/identification'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/identification'
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_configsections_geo_PUT(sname, put):
+    
+    fname = '/istsos/services/{name/default}/configsections/geo'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/geo'
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_configsections_connection_PUT(sname, put):
+    
+    fname = '/istsos/services/{name/default}/configsections/connection'    
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/connection'
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_configsections_serviceurl_PUT(sname, put):
+    
+    fname = '/istsos/services/{name/default}/configsections/serviceurl'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/serviceurl'
+    
+    result = PUT(fname, put, address)
+    return result
+    
+def services_name_configsections_provider_PUT(sname, put):
+    
+    fname = '/istsos/services/{name/default}/configsections/provider'
+    address = 'http://localhost/istsos/wa/istsos/services/' + sname + '/configsections/provider'
+    
+    result = PUT(fname, put, address)
+    return result
\ No newline at end of file
diff --git a/test/scripts/__init__.py b/test/scripts/__init__.py
new file mode 100755
index 0000000..d20ce61
--- /dev/null
+++ b/test/scripts/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+__all__ = [ "testConverter", "importvp"]
diff --git a/test/scripts/data/soglie_QC0_2013.txt b/test/scripts/data/soglie_QC0_2013.txt
new file mode 100755
index 0000000..4aa9356
--- /dev/null
+++ b/test/scripts/data/soglie_QC0_2013.txt
@@ -0,0 +1,96 @@
+P_OLI,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_BED,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_FUS_PAE,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_FRA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_LOD,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_GNO,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_MAG,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_CAM_DOG,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_ISO,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_MEN,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_CHIA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_ARO,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_GIUB,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_SOM,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_CVM,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_CAM,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_LUZ,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_NOV,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_CAV,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_CAR,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_COL,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_TRE,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_PON,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_GRA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_CAL,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_SON,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+P_BIA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,40
+A_GNO_GNO,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2
+A_BON_QUA,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,3
+A_LAV_RSV,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2.5
+A_SAL_MAG,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,5
+A_CAL_AIR,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2
+A_VED_ISO,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2.5
+A_MAR_MAR,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,3
+A_TIC_BED,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,4
+A_LAV_MEN,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2.5
+A_SCA_LUG,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2.5
+A_VVED_AGN,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2.5
+A_BOL_PTC,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,3
+A_CUC_POR,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2.5
+A_ROV_CVM1,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2.5
+A_ROV_CVM2,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,3
+A_ROV_CVM3,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,3
+A_MAG_LOD,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,7
+A_MUZ_MUZ,urn:ogc:def:parameter:x-istsos:1.0:lake:water:height,337,339
+A_AETCAN_AIR,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,3
+A_SBIB_PON,urn:ogc:def:parameter:x-istsos:1.0:spring:water:height,0,1
+A_RMUL_ARB,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,1
+A_MOR_GIU,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,3.5
+A_CFER_ARO,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,1
+A_MAR_MAR2,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2.5
+A_RMUL_MAR,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,1
+A_TRA_ARB_FFS1,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,2
+A_TRA_ARB_FFS2,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,0,1
+A_BOL_PTC_LAM,urn:ogc:def:parameter:x-istsos:1.0:river:water:height,-0.2,1
+T_ISO,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_NOV,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_CAV,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_CAR,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_COL,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_TRE,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_PON,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_GRA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_CAL,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_SON,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_BIA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_CHIA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+T_CAM_DOG,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:temperature,-20,45
+H_NOV,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity,1,100
+H_CAV,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity,1,100
+H_TRE,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity,1,100
+H_BIA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:humidity,1,100
+H_CHIA,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:relative_humidity,1,100
+B_TRE,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:pressure,900,1020
+R_CAV,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:radiation,-10,1300
+WT_GNO_GNO,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_BON_QUA,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_LAV_RSV,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_SAL_MAG,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_CAL_AIR,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_VED_ISO,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_MAR_MAR,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_TIC_BED,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_LAV_MEN,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_SCA_LUG,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_VVED_AGN,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_BOL_PTC,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_CUC_POR,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_MUZ_MUZ,urn:ogc:def:parameter:x-istsos:1.0:lake:water:temperature,-5,35
+WT_TRA_ARB_FFS1,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_MOR_GIU,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_ROV_CVM2,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_MAG_CEV,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_ROV_CVM1,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+WT_ROV_CVM3,urn:ogc:def:parameter:x-istsos:1.0:river:water:temperature,-5,35
+W_PON,urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall,0,650
diff --git a/test/walib/__init__.py b/test/walib/__init__.py
new file mode 100755
index 0000000..89a9d4d
--- /dev/null
+++ b/test/walib/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+__all__ = [ "istsos" ]
\ No newline at end of file
diff --git a/test/walib/istsos/__init__.py b/test/walib/istsos/__init__.py
new file mode 100755
index 0000000..ed4caed
--- /dev/null
+++ b/test/walib/istsos/__init__.py
@@ -0,0 +1 @@
+__all__ = ["services"]
diff --git a/test/walib/istsos/services/__init__.py b/test/walib/istsos/services/__init__.py
new file mode 100755
index 0000000..28eb19e
--- /dev/null
+++ b/test/walib/istsos/services/__init__.py
@@ -0,0 +1 @@
+__all__ = ["sosRequests","configsections", "dataqualities", "epsgs", "observedproperties", "offerings", "operations", "procedures", "systemtypes", "uoms", "services"]
diff --git a/test/walib/istsos/services/configsections.py b/test/walib/istsos/services/configsections.py
new file mode 100755
index 0000000..aa45bd9
--- /dev/null
+++ b/test/walib/istsos/services/configsections.py
@@ -0,0 +1,1052 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import pprint
+import time
+
+def deldic(d, k):
+    c = d.copy()
+    for el in k:
+        if type(el) == list:
+            del c[el[0]][el[1]]
+        else:
+            del c[el]
+    return c
+
+def test_configsections(doc):
+    #services_name_configsections_GET(sname)
+    #services_name_configsections_PUT(sname, put)
+    #services_name_configsections_DELETE(sname)
+    #services_name_configsections_getobservation_GET(sname)
+    #services_name_configsections_getobservation_PUT(sname, putob)
+    #services_name_configsections_getobservation_DELETE(sname)
+    #services_name_configsections_identification_GET(sname)
+    #services_name_configsections_identification_PUT(sname, putid)
+    #services_name_configsections_identification_DELETE(sname)
+    #services_name_configsections_geo_GET(sname)
+    #services_name_configsections_geo_PUT(sname, putgeo)
+    #services_name_configsections_geo_DELETE(sname)
+    #services_name_configsections_connection_GET(sname)
+    #services_name_configsections_connection_PUT(sname, putcon)
+    #services_name_configsections_connection_operations_validatedb_GET(sname)
+    #services_name_configsections_serviceurl_GET(sname)
+    #services_name_configsections_serviceurl_PUT(sname, putsrv)
+    #services_name_configsections_serviceurl_DELETE(sname)
+    #services_name_configsections_provider_GET(sname)
+    #services_name_configsections_provider_PUT(sname, putpro)
+    #services_name_configsections_provider_DELETE(sname)
+    
+    doc.write('\n\n-----------------CONFIGSECTIONS---------------------')
+    
+    pp = pprint.PrettyPrinter(indent=2)    
+    sname = 'test'
+        
+    put = {
+        "getobservation": {
+            #"default": True, 
+            "maxgoperiod": "200", 
+            "aggregatenodataqi": "-100", 
+            "defaultqi": "100", 
+            "aggregatenodata": "-999.9",
+            "correct_qi" : "110",
+            "stat_qi" : "200",
+            "transactional_log" : "True"
+            }, 
+        "urn": {
+            "process": "urn:ogc:def:process:x-istsos:1.0:", 
+            "property": "urn:ogc:def:property:x-istsos:1.0:", 
+            "offering": "urn:ogc:def:offering:x-istsos:1.0:", 
+            #"default": True, 
+            "sensor": "urn:ogc:def:sensor:x-istsos:1.0:", 
+            "phenomena": "urn:ogc:def:phenomenon:x-istsos:1.0:", 
+            "feature": "urn:ogc:def:feature:x-istsos:1.0:", 
+            "sensorType": "urn:ogc:def:sensorType:x-istsos:1.0:", 
+            "dataType": "urn:ogc:def:dataType:x-istsos:1.0:", 
+            "role": "urn:role:x-istsos:1.0:", 
+            "refsystem": "urn:ogc:crs:EPSG:", 
+            "time": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "keywords": "urn:ogc:def:keywords:x-istsos:1.0:", 
+            "identifier": "urn:ogc:def:identifier:x-istsos:1.0:", 
+            "parameter": "urn:ogc:def:parameter:x-istsos:1.0:", 
+            "procedure": "urn:ogc:def:procedure:x-istsos:1.0:"
+            }, 
+        "connection": {
+            #"default": True, 
+            "dbname": "istsos", 
+            "host": "localhost", 
+            "user": "postgres", 
+            "password": "postgres", 
+            "port": "5432"
+            }, 
+        "identification": {
+            "title": "IST Sensor Observation Service 1", 
+            #"default": False, 
+            "abstract": "hydro-meteorological monitoring network", 
+            "urnversion": "1.0", 
+            "authority": "x-istsos", 
+            "fees": "NONE", 
+            "keywords": "SOS,IST,SUPSI", 
+            "accessconstrains": "NONE"
+            }, 
+        "serviceurl": {
+            #"default": True, 
+            "url": "http://localhost/istsos/test"
+            }, 
+        "provider": {
+            "contactcountry": "Switzerland", 
+            "providername": "Istituto Scienze della Terra", 
+            #"default": True, 
+            "contactposition": "Data manager", 
+            "contactvoice": "+41586666200", 
+            "contactadminarea": "Canton Ticino", 
+            "contactemail": "geoservice at supsi.ch", 
+            "contactdeliverypoint": "Campus Trevano", 
+            "contactname": "Team Geomatica", 
+            "contactpostalcode": "6952", 
+            "contactcity": "Canobbio", 
+            "providersite": "http://www.supsi.ch/ist", 
+            "contactfax": "+41000000000000"
+            }, 
+        "geo": {
+            "zaxisname": "altitude", 
+            #"default": True, 
+            "xaxisname": "easting", 
+            "yaxisname": "northing", 
+            "allowedepsg": "4326,3857", 
+            "istsosepsg": "21781"
+            }
+        }     
+        
+    putob = {
+        #"default": False, 
+        "maxgoperiod": "600", 
+        "aggregatenodataqi": "-100", 
+        "defaultqi": "100", 
+        "aggregatenodata": "-999.9",
+        "correct_qi" : "110",
+        "stat_qi" : "200",
+        "transactional_log": "'True"
+        }
+        
+    putid = {
+        "title": "IST Sensor Observation Service 1", 
+        #"default": False, 
+        "abstract": "hydro-meteorological monitoring network", 
+        "urnversion": "1.0", 
+        "authority": "x-istsos", 
+        "fees": "YUP, sure", 
+        "keywords": "SOS,IST,SUPSI, test", 
+        "accessconstrains": "NONE"}
+        
+    putgeo = {
+        "zaxisname": "altitude", 
+        #"default": False, 
+        "xaxisname": "easting", 
+        "yaxisname": "northing_u", 
+        "allowedepsg": "4326,3857", 
+        "istsosepsg": "21781"
+        }
+        
+    putcon = {
+        #"default": False, 
+        "dbname": "istsos", 
+        "host": "localhost", 
+        "user": "postgres", 
+        "password": "postgres", 
+        "port": "5432"
+        }
+        
+    putsrv = {
+        #"default": True, 
+        "url": "http://localhost/istsos/test"
+        }
+    
+    putpro = {
+        "contactcountry": "SwitzerlandCH", 
+        "providername": "South Hampton Institute of Technology", 
+        #"default": False, 
+        "contactposition": "Data manager", 
+        "contactvoice": "+41586666200", 
+        "contactadminarea": "Canton Ticino", 
+        "contactemail": "geoservice at supsi.ch", 
+        "contactdeliverypoint": "Campus Trevano", 
+        "contactname": "Team Geomatica", 
+        "contactpostalcode": "6952", 
+        "contactcity": "Canobbio", 
+        "providersite": "http://www.supsi.ch/ist", 
+        "contactfax": "+41586666209"
+        }
+        
+    success_get = False
+    success_put = False
+    success_del = False
+    success_getob = False
+    success_putob = False
+    success_delob = False
+    success_getid = False
+    success_putid = False
+    success_delid = False
+    success_getgeo = False
+    success_putgeo = False
+    success_delgeo = False
+    success_getcon = False
+    success_putcon = False
+    success_getconop = False
+    success_getsrv = False
+    success_putsrv = False
+    success_delsrv = False
+    success_getpro = False
+    success_putpro = False
+    success_delpro = False
+    
+    get1 = tget.services_name_configsections_GET(sname)
+    time.sleep(1)
+    get2 = tget.services_name_configsections_GET(sname)
+    put1 = tput.services_name_configsections_PUT(sname, put)
+    get3 = tget.services_name_configsections_GET(sname)
+    delete1 = tdelete.services_name_configsections_DELETE(sname)
+    get4 = tget.services_name_configsections_GET(sname)
+    
+    getob1 = tget.services_name_configsections_getobservation_GET(sname)
+    time.sleep(1)
+    getob2 = tget.services_name_configsections_getobservation_GET(sname)
+    putob1 = tput.services_name_configsections_getobservation_PUT(sname, putob)
+    getob3 = tget.services_name_configsections_getobservation_GET(sname)
+    deleteob1 = tdelete.services_name_configsections_getobservation_DELETE(sname)
+    getob4 = tget.services_name_configsections_getobservation_GET(sname)
+    
+    getid1 = tget.services_name_configsections_identification_GET(sname)
+    time.sleep(1)
+    getid2 = tget.services_name_configsections_identification_GET(sname)
+    putid1 = tput.services_name_configsections_identification_PUT(sname, putid)
+    getid3 = tget.services_name_configsections_identification_GET(sname)
+    deleteid1 = tdelete.services_name_configsections_identification_DELETE(sname)
+    getid4 = tget.services_name_configsections_identification_GET(sname)
+    
+    getgeo1 = tget.services_name_configsections_geo_GET(sname)
+    time.sleep(1)
+    getgeo2 = tget.services_name_configsections_geo_GET(sname)
+    putgeo1 = tput.services_name_configsections_geo_PUT(sname, putgeo)
+    getgeo3 = tget.services_name_configsections_geo_GET(sname)
+    deletegeo1 = tdelete.services_name_configsections_geo_DELETE(sname)
+    getgeo4 = tget.services_name_configsections_geo_GET(sname)
+    
+    getcon1 = tget.services_name_configsections_connection_GET(sname)
+    time.sleep(1)
+    getcon2 = tget.services_name_configsections_connection_GET(sname)
+    putcon1 = tput.services_name_configsections_connection_PUT(sname, putcon)
+    getcon3 = tget.services_name_configsections_connection_GET(sname)
+    
+    getcon4 = tget.services_name_configsections_connection_operations_validatedb_GET(sname)
+    time.sleep(1)
+    getcon5 = tget.services_name_configsections_connection_operations_validatedb_GET(sname)
+    
+    getpro1 = tget.services_name_configsections_provider_GET(sname)
+    time.sleep(1)
+    getpro2 = tget.services_name_configsections_provider_GET(sname)
+    putpro1 = tput.services_name_configsections_provider_PUT(sname, putpro)
+    getpro3 = tget.services_name_configsections_provider_GET(sname)
+    deletepro1 = tdelete.services_name_configsections_provider_DELETE(sname)
+    getpro4 = tget.services_name_configsections_provider_GET(sname)
+    
+    getsrv1 = tget.services_name_configsections_serviceurl_GET(sname)
+    time.sleep(1)
+    getsrv2 = tget.services_name_configsections_serviceurl_GET(sname)
+    putsrv1 = tput.services_name_configsections_serviceurl_PUT(sname, putsrv)
+    getsrv3 = tget.services_name_configsections_serviceurl_GET(sname)
+    deletesrv1 = tdelete.services_name_configsections_serviceurl_DELETE(sname)
+    getsrv4 = tget.services_name_configsections_serviceurl_GET(sname)
+    
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    #configsections
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    
+    #Check for two successful requests to have the same result
+    if get1['success'] and get2['success']:
+        if get1 == get2:
+            doc.write('services_name_configsections_GET: SUCCESS')
+            success_get = True
+        else:
+            doc.write('services_name_configsections_GET: FAILED')
+            doc.write('\n\nservices_name_configsections_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get2))
+    else:
+        doc.write('services_name_configsections_GET: FAILED')
+        doc.write('\n\nservices_name_configsections_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get2))
+        
+    
+     
+    #Checks for the PUT to be successful by comparing two GETs
+    if put1['success']:
+        #If gets before and after are the same, failure
+        if get2 == get3:
+            doc.write('services_name_configsections_PUT: FAILED')
+            doc.write('\n\nservices_name_configsections_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(put1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            temp = deldic(get3['data'], [['getobservation','default'],['urn','default'],['connection','default'],['identification','default'],['serviceurl','default'],['provider','default'],['geo','default']])
+            if (temp['getobservation'] == put['getobservation'] 
+                and temp['urn'] == put['urn'] 
+                and temp['connection'] == put['connection'] 
+                and temp['identification'] == put['identification'] 
+                and temp['serviceurl'] == put['serviceurl'] 
+                and temp['provider'] == put['provider'] 
+                and temp['geo'] == put['geo']
+                ):
+                doc.write('services_name_configsections_PUT: SUCCESS')
+                success_put = True
+            else:
+                doc.write('services_name_configsections_PUT: FAILED')
+                doc.write('\n\nservices_name_configsections_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(put1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_PUT: FAILED')
+        doc.write('\n\nservices_name_configsections_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(put1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get3))
+        
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete1['success']:
+        #If gets before and after are the same, failure
+        if get3 == get4:
+            doc.write('services_name_configsections_DELETE: FAILED')
+            doc.write('\n\nservices_name_configsections_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(delete1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get3))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get4))
+        #For the success, second get should be void
+        else:
+            if get4['total'] == get3['total'] - 1:
+                #print 'the delete is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_configsections_DELETE: SUCCESS')
+                success_del = True
+            else:
+                doc.write('services_name_configsections_DELETE: FAILED')
+                doc.write('\n\nservices_name_configsections_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(delete1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get3))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get4))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_DELETE: FAILED')
+        doc.write('\n\nservices_name_configsections_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(delete1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get3))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get4))
+        
+            
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    #observations
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    
+    #Check for two successful requests to have the same result
+    if getob1['success'] and getob2['success']:
+        if getob1 == getob2:
+            doc.write('services_name_configsections_getobservation_GET: SUCCESS')
+            success_getob = True
+        else:
+            doc.write('services_name_configsections_getobservation_GET: FAILED')
+            doc.write('\n\nservices_name_configsections_getobservation_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(getob1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(getob2))
+    else:
+        doc.write('services_name_configsections_getobservation_GET: FAILED')
+        doc.write('\n\nservices_name_configsections_getobservation_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(getob1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(getob2))
+        
+    
+     
+    #Checks for the PUT to be successful by comparing two GETs
+    if putob1['success']:
+        #If gets before and after are the same, failure
+        if getob2 == getob3:
+            doc.write('services_name_configsections_getobservation_PUTT: FAILED')
+            doc.write('\n\nservices_name_configsections_getobservation_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(putob1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getob2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getob3))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if (getob3['data']['maxgoperiod'] == putob['maxgoperiod']
+                #and getob3['data']['default'] == putob['default']
+                and getob3['data']['aggregatenodataqi'] == putob['aggregatenodataqi'] 
+                and getob3['data']['defaultqi'] == putob['defaultqi'] 
+                and getob3['data']['aggregatenodata'] == putob['aggregatenodata']
+                ):
+                #print 'the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_configsections_getobservation_PUTT: SUCCESS')
+                success_putob = True
+            else:
+                doc.write('services_name_configsections_getobservation_PUTT: FAILED')
+                doc.write('\n\nservices_name_configsections_getobservation_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(putob1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getob2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getob3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_getobservation_PUTT: FAILED')
+        doc.write('\n\nservices_name_configsections_getobservation_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(putob1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getob2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getob3))
+        
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if deleteob1['success']:
+        #If gets before and after are the same, failure
+        if getob3 == getob4:
+            doc.write('services_name_configsections_getobservations_DELETE: FAILED')
+            doc.write('\n\nservices_name_configsections_getobservations_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(deleteob1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getob3))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getob4))
+        #For the success, second get should be void
+        else:
+            if getob4['total'] <= getob3['total'] and getob4['data']['default']:
+                doc.write('services_name_configsections_getobservations_DELETE: SUCCESS')
+                success_delob = True
+            else:
+                doc.write('services_name_configsections_getobservations_DELETE: FAILED')
+                doc.write('\n\nservices_name_configsections_getobservations_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(deleteob1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getob3))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getob4))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_getobservations_DELETE: FAILED')
+        doc.write('\n\nservices_name_configsections_getobservations_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(deleteob1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getob3))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getob4))
+        
+            
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    #identification
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    
+    #Check for two successful requests to have the same result
+    if getid1['success'] and getid2['success']:
+        if getid1 == getid2:
+            doc.write('services_name_configsections_identificaiton_GET: SUCCESS')
+            success_getid = True
+        else:
+            doc.write('services_name_configsections_identificaiton_GET: FAILED')
+            doc.write('\n\nservices_name_configsections_identificaiton_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(getid1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(getid2))
+    else:
+        doc.write('services_name_configsections_identificaiton_GET: FAILED')
+        doc.write('\n\nservices_name_configsections_identification_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(getid1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(getid2))
+        
+    
+     
+    #Checks for the PUT to be successful by comparing two GETs
+    if putid1['success']:
+        #If gets before and after are the same, failure
+        if getid2 == getid3:
+            doc.write('services_name_configsections_identification_PUT: FAILED')
+            doc.write('\n\nservices_name_configsections_identification_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(putid1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getid2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getid3))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if (getid3['data']['title'] == putid['title'] 
+                #and getid3['data']['default'] == putid['default'] 
+                and getid3['data']['abstract'] == putid['abstract'] 
+                and getid3['data']['urnversion'] == putid['urnversion'] 
+                and getid3['data']['authority'] == putid['authority'] 
+                and getid3['data']['fees'] == putid['fees'] 
+                and getid3['data']['keywords'] == putid['keywords'] 
+                and getid3['data']['accessconstrains'] == putid['accessconstrains']
+                ):
+                #print 'the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_configsections_identification_PUT: SUCCESS')
+                success_putid = True
+            else:
+                doc.write('services_name_configsections_identification_PUT: FAILED')
+                doc.write('\n\nservices_name_configsections_identification_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(putid1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getid2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getid3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_identification_PUT: FAILED')
+        doc.write('\n\nservices_name_configsections_identification_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(putid1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getid2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getid3))
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if deleteid1['success']:
+        #If gets before and after are the same, failure
+        if getid3 == getid4:
+            doc.write('services_name_configsections_identification_DELETE: FAILED')
+            doc.write('\n\nservices_name_configsections_identification_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(deleteid1))     
+            doc.write('\nGet, before:\idn')
+            doc.write(pp.pformat(get3))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getid4))
+        #For the success, second get should be void
+        else:
+            if getid4['total'] <= getid3['total'] and getid4['data']['default']:
+                doc.write('services_name_configsections_identification_DELETE: SUCCESS')
+                success_delid = True
+            else:
+                doc.write('services_name_configsections_identification_DELETE: FAILED')
+                doc.write('\n\nservices_name_configsections_identification_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(deleteid1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getid3))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getid4))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_identification_DELETE: FAILED')
+        doc.write('\n\nservices_name_configsections_identification_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(deleteid1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getid3))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getid4))
+        
+            
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    #geo
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    
+    #Check for two successful requests to have the same result
+    if getgeo1['success'] and getgeo2['success']:
+        if getgeo1 == getgeo2:
+            doc.write('services_name_configsections_geo_GET: SUCCESS')
+            success_getgeo = True
+        else:
+            doc.write('services_name_configsections_geo_GET: FAILED')
+            doc.write('\n\nservices_name_configsections_geo_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(getgeo1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(getgeo2))
+    else:
+        doc.write('services_name_configsections_geo_GET: FAILED')
+        doc.write('\n\nservices_name_configsections_geo_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(getgeo1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(getgeo2))
+        
+    
+     
+    #Checks for the PUT to be successful by comparing two GETs
+    if putgeo1['success']:
+        #If gets before and after are the same, failure
+        if getgeo2 == getgeo3:
+            doc.write('services_name_configsections_geo_PUT: FAILED')
+            doc.write('\n\nservices_name_configsections_geo_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(putgeo1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getgeo2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getgeo3))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if (getgeo3['data']['zaxisname'] == putgeo['zaxisname'] 
+                #and getgeo3['data']['default'] == putgeo['default'] 
+                and getgeo3['data']['xaxisname'] == putgeo['xaxisname'] 
+                and getgeo3['data']['yaxisname'] == putgeo['yaxisname'] 
+                and getgeo3['data']['allowedepsg'] == putgeo['allowedepsg'] 
+                and getgeo3['data']['istsosepsg'] == putgeo['istsosepsg']
+                ):
+                #print 'the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_configsections_geo_PUT: SUCCESS')
+                success_putgeo = True
+            else:
+                doc.write('services_name_configsections_geo_PUT: FAILED')
+                doc.write('\n\nservices_name_configsections_geo_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(putgeo1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getgeo2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getgeo3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_geo_PUT: FAILED')
+        doc.write('\n\nservices_name_configsections_geo_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(putgeo1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getgeo2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getgeo3))
+             
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if deletegeo1['success']:
+        #If gets before and after are the same, failure
+        if getgeo3 == getgeo4:
+            doc.write('services_name_configsections_geo_DELETE: FAILED')
+            doc.write('\n\nservices_name_configsections_geo_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(deletegeo1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getgeo3))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getgeo4))
+        #For the success, second get should be void
+        else:
+            if getgeo4['total'] <= getgeo3['total'] and getgeo4['data']['default']:
+                doc.write('services_name_configsections_geo_DELETE: SUCCESS')
+                success_delgeo = True
+            else:
+                doc.write('services_name_configsections_geo_DELETE: FAILED')
+                doc.write('\n\nservices_name_configsections_geo_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(deletegeo1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getgeo3))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getgeo4))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_geo_DELETE: FAILED')
+        doc.write('\n\nservices_name_configsections_geo_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(deletegeo1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getgeo3))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getgeo4))
+        
+            
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    #serviceurl
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    
+    #Check for two successful requests to have the same result
+    if getsrv1['success'] and getsrv2['success']:
+        if getsrv1 == getsrv2:
+            doc.write('services_name_configsections_serviceurl_GET: SUCCESS')
+            success_getsrv = True
+        else:
+            doc.write('services_name_configsections_serviceurl_GET: FAILED')
+            doc.write('\n\nservices_name_configsections_serviceurl_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(getsrv1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(getsrv2))
+    else:
+        doc.write('services_name_configsections_serviceurl_GET: FAILED')
+        doc.write('\n\nservices_name_configsections_serviceurl_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(getsrv1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(getsrv2))
+        
+    
+     
+    #Checks for the PUT to be successful by comparing two GETs
+    if putsrv1['success']:
+        #If gets before and after are the same, failure
+        if getsrv2 == getsrv3:
+            doc.write('services_name_configsections_serviceurl_PUT: FAILED')
+            doc.write('\n\nservices_name_configsections_serviceurl_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(putsrv1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getsrv2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getsrv3))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if (getsrv3['data']['url'] == putsrv['url']
+                #and getsrv3['data']['default'] == putsrv['default']
+                ):
+                #print 'the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_configsections_serviceurl_PUT: SUCCESS')
+                success_putsrv = True
+            else:
+                doc.write('services_name_configsections_serviceurl_PUT: FAILED')
+                doc.write('\n\nservices_name_configsections_serviceurl_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(putsrv1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getsrv2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getsrv3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_serviceurl_PUT: FAILED')
+        doc.write('\n\nservices_name_configsections_serviceurl_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(putsrv1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getsrv2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getsrv3))
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if deletesrv1['success']:
+        #If gets before and after are the same, failure
+        if getsrv3 == getsrv4:
+            doc.write('services_name_configsections_serviceurl_DELETE: FAILED')
+            doc.write('\n\nservices_name_configsections_serviceurl_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(deletesrv1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getsrv3))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getsrv4))
+        #For the success, second get should be void
+        else:
+            if getsrv4['total'] <= getsrv3['total'] and getsrv4['data']['default']:
+                doc.write('services_name_configsections_serviceurl_DELETE: SUCCESS')
+                success_delsrv = True
+            else:
+                doc.write('services_name_configsections_serviceurl_DELETE: FAILED')
+                doc.write('\n\nservices_name_configsections_serviceurl_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(deletesrv1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getsrv3))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getsrv4))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_serviceurl_DELETE: FAILED')
+        doc.write('\n\nservices_name_configsections_serviceurl_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(deletesrv1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getsrv3))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getsrv4))
+            
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    #provider
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    
+    #Check for two successful requests to have the same result
+    if getpro1['success'] and getpro2['success']:
+        if getpro1 == getpro2:
+            doc.write('services_name_configsections_provider_GET: SUCCESS')            
+            success_getpro = True
+        else:
+            doc.write('services_name_configsections_provider_GET: FAILED')
+            doc.write('\n\nservices_name_configsections_provider_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(getpro1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(getpro2))
+    else:
+        doc.write('services_name_configsections_provider_GET: FAILED')
+        doc.write('\n\nservices_name_configsections_provider_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(getpro1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(getpro2))
+    
+     
+    #Checks for the PUT to be successful by comparing two GETs
+    if putpro1['success']:
+        #If gets before and after are the same, failure
+        if getpro2 == getpro3:
+            doc.write('services_name_configsections_provider_PUT: FAILED')
+            doc.write('\n\nservices_name_configsections_provider_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(putpro1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getpro2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getpro3))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if (getpro3['data']['contactcountry'] == putpro['contactcountry'] 
+                and getpro3['data']['providername'] == putpro['providername'] 
+                and getpro3['data']['contactposition'] == putpro['contactposition'] 
+                and getpro3['data']['contactvoice'] == putpro['contactvoice'] 
+                and getpro3['data']['contactadminarea'] == putpro['contactadminarea'] 
+                and getpro3['data']['contactemail'] == putpro['contactemail'] 
+                and getpro3['data']['contactdeliverypoint'] == putpro['contactdeliverypoint'] 
+                and getpro3['data']['contactname'] == putpro['contactname'] 
+                and getpro3['data']['contactpostalcode'] == putpro['contactpostalcode'] 
+                and getpro3['data']['contactcity'] == putpro['contactcity'] 
+                and getpro3['data']['providersite'] == putpro['providersite'] 
+                and getpro3['data']['contactfax'] == putpro['contactfax']
+                #and getpro3['data']['default'] == putpro['default']
+                ):
+                #print 'the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_configsections_provider_PUT: SUCCESS')
+                success_putpro = True
+            else:
+                doc.write('services_name_configsections_provider_PUT: FAILED')
+                doc.write('\n\nservices_name_configsections_provider_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(putpro1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getpro2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getpro3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_provider_PUT: FAILED')
+        doc.write('\n\nservices_name_configsections_provider_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(putpro1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getpro2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getpro3))
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if deletepro1['success']:
+        #If gets before and after are the same, failure
+        if getpro3 == getpro4:
+            doc.write('services_name_configsections_provider_DELETE: FAILED')
+            doc.write('\n\nservices_name_configsections_provider_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(deletepro1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getpro3))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getpro4))
+        #For the success, second get should be void
+        else:
+            if getpro4['total'] <= getpro3['total'] and getpro4['data']['default']:
+                #print 'the delete is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_configsections_provider_DELETE: SUCCESS')
+                success_delpro = True
+            else:
+                doc.write('services_name_configsections_provider_DELETE: FAILED')
+                doc.write('\n\nservices_name_configsections_provider_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(deletepro1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getpro3))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getpro4))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_provider_DELETE: FAILED')
+        doc.write('\n\nservices_name_configsections_provider_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(deletepro1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getpro3))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getpro4))
+            
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    #connection
+    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    
+    #Check for two successful requests to have the same result
+    if getcon1['success'] and getcon2['success']:
+        if getcon1 == getcon2:
+            doc.write('services_name_configsections_connection_GET: SUCCESS')
+            success_getcon = True
+        else:
+            doc.write('services_name_configsections_connection_GET: FAILED')
+            doc.write('\n\nservices_name_configsections_connection_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(getcon1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(getcon2))
+    else:
+        doc.write('services_name_configsections_connection_GET: FAILED')
+        doc.write('\n\nservices_name_configsections_connection_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(getcon1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(getcon2))
+    
+     
+    #Checks for the PUT to be successful by comparing two GETs
+    if putcon1['success']:
+        #If gets before and after are the same, failure
+        if getcon2 == getcon3:
+            doc.write('services_name_configsections_connection_PUT: FAILED')
+            doc.write('\n\nservices_name_configsections_connection_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(putcon1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(getcon2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(getcon3))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if (getcon3['data']['dbname'] == putcon['dbname'] 
+                and getcon3['data']['host'] == putcon['host'] 
+                and getcon3['data']['user'] == putcon['user'] 
+                and getcon3['data']['password'] == putcon['password'] 
+                and getcon3['data']['port'] == putcon['port']
+                #and getcon3['data']['default'] == putcon['default']
+                ):
+                #print 'the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_configsections_connection_PUT: SUCCESS')
+                success_putcon = True
+            else:
+                doc.write('services_name_configsections_connection_PUT: FAILED')
+                doc.write('\n\nservices_name_configsections_connection_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(putcon1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(getcon2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(getcon3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_configsections_connection_PUT: FAILED')
+        doc.write('\n\nservices_name_configsections_connection_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(putcon1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(getcon2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(getcon3))    
+    
+    #Check for two successful requests to have the same result
+    if getcon4['success'] and getcon5['success']:
+        if getcon4 == getcon5:
+            doc.write('services_name_configsections_connection_operations_validatedb_GET: SUCCESS')
+            success_getconop = True
+        else:
+            doc.write('services_name_configsections_connection_operations_validatedb_GET: FAILED')
+            doc.write('\n\nservices_name_configsections_connection_operations_validatedb_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(getcon4))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(getcon5))
+    else:
+        doc.write('services_name_configsections_connection_operations_validatedb_GET: FAILED')
+        doc.write('\n\nservices_name_configsections_connection_operations_validatedb_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(getcon4))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(getcon5))
+    
+    result = {
+        'services_name_configsections_GET' : success_get,
+        'services_name_configsections_PUT' : success_put,
+        'services_name_configsections_DELETE' : success_del,
+        'services_name_configsections_getobservation_GET' : success_getob,
+        'services_name_configsections_getobservation_PUT' : success_putob,
+        'services_name_configsections_getobservation_DELETE' : success_delob,
+        'services_name_configsections_identification_GET' : success_getid,
+        'services_name_configsections_identification_PUT' : success_putid,
+        'services_name_configsections_identification_DELETE' : success_delid,
+        'services_name_configsections_geo_GET' : success_getgeo,
+        'services_name_configsections_geo_PUT' : success_putgeo,
+        'services_name_configsections_geo_DELETE' : success_delgeo,
+        'services_name_configsections_connection_GET' : success_getcon,
+        'services_name_configsections_connection_PUT' : success_putcon,
+        'services_name_configsections_connection_operations_validatedb_GET' : success_getconop,
+        'services_name_configsections_serviceurl_GET' : success_getsrv,
+        'services_name_configsections_serviceurl_PUT' : success_putsrv,
+        'services_name_configsections_serviceurl_DELETE' : success_delsrv,
+        'services_name_configsections_provider_GET' : success_getpro,
+        'services_name_configsections_provider_PUT' : success_putpro,
+        'services_name_configsections_provider_DELETE' : success_delpro,
+        }
+        
+    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/dataqualities.py b/test/walib/istsos/services/dataqualities.py
new file mode 100755
index 0000000..ab71741
--- /dev/null
+++ b/test/walib/istsos/services/dataqualities.py
@@ -0,0 +1,257 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import pprint
+import time
+
+    
+def test_dataqualities(doc):
+    #services_name_dataqualities_GET(sname)
+    #services_name_dataqualities_POST(sname, post)
+    #services_name_dataqualities_code_GET(sname, qualcode)
+    #services_name_dataqualities_code_PUT(sname, put, qualcode)
+    #services_name_dataqualities_code_DELETE(sname, qualcode)
+    
+    doc.write('\nDATAQUALITIES\n-------------\n')
+    
+    pp = pprint.PrettyPrinter(indent=2)    
+    sname = 'test'
+    qualcode = '42'
+    post = {
+        "code": 42, 
+        "name": "the answer", 
+        "description": "Answer to the Ultimate Question of Life, the Universe, and Everything"}
+        
+    put = {
+        "code": 42, 
+        "name": "the answer", 
+        "description": "answer to the life, updated"}        
+        
+    success_get1 = False
+    success_post = False
+    success_get2 = False
+    success_put = False
+    success_delete = False
+    
+    get1 = tget.services_name_dataqualities_GET(sname)
+    time.sleep(1)
+    get2 = tget.services_name_dataqualities_GET(sname)
+    post1 = tpost.services_name_dataqualities_POST(sname, post)
+    get3 = tget.services_name_dataqualities_GET(sname)
+    
+    get4 = tget.services_name_dataqualities_code_GET(sname, qualcode)
+    time.sleep(1)
+    get5 = tget.services_name_dataqualities_code_GET(sname, qualcode)
+    put1 = tput.services_name_dataqualities_code_PUT(sname, put, qualcode)
+    get6 = tget.services_name_dataqualities_code_GET(sname, qualcode)
+    delete1 = tdelete.services_name_dataqualities_code_DELETE(sname, qualcode)
+    get7 = tget.services_name_dataqualities_code_GET(sname, qualcode)
+    get8 = tget.services_name_dataqualities_GET(sname)
+    
+    #Check for two successful requests to have the same result
+    if get1['success'] and get2['success']:
+        if get1 == get2:
+            success_get1 = True
+            doc.write('\n\nservices_name_dataqualities_GET: SUCCESS')
+        else:
+            doc.write('\n\nservices_name_dataqualities_GET: FAILED')
+            doc.write('\nThe results are not consistent\n')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get2))
+    else:
+        doc.write('\n\nservices_name_dataqualities_GET: FAILED')
+        doc.write('\n\nservices_name_dataqualities_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get2))
+        
+     
+    #Checks for the POST to be successful by comparing two GETs
+    if post1['success']:
+        #If gets before and after are the same, failure
+        if get1 == get3:
+            doc.write('\n\nservices_name_dataqualities_POST: FAILED')
+            doc.write('\n\nservices_name_dataqualities_POST: the data has not changed')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #If second get has same or less entries than first, failure
+        elif get3['total'] <= get1['total']:
+            doc.write('\n\nservices_name_dataqualities_POST: FAILED')
+            doc.write('\n\nservices_name_dataqualities_POST: post failed or deleted another entry')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #If second get has one more entry than first, look for the 
+        #inserted value. If found, success, else failure
+        elif get3['total'] == get1['total'] + 1:
+            for data in get3['data']:
+                if (data['name'] == post['name'] 
+                    and data['code'] == post['code'] 
+                    and data['description'] == post['description']
+                    ):
+                    #pp.pprint(get3)   
+                    #pp.pprint(post1)
+                    doc.write('\n\nservices_name_dataqualities_POST: SUCCESS')
+                    success_post = True
+                    break
+            if not success_post:
+                doc.write('\n\nservices_name_dataqualities_POST: FAILED')
+                doc.write('\n\nservices_name_dataqualities_POST: posted data does not correspond')
+                doc.write('\nPost:\n')
+                doc.write(pp.pformat(post1))
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get3))
+        #if anything else wrong, failure
+        else:
+            doc.write('\n\nservices_name_dataqualities_POST: FAILED')
+            doc.write('\n\nservices_name_dataqualities_POST: something went wrong')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+    #If post not successful, failure
+    else:
+        doc.write('\n\nservices_name_dataqualities_POST: FAILED')
+        doc.write('\n\nservices_name_dataqualities_POST: post failed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post1))
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get3))
+    
+    #Check for two successful requests to have the same result
+    if get4['success'] and get5['success']:
+        if get4 == get5:
+            #print 'the results are the same:\n'
+            #pp.pprint(get1)
+            doc.write('\n\nservices_name_dataqualities_code_GET: SUCCESS')
+            success_get2 = True
+        else:
+            doc.write('\n\nservices_name_dataqualities_code_GET: FAILED')
+            doc.write('\n\nservices_name_dataqualities_code_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get4))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get5))
+    else:
+        doc.write('\n\nservices_name_dataqualities_code_GET: FAILED')
+        doc.write('\n\nservices_name_dataqualities_code_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get4))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get5))
+    
+    
+    #Checks for the PUT to be successful by comparing two GETs
+    if put1['success']:
+        #If gets before and after are the same, failure
+        if get5 == get6:
+            doc.write('\n\nservices_name_dataqualities_code_PUT: FAILED')
+            doc.write('\n\nservices_name_dataqualities_code_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(put1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get5))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get6))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if (get6['data'][0]['code'] == put['code'] 
+                and get6['data'][0]['name'] == put['name'] 
+                and get6['data'][0]['description'] == put['description']
+                ):
+                #print 'the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('\n\nservices_name_dataqualities_code_PUT: SUCCESS')
+                success_put = True
+            else:
+                doc.write('\n\nservices_name_dataqualities_code_PUT: FAILED')
+                doc.write('\n\nservices_name_dataqualities_code_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(put1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get5))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get6))
+    #If post not successful, failure
+    else:
+        doc.write('\n\nservices_name_dataqualities_code_PUT: FAILED')
+        doc.write('\n\nservices_name_dataqualities_code_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(put1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get5))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get6))
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete1['success']:
+        #If gets before and after are the same, failure
+        if get6 == get7:
+            doc.write('\n\nservices_name_dataqualities_code_DELETE: FAILED')
+            doc.write('\n\nservices_name_dataqualities_code_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(delete1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get6))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get7))
+        #For the success, second get should be void
+        else:
+            if get7['total'] == get6['total'] - 1 and get8 == get1:
+                #print 'the delete is successful:\n'
+                #pp.pprint(get6)
+                doc.write('\n\nservices_name_dataqualities_code_DELETE: FAILED')
+                success_delete = True
+            else:
+                doc.write('\n\nservices_name_dataqualities_code_DELETE: FAILED')
+                doc.write('\n\nservices_name_dataqualities_code_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(delete1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get6))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get7))
+    #If post not successful, failure
+    else:
+        doc.write('\n\nservices_name_dataqualities_code_DELETE: FAILED')
+        doc.write('\n\nservices_name_dataqualities_code_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(delete1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get6))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get7))
+            
+            
+            
+    result = {
+        'services_name_dataqualities_GET' : success_get1,
+        'services_name_dataqualities_POST' : success_post,
+        'services_name_dataqualities_code_GET' : success_get2,
+        'services_name_dataqualities_code_PUT' : success_put,
+        'services_name_dataqualities_code_DELETE' : success_delete
+        }
+        
+    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/epsgs.py b/test/walib/istsos/services/epsgs.py
new file mode 100755
index 0000000..886ccf7
--- /dev/null
+++ b/test/walib/istsos/services/epsgs.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import time
+import pprint
+
+    
+def test_epsgs(doc):
+    #services_name_epsgs_GET(sname)
+    
+    doc.write('\n\n-----------------EPSGS------------------------------')
+    
+    pp = pprint.PrettyPrinter(indent=2)    
+    sname = 'test'
+    success = False
+    
+    get1 = tget.services_name_epsgs_GET(sname)
+    time.sleep(1)
+    get2 = tget.services_name_epsgs_GET(sname)
+    
+    #Checks if all the requests were successful
+    if get1['success'] and get2['success']:
+        #Checks if all the requests got the same result
+        if get1 == get2:
+            doc.write('services_name_epsgs_GET: SUCCESS')
+            success = True
+        #If the results are not all the same, we got a failure
+        else:
+            doc.write('services_name_epsgs_GET: FAILED')
+            doc.write('\n\nservices_name_epsgs_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')            
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')            
+            doc.write(pp.pformat(get2))
+    #If the requests weren't all successful, we got a failure
+    else:
+        doc.write('services_name_epsgs_GET: FAILED')
+        doc.write('\n\nservices_name_epsgs_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')            
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')            
+        doc.write(pp.pformat(get2))
+        
+        
+        
+        
+    result = {'services_name_epsgs_GET' : success}
+    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/observedproperties.py b/test/walib/istsos/services/observedproperties.py
new file mode 100755
index 0000000..4c3ad7a
--- /dev/null
+++ b/test/walib/istsos/services/observedproperties.py
@@ -0,0 +1,281 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import pprint
+import time
+
+    
+def test_observedproperties(doc):
+    #services_name_observedproperties_GET(sname)
+    #services_name_observedproperties_POST(sname, post)
+    #services_name_observedproperties_name_GET(sname, oname)
+    #services_name_observedproperties_name_PUT(sname, oname, put)
+    #services_name_observedproperties_name_DELETE(sname, oname)
+    
+    doc.write('\n\n-----------------OBSERVEDPROPERTIES-----------------')
+    
+    pp = pprint.PrettyPrinter(indent=2)    
+    sname = 'test'
+    oname = 'urn:ogc:def:parameter:x-istsos:1.0:test_post'
+    
+    post = {
+        "definition": "urn:ogc:def:parameter:x-istsos:1.0:test_post", 
+        #"procedures": [], 
+        "constraint": [],
+        "name": "test_post", 
+        "description": "lorem impsum dolor"
+        }
+        
+    put = {
+        "definition": "urn:ogc:def:parameter:x-istsos:1.0:test_post_up", 
+        #"procedures": [], 
+        "constraint": [],
+        "name": "test_post", 
+        "description": "updated description"}        
+        
+    success_get1 = False
+    success_post = False
+    success_get2 = False
+    success_put = False
+    success_delete = False
+    
+    get1 = tget.services_name_observedproperties_GET(sname)
+    time.sleep(1)
+    get2 = tget.services_name_observedproperties_GET(sname)
+    post1 = tpost.services_name_observedproperties_POST(sname, post)
+    get3 = tget.services_name_observedproperties_GET(sname)
+    
+    get4 = tget.services_name_observedproperties_name_GET(sname, oname)
+    time.sleep(1)
+    get5 = tget.services_name_observedproperties_name_GET(sname, oname)
+    put1 = tput.services_name_observedproperties_name_PUT(sname, oname, put)
+    get6 = tget.services_name_observedproperties_name_GET(sname, oname + '_up')
+    delete1 = tdelete.services_name_observedproperties_name_DELETE(sname, oname + '_up')
+    get7 = tget.services_name_observedproperties_name_GET(sname, oname)
+    get8 = tget.services_name_observedproperties_GET(sname)
+    
+    
+    
+    #Check for two successful requests to have the same result
+    if get1['success'] and get2['success']:
+        if get1 == get2:
+            doc.write('services_name_observedproperties_GET: SUCCESS')
+            success_get1 = True
+        else:
+            doc.write('services_name_observedproperties_GET: FAILED')
+            doc.write('\n\nservices_name_observedproperties_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get2))
+            
+    else:
+        doc.write('services_name_observedproperties_GET: FAILED')
+        doc.write('\n\nservices_name_observedproperties_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get2))
+    
+    
+     
+    #Checks for the POST to be successful by comparing two GETs
+    if post1['success']:
+        #If gets before and after are the same, failure
+        if get2 == get3:
+            doc.write('services_name_observedproperties_POST: FAILED')
+            doc.write('\n\nservices_name_observedproperties_POST: the data has not changed')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        
+        #If second get has same or less entries than first, failure
+        elif get3['total'] <= get2['total']:
+            doc.write('services_name_observedproperties_POST: FAILED')
+            doc.write('\n\nservices_name_observedproperties_POST: post failed or deleted another entry')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+            
+        #If second get has one more entry than first, look for the 
+        #inserted value. If found, success, else failure
+        elif get3['total'] == get2['total'] + 1:
+            for data in get3['data']:
+                if (data['name'] == post['name'] 
+                    and data['description'] == post['description'] 
+                    and data['definition'] == post['definition']
+                    #and data['procedures'] == post['procedures']
+                    ):
+                    doc.write('services_name_observedproperties_POST: SUCCESS')
+                    success_post = True
+                    break
+            if not success_post:
+                doc.write('services_name_observedproperties_POST: FAILED')
+                doc.write('\n\nservices_name_observedproperties_POST: posted data does not correspond')
+                doc.write('\nPost:\n')
+                doc.write(pp.pformat(post1))
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get3))
+                
+        #if anything else wrong, failure
+        else:
+            doc.write('services_name_observedproperties_POST: FAILED')
+            doc.write('\n\nservices_name_observedproperties_POST: something went wrong')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+            doc.write('services_name_observedproperties_POST: FAILED')
+    #If post not successful, failure
+    else:
+        doc.write('\n\nservices_name_observedproperties_POST: post FAILED')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post1))
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get3))
+    
+            
+    
+    #Check for two successful requests to have the same result
+    if get4['success'] and get5['success']:
+        if get4 == get5:
+            #doc.write('the results are the same:\n'
+            #pp.pprint(get1)
+            doc.write('services_name_observedproperties_name_GET: SUCCESS')
+            success_get2 = True
+        else:
+            doc.write('services_name_observedproperties_name_GET: FAILED')
+            doc.write('\n\nservices_name_observedproperties_name_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get4))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get5))
+        
+    else:
+        doc.write('services_name_observedproperties_name_GET: FAILED')
+        doc.write('\n\nservices_name_observedproperties_name_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get4))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get5))
+        
+    
+    
+    
+    
+    #Checks for the PUT to be successful by comparing two GETs
+    if put1['success']:
+        #If gets before and after are the same, failure
+        if get5 == get6:
+            doc.write('services_name_observedproperties_name_PUT: FAILED')
+            doc.write('\n\nservices_name_observedproperties_name_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(put1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get5))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get6))
+            
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if len(get6['data']) > 0 and (get6['data'][0]['definition'] == put['definition'] 
+                and get6['data'][0]['name'] == put['name'] 
+                and get6['data'][0]['description'] == put['description']
+                #and get6['data'][0]['procedures'] == put['procedures']                
+                ):
+                #doc.write('the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_observedproperties_name_PUT: SUCCESS')
+                success_put = True
+            else:
+                doc.write('services_name_observedproperties_name_PUT: FAILED')
+                doc.write('\n\nservices_name_observedproperties_name_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(put1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get5))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get6))
+                
+    #If post not successful, failure
+    else:
+        doc.write('services_name_observedproperties_name_PUT: FAILED')
+        doc.write('\n\nservices_name_observedproperties_name_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(put1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get5))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get6))
+        
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete1['success']:
+        #If gets before and after are the same, failure
+        if get6 == get7:
+            doc.write('services_name_observedproperties_name_DELETE: FAILED')
+            doc.write('\n\nservices_name_observedproperties_name_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(delete1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get6))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get7))
+            
+        #For the success, second get should be void
+        else:
+            if get7['total'] == get6['total'] - 1 and get8 == get1:
+                #doc.write('the delete is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_observedproperties_name_DELETE: SUCCESS')
+                success_delete = True
+            else:
+                doc.write('services_name_observedproperties_name_DELETE: FAILED')
+                doc.write('\n\nservices_name_observedproperties_name_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(delete1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get6))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get7))
+                
+    #If post not successful, failure
+    else:
+        doc.write('services_name_observedproperties_name_DELETE: FAILED')
+        doc.write('\n\nservices_name_observedproperties_name_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(delete1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get6))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get7))
+        
+            
+            
+    result = {
+        'services_name_observedproperties_GET' : success_get1,
+        'services_name_observedproperties_POST' : success_post,
+        'services_name_observedproperties_name_GET' : success_get2,
+        'services_name_observedproperties_name_PUT' : success_put,
+        'services_name_observedproperties_name_DELETE' : success_delete
+        }
+        
+    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/offerings.py b/test/walib/istsos/services/offerings.py
new file mode 100755
index 0000000..9c64f77
--- /dev/null
+++ b/test/walib/istsos/services/offerings.py
@@ -0,0 +1,440 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import pprint
+import time
+
+    
+def test_offerings(doc):
+    #services_name_offerings_GET(sname)
+    #services_name_offerings_POST(sname, post)
+    #services_name_offerings_name_GET(sname, oname)
+    #services_name_offerings_name_PUT(sname, oname, put)
+    #services_name_offerings_name_DELETE(sname, oname)
+    #services_name_offerings_name_procedures_GET(sname, oname)
+    #services_name_offerings_name_procedures_operations_memberlist_GET(sname, oname)
+    #services_name_offerings_name_procedures_operations_nonmemberlist_GET(sname, oname)
+    #services_name_offerings_operations_getlist_GET(sname)
+    #services_name_offerings_name_procedures_name_POST(sname, post)
+    #services_name_offerings_name_procedures_name_DELETE(sname)
+    
+    doc.write('\n-----------------OFFERINGS-----------------------\n')
+    
+    pp = pprint.PrettyPrinter(indent=2)
+    
+    sname = 'test'
+    oname = 'test'
+    pname = 'test'
+    delname = 'test_post'
+    
+    post = {
+        "description": "test_post", 
+        "expiration": "", 
+        "active": "on", 
+        #"procedures": 4, 
+        #"id": 1, 
+        "name": "test"
+        }
+        
+    postproc = [{
+        "offering": "test_post",
+        "procedure": "test"
+                }]
+        
+    put = {
+        "description": "updated description", 
+        "expiration": "", 
+        #"active": True, 
+        #"procedures": 0, 
+        #"id": 14, 
+        "name": "test_post"}        
+        
+    success_get1 = False
+    success_post = False
+    success_get2 = False
+    success_put = False
+    success_delete = False
+    success_get3 = False
+    success_getmem = False
+    success_getnmem = False
+    success_getlist = False
+    success_postprog = False
+    success_delprog = False
+    
+    
+    get1 = tget.services_name_offerings_GET(sname)
+    time.sleep(1)
+    get2 = tget.services_name_offerings_GET(sname)
+    post1 = tpost.services_name_offerings_POST(sname, post)
+    get3 = tget.services_name_offerings_GET(sname)
+    
+    get4 = tget.services_name_offerings_name_GET(sname, oname)
+    time.sleep(1)
+    get5 = tget.services_name_offerings_name_GET(sname, oname)
+    put1 = tput.services_name_offerings_name_PUT(sname, oname, put)
+    get6 = tget.services_name_offerings_name_GET(sname, oname)
+    
+    post2 = tpost.services_name_offerings_name_procedures_name_POST(sname, oname, postproc)
+    
+    delete2 = tdelete.services_name_offerings_name_procedures_name_DELETE(sname, oname, pname)
+    
+    delete1 = tdelete.services_name_offerings_name_DELETE(sname, delname)
+    
+    get7 = tget.services_name_offerings_name_GET(sname, oname)
+    get8 = tget.services_name_offerings_GET(sname)
+    
+    get9 = tget.services_name_offerings_name_procedures_GET(sname, oname)
+    time.sleep(1)
+    get10 = tget.services_name_offerings_name_procedures_GET(sname, oname)
+    
+    get11 = tget.services_name_offerings_name_procedures_operations_memberlist_GET(sname, oname)
+    time.sleep(1)
+    get12 = tget.services_name_offerings_name_procedures_operations_memberlist_GET(sname, oname)
+    
+    get13 = tget.services_name_offerings_name_procedures_operations_nonmemberlist_GET(sname, oname)
+    time.sleep(1)
+    get14 = tget.services_name_offerings_name_procedures_operations_nonmemberlist_GET(sname, oname)
+    
+    get15 = tget.services_name_offerings_operations_getlist_GET(sname)
+    time.sleep(1)
+    get16 = tget.services_name_offerings_operations_getlist_GET(sname)
+    
+    
+    
+    
+    #Check for two successful requests to have the same result
+    if get1['success'] and get2['success']:
+        if get1 == get2:
+            doc.write('services_name_offerings_GET: SUCCESS')
+            success_get1 = True
+        else:
+            doc.write('services_name_offerings_GET: FAILED')
+            doc.write('\n\nservices_name_offerings_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get2))
+    else:
+        doc.write('services_name_offerings_GET: FAILED')
+        doc.write('\n\nservices_name_offerings_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get2))
+    
+     
+    #Checks for the POST to be successful by comparing two GETs
+    if post1['success']:
+        #If gets before and after are the same, failure
+        if get2 == get3:
+            doc.write('services_name_offerings_POST: FAILED')
+            doc.write('\n\nservices_name_offerings_POST: the data has not changed')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #If second get has same or less entries than first, failure
+        elif get3['total'] <= get2['total']:
+            doc.write('services_name_offerings_POST: FAILED')
+            doc.write('\n\nservices_name_offerings_POST: post failed or deleted another entry')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #If second get has one more entry than first, look for the 
+        #inserted value. If found, success, else failure
+        elif get3['total'] == get2['total'] + 1:
+            for data in get3['data']:
+                if (data['name'] == post['name'] 
+                    and data['description'] == post['description']
+                    and data['expiration'] == post['expiration']
+                    #and data['active'] == post['active']
+                    #and data['procedures'] == post['procedures']
+                    #and data['id'] == post['id']
+                    ):
+                    #pp.pprint(get3)   
+                    #pp.pprint(post1)
+                    doc.write('services_name_offerings_POST: SUCCESS')
+                    success_post = True
+                    break
+            if not success_post:
+                doc.write('services_name_offerings_POST: FAILED')
+                doc.write('\n\nservices_name_offerings_POST: posted data does not correspond')
+                doc.write('\nPost:\n')
+                doc.write(pp.pformat(post1))
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get3))
+        #if anything else wrong, failure
+        else:
+            doc.write('services_name_offerings_POST: FAILED')
+            doc.write('\n\nservices_name_offerings_POST: something went wrong')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_offerings_POST: FAILED')
+        doc.write('\n\nservices_name_offerings_POST: post failed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post1))
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get3))
+            
+    
+    #Check for two successful requests to have the same result
+    if get4['success'] and get5['success']:
+        if get4 == get5:
+            #doc.write('the results are the same:\n'
+            #pp.pprint(get1)
+            doc.write('services_name_offerings_name_GET: SUCCESS')
+            success_get2 = True
+        else:
+            doc.write('services_name_offerings_name_GET: FAILED')
+            doc.write('\n\nservices_name_offerings_name_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get4))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get5))
+    else:
+        doc.write('services_name_offerings_name_GET: FAILED')
+        doc.write('\n\nservices_name_offerings_name_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get4))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get5))
+    
+    
+    
+    
+    #Checks for the PUT to be successful by comparing two GETs
+    if put1['success']:
+        #If gets before and after are the same, failure
+        if get5 == get6:
+            doc.write('services_name_offerings_name_PUT: FAILED')
+            doc.write('\n\nservices_name_offerings_name_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(put1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get5))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get6))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            for data in get6['data']:
+                if (data['description'] == put['description'] 
+                    and data['name'] == put['name']
+                    and data['expiration'] == put['expiration']
+                    #and data['active'] == put['active']
+                    #and data['procedures'] == put['procedures']
+                    #and data['id'] == put['id']
+                    ):
+                    doc.write('services_name_offerings_name_PUT: SUCCESS')
+                    success_put = True
+                    break
+            if not success_put:
+                doc.write('services_name_offerings_name_PUT: FAILED')
+                doc.write('\n\nservices_name_offerings_name_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(put1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get5))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get6))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_offerings_name_PUTT: FAILED')
+        doc.write('\n\nservices_name_offerings_name_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(put1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get5))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get6))
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete1['success']:
+        #If gets before and after are the same, failure
+        if get6 == get7:
+            doc.write('services_name_offerings_name_DELETE: FAILED')
+            doc.write('\n\nservices_name_offerings_name_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(delete1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get6))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get7))
+        #For the success, second get should be void
+        else:
+            if get7['total'] == get6['total'] - 1 and get8 == get1:
+                #doc.write('the delete is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_offerings_name_DELETE: SUCCESS')
+                success_delete = True
+            else:
+                doc.write('services_name_offerings_name_DELETE: FAILED')
+                doc.write('\n\nservices_name_offerings_name_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(delete1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get6))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get7))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_offerings_name_DELETE: FAILED')
+        doc.write('\n\nservices_name_offerings_name_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(delete1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get6))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get7))
+            
+    
+    
+    #Check for two successful requests to have the same result
+    if get9['success'] and get10['success']:
+        if get9 == get10:
+            doc.write('services_name_offerings_name_procedures_GET: SUCCESS')
+            success_get3 = True
+        else:
+            doc.write('services_name_offerings_name_procedures_GET: FAILED')
+            doc.write('\n\nservices_name_offerings_name_procedures_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get9))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get10))
+    else:
+        doc.write('services_name_offerings_name_procedures_GET: FAILED')
+        doc.write('\n\nservices_name_offerings_name_procedures_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get9))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get10))
+        
+        
+    #Check for two successful requests to have the same result
+    if get11['success'] and get12['success']:
+        if get11 == get12:
+            doc.write('services_name_offerings_name_procedures_operations_memberlist_GET: SUCCESS')
+            success_getmem = True
+        else:
+            doc.write('services_name_offerings_name_procedures_operations_memberlist_GET: FAILED')
+            doc.write('\n\nservices_name_offerings_name_procedures_operations_memberlist_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get11))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get12))
+    else:
+        doc.write('services_name_offerings_name_procedures_operations_memberlist_GET: FAILED')
+        doc.write('\n\nservices_name_offerings_name_procedures_operations_memberlist_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get11))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get12))
+        
+        
+    #Check for two successful requests to have the same result
+    if get13['success'] and get14['success']:
+        if get13 == get14:
+            doc.write('services_name_offerings_name_procedures_operations_nonmemberlist_GET: SUCCESS')
+            success_getnmem = True
+        else:
+            doc.write('services_name_offerings_name_procedures_operations_nonmemberlist_GET: FAILED')
+            doc.write('\n\nservices_name_offerings_name_procedures_operations_nonmemberlist_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get13))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get14))
+            
+    else:
+        doc.write('services_name_offerings_name_procedures_operations_nonmemberlist_GET: FAILED')
+        doc.write('\n\nservices_name_offerings_name_procedures_operations_nonmemberlist_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get13))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get14))
+        
+        
+        
+  #Check for two successful requests to have the same result
+    if get15['success'] and get16['success']:
+        if get15 == get16:
+            doc.write('services_name_offerings_name_operations_getlist_GET: SUCCESS')
+            success_getlist = True
+        else:
+            doc.write('services_name_offerings_name_operations_getlist_GET: FAILED')
+            doc.write('\n\nservices_name_offerings_name_operations_getlist_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get15))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get16))
+            
+    else:
+        doc.write('services_name_offerings_name_operations_getlist_GET: FAILED')
+        doc.write('\n\nservices_name_offerings_name_operations_getlist_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get15))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get16))
+        
+        
+   
+    #Checks for the POST to be successful by comparing two GETs
+    if post2['success']:
+        doc.write('services_name_offerings_name_procedures_name_POST: SUCCESS')
+        success_postprog= True
+    #If post not successful, failure
+    else:
+        doc.write('services_name_offerings_name_procedures_name_POST: FAILED')
+        doc.write('\n\nservices_name_offerings_name_procedures_name_POST: post failed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post2))
+             
+        
+       
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete2['success']:
+        doc.write('services_name_offerings_name_procedures_name_DELETE: SUCCESS')
+        success_delprog = True
+    #If post not successful, failure
+    else:
+        doc.write('services_name_offerings_name_procedures_name_DELETE: FAILED')       
+        doc.write('\n\nservices_name_offerings_name_procedures_name_DELETEE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(delete2))
+       
+    
+        
+    result = {
+        'services_name_offerings_GET' : success_get1,
+        'services_name_offerings_POST' : success_post,
+        'services_name_offerings_name_GET' : success_get2,
+        'services_name_offerings_name_PUT' : success_put,
+        'services_name_offerings_name_DELETE' : success_delete,
+        'services_name_offerings_name_procedures_GET' : success_get3,
+        'services_name_offerings_name_procedures_operations_memberlist_GET' : success_getmem,
+        'services_name_offerings_name_procedures_operations_nonmemberlist_GET' : success_getnmem,
+        'services_name_offerings_operations_getlist_GET' : success_getlist,
+        'services_name_offerings_name_procedures_name_POST' : success_postprog,
+        'services_name_offerings_name_procedures_name_DELETE' : success_delprog
+        }
+            
+    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/operations.py b/test/walib/istsos/services/operations.py
new file mode 100755
index 0000000..99cd720
--- /dev/null
+++ b/test/walib/istsos/services/operations.py
@@ -0,0 +1,286 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import pprint
+import time
+    
+    
+def test_operations(doc):
+    #operations_status_GET()
+    #operations_log_GET()
+    #operations_log_DELETE()
+    #operations_about_GET()
+    #operations_validatedb_POST(post_db)
+    #operations_initialization_GET()
+    #operations_initialization_PUT(put)
+    #operations_getobservation_offerings_name_procedures_GET(sname, oname, pname, oprop, start, end)
+    
+    
+    doc.write('\n\n-----------------OPERATIONS-------------------------') 
+    
+    pp = pprint.PrettyPrinter(indent=2)   
+    
+    sname = 'test'
+    oname = 'temporary'
+    pname = 'test'
+    oprop = 'test'
+    start = '2013-01-01T00:10:00.000000+0100'
+    end = '2013-01-05T00:00:00.000000+0100'
+    
+    post_db = {
+        "user" : "postgres",
+        "password" : "postgres",
+        "dbname" : "istsos",
+        "host" : "localhost",
+        "port" : 5432
+    }
+        
+    put = {"level": 42}        
+        
+    success_get1 = False
+    success_get2 = False
+    success_get3 = False
+    success_get4 = False
+    success_post = False
+    success_put = False
+    success_delete = False
+    success_getobs = False
+    
+    get1 = tget.operations_status_GET()
+    time.sleep(1)
+    get2 = tget.operations_status_GET()
+    
+    get3 = tget.operations_log_GET()
+    time.sleep(1)
+    get4 = tget.operations_log_GET()
+    delete1 = tdelete.operations_log_DELETE()
+    get5 = tget.operations_log_GET()
+    
+    get6 = tget.operations_about_GET()
+    time.sleep(1)
+    get7 = tget.operations_about_GET()
+    
+    post1 = tpost.operations_validatedb_POST(post_db)
+    
+    get8 = tget.operations_initialization_GET()
+    time.sleep(1)
+    get9 = tget.operations_initialization_GET()
+    put1 = tput.operations_initialization_PUT(put)
+    get10 = tget.operations_initialization_GET()
+    
+    get11 = tget.operations_getobservation_offerings_name_procedures_GET(sname, oname, pname, oprop, start, end)
+    time.sleep(1)
+    get12 = tget.operations_getobservation_offerings_name_procedures_GET(sname, oname, pname, oprop, start, end)
+
+    
+    #Check for two successful requests to have the same result
+    if get1['success'] and get2['success']:
+        if get1 == get2:
+            doc.write('operations_status_GET: SUCCESS')
+            success_get1 = True
+        else:
+            doc.write('operations_status_GET: FAILED')
+            doc.write('\n\noperations_status_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get2))
+    else:
+        doc.write('operations_status_GET: FAILED')
+        doc.write('\n\noperations_status_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get2))
+        
+    
+    #Check for two successful requests to have the same result
+    if get3['success'] and get4['success']:
+        if get3 == get4:
+            doc.write('operations_log_GET: SUCCESS')
+            success_get2 = True
+        else:
+            doc.write('operations_log_GET: FAILED')
+            doc.write('\n\noperations_log_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get3))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get4))
+    else:
+        doc.write('operations_log_GET: FAILED')
+        doc.write('\n\noperations_log_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get3))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get4))
+        
+        
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete1['success']:
+        #If gets before and after are the same, failure
+        if get4 == get5:
+            doc.write('operations_log_DELETE: FAILED')
+            doc.write('\n\noperations_log_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(delete1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get4))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get5))
+        #For the success, second get should be void
+        else:
+           if not get5['success']:
+                doc.write('operations_log_DELETE: SUCCESS')
+                success_delete = True
+           else:
+               doc.write('operations_log_DELETE: FAILED')
+               doc.write('\n\noperations_log_DELETE: the element has not been deleted')
+               doc.write('\nDelete:\n')            
+               doc.write(pp.pformat(delete1))     
+               doc.write('\nGet, before:\n')
+               doc.write(pp.pformat(get4))
+               doc.write('\nGet, after:\n')
+               doc.write(pp.pformat(get5))
+    #If post not successful, failure
+    else:
+        doc.write('operations_log_DELETEE: FAILED')
+        doc.write('\n\noperations_log_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(delete1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get4))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get5))
+            
+            
+    #Check for two successful requests to have the same result
+    if get6['success'] and get7['success']:
+        if get6 == get7:
+            doc.write('operations_about_GET: SUCCESS')
+            success_get3 = True
+        else:
+            doc.write('operations_about_GET: FAILED')
+            doc.write('\n\noperations_about_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get6))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get7))
+    else:
+        doc.write('operations_about_GET: FAILED')
+        doc.write('\n\noperations_about_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get6))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get7))
+    
+     
+    #Checks for the POST to be successful by comparing two GETs
+    if post1['success']:
+        doc.write('operations_validatedb_POST: SUCCESS')
+        success_post = True  
+    else:
+        doc.write('operations_validatedb_POST: FAILED')        
+        doc.write('\n\noperations_validatedb_POST: post failed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post1))
+        
+    
+    #Check for two successful requests to have the same result
+    if get8['success'] and get9['success']:
+        if get8 == get9:
+            doc.write('operations_initialization_GET: SUCCESS')
+            success_get4 = True
+        else:
+            doc.write('operations_initialization_GET: FAILED')
+            doc.write('\n\noperations_initialization_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get8))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get9))
+    else:
+        doc.write('operations_initialization_GET: FAILED')    
+        doc.write('\n\noperations_initialization_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get8))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get9))
+    
+    
+    
+    #Checks for the PUT to be successful by comparing two GETs
+    if put1['success']:
+        #If gets before and after are the same, failure
+        if get9 == get10:
+            doc.write('operations_initialization_PUT: FAILED')
+            doc.write('\n\noperations_initialization_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(put1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get9))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get10))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if get10['data']['level'] == put['level']:
+                #doc.write('the update is successful:\n'
+                #pp.pprint(get6)
+                doc.write('operations_initialization_PUT: SUCCESS')
+                success_put = True
+            else:
+                doc.write('operations_initialization_PUT: FAILED')
+                doc.write('\n\noperations_initialization_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(put1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get9))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get10))
+    #If post not successful, failure
+    else:
+        doc.write('operations_initialization_PUT: FAILED')
+        doc.write('\n\noperations_initialization_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(put1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get9))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get10))
+            
+    
+    #Check for two successful requests to have the same result
+    if get11['success'] and get12['success']:
+        if get11 == get12:
+            doc.write('operations_getobservation_offerings_name_procedures_GET: SUCCESS')
+            success_getobs = True
+        else:
+            doc.write('operations_getobservation_offerings_name_procedures_GET: FAILED')
+            doc.write('\n\noperations_getobservation_offerings_name_procedures_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get11))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get12))
+    else:
+        doc.write('operations_getobservation_offerings_name_procedures_GET: FAILED')
+        doc.write('\n\noperations_getobservation_offerings_name_procedures_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get11))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get12))
+        
+        
+    result = {
+        'operations_status_GET' : success_get1,
+        'operations_log_GET' : success_get2,
+        'operations_about_GET' : success_get3,
+        'operations_initialization_GET' : success_get4,
+        'operations_validatedb_POST' : success_post,
+        'operations_initialization_PUT' : success_put,
+        'operations_log_DELETE' : success_delete,
+        'operations_getobservation_offerings_name_procedures_GET' : success_getobs
+        }
+        
+    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/procedures.py b/test/walib/istsos/services/procedures.py
new file mode 100755
index 0000000..858528d
--- /dev/null
+++ b/test/walib/istsos/services/procedures.py
@@ -0,0 +1,486 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import pprint
+import time
+
+    
+def deldic(d, k):
+    c = d.copy()
+    for el in k:
+        if type(el) == list:
+            del c[el[0]][el[1]]
+        else:
+            del c[el]
+    return c    
+    
+def test_procedures(doc):
+    #services_name_procedures_POST(sname, post)
+    #services_name_procedures_name_GET(sname, pname)
+    #services_name_procedures_name_PUT(sname, pname, put)
+    #services_name_procedures_name_DELETE(sname, pname)
+    #services_name_procedures_operations_getlist_GET(sname)
+    #services_name_procedures_name_ratingcurve_GET(sname, pname)
+    #services_name_procedures_name_ratingcurve_POST(sname, pname, post)
+    
+    doc.write('\n-----------------PROCEDURES----------------------\n')
+    
+    pp = pprint.PrettyPrinter(indent=2)    
+    sname = 'test'
+    pname = 'test_post'
+    prat = "Q_TICINO"
+    
+    post = {
+        "inputs": [], 
+        "description": "Weather in Usmate Carate", 
+        "classification": [
+            {
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType", 
+            "name": "System Type", 
+            "value": "insitu-fixed-point"
+            }, 
+            {
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType", 
+            "name": "Sensor Type", 
+            "value": "tipping bucket rain gauge"
+            }
+        ], 
+        "characteristics": "", 
+        "interfaces": "", 
+        "keywords": "weather,meteorological,IST", 
+        "contacts": [], 
+        #"assignedSensorId": "6ecb65065eccaac8967089df62c81a24", 
+        "documentation": [], 
+        "system": "test_post", 
+        "capabilities": [], 
+        "identification": [], 
+        "location": {
+            "geometry": {
+                "type": "Point", 
+                "coordinates": ["8.96127", "46.02723", "344.1"]
+                }, 
+            "crs": {
+                "type": "name", 
+                "properties": {"name": "4326"}
+                }, 
+            "type": "Feature", 
+            "properties": {"name": "test"}
+            }, 
+        "outputs": [
+            {
+            "definition": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "constraint": { }, 
+            "name": "Time", 
+            "uom": "", 
+            "description": ""
+            }, 
+            {
+            "definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall", 
+            "constraint": { }, 
+            "name": "air-rainfall", 
+            "uom": "mm", 
+            "description": ""
+            }
+        ], 
+        "system_id": "test_post", 
+        "history": []
+        }
+        
+    put = {
+        "inputs": [], 
+        "description": "updated description", 
+        "classification": [
+            {
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType", 
+            "name": "System Type", 
+            "value": "insitu-fixed-point"
+            }, 
+            {
+            "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType", 
+            "name": "Sensor Type", 
+            "value": "tipping bucket rain gauge"
+            }
+        ], 
+        "characteristics": "", 
+        "interfaces": "", 
+        "keywords": "weather,meteorological,IST,test_update", 
+        "contacts": [], 
+        #"assignedSensorId": "6ecb65065eccaac8967089df62c81a24", 
+        "documentation": [], 
+        "system": "test_post", 
+        "capabilities": [], 
+        "identification": [], 
+        "location": {
+            "geometry": {
+                "type": "Point", 
+                "coordinates": ["8.96127", "46.02723", "344.1"]
+                }, 
+            "crs": {
+                "type": "name", 
+                "properties": {"name": "4326"}
+                }, 
+            "type": "Feature", 
+            "properties": {"name": "test"}
+            }, 
+        "outputs": [
+            {
+            "definition": "urn:ogc:def:parameter:x-istsos:1.0:time:iso8601", 
+            "constraint": { },
+            "name": "Time", 
+            "uom": "", 
+            "description": ""
+            }, 
+            {
+            "definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall", 
+            "constraint": { },
+            "name": "air-rainfall", 
+            "uom": "mm", 
+            "description": ""
+            }
+        ], 
+        "system_id": "test_post", 
+        "history": []
+    }   
+        
+    post_rat = [ 
+         {
+          'A': '42',
+          'B': '42',
+          'C': '42',
+          'K': '42',
+          'from': '1982-01-01T00:00+00:00',
+          'low_val': '0',
+          'to': '1983-01-01T00:00+00:00',
+          'up_val': '1000'
+         }
+        ]
+        
+    success_get1 = False
+    success_post = False
+    success_getlist = False
+    success_put = False
+    success_delete = False
+    success_get2 = False
+    success_postrat = False
+    
+    post1 = tpost.services_name_procedures_POST(sname, post)
+    get1 = tget.services_name_procedures_name_GET(sname, pname)
+    time.sleep(1)
+    get2 = tget.services_name_procedures_name_GET(sname, pname)
+    put1 = tput.services_name_procedures_name_PUT(sname, pname, put)
+    get3 = tget.services_name_procedures_name_GET(sname, pname)
+    delete1 = tdelete.services_name_procedures_name_DELETE(sname, pname)
+    get4 = tget.services_name_procedures_name_GET(sname, pname)
+    get5 = tget.services_name_procedures_operations_getlist_GET(sname)
+    time.sleep(1)
+    get6 = tget.services_name_procedures_operations_getlist_GET(sname)
+    
+    get7 = tget.services_name_procedures_name_ratingcurve_GET(sname, prat)
+    time.sleep(1)
+    get8 = tget.services_name_procedures_name_ratingcurve_GET(sname, prat)
+    post2 = tpost.services_name_procedures_name_ratingcurve_POST(sname, prat, post_rat)
+    get9 = tget.services_name_procedures_name_ratingcurve_GET(sname, prat)
+    
+    #Check for two successful requests to have the same result
+    if get1['success'] and get2['success']:
+        if get1 == get2:
+            doc.write('services_name_procedures_name_GET: SUCCESS')
+            success_get1 = True
+        else:
+            doc.write('services_name_procedures_name_GET: FAILED')
+            doc.write('\n\nservices_name_procedures_name_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get2))            
+    else:
+        doc.write('services_name_procedures_name_GET: FAILED')
+        doc.write('\n\nservices_name_procedures_name_GET: the requests did not succeed')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get2))            
+    
+     
+    #Checks for the POST to be successful by comparing two GETs
+    if post1['success']:
+        temp = deldic(get1['data'], [['location', 'crs']])
+        postloc = deldic(post['location'], ['crs'])
+        if (get1['data']['description'] == post['description']
+            and temp['inputs'] == post['inputs']
+            and temp['classification'] == post['classification']
+            and temp['characteristics'] == post['characteristics']
+            and temp['interfaces'] == post['interfaces']
+            and temp['keywords'] == post['keywords']
+            and temp['contacts'] == post['contacts']
+            #and temp['assignedSensorId'] == post['assignedSensorId']
+            and temp['documentation'] == post['documentation']
+            and temp['system'] == post['system']
+            and temp['capabilities'] == post['capabilities']
+            and temp['identification'] == post['identification']
+            and temp['location'] == postloc
+            and temp['outputs'] == post['outputs']
+            and temp['system_id'] == post['system_id']
+            and temp['history'] == post['history']
+            ):
+            doc.write('services_name_procedures_POST: SUCCESS')
+            success_post = True
+        #if anything else wrong, failure
+        else:
+            doc.write('services_name_procedures_POST: FAILED')
+            doc.write('\n\nservices_name_procedures_POST: posted data does not correspond')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get1['data']))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_procedures_POST: FAILED')
+        doc.write('\n\nservices_name_procedures_POST: post did not succeed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post1))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get1))
+            
+    
+    
+    #Checks for the PUT to be successful by comparing two GETs
+    if put1['success']:
+        #If gets before and after are the same, failure
+        if get2 == get3:
+            doc.write('services_name_procedures_name_PUT: FAILED')
+            doc.write('\n\nservices_name_procedures_name_PUT: data did not change')
+            doc.write('\nPut:\n')
+            doc.write(pp.pformat(put1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        
+        else:
+            
+            print 'get3:\n'
+            print pp.pformat(get3)
+            print 'put, after:\n'
+            print pp.pformat(put)
+            
+            temp = deldic(get3['data'], [['location', 'crs']])
+            ptloc = deldic(put['location'], ['crs'])
+            
+            
+            print '\ntemp:\n'
+            print pp.pformat(temp)
+            print '\nptloc, after:\n'
+            print pp.pformat(ptloc)
+            
+            if (temp['description'] == put['description']
+                and temp['inputs'] == put['inputs']
+                and temp['classification'] == put['classification']
+                and temp['characteristics'] == put['characteristics']
+                and temp['interfaces'] == put['interfaces']
+                and temp['keywords'] == put['keywords']
+                and temp['contacts'] == put['contacts']
+                #and temp['assignedSensorId'] == put['assignedSensorId']
+                and temp['documentation'] == put['documentation']
+                and temp['system'] == put['system']
+                and temp['capabilities'] == put['capabilities']
+                and temp['identification'] == put['identification']
+                and temp['location'] == putloc
+                and temp['outputs'] == put['outputs']
+                and temp['system_id'] == put['system_id']
+                and temp['history'] == put['history']
+                ):
+                doc.write('services_name_procedures_name_PUT: SUCCESS')
+                success_put = True
+            else:
+                doc.write('services_name_procedures_name_PUT: FAILED')
+                doc.write('\n\nservices_name_procedures_name_PUT: data does not correspond')
+                doc.write('\nPut:\n')
+                doc.write(pp.pformat(put1))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_procedures_name_PUT: FAILED')
+        doc.write('\n\nservices_name_procedures_name_PUT: request did not succeed')
+        doc.write('\nPut:\n')
+        doc.write(pp.pformat(put1))
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get3))
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete1['success']:
+        #If gets before and after are the same, failure
+        if get3 == get4:
+            doc.write('services_name_procedures_name_DELETE: FAILED')
+            doc.write('\n\nservices_name_procedures_name_DELETE: data did not change')
+            doc.write('\nDelete:\n')
+            doc.write(pp.pformat(delete1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get3))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get4))
+        #For the success, second get should be void
+        else:
+            if not get4['success']:
+                #doc.write('the delete is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_procedures_name_DELETE: SUCCESS')
+                success_delete = True
+            else:
+                doc.write('services_name_procedures_name_DELETE: FAILED')
+                doc.write('\n\nservices_name_procedures_name_DELETE: data has not been deleted')
+                doc.write('\nDelete:\n')
+                doc.write(pp.pformat(delete1))
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get3))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get4))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_procedures_name_DELETE: FAILED')
+        doc.write('\n\nservices_name_procedures_name_DELETE: request did not succeed')
+        doc.write('\nDelete:\n')
+        doc.write(pp.pformat(delete1))
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get3))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get4))
+            
+    
+    
+    #Check for two successful requests to have the same result
+    if get5['success'] and get6['success']:
+        if get5 == get6:
+            doc.write('services_name_procedures_operations_getlist_GET: SUCCESS')
+            success_getlist = True
+        else:
+            doc.write('services_name_procedures_operations_getlist_GET: FAILED')
+            doc.write('\n\nservices_name_procedures_operations_getlist_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get5))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get6))            
+    else:
+        doc.write('services_name_procedures_operations_getlist_GET: FAILED')
+        doc.write('\n\nservices_name_procedures_operations_getlist_GET: the requests did not succeed')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get5))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get6))            
+        
+        
+        
+    #Check for two successful requests to have the same result    
+    if get7['success'] and get8['success']:
+        if get7 == get8:
+            doc.write('services_name_procedures_name_ratingcurve_GET: SUCCESS')
+            success_get2 = True
+        else:
+            doc.write('services_name_procedures_name_ratingcurve_GET: FAILED')
+            doc.write('\n\nservices_name_procedures_name_ratingcurve_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get7))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get8))            
+    else:
+        doc.write('services_name_procedures_name_ratingcurve_GET: FAILED')
+        doc.write('\n\nservices_name_procedures_name_ratingcurve_GET: the requests did not succeed')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get7))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get8))
+        
+    
+    
+    #Checks for the POST to be successful by comparing two GETs
+    if post2['success']:
+        #If gets before and after are the same, failure
+        if get8 == get9:
+            doc.write('services_name_procedures_name_ratingcurve_POST: FAILED')
+            doc.write('\n\nservices_name_procedures_name_ratingcurve_POST: the data has not changed')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get8))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get9))
+        #If second get has same or less entries than first, failure
+        elif get9['total'] != len(post_rat):
+            doc.write('services_name_procedures_name_ratingcurve_POST: FAILED')
+            doc.write('\n\nservices_name_procedures_name_ratingcurve_POST: post does not have correct length')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post2))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get8))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get9))
+        #If second get has one more entry than first, look for the 
+        #inserted value. If found, success, else failure
+        elif get9['total'] == len(post_rat):
+            for data in get9['data']:
+                temp = post_rat[0]
+                if (data['A'] == temp['A'] 
+                    and data['B'] == temp['B']
+                    and data['C'] == temp['C']
+                    and data['K'] == temp['K']
+                    and data['from'] == temp['from']
+                    and data['to'] == temp['to']
+                    and data['up_val'] == temp['up_val']
+                    and data['low_val'] == temp['low_val']
+                    ):
+                    doc.write('services_name_procedures_name_ratingcurve_POST: SUCCESS')
+                    success_postrat = True
+                    break
+            if not success_postrat:
+                doc.write('services_name_procedures_name_ratingcurve_POST: FAILED')
+                doc.write('\n\nservices_name_procedures_name_ratingcurve_POST: posted data does not correspond')
+                doc.write('\nPost:\n')
+                doc.write(pp.pformat(post2))
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get8))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get9))
+        #if anything else wrong, failure
+        else:
+            doc.write('services_name_procedures_name_ratingcurve_POST: FAILED')
+            doc.write('\n\nservices_name_procedures_name_ratingcurve_POST: something went wrong')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post2))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get8))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get9))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_procedures_name_ratingcurve_POST: FAILED')
+        doc.write('\n\nservices_name_procedures_name_ratingcurve_POST: post failed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post2))
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get8))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get9))
+    
+    
+    
+    result = {
+        'services_name_procedures_name_GET' : success_get1,
+        'services_name_procedures_POST' : success_post,
+        'services_name_procedures_operations_getlist_GET' : success_getlist,
+        'services_name_procedures_name_PUT' : success_put,
+        'services_name_procedures_name_DELETE' : success_delete,
+        'services_name_procedures_name_ratingcurve_GET' : success_get2,
+        'services_name_procedures_name_ratingcurve_POST' : success_postrat
+        }
+        
+    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/services.py b/test/walib/istsos/services/services.py
new file mode 100755
index 0000000..8e12a6e
--- /dev/null
+++ b/test/walib/istsos/services/services.py
@@ -0,0 +1,335 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import pprint
+import time
+
+    
+def test_services(doc):
+    #services_GET()
+    #services_POST(post)
+    #services_name_GET(sname)
+    #services_name_PUT(put, sname)
+    #services_name_DELETE(sname_updated)
+    #services_name_operations_insertobservation_POST(sname_insertob, post_observation)
+    
+    doc.write('\n-----------------SERVICES------------------------\n')
+    
+    pp = pprint.PrettyPrinter(indent=2)    
+    sname = 'test'
+    sname_updated = 'prova_updated'
+    sname_post = 'prova'
+    sname_insertob = 'test'
+    
+    post = {
+        "path": "/usr/local/istsos/services/prova/prova.cfg",
+        "service": "prova"
+    }
+        
+    put = {
+        "service": "prova_updated", 
+        "dbname": "istsos", 
+        "host": "localhost", 
+        "user": "postgres", 
+        "password": "postgres", 
+        "port": "5432"
+    } 
+
+      
+    success_get1 = False
+    success_post = False
+    success_get2 = False
+    success_put = False
+    success_delete = False
+    success_insertob = False
+    
+    get1 = tget.services_GET()
+    time.sleep(1)
+    get2 = tget.services_GET()    
+    post1 = tpost.services_POST(post)
+    get3 = tget.services_GET()
+    
+    get4 = tget.services_name_GET(sname)
+    time.sleep(1)
+    get5 = tget.services_name_GET(sname)
+    put1 = tput.services_name_PUT(put, sname_post)
+    get6 = tget.services_name_GET(sname_updated)
+    delete1 = tdelete.services_name_DELETE(sname_updated)
+    get7 = tget.services_name_GET(sname_updated)
+    
+    
+    asi = tget.services_name_procedures_name_GET(sname, sname)['data']['assignedSensorId']
+    post_observation = {
+            "AssignedSensorId" : asi,
+            "ForceInsert" : "true",
+            "Observation" : {
+                "procedure": "urn:ogc:object:procedure:x-istsos:1.01.0:test",
+                "samplingTime": {
+				    "beginPosition": "2012-01-01T13:00:00+01:00", 
+				    "endPosition": "2012-01-01T17:00:00+01:00"
+			    }, 
+			    "observedProperty": {
+				    "CompositePhenomenon": {
+					    "id": "comp_126", 
+					    "dimension": "2"
+				    }, 
+				    "component": [
+					    "urn:ogc:def:parameter:x-istsos:1.01.0:time:iso8601", 
+					    "urn:ogc:def:parameter:x-istsos:1.0:test"
+				    ]
+			    },
+			    "featureOfInterest": {
+				    "geom": "<gml:Point srsName='EPSG:4326'><gml:coordinates>15,15,15</gml:coordinates></gml:Point>", 
+				    "name": "urn:ogc:object:feature:x-istsos:1.01.0:station:test"
+			    }, 
+			    "result": {
+				    "DataArray": {
+					    "elementCount": "2", 
+					    "values": [
+						    [
+							    "2012-01-01T14:00:00+01:00", 
+							    "10.000000"
+						    ],
+						    [
+							    "2012-01-01T15:00:00+01:00", 
+							    "20.000000"
+						    ]
+					    ], 
+					    "field": [
+						    {
+							    "definition": "urn:ogc:def:parameter:x-istsos:1.01.0:time:iso8601", 
+							    "name": "Time"
+						    }, 
+						    {
+							    "definition": "urn:ogc:def:parameter:x-istsos:1.0:test", 
+							    "name": "test", 
+							    "uom": "test"
+						    }
+					    ]
+				    }
+			    }
+		    } 
+		}    
+    
+    post2 = tpost.services_name_operations_insertobservation_POST(sname_insertob, post_observation)
+    
+    
+    #Check for two successful requests to have the same result
+    if get1['success'] and get2['success']:
+        if get1 == get2:
+            doc.write('services_GET: SUCCESS')
+            success_get1 = True
+        else:
+            doc.write('services_GET: FAILED')
+            doc.write('\n\nservices_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get2))
+    else:
+        doc.write('services_GET: FAILED')
+        doc.write('\n\nservices_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get2))
+    
+     
+    #Checks for the POST to be successful by comparing two GETs
+    if post1['success']:
+        #If gets before and after are the same, failure
+        if get2 == get3:
+            doc.write('services_POST: FAILED')
+            doc.write('\n\nservices_POST: the data has not changed')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #If second get has same or less entries than first, failure
+        elif get3['total'] <= get2['total']:
+            doc.write('services_POST: FAILED')
+            doc.write('\n\nservices_POST: post failed or deleted another entry')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #If second get has one more entry than first, look for the 
+        #inserted value. If found, success, else failure
+        elif get3['total'] == get2['total'] + 1:
+            for data in get3['data']:
+                if (data['service'] == post['service']
+                    #and data['path'] == post['path']
+                    ):
+                    doc.write('services_POST: SUCCESS')
+                    success_post = True
+                    break
+            if not success_post:
+                doc.write('services_POST: FAILED')
+                doc.write('\n\nservices_POST: posted data does not correspond')
+                doc.write('\nPost:\n')
+                doc.write(pp.pformat(post1))
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get3))
+        #if anything else wrong, failure
+        else:
+            doc.write('services_POST: FAILED')
+            doc.write('\n\nservices_POST: something went wrong')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+    #If post not successful, failure
+    else:
+        doc.write('services_POST: FAILED')
+        doc.write('\n\nservices_POST: post failed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post1))
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get3))
+            
+    
+    #Check for two successful requests to have the same result
+    if get4['success'] and get5['success']:
+        if get4 == get5:
+            #doc.write('the results are the same:\n'
+            #pp.pprint(get1)
+            doc.write('services_name_GET: SUCCESS')
+            success_get2 = True
+        else:
+            doc.write('services_name_GET: FAILED')
+            doc.write('\n\nservices_name_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get4))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get5))
+    else:
+        doc.write('services_name_GET: FAILED')
+        doc.write('\n\nservices_name_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get4))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get5))
+    
+    
+    
+    
+    #Checks for the PUT to be successful by comparing two GETs
+    if put1['success']:
+        #If gets before and after are the same, failure
+        if get5 == get6:
+            doc.write('services_name_uoms_name_PUT: FAILED')
+            doc.write('\n\nservices_name_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(put1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get5))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get6))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            if (get6['data']['service'] == put['service'] 
+                and get6['data']['dbname'] == put['dbname']
+                and get6['data']['host'] == put['host']
+                and get6['data']['user'] == put['user']
+                and get6['data']['password'] == put['password']
+                and get6['data']['port'] == put['port']
+                ):
+                doc.write('services_name_PUT: SUCCESS')
+                success_put = True
+            else:
+                doc.write('services_name_PUT: FAILED')
+                doc.write('\n\nservices_name_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(put1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get5))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get6))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_PUT: FAILED')
+        doc.write('\n\nservices_name_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(put1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get5))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get6))
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete1['success']:
+        #If gets before and after are the same, failure
+        if get6 == get7:
+            doc.write('services_name_DELETE: FAILED')
+            doc.write('\n\nservices_name_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(delete1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get6))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get7))
+        #For the success, second get should be void
+        else:
+            if get7['success'] == False:
+                #doc.write('the delete is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_DELETE: SUCCESS')
+                success_delete = True
+            else:
+                doc.write('services_name_DELETE: FAILED')
+                doc.write('\n\nservices_name_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(delete1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get6))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get7))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_DELETE: FAILED')
+        doc.write('\n\nservices_name_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(delete1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get6))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get7))
+        
+            
+    #Checks for the POST to be successful by comparing two GETs
+    if post2['success']:
+        doc.write('services_name_operations_insertobservation_POST: SUCCESS')
+        success_insertob = True
+    else:
+        doc.write('\n\nservices_name_operations_insertobservation_POST: post failed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post2))
+        doc.write('services_name_operations_insertobservation_POST: FAILED')
+        
+    
+    result = {
+        'services_GET' : success_get1,
+        'services_POST' : success_post,
+        'services_name_GET' : success_get2,
+        'services_name_PUT' : success_put,
+        'services_name_DELETE' : success_delete,
+        'services_name_operations_insertobservation_POST' : success_insertob
+        }
+        
+    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/systemtypes.py b/test/walib/istsos/services/systemtypes.py
new file mode 100755
index 0000000..37ddb77
--- /dev/null
+++ b/test/walib/istsos/services/systemtypes.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import time
+import pprint
+
+   
+def test_systemtypes(doc):
+    #services_name_systemtypes_GET(sname)
+    
+    doc.write('\n-----------------SYSTEMTYPES---------------------\n')
+    doc.write('\nRequest services_name_systemtypes_GET is not implemented\n')
+    
+#    if v:
+#        doc.write('\n\n-----------------SYSTEMTYPES------------------------')
+#    
+#    pp = pprint.PrettyPrinter(indent=2)    
+#    sname = 'test'
+#    success = False
+#    
+#    get1 = tget.services_name_systemtypes_GET(sname)
+#    time.sleep(1)
+#    get2 = tget.services_name_systemtypes_GET(sname)
+#    
+#    
+#    #Checks if all the requests were successful
+#    if get1['success'] and get2['success']:
+#        #Checks if all the requests got the same result
+#        if get1 == get2:
+#            print 'services_name_systemtypes_GET: SUCCESS'
+#            success = True
+#        #If the results are not all the same, we got a failure
+#        else:
+#            if v:
+#                doc.write('\n\nservices_name_systemtypes_GET: the results are not all the same')
+#                doc.write('\nFirst get:\n')            
+#                doc.write(pp.pformat(get1))
+#                doc.write('\nSecond get:\n')            
+#                doc.write(pp.pformat(get2))
+#            print 'services_name_systemtypes_GET: FAILED'
+#    #If the requests weren't all successful, we got a failure
+#    else:
+#        if v:
+#            doc.write('\n\nservices_name_systemtypes_GET: the requests have not been successful')
+#            doc.write('\nFirst get:\n')            
+#            doc.write(pp.pformat(get1))
+#            doc.write('\nSecond get:\n')            
+#            doc.write(pp.pformat(get2))
+#        print 'services_name_systemtypes_GET: FAILED'
+#        
+#    result = {'services_name_systemtypes_GET' : success}
+#    return result
\ No newline at end of file
diff --git a/test/walib/istsos/services/uoms.py b/test/walib/istsos/services/uoms.py
new file mode 100755
index 0000000..7711930
--- /dev/null
+++ b/test/walib/istsos/services/uoms.py
@@ -0,0 +1,261 @@
+# -*- coding: utf-8 -*-
+
+import test.get as tget #GET(fname, address)
+import test.post as tpost #POST(fname, spost, address)
+import test.put as tput #PUT(fname, sput, address)
+import test.delete as tdelete #DELETE(fname, address)
+import pprint
+import time
+
+    
+def test_uoms(doc):
+    #services_name_uoms_GET(sname)
+    #services_name_uoms_POST(sname, post)    
+    #services_name_uoms_name_GET(sname, uname)
+    #services_name_uoms_name_PUT(sname, uname, put)
+    #services_name_uoms_name_DELETE(sname, uname)
+    
+    doc.write('\n-----------------UOMS----------------------------\n')
+    pp = pprint.PrettyPrinter(indent=2)    
+    sname = 'test'
+    uname = 'test'
+    putname = 'test_post'
+    
+    post = {
+        "procedures": [], 
+        "name": "test_post", 
+        "description": "lorem ipsum dolor"
+        }
+        
+    put = {
+        "procedures": [], 
+        "name": "test_post", 
+        "description": "modified input"
+        }        
+        
+    success_get1 = False
+    success_post = False
+    success_get2 = False
+    success_put = False
+    success_delete = False
+    
+    get1 = tget.services_name_uoms_GET(sname)
+    time.sleep(1)
+    get2 = tget.services_name_uoms_GET(sname)
+    post1 = tpost.services_name_uoms_POST(sname, post)
+    get3 = tget.services_name_uoms_GET(sname)
+    
+    get4 = tget.services_name_uoms_name_GET(sname, putname)
+    time.sleep(1)
+    get5 = tget.services_name_uoms_name_GET(sname, putname)
+    put1 = tput.services_name_uoms_name_PUT(sname, putname, put)
+    get6 = tget.services_name_uoms_name_GET(sname, putname)    
+    delete1 = tdelete.services_name_uoms_name_DELETE(sname, putname)
+    get7 = tget.services_name_uoms_name_GET(sname, putname)
+    get8 = tget.services_name_uoms_GET(sname)
+    
+    
+    
+    #Check for two successful requests to have the same result
+    if get1['success'] and get2['success']:
+        if get1 == get2:
+            doc.write('services_name_uoms_GET: SUCCESS')
+            success_get1 = True
+        else:
+            doc.write('services_name_uoms_GET: FAILED')
+            doc.write('\n\nservices_name_uoms_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get1))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get2))
+    else:
+        doc.write('services_name_uoms_GET: FAILED')
+        doc.write('\n\nservices_name_uoms_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get1))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get2))
+    
+     
+    #Checks for the POST to be successful by comparing two GETs
+    if post1['success']:
+        #If gets before and after are the same, failure
+        if get2 == get3:
+            doc.write('services_name_uoms_POST: FAILED')
+            doc.write('\n\nservices_name_uoms_POST: the data has not changed')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #If second get has same or less entries than first, failure
+        elif get3['total'] <= get2['total']:
+            doc.write('services_name_uoms_POST: FAILED')
+            doc.write('\n\nservices_name_uoms_POST: post failed or deleted another entry')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+        #If second get has one more entry than first, look for the 
+        #inserted value. If found, success, else failure
+        elif get3['total'] == get2['total'] + 1:
+            for data in get3['data']:
+                if (data['name'] == post['name']
+                    and data['description'] == post['description']
+                    and data['procedures'] == post['procedures']
+                    ):
+                    doc.write('services_name_uoms_POST: SUCCESS')
+                    success_post = True
+                    break
+            if not success_post:
+                doc.write('services_name_uoms_POST: FAILED')
+                doc.write('\n\nservices_name_uoms_POST: posted data does not correspond')
+                doc.write('\nPost:\n')
+                doc.write(pp.pformat(post1))
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get2))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get3))
+        #if anything else wrong, failure
+        else:
+            doc.write('services_name_uoms_POST: FAILED')
+            doc.write('\n\nservices_name_uoms_POST: something went wrong')
+            doc.write('\nPost:\n')
+            doc.write(pp.pformat(post1))
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get2))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get3))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_uoms_POST: FAILED')
+        doc.write('\n\nservices_name_uoms_POST: post failed')
+        doc.write('\nPost:\n')
+        doc.write(pp.pformat(post1))
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get2))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get3))
+            
+    
+    #Check for two successful requests to have the same result
+    if get4['success'] and get5['success']:
+        if get4 == get5:
+            #doc.write('the results are the same:\n'
+            #pp.pprint(get1)
+            doc.write('services_name_uoms_name_GET: SUCCESS')
+            success_get2 = True
+        else:
+            doc.write('services_name_uoms_name_GET: FAILED')
+            doc.write('\n\nservices_name_uoms_name_GET: the results are not all the same')
+            doc.write('\nFirst get:\n')
+            doc.write(pp.pformat(get4))
+            doc.write('\nSecond get:\n')
+            doc.write(pp.pformat(get5))
+    else:
+        doc.write('services_name_uoms_name_GET: FAILED')
+        doc.write('\n\nservices_name_uoms_name_GET: the requests have not been successful')
+        doc.write('\nFirst get:\n')
+        doc.write(pp.pformat(get4))
+        doc.write('\nSecond get:\n')
+        doc.write(pp.pformat(get5))
+
+    
+    
+    
+    #Checks for the PUT to be successful by comparing two GETs
+    if put1['success']:
+        #If gets before and after are the same, failure
+        if get5 == get6:
+            doc.write('services_name_uoms_name_PUT: FAILED')
+            doc.write('\n\nservices_name_uoms_name_PUT: maybe you re-wrote existing data')
+            doc.write('\nPut:\n')            
+            doc.write(pp.pformat(put1)) 
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get5))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get6))
+        #For the success, second get should be the same as first
+        #apart from the modicifation done with put
+        else:
+            for data in get6['data']:
+                if (data['name'] == put['name'] 
+                    and data['description'] == put['description']
+                    #and get6['data'][0]['procedures'] == put['procedures']
+                ):
+                    doc.write('services_name_uoms_name_PUT: SUCCESS')
+                    success_put = True
+            if not success_put:
+                doc.write('services_name_uoms_name_PUT: FAILED')
+                doc.write('\n\nservices_name_uoms_name_PUT: updated data does not correspond')
+                doc.write('\nPut:\n')            
+                doc.write(pp.pformat(put1)) 
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get5))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get6))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_uoms_name_PUT: FAILED')
+        doc.write('\n\nservices_name_uoms_name_PUT: the request has not been successful')
+        doc.write('\nPut:\n')            
+        doc.write(pp.pformat(put1)) 
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get5))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get6))
+            
+            
+            
+    #Checks for the DELETE to be successful by comparing two GETs
+    if delete1['success']:
+        #If gets before and after are the same, failure
+        if get6 == get7:
+            doc.write('services_name_uoms_name_DELETE: FAILED')
+            doc.write('\n\nservices_name_uoms_name_DELETE: the results remained the same')
+            doc.write('\nDelete:\n')            
+            doc.write(pp.pformat(delete1))     
+            doc.write('\nGet, before:\n')
+            doc.write(pp.pformat(get6))
+            doc.write('\nGet, after:\n')
+            doc.write(pp.pformat(get7))
+        #For the success, second get should be void
+        else:
+            if get7['total'] == get6['total'] - 1 and get8 == get1:
+                #doc.write('the delete is successful:\n'
+                #pp.pprint(get6)
+                doc.write('services_name_uoms_name_DELETE: SUCCESS')
+                success_delete = True
+            else:
+                doc.write('services_name_uoms_name_DELETE: FAILED')
+                doc.write('\n\nservices_name_uoms_name_DELETE: the element has not been deleted')
+                doc.write('\nDelete:\n')            
+                doc.write(pp.pformat(delete1))     
+                doc.write('\nGet, before:\n')
+                doc.write(pp.pformat(get6))
+                doc.write('\nGet, after:\n')
+                doc.write(pp.pformat(get7))
+    #If post not successful, failure
+    else:
+        doc.write('services_name_uoms_name_DELETE: FAILED')
+        doc.write('\n\nservices_name_uoms_name_DELETE: the request has not been successful')
+        doc.write('\nDelete:\n')            
+        doc.write(pp.pformat(delete1))     
+        doc.write('\nGet, before:\n')
+        doc.write(pp.pformat(get6))
+        doc.write('\nGet, after:\n')
+        doc.write(pp.pformat(get7))
+            
+            
+    result = {
+        'services_name_uoms_GET' : success_get1,
+        'services_name_uoms_POST' : success_post,
+        'services_name_uoms_name_GET' : success_get2,
+        'services_name_uoms_name_PUT' : success_put,
+        'services_name_uoms_name_DELETE' : success_delete
+        }
+        
+    return result
\ No newline at end of file
diff --git a/waconf2sos.py b/waconf2sos.py
new file mode 100755
index 0000000..f876bc3
--- /dev/null
+++ b/waconf2sos.py
@@ -0,0 +1,288 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import resource
+import string
+import config
+import sys
+
+class istsosConfig():
+    def __init__(self,environ):
+       
+        waEnviron = {
+            "path" : environ['PATH_INFO'],
+            "method" : str(environ['REQUEST_METHOD']).upper(),
+            "pathinfo" : environ['PATH_INFO'].strip()[1:].split("/"),
+            #"wsgi_input" : environ['wsgi.input'].read(int(environ["CONTENT_LENGTH"])) if environ.get("CONTENT_LENGTH") else None,
+            "url_scheme" : environ['wsgi.url_scheme'],
+            "http_host" : environ['HTTP_HOST'] if environ.get('HTTP_HOST') else None,
+            "server_name" : environ['SERVER_NAME'],
+            "server_port" : environ['SERVER_PORT'],
+            "script_name" : environ['SCRIPT_NAME'] if environ.get('SCRIPT_NAME', '') else None,
+            "query_string" : environ['QUERY_STRING'] if environ.get('QUERY_STRING') else None,
+            "services_path" : config.services_path,
+            "istsos_path" : config.istsoslib_path
+        }
+        
+        """
+        i = waEnviron["pathinfo"].index("services")
+        if i>0 and i<len(waEnviron["pathinfo"])-1:
+            service = waEnviron["pathinfo"][i+1]
+        else:
+            service = None
+        serviceobj = resource.waResourceService(waEnviron,service,loadjson=False)
+        """
+        serviceobj = resource.waResourceService(waEnviron,waEnviron["pathinfo"][-1],loadjson=False)
+        
+        self.debug=config.debug
+        
+        self.istsos_librarypath = serviceobj.waconf.paths["istsos"]
+        
+        self.connection = {
+            "user" : serviceobj.serviceconf.connection["user"],
+            "password" : serviceobj.serviceconf.connection["password"],
+            "host" : serviceobj.serviceconf.connection["host"],
+            "dbname" : serviceobj.serviceconf.connection["dbname"],
+            "port" : serviceobj.serviceconf.connection["port"],
+        }
+        
+        self.schema = serviceobj.service
+        self.authority =  serviceobj.serviceconf.identification["authority"]
+        self.urnversion = serviceobj.serviceconf.identification["urnversion"]
+        self.version = serviceobj.serviceconf.parameters["version"]
+        
+        self.istsosepsg = serviceobj.serviceconf.geo["istsosepsg"]
+        self.x_axis = serviceobj.serviceconf.geo["xAxisName"]
+        self.y_axis = serviceobj.serviceconf.geo["yAxisName"]
+        self.z_axis = serviceobj.serviceconf.geo["zAxisName"]
+        self.sos_allowedEPSG = [ self.istsosepsg ] + serviceobj.serviceconf.geo["allowedEPSG"].split(",")
+        
+        self.sensorMLpath = serviceobj.sensormlpath
+        self.virtual_processes_folder = serviceobj.virtualpath
+        #self.virtual_HQ_folder = serviceobj.serviceconf.discharges["virtual_HQ_folder"]
+        
+        self.aggregate_nodata = serviceobj.serviceconf.getobservation["aggregate_nodata"]
+        self.maxGoPeriod = serviceobj.serviceconf.getobservation["maxGoPeriod"]        
+        self.aggregate_nodata_qi = serviceobj.serviceconf.getobservation["aggregate_nodata_qi"]
+        self.default_qi = serviceobj.serviceconf.getobservation["default_qi"]
+        self.correct_qi = serviceobj.serviceconf.getobservation["correct_qi"]
+        self.stat_qi = serviceobj.serviceconf.getobservation["stat_qi"]
+        self.transactional_log = serviceobj.serviceconf.getobservation["transactional_log"]
+        
+        self.serviceUrl = {
+            "get" : serviceobj.serviceconf.serviceurl["url"],
+            "post" : serviceobj.serviceconf.serviceurl["url"]
+        }
+                          
+        self.serviceIdentification={
+            "title" : serviceobj.serviceconf.identification["title"],
+            "abstract" : serviceobj.serviceconf.identification["abstract"],
+            "keywords" : serviceobj.serviceconf.identification["keywords"].split(","),
+            "fees" : serviceobj.serviceconf.identification["fees"],
+            "accessConstrains" : serviceobj.serviceconf.identification["accessConstrains"]
+        }
+                       
+        self.serviceProvider={
+            "providerName" : serviceobj.serviceconf.provider["providerName"],
+            "providerSite" : serviceobj.serviceconf.provider["providerSite"],
+            "serviceContact" : {
+                "individualName" : serviceobj.serviceconf.provider["contactName"],
+                "positionName" : serviceobj.serviceconf.provider["contactPosition"],
+                "contactInfo" : {
+                    "voice" : serviceobj.serviceconf.provider["contactVoice"],
+                    "fax" : serviceobj.serviceconf.provider["contactFax"],
+                    "deliveryPoint" : serviceobj.serviceconf.provider["contactDeliveryPoint"],
+                    "city" : serviceobj.serviceconf.provider["contactCity"],
+                    "administrativeArea" : serviceobj.serviceconf.provider["contactAdminArea"],
+                    "postalCode" : serviceobj.serviceconf.provider["contactPostalCode"],
+                    "country" : serviceobj.serviceconf.provider["contactCountry"],
+                    "email" : serviceobj.serviceconf.provider["contactEmail"]
+                }
+            }
+        }
+        
+        
+        self.urn={
+            "phenomena" : serviceobj.serviceconf.urn["phenomena"],
+            "dataType" : serviceobj.serviceconf.urn["dataType"],
+            "parameter" : serviceobj.serviceconf.urn["parameter"],
+            "process" : serviceobj.serviceconf.urn["process"],
+            "identifier" : serviceobj.serviceconf.urn["identifier"],
+            "keywords" : serviceobj.serviceconf.urn["keywords"],
+            "sensor" : serviceobj.serviceconf.urn["sensor"],
+            "procedure" : serviceobj.serviceconf.urn["procedure"],
+            "sensorType" : serviceobj.serviceconf.urn["sensorType"],
+            "property" : serviceobj.serviceconf.urn["property"],
+            "feature" : serviceobj.serviceconf.urn["feature"],
+            "role" : serviceobj.serviceconf.urn["role"],
+            "offering": serviceobj.serviceconf.urn["offering"],
+            "refsystem" : serviceobj.serviceconf.urn["refsystem"],
+            "time" : serviceobj.serviceconf.urn["time"]
+        }
+        
+        """
+        #=========================================================================================
+        #== ADJUST URN DEPENDING ON identification["authority"] & identification["urnversion"] ===
+        #=========================================================================================
+        self.urn={
+            "phenomena" : serviceobj.serviceconf.urn["phenomena"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "dataType" : serviceobj.serviceconf.urn["dataType"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "parameter" : serviceobj.serviceconf.urn["parameter"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "process" : serviceobj.serviceconf.urn["process"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "identifier" : serviceobj.serviceconf.urn["identifier"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "keywords" : serviceobj.serviceconf.urn["keywords"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "sensor" : serviceobj.serviceconf.urn["sensor"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "procedure" : serviceobj.serviceconf.urn["procedure"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "sensorType" : string.replace(
+                                        serviceobj.serviceconf.urn["sensorType"],
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "property" : string.replace(
+                                        serviceobj.serviceconf.urn["property"],
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "feature" : serviceobj.serviceconf.urn["feature"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "role" : serviceobj.serviceconf.urn["role"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "offering": serviceobj.serviceconf.urn["offering"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "refsystem" : serviceobj.serviceconf.urn["refsystem"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        ),
+            "time" : serviceobj.serviceconf.urn["time"].replace(
+                                        "@identification-authority@",
+                                        serviceobj.serviceconf.identification["authority"]
+                                        ).replace(
+                                        "@urnversion@",
+                                        serviceobj.serviceconf.identification["urnversion"]
+                                        )
+        }
+        """
+        
+        self.parameters={
+           "service" : ["SOS"],
+           "version" : serviceobj.serviceconf.serviceType["version"].split(","),
+           "requests" : serviceobj.serviceconf.parameters["requests"].split(","),
+           "GC_Section" : serviceobj.serviceconf.parameters["GC_Section"].split(","),
+           "DS_outputFormats" : serviceobj.serviceconf.parameters["DS_outputFormats"].split(","),
+           "GO_srs" : self.sos_allowedEPSG,
+           "GO_timeFormats" : serviceobj.serviceconf.parameters["GO_timeFormats"].split(","),
+           "GO_responseFormat" : serviceobj.serviceconf.parameters["GO_responseFormat"].split(","),
+           "GO_resultModel" : serviceobj.serviceconf.parameters["GO_resultModel"].split(","),
+           "GO_responseMode" : serviceobj.serviceconf.parameters["GO_responseMode"].split(",")
+        }
+
+        self.parGeom = { 
+            "x" : serviceobj.serviceconf.parGeom["x"].split(","),
+            "y" : serviceobj.serviceconf.parGeom["y"].split(","),
+            "z" : serviceobj.serviceconf.parGeom["z"].split(",")
+        }
+        
+        self.foiGeometryType = {
+            "gml:Point"     : serviceobj.serviceconf.foiGeometryType["Point"],
+            "gml:Polygon"   : serviceobj.serviceconf.foiGeometryType["Polygon"],
+            "gml:Box"       : serviceobj.serviceconf.foiGeometryType["Box"]
+        }
+        
+
+        self.serviceType={
+            "codespace" : serviceobj.serviceconf.serviceType["codespace"],
+            "value" : serviceobj.serviceconf.serviceType["value"],
+            "version" : serviceobj.serviceconf.serviceType["version"],
+        }
+
+        self.service = "SOS"
+        self.version = "1.0.0"
+        
+        
+        
diff --git a/waconf2sos.pyc b/waconf2sos.pyc
new file mode 100644
index 0000000..dd98efd
Binary files /dev/null and b/waconf2sos.pyc differ
diff --git a/walib/__init__.py b/walib/__init__.py
new file mode 100755
index 0000000..d32e069
--- /dev/null
+++ b/walib/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "istsos","admin","configManager","databaseManager","resourceFactory","utils","sqlschema","wa_version"]
diff --git a/walib/__init__.pyc b/walib/__init__.pyc
new file mode 100644
index 0000000..e6e52e2
Binary files /dev/null and b/walib/__init__.pyc differ
diff --git a/walib/admin/__init__.py b/walib/admin/__init__.py
new file mode 100755
index 0000000..abe9e13
--- /dev/null
+++ b/walib/admin/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "configsections"]
diff --git a/walib/admin/configsections/__init__.py b/walib/admin/configsections/__init__.py
new file mode 100755
index 0000000..7893296
--- /dev/null
+++ b/walib/admin/configsections/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "configsections", "paths"]
diff --git a/walib/admin/configsections/configsections.py b/walib/admin/configsections/configsections.py
new file mode 100755
index 0000000..e69de29
diff --git a/walib/admin/configsections/paths.py b/walib/admin/configsections/paths.py
new file mode 100755
index 0000000..608a948
--- /dev/null
+++ b/walib/admin/configsections/paths.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceAdmin
+
+class waPaths(waResourceAdmin):
+
+    def executeGet(self):
+        self.setData({
+            "istsos": self.waconf.get('paths')['istsos'],
+            "services": self.waconf.get('paths')['services']
+        })
+        
+    def executePut(self):
+        self.waconf.put('paths','istsos',str(self.json["istsos"]))
+        self.waconf.put('paths','services',str(self.json["services"]))
+        self.waconf.save()
+        self.executeGet()
+        
+    def executePost(self):
+        self.executePut()
diff --git a/walib/configManager.py b/walib/configManager.py
new file mode 100755
index 0000000..72533c4
--- /dev/null
+++ b/walib/configManager.py
@@ -0,0 +1,158 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import ConfigParser
+import os 
+import os.path
+
+class waServiceConfig():
+    """
+    base service configuration object to handle configuration files
+    
+    >>> Class structure:
+        self.defaultcfgpath --> path of the default configuration file
+        self.servicecfgpath --> path of the service configuration file
+        self.sections = --> list of available sections
+        self.* = {} --> dictionary of the options for the * section
+    
+    @note: Each section is an attribute of the waServiceConfig object and is a dictionary of option names (key) and value.
+    Additionally each section dictionary has a special key "default" that is a boolean variable indicating if the section 
+    is set in the default or specific service configuration file.
+    
+    >>> Example of section attribute
+        myconfig = waServiceConfig("/services","/services/myservice")
+        print myconfig.serviceurl
+        {'default': True, 'post': 'http://localhost:8099', 'get': 'http://localhost:8099'}
+    """
+    
+    def __init__(self, defaultcfgpath, servicecfgpath=None):
+        """
+        initialize the configuration object with default configuration file and
+        service specific configuration file
+        
+        @param defaultcfgpath: path of default configuration file
+        @type defaultcfgpath: C{string}
+        @param servicecfgpath: path of service configuration file
+        @type servicecfgpath: C{string}
+        """
+        self.defaultcfgpath = defaultcfgpath
+        self.servicecfgpath = servicecfgpath
+        
+        #read config from server
+        defaultconf = ConfigParser.RawConfigParser()
+        defaultconf.optionxform = str
+        defaultconf.read(defaultcfgpath)
+        self.sections = defaultconf.sections()
+        
+        #read config from service
+        serviceconf = ConfigParser.RawConfigParser()
+        serviceconf.optionxform = str
+        if not servicecfgpath == None:
+            serviceconf.read(servicecfgpath)
+        
+        for section in self.sections:
+            val = {}
+            if serviceconf.has_section(section):
+                val["default"] = False
+                for option in serviceconf.options(section):
+                    val[option] = serviceconf.get(section, option)
+            else:
+                val["default"] = True
+                for option in defaultconf.options(section):
+                    val[option] = defaultconf.get(section, option)
+            setattr(self, section, val) 
+    
+    def get(self,section):
+        """
+        returns the requested section as a dictionary
+        
+        @param section: configuration section
+        @type section: C{string}
+        """
+        try:
+            return getattr(self,"%s" % section)
+        except Exception:
+            raise Exception("Section %s does not exists" % section)
+    
+    def put(self,section,option,value):
+        """
+        put new value to given option in given section
+        
+        @param section: configuration section
+        @type section: C{string}
+        @param option: configuration option
+        @type option: C{string}
+        @param value: configuration value
+        @type section: C{value}
+        """
+        tmpsection = getattr(self,"%s" % section)
+        if option in tmpsection:
+            if not self.servicecfgpath==None:
+                tmpsection["default"] = False 
+            tmpsection[option]=value
+            setattr(self,section,tmpsection)
+        else:
+            raise Exception("section <%s> has not option <%s>" %(section,option) )
+    
+    
+    def delete(self,section):
+        """
+        returns the requested section as a dictionary
+        
+        @param section: configuration section
+        @type section: C{string}
+        """
+        if self.get(section)['default'] == True:
+            raise Exception("Cannot remove sections from default configuration")
+        self.sections.remove(section)
+    
+    def save(self):
+        """
+        save current configuration to appropriate files
+        """
+        if not self.servicecfgpath==None:
+            serviceconf = ConfigParser.RawConfigParser()
+            serviceconf.optionxform = str
+            
+            for sectionname in self.sections:
+                section = getattr(self,"%s" % sectionname)
+                if section["default"]==False:
+                    serviceconf.add_section(sectionname)
+                    for option in section.keys():
+                        if not option=="default":
+                            serviceconf.set(sectionname, option, section[option])
+                        
+            cfgfile = open(self.servicecfgpath,'w')
+            serviceconf.write(cfgfile)
+            cfgfile.close()
+            
+        else:
+            defaultconf = ConfigParser.RawConfigParser()
+            defaultconf.optionxform = str
+            
+            for sectionname in self.sections:
+                section = getattr(self,"%s" % sectionname)
+                defaultconf.add_section(sectionname)
+                for option in section.keys():
+                    if not option=="default":
+                        defaultconf.set(sectionname, option, section[option])
+                        
+            cfgfile = open(self.defaultcfgpath,'w')
+            defaultconf.write(cfgfile)
+            cfgfile.close()     
+        
+    
diff --git a/walib/configManager.pyc b/walib/configManager.pyc
new file mode 100644
index 0000000..01647c7
Binary files /dev/null and b/walib/configManager.pyc differ
diff --git a/walib/databaseManager.py b/walib/databaseManager.py
new file mode 100755
index 0000000..b933d19
--- /dev/null
+++ b/walib/databaseManager.py
@@ -0,0 +1,167 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import psycopg2 # @TODO the right library
+import psycopg2.extras
+import psycopg2.extensions
+psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
+psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
+import sys
+
+from walib import utils as wut
+
+#import pprint
+#pp = pprint.PrettyPrinter(indent=4)
+    
+
+class Database:
+    """Connect to a database"""
+    user = None
+    password = None
+    host = None
+    dbName = None
+    port = None
+    def getConnection(self):
+        """Return a database connection"""
+        return None;
+    def closeConnection(self):
+        """Close a database connection"""
+        return None
+
+class PgDB(Database):
+    """Connect to a PostgreSQL database"""
+    host=None
+    def __init__(self,user,password,dbName,host='localhost',port='5432'):
+        "Initialize PostgreSQL connection parameters"
+        self.__dns=""
+        if host: self.__dns += "host='%s' " % host
+        if port: self.__dns += "port='%d' " % int(port)
+        if dbName: self.__dns += "dbname='%s' " % dbName
+        if user: self.__dns += "user='%s' " % user
+        if password: self.__dns += "password='%s' " % password
+        self.__connect()
+    
+    def __connect(self):
+        """Connect to a PostgreSQL database"""
+        try:
+            self.__conn=psycopg2.connect(self.__dns)
+            self.__conn.set_client_encoding('UTF8')
+        except Exception as e:
+            emes = "%s" % e
+            if emes.find("CONNECTION ERROR: wrong password")>-1:
+                raise Exception("CONNECTION ERROR: wrong password or user")
+            elif emes.find("could not translate host")>-1:
+                raise Exception("CONNECTION ERROR: wrong host name")
+            elif emes.find("database")>-1:
+                raise Exception("CONNECTION ERROR: wrong database")
+            elif emes.find("connections on port")>-1 or emes.find("invalid literal for int()")>-1:
+                raise Exception("CONNECTION ERROR: wrong port")
+            else:
+                raise Exception("CONNECTION ERROR: %s" % e)  
+        
+    def select(self,sql,par=None):
+        """ Execute a select statement"""
+        if sql.lstrip()[0:6].lower() == "select":
+            cur = self.__conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+            try:
+                cur.execute(sql,par)
+            except psycopg2.ProgrammingError as e:
+                raise e
+            try:
+                rows = cur.fetchall()
+            except:
+                rows = None
+            #self.__conn.commit()
+            cur.close()
+            #return rows
+            return wut.encodeobject(rows)
+        else:
+            raise Exception("sql must be a SELECT statement")
+
+    def commitTransaction(self):
+        """Commit current transaction"""
+        try:
+            self.__conn.commit()
+        except psycopg2.ProgrammingError as e:
+            raise e
+        except Exception as e:
+            raise e
+            
+    def rollbackTransaction(self):
+        """Rollback current transaction"""
+        try:
+            self.__conn.rollback()
+        except psycopg2.ProgrammingError as e:
+            print >> sys.stderr,  e.message
+    
+    def executeInTransaction(self,sql,par=None):
+        """Execute an sql statement in an open session"""
+        cur = self.__conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+        try:
+            cur.execute(sql,par)
+        except psycopg2.ProgrammingError as e:
+            print >> sys.stderr,  e.message
+            self.__conn.rollback()
+            raise e
+        except Exception as e:
+            raise e
+        try:
+            rows = cur.fetchall()
+        except:
+            rows = None
+        cur.close()
+        #return rows
+        return wut.encodeobject(rows)
+                
+    def execute(self,sql,par=None):
+        """Execute an sql statement"""
+        cur = self.__conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+        try:
+            cur.execute(sql,par)
+        except psycopg2.ProgrammingError as e:
+            raise e
+        try:
+            rows = cur.fetchall()
+        except:
+            rows = None
+        self.__conn.commit()
+        #return rows
+        return wut.encodeobject(rows)
+
+    def insertMany(self,sql,dict):
+        """Insert many values at once"""
+        cur = self.__conn.cursor()
+        try:
+            cur.executemany(sql,dict)
+        except psycopg2.ProgrammingError as e:
+            raise e
+        self.__conn.commit()
+        return
+    
+    def mogrify(self,sql,par=None):
+        """Mogrify an sql statement (print >> sys.stderr,  the actual sql query that will be executed)"""
+        cur = self.__conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+        try:
+            if par:
+                a = cur.mogrify(sql,par)
+            else:
+                a = cur.mogrify(sql)
+        except psycopg2.ProgrammingError as e:
+            raise e
+        cur.close()
+        return a
+        
diff --git a/walib/databaseManager.pyc b/walib/databaseManager.pyc
new file mode 100644
index 0000000..c6de2c2
Binary files /dev/null and b/walib/databaseManager.pyc differ
diff --git a/walib/istsos/__init__.py b/walib/istsos/__init__.py
new file mode 100755
index 0000000..fcbeac0
--- /dev/null
+++ b/walib/istsos/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "istsos","services"]
diff --git a/walib/istsos/__init__.pyc b/walib/istsos/__init__.pyc
new file mode 100644
index 0000000..7da3530
Binary files /dev/null and b/walib/istsos/__init__.pyc differ
diff --git a/walib/istsos/istsos.py b/walib/istsos/istsos.py
new file mode 100755
index 0000000..2ec63ec
--- /dev/null
+++ b/walib/istsos/istsos.py
@@ -0,0 +1,264 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import resource, utils, databaseManager, configManager
+import sys, os
+import xml.etree.ElementTree as ET
+import urllib2
+
+
+class waIstsos(resource.waResourceAdmin):
+    def __init__(self, waEnviron):
+        resource.waResourceAdmin.__init__(self,waEnviron)
+        pass
+
+class waStatus(waIstsos):
+    """
+    Class to execute /istsos/operations/serverstatus
+    """
+    def __init__(self, waEnviron):
+        waIstsos.__init__(self,waEnviron)
+        pass  
+    def executeGet(self):
+        """
+        Execute GET request investigating set-up services
+                      
+        @note: This method creates a C{self.data} object in the form of a list of
+        dictionaries as below:
+            
+        >>> template = {"service" : None, 
+                        "offerings" : None,
+                        "procedures" : None,
+                        "observedProperties" : None,
+                        "featuresOfInterest" : None,
+                        "getCapabilities" : None,
+                        "describeSensor" : None,
+                        "getObservations" : None,
+                        "registerSensor" : None,
+                        "insertObservation" : None,
+                        "getFeatureOfInterest" : None,
+                        "availability" : "up"
+                        } 
+        """
+        services = utils.getServiceList(self.waconf.paths["services"],listonly=True)
+        data = []
+        for service in services:
+            srv = {}
+            srv["service"] = service
+            
+            #get service configuration
+            #-------------------------------------------------------------------
+            defaultcfgpath = os.path.join(self.waconf.paths["services"],"default.cfg")
+            servicecfgpath = os.path.join(self.waconf.paths["services"],service,service)+".cfg"
+            config = configManager.waServiceConfig(defaultcfgpath,servicecfgpath)
+            
+            #test if service is active (check answer to GetCapabilities)
+            #-------------------------------------------------------------------
+            if config.serviceurl["default"] == True:
+                urlget = config.serviceurl["url"] + "/" + service
+            else:
+                urlget = config.serviceurl["url"]
+            
+            request = "?request=getCapabilities&section=serviceidentification&service=SOS"
+                        
+            srv["availability"] = utils.verifyxmlservice(urlget+request)
+            
+            #test if connection is valid
+            #-------------------------------------------------------------------
+            connection = config.get("connection")
+            try:
+                servicedb = databaseManager.PgDB(connection['user'],
+                                            connection['password'],
+                                            connection['dbname'],
+                                            connection['host'],
+                                            connection['port']
+                )
+                srv["database"] = "active"
+            except:
+                srv["database"] = "not connectable"
+                srv["offerings"] = None
+                srv["procedures"] = None
+                srv["observedProperties"] = None
+                srv["featuresOfInterest"] = None
+            try:
+                #count offerings
+                #-------------------------------------------------------------------
+                srv["offerings"] = len(utils.getOfferingNamesList(servicedb,service))
+            except:
+                srv["offerings"] = None
+                
+            try:
+                #count procedures
+                #-------------------------------------------------------------------
+                srv["procedures"] = len(utils.getProcedureNamesList(servicedb,service,offering=None))
+            except:
+                srv["procedures"] = None
+            
+            try:
+                #count observed properties
+                #-------------------------------------------------------------------
+                srv["observedProperties"] = len(utils.getObsPropNamesList(servicedb,service,offering=None))
+            except:
+                srv["observedProperties"] = None
+                
+            try:
+                #count features of interest
+                #-------------------------------------------------------------------
+                srv["featuresOfInterest"] = len(utils.getFoiNamesList(servicedb,service,offering=None))
+            except:
+                srv["featuresOfInterest"] = None
+            
+            #get available requests
+            #-------------------------------------------------------------------
+            requests_ON = config.parameters["requests"].split(",")
+            for operation in ["getcapabilities","describesensor","getobservation",
+                                "getfeatureofinterest","insertobservation","registersensor"]:
+                if operation in requests_ON:
+                    srv[operation]=True
+                else:
+                    srv[operation]=False
+            data.append(srv)
+        self.setData(data)
+        self.setMessage("Serverstatus request successfully executed")
+            
+             
+        
+class waLog(waIstsos):
+    def __init__(self, waEnviron):
+        waIstsos.__init__(self,waEnviron)
+        pass  
+        
+class waAbout(waIstsos):
+
+    def __init__(self, waEnviron):
+        waIstsos.__init__(self,waEnviron)
+        
+    def executeGet(self):
+        from istsoslib import sos_version
+        #from walib import wa_version
+        import lib.requests as requests
+        
+        try:
+            import lib.requests as requests
+            response = requests.get("http://istsos.googlecode.com/svn/wiki/currentversion.wiki")
+            data = {}
+            try:
+                response.raise_for_status()
+                
+                lastVersion = response.json
+                data["istsos_version"] = str(sos_version.version)
+                data["latest_istsos_version"] = str(lastVersion["istsos_version"])
+                data["latest_istsos_changelog"] = str(lastVersion["istsos_changelog"])
+                data["download_url"] = "http://code.google.com/p/istsos/downloads/list"
+                
+                vnum_your_sos = int(data["istsos_version"].replace(".",""))
+                vnum_last_sos = int(data["latest_istsos_version"].replace(".",""))
+                
+                if vnum_last_sos > vnum_your_sos:
+                    data["istsos_message"] = "A new istsos version is available, check out the download page"
+                    data["istsos_update"] = True
+                else:
+                    data["istsos_message"] = "You have the latest istsos version installed"
+                    data["istsos_update"] = False
+                
+                self.setData(data)
+                self.setMessage("istSOS \"About\" information successfully retrived")
+                
+            except Exception as e:
+                
+                print >> sys.stderr, "Exception: %s" %  e
+                
+                data["istsos_version"] = str(sos_version.version)
+                data["latest_istsos_version"] = ""
+                data["latest_istsos_changelog"] = ""
+                data["download_url"] = "http://code.google.com/p/istsos/downloads/list"
+                
+                data["istsos_message"] = "updates not found"
+                data["istsos_update"] = False
+                
+                self.setData(data)
+                self.setMessage("Checking for updates failed")
+                
+        except:
+            self.setException("Error in retriving information")
+        
+class waValidatedb(waIstsos):
+    def __init__(self, waEnviron):
+        waIstsos.__init__(self,waEnviron)
+        
+    def executePost(self):
+        from walib.utils import validatedb
+        res={}
+        try:
+            test_conn = validatedb(self.json["user"],self.json["password"],self.json["dbname"],
+                                    self.json["host"],self.json["port"])
+            res["database"] = "active"
+        except:
+            res["database"] = "inactive"
+        self.setData(res)
+        self.setMessage("Database validation request successfully executed")
+        
+class waInitialization(waIstsos):
+    def __init__(self, waEnviron):
+        waIstsos.__init__(self,waEnviron)
+        
+    def executeGet(self):
+        try:
+            os.path.isdir(self.waconf.paths["istsos"])
+        except:
+            error = "istsos lib not found at path %s" % self.waconf.paths["istsos"]
+            print >> sys.stderr, error
+        try:
+            os.path.isdir(self.waconf.paths["services"])
+        except:
+            error = "services lib not found at path %s" % self.waconf.paths["services"]
+            print >> sys.stderr, error
+        defaultcfgpath = os.path.join(self.waconf.paths["services"],"default.cfg")
+        try:
+            os.path.isfile(defaultcfgpath)
+        except:
+            error = "default service configuration file at path %s" % defaultcfgpath
+            print >> sys.stderr, error
+        config = configManager.waServiceConfig(defaultcfgpath)
+    
+        self.setData({"level" : config.initialization["level"]})
+        if int(config.initialization["level"]) == 0:
+            self.setMessage("Your istsos has not been initializated jet")
+        else:
+            self.setMessage("Your istsos has been initializated")
+            
+    def executePut(self):
+        defaultcfgpath = os.path.join(self.waconf.paths["services"],"default.cfg")
+        config = configManager.waServiceConfig(defaultcfgpath)
+        config.put("initialization","level",self.json["level"])
+        config.save()
+        self.setMessage("Initializatuion level successfully recorded")
+
+
+            
+            
+            
+          
+        
+    
+
+
+
+
+
+
+
diff --git a/walib/istsos/istsos.pyc b/walib/istsos/istsos.pyc
new file mode 100644
index 0000000..be39fa3
Binary files /dev/null and b/walib/istsos/istsos.pyc differ
diff --git a/walib/istsos/services/__init__.py b/walib/istsos/services/__init__.py
new file mode 100755
index 0000000..5a02e2b
--- /dev/null
+++ b/walib/istsos/services/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "configsections","dataqualities","services","procedures","observedproperties","uoms","systemtypes"]
diff --git a/walib/istsos/services/__init__.pyc b/walib/istsos/services/__init__.pyc
new file mode 100644
index 0000000..ef51738
Binary files /dev/null and b/walib/istsos/services/__init__.pyc differ
diff --git a/walib/istsos/services/configsections/__init__.py b/walib/istsos/services/configsections/__init__.py
new file mode 100755
index 0000000..69310b7
--- /dev/null
+++ b/walib/istsos/services/configsections/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "configsections", "connection", "geo", "getobservation", "identification", "provider", "serviceurl","urn" ]
diff --git a/walib/istsos/services/configsections/__init__.pyc b/walib/istsos/services/configsections/__init__.pyc
new file mode 100644
index 0000000..f2fd930
Binary files /dev/null and b/walib/istsos/services/configsections/__init__.pyc differ
diff --git a/walib/istsos/services/configsections/configsections.py b/walib/istsos/services/configsections/configsections.py
new file mode 100755
index 0000000..c422181
--- /dev/null
+++ b/walib/istsos/services/configsections/configsections.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceService
+
+class waConfigsections(waResourceService):
+    """
+    Implementation of the configsection GET operation 
+    (if non configsection setted all the sections are returned)
+    """
+    def executeGet(self):
+        data = {}
+        for section in self.serviceconf.sections:
+            if section == "connection":
+                from walib.istsos.services.configsections import connection
+                sect = connection.waConnection(self.waEnviron)
+                data[section] = sect.executeGet()
+            if section == "identification":
+                from walib.istsos.services.configsections import identification
+                sect = identification.waIdentification(self.waEnviron)
+                data[section] = sect.executeGet()
+            if section == "geo":
+                from walib.istsos.services.configsections import geo
+                sect = geo.waGeo(self.waEnviron)
+                data[section] = sect.executeGet() 
+            if section == "getobservation":
+                from walib.istsos.services.configsections import getobservation
+                sect = getobservation.waGetobservation(self.waEnviron)
+                data[section] = sect.executeGet()
+            if section == "provider":
+                from walib.istsos.services.configsections import provider
+                sect = provider.waProvider(self.waEnviron)
+                data[section] = sect.executeGet()
+            if section == "serviceurl":
+                from walib.istsos.services.configsections import serviceurl
+                sect = serviceurl.waServiceurl(self.waEnviron)
+                data[section] = sect.executeGet()
+            if section == "urn":
+                from walib.istsos.services.configsections import urn
+                sect = urn.waUrn(self.waEnviron)
+                data[section] = sect.executeGet()
+        self.setData(data)
+        self.setMessage("List of sections successfully returned")
+        
+    def executePut(self):
+        import json
+        for section in self.json:
+            if section == "connection":
+                from walib.istsos.services.configsections import connection
+                self.waEnviron['wsgi_input'] = json.dumps(self.json[section])
+                sect = connection.waConnection(self.waEnviron)
+                sect.executePut()
+            if section == "identification":
+                from walib.istsos.services.configsections import identification
+                self.waEnviron['wsgi_input'] = json.dumps(self.json[section])
+                sect = identification.waIdentification(self.waEnviron)
+                sect.executePut()
+            if section == "geo":
+                from walib.istsos.services.configsections import geo
+                self.waEnviron['wsgi_input'] = json.dumps(self.json[section])
+                sect = geo.waGeo(self.waEnviron)
+                sect.executePut() 
+            if section == "getobservation":
+                from walib.istsos.services.configsections import getobservation
+                self.waEnviron['wsgi_input'] = json.dumps(self.json[section])
+                sect = getobservation.waGetobservation(self.waEnviron)
+                sect.executePut()
+            if section == "provider":
+                from walib.istsos.services.configsections import provider
+                self.waEnviron['wsgi_input'] = json.dumps(self.json[section])
+                sect = provider.waProvider(self.waEnviron)
+                sect.executePut()
+            if section == "serviceurl":
+                from walib.istsos.services.configsections import serviceurl
+                self.waEnviron['wsgi_input'] = json.dumps(self.json[section])
+                sect = serviceurl.waServiceurl(self.waEnviron)
+                sect.executePut()                
+        
+        self.setMessage("Configuration Sections successfully updated")
+
diff --git a/walib/istsos/services/configsections/configsections.pyc b/walib/istsos/services/configsections/configsections.pyc
new file mode 100644
index 0000000..3cee2d1
Binary files /dev/null and b/walib/istsos/services/configsections/configsections.pyc differ
diff --git a/walib/istsos/services/configsections/connection.py b/walib/istsos/services/configsections/connection.py
new file mode 100755
index 0000000..c97974a
--- /dev/null
+++ b/walib/istsos/services/configsections/connection.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceConfigurator, waResourceService
+
+class waConnection(waResourceConfigurator):
+    template = {
+        "user": ["connection","user"],
+        "password": ["connection","password"],
+        "host": ["connection","host"],
+        "port": ["connection","port"],
+        "dbname": ["connection","dbname"]
+    }
+
+    def executePut(self):
+        from walib.utils import validatedb
+        test = validatedb(self.json["user"],self.json["password"],self.json["dbname"],
+                                    self.json["host"],self.json["port"],self.service)
+        waResourceConfigurator.executePut(self)
+
+class waValidatedb(waResourceService):
+    """
+    Implementation of the operation/validatedb GET operation
+    """
+    def validateGet(self):
+        from walib.utils import validatedb
+        test = validatedb(self.serviceconf.connection["user"],
+                         self.serviceconf.connection["password"],
+                         self.serviceconf.connection["dbname"],
+                         self.serviceconf.connection["host"],
+                         self.serviceconf.connection["port"],
+                         self.service)
+    
+    def executeGet(self):
+        """
+        Test the connection parameters in the server/service configuration
+        """
+        self.validateGet()
+        self.setMessage("Configured connection parameters successfully tested")
diff --git a/walib/istsos/services/configsections/connection.pyc b/walib/istsos/services/configsections/connection.pyc
new file mode 100644
index 0000000..dcae483
Binary files /dev/null and b/walib/istsos/services/configsections/connection.pyc differ
diff --git a/walib/istsos/services/configsections/geo.py b/walib/istsos/services/configsections/geo.py
new file mode 100755
index 0000000..fcb5395
--- /dev/null
+++ b/walib/istsos/services/configsections/geo.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceConfigurator
+from walib import databaseManager
+
+class waGeo(waResourceConfigurator):
+    template = {
+        "allowedepsg" : ["geo","allowedEPSG"],
+        "istsosepsg" : ["geo","istsosepsg"],
+        "xaxisname" : ["geo","xAxisName"],
+        "yaxisname" : ["geo","yAxisName"],
+        "zaxisname" : ["geo","zAxisName"]
+    }
+
+    def validate(self):
+        
+        sql = "SELECT * FROM spatial_ref_sys WHERE auth_srid IN %s"
+        
+        aepsgs = map( int, [ self.json["istsosepsg"] ] + self.json["allowedepsg"].split(",") )
+        
+        params = (tuple(aepsgs),)
+        
+        servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+                
+        res = servicedb.select(sql,params)
+        
+        if not len(res)==len(aepsgs):
+            raise Exception("%s EPSG codes not valid in database srs list" %(list(set(aepsgs) - set([c[0] for c in res]) )))
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
diff --git a/walib/istsos/services/configsections/geo.pyc b/walib/istsos/services/configsections/geo.pyc
new file mode 100644
index 0000000..eda9ffd
Binary files /dev/null and b/walib/istsos/services/configsections/geo.pyc differ
diff --git a/walib/istsos/services/configsections/getobservation.py b/walib/istsos/services/configsections/getobservation.py
new file mode 100755
index 0000000..2f868f2
--- /dev/null
+++ b/walib/istsos/services/configsections/getobservation.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceConfigurator, waResourceService
+
+class waGetobservation(waResourceConfigurator):
+    template = {
+            "aggregatenodata" : ["getobservation","aggregate_nodata"],
+            "maxgoperiod" : ["getobservation","maxGoPeriod"],
+            "aggregatenodataqi" : ["getobservation","aggregate_nodata_qi"],
+            "defaultqi" : ["getobservation","default_qi"],
+            "correct_qi" : ["getobservation","correct_qi"],
+            "stat_qi" : ["getobservation","stat_qi"],
+            "transactional_log" :  ["getobservation","transactional_log"]
+    }
diff --git a/walib/istsos/services/configsections/getobservation.pyc b/walib/istsos/services/configsections/getobservation.pyc
new file mode 100644
index 0000000..667d40a
Binary files /dev/null and b/walib/istsos/services/configsections/getobservation.pyc differ
diff --git a/walib/istsos/services/configsections/identification.py b/walib/istsos/services/configsections/identification.py
new file mode 100755
index 0000000..447f86b
--- /dev/null
+++ b/walib/istsos/services/configsections/identification.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceConfigurator, waResourceService
+
+class waIdentification(waResourceConfigurator):
+    '''
+    [identification]
+    keywords = SOS,IST,SUPSI
+    abstract = hydro-meteorological monitoring network
+    authority = x-ist
+    urnversion = 1.0
+    fees = NONE
+    accessConstrains = NONE
+    title = IST Sensor Observation Service
+    '''
+    template = {
+            "title" : ["identification","title"],
+            "abstract" : ["identification","abstract"],
+            "authority" : ["identification","authority"],
+            "urnversion" : ["identification","urnversion"],
+            "fees" : ["identification","fees"],
+            "keywords" : ["identification","keywords"],
+            "accessconstrains" : ["identification","accessConstrains"]
+    }
+
diff --git a/walib/istsos/services/configsections/identification.pyc b/walib/istsos/services/configsections/identification.pyc
new file mode 100644
index 0000000..15f32e2
Binary files /dev/null and b/walib/istsos/services/configsections/identification.pyc differ
diff --git a/walib/istsos/services/configsections/provider.py b/walib/istsos/services/configsections/provider.py
new file mode 100755
index 0000000..4c205a1
--- /dev/null
+++ b/walib/istsos/services/configsections/provider.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceConfigurator, waResourceService
+import sys
+
+class waProvider(waResourceConfigurator):
+    '''
+    [provider]
+    contactCountry = Switzerland
+    providerName = Istituto Scienze della Terra
+    contactCity = Lugano
+    contactAdminArea = Canton Ticino
+    contactVoice = +4179123456
+    contactEmail = clark.kent at superman.com
+    contactDeliveryPoint = Via Cippili
+    contactName = Pinco Pallino
+    contactPostalCode = 6900
+    contactPosition = Data manager
+    providerSite = http://istgeo.ist.supsi.ch
+    contactFax = +4179123459
+    '''
+    template = {
+        "providername" : ["provider","providerName"],
+        "providersite" : ["provider","providerSite"],
+        "contactname" : ["provider","contactName"],
+        "contactposition" : ["provider","contactPosition"],
+        "contactdeliverypoint" : ["provider","contactDeliveryPoint"],
+        "contactpostalcode" : ["provider","contactPostalCode"],
+        "contactcity" : ["provider","contactCity"],
+        "contactadminarea" : ["provider","contactAdminArea"],
+        "contactcountry" : ["provider","contactCountry"],
+        "contactvoice" : ["provider","contactVoice"],
+        "contactfax" : ["provider","contactFax"],
+        "contactemail" : ["provider","contactEmail"]
+    }
+
diff --git a/walib/istsos/services/configsections/provider.pyc b/walib/istsos/services/configsections/provider.pyc
new file mode 100644
index 0000000..d7982ee
Binary files /dev/null and b/walib/istsos/services/configsections/provider.pyc differ
diff --git a/walib/istsos/services/configsections/serviceurl.py b/walib/istsos/services/configsections/serviceurl.py
new file mode 100755
index 0000000..fef5362
--- /dev/null
+++ b/walib/istsos/services/configsections/serviceurl.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceConfigurator
+
+class waServiceurl(waResourceConfigurator):
+    template = {
+        "url": ["serviceurl","url"]
+    }
\ No newline at end of file
diff --git a/walib/istsos/services/configsections/serviceurl.pyc b/walib/istsos/services/configsections/serviceurl.pyc
new file mode 100644
index 0000000..639fc02
Binary files /dev/null and b/walib/istsos/services/configsections/serviceurl.pyc differ
diff --git a/walib/istsos/services/configsections/urn.py b/walib/istsos/services/configsections/urn.py
new file mode 100755
index 0000000..2ee5745
--- /dev/null
+++ b/walib/istsos/services/configsections/urn.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceConfigurator, waResourceService
+import sys
+
+class waUrn(waResourceConfigurator):
+    template = {
+        "property" : ["urn","property"],
+        "offering" : ["urn","offering"],
+        "sensor" : ["urn","sensor"],
+        "phenomena" : ["urn","phenomena"],
+        "feature" : ["urn","feature"],
+        "sensorType" : ["urn","sensorType"],
+        "process" : ["urn","process"],
+        "role" : ["urn","role"],
+        "refsystem" : ["urn","refsystem"],
+        "dataType" : ["urn","dataType"],
+        "time" : ["urn","time"],
+        "keywords" : ["urn","keywords"],
+        "identifier" : ["urn","identifier"],
+        "parameter" : ["urn","parameter"],
+        "procedure" : ["urn","procedure"]
+    }
+    
+    def executeGet(self):
+        """
+        Execute operation GET for on service configuration sections
+        """
+        data = {
+            'default': True
+        }
+        identification = self.serviceconf.get("identification")
+        authority = identification["authority"]
+        urnversion = identification["urnversion"]
+        for key in self.template:
+            temp = self.serviceconf.get(self.template[key][0])
+            
+            if not temp.has_key(self.template[key][1]):
+                raise Exception("Configuration error: value \"%s\" not present in section \"%s\", check your template settings!" % (self.template[key][1],self.template[key][0]))
+            
+            #---SUBSTITUTED---------------------------------------------------
+            #data[key] = temp[self.template[key][1]].replace(
+            #                                "@identification-authority@",authority
+            #                                ).replace("@urnversion@",urnversion)
+            #---BY------------------------------------------------------------------
+            data[key] = temp[self.template[key][1]]
+            #-----------------------------------------------------------------------            
+        for s in self.sections:
+            data['default'] = data['default'] and self.serviceconf.get(s)["default"]
+        self.setData(data)
+        self.setMessage("Information successfully retrived")
+        return data
+
+    def executePost(self):
+        raise Exception("%s.executePost method is not implemented!" % self.__class__.__name__)
+        
+    def executePut(self):
+        raise Exception("%s.executePut method is not implemented!" % self.__class__.__name__)
+        
+    def executeDelete(self):
+        raise Exception("%s.executeDelete method is not implemented!" % self.__class__.__name__)
+        
+    
+    
+    
+    
diff --git a/walib/istsos/services/configsections/urn.pyc b/walib/istsos/services/configsections/urn.pyc
new file mode 100644
index 0000000..bdbcb45
Binary files /dev/null and b/walib/istsos/services/configsections/urn.pyc differ
diff --git a/walib/istsos/services/dataqualities/__init__.py b/walib/istsos/services/dataqualities/__init__.py
new file mode 100755
index 0000000..e1f71a0
--- /dev/null
+++ b/walib/istsos/services/dataqualities/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "dataqualities" ]
diff --git a/walib/istsos/services/dataqualities/dataqualities.py b/walib/istsos/services/dataqualities/dataqualities.py
new file mode 100755
index 0000000..7c5d7d4
--- /dev/null
+++ b/walib/istsos/services/dataqualities/dataqualities.py
@@ -0,0 +1,235 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import databaseManager
+from walib.resource import waResourceService
+import traceback
+
+class waDataqualities(waResourceService):
+    """class to handle SOS unit of data quality objects, support GET and POST method"""
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.dataquality = int(self.pathinfo[-1]) if not self.pathinfo[-1]=="dataqualities" else None
+
+    def executeGet(self):
+        """
+        Method for executing a GET requests that remove an existing SOS data quality
+        
+            .. note:: The GET must include code in the URL
+            
+            >>> http://localhost/istsos/wa/istsos/services/demo/dataqualities/1000
+        
+        """
+        
+        if self.service == "default":
+            raise Exception("dataqualities operation can not be done for default service instance.")
+            
+        else:
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+                
+            if self.dataquality:
+                sql = """ 
+                SELECT 
+                  id_qi as code,
+                  name_qi as name, 
+                  COALESCE(desc_qi,'') as description
+                FROM 
+                  %s.quality_index """ % (self.service)
+                sql += """WHERE id_qi = %s
+                GROUP BY id_qi, name_qi, desc_qi
+                ORDER BY 1"""
+                par = (self.dataquality,)
+                res = servicedb.select(sql,par)
+                data = []
+                if len(res)>0:
+                    for i in range(0,len(res)):
+                        procs = []
+                        data.append(
+                            {
+                                "code": res[i]['code'],
+                                "name": res[i]['name'],
+                                "description" : res[i]['description']
+                            }
+                        )
+                    self.setMessage("Data qualities of service <%s> successfully retrived" % self.service)
+                else:
+                    self.setMessage("There are not yet any data qualities in the %s database" % self.service)
+                self.setData(data)
+            else:     
+                sql = """ 
+                SELECT 
+                  id_qi as code,
+                  name_qi as name, 
+                  COALESCE(desc_qi,'') as description
+                FROM 
+                  %s.quality_index 
+                GROUP BY id_qi, name_qi, desc_qi
+                ORDER BY 1""" % (self.service)
+                
+                res = servicedb.select(sql)
+                data = []
+                if len(res)>0:
+                    for i in range(0,len(res)):
+                        procs = []
+                        data.append(
+                            {
+                                "code": res[i]['code'],
+                                "name": res[i]['name'],
+                                "description" : res[i]['description']
+                            }
+                        )
+                    self.setMessage("Data qualities of service <%s> successfully retrived" % self.service)
+                else:
+                    self.setMessage("There are not yet any data qualities in the %s database" % self.service)
+                self.setData(data)
+            
+    def executePost(self):
+        """
+        Method for executing a POST requests that create a new SOS data quality
+        
+            .. note:: The POST must be in Json format with mandatory code, name and description keys
+                
+            >>> http://localhost/istsos/wa/istsos/services/demo/dataqualities
+                    
+            >>> {
+                    "code": 100,
+                    "name": "raw",
+                    "description": "the format is correct"
+                }
+                  
+        """
+        if self.service == "default":
+            raise Exception("dataqualities operation can not be done for default service instance.")
+        else:
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])            
+            sql = "INSERT INTO %s.quality_index(id_qi, name_qi, desc_qi)" % self.service
+            sql += " VALUES (%s, %s, %s);"
+            par = (self.json['code'], self.json['name'],self.json['description'])
+            servicedb.execute(sql,par)
+            self.setMessage("")
+            
+    def executePut(self):
+        """
+        Method for executing a PUT requests that updates an existing SOS data quality
+        
+            .. note:: The PUT must be in Json format with mandatory name and description keys
+            
+            >>> http://localhost/istsos/wa/istsos/services/demo/dataqualities/1000
+                    
+            >>> {
+			        "name": "raw",
+			        "description": "the format is correct"
+		        }
+        """
+        if self.service == "default":
+            raise Exception("observedproperties operation can not be done for default service instance.")
+        elif self.dataquality == None:
+            raise Exception("destination quality index code is not specified.")
+        else:
+            #--check if quality index exists
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+            sql = "SELECT id_qi FROM %s.quality_index" % self.service
+            sql +=  " WHERE  id_qi = %s"
+            par = (self.dataquality,)
+            row = servicedb.select(sql, par)
+            if not row:
+                raise Exception("Quality index '%s' does not exist." % self.dataquality)
+            oid = row[0]["id_qi"] 
+            sql = "UPDATE %s.quality_index " % self.service
+            sql += "SET name_qi = %s, desc_qi=%s"
+            sql += " WHERE id_qi = %s"
+            par = (self.json['name'],self.json['description'],oid)
+            servicedb.execute(sql,par)
+            #--update quality index code if provided
+            if self.json['code'] and not self.json['code']==self.dataquality:
+                sql  = "UPDATE %s.quality_index" % self.service
+                sql += " SET id_qi = %s"
+                sql += " WHERE id_qi = %s"
+                par = (self.json['code'],self.dataquality)
+                servicedb.execute(sql,par)
+            self.setMessage("Quality Index successfully updated")
+        
+        
+    def executeDelete(self):
+        """
+        Method for executing a DELETE requests that remove an existing SOS data quality
+        
+            .. note:: The DELETE must include code in the URL
+            
+            >>> http://localhost/istsos/wa/istsos/services/demo/dataqualities/1000
+        
+        """
+        if self.service == "default":
+            raise Exception("dataqualities operation can not be done for default service instance.")
+        elif self.dataquality == None:
+            raise Exception("destination quality index code has to be specified.")
+        else:
+            #--check if quality index exists
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+            sql  = "SELECT id_qi FROM %s.quality_index" %(self.service)
+            sql += " WHERE id_qi = %s"
+            par = (self.dataquality,)
+            row = servicedb.select(sql, par)
+            if not row:
+                raise Exception("'%s' Quality index code does not exist." % self.dataquality)
+            oid = row[0]["id_qi"]
+            #--check if quality index is in use
+            sql  = "SELECT id_msr FROM %s.measures" %(self.service)
+            sql += " WHERE id_qi_fk=%s LIMIT 1"
+            use = servicedb.select(sql, (oid,))
+            if use:
+                raise Exception("'%s' Quality index code is in use." % self.dataquality)
+            #--erase quality index code
+            sql = "DELETE FROM %s.quality_index " % self.service
+            sql += " WHERE id_qi = %s;"
+            par = (oid,)
+            servicedb.execute(sql,par)
+            self.setMessage("Quality index successfully deleted")
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+        
diff --git a/walib/istsos/services/epsgs/__init__.py b/walib/istsos/services/epsgs/__init__.py
new file mode 100755
index 0000000..3ddc54b
--- /dev/null
+++ b/walib/istsos/services/epsgs/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "epsgs" ]
diff --git a/walib/istsos/services/epsgs/__init__.pyc b/walib/istsos/services/epsgs/__init__.pyc
new file mode 100644
index 0000000..c62cdf4
Binary files /dev/null and b/walib/istsos/services/epsgs/__init__.pyc differ
diff --git a/walib/istsos/services/epsgs/epsgs.py b/walib/istsos/services/epsgs/epsgs.py
new file mode 100755
index 0000000..d414aa3
--- /dev/null
+++ b/walib/istsos/services/epsgs/epsgs.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import resource, utils, databaseManager, configManager
+from walib.resource import waResourceService
+import sys, os
+from lib import isodate
+
+class waEpsgs(waResourceService):
+    """class to handle SOS service objects, support GET and POST method"""
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        
+    def executeGet(self):
+        """
+        Method for executing a GET requests that return a list of valid EPSG codes
+                          
+        """
+        data = [{
+            "name": self.serviceconf.geo["istsosepsg"]
+        }]
+        for epsg in self.serviceconf.geo["allowedEPSG"].split(","):
+            data.append({
+                "name": epsg
+            })
+        
+        #self.setData( [ self.serviceconf.geo["istsosepsg"] ] + self.serviceconf.geo["allowedEPSG"].split(",") )
+        self.setData(data)
+        self.setMessage("List of valid EPSG codes of service <%s> successfully retrived" % self.service)
+        
+        
+        
+        
+        
diff --git a/walib/istsos/services/epsgs/epsgs.pyc b/walib/istsos/services/epsgs/epsgs.pyc
new file mode 100644
index 0000000..1fffdeb
Binary files /dev/null and b/walib/istsos/services/epsgs/epsgs.pyc differ
diff --git a/walib/istsos/services/observedproperties/__init__.py b/walib/istsos/services/observedproperties/__init__.py
new file mode 100755
index 0000000..4498650
--- /dev/null
+++ b/walib/istsos/services/observedproperties/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "observedproperties"]
diff --git a/walib/istsos/services/observedproperties/observedproperties.py b/walib/istsos/services/observedproperties/observedproperties.py
new file mode 100755
index 0000000..8eb3198
--- /dev/null
+++ b/walib/istsos/services/observedproperties/observedproperties.py
@@ -0,0 +1,280 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import databaseManager #, procedure, resource, utils, configManager
+from walib.resource import waResourceService
+#import sys, os, shutil, errno
+#from walib.resource import waResourceConfigurator, waResourceService
+#import traceback
+
+class waObservedproperties(waResourceService):
+    """class to handle SOS service objects, support GET and POST method"""
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.observedproperty = self.pathinfo[-1] if not self.pathinfo[-1]=="observedproperties" else None
+
+    def executeGet(self):
+        if self.service == "default":
+            raise Exception("observedproperties operation can not be done for default service instance.")
+        else:
+            import json
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+                
+            # Loading single observed properties details
+            if self.observedproperty:                 
+                sql = """ 
+                SELECT 
+                  name_opr as name, 
+                  def_opr as definition, 
+                  COALESCE(desc_opr,'') as description, 
+                  array_to_string(array_agg(name_prc), ',') as procedures,
+                  constr_opr as constraint
+                FROM 
+                  %s.observed_properties
+                LEFT JOIN (
+                  SELECT id_opr_fk, name_prc 
+                  FROM %s.proc_obs,%s.procedures
+                  WHERE id_prc=id_prc_fk
+                ) AS b 
+                ON id_opr = id_opr_fk """ % ((self.service,)*3)
+                sql += """WHERE def_opr = %s
+                GROUP BY name_opr, def_opr, desc_opr, constr_opr
+                ORDER BY 1""" 
+                par = (self.observedproperty,)
+                res = servicedb.select(sql,par)
+                data = []
+                
+                if len(res)>0:
+                    for i in range(0,len(res)):
+                        procs = []
+                        if res[i]['procedures']:
+                            procs = res[i]['procedures'].split(",")
+                        
+                        try:
+                            constraint = json.loads(res[i]['constraint'])
+                        except:
+                            constraint = None
+                            
+                        data.append(
+                            {
+                                "name": res[i]['name'],
+                                "definition": res[i]['definition'],
+                                "description" : res[i]['description'],
+                                "procedures" : procs,
+                                "constraint" : constraint
+                            }
+                        )
+                    self.setMessage("Observed properties of service <%s> successfully retrived" % self.service)
+                else:
+                    self.setMessage("There are not yet any observed properties in the %s database" % self.service)
+                self.setData(data)
+            else:
+                sql = """ 
+                SELECT 
+                  name_opr as name, 
+                  def_opr as definition, 
+                  COALESCE(desc_opr,' ') as description, 
+                  array_to_string(array_agg(name_prc), ',') as procedures,
+                  constr_opr as constraint
+                FROM 
+                  %s.observed_properties
+                LEFT JOIN (
+                  SELECT id_opr_fk, name_prc 
+                  FROM %s.proc_obs,%s.procedures
+                  WHERE id_prc=id_prc_fk
+                ) AS b 
+                ON id_opr = id_opr_fk
+                GROUP BY name_opr, def_opr, desc_opr, constr_opr
+                ORDER BY 1
+                """ %((self.service,)*3)
+                res = servicedb.select(sql)
+                data = []
+                if len(res)>0:
+                    for i in range(0,len(res)):
+                        procs = []
+                        if res[i]['procedures']:
+                            procs = res[i]['procedures'].split(",")
+                            
+                        try:
+                            constraint = json.loads(res[i]['constraint'])
+                        except:
+                            constraint = None
+                            
+                        data.append(
+                            {
+                                "name": res[i]['name'],
+                                "definition": res[i]['definition'],
+                                "description" : res[i]['description'],
+                                "procedures" : procs,
+                                "constraint" : constraint
+                            }
+                        )
+                    self.setMessage("Observed properties of service <%s> successfully retrived" % self.service)
+                else:
+                    self.setMessage("There are not yet any observed properties in the %s database" % self.service)
+                self.setData(data)
+            
+    
+    def executePost(self):
+        """
+        Method for executing a POST requests that create a new SOS observed property
+                  
+        """
+        if self.service == "default":
+            raise Exception("observedproperties operation can not be done for default service instance.")
+        else:
+            import json
+            from walib import utils as ut
+            
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])     
+                
+            sql = "INSERT INTO %s.observed_properties(name_opr, def_opr, desc_opr, constr_opr)" % self.service
+            
+            
+            if not self.json['constraint'] or self.json['constraint'] == {}:
+                sql += " VALUES (%s, %s, %s, NULL);"
+                par = (
+                    self.json['name'],
+                    self.json['definition'],
+                    self.json['description']
+                )
+            else:
+                try:
+                    ut.validateJsonConstraint(self.json['constraint'])
+                except Exception as ex:
+                    raise Exception("Constraint for observed property '%s' is not valid: %s" % (self.observedproperty,ex))   
+                sql += " VALUES (%s, %s, %s, %s);"
+                par = (
+                    self.json['name'],
+                    self.json['definition'],
+                    self.json['description'],
+                    json.dumps(self.json['constraint'])
+                )
+
+            servicedb.execute(sql,par)
+            self.setMessage("Insert successfull")
+            
+            
+    def executePut(self):
+        """
+        Method for executing a POST requests that create a new SOS observed property
+        """
+        if self.service == "default":
+            raise Exception("observedproperties operation can not be done for default service instance.")
+        elif self.observedproperty == None:
+            raise Exception("destination observedproperty is not specified.")
+        else:
+            import json
+            from walib import utils as ut
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+            sql = "SELECT id_opr FROM %s.observed_properties " % self.service
+            sql +=  "WHERE  def_opr = %s"
+            par = (self.observedproperty,)
+            row = servicedb.select(sql, par)
+            if not row:
+                raise Exception("Original observed property '%s' does not exist." % self.observedproperty)
+            oid = row[0]["id_opr"]
+            
+            sql = "UPDATE %s.observed_properties " % self.service
+            
+            if not self.json['constraint'] or self.json['constraint'] == {}:
+                sql += "SET name_opr = %s, def_opr = %s, desc_opr=%s, constr_opr=NULL "
+                par = (
+                    self.json['name'],
+                    self.json['definition'],
+                    self.json['description'],
+                    oid
+                )
+            else:
+                try:
+                    ut.validateJsonConstraint(self.json['constraint'])
+                except Exception as ex:
+                    raise Exception("Constraint for observed property '%s' is not valid: %s" % (self.observedproperty,ex))
+                sql += "SET name_opr = %s, def_opr = %s, desc_opr=%s, constr_opr=%s "
+                par = (
+                    self.json['name'],
+                    self.json['definition'],
+                    self.json['description'],
+                    json.dumps(self.json['constraint']),
+                    oid
+                )
+            sql += "WHERE id_opr = %s"
+            
+            servicedb.execute(sql,par)
+            self.setMessage("Update successfull")
+        
+        
+    def executeDelete(self):
+        """
+        Method for executing a DELETE requests that remove an existing SOS observed property
+                  
+        """
+        if self.service == "default":
+            raise Exception("observedproperties operation can not be done for default service instance.")
+        elif self.observedproperty == None:
+            raise Exception("destination observedproperty has to be specified.")
+        else:
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+            sql = """
+                SELECT id_opr, COALESCE(procCount,0) as counter
+                FROM 
+                  %s.observed_properties
+                LEFT JOIN (
+                  SELECT id_opr_fk, count(id_opr_fk) as procCount
+                  FROM %s.proc_obs
+                  GROUP BY id_opr_fk
+                ) AS b 
+                ON id_opr = id_opr_fk """ %((self.service,)*2)
+            sql += "WHERE def_opr = %s"
+            par = (self.observedproperty,)
+            row = servicedb.select(sql, par)
+            if not row:
+                raise Exception("'%s' observed property does not exist." % self.observedproperty)
+            oid = row[0]["id_opr"]
+            counter = row[0]["counter"]
+            if counter > 0:
+                if counter == 1:
+                    raise Exception("There is %s procedure connected with '%s' observed property " % (counter,self.observedproperty))
+                else:
+                    raise Exception("There are %s procedures connected with '%s' observed property " % (counter,self.observedproperty))
+            sql = "DELETE FROM %s.observed_properties " % self.service
+            sql += " WHERE id_opr = %s;"
+            par = (oid,)
+            servicedb.execute(sql,par)
+            self.setMessage("Observed property is deleted")
+
diff --git a/walib/istsos/services/offerings/__init__.py b/walib/istsos/services/offerings/__init__.py
new file mode 100755
index 0000000..6f3e59c
--- /dev/null
+++ b/walib/istsos/services/offerings/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "offerings"]
diff --git a/walib/istsos/services/offerings/__init__.pyc b/walib/istsos/services/offerings/__init__.pyc
new file mode 100644
index 0000000..1274bef
Binary files /dev/null and b/walib/istsos/services/offerings/__init__.pyc differ
diff --git a/walib/istsos/services/offerings/offerings.py b/walib/istsos/services/offerings/offerings.py
new file mode 100755
index 0000000..1cd255e
--- /dev/null
+++ b/walib/istsos/services/offerings/offerings.py
@@ -0,0 +1,242 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import resource, utils, databaseManager, configManager
+from walib.resource import waResourceService
+import sys, os
+from lib import isodate
+
+class waOfferings(waResourceService):
+    """class to handle SOS offerings objects, support GET, POST, PUT and DELETE method"""
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        
+        
+    def executePost(self,db=True):
+        """
+        Method for executing a POST requests that initialize a new SOS service
+                      
+        @note: This method creates a new istSOS offering
+        
+        The POST must be in Json format with mandatory offering key:
+                
+        >>> {
+                "offering" : "meteorology", 
+                "description" : "meteo information"
+                "expiration" : "2012-12-30T12:00"
+                "active" : "sos_db"
+            } 
+        """
+        servicedb = databaseManager.PgDB(
+                        self.serviceconf.connection["user"],
+                        self.serviceconf.connection["password"],
+                        self.serviceconf.connection["dbname"],
+                        self.serviceconf.connection["host"],
+                        self.serviceconf.connection["port"]
+                        )
+        
+        #insert new offering in db
+        try:
+            sql  = "INSERT INTO %s.offerings" % self.service
+            sql += " (name_off,desc_off,expiration_off,active_off)"
+            sql += " VALUES (%s, %s, %s, %s)"
+        
+            name = self.json["name"]
+            try:
+                desc = self.json["description"]
+            except:
+                desc = None
+            try:
+                exp = isodate.parse_datetime(self.json["expiration"])
+            except:
+                exp = None
+            try:
+                act = self.json["active"]
+            except:
+                act = False
+            
+            pars = (name,desc,exp,act)
+            
+            servicedb.execute(sql,pars)
+            self.setMessage("new offering successfully added")            
+            
+        except Exception as e:
+            self.setException("Error in adding new offering: %s" % e)
+        
+
+    def executeDelete(self):
+        """
+        Method for executing a DELETE requests that erase a SOS offering
+                          
+            @note: This method delete the offering (temporary offering cannot be deleted!)
+                
+            
+            The POST must be in Json format with mandatory service key
+                    
+            >>> {
+                    "service" : "service_name"
+                } 
+        """
+        if self.service == "default":
+            raise Exception("offerings DELETE operation can not be done for 'default' service instance.")
+            
+        
+        try:
+        
+            self.offering = self.pathinfo[(self.pathinfo.index("offerings")+1)]
+            
+            if self.offering == 'temporary':
+                raise Exception("'temporary' offerings cannot be deleted")
+            
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection["user"],
+                self.serviceconf.connection["password"],
+                self.serviceconf.connection["dbname"],
+                self.serviceconf.connection["host"],
+                self.serviceconf.connection["port"]
+            )
+                        
+            sql  = "DELETE FROM %s.offerings" % self.service
+            sql += " WHERE name_off=%s"
+            params = (self.offering,)
+        
+            servicedb.execute(sql,params)
+            self.setMessage("offering '%s' successfully deleted")            
+            
+        except Exception as e:
+            self.setException("Error in deleting offering: %s" % e)
+        
+        
+    def executePut(self):
+        """
+        Method for executing a PUT requests that rename a SOS service
+                          
+            @note: This method renames:
+                1. create a new service folder, 
+                2. copy content from old to new service configuration file
+                3. rename the databse schema
+                4. delete old service files
+            
+            The POST must be in Json format with mandatory service key
+                    
+            >>> {
+                    "service" : "service_name"
+                } 
+        """
+        
+        if self.service == "default":
+            raise Exception("offerings PUT operation can not be done for 'default' service instance.")
+            
+        try:                
+            self.offering = self.pathinfo[(self.pathinfo.index("offerings")+1)]
+            
+            if self.offering == 'temporary' and self.offering != self.json["name"]:
+                raise Exception("'temporary' offering name cannot be updated")
+                    
+            servicedb = databaseManager.PgDB(
+                            self.serviceconf.connection["user"],
+                            self.serviceconf.connection["password"],
+                            self.serviceconf.connection["dbname"],
+                            self.serviceconf.connection["host"],
+                            self.serviceconf.connection["port"]
+                            )
+        
+            sql  = "UPDATE %s.offerings" % self.service
+            sql += " SET name_off = %s, desc_off = %s, expiration_off = %s , active_off = %s "
+            sql += " WHERE name_off = %s"
+        
+            name = self.json["name"]
+            desc = self.json["description"]
+            
+            try:
+                exp = isodate.parse_datetime(self.json["expiration"])
+            except:
+                exp = None
+            try:
+                act = True if (self.json.has_key("active") and self.json["active"]=='on') else False
+            except:
+                act = False
+            
+            pars = (name,desc,exp,act,self.offering)
+            
+            servicedb.execute(sql,pars)
+            self.setMessage("offering successfully updated")
+            
+        except Exception as e:
+            self.setException("Error in updating an offering: %s" % e)
+        
+    def executeGet(self):
+        """
+        Method for executing a GET requests that return a list of offerings details
+                          
+            
+            The data is returned in this format:
+                    
+            >>> {
+                    "total": 1,
+                    "success": true,
+                    "message": "Offerings details data loaded correctly",
+                    "data": [
+                        {
+                            "name": "temporary",
+                            "description": "descrizione 1",
+                            "procedures": 31,
+                            "expiration": "31.01.2012",
+                            "active": true
+                        },{...}
+                    ]
+                }
+        """
+        if self.service == "default":
+            raise Exception("offerings operation can not be done for 'default' service instance.")
+        else:
+            self.setData(utils.getOfferingDetailsList(
+                databaseManager.PgDB(self.serviceconf.connection['user'],
+                                            self.serviceconf.connection['password'],
+                                            self.serviceconf.connection['dbname'],
+                                            self.serviceconf.connection['host'],
+                                            self.serviceconf.connection['port']
+                ),self.service))
+            if self.response['total']>0:
+                self.setMessage("Offerings of service \"%s\" successfully retrived" % self.service)
+            else:
+                self.setMessage("There aren't Offerings for service \"%s\"" % self.service)
+
+class waGetlist(waResourceService):
+    """
+    class to handle SOS offerings objects, support only GET method
+    """
+        
+    def executeGet(self):
+        
+        if self.service == "default":
+            raise Exception("offerings operation can not be done for 'default' service instance.")
+        else:
+            self.setData(utils.getOfferingNamesList(
+                databaseManager.PgDB(self.serviceconf.connection['user'],
+                                            self.serviceconf.connection['password'],
+                                            self.serviceconf.connection['dbname'],
+                                            self.serviceconf.connection['host'],
+                                            self.serviceconf.connection['port']
+                ),self.service))
+            if self.response['total']>0:
+                self.setMessage("Offerings names of service \"%s\" successfully retrived" % self.service)
+            else:
+                self.setMessage("There aren't Offerings for service \"%s\"" % self.service)
+            
+        
diff --git a/walib/istsos/services/offerings/offerings.pyc b/walib/istsos/services/offerings/offerings.pyc
new file mode 100644
index 0000000..7a1744d
Binary files /dev/null and b/walib/istsos/services/offerings/offerings.pyc differ
diff --git a/walib/istsos/services/offerings/procedures/__init__.py b/walib/istsos/services/offerings/procedures/__init__.py
new file mode 100755
index 0000000..dd8fd91
--- /dev/null
+++ b/walib/istsos/services/offerings/procedures/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "procedures" ]
diff --git a/walib/istsos/services/offerings/procedures/__init__.pyc b/walib/istsos/services/offerings/procedures/__init__.pyc
new file mode 100644
index 0000000..b26b33f
Binary files /dev/null and b/walib/istsos/services/offerings/procedures/__init__.pyc differ
diff --git a/walib/istsos/services/offerings/procedures/procedures.py b/walib/istsos/services/offerings/procedures/procedures.py
new file mode 100755
index 0000000..4b8a74a
--- /dev/null
+++ b/walib/istsos/services/offerings/procedures/procedures.py
@@ -0,0 +1,184 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import utils, databaseManager
+from walib.resource import waResourceService
+
+class waProcedures(waResourceService):
+    """class to handle SOS procedures objects in related to an offering, support GET and POST method"""
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.offering = self.pathinfo[(self.pathinfo.index("offerings")+1)]
+    
+    def executePost(self):
+        """
+        Method for executing a POST requests that initialize a new SOS service
+                      
+        @note: This method creates a new istSOS offering
+        
+        The POST must be in Json format with mandatory offering key:
+                
+        >>> [
+                {
+                    "offerings": "meteo",
+                    "procedure": "RAIN_SENSOR_2"
+                },{
+                    "offerings": "meteo",
+                    "procedure": "RAIN_SENSOR_1"
+                }
+            ] 
+        """
+        # Preparing select for extracting the offering id
+        sqlIdOff = "(SELECT id_off FROM %s.offerings" % self.service
+        sqlIdOff += " WHERE name_off = %(name_off)s)"
+        
+        # Preparing select for extracting the procedure id
+        sqlIdPrc = "(SELECT id_prc FROM %s.procedures" % self.service
+        sqlIdPrc += " WHERE name_prc = %(name_prc)s)"
+        
+        sql  = "INSERT INTO %s.off_proc (id_off_fk,id_prc_fk) " % self.service
+        sql += """VALUES (%s, %s)""" % (sqlIdOff,sqlIdPrc)
+        
+        pars = ()
+        for j in self.json:
+            pars = pars + (
+                {
+                    "name_off": j["offering"],
+                    "name_prc": j["procedure"]
+                },
+            )
+        databaseManager.PgDB(
+            self.serviceconf.connection["user"],
+            self.serviceconf.connection["password"],
+            self.serviceconf.connection["dbname"],
+            self.serviceconf.connection["host"],
+            self.serviceconf.connection["port"]
+        ).insertMany(sql,pars)
+        
+        self.setMessage("new offering successfully added")
+    
+    def executeDelete(self):
+        """
+        Method for executing a DELETE requests remove an offering procedure member
+        """
+        
+        self.procedure = self.pathinfo[(self.pathinfo.index("procedures")+1)]
+        
+        # Preparing select for extracting the offering id
+        sqlIdOff = "(SELECT id_off FROM %s.offerings" % self.service
+        sqlIdOff += " WHERE name_off = %s)"
+        
+        # Preparing select for extracting the procedure id
+        sqlIdPrc = "(SELECT id_prc FROM %s.procedures" % self.service
+        sqlIdPrc += " WHERE name_prc = %s)"
+        
+        sql  = "DELETE FROM %s.off_proc " % self.service
+        sql += "WHERE id_off_fk = %s AND id_prc_fk = %s" % (sqlIdOff,sqlIdPrc)
+        
+        pars = (self.offering, self.procedure)
+        
+        databaseManager.PgDB(
+            self.serviceconf.connection["user"],
+            self.serviceconf.connection["password"],
+            self.serviceconf.connection["dbname"],
+            self.serviceconf.connection["host"],
+            self.serviceconf.connection["port"]
+        ).execute(sql,pars)
+        
+        self.setMessage("Offering member successfully removed")
+        
+        
+        
+
+class waMemberslist(waProcedures):
+    """
+    class to handle SOS offerings objects, support only GET method
+    """
+    def executeGet(self):
+        if self.service == "default":
+            raise Exception("offerings operation can not be done for 'default' service instance.")
+        else:
+            dbm = databaseManager.PgDB(self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port']
+            )
+            data = []
+            procs = utils.getProcedureNamesList(dbm,self.service,self.offering)
+            for proc in procs:
+                elem = {}
+                elem["name"] = proc["name"]
+                ops = utils.getObservedPropertiesFromProcedure(dbm,self.service,proc["name"])
+                if ops != None:
+                    elem["observedproperties"] = [ {"name" : op["name"], "uom" : op["uom"]  } for op in ops ]
+                else:
+                    elem["observedproperties"] = []
+                offs = utils.getOfferingsFromProcedure(dbm,self.service,proc["name"])
+                if offs != None:
+                    elem["offerings"] = [ off["name"] for off in offs ]
+                else:
+                    elem["offerings"] = []
+                data.append(elem)
+            self.setData(data)
+            self.setMessage("Offerings names of service <%s> successfully retrived" % self.service)
+            
+class waNonmemberslist(waProcedures):
+    """
+    class to handle SOS offerings objects, support only GET method
+    """
+    def executeGet(self):
+        if self.service == "default":
+            raise Exception("offerings operation can not be done for 'default' service instance.")
+        else:            
+            sql  = """
+                SELECT 	id_prc, name_prc, desc_prc 
+                FROM 	%s.procedures
+                WHERE 	NOT EXISTS
+	                (
+	                SELECT 	id_prc_fk
+	                FROM 	%s.off_proc, %s.offerings""" %((self.service,)*3)
+            sql += """ 
+	                WHERE	id_off = id_off_fk
+	                AND	id_prc_fk = id_prc
+	                AND	name_off = %s
+	                )
+                ORDER BY 
+	                name_prc;"""
+                
+            rows = databaseManager.PgDB(self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port']
+            ).select(sql,(self.offering,))
+            
+            if rows:
+                self.setMessage("Non members procedures list of service %s, offering %s successfully retrived" % (self.service,self.offering))
+                self.setData( [
+                    {
+                        "id": row["id_prc"], 
+                        "name": row["name_prc"], 
+                        "description": row["desc_prc"]
+                    } for row in rows
+                ])
+            else:
+                self.setData([])
+                self.setMessage("Non members procedures list of service %s, offering %s is empty" % (self.service,self.offering))
+            
+               
+        
diff --git a/walib/istsos/services/offerings/procedures/procedures.pyc b/walib/istsos/services/offerings/procedures/procedures.pyc
new file mode 100644
index 0000000..69a389b
Binary files /dev/null and b/walib/istsos/services/offerings/procedures/procedures.pyc differ
diff --git a/walib/istsos/services/procedures/__init__.py b/walib/istsos/services/procedures/__init__.py
new file mode 100755
index 0000000..dd8fd91
--- /dev/null
+++ b/walib/istsos/services/procedures/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "procedures" ]
diff --git a/walib/istsos/services/procedures/__init__.pyc b/walib/istsos/services/procedures/__init__.pyc
new file mode 100644
index 0000000..d66d0e2
Binary files /dev/null and b/walib/istsos/services/procedures/__init__.pyc differ
diff --git a/walib/istsos/services/procedures/procedures.py b/walib/istsos/services/procedures/procedures.py
new file mode 100755
index 0000000..9d1d054
--- /dev/null
+++ b/walib/istsos/services/procedures/procedures.py
@@ -0,0 +1,619 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import procedure, utils, databaseManager
+from walib.resource import waResourceService
+import lib.requests as requests
+import os
+import sys
+
+class waProcedures(waResourceService):
+    """class to handle SOS service objects, support GET and POST method"""
+
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.servicename = self.pathinfo[2]
+        if not self.pathinfo[-1]=="procedures" and len(self.pathinfo)>4:
+            self.procedurename = self.pathinfo[4]
+        else:
+            self.procedurename = None
+
+    def executePost(self,db=True):
+        """
+        Method for executing a POST requests that create a new SOS procedure
+
+        @note: This method creates:
+            1. Create a new procedure sending an XML to the istsos service
+
+        The POST must be in Json format:
+
+        >>> {
+                "system_id": "P_TRE",
+                "system": "P_TRE",
+                "description": "ciao",
+                "keywords": "uno,due,tre",
+                "identification": [
+                    {
+                        "definition":"urn:ogc:def:identifier:OGC:P_TRE",
+                        "name":"uniqueID",
+                        "value":"urn:ogc:def:procedure:x-istsos:1.0:test"
+                    }
+                ],
+                "classification": [
+                    {
+                        "name": "System Type",
+                        "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType",
+                        "value": "insitu-fixed-point"
+                    },
+                    {
+                        "name": "Sensor Type",
+                        "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType",
+                        "value": "bukket"
+                    }
+                ],
+                "characteristics": "",
+                "contacts": [],
+                "documentation": [],
+                "location": {
+                    "type": "Feature",
+                    "geometry": {
+                        "type": "Point",
+                        "coordinates": ["123","456"]
+                    },
+                    "crs": {
+                        "type": "name",
+                        "properties": {"name": "EPSG:21781"}
+                    },
+                    "properties": {"name": "LUGANO"}
+                },
+                "interfaces": "",
+                "inputs": [],
+                "history": [],
+                "capabilities": [
+                    {
+                        "name": "Memory Capacity",
+                        "description": "",
+                        "definition": "urn:ogc:def:classifier:x-istsos:1.0:memoryCapacity",
+                        "uom": "Byte",
+                        "value": "131"
+                    },
+                    {
+                        "name": "Sampling time resolution",
+                        "definition": "urn:ogc:def:classifier:x-istsos:1.0:samplingTimeResolution",
+                        "uom": "iso8601",
+                        "value": "PT10M"
+                    },
+                    {
+                        "name": "Acquisition time resolution",
+                        "definition": "urn:ogc:def:classifier:x-istsos:1.0:acquisitionTimeResolution",
+                        "uom": "iso8601",
+                        "value": "PT1H"
+                    }
+                ],
+                "outputs": [
+                    {
+                        "name": "Time",
+                        "definition": "urn:ogc:def:dataType:x-istsos:1.0:time",
+                        "uom": "iso8601",
+                        "description": "",
+                        "constraint": {
+                            "role": "urn:ogc:def:classifiers:x-istsos:1.0:dataAvailability",
+                            "min": "",
+                            "max": "",
+                            "interval": [123,456],
+                            "valuelist": ""
+                        }
+                    },
+                    {
+                        "name": "Conductivity",
+                        "definition": "urn:ogc:def:phenomenon:x-istsos:1.0:conductivity",
+                        "uom": "Pressure",
+                        "description": "foo bar",
+                        "constraint": {
+                            "role": "urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable",
+                            "interval": ["12","65"]
+                        }
+                    }
+                ]
+            }
+        """
+        #verify no service name in url
+        if not self.procedurename==None:
+            raise Exception("POST action with url procedure name not supported")
+
+        proc = procedure.Procedure(self.serviceconf)
+
+        # Workaround for uniqueID requirement
+        '''if type(self.json['identification']) == type([]):
+            for identification in self.json['identification']:
+                uniqueidPresent = False
+                if identification['definition'] == 'urn:ogc:def:identifier:OGC:uniqueID':
+                    uniqueidPresent = True
+                    break
+            if not uniqueidPresent:
+                self.json['identification'].append({
+                    "definition":'urn:ogc:def:identifier:OGC:uniqueID',
+                    "name":"uniqueID",
+                    "value":"%s:%s" % (self.serviceconf.urn['procedure'],self.json['system_id'])
+                })
+        else:
+            self.json['identification'] = [
+                {
+                    "definition":'urn:ogc:def:identifier:OGC:uniqueID',
+                    "name":"uniqueID",
+                    "value":"%s:%s" % (self.serviceconf.urn['procedure'],self.json['system_id'])
+                }
+            ]'''
+
+        proc.loadDICT(self.json)
+        smlstring = proc.toRegisterSensor(indent=False)
+
+        #import pprint
+        #pp = pprint.PrettyPrinter(indent=4)
+        
+        #print >> sys.stderr, "\n\nSML: %s" % smlstring
+        #print >> sys.stderr, "\n\nSML: %s" % pp.pprint(self.json)
+        
+        response = requests.post(
+            self.serviceconf.serviceurl["url"],
+            data=smlstring,
+            headers={"Content-type": "text/xml"},
+            prefetch=True
+        )
+
+        try:
+            response.raise_for_status() # raise exception if som comunication error occured
+            if response.text.find("AssignedSensorId")>0:
+                self.setMessage("%s" % response.text)
+            else:
+                self.setException("Register sensor failed - Communication: %s - Response: %s"
+                                    %(response.status_code, response.text))
+        except Exception as e:
+            self.setException("Register sensor failed - Communication: %s %s - Response: %s"
+                                    %(response.status_code, e, response.text))
+
+
+    def executeDelete(self):
+        """
+        Method for executing a DELETE requests that erase a SOS procedure
+
+            @note: This method delete:
+                1. the given procedure
+
+        """
+        if self.procedurename==None:
+            raise Exception("DELETE action without url procedure name not supported")
+
+        try:
+            servicedb = databaseManager.PgDB(self.serviceconf.connection['user'],
+                                            self.serviceconf.connection['password'],
+                                            self.serviceconf.connection['dbname'],
+                                            self.serviceconf.connection['host'],
+                                            self.serviceconf.connection['port']
+            )
+
+            #DELETE from database in transaction
+            sql  = "DELETE from %s.procedures" % self.service
+            sql += " WHERE name_prc = %s"
+            params = (self.procedurename,)
+            servicedb.executeInTransaction(sql,params)
+
+            #DELETE sensorML
+            procedureMLpath = os.path.join(self.sensormlpath,self.procedurename+".xml")
+            os.remove(procedureMLpath)
+
+           #COMMIT transaction
+            servicedb.commitTransaction()
+            self.setMessage("Procedure '%s' successfully deleted" % self.procedurename)
+        except Exception as e:
+            self.setException("%s" %e)
+
+
+    def executePut(self):
+        """
+        Method for executing a PUT requests that update a SOS sensorML procedure
+
+            @note: This method replace old sensorML with the new one, note that
+                    database objectes are not updated. To update entirely a procedure
+                    consider to delete and recreate it.
+                1. ...
+
+            The Put must be in Json format:
+
+            >>> {
+                    ...
+                }
+        """
+
+        proc = procedure.Procedure()
+        proc.loadDICT(self.json)
+
+        '''if proc.data['system'] == self.procedurename:
+
+            smlstring = proc.toXML()
+            f = open(os.path.join(self.sensormlpath,self.json["system"]+".xml"), 'w')
+            f.write(smlstring)
+            f.close()
+            self.setMessage("SensorML successfully updated")
+
+        else:'''
+
+        if not "system" in proc.data:
+            raise Exception("system parameter is mandatory for PUT request")
+
+        smlstring = proc.toXML()
+        f = open(os.path.join(self.sensormlpath,self.procedurename+".xml"), 'w')
+        f.write(smlstring)
+        f.close()
+        self.setMessage("SensorML successfully updated")
+        servicedb = databaseManager.PgDB(self.serviceconf.connection['user'],
+                                         self.serviceconf.connection['password'],
+                                         self.serviceconf.connection['dbname'],
+                                         self.serviceconf.connection['host'],
+                                         self.serviceconf.connection['port']
+                                         )
+        msg1 = ""
+        msg2 = ""
+
+        if proc.data['system'] != self.procedurename:
+            #rename procedure in transaction
+            sql  = "UPDATE %s.procedures" % self.service
+            sql += " SET name_prc = %s WHERE name_prc= %s"
+            params = (self.json["system"],self.procedurename)
+            servicedb.executeInTransaction(sql,params)
+
+            #rename sensorML file
+            os.rename(os.path.join(self.sensormlpath,self.procedurename+".xml"),
+                      os.path.join(self.sensormlpath,self.json["system"]+".xml"))
+
+            #commit transaction
+
+            msg1 = "Procedure '%s' successfully renamed to '%s'" %(self.procedurename,str(self.json["system"]))
+
+        #allows to update observed property constraints
+        for obsprop in proc.data['outputs']:
+            if "constraint" in obsprop:
+                if "role" in obsprop["constraint"]:
+                    if obsprop["constraint"]["role"]=="urn:ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable":
+                        #get obsprop_id, uom_id and proc_id
+                        sql = "SELECT id_prc, id_opr, id_uom"
+                        sql += " FROM %s.procedures, %s.observed_properties, %s.uoms" %(self.service,self.service,self.service)
+                        sql += " WHERE name_prc=%s AND def_opr=%s AND name_uom=%s"
+                        params = (proc.data['system'], obsprop["definition"], obsprop["uom"])
+                        try:
+                            ids = servicedb.select(sql,params)
+                        except Exception:
+                            raise Exception("Procedure-observedProperty-UnitOfMeasure triplet not found in system, SQL: %s" % servicedb.mogrify(sql,params) )
+        
+                        if len(ids)==1:
+                            #update database values for the constraints
+                            sql = "UPDATE %s.proc_obs" % self.service
+                            sql += " SET constr_pro = %s"
+                            sql += " WHERE id_prc_fk=%s AND id_opr_fk=%s AND id_uom_fk=%s"
+                            #calculate json string
+                            upd = {}
+                            if "role" in obsprop["constraint"]:
+                                upd["role"] = obsprop["constraint"]["role"]
+                            if "min" in obsprop["constraint"]:
+                                #upd["min"]= obsprop["constraint"]["min"]
+                                try:
+                                    upd["min"] = obsprop["constraint"]["min"]
+                                except:
+                                    raise Exception("'min' constraint requires float value")
+                            elif "max" in obsprop["constraint"]:
+                                #upd["max"]= obsprop["constraint"]["max"]
+                                try:
+                                    upd["max"] = obsprop["constraint"]["max"]
+                                except:
+                                    raise Exception("'max' constraint requires float value")
+                            elif "interval" in obsprop["constraint"]:
+                                #upd["interval"]= [ str(a) for a in obsprop["constraint"]["interval"] ]
+                                try:
+                                    upd["interval"] = [
+                                        float(obsprop["constraint"]["interval"][0]),
+                                        float(obsprop["constraint"]["interval"][1])
+                                    ]
+                                except:
+                                    raise Exception("'interval' constraint requires an array of two float value")
+                            elif "valueList" in obsprop["constraint"]:
+                                #upd["valueList"]= [ str(a) for a in obsprop["constraint"]["valueList"] ]
+                                try:
+                                    upd["valueList"] = [float(a) for a in obsprop["constraint"]["valueList"]]
+                                except:
+                                    raise Exception("'interval' constraint requires an array of two float value")
+                                
+                            import json
+                            params = (json.dumps(upd), ids[0]['id_prc'], ids[0]['id_opr'], ids[0]['id_uom'])
+                            try:
+                                #print >> sys.stderr, servicedb.mogrify(sql,params)                                
+                                ids = servicedb.executeInTransaction(sql,params)
+                                msg2 = "observed properties constraints have been updated"
+                            except:
+                                raise Exception("Procedure-observedProperty-UnitOfMeasure triplet not found in system")
+                
+                else:
+                    #get obsprop_id, uom_id and proc_id
+                    sql = "SELECT id_prc, id_opr, id_uom"
+                    sql += " FROM %s.procedures, %s.observed_properties, %s.uoms" %(self.service,self.service,self.service)
+                    sql += " WHERE name_prc=%s AND def_opr=%s AND name_uom=%s"
+                    params = (proc.data['system'], obsprop["definition"], obsprop["uom"])
+                    try:
+                        ids = servicedb.select(sql,params)
+                    except Exception:
+                        raise Exception("Procedure-observedProperty-UnitOfMeasure triplet not found in system, SQL: %s" % servicedb.mogrify(sql,params) )
+    
+                    if len(ids)==1:
+                        #update database values for the constraints
+                        sql = "UPDATE %s.proc_obs" % self.service
+                        sql += " SET constr_pro = NULL"
+                        sql += " WHERE id_prc_fk=%s AND id_opr_fk=%s AND id_uom_fk=%s"
+                        
+                        params = (ids[0]['id_prc'], ids[0]['id_opr'], ids[0]['id_uom'])
+                        try:
+                            #print >> sys.stderr, servicedb.mogrify(sql,params)                                
+                            ids = servicedb.executeInTransaction(sql,params)
+                            msg2 = "observed properties constraints have been updated"
+                        except:
+                            raise Exception("Procedure-observedProperty-UnitOfMeasure triplet not found in system")
+                
+        servicedb.commitTransaction()
+        
+        if msg1 and msg2:
+            self.setMessage(" and ".join([msg1,msg2]) )
+        elif msg1:
+            self.setMessage(msg1)
+        else:
+            self.setMessage(msg2)
+
+    def executeGet(self):
+        """
+        Method for executing a GET requests that rename a SOS service
+
+        {
+            "message": "Sensor Description secessfully loaded",
+            "total": 1,
+            "data": {
+                "inputs": [],
+                "description": "",
+                "classification": [
+                    {
+                        "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType",
+                        "name": "System Type",
+                        "value": "insitu-fixed-point"
+                    },
+                    {
+                        "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType",
+                        "name": "Sensor Type",
+                        "value": "temperature"
+                    }
+                ],
+                "characteristics": "",
+                "interfaces": "",
+                "keywords": "",
+                "contacts": [],
+                "assignedSensorId": "ec08e1f51ab879f4e1796f3c187daff6",
+                "documentation": [],
+                "system": "DEMO_1",
+                "capabilities": [],
+                "identification": [],
+                "location": {
+                    "geometry": {
+                        "type": "Point",
+                        "coordinates": [
+                            "8.88",
+                            "45.45"
+                        ]
+                    },
+                    "crs": {
+                        "type": "name",
+                        "properties": {
+                            "name": "4326"
+                        }
+                    },
+                    "type": "Feature",
+                    "properties": {
+                        "name": "lugano"
+                    }
+                },
+                "outputs": [
+                    {
+                        "definition": "urn:ogc:def:parameter:x-istsos::time:iso8601",
+                        "constraint": {
+                            "max": "",
+                            "interval": [
+                                "2007-11-03T14:00:00+01:00",
+                                "2011-12-07T18:00:00+01:00"
+                            ],
+                            "role": "",
+                            "valuelist": "",
+                            "min": ""
+                        },
+                        "name": "Time",
+                        "uom": "",
+                        "description": ""
+                    },
+                    {
+                        "definition": "urn:ogc:def:parameter:x-istsos::meteo:air:temperature",
+                        "constraint": {
+                            "max": "",
+                            "interval": "",
+                            "role": "",
+                            "valuelist": "",
+                            "min": ""
+                        },
+                        "name": "meteo-air-temperature",
+                        "uom": "deg",
+                        "description": ""
+                    }
+                ],
+                "system_id": "DEMO_1",
+                "history": []
+            },
+            "success": true
+        }
+        """
+
+        import lib.requests as requests
+        res = requests.get(
+            self.serviceconf.serviceurl["url"],
+            params={
+                "request": "DescribeSensor",
+                "procedure": self.procedurename,
+                "outputFormat": "text/xml;subtype=\"sensorML/1.0.1\"",
+                "service": "SOS",
+                "version": "1.0.0"
+            }
+        )
+
+        smlobj = procedure.Procedure()
+        try:
+            smlobj.loadXML(res.content)
+        except Exception as e:
+            print >> sys.stderr, "\n\nSML: %s\n\n" % res.content
+            raise Exception("Error loading DescribeSensor of '%s' [STATUS CODE: %s]: %s" % (self.procedurename,res.status_code,e))
+
+        # Searching for the assignedSensorId from the database
+        servicedb = databaseManager.PgDB(
+            self.serviceconf.connection['user'],
+            self.serviceconf.connection['password'],
+            self.serviceconf.connection['dbname'],
+            self.serviceconf.connection['host'],
+            self.serviceconf.connection['port']
+        )
+        sql  = "SELECT assignedid_prc FROM %s.procedures " %((self.service,))
+        sql  += " WHERE name_prc = %s"
+        rows = servicedb.select(sql,(self.procedurename,))
+        if rows:
+            ret = {
+                'assignedSensorId': rows[0]["assignedid_prc"]
+            }
+            ret.update(smlobj.data) # merging dictionaries
+            self.setData(ret)
+            self.setMessage("Sensor Description successfully loaded")
+        else:
+            self.setException("Unable to find the procedure's assignedSensorId")
+
+
+
+class waGetlist(waResourceService):
+    """
+    Class to execute istsos/services/{serviceName}/procedures/operations/getlist
+    """
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.servicename = self.pathinfo[2]
+
+    def executeGet(self):
+        if self.servicename == "default":
+            raise Exception("getlist operation can not be done for default service instance.")
+        else:
+            data = []
+            servicedb = databaseManager.PgDB(self.serviceconf.connection['user'],
+                                            self.serviceconf.connection['password'],
+                                            self.serviceconf.connection['dbname'],
+                                            self.serviceconf.connection['host'],
+                                            self.serviceconf.connection['port']
+            )
+            proceduresList = utils.getProcedureNamesList(servicedb,self.servicename)
+            for proc in proceduresList:
+                elem = {}
+                elem.update(proc)
+                #elem["name"] = proc["name"]
+                ops = utils.getObservedPropertiesFromProcedure(servicedb,self.servicename,proc["name"])
+                if ops != None:
+                    elem["observedproperties"] = [ {"name" : op["name"], "uom" : op["uom"]  } for op in ops ]
+                else:
+                    elem["observedproperties"] = []
+                offs = utils.getOfferingsFromProcedure(servicedb,self.servicename,proc["name"])
+                if offs != None:
+                    elem["offerings"] = [ off["name"] for off in offs ]
+                else:
+                    elem["offerings"] = []
+                data.append(elem)
+
+            self.setData(data)
+            self.setMessage("Procedures of service <%s> successfully retrived" % self.servicename)
+
+
+class waGetGeoJson(waResourceService):
+    """
+    Class to execute istsos/services/{serviceName}/procedures/operations/geojson/{epsg}
+    """
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+
+        import pprint
+        pp = pprint.PrettyPrinter(indent=4)
+        print >> sys.stderr, "\n\nENVIRON: %s" % pp.pprint(self.serviceconf.get("geo")['istsosepsg'])
+
+        if self.waEnviron['parameters'] and self.waEnviron['parameters']['epsg']:
+            self.epsg = self.waEnviron['parameters']['epsg'][0]
+        else:
+            self.epsg = self.serviceconf.get("geo")['istsosepsg']
+
+    def executeGet(self):
+        if self.service == "default":
+            raise Exception("getlist operation can not be done for default service instance.")
+        else:
+            try:
+                data = {
+                    "type": "FeatureCollection",
+                    "features": []
+                }
+                servicedb = databaseManager.PgDB(self.serviceconf.connection['user'],
+                                                self.serviceconf.connection['password'],
+                                                self.serviceconf.connection['dbname'],
+                                                self.serviceconf.connection['host'],
+                                                self.serviceconf.connection['port']
+                )
+                proceduresList = utils.getProcedureNamesList(servicedb,self.service)
+                for proc in proceduresList:
+                    elem = {}
+                    elem.update(proc)
+                    #elem["name"] = proc["name"]
+                    ops = utils.getObservedPropertiesFromProcedure(servicedb,self.service,proc["name"])
+                    if ops != None:
+                        elem["observedproperties"] = [ {"name" : op["name"], "uom" : op["uom"]  } for op in ops ]
+                    else:
+                        elem["observedproperties"] = []
+                    offs = utils.getOfferingsFromProcedure(servicedb,self.service,proc["name"])
+                    if offs != None:
+                        elem["offerings"] = [ off["name"] for off in offs ]
+                    else:
+                        elem["offerings"] = []
+
+
+                    geom = utils.getGeoJSONFromProcedure(servicedb, self.service,proc["name"], self.epsg)
+                    if geom == None:
+                        continue
+
+                    data["features"].append({
+                        "type": "Feature",
+                        "geometry": geom,
+                        "properties": elem
+                    })
+
+                self.setData(data)
+            except Exception as e:
+                self.setMessage("%s" % e)
+
+
+
+    def setData(self,data):
+        """ Set data in response """
+        self.response = data
+
diff --git a/walib/istsos/services/procedures/procedures.pyc b/walib/istsos/services/procedures/procedures.pyc
new file mode 100644
index 0000000..35db809
Binary files /dev/null and b/walib/istsos/services/procedures/procedures.pyc differ
diff --git a/walib/istsos/services/services.py b/walib/istsos/services/services.py
new file mode 100755
index 0000000..d8287a5
--- /dev/null
+++ b/walib/istsos/services/services.py
@@ -0,0 +1,733 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import utils, databaseManager, configManager
+from walib.resource import waResourceAdmin, waResourceService
+import sys, os, shutil, errno
+import traceback
+
+class waServices(waResourceAdmin):
+    """class to handle SOS service objects, support GET and POST method"""
+    
+    def __init__(self,waEnviron):
+        waResourceAdmin.__init__(self,waEnviron)
+        self.urlservicename = self.pathinfo[-1] if not self.pathinfo[-1]=="services" else None
+     
+    def executePost(self,db=True):
+        """
+        Method for executing a POST requests that initialize a new SOS service
+                      
+        .. note::  This method creates:
+            1. service folder, 
+            2. service configuration file
+            3. C{sensorML} folder
+            4. C{virtual procedures} folder
+            5. a new schema with the same name of your service
+            6. istSOS tables and relations in the new schema
+        
+        The POST must be in Json format with mandatory service key, if databease keys 
+        are not provided the server default connection are used:
+                
+        >>> {
+                "service" : "service_name", 
+                "user" : "pinco"
+                "password" : "pallino"
+                "dbname" : "sos_db"
+                "host" : "10.7.5.3"
+                "port" : "5432"
+            } 
+        """
+        
+        #check to be at service level without serviceID provided in url
+        if not self.urlservicename == None and db==True:
+            raise Exception("POST action with url service name not supported")
+            
+        #check that service name was provided
+        if not "service" in self.json:
+            raise Exception("PUT action require the new service name sent within request body")
+        
+        #validate schemaname against injection
+        utils.preventInjection(self.json["service"])
+        
+        #validate db connection
+        #-------------------------------------
+        jsoncount = 0
+        dbkeys = ["user","password","dbname","host","port"]
+        for key in dbkeys:
+            if key in self.json :
+                jsoncount += 1
+        
+        
+        defaultcfgpath = os.path.join(self.waEnviron["services_path"],"default.cfg")
+        defaultconfig = configManager.waServiceConfig(defaultcfgpath)
+        
+        if jsoncount == 5:
+            servicedb = databaseManager.PgDB(
+                self.json["user"],
+                self.json["password"],
+                self.json["dbname"],
+                self.json["host"],
+                self.json["port"])
+        
+        elif jsoncount == 0:
+            defaultconnection = defaultconfig.get("connection")
+            servicedb = databaseManager.PgDB(
+                defaultconnection['user'],
+                defaultconnection['password'],
+                defaultconnection['dbname'],
+                defaultconnection['host'],
+                defaultconnection['port'])
+                
+        else:
+            raise Exception("db parameters [service,user,password,dbname,host,port] must be all or none provided")
+        
+        #verify that the schema does not exist
+        #-------------------------------------
+        sql = "SELECT count(*) from pg_namespace WHERE nspname = %s"
+        par = (self.json["service"],)
+        res = servicedb.select(sql,par)
+        if len(res)==1:
+            pass
+        else:
+            raise Exception("a schema '%s' already exist" % self.json["service"])
+        
+        #check if service folder does not exist: in case create it
+        #-------------------------------------------------------------------        
+        newservicepath = os.path.join( self.waEnviron["services_path"],self.json["service"] )
+        try:
+            os.makedirs(newservicepath)
+        except OSError as exc:
+            if exc.errno == errno.EEXIST:
+                raise Exception("Service %s already exist" %(self.json["service"]) )
+            else:
+                raise exc
+      
+        #create configuration file
+        #-------------------------------------------------------------------
+        configfile = os.path.join(self.waEnviron["services_path"],self.json["service"],self.json["service"])+".cfg"
+        open(configfile, 'w').close()
+        #--set EPSGdefault
+        
+        #create sensorML folder
+        #-------------------------------------------------------------------
+        smldir = os.path.join(self.waEnviron["services_path"],self.json["service"],"sml")
+        os.makedirs(smldir)
+        
+        #create virtual procedure path
+        #-------------------------------------------------------------------
+        virtualdir = os.path.join(self.waEnviron["services_path"],self.json["service"],"virtual")
+        os.makedirs(virtualdir)
+        
+        if db==True:
+            try:
+                
+                #create schema
+                #-------------------------------------------------------------------
+                sql = "CREATE SCHEMA %s" % self.json["service"]
+                servicedb.executeInTransaction(sql)
+                
+                #set db path
+                #-------------------------------------------------------------------
+                sql = "SET search_path = %s, public, pg_catalog" % self.json["service"]
+                servicedb.executeInTransaction(sql,par)
+                
+                #create tableas and relations
+                #-------------------------------------------------------------------
+                from walib import sqlschema
+                defaultepsg = defaultconfig.get("geo")['istsosepsg']
+                import sys
+                if not "epsg" in self.json:
+                    sql = sqlschema.createsqlschema.replace("$SRID",defaultepsg).replace("$schema",self.json["service"])
+                else:
+                    sql = sqlschema.createsqlschema.replace("$SRID",self.json['epsg'])
+                    
+                    #set correct default EPSG of the new service
+                    #-------------------------------------------------------------------
+                    newconfig = configManager.waServiceConfig(defaultcfgpath,configfile)
+                    allowed = newconfig.get('geo')['allowedEPSG'].split(",")
+                    if self.json['epsg'] in allowed:
+                        newallowedepsg = ",".join([x for x in allowed if x != self.json['epsg']])
+                        newconfig.put('geo','allowedEPSG',newallowedepsg)
+                        newconfig.save() 
+                    newconfig.put('geo','istsosepsg',self.json['epsg'])
+                    newconfig.save()
+                servicedb.executeInTransaction(sql)
+            
+                servicedb.commitTransaction()
+            except:
+                servicedb.rollbackTransaction()
+                raise
+        
+
+
+
+
+        
+        # Setting proxy configuration
+        from walib.istsos.services.configsections import serviceurl
+        surl = configManager.waServiceConfig(defaultcfgpath, configfile)
+        
+        url = ''
+        if self.waEnviron['server_port'] == '80':
+            url = 'http://'
+        else:
+            url = 'https://'
+        
+        url = "%s%s%s/%s" % (url, self.waEnviron['server_name'], self.waEnviron['script_name'], self.json["service"])
+        
+        surl.put("serviceurl", "url", url)
+        surl.save()
+
+
+
+
+        
+        self.setMessage( "New service <%s> correctly created" % str(self.json["service"]) )
+
+    def executeDelete(self):
+        """
+        Method for executing a DELETE requests that erase a SOS service
+                          
+            .. note::  This method delete:
+                1. service folder, 
+                2. service configuration file
+                3. C{sensorML} folder
+                4. C{virtual procedures} folder
+                5. a new schema with the same name of your service
+                6. istSOS tables and relations in the new schema
+            
+            The POST must be in Json format with mandatory service key
+                    
+            >>> {
+                    "service" : "service_name"
+                } 
+        """
+        #check schemaname input
+        if self.urlservicename == None:
+            raise Exception("DELETE action without url service name not supported")
+        
+        #validate schemaname against injection
+        utils.preventInjection(self.urlservicename)
+        
+        #get database connection and initialize it
+        defaultcfgpath = os.path.join(self.waEnviron["services_path"],"default.cfg")
+        servicepath = os.path.join(self.waEnviron["services_path"],self.urlservicename)
+        servicecfgpath = os.path.join(self.waEnviron["services_path"],self.urlservicename,self.urlservicename)+".cfg"
+        
+        if not os.path.isdir(servicepath):
+            raise Exception("service [%s] does not exists." % self.urlservicename)
+        if not os.path.isdir(os.path.join(self.waEnviron["services_path"],self.urlservicename,"virtual")):
+            raise Exception("service [%s] misconfigured, missing <virtual> folder." % self.urlservicename)
+        if not os.path.isdir(os.path.join(self.waEnviron["services_path"],self.urlservicename,"sml")):
+            raise Exception("service [%s] misconfigured, missing <sml> folder." % self.urlservicename)
+        if not os.path.isfile(servicecfgpath):
+            raise Exception("service [%s] misconfigured, missing config file." % self.urlservicename)
+      
+        config = configManager.waServiceConfig(defaultcfgpath,servicecfgpath)
+        connection = config.get("connection")
+        servicedb = databaseManager.PgDB(connection['user'],
+                                    connection['password'],
+                                    connection['dbname'],
+                                    connection['host'],
+                                    connection['port']
+        )
+        #verify that the schema exist
+        #-------------------------------------
+        sql = "SELECT count(*) from pg_namespace WHERE nspname = %s"
+        par = (self.urlservicename,)
+        res = servicedb.select(sql,par)
+        if len(res)==1:
+            pass
+        else:
+            raise Exception("the db schema <<%s>> doesn't exist" % self.urlservicename)
+        
+        try:
+            #drop schema
+            #-------------------------------------------------------------------
+            sql = "DROP SCHEMA %s CASCADE" % self.urlservicename
+            servicedb.executeInTransaction(sql)
+                    
+            #remove service folder and subfolder contents
+            #-------------------------------------------------------------------        
+            shutil.rmtree(servicepath)
+            
+            servicedb.commitTransaction()
+            
+        except:
+            servicedb.rollbackTransaction()
+            raise
+        self.setMessage("Service <%s> correctly deleted" % self.urlservicename)
+      
+    def executePut(self):
+        """
+        Method for executing a PUT requests that rename a SOS service
+                          
+            .. note:: This method renames:
+                1. create a new service folder, 
+                2. copy content from old to new service configuration file
+                3. rename the databse schema
+                4. delete old service files
+            
+            The POST must be in Json format with mandatory service key
+                    
+            >>> {
+                    "service" : "service_name"
+                } 
+        """
+        
+        #check to be at service level without serviceID provided in url
+        #-------------------------------------------------------------------        
+        if self.urlservicename == None:
+            raise Exception("PUT action with url service name not supported")
+        
+        #check that service name was provided
+        #-------------------------------------------------------------------        
+        if not "service" in self.json:
+            raise Exception("PUT action require the new service name sent within request body")
+        
+        
+        #create a new service with new name
+        #-------------------------------------------------------------------        
+        try:
+            self.executePost(db=False)
+        except:
+            raise
+        
+        #copy configuration file to new configuration file name
+        #-------------------------------------------------------------------        
+        try:
+            defaultcfgpath = os.path.join(self.waEnviron["services_path"],"default.cfg")
+            servicecfgpath = os.path.join(self.waEnviron["services_path"],self.urlservicename,self.urlservicename)+".cfg"
+            newservicecfgpath = os.path.join(self.waEnviron["services_path"],self.json["service"],self.json["service"])+".cfg"
+            of = open(servicecfgpath, "r")
+            content = of.read()
+            of.close()
+            nf = open(newservicecfgpath, 'w')
+            nf.write(content)
+            nf.close()
+        except:
+            #remove new files
+            shutil.rmtree(os.path.join(self.waEnviron["services_path"],self.json["service"]))
+            raise Exception("cannot copy configuration file content")
+        
+        #rename database schema to new service name
+        #-------------------------------------------------------------------
+        try:
+            config = configManager.waServiceConfig(defaultcfgpath,servicecfgpath)
+            connection = config.get("connection")
+            servicedb = databaseManager.PgDB(connection['user'],
+                                        connection['password'],
+                                        connection['dbname'],
+                                        connection['host'],
+                                        connection['port']
+            )
+            sql = "ALTER SCHEMA %s RENAME TO %s" %(self.urlservicename,str(self.json["service"]))
+            servicedb.executeInTransaction(sql)
+        except:
+            #remove new files
+            shutil.rmtree(os.path.join(self.waEnviron["services_path"],self.json["service"]))
+            raise #Exception("invalid alter schema sql")
+        
+        #remove service folder and subfolder contents
+        #-------------------------------------------------------------------        
+        try:
+            shutil.rmtree(os.path.join(self.waEnviron["services_path"],self.urlservicename))
+        except:
+            servicedb.rollbackTransaction()
+            
+        servicedb.commitTransaction()
+        self.setMessage("service <%s> successfully renamed to <%s>" %(self.urlservicename,str(self.json["service"])))
+        
+        
+        
+    def executeGet(self):
+        """
+        Method for executing a GET requests that rename a SOS service
+                          
+            .. note::  This method renames:
+                1. service folder, 
+                2. service configuration file
+                3. the databse schema
+            
+            The POST must be in Json format with mandatory service key
+                    
+            >>> {
+                    "service" : "service_name"
+                } 
+        """
+        #check to be at service level without serviceID provided in url
+        #-------------------------------------------------------------------        
+        if self.urlservicename == None:
+            try:
+                serviceslist = utils.getServiceList(self.waEnviron["services_path"],listonly=False)
+            except Exception as ex:
+                print >> sys.stderr, traceback.print_exc()
+                raise ex
+            self.setData(serviceslist)
+            self.setMessage("Services list successfully retrived: found [%s] services" % len(serviceslist) )
+            
+        else:
+            
+            try:
+                serviceslist = utils.getServiceList(self.waEnviron["services_path"],listonly=True)
+                
+                if not(self.urlservicename in serviceslist):
+                    raise Exception("")
+                
+            except Exception as ex:
+                print >> sys.stderr, traceback.print_exc()
+                raise ex
+            
+            
+            #get database connection and initialize it
+            #-------------------------------------------------------------------
+            defaultcfgpath = os.path.join(self.waEnviron["services_path"],"default.cfg")
+            servicecfgpath = os.path.join(self.waEnviron["services_path"],self.urlservicename, self.urlservicename)+".cfg"
+            config = configManager.waServiceConfig(defaultcfgpath,servicecfgpath)
+            connection = config.get("connection")
+            
+            #test if connection is valid
+            #-------------------------------------------------------------------
+            servicedb = databaseManager.PgDB(connection['user'],
+                                        connection['password'],
+                                        connection['dbname'],
+                                        connection['host'],
+                                        connection['port']
+            )
+            self.setData({
+                "service": self.urlservicename,
+                "user" : connection['user'],
+                "password" : connection['password'],
+                "dbname" : connection['dbname'],
+                "host" : connection['host'],
+                "port" : connection['port']
+            })
+            self.setMessage("Informations of service <%s> successfully retrived" % self.urlservicename)
+        
+        
+class waGetobservation(waResourceService):
+    """class to handle SOS observations, support only the GET method"""
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+             
+    def executeGet(self):
+        """
+        Method for executing a Get requests that create a new SOS procedure
+                      
+        .. note::  This method return a Json object with ObservationCollection members
+        
+        The response is:
+                
+        >>> {
+                "message" : "abcderfghilmnopqrstuvz",
+                "total": 4,
+                "data" : [
+                    {
+                        "samplingTime": {...},
+                        "featureOfInterest": {...},
+                        "observedProperty": {...},
+                        "result": {...},
+                        "procedure": {...}
+                    },{
+                        "samplingTime": {...},
+                        "featureOfInterest": {...},
+                        "observedProperty": {...},
+                        "result": {...},
+                        "procedure": {...}
+                    },...
+                ],
+                "success": true
+            }
+        """
+        #get the parameters
+        #/istsos/services/{sosmaxi}/operations/{getobservation}/offerings/{temporary}/procedures/{P_BED&P_TRE}/observations/{rain}/eventtime/{last}
+        try:
+            offerings = self.pathinfo[6] # {name}
+            procedures = self.pathinfo[8].replace("&",",") # { * | name | name1&name2&...}
+            observations = self.pathinfo[10].replace("&",",") # {name | name1&name2}
+            try:
+                eventtime = [ self.pathinfo[12], self.pathinfo[13] ] # {begin}/{end}
+            except:
+                eventtime = [ self.pathinfo[12] ] # {instant} | {"last"}
+        except:
+            raise Exception("ERROR in pathinfo scanning")
+                    
+        import lib.requests as requests
+        
+        rparams = {
+            "request": "GetObservation",
+            "service": "SOS",
+            "version": "1.0.0",
+            "observedProperty": observations,
+            "responseFormat": "application/json",
+            "offering": offerings
+        }
+        
+        if self.waEnviron['parameters'] and (
+                'qualityIndex' in self.waEnviron['parameters'] and 'False' in self.waEnviron['parameters']['qualityIndex']):
+            rparams["qualityIndex"] = "False"
+        else:            
+            rparams["qualityIndex"] = "True"
+            
+            
+        if not procedures == "*":
+            rparams.update({
+                "procedure": procedures
+            })
+        if not eventtime[0] == "last":
+            rparams.update({
+                "eventTime": "/".join(eventtime)
+            })
+            
+        response = requests.get(
+            self.serviceconf.serviceurl["url"], 
+            params=rparams
+        )
+        
+        obsjson = response.json
+        
+        '''try:
+            obsjson["ObservationCollection"]["member"][0]["observedProperty"]["components"] = obsjson["ObservationCollection"]["member"][0]["observedProperty"]["component"]
+        except:
+            print >> sys.stderr,  "ERROR"
+            pass'''
+            
+        # build the response --------------------------------------------------- 
+        try:
+            response.raise_for_status()
+            self.setData( obsjson["ObservationCollection"]["member"] )
+            self.setMessage("GetObservation requested successfully executed")
+        except Exception as e:
+            self.setException("GetObservation request failed - Communication: %s %s - Response: %s"  %(response.status_code, e, response.content))
+        
+        
+
+import sys  
+from lib.etree import et
+
+reurl = r'(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?'
+
+def parse_and_get_ns(file):
+    events = "start", "start-ns"
+    root = None
+    ns = {}
+    for event, elem in et.iterparse(file, events):
+        if event == "start-ns":
+            if elem[0] in ns and ns[elem[0]] != elem[1]:
+                # NOTE: It is perfectly valid to have the same prefix refer
+                #   to different URI namespaces in different parts of the
+                #   document. This exception serves as a reminder that this
+                #   solution is not robust.  Use at your own peril.
+                raise KeyError("Duplicate prefix with different URI found.")
+            ns[elem[0]] = "%s" % elem[1]
+        elif event == "start":
+            if root is None:
+                root = elem 
+    return et.ElementTree(root), ns
+
+class waInsertobservation(waResourceService):
+    """class to handle SOS observations, support only the GET method"""
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+     
+    def executePost(self):
+        """
+        Method for executing a POST requests that insert new observations into a SOS procedure
+                      
+        .. note::  The POST data shall be in JSON format as following:
+                
+        >>> {
+            "ForceInsert" : "true",
+            "Observation" : {
+                "procedure": "urn:ogc:object:procedure:x-istsos:1.01.0:P_TRE",
+                "AssignedSensorId" : "247df84cf4a0c2ebc632d08318d00cb3",
+			    "samplingTime": {
+				    "beginPosition": "2012-01-01T13:00:00+01:00", 
+				    "endPosition": "2012-01-01T17:00:00+01:00"
+			    }, 
+			    "observedProperty": {
+				    "CompositePhenomenon": {
+					    "id": "comp_126", 
+					    "dimension": "2"
+				    }, 
+				    "component": [
+					    "urn:ogc:def:parameter:x-istsos:1.01.0:time:iso8601", 
+					    "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall"
+				    ]
+			    },
+			    "featureOfInterest": {
+				    "geom": "<gml:Point srsName='EPSG:21781'><gml:coordinates>717900,98520,342</gml:coordinates></gml:Point>", 
+				    "name": "urn:ogc:object:feature:x-istsos:1.01.0:station:Trevano"
+			    }, 
+			    "result": {
+				    "DataArray": {
+					    "elementCount": "2", 
+					    "values": [
+						    [
+							    "22012-01-01T14:00:00+01:00", 
+							    "10.000000"
+						    ],
+						    [
+							    "2012-01-01T15:00:00+01:00", 
+							    "20.000000"
+						    ]
+					    ], 
+					    "field": [
+						    {
+							    "definition": "urn:ogc:def:parameter:x-istsos:1.01.0:time:iso8601", 
+							    "name": "Time"
+						    }, 
+						    {
+							    "definition": "urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall", 
+							    "name": "air-rainfall", 
+							    "uom": "mm"
+						    }
+					    ]
+				    }
+			    }
+		    } 
+		}    
+        """
+        ns = {
+            'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+            'sml': 'http://www.opengis.net/sensorML', 
+            'swe': 'http://www.opengis.net/swe', 
+            'xlink': 'http://www.w3.org/1999/xlink', 
+            'gml': 'http://www.opengis.net/gml',
+            'sos' : 'http://www.opengis.net/sos/1.0',
+            'sa' : 'http://www.opengis.net/sampling/1.0',
+            'ogc' : 'http://www.opengis.net/ogc',
+            'om' : 'http://www.opengis.net/om/1.0'
+        }    
+        
+        #---map namespaces---
+        try:
+            register_namespace = et.register_namespace
+            for key in ns:
+                register_namespace(key,ns[key])
+        except AttributeError:
+            try:
+                et._namespace_map.update(ns)
+                for key in ns:
+                    et._namespace_map[ns[key]] = key
+            except AttributeError:
+                try:
+                    from xml.etree.ElementTree import _namespace_map
+                except ImportError:
+                    try:
+                        from elementtree.ElementTree import _namespace_map
+                    except ImportError:
+                        print >> sys.stderr, ("Failed to import ElementTree from any known place")
+                for key in ns:
+                    _namespace_map[ns[key]] = key
+        
+        #create xml request
+        root = et.Element("{%s}InsertObservation" % ns['sos'])
+        root.attrib[ "{%s}schemaLocation" % ns['xsi'] ] = "http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+        root.attrib["version"] = "1.0.0"
+        root.attrib["service"] = "SOS"
+                   
+        AssignedSensorId = et.SubElement(root, "{%s}AssignedSensorId" % ns['sos'] )
+        AssignedSensorId.text = self.json["AssignedSensorId"]
+        
+        if "ForceInsert" in self.json:
+            ForceInsert = et.SubElement(root, "{%s}ForceInsert" % ns['sos'])
+            ForceInsert.text = self.json["ForceInsert"]
+        
+        Observation = et.SubElement(root, "{%s}Observation" % ns['om'] )
+        
+        procedure =  et.SubElement(Observation, "{%s}procedure" % ns['om'] )
+        procedure.attrib[ "{%s}href" % ns['xlink'] ] = self.json["Observation"]["procedure"]
+        
+        samplingTime =  et.SubElement(Observation, "{%s}samplingTime" % ns['om'] )
+        TimePeriod = et.SubElement(samplingTime, "{%s}TimePeriod" % ns['gml'] )
+        beginPosition = et.SubElement(TimePeriod, "{%s}beginPosition" % ns['gml'] )
+        beginPosition.text = self.json["Observation"]["samplingTime"]["beginPosition"]
+        endPosition = et.SubElement(TimePeriod, "{%s}endPosition" % ns['gml'] )
+        endPosition.text = self.json["Observation"]["samplingTime"]["endPosition"]
+        
+        observedProperty = et.SubElement(Observation, "{%s}observedProperty" % ns['om'] )
+        CompositePhenomenon = et.SubElement(observedProperty, "{%s}CompositePhenomenon" % ns['swe'] )
+        CompositePhenomenon.attrib["dimension"] = self.json["Observation"]["observedProperty"]["CompositePhenomenon"]["dimension"]
+        
+        for comp in self.json["Observation"]["observedProperty"]["component"]:
+            component = et.SubElement(CompositePhenomenon, "{%s}component" % ns['swe'] )
+            component.attrib[ "{%s}href" % ns['xlink'] ] = comp
+            
+        featureOfInterest = et.SubElement(Observation, "{%s}featureOfInterest" % ns['om'] )
+        featureOfInterest.attrib[ "{%s}href" % ns['xlink'] ] = self.json["Observation"]["featureOfInterest"]["name"]
+        
+        result = et.SubElement(Observation, "{%s}result" % ns['om'] )
+        DataArray = et.SubElement(result, "{%s}DataArray" % ns['swe'] )
+        elementCount = et.SubElement(DataArray, "{%s}elementCount" % ns['swe'] )
+        value = et.SubElement(elementCount, "{%s}value" % ns['swe'] )
+        value.text = self.json["Observation"]["result"]["DataArray"]["elementCount"]
+        elementType = et.SubElement(DataArray, "{%s}elementType" % ns['swe'] )
+        elementType.attrib["name"] = "SimpleDataArray"
+        DataRecord = et.SubElement(elementType, "{%s}DataRecord" % ns['swe'] )
+        DataRecord.attrib["definition"] = "urn:ogc:def:dataType:x-istsos:1.0:timeSeries"
+        for index, item in enumerate(self.json["Observation"]["result"]["DataArray"]["field"]):
+            field = et.SubElement(DataRecord, "{%s}field" % ns['swe'] )
+            field.attrib["name"] = item["name"]
+            if index==0:
+                Time = et.SubElement(field, "{%s}Time" % ns['swe'] )
+                Time.attrib["definition"] = item["definition"]
+                if not item["definition"].find("time" )>0:
+                    raise Exception("first element of DataRecord is not of type time")
+            else:
+                Quantity = et.SubElement(field, "{%s}Quantity" % ns['swe'] )
+                Quantity.attrib["definition"] = item["definition"]
+                if "uom" in item:
+                    uom = et.SubElement(Quantity, "{%s}uom" % ns['swe'] )
+                    uom.attrib["code"] = item["uom"]
+                
+                
+                
+        encoding = et.SubElement(DataArray, "{%s}encoding" % ns['swe'] )
+        TextBlock = et.SubElement(encoding, "{%s}TextBlock" % ns['swe'] )
+        TextBlock.attrib["tokenSeparator"] = ","
+        TextBlock.attrib["blockSeparator"] = "@"
+        TextBlock.attrib["decimalSeparator"] = "."
+        
+        values = et.SubElement(DataArray, "{%s}values" % ns['swe'] )
+        values.text = "@".join([",".join(row) for row in self.json["Observation"]["result"]["DataArray"]["values"] ])
+        
+        #--- PrettyPrint XML
+        iostring = et.tostring(root, encoding="UTF-8")
+                
+        import lib.requests as requests
+        response = requests.post(
+            self.serviceconf.serviceurl["url"], 
+            data=iostring, 
+            headers={
+                "Content-type": "text/xml",
+                "User-Agent": "Walib post"
+            }
+        )
+        data = response.text
+        
+        try:
+            response.raise_for_status()
+            if data.find("AssignedObservationId")>0:
+                self.setMessage("%s" % data)
+            else:
+                self.setException("Insert observations failed - Communication: %s %s - Response: %s"  %(response.status_code, e, response.text))
+        except Exception as e:
+            self.setException("Insert observations failed - Communication: %s %s - Response: %s"  %(response.status_code, e, response.text))
+        
diff --git a/walib/istsos/services/services.pyc b/walib/istsos/services/services.pyc
new file mode 100644
index 0000000..48d276b
Binary files /dev/null and b/walib/istsos/services/services.pyc differ
diff --git a/walib/istsos/services/systemtypes/__init__.py b/walib/istsos/services/systemtypes/__init__.py
new file mode 100755
index 0000000..8204305
--- /dev/null
+++ b/walib/istsos/services/systemtypes/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "systemtypes"]
diff --git a/walib/istsos/services/systemtypes/__init__.pyc b/walib/istsos/services/systemtypes/__init__.pyc
new file mode 100644
index 0000000..dc772f8
Binary files /dev/null and b/walib/istsos/services/systemtypes/__init__.pyc differ
diff --git a/walib/istsos/services/systemtypes/systemtypes.py b/walib/istsos/services/systemtypes/systemtypes.py
new file mode 100755
index 0000000..681c16f
--- /dev/null
+++ b/walib/istsos/services/systemtypes/systemtypes.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2013 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import databaseManager
+from walib.resource import waResourceService
+
+class waSystemTypes(waResourceService):
+    """
+    Class to execute istsos/services/{serviceName}/systemtypes
+    """
+
+    def executeGet(self):
+    
+        if self.service == "default":
+            raise Exception("uoms operation can not be done for default service instance.")
+            
+        else:
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+                
+            sql = """ 
+                SELECT 
+                  id_oty, name_oty, desc_oty
+                FROM 
+                  %s.obs_type 
+                ORDER BY id_oty""" % self.service
+            
+            res = servicedb.select(sql)
+            
+            data = []
+            
+            if len(res)>0:
+                for i in range(0,len(res)):
+                    data.append(
+                        {
+                            "id": res[i]['id_oty'],
+                            "name" : res[i]['name_oty'],
+                            "description" : res[i]['desc_oty']
+                        }
+                    )
+                self.setMessage("System type of service <%s> successfully retrived" % self.service)
+            else:
+                self.setMessage("There are not any system type in the %s database. This data is static and must be present. Contact the istSOS administrator." % self.service)
+            
+            self.setData(data)
+        
+            
\ No newline at end of file
diff --git a/walib/istsos/services/systemtypes/systemtypes.pyc b/walib/istsos/services/systemtypes/systemtypes.pyc
new file mode 100644
index 0000000..a89e48b
Binary files /dev/null and b/walib/istsos/services/systemtypes/systemtypes.pyc differ
diff --git a/walib/istsos/services/uoms/__init__.py b/walib/istsos/services/uoms/__init__.py
new file mode 100755
index 0000000..0ef09e9
--- /dev/null
+++ b/walib/istsos/services/uoms/__init__.py
@@ -0,0 +1 @@
+__all__ = [ "uoms"]
diff --git a/walib/istsos/services/uoms/uoms.py b/walib/istsos/services/uoms/uoms.py
new file mode 100755
index 0000000..70c38d8
--- /dev/null
+++ b/walib/istsos/services/uoms/uoms.py
@@ -0,0 +1,207 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib import procedure, resource, utils, databaseManager, configManager
+from walib.resource import waResourceService
+import sys, os, shutil, errno
+from walib.resource import waResourceConfigurator, waResourceService
+import traceback
+import urllib
+
+class waUoms(waResourceService):
+    """class to handle SOS unit of measure objects, support GET and POST method"""
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.uoms = urllib.unquote(self.pathinfo[-1]) if not self.pathinfo[-1]=="uoms" else None
+
+    def executeGet(self):
+    
+        if self.service == "default":
+            raise Exception("uoms operation can not be done for default service instance.")
+            
+        else:
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+                
+            if self.uoms:                 
+                sql = """ 
+                SELECT 
+                  name_uom as name, 
+                  COALESCE(desc_uom,'') as description, 
+                  array_to_string(array_agg(name_prc), ',') as procedures 
+                FROM 
+                  %s.uoms 
+                LEFT JOIN (
+                  SELECT id_uom_fk, name_prc 
+                  FROM %s.proc_obs,%s.procedures 
+                  WHERE id_prc=id_prc_fk 
+                ) AS b 
+                ON id_uom = id_uom_fk """ % ((self.service,)*3)
+                sql += """WHERE name_uom = %s
+                GROUP BY name_uom, desc_uom
+                ORDER BY 1"""
+                par = (self.uoms,)
+                res = servicedb.select(sql,par)
+                data = []
+                if len(res)>0:
+                    for i in range(0,len(res)):
+                        procs = []
+                        if res[i]['procedures']:
+                            procs = res[i]['procedures'].split(",")
+                        data.append(
+                            {
+                                "name": res[i]['name'],
+                                "description" : res[i]['description'],
+                                "procedures" : procs
+                            }
+                        )
+                    self.setMessage("Unit of measures of service <%s> successfully retrived" % self.service)
+                else:
+                    self.setMessage("There are not yet any unit of measures in the %s database" % self.service)
+                self.setData(data)
+            else:     
+                sql = """ 
+                SELECT 
+                  name_uom as name, 
+                  COALESCE(desc_uom,'') as description, 
+                  array_to_string(array_agg(name_prc), ',') as procedures 
+                FROM 
+                  %s.uoms 
+                LEFT JOIN (
+                  SELECT id_uom_fk, name_prc 
+                  FROM %s.proc_obs,%s.procedures 
+                  WHERE id_prc=id_prc_fk 
+                ) AS b 
+                ON id_uom = id_uom_fk 
+                GROUP BY name_uom, desc_uom
+                ORDER BY 1""" % ((self.service,)*3)
+                
+                res = servicedb.select(sql)
+                data = []
+                if len(res)>0:
+                    for i in range(0,len(res)):
+                        procs = []
+                        if res[i]['procedures']:
+                            procs = res[i]['procedures'].split(",")
+                        data.append(
+                            {
+                                "name": res[i]['name'],
+                                "description" : res[i]['description'],
+                                "procedures" : procs
+                            }
+                        )
+                    self.setMessage("Unit of measures of service <%s> successfully retrived" % self.service)
+                else:
+                    self.setMessage("There are not yet any unit of measures in the %s database" % self.service)
+                self.setData(data)
+            
+    def executePost(self):
+        """
+        Method for executing a POST requests that create a new SOS observed property
+                  
+        """
+        if self.service == "default":
+            raise Exception("uoms operation can not be done for default service instance.")
+        else:
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])            
+            sql = "INSERT INTO %s.uoms(name_uom, desc_uom)" % self.service
+            sql += " VALUES (%s, %s);"
+            par = (self.json['name'],self.json['description'])
+            servicedb.execute(sql,par)
+            self.setMessage("")
+            
+    def executePut(self):
+        """
+        Method for executing a POST requests that create a new SOS observed property
+        """
+        if self.service == "default":
+            raise Exception("observedproperties operation can not be done for default service instance.")
+        elif self.uoms == None:
+            raise Exception("destination observedproperty is not specified.")
+        else:
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+            sql = "SELECT id_uom FROM %s.uoms " % self.service
+            sql +=  "WHERE  name_uom = %s"
+            par = (self.uoms,)
+            row = servicedb.select(sql, par)
+            if not row:
+                raise Exception("Original Unit of measure '%s' does not exist." % self.uoms)
+            oid = row[0]["id_uom"] 
+            sql = "UPDATE %s.uoms " % self.service
+            sql += "SET name_uom = %s, desc_uom=%s"
+            sql += " WHERE id_uom = %s"
+            par = (str(self.json['name']),self.json['description'],oid)
+            servicedb.execute(sql,par)
+            self.setMessage("Update successfull")
+        
+        
+    def executeDelete(self):
+        """
+        Method for executing a DELETE requests that remove an existing SOS observed property
+                  
+        """
+        if self.service == "default":
+            raise Exception("uoms operation can not be done for default service instance.")
+        elif self.uoms == None:
+            raise Exception("destination Unit of measure has to be specified.")
+        else:
+            servicedb = databaseManager.PgDB(
+                self.serviceconf.connection['user'],
+                self.serviceconf.connection['password'],
+                self.serviceconf.connection['dbname'],
+                self.serviceconf.connection['host'],
+                self.serviceconf.connection['port'])
+            sql = """
+                SELECT id_uom, COALESCE(procCount,0) as counter
+                FROM 
+                  %s.uoms
+                LEFT JOIN (
+                  SELECT id_uom_fk, count(id_uom_fk) as procCount
+                  FROM %s.proc_obs
+                  GROUP BY id_uom_fk
+                ) AS b 
+                ON id_uom = id_uom_fk """ %((self.service,)*2)
+            sql += "WHERE name_uom = %s"
+            par = (self.uoms,)
+            row = servicedb.select(sql, par)
+            if not row:
+                raise Exception("'%s' Unit of measure does not exist." % self.uoms)
+            oid = row[0]["id_uom"]
+            counter = row[0]["counter"]
+            if counter > 0:
+                raise Exception("There are %s procedures connected with '%s' Unit of measure" % (counter,self.uoms))
+            sql = "DELETE FROM %s.uoms " % self.service
+            sql += " WHERE id_uom = %s;"
+            par = (oid,)
+            servicedb.execute(sql,par)
+            self.setMessage("Unit of measure is deleted")
+        
diff --git a/walib/istsos/services/virtualprocedures/__init__.py b/walib/istsos/services/virtualprocedures/__init__.py
new file mode 100755
index 0000000..9f53c45
--- /dev/null
+++ b/walib/istsos/services/virtualprocedures/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+__all__ = [ "virtualprocedures", "ratingcurve", "code" ]
diff --git a/walib/istsos/services/virtualprocedures/code.py b/walib/istsos/services/virtualprocedures/code.py
new file mode 100755
index 0000000..ad38eb4
--- /dev/null
+++ b/walib/istsos/services/virtualprocedures/code.py
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+#---------------------------------------------------------------------------
+# istSOS - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#---------------------------------------------------------------------------
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#---------------------------------------------------------------------------
+# Created on Thu Aug 29 17:28:18 2013
+#---------------------------------------------------------------------------
+"""
+description:
+    
+"""
+
+# istsos/services/test/virtualprocedures/Q_TEST/code
+from walib.resource import waResourceService
+import os
+import codecs
+
+
+# istsos/services/test/virtualprocedures/Q_TEST/ratingcurves
+class waCode(waResourceService):
+    """
+    class to handle SOS code for virtual procedure
+    
+    {
+    "code" : "....",    
+    }
+    """
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.servicename = self.pathinfo[2]
+        self.procedurename =  self.pathinfo[4]
+        self.procedureFolder = os.path.join(self.servicepath, "virtual", self.procedurename)
+        self.codefile = os.path.join(self.servicepath, "virtual", self.procedurename, self.procedurename+".py")
+        
+    def executeGet(self):
+        #filename = self.RCpath + "/" + self.RCprocedure + ".dat"
+        if not os.path.exists(self.procedureFolder):
+            raise Exception("Virtual procedure %s not available: please check!" % self.procedurename)
+        if not os.path.exists(self.codefile):
+            raise Exception("Virtual procedure code file %s not available: please check!" % self.procedurename)
+        
+        with open(self.codefile, 'r') as content_file:
+            content = content_file.read()
+            self.setData({"code":content})
+            self.setMessage("Virtual procedure code secessfully loaded")
+    
+    def executeDelete(self):
+        if not os.path.exists(self.procedureFolder):
+            raise Exception("Virtual procedure %s not available: please check!")
+        if not os.path.exists(self.codefile):
+            raise Exception("Virtual procedure code file %s not available: please check!")
+        os.remove(self.codefile)
+        
+    def executePost(self):
+        if not os.path.exists(self.procedureFolder):
+            raise Exception("Virtual procedure %s not available: please check!")
+        if os.path.exists(self.codefile):
+            raise Exception("Virtual procedure code file %s already exists!")
+        if not "code" in self.json:
+            raise Exception("code parameter is mandatory")
+        with open(self.codefile, 'w') as f:
+            f.write(self.json["code"])
+      
+    def executePut(self):
+        if not os.path.exists(self.procedureFolder):
+            raise Exception("Virtual procedure %s not available: please check!")
+        if not os.path.exists(self.codefile):
+            raise Exception("Virtual procedure code file %s does not exist!")
+        if not "code" in self.json:
+            raise Exception("code parameter is mandatory")
+        
+        #with open(self.codefile, 'w') as f:
+        
+        with codecs.open(self.codefile, "w", "utf-8") as f:
+            f.write(self.json["code"])
+            f.close()
+  
+        
\ No newline at end of file
diff --git a/walib/istsos/services/virtualprocedures/ratingcurve.py b/walib/istsos/services/virtualprocedures/ratingcurve.py
new file mode 100755
index 0000000..fc93598
--- /dev/null
+++ b/walib/istsos/services/virtualprocedures/ratingcurve.py
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from walib.resource import waResourceService
+import sys, os
+
+# istsos/services/test/virtualprocedures/Q_TEST/ratingcurves
+class waRatingcurves(waResourceService):
+    """
+    class to handle SOS rating curve for virtual procedure of type HQ
+    called with a request to istsos/services/{serviceName}/virtualprocedures/{procedurename}/ratingcurve
+    
+    list of ordered dictionary of rating-curve parameters:
+        [ 
+         {
+          "A": "5.781",
+          "B": "0.25",
+          "C": "1.358",
+          "K": "0",
+          "from": "1982-01-01T00:00+00:00",
+          "to": "1983-01-01T00:00+00:00",
+          "low_val": "0",          
+          "up_val": "1000"
+         }, 
+         {...},{...},...
+        ]
+    """
+    
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.servicename = self.pathinfo[2]
+        self.procedurename =  self.pathinfo[4]
+        self.procedureFolder = os.path.join(self.servicepath, "virtual", self.procedurename)
+        self.RCfilename = os.path.join(self.procedureFolder, self.procedurename + ".rcv")
+        
+    def executeGet(self):
+        #filename = self.RCpath + "/" + self.RCprocedure + ".dat"
+        if not os.path.isfile(self.RCfilename):
+            raise Exception("Rating-curve parameters of procedure <%s> not set" % self.procedurename)
+        
+        RClist = RCload(self.RCfilename)
+        self.setData(RClist)
+        self.setMessage("Rating-curve parameters of procedure <%s> successfully retrived" % self.procedurename)        
+            
+    def executePost(self):
+        """
+        Method for executing a POST requests that create a new SOS observed property
+                  
+        """
+        if not os.path.exists(self.procedureFolder):
+            raise Exception("Virtual procedure <%s> not set" % self.procedurename)         
+            #os.makedirs(self.procedureFolder)        
+        if RCsave(self.json,self.RCfilename):
+            self.setMessage("Rating-curve parameters of procedure <%s> successfully saved" % self.procedurename)               
+            
+    def executeDelete(self):
+        if os.path.isfile(self.RCfilename):
+            os.remove(self.RCfilename)
+        else:
+            raise Exception("Rating-curve parameters of procedure <%s> not set" % self.procedurename)
+        
+def RCload(filename):
+    #load HQ virtual procedure conf file to a list of dictionaries
+    cvlist=[]
+    with open(filename) as f:
+        lines = f.readlines()
+        items = [ i.strip().split("|") for i in lines if i.strip()!=""]
+        fields = items[0]
+        for i in range(1,len(items)):
+            cvdict = {}
+            for f, field in enumerate(fields):
+                cvdict[field]= items[i][f]
+            cvlist.append(cvdict)
+    return cvlist
+
+def RCsave(cvlist,filename):
+
+    lines = []
+    header = ['from','to','low_val','up_val','A','B','C','K']
+    #check cvlist validity and save to HQ virtual procedure conf file
+    for item in cvlist:
+        try:
+            if not item["from"] < item["to"]:
+                raise Exception, 'Error: <from> %s not before of <to> %s' %(item["from"],item["to"])
+            line = [ item[h] for h in header ]
+            lines.append(line)
+        except Exception as e:
+            raise Exception("Error: invalid HQ parameter list; %s" % str(e) )
+    
+    lines.sort()
+    for i in range(1,len(lines)):
+        if lines[i][0]==lines[i-1][0] and lines[i][1]==lines[i-1][1]:
+            if not lines[i][2] == lines[i-1][3]:
+                raise Exception, 'Error: series of HQ curve same period multilevel wrong; check <from> %s' %(lines[i][0])
+        elif not lines[i][0]==lines[i-1][1]:
+            raise Exception, 'Error: series of HQ curve not continue; check <from> %s' %(lines[i][0])
+    
+    with open (filename, 'w') as f:
+        f.write("|".join(header) + "\n")
+        for line in lines:
+            f.write ("|".join(line) + "\n")
+    
+    return True
+        
+
+"""    
+from|to|low_val|up_val|A|B|C|K
+1982-
+"""
diff --git a/walib/istsos/services/virtualprocedures/virtualprocedures.py b/walib/istsos/services/virtualprocedures/virtualprocedures.py
new file mode 100755
index 0000000..0aef394
--- /dev/null
+++ b/walib/istsos/services/virtualprocedures/virtualprocedures.py
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+
+from walib import databaseManager, utils
+from walib.istsos.services.procedures.procedures import waProcedures
+from walib.resource import waResourceService
+
+import os, sys
+import shutil
+
+# istsos/services/test/virtualprocedures/Q_TEST
+class waVirtualProcedures(waProcedures):
+    
+    def __init__(self,waEnviron):
+        super(waProcedures, self).__init__(waEnviron)
+        self.servicename = self.pathinfo[2]
+        if not self.pathinfo[-1]=="virtualprocedures" and len(self.pathinfo)>4:
+            self.procedurename = self.pathinfo[4]
+        else:
+            self.procedurename = None
+            
+    def executePost(self):
+        if not self.procedurename==None:
+            raise Exception("POST action with url procedure name not supported")
+        
+        waProcedures.executePost(self)
+        if not self.response['success'] == True:
+            self.procedurename = self.json["system"]
+            self.executeDelete()
+            raise Exception("Error in registering %s" %(self.json["system"]))  
+                
+            
+    def executeDelete(self):
+        if self.procedurename==None:
+            raise Exception("Delete action without url procedure name not supported")
+        
+        #==================================
+        # delete the procedure
+        #==================================
+        #print >> sys.stderr, "Deleting procedure.."
+        waProcedures.executeDelete(self)
+        #print >> sys.stderr, " > success: %s"  % self.response['success']
+        if self.response['success'] == True:
+            #==================================
+            # remove the virtual files and folders
+            #==================================
+            procedureFolder = os.path.join(self.servicepath, "virtual", self.procedurename)
+            if os.path.exists(procedureFolder):
+                shutil.rmtree(procedureFolder)
+        else:
+            raise Exception("deleting procedure error!")
+            
+    def executeGet(self):
+        if self.procedurename==None:
+            raise Exception("GET action without url procedure name not supported")
+        #==================================
+        # get the procedure
+        #==================================
+        waProcedures.executeGet(self)
+        
+    def executePut(self):
+        if self.procedurename==None:
+            raise Exception("GET action without url procedure name not supported")
+        #==================================
+        # update the procedure
+        #==================================
+        waProcedures.executePut(self)
+ 
+"""
+{
+        "system_id": "uniqueid1",
+        "system": "Q_TEST",
+        "description": "ciao",
+        "keywords": "uno,due,tre",
+        "identification": [],
+        "classification": [
+            {
+                "name": "System Type",
+                "definition": "urn:ogc:def:classifier:x-istsos:1.0:systemType",
+                "value": "virtual"
+            },
+            {
+                "name": "Sensor Type",
+                "definition": "urn:ogc:def:classifier:x-istsos:1.0:sensorType",
+                "value": "bukket"
+            }
+        ],
+        "characteristics": "",
+        "contacts": [],
+        "documentation": [],
+        "location": {
+            "type": "Feature",
+            "geometry": {
+                "type": "Point",
+                "coordinates": ["123","456"]
+            },
+            "crs": {
+                "type": "name",
+                "properties": {"name": "EPSG:21781"}
+            },
+            "properties": {"name": "LUGANO"}
+        },
+        "interfaces": "",
+        "inputs": [],
+        "history": [],
+        "capabilities": [],
+        "outputs": [
+            {
+                "name": "Time",
+                "definition": "urn:ogc:def:dataType:x-istsos:1.0:time",
+                "uom": "iso8601",
+                "description": "",
+                "constraint": {
+                    "role": "urn:x-ogc:def:classifiers:x-istsos:1.0:dataAvailability",
+                    "min": "",
+                    "max": "",
+                    "interval": [123,456],
+                    "valuelist": ""
+                }
+            },
+            {
+                "name": "Discharge",
+                "definition": "urn:x-ogc:def:phenomenon:x-istsos:1.0:discharge",
+                "uom": "Pressure",
+                "description": "foo bar",
+                "constraint": {
+                    "role": "urn:x-ogc:def:classifiers:x-istsos:1.0:qualityIndex:check:reasonable",
+                    "interval": ["12","65"]
+                }
+            }
+        ]
+    }
+"""
+
+
+
+class waGetlist(waResourceService):
+    """
+    Class to execute istsos/services/{serviceName}/virtualprocedures/operations/getlist
+    """
+    def __init__(self,waEnviron):
+        waResourceService.__init__(self,waEnviron)
+        self.servicename = self.pathinfo[2]
+        
+    def executeGet(self):
+        if self.servicename == "default":
+            raise Exception("getlist operation can not be done for default service instance.")
+        else:
+            data = []
+            servicedb = databaseManager.PgDB(self.serviceconf.connection['user'],
+                                            self.serviceconf.connection['password'],
+                                            self.serviceconf.connection['dbname'],
+                                            self.serviceconf.connection['host'],
+                                            self.serviceconf.connection['port']
+            )
+            proceduresList = utils.getProcedureNamesList(servicedb,self.servicename,observationType='virtual')
+            for proc in proceduresList:
+                elem = {}
+                elem.update(proc)
+                #elem["name"] = proc["name"]
+                ops = utils.getObservedPropertiesFromProcedure(servicedb,self.servicename,proc["name"])
+                if ops != None:
+                    elem["observedproperties"] = [ {"name" : op["name"], "uom" : op["uom"]  } for op in ops ]
+                else:
+                    elem["observedproperties"] = []
+                offs = utils.getOfferingsFromProcedure(servicedb,self.servicename,proc["name"])
+                if offs != None:
+                    elem["offerings"] = [ off["name"] for off in offs ]
+                else:
+                    elem["offerings"] = []
+                data.append(elem)
+            
+            self.setData(data)
+            self.setMessage("Procedures of service <%s> successfully retrived" % self.servicename)
+            
+        
diff --git a/walib/procedure.py b/walib/procedure.py
new file mode 100755
index 0000000..1f3e402
--- /dev/null
+++ b/walib/procedure.py
@@ -0,0 +1,881 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import sys, traceback
+import json
+from lib.etree import et
+from walib import utils as ut
+
+reurl = r'(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?'
+
+def parse_and_get_ns(file):
+    events = "start", "start-ns"
+    root = None
+    ns = {}
+    for event, elem in et.iterparse(file, events):
+        if event == "start-ns":
+            if elem[0] in ns and ns[elem[0]] != elem[1]:
+                # NOTE: It is perfectly valid to have the same prefix refer
+                #   to different URI namespaces in different parts of the
+                #   document. This exception serves as a reminder that this
+                #   solution is not robust.  Use at your own peril.
+                raise KeyError("Duplicate prefix with different URI found.")
+            ns[elem[0]] = "%s" % elem[1]
+        elif event == "start":
+            if root is None:
+                root = elem 
+    return et.ElementTree(root), ns
+
+
+class Procedure():
+    def __init__(self, serviceconf=None):
+        """
+        Create the the self.data object representing the istSOS SensorML
+        """
+        self.data = {}
+        self.serviceconf = serviceconf
+    
+    def loadJSON(self, describeSensorObj):
+        """
+        Create the the self.data object representing the istSOS SensorML from a json elemet
+        
+        @param json: a json describeSensor object
+        """
+        self.data = json.loads(describeSensorObj)
+
+    
+    def loadDICT(self, describeSensorObj):
+        """
+        Create the the self.data object representing the istSOS SensorML from a json elemet
+        
+        @param json: a json describeSensor object
+        """
+        self.data = describeSensorObj
+        
+    def loadXML(self, xml):
+        """
+        Create the the self.data object representing the istSOS SensorML from an XML elemet
+        
+        @param json: a json describeSensor object (xml string or xml file full path)
+        """
+        if type(xml)==type("ciao"):
+            from os import path
+            if path.isfile(xml):
+                tree, ns = parse_and_get_ns(xml)
+            else:
+                from StringIO import StringIO
+                tree, ns = parse_and_get_ns(StringIO(xml))
+        else:
+            raise TypeError("xml input must be a string representing the XML itself or the path to the file where the XML is stored")
+            #tree, ns = parse_and_get_ns(xml)
+        
+        #-----System name/identifier------
+        system = tree.find("{%s}member/{%s}System" %(ns['sml'],ns['sml']) )
+        try:
+            self.data['system_id'] = system.attrib[ "{%s}id" % ns['gml'] ]
+        except:
+            raise SyntaxError("Error in <sml:member>: <sml:System> element or mandatory attribute are missing")
+        
+        systemname = tree.find("{%s}member/{%s}System/{%s}name" %(ns['sml'],ns['sml'],ns['gml']) )
+        try:
+            self.data['system'] = systemname.text.strip()
+        except:
+            raise SyntaxError("Error in <sml:System>: <sml:name> element is missing")
+        
+        
+        #-----System description------
+        desc = tree.find("{%s}member/{%s}System/{%s}description" %(ns['sml'],ns['sml'],ns['gml']) )
+        try:
+            self.data['description'] = desc.text.strip()
+        except:
+            self.data['description'] = ""
+        
+        #-----System Search Keywords------
+        keys = tree.findall("{%s}member/{%s}System/{%s}keywords/{%s}KeywordList/{%s}keyword" %((ns['sml'],)*5))
+        try:
+            self.data['keywords'] = ",".join([key.text.strip() for key in keys])
+        except:
+            self.data['keywords'] = ""
+        
+        #-----System Classifiers------
+        self.data['identification'] = []
+        idents = tree.findall("{%s}member/{%s}System/{%s}identification/{%s}IdentifierList/{%s}identifier" %((ns['sml'],)*5))
+        for ident in idents:
+            try:
+                defin = ident.find('{%s}Term' % ns['sml']).attrib['definition']
+                item={}
+                item["name"] = defin.split(':')[-1]
+                item["definition"] = defin
+                item["value"] = ident.find('{%s}Term/{%s}value' %(ns['sml'],ns['sml'])).text.strip()
+                self.data['identification'].append(item)
+            except:
+                raise SyntaxError("Error in <swe:identification>: some <sml:identifier> mandatory sub elements or attributes are missing")
+        
+        #-----System Identifiers------
+        self.data["classification"] = []
+        man=[False,False]
+        classifiers = tree.findall("{%s}member/{%s}System/{%s}classification/{%s}ClassifierList/{%s}classifier" %((ns['sml'],)*5))
+        for classifier in classifiers:
+            try:
+                item={}
+                item["name"] = classifier.attrib['name']
+                item["definition"] = classifier.find('{%s}Term' % ns['sml']).attrib['definition']
+                item["value"] = classifier.find('{%s}Term/{%s}value' %(ns['sml'],ns['sml'])).text.strip()
+                self.data['classification'].append(item)
+                if item["name"] == "System Type":
+                    man[0]=True
+                elif item["name"] == "Sensor Type":
+                    man[1]=True
+            except:
+                raise SyntaxError("Error in <swe:classification>: some <sml:classifier> mandatory sub elements or attributes are missing")
+        if not man==[True,True]:
+            raise SyntaxError("Error in <sml:ClassifierList>: 'System Type' and 'Sensor Type' classifiers are both mandatory")
+        
+        #-----System Characteristics------
+        try:
+            self.data["characteristics"] = tree.find("{%s}member/{%s}System/{%s}characteristics" %((ns['sml'],)*3)).attrib[ "{%s}href" % ns['xlink'] ]
+        except:
+            self.data["characteristics"] = ""
+        
+        #-----System Capabilities------
+        self.data["capabilities"] = []
+        fields = tree.findall("{%s}member/{%s}System/{%s}capabilities/{%s}DataRecord/{%s}field" %(ns['sml'],ns['sml'],ns['sml'],ns['swe'],ns['swe']))
+        man=[False,False]
+        for field in fields:
+            try:
+                item={}
+                item["name"] = field.attrib['name']
+                fieldchield = field.find('{%s}Quantity' % ns['swe'])
+                if fieldchield == None:
+                    fieldchield = field.find('{%s}Category' % ns['swe'])
+                item["definition"] = fieldchield.attrib['definition']
+                
+                uom = fieldchield.find('{%s}uom' % ns['swe'] )
+                value = fieldchield.find('{%s}value' % ns['swe'] )
+                
+                if uom != None and value != None:
+                    item["uom"] = uom.attrib['code']
+                    item["value"] = value.text.strip()
+                
+                self.data['capabilities'].append(item)
+                if item["name"] == 'Sampling time resolution':
+                    man[0]=True
+                elif item["name"] == 'Acquisition time resolution':
+                    man[1]=True
+            except:
+                raise SyntaxError("Error in <swe:capabilities>: some <swe:field> mandatory sub elements or attributes are missing")
+        #if not man==[True,True]:
+        #    raise SyntaxError("Error in <sml:capabilities>: 'Sampling time resolution' and 'Acquisition time resolution' fields are both mandatory")
+        
+        #-----Relevant Contacts------
+        self.data["contacts"] = []
+        contacts = tree.findall("{%s}member/{%s}System/{%s}contact" %((ns['sml'],)*3))
+        for contact in contacts:
+            try:
+                item={}
+                item["role"] = contact.attrib["{%s}role"  % ns['xlink']]
+                cont = contact.find("{%s}ResponsibleParty" % ns['sml'])
+                item["organizationName"] = cont.find("{%s}organizationName" % ns['sml']).text.strip()
+                try:
+                    item["individualName"] = cont.find("{%s}individualName" % ns['sml']).text.strip()
+                except:
+                    item["individualName"] = ""
+                try:
+                    item["voice"] = cont.find("{%s}contactInfo/{%s}phone/{%s}voice" %((ns['sml'],)*3)).text.strip()
+                except:
+                    item["voice"] = ""   
+                try:
+                    item["fax"] = cont.find("{%s}contactInfo/{%s}phone/{%s}facsimile" %((ns['sml'],)*3)).text.strip()
+                except:
+                    item["fax"] = "" 
+                try:
+                    item["deliveryPoint"] = cont.find("{%s}contactInfo/{%s}address/{%s}deliveryPoint" %((ns['sml'],)*3)).text.strip()
+                except:
+                    item["deliveryPoint"] = ""
+                try:
+                    item["city"] = cont.find("{%s}contactInfo/{%s}address/{%s}city" %((ns['sml'],)*3)).text.strip()
+                except:
+                    item["city"] = ""
+                try:
+                    item["administrativeArea"] = cont.find("{%s}contactInfo/{%s}address/{%s}administrativeArea" %((ns['sml'],)*3)).text.strip()
+                except:
+                    item["administrativeArea"] = ""
+                try:
+                    item["postalcode"] = cont.find("{%s}contactInfo/{%s}address/{%s}postalCode" %((ns['sml'],)*3)).text.strip()
+                except:
+                    item["postalcode"] = ""
+                try:
+                    item["country"] = cont.find("{%s}contactInfo/{%s}address/{%s}country" %((ns['sml'],)*3)).text.strip()
+                except:
+                    item["country"] = ""
+                try:
+                    item["email"] = cont.find("{%s}contactInfo/{%s}address/{%s}electronicMailAddress" %((ns['sml'],)*3)).text.strip()
+                except:
+                    item["email"] = ""
+                try:
+                    item["web"] = cont.find("{%s}contactInfo/{%s}onlineResource" %((ns['sml'],)*2)).attrib["{%s}href" % ns['xlink']]
+                except:
+                    item["web"] = ""
+                self.data["contacts"].append(item)
+            except:
+                raise SyntaxError("Error in <swe:contact>: some <swe:contact> mandatory sub elements or attributes are missing")
+            
+        
+        #-----System Documentation------            
+        self.data["documentation"] = []
+        documents = tree.findall("{%s}member/{%s}System/{%s}documentation/{%s}Document" %((ns['sml'],)*4))
+        for doc in documents:
+            try:
+                item = {}
+                item["description"] = doc.find("{%s}description" % ns['gml']).text.strip()
+                item["link"] = doc.find("{%s}onlineResource" % ns['sml']).attrib["{%s}href" % ns['xlink'] ]
+                try:
+                    item["date"] = doc.find("{%s}date" % ns['sml']).text.strip()
+                except:
+                    item["date"] = ""
+                try:
+                    item["format"] = doc.find("{%s}format" % ns['sml']).text.strip()
+                except:
+                    item["format"] = ""
+                    
+                self.data["documentation"].append(item)
+                
+            except:
+                raise SyntaxError("Error in <swe:documentation>: some <swe:Document> mandatory sub elements or attributes are missing")
+                
+        #-----System Location------            
+        point = tree.find("{%s}member/{%s}System/{%s}location/{%s}Point" %(ns['sml'],ns['sml'],ns['sml'],ns['gml']) )
+        coord = tree.find("{%s}member/{%s}System/{%s}location/{%s}Point/{%s}coordinates" %(ns['sml'],ns['sml'],ns['sml'],ns['gml'],ns['gml']))
+        
+        try:
+            coordlist = [ i for i in coord.text.strip().split(",")]
+            self.data["location"] = {}
+            self.data["location"]["type"] = "Feature"
+            self.data["location"]["geometry"] = {}
+            self.data["location"]["geometry"]["type"] = "Point"
+            self.data["location"]["geometry"]["coordinates"] = coordlist
+            self.data["location"]["crs"] = {}
+            self.data["location"]["crs"]["type"] = "name"
+            self.data["location"]["crs"]["properties"] = {}
+            self.data["location"]["crs"]["properties"]["name"] = point.attrib["srsName"]
+            self.data["location"]["properties"] = {}
+            self.data["location"]["properties"]["name"] = point.attrib["{%s}id" % ns['gml'] ]
+        except:
+            raise SyntaxError("Error in <swe:location>: some mandatory <gml:Point> sub elements or attributes are missing")
+            
+        
+        #-----System Interfaces------
+        interfaces = tree.findall("{%s}member/{%s}System/{%s}interfaces/{%s}InterfaceList/{%s}interface" %((ns['sml'],)*5))
+        try:
+            self.data["interfaces"] = ",".join([ interface.attrib["name"] for interface in interfaces ])
+        except:
+            raise SyntaxError("Error in <swe:interfaces>: some mandatory sub elements or attributes are missing")
+        
+        #-----System Inputs------
+        inputs = tree.findall("{%s}member/{%s}System/{%s}inputs/{%s}InputList/{%s}input" %((ns['sml'],)*5))
+        self.data["inputs"] = []
+        for inp in inputs:
+            try:
+                item = {}
+                item["name"] = inp.attrib["name"]
+                item["definition"] = inp.find("{%s}Quantity" % ns['swe']).attrib["definition"]
+                try:
+                    item["description"] = inp.find("{%s}Quantity/{%s}description" %(ns['swe'],ns['gml'])).text.strip()
+                except:
+                    item["description"] = ""
+                self.data["inputs"].append(item)
+            except:
+                raise SyntaxError("Error in <swe:inputs>: some <swe:input> mandatory sub elements or attributes are missing")
+                
+            
+        #-----System Outputs------
+        outputs = tree.findall("{%s}member/{%s}System/{%s}outputs/{%s}OutputList/{%s}output/{%s}DataRecord/{%s}field" 
+                                %( (ns['sml'],)*5 + (ns['swe'],)*2) )
+        self.data["outputs"] = []
+        time = False
+        for out in outputs:
+            try:
+                item={}
+                item["name"] = out.attrib["name"]
+                if out.attrib["name"] == "Time":
+                    time = True
+                    child = out.find("{%s}Time" % ns['swe'] )
+                    allow = child.find("{%s}constraint/{%s}AllowedTimes" %(ns['swe'],ns['swe']))
+                else:
+                    child =  out.find("{%s}Quantity" % ns['swe'] )
+                    allow = child.find("{%s}constraint/{%s}AllowedValues" %(ns['swe'],ns['swe']))  
+                item["definition"] = child.attrib["definition"]
+                try:
+                    item["description"] = child.find("{%s}description" % ns['gml']).text.strip()
+                except:
+                    item["description"] = ""
+                    
+                try:
+                    item["uom"] = child.find("{%s}uom" % ns['swe']).attrib["code"]
+                except:
+                    item["uom"] = ""
+                
+                
+                if allow:
+                
+                    item["constraint"] = {}
+                     
+                    try:
+                        item["constraint"]["role"] = child.find("{%s}constraint" % ns['swe']).attrib["{%s}role" % ns['xlink']]
+                    except:
+                        pass
+    
+                    try:
+                        item["constraint"]["min"] = allow.find("{%s}min" % ns['swe']).text.strip()
+                    except:
+                        pass #item["constraint"]["min"] = ""
+    
+                    try:
+                        item["constraint"]["max"] = allow.find("{%s}max" % ns['swe']).text.strip()
+                    except:
+                        pass #item["constraint"]["max"] = ""
+    
+                    try:
+                        item["constraint"]["interval"] = allow.find("{%s}interval" % ns['swe']).text.strip().split(" ")
+                    except:
+                        pass #item["constraint"]["interval"] = ""
+                    
+                    try:
+                        item["constraint"]["valuelist"] = allow.find("{%s}valueList" % ns['swe']).text.strip().split(" ")
+                    except:
+                        pass #item["constraint"]["valuelist"] = ""
+                
+                self.data["outputs"].append(item)
+                
+            except Exception as ex:
+                print >> sys.stderr, traceback.print_exc()
+                raise SyntaxError("Error in <sml:outputs>: some <swe:field> mandatory sub elements or attributes are missing")
+        if time==False:
+            raise SyntaxError("Error in <sml:outputs>: <swe:Time> is mandatory")
+
+        #-----System History------
+        events = tree.findall("{%s}member/{%s}System/{%s}history/{%s}EventList/{%s}member" %( (ns['sml'],)*5 ) )
+        self.data["history"] = []
+        for event in events:
+            try:
+                item = {}
+                item["type"] = event.attrib["name"]
+                item["date"] = event.find("{%s}Event/{%s}date" %((ns['sml'],)*2) ).text.strip()
+                try:
+                    item["description"] = event.find("{%s}Event/{%s}description" %(ns['sml'],ns['gml']) ).text.strip()
+                except:
+                    item["description"] = ""
+                item["reference"] = {}
+                item["reference"]["username"] = event.find("{%s}Event/{%s}contact" %((ns['sml'],)*2) ).attrib["{%s}href" % ns['xlink']]
+                item["reference"]["role"] = event.find("{%s}Event/{%s}contact" %((ns['sml'],)*2) ).attrib["{%s}arcrole" % ns['xlink']]
+                self.data["history"].append(item)
+            except:
+                raise SyntaxError("Error in <sml:history>: some <sml:member> mandatory sub elements or attributes are missing")
+        
+        
+    def toJSON(self):
+        """
+        Return the Json that represent the self.data object as L{string}
+        """
+        return json.dumps(self.data, ensure_ascii=False)
+        
+    def toXML(self,indent=False):
+        """
+        Return the SensorML that represent the self.data object as L{string}
+        """
+        import sys
+        ns = {
+            'xsi': "http://www.w3.org/2001/XMLSchema-instance" ,
+            'sml': "http://www.opengis.net/sensorML/1.0.1", 
+            'swe': "http://www.opengis.net/swe/1.0.1", 
+            'xlink': "http://www.w3.org/1999/xlink", 
+            'gml': 'http://www.opengis.net/gml'            
+        }
+           
+        #---map namespaces---
+        try:
+            register_namespace = et.register_namespace
+            for key in ns:
+                register_namespace(key,ns[key])
+        except AttributeError:
+            try:
+                et._namespace_map.update(ns)
+                for key in ns:
+                    et._namespace_map[ns[key]] = key
+            except AttributeError:
+                try:
+                    from xml.etree.ElementTree import _namespace_map
+                except ImportError:
+                    try:
+                        from elementtree.ElementTree import _namespace_map
+                    except ImportError:
+                        print >> sys.stderr, ("Failed to import ElementTree from any known place")
+                for key in ns:
+                    _namespace_map[ns[key]] = key
+        
+        root = et.Element("{%s}SensorML" % ns['sml'])
+        root.attrib[ "{%s}schemaLocation" % ns['xsi'] ] = "http://www.opengis.net/sensorML/1.0.1 http://schemas.opengis.net/sensorML/1.0.1/sensorML.xsd"
+        root.attrib["version"] = "1.0"
+                   
+        member = et.SubElement(root, "{%s}member" % ns['sml'] )
+        
+        system = et.SubElement(member, "{%s}System" % ns['sml'] )
+        system.attrib["{%s}id" % ns['gml'] ] = self.data["system_id"]
+
+        #--- System Description
+        system.append(et.Comment("System Description"))        
+        
+        if ("keywords" in self.data) and (not self.data["description"]==""):
+            desc = et.SubElement(system, "{%s}description" % ns['gml'] )
+            desc.text = self.data["description"]
+        
+        name = et.SubElement(system, "{%s}name" % ns['gml'] )
+        name.text = self.data["system"]
+        
+        #--- System Search Keywords
+        if ("keywords" in self.data) and (not self.data["keywords"]==""):
+            system.append(et.Comment("System Search Keywords"))
+            keys = et.SubElement(system, "{%s}keywords" % ns['sml'] )
+            keylist = et.SubElement(keys, "{%s}KeywordList" % ns['sml'] )
+            for k in self.data["keywords"].split(","):
+                key = et.SubElement(keylist, "{%s}keyword" % ns['sml'] )
+                key.text = k
+        
+        #--- System Identifiers
+        if ("identification" in self.data) and (not self.data["identification"]==[]):
+            system.append(et.Comment("System Identifiers"))
+            identification = et.SubElement(system, "{%s}identification" % ns['sml'] )
+            IdentifierList = et.SubElement(identification, "{%s}IdentifierList" % ns['sml'] )
+            uniqueidPresent = False
+            for i in  self.data["identification"]:
+                if i["definition"] == 'urn:ogc:def:identifier:OGC:uniqueID':
+                    uniqueidPresent = True
+                identifier = et.SubElement(IdentifierList, "{%s}identifier" % ns['sml'] )
+                identifier.attrib["name"] = i["name"]
+                term = et.SubElement(identifier, "{%s}Term" % ns['sml'] )
+                term.attrib["definition"] = i["definition"]
+                value = et.SubElement(term, "{%s}value" % ns['sml'])
+                value.text = i["value"]
+            if not uniqueidPresent:
+                raise Exception("self.data['identification']: 'uniqueID' is mandatory")
+        
+        #--- System Classifiers
+        system.append(et.Comment("System Classifiers"))
+        classification = et.SubElement(system, "{%s}classification" % ns['sml'] )
+        ClassifierList = et.SubElement(classification, "{%s}ClassifierList" % ns['sml'])
+        for c in self.data["classification"]:
+            classifier = et.SubElement(ClassifierList, "{%s}classifier" % ns['sml'] )
+            classifier.attrib["name"] = c["name"]
+            term = et.SubElement(classifier, "{%s}Term" % ns['sml'] )
+            term.attrib["definition"] = c["definition"]
+            value = et.SubElement(term, "{%s}value" % ns['sml'] )
+            value.text = c["value"]
+            if c["name"]=="System Type":
+                systype = True
+            elif c["name"]=="Sensor Type":
+                senstype = True
+        if not systype == True and senstype == True:
+            raise Exception("self.data['classification']: 'System Type' and 'Sensor Type' are mandatory")
+        
+        #--- System Characteristics 
+        if ("characteristics" in self.data) and ( not self.data["characteristics"] == ""):
+            system.append(et.Comment("System Characteristics"))
+            characteristics = et.SubElement(system, "{%s}characteristics" % ns['sml'])
+            characteristics.attrib[ "{%s}href" % ns['xlink'] ] = self.data["characteristics"]
+        
+        #--- System Capabilities 
+        system.append(et.Comment("System Capabilities"))
+        capabilities = et.SubElement(system, "{%s}capabilities" % ns['sml'])
+        DataRecord = et.SubElement(capabilities, "{%s}DataRecord" % ns['swe'])
+        stres = False
+        atres = False
+        for f in self.data["capabilities"]:
+            field = et.SubElement(DataRecord, "{%s}field" % ns['swe'])
+            field.attrib[ "name" ] =f["name"]
+            Quantity = et.SubElement(field, "{%s}Quantity" % ns['swe'])
+            Quantity.attrib[ "definition" ] =f["definition"]
+            if "uom" in f and "value" in f :
+                uom = et.SubElement(Quantity, "{%s}uom" % ns['swe'])
+                uom.attrib[ "code" ] =f["uom"]
+                value = et.SubElement(Quantity, "{%s}value" % ns['swe'])
+                value.text =f["value"]
+            if c["name"]=="Sampling time resolution":
+                stres = True
+            elif c["name"]=="Acquisition time resolution":
+                atres = True
+        if not stres == True and atres == True:
+            raise Exception("self.data['capabilities']: 'Sampling time resolution' and 'Acquisition time resolution' are mandatory")
+        
+        #--- Relevant Contacts 
+        if  ("contacts" in self.data) and (not self.data["contacts"] == []):
+            system.append(et.Comment("Relevant Contacts"))
+            for c in self.data["contacts"]:
+                contact = et.SubElement(system, "{%s}contact" % ns['sml'])
+                contact.attrib["{%s}role" % ns['xlink']] = c["role"]
+                ResponsibleParty = et.SubElement(contact, "{%s}ResponsibleParty" % ns['sml'])
+                if not c["individualName"] == "":
+                    individualName = et.SubElement(ResponsibleParty, "{%s}individualName" % ns['sml'])
+                    individualName.text = c["individualName"]
+                organizationName = et.SubElement(ResponsibleParty, "{%s}organizationName" % ns['sml'])
+                organizationName.text = c["organizationName"]
+                phonetag = not c["voice"] == c["fax"] == ""
+                addresstag = not c["deliveryPoint"] == c["city"] == c["administrativeArea"] == c["postalcode"] == c["country"] == c["email"] == ""
+                onlineResourcetag = not c["web"] == ""
+                if not phonetag == addresstag == onlineResourcetag == False:
+                    contactInfo = et.SubElement(ResponsibleParty, "{%s}contactInfo" % ns['sml'])
+                    if not phonetag==False:
+                        phone = et.SubElement(contactInfo, "{%s}phone" % ns['sml'])
+                        if not c["voice"] == "":
+                            voice = et.SubElement(phone, "{%s}voice" % ns['sml'])
+                            voice.text = c["voice"]
+                        if not c["fax"] == "":
+                            facsimile = et.SubElement(phone, "{%s}facsimile" % ns['sml'])
+                            facsimile.text = c["fax"]
+                    if not addresstag==False:
+                        address = et.SubElement(contactInfo, "{%s}address" % ns['sml'])
+                        if not c["deliveryPoint"] == "":
+                            deliveryPoint = et.SubElement(address, "{%s}deliveryPoint" % ns['sml'])
+                            deliveryPoint.text = c["deliveryPoint"]
+                        if not c["city"] == "":
+                            city = et.SubElement(address, "{%s}city" % ns['sml'])
+                            city.text = c["city"]
+                        if not c["administrativeArea"] == "":
+                            administrativeArea = et.SubElement(address, "{%s}administrativeArea" % ns['sml'])
+                            administrativeArea.text = c["administrativeArea"]
+                        if not c["postalcode"] == "":
+                            postalCode = et.SubElement(address, "{%s}postalCode" % ns['sml'])
+                            postalCode.text = c["postalcode"]
+                        if not c["country"] == "":
+                            country = et.SubElement(address, "{%s}country" % ns['sml'])
+                            country.text = c["country"]
+                        if not c["email"] == "":
+                            electronicMailAddress = et.SubElement(address, "{%s}electronicMailAddress" % ns['sml'])
+                            electronicMailAddress.text = c["email"]
+                    if not onlineResourcetag==False:
+                        onlineResource = et.SubElement(contactInfo, "{%s}onlineResource" % ns['sml'])
+                        onlineResource.attrib["{%s}href" % ns['xlink'] ] = c["web"]
+                        
+        #--- System Documentation 
+        if ("documentation" in self.data) and (not self.data["documentation"] == []):
+            system.append(et.Comment("System Documentation"))
+            for d in self.data["documentation"]:
+                documentation = et.SubElement(system, "{%s}documentation" % ns['sml'])
+                Document = et.SubElement(documentation, "{%s}Document" % ns['sml'])
+                description = et.SubElement(Document, "{%s}description" % ns['gml'])
+                description.text = d["description"]
+                if not d["date"]=="":
+                    date = et.SubElement(Document, "{%s}date" % ns['sml'])
+                    date.text = d["date"]
+                if not d["format"]=="":
+                    format = et.SubElement(Document, "{%s}format" % ns['sml'])
+                    format.text = d["format"]    
+                onlineResource = et.SubElement(Document, "{%s}onlineResource" % ns['sml'])
+                onlineResource.attrib["{%s}href" % ns['xlink'] ] = d["link"]
+        
+        #--- System Location
+        system.append(et.Comment("System Location"))
+        location = et.SubElement(system, "{%s}location" % ns['sml'])
+        for item in self.data["classification"]:
+            if item["name"] == "System Type":
+                if item["value"].find("mobile")>0:
+                    location.attrib[ "{%s}role" % ns['xlink'] ] = "urn:ogc:def:dataType:x-istsos:1.0:lastPosition"
+        Point = et.SubElement(location, "{%s}Point" % ns['gml'])
+
+        if ut.valid_NCName(self.data["location"]["properties"]["name"]):
+            Point.attrib[ "{%s}id" % ns['gml'] ] = self.data["location"]["properties"]["name"]
+        else:
+            raise Exception ("Invalid location name (gml:id only allows alphanumeric characters")
+        Point.attrib[ "srsName" ] = "EPSG:"+str(self.data["location"]["crs"]["properties"]["name"])
+        coordinates = et.SubElement(Point, "{%s}coordinates" % ns['gml'])
+        coordinates.text = ",".join([ str(a) for a in self.data["location"]["geometry"]["coordinates"] ])
+        
+        #--- System Interfaces
+        if ("interfaces" in self.data) and (not self.data["interfaces"]==""):
+            system.append(et.Comment("System Interfaces"))
+            interfaces = et.SubElement(system, "{%s}interfaces" % ns['sml'])
+            InterfaceList = et.SubElement(interfaces, "{%s}InterfaceList" % ns['sml'])
+            for i in self.data["interfaces"].split(","):
+                interface = et.SubElement(InterfaceList, "{%s}interface" % ns['sml'])
+                interface.attrib["name"] = i
+        
+        #--- System Inputs # Not yet supported in waAdmin !!
+        if ("inputs" in self.data) and (not self.data["inputs"]==[]):
+            system.append(et.Comment("System Inputs"))
+            inputs = et.SubElement(system, "{%s}inputs" % ns['sml'])
+            InputList = et.SubElement(inputs, "{%s}InputList" % ns['sml'])
+            for inp in self.data["inputs"]:
+                inputml = et.SubElement(InputList, "{%s}input" % ns['sml'])
+                inputml.attrib["name"] = inp["name"]
+                Quantity = et.SubElement(inputml, "{%s}Quantity" % ns['swe'])
+                Quantity.attrib["definition"] = inp["definition"]
+                if not inp["description"]=="":
+                    description = et.SubElement(Quantity, "{%s}description" % ns['gml'])
+                    description.text = inp["description"]
+        
+        #--- System Outputs
+        timetag = False
+        system.append(et.Comment("System Outputs"))
+        outputs = et.SubElement(system, "{%s}outputs" % ns['sml'])
+        OutputList = et.SubElement(outputs, "{%s}OutputList" % ns['sml'])
+        output = et.SubElement(OutputList, "{%s}output" % ns['sml'])
+        output.attrib["name"] = "output data"
+        DataRecord = et.SubElement(output, "{%s}DataRecord" % ns['swe'])
+        DataRecord.attrib["definition"] = "urn:ogc:def:dataType:x-istsos:1.0:timeSeries"
+        oid = 0
+        for o in self.data["outputs"]:
+            oid += 1
+            field = et.SubElement(DataRecord, "{%s}field" % ns['swe'])
+            field.attrib["name"] = o["name"]
+            
+            if o["name"] == "Time":
+                timetag = True
+                item = et.SubElement(field, "{%s}Time" % ns['swe'])
+                item.attrib["{%s}id" % ns['gml']] = "IDT_" + str(oid)
+                item.attrib["definition"] = o["definition"]
+                
+                if not o["description"]=="":
+                    description = et.SubElement(item, "{%s}description" % ns['gml'])
+                    description.text = o["description"]
+                    
+                uom = et.SubElement(item, "{%s}uom" % ns['swe'])
+                uom.attrib["code"] = o["uom"]
+                
+                # The constraint object is not mandatory
+                if "constraint" in o and o["constraint"]!={}: # and o["constraint"]["role"]!="" and o["constraint"]["role"]!=None:
+                    
+                    constraint = et.SubElement(item, "{%s}constraint" % ns['swe'])
+                    
+                    # Role attribute is not mandatory
+                    if "role" in o["constraint"] and o["constraint"]["role"]!="" and o["constraint"]["role"]!=None:
+                        constraint.attrib[ "{%s}role" % ns['xlink'] ] = o["constraint"]["role"]
+                        
+                    AllowedTimes = et.SubElement(constraint, "{%s}AllowedTimes" % ns['swe'])
+                    interval = et.SubElement(AllowedTimes, "{%s}interval" % ns['swe'])
+                    interval.text = " ".join([ str(a) for a in o["constraint"]["interval"] ])
+                    
+            else:
+                item = et.SubElement(field, "{%s}Quantity" % ns['swe'])
+                item.attrib["{%s}id" % ns['gml']] = "IDQ_" + str(oid)
+                item.attrib["definition"] = o["definition"]
+                
+                if not o["description"]=="":
+                    description = et.SubElement(item, "{%s}description" % ns['gml'])
+                    description.text = o["description"]
+                    
+                uom = et.SubElement(item, "{%s}uom" % ns['swe'])
+                uom.attrib["code"] = o["uom"]
+                
+                # The constraint object is not mandatory
+                if "constraint" in o and o["constraint"]!={}: # and o["constraint"]["role"]!="" and o["constraint"]["role"]!=None:
+                    print >> sys.stderr, o['constraint']                    
+                    try:
+                        ut.validateJsonConstraint(o['constraint'])
+                    except Exception as ex:
+                        raise Exception("Constraint for observed property '%s' is not valid: %s" % (o["definition"],ex))
+                    
+                    constraint = et.SubElement(item, "{%s}constraint" % ns['swe'])
+                    
+                    # Role attribute is not mandatory
+                    if "role" in o["constraint"] and o["constraint"]["role"]!="" and o["constraint"]["role"]!=None:
+                        constraint.attrib[ "{%s}role" % ns['xlink'] ]= o["constraint"]["role"]
+                        
+                    AllowedValues = et.SubElement(constraint, "{%s}AllowedValues" % ns['swe'])
+                    
+                    # Factory on constraint min/max/interval/valuelist
+                    if "interval" in o["constraint"]:
+                        interval = et.SubElement(AllowedValues, "{%s}interval" % ns['swe'])
+                        interval.text = " ".join([ str(a) for a in o["constraint"]["interval"] ])
+                        
+                        
+                    elif "valueList" in o["constraint"]:#.has_key("valueList"):
+                        valueList = et.SubElement(AllowedValues, "{%s}valueList" % ns['swe'])
+                        valueList.text = " ".join([ str(a) for a in o["constraint"]["valueList"] ])
+                        
+                    elif "min" in o["constraint"]:#.has_key("min"):
+                        amin = et.SubElement(AllowedValues, "{%s}min" % ns['swe'])
+                        amin.text = str(o["constraint"]["min"])
+                        
+                    elif "max" in o["constraint"]:#.has_key("max"):
+                        amax = et.SubElement(AllowedValues, "{%s}max" % ns['swe'])
+                        amax.text = str(o["constraint"]["max"])
+                        
+                        
+        if timetag == False:
+            raise Exception("self.data['outputs']: Time is mandatory")
+        
+        #--- System History
+        if ("history" in self.data) and (not self.data["history"]==[]):
+            system.append(et.Comment("System History"))
+            history = et.SubElement(system, "{%s}history" % ns['sml'])
+            EventList = et.SubElement(history, "{%s}EventList" % ns['sml'])
+            for h in self.data["history"]:
+                member = et.SubElement(EventList, "{%s}member" % ns['sml'])
+                member.attrib["name"] = h["type"]
+                Event = et.SubElement(member, "{%s}Event" % ns['sml'])
+                date = et.SubElement(Event, "{%s}date" % ns['sml'])
+                date.text = h["date"]
+                if not h["description"]=="":
+                    description = et.SubElement(Event, "{%s}description" % ns['gml'])
+                    description.text = h["description"]
+                contact = et.SubElement(Event, "{%s}contact" % ns['sml'])
+                contact.attrib["{%s}href" % ns['xlink'] ] = h["reference"]["username"]
+                contact.attrib["{%s}arcrole" % ns['xlink'] ] = h["reference"]["role"]
+        
+        return et.tostring(root, encoding="UTF-8")
+        
+        
+    def toRegisterSensorDom(self,indent=False):
+        """
+        Create a SOS register sensor request DOM element from self.procedure object
+        """
+        import sys
+        ns = {
+            'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+            'sml': 'http://www.opengis.net/sensorML/1.0.1', 
+            'swe': "http://www.opengis.net/swe/1.0.1", 
+            'xlink': "http://www.w3.org/1999/xlink", 
+            'gml': 'http://www.opengis.net/gml',           
+            'sos': "http://www.opengis.net/sos/1.0",
+            'ogc': "http://www.opengis.net/ogc",
+            'om': "http://www.opengis.net/om/1.0",
+        }
+        
+        #---map namespaces---
+        try:
+            register_namespace = et.register_namespace
+            for key in ns:
+                register_namespace(key,ns[key])
+        except AttributeError:
+            try:
+                et._namespace_map.update(ns)
+                for key in ns:
+                    et._namespace_map[ns[key]] = key
+            except AttributeError:
+                try:
+                    from xml.etree.ElementTree import _namespace_map
+                except ImportError:
+                    try:
+                        from elementtree.ElementTree import _namespace_map
+                    except ImportError:
+                        print >> sys.stderr, ("Failed to import ElementTree from any known place")
+                for key in ns:
+                    _namespace_map[ns[key]] = key
+        
+        #---start creating XML ----        
+        root = et.Element("{%s}RegisterSensor" % ns['sos'])
+        root.attrib[ "{%s}schemaLocation" % ns['xsi'] ] = "http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd"
+        root.attrib["version"] = "1.0.0"
+        root.attrib["service"] = "SOS"
+        
+        SensorDescription = et.SubElement(root, "{%s}SensorDescription" % ns['sos'])
+        
+        sml = self.toXML()
+        #print >> sys.stderr, "SML:%s" % sml
+        from StringIO import StringIO
+        smltree, smlns = parse_and_get_ns(StringIO(sml))
+        member = smltree.find("{%s}member" % ns['sml'] )
+        SensorDescription.append(member)
+        
+        #---         
+        ObservationTemplate = et.SubElement(root, "{%s}ObservationTemplate" % ns['sos'])
+        Observation = et.SubElement(ObservationTemplate, "{%s}Observation" % ns['om'])
+        procedure = et.SubElement(Observation, "{%s}procedure" % ns['om'])
+        procedure.attrib["{%s}href" % ns['xlink']] = "urn:ogc:object:procedure:x-istsos:1.0:"+self.data["system"]
+        
+        samplingTime = et.SubElement(Observation, "{%s}samplingTime" % ns['om'])
+        TimePeriod = et.SubElement(samplingTime, "{%s}TimePeriod" % ns['gml'])
+        beginPosition = et.SubElement(TimePeriod, "{%s}beginPosition" % ns['gml'])
+        endPosition = et.SubElement(TimePeriod, "{%s}endPosition" % ns['gml'])
+
+        observedProperty = et.SubElement(Observation, "{%s}observedProperty" % ns['om'])
+        CompositePhenomenon = et.SubElement(observedProperty, "{%s}CompositePhenomenon" % ns['swe'])
+        CompositePhenomenon.attrib["{%s}id" % ns['gml']] = str("comp_XXX")
+        CompositePhenomenon.attrib["dimension"] = str(len(self.data["outputs"]))
+        name = et.SubElement(CompositePhenomenon, "{%s}name" % ns['gml'])
+        name.text = "timeSeriesOfObservations"
+        for o in self.data["outputs"]:
+            component = et.SubElement(CompositePhenomenon, "{%s}component" % ns['swe'])
+            component.attrib["{%s}href" % ns['xlink']] = o["definition"]
+        
+        featureOfInterest = et.SubElement(Observation, "{%s}featureOfInterest" % ns['om'])
+        featureOfInterest.attrib["{%s}href" % ns['xlink']] = self.data["location"]["properties"]["name"]
+        FeatureCollection = et.SubElement(featureOfInterest, "{%s}FeatureCollection" % ns['gml'])
+        #FeatureCollection = et.SubElement(featureOfInterest, "{%s}FeatureCollection" % ns['gml'])
+        location = et.SubElement(FeatureCollection, "{%s}location" % ns['gml'])
+        Point = et.SubElement(location, "{%s}Point" % ns['gml'])
+        Point.attrib[ "{%s}id" % ns['gml'] ] = "gmlfoi_" + self.data["location"]["properties"]["name"]
+        Point.attrib[ "srsName" ] = self.data["location"]["crs"]["properties"]["name"] if "EPSG:" in self.data["location"]["crs"]["properties"]["name"] else "EPSG:%s" % self.data["location"]["crs"]["properties"]["name"]
+        coordinates = et.SubElement(Point, "{%s}coordinates" % ns['gml'])
+        coordinates.text = ",".join([ str(a) for a in self.data["location"]["geometry"]["coordinates"] ])
+        
+        result = et.SubElement(Observation, "{%s}result" % ns['om'])
+        DataArray = et.SubElement(result, "{%s}DataArray" % ns['swe'])
+        
+        elementCount = et.SubElement(DataArray, "{%s}elementCount" % ns['swe'])
+        count = et.SubElement(elementCount, "{%s}count" % ns['swe'])        
+        value = et.SubElement(count, "{%s}value" % ns['swe'])
+        value.text = str(len(self.data["outputs"]))
+        
+        elementType = et.SubElement(DataArray, "{%s}elementType" % ns['swe'])
+        elementType.attrib["name"] = "SimpleDataArray"
+        elementType.attrib["{%s}href" % ns['xlink']] = "urn:ogc:def:dataType:x-istsos:1.0:timeSeriesDataRecord"
+        
+        DataRecord = smltree.find("{%s}member/{%s}System/{%s}outputs/{%s}OutputList/{%s}output/{%s}DataRecord" 
+                            % (ns['sml'],  ns['sml'],  ns['sml'], ns['sml'],    ns['sml'],  ns['swe'] ) )
+        
+        elementType.append(DataRecord)
+        
+        encoding = et.SubElement(DataArray, "{%s}encoding" % ns['swe'])
+        TextBlock = et.SubElement(encoding, "{%s}TextBlock" % ns['swe'])
+        TextBlock.attrib["tokenSeparator"] = "," 
+        TextBlock.attrib["blockSeparator"] = "@"
+        TextBlock.attrib["decimalSeparator"] = "."
+        
+        #values = et.SubElement(DataArray, "{%s}values" % ns['swe'])
+        
+        return root
+        
+        
+    def toRegisterSensor(self,indent=False):
+        """
+        Create a SOS register sensor request String from self.procedure object
+        """
+        dom = self.toRegisterSensorDom()
+        return et.tostring(dom, encoding="UTF-8")      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+
+
+
+    
+
diff --git a/walib/procedure.pyc b/walib/procedure.pyc
new file mode 100644
index 0000000..6371631
Binary files /dev/null and b/walib/procedure.pyc differ
diff --git a/walib/resource.py b/walib/resource.py
new file mode 100755
index 0000000..935bc2a
--- /dev/null
+++ b/walib/resource.py
@@ -0,0 +1,225 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import sys, os
+from walib import configManager
+from walib import utils as ut
+
+class waResource(object):
+    """
+    Base class for istSOS Web Admin REST operations
+    """
+    
+    def __init__(self, waEnviron,loadjson=True):
+        """
+        Initialize resource object
+        @param waEnviron: waEnviron variable see L(wa)
+        @type waEnviron: C{dictionary}
+        """
+        self.response = {
+            "success": True,
+            "message": ""
+        }
+        self.waEnviron = waEnviron
+        self.method = waEnviron['method']
+        self.pathinfo = waEnviron['pathinfo']
+        self.json = None
+        self.postRequest = None
+        if self.method in ["POST","PUT"] and loadjson==True:
+            import json
+            
+            self.json = ut.encodeobject(json.loads(waEnviron['wsgi_input']))
+    
+    def validateGet(self):
+        """ base method to validate GET request """
+        raise Exception("%s.validateGet method is not implemented!" % self.__class__.__name__)
+        
+    def validatePost(self):
+        """ base method to validate POST request """
+        raise Exception("%s.validatePost method is not implemented!" % self.__class__.__name__)
+        
+    def validatePut(self):
+        """ base method to validate PUT request """
+        raise Exception("%s.validatePut method is not implemented!" % self.__class__.__name__)
+        
+    def validateDelete(self):
+        """ base method to validate DELETE request """
+        raise Exception("%s.validateDelete method is not implemented!" % self.__class__.__name__)
+        
+    def executeGet(self):
+        """ base method to execute GET request """
+        raise Exception("%s.executeGet method is not implemented!" % self.__class__.__name__)
+        
+    def executePost(self):
+        """ base method to execute POST request """
+        raise Exception("%s.executePost method is not implemented!" % self.__class__.__name__)
+        
+    def executePut(self):
+        """ base method to execute PUT request """
+        raise Exception("%s.executePut method is not implemented!" % self.__class__.__name__)
+        
+    def executeDelete(self):
+        """ base method to execute DELETE request """
+        raise Exception("%s.executeDelete method is not implemented!" % self.__class__.__name__)
+        
+    def getResponse(self):
+        import json
+        #return json.dumps(self.response, ensure_ascii=False)
+        return json.dumps(self.response)
+    
+    def setData(self,data):
+        """ Set data in response """
+        self.response['data'] = data
+        self.response['total'] = len(data) if type(data)==type([]) else 0
+        
+    def setMessage(self,msg):
+        """ Set message in response """
+        self.response['message'] = msg
+        
+    def setException(self,msg):
+        """ Set exception message in response """
+        self.response['message']    = msg
+        self.response['resource']   = self.__class__.__name__
+        self.response['method']     = self.waEnviron["method"]
+        self.response['path']       = self.waEnviron["path"]
+        self.response['success']    = False
+
+    def setLog(self,log):
+        """ set message in log """
+        self.response['log'] = log
+
+class waResourceAdmin(waResource):
+    """
+    Extension class of istSOS Web Admin REST operations that manages Wab Admin Configuration
+    """
+    def __init__(self, waEnviron,loadjson=True):
+        waResource.__init__(self,waEnviron,loadjson)
+        class waconf():
+            def __init__(self):
+                self.paths = {}
+            
+        self.waconf = waconf()
+        self.waconf.paths["services"] = waEnviron["services_path"]
+        self.waconf.paths["istsos"] = waEnviron["istsos_path"]
+        
+        #self.waconf = configManager.waConfig()
+        
+class waResourceService(waResourceAdmin):
+    def __init__(self, waEnviron,service=None,loadjson=True):
+        waResourceAdmin.__init__(self,waEnviron,loadjson)
+
+        if service == None:
+            i = self.pathinfo.index("services")
+            if i>0 and i<len(self.pathinfo)-1:
+                self.service = self.pathinfo[i+1]
+            else:
+                self.service = None
+                
+        else:
+            self.service = service
+        
+        #set default config path
+        if not os.path.isdir(self.waconf.paths["services"]):
+            raise Exception("servicespath is not configured in the wa.cfg file [%s]." % self.waconf.paths["services"])
+            
+        defaultCFGpath = os.path.join(self.waconf.paths["services"], "default.cfg")
+        if not os.path.isfile(defaultCFGpath):
+            raise Exception("istsos [default] configuration file not found in %s." % (defaultCFGpath))
+        
+        if not (self.service == None or self.service == 'default'):
+            serviceCFGpath = os.path.join(self.waconf.paths["services"], "%s" % self.service, "%s.cfg" % self.service)
+            if not os.path.isfile(serviceCFGpath):
+                raise Exception("istsos [%s] configuration file not found in %s." % (self.service,serviceCFGpath))
+            self.servicepath = os.path.join(self.waconf.paths["services"], "%s" % self.service)
+            
+            sensormlpath = os.path.join(self.waconf.paths["services"], "%s" % self.service, "sml")
+            if not os.path.isdir(sensormlpath):
+                raise Exception("istsos [%s] sensorML folder not found in %s." % (self.service,sensormlpath))
+            self.sensormlpath = sensormlpath
+            
+            virtualpath = os.path.join(self.waconf.paths["services"], "%s" % self.service, "virtual")          
+            if not os.path.isdir(virtualpath):
+                raise Exception("istsos [%s] virtual procedures folder not found in %s." % (self.service,virtualpath))  
+            self.virtualpath = virtualpath
+        
+        if self.service == None or self.service == 'default':
+            self.serviceconf = configManager.waServiceConfig(defaultCFGpath)
+        else:
+            self.serviceconf = configManager.waServiceConfig(defaultCFGpath,serviceCFGpath)
+
+
+class waResourceConfigurator(waResourceService):
+    def __init__(self, waEnviron,loadjson=True):
+        waResourceService.__init__(self,waEnviron,None,loadjson)
+        tmp = []
+        for key in self.template:
+            tmp.append(self.template[key][0])
+        self.sections = list(set(tmp))
+        
+    def validate(self):
+        pass
+    
+    def executeGet(self):
+        """
+        Execute operation GET for on service configuration sections
+        """
+        
+        data = {
+            'default': True
+        }
+        for key in self.template:
+            temp = self.serviceconf.get(self.template[key][0])
+            if not temp.has_key(self.template[key][1]):
+                raise Exception("Configuration error: value \"%s\" not present in section \"%s\", check your template settings!" % (self.template[key][1],self.template[key][0]))
+            data[key] = temp[self.template[key][1]]
+        for s in self.sections:
+            data['default'] = data['default'] and self.serviceconf.get(s)["default"]
+        self.setData(data)
+        self.setMessage("Information successfully retrived")
+        return data
+    
+    def executePut(self, json=None):
+        """
+        Execute operation PUT for on service configuration sections and return new values
+        """
+        if json is not None:
+            self.json = json
+            
+        self.validate()
+        for key in self.template:
+            if not self.json.has_key(key):
+                raise Exception("Key \"%s\" not present in json data" % (key))
+            self.serviceconf.put(
+                self.template[key][0],
+                self.template[key][1],
+                str(self.json[key]))
+                
+        self.serviceconf.save()
+        self.executeGet()
+        self.setMessage("Information successfully updated")
+    
+    def executeDelete(self):
+        """
+        Execute operation DELETE for on service configuration sections
+        
+        @note: it does not work on default service
+        """
+        for s in self.sections:
+            self.serviceconf.delete(s)
+        self.serviceconf.save()
+        self.setMessage("Information successfully reset to default values!")
+    
diff --git a/walib/resource.pyc b/walib/resource.pyc
new file mode 100644
index 0000000..0390784
Binary files /dev/null and b/walib/resource.pyc differ
diff --git a/walib/resourceFactory.py b/walib/resourceFactory.py
new file mode 100755
index 0000000..b8a6b9c
--- /dev/null
+++ b/walib/resourceFactory.py
@@ -0,0 +1,275 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import sys, re
+import copy
+def initResource(waEnviron):
+    path = waEnviron['path']
+    # ---------------
+    # Entering istsos
+    # ---------------
+    pathinfo = copy.deepcopy(waEnviron['pathinfo'])
+    resource = pathinfo.pop(0)
+    #print >> sys.stderr, resource
+    
+    if resource == "istsos":
+        
+        resource = pathinfo.pop(0)
+        
+        # --------------------------
+        # Entering istsos.operations
+        # -------------------------- 
+        if resource == "operations":
+            resource = pathinfo.pop(0)
+            
+            if resource == "status":
+                from walib.istsos import istsos
+                return istsos.waStatus(waEnviron)
+            elif resource == "log":
+                from walib.istsos import istsos
+                return istsos.waLog(waEnviron)
+            elif resource == "about":
+                from walib.istsos import istsos
+                return istsos.waAbout(waEnviron)
+            elif resource == "validatedb":
+                from walib.istsos import istsos
+                return istsos.waValidatedb(waEnviron)
+            elif resource == "initialization":
+                from walib.istsos import istsos
+                return istsos.waInitialization(waEnviron)
+        
+        # --------------------------
+        # Entering istsos.services
+        # -------------------------- 
+        elif resource == "services":
+            #print >> sys.stderr, resource
+            
+            if len(pathinfo)<=1:
+                from walib.istsos.services import services
+                return services.waServices(waEnviron)
+            else:
+                pathinfo.pop(0) #print >> sys.stderr, pathinfo.pop(0)  # remove service name
+                resource = pathinfo.pop(0)
+                
+                # ---------------------------------------
+                # Entering istsos.services.configsections
+                # ---------------------------------------
+                if resource == "configsections":
+                    #print >> sys.stderr, resource
+                    
+                    if len(pathinfo)==0:
+                        from walib.istsos.services.configsections import configsections
+                        return configsections.waConfigsections(waEnviron)
+                    else:
+                        resource = pathinfo.pop(0)
+                        #print >> sys.stderr, resource
+                        if resource == "connection":
+                            if len(pathinfo)==0:
+                                from walib.istsos.services.configsections import connection
+                                return connection.waConnection(waEnviron)
+                            else:
+                                resource = pathinfo.pop(0)
+                                #print >> sys.stderr, resource
+                                if resource == "operations":
+                                    resource = pathinfo.pop(0)
+                                    #print >> sys.stderr, resource
+                                    if resource == "validatedb":
+                                        from walib.istsos.services.configsections import connection
+                                        return connection.waValidatedb(waEnviron)
+                                
+                        elif resource == "getobservation":
+                            from walib.istsos.services.configsections import getobservation
+                            return getobservation.waGetobservation(waEnviron)
+                        elif resource == "paths":
+                            from walib.istsos.services.configsections import paths
+                            return paths.waPaths(waEnviron)
+                        elif resource == "authority":
+                            from walib.istsos.services.configsections import authority
+                            return authority.waAuthority(waEnviron)
+                        elif resource == "identification":
+                            from walib.istsos.services.configsections import identification
+                            return identification.waIdentification(waEnviron)
+                        elif resource == "geo":
+                            from walib.istsos.services.configsections import geo
+                            return geo.waGeo(waEnviron)
+                        elif resource == "serviceurl":
+                            from walib.istsos.services.configsections import serviceurl
+                            return serviceurl.waServiceurl(waEnviron)
+                        elif resource == "provider":
+                            from walib.istsos.services.configsections import provider
+                            return provider.waProvider(waEnviron)
+                        elif resource == "urn":
+                            from walib.istsos.services.configsections import urn
+                            return urn.waUrn(waEnviron)
+                
+                # ---------------------------------------
+                # Entering istsos.services.dataqualities
+                # ---------------------------------------
+                elif resource == "dataqualities":
+                    #print >> sys.stderr, resource
+                    from walib.istsos.services.dataqualities import dataqualities
+                    return dataqualities.waDataqualities(waEnviron)
+                
+                # ---------------------------------------
+                # Entering istsos.services.procedures
+                # ---------------------------------------
+                elif resource == "procedures":
+                    #print >> sys.stderr, resource
+                    
+                    if len(pathinfo)<=1:
+                        from walib.istsos.services.procedures import procedures
+                        return procedures.waProcedures(waEnviron)
+                                        
+                    else:
+                        
+                        resource = pathinfo.pop(0)
+                        #print >> sys.stderr, resource
+                        
+                        if resource == 'operations':
+                            resource = pathinfo.pop(0)
+                            #print >> sys.stderr, resource
+                            
+                            if resource == "getlist":
+                                from walib.istsos.services.procedures import procedures
+                                return procedures.waGetlist(waEnviron)
+                            
+                            elif resource == "geojson":
+                                from walib.istsos.services.procedures import procedures
+                                return procedures.waGetGeoJson(waEnviron)
+                        
+                # ---------------------------------------
+                # Entering istsos.services.virtualprocedures
+                # ---------------------------------------
+                elif resource == "virtualprocedures":
+                    #print >> sys.stderr, resource
+                    
+                    if len(pathinfo)<=1:
+                        from walib.istsos.services.virtualprocedures import virtualprocedures
+                        return virtualprocedures.waVirtualProcedures(waEnviron)
+                                        
+                    else:
+                        resource = pathinfo.pop(0)
+                        #print >> sys.stderr, resource
+
+                        if resource == "operations":
+                            #print >> sys.stderr, resource              
+                            resource = pathinfo.pop(0)    
+                            if resource == "getlist":  
+                                #print >> sys.stderr, resource     
+                                from walib.istsos.services.virtualprocedures import virtualprocedures
+                                return virtualprocedures.waGetlist(waEnviron)
+                                
+                        resource = pathinfo.pop(0)
+                        #print >> sys.stderr, resource
+                        
+                        if resource == 'code':
+                            #print >> sys.stderr, resource
+                            from walib.istsos.services.virtualprocedures import code
+                            return code.waCode(waEnviron)
+                            
+                        elif resource == 'ratingcurve':
+                            #print >> sys.stderr, resource
+                            from walib.istsos.services.virtualprocedures import ratingcurve
+                            return ratingcurve.waRatingcurves(waEnviron)
+                            
+                # ---------------------------------------
+                # Entering istsos.services.observedproperties
+                # ---------------------------------------
+                elif resource == "observedproperties":
+                    #print >> sys.stderr, resource
+                    from walib.istsos.services.observedproperties import observedproperties
+                    return observedproperties.waObservedproperties(waEnviron)
+                    
+                # ---------------------------------------
+                # Entering istsos.services.uoms
+                # ---------------------------------------
+                elif resource == "uoms":
+                    #print >> sys.stderr, resource
+                    from walib.istsos.services.uoms import uoms
+                    return uoms.waUoms(waEnviron)
+                
+                # ---------------------------------------
+                # Entering istsos.services.epsgs
+                # ---------------------------------------
+                elif resource == "epsgs":
+                    #print >> sys.stderr, resource
+                    from walib.istsos.services.epsgs import epsgs
+                    return epsgs.waEpsgs(waEnviron)
+                    
+                # ---------------------------------------
+                # Entering istsos.services.epsgs
+                # ---------------------------------------
+                elif resource == "systemtypes":
+                    #print >> sys.stderr, resource
+                    from walib.istsos.services.systemtypes import systemtypes
+                    return systemtypes.waSystemTypes(waEnviron)
+                
+                
+                # ---------------------------------------
+                # Entering istsos.services.offerings
+                # ---------------------------------------
+                elif resource == "offerings":
+                    #print >> sys.stderr, resource
+                    
+                    if len(pathinfo)<=1:
+                        from walib.istsos.services.offerings import offerings
+                        return offerings.waOfferings(waEnviron)
+                    else:
+                        resource = pathinfo.pop(0) # remove offering name
+                        #print >> sys.stderr, resource
+                        
+                        if resource == "operations":
+                            resource = pathinfo.pop(0)
+                            if resource == "getlist":
+                                #print >> sys.stderr, resource
+                                from walib.istsos.services.offerings import offerings
+                                return offerings.waGetlist(waEnviron)
+                        else:
+                            resource = pathinfo.pop(0)
+                            if resource == "procedures":
+                                if len(pathinfo)<=1:
+                                    from walib.istsos.services.offerings.procedures import procedures
+                                    return procedures.waProcedures(waEnviron)
+                                else:
+                                    resource = pathinfo.pop(0)
+                                    if resource == "operations":
+                                        #print >> sys.stderr, resource
+                                        resource = pathinfo.pop(0)
+                                        if resource == "memberslist":
+                                            from walib.istsos.services.offerings.procedures import procedures
+                                            return procedures.waMemberslist(waEnviron)
+                                        elif resource == "nonmemberslist":
+                                            from walib.istsos.services.offerings.procedures import procedures
+                                            return procedures.waNonmemberslist(waEnviron)
+                          
+                # ---------------------------------------
+                # Entering istsos.services.operations
+                # ---------------------------------------
+                elif resource == "operations":
+                    #print >> sys.stderr, resource              
+                    resource = pathinfo.pop(0)    
+                    if resource == "getobservation":  
+                        #print >> sys.stderr, resource     
+                        from walib.istsos.services import services
+                        return services.waGetobservation(waEnviron)
+                    elif resource == "insertobservation":
+                        #print >> sys.stderr, resource     
+                        from walib.istsos.services import services
+                        return services.waInsertobservation(waEnviron)
+                                   
+    raise Exception("Resource is not identified, check the URL")
+
diff --git a/walib/resourceFactory.pyc b/walib/resourceFactory.pyc
new file mode 100644
index 0000000..88fcb52
Binary files /dev/null and b/walib/resourceFactory.pyc differ
diff --git a/walib/sqlschema.py b/walib/sqlschema.py
new file mode 100755
index 0000000..af9f57c
--- /dev/null
+++ b/walib/sqlschema.py
@@ -0,0 +1,395 @@
+# -*- coding: utf-8 -*-
+createsqlschema = u"""
+
+SET statement_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = off;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET escape_string_warning = off;
+SET default_tablespace = '';
+SET default_with_oids = false;
+SET TimeZone='0';
+
+--=====================================
+
+CREATE TABLE event_time (
+    id_eti bigint NOT NULL,
+    id_prc_fk integer NOT NULL,
+    time_eti timestamp with time zone NOT NULL
+);
+COMMENT ON TABLE event_time IS 'Stores Observation''s eventTime.';
+
+CREATE SEQUENCE event_time_id_eti_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE event_time_id_eti_seq OWNED BY event_time.id_eti;
+
+--=====================================
+
+CREATE TABLE feature_type (
+    name_fty character varying(25) NOT NULL,
+    id_fty integer NOT NULL
+);
+COMMENT ON TABLE feature_type IS 'Definition of FeatureOfInterest type.';
+
+CREATE SEQUENCE feature_type_id_fty_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE feature_type_id_fty_seq OWNED BY feature_type.id_fty;
+
+--=====================================
+
+CREATE TABLE foi (
+    desc_foi text,
+    id_fty_fk integer NOT NULL,
+    id_foi integer NOT NULL,
+    name_foi character varying(25) NOT NULL
+);
+SELECT AddGeometryColumn('foi', 'geom_foi', $SRID, 'POINT', 3);
+COMMENT ON TABLE foi IS 'Stores FeatureOfInterest type.';
+
+CREATE SEQUENCE foi_id_foi_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE foi_id_foi_seq OWNED BY foi.id_foi;
+
+
+--=====================================
+
+--=====================================
+
+CREATE TABLE measures (
+    id_msr bigint NOT NULL,
+    id_eti_fk bigint NOT NULL,
+    id_qi_fk integer NOT NULL,
+    id_pro_fk integer NOT NULL,
+    val_msr numeric(10,6) NOT NULL
+);
+COMMENT ON TABLE measures IS 'Stores the measures of the Procedure.';
+
+CREATE SEQUENCE measures_id_msr_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE measures_id_msr_seq OWNED BY measures.id_msr;
+
+--=====================================
+
+CREATE TABLE positions (
+    id_pos bigint NOT NULL,
+    id_qi_fk integer NOT NULL,
+    id_eti_fk bigint NOT NULL
+);
+SELECT AddGeometryColumn('positions', 'geom_pos', $SRID, 'POINT', 3);
+COMMENT ON TABLE positions IS 'Stores the location for mobile-points Procedure.';
+
+CREATE SEQUENCE measures_mobile_id_mmo_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE measures_mobile_id_mmo_seq OWNED BY positions.id_pos;
+
+--=====================================
+
+CREATE TABLE observed_properties (
+    name_opr character varying(60) NOT NULL,
+    def_opr character varying(80) NOT NULL,
+    desc_opr text,
+    constr_opr character varying,
+    id_opr integer NOT NULL
+);
+COMMENT ON TABLE observed_properties IS 'Stores the ObservedProperties.';
+
+CREATE SEQUENCE obs_pr_id_opr_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE obs_pr_id_opr_seq OWNED BY observed_properties.id_opr;
+
+--=====================================
+
+CREATE TABLE obs_type (
+    id_oty integer NOT NULL,
+    name_oty character varying(60) NOT NULL,
+    desc_oty character varying(120)
+);
+COMMENT ON TABLE obs_type IS 'Stores the type of observation (e.g.: mobile or fix).';
+
+CREATE SEQUENCE obs_type_id_oty_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE obs_type_id_oty_seq OWNED BY obs_type.id_oty;
+
+--=====================================
+
+CREATE TABLE off_proc (
+    id_off_prc integer NOT NULL,
+    id_off_fk integer NOT NULL,
+    id_prc_fk integer NOT NULL
+);
+COMMENT ON TABLE off_proc IS 'Association table between Offerings and Procedures.';
+
+CREATE SEQUENCE off_proc_id_opr_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE off_proc_id_opr_seq OWNED BY off_proc.id_off_prc;
+
+--=====================================
+
+CREATE TABLE offerings (
+    name_off character varying(64) NOT NULL,
+    desc_off text,
+    expiration_off timestamp with time zone,
+    active_off boolean DEFAULT true NOT NULL,
+    id_off integer NOT NULL
+);
+COMMENT ON TABLE offerings IS 'Stores the Offerings.';
+
+CREATE SEQUENCE offerings_id_off_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE offerings_id_off_seq OWNED BY offerings.id_off;
+
+--=====================================
+
+CREATE TABLE proc_obs (
+    id_pro integer NOT NULL,
+    id_prc_fk integer NOT NULL,
+    id_uom_fk integer NOT NULL,
+    id_opr_fk integer NOT NULL,
+    constr_pro character varying
+);
+COMMENT ON TABLE proc_obs IS 'Association table between Procedures, ObservedProperty and UnitOfMeasure.';
+
+CREATE SEQUENCE prc_obs_id_pro_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE prc_obs_id_pro_seq OWNED BY proc_obs.id_pro;
+
+--=====================================
+
+CREATE TABLE procedures (
+    id_prc integer NOT NULL,
+    name_prc character varying(30) NOT NULL,
+    desc_prc text,
+    stime_prc timestamp with time zone,
+    etime_prc timestamp with time zone,
+
+    id_tru_fk integer NOT NULL,
+    time_res_prc integer,
+    id_oty_fk integer,
+    id_foi_fk integer,
+    assignedid_prc character varying(32) NOT NULL
+);
+COMMENT ON TABLE procedures IS 'Stores the Procedures.';
+
+CREATE SEQUENCE procedures_id_prc_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE procedures_id_prc_seq OWNED BY procedures.id_prc;
+
+--=====================================
+
+CREATE TABLE quality_index (
+    name_qi character varying(25) NOT NULL,
+    desc_qi text,
+    id_qi integer NOT NULL
+);
+COMMENT ON TABLE quality_index IS 'Stores the QualityIndexes.';
+
+--=====================================
+
+CREATE TABLE time_res_unit (
+    id_tru integer NOT NULL,
+    name_tru character varying(15)
+);
+COMMENT ON TABLE time_res_unit IS 'Stores the Procedure''s time resolution units.';
+
+CREATE SEQUENCE time_res_unit_id_tru_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE time_res_unit_id_tru_seq OWNED BY time_res_unit.id_tru;
+
+--=====================================
+
+CREATE TABLE uoms (
+    name_uom character varying(20) NOT NULL,
+    desc_uom text,
+    id_uom integer NOT NULL
+);
+COMMENT ON TABLE uoms IS 'Stores the Units of Measures.';
+
+CREATE SEQUENCE uoms_id_uom_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE uoms_id_uom_seq OWNED BY uoms.id_uom;
+
+--=====================================
+
+CREATE TABLE tran_log (
+    id_trl integer NOT NULL,
+    transaction_time_trl timestamp without time zone DEFAULT now(),
+    operation_trl character varying NOT NULL,
+    procedure_trl character varying(30) NOT NULL,
+    begin_trl timestamp with time zone,
+    end_trl timestamp with time zone,
+    count integer,
+    stime_prc timestamp with time zone,
+    etime_prc timestamp with time zone
+);
+COMMENT ON TABLE tran_log IS 'Log table for transactional operations.';
+
+CREATE SEQUENCE tran_log_id_trl_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+ALTER SEQUENCE tran_log_id_trl_seq OWNED BY tran_log.id_trl;
+
+--=====================================
+-- NEXTVALS
+--=====================================
+
+ALTER TABLE event_time ALTER COLUMN id_eti SET DEFAULT nextval('event_time_id_eti_seq'::regclass);
+ALTER TABLE feature_type ALTER COLUMN id_fty SET DEFAULT nextval('feature_type_id_fty_seq'::regclass);
+ALTER TABLE foi ALTER COLUMN id_foi SET DEFAULT nextval('foi_id_foi_seq'::regclass);
+ALTER TABLE measures ALTER COLUMN id_msr SET DEFAULT nextval('measures_id_msr_seq'::regclass);
+ALTER TABLE obs_type ALTER COLUMN id_oty SET DEFAULT nextval('obs_type_id_oty_seq'::regclass);
+ALTER TABLE observed_properties ALTER COLUMN id_opr SET DEFAULT nextval('obs_pr_id_opr_seq'::regclass);
+ALTER TABLE off_proc ALTER COLUMN id_off_prc SET DEFAULT nextval('off_proc_id_opr_seq'::regclass);
+ALTER TABLE offerings ALTER COLUMN id_off SET DEFAULT nextval('offerings_id_off_seq'::regclass);
+ALTER TABLE positions ALTER COLUMN id_pos SET DEFAULT nextval('measures_mobile_id_mmo_seq'::regclass);
+ALTER TABLE proc_obs ALTER COLUMN id_pro SET DEFAULT nextval('prc_obs_id_pro_seq'::regclass);
+ALTER TABLE procedures ALTER COLUMN id_prc SET DEFAULT nextval('procedures_id_prc_seq'::regclass);
+ALTER TABLE time_res_unit ALTER COLUMN id_tru SET DEFAULT nextval('time_res_unit_id_tru_seq'::regclass);
+ALTER TABLE uoms ALTER COLUMN id_uom SET DEFAULT nextval('uoms_id_uom_seq'::regclass);
+ALTER TABLE tran_log ALTER COLUMN id_trl SET DEFAULT nextval('tran_log_id_trl_seq'::regclass);
+
+--=====================================
+-- CONSTRAINTS
+--=====================================
+ALTER TABLE ONLY event_time
+    ADD CONSTRAINT event_time_id_prc_fk_key UNIQUE (id_prc_fk, time_eti);
+ALTER TABLE ONLY event_time
+    ADD CONSTRAINT event_time_pkey PRIMARY KEY (id_eti);
+ALTER TABLE ONLY feature_type
+    ADD CONSTRAINT feature_type_pkey PRIMARY KEY (id_fty);
+ALTER TABLE ONLY foi
+    ADD CONSTRAINT foi_name_foi_key UNIQUE (name_foi);
+ALTER TABLE ONLY foi
+    ADD CONSTRAINT foi_pkey PRIMARY KEY (id_foi);
+ALTER TABLE ONLY measures
+    ADD CONSTRAINT measures_fix_pkey PRIMARY KEY (id_msr);
+ALTER TABLE ONLY measures
+    ADD CONSTRAINT measures_id_eti_fk_key UNIQUE (id_eti_fk, id_pro_fk);
+ALTER TABLE ONLY positions
+    ADD CONSTRAINT measures_mobile_pkey PRIMARY KEY (id_pos);
+ALTER TABLE ONLY observed_properties
+    ADD CONSTRAINT obs_pr_def_opr_key UNIQUE (def_opr);
+ALTER TABLE ONLY observed_properties
+    ADD CONSTRAINT obs_pr_pkey PRIMARY KEY (id_opr);
+ALTER TABLE ONLY obs_type
+    ADD CONSTRAINT obs_type_pkey PRIMARY KEY (id_oty);
+ALTER TABLE ONLY off_proc
+    ADD CONSTRAINT off_proc_id_off_fk_key UNIQUE (id_off_fk, id_prc_fk);
+ALTER TABLE ONLY off_proc
+    ADD CONSTRAINT off_proc_pkey PRIMARY KEY (id_off_prc);
+ALTER TABLE ONLY offerings
+    ADD CONSTRAINT offerings_name_off_key UNIQUE (name_off);
+ALTER TABLE ONLY offerings
+    ADD CONSTRAINT offerings_pkey PRIMARY KEY (id_off);
+ALTER TABLE ONLY proc_obs
+    ADD CONSTRAINT prc_obs_pkey PRIMARY KEY (id_pro);
+ALTER TABLE ONLY proc_obs
+    ADD CONSTRAINT proc_obs_id_uom_fk_key UNIQUE (id_uom_fk, id_opr_fk, id_prc_fk);
+ALTER TABLE ONLY procedures
+    ADD CONSTRAINT procedures_assignedid_prc_key UNIQUE (assignedid_prc);
+ALTER TABLE ONLY procedures
+    ADD CONSTRAINT procedures_pkey PRIMARY KEY (id_prc);
+ALTER TABLE ONLY quality_index
+    ADD CONSTRAINT quality_index_pkey PRIMARY KEY (id_qi);
+ALTER TABLE ONLY time_res_unit
+    ADD CONSTRAINT time_res_unit_pkey PRIMARY KEY (id_tru);
+ALTER TABLE ONLY uoms
+    ADD CONSTRAINT uoms_pkey PRIMARY KEY (id_uom);
+ALTER TABLE ONLY event_time
+    ADD CONSTRAINT event_time_id_prc_fk_fkey FOREIGN KEY (id_prc_fk) REFERENCES procedures(id_prc) ON DELETE CASCADE;
+ALTER TABLE ONLY foi
+    ADD CONSTRAINT foi_id_fty_fk_fkey FOREIGN KEY (id_fty_fk) REFERENCES feature_type(id_fty);
+ALTER TABLE ONLY measures
+    ADD CONSTRAINT measures_fix_id_qi_fk_fkey FOREIGN KEY (id_qi_fk) REFERENCES quality_index(id_qi) ON UPDATE CASCADE;
+ALTER TABLE ONLY measures
+    ADD CONSTRAINT measures_id_eti_fk_fkey FOREIGN KEY (id_eti_fk) REFERENCES event_time(id_eti) ON DELETE CASCADE;
+ALTER TABLE ONLY measures
+    ADD CONSTRAINT measures_id_pro_fk_fkey FOREIGN KEY (id_pro_fk) REFERENCES proc_obs(id_pro);
+ALTER TABLE ONLY positions
+    ADD CONSTRAINT measures_mobile_id_qi_fk_fkey FOREIGN KEY (id_qi_fk) REFERENCES quality_index(id_qi) ON UPDATE CASCADE;
+ALTER TABLE ONLY off_proc
+    ADD CONSTRAINT off_proc_id_off_fk_fkey FOREIGN KEY (id_off_fk) REFERENCES offerings(id_off) ON DELETE CASCADE;
+ALTER TABLE ONLY off_proc
+    ADD CONSTRAINT off_proc_id_prc_fk_fkey FOREIGN KEY (id_prc_fk) REFERENCES procedures(id_prc) ON DELETE CASCADE;
+ALTER TABLE ONLY positions
+    ADD CONSTRAINT positions_id_eti_fk_fkey FOREIGN KEY (id_eti_fk) REFERENCES event_time(id_eti) ON DELETE CASCADE;
+ALTER TABLE ONLY proc_obs
+    ADD CONSTRAINT prc_obs_id_opr_fk_fkey FOREIGN KEY (id_opr_fk) REFERENCES observed_properties(id_opr);
+ALTER TABLE ONLY proc_obs
+    ADD CONSTRAINT prc_obs_id_uom_fk_fkey FOREIGN KEY (id_uom_fk) REFERENCES uoms(id_uom);
+ALTER TABLE ONLY proc_obs
+    ADD CONSTRAINT proc_obs_id_prc_fk_fkey FOREIGN KEY (id_prc_fk) REFERENCES procedures(id_prc) ON DELETE CASCADE;
+ALTER TABLE ONLY procedures
+    ADD CONSTRAINT procedures_id_foi_fk_fkey FOREIGN KEY (id_foi_fk) REFERENCES foi(id_foi);
+ALTER TABLE ONLY procedures
+    ADD CONSTRAINT procedures_id_oty_fk_fkey FOREIGN KEY (id_oty_fk) REFERENCES obs_type(id_oty);
+ALTER TABLE ONLY procedures
+    ADD CONSTRAINT procedures_id_tru_fk_fkey FOREIGN KEY (id_tru_fk) REFERENCES time_res_unit(id_tru);
+ALTER TABLE ONLY tran_log
+    ADD CONSTRAINT tran_log_pkey PRIMARY KEY (id_trl);
+   
+--=====================================
+-- INDEXES
+--=====================================
+CREATE INDEX ety_prc_date ON event_time USING btree (id_eti, time_eti);
+
+--=====================================
+-- CONSTANT/DEFAULT VALUES
+--=====================================
+
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('aggregation no data', 'no values are present for this aggregation interval', -100);
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('outboud', 'gross error', 0);
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('raw', 'the format is correct', 100);
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('acceptable', 'the value is acceptable for the observed property', 110);
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('reasonable', 'the value is in a resonable range for that observed property and station', 200);
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('timely coherent', 'the value is coherent with time-series', 300);
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('spatilly coherent', 'the value is coherent with close by observations', 400);
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('manually adjusted', 'the value has been manually corrected', 500);
+INSERT INTO quality_index (name_qi, desc_qi, id_qi) VALUES ('correct', 'the value has not been modified and is correct', 600);
+
+INSERT INTO obs_type (id_oty, name_oty, desc_oty) VALUES (1, 'insitu-fixed-point', 'fixed, in-situ, pointwise observation');
+INSERT INTO obs_type (id_oty, name_oty, desc_oty) VALUES (2, 'insitu-mobile-point', 'mobile, in-situ, pointwise observation');
+INSERT INTO obs_type (id_oty, name_oty, desc_oty) VALUES (3, 'virtual', 'virtual procedure');
+
+"""
diff --git a/walib/sqlschema.pyc b/walib/sqlschema.pyc
new file mode 100644
index 0000000..120d62a
Binary files /dev/null and b/walib/sqlschema.pyc differ
diff --git a/walib/utils.py b/walib/utils.py
new file mode 100755
index 0000000..b9776c3
--- /dev/null
+++ b/walib/utils.py
@@ -0,0 +1,593 @@
+# -*- coding: utf-8 -*-
+# istSOS WebAdmin - Istituto Scienze della Terra
+# Copyright (C) 2012 Massimiliano Cannata, Milan Antonovic
+#
+# 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 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import sys, traceback
+
+def valid_NCName(name):
+    not_allowed_NCName = [' ', '!','"', '#', '$', '%', '&', '\'', 
+                          '(', ')', '*', '+', ',', '/', ':', ';', 
+                          '<', '=', '>', '?', '@', '[', '\\', ']', 
+                          '^', '`', '{', '|', '}', '~']
+    for c in not_allowed_NCName:
+        if name.find(c)>0:
+            return False
+    return True                
+
+def validatedb(user,password,dbname,host,port=5432,service=None):
+    """
+    Validate a service db connection parameters
+    
+    @param user: user name used to authenticate
+    @param password: password used to authenticate
+    @param dbname: the database name (only in dsn string)
+    @param host: database host address
+    @param port: onnection port number (optional - defaults to 5432)
+    @param service: service name that correspond with associated database schema (optional)
+    @return: L{True} if connection could be estabished and the schema found (only if schema is provided)
+    """
+    from walib import databaseManager
+    test_conn = databaseManager.PgDB(user,password,dbname,host,port)
+    if not service == None or service=="default":
+        sql = "SELECT count(*) from pg_namespace WHERE nspname = %s"
+        par = (service,)
+        res = test_conn.select(sql,par)
+        if len(res)==1:
+            pass
+        else:
+            raise Exception("CONNECTION ERROR: wrong schema %s" % service)
+
+def preventInjection(sql):
+    """
+    Parse given sql with regex for possible malicious sql ignection
+    
+    @param sql: text to parse
+    @param type: L{string}
+    @return: L{True} if no malicious sql ingnection was detected
+    """
+    regex = "(\W)|(\d)|(script)|(<)|(>)|(%3c)|(%3e)|(SELECT) |(UPDATE) |(INSERT) |(DELETE)|(GRANT) |(REVOKE)|(UNION)|(&lt;)|(&gt;)/gi"
+    import re
+    p = re.compile(regex,re.IGNORECASE)
+    if p.search( sql ):
+        raise Exception("detected possible malicius SQL injection, please change service name avoiding spaces and SQL reserved words")
+    return True
+
+def getServiceList(servicepath,listonly=False):
+    """
+    Return the list of istsos services
+    
+    @param servicepath: path to service folder
+    @param listonly: define if only service list is requested (optional - default L{False})
+    @param type: L{boolean}
+    @return: return a list of services
+    
+        >>> Return example with listonly==True :
+            [name1,name2,...]
+            
+        >>> Return example with listonly==False:
+            [
+                {"service":name1,"path":path1},
+                {"service":name1,"path":path1},
+                ...
+            ]
+    """
+    import os, fnmatch
+    services=[]
+    for root, dirnames, filenames in os.walk( servicepath ):
+        for filename in fnmatch.filter(filenames, '*.cfg'):
+            service = filename.split(".")[0].split("/")[-1]
+            path = os.path.join(root, filename)
+            if service == "default" or service == "wa":
+                continue
+            else:
+                if listonly==True:
+                    services.append(service)
+                else:
+                    services.append({"service":service,"path":path})
+    return services
+
+def getOfferingNamesList(pgdb,service):
+    """
+    Return the list of offerings for a give istsos service connection
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param service: service name
+    @type service: L{string}
+    @return: C{list} of C{dict} with offering C{id} and C{name} keys
+    
+    >>> Return example:
+        [
+            { "id":1,"name":"temporary"},
+            { "id":2,"name":"water"},
+            { "id":3,"name":"air"}
+        ]
+    
+    """
+    sql  = "SELECT id_off, name_off FROM %s.offerings ORDER BY name_off" %((service,))
+    rows = pgdb.select(sql,None)
+    if rows:
+        return [ { "id":row["id_off"] , "name":row["name_off"]} for row in rows ]
+    else:
+        return []
+        
+def getOfferingDetailsList(pgdb,service):
+    """
+    Return the list of offerings details for a given istsos service connection
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param service: service name
+    @type service: L{string}
+    @return: C{list} of C{dict} with offering C{id} and C{name} keys
+    
+    >>> Return example:
+        [
+            {"name": "temperature","description": "descrizione 3","procedures": 12,"expiration": "22.12.2012","active": true},
+            {"name": "water","description": "descrizione 3","procedures": 22,"expiration": "22.12.2012","active": true},
+            {"name": "air","description": "descrizione 3","procedures": 3,"expiration": "22.12.2012","active": true}
+        ]
+    """
+    sql  = """
+        SELECT DISTINCT id_off as id, name_off as name, desc_off as description, 
+            expiration_off as expiration, active_off as active, count(id_off_prc) as procedures
+        FROM %s.offerings
+        LEFT JOIN %s.off_proc 
+            ON id_off = id_off_fk
+        GROUP BY id_off, name_off, desc_off, expiration_off, active_off
+        ORDER BY name_off; """ %((service,)*2)
+    rows = pgdb.select(sql,None)
+    if rows:
+        from lib import isodate
+        return [
+            {
+                "id":row["id"],
+                "name":row["name"],
+                "description":row["description"],
+                "procedures":row["procedures"],
+                "expiration": isodate.datetime_isoformat(row["expiration"]) if row["expiration"] else "",
+                "active":row["active"]
+            } for row in rows
+        ]
+    else:
+        return []
+
+def getProcedureNamesList(pgdb,service,offering=None, observationType=None):
+    """
+    Return the list of procedures:
+        
+        The list can be filtered by offering and/or observationType
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param service: service name
+    @type service: L{string}
+    @param offering: filter procedures by this offering name
+    @type offering: C{string} or C{None}
+    @type observationType: C{string} or C{None}
+    @return: C{list} of C{dict} with procedure C{id} and C{name} keys
+    
+    >>> Return example:
+        [
+            { "id":1,"name":"Chiasso", "description": "", "assignedid": "1234"},
+            { "id":2,"name":"Bellinzona", "description": "", "assignedid": "1235"},
+            { "id":3,"name":"Lugano", "description": "", "assignedid": "1236"}
+        ]
+    """
+    if offering==None:
+        if observationType==None:            
+            sql = """
+                SELECT id_prc, name_prc, desc_prc, assignedid_prc, name_oty, stime_prc, etime_prc
+                FROM %s.procedures, %s.obs_type 
+                WHERE id_oty_fk = id_oty 
+                ORDER BY name_prc""" %((service,)*2)
+            rows = pgdb.select(sql)
+            
+        else:
+            sql = """
+                SELECT id_prc, name_prc, desc_prc, assignedid_prc, name_oty, stime_prc, etime_prc
+                FROM %s.procedures, %s.obs_type 
+                WHERE id_oty_fk = id_oty""" % ((service,)*2)
+            sql += """
+                AND name_oty = %s
+                ORDER BY name_prc""" 
+            rows = pgdb.select(sql,(observationType,))
+    else:
+        if observationType==None:   
+            sql  = """
+                SELECT id_prc, name_prc, desc_prc, assignedid_prc, name_oty, stime_prc, etime_prc
+                FROM %s.off_proc op, %s.procedures p, %s.offerings o, %s.obs_type """ %((service,)*4)
+            sql += """ 
+                WHERE o.id_off = op.id_off_fk 
+                AND op.id_prc_fk = p.id_prc  
+                AND id_oty_fk = id_oty
+                AND o.name_off = %s
+                ORDER BY p.name_prc; """
+            rows = pgdb.select(sql,(offering,))
+        else:
+            sql = """
+                SELECT id_prc, name_prc, desc_prc, assignedid_prc, name_oty, stime_prc, etime_prc
+                FROM %s.off_proc op, %s.procedures, %s.offerings, %s.obs_type """ % ((service,)*4)
+            sql += """
+                WHERE o.id_off=op.id_off_fk 
+                AND op.id_prc_fk=p.id_prc 
+                AND id_oty_fk = id_oty
+                AND o.name_off = %s
+                AND name_oty = %s
+                ORDER BY name_prc""" 
+            rows = pgdb.select(sql,(offering, observationType))
+            
+    if rows:
+    
+        ret = []
+        for row in rows:
+            begin = ""
+            end = ""
+            
+            if row["stime_prc"]:
+                begin = row["stime_prc"].strftime("%Y-%m-%dT%H:%M:%S%z")
+            if row["etime_prc"]:
+                end = row["etime_prc"].strftime("%Y-%m-%dT%H:%M:%S%z")
+            
+            ret.append({ 
+                "id": row["id_prc"], 
+                "name": row["name_prc"], 
+                "description": row["desc_prc"], 
+                "assignedid": row["assignedid_prc"], 
+                "sensortype": row["name_oty"], 
+                "samplingTime": {
+                    "beginposition": begin, 
+                    "endposition": end
+                }
+            })
+            
+        return ret
+    else:
+        return []
+               
+
+def getObsPropNamesList(pgdb,service,offering=None):
+    """
+    Return the list of observed properties
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param service: service name
+    @type service: L{string}
+    @param offering: filter procedures by this offering name
+    @type offering: C{string} or C{None}
+    @return: C{list} of C{dict} with observed property C{id} and C{name} keys
+    
+    >>> Return example:
+        [
+            { "id":1,"name":"urn:ogc:def:parameter:x-istsos:1.0:lake:water:height"},
+            { "id":2,"name":"urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall"}
+        ]
+    
+    """
+    if offering==None:
+        sql  = "SELECT DISTINCT id_opr, name_opr FROM %s.observed_properties ORDER BY name_opr" %((service,))
+        rows = pgdb.select(sql)
+    else:
+        sql  = "SELECT DISTINCT id_opr, name_opr"
+        sql += " FROM %s.procedures p, %s.proc_obs po ,%s.observed_properties obs" %((service,)*3)
+        sql += ", %s.off_proc op, %s.offerings o" %((service,)*2)
+        sql += " WHERE po.id_prc_fk=p.id_prc AND po.id_opr_fk=obs.id_opr"
+        sql += " AND p.id_prc=op.id_prc_fk AND op.id_off_fk=o.id_off AND o.name_off=%s ORDER BY obs.name_opr"
+        rows = pgdb.select(sql,(offering,))
+    if rows:
+        return [ { "id":row["id_opr"] , "name":row["name_opr"]} for row in rows ]
+    else:
+        return None
+
+def getFoiNamesList(pgdb,service,offering=None):
+    """
+    Return the list of observed properties
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param service: service name
+    @type service: L{string}
+    @param offering: filter procedures by this offering name
+    @type offering: C{string} or C{None}
+    @return: C{list} of C{dict} with observed property C{id} and C{name} keys
+    
+    >>> Return example:
+        [
+            { "id":1,"name":"urn:ogc:def:parameter:x-istsos:1.0:lake:water:height"},
+            { "id":2,"name":"urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall"}
+        ]
+    
+    """
+    if offering==None:
+        sql = "SELECT DISTINCT id_foi,(name_fty || ':' || name_foi) as name_foi" 
+        sql += " FROM %s.off_proc op, %s.procedures p, %s.foi f, %s.feature_type ft" %((service,)*4)
+        sql += " WHERE op.id_prc_fk=p.id_prc AND p.id_foi_fk=f.id_foi AND f.id_fty_fk=ft.id_fty"
+        sql += " ORDER BY name_foi"
+        rows = pgdb.select(sql)
+    else:
+        sql = "SELECT DISTINCT id_foi,(name_fty || ':' || name_foi) as name_foi" 
+        sql += " FROM %s.off_proc op, %s.procedures p, %s.foi f" %((service,)*3)
+        sql += ", %s.feature_type ft, %s.offerings o" %((service,)*2)
+        sql += " WHERE op.id_prc_fk=p.id_prc AND op.id_off_fk=o.id_off AND o.name_off=%s"
+        sql += " AND p.id_foi_fk=f.id_foi AND f.id_fty_fk=ft.id_fty"
+        sql += " ORDER BY name_foi"
+        rows = pgdb.select(sql,(offering,))
+    if rows:
+        return [ { "id":row["id_foi"] , "name":row["name_foi"]} for row in rows ]
+    else:
+        return None
+
+
+def getGeoJSONFromProcedure(pgdb, service, procedure, epsg):
+    """
+    >>> Return example:
+        {"type":"Point","coordinates":[8.961270000000001,46.027230000000003,344.100000000000023]}    
+    """
+    import json
+    sql = """ 
+        SELECT st_asgeojson(ST_Transform(geom_foi,%s)) as gjson
+        FROM %s.foi, %s.procedures    
+        WHERE id_foi = id_foi_fk
+    """ % (epsg,service,service)
+    sql += "AND name_prc=%s"
+    rows = pgdb.select(sql,(procedure,))
+    if rows:
+        return  json.loads(rows[0]["gjson"])
+    else:
+        return None
+    
+def getObservedPropertiesFromProcedure(pgdb,service,procedure):
+    """
+    Return the list of observed properties related to the given procedure
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param service: service name
+    @type service: L{string}
+    @param procedureID: filter procedure id
+    @type procedure: C{string} or C{None}
+    @return: C{list} of C{dict} with observed property C{id} and C{name} keys
+    
+    >>> Return example:
+        [
+            { "id":1,"name":"urn:ogc:def:parameter:x-istsos:1.0:lake:water:height"},
+            { "id":2,"name":"urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall"}
+        ]
+    
+    """
+    sql  = "SELECT id_opr, name_opr, name_uom"
+    sql += " FROM %s.proc_obs po, %s.procedures p, %s.observed_properties o, %s.uoms u" %((service,)*4) 
+    sql += " WHERE po.id_prc_fk=p.id_prc AND po.id_opr_fk=o.id_opr AND po.id_uom_fk=u.id_uom"
+    sql += " AND name_prc=%s"
+    params = (procedure,)
+    # @todo check this double tuple ?
+    rows = pgdb.select(sql,(params,))
+    if rows:
+        return [ { "id":row["id_opr"] , "name":row["name_opr"], "uom":row["name_uom"]} for row in rows ]
+    else:
+        return None
+
+def getOfferingsFromProcedure(pgdb,service,procedure):
+    """
+    Return the list of offerings related to the given procedure
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param service: service name
+    @type service: L{string}
+    @param procedureID: filter procedure id
+    @type procedure: C{string} or C{None}
+    @return: C{list} of C{dict} with observed property C{id} and C{name} keys
+    
+    >>> Return example:
+        [
+            { "id":1,"name":"urn:ogc:def:parameter:x-istsos:1.0:lake:water:height"},
+            { "id":2,"name":"urn:ogc:def:parameter:x-istsos:1.0:meteo:air:rainfall"}
+        ]
+    
+    """
+    sql  = "SELECT id_off, name_off"
+    sql += " FROM %s.off_proc op, %s.procedures p, %s.offerings o" %((service,)*3) 
+    sql += " WHERE op.id_prc_fk=p.id_prc AND op.id_off_fk=o.id_off"
+    sql += " AND name_prc=%s"
+    params = (procedure,)
+    rows = pgdb.select(sql,(params,))
+    if rows:
+        return [ { "id":row["id_off"] , "name":row["name_off"] } for row in rows ]
+    else:
+        return None    
+
+def verifyxmlservice(url):
+    import lib.requests as requests
+    from lib.etree import et
+    try:
+        response = requests.get(url)
+        response.raise_for_status()
+        root = et.fromstring(response.text)
+        if not root.find("Exception") == None:
+            return "up with error"
+        else:
+            return  "up"
+    except Exception as e:
+        print >> sys.stderr, traceback.print_exc()
+        return "down"
+
+def getObservationPeriod(pgdb,service,procedures):
+    """
+    Return the list of procedures with observation periods
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param service: service name
+    @type service: L{string}
+    @param procedures: procedures
+    @type procedure: C{list} of C{string}
+    @return: C{list} of C{dict} with procedure, stime (start time) and etime (end time) keys
+    
+    >>> Return example:
+        [
+            { "procedure":"P_TRE","stime":"2000-12-31T23:00:00Z", "etime":"2012-12-31T23:00:00Z"},
+            { "procedure":"P_ BOD","stime":"1986-12-31T23:00:00Z", "etime":"2012-12-31T23:00:00Z"}
+        ]
+    
+    """
+    sql  = "SELECT name_prc, stime_prc, etime_prc"
+    sql += " FROM %s.procedures p" %((service,)*3) 
+    sql += " WHERE name_prc IN %s"
+    params = touple(procedure)
+    rows = pgdb.select(sql,(params,))
+    if rows:
+        return [ { "procedure":row["name_prc"] , "stime":row["stime_prc"], "etime":row["etime_prc"] } for row in rows ]
+    else:
+
+        return None 
+"""    
+def gmlToGeojson(pgdb,gmlstr):
+    ""
+    Return the list of observed properties
+    
+    @param pgdb: service connection
+    @type pgdb: L{wa.databaseManager.PgDB} object
+    @param gmlstr: gml geometry as text
+    @type service: L{string}
+    @return: C{dict} of geomatry in GeoJson format
+    
+    >>> Return example:
+        [
+            {
+                "type":"Point",
+                "coordinates":[693682,145597,1471],
+                "crs": {
+                    "type": "name",
+                    "properties": {
+                        "name": "EPSG:21781"
+                    }
+                }
+            }
+        ]
+    
+    ""
+    
+    geojsonsql = "SELECT st_asgeojson(st_geomfromgml(%s)) as geojson"
+    params = (gmlstr,)
+    geojson = pgdb.select(geojsonsql,params)[0]["geojson"]
+    
+    sridsql = "SELECT st_srid(st_geomfromgml(%s)) as srid""
+    srid = pgdb.select(sridsql,params)[0]["srid"]
+
+    exec("geojson=%s" % geojson)
+    geojson["crs"] = {}
+    geojson["crs"]["type"] = "name"
+    geojson["crs"]["properties"] = {}
+    geojson["crs"]["properties"]["name"] = "EPSG:%s" % srid
+    
+    return geojson
+
+"""
+"""    
+--SELECT st_asewkt(st_geomfromgml('<gml:Point gml:id="SYSTEM_LOCATION" srsName="EPSG:21781">
+--<gml:coordinates>693682,145597,1471</gml:coordinates></gml:Point>'))
+
+SELECT st_srid(st_geomfromgml('<gml:Point gml:id="SYSTEM_LOCATION" srsName="EPSG:21781">
+<gml:coordinates>693682,145597,1471</gml:coordinates></gml:Point>'))    
+"""
+
+
+'''
+Workaround to prevent encoding change during execution exception
+'''
+
+
+import psycopg2 # @TODO the right library
+import psycopg2.extras
+
+def to_unicode_or_bust(obj, encoding='utf-8'):
+    try:
+        if isinstance(obj, basestring):
+            if not isinstance(obj, unicode):
+                obj = unicode(obj, encoding)
+    except Exception as e:
+        print >> sys.stderr, "to_unicode_or_bust(%s,%s)\n%s" % (obj,encoding,traceback.print_exc())
+    return obj
+    
+    
+
+def encodeobject(obj, encoding='utf-8'):
+    try:
+        if type(obj) is list:
+            for key, value in enumerate(obj):
+                
+                if type(value) is dict or type(value) is psycopg2.extras.DictRow:
+                    obj[key] = encodeobject(value, encoding)
+                elif type(value) is list:
+                    obj[key] = encodeobject(value, encoding)
+                else:
+                    obj[key] = to_unicode_or_bust(value, encoding)
+        elif type(obj) is dict or type(obj) is psycopg2.extras.DictRow:
+            for key, value in obj.iteritems():
+                if type(value) is dict:
+                    obj[key] = encodeobject(value, encoding)
+                elif type(value) is list:
+                    obj[key] = encodeobject(value, encoding)
+                else:
+                    obj[key] = to_unicode_or_bust(value, encoding)
+    except Exception as e:
+        print >> sys.stderr, traceback.print_exc()
+    return obj
+            
+    
+def validateJsonConstraint(constraint):
+    """
+    Permitted conigurations:
+        {"role":"urn:ogc:def:classifiers:x-istsos:1.0:qualityIndexCheck:level0","min":"10"}
+        {"role":"urn:ogc:def:classifiers:x-istsos:1.0:qualityIndexCheck:level0","max":"10"}
+        {"role":"urn:ogc:def:classifiers:x-istsos:1.0:qualityIndexCheck:level0","interval":["-10","10"]}
+        {"role":"urn:ogc:def:classifiers:x-istsos:1.0:qualityIndexCheck:level0","valueList":["1","2","3","4","5","6"]}
+    """
+    if 'min' in constraint:
+        try:
+            float(constraint['min'])
+        except ValueError:
+            raise Exception("Min value in constraint definition must be numeric")
+    elif 'max' in constraint:
+        try:
+            float(constraint['max'])
+        except ValueError:
+            raise Exception("Max value in constraint definition must be numeric")
+    elif 'interval' in constraint:
+        if not type(constraint['interval']) == type([]):
+            raise Exception("Constraint interval must be an array containint two numeric values")
+        if len(constraint['interval']) != 2:
+            raise Exception("Constraint interval must be an array containint two numeric values")
+        try:
+            float(constraint['interval'][0])
+            float(constraint['interval'][1])
+        except ValueError:
+            raise Exception("Constraint interval must be an array containint two numeric values")
+    elif 'valueList' in constraint:
+        if not type(constraint['valueList']) == type([]):
+            raise Exception("Constraint valueList must be an array containint a series of numeric values")
+        if len(constraint['valueList']) <= 2:
+            raise Exception("Constraint valueList must be an array containint at least 1 numeric value")
+        try:
+            for val in constraint['valueList']:
+                float(val)
+        except ValueError:
+            raise Exception("Constraint valueList must be an array containint a series of numeric values")
+            
+    
+    
diff --git a/walib/utils.pyc b/walib/utils.pyc
new file mode 100644
index 0000000..7d48da0
Binary files /dev/null and b/walib/utils.pyc differ
diff --git a/walib/wa.cfg b/walib/wa.cfg
new file mode 100755
index 0000000..18922be
--- /dev/null
+++ b/walib/wa.cfg
@@ -0,0 +1,3 @@
+[paths]
+services = /home/geomatica/istsos/services
+istsos   = /home/geomatica/istsos
diff --git a/walib/wa_version.py b/walib/wa_version.py
new file mode 100755
index 0000000..11a716e
--- /dev/null
+++ b/walib/wa_version.py
@@ -0,0 +1 @@
+version = "1.0.0"

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/istsos.git



More information about the Pkg-grass-devel mailing list